From 83975938ef6984d9722ffe1b3df219c16d8845d1 Mon Sep 17 00:00:00 2001 From: Roel Baars <6567747+Thanatomanic@users.noreply.github.com> Date: Sun, 11 Nov 2018 12:34:12 +0100 Subject: [PATCH 01/60] Don't use boolean logic to increment value directly --- rtengine/dcraw.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index c9bc8ccad..79c0e59f6 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -9138,7 +9138,7 @@ void CLASS identify() parse_fuji (get4()); if (thumb_offset > 120) { fseek (ifp, 120, SEEK_SET); - is_raw += (i = get4()) && 1; + is_raw += (i = get4()) != 0 ? 1 : 0; if (is_raw == 2 && shot_select) parse_fuji (i); } From c5c04769e4e55729d5d7bf8a2612df3554fdff53 Mon Sep 17 00:00:00 2001 From: "U-PC-BUREAU\\jacques" Date: Sun, 11 Nov 2018 14:34:45 +0100 Subject: [PATCH 02/60] Improvments to ICC profile creator --- rtdata/iccprofiles/output/RTv2_Medium.icc | Bin 25508 -> 884 bytes rtdata/iccprofiles/output/RTv2_sRGB.icc | Bin 25504 -> 25452 bytes rtdata/iccprofiles/output/RTv4_Medium.icc | Bin 764 -> 680 bytes rtdata/iccprofiles/output/RTv4_sRGB.icc | Bin 760 -> 752 bytes rtgui/iccprofilecreator.cc | 396 ++++++++++++++++------ rtgui/iccprofilecreator.h | 2 +- rtgui/preferences.cc | 9 +- 7 files changed, 306 insertions(+), 101 deletions(-) diff --git a/rtdata/iccprofiles/output/RTv2_Medium.icc b/rtdata/iccprofiles/output/RTv2_Medium.icc index 59bdf67067282c5abe83384f4e41303e901d0cdb..cc1f37d1d9fd8f5a9c01eb00d7a96e77cd5760e0 100644 GIT binary patch literal 884 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 diff --git a/rtdata/iccprofiles/output/RTv2_sRGB.icc b/rtdata/iccprofiles/output/RTv2_sRGB.icc index 5efc365f8e881f8b9e132538a324d16652203cf3..e311e5d71e11af3f0cd72c78ca2f23bbc23fff16 100644 GIT binary patch literal 25452 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 diff --git a/rtdata/iccprofiles/output/RTv4_Medium.icc b/rtdata/iccprofiles/output/RTv4_Medium.icc index d63965fa5bb813edae05a98c4512877cb41eb796..5e57952e33a1bf2275da225f3a03dbb594d5650f 100644 GIT binary patch delta 267 zcmeyvx`I`Qfq`j7PI7KBiva^eZeB@Ikh_yYL}Zi#`y&Q!Amn8bXW&UpE-vs5b_QkVb_4z$r(ktKs8H%Y?YMUJfQhZOeZD_FiLBx z0EJ{2d>K+1QW!EBN*Qt);u#be(iv0TOcr32mX!bs r$uI;lxHC90C@>^3lrm&8*l=mP1y$pMU?881xEVN!>aQu#N^@v-(a_p ziHTAZ-8}1Uk_(DT7#J7>7#J9$%1a7B>@`5PNODGE3XpvO$kr(W8Ukd$0f{Gp*-Stt zgGf4rEdpW}g#$ax#B^k`0Hd_3 z0#HbXp_n0v!JWa0A)Y~jA)UdN!H7YR!34-I2C@wqj3;|Aer7yB*@j6SPWCXR000X! BG&TSL diff --git a/rtgui/iccprofilecreator.cc b/rtgui/iccprofilecreator.cc index 8d6e09553..f76211bd4 100644 --- a/rtgui/iccprofilecreator.cc +++ b/rtgui/iccprofilecreator.cc @@ -41,7 +41,7 @@ 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) + : Gtk::Dialog(M("MAIN_BUTTON_ICCPROFCREATOR"), *rtwindow, true) , primariesPreset(options.ICCPC_primariesPreset) , redPrimaryX(options.ICCPC_redPrimaryX) , redPrimaryY(options.ICCPC_redPrimaryY) @@ -141,12 +141,15 @@ ICCProfileCreator::ICCProfileCreator(RTWindow *rtwindow) setExpandAlignProperties(trcPresets, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_BASELINE); std::vector 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 @@ -157,6 +160,7 @@ ICCProfileCreator::ICCProfileCreator(RTWindow *rtwindow) if (aGamma->delay < options.adjusterMaxDelay) { aGamma->delay = options.adjusterMaxDelay; } + aGamma->show(); mainGrid->attach(*aGamma, 1, 3, 1, 1); //gamma @@ -166,6 +170,7 @@ ICCProfileCreator::ICCProfileCreator(RTWindow *rtwindow) if (aSlope->delay < options.adjusterMaxDelay) { aSlope->delay = options.adjusterMaxDelay; } + aSlope->show(); mainGrid->attach(*aSlope, 1, 4, 1, 1); //slope @@ -222,10 +227,10 @@ ICCProfileCreator::ICCProfileCreator(RTWindow *rtwindow) setExpandAlignProperties(eCopyright, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); copygrid->attach(*eCopyright, 0, 0, 1, 1); resetCopyright = Gtk::manage(new Gtk::Button()); - resetCopyright->add (*Gtk::manage (new RTImage ("undo-small.png", "redo-small.png"))); + resetCopyright->add(*Gtk::manage(new RTImage("undo-small.png", "redo-small.png"))); setExpandAlignProperties(resetCopyright, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); - resetCopyright->set_relief (Gtk::RELIEF_NONE); - resetCopyright->set_tooltip_markup (M("ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP")); + resetCopyright->set_relief(Gtk::RELIEF_NONE); + resetCopyright->set_tooltip_markup(M("ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP")); resetCopyright->get_style_context()->add_class(GTK_STYLE_CLASS_FLAT); resetCopyright->set_can_focus(false); copygrid->attach(*resetCopyright, 1, 0, 1, 1); @@ -273,6 +278,7 @@ ICCProfileCreator::ICCProfileCreator(RTWindow *rtwindow) } trcPresets->set_active(0); + if (gammaPreset != "Custom") { trcPresets->set_active_text(gammaPreset); } @@ -309,6 +315,7 @@ ICCProfileCreator::ICCProfileCreator(RTWindow *rtwindow) } iccVersion->set_active(0); + if (profileVersion == "v2") { iccVersion->set_active(1); } @@ -319,17 +326,17 @@ ICCProfileCreator::ICCProfileCreator(RTWindow *rtwindow) //--------------- 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* 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); + 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 (); + show_all_children(); //--------------- Connecting the signals @@ -366,9 +373,8 @@ void ICCProfileCreator::updateICCVersion() void ICCProfileCreator::adjusterChanged(Adjuster* a, double newval) { if (a == aPrimariesRedX || a == aPrimariesRedY || - a == aPrimariesGreenX || a == aPrimariesGreenY || - a == aPrimariesBlueX || a == aPrimariesBlueY) - { + a == aPrimariesGreenX || a == aPrimariesGreenY || + a == aPrimariesBlueX || a == aPrimariesBlueY) { if (primaries->get_active_row_number() > 0) { ConnectionBlocker blocker(primariesconn); primaries->set_active(0); @@ -401,6 +407,7 @@ void ICCProfileCreator::primariesChanged() aPrimariesBlueX->setValue(p[4]); aPrimariesBlueY->setValue(p[5]); } + updateICCVersion(); } @@ -497,6 +504,7 @@ Glib::ustring ICCProfileCreator::getPrimariesPresetName(const Glib::ustring &pre void ICCProfileCreator::getPrimaries(const Glib::ustring &preset, float *p, ColorTemp &temp) { temp = ColorTemp::D50; + if (preset == "Widegamut") { p[0] = 0.7350; //Widegamut primaries p[1] = 0.2650; @@ -595,9 +603,11 @@ void ICCProfileCreator::getPrimaries(const Glib::ustring &preset, float *p, Colo Glib::ustring ICCProfileCreator::getGammaPresetName(const Glib::ustring &preset) { Glib::ustring name(trcPresets->get_active_text()); + if (name == M("ICCPROFCREATOR_CUSTOM")) { name = "Custom"; } + return name; } @@ -646,6 +656,8 @@ void ICCProfileCreator::onResetCopyright() void ICCProfileCreator::savePressed() { cmsHPROFILE newProfile = nullptr; + cmsHPROFILE profile_v2_except = nullptr; + Glib::ustring sNewProfile; Glib::ustring sPrimariesPreset; Glib::ustring sGammaPreset; @@ -653,47 +665,57 @@ void ICCProfileCreator::savePressed() storeValues(); // -------------------------------------------- Compute the default file name + // -----------------setmedia white point for monitor profile sRGB or AdobeRGB in case of profile used for monitor--------------------- + //instead of calculations made by LCMS..small differences + + v2except = (profileVersion == "v2" && (primariesPreset == "sRGB" || primariesPreset == "Adobe") && illuminant == "DEF"); //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)) { - sNewProfile = options.rtSettings.prophoto; - 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)) { - sNewProfile = options.rtSettings.srgb; - 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()); + + if (!v2except) { + 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)) { + sNewProfile = options.rtSettings.prophoto; + 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)) { + sNewProfile = options.rtSettings.srgb; + 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; } - return; + } else { + sNewProfile = "RTv2_Beta"; } //begin adaptation rTRC gTRC bTRC @@ -702,16 +724,23 @@ void ICCProfileCreator::savePressed() printf("Output Gamma - profile Primaries as RT profile: \"%s\"\n", sNewProfile.c_str()); } - newProfile = rtengine::ICCStore::getInstance()->getProfile(sNewProfile); //get output profile + if (!v2except) { + newProfile = rtengine::ICCStore::getInstance()->getProfile(sNewProfile); //get output profile + } else { + profile_v2_except = 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; } + /* + if (newProfile == nullptr ) { + + if (rtengine::settings->verbose) { + printf("\"%s\" ICC output profile not found!\n", sNewProfile.c_str()); + } + + return; + } + */ //change desc Tag , to "free gamma", or "BT709", etc. Glib::ustring fName; Glib::ustring sPrimariesAndIlluminant; @@ -719,6 +748,7 @@ void ICCProfileCreator::savePressed() double presetSlope = 12.92310; const double eps = 0.000000001; // not divide by zero getGamma(gammaPreset, presetGamma, presetSlope); + if (gammaPreset == "High_g1.3_s3.35") { sGammaPreset = "High_g=1.3_s=3.35"; ga[0] = 1.3 ; //for high dynamic images @@ -786,17 +816,18 @@ void ICCProfileCreator::savePressed() 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[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)); + 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; @@ -804,8 +835,7 @@ void ICCProfileCreator::savePressed() sPrimariesAndIlluminant = sPrimariesPreset; if (profileVersion == "v4" && illuminant != "DEF") { - sPrimariesPreset += "-" + illuminant; - // printf("outpr=%s \n",outPr.c_str()); + sPrimariesPreset += "-" + illuminant; } Glib::ustring profileDesc; @@ -815,16 +845,17 @@ void ICCProfileCreator::savePressed() Glib::ustring sSlope; if (gammaPreset == "Custom") { - sGamma = Glib::ustring::format (std::setw(3), std::fixed, std::setprecision(2), gamma); - sSlope = Glib::ustring::format (std::setw(6), std::fixed, std::setprecision(5), slope); + sGamma = Glib::ustring::format(std::setw(3), std::fixed, std::setprecision(2), gamma); + sSlope = Glib::ustring::format(std::setw(6), std::fixed, std::setprecision(5), slope); fName = Glib::ustring::compose("RT%1_%2_g%3_s%4.icc", profileVersion, sPrimariesAndIlluminant, sGamma, sSlope); profileDesc = sPrimariesPreset; } else { - sGamma = Glib::ustring::format (std::setw(3), std::fixed, std::setprecision(2), presetGamma); - sSlope = Glib::ustring::format (std::setw(6), std::fixed, std::setprecision(5), presetSlope); + sGamma = Glib::ustring::format(std::setw(3), std::fixed, std::setprecision(2), presetGamma); + sSlope = Glib::ustring::format(std::setw(6), std::fixed, std::setprecision(5), presetSlope); fName = Glib::ustring::compose("RT%1_%2_%3.icc", profileVersion, sPrimariesAndIlluminant, sGammaPreset); profileDesc == sPrimariesPreset + sGammaPreset; } + sGammaSlopeParam = Glib::ustring::compose("g%1s%2!", sGamma, sSlope); sGammaSlopeDesc = Glib::ustring::compose("g=%1 s=%2", sGamma, sSlope); @@ -876,12 +907,13 @@ void ICCProfileCreator::savePressed() } while (1); // --------------- main tags ------------------ - - if (profileVersion == "v4") { - cmsSetProfileVersion(newProfile, 4.3); - } else { - cmsSetProfileVersion(newProfile, 2.0); - } + /* + if (profileVersion == "v4") { + cmsSetProfileVersion(newProfile, 4.3); + } else { + cmsSetProfileVersion(newProfile, 2.0); + } + */ //change float p[6]; //primaries @@ -897,8 +929,17 @@ void ICCProfileCreator::savePressed() {p[4], p[5], 1.0} // blue }; + + if (v2except) { + cmsSetDeviceClass(profile_v2_except, cmsSigDisplayClass); + cmsSetPCS(profile_v2_except, cmsSigXYZData); + cmsSetHeaderRenderingIntent(profile_v2_except, 0); + } + + if (profileVersion == "v4" && illuminant != "DEF") { double tempv4 = 5000.; + if (illuminant == "D41") { tempv4 = 4100.; } else if (illuminant == "D50") { @@ -914,9 +955,81 @@ void ICCProfileCreator::savePressed() } else if (illuminant == "stdA") { tempv4 = 5003.; } + cmsWhitePointFromTemp(&xyD, tempv4); } else { - cmsWhitePointFromTemp(&xyD, (double)temp); + if (v2except) { + + cmsCIExyY XYZ; + + { + // XYZ = {0.950486322, 1.0, 1.08902736};//White D65 point calculated from white point xy 0,312710 y 0,3290 + // XYZ = {0.95047, 1.0, 1.088830};//White D65 point from B.Lindbloom + XYZ = {0.95045471, 1.0, 1.08905029}; + } + cmsCIExyY blackpoint; + + { + blackpoint = {0., 0., 0.};//White D65 point from the sRGB.icm and AdobeRGB1998 profile specs + } + + cmsWriteTag(profile_v2_except, cmsSigMediaBlackPointTag, &blackpoint); + cmsWriteTag(profile_v2_except, cmsSigMediaWhitePointTag, &XYZ); + cmsCIExyY rt; + cmsCIExyY bt; + cmsCIExyY gt; + + if (primariesPreset == "sRGB") { + + //Matrix value from B.Lindbloom + /* + rt = {0.4360747, 0.2225045, 0.0139322}; + cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); + bt = {0.1430804, 0.0606169, 0.7141733}; + cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); + gt = {0.3850649, 0.7168786, 0.0971045}; + cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); + } + */ + { + //Matrix value from spec Adobe + rt = {0.43607, 0.22249, 0.01392}; + cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); + bt = {0.14307, 0.06061, 0.71410}; + cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); + gt = {0.38515, 0.71687, 0.09708}; + cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); + + } + + } + + if (primariesPreset == "Adobe") { + { + //B.Lindbloom + /* + rt = {0.6097559, 0.3111242, 0.0194811}; + cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); + bt = {0.1492240, 0.0632197, 0.7448387}; + cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); + gt = {0.2052401, 0.6256560, 0.0608902}; + cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); + */ + } + { + //Adobe spec + rt = {0.60974, 0.31111, 0.01947}; + cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); + bt = {0.14919, 0.06322, 0.74457}; + cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); + gt = {0.20528, 0.62567, 0.06087}; + cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); + } + } + + } else { + cmsWhitePointFromTemp(&xyD, (double)temp); + } } if (illuminant == "stdA") { @@ -924,26 +1037,67 @@ void ICCProfileCreator::savePressed() } // Calculate output profile's rTRC gTRC bTRC + + cmsToneCurve* GammaTRC[3]; - GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildParametricToneCurve(nullptr, 5, ga); + + if (gammaPreset != "standard_g2.2" || gammaPreset != "standard_g1.8" || gammaPreset != "linear_g1.0") { + GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildParametricToneCurve(nullptr, 5, ga); + } + + if (gammaPreset == "standard_g2.2") { + GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildGamma(NULL, 2.19921875); + } + + if (gammaPreset == "standard_g1.8") { + GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildGamma(NULL, 1.80078125); + } + + if (gammaPreset == "linear_g1.0") { + GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildGamma(NULL, 1.0); + } + + if (profileVersion == "v4") { newProfile = cmsCreateRGBProfile(&xyD, &Primaries, GammaTRC); } - cmsWriteTag(newProfile, cmsSigRedTRCTag, GammaTRC[0]); - cmsWriteTag(newProfile, cmsSigGreenTRCTag, GammaTRC[1]); - cmsWriteTag(newProfile, cmsSigBlueTRCTag, GammaTRC[2]); + if (profileVersion == "v2") { + if (v2except) { + cmsSetProfileVersion(profile_v2_except, 2.2); + } else { + cmsSetProfileVersion(newProfile, 2.2); + } + } + + if (!v2except) { + cmsWriteTag(newProfile, cmsSigRedTRCTag, GammaTRC[0]); + cmsWriteTag(newProfile, cmsSigGreenTRCTag, GammaTRC[1]); + cmsWriteTag(newProfile, cmsSigBlueTRCTag, GammaTRC[2]); + } else { + cmsWriteTag(profile_v2_except, cmsSigRedTRCTag, GammaTRC[0]); + cmsWriteTag(profile_v2_except, cmsSigGreenTRCTag, GammaTRC[1]); + cmsWriteTag(profile_v2_except, cmsSigBlueTRCTag, GammaTRC[2]); + } // --------------- set dmnd tag ------------------ cmsMLU *dmnd; dmnd = cmsMLUalloc(nullptr, 1); cmsMLUsetASCII(dmnd, "en", "US", "RawTherapee"); - cmsWriteTag(newProfile, cmsSigDeviceMfgDescTag, dmnd); + + if (!v2except) { + cmsWriteTag(newProfile, cmsSigDeviceMfgDescTag, dmnd); + } else { + cmsWriteTag(profile_v2_except, cmsSigDeviceMfgDescTag, dmnd); + } + cmsMLUfree(dmnd); - // --------------- set dmdd tag ------------------ + + +// --------------- set dmdd tag ------------------ if (profileVersion == "v2") { //write in tag 'dmdd' values of current gamma and slope to retrieve after in Output profile @@ -951,27 +1105,43 @@ void ICCProfileCreator::savePressed() wGammaSlopeParam << sGammaSlopeParam; cmsMLU *dmdd = cmsMLUalloc(nullptr, 1); + // Language code (2 letters code) : https://www.iso.org/obp/ui/ // Country code (2 letters code) : http://www.loc.gov/standards/iso639-2/php/code_list.php if (sGammaSlopeParam.is_ascii()) { if (cmsMLUsetASCII(dmdd, "en", "US", sGammaSlopeParam.c_str())) { - if (!cmsWriteTag(newProfile, cmsSigProfileDescriptionTag, dmdd)) { - printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); + if (!v2except) { + if (!cmsWriteTag(newProfile, cmsSigProfileDescriptionTag, dmdd)) { + printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); + } + } else { + if (!cmsWriteTag(profile_v2_except, cmsSigProfileDescriptionTag, dmdd)) { + printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); + } + } } } else if (cmsMLUsetWide(dmdd, "en", "US", wGammaSlopeParam.str().c_str())) { - if (!cmsWriteTag(newProfile, cmsSigDeviceModelDescTag, dmdd)) { - printf("Error: Can't write cmsSigDeviceModelDescTag!\n"); + if (!v2except) { + if (!cmsWriteTag(newProfile, cmsSigDeviceModelDescTag, dmdd)) { + printf("Error: Can't write cmsSigDeviceModelDescTag!\n"); + } + } else { + if (!cmsWriteTag(profile_v2_except, cmsSigDeviceModelDescTag, dmdd)) { + printf("Error: Can't write cmsSigDeviceModelDescTag!\n"); + } } } else { printf("Error: cmsMLUsetWide failed for dmdd \"%s\" !\n", sGammaSlopeParam.c_str()); } + cmsMLUfree(dmdd); } - // --------------- set desc tag ------------------ +// --------------- set desc tag ------------------ Glib::ustring sDescription; + if (!description.empty()) { if (cAppendParamsToDesc->get_active()) { sDescription = description + " / " + sGammaSlopeDesc; @@ -986,41 +1156,66 @@ void ICCProfileCreator::savePressed() } } - //write in tag 'dmdd' values of current gamma and slope to retrieve after in Output profile +//write in tag 'dmdd' values of current gamma and slope to retrieve after in Output profile std::wostringstream wDescription; wDescription << sDescription; cmsMLU *descMLU = cmsMLUalloc(nullptr, 1); - // Language code (2 letters code) : https://www.iso.org/obp/ui/ - // Country code (2 letters code) : http://www.loc.gov/standards/iso639-2/php/code_list.php + +// Language code (2 letters code) : https://www.iso.org/obp/ui/ +// Country code (2 letters code) : http://www.loc.gov/standards/iso639-2/php/code_list.php if (sDescription.is_ascii()) { if (cmsMLUsetASCII(descMLU, "en", "US", sDescription.c_str())) { - if (!cmsWriteTag(newProfile, cmsSigProfileDescriptionTag, descMLU)) { - printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); + if (!v2except) { + if (!cmsWriteTag(newProfile, cmsSigProfileDescriptionTag, descMLU)) { + printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); + } + } else { + if (!cmsWriteTag(profile_v2_except, cmsSigProfileDescriptionTag, descMLU)) { + printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); + } } } } else if (cmsMLUsetWide(descMLU, "en", "US", wDescription.str().c_str())) { - if (!cmsWriteTag(newProfile, cmsSigProfileDescriptionTag, descMLU)) { - printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); + if (!v2except) { + + if (!cmsWriteTag(newProfile, cmsSigProfileDescriptionTag, descMLU)) { + printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); + } + } else { + if (!cmsWriteTag(profile_v2_except, cmsSigProfileDescriptionTag, descMLU)) { + printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); + } } } else { printf("Error: cmsMLUsetWide failed for desc \"%s\" !\n", sDescription.c_str()); } + cmsMLUfree(descMLU); - // --------------- set cprt tag ------------------ +// --------------- set cprt tag ------------------ std::wostringstream wCopyright; wCopyright << copyright; cmsMLU *copyMLU = cmsMLUalloc(nullptr, 1); + if (cmsMLUsetWide(copyMLU, "en", "US", wCopyright.str().c_str())) { - if (!cmsWriteTag(newProfile, cmsSigCopyrightTag, copyMLU)) { - printf("Error: Can't write cmsSigCopyrightTag!\n"); + if (!v2except) { + + if (!cmsWriteTag(newProfile, cmsSigCopyrightTag, copyMLU)) { + printf("Error: Can't write cmsSigCopyrightTag!\n"); + } + } else { + if (!cmsWriteTag(profile_v2_except, cmsSigCopyrightTag, copyMLU)) { + printf("Error: Can't write cmsSigCopyrightTag!\n"); + } + } } else { printf("Error: cmsMLUsetWide failed for cprt \"%s\" !\n", copyright.c_str()); } + cmsMLUfree(copyMLU); @@ -1030,8 +1225,13 @@ void ICCProfileCreator::savePressed() cmsCIEXYZ *blueT = static_cast(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); */ + if (!v2except) { + cmsSaveProfileToFile(newProfile, absoluteFName.c_str()); + } else { + printf("save except\n"); + cmsSaveProfileToFile(profile_v2_except, absoluteFName.c_str()); - cmsSaveProfileToFile(newProfile, absoluteFName.c_str()); + } cmsFreeToneCurve(GammaTRC[0]); } diff --git a/rtgui/iccprofilecreator.h b/rtgui/iccprofilecreator.h index 4ec73ff5c..e8de318d3 100644 --- a/rtgui/iccprofilecreator.h +++ b/rtgui/iccprofilecreator.h @@ -50,7 +50,7 @@ private: double gamma; double slope; bool appendParamsToDesc; - + bool v2except; Glib::ustring profileVersion; Glib::ustring illuminant; Glib::ustring description; diff --git a/rtgui/preferences.cc b/rtgui/preferences.cc index 147e6badd..1887bb7a5 100644 --- a/rtgui/preferences.cc +++ b/rtgui/preferences.cc @@ -769,8 +769,13 @@ Gtk::Widget* Preferences::getColorManPanel () const std::vector profiles = rtengine::ICCStore::getInstance ()->getProfiles (rtengine::ICCStore::ProfileType::MONITOR); for (const auto profile : profiles) { - if (profile.find ("file:") != 0) { - monProfile->append (profile); + if (profile.find("file:") != 0) { + std::string fileis_RTv4 = profile.substr(0, 4); + + if (fileis_RTv4 != "RTv4") { + // printf("pro=%s \n", profile.c_str()); + monProfile->append(profile); + } } } From f179eb83331a3cc930f6e2a4b1b401de02e8a7bf Mon Sep 17 00:00:00 2001 From: Roel Baars <6567747+Thanatomanic@users.noreply.github.com> Date: Sun, 11 Nov 2018 14:48:44 +0100 Subject: [PATCH 03/60] Add safeguards for setjmp calls when compiling with clang --- rtengine/imageio.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index 802365d74..9ac72be58 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -447,7 +447,7 @@ void my_error_exit (j_common_ptr cinfo) (*cinfo->err->output_message) (cinfo); /* Return control to the setjmp point */ -#if defined( WIN32 ) && defined( __x86_64__ ) +#if defined( WIN32 ) && defined( __x86_64__ ) && !defined(__clang__) __builtin_longjmp(myerr->setjmp_buffer, 1); #else longjmp(myerr->setjmp_buffer, 1); @@ -471,7 +471,7 @@ int ImageIO::loadJPEGFromMemory (const char* buffer, int bufsize) jerr.pub.error_exit = my_error_exit; /* Establish the setjmp return context for my_error_exit to use. */ -#if defined( WIN32 ) && defined( __x86_64__ ) +#if defined( WIN32 ) && defined( __x86_64__ ) && !defined(__clang__) if (__builtin_setjmp(jerr.setjmp_buffer)) { #else @@ -1134,7 +1134,7 @@ int ImageIO::saveJPEG (Glib::ustring fname, int quality, int subSamp) jerr.pub.error_exit = my_error_exit; /* Establish the setjmp return context for my_error_exit to use. */ -#if defined( WIN32 ) && defined( __x86_64__ ) +#if defined( WIN32 ) && defined( __x86_64__ ) && !defined(__clang__) if (__builtin_setjmp(jerr.setjmp_buffer)) { #else @@ -1252,7 +1252,7 @@ int ImageIO::saveJPEG (Glib::ustring fname, int quality, int subSamp) unsigned char *row = new unsigned char [rowlen]; /* To avoid memory leaks we establish a new setjmp return context for my_error_exit to use. */ -#if defined( WIN32 ) && defined( __x86_64__ ) +#if defined( WIN32 ) && defined( __x86_64__ ) && !defined(__clang__) if (__builtin_setjmp(jerr.setjmp_buffer)) { #else From efccb23a5c95a0152d61edb275201b26698604cb Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sun, 11 Nov 2018 16:16:59 +0100 Subject: [PATCH 04/60] Change line endings to LF --- rtgui/iccprofilecreator.cc | 2074 ++++++++++++++++++------------------ 1 file changed, 1037 insertions(+), 1037 deletions(-) diff --git a/rtgui/iccprofilecreator.cc b/rtgui/iccprofilecreator.cc index 8d6e09553..23c8472c5 100644 --- a/rtgui/iccprofilecreator.cc +++ b/rtgui/iccprofilecreator.cc @@ -1,1037 +1,1037 @@ -/* - * This file is part of RawTherapee. - * - * Copyright (c) 2018 Jacques DESMIS - * Copyright (c) 2018 Jean-Christophe FRISCH - * - * 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 . - */ -#include -#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 -#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) - , appendParamsToDesc(options.ICCPC_appendParamsToDesc) - , profileVersion(options.ICCPC_profileVersion) - , illuminant(options.ICCPC_illuminant) - , description(options.ICCPC_description) - , copyright(options.ICCPC_copyright) - , parent(rtwindow) -{ - - set_default_size(600, -1); - - Gtk::Grid* mainGrid = Gtk::manage(new Gtk::Grid()); - mainGrid->set_column_spacing(3); - mainGrid->set_row_spacing(3); - - //--------------------------------- 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_CUSTOM")); - 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->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.0800, 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 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); - - //--------------------------------- Description - - Gtk::Label* desclab = Gtk::manage(new Gtk::Label(M("ICCPROFCREATOR_DESCRIPTION"))); - setExpandAlignProperties(desclab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_START); - mainGrid->attach(*desclab, 0, 7, 1, 2); - eDescription = Gtk::manage(new Gtk::Entry()); - setExpandAlignProperties(eDescription, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - eDescription->set_tooltip_text(M("ICCPROFCREATOR_DESCRIPTION_TOOLTIP")); - mainGrid->attach(*eDescription, 1, 7, 1, 1); - cAppendParamsToDesc = Gtk::manage(new Gtk::CheckButton(M("ICCPROFCREATOR_DESCRIPTION_ADDPARAM"))); - setExpandAlignProperties(cAppendParamsToDesc, true, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); - mainGrid->attach(*cAppendParamsToDesc, 1, 8, 1, 1); - - //--------------------------------- Copyright - - Gtk::Label* copylab = Gtk::manage(new Gtk::Label(M("ICCPROFCREATOR_COPYRIGHT"))); - setExpandAlignProperties(copylab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); - mainGrid->attach(*copylab, 0, 9, 1, 1); - Gtk::Grid* copygrid = Gtk::manage(new Gtk::Grid()); - setExpandAlignProperties(copygrid, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); - eCopyright = Gtk::manage(new Gtk::Entry()); - setExpandAlignProperties(eCopyright, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - copygrid->attach(*eCopyright, 0, 0, 1, 1); - resetCopyright = Gtk::manage(new Gtk::Button()); - resetCopyright->add (*Gtk::manage (new RTImage ("undo-small.png", "redo-small.png"))); - setExpandAlignProperties(resetCopyright, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); - resetCopyright->set_relief (Gtk::RELIEF_NONE); - resetCopyright->set_tooltip_markup (M("ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP")); - resetCopyright->get_style_context()->add_class(GTK_STYLE_CLASS_FLAT); - resetCopyright->set_can_focus(false); - copygrid->attach(*resetCopyright, 1, 0, 1, 1); - mainGrid->attach(*copygrid, 1, 9, 1, 1); - - //--------------------------------- Adding the mainGrid - - get_content_area()->add(*mainGrid); - - //--------------------------------- Setting default values for Adjusters - - aGamma->setDefault(gamma); - aSlope->setDefault(slope); - aPrimariesRedX->setDefault(redPrimaryX); - aPrimariesRedY->setDefault(redPrimaryY); - aPrimariesGreenX->setDefault(greenPrimaryX); - aPrimariesGreenY->setDefault(greenPrimaryY); - aPrimariesBlueX->setDefault(bluePrimaryX); - aPrimariesBlueY->setDefault(bluePrimaryY); - - //--------------- Updating widgets with actual values (from options) - - if (primariesPreset == "custom") { - primaries->set_active_text(M("ICCPROFCREATOR_CUSTOM")); - } else 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")); - } - - trcPresets->set_active(0); - if (gammaPreset != "Custom") { - trcPresets->set_active_text(gammaPreset); - } - - aGamma->setValue(gamma); - aSlope->setValue(slope); - aPrimariesRedX->setValue(redPrimaryX); - aPrimariesRedY->setValue(redPrimaryY); - aPrimariesGreenX->setValue(greenPrimaryX); - aPrimariesGreenY->setValue(greenPrimaryY); - aPrimariesBlueX->setValue(bluePrimaryX); - aPrimariesBlueY->setValue(bluePrimaryY); - - eDescription->set_text(description); - eCopyright->set_text(copyright); - cAppendParamsToDesc->set_active(appendParamsToDesc); - - 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)); - resetCopyright->signal_clicked().connect(sigc::mem_fun(*this, &ICCProfileCreator::onResetCopyright)); -} - -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::adjusterChanged(Adjuster* a, double newval) -{ - if (a == aPrimariesRedX || a == aPrimariesRedY || - a == aPrimariesGreenX || a == aPrimariesGreenY || - a == aPrimariesBlueX || a == aPrimariesBlueY) - { - if (primaries->get_active_row_number() > 0) { - ConnectionBlocker blocker(primariesconn); - primaries->set_active(0); - updateICCVersion(); - } - } else if (a == aGamma || a == aSlope) { - if (trcPresets->get_active_row_number() > 0) { - ConnectionBlocker blocker(trcpresetsconn); - trcPresets->set_active(0); - } - } -} - -void ICCProfileCreator::adjusterAutoToggled(Adjuster* a, bool newval) -{ -} - -void ICCProfileCreator::primariesChanged() -{ - if (primaries->get_active_row_number() > 0) { - float p[6]; - ColorTemp temp; - Glib::ustring activeValue = primaries->get_active_text(); - Glib::ustring primPresetName = getPrimariesPresetName(activeValue); - getPrimaries(primPresetName, p, temp); - aPrimariesRedX->setValue(p[0]); - aPrimariesRedY->setValue(p[1]); - aPrimariesGreenX->setValue(p[2]); - aPrimariesGreenY->setValue(p[3]); - aPrimariesBlueX->setValue(p[4]); - aPrimariesBlueY->setValue(p[5]); - } - updateICCVersion(); -} - -void ICCProfileCreator::illuminantChanged() -{ - updateICCVersion(); -} - -void ICCProfileCreator::trcPresetsChanged() -{ - aGamma->block(true); - aSlope->block(true); - - double gamma; - double slope; - getGamma(getGammaPresetName(trcPresets->get_active_text()), gamma, slope); - aGamma->setValue(gamma); - aSlope->setValue(slope); - - 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"; - } - - 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"; - } - - options.ICCPC_primariesPreset = primariesPreset = getPrimariesPresetName(primaries->get_active_text()); - options.ICCPC_gammaPreset = gammaPreset = getGammaPresetName(trcPresets->get_active_text()); - 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(); - options.ICCPC_description = description = eDescription->get_text(); - options.ICCPC_copyright = copyright = eCopyright->get_text(); - options.ICCPC_appendParamsToDesc = appendParamsToDesc = cAppendParamsToDesc->get_active(); -} - -Glib::ustring ICCProfileCreator::getPrimariesPresetName(const Glib::ustring &preset) -{ - if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_ACESP0")) { - return Glib::ustring("ACES-AP0"); - } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_ACESP1")) { - return Glib::ustring("ACES-AP1"); - } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_ADOBE")) { - return Glib::ustring("Adobe"); - } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_PROPH")) { - return Glib::ustring("ProPhoto"); - } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_REC2020")) { - return Glib::ustring("Rec2020"); - } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_SRGB")) { - return Glib::ustring("sRGB"); - } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_WIDEG")) { - return Glib::ustring("Widegamut"); - } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_BEST")) { - return Glib::ustring("BestRGB"); - } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_BETA")) { - return Glib::ustring("BetaRGB"); - } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_BRUCE")) { - return Glib::ustring("BruceRGB"); - } else if (primaries->get_active_text() == M("ICCPROFCREATOR_CUSTOM")) { - return Glib::ustring("custom"); - } else { - return Glib::ustring(); - } -} - -void ICCProfileCreator::getPrimaries(const Glib::ustring &preset, float *p, ColorTemp &temp) -{ - temp = ColorTemp::D50; - if (preset == "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 (preset == "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 (preset == "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 (preset == "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 (preset == "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 (preset == "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 (preset == "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 (preset == "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 (preset == "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 (preset == "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 (preset == "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; - } -} - -Glib::ustring ICCProfileCreator::getGammaPresetName(const Glib::ustring &preset) -{ - Glib::ustring name(trcPresets->get_active_text()); - if (name == M("ICCPROFCREATOR_CUSTOM")) { - name = "Custom"; - } - return name; -} - -void ICCProfileCreator::getGamma(const Glib::ustring &preset, double &presetGamma, double &presetSlope) -{ - if (preset == "High_g1.3_s3.35") { - presetGamma = 1.3; - presetSlope = 3.35; - } else if (preset == "Low_g2.6_s6.9") { - presetGamma = 2.6; - presetSlope = 6.9; - } else if (preset == "sRGB_g2.4_s12.92") { - presetGamma = 2.4; - presetSlope = 12.92310; - } else if (preset == "BT709_g2.2_s4.5") { - presetGamma = 2.22; - presetSlope = 4.5; - } else if (preset == "linear_g1.0") { - presetGamma = 1.; - presetSlope = 0.; - } else if (preset == "standard_g2.2") { - presetGamma = 2.2; - presetSlope = 0.; - } else if (preset == "standard_g1.8") { - presetGamma = 1.8; - presetSlope = 0.; - } else if (preset == "Lab_g3.0s9.03296") { - presetGamma = 3.0; - presetSlope = 9.03296; - } else if (preset == "Custom") { - presetGamma = gamma; - presetSlope = slope; - } else { - presetGamma = 2.4; - presetSlope = 12.92310; - } -} - -void ICCProfileCreator::onResetCopyright() -{ - eCopyright->set_text(Options::getICCProfileCopyright()); -} - -// Copyright (c) 2018 Jacques DESMIS -// WARNING: the caller must lock lcmsMutex -void ICCProfileCreator::savePressed() -{ - cmsHPROFILE newProfile = nullptr; - Glib::ustring sNewProfile; - Glib::ustring sPrimariesPreset; - Glib::ustring sGammaPreset; - - storeValues(); - - // -------------------------------------------- Compute the default file name - - //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)) { - sNewProfile = options.rtSettings.prophoto; - 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)) { - sNewProfile = options.rtSettings.srgb; - 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; - } - - //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 - getGamma(gammaPreset, presetGamma, presetSlope); - if (gammaPreset == "High_g1.3_s3.35") { - sGammaPreset = "High_g=1.3_s=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"; - 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"; - 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"; - 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"; - 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"; - 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"; - 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"; - 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()); - } - - Glib::ustring profileDesc; - Glib::ustring sGammaSlopeParam;//to save gamma and slope in a dmdd - Glib::ustring sGammaSlopeDesc; //to save gamma and slope in a desc - Glib::ustring sGamma; - Glib::ustring sSlope; - - if (gammaPreset == "Custom") { - sGamma = Glib::ustring::format (std::setw(3), std::fixed, std::setprecision(2), gamma); - sSlope = Glib::ustring::format (std::setw(6), std::fixed, std::setprecision(5), slope); - fName = Glib::ustring::compose("RT%1_%2_g%3_s%4.icc", profileVersion, sPrimariesAndIlluminant, sGamma, sSlope); - profileDesc = sPrimariesPreset; - } else { - sGamma = Glib::ustring::format (std::setw(3), std::fixed, std::setprecision(2), presetGamma); - sSlope = Glib::ustring::format (std::setw(6), std::fixed, std::setprecision(5), presetSlope); - fName = Glib::ustring::compose("RT%1_%2_%3.icc", profileVersion, sPrimariesAndIlluminant, sGammaPreset); - profileDesc == sPrimariesPreset + sGammaPreset; - } - sGammaSlopeParam = Glib::ustring::compose("g%1s%2!", sGamma, sSlope); - sGammaSlopeDesc = Glib::ustring::compose("g=%1 s=%2", sGamma, 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 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 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); - - // --------------- main tags ------------------ - - if (profileVersion == "v4") { - cmsSetProfileVersion(newProfile, 4.3); - } else { - cmsSetProfileVersion(newProfile, 2.0); - } - -//change - float p[6]; //primaries - ga[6] = 0.0; - - ColorTemp temp; - getPrimaries(primariesPreset, p, temp); - - 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 - }; - - if (profileVersion == "v4" && illuminant != "DEF") { - double tempv4 = 5000.; - 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.; - } - 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, ga); - - if (profileVersion == "v4") { - newProfile = cmsCreateRGBProfile(&xyD, &Primaries, GammaTRC); - } - - cmsWriteTag(newProfile, cmsSigRedTRCTag, GammaTRC[0]); - cmsWriteTag(newProfile, cmsSigGreenTRCTag, GammaTRC[1]); - cmsWriteTag(newProfile, cmsSigBlueTRCTag, GammaTRC[2]); - - // --------------- set dmnd tag ------------------ - - cmsMLU *dmnd; - dmnd = cmsMLUalloc(nullptr, 1); - cmsMLUsetASCII(dmnd, "en", "US", "RawTherapee"); - cmsWriteTag(newProfile, cmsSigDeviceMfgDescTag, dmnd); - cmsMLUfree(dmnd); - - // --------------- set dmdd tag ------------------ - - if (profileVersion == "v2") { - //write in tag 'dmdd' values of current gamma and slope to retrieve after in Output profile - std::wostringstream wGammaSlopeParam; - wGammaSlopeParam << sGammaSlopeParam; - - cmsMLU *dmdd = cmsMLUalloc(nullptr, 1); - // Language code (2 letters code) : https://www.iso.org/obp/ui/ - // Country code (2 letters code) : http://www.loc.gov/standards/iso639-2/php/code_list.php - if (sGammaSlopeParam.is_ascii()) { - if (cmsMLUsetASCII(dmdd, "en", "US", sGammaSlopeParam.c_str())) { - if (!cmsWriteTag(newProfile, cmsSigProfileDescriptionTag, dmdd)) { - printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); - } - } - } else if (cmsMLUsetWide(dmdd, "en", "US", wGammaSlopeParam.str().c_str())) { - if (!cmsWriteTag(newProfile, cmsSigDeviceModelDescTag, dmdd)) { - printf("Error: Can't write cmsSigDeviceModelDescTag!\n"); - } - } else { - printf("Error: cmsMLUsetWide failed for dmdd \"%s\" !\n", sGammaSlopeParam.c_str()); - } - cmsMLUfree(dmdd); - } - - // --------------- set desc tag ------------------ - - Glib::ustring sDescription; - if (!description.empty()) { - if (cAppendParamsToDesc->get_active()) { - sDescription = description + " / " + sGammaSlopeDesc; - } else { - sDescription = description; - } - } else { - if (cAppendParamsToDesc->get_active()) { - sDescription = profileDesc + " / " + sGammaSlopeDesc; - } else { - sDescription = profileDesc; - } - } - - //write in tag 'dmdd' values of current gamma and slope to retrieve after in Output profile - std::wostringstream wDescription; - wDescription << sDescription; - - cmsMLU *descMLU = cmsMLUalloc(nullptr, 1); - // Language code (2 letters code) : https://www.iso.org/obp/ui/ - // Country code (2 letters code) : http://www.loc.gov/standards/iso639-2/php/code_list.php - if (sDescription.is_ascii()) { - if (cmsMLUsetASCII(descMLU, "en", "US", sDescription.c_str())) { - if (!cmsWriteTag(newProfile, cmsSigProfileDescriptionTag, descMLU)) { - printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); - } - } - } else if (cmsMLUsetWide(descMLU, "en", "US", wDescription.str().c_str())) { - if (!cmsWriteTag(newProfile, cmsSigProfileDescriptionTag, descMLU)) { - printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); - } - } else { - printf("Error: cmsMLUsetWide failed for desc \"%s\" !\n", sDescription.c_str()); - } - cmsMLUfree(descMLU); - - // --------------- set cprt tag ------------------ - - std::wostringstream wCopyright; - wCopyright << copyright; - - cmsMLU *copyMLU = cmsMLUalloc(nullptr, 1); - if (cmsMLUsetWide(copyMLU, "en", "US", wCopyright.str().c_str())) { - if (!cmsWriteTag(newProfile, cmsSigCopyrightTag, copyMLU)) { - printf("Error: Can't write cmsSigCopyrightTag!\n"); - } - } else { - printf("Error: cmsMLUsetWide failed for cprt \"%s\" !\n", copyright.c_str()); - } - cmsMLUfree(copyMLU); - - - /* //to read XYZ values - cmsCIEXYZ *redT = static_cast(cmsReadTag(newProfile, cmsSigRedMatrixColumnTag)); - cmsCIEXYZ *greenT = static_cast(cmsReadTag(newProfile, cmsSigGreenMatrixColumnTag)); - cmsCIEXYZ *blueT = static_cast(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); - */ - - cmsSaveProfileToFile(newProfile, absoluteFName.c_str()); - - cmsFreeToneCurve(GammaTRC[0]); -} +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2018 Jacques DESMIS + * Copyright (c) 2018 Jean-Christophe FRISCH + * + * 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 . + */ +#include +#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 +#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) + , appendParamsToDesc(options.ICCPC_appendParamsToDesc) + , profileVersion(options.ICCPC_profileVersion) + , illuminant(options.ICCPC_illuminant) + , description(options.ICCPC_description) + , copyright(options.ICCPC_copyright) + , parent(rtwindow) +{ + + set_default_size(600, -1); + + Gtk::Grid* mainGrid = Gtk::manage(new Gtk::Grid()); + mainGrid->set_column_spacing(3); + mainGrid->set_row_spacing(3); + + //--------------------------------- 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_CUSTOM")); + 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->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.0800, 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 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); + + //--------------------------------- Description + + Gtk::Label* desclab = Gtk::manage(new Gtk::Label(M("ICCPROFCREATOR_DESCRIPTION"))); + setExpandAlignProperties(desclab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_START); + mainGrid->attach(*desclab, 0, 7, 1, 2); + eDescription = Gtk::manage(new Gtk::Entry()); + setExpandAlignProperties(eDescription, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + eDescription->set_tooltip_text(M("ICCPROFCREATOR_DESCRIPTION_TOOLTIP")); + mainGrid->attach(*eDescription, 1, 7, 1, 1); + cAppendParamsToDesc = Gtk::manage(new Gtk::CheckButton(M("ICCPROFCREATOR_DESCRIPTION_ADDPARAM"))); + setExpandAlignProperties(cAppendParamsToDesc, true, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); + mainGrid->attach(*cAppendParamsToDesc, 1, 8, 1, 1); + + //--------------------------------- Copyright + + Gtk::Label* copylab = Gtk::manage(new Gtk::Label(M("ICCPROFCREATOR_COPYRIGHT"))); + setExpandAlignProperties(copylab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); + mainGrid->attach(*copylab, 0, 9, 1, 1); + Gtk::Grid* copygrid = Gtk::manage(new Gtk::Grid()); + setExpandAlignProperties(copygrid, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + eCopyright = Gtk::manage(new Gtk::Entry()); + setExpandAlignProperties(eCopyright, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + copygrid->attach(*eCopyright, 0, 0, 1, 1); + resetCopyright = Gtk::manage(new Gtk::Button()); + resetCopyright->add (*Gtk::manage (new RTImage ("undo-small.png", "redo-small.png"))); + setExpandAlignProperties(resetCopyright, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); + resetCopyright->set_relief (Gtk::RELIEF_NONE); + resetCopyright->set_tooltip_markup (M("ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP")); + resetCopyright->get_style_context()->add_class(GTK_STYLE_CLASS_FLAT); + resetCopyright->set_can_focus(false); + copygrid->attach(*resetCopyright, 1, 0, 1, 1); + mainGrid->attach(*copygrid, 1, 9, 1, 1); + + //--------------------------------- Adding the mainGrid + + get_content_area()->add(*mainGrid); + + //--------------------------------- Setting default values for Adjusters + + aGamma->setDefault(gamma); + aSlope->setDefault(slope); + aPrimariesRedX->setDefault(redPrimaryX); + aPrimariesRedY->setDefault(redPrimaryY); + aPrimariesGreenX->setDefault(greenPrimaryX); + aPrimariesGreenY->setDefault(greenPrimaryY); + aPrimariesBlueX->setDefault(bluePrimaryX); + aPrimariesBlueY->setDefault(bluePrimaryY); + + //--------------- Updating widgets with actual values (from options) + + if (primariesPreset == "custom") { + primaries->set_active_text(M("ICCPROFCREATOR_CUSTOM")); + } else 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")); + } + + trcPresets->set_active(0); + if (gammaPreset != "Custom") { + trcPresets->set_active_text(gammaPreset); + } + + aGamma->setValue(gamma); + aSlope->setValue(slope); + aPrimariesRedX->setValue(redPrimaryX); + aPrimariesRedY->setValue(redPrimaryY); + aPrimariesGreenX->setValue(greenPrimaryX); + aPrimariesGreenY->setValue(greenPrimaryY); + aPrimariesBlueX->setValue(bluePrimaryX); + aPrimariesBlueY->setValue(bluePrimaryY); + + eDescription->set_text(description); + eCopyright->set_text(copyright); + cAppendParamsToDesc->set_active(appendParamsToDesc); + + 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)); + resetCopyright->signal_clicked().connect(sigc::mem_fun(*this, &ICCProfileCreator::onResetCopyright)); +} + +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::adjusterChanged(Adjuster* a, double newval) +{ + if (a == aPrimariesRedX || a == aPrimariesRedY || + a == aPrimariesGreenX || a == aPrimariesGreenY || + a == aPrimariesBlueX || a == aPrimariesBlueY) + { + if (primaries->get_active_row_number() > 0) { + ConnectionBlocker blocker(primariesconn); + primaries->set_active(0); + updateICCVersion(); + } + } else if (a == aGamma || a == aSlope) { + if (trcPresets->get_active_row_number() > 0) { + ConnectionBlocker blocker(trcpresetsconn); + trcPresets->set_active(0); + } + } +} + +void ICCProfileCreator::adjusterAutoToggled(Adjuster* a, bool newval) +{ +} + +void ICCProfileCreator::primariesChanged() +{ + if (primaries->get_active_row_number() > 0) { + float p[6]; + ColorTemp temp; + Glib::ustring activeValue = primaries->get_active_text(); + Glib::ustring primPresetName = getPrimariesPresetName(activeValue); + getPrimaries(primPresetName, p, temp); + aPrimariesRedX->setValue(p[0]); + aPrimariesRedY->setValue(p[1]); + aPrimariesGreenX->setValue(p[2]); + aPrimariesGreenY->setValue(p[3]); + aPrimariesBlueX->setValue(p[4]); + aPrimariesBlueY->setValue(p[5]); + } + updateICCVersion(); +} + +void ICCProfileCreator::illuminantChanged() +{ + updateICCVersion(); +} + +void ICCProfileCreator::trcPresetsChanged() +{ + aGamma->block(true); + aSlope->block(true); + + double gamma; + double slope; + getGamma(getGammaPresetName(trcPresets->get_active_text()), gamma, slope); + aGamma->setValue(gamma); + aSlope->setValue(slope); + + 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"; + } + + 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"; + } + + options.ICCPC_primariesPreset = primariesPreset = getPrimariesPresetName(primaries->get_active_text()); + options.ICCPC_gammaPreset = gammaPreset = getGammaPresetName(trcPresets->get_active_text()); + 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(); + options.ICCPC_description = description = eDescription->get_text(); + options.ICCPC_copyright = copyright = eCopyright->get_text(); + options.ICCPC_appendParamsToDesc = appendParamsToDesc = cAppendParamsToDesc->get_active(); +} + +Glib::ustring ICCProfileCreator::getPrimariesPresetName(const Glib::ustring &preset) +{ + if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_ACESP0")) { + return Glib::ustring("ACES-AP0"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_ACESP1")) { + return Glib::ustring("ACES-AP1"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_ADOBE")) { + return Glib::ustring("Adobe"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_PROPH")) { + return Glib::ustring("ProPhoto"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_REC2020")) { + return Glib::ustring("Rec2020"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_SRGB")) { + return Glib::ustring("sRGB"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_WIDEG")) { + return Glib::ustring("Widegamut"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_BEST")) { + return Glib::ustring("BestRGB"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_BETA")) { + return Glib::ustring("BetaRGB"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_BRUCE")) { + return Glib::ustring("BruceRGB"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_CUSTOM")) { + return Glib::ustring("custom"); + } else { + return Glib::ustring(); + } +} + +void ICCProfileCreator::getPrimaries(const Glib::ustring &preset, float *p, ColorTemp &temp) +{ + temp = ColorTemp::D50; + if (preset == "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 (preset == "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 (preset == "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 (preset == "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 (preset == "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 (preset == "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 (preset == "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 (preset == "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 (preset == "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 (preset == "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 (preset == "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; + } +} + +Glib::ustring ICCProfileCreator::getGammaPresetName(const Glib::ustring &preset) +{ + Glib::ustring name(trcPresets->get_active_text()); + if (name == M("ICCPROFCREATOR_CUSTOM")) { + name = "Custom"; + } + return name; +} + +void ICCProfileCreator::getGamma(const Glib::ustring &preset, double &presetGamma, double &presetSlope) +{ + if (preset == "High_g1.3_s3.35") { + presetGamma = 1.3; + presetSlope = 3.35; + } else if (preset == "Low_g2.6_s6.9") { + presetGamma = 2.6; + presetSlope = 6.9; + } else if (preset == "sRGB_g2.4_s12.92") { + presetGamma = 2.4; + presetSlope = 12.92310; + } else if (preset == "BT709_g2.2_s4.5") { + presetGamma = 2.22; + presetSlope = 4.5; + } else if (preset == "linear_g1.0") { + presetGamma = 1.; + presetSlope = 0.; + } else if (preset == "standard_g2.2") { + presetGamma = 2.2; + presetSlope = 0.; + } else if (preset == "standard_g1.8") { + presetGamma = 1.8; + presetSlope = 0.; + } else if (preset == "Lab_g3.0s9.03296") { + presetGamma = 3.0; + presetSlope = 9.03296; + } else if (preset == "Custom") { + presetGamma = gamma; + presetSlope = slope; + } else { + presetGamma = 2.4; + presetSlope = 12.92310; + } +} + +void ICCProfileCreator::onResetCopyright() +{ + eCopyright->set_text(Options::getICCProfileCopyright()); +} + +// Copyright (c) 2018 Jacques DESMIS +// WARNING: the caller must lock lcmsMutex +void ICCProfileCreator::savePressed() +{ + cmsHPROFILE newProfile = nullptr; + Glib::ustring sNewProfile; + Glib::ustring sPrimariesPreset; + Glib::ustring sGammaPreset; + + storeValues(); + + // -------------------------------------------- Compute the default file name + + //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)) { + sNewProfile = options.rtSettings.prophoto; + 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)) { + sNewProfile = options.rtSettings.srgb; + 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; + } + + //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 + getGamma(gammaPreset, presetGamma, presetSlope); + if (gammaPreset == "High_g1.3_s3.35") { + sGammaPreset = "High_g=1.3_s=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"; + 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"; + 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"; + 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"; + 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"; + 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"; + 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"; + 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()); + } + + Glib::ustring profileDesc; + Glib::ustring sGammaSlopeParam;//to save gamma and slope in a dmdd + Glib::ustring sGammaSlopeDesc; //to save gamma and slope in a desc + Glib::ustring sGamma; + Glib::ustring sSlope; + + if (gammaPreset == "Custom") { + sGamma = Glib::ustring::format (std::setw(3), std::fixed, std::setprecision(2), gamma); + sSlope = Glib::ustring::format (std::setw(6), std::fixed, std::setprecision(5), slope); + fName = Glib::ustring::compose("RT%1_%2_g%3_s%4.icc", profileVersion, sPrimariesAndIlluminant, sGamma, sSlope); + profileDesc = sPrimariesPreset; + } else { + sGamma = Glib::ustring::format (std::setw(3), std::fixed, std::setprecision(2), presetGamma); + sSlope = Glib::ustring::format (std::setw(6), std::fixed, std::setprecision(5), presetSlope); + fName = Glib::ustring::compose("RT%1_%2_%3.icc", profileVersion, sPrimariesAndIlluminant, sGammaPreset); + profileDesc == sPrimariesPreset + sGammaPreset; + } + sGammaSlopeParam = Glib::ustring::compose("g%1s%2!", sGamma, sSlope); + sGammaSlopeDesc = Glib::ustring::compose("g=%1 s=%2", sGamma, 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 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 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); + + // --------------- main tags ------------------ + + if (profileVersion == "v4") { + cmsSetProfileVersion(newProfile, 4.3); + } else { + cmsSetProfileVersion(newProfile, 2.0); + } + +//change + float p[6]; //primaries + ga[6] = 0.0; + + ColorTemp temp; + getPrimaries(primariesPreset, p, temp); + + 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 + }; + + if (profileVersion == "v4" && illuminant != "DEF") { + double tempv4 = 5000.; + 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.; + } + 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, ga); + + if (profileVersion == "v4") { + newProfile = cmsCreateRGBProfile(&xyD, &Primaries, GammaTRC); + } + + cmsWriteTag(newProfile, cmsSigRedTRCTag, GammaTRC[0]); + cmsWriteTag(newProfile, cmsSigGreenTRCTag, GammaTRC[1]); + cmsWriteTag(newProfile, cmsSigBlueTRCTag, GammaTRC[2]); + + // --------------- set dmnd tag ------------------ + + cmsMLU *dmnd; + dmnd = cmsMLUalloc(nullptr, 1); + cmsMLUsetASCII(dmnd, "en", "US", "RawTherapee"); + cmsWriteTag(newProfile, cmsSigDeviceMfgDescTag, dmnd); + cmsMLUfree(dmnd); + + // --------------- set dmdd tag ------------------ + + if (profileVersion == "v2") { + //write in tag 'dmdd' values of current gamma and slope to retrieve after in Output profile + std::wostringstream wGammaSlopeParam; + wGammaSlopeParam << sGammaSlopeParam; + + cmsMLU *dmdd = cmsMLUalloc(nullptr, 1); + // Language code (2 letters code) : https://www.iso.org/obp/ui/ + // Country code (2 letters code) : http://www.loc.gov/standards/iso639-2/php/code_list.php + if (sGammaSlopeParam.is_ascii()) { + if (cmsMLUsetASCII(dmdd, "en", "US", sGammaSlopeParam.c_str())) { + if (!cmsWriteTag(newProfile, cmsSigProfileDescriptionTag, dmdd)) { + printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); + } + } + } else if (cmsMLUsetWide(dmdd, "en", "US", wGammaSlopeParam.str().c_str())) { + if (!cmsWriteTag(newProfile, cmsSigDeviceModelDescTag, dmdd)) { + printf("Error: Can't write cmsSigDeviceModelDescTag!\n"); + } + } else { + printf("Error: cmsMLUsetWide failed for dmdd \"%s\" !\n", sGammaSlopeParam.c_str()); + } + cmsMLUfree(dmdd); + } + + // --------------- set desc tag ------------------ + + Glib::ustring sDescription; + if (!description.empty()) { + if (cAppendParamsToDesc->get_active()) { + sDescription = description + " / " + sGammaSlopeDesc; + } else { + sDescription = description; + } + } else { + if (cAppendParamsToDesc->get_active()) { + sDescription = profileDesc + " / " + sGammaSlopeDesc; + } else { + sDescription = profileDesc; + } + } + + //write in tag 'dmdd' values of current gamma and slope to retrieve after in Output profile + std::wostringstream wDescription; + wDescription << sDescription; + + cmsMLU *descMLU = cmsMLUalloc(nullptr, 1); + // Language code (2 letters code) : https://www.iso.org/obp/ui/ + // Country code (2 letters code) : http://www.loc.gov/standards/iso639-2/php/code_list.php + if (sDescription.is_ascii()) { + if (cmsMLUsetASCII(descMLU, "en", "US", sDescription.c_str())) { + if (!cmsWriteTag(newProfile, cmsSigProfileDescriptionTag, descMLU)) { + printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); + } + } + } else if (cmsMLUsetWide(descMLU, "en", "US", wDescription.str().c_str())) { + if (!cmsWriteTag(newProfile, cmsSigProfileDescriptionTag, descMLU)) { + printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); + } + } else { + printf("Error: cmsMLUsetWide failed for desc \"%s\" !\n", sDescription.c_str()); + } + cmsMLUfree(descMLU); + + // --------------- set cprt tag ------------------ + + std::wostringstream wCopyright; + wCopyright << copyright; + + cmsMLU *copyMLU = cmsMLUalloc(nullptr, 1); + if (cmsMLUsetWide(copyMLU, "en", "US", wCopyright.str().c_str())) { + if (!cmsWriteTag(newProfile, cmsSigCopyrightTag, copyMLU)) { + printf("Error: Can't write cmsSigCopyrightTag!\n"); + } + } else { + printf("Error: cmsMLUsetWide failed for cprt \"%s\" !\n", copyright.c_str()); + } + cmsMLUfree(copyMLU); + + + /* //to read XYZ values + cmsCIEXYZ *redT = static_cast(cmsReadTag(newProfile, cmsSigRedMatrixColumnTag)); + cmsCIEXYZ *greenT = static_cast(cmsReadTag(newProfile, cmsSigGreenMatrixColumnTag)); + cmsCIEXYZ *blueT = static_cast(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); + */ + + cmsSaveProfileToFile(newProfile, absoluteFName.c_str()); + + cmsFreeToneCurve(GammaTRC[0]); +} From 5e0cbd4c683b5edef32635c094536300b0c85a26 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sun, 11 Nov 2018 16:18:06 +0100 Subject: [PATCH 05/60] Bug in iccprofilecreator.cc found by clang, fixes #4973 --- rtgui/iccprofilecreator.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtgui/iccprofilecreator.cc b/rtgui/iccprofilecreator.cc index 23c8472c5..a2c1c60d4 100644 --- a/rtgui/iccprofilecreator.cc +++ b/rtgui/iccprofilecreator.cc @@ -823,7 +823,7 @@ void ICCProfileCreator::savePressed() sGamma = Glib::ustring::format (std::setw(3), std::fixed, std::setprecision(2), presetGamma); sSlope = Glib::ustring::format (std::setw(6), std::fixed, std::setprecision(5), presetSlope); fName = Glib::ustring::compose("RT%1_%2_%3.icc", profileVersion, sPrimariesAndIlluminant, sGammaPreset); - profileDesc == sPrimariesPreset + sGammaPreset; + profileDesc = sPrimariesPreset + sGammaPreset; } sGammaSlopeParam = Glib::ustring::compose("g%1s%2!", sGamma, sSlope); sGammaSlopeDesc = Glib::ustring::compose("g=%1 s=%2", sGamma, sSlope); From 513b582b4d71ecf82e1e22f9e771e1fe533a1f59 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Sun, 11 Nov 2018 22:08:29 +0100 Subject: [PATCH 06/60] Updated rtexif using ExifTool-11.17 Closes #4921 --- rtexif/canonattribs.cc | 52 +++++++++++++++++++++++++++++++----- rtexif/nikonattribs.cc | 39 ++++++++++++++++++++++----- rtexif/pentaxattribs.cc | 1 + rtexif/sonyminoltaattribs.cc | 31 ++++++++++++++++++++- 4 files changed, 109 insertions(+), 14 deletions(-) diff --git a/rtexif/canonattribs.cc b/rtexif/canonattribs.cc index 2e2eea676..17ce4f343 100644 --- a/rtexif/canonattribs.cc +++ b/rtexif/canonattribs.cc @@ -567,6 +567,7 @@ public: {6, "Sigma 18-125mm f/3.5-5.6 DC IF ASP"}, {6, "Tokina AF 193-2 19-35mm f/3.5-4.5"}, {6, "Sigma 28-80mm f/3.5-5.6 II Macro"}, + {6, "Sigma 28-300mm f/3.5-6.3 DG Macro"}, {7, "Canon EF 100-300mm f/5.6L"}, {8, "Canon EF 100-300mm f/5.6 or Sigma or Tokina Lens"}, {8, "Sigma 70-300mm f/4-5.6 [APO] DG Macro"}, @@ -656,7 +657,9 @@ public: {82, "Canon TS-E 135mm f/4L Macro"}, {94, "Canon TS-E 17mm f/4L"}, {95, "Canon TS-E 24mm f/3.5L II"}, - {103, "Samyang AF 14mm f/2.8 EF"}, + {103, "Samyang AF 14mm f/2.8 EF or Rokinon Lens"}, + {103, "Rokinon SP 14mm f/2.4"}, + {103, "Rokinon AF 14mm f/2.8 EF"}, {124, "Canon MP-E 65mm f/2.8 1-5x Macro Photo"}, {125, "Canon TS-E 24mm f/3.5L"}, {126, "Canon TS-E 45mm f/2.8"}, @@ -733,7 +736,7 @@ public: {160, "Tokina AT-X 107 AF DX 10-17mm f/3.5-4.5 Fisheye"}, {160, "Tokina AT-X 116 AF Pro DX 11-16mm f/2.8"}, {160, "Tokina AT-X 11-20 F2.8 PRO DX Aspherical 11-20mm f/2.8"}, - {161, "Canon EF 28-70mm f/2.8L USM or Sigma or Tamron Lens"}, + {161, "Canon EF 28-70mm f/2.8L USM or Other Lens"}, {161, "Sigma 24-70mm f/2.8 EX"}, {161, "Sigma 28-70mm f/2.8 EX"}, {161, "Sigma 24-60mm f/2.8 EX DG"}, @@ -741,6 +744,7 @@ public: {161, "Tamron 90mm f/2.8"}, {161, "Tamron SP AF 17-35mm f/2.8-4 Di LD Aspherical IF"}, {161, "Tamron SP AF 28-75mm f/2.8 XR Di LD Aspherical [IF] Macro"}, + {161, "Tokina AT-X 24-70mm f/2.8 PRO FX (IF)"}, {162, "Canon EF 200mm f/2.8L USM"}, {163, "Canon EF 300mm f/4L"}, {164, "Canon EF 400mm f/5.6L"}, @@ -757,6 +761,7 @@ public: {169, "Sigma 85mm f/1.4 EX DG HSM"}, {169, "Sigma 30mm f/1.4 EX DC HSM"}, {169, "Sigma 35mm f/1.4 DG HSM"}, + {169, "Sigma 35mm f/1.5 FF High-Speed Prime | 017"}, {170, "Canon EF 200mm f/2.8L II USM"}, {171, "Canon EF 300mm f/4L USM"}, {172, "Canon EF 400mm f/5.6L USM or Sigma Lens"}, @@ -780,6 +785,9 @@ public: {180, "Zeiss Milvus 50mm f/1.4"}, {180, "Zeiss Milvus 85mm f/1.4"}, {180, "Zeiss Otus 28mm f/1.4 ZE"}, + {180, "Sigma 24mm f/1.5 FF High-Speed Prime | 017"}, + {180, "Sigma 50mm f/1.5 FF High-Speed Prime | 017"}, + {180, "Sigma 85mm f/1.5 FF High-Speed Prime | 017"}, {181, "Canon EF 100-400mm f/4.5-5.6L IS USM + 1.4x or Sigma Lens"}, {181, "Sigma 150-600mm f/5-6.3 DG OS HSM | S + 1.4x"}, {182, "Canon EF 100-400mm f/4.5-5.6L IS USM + 2x or Sigma Lens"}, @@ -791,6 +799,7 @@ public: {183, "Sigma 150-600mm f/5-6.3 DG OS HSM | C"}, {183, "Sigma 150-600mm f/5-6.3 DG OS HSM | S"}, {183, "Sigma 100-400mm f/5-6.3 DG OS HSM"}, + {183, "Sigma 180mm f/3.5 APO Macro EX DG IF HSM"}, {184, "Canon EF 400mm f/2.8L USM + 2x"}, {185, "Canon EF 600mm f/4L IS USM"}, {186, "Canon EF 70-200mm f/4L USM"}, @@ -798,7 +807,8 @@ public: {188, "Canon EF 70-200mm f/4L USM + 2x"}, {189, "Canon EF 70-200mm f/4L USM + 2.8x"}, {190, "Canon EF 100mm f/2.8 Macro USM"}, - {191, "Canon EF 400mm f/4 DO IS"}, + {191, "Canon EF 400mm f/4 DO IS or Sigma Lens"}, + {191, "Sigma 500mm f/4 DG OS HSM"}, {193, "Canon EF 35-80mm f/4-5.6 USM"}, {194, "Canon EF 80-200mm f/4.5-5.6 USM"}, {195, "Canon EF 35-105mm f/4.5-5.6 USM"}, @@ -808,6 +818,7 @@ public: {198, "Canon EF 50mm f/1.4 USM or Zeiss Lens"}, {198, "Zeiss Otus 55mm f/1.4 ZE"}, {198, "Zeiss Otus 85mm f/1.4 ZE"}, + {198, "Zeiss Milvus 25mm f/1.4"}, {199, "Canon EF 28-80mm f/3.5-5.6 USM"}, {200, "Canon EF 75-300mm f/4-5.6 USM"}, {201, "Canon EF 28-80mm f/3.5-5.6 USM"}, @@ -841,8 +852,10 @@ public: {236, "Canon EF-S 60mm f/2.8 Macro USM"}, {237, "Canon EF 24-105mm f/4L IS USM"}, {238, "Canon EF 70-300mm f/4-5.6 IS USM"}, - {239, "Canon EF 85mm f/1.2L II USM"}, - {240, "Canon EF-S 17-55mm f/2.8 IS USM"}, + {239, "Canon EF 85mm f/1.2L II USM or Rokinon Lens"}, + {239, "Rokinon SP 85mm f/1.2"}, + {240, "Canon EF-S 17-55mm f/2.8 IS USM or Sigma Lens"}, + {240, "Sigma 17-50mm f/2.8 EX DC OS HSM"}, {241, "Canon EF 50mm f/1.2L USM"}, {242, "Canon EF 70-200mm f/4L IS USM"}, {243, "Canon EF 70-200mm f/4L IS USM + 1.4x"}, @@ -852,16 +865,23 @@ public: {247, "Canon EF 14mm f/2.8L II USM"}, {248, "Canon EF 200mm f/2L IS USM or Sigma Lens"}, {248, "Sigma 24-35mm f/2 DG HSM | A"}, + {248, "Sigma 135mm f/2 FF High-Speed Prime | 017"}, + {248, "Sigma 24-35mm f/2.2 FF Zoom | 017"}, {249, "Canon EF 800mm f/5.6L IS USM"}, {250, "Canon EF 24mm f/1.4L II USM or Sigma Lens"}, {250, "Sigma 20mm f/1.4 DG HSM | A"}, + {250, "Sigma 20mm f/1.5 FF High-Speed Prime | 017"}, {251, "Canon EF 70-200mm f/2.8L IS II USM"}, {252, "Canon EF 70-200mm f/2.8L IS II USM + 1.4x"}, {253, "Canon EF 70-200mm f/2.8L IS II USM + 2x"}, {254, "Canon EF 100mm f/2.8L Macro IS USM"}, {255, "Sigma 24-105mm f/4 DG OS HSM | A or Other Sigma Lens"}, {255, "Sigma 180mm f/2.8 EX DG OS HSM APO Macro"}, - {368, "Sigma 14-24mm f/2.8 DG HSM | A"}, + {368, "Sigma 14-24mm f/2.8 DG HSM | A or other Sigma Lens"}, + {368, "Sigma 20mm f/1.4 DG HSM | A"}, + {368, "Sigma 50mm f/1.4 DG HSM | A"}, + {368, "Sigma 40mm f/1.4 DG HSM | A"}, + {368, "Sigma 60-600mm f/4.5-6.3 DG OS HSM | S"}, {488, "Canon EF-S 15-85mm f/3.5-5.6 IS USM"}, {489, "Canon EF 70-300mm f/4-5.6L IS USM"}, {490, "Canon EF 8-15mm f/4L Fisheye USM"}, @@ -869,6 +889,9 @@ public: {491, "Tamron SP 70-200mm f/2.8 Di VC USD G2 (A025)"}, {491, "Tamron 18-400mm f/3.5-6.3 Di II VC HLD (B028)"}, {491, "Tamron 100-400mm f/4.5-6.3 Di VC USD (A035)"}, + {491, "Tamron 70-210mm f/4 Di VC USD (A034)"}, + {491, "Tamron 70-210mm f/4 Di VC USD (A034) + 1.4x"}, + {491, "Tamron SP 24-70mm f/2.8 Di VC USD G2 (A032)"}, {492, "Canon EF 400mm f/2.8L IS II USM"}, {493, "Canon EF 500mm f/4L IS II USM or EF 24-105mm f4L IS USM"}, {493, "Canon EF 24-105mm f/4L IS USM"}, @@ -887,11 +910,18 @@ public: {508, "Tamron 10-24mm f/3.5-4.5 Di II VC HLD"}, {747, "Canon EF 100-400mm f/4.5-5.6L IS II USM or Tamron Lens"}, {747, "Tamron SP 150-600mm f/5-6.3 Di VC USD G2"}, - {748, "Canon EF 100-400mm f/4.5-5.6L IS II USM + 1.4x"}, + {748, "Canon EF 100-400mm f/4.5-5.6L IS II USM + 1.4x or Tamron Lens"}, + {748, "Tamron 100-400mm f/4.5-6.3 Di VC USD A035E + 1.4x"}, + {748, "Tamron 70-210mm f/4 Di VC USD (A034) + 2x"}, + {749, "Tamron 100-400mm f/4.5-6.3 Di VC USD A035E + 2x"}, {750, "Canon EF 35mm f/1.4L II USM"}, {751, "Canon EF 16-35mm f/2.8L III USM"}, {752, "Canon EF 24-105mm f/4L IS II USM"}, {753, "Canon EF 85mm f/1.4L IS USM"}, + {754, "Canon EF 70-200mm f/4L IS II USM"}, + {757, "Canon EF 400mm f/2.8L IS III USM"}, + {758, "Canon EF 600mm f/4L IS III USM"}, + {1136, "Sigma 24-70mm f/2.8 DG OS HSM | Art 017"}, {4142, "Canon EF-S 18-135mm f/3.5-5.6 IS STM"}, {4143, "Canon EF-M 18-55mm f/3.5-5.6 IS STM or Tamron Lens"}, {4143, "Tamron 18-200mm f/3.5-6.3 Di III VC"}, @@ -909,9 +939,14 @@ public: {4156, "Canon EF 50mm f/1.8 STM"}, {4157, "Canon EF-M 18-150mm 1:3.5-6.3 IS STM"}, {4158, "Canon EF-S 18-55mm f/4-5.6 IS STM"}, + {4159, "Canon EF-M 32mm f/1.4 STM"}, {4160, "Canon EF-S 35mm f/2.8 Macro IS STM"}, {36910, "Canon EF 70-300mm f/4-5.6 IS II USM"}, {36912, "Canon EF-S 18-135mm f/3.5-5.6 IS USM"}, + {61182, "Canon RF 35mm F1.8 Macro IS STM or other Canon RF Lens"}, + {61182, "Canon RF 50mm F1.2 L USM"}, + {61182, "Canon RF 24-105mm F4 L IS USM"}, + {61182, "Canon RF 28-70mm F2 L USM"}, {61491, "Canon CN-E 14mm T3.1 L F"}, {61492, "Canon CN-E 24mm T1.5 L F"}, {61494, "Canon CN-E 85mm T1.3 L F"}, @@ -1477,6 +1512,8 @@ public: CAModelIDInterpreter () { choices[1042] = "EOS M50 / Kiss M"; + choices[2049] = "PowerShot SX740 HS"; + choices[2053] = "PowerShot SX70 HS"; choices[16842752] = "PowerShot A30"; choices[17039360] = "PowerShot S300 / Digital IXUS 300 / IXY Digital 300"; choices[17170432] = "PowerShot A20"; @@ -1799,6 +1836,7 @@ public: choices[2147484680] = "EOS 77D / 9000D"; choices[2147484695] = "EOS Rebel SL2 / 200D / Kiss X9"; choices[2147484706] = "EOS Rebel T100 / 4000D / 3000D"; + choices[2147484708] = "EOR R"; choices[2147484722] = "EOS Rebel T7 / 2000D / 1500D / Kiss X90"; } }; diff --git a/rtexif/nikonattribs.cc b/rtexif/nikonattribs.cc index fc0fc22db..e534f8123 100644 --- a/rtexif/nikonattribs.cc +++ b/rtexif/nikonattribs.cc @@ -850,7 +850,9 @@ const std::map NALensDataInterpreter::lenses = { {"49 3C A6 A6 30 30 F2 02", "AF-S Nikkor 600mm f/4D IF-ED + TC-20E"}, {"4A 40 11 11 2C 0C 4D 02", "Samyang 8mm f/3.5 Fish-Eye CS"}, {"4A 48 1E 1E 24 0C 4D 02", "Samyang 12mm f/2.8 ED AS NCS Fish-Eye"}, + {"4A 48 24 24 24 0C 4D 02", "Samyang 10mm f/2.8 ED AS NCS CS"}, {"4A 48 24 24 24 0C 4D 02", "Samyang AE 14mm f/2.8 ED AS IF UMC"}, + {"4A 4C 24 24 1E 6C 4D 06", "Samyang 14mm f/2.4 Premium"}, {"4A 54 29 29 18 0C 4D 02", "Samyang 16mm f/2.0 ED AS UMC CS"}, {"4A 54 62 62 0C 0C 4D 02", "AF Nikkor 85mm f/1.4D IF"}, {"4A 60 36 36 0C 0C 4D 02", "Samyang 24mm f/1.4 ED AS UMC"}, @@ -910,7 +912,7 @@ const std::map NALensDataInterpreter::lenses = { {"74 40 37 62 2C 34 78 06", "AF-S Zoom-Nikkor 24-85mm f/3.5-4.5G IF-ED"}, {"75 40 3C 68 2C 3C 79 06", "AF Zoom-Nikkor 28-100mm f/3.5-5.6G"}, {"76 58 50 50 14 14 7A 02", "AF Nikkor 50mm f/1.8D"}, - {"77 44 60 98 34 3C 7B 0E", "Sigma 80-400mm f4.5-5.6 APO DG D OS"}, + {"77 44 60 98 34 3C 7B 0E", "Sigma 80-400mm f/4.5-5.6 APO DG D OS"}, {"77 44 61 98 34 3C 7B 0E", "Sigma 80-400mm f/4.5-5.6 EX OS"}, {"77 48 5C 80 24 24 7B 0E", "AF-S VR Zoom-Nikkor 70-200mm f/2.8G IF-ED"}, {"78 40 37 6E 2C 3C 7C 0E", "AF-S VR Zoom-Nikkor 24-120mm f/3.5-5.6G IF-ED"}, @@ -953,6 +955,7 @@ const std::map NALensDataInterpreter::lenses = { {"8B 4C 2D 44 14 14 4B 06", "Sigma 18-35mm f/1.8 DC HSM"}, {"8C 40 2D 53 2C 3C 8E 06", "AF-S DX Zoom-Nikkor 18-55mm f/3.5-5.6G ED"}, {"8D 44 5C 8E 34 3C 8F 0E", "AF-S VR Zoom-Nikkor 70-300mm f/4.5-5.6G IF-ED"}, + {"8D 48 6E 8E 24 24 4B 0E", "Sigma 120-300mm f/2.8 DG OS HSM Sports"}, {"8E 3C 2B 5C 24 30 4B 0E", "Sigma 17-70mm f/2.8-4 DC Macro OS HSM | C"}, {"8F 40 2D 72 2C 3C 91 06", "AF-S DX Zoom-Nikkor 18-135mm f/3.5-5.6G IF-ED"}, {"8F 48 2B 50 24 24 4B 0E", "Sigma 17-50mm f/2.8 EX DC OS HSM"}, @@ -963,7 +966,7 @@ const std::map NALensDataInterpreter::lenses = { {"92 48 24 37 24 24 94 06", "AF-S Zoom-Nikkor 14-24mm f/2.8G ED"}, {"93 48 37 5C 24 24 95 06", "AF-S Zoom-Nikkor 24-70mm f/2.8G ED"}, {"94 40 2D 53 2C 3C 96 06", "AF-S DX Zoom-Nikkor 18-55mm f/3.5-5.6G ED II"}, - {"94 48 7C 7C 24 24 4B 0E", "Sigma 180mm f/2.8 APO Macro EX DG OS"}, + {"94 48 7C 7C 24 24 4B 0E", "Sigma APO Macro 180mm f/2.8 EX DG OS HSM"}, {"95 00 37 37 2C 2C 97 06", "PC-E Nikkor 24mm f/3.5D ED"}, {"95 4C 37 37 2C 2C 97 02", "PC-E Nikkor 24mm f/3.5D ED"}, {"96 38 1F 37 34 3C 4B 06", "Sigma 12-24mm f/4.5-5.6 II DG HSM"}, @@ -975,6 +978,7 @@ const std::map NALensDataInterpreter::lenses = { {"99 40 29 62 2C 3C 9B 0E", "AF-S DX VR Zoom-Nikkor 16-85mm f/3.5-5.6G ED"}, {"99 48 76 76 24 24 4B 0E", "Sigma APO Macro 150mm f/2.8 EX DG OS HSM"}, {"9A 40 2D 53 2C 3C 9C 0E", "AF-S DX VR Zoom-Nikkor 18-55mm f/3.5-5.6G"}, + {"9A 4C 50 50 14 14 9C 06", "Yongnuo YN50mm f/1.8N"}, {"9B 00 4C 4C 24 24 9D 06", "PC-E Micro Nikkor 45mm f/2.8D ED"}, {"9B 54 4C 4C 24 24 9D 02", "PC-E Micro Nikkor 45mm f/2.8D ED"}, {"9B 54 62 62 0C 0C 4B 06", "Sigma 85mm f/1.4 EX DG HSM"}, @@ -997,37 +1001,54 @@ const std::map NALensDataInterpreter::lenses = { {"A1 54 55 55 0C 0C BC 06", "AF-S Nikkor 58mm f/1.4G"}, {"A2 40 2D 53 2C 3C BD 0E", "AF-S DX Nikkor 18-55mm f/3.5-5.6G VR II"}, {"A2 48 5C 80 24 24 A4 0E", "AF-S Nikkor 70-200mm f/2.8G ED VR II"}, + {"A3 38 5C 8E 34 40 CE 0E", "AF-P DX Nikkor 70-300mm f/4.5-6.3G ED"}, + {"A3 38 5C 8E 34 40 CE 8E", "AF-P DX Nikkor 70-300mm f/4.5-6.3G ED VR"}, {"A3 3C 29 44 30 30 A5 0E", "AF-S Nikkor 16-35mm f/4G ED VR"}, {"A3 3C 5C 8E 30 3C 4B 0E", "Sigma 70-300mm f/4-5.6 DG OS"}, {"A4 40 2D 8E 2C 40 BF 0E", "AF-S DX Nikkor 18-300mm f/3.5-6.3G ED VR"}, {"A4 47 2D 50 24 34 4B 0E", "Sigma 18-50mm f/2.8-4.5 DC OS HSM"}, {"A4 48 5C 80 24 24 CF 0E", "AF-S Nikkor 70-200mm f/2.8E FL ED VR"}, + {"A4 48 5C 80 24 24 CF 4E", "AF-S Nikkor 70-200mm f/2.8E FL ED VR"}, {"A4 54 37 37 0C 0C A6 06", "AF-S Nikkor 24mm f/1.4G ED"}, {"A5 40 2D 88 2C 40 4B 0E", "Sigma 18-250mm f/3.5-6.3 DC OS HSM"}, {"A5 40 3C 8E 2C 3C A7 0E", "AF-S Nikkor 28-300mm f/3.5-5.6G ED VR"}, {"A5 4C 44 44 14 14 C0 06", "AF-S Nikkor 35mm f/1.8G ED"}, {"A5 54 6A 6A 0C 0C D0 06", "AF-S Nikkor 105mm f/1.4E ED"}, {"A5 54 6A 6A 0C 0C D0 46", "AF-S Nikkor 105mm f/1.4E ED"}, + {"A6 48 2F 2F 30 30 D1 06", "PC Nikkor 19mm f/4E ED"}, + {"A6 48 2F 2F 30 30 D1 46", "PC Nikkor 19mm f/4E ED"}, {"A6 48 37 5C 24 24 4B 06", "Sigma 24-70mm f/2.8 IF EX DG HSM"}, - {"A6 48 8E 8E 24 24 A8 0E", "AF-S VR Nikkor 300mm f/2.8G IF-ED II"}, + {"A6 48 8E 8E 24 24 A8 0E", "AF-S Nikkor 300mm f/2.8G IF-ED VR II"}, {"A6 48 98 98 24 24 C1 0E", "AF-S Nikkor 400mm f/2.8E FL ED VR"}, {"A7 3C 53 80 30 3C C2 0E", "AF-S DX Nikkor 55-200mm f/4-5.6G ED VR II"}, + {"A7 40 11 26 2C 34 D2 06", "AF-S Fisheye Nikkor 8-15mm f/3.5-4.5E ED"}, + {"A7 40 11 26 2C 34 D2 46", "AF-S Fisheye Nikkor 8-15mm f/3.5-4.5E ED"}, {"A7 49 80 A0 24 24 4B 06", "Sigma APO 200-500mm f/2.8 EX DG"}, {"A7 4B 62 62 2C 2C A9 0E", "AF-S DX Micro Nikkor 85mm f/3.5G ED VR"}, + {"A8 38 18 30 34 3C D3 0E", "AF-P DX Nikkor 10-20mm f/4.5-5.6G VR"}, {"A8 38 18 30 34 3C D3 8E", "AF-P DX Nikkor 10-20mm f/4.5-5.6G VR"}, - {"A8 48 80 98 30 30 AA 0E", "AF-S VR Zoom-Nikkor 200-400mm f/4G IF-ED II"}, + {"A8 48 80 98 30 30 AA 0E", "AF-S Zoom-Nikkor 200-400mm f/4G IF-ED VR II"}, {"A8 48 8E 8E 30 30 C3 0E", "AF-S Nikkor 300mm f/4E PF ED VR"}, {"A8 48 8E 8E 30 30 C3 4E", "AF-S Nikkor 300mm f/4E PF ED VR"}, + {"A9 48 7C 98 30 30 D4 0E", "AF-S Nikkor 180-400mm f/4E TC1.4 FL ED VR"}, {"A9 48 7C 98 30 30 D4 4E", "AF-S Nikkor 180-400mm f/4E TC1.4 FL ED VR"}, {"A9 4C 31 31 14 14 C4 06", "AF-S Nikkor 20mm f/1.8G ED"}, {"A9 54 80 80 18 18 AB 0E", "AF-S Nikkor 200mm f/2G ED VR II"}, {"AA 3C 37 6E 30 30 AC 0E", "AF-S Nikkor 24-120mm f/4G ED VR"}, + {"AA 48 37 5C 24 24 C5 0E", "AF-S Nikkor 24-70mm f/2.8E ED VR"}, {"AA 48 37 5C 24 24 C5 4E", "AF-S Nikkor 24-70mm f/2.8E ED VR"}, + {"AA 48 88 A4 3C 3C D5 0E", "AF-S Nikkor 180-400mm f/4E TC1.4 FL ED VR + 1.4x TC"}, {"AA 48 88 A4 3C 3C D5 4E", "AF-S Nikkor 180-400mm f/4E TC1.4 FL ED VR + 1.4x TC"}, {"AB 3C A0 A0 30 30 C6 4E", "AF-S Nikkor 500mm f/4E FL ED VR"}, - {"AC 38 53 8E 34 3C AE 0E", "AF-S DX VR Nikkor 55-300mm f/4.5-5.6G ED"}, + {"AB 44 5C 8E 34 3C D6 0E", "AF-P Nikkor 70-300mm f/4.5-5.6E ED VR"}, + {"AB 44 5C 8E 34 3C D6 CE", "AF-P Nikkor 70-300mm f/4.5-5.6E ED VR"}, + {"AC 38 53 8E 34 3C AE 0E", "AF-S DX Nikkor 55-300mm f/4.5-5.6G ED VR"}, {"AC 3C A6 A6 30 30 C7 4E", "AF-S Nikkor 600mm f/4E FL ED VR"}, + {"AC 54 3C 3C 0C 0C D7 06", "AF-S Nikkor 28mm f/1.4E ED"}, + {"AC 54 3C 3C 0C 0C D7 46", "AF-S Nikkor 28mm f/1.4E ED"}, {"AD 3C 2D 8E 2C 3C AF 0E", "AF-S DX Nikkor 18-300mm f/3.5-5.6G ED VR"}, + {"AD 3C A0 A0 3C 3C D8 0E", "AF-S Nikkor 500mm f/5.6E PF ED VR"}, + {"AD 3C A0 A0 3C 3C D8 4E", "AF-S Nikkor 500mm f/5.6E PF ED VR"}, {"AD 48 28 60 24 30 C8 0E", "AF-S DX Nikkor 16-80mm f/2.8-4E ED VR"}, {"AD 48 28 60 24 30 C8 4E", "AF-S DX Nikkor 16-80mm f/2.8-4E ED VR"}, {"AE 3C 80 A0 3C 3C C9 0E", "AF-S Nikkor 200-500mm f/5.6E ED VR"}, @@ -1039,7 +1060,7 @@ const std::map NALensDataInterpreter::lenses = { {"B1 48 48 48 24 24 B3 06", "AF-S DX Micro Nikkor 40mm f/2.8G"}, {"B2 48 5C 80 30 30 B4 0E", "AF-S Nikkor 70-200mm f/4G ED VR"}, {"B3 4C 62 62 14 14 B5 06", "AF-S Nikkor 85mm f/1.8G"}, - {"B4 40 37 62 2C 34 B6 0E", "AF-S VR Zoom-Nikkor 24-85mm f/3.5-4.5G IF-ED"}, + {"B4 40 37 62 2C 34 B6 0E", "AF-S Zoom-Nikkor 24-85mm f/3.5-4.5G IF-ED VR"}, {"B5 4C 3C 3C 14 14 B7 06", "AF-S Nikkor 28mm f/1.8G"}, {"B6 3C B0 B0 3C 3C B8 0E", "AF-S VR Nikkor 800mm f/5.6E FL ED"}, {"B6 3C B0 B0 3C 3C B8 4E", "AF-S VR Nikkor 800mm f/5.6E FL ED"}, @@ -1048,8 +1069,11 @@ const std::map NALensDataInterpreter::lenses = { {"B8 40 2D 44 2C 34 BA 06", "AF-S Nikkor 18-35mm f/3.5-4.5G ED"}, {"BF 3C 1B 1B 30 30 01 04", "Irix 11mm f/4 Firefly"}, {"BF 4E 26 26 1E 1E 01 04", "Irix 15mm f/2.4 Firefly"}, + {"C1 48 24 37 24 24 4B 46", "Sigma 14-24mm f/2.8 DG HSM | A"}, + {"C2 4C 24 24 14 14 4B 06", "Sigma 14mm f/1.8 DG HSM | A"}, {"C3 34 68 98 38 40 4B 4E", "Sigma 100-400mm f/5-6.3 DG OS HSM | C"}, {"C8 54 62 62 0C 0C 4B 46", "Sigma 85mm f/1.4 DG HSM | A"}, + {"C9 48 37 5C 24 24 4B 4E", "Sigma 24-70mm f/2.8 DG OS HSM | A"}, {"CC 4C 50 68 14 14 4B 06", "Sigma 50-100mm f/1.8 DC HSM | A"}, {"CD 3D 2D 70 2E 3C 4B 0E", "Sigma 18-125mm f/3.8-5.6 DC OS HSM"}, {"CE 34 76 A0 38 40 4B 0E", "Sigma 150-500mm f/5-6.3 DG OS APO HSM"}, @@ -1058,7 +1082,10 @@ const std::map NALensDataInterpreter::lenses = { {"DC 48 19 19 24 24 4B 06", "Sigma 10mm f/2.8 EX DC HSM Fisheye"}, {"DE 54 50 50 0C 0C 4B 06", "Sigma 50mm f/1.4 EX DG HSM"}, {"E0 3C 5C 8E 30 3C 4B 06", "Sigma 70-300mm f/4-5.6 APO DG Macro HSM"}, + {"E0 40 2D 98 2C 41 DF 4E", "Tamron AF 18-400mm f/3.5-6.3 Di II VC HLD (B028)"}, + {"E1 40 19 36 2C 35 DF 4E", "Tamron 10-24mm f/3.5-4.5 Di II VC HLD (B023)"}, {"E1 58 37 37 14 14 1C 02", "Sigma 24mm f/1.8 EX DG Aspherical Macro"}, + {"E2 47 5C 80 24 24 DF 4E", "Tamron SP 70-200mm f/2.8 Di VC USD G2 (A025)"}, {"E3 40 76 A6 38 40 DF 4E", "Tamron SP 150-600mm f/5-6.3 Di VC USD G2"}, {"E3 54 50 50 24 24 35 02", "Sigma Macro 50mm f/2.8 EX DG"}, {"E4 54 64 64 24 24 DF 0E", "Tamron SP 90mm f/2.8 Di VC USD Macro 1:1 (F017)"}, diff --git a/rtexif/pentaxattribs.cc b/rtexif/pentaxattribs.cc index 4d9a31b6f..0968271e5 100644 --- a/rtexif/pentaxattribs.cc +++ b/rtexif/pentaxattribs.cc @@ -937,6 +937,7 @@ public: choices.insert (p_t (256 * 8 + 61, "HD PENTAX-D FA 28-105mm f/3.5-5.6 ED DC WR")); choices.insert (p_t (256 * 8 + 62, "HD PENTAX-D FA 24-70mm f/2.8 ED SDM WR")); choices.insert (p_t (256 * 8 + 63, "HD PENTAX-D FA 15-30mm f/2.8 ED SDM WR")); + choices.insert (p_t (256 * 8 + 64, "HD PENTAX-D FA* 50mm f/1.4 SDM AW")); choices.insert (p_t (256 * 8 + 197, "HD PENTAX-DA 55-300mm f/4.5-6.3 ED PLM WR RE")); choices.insert (p_t (256 * 8 + 198, "smc PENTAX-DA L 18-50mm f/4-5.6 DC WR RE")); choices.insert (p_t (256 * 8 + 199, "HD PENTAX-DA 18-50mm f/4-5.6 DC WR RE")); diff --git a/rtexif/sonyminoltaattribs.cc b/rtexif/sonyminoltaattribs.cc index 834d436f9..76ed788c2 100644 --- a/rtexif/sonyminoltaattribs.cc +++ b/rtexif/sonyminoltaattribs.cc @@ -818,6 +818,7 @@ public: {2672, "Minolta AF 24-105mm f/3.5-4.5 (D)"}, {3046, "Metabones Canon EF Speed Booster"}, {4567, "Tokina 70-210mm f/4-5.6"}, + {4570, "Tamron AF 35-135mm f/3.5-4.5"}, {4571, "Vivitar 70-210mm f/4.5-5.6"}, {4574, "2x Teleconverter or Tamron or Tokina Lens"}, {4574, "Tamron SP AF 90mm f/2.5"}, @@ -851,6 +852,7 @@ public: {6553, "Sony FE 12-24mm f/4 G"}, {6553, "Sony FE 90mm f/2.8 Macro G OSS"}, {6553, "Sony E 18-50mm f/4-5.6"}, + {6553, "Sony FE 24mm f/1.4 GM"}, {6553, "Sony FE 24-105mm f/4 G OSS"}, {6553, "Sony E PZ 18-200mm f/3.5-6.3 OSS"}, {6553, "Sony FE 55mm f/1.8 ZA"}, @@ -874,20 +876,26 @@ public: {6553, "Sony FE 100-400mm f/4.5-5.6 GM OSS"}, {6553, "Sony FE 70-200mm f/2.8 GM OSS"}, {6553, "Sony FE 16-35mm f/2.8 GM"}, + {6553, "Sony FE 400mm f/2.8 GM OSS"}, {6553, "Sony E 18-135mm f/3.5-5.6 OSS"}, {6553, "Sony FE 70-200mm f/2.8 GM OSS + 1.4X Teleconverter"}, {6553, "Sony FE 70-200mm f/2.8 GM OSS + 2X Teleconverter"}, {6553, "Sony FE 100-400mm f/4.5-5.6 GM OSS + 1.4X Teleconverter"}, {6553, "Sony FE 100-400mm f/4.5-5.6 GM OSS + 2X Teleconverter"}, + {6553, "Sony FE 400mm f/2.8 GM OSS + 1.4X Teleconverter"}, + {6553, "Sony FE 400mm f/2.8 GM OSS + 2X Teleconverter"}, {6553, "Samyang AF 50mm f/1.4 FE"}, {6553, "Samyang AF 14mm f/2.8 FE"}, + {6553, "Samyang AF 24mm f/2.8"}, {6553, "Samyang AF 35mm f/2.8 FE"}, {6553, "Samyang AF 35mm f/1.4"}, {6553, "Sigma 19mm f/2.8 [EX] DN"}, {6553, "Sigma 30mm f/2.8 [EX] DN"}, {6553, "Sigma 60mm f/2.8 DN"}, {6553, "Sigma 30mm f/1.4 DC DN | C"}, + {6553, "Sigma 85mm f/1.4 DG HSM | A"}, {6553, "Sigma 16mm f/1.4 DC DN | C"}, + {6553, "Sigma 70mm f/2.8 DG MACRO | A"}, {6553, "Tamron 18-200mm f/3.5-6.3 Di III VC"}, {6553, "Tamron 28-75mm f/2.8 Di III RXD"}, {6553, "Tokina Firin 20mm f/2 FE MF"}, @@ -897,6 +905,7 @@ public: {6553, "Voigtlander MACRO APO-LANTHAR 65mm f/2 Aspherical"}, {6553, "Voigtlander NOKTON 40mm f/1.2 Aspherical"}, {6553, "Voigtlander NOKTON classic 35mm f/1.4"}, + {6553, "Voigtlander COLOR-SKOPAR 21mm f/3.5 Aspherical"}, {6553, "Zeiss Touit 12mm f/2.8"}, {6553, "Zeiss Touit 32mm f/1.8"}, {6553, "Zeiss Touit 50mm f/2.8 Macro"}, @@ -904,6 +913,7 @@ public: {6553, "Zeiss Batis 85mm f/1.8"}, {6553, "Zeiss Batis 18mm f/2.8"}, {6553, "Zeiss Batis 135mm f/2.8"}, + {6553, "Zeiss Batis 40mm f/2 CF"}, {6553, "Zeiss Loxia 50mm f/2"}, {6553, "Zeiss Loxia 35mm f/2"}, {6553, "Zeiss Loxia 21mm f/2.8"}, @@ -1029,6 +1039,7 @@ public: {26721, "Minolta AF 24-105mm f/3.5-4.5 (D)"}, {30464, "Metabones Canon EF Speed Booster"}, {45671, "Tokina 70-210mm f/4-5.6"}, + {45701, "Tamron AF 35-135mm f/3.5-4.5"}, {45711, "Vivitar 70-210mm f/4.5-5.6"}, {45741, "2x Teleconverter or Tamron or Tokina Lens"}, {45741, "Tamron SP AF 90mm f/2.5"}, @@ -1062,6 +1073,7 @@ public: {65535, "Sony FE 12-24mm f/4 G"}, {65535, "Sony FE 90mm f/2.8 Macro G OSS"}, {65535, "Sony E 18-50mm f/4-5.6"}, + {65535, "Sony FE 24mm f/1.4 GM"}, {65535, "Sony FE 24-105mm f/4 G OSS"}, {65535, "Sony E PZ 18-200mm f/3.5-6.3 OSS"}, {65535, "Sony FE 55mm f/1.8 ZA"}, @@ -1085,20 +1097,26 @@ public: {65535, "Sony FE 100-400mm f/4.5-5.6 GM OSS"}, {65535, "Sony FE 70-200mm f/2.8 GM OSS"}, {65535, "Sony FE 16-35mm f/2.8 GM"}, + {65535, "Sony FE 400mm f/2.8 GM OSS"}, {65535, "Sony E 18-135mm f/3.5-5.6 OSS"}, {65535, "Sony FE 70-200mm f/2.8 GM OSS + 1.4X Teleconverter"}, {65535, "Sony FE 70-200mm f/2.8 GM OSS + 2X Teleconverter"}, {65535, "Sony FE 100-400mm f/4.5-5.6 GM OSS + 1.4X Teleconverter"}, {65535, "Sony FE 100-400mm f/4.5-5.6 GM OSS + 2X Teleconverter"}, + {65535, "Sony FE 400mm f/2.8 GM OSS + 1.4X Teleconverter"}, + {65535, "Sony FE 400mm f/2.8 GM OSS + 2X Teleconverter"}, {65535, "Samyang AF 50mm f/1.4 FE"}, {65535, "Samyang AF 14mm f/2.8 FE"}, + {65535, "Samyang AF 24mm f/2.8"}, {65535, "Samyang AF 35mm f/2.8 FE"}, {65535, "Samyang AF 35mm f/1.4"}, {65535, "Sigma 19mm f/2.8 [EX] DN"}, {65535, "Sigma 30mm f/2.8 [EX] DN"}, {65535, "Sigma 60mm f/2.8 DN"}, {65535, "Sigma 30mm f/1.4 DC DN | C"}, + {65535, "Sigma 85mm f/1.4 DG HSM | A"}, {65535, "Sigma 16mm f/1.4 DC DN | C"}, + {65535, "Sigma 70mm f/2.8 DG MACRO | A"}, {65535, "Tamron 18-200mm f/3.5-6.3 Di III VC"}, {65535, "Tamron 28-75mm f/2.8 Di III RXD"}, {65535, "Tokina Firin 20mm f/2 FE MF"}, @@ -1108,6 +1126,7 @@ public: {65535, "Voigtlander MACRO APO-LANTHAR 65mm f/2 Aspherical"}, {65535, "Voigtlander NOKTON 40mm f/1.2 Aspherical"}, {65535, "Voigtlander NOKTON classic 35mm f/1.4"}, + {65535, "Voigtlander COLOR-SKOPAR 21mm f/3.5 Aspherical"}, {65535, "Zeiss Touit 12mm f/2.8"}, {65535, "Zeiss Touit 32mm f/1.8"}, {65535, "Zeiss Touit 50mm f/2.8 Macro"}, @@ -1115,6 +1134,7 @@ public: {65535, "Zeiss Batis 85mm f/1.8"}, {65535, "Zeiss Batis 18mm f/2.8"}, {65535, "Zeiss Batis 135mm f/2.8"}, + {65535, "Zeiss Batis 40mm f/2 CF"}, {65535, "Zeiss Loxia 50mm f/2"}, {65535, "Zeiss Loxia 35mm f/2"}, {65535, "Zeiss Loxia 21mm f/2.8"}, @@ -1190,7 +1210,8 @@ public: choices.insert (p_t (32791, "Sony E 16-70mm f/4 ZA OSS")); choices.insert (p_t (32792, "Sony E 10-18mm f/4 OSS")); choices.insert (p_t (32793, "Sony E PZ 16-50mm f/3.5-5.6 OSS")); - choices.insert (p_t (32794, "Sony FE 35mm f/2.8 ZA")); + choices.insert (p_t (32794, "Sony FE 35mm f/2.8 ZA or Samyang AF 24mm f/2.8 FE")); + choices.insert (p_t (32794, "Samyang AF 24mm f/2.8 FE")); choices.insert (p_t (32795, "Sony FE 24-70mm f/4 ZA OSS")); choices.insert (p_t (32796, "Sony FE 85mm f/1.8")); choices.insert (p_t (32797, "Sony E 18-200mm f/3.5-6.3 OSS LE")); @@ -1200,6 +1221,7 @@ public: choices.insert (p_t (32801, "Sony FE 12-24mm f/4 G")); choices.insert (p_t (32802, "Sony FE 90mm f/2.8 Macro G OSS")); choices.insert (p_t (32803, "Sony E 18-50mm f/4-5.6")); + choices.insert (p_t (32804, "Sony FE 24mm f/1.4 GM")); choices.insert (p_t (32805, "Sony FE 24-105mm f/4 G OSS")); choices.insert (p_t (32807, "Sony E PZ 18-200mm f/3.5-6.3 OSS")); choices.insert (p_t (32808, "Sony FE 55mm f/1.8 ZA")); @@ -1223,12 +1245,15 @@ public: choices.insert (p_t (32829, "Sony FE 100-400mm f/4.5-5.6 GM OSS")); choices.insert (p_t (32830, "Sony FE 70-200mm f/2.8 GM OSS")); choices.insert (p_t (32831, "Sony FE 16-35mm f/2.8 GM")); + choices.insert (p_t (32848, "Sony FE 400mm f/2.8 GM OSS")); choices.insert (p_t (32849, "Sony E 18-135mm f/3.5-5.6 OSS")); choices.insert (p_t (33072, "Sony FE 70-200mm f/2.8 GM OSS + 1.4X Teleconverter")); choices.insert (p_t (33073, "Sony FE 70-200mm f/2.8 GM OSS + 2X Teleconverter")); choices.insert (p_t (33076, "Sony FE 100mm f/2.8 STF GM OSS (macro mode)")); choices.insert (p_t (33077, "Sony FE 100-400mm f/4.5-5.6 GM OSS + 1.4X Teleconverter")); choices.insert (p_t (33078, "Sony FE 100-400mm f/4.5-5.6 GM OSS + 2X Teleconverter")); + choices.insert (p_t (33079, "Sony FE 400mm f/2.8 GM OSS + 1.4X Teleconverter")); + choices.insert (p_t (33080, "Sony FE 400mm f/2.8 GM OSS + 2X Teleconverter")); choices.insert (p_t (49201, "Zeiss Touit 12mm f/2.8")); choices.insert (p_t (49202, "Zeiss Touit 32mm f/1.8")); choices.insert (p_t (49203, "Zeiss Touit 50mm f/2.8 Macro")); @@ -1236,6 +1261,7 @@ public: choices.insert (p_t (49217, "Zeiss Batis 85mm f/1.8")); choices.insert (p_t (49218, "Zeiss Batis 18mm f/2.8")); choices.insert (p_t (49219, "Zeiss Batis 135mm f/2.8")); + choices.insert (p_t (49220, "Zeiss Batis 40mm f/2 CF")); choices.insert (p_t (49232, "Zeiss Loxia 50mm f/2")); choices.insert (p_t (49233, "Zeiss Loxia 35mm f/2")); choices.insert (p_t (49234, "Zeiss Loxia 21mm f/2.8")); @@ -1255,14 +1281,17 @@ public: choices.insert (p_t (50492, "Sigma 24-105mm f/4 DG OS HSM | A + MC-11")); choices.insert (p_t (50493, "Sigma 17-70mm f/2.8-4 DC MACRO OS HSM | C + MC-11")); choices.insert (p_t (50495, "Sigma 50-100mm f/1.8 DC HSM | A + MC-11")); + choices.insert (p_t (50499, "Sigma 85mm f/1.4 DG HSM | A")); choices.insert (p_t (50501, "Sigma 100-400mm f/5-6.3 DG OS HSM | C + MC-11")); choices.insert (p_t (50503, "Sigma 16mm f/1.4 DC DN | C")); + choices.insert (p_t (50513, "Sigma 70mm f/2.8 DG MACRO | A")); choices.insert (p_t (50992, "Voigtlander SUPER WIDE-HELIAR 15mm f/4.5 III")); choices.insert (p_t (50993, "Voigtlander HELIAR-HYPER WIDE 10mm f/5.6")); choices.insert (p_t (50994, "Voigtlander ULTRA WIDE-HELIAR 12mm f/5.6 III")); choices.insert (p_t (50995, "Voigtlander MACRO APO-LANTHAR 65mm f/2 Aspherical")); choices.insert (p_t (50996, "Voigtlander NOKTON 40mm f/1.2 Aspherical")); choices.insert (p_t (50997, "Voigtlander NOKTON classic 35mm f/1.4")); + choices.insert (p_t (50999, "Voigtlander COLOR-SKOPAR 21mm f/3.5 Aspherical")); choices.insert (p_t (51505, "Samyang AF 14mm f/2.8 FE or Samyang AF 35mm f/2.8 FE")); choices.insert (p_t (51505, "Samyang AF 35mm f/2.8 FE")); choices.insert (p_t (51507, "Samyang AF 35mm f/1.4")); From 561ea418562e6353a6b7032f2de7a7263a0d622d Mon Sep 17 00:00:00 2001 From: Hombre Date: Mon, 12 Nov 2018 01:04:14 +0100 Subject: [PATCH 07/60] Updated French translation + minor change in Preferences window (no issue) --- rtdata/languages/Francais | 256 +++++++++++++++++++------------------- rtdata/languages/default | 2 +- rtgui/preferences.cc | 9 +- 3 files changed, 134 insertions(+), 133 deletions(-) diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais index adc0528ea..34c74ea67 100644 --- a/rtdata/languages/Francais +++ b/rtdata/languages/Francais @@ -5,6 +5,7 @@ ABOUT_TAB_CREDITS;Crédits ABOUT_TAB_LICENSE;Licence ABOUT_TAB_RELEASENOTES;Notes de version ABOUT_TAB_SPLASH;Splash +ADJUSTER_RESET_TO_DEFAULT;Clic - réinitialise à la valeur par défaut.\nCtrl+clic - réinitialise à la valeur initiale. BATCHQUEUE_AUTOSTART;Démarrage auto BATCHQUEUE_AUTOSTARTHINT;Démarrer automatiquement le traitement à l'arrivée d'une nouvelle tâche BATCHQUEUE_DESTFILENAME;Chemin et nom de fichier @@ -40,6 +41,10 @@ DYNPROFILEEDITOR_DELETE;Supprimer DYNPROFILEEDITOR_EDIT;Modifier DYNPROFILEEDITOR_EDIT_RULE;Modifier une règle de Profil Dynamique DYNPROFILEEDITOR_ENTRY_TOOLTIP;La correspondance est insensible à la casse.\nUtilisez le préfix "re:" pour entrer\nune expression régulière. +DYNPROFILEEDITOR_IMGTYPE_ANY;Tout +DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +DYNPROFILEEDITOR_IMGTYPE_STD;Standard DYNPROFILEEDITOR_MOVE_DOWN;Déplacer vers le bas DYNPROFILEEDITOR_MOVE_UP;Déplacer vers le haut DYNPROFILEEDITOR_NEW;Nouveau @@ -53,6 +58,7 @@ EXIFFILTER_CAMERA;Appareil photo EXIFFILTER_EXPOSURECOMPENSATION;Compensation d'exposition (EV) EXIFFILTER_FILETYPE;Type de fichier EXIFFILTER_FOCALLEN;Longueur focale +EXIFFILTER_IMAGETYPE;Type d'image EXIFFILTER_ISO;ISO EXIFFILTER_LENS;Objectif EXIFFILTER_METADATAFILTER;Activer les filtres sur les Métadonnées @@ -111,6 +117,8 @@ FILEBROWSER_AUTOFLATFIELD;Champ Uniforme auto FILEBROWSER_BROWSEPATHBUTTONHINT;Cliquez pour parcourir le chemin saisi FILEBROWSER_BROWSEPATHHINT;Saisissez le chemin à parcourir\nCtrl-O pour placer le focus sur le champ de saisie.\nEntrée / Ctrl-Entrée pour y naviguer;\nEsc pour effacer les modifications.\nShift-Esc pour enlever le focus.\n\n\nRaccourcis pour les chemins:\n ~ - le dossier utilisateur\n ! - le dossier Images de l'utilisateur FILEBROWSER_CACHE;Cache +FILEBROWSER_CACHECLEARFROMFULL;Vider tout y compris les profils mis en cache +FILEBROWSER_CACHECLEARFROMPARTIAL;Vider tout sauf les profils mis en cache FILEBROWSER_CLEARPROFILE;Remettre le profil à zéro FILEBROWSER_COLORLABEL_TOOLTIP;Label couleur\n\nUtilisez le menu déroulant ou le raccourci clavier:\nShift-Ctrl-0 Pas de couleur\nShift-Ctrl-1 Rouge\nShift-Ctrl-2 Jaune\nShift-Ctrl-3 Vert\nShift-Ctrl-4 Bleu\nShift-Ctrl-5 Pourpre FILEBROWSER_COPYPROFILE;Copier le profil @@ -225,6 +233,7 @@ GENERAL_NONE;Aucun GENERAL_OK;OK GENERAL_OPEN;Ouvrir GENERAL_PORTRAIT;Portrait +GENERAL_RESET;Réinitialiser GENERAL_SAVE;Enregistrer GENERAL_SAVE_AS;Enregistrer sous... GENERAL_SLIDER;Curseur @@ -237,6 +246,7 @@ HISTOGRAM_TOOLTIP_CHRO;Montrer/Cacher l'histogramme de Chromaticité HISTOGRAM_TOOLTIP_FULL;Basculer la vue de l'histogramme : complet (activé) / zoomé (désactivé) HISTOGRAM_TOOLTIP_G;Montrer/cacher l'histogramme VERT HISTOGRAM_TOOLTIP_L;Montrer/cacher l'histogramme Luminance CIELAB +HISTOGRAM_TOOLTIP_MODE;Bascule entre une échelle linéaire, linéaire-log et log-log de l'histogramme. HISTOGRAM_TOOLTIP_R;Montrer/cacher l'histogramme ROUGE HISTOGRAM_TOOLTIP_RAW;Montrer/Cacher l'histogramme des données RAW HISTORY_CHANGED;Changé @@ -476,7 +486,9 @@ HISTORY_MSG_231;N&B - Courbe 'Avant' HISTORY_MSG_232;N&B - Type de courbe 'Avant' HISTORY_MSG_233;N&B - Courbe 'Après' HISTORY_MSG_234;N&B - Type de courbe 'Après' +HISTORY_MSG_235;N&B - Mixeur de Canaux - Auto HISTORY_MSG_236;--inutilisé-- +HISTORY_MSG_237;N&B - Mixeur de Canaux HISTORY_MSG_238;FD - Étendu HISTORY_MSG_239;FD - Force HISTORY_MSG_240;FD - Centre @@ -512,6 +524,7 @@ HISTORY_MSG_269;Virage Partiel - HL - Rouge HISTORY_MSG_270;Virage Partiel - HL - Vert HISTORY_MSG_271;Virage Partiel - HL - Bleu HISTORY_MSG_272;Virage Partiel - Balance +HISTORY_MSG_273;Virage Partiel - Balance Couleur O/TM/HL HISTORY_MSG_274;Virage Partiel - Saturation des ombres HISTORY_MSG_275;Virage Partiel - Saturation des HL HISTORY_MSG_276;Virage Partiel - Opacité @@ -630,6 +643,7 @@ HISTORY_MSG_388;O - Résiduel - BC vert moyen HISTORY_MSG_389;O - Résiduel - BC bleu moyen HISTORY_MSG_390;O - Résiduel - BC vert bas HISTORY_MSG_391;O - Résiduel - BC bleu bas +HISTORY_MSG_392;O - Résiduel - Balance Couleur HISTORY_MSG_393;DCP - Table de corresp. (LUT) HISTORY_MSG_394;DCP - Exposition de base HISTORY_MSG_395;DCP - Table de base @@ -709,25 +723,65 @@ HISTORY_MSG_484;CAM02 - Yb auto scène HISTORY_MSG_485;Correction d'Objectif HISTORY_MSG_486;Corr. d'Obj. - Appareil HISTORY_MSG_487;Corr. d'Obj. - Objectif +HISTORY_MSG_488;Compression de Plage Dymanique +HISTORY_MSG_489;CPD - Détail +HISTORY_MSG_490;CPD - Quantité HISTORY_MSG_491;Balances des Blancs HISTORY_MSG_492;Courbes RVB HISTORY_MSG_493;Ajustements L*a*b* +HISTORY_MSG_CLAMPOOG;Tronquer les couleurs hors gamut HISTORY_MSG_COLORTONING_LABGRID_VALUE;Virage Partiel - Correction couleur +HISTORY_MSG_COLORTONING_LABREGION_AB;Virage Partiel - Correction couleur +HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;Virage Partiel - Masque C +HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;Virage Partiel - Masque T +HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;Virage Partiel - Luminosité +HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;Virage Partiel - Masque L +HISTORY_MSG_COLORTONING_LABREGION_LIST;Virage Partiel - Liste +HISTORY_MSG_COLORTONING_LABREGION_SATURATION;Virage Partiel - Saturation +HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;Virage Partiel - Montrer le masque +HISTORY_MSG_DEHAZE_DEPTH;EB - Profondeur +HISTORY_MSG_DEHAZE_ENABLED;Élimination de la Brume +HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;EB - Montrer carte de profondeur +HISTORY_MSG_DEHAZE_STRENGTH;EB - Force +HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Double dématriçage - Seuil auto +HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Double dématriçage - Seuil de contraste HISTORY_MSG_HISTMATCHING;Calcul Courbe Tonale svt Aperçu +HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Sortie - Primaires +HISTORY_MSG_ICM_OUTPUT_TEMP;Sortie - ICC-v4 illuminant D +HISTORY_MSG_ICM_OUTPUT_TYPE;Sortie - Type +HISTORY_MSG_ICM_WORKING_GAMMA;Travail - Gamma +HISTORY_MSG_ICM_WORKING_SLOPE;Travail - Pente +HISTORY_MSG_ICM_WORKING_TRC_METHOD;Travail - Méthode TRC HISTORY_MSG_LOCALCONTRAST_AMOUNT;Contraste Local - Quantité HISTORY_MSG_LOCALCONTRAST_DARKNESS;Contraste Local - Ombres HISTORY_MSG_LOCALCONTRAST_ENABLED;Contraste Local HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Contraste Local - H.L. HISTORY_MSG_LOCALCONTRAST_RADIUS;Contraste Local - Rayon HISTORY_MSG_METADATA_MODE;Mode de copie des métadonnées +HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontraste - Seuil de contraste +HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Méthode de dématriçage pour les mouvements +HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Direction du filtre de bruit de ligne +HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;Filtre de ligne PDAF +HISTORY_MSG_PRSHARPEN_CONTRAST;NPR - Seuil de contraste +HISTORY_MSG_RAWCACORR_AUTOIT;A.C. Raw - Itérations +HISTORY_MSG_RAWCACORR_COLORSHIFT;A.C. Raw - Éviter les dérives de teinte +HISTORY_MSG_RAW_BORDER;Bord Raw +HISTORY_MSG_RESIZE_ALLOWUPSCALING;Redim. - Autoriser l'agrandissement +HISTORY_MSG_SHARPENING_CONTRAST;Netteté - Seuil de contraste +HISTORY_MSG_SH_COLORSPACE;O/HL - Espace couleur +HISTORY_MSG_SOFTLIGHT_ENABLED;Lumière douce +HISTORY_MSG_SOFTLIGHT_STRENGTH;Lumière douce - Force +HISTORY_MSG_TM_FATTAL_ANCHOR;CPD - Ancre HISTORY_NEWSNAPSHOT;Ajouter HISTORY_NEWSNAPSHOT_TOOLTIP;Raccourci: Alt-s HISTORY_SNAPSHOT;Capture HISTORY_SNAPSHOTS;Captures ICCPROFCREATOR_ADD_PARAM_IN_DESC;Ajoute le paramètre Gamma et Pente (Slope) à la fin de la description ICCPROFCREATOR_COPYRIGHT;Copyright: +ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Réinitialise au copyright par défaut, attribué à "RawTherapee, CC0" ICCPROFCREATOR_CUSTOM;Personnalisé ICCPROFCREATOR_DESCRIPTION;Description: +ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Ajouter les valeurs gamma et pente à la description ICCPROFCREATOR_DESCRIPTION_TOOLTIP;Laisser vide pour que mettre la description par défaut ICCPROFCREATOR_GAMMA;Gamma ICCPROFCREATOR_ICCVERSION;Version du profil généré: @@ -881,6 +935,7 @@ MAIN_TOOLTIP_PREVIEWFOCUSMASK;Affichage du Masque du focus\nRaccourci: canal Vert\nRaccourci: g MAIN_TOOLTIP_PREVIEWL;Affichage de la Luminosité\nRaccourci: v\n\n0.299*R + 0.587*V + 0.114*B MAIN_TOOLTIP_PREVIEWR;Affichage du canal Rouge\nRaccourci: r +MAIN_TOOLTIP_PREVIEWSHARPMASK;Prévisualiser le masque de contraste de netteté.\nRaccourci: Aucun\n\nNe fonctionne que si l'outil Netteté est activé et pour un zomm >= 100%. MAIN_TOOLTIP_QINFO;Informations rapide sur l'image\nRaccourci: i MAIN_TOOLTIP_SHOWHIDELP1;Montrer/Cacher le panneau gauche\nRaccourci: l MAIN_TOOLTIP_SHOWHIDERP1;Afficher/Cacher le panneau droit\nRaccourci: Alt-l @@ -918,6 +973,7 @@ PARTIALPASTE_CROP;Recadrage PARTIALPASTE_DARKFRAMEAUTOSELECT;Sélection auto de la Trame Noire PARTIALPASTE_DARKFRAMEFILE;Fichier de Trame Noire PARTIALPASTE_DEFRINGE;Aberration chromatique +PARTIALPASTE_DEHAZE;Élimination de la Brume PARTIALPASTE_DETAILGROUP;Détail PARTIALPASTE_DIALOGLABEL;Collage partiel de profil de traitement PARTIALPASTE_DIRPYRDENOISE;Réduction du bruit @@ -951,13 +1007,16 @@ PARTIALPASTE_PREPROCESS_DEADPIXFILT;Filtrage des pixels morts PARTIALPASTE_PREPROCESS_GREENEQUIL;Équilibrage du vert PARTIALPASTE_PREPROCESS_HOTPIXFILT;Filtrage des pixels chauds PARTIALPASTE_PREPROCESS_LINEDENOISE;Filtre de bruit de ligne +PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;Filtre de ligne PDAF PARTIALPASTE_PRSHARPENING;Netteté post-redim. PARTIALPASTE_RAWCACORR_AUTO;Corr. auto. de l'aberr. chromatique -PARTIALPASTE_RAWCACORR_CAREDBLUE;Aberr. chromatique rouge et bleu +PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;A.C. Raw - Éviter les dérives couleurs +PARTIALPASTE_RAWCACORR_CAREDBLUE;A.C. Raw - Rouge et bleu PARTIALPASTE_RAWEXPOS_BLACK;Niveaux de noir PARTIALPASTE_RAWEXPOS_LINEAR;Correction du point blanc PARTIALPASTE_RAWEXPOS_PRESER;Préservation des hautes humières PARTIALPASTE_RAWGROUP;Réglages RAW +PARTIALPASTE_RAW_BORDER;Bord Raw PARTIALPASTE_RAW_DCBENHANCE;Amélioration de DCB PARTIALPASTE_RAW_DCBITERATIONS;Nombre d'itération de DCB PARTIALPASTE_RAW_DMETHOD;Algorithme de dématriçage @@ -973,6 +1032,8 @@ PARTIALPASTE_SHADOWSHIGHLIGHTS;Ombres/Hautes lumières PARTIALPASTE_SHARPENEDGE;Bords PARTIALPASTE_SHARPENING;Netteté PARTIALPASTE_SHARPENMICRO;Microcontraste +PARTIALPASTE_SOFTLIGHT;Lumière douce +PARTIALPASTE_TM_FATTAL;Compression de plage dynamique PARTIALPASTE_VIBRANCE;Vibrance PARTIALPASTE_VIGNETTING;Correction du vignettage PARTIALPASTE_WAVELETGROUP;Niveaux d'ondelette @@ -988,6 +1049,11 @@ PREFERENCES_BEHAVIOR;Comportement PREFERENCES_BEHSETALL;Tout à 'Remplace' PREFERENCES_BEHSETALLHINT;Règle tous les paramètres sur le mode Remplace.\nLa modification des paramètres dans le panneau d'édition en par lot sera absolue, les valeurs réelles seront affichées PREFERENCES_BLACKBODY;Tungstène +PREFERENCES_CACHECLEAR;Vider +PREFERENCES_CACHECLEAR_ALL;Vider tous les fichiers mis en cache : +PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Vider tous les fichiers mis en cache excepté les profils de traitement : +PREFERENCES_CACHECLEAR_ONLYPROFILES;Vider seulement les profils de traitement mis en cache : +PREFERENCES_CACHECLEAR_SAFETY;Seuls les fichiers mis en cache sont effacés. Les profils de traitement enregitrés à côté des images sources ne sont pas touchés. PREFERENCES_CACHEMAXENTRIES;Nombre maximal d'éléments dans le Cache PREFERENCES_CACHEOPTS;Options du Cache PREFERENCES_CACHETHUMBHEIGHT;Hauteur maximale des vignettes @@ -1001,7 +1067,7 @@ PREFERENCES_CLUTSCACHE_LABEL;Nombre maximum de chache CLUT PREFERENCES_CLUTSDIR;Dossier HaldCLUT PREFERENCES_CMMBPC;Compensation du point noir PREFERENCES_CROP;Édition du recadrage -PREFERENCES_CROP_AUTO_FIT;Zommer automatiquement sur la zone recadrée +PREFERENCES_CROP_AUTO_FIT;Zoomer automatiquement sur la zone recadrée lorsque vous double-cliquez sur l'image de prévisualisation PREFERENCES_CROP_GUIDES;Guides affichés en dehors de l'édition du recadrage PREFERENCES_CROP_GUIDES_FRAME;Cadre PREFERENCES_CROP_GUIDES_FULL;Original @@ -1066,8 +1132,8 @@ PREFERENCES_GREYSC;Luminance Yb de la scène (%) PREFERENCES_GREYSC18;Yb=18 CIE L#50 PREFERENCES_GREYSCA;Automatique PREFERENCES_HISTOGRAMPOSITIONLEFT;Histogramme dans le panneau de gauche -PREFERENCES_HISTOGRAMWORKING;Utiliser le profil de travail pour l'histograme principal et le Navigateur -PREFERENCES_HISTOGRAM_TOOLTIP;Si activé, le profil couleur de travail est utilisé pour les données d'histograme et le panneau Navigateur, sinon le profil de travail de sortie "gamma-corrigé" est utilisé. +PREFERENCES_HISTOGRAMWORKING;Utiliser le profil de travail pour l'histogramme principal et le Navigateur +PREFERENCES_HISTOGRAM_TOOLTIP;Si activé, le profil couleur de travail est utilisé pour les données d'histogramme et le panneau Navigateur, sinon le profil de travail de sortie "gamma-corrigé" est utilisé. PREFERENCES_HLTHRESHOLD;Seuil pour le dépassement de domaine supérieur PREFERENCES_ICCDIR;Dossier des profils ICC PREFERENCES_IMG_RELOAD_NEEDED;Ces changements nécessitent un rechargement de l'image (ou l'ouverture d'une autre image) pour prendre effet. @@ -1113,6 +1179,8 @@ PREFERENCES_PARSEDEXTADDHINT;Tapez une extension et cliquez ce bouton pour l'ajo PREFERENCES_PARSEDEXTDELHINT;Supprime de la liste les extensions sélectionnées PREFERENCES_PARSEDEXTDOWNHINT;Déplacer l'extension sélectionnée plus bas dans la liste. PREFERENCES_PARSEDEXTUPHINT;Déplacer l'extension sélectionnée plus haut dans la liste. +PREFERENCES_PERFORMANCE_THREADS;Unités d'exécution (Threads) +PREFERENCES_PERFORMANCE_THREADS_LABEL;Nombre maximum d'unité d'exécution pour la Réduction de Bruit et les Niveaux d'Ondelettes (0 = Automatique) PREFERENCES_PREVDEMO;Méthode de Dématriçage de l'Aperçu PREFERENCES_PREVDEMO_FAST;Rapide PREFERENCES_PREVDEMO_LABEL;Méthode de dématriçage utilisé pour l'aperçu à un zoom <100%: @@ -1159,8 +1227,13 @@ PREFERENCES_TAB_COLORMGR;Gestion des couleurs PREFERENCES_TAB_DYNAMICPROFILE;Règles de Profil Dynamique PREFERENCES_TAB_GENERAL;Général PREFERENCES_TAB_IMPROC;Traitement de l'image +PREFERENCES_TAB_PERFORMANCE;Performance PREFERENCES_TAB_SOUND;Sons PREFERENCES_THEME;Thème +PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Prévisualisation JPEG incluse +PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Image à montrer +PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Rendu Neutre des données Raw +PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;JPEG inclus si pleine taille, rendu Neutre des données Raw sinon PREFERENCES_TP_LABEL;Panneau des outils: PREFERENCES_TP_VSCROLLBAR;Cacher la barre de défilement verticale PREFERENCES_TUNNELMETADATA;Copier les données Exif/IPTC/XMP tel quel dans le fichier de sortie @@ -1277,6 +1350,8 @@ TP_BWMIX_MET;Méthode TP_BWMIX_MET_CHANMIX;Mixeur de Canaux TP_BWMIX_MET_DESAT;Désaturation TP_BWMIX_MET_LUMEQUAL;Égaliseur de Luminance +TP_BWMIX_MIXC;Mixeur de cannaux +TP_BWMIX_NEUTRAL;Réinitialiser TP_BWMIX_RGBLABEL;R: %1%% V: %2%% B: %3%% Total: %4%% TP_BWMIX_RGBLABEL_HINT;Coefficients RVB finaux qui tiennent compte de toutes les options du mixeur\nTotal affiche la somme des valeurs RVB actuellement appliqué:\n- toujours 100% en mode relatif\n- supérieur (plus clair) ou inférieur (plus sombre) à 100% en mode absolu. TP_BWMIX_RGB_TOOLTIP;Mixe les canaux RVB. Utilisez les Préréglages pour vous guider.\nAttention aux valeurs négatives qui peuvent causer des artefacts ou un comportement erratique. @@ -1410,6 +1485,16 @@ TP_COLORTONING_LAB;Mixage Lab TP_COLORTONING_LABEL;Virage Partiel TP_COLORTONING_LABGRID;Grille de correction L*a*b* TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nO: a=%3 b=%4 +TP_COLORTONING_LABREGIONS;Régions de correction L*a*b* +TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +TP_COLORTONING_LABREGION_HUEMASK;T +TP_COLORTONING_LABREGION_LIGHTNESS;Luminosité +TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +TP_COLORTONING_LABREGION_LIST_TITLE;Correction +TP_COLORTONING_LABREGION_MASK;Masque +TP_COLORTONING_LABREGION_SATURATION;Saturation +TP_COLORTONING_LABREGION_SHOWMASK;Montrer le masque TP_COLORTONING_LUMA;Luminance TP_COLORTONING_LUMAMODE;Préserver la luminance TP_COLORTONING_LUMAMODE_TOOLTIP;Si activé, lorsque vous changez la couleur (rouge, vert, cyan, bleu, etc.), la luminance de chaque pixel est préservé @@ -1458,6 +1543,10 @@ TP_DARKFRAME_LABEL;Trame Noire TP_DEFRINGE_LABEL;Aberration chromatique TP_DEFRINGE_RADIUS;Rayon TP_DEFRINGE_THRESHOLD;Seuil +TP_DEHAZE_DEPTH;Profondeur +TP_DEHAZE_LABEL;Élimination de la Brume +TP_DEHAZE_SHOW_DEPTH_MAP;Montrer la Carte de Profondeur +TP_DEHAZE_STRENGTH;Force TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Multi-zones auto TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Global automatique TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Essaie d'évaluer le bruit chroma\nFaites attention, cela calcul une moyenne, et est très subjectif ! @@ -1546,6 +1635,7 @@ TP_EXPOSURE_AUTOLEVELS;Niveaux Auto TP_EXPOSURE_AUTOLEVELS_TIP;Bascule l'usage de Niveaux automatiques afin de régler automatiquement les valeurs basé sur l'analyse de l'image\nActive la Reconstruction des Hautes Lumières si nécessaire. TP_EXPOSURE_BLACKLEVEL;Noir TP_EXPOSURE_BRIGHTNESS;Luminosité +TP_EXPOSURE_CLAMPOOG;Tronquer les couleurs hors gamut TP_EXPOSURE_CLIP;Rognage % TP_EXPOSURE_CLIP_TIP;La fraction de pixels que l'outil Niveaux Auto passera en dehors du domaine TP_EXPOSURE_COMPRHIGHLIGHTS;Compression hautes lumières @@ -1730,10 +1820,19 @@ TP_PREPROCESS_HOTPIXFILT;Filtrer les pixels chauds TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Essaie de supprimer les pixels chauds TP_PREPROCESS_LABEL;Traitement pre-dématriçage TP_PREPROCESS_LINEDENOISE;Filtre de bruit de ligne +TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction +TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Toutes +TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontale +TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontale seulement sur les lignes PDAF +TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Verticale TP_PREPROCESS_NO_FOUND;Aucun trouvé +TP_PREPROCESS_PDAFLINESFILTER;Filtre de ligne PDAF +TP_PREPROCESS_PDAFLINESFILTER_TOOLTIP;Essaie de supprimer les bandes de bruit causées par les pixel PDAF sur le capteur, arrivant sur certains mirrorless Sony cameras avec des scènes en contre-jour avec un flare visible. TP_PRSHARPENING_LABEL;Netteté post-redimensionnement TP_PRSHARPENING_TOOLTIP;Augmente la netteté de l'image après le redimentionnement. Ne fonctionne que si la méthode de redimensionnement "Lanczos" est utilisé. Il est impossible de prévisualiser les effets de cet outil. Cf. RawPedia pour les instructions d'utilisation. TP_RAWCACORR_AUTO;Correction automatique +TP_RAWCACORR_AUTOIT;Itérations +TP_RAWCACORR_AVOIDCOLORSHIFT;Éviter les dérives couleurs TP_RAWCACORR_CABLUE;Bleu TP_RAWCACORR_CARED;Rouge TP_RAWCACORR_CASTR;Force @@ -1750,16 +1849,24 @@ TP_RAWEXPOS_PRESER;Préservation des HL TP_RAWEXPOS_RGB;Rouge, Vert, Bleu TP_RAWEXPOS_TWOGREEN;Lier les verts TP_RAW_1PASSMEDIUM;1-Passe (Medium) +TP_RAW_2PASS;1-passe+Fast TP_RAW_3PASSBEST;3-Passes (Meilleur) +TP_RAW_4PASS;3-passes+Fast TP_RAW_AHD;AHD TP_RAW_AMAZE;AMaZE +TP_RAW_AMAZEVNG4;AMaZE+VNG4 +TP_RAW_BORDER;Bord TP_RAW_DCB;DCB TP_RAW_DCBENHANCE;Amélioration de DCB TP_RAW_DCBITERATIONS;Nombre d'itération de DCB +TP_RAW_DCBVNG4;DCB+VNG4 TP_RAW_DMETHOD;Méthode TP_RAW_DMETHOD_PROGRESSBAR;Dématriçage %1... TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Affinage du dématriçage... TP_RAW_DMETHOD_TOOLTIP;Note: IGV et LMMSE sont dédiés aux images à haut ISO +TP_RAW_DUALDEMOSAICAUTOCONTRAST;Seuil auto +TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;Si la case est cochée (recommandé), RawTherapee calcul une valeur optimum basée sur les régions de "couleur unie" de l'image.\nS'il n'y en a pas ou que l'image est trop bruité, la valeur sera réglée à 0.\nPour régler la valeur manuellement, décochez la case d'abord (les valeurs raisonables dépendent de l'image). +TP_RAW_DUALDEMOSAICCONTRAST;Seuil de contraste TP_RAW_EAHD;EAHD TP_RAW_FALSECOLOR;Itérations pour la suppression\ndes fausses couleurs TP_RAW_FAST;Fast @@ -1778,6 +1885,9 @@ TP_RAW_NONE;Aucun (montre ce que voit le capteur) TP_RAW_PIXELSHIFT;Pixel Shift TP_RAW_PIXELSHIFTADAPTIVE;Détection adaptative TP_RAW_PIXELSHIFTBLUR;Flouter le masque de mouvement +TP_RAW_PIXELSHIFTDMETHOD;Méthode de dématriçage pour les mouvements +TP_RAW_PIXELSHIFTEPERISO;Sensibilité +TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;La valeur par défaut de 0 devrait bien fonctionner pour l'ISO de base.\nLes valeurs plus hautes augmentent la sensibilité de la détection de mouvement.\nChangez par petits incréments et observez le masque de mouvement se mettre à jour pendant votre ajustement.\nAugmentez la sensibilité pour les images sous-exposées ou à haut ISO. TP_RAW_PIXELSHIFTEQUALBRIGHT;Égaliser la luminosité des sous-images TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL;Égaliser par canal TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL_TOOLTIP;Activé: Égalise les canaux RVB individuellement.\nDésactivé: Utilise le même facteur d'égalisation pour tous les canaux. @@ -1813,6 +1923,7 @@ TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Poid Rouge&Bleu TP_RAW_PIXELSHIFTSHOWMOTION;Voir le masque de mouvement TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;Voir uniquement le masque TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;Affiche le masque sans l'image. +TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Applique un masque vert montrant les régions contenant du mouvement. TP_RAW_PIXELSHIFTSIGMA;Rayon de floutage TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;Le rayon par défaut de 1.0 fonctionne généralement bien pour l'ISO de base.\nAugmentez cette valeur pour les images de haut ISO, 5.0 est un bon point de départ.\nContrôlez le masque de mouvement à chaque nouvelle valeur. TP_RAW_PIXELSHIFTSMOOTH;Adoucir les transitions @@ -1821,10 +1932,12 @@ TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;Facteur DevStd Bleu TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;Facteur DevStd Vert TP_RAW_PIXELSHIFTSTDDEVFACTORRED;Facteur DevStd Rouge TP_RAW_RCD;RCD +TP_RAW_RCDVNG4;RCD+VNG4 TP_RAW_SENSOR_BAYER_LABEL;Capteur à matrice de Bayer TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-passes donne les meilleurs résultats (recommendé pour les images de faible ISO).\n1-passe est presque indifférentiable de 3-passes pour les images à haut ISO et est plus rapide. TP_RAW_SENSOR_XTRANS_LABEL;Capteur à matrice X-Trans TP_RAW_VNG4;VNG4 +TP_RESIZE_ALLOW_UPSCALING;Autoriser l'Agrandissement TP_RESIZE_APPLIESTO;S'applique à: TP_RESIZE_CROPPEDAREA;La zone recadrée TP_RESIZE_FITBOX;Boîte englobante @@ -1943,6 +2056,7 @@ TP_SHARPENEDGE_LABEL;Bords TP_SHARPENEDGE_PASSES;Itérations TP_SHARPENEDGE_THREE;Luminance uniquement TP_SHARPENING_AMOUNT;Quantité +TP_SHARPENING_CONTRAST;Seuil de contraste TP_SHARPENING_EDRADIUS;Rayon TP_SHARPENING_EDTOLERANCE;Tolérance des bords TP_SHARPENING_HALOCONTROL;Contrôle du halo @@ -1958,9 +2072,16 @@ TP_SHARPENING_RLD_ITERATIONS;Itérations TP_SHARPENING_THRESHOLD;Seuil TP_SHARPENING_USM;Masque flou (USM) TP_SHARPENMICRO_AMOUNT;Quantité +TP_SHARPENMICRO_CONTRAST;Seuil de contraste TP_SHARPENMICRO_LABEL;Microcontraste TP_SHARPENMICRO_MATRIX;Matrice 3×3 au lieu de 5×5 TP_SHARPENMICRO_UNIFORMITY;Uniformité +TP_SOFTLIGHT_LABEL;Lumière douce +TP_SOFTLIGHT_STRENGTH;Force +TP_TM_FATTAL_AMOUNT;Quantité +TP_TM_FATTAL_ANCHOR;Ancre +TP_TM_FATTAL_LABEL;Compression de Plage Dynamique +TP_TM_FATTAL_THRESHOLD;Détail TP_VIBRANCE_AVOIDCOLORSHIFT;Éviter les dérives de teinte TP_VIBRANCE_CURVEEDITOR_SKINTONES;TT TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Tons chair @@ -2024,7 +2145,7 @@ TP_WAVELET_CHTYPE;Méthode de chrominance TP_WAVELET_COLORT;Opacité Rouge-Vert TP_WAVELET_COMPCONT;Contraste TP_WAVELET_COMPGAMMA;Compression gamma -TP_WAVELET_COMPGAMMA_TOOLTIP;Ajuster le gamma de l'image résiduelle vous permet d'équiilibrer les données de l'histograme. +TP_WAVELET_COMPGAMMA_TOOLTIP;Ajuster le gamma de l'image résiduelle vous permet d'équiilibrer les données de l'histogramme. TP_WAVELET_COMPTM;Compression tonale TP_WAVELET_CONTEDIT;Courbe de contraste 'Après' TP_WAVELET_CONTR;Gamut @@ -2204,128 +2325,3 @@ ZOOMPANEL_ZOOMFITSCREEN;Affiche l'image entière\nRaccourci: Alt-f ZOOMPANEL_ZOOMIN;Zoom Avant\nRaccourci: + ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - -!!!!!!!!!!!!!!!!!!!!!!!!! -! Untranslated keys follow; remove the ! prefix after an entry is translated. -!!!!!!!!!!!!!!!!!!!!!!!!! - -!ADJUSTER_RESET_TO_DEFAULT;Click - reset to default value.\nCtrl+click - reset to initial value. -!DYNPROFILEEDITOR_IMGTYPE_ANY;Any -!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR -!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift -!DYNPROFILEEDITOR_IMGTYPE_STD;Standard -!EXIFFILTER_IMAGETYPE;Image type -!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles -!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles -!GENERAL_RESET;Reset -!HISTOGRAM_TOOLTIP_MODE;Toggle between linear, log-linear and log-log scaling of the histogram. -!HISTORY_MSG_235;B&W - CM - Auto -!HISTORY_MSG_237;B&W - CM -!HISTORY_MSG_273;CT - Color Balance SMH -!HISTORY_MSG_392;W - Residual - Color Balance -!HISTORY_MSG_488;Dynamic Range Compression -!HISTORY_MSG_489;DRC - Detail -!HISTORY_MSG_490;DRC - Amount -!HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors -!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction -!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - C mask -!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask -!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness -!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask -!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List -!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation -!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - Show mask -!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth -!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal -!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map -!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength -!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold -!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold -!HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries -!HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D -!HISTORY_MSG_ICM_OUTPUT_TYPE;Output - Type -!HISTORY_MSG_ICM_WORKING_GAMMA;Working - Gamma -!HISTORY_MSG_ICM_WORKING_SLOPE;Working - Slope -!HISTORY_MSG_ICM_WORKING_TRC_METHOD;Working - TRC method -!HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold -!HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion -!HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction -!HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter -!HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrast threshold -!HISTORY_MSG_RAWCACORR_AUTOIT;Raw CA Correction - Iterations -!HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correction - Avoid color shift -!HISTORY_MSG_RAW_BORDER;Raw border -!HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling -!HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold -!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace -!HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light -!HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength -!HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor -!ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Reset to the default copyright, granted to "RawTherapee, CC0" -!ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Append gamma and slope values to the description -!MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the Sharpening Contrast Mask.\nShortcut: None\n\nOnly works when sharpening is enabled and zoom >= 100%. -!PARTIALPASTE_DEHAZE;Haze removal -!PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter -!PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid color shift -!PARTIALPASTE_RAW_BORDER;Raw border -!PARTIALPASTE_SOFTLIGHT;Soft light -!PARTIALPASTE_TM_FATTAL;Dynamic range compression -!PREFERENCES_CACHECLEAR;Clear -!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: -!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: -!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: -!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. -!PREFERENCES_PERFORMANCE_THREADS;Threads -!PREFERENCES_PERFORMANCE_THREADS_LABEL;Maximum number of threads for Noise Reduction and Wavelet Levels (0 = Automatic) -!PREFERENCES_TAB_PERFORMANCE;Performance -!PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Embedded JPEG preview -!PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Image to show -!PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Neutral raw rendering -!PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;Embedded JPEG if fullsize, neutral raw otherwise -!TP_BWMIX_MIXC;Channel Mixer -!TP_BWMIX_NEUTRAL;Reset -!TP_COLORTONING_LABREGIONS;L*a*b* correction regions -!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 -!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C -!TP_COLORTONING_LABREGION_HUEMASK;H -!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness -!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L -!TP_COLORTONING_LABREGION_LIST_TITLE;Correction -!TP_COLORTONING_LABREGION_MASK;Mask -!TP_COLORTONING_LABREGION_SATURATION;Saturation -!TP_COLORTONING_LABREGION_SHOWMASK;Show mask -!TP_DEHAZE_DEPTH;Depth -!TP_DEHAZE_LABEL;Haze Removal -!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map -!TP_DEHAZE_STRENGTH;Strength -!TP_EXPOSURE_CLAMPOOG;Clip out-of-gamut colors -!TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction -!TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both -!TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal -!TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontal only on PDAF rows -!TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Vertical -!TP_PREPROCESS_PDAFLINESFILTER;PDAF lines filter -!TP_PREPROCESS_PDAFLINESFILTER_TOOLTIP;Tries to suppress stripe noise caused by on-sensor PDAF pixels, occurring with some Sony mirrorless cameras on some backlit scenes with visible flare. -!TP_RAWCACORR_AUTOIT;Iterations -!TP_RAWCACORR_AVOIDCOLORSHIFT;Avoid color shift -!TP_RAW_2PASS;1-pass+fast -!TP_RAW_4PASS;3-pass+fast -!TP_RAW_AMAZEVNG4;AMaZE+VNG4 -!TP_RAW_BORDER;Border -!TP_RAW_DCBVNG4;DCB+VNG4 -!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold -!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the check-box first (reasonable values depend on the image). -!TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold -!TP_RAW_PIXELSHIFTDMETHOD;Demosaic method for motion -!TP_RAW_PIXELSHIFTEPERISO;Sensitivity -!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nHigher values increase sensitivity of motion detection.\nChange in small steps and watch the motion mask while changing.\nIncrease sensitivity for underexposed or high ISO images. -!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a green mask showing the regions with motion. -!TP_RAW_RCDVNG4;RCD+VNG4 -!TP_RESIZE_ALLOW_UPSCALING;Allow Upscaling -!TP_SHARPENING_CONTRAST;Contrast threshold -!TP_SHARPENMICRO_CONTRAST;Contrast threshold -!TP_SOFTLIGHT_LABEL;Soft Light -!TP_SOFTLIGHT_STRENGTH;Strength -!TP_TM_FATTAL_AMOUNT;Amount -!TP_TM_FATTAL_ANCHOR;Anchor -!TP_TM_FATTAL_LABEL;Dynamic Range Compression -!TP_TM_FATTAL_THRESHOLD;Detail diff --git a/rtdata/languages/default b/rtdata/languages/default index a5c9976a4..5a66807ca 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1060,7 +1060,7 @@ PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs PREFERENCES_CLUTSDIR;HaldCLUT directory PREFERENCES_CMMBPC;Black point compensation PREFERENCES_CROP;Crop editing -PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area when double clicking in the preview image PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop PREFERENCES_CROP_GUIDES_FRAME;Frame PREFERENCES_CROP_GUIDES_FULL;Original diff --git a/rtgui/preferences.cc b/rtgui/preferences.cc index 147e6badd..06654c7cf 100644 --- a/rtgui/preferences.cc +++ b/rtgui/preferences.cc @@ -609,7 +609,12 @@ Gtk::Widget* Preferences::getImageProcessingPanel () crophb->pack_start(*Gtk::manage(new Gtk::Label(M("PREFERENCES_CROP_GUIDES") + ": ")), Gtk::PACK_SHRINK, 4); crophb->pack_start(*cropGuides); cropvb->pack_start(*crophb); - cropAutoFit = Gtk::manage(new Gtk::CheckButton(M("PREFERENCES_CROP_AUTO_FIT"))); + Gtk::Label *cropAutoFitLabel = Gtk::manage(new Gtk::Label(M("PREFERENCES_CROP_AUTO_FIT"))); + cropAutoFitLabel->set_line_wrap(true); + setExpandAlignProperties(cropAutoFitLabel, false, false, Gtk::ALIGN_START, Gtk::ALIGN_START); + cropAutoFit = Gtk::manage(new Gtk::CheckButton()); + setExpandAlignProperties(cropAutoFit, false, true, Gtk::ALIGN_START, Gtk::ALIGN_START); + cropAutoFit->add(*cropAutoFitLabel); cropvb->pack_start(*cropAutoFit); cropframe->add(*cropvb); vbImageProcessing->pack_start(*cropframe, Gtk::PACK_SHRINK, 4); @@ -1398,7 +1403,7 @@ Gtk::Widget* Preferences::getFileBrowserPanel () vbc->pack_start (*cacheGrid, Gtk::PACK_SHRINK, 4); Gtk::Label* clearSafetyLbl = Gtk::manage (new Gtk::Label(M("PREFERENCES_CACHECLEAR_SAFETY"))); - setExpandAlignProperties(clearSafetyLbl, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + setExpandAlignProperties(clearSafetyLbl, false, false, Gtk::ALIGN_START, Gtk::ALIGN_START); clearSafetyLbl->set_line_wrap(true); vbc->pack_start(*clearSafetyLbl, Gtk::PACK_SHRINK, 4); From d55d3446f60246aa206f57c5d7cf1dda06f3f268 Mon Sep 17 00:00:00 2001 From: "U-PC-BUREAU\\jacques" Date: Mon, 12 Nov 2018 12:46:33 +0100 Subject: [PATCH 08/60] various improvments to ICC Profile Creator --- rtdata/iccprofiles/output/RTv2_ACES-AP0.icc | Bin 25336 -> 25452 bytes rtdata/iccprofiles/output/RTv2_ACES-AP1.icc | Bin 25532 -> 25452 bytes rtdata/iccprofiles/output/RTv2_Best.icc | Bin 25456 -> 25452 bytes rtdata/iccprofiles/output/RTv2_Bruce.icc | Bin 25496 -> 25452 bytes rtdata/iccprofiles/output/RTv2_Large.icc | Bin 25504 -> 25500 bytes rtdata/iccprofiles/output/RTv2_Rec2020.icc | Bin 25544 -> 25452 bytes rtdata/iccprofiles/output/RTv2_Wide.icc | Bin 25456 -> 25452 bytes rtdata/iccprofiles/output/RTv4_ACES-AP0.icc | Bin 744 -> 752 bytes rtdata/iccprofiles/output/RTv4_ACES-AP1.icc | Bin 764 -> 752 bytes rtdata/iccprofiles/output/RTv4_Best.icc | Bin 760 -> 752 bytes rtdata/iccprofiles/output/RTv4_Beta.icc | Bin 760 -> 752 bytes rtdata/iccprofiles/output/RTv4_Bruce.icc | Bin 764 -> 752 bytes rtdata/iccprofiles/output/RTv4_Large.icc | Bin 764 -> 752 bytes rtdata/iccprofiles/output/RTv4_Medium.icc | Bin 680 -> 752 bytes rtdata/iccprofiles/output/RTv4_Rec2020.icc | Bin 768 -> 752 bytes rtdata/iccprofiles/output/RTv4_Wide.icc | Bin 760 -> 752 bytes rtdata/iccprofiles/output/RTv4_sRGB.icc | Bin 752 -> 752 bytes rtgui/iccprofilecreator.cc | 144 ++++++++++++++++---- rtgui/options.cc | 60 ++++---- 19 files changed, 151 insertions(+), 53 deletions(-) diff --git a/rtdata/iccprofiles/output/RTv2_ACES-AP0.icc b/rtdata/iccprofiles/output/RTv2_ACES-AP0.icc index 34363781fa091909250c3ed101e06b24df93b335..03d952f9fc09d25b7e828a2213281daee89fe0ff 100644 GIT binary patch delta 878 zcmexyl=00mMiT~x zZXpanpa29DO`_|2k_(DT7#J8A0L3(lfI5Ke6F{~|I)r@(#7=^+KY-XpAwkXz3`{IQ zBY4umY$X8@I|bP{TKjK3B}GB*P6`o`Q3~vj7+4tu7&sY}8FUhpiwk^% z-9jcNN=p~Yp||k0MH-^;AC)QaAt622xia)vH}$c>$x5*|%#9 zj38x~b&J!CjldchIW93Uutfa-{|#t9>r4iQzu*7=|Fh@+|9@6M_dR7`xS%lk1f$I4 zAB;RApuhoZVqn%{VA$~us6b}3fYMG@#^am!v7csQoHn_OYcb=4$$H%Sj8iwqabIU< z{59Fn-;~j8a}NJ%M#g)S4FVMzPfWHFOk}K_JV)>}W8~z9AWKHE$?J?H86RxkBP7qr z$Ugawa53Y%%>g3c85v_HCxkUKPTzb+Y%wEa!sG&plZ^e7tt6uvA8uY3Db2`uWb!^M zT}Fw`52Os47$Y{z*>2|=bqw~9`Ol&ZPEf!YWCq3J9#IAc=hxu)1Sbjx_W%Ficul^M G)BpfxEAZ$5 diff --git a/rtdata/iccprofiles/output/RTv2_ACES-AP1.icc b/rtdata/iccprofiles/output/RTv2_ACES-AP1.icc index 413360817fad230feda6988a9155e51a6e995ef7..cc5e59f3ccbdd3e0b78913405527fdad6a444ee7 100644 GIT binary patch literal 25452 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 W0sbI%XAb_a)BpGLzy136TK@yXC;edn literal 25532 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 KAjbLs?D!9!02w#{ diff --git a/rtdata/iccprofiles/output/RTv2_Best.icc b/rtdata/iccprofiles/output/RTv2_Best.icc index 3f9db89e0e40d0ac01ca78440dcc7325df9f1082..84037ecf7f03fa589b9bef0db53d542971a4893d 100644 GIT binary patch literal 25452 zcmeI5XHXQ|8>dhA2Q?h^7`XAr>-(C@e z;u4YofN0w@C4)l}gSKm(?YcNMDeh1I=5|dBjQqQv`%@>lI2mvEKLa304Ewtl`s+^} z_;+oD{Zl7wZvue8KWoy${;4JZUgw|s&-%3B=-}Y(IS$)(O>lI~pZddgos$%jw*9>T z7{|u#O4u0|o+RiLkm?d1k`NFV5+bOipr|1uXl$$i{<+sbGXYDOlAMY{qN0+VrjoLv zg3#a1KYb7elz<#i0SX`yDE?h*Zl9I6YX$J%r~S9-|M%mcXZFvh*XRE0v(Wmt_wTwv z$q6a{T(SHaAOHg-Kmjzs035&r0w4l1plshaD`4Ax`gFh!H~|;n20VZl@B;xLxP8|m zKop1paUcm8Knh3$+3g+5Z|~>NzEprJPzM@76KDZ#pbPYXJ}>}Az!;bSQ(z7(fF-a3 zHoz9x0ej#GoPaZM0Xu*ja0ed16L8AJ`8HK@lhh2SEuq432 z7y`p!1Y85x!5Fv!Zh_li9NYmDU=rK|_rVmH1`ojum<5l)Q!odff#=`_cnKE3Yp@93 zfMxI&yayk^NAL-J2CLvJ_y*R&2KWwsf?r@0Y=Pep1i=szLO~b^3*jLGM1sf=3&aXh zAsR%7I3O;F8{&odAOT1a5{5(|F-RPegcy)CBn!zw3XmeC45>hBkOrg)X+ye@9%KL+ zLdK9OWCmG4R**Gh3)w>skQ3wr?SR}M56BDhhI}D^C;$qALZC1x9EyOVpcp6?iiZ-R zWGEF%gLXq1P!^N}bIs02C;l|tpvQK%9+4pl?7P#shcH9$?!Y3K}e z7HWsiK^;&R)D2yPdZ8;&KQsUhK_k#LXbidu-G=T!6VN^A0W=Lgf@Yy7&>S=my@Xyt zi_jAE7J3hTgg!y5&{t?3`VRes{(`n(0K+f}#=tn30Fz(}OoeGMJIo1l!+fv+ECh?d z;;|i;oIEmZzPOFA+bmTl7gfn=}1l_FH!(0j1)&QkTOVlq%u+ssfpA@8X%34=141~ zEz%L`f^WG71@sOhl$2cOx^AImmqEK4cNH1X+r#KpscdAWtG2kf)KY z$aBa}WDl|z*^eAVjv{X$ZzCs=_mK~gkCAi87syx0CFFbL3i1nb4fzAPi2^7j3X3A3 zC@3}*2Z|fTj}k_Sp%^Gxlp;z6rGe5x8K8_&<|u2FJ<1v7itDppC8`E>64i)mLA9YeP~E6rR6lAEHHx}{8b?i{rcg7er>J?< zYt%C81L`yC8|pjiFEl_S(O5JQ&4Q+(InjJ*A+#8pftE!pqE*paXg#zM+6--lwnICk z-OyfWKXfoU936#@Lnotmp)=9B=)LFz=n`}(`WU(zU59Q&x1ih5o#-C)W%K}g1U-fx zM^B=s(X;3|^h@+2`W<=&{T01|{)GV;BnF2eVW=2(3=c*CBZ`s4$YK;RY8WkyKE?!N zfw9FnVq7tv7(YxfCL9xuiN~a1(lObXd`uzcAf^;^3{#CciD|-|!JNZf!1QAJF~gWK z%x%mhW*YMt^Bl8)S;Bn4tYX$MKQX_tNGuLZ#!|5ySYE6URvashRlurZHL-eFW2^<% z7VCs{!+K)_u%XyUY#cTjyBnL0&BqpEOR#0wN^C9m6!tW>4cm#mi0#7;VXtFvV<)i> zu}`q`*w@&%*cI$o?04)I4uQksNH{8v1ILFG#!290a7s9JoDR+qXO6SMIpSP#-nal< zC@vBgk4wR&<8pC(aYeWzxTCmgTs^KC*M{rFUBva{hH*D=cX0P{Gq^e20&WTS5%&f6 z9k+=`;IVizo(<21=f{iU8F+cT3SJ9ufH%ck;~ns>crSbaJ`5j)Pr#?)Gx2%&LVO9n z9AAa6!#Cm2;ydsc@%{K={0;nF{1ko`{~Z4s{|^5dzlQ%sfCv}@i9jWA68H(C1Sx_7 zL6x9QFeI20YzfW;4}u>dgb+!HC!`QE2zvpkgds%WOuS3Ig}htP9*Op=aTo650NX# zHRJ|zE4h>0OCBVTk?)YF$WO>G$;;$VAM^UBdP>d;76i13X z#g7t7iKZk`(kXi=2Pj78lkvXdpAC5))dw()&kaptmUjV ztc|Q^Sue2mv5v6bW_`f=nDr&=Th>+9?^Hm=Qdy`RQ~|04Ri3Iw)uWnG?WnF)A8H6S znwm__q!v&QQp>3|)JAF>wVT>cy+*x5ouPO^O>FIKJ#1Im#@Hs<9T^%cm97%4xNnhRk|+SjBZDFqx;dr>2dU3^gZ+g^fG!iy^-Ed@1YOS$LN#vS^5k5 zTlyFJFLnewk)6)Y$1ct;&#u94z;4Oz#O}o&?-%$~)*kNpsPC3`)4EBgiZe)j9^ zciA7Y&$BPHud@H-KyVN_=p6hU5*!K~njA(P)*LPzJ{+MOu^ed}xf};L$~bB`nmEpJ zT;dqwxW(~+<0;1?#|p;=C*Z_!QaO1z#W>|S)j16~EjgVzy*WcTV>r_|b2$%imT}f{ zHglfmyv#YmInMcz^Eu}d=PKt)WzXf#704CImBf|BwU6rv zR~1(yS3B1wt|6}5T+>|7xR$s+bN%E-aFe(>xCObTxRtqexy`v9xIMXpxudyLxpTP> zaF=tR;BMjWg zTll;9ukzpIf588Ye~JGK|E2&&fGWT%AR(Y6pd(-|;3VK95GIfykSVZFpj4n%phcid z;Htn)fhmD!0?Ptl1-1lnf;2&XL584;puV7$;0{55!AQYm!5qON!J~rpf^CAA1V;q# z3eF0?5?m4dA%qm72yqLE2`LC^3z-Qy3i$|y3ndC=2^9*J3)Km=3iSvL3*8Z#5n2%X zDD*=ZDNGUO78Vm$6xIWf;7x{3yh#)$3`Ef75-S}WQj+ATUHIxadR`bzYZ=r1v}7*&j4OiD~u%uvi$%tI_h zEM6>AY`<8!*h#TAv0kxjV)w-6#FoXri34$>IH$O%xPrKjxP`cjxW9Omc$#>=_+jxH z@fPuJ@gea$;b{th}s_tfj1*Y_M#+Y?f@X>~Yy<*>2fk*$LS>*|)Oma!5H=IRQBtIZZipITyJ= zxmdYOxdU>Qa!qnwazk==<(|sDm0Oob%CpJ~$jiuU$(zgXkPniNlh2YbmOn0kTE1I; zME;)qGx_)OKNK(uGzDP=1qD3?YXuL5Fok4=Jqm{vPAIe~Tv528@KE8E!m7e=MUosvEQ0i0~QkqbjQ+lWLT^XZHR~AuLRMuCvQ}$MlP)<|cr(B`jpxmWAq&%VgO!>X? z4;8EmyNZ~KvWlUKgNm<8v`V^4p-QDnvr3Q3sLBJC7b>4rHdTqL+^P&!4OKJM9jZa9 z397lOhg46fwyE~1-d3GeT~b|FL#nZ<39Bin>8shP`KU#z?N%#Pt5j=N>ruO=Hl?

zyHvYgyHk5e`=0i^_9yM%I%FMw9XTCc9a|kAohY3QonoD8owGW9I^#M|bl&Ow)Wz#^ z=`wURbuD#0bi;Miboc94>bB_i>fY3y(OuHr(8K6)=t=0Q>zV7h>4oW~>h04zrgvKJ zlHLuy8NDUF4SkG0hrWcqy1u!-yMDNSn*M(MO8pl7Uj1A8kM-Z`|1iKAa2rS&Xc<@; zco{?*q#G0))EKlG^c&nYcxJF-uw_U#6fl%G)Hif6^f!z*%rz`EJZ0ErIBGa$_}cKB z5z2^eByOZ;WNzec6mGQ3sL-g&sMV;?=#J5x(MO{#W3sV;v4XLIv7>RIae{H4ak+7m zagXts@r?1Z@edQ63Ac%~iH?b_iH}K)Nw&#hlX{ablTnjtlSPwtQ?x0Esidi6Gbf(={`+8HbsqnWmYQnU`6#S(e!$vy*0>W+P_PW{YO)<`{EM zb18Fea~pGC^H}p7^CRXB=H2Gk&1cM)&3{-BEO;&CEc7iLECMYOEeb4-TC`YPwivgV zv-oK7+mh8%*iyyP)Y8o|+;X>Nk!7vrdCMWo2bQla*Q_vBoK{j+I##w;epc~Tc~<3C z%~riux2>L9eYE;*&1x-dtzvCv?QR`mond{@y3V@Oder)%^^)}u8-fj=jl7Majk8UN zO{z_yO|?zC&7jSFn^!h#wisJ3TWMQeTYK98+eF&}+e+J3+kV>#+ZVQ9>`-nJe ztJ3@A(?I_xDVn^4G z>pNz5yx;NLmFggSr^y4Ur%Yn$tk>y+z~>rXe5n~z zd-Qoscr19Vd*VI$JQY1nJv}_5J##(FJzG5cJ@0wG_WbTe^b+(^@v`vp@{0A!^E&2r z)@#sf%4^B%mp6;IsJDip$c_?f=$)D}Wjx5ug*`5D*fuJK#`2LqKo9 z-GGIF^*}B8-a6yt3l`>?jZRflOT_vn4r9%%Aoe3k)WBN z55Z6{d$4q{L9lCZWN=P!MR05IVDNPC+u+|Jv=By!UWju@ct}=ASx8IB)sU%><&e!# zYN%wWZm3gecxYy5X=qF6)zGQX<(J7ad{@2uK+e&_X_Pj{|Hpd)xAlp-u5 zd?OMg3M1+wdLqUnUPf$05+j8pH6raIgCloG9*%5|?2mj9xg5C_MT?S(GKg}Gii+A3 zRT*_I>RQy3sMTmpG+(rGv}LqkbaHfY^r`6H=!xjp(Z6C?VPbn$u7x}$$OHI zCwC;@OrB3(Pa&mp4yRmBXvG? zJ&l|umZp>Dk`|ekmsXY5m3AxbW!m>$EW0Fj>F;vg6|<{gSM9EzU3Yf9-t}uY+ivOI zM!P+CC+sfVUBCPC?t8nJ(?L3Cx_r8Mx?g%~dP#b7`at@l^py;B27iWXhHXYjMrKAu zMtjEfjAt2ZnWRjyOx?^KnbDaAnYEccnRhc6GdHv7S+ZHCSw30GStVJ`Sp!**vR1Ou z*#g<>+4k9C+1c5Z*&W$8vtMNY$YIT4K>^*#(TW>B<(r4r)kf?o=1B=%n!`ponMyUmVZ6}dH#9O+v3rH~YVCF2 z8@0D!?}@#a_TJn3b|1Wtcc1D$yM1B%a`qkH*R^ka-|Kx_`#JV2?6=$>xIbfm#r|{q zZ|r}$|7Rgvp-iD!pQ;Amt$Apz%TPgDD3OA8b81 zdhpr7jS|)p=@Qct-;%VF(vr54v62@hKM&Ck$sMvd6nH58P{pD1hi)Bub!hW2$6=+z zHittG=Nzs&+bLmj& zlhU;^N*SZfq|CQ$S6NwEd)dvhg|f|Zj&h}PoAS`|-16%3i{p%AB*lH!Q zQliqR(x)=5vaIr4<;}`hm0QQTj;kEEKOS+s;P}boea9aiU#%ilNmdzG`Bv?!Dz7?U zb-QY@8mi{4RM6YWUQ% zQ$HH$4T=r64LchO8tNOaHau=vYh-PdZM19*ZQRp%qVY=OqsA{yspe0o38y7bo16|foq4+I^u^N;PJe14v`Ds?v;?$d zwp6uTY?*5Le1>?2amMsa;F;_*)n|IoOrKe8CAUhonzshG=C;Rqp{&NSZL#o4~Bcx+b$H|VX9Zx#G zchWnRIvqNrJBvD7IH=N-UD{n9T`67VU7cN%T^}ysFGyT4y%2OE=fa5#eHR{I z*yyHpD|I_`M|T%>pXna!e%%B22=?gqc=hb+Io8wN^PuPRMe;?Ni&huIFBV*ExHx=q z{^I5(o=cjS+%6?wD!bHqY4Xy?UP3RU*St5RH?Oz8cd++a@2|_;mo+ZCUQW7Pdb#8B zy%J7x>E1P{heOi6)eJOnveHZ#3^nLCp_sjNM_eb>a??2st zz5n%9_^QxV{j0uLGp<%&y?k}{>iPhEKxM#bAb#M`z`23D1Mdg%gN#9o!O+2i!N$SS z!Iwi|NMJ~B$a^S#sA}l)(CpC0F#E8|u=8-j@R8w;;mP5Z5z>gvi1kRsNa0A!$c>RV zqo`5QQRC6T(cIDc(V@}#(XDHI*L1FVUrWDMb?x%C*=yggb6i)uzTPmMBX@XqxHtE8*gu7Z%W=YzZrIO@6G0$V>cIX zp>B!ZGPxCeEALjrtA+jFns-srto_mTHS@0;8YxnFR<>HgULHxDomBpz5i z2!Bxc;LL;D58h1?rlhBArlO_}PPI=>OnsWBOe;(~Ovg``PIpaDO@Dhxd#L)*^2c!Y^2a@oXC8ll!u3S!iPw{iCnuf^K6&vJdMfhNZhCI*8OJk?XCBYepVd4YcsBnWdM^CjT8wPuCLQxSH13kJ--MoiY%HghAkE@o?V<+ z{QQRcM&*s`n_X|J-&}n&zXUIdE}1RuTq;^>U%I#SWtq0DzU;A_v3z2AX!+G!)LY57 zR&S%<9(vpLcKYqcJFa&+@BH57zH59p_U`R_;(NLGj_;G+AANuM{oMPl4?-VIK7@TJ z{LuDc^23*pw2$f^JwIlCJo$0-*U#VBzNvll{FeEx{@b;0%WH%+`8B7tl(pk)SJz&wBiAL?t=D7MOV=;1 zKVIM55ZW-=2;V5)=-8Or*!a%#UGIC~_r2d+zfXK${Xzes`NQW&?vJJ)w|;#1$?{X> zr~A*0pC^A_`?>s!_)FoJ%dfOwHNS>_z5WaPm&{)desKJaNNH=!E6AqLjc^n`X8AH^uIF^w*N-)Z!W^W!3gyK z2u4uYjt=0N0Jj_{?_kqXLkSaf8`f{bDXoI@pkQ1GncmZ|9o8$f&=0bvtJz1f^_$ zF962TF?-^6hlD239sQD>LxbY{VuFI`N(zb^GIV2O1@O;$gB4Y&gj;03&a&-MlL1O6ZY1cKo03l|D@gK!W5 zB0&_02C*RSUl%nAB!d*N2c&^?kOB6BERYRyKrYA!`@nus01817I0z1bVsHc;1tp*q zl!IfS0#t%3Pz`E8EvN%0K|MGHPJ>3!1e!q$Xa#3M8)ygTK?mprU7#EEfL?GBTmqLt zKez%0zz`S)SHTFl4o1NkxB+f~+u#nk3&z2HFaaKbDew?H0@GjyJONL^EO-v)zzgsa zyaKPm8}Jq^fo1Rxd;lN8C$I`WgRkHlSO**6JJwDP$rZO@A zhXr9FSOgY>C1EL829|>rVP#kq)_}EO9as-GgpFZS*aEhKcffYA1MCF5z;3Vy><#RL+}x}1TKdw;3~KVu7m602Dk}6 z1D}P@!5#1gxCico`{4n27#@K~;hXSn_#S*8o`fI4)9_RHIXn-)f?van@H_Ye{0aU7 zufZGeCcFjzLBI$U0*k;SNC*}L8-j-5LhvF45OjnHLL9+B$ROkpiU<{iIzkJfi_k|H zAxse#2y28b!U5roa6z~uyb!(!e?$->6cLVyLc}5x5Xp#CL0 zW28CK3TcCMKsqB`k)B8&q(3qU8H$WRMkC{qNyt6O3}hBE54j&%ge*puAj^@*ku}JZ z$kWJXWGnI_c8b4k520$B?&?IUi#>ON`; zHH~_Pnnx|57E$j}tEg|N@2FpBfJUORXd;>g&5q_m^Pz>%VrT|h7OjX@MQft<&_-x8 zv=!PG?Sytkd!l{O0q9V41Ud$tfZl`7Kxd=#(Ff4Q=n`}Vx*A=FZa}x7+t8ip9`q&j zAbJEnhQ5QokA8@rLC>OJqTit3p;ypf&>QHV7=S@ya2OJXis8WUVgxaw7)gvQMiHZi z(Zc9sj4>7%8;k?S1>=G7#ROnNF_D;9OcEvylZna06k-lxN-!0eYRpMYBjya|9OeS% zBIXL_DrO9G8*?A?5c34{9PQN3lKaSmN1jYXHmgk=Yd6N?9nKg({G7?u>4OqP8t#VqA4wJZ%RXIU<=TxJ@vdFT+vd*%_iee?Qva|BCim*ztDzR#^8nRlj+OxW{`m%l4HflHZ3iUemF7+XGmbyTFPyI^$$%bGfu(7f6vWc)s zvnjJ_vzf5%U~^{kVhd!8U`t?2XUk(d$X3Qy%ht%&&ep>=z&6TukL@wr9NSyA6}EM@ zKkOKG3Ogq|on4Y$fn9^$klm8qf!%}MpFNB{o;{5{m;E4n8G8+TBYQi0FZ&?-82f$p zY4#WFOYEQ7f6yQro<^nd(nM%7G!>dI&6H+KbEWyxLTNFyJ+y4v0a_`on$|#TqxH}R zX=Akev>Dn9+A{46ZIc7RLF8cP;O7wMkmpe6FyOG{aOCjd2;hj|NaWbdv5(_0M%e|lbD0dZi19v<3Mebql+uT#!&$-`nuX1nlAb3bT96WR$DIR4WT^=(Ydmay- z0G>#mWS(rE13YCsCwQ89I(hneMtR10W_VuleBfE*`NNCjW#i@NmEcw2)#5ebwdHl= z_2-S?P2|nwE#xibt>taz?d0v}9p$~x`-FFa_apBHAH+xCqwxvyG5D1EbotEr9QZu> zg7{+iQu*@uiuo$}PVu$z_3~ZiyTkX0Z=P?N?;GE5ek?zgpO0UHUy)y%-<02;--ADp zKbn6Je=dJ9ecSn2vP<41SJHO1a$<>1sw&w1VaSl1k(lg z3zi7h3N{ON2@VL}6r2=%F1RH4Rq!_*OJ}1C&>3_Ux<1{C?o9WkhtU)1S@a_MF?v0{ zjee0nLcd3!p)b%^=s$#zLKGn$Au%BZA#EWuAqOEZp%9@sp}j(dLS;gALajnQLc>CL zg{FmG34Ij$E{qhW2=fSw2`dQe2%8H#3i}A}7ETb(6fP1zCR{JvF5D-4P58d>Q{lJ5 zpM`&kU`5zO1VyAoR7DI$c8Iu%1c*e7q>AhlIVw^s(jw9=G9+?GEzvB| zEio){SK^7p8;Q>nTatK54oMM7c}ZbBIh)N85FQop6~(wx$w(u&f0($>;$(m~R3(wWi+ zrH@NDN_R;QN#B)zBK=nSs|+MVmf@9=lu?y2lChKVlG!bjB$F$1MCOFdS(!eWQJG1Z zd6|zgo3a>Lc3B}=d08DQL6OfaU z)08upbC&ayig8zUPfL^-dujCyuW;m{9gGY z`Q!4<^4;&8Zq0pvqN#TaVBZUQp z&kBDONs2s*l8S1ICW?-VyA-1o(-jXWRw_0rb}No3PAJYPeo)+0!YXkni7F{687SE* zc`1b{?NQpVRIYSdsZ(i4>7LT8(mSQ^%4lVFWf5gXWqoBEWiRD0P{F8hsEDd4s~D=-sraZwsHCYBs#K~psr0B^Q<+qGq4G&(OO>d~qsmZK zS2a_0Rt->%Q_WI6tXiwurrNK1OLazdQFToXsm7)zq^6*zuV$;}r53K1s#d60q1L3< zqjp_wO6{fEs@flQvO2%IjJmeErMjDXh`0`URvQ=X<7%gsTGvKv)3n93RkTgC zowNhAfO+r)?3uu(8uU=>PzUW>znJl>WAp3=ojc$>bL0k>EG0UqQ9*F!vJT% zZ6IZ!Wng9CVGwSRW>92MW6)-B#o(U7bAyitzYWQT0*3O2`iAy~y9{Ftvki|Lo-*t* zykvnIAPjW!`N*YW~=K$^3@}!Gh01)p0gaboU~l9T(d%3aal=OXx@Gmu>Z8>kYZhx^YZYrVYd7oN)@jyvR<_Qu>-$@ zZ-?9tgB^}L0(T_sDA-Z8qix6Fj)@(wc6_rz+i=@R+vwWZ+4$MS+vM9+*qpJsVl!^@ z!sd%D(w5VfVXJLxW9w@hXPakx%=V0JzwJHSdD|~`NIOnDhMl&Zt=%rWIJT6YclgSJ}7Q57|%Jzqa3Sz&Y?a$U7K1I6H(m>~T2g zQ0LI;aNS|rVcFrABgIkJQN_{R(Zey)G0U;UvC*;5@s8u1<7X$N6NeMSNyo{~$=@l_ zslch)>73J5r-x39PMgjoXS%bpvzfEIbA)rIbBS}KbD#4a=Q-yuJ5f8ic1rKm+v%_~ zXlKgKqMavpcJ3VAIkWTq&fhLn7cmzN7i$+^mpGSvm*XyNF2gQUE^l2nT}iHVR~1)t zS5Ma{*BsY!*E6nHTqj%?TsPeCZUSzKZl-Q-ZV_%-Zl!L`ZkOH0-Cnt^x#QgV-4)zT z+}+&6-80=w-J9JnyN|oSa$onrdGLEEdYF2+dqj9-d6apycwF(A@ObU<-IL%c=&9^! z?&;|n?V0OY;d$0`$aBhb(etMl#Y@CX-OJi*msf&Ufme-Jhu3wl8LtoCkT=bn;jQcK z;2rFp>Rs%8%DdP5j`zIxS0AhopO1o%sgJu)q)(2|F`rhSA)hIqMW0{3EWTpCn!dKa z{=Uh+MZPC}yM1r@KKK2y3%!eXm;5f1U2eM~cjfFlw(IP!p+`$k_tJ0OpWsjTSM|5__wkSSFYvGR@AALl|IB|i02RO!ARk~7;2sba zkQ-1L&>k=nFdgtA5DMf7lnyiq+!+`am>F0e*cvz#_%Lue@OKbf5F=+ypoDp0S+#Ea*JQ=(cycI$XkqprdaS90y*&9+CawcRj z?$O=P zcCUt^!}!9K!YsnP!{WmV!|K9%!tR8<2wM*)h6{&lgxiJ(hNp%f32zF&5_vZ9VfwMSixdJ?r7jgIDvR*tre-W8n`eK7iT^rh&D=(o{ZF>EnXF$OWNF_AHO zF;y|0F*jo7V!p)^VufQhV(nssW7A_xV_Rc~W2a+R;*fE?aY}I(alUa$afjj>;x5NM zh+B&L6VDMZ6K@>v5g!|05MLMH8-FkUb^K-mYl38geu7IvWI|p-bwXFdt%Mf|8;O)e z@kHH3=fv>DoW$da9f>y*=MvYGNJ*ke+DVQ{VM*CZl}YE5ZY0emttAtaMU%CY9h1Y7 zvy&^6JCbiC&n2&?kW$1_bW)sC!c%fms!}>rZl%0P`M!s;M`DlO9+y2)d-C_x?&;oh zchAC}pQ&uAQmIC%9;vaZg{k$aeW??vOKBjDGfh6tJk2*PDXloIDQz(AaoS2cDxE)F zHQgpXC_N*+JiR@AH2rz{w+v#2XogOPb4El)UPetucgDSpHyK-dX?tb&n(p=9o4EJT z-p0Lydmryz$wX%gWU6P{Wrk#CW>#c&WZuktk@+KwHH(pDnB|cbmsON?I;%hHVb+Ii zWHx`cYPM~5aCT;PMRrH_&Fq)iKXRx!QaQ#so;e9Q2Xh*826G4HVfGbWeUv-eG5|xj~1RSyk0n0xN(5xfYbrw1KtOc4jevk=D^5- z*#m1ulp@I@qax3u#G>M&mZFiOXGLoV$pyBPJI(2lV1Y06pqEq5p z5?fMK(o`~B^0eezDW#NAYEtS`no?R?+Fp9I^i}DvGR`u^vK?i?W!YubWxZt+W$(*T z<@9px@}1=|ap@;9mj4Tds6`_cq>#Z>?^`6_EpqZ z^jAEt_*_Y>l&CbS^sY>>`k zK2>|F%Bs#+-L8654XXL7)vFz=BdZIl8>)w@pH{Ecu-3@bnAZft35sd!+Vk?O5%r+N~4ZCsa<@p9nv(|HP>igD0MzSgT{Llc}?)3#iMitFG&< zo2*+oi90EF((t6$$&{02Cp%8wIk{Mms28l)u6L=At1qr^tskp@RljwL`;_V_hf|TK z3Qskjx_avQsUN3lrxj1zoZfvp|8)K7fzwY;uQjkX$TnCu1T|zgoM^b*@VMbiBe_wk z(Y!IBF|)C{v9IxA<7yMJiP2=*mvRF5z6sx%21lo?AYTJ}+|K;JnZIwDXncd(KatU+o}uNOf3r1a;(e z)O8GWJnh)%q;)EF+IL2F9_Vc89PM1_0$l=K+FkBlNnK@Kon804K3u?Gkhoxa!T&VZoGGXv{`v_a)T$HCaa!-MAr?+v~m!VfWq%!h)9 z@`oCRMuuJvgJHp8yuJ}ku3x%7bA4l!b5w0~=V;<+ z+31DQ$PEzw&hw*qhF-a38j+O1c&;oHKu4R8D1&c0oLd-(Q?JKzrej=>$@JDGRt z?hM_Tzw_s=;9dQ@K6m%tJ#lyN?%dtq_XO_g-SfG(_uh$ngZJj{{T>$_*B|#C&m6BC z9~z$@|8t*y-{AhP`&su--oJYP{n+bq#^V!@haS&QgK42@qv?R@yy?d2vFXJb>_{^s#EKd}lI6jGgQud_h$>S&ApK?Fddg}Q!{ppFPLr-5kgPsXLGkF&D zY~Qn%XSbfcnn@YRb2ctLc*Y$0^vz(U)?_`>RI>T8wPF0WHwSG~USdhQMMM&ym@ zn~*n!Z_d8C_h$7i^{vWVm$!S~R=*v1JHH4oiY}Th?p`cfY+syM{IbNpq`u_7l(uwY zX?SU28MQ3AY_%M@e0aHQ`Qh@$JMMQn?|j~6ziW6m_HOw-@x9!8hxhUCkG;S2e)j$E z4?-VIJ_LU#{LuE{{)aCg**~g(^!S+Z@#M#AAK$ECSEN^LS7KMnRxYkQUD^6X|783r z_*3DhwomszeOaZgYOH#$?p>{49bH}eO!zGK+2M1-=gQChpXa_nUqruHdi;$W>zS{2zpj2``=<8I<6FkJ`fu02Ev*sOyl)&E@Z&$9o~ v>wh^n;(zJt@E^w{ZucVa+wLjgyxnggXuHRNABfo={|_B6{$s)a>-fI_56S+Q diff --git a/rtdata/iccprofiles/output/RTv2_Bruce.icc b/rtdata/iccprofiles/output/RTv2_Bruce.icc index c795da140de12099a41e3e8f94175b4e120fcbce..152b4171717d7acf95542e0876b79f808cec73b9 100644 GIT binary patch literal 25452 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 UVs`dH|Mm9&{r=ze`uAM_15{=AbN~PV literal 25496 zcmeI5SvZwns#Q5!ebvp~&I9S?k=U3Yq7ZjWjxSc<3=Yv5}K|ufnWNzpBps48W9LTku zbN}AO_Pjl^3jr`F0|1Ht&zchffD76Hu<-t8P27C@vjzYIn82j?;P`S9e4mw;0=6$FYp8YAOHk{AP@pVK^WKtB0waF0?{A_#DRE_01`nmNCBxJ4P<~! zkOi_qF31D;wBj88`?IfpSm*s=#4T4QfCwr~~!jC^!yIfCg|9 zoB~at8Jq?!;4C-?T0tAQ0NOzZ=mcG$8}xun;4-)Z`oL9i4Ge%ma2*VRn_w7>fLq`W zxC`!q`(PA21Y_V4m;jH#6EF#;z%%e1OoNwT2D}2V!5i=vyaVsS0$2nez$fq-d;!bg zEBFS!gEg=Yet-?|3v7Zd@CSk*7(zlQ2m@guJVby<5E-ICtPmAqhiDKd#0Bv{ybwPm z2+<*7NCXmt#34zD0ZBu$kQ}4{DMHGS3Zw>UK$?&?qyy&p6K`zh^$PMy83))C!%4+M!OU3+jP- zp)1f;s2>`HhM=3!2y`2|3*CoCp)qJ2dJH{h)6-CBeD>=hPn+ zkpv_KNk!6-Tu45oAW|49hGZaRkn%`nq#9Basf#o~8Y9h-R!CcmN19(4lMh-yK#qAs8=qAsEOPy?tNs9UIesE4Qt)FkQ!Y8Ewznn!&^Eu+4pexQD% z0UC+MqKRl0G&`CL&4(63i=i24S+pWr6|ITZLmQ#Z&{k+Wv@_Zb?S=M32cpB!k?2@- zB03G7h0a44q4%Q8(BKrSA^I_T3O$W}jedvz zfL=ncpx4pAFaU$Z;4mZ%6~lqy#Ry_VF_IWrj3P!2qlMAO7-K9jwiri@E5;M!hY7@l zVWKc`m}E=_CI?f9DZ%W=lw+zfb(j;FCd?VkdCW!3CCpXKb<7CnF6JTTG3FWOCFTug z9`gzF6|;)j!2H1?u{bOVOT}_x`LIG*ajY~}9;<@Y#Oh&y7othF~MG zvDhSRIyMJeh%LdEVJomT*rV8!*wffnYzMXn+lL**4rA|PA7US4pJ8XQZ?TKmCG0os z59}rmfy3fRI4X`4$Bz@nN#JB~ia2$g4$cr~hO@yr;#_fFIDcFSE&>;aOU7m3@^HIx zrMN@5!?-$J1Fji&4%dO}!Cl2&$Bp3b;~wEAanrarxOv=X+zRdoZW9mVv3L@m4bP1i zz>DG;czL`EUJI{}H^p1w9q_JrFT6iK6d#F?$EV=4@CEo{d>OtHe*}LV--JJlZ^!rG zui~%cZ{Z){C-77F8T?!P2mBZOD*hJ%B47wa0+ql;5Fm&WqzLi^Rf0CbkYG-*B{&m2 z2!4bhLO3CokW9!VJ|Vs!z9udZmx!yxUnGcxC6P%q5-&-JBuSDZsgkrwMkEW8J!uEY zn-oCWMT#LMlQKyKq!Q9WQZ?x)sgZP+)IqvL>L(48?vchx&q%YR_oPpxZ=?+}M8=TG zWEz>5EKFvQ<;iMfU9t(;itI>sC;O2@$dTj(aymJWTud$_SCQ+NfVM;W5rr97fcQD!OcDW55;l;11}7CZ};g`0)WBEcfhqQ;`jV!~p> z;>_a762P*HC6*X8WLfha#a1c4z zIrurmIpjIiISe=~Ih;5=IRZH%Ig&WCId*d#;Hcqf;5f^1k)w~}CdUJgryR2!3mjiL zHaHQSL{4^2eok>tc}@*ZLryDBXHIXj&r`? ze9QTnbDaxt;kc+=yj-GOa$M?M23(e0PF&tx!CcW?DO`D6d$}sO>baV^E^zg74RPJ$ zddxM$HP5xowZV{POd6Rf^cuROIc#ra)=I!9^ z;~nOG$oq_Uj`uU~Iv>PG;G^*g@-g_7`E>cr`5gJY_=5Rj`O^6c`O5fe_)hY*^7Zgt z=ex)Egm0E_k?%X-7C)As%Fo9y!LP`#&2P%@!0*W)#2>?-#$Ui+#$UsKlE01r690An z`}|M&U-N(DUljlXcmbM#pn#Nsih!PgrGT@5uRxeUf=e8vcw2B>@TK5_ z;5Wf7I+o5x7oaofDs+9i72SpIM-Qhb(R1mg^uzQ9dMo`BeTe>mK1H9SFVTMrA%!SH zJVIhZ3PRdKW?G_fyh}JyI7hft_^@z;aGP+i@D1UI!q0`@3x5^XW~6tNL; z7YP)J5lI)>EpkZYs7Q-Qm&ky~J&~s(Z$y?veu|<*Sw#6nB}J7*^+l~kT}1;#qeat1 zi$o8J){C}?c8Ly%-V>b^ofBOW-4H{IQN;wr7-FhohGMp29%8{_v0|BG#bT9WC&XIC zdc|&vjfqW*&5L~#`y);e=M)zamlxL-Hy3vn_Y;p0PZ2K^KPX-=-Xh*5J}7=)d`kSS z__Fw>1Wtk`AtWIyp($Y|;UwWJ5iXG|Q6OlM0fGlgg6XD^)GkDAgf# zP3o@Hq|{rfuTopmcxg^)QE5eKJ!xxccj;j1c;f6Y_@Ev>=D^!*^9E*Wk+RS$S%sR$sy%fgrkb5DwAh#xukY|+_ke89yk~f#%As-+gE1xZ2Dt|=&w0xKRko=hZOZkuTKNZjl z>Z)d{E~8shPd8wRjW0tb*tS}n^1eLwygF?ovhBUE~Bok zZmI6B9;%+KUZh^BeoDPl{kr;?`mFkr`lbd^gI7aJLsP>-!%ZVZBT1uBqeA1PMu*0A zjWLZ`jU|muO`;~RrnIJ(rlqF4W~gS0=5Ea@%|^{G%^RBIny)p#Y5^^ZmY|lLmadkq zmbX@fR)*GIty--!TD@AgwI;RZwbr!J+B9u3Z53@3ZD;L3?Rf2c?L*oP+U?qd+GEwI_Gq*=-kzLuJb|Xr!G#HTbH4$scWI@t{bMC zs#~mEqkCHSlI|_tN!@wfbv=w8r=EnKx}Le7n_j41iryZ*YQ58Xm-KGwP3q0-t?Og- zIrSy<)%DHw-Sk8CQ}v7WYxG<6d-ZSYKhs~-|7n0T;5Lvl&@!+x@HB`p$S^21s5fXe zxN7jg;HAN5gDpd{p@5;hp}wJm;ZDO?!#u-7h9?a>4R07u7``?9ZiF(T8HpRI8JQco z8HE|88kHE;8l5%jGrDIqZS>h_)0k{5Xe@7RVC-n@Zyax2U|eb3Xxwc)VmxU)Z~Vgq zXToD5ZK7jhW8z~HZIWYh(4@hn(`3kG!sM;Vswvu((^S$_)6~k;%QVt7%e2h&xM{oT zb<=UvIn(cEC^JqoNi$6|D>E;%NV6=n17;`8I?RU5Cd}TNt(jxYxy%{n+U7RqKIYNp zx#ow=Pnvg`51T(VUoih^L9pPnkhRdaaIgrlNU$ihIBap+;REQKwV zEln+5EyFC+ElVwrTAsHYv>dmbvs|@8TX9)QS!r9@TKQSUS>;<*S~Xi;vbtmS!s@ft zA8QtCVQUp@Gi!J2UDg@a`>l^#cUa%Bequdu{nG|-!)GIBV_@TC6J(QYQ*2Xf(`wUi zGiLL~=DRK0mfKd^R@c_v*55Y4w#c^H_KfXS+fmzBwkvi>J5D=>owl8=ou6I2U7_7! zyEArub`R`k?N;oO_MG+%du@9=`(J&f;4tp+)?wWd=g8+M?`Y`g;uz|f=D5%CxMPRoO~*;cMaSPx6enRP6(@5i zPp2rST&HrUCZ}GfdrmV>U!9T89L@}99cO#z0Ous*fG3gYRAVNTdq`B zF;@*&Yga$lc-JD=Bd)EkgRT>$ z0`7|Lrta?Uk?y(f74E0quegu8zj0snzM!B1?eE|p?4Rym=6}k+*Z+b4YyY(XLI6EL zHNY~!Hy|OPIN)eNXTYt17XizGs6d`T`9PCEkHF}_g20-?pvq1wvkAoJ2wu0G$8NqtN&cR{9S-};-Ey34<$AcGwH$$i)5+S-FP9dQo zSs~>ir$erVjE5|QY=%-pB|~*XokPPyvqLLF&xH1eJ`PCKaY1wj(S&EH~_M z*txLlVNb(8?Sgl4?vmYQyvu!8^sd5PM|NGJBbpM4pel8TmYN zISL)c7o{9!8RZw16jd5^GO9OfH0o{CMl@@*M6_`;uqroByc3iBp4@nCd4HaCmc`c zNqCU(Hen-?HBmBAKhZTYDzPxJF0nK5PU5S?^(0D?c#>|COHxEqe$tVo_M}@$Gf8X7 zq-4=#?PRCq@Z`MYn&b<~w~}X)S5t^7qAA)bPATCjc_}q1?J2iXW>VHtNvUF~I;k$H z5vlp9wW%GccT!)a{z#*wNu=qexu!*@6{Q_b>q@(yHkbA*oh@A|-6-8NJubZ@y&=6f zeJp(;17vV!$Y+>m_+=z#lw~w$^k+QHSjt3Y@@J}M+GYl4W@T1owq*`yzRdidMa&Y- z(#dkkip(m^s?X}mdXV)lYcrdcEt_qc?US99y+6AtyFdGB_EHWyM<7Q%$37=CCnu*m zr#RX@UQkd_SI|}Ppx|A>Rv~AhLZL;We_?uI zMPX~<&BB+3YekeI$s)rd&!YIE(xS$qYei3szU;>C7TT?~+j)27?xNktc3;{(wtI08 zyoYy>${yQ2p?h-o9NE*k=iZ*Tdp3(XixrA3ivx-?imQsx7vCy=RlHHcRw7ekR^nHZ zT5_o5T*=LnnUeLrEPJK)8t?Vlo4ohH-ZOiL_D=6zEv1x7mKv3Ml_r&zm9~@)mA)ul z-ACRhxzA{y*S@5E2lln>8`?L$Z*@OqKV!eqe((Ls`w#9vv;W5am;2YtSj(i#Ov-%A zQp?KATFXYtUX^VeU^^gt!2E#!fs6xH2QD1Ab71bk=0VPbiU+L^1|Q5hSbMPR;ON1H zL+~NKLu!W{4n-U)I&}Qd2y6OSG|dhY1R(Kkmok8vMU zIp%OI;@F;JCy(_Xdwy*7IO}nl;}*vQkLMh(JKl4A{P@xd+zGK0h9|sFq@Jie(SG9I ziTMUZgJ6SpgKI;4Ls`SwhLMIh4Vx#qPpY1DJQ;PenC5H{CSFYO7WEKsa>av zPBommcIw%w)kfAv*+$F8;KsbhV~tlDpEj;Ek(;EN%$ow6a+>OzdYc|MEjJUJ8O^56 z{>|CVwaq=v6U|>v6HZH>HaWfXbk^x3r+ZG1pZ?N9Xpw9&Y4LB#YN>7MX_;vGa)x+@ zamMsaz?tkbb!U3dJU;XFEcvX|S@W|&XLHXUJ$vQsbJxy2 zKeyh>-m1`Q+Zx`wr?s*5dh1NptAw)ji(5+(Yh>>9Ony?J4Rx)pNaPwrBGa?UP3RU*St5lx1hJ7ccAxW@2|_;mo+ZCUQWDRe!2bf=;hB>2v-%HWmRE1P}1eOi6)eaU@QeHZ&4^(|i|UzNRTeKq`Q@zv(5!&m37!Pn^5^so6` z%e+>1?eev$Yis?qe&v3r{LBT=2LGQtg z!P>#ggHwa+*J;;Pt~+0kzkcX?`}K#{mxf3~GDFrw;X@@uEkn14-rqpo5WQi1Bj85f zjT1KpZ_M7>>#IQF3b!OVlLQNdCDQNPig(c_~7qqC!b9?~BgJly#(_u+|$ z*B`zfgT{o$jK%`S^2bh&-58sDgm@(S$mCJ*qoPMmk47H7AIFSKjGK>#jTeuf8NW0B zVFEuPJz+BuIkA7DZDMp{=`rQ8!efWWagWO%cRrqY{QU|06V)fKPg0&#Kk0q)?8(Mc zo~PPRy`N@1J@$0q>Fgw!6q+=e44f>SY?>UIoS(u@F{Z4hBBu6DwM~sqeR;<6O!1l1 zvxH}r&$^#IefHxy_j9f1Ue7b1AA3IV{M8HSh42fL7r`%fzi4@J=f#IkF?Rz5e!w_D21U$D8yw^>6y$yqbgO zMCZ)r!shnQwa$&sEx)C{Re9_BHuY`o+pBM9-a+p~-kH7&eOL1C+`9+wmfus~tGsu8 zpZ31){k8YA^YFaryxIJ&`O^8e`LX$x1@;B?1&@V{g<}hY3v-L8Maf00#i+#ti=B&) z7uP>CUjAGbaUeKPqJ@~Pxg>!*jGRz9I``?zo zvwc_l?)g3Id&Bpe-xpR1tMaQ(tI4ZJR=eV0hnF@rWb(e1z>ssm|g&;7l7#nV0r=eV0hnF@rWb(e1z>ssm|lSYf4umboV7iimqJ|9J*jNGld!LPeLZY*Oaxh(& zF0803ub?9TcaJa$zx|GX@A><_fBFvoCO|ccPYMk7qlfA$$*Is2bQQO29{w5B?f!sx zkhI+g5WL+CK;Lcz(B1ADklXGWpl>$;=mN#RjS&BD#($lM7P@_o?f(K%P)JZzlG9XD zR#Z?B`uDfcwh!^o5frwI5B~W{*gnYLHO+q&At?T9_5VEZ?+5=E^M9R<_+PjG?>7>+ dyA=GlI}u#A`x1h;@5>*=ZqLF0{`LQU{vUfm2h#um diff --git a/rtdata/iccprofiles/output/RTv2_Large.icc b/rtdata/iccprofiles/output/RTv2_Large.icc index 40f86fcf138583e6f239fdeef3412792970e0544..a7659d318bf822bca36865ab26d79e4dae456455 100644 GIT binary patch literal 25500 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 E0a{T7aR2}S literal 25504 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 diff --git a/rtdata/iccprofiles/output/RTv2_Rec2020.icc b/rtdata/iccprofiles/output/RTv2_Rec2020.icc index b6969a6f1d1c6492e22040e044c63fe615e959d0..5426e8d685ee8558e902b26fb266c8d85f5dee05 100644 GIT binary patch literal 25452 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 O|BJMXe}?~`pZ^OV!uxvw literal 25456 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 delta 217 zcmeys`hr!5fr05oPI7KBiva^eZeB@Ikh_yYL}Zi#`y&QU1~vu`23`i~#N^@v-(a_p ziHTAZ-8}1ck_(DT7#J8G7#J9$%1a7B>^VTTNODGE3Xr`4$kr(W8UkeB0f{F;*dIXb zbTFHV1;j22333M7F9Bq0q(j&aAa)XjodIGeXB6cE)l2}gRZ?>EfaWtXZJ8{D1We8@_1+oGd3^sc(u3!WJ@=z=8 diff --git a/rtdata/iccprofiles/output/RTv4_ACES-AP1.icc b/rtdata/iccprofiles/output/RTv4_ACES-AP1.icc index 5dfb4cb0df7aec46770fffef9f78689bbb36cca8..aecee414d24b9a3bb29c1c4b446013300179c227 100644 GIT binary patch delta 242 zcmeyv`hiu4fr05mPI7KBiva^eZeB@Ikh_yYL}Zi#`y&Q!1|9}Z26+bd#N^@v-(a_p ziHTAZ-8}0}k_(DT7#J8m7#J9$%1a7B>?J_9NODGE3Xr`6$kr(W8UkcL0f{F;*grt* zbTFHV2gEK4333M7uK;9gq(j&sGc}SR>;e!wIin~SsAdL`t&)&YK*<_?hv-QkVb_4z$r(ktKs8H%Y?YMUJfQhZOeZD_FiLBx z0EJ{292t@sQW=UF3K$F-;u#be(iv?J_9NODGE3Xr`6$kr(W8UkcL0f{F;*grt* zbTFHV2gEK4333M7uK;9gq(j&sGc}SR>;e!wIin~SsAdL`t&)&YK*-_?hv-7#N^@v-(a_p ziHTAZ-8}1Uk_(DT7#J7>7#J9$%1a7B>@`5PNODGE3XpvO$kr(W8Ukd$0f{Gp*-Stt zgGf4rEdpW}g#$ax#B^k`0Hd_3 z0#HbX!HFT2p_rkBA)Y~jA)UdN!H7YR!34-I2C@wqj3;|Aer7yB*@j6SPWCXR001sK BG?M@T diff --git a/rtdata/iccprofiles/output/RTv4_Beta.icc b/rtdata/iccprofiles/output/RTv4_Beta.icc index 86825164a5c0f56637b348ef78a797a509f186ff..27e7c85f7fbdad6d9c680c242fb6eb05ac8c4eb9 100644 GIT binary patch delta 242 zcmeyt`hiu4fr05mPI7KBiva^eZeB@Ikh_yYL}Zi#`y&Q!1|9}Z26YD2#N^@v-(a_p ziHTAZ-8}0}k_(DT7#J8m7#J9$%1a7B>?J_9NODGE3Xr`6$kr(W8UkcL0f{F;*grt* zbTFHV2gEK4333M7uK;9gq(j&sGc}SR>;e!wIin~SsAdL`t&)&YK*-_?hv-5#N^@v-(a_p ziHTAZ-8}1Uk_(DT7#J7>7#J9$%1a7B>@`5PNODGE3XpvO$kr(W8Ukd$0f{Gp*-Stt zgGf4rEdpW}g#$ax#B^k`0Hd_3 z0#HbX!HFT2p@bokA)Y~jA)UdN!H7YR!34-I2C@wqj3;|Aer7yB*@j6SPWCXR001}- BG?4%R diff --git a/rtdata/iccprofiles/output/RTv4_Bruce.icc b/rtdata/iccprofiles/output/RTv4_Bruce.icc index c3a01b116a63e8dc72374a61e404ea970aba851b..72cf801a4e4ad51ba7f1747dd9239ab3ceff5070 100644 GIT binary patch delta 242 zcmeyv`hiu4fr05mPI7KBiva^eZeB@Ikh_yYL}Zi#`y&Q!1|9}Z25kn-#N^@v-(a_p ziHTAZ-8}0}k_(DT7#J8m7#J9$%1a7B>?J_9NODGE3Xr`6$kr(W8UkcL0f{F;*grt* zbTFHV2gEK4333M7uK;9gq(j&sGc}SR>;e!wIin~SsAdL`t&)&YK*<_?hv-QkVb_4z$r(ktKs8H%Y?YMUJfQhZOeZD_FiLAG z0fl53oEVB2N*R(FQW@eI6d2MOY#EFg^cYNl>|!9>kinRNVX_C~XU6lBZJ5;IWDipc E0Qkr?761SM diff --git a/rtdata/iccprofiles/output/RTv4_Large.icc b/rtdata/iccprofiles/output/RTv4_Large.icc index 176bff9a7f7266d644f489b9b260c2a013c6ce72..e09992e82feca311cd714d66cc31121065790a11 100644 GIT binary patch delta 242 zcmeyv`hiu4fr05mPI7KBiva^eZeB@Ikh_yYL}Zi#`y&Q!1|9}Z24x1d#N^@v-(a_p ziHTAZ-8}0}k_(DT7#J8m7#J9$%1a7B>?J_9NODGE3Xr`6$kr(W8UkcL0f{F;*grt* zbTFHV2gEK4333M7uK;9gq(j&sGc}SR>;e!wIin~SsAdL`t&)&YK*<_?hv-QkVb_4z$r(ktKs8H%Y?YMUJfQhZOeZD_FiLAG z0fl53d>9fLiWt%vQW@eI6o9lXgAs!sg9(sb3}hQJ7&9L_1kgbxEo0kG)@7XNCD9KpQ0u*9O wOJiX8w48x~H9R$(W%a Qu_zJ51OrU|>nU@ zI+)GG17a721UUokR{*j#(jjb+nHotDb^(Z;oKchuR5Js}R!Pat1Demov}dvaqqM99 tP)LR$h{2t~i9vxOiJ_DslOczpgh3Zb=S_}a{LFY^vJaCwoSegy0syb}G^79k delta 258 zcmeys+Q6p6z`)Fqlbl=3V!*(Vn^#g4eOhB6%G}0k#keM1u5OxEIot#mW3skcL$W}?o%>$ax#B^q|0Hd_7 z8c;}vA&4QBA(_F5!2pco859`O8Ek=UJq8mXyBNqeWH4r6nC!v$neqH&8zyx)*~63q E0Br*^?*IS* diff --git a/rtdata/iccprofiles/output/RTv4_Wide.icc b/rtdata/iccprofiles/output/RTv4_Wide.icc index f95587797ef41a1578ddf1ebad16512e3192073c..f8043a3c2a94b1aba565c07e2d8915a53102025f 100644 GIT binary patch delta 242 zcmeyt`hiu4fr05mPI7KBiva^eZeB@Ikh_yYL}Zi#`y&Q!1|9}Z1~mqe#N^@v-(a_p ziHTAZ-8}0}k_(DT7#J8m7#J9$%1a7B>?J_9NODGE3Xr`6$kr(W8UkcL0f{F;*grt* zbTFHV2gEK4333M7uK;9gq(j&sGc}SR>;e!wIin~SsAdL`t&)&YK*-_?hv-(#N^@v-(a_p ziHTAZ-8}1Uk_(DT7#J7>7#J9$%1a7B>@`5PNODGE3XpvO$kr(W8Ukd$0f{Gp*-Stt zgGf4rEdpW}g#$ax#B^k`0Hd_3 z0#HbXA)FzTA%!88A)Y~jA)UdN!H7YR!34-I2C@wqj3;|Aer7yB*@j6SPWCXR001F! BG=Bg9 diff --git a/rtdata/iccprofiles/output/RTv4_sRGB.icc b/rtdata/iccprofiles/output/RTv4_sRGB.icc index e760848acc779f790781358d6fc3c55ba8770ff4..8827a8a85321e7856d9c956ab6b231ca23f218f3 100644 GIT binary patch delta 29 kcmeys`hj(VEI$teCxa@3Xkv14fp4%|$izgcjc%)$0DABUh5!Hn delta 29 kcmeys`hj(VEI&5`FM}8Zb7FFFfp4%|$izgcjc%)$0C@ZeXaE2J diff --git a/rtgui/iccprofilecreator.cc b/rtgui/iccprofilecreator.cc index f76211bd4..2054a6c15 100644 --- a/rtgui/iccprofilecreator.cc +++ b/rtgui/iccprofilecreator.cc @@ -668,11 +668,13 @@ void ICCProfileCreator::savePressed() // -----------------setmedia white point for monitor profile sRGB or AdobeRGB in case of profile used for monitor--------------------- //instead of calculations made by LCMS..small differences - v2except = (profileVersion == "v2" && (primariesPreset == "sRGB" || primariesPreset == "Adobe") && illuminant == "DEF"); + v2except = (profileVersion == "v2" && (primariesPreset == "sRGB" || primariesPreset == "Adobe" || primariesPreset == "Rec2020" || primariesPreset == "BruceRGB" || primariesPreset == "ACES-AP1" || primariesPreset == "ACES-AP0") && illuminant == "DEF"); //necessary for V2 profile if (!v2except) { + std::string is_RTv4 = ""; + if (primariesPreset == "ACES-AP0" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.ACESp0)) { sNewProfile = options.rtSettings.ACESp0; sPrimariesPreset = "ACES-AP0"; @@ -683,7 +685,14 @@ void ICCProfileCreator::savePressed() sNewProfile = options.rtSettings.adobe; sPrimariesPreset = "Medium"; } else if (primariesPreset == "ProPhoto" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.prophoto)) { + is_RTv4 = options.rtSettings.prophoto.substr(0, 4); + + if (is_RTv4 == "RTv4") { + options.rtSettings.prophoto = "RTv2_Large"; + }; + sNewProfile = options.rtSettings.prophoto; + sPrimariesPreset = "Large"; } else if (primariesPreset == "Rec2020" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.rec2020)) { sNewProfile = options.rtSettings.rec2020; @@ -692,13 +701,33 @@ void ICCProfileCreator::savePressed() sNewProfile = options.rtSettings.srgb; sPrimariesPreset = "sRGB"; } else if (primariesPreset == "Widegamut" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.widegamut)) { + is_RTv4 = options.rtSettings.widegamut.substr(0, 4); + + if (is_RTv4 == "RTv4") { + options.rtSettings.widegamut = "RTv2_Wide"; + }; + sNewProfile = options.rtSettings.widegamut; + sPrimariesPreset = "Wide"; } else if (primariesPreset == "BestRGB" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.best)) { + is_RTv4 = options.rtSettings.best.substr(0, 4); + + if (is_RTv4 == "RTv4") { + options.rtSettings.best = "RTv2_Best"; + }; + sNewProfile = options.rtSettings.best; + sPrimariesPreset = "Best"; } else if (primariesPreset == "BetaRGB" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.beta)) { sNewProfile = options.rtSettings.beta; + is_RTv4 = options.rtSettings.beta.substr(0, 4); + + if (is_RTv4 == "RTv4") { + options.rtSettings.widegamut = "RTv2_Beta"; + }; + sPrimariesPreset = "Beta"; } else if (primariesPreset == "BruceRGB" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.bruce)) { sNewProfile = options.rtSettings.bruce; @@ -715,7 +744,22 @@ void ICCProfileCreator::savePressed() return; } } else { - sNewProfile = "RTv2_Beta"; + //new model for v2 profile different from D50 by entering directly XYZ values and media white point + sNewProfile = "RTv2_Beta";//for copy + + if (primariesPreset == "ACES-AP0") { + sPrimariesPreset = "ACES-AP0"; + } else if (primariesPreset == "ACES-AP1") { + sPrimariesPreset = "ACES-AP1"; + } else if (primariesPreset == "Adobe") { + sPrimariesPreset = "Medium"; + } else if (primariesPreset == "Rec2020") { + sPrimariesPreset = "Rec2020"; + } else if (primariesPreset == "BruceRGB") { + sPrimariesPreset = "Bruce"; + } else if (primariesPreset == "sRGB") { + sPrimariesPreset = "sRGB"; + } } //begin adaptation rTRC gTRC bTRC @@ -957,16 +1001,30 @@ void ICCProfileCreator::savePressed() } cmsWhitePointFromTemp(&xyD, tempv4); + + if (illuminant == "D65") { + xyD = {0.312700492, 0.329000939}; + } + + if (illuminant == "D60") { + xyD = {0.32168, 0.33767}; + } + + } else { if (v2except) { cmsCIExyY XYZ; { - // XYZ = {0.950486322, 1.0, 1.08902736};//White D65 point calculated from white point xy 0,312710 y 0,3290 - // XYZ = {0.95047, 1.0, 1.088830};//White D65 point from B.Lindbloom - XYZ = {0.95045471, 1.0, 1.08905029}; + XYZ = {0.95045471, 1.0, 1.08905029};//white D65 } + + if (primariesPreset == "ACES-AP1" || primariesPreset == "ACES-AP0") { + XYZ = {0.952646075, 1.0, 1.008825184};//white D60 + } + + cmsCIExyY blackpoint; { @@ -981,16 +1039,6 @@ void ICCProfileCreator::savePressed() if (primariesPreset == "sRGB") { - //Matrix value from B.Lindbloom - /* - rt = {0.4360747, 0.2225045, 0.0139322}; - cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {0.1430804, 0.0606169, 0.7141733}; - cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.3850649, 0.7168786, 0.0971045}; - cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); - } - */ { //Matrix value from spec Adobe rt = {0.43607, 0.22249, 0.01392}; @@ -1005,17 +1053,6 @@ void ICCProfileCreator::savePressed() } if (primariesPreset == "Adobe") { - { - //B.Lindbloom - /* - rt = {0.6097559, 0.3111242, 0.0194811}; - cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {0.1492240, 0.0632197, 0.7448387}; - cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.2052401, 0.6256560, 0.0608902}; - cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); - */ - } { //Adobe spec rt = {0.60974, 0.31111, 0.01947}; @@ -1027,6 +1064,50 @@ void ICCProfileCreator::savePressed() } } + if (primariesPreset == "Rec2020") { + { + rt = {0.67337, 0.27901, -0.00192}; + cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); + bt = {0.12506, 0.04561, 0.79686}; + cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); + gt = {0.16577, 0.67538, 0.02997}; + cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); + } + } + + if (primariesPreset == "BruceRGB") { + { + rt = {0.49400, 0.25204, 0.01578}; + cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); + bt = {0.14949, 0.06332, 0.74617}; + cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); + gt = {0.32071, 0.68463, 0.06294}; + cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); + } + } + + if (primariesPreset == "ACES-AP0") { + { + rt = {0.99084, 0.36192, -0.00272}; + cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); + bt = {-0.03900, -0.08443, 0.81938}; + cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); + gt = {0.01236, 0.72250, 0.00824}; + cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); + } + } + + if (primariesPreset == "ACES-AP1") { + { + rt = {0.68970, 0.28445, -0.00604}; + cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); + bt = {0.12456, 0.04379, 0.82094}; + cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); + gt = {0.14995, 0.67175, 0.00999}; + cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); + } + } + } else { cmsWhitePointFromTemp(&xyD, (double)temp); } @@ -1036,6 +1117,14 @@ void ICCProfileCreator::savePressed() xyD = {0.447573, 0.407440, 1.0}; } + if (illuminant == "D65") { + xyD = {0.312700492, 0.329000939}; + } + + if (illuminant == "D60") { + xyD = {0.32168, 0.33767}; + } + // Calculate output profile's rTRC gTRC bTRC @@ -1046,7 +1135,7 @@ void ICCProfileCreator::savePressed() } if (gammaPreset == "standard_g2.2") { - GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildGamma(NULL, 2.19921875); + GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildGamma(NULL, 2.19921875);//spec Adobe } if (gammaPreset == "standard_g1.8") { @@ -1176,6 +1265,7 @@ void ICCProfileCreator::savePressed() } } } + } else if (cmsMLUsetWide(descMLU, "en", "US", wDescription.str().c_str())) { if (!v2except) { diff --git a/rtgui/options.cc b/rtgui/options.cc index c690a42e3..c1494a085 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -551,16 +551,16 @@ void Options::setDefaults() rtSettings.monitorIntent = rtengine::RI_RELATIVE; rtSettings.monitorBPC = true; rtSettings.autoMonitorProfile = false; - rtSettings.adobe = "RTv4_Medium"; // put the name of yours profiles (here windows) - rtSettings.prophoto = "RTv4_Large"; // these names appear in the menu "output profile" - rtSettings.widegamut = "RTv4_Wide"; - rtSettings.srgb = "RTv4_sRGB"; - rtSettings.bruce = "RTv4_Bruce"; - rtSettings.beta = "RTv4_Beta"; - rtSettings.best = "RTv4_Best"; - rtSettings.rec2020 = "RTv4_Rec2020"; - rtSettings.ACESp0 = "RTv4_ACES-AP0"; - rtSettings.ACESp1 = "RTv4_ACES-AP1"; + rtSettings.adobe = "RTv2_Medium"; // put the name of yours profiles (here windows) + rtSettings.prophoto = "RTv2_Large"; // these names appear in the menu "output profile" + rtSettings.widegamut = "RTv2_Wide"; + rtSettings.srgb = "RTv2_sRGB"; + rtSettings.bruce = "RTv2_Bruce"; + rtSettings.beta = "RTv2_Beta"; + rtSettings.best = "RTv2_Best"; + rtSettings.rec2020 = "RTv2_Rec2020"; + rtSettings.ACESp0 = "RTv2_ACES-AP0"; + rtSettings.ACESp1 = "RTv2_ACES-AP1"; rtSettings.verbose = false; rtSettings.gamutICC = true; rtSettings.gamutLch = true; @@ -1442,66 +1442,74 @@ void Options::readFromFile(Glib::ustring fname) if (keyFile.has_key("Color Management", "AdobeRGB")) { rtSettings.adobe = keyFile.get_string("Color Management", "AdobeRGB"); - if (rtSettings.adobe == "RT_Medium_gsRGB") { - rtSettings.adobe = "RTv4_Medium"; + if (rtSettings.adobe == "RT_Medium_gsRGB" || rtSettings.adobe == "RTv4_Medium") { + rtSettings.adobe = "RTv2_Medium"; } } if (keyFile.has_key("Color Management", "ProPhoto")) { rtSettings.prophoto = keyFile.get_string("Color Management", "ProPhoto"); - if (rtSettings.prophoto == "RT_Large_gBT709") { - rtSettings.prophoto = "RTv4_Large"; + if (rtSettings.prophoto == "RT_Large_gBT709" || rtSettings.prophoto == "RTv4_Large") { + rtSettings.prophoto = "RTv2_Large"; } } if (keyFile.has_key("Color Management", "WideGamut")) { rtSettings.widegamut = keyFile.get_string("Color Management", "WideGamut"); - if (rtSettings.widegamut == "WideGamutRGB") { - rtSettings.widegamut = "RTv4_Wide"; + if (rtSettings.widegamut == "WideGamutRGB" || rtSettings.widegamut == "RTv4_Wide") { + rtSettings.widegamut = "RTv2_Wide"; } } if (keyFile.has_key("Color Management", "sRGB")) { rtSettings.srgb = keyFile.get_string("Color Management", "sRGB"); - if (rtSettings.srgb == "RT_sRGB") { - rtSettings.srgb = "RTv4_sRGB"; + if (rtSettings.srgb == "RT_sRGB" || rtSettings.srgb == "RTv4_sRGB") { + rtSettings.srgb = "RTv2_sRGB"; } } if (keyFile.has_key("Color Management", "Beta")) { rtSettings.beta = keyFile.get_string("Color Management", "Beta"); - if (rtSettings.beta == "BetaRGB") { - rtSettings.beta = "RTv4_Beta"; + if (rtSettings.beta == "BetaRGB" || rtSettings.beta == "RTv4_Beta") { + rtSettings.beta = "RTv2_Beta"; } } if (keyFile.has_key("Color Management", "Best")) { rtSettings.best = keyFile.get_string("Color Management", "Best"); - if (rtSettings.best == "BestRGB") { - rtSettings.best = "RTv4_Best"; + if (rtSettings.best == "BestRGB" || rtSettings.best == "RTv4_Best") { + rtSettings.best = "RTv2_Best"; } } if (keyFile.has_key("Color Management", "Rec2020")) { rtSettings.rec2020 = keyFile.get_string("Color Management", "Rec2020"); - if (rtSettings.rec2020 == "Rec2020") { - rtSettings.rec2020 = "RTv4_Rec2020"; + if (rtSettings.rec2020 == "Rec2020" || rtSettings.rec2020 == "RTv4_Rec2020") { + rtSettings.rec2020 = "RTv2_Rec2020"; } } if (keyFile.has_key("Color Management", "Bruce")) { rtSettings.bruce = keyFile.get_string("Color Management", "Bruce"); - if (rtSettings.bruce == "Bruce") { - rtSettings.bruce = "RTv4_Bruce"; + if (rtSettings.bruce == "Bruce" || rtSettings.bruce == "RTv4_Bruce") { + rtSettings.bruce = "RTv2_Bruce"; } } if (keyFile.has_key("Color Management", "ACES-AP0")) { rtSettings.ACESp0 = keyFile.get_string("Color Management", "ACES-AP0"); + if (rtSettings.ACESp0 == "RTv4_ACES-AP0") { + rtSettings.ACESp0 = "RTv2_ACES-AP0"; + } + } if (keyFile.has_key("Color Management", "ACES-AP1")) { rtSettings.ACESp1 = keyFile.get_string("Color Management", "ACES-AP1"); + if (rtSettings.ACESp1 == "RTv4_ACES-AP1") { + rtSettings.ACESp1 = "RTv2_ACES-AP1"; + } + } if (keyFile.has_key("Color Management", "GamutLch")) { From 25eb93a256e87aeb861b9c801678736b4c3a1a4c Mon Sep 17 00:00:00 2001 From: "U-PC-BUREAU\\jacques" Date: Mon, 12 Nov 2018 16:45:05 +0100 Subject: [PATCH 09/60] Change Tag desc for all ICCv2 and ICCv4 --- rtdata/iccprofiles/output/RTv2_ACES-AP0.icc | Bin 25452 -> 25444 bytes rtdata/iccprofiles/output/RTv2_ACES-AP1.icc | Bin 25452 -> 25444 bytes rtdata/iccprofiles/output/RTv2_Best.icc | Bin 25452 -> 25432 bytes rtdata/iccprofiles/output/RTv2_Beta.icc | Bin 25424 -> 25412 bytes rtdata/iccprofiles/output/RTv2_Bruce.icc | Bin 25452 -> 25436 bytes rtdata/iccprofiles/output/RTv2_Large.icc | Bin 25500 -> 25484 bytes rtdata/iccprofiles/output/RTv2_Medium.icc | Bin 884 -> 876 bytes rtdata/iccprofiles/output/RTv2_Rec2020.icc | Bin 25452 -> 25444 bytes rtdata/iccprofiles/output/RTv2_Wide.icc | Bin 25452 -> 25432 bytes rtdata/iccprofiles/output/RTv2_sRGB.icc | Bin 25452 -> 25432 bytes rtdata/iccprofiles/output/RTv4_ACES-AP0.icc | Bin 752 -> 756 bytes rtdata/iccprofiles/output/RTv4_ACES-AP1.icc | Bin 752 -> 756 bytes rtdata/iccprofiles/output/RTv4_Best.icc | Bin 752 -> 748 bytes rtdata/iccprofiles/output/RTv4_Beta.icc | Bin 752 -> 752 bytes rtdata/iccprofiles/output/RTv4_Bruce.icc | Bin 752 -> 748 bytes rtdata/iccprofiles/output/RTv4_Large.icc | Bin 752 -> 748 bytes rtdata/iccprofiles/output/RTv4_Medium.icc | Bin 752 -> 752 bytes rtdata/iccprofiles/output/RTv4_Rec2020.icc | Bin 752 -> 752 bytes rtdata/iccprofiles/output/RTv4_Wide.icc | Bin 752 -> 748 bytes rtdata/iccprofiles/output/RTv4_sRGB.icc | Bin 752 -> 748 bytes 20 files changed, 0 insertions(+), 0 deletions(-) diff --git a/rtdata/iccprofiles/output/RTv2_ACES-AP0.icc b/rtdata/iccprofiles/output/RTv2_ACES-AP0.icc index 03d952f9fc09d25b7e828a2213281daee89fe0ff..b54fcfb4e51bd534ca3ccfbc6170a637a4d6dc89 100644 GIT binary patch delta 218 zcmaEJjPc1aMivH!;piyNIHal1;kE*uwQ`K zMIk}XKsA3D7!-KY!E7ZC5IYIXb`k-x%S#G?W+o|s)TiX8qyX6_K=z!J+&mEb0+8L1 zlnqkjlpFw7lvD1We5hd R0vHS?PfT*(JfHDwA^;69F7E&U delta 220 zcmaEIjPcDeMivH!=Qt?NIHal2gFW-us?v< zMIk}X3=B*_0~C1D!E7Y~5IYIXc9H?H%S#G?W+rKX)TiX8qyX7AK=z!J+&mEb29Vv5 zlnqkjk{kh6lvGpxDqz&(g@)&_EF)3KVBZXE0*WV=!SbU?^rV1hXxH Sq%nix;piyNIHal1;kE*uwQ`K zMIk}XKsA3D7!-KY!E7ZC5IYIXb`k-x%S#G?W+o|s)TiX8qyX6_K=z!J+&mEb0+8L1 zlnqkjlpFw7lvD1We5hd R0vHS@PfT*(JfHDwA^;6$F7W^W delta 220 zcmaEIjPcDeMivH!=Qt?NIHal2gFW-us?v< zMIk}X3=B*_0~C1D!E7Y~5IYIXc9H?H%S#G?W+rKX)TiX8qyX7AK=z!J+&mEb29Vv5 zlnqkjk{kh6lvGpxDqz&(g@)&_EF)3KVBZXE0*WV=!SbU?^rV1hXxH Sq%nixyko^&u< z@db#T1ZF#a0kMlBBBK}>l7Pw?MA9K_5wJNBwg!lulADqORAU2V&q>M61F>%a*$pMB z6+n9@OEK!Ias`Ey8O1xL76Sz!fQuoBA%vlf!H6NA!HFT2p_rj$^1>vK%_kU_Bmw|v C+$_id delta 211 zcmca{jPcDeMivH!i`Ng^Qi=@7OC*c=Gk2E`O^q~zv-*l&RBhLY3@ zpuLl&7?42lhn^el~x4Gk25(qJIKkj`MlpvPdsV8Bq!Ua+kioF O^28+f%^Mk)CjtN=vMkyF diff --git a/rtdata/iccprofiles/output/RTv2_Beta.icc b/rtdata/iccprofiles/output/RTv2_Beta.icc index ebd5005e278a4cbe5de8067570451140c7826cef..d697c8caf9baf1177f71f0cdb05cb7dda70f44c2 100644 GIT binary patch literal 25412 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 I|9$^|05wDT$p8QV literal 25424 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 aQ!Bt}r;b42PVE3+5WUj|{`>a-zWqOZ7x~5j diff --git a/rtdata/iccprofiles/output/RTv2_Bruce.icc b/rtdata/iccprofiles/output/RTv2_Bruce.icc index 152b4171717d7acf95542e0876b79f808cec73b9..8d53051887c297477b93446c68e08008fef7c5ef 100644 GIT binary patch delta 209 zcmaEJjPcGfMivH!>WV1NIHal2Euw=04T%|#1O(z#$dz{&)~#R#8AqR%#b>H MVv_sjd5q^00Z{%e+5i9m delta 224 zcmca}jPcDeMivH!=Qt?NIHal2gFW-us?v< zMIk}X3=B*_0~C1D!E7Y~5IYIXc9H?H%S#G?W+rKX)TiX8qyX7AK=z!J+&mEb29Vv5 zlnqkjksJY5lvGpxDqz&(g@)&_EF)3KVBZXE0*WV=!SbU?^rV1hXxH Uq%n|fz@Rv}G0A;%FXQ<{0BoNv1^@s6 diff --git a/rtdata/iccprofiles/output/RTv2_Large.icc b/rtdata/iccprofiles/output/RTv2_Large.icc index a7659d318bf822bca36865ab26d79e4dae456455..019ce621310bdd86893359fbf2bd3ff764d38133 100644 GIT binary patch delta 203 zcmbPpoU!LPBMSpVa?eDT>Gd@!xhW|O3`{Z%3=DJ1OA1PW>>WV1NKr&&6p(!e#7=^+ zAAs2D5cU_anvfu81_ovh1_lM5bTC_41jJ4Pvz-+{?BtB1T%ct-K=mrg1w}yflLLTk zjihX_UC9-bWf=Q4xPwB8i5X2C|P{v@y5YOPlkjPNPkj{`gxsl0z N@;pY~&E`z0i2&okE1CcR delta 218 zcmeA<&N$~dBMSpV@|=k*)9ZUua#Ke%n}R?3Owmxwz3L{odjk(8-Uo!8AZ83%WQz^Rgw#efaWJB z0NENz*%J-0ND*m*&sDG z%n@Kksl~}a8U%QPLduNdeN$61OLHM2Krx0Oh7g7_1|x=e2499$h7^WOhEj&y$qSk6 NCl+vTp2K*95dcP2E0X{K delta 219 zcmaFE_Jxgwfq}VXB1?CDM{+??2?GP;90mpkjiQLiC?NX?kS&r9Vc!6;lOXIjAa+qm zkTU}V6OhTkmkwbIfY?b8wgQMrXNddB5fb2Obxp^S=10cI0DI285 zl{o>(5lKlcP6pB-z@KiUXJk-ppl1LAiV#7dFhe?n5rZBO8!!|Du^te^pyK3-OzxW} IG2UVX0BoHn=>Px# diff --git a/rtdata/iccprofiles/output/RTv2_Rec2020.icc b/rtdata/iccprofiles/output/RTv2_Rec2020.icc index 5426e8d685ee8558e902b26fb266c8d85f5dee05..57eb17a86eafc65cc4945d6aa8e3788540e0e204 100644 GIT binary patch delta 218 zcmaEJjPc1aMivH!;piyNIHal1;kE*uwQ`K zMIk}XKsA3D7!-KY!E7ZC5IYIXb`k-x%S#G?W+o|s)TiX8qyX6_K=z!J+&mEb0+8L1 zlnqj2pBw;Ilv=Qt?NIHal2gFW-us?v< zMIk}X3=B*_0~C1D!E7Y~5IYIXc9H?H%S#G?W+rKX)TiX8qyX7AK=z!J+&mEb29Vv5 zlnqkjk{kh6lvGpxDqz&(g@)&_EF)3KVBZXE0*WV=!SbU?^rV1hXxH Sq%nixyko^&u< z@db#T1ZF#a0kMlBBBK}>l7Pw?MA9K_5wJNBwg!lulADqORAU2V&q>M61F>%a*$pMB z6+n9@OEKyya|MNz8O4WZrlbNTz<`S(h#`cbjKPQ@o*|qelObiYLbBK96O2m|0T5&> A*#H0l delta 211 zcmca{jPcDeMivH!i`Ng^Qi=@7OC*c=Gk2E`O^q~zv-*l&RBhLY3@ zpuLl&7?42lhn^el~x4Gk25(qJIKkj`MlpvPdsV8Bq!Ua+kioF O^28+f%^Mk)CjtN=vMkyF diff --git a/rtdata/iccprofiles/output/RTv2_sRGB.icc b/rtdata/iccprofiles/output/RTv2_sRGB.icc index e311e5d71e11af3f0cd72c78ca2f23bbc23fff16..a039d2f6efa89e23a1c6698f56d9c3b48ce0492a 100644 GIT binary patch delta 206 zcmaEJjPb@XMivH!7 zlnqj2mh1vnlv=Qt?NIHal2gFW-us?v< zMIk}X3=B*_0~C1D!E7Y~5IYIXc9H?H%S#G?W+rKX)TiX8qyX7AK=z!J+&mEb29Vv5 zlnqj2lpFz8lvGpxDqz&(g@)&_EF)3KVBZXE0*WV=$SVm?X-mIJq&& Nd13+k<{ri~i2!5?EhPW| diff --git a/rtdata/iccprofiles/output/RTv4_ACES-AP0.icc b/rtdata/iccprofiles/output/RTv4_ACES-AP0.icc index 55de42f4d619afead84ae8a70cc4eaf8620a37c5..5661f7e9ee44ee3351b7863c0a496664d7d80f14 100644 GIT binary patch delta 229 zcmeys`h``8fr05uPI7KBiva^eZeB@Ikh_yYL}Zi#`y&Q!1|9}}23ZD;#N^@v-(a_p ziHTAZ-8}2fk_(DT7#J9R7#J9$%1a7B>=i(^NODGE3Xr`A$kr(W8Ukd$0Es6-*ndFm zbTFGq0K_f|333M7uL5Liq(j&sGc}SRY@oRe8p#<&xj;2@fNYhN+&rN9OiTwR3ouG6 mN&$sr7=jo=7|Iw-7~&Zm8Jrnh8G^yA00y9UHhVCxU<3exhc34O delta 229 zcmeyu`hiu4fr05mPI7KBiva^eZeB@Ikh_yYL}Zi#`y&Q!1|9}Z1~~?f#N^@v-(a_p ziHTAZ-8}0}k_(DT7#J8m7#J9$%1a7B>?J_9NODGE3Xr`6$kr(W8UkcL0f{F;*grt* zbTFHV2gEK4333M7uK;9gq(j&sGc}SR>;e!wIin~SsAdL`t&)&YOIINqloM<3vUPT!SzE diff --git a/rtdata/iccprofiles/output/RTv4_ACES-AP1.icc b/rtdata/iccprofiles/output/RTv4_ACES-AP1.icc index aecee414d24b9a3bb29c1c4b446013300179c227..4237752a48186428f964d0da3b8686528fc2d434 100644 GIT binary patch delta 229 zcmeys`h``8fr05uPI7KBiva^eZeB@Ikh_yYL}Zi#`y&Q!1|9}}26+aN#N^@v-(a_p ziHTAZ-8}2fk_(DT7#J9R7#J9$%1a7B>=i(^NODGE3Xr`A$kr(W8Ukd$0Es6-*ndFm zbTFGq0K_f|333M7uL5Liq(j&sGc}SRY@oRe8p#<&xj;2@fNYhN+&rN9OiTwR3ouG6 mN&$sr7=jo=7|Iw-7~&Zm8Jrnh8G^yA00u(_hRq&~D;NQENiL=U delta 229 zcmeyu`hiu4fr05mPI7KBiva^eZeB@Ikh_yYL}Zi#`y&Q!1|9}Z26+bd#N^@v-(a_p ziHTAZ-8}0}k_(DT7#J8m7#J9$%1a7B>?J_9NODGE3Xr`6$kr(W8UkcL0f{F;*grt* zbTFHV2gEK4333M7uK;9gq(j&sGc}SR>;e!wIin~SsAdL`t&)&YOIINqloM<3vUPT!k;*u!NODGE3Xr`8$kr(W8UkcL0Es6-*k3^G zbTFHV1H>*0333M7F9T$2q(j&sGc}SR>>Lm~Iin~SsAdX~t&)?J_9NODGE3Xr`6$kr(W8UkcL0f{F;*grt* zbTFHV2gEK4333M7uK;9gq(j&sGc}SR>;e!wIin~SsAdL`t&)&fDz5xPlP?v>`66 diff --git a/rtdata/iccprofiles/output/RTv4_Beta.icc b/rtdata/iccprofiles/output/RTv4_Beta.icc index 27e7c85f7fbdad6d9c680c242fb6eb05ac8c4eb9..b3c36c28bd3f2b29eb9cd6aa029e043381f097d5 100644 GIT binary patch delta 53 zcmeys`hj(VJTE_k41-Eya&duguv^H)M5&2xZ$(2G${0)-;u)M6QW;7Z5*dOR+!>rU JdoZqG1OS@h4ix|Z delta 53 zcmeys`hj(VJTE7MI)iFra&duguv^H)M5&2xZ$;f1oEQ`sk{C)EG8u9hN*Hv3blzqU H#ubbJnH>%^ diff --git a/rtdata/iccprofiles/output/RTv4_Bruce.icc b/rtdata/iccprofiles/output/RTv4_Bruce.icc index 72cf801a4e4ad51ba7f1747dd9239ab3ceff5070..e6d0a69f7f321b8a41ffcfa8c5cceb82660df851 100644 GIT binary patch delta 221 zcmeys`i519fr05wPI7KBiva^eZeB@Ikh_yYL}Zi#`y&Q!1|9}}26YCj#N^@v-(a_p ziHTAZ-8}0Jk_(DT7#J8`7#J9$%1a7B>;*u!NODGE3Xr`8$kr(W8UkcL0Es6-*k3^G zbTFHV1H>*0333M7F9T$2q(j&sGc}SR>>Lm~Iin~SsAdX~t&)?J_9NODGE3Xr`6$kr(W8UkcL0f{F;*grt* zbTFHV2gEK4333M7uK;9gq(j&sGc}SR>;e!wIin~SsAdL`t&)&fDz5xPlP?w+}9` diff --git a/rtdata/iccprofiles/output/RTv4_Large.icc b/rtdata/iccprofiles/output/RTv4_Large.icc index e09992e82feca311cd714d66cc31121065790a11..b9cfc94894c1b63910d6990241d9b1e452717f40 100644 GIT binary patch delta 221 zcmeys`i519fr05wPI7KBiva^eZeB@Ikh_yYL}Zi#`y&Q!1|9}}1|;*u!NODGE3Xr`8$kr(W8UkcL0Es6-*k3^G zbTFHV1H>*0333M7F9T$2q(j&sGc}SR>>Lm~Iin~SsAdX~t&)?J_9NODGE3Xr`6$kr(W8UkcL0f{F;*grt* zbTFHV2gEK4333M7uK;9gq(j&sGc}SR>;e!wIin~SsAdL`t&)&fDz5xPlP?uM94w diff --git a/rtdata/iccprofiles/output/RTv4_Medium.icc b/rtdata/iccprofiles/output/RTv4_Medium.icc index 072bda68fe1656d154d53b7fba3d9521347cc438..40bed87871fa6e665c61166ee421387e7ec18baf 100644 GIT binary patch delta 66 zcmeys`hj(VJTE_k0s~uOa&duguv^H)M5&2xo{UBlC(M==V_;yAVF+RfVJKrTVTfn& WWk_X6VaQ}CWyob<*zCc$f)M~kwGZ3? delta 66 zcmeys`hj(VJTE7MG6Pd$a&duguv^H)M5&2xo{T0FC(M?WU|?X7VF+SyXK-RrU`S#p VWyoa6VJKnH1=4w&Js4Lo0sug+59j~@ diff --git a/rtdata/iccprofiles/output/RTv4_Rec2020.icc b/rtdata/iccprofiles/output/RTv4_Rec2020.icc index e2e2de5dd3e59793accb474af27ed385295eb890..bb7603b5528030ecbebd6d635ae5884b871a8887 100644 GIT binary patch delta 53 zcmeys`hj(VJTE_k5`$i1a&duguv^H)M5&2xZ$(2G${0)-;u(S%QW=sNj2H|+c(VuN G3Pu2#BMqzo delta 53 zcmeys`hj(VJTE7M3WH^0a&duguv^H)M5&2xZ$;f1oEQ`sk{C)EG8u9hN*Hv3blzqU H#ubbJo8b;c diff --git a/rtdata/iccprofiles/output/RTv4_Wide.icc b/rtdata/iccprofiles/output/RTv4_Wide.icc index f8043a3c2a94b1aba565c07e2d8915a53102025f..9a63a8c721d631a472452228a726dcdf84a759b5 100644 GIT binary patch delta 221 zcmeys`i519fr05wPI7KBiva^eZeB@Ikh_yYL}Zi#`y&Q!1|9}}22}>R#N^@v-(a_p ziHTAZ-8}2{k_(DT7#J8`7#J9$%1a7B>;*u!NODGE3Xr`8$kr(W8UkcL0Es6-*k3^G zbTFHV1H>*0333M7F9T$2q(j&sGc}SR>>Lm~Iin~SsAdX~t&)?J_9NODGE3Xr`6$kr(W8UkcL0f{F;*grt* zbTFHV2gEK4333M7uK;9gq(j&sGc}SR>;e!wIin~SsAdL`t&)&fDz5xPlP?q&qH_ diff --git a/rtdata/iccprofiles/output/RTv4_sRGB.icc b/rtdata/iccprofiles/output/RTv4_sRGB.icc index 8827a8a85321e7856d9c956ab6b231ca23f218f3..6e348a98a3939d7540c5ad7073b0170c591c7df5 100644 GIT binary patch delta 221 zcmeys`i519fr05wPI7KBiva^eZeB@Ikh_yYL}Zi#`y&Q!1|9}}22}>;#N^@v-(a_p ziHTAZ-8}2{k_(DT7#J8`7#J9$%1a7B>;*u!NODGE3Xr`8$kr(W8UkcL0Es6-*k3^G zbTFHV1H>*0333M7F9T$2q(j&sGc}SR>>Lm~Iin~SsAdX~t&)p#N^@v-(a_p ziHTAZ-8}0}k_(DT7#J8m7#J9$%1a7B>?J_9NODGE3Xr`6$kr(W8UkcL0f{F;*grt* zbTFHV2gEK4333M7uK;9gq(j&sGc}SR>;e!wIin~SsAdL`t&)&fDz5xPlP?q&Y5@ From 847e20969b256047a10ea4b24578b44a844bc18f Mon Sep 17 00:00:00 2001 From: heckflosse Date: Mon, 12 Nov 2018 18:52:26 +0100 Subject: [PATCH 10/60] Add tooltip for raw auto ca-correction iterations slider --- rtdata/languages/default | 1 + rtgui/rawcacorrection.cc | 1 + 2 files changed, 2 insertions(+) diff --git a/rtdata/languages/default b/rtdata/languages/default index 5a66807ca..02ded5378 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1818,6 +1818,7 @@ TP_PRSHARPENING_LABEL;Post-Resize Sharpening TP_PRSHARPENING_TOOLTIP;Sharpens the image after resizing. Only works when the "Lanczos" resizing method is used. It is impossible to preview the effects of this tool. See RawPedia for usage instructions. TP_RAWCACORR_AUTO;Auto-correction TP_RAWCACORR_AUTOIT;Iterations +TP_RAWCACORR_AUTOIT_TOOLTIP;This setting is available if "Auto-correction" is checked.\nAuto-correction is conservative, means it often does not correct all Chromatic Aberration.\nTo correct the remaining Chromatic Aberration, you can use up to 5 iterations of automatic Chromatic Aberration correction.\nEach iteration will reduce the remaining Chromatic Aberration from the last iteration at the cost of additional processing time. TP_RAWCACORR_AVOIDCOLORSHIFT;Avoid color shift TP_RAWCACORR_CABLUE;Blue TP_RAWCACORR_CARED;Red diff --git a/rtgui/rawcacorrection.cc b/rtgui/rawcacorrection.cc index b208f5509..2daeb102f 100644 --- a/rtgui/rawcacorrection.cc +++ b/rtgui/rawcacorrection.cc @@ -41,6 +41,7 @@ RAWCACorr::RAWCACorr () : FoldableToolPanel(this, "rawcacorrection", M("TP_CHROM caAutoiterations = Gtk::manage(new Adjuster (M("TP_RAWCACORR_AUTOIT"), 1, 5, 1, 2)); caAutoiterations->setAdjusterListener (this); + caAutoiterations->set_tooltip_markup(M("TP_RAWCACORR_AUTOIT_TOOLTIP")); if (caAutoiterations->delay < options.adjusterMaxDelay) { caAutoiterations->delay = options.adjusterMaxDelay; From 53a99837e50ea30c3421b45791a3d603d048e5e3 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Mon, 12 Nov 2018 22:23:25 +0100 Subject: [PATCH 11/60] histmatching: avoid concavities in the upper part of the matched curve (assumed to be S-shaped) Fixes #4979 --- rtengine/histmatching.cc | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/rtengine/histmatching.cc b/rtengine/histmatching.cc index b2fe436fd..2bc0e940e 100644 --- a/rtengine/histmatching.cc +++ b/rtengine/histmatching.cc @@ -216,6 +216,45 @@ void mappingToCurve(const std::vector &mapping, std::vector &curve) curve.push_back(1.0); curve.push_back(1.0); + + // we assume we are matching an S-shaped curve, so try to avoid + // concavities in the upper part of the S + const auto getpos = + [](float x, float xa, float ya, float xb, float yb) + { + // line equation: + // (x - xa) / (xb - xa) = (y - ya) / (yb - ya) + return (x - xa) / (xb - xa) * (yb - ya) + ya; + }; + idx = -1; + for (size_t i = curve.size()-1; i > 0; i -= 2) { + if (curve[i] <= 0.f) { + idx = i+1; + break; + } + } + if (idx >= 0 && size_t(idx) < curve.size()) { + // idx is the position of the first point in the upper part of the S + // for each 3 consecutive points (xa, ya), (x, y), (xb, yb) we check + // that y is above the point at x of the line between the other two + // if this is not the case, we remove (x, y) from the curve + while (size_t(idx+5) < curve.size()) { + float xa = curve[idx]; + float ya = curve[idx+1]; + float x = curve[idx+2]; + float y = curve[idx+3]; + float xb = curve[idx+4]; + float yb = curve[idx+5]; + float yy = getpos(x, xa, ya, xb, yb); + if (yy > y) { + // we have to remove (x, y) from the curve + curve.erase(curve.begin()+(idx+2), curve.begin()+(idx+4)); + } else { + // move on to the next point + idx += 2; + } + } + } if (curve.size() < 4) { curve = { DCT_Linear }; // not enough points, fall back to linear From 3cec74c50995522375f7a82969ac8c4c92fcf5f3 Mon Sep 17 00:00:00 2001 From: "U-PC-BUREAU\\jacques" Date: Tue, 13 Nov 2018 10:36:51 +0100 Subject: [PATCH 12/60] Normalize D50 profiles --- rtdata/iccprofiles/output/RTv2_Best.icc | Bin 25432 -> 25432 bytes rtdata/iccprofiles/output/RTv2_Beta.icc | Bin 25412 -> 25432 bytes rtdata/iccprofiles/output/RTv2_Large.icc | Bin 25484 -> 25436 bytes rtdata/iccprofiles/output/RTv2_Wide.icc | Bin 25432 -> 25432 bytes rtdata/iccprofiles/output/RTv4_Best.icc | Bin 748 -> 748 bytes rtdata/iccprofiles/output/RTv4_Beta.icc | Bin 752 -> 748 bytes rtdata/iccprofiles/output/RTv4_Large.icc | Bin 748 -> 748 bytes rtdata/iccprofiles/output/RTv4_Wide.icc | Bin 748 -> 748 bytes rtgui/iccprofilecreator.cc | 71 ++++++++++++++++++++++- 9 files changed, 69 insertions(+), 2 deletions(-) diff --git a/rtdata/iccprofiles/output/RTv2_Best.icc b/rtdata/iccprofiles/output/RTv2_Best.icc index 8347db4d6cda8e5a8812f316ff3661b565210e27..f04b96d2807a34cc3844d87cee7c773d3171d3d6 100644 GIT binary patch delta 296 zcmca{jPb@X#tD+rml;?X7#X-2tQgo6lZy*{gWW>eOnqbMRW3dr69WQ(Lj*e5{jBnbNsh+PyCl}Q&NCz4Iq0?N^TyAEqDaTX-LWjDN1$$DVl7u1sAYGTOHrpi0 MFp3~lfossI20 delta 295 zcmca{jPb@X#tD+r7a5otco{?(bQp9KlZy*{gWWPpVNIHZKGG8PK!qxz>Q*u*MfNBImmd#1Y%>!|60ND+bdl)q)i!fGb02M0$ z1%Tk&9R@}aec1{j2I51&<`0Z|2}TQlGcZ`yf;zQc{bP85kHv7#J8TCQhiZNy;uL0jh8T@$>e7~K;%?=Ucegf3fc)<}|J6hSBgi9!GX6OSVg delta 151 zcmca{jPb}ZMivH!WS5C7_Kb`ZUF>IGKTgQ3S}ZNiHZV0kS6m*&0Pa6M*a;K( zfY?PLLC!!mUw}sPq=VT?Kw$-*Brw~F2gEKfDFB+8Bmq*NlADqOWa|Lgb5e5ifNY_p z6F^QwQZ`6YvIj`fUK2WUF?WNpS$Bn2Qz2mk;aaYkDJ delta 377 zcmca}jIrl9qXh#)a!*cjZZVSr14C|JNl}oylR`vflmh!521W*c20;dP2K~h3;sW1b zw-5#(@NxDH22xBDExhY_Q*!fC7#J88fC3FEsl~}a_5vWgCM7ooD9$7UWX~xtDJTK5 zcL3QUML?5*>@y&C5`_H##7>8>zkt<*1UWM>Fmo_4DDb3%*~%gyb`qHFtN>ysXB6c! zFvunA05zy27Zd?4NDct9HIlMHmL*q!44Ql*sbR7RW6flpq&Wc~F98LC;M*~v$AI9{ zZ-m$xEd~b9T|hxbgct`8kPmdlWqpL0(gFsCZFc|v|Npm1Ny1^160d?X*d;)f%s|Yr hN0foV`8CiTcNiG1t1vKd#sdY}Cr@BB;sQxS008!4PLlut diff --git a/rtdata/iccprofiles/output/RTv2_Wide.icc b/rtdata/iccprofiles/output/RTv2_Wide.icc index b93ec47bac04c4d383d50417c5eff834339d1541..06d5747cba04616d580230da0d77a17fcbf56e74 100644 GIT binary patch delta 296 zcmca{jPb@X#tD+rml;?X7#X-2tQgo6lZy*{gWW>eOnqbMRW3dr69WQ(Lj*e5{jBnbNsh+PyCl}Q&NCz4Iq0?N^TyAEqDaTX-LWjDN1$$DVl7u1sAYGTOHrpi0 MFp3~lf@~ delta 295 zcmca{jPb@X#tD+r7Z^AgxEX{Q%o)@ZlZy*{gWWPpVNIHZKGG8PK!qxz>Q*u*MfNBImmd#1Y%>!|60ND+bdl)q)i!fGb02M0$ z1%Tk&9R@}aec1{j2I51&<`0Z|2}awq7#N(aK_Un>lD8QccD6Gx@X8>>R3|bpu-Gv$ M924BEktD+i0K0@dU;qFB diff --git a/rtdata/iccprofiles/output/RTv4_Best.icc b/rtdata/iccprofiles/output/RTv4_Best.icc index 0aaa2a71e0f16cca8d1feef07bdb375ca843fe0e..22ce4276cc641056bf025b047eec12513a193bbc 100644 GIT binary patch delta 29 kcmaFE`i6CaEI%&;2ZIs=dt!2Nfp4%|$izgcjc&`B0C@BWX#fBK delta 29 kcmaFE`i6CaEI$teKZ81ha$<6Efp4%|$izgcjc&`B0DFW8kN^Mx diff --git a/rtdata/iccprofiles/output/RTv4_Beta.icc b/rtdata/iccprofiles/output/RTv4_Beta.icc index b3c36c28bd3f2b29eb9cd6aa029e043381f097d5..6d5bce2a415e2038c0a80448836bbe266c494810 100644 GIT binary patch delta 221 zcmeys`i519fr05wPI7KBiva^eZeB@Ikh_yYL}Zi#`y&Q!23`gZ1|;*u!NODGE3Xr`8$kr(W8UkcL0Es6-*k3^G zbTFHV1H>*0333M7F9T$2q(j&sGc}SR>>Lm~Iin~SsAdX~t&)?J_9NODGE3Xr`6$kr(W8UkcL0f{F;*grt* zbTFHV2gEK4333M7uK;9gq(j&sGc}SR>;e!wIin~SsAdL`t&)outputProfileExist(options.rtSettings.ACESp0)) { sNewProfile = options.rtSettings.ACESp0; sPrimariesPreset = "ACES-AP0"; @@ -759,6 +763,14 @@ void ICCProfileCreator::savePressed() sPrimariesPreset = "Bruce"; } else if (primariesPreset == "sRGB") { sPrimariesPreset = "sRGB"; + } else if (primariesPreset == "ProPhoto") { + sPrimariesPreset = "Large"; + } else if (primariesPreset == "Widegamut") { + sPrimariesPreset = "Wide"; + } else if (primariesPreset == "BestRGB") { + sPrimariesPreset = "Best"; + } else if (primariesPreset == "BetaRGB") { + sPrimariesPreset = "Beta"; } } @@ -1010,6 +1022,9 @@ void ICCProfileCreator::savePressed() xyD = {0.32168, 0.33767}; } + if (illuminant == "D50") { + xyD = {0.3457, 0.3585};//white D50 near LCMS values but not perfect...it's a compromise!! + } } else { if (v2except) { @@ -1024,6 +1039,9 @@ void ICCProfileCreator::savePressed() XYZ = {0.952646075, 1.0, 1.008825184};//white D60 } + if (isD50) { + XYZ = {0.964295676, 1.0, 0.825104603};//white D50 room (prophoto) near LCMS values but not perfect...it's a compromise!! + } cmsCIExyY blackpoint; @@ -1108,6 +1126,50 @@ void ICCProfileCreator::savePressed() } } + if (primariesPreset == "ProPhoto") { + { + rt = {0.79755, 0.28802, 0.0}; + cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); + bt = {0.03134, 0.00008, 0.82492}; + cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); + gt = {0.13531, 0.71190, -0.00002}; + cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); + } + } + + if (primariesPreset == "Widegamut") { + { + rt = {0.71603, 0.25818, 0.0}; + cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); + bt = {0.14713, 0.01688, 0.77312}; + cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); + gt = {0.10104, 0.72493, 0.05177}; + cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); + } + } + + if (primariesPreset == "BestRGB") { + { + rt = {0.63254, 0.22844, 0.0}; + cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); + bt = {0.12695, 0.03418, 0.81540}; + cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); + gt = {0.20471, 0.73738, 0.00951}; + cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); + } + } + + if (primariesPreset == "BetaRGB") { + { + rt = {0.67113, 0.30321, 0.0}; + cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); + bt = {0.11833, 0.03293, 0.78419}; + cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); + gt = {0.17473, 0.66386, 0.04070}; + cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); + } + } + } else { cmsWhitePointFromTemp(&xyD, (double)temp); } @@ -1125,6 +1187,11 @@ void ICCProfileCreator::savePressed() xyD = {0.32168, 0.33767}; } + if (illuminant == "D50") { + xyD = {0.3457, 0.3585}; + } + +// {0.3457, 0.3585, 1.0}; // Calculate output profile's rTRC gTRC bTRC From b70d06f639d951c5d89dbfc5c28358f931c2af81 Mon Sep 17 00:00:00 2001 From: "U-PC-BUREAU\\jacques" Date: Tue, 13 Nov 2018 11:35:17 +0100 Subject: [PATCH 13/60] small changes for xyD --- rtgui/iccprofilecreator.cc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/rtgui/iccprofilecreator.cc b/rtgui/iccprofilecreator.cc index 2a587a528..dc75db61f 100644 --- a/rtgui/iccprofilecreator.cc +++ b/rtgui/iccprofilecreator.cc @@ -1015,15 +1015,15 @@ void ICCProfileCreator::savePressed() cmsWhitePointFromTemp(&xyD, tempv4); if (illuminant == "D65") { - xyD = {0.312700492, 0.329000939}; + xyD = {0.312700492, 0.329000939, 1.0}; } if (illuminant == "D60") { - xyD = {0.32168, 0.33767}; + xyD = {0.32168, 0.33767, 1.0}; } if (illuminant == "D50") { - xyD = {0.3457, 0.3585};//white D50 near LCMS values but not perfect...it's a compromise!! + xyD = {0.3457, 0.3585, 1.0};//white D50 near LCMS values but not perfect...it's a compromise!! } } else { @@ -1180,15 +1180,15 @@ void ICCProfileCreator::savePressed() } if (illuminant == "D65") { - xyD = {0.312700492, 0.329000939}; + xyD = {0.312700492, 0.329000939, 1.0}; } if (illuminant == "D60") { - xyD = {0.32168, 0.33767}; + xyD = {0.32168, 0.33767, 1.0}; } if (illuminant == "D50") { - xyD = {0.3457, 0.3585}; + xyD = {0.3457, 0.3585, 1.0}; } // {0.3457, 0.3585, 1.0}; From 3ba386d0ca8d1dd1612a0c102c8f21d3a5093c56 Mon Sep 17 00:00:00 2001 From: "U-PC-BUREAU\\jacques" Date: Tue, 13 Nov 2018 12:23:03 +0100 Subject: [PATCH 14/60] Normalize ICCv4 white point --- rtdata/iccprofiles/output/RTv4_ACES-AP0.icc | Bin 756 -> 756 bytes rtdata/iccprofiles/output/RTv4_ACES-AP1.icc | Bin 756 -> 756 bytes rtdata/iccprofiles/output/RTv4_Best.icc | Bin 748 -> 748 bytes rtdata/iccprofiles/output/RTv4_Beta.icc | Bin 748 -> 748 bytes rtdata/iccprofiles/output/RTv4_Bruce.icc | Bin 748 -> 748 bytes rtdata/iccprofiles/output/RTv4_Large.icc | Bin 748 -> 748 bytes rtdata/iccprofiles/output/RTv4_Medium.icc | Bin 752 -> 752 bytes rtdata/iccprofiles/output/RTv4_Rec2020.icc | Bin 752 -> 752 bytes rtdata/iccprofiles/output/RTv4_Wide.icc | Bin 748 -> 748 bytes rtdata/iccprofiles/output/RTv4_sRGB.icc | Bin 748 -> 748 bytes rtgui/iccprofilecreator.cc | 6 +++--- 11 files changed, 3 insertions(+), 3 deletions(-) diff --git a/rtdata/iccprofiles/output/RTv4_ACES-AP0.icc b/rtdata/iccprofiles/output/RTv4_ACES-AP0.icc index 5661f7e9ee44ee3351b7863c0a496664d7d80f14..03efd91e258071cb54fb97623a63e58034982a43 100644 GIT binary patch delta 135 zcmeyu`h|6ZEI%&;Hv>O|X<~A5fp4%|$izgcjc$#MvHKYqSp5F~|CYhPz}m^c@Q?Zb z|3CZw|Nm#nz`*p3f#HH;L}Zi#0~q{W&A;YC$Z7m_j`R1IGadh6{TUVkXfH40{eUFfbKNmSMU804wq> AK>z>% delta 127 zcmaFE`i6CaJTC`>5(9f;a&duguv^H)M5&E#<&5!+3_J`B4D3J*0^AG?|G)hQ0w9|a zNd04AWZ;X4j8XteGB7NB$G~7!4Pqh06dD*9I1Vr{T-b*YGs$3J*mIPDfhm8o4ATVw DL{lGd diff --git a/rtdata/iccprofiles/output/RTv4_Beta.icc b/rtdata/iccprofiles/output/RTv4_Beta.icc index 6d5bce2a415e2038c0a80448836bbe266c494810..1186153260e27a9977bb1e5b4295128399e1ab8b 100644 GIT binary patch delta 93 zcmaFE`i6CaJTEtc2m@PUa&duguv^H)M5&E#<&4G*|Ns8~|NkEp|7BogU5`$J^a&duguv^H)M5&E#<&4IR3_J`B4D3J*0^AG?|G)hQ0w9|a oNd04AWZ;X4j8XteGBB(@&%oe2fAR-LW!Bvc3@blRmSDO90K?xKvH$=8 diff --git a/rtdata/iccprofiles/output/RTv4_Bruce.icc b/rtdata/iccprofiles/output/RTv4_Bruce.icc index e6d0a69f7f321b8a41ffcfa8c5cceb82660df851..d617673052158f35d8a05c5349e0b6983637b811 100644 GIT binary patch delta 127 zcmaFE`i6CaEI%&;H-iX+Y+`b8fp4%|$izgcjc%2Uu}%yOtoQ!^|E$Wuz&@FQ;qQe1 z|9>z1|NrkI1_tIk3=9YIA|j&{7{H*ek%7UXhk=2G3n8ZF&cGmG!N9Pe10fc~$H1`O M1}H8)S%&EX0OFV;761SM delta 127 zcmaFE`i6CaEI$teKZ81hRbp~+fp4%|$izgcjc%2Uv0e-etdIZy|E$Hpz&@LS;cxr@ z|GyXg|NnO}0|WC728IJuA|j&{7{H*eoPoiije&uM3n8ZF%D^CC#=x+j6(JTR#lW!M M1t=~%S%&EX00s#neEy&7zZnm3&fXo5MoNR7#OzM0>v38%P?I40L@e?8~^|S delta 127 zcmaFE`i6CaJTC`>JOh7Xa&duguv^H)M5&E#<&5!+3_J`B4D3J*0^AG?|G)hQ0w9|a zNd04AWZ;X4j8XteGBBLcVPNpw17ab>IM{$(RtAR4dI&M4B@7JP>_O&CmSMU802JCF AbpQYW diff --git a/rtdata/iccprofiles/output/RTv4_Medium.icc b/rtdata/iccprofiles/output/RTv4_Medium.icc index 40bed87871fa6e665c61166ee421387e7ec18baf..f81aba3913cacce8561847d4589ce657ea58f249 100644 GIT binary patch delta 127 zcmeys`hj(VEI%&;H-jL9Qetv(fp4%|$izgcjc&D!u}%yOtoQ!^|E$Wuz&@FQ;qQe1 z|9>z1|NrkI1_tIk3=9YIA|j&{7{FkT1OtQrQU(T=KL{~3Lk0!`eFlbovk_t@y$lQs ObQl=;r%qO2x&QziR3s$; delta 127 zcmeys`hj(VEI$teKZ61TTVir?fp4%|$izgcjc&D!v0e-etdIZy|E$Hpz&@LS;cxr@ z|GyXg|NnO}0|WC728IJuA|j&{7{FkTAOnN{0tN<_KL{~30|o{GT?U4IGZA7YQyCZ* O7%?#LPoJ#7bO8V*NF+}H diff --git a/rtdata/iccprofiles/output/RTv4_Rec2020.icc b/rtdata/iccprofiles/output/RTv4_Rec2020.icc index bb7603b5528030ecbebd6d635ae5884b871a8887..9fcb5d263b82e3f388e382be0f890f0552785ea4 100644 GIT binary patch delta 127 zcmeys`hj(VEI%&;H-iv^WMXo0fp4%|$izgcjc&D!u}%yOtoQ!^|E$Wuz&@FQ;qQe1 z|9>z1|NrkI1_tIk3=9YIA|j&{7{FjnCIf?e{{R2~8xdj(%nS_NYZ(|$|3ipr0oAQ} M3^Z@;WCf-R0IlOF7ytkO delta 127 zcmeys`hj(VEI$teKZ6p3USe`_fp4%|$izgcjc&D!v0e-etdIZy|E$Hpz&@LS;cxr@ z|GyXg|NnO}0|WC728IJuA|j&{7{Fjn5(9&K?*IS)n-F3OEDQ|XYZ(|$|3`>v6)-TY Nc?L9Z&140p3joe-D0lz> diff --git a/rtdata/iccprofiles/output/RTv4_Wide.icc b/rtdata/iccprofiles/output/RTv4_Wide.icc index fced23d15f6bda0494fa4e95a78530c24102202b..6dca43823e347e6d3a519d85ee52b34f444e9137 100644 GIT binary patch delta 119 zcmaFE`i6CaJTEtcFav*La&duguv^H)M5&E#<&5DB|Ns8~|NkEp|7BogU0)us8a&duguv^H)M5&E#<&5Es3_J`B4D3J*0^AG?|G)hQ0w9|a vNd04AWZ;X4j8XteGB9lSV_z1|NrkI1_tIk3=9YIA|j&{7{DNZ0Rw}@SD^R=gqX^F1_u5X28L~i5n@Tx85p*= NGcZWpoGin10RT)+CM5s> delta 127 zcmaFE`i6CaEI$teKZ7a*b7FFFfp4%|$izgcjc%2Uv0e-etdIZy|E$Hpz&@LS;cxr@ z|GyXg|NnO}0|WC728IJuA|j&{7{DNZ3Il`1JD~UkgqX@)1_u6S28M0>5MoJ785p)t NU|^8AH(7@10su_tCP4rI diff --git a/rtgui/iccprofilecreator.cc b/rtgui/iccprofilecreator.cc index dc75db61f..c028ee9e7 100644 --- a/rtgui/iccprofilecreator.cc +++ b/rtgui/iccprofilecreator.cc @@ -1179,15 +1179,15 @@ void ICCProfileCreator::savePressed() xyD = {0.447573, 0.407440, 1.0}; } - if (illuminant == "D65") { + if (isD65) { xyD = {0.312700492, 0.329000939, 1.0}; } - if (illuminant == "D60") { + if (isD60) { xyD = {0.32168, 0.33767, 1.0}; } - if (illuminant == "D50") { + if (isD50) { xyD = {0.3457, 0.3585, 1.0}; } From 5535603710282195d6c581026a9142312ff8a50f Mon Sep 17 00:00:00 2001 From: "U-PC-BUREAU\\jacques" Date: Tue, 13 Nov 2018 14:31:30 +0100 Subject: [PATCH 15/60] Change sligthly matrix XYZ for ICCv2 due to white point change --- rtdata/iccprofiles/output/RTv2_ACES-AP0.icc | Bin 25444 -> 25444 bytes rtdata/iccprofiles/output/RTv2_ACES-AP1.icc | Bin 25444 -> 25444 bytes rtdata/iccprofiles/output/RTv2_Best.icc | Bin 25432 -> 25432 bytes rtdata/iccprofiles/output/RTv2_Beta.icc | Bin 25432 -> 25432 bytes rtdata/iccprofiles/output/RTv2_Bruce.icc | Bin 25436 -> 25436 bytes rtdata/iccprofiles/output/RTv2_Large.icc | Bin 25436 -> 25436 bytes rtdata/iccprofiles/output/RTv2_Medium.icc | Bin 876 -> 876 bytes rtdata/iccprofiles/output/RTv2_Rec2020.icc | Bin 25444 -> 25444 bytes rtdata/iccprofiles/output/RTv2_Wide.icc | Bin 25432 -> 25432 bytes rtdata/iccprofiles/output/RTv2_sRGB.icc | Bin 25432 -> 25432 bytes rtdata/iccprofiles/output/RTv4_Medium.icc | Bin 752 -> 752 bytes rtgui/iccprofilecreator.cc | 54 ++++++++++---------- 12 files changed, 27 insertions(+), 27 deletions(-) diff --git a/rtdata/iccprofiles/output/RTv2_ACES-AP0.icc b/rtdata/iccprofiles/output/RTv2_ACES-AP0.icc index b54fcfb4e51bd534ca3ccfbc6170a637a4d6dc89..a12a57402705fa3564bff99bebd5056c2ab07465 100644 GIT binary patch delta 64 zcmaEIjPc1a#to+#4OcTT#4P>)|G!^EWRwB}7%(d_Fzoooz`!I66Z`-F8|VN3uTmHo ME*{$ahcP1&02bvKm;e9( delta 64 zcmaEIjPc1a#to+#4OcKQ#4P{+|G!^EWRwB}7%*!wFzoooz`!H}6Z`-F8_WOyuaX%U ME*{?ehcP1&02fmjnE(I) diff --git a/rtdata/iccprofiles/output/RTv2_ACES-AP1.icc b/rtdata/iccprofiles/output/RTv2_ACES-AP1.icc index dc7e1f709e7de8c83be15926b36b1f2ab61ba022..079eed297c05d9ca44d6c9347de1236be5d87c27 100644 GIT binary patch delta 44 xcmaEIjPc1a#to+#W#=$3cwGDc|6fT&WRwB}7^sCaFs%N^SXDCsK}2Mf0*Gc{Fv(zG*mIPDfhiv$rqIB^z;S?q;ljSn I9~d(d0X*0c$^ZZW diff --git a/rtdata/iccprofiles/output/RTv2_Beta.icc b/rtdata/iccprofiles/output/RTv2_Beta.icc index c17ff0f0f9b6090d80e42d0127386407752abaa3..e6772948388f460585a855fc8af1f5d699488605 100644 GIT binary patch delta 40 scmca{jPb@X#tr)!CGRjW_%3Atf{4f{1rW`^ptGKVVddM+Hy9fd0TYc3p8x;= delta 40 scmca{jPb@X#tr)!CC@W3_|9hlf{4f{1rW`^ptGBSVddw|Hy9fd0TKrco&W#< diff --git a/rtdata/iccprofiles/output/RTv2_Bruce.icc b/rtdata/iccprofiles/output/RTv2_Bruce.icc index 8d53051887c297477b93446c68e08008fef7c5ef..601c485fd5d73571fb12bad7ef194ad604f77523 100644 GIT binary patch delta 72 zcmca}jPcGf#tnxV4I3F49C{cSShyl0qZAmxAc&8FVZ99lgMc(bOwAq0w_sq{&#_5K P!eNsVkHTh&Bo{^ia^Vjx delta 72 zcmca}jPcGf#tnxV4a*rA9NHKdShyl0qZAmxAV`XVVZ93jgMchTOwAR@H)CMf&$>xT P!eNsVkHTh&Bo{^iatjYE diff --git a/rtdata/iccprofiles/output/RTv2_Large.icc b/rtdata/iccprofiles/output/RTv2_Large.icc index 962c759bbaae93009497befacaff670aeb255295..acb6a91f993470d6bbe4f7c0a548930659e9c6f0 100644 GIT binary patch delta 72 zcmca}jPcGf#tnxV4b2%CJohmGK}2Mf0*Gc{P@2WSu+0|8U_^**w-S&6qp$pxYsf;oc_1@ I4`W6m0MT?4>Hq)$ delta 64 zcmaEIjPc1a#to+#4U-rc+;ji`|KAi58KuAg23iFS3~Qb-FtD#dh$*lzFmSJBU^xAM J^B=~HL;%qS6YT&1 diff --git a/rtdata/iccprofiles/output/RTv2_Wide.icc b/rtdata/iccprofiles/output/RTv2_Wide.icc index 06d5747cba04616d580230da0d77a17fcbf56e74..a932f5a06ec1686765ca94d7b8f47859b9a04a26 100644 GIT binary patch delta 36 ocmca{jPb@X#tr)!MZ*~woTM0lAR;nK0Yoz}NM7B1g|Q_O0L)tn{Qv*} delta 36 ocmca{jPb@X#tr)!Mg15UoFo{4AR;nK0Yoz}NZ#9gg|Q_O0Lyy``v3p{ diff --git a/rtdata/iccprofiles/output/RTv2_sRGB.icc b/rtdata/iccprofiles/output/RTv2_sRGB.icc index a039d2f6efa89e23a1c6698f56d9c3b48ce0492a..e0f967bfe4a296e12e95de7886163450cd033aed 100644 GIT binary patch delta 64 zcmca{jPb@X#tr)!4HqylSbSw*V4e^W8KuAg21(Ny7`C@FFi6})h^fqHVBl|IVAyte J^9RO^L;!C|5&8fC delta 64 zcmca{jPb@X#tr)!4Hq#mSbSw*V4e^W8KuAg21zp+7`C@EFi6}&h^Z`KVBl|IVAytk J^9RO^L;!Ft5()qS diff --git a/rtdata/iccprofiles/output/RTv4_Medium.icc b/rtdata/iccprofiles/output/RTv4_Medium.icc index f81aba3913cacce8561847d4589ce657ea58f249..075e9637c4daf56c91e68ba325a3ef214bc9eda3 100644 GIT binary patch delta 27 icmeys`hj(VJTEVU00UoQa&duguv^H)M5&E#tC#?D0tjLN delta 27 icmeys`hj(VJTEtcAcIn3a&duguv^H)M5&E#tC#?EEC_V~ diff --git a/rtgui/iccprofilecreator.cc b/rtgui/iccprofilecreator.cc index e5e0f759f..0e4921b3f 100644 --- a/rtgui/iccprofilecreator.cc +++ b/rtgui/iccprofilecreator.cc @@ -1063,12 +1063,12 @@ void ICCProfileCreator::savePressed() if (primariesPreset == "sRGB") { { - //Matrix value from spec Adobe - rt = {0.43607, 0.22249, 0.01392}; + //Matrix value from spec Adobe but adapted with wp + rt = {0.43604, 0.22249, 0.01392}; cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {0.14307, 0.06061, 0.71410}; + bt = {0.14305, 0.06061, 0.71391}; cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.38515, 0.71687, 0.09708}; + gt = {0.38512, 0.71690, 0.09706}; cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); } @@ -1077,10 +1077,10 @@ void ICCProfileCreator::savePressed() if (primariesPreset == "Adobe") { { - //Adobe spec + //Adobe spec adapted with wp rt = {0.60974, 0.31111, 0.01947}; cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {0.14919, 0.06322, 0.74457}; + bt = {0.14919, 0.06322, 0.74455}; cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); gt = {0.20528, 0.62567, 0.06087}; cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); @@ -1089,88 +1089,88 @@ void ICCProfileCreator::savePressed() if (primariesPreset == "Rec2020") { { - rt = {0.67337, 0.27901, -0.00192}; + rt = {0.67348, 0.27904, -0.00194}; cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {0.12506, 0.04561, 0.79686}; + bt = {0.12505, 0.04561, 0.79684}; cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.16577, 0.67538, 0.02997}; + gt = {0.16566, 0.67534, 0.02998}; cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); } } if (primariesPreset == "BruceRGB") { { - rt = {0.49400, 0.25204, 0.01578}; + rt = {0.49416, 0.25214, 0.01578}; cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {0.14949, 0.06332, 0.74617}; + bt = {0.14952, 0.06335, 0.74622}; cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.32071, 0.68463, 0.06294}; + gt = {0.32053, 0.68451, 0.06291}; cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); } } if (primariesPreset == "ACES-AP0") { { - rt = {0.99084, 0.36192, -0.00272}; + rt = {0.99089, 0.36189, -0.00272}; cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {-0.03900, -0.08443, 0.81938}; + bt = {-0.03893, -0.08441, 0.81937}; cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.01236, 0.72250, 0.00824}; + gt = {0.01224, 0.72250, 0.00826}; cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); } } if (primariesPreset == "ACES-AP1") { { - rt = {0.68970, 0.28445, -0.00604}; + rt = {0.68988, 0.28452, -0.00604}; cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); bt = {0.12456, 0.04379, 0.82094}; cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.14995, 0.67175, 0.00999}; + gt = {0.14977, 0.67169, 0.01001}; cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); } } if (primariesPreset == "ProPhoto") { { - rt = {0.79755, 0.28802, 0.0}; + rt = {0.79771, 0.28806, 0.0}; cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {0.03134, 0.00008, 0.82492}; + bt = {0.03133, 0.00008, 0.82489}; cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.13531, 0.71190, -0.00002}; + gt = {0.13516, 0.71187, 0.00002}; cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); } } if (primariesPreset == "Widegamut") { { - rt = {0.71603, 0.25818, 0.0}; + rt = {0.71617, 0.25821, 0.0}; cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); bt = {0.14713, 0.01688, 0.77312}; cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.10104, 0.72493, 0.05177}; + gt = {0.10091, 0.72493, 0.05177}; cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); } } if (primariesPreset == "BestRGB") { { - rt = {0.63254, 0.22844, 0.0}; + rt = {0.63274, 0.22847, 0.0}; cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {0.12695, 0.03418, 0.81540}; + bt = {0.12694, 0.03418, 0.81538}; cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.20471, 0.73738, 0.00951}; + gt = {0.20451, 0.73735, 0.00952}; cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); } } if (primariesPreset == "BetaRGB") { { - rt = {0.67113, 0.30321, 0.0}; + rt = {0.67133, 0.30330, 0.0}; cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); bt = {0.11833, 0.03293, 0.78419}; cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.17473, 0.66386, 0.04070}; + gt = {0.17455, 0.66377, 0.04070}; cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); } } From b0bc0c7addef9894cca0545c464a6e17c3330f99 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 13 Nov 2018 15:02:08 +0100 Subject: [PATCH 16/60] Fix bug in pdaf lines filter --- rtengine/pdaflinesfilter.cc | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/rtengine/pdaflinesfilter.cc b/rtengine/pdaflinesfilter.cc index 92fd68b41..ee279f3c0 100644 --- a/rtengine/pdaflinesfilter.cc +++ b/rtengine/pdaflinesfilter.cc @@ -151,12 +151,10 @@ public: if (it > pattern_.begin()) { int b2 = *(it-1); int d2 = key - b2; - float f = BORDER[std::min(std::min(d, d2), BORDER_WIDTH)]; - return f; - } else { - float f = BORDER[std::min(d, BORDER_WIDTH)]; - return f; + d = std::min(d, d2); } + float f = (d <= BORDER_WIDTH) ? BORDER[d] : 0.f; + return f; } return 0.f; } From 7a84f8211ecb6b7ebe31b3dff25ad51f89842b49 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 13 Nov 2018 22:22:09 +0100 Subject: [PATCH 17/60] Show 'Could not extract thumb from ...' only in verbose mode, closes #4984 --- rtengine/rtthumbnail.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index f01e87ff7..aafdea029 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -421,7 +421,9 @@ Thumbnail* Thumbnail::loadQuickFromRaw (const Glib::ustring& fname, RawMetaDataL // did we succeed? if ( err ) { - printf ("Could not extract thumb from %s\n", fname.data()); + if (options.rtSettings.verbose) { + std::cout << "Could not extract thumb from " << fname.c_str() << std::endl; + } delete tpp; delete img; delete ri; From 24ce9148b96b9cb62246e272540a3b9f53518dfb Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 13 Nov 2018 22:23:30 +0100 Subject: [PATCH 18/60] Remove useless logging in verbose mode, #4985 --- rtengine/ipvibrance.cc | 6 ------ 1 file changed, 6 deletions(-) diff --git a/rtengine/ipvibrance.cc b/rtengine/ipvibrance.cc index f7a938c33..86c942731 100644 --- a/rtengine/ipvibrance.cc +++ b/rtengine/ipvibrance.cc @@ -170,12 +170,6 @@ void ImProcFunctions::vibrance (LabImage* lab) {static_cast(wiprof[2][0]), static_cast(wiprof[2][1]), static_cast(wiprof[2][2])} }; - - if (settings->verbose) { - printf ("vibrance: p0=%1.2f p1=%1.2f p2=%1.2f s0=%1.2f s1=%1.2f s2=%1.2f\n", p0, p1, p2, s0, s1, s2); - printf (" pastel=%f satur=%f limit= %1.2f chromamean=%0.5f\n", 1.0f + chromaPastel, 1.0f + chromaSatur, limitpastelsatur, chromamean); - } - #pragma omp parallel if (multiThread) { From be4027349d583149be4c3e9457cde813e0d4cd77 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 13 Nov 2018 22:39:54 +0100 Subject: [PATCH 19/60] Remove useless logging while panning in verbose mode, #4985 --- rtengine/dcrop.cc | 12 ------------ rtengine/improccoordinator.cc | 17 ----------------- 2 files changed, 29 deletions(-) diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 6aa1bd2fe..ddb1b750d 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -1163,10 +1163,6 @@ bool check_need_larger_crop_for_lcp_distortion(int fw, int fh, int x, int y, int bool Crop::setCropSizes(int rcx, int rcy, int rcw, int rch, int skip, bool internal) { - if (settings->verbose) { - printf("setcropsizes before lock\n"); - } - if (!internal) { cropMutex.lock(); } @@ -1258,10 +1254,6 @@ bool Crop::setCropSizes(int rcx, int rcy, int rcw, int rch, int skip, bool inter int cw = skips(bw, skip); int ch = skips(bh, skip); - if (settings->verbose) { - printf("setsizes starts (%d, %d, %d, %d, %d, %d)\n", orW, orH, trafw, trafh, cw, ch); - } - EditType editType = ET_PIPETTE; if (const auto editProvider = PipetteBuffer::getDataProvider()) { @@ -1326,10 +1318,6 @@ bool Crop::setCropSizes(int rcx, int rcy, int rcw, int rch, int skip, bool inter cropx = bx1; cropy = by1; - if (settings->verbose) { - printf("setsizes ends\n"); - } - if (!internal) { cropMutex.unlock(); } diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index ac330db23..f683f0b71 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -1010,10 +1010,6 @@ void ImProcCoordinator::freeAll() void ImProcCoordinator::setScale(int prevscale) { - if (settings->verbose) { - printf("setscale before lock\n"); - } - tr = getCoarseBitMask(params.coarse); int nW, nH; @@ -1027,10 +1023,6 @@ void ImProcCoordinator::setScale(int prevscale) imgsrc->getSize(pp, nW, nH); } while (nH < 400 && prevscale > 1 && (nW * nH < 1000000)); // sctually hardcoded values, perhaps a better choice is possible - if (settings->verbose) { - printf("setscale starts (%d, %d)\n", nW, nH); - } - if (nW != pW || nH != pH) { freeAll(); @@ -1054,19 +1046,10 @@ void ImProcCoordinator::setScale(int prevscale) fullw = fw; fullh = fh; - if (settings->verbose) { - printf("setscale ends\n"); - } - if (!sizeListeners.empty()) for (size_t i = 0; i < sizeListeners.size(); i++) { sizeListeners[i]->sizeChanged(fullw, fullh, fw, fh); } - - if (settings->verbose) { - printf("setscale ends2\n"); - } - } From 9453c23b48cb587cffdd731c3902916b8c5a38bf Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 13 Nov 2018 22:46:13 +0100 Subject: [PATCH 20/60] Remove useless 'freeall...' logs, #4985 --- rtengine/dcrop.cc | 4 ---- rtengine/improccoordinator.cc | 4 ---- 2 files changed, 8 deletions(-) diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index ddb1b750d..48d1df191 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -1100,10 +1100,6 @@ void Crop::update(int todo) void Crop::freeAll() { - if (settings->verbose) { - printf("freeallcrop starts %d\n", (int)cropAllocated); - } - if (cropAllocated) { if (origCrop) { delete origCrop; diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index f683f0b71..2eb72a72b 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -965,10 +965,6 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) void ImProcCoordinator::freeAll() { - if (settings->verbose) { - printf("freeall starts %d\n", (int)allocated); - } - if (allocated) { if (orig_prev != oprevi) { delete oprevi; From 406a64c4697b0170f198916b83120c9cbde7ea47 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 13 Nov 2018 22:59:29 +0100 Subject: [PATCH 21/60] Don't log filter settings on startup, #4985 --- rtgui/filecatalog.cc | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/rtgui/filecatalog.cc b/rtgui/filecatalog.cc index 55e293718..49559f93e 100644 --- a/rtgui/filecatalog.cc +++ b/rtgui/filecatalog.cc @@ -1623,26 +1623,6 @@ BrowserFilter FileCatalog::getFilter () anyRankFilterActive || anyCLabelFilterActive || anyEditedFilterActive; } - if( options.rtSettings.verbose ) { - printf ("\n**************** FileCatalog::getFilter *** AFTER STEP 1 \n"); - - for (int i = 0; i <= 5; i++) { - printf ("filter.showRanked[%i] = %i\n", i, filter.showRanked[i]); - } - - for (int i = 0; i <= 5; i++) { - printf ("filter.showCLabeled[%i] = %i\n", i, filter.showCLabeled[i]); - } - - for (int i = 0; i < 2; i++) { - printf ("filter.showEdited[%i] = %i\n", i, filter.showEdited[i]); - } - - for (int i = 0; i < 2; i++) { - printf ("filter.showRecentlySaved[%i] = %i\n", i, filter.showRecentlySaved[i]); - } - } - filter.multiselect = false; /* From 88e9cf165c9b463bc70a0eb2c36227ab3db42e2d Mon Sep 17 00:00:00 2001 From: "U-PC-BUREAU\\jacques" Date: Wed, 14 Nov 2018 09:07:14 +0100 Subject: [PATCH 22/60] Increases the accuracy of XYZ matrix for ICC v2 --- rtgui/iccprofilecreator.cc | 82 +++++++++++++++++++------------------- 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/rtgui/iccprofilecreator.cc b/rtgui/iccprofilecreator.cc index 0e4921b3f..10d3614d9 100644 --- a/rtgui/iccprofilecreator.cc +++ b/rtgui/iccprofilecreator.cc @@ -1061,14 +1061,14 @@ void ICCProfileCreator::savePressed() cmsCIExyY gt; if (primariesPreset == "sRGB") { - + //calculated with personnal special spreadsheat { //Matrix value from spec Adobe but adapted with wp - rt = {0.43604, 0.22249, 0.01392}; + rt = {0.4360411843, 0.2224843154, 0.0139201582}; cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {0.14305, 0.06061, 0.71391}; + bt = {0.1430457992, 0.0606099658, 0.7139121724}; cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.38512, 0.71690, 0.09706}; + gt = {0.3851136574, 0.7169049862, 0.0970677661}; cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); } @@ -1077,100 +1077,100 @@ void ICCProfileCreator::savePressed() if (primariesPreset == "Adobe") { { - //Adobe spec adapted with wp - rt = {0.60974, 0.31111, 0.01947}; + //Adobe spec adapted with wp calculated with personnal special spreadsheat + rt = {0.6097408852, 0.3111123176, 0.0194653393}; cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {0.14919, 0.06322, 0.74455}; + bt = {0.1491866649, 0.0632119133, 0.7445599707}; cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.20528, 0.62567, 0.06087}; + gt = {0.2052730908, 0.6256750365, 0.0608747867}; cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); } } if (primariesPreset == "Rec2020") { - { - rt = {0.67348, 0.27904, -0.00194}; + {//calculated with personnal special spreadsheat + rt = {0.6734800343, 0.2790423273, -0.0019336766}; cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {0.12505, 0.04561, 0.79684}; + bt = {0.1250489478, 0.0456126910, 0.7968509159}; cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.16566, 0.67534, 0.02998}; + gt = {0.1656716588, 0.6753442491, 0.0299828575}; cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); } } if (primariesPreset == "BruceRGB") { - { - rt = {0.49416, 0.25214, 0.01578}; + {//calculated with personnal special spreadsheat + rt = {0.4941542253, 0.2521357351, 0.0157753562}; cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {0.14952, 0.06335, 0.74622}; + bt = {0.1495175342, 0.0633521060, 0.7462112712}; cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.32053, 0.68451, 0.06291}; + gt = {0.3205288814, 0.6845114263, 0.0629134693}; cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); } } if (primariesPreset == "ACES-AP0") { - { - rt = {0.99089, 0.36189, -0.00272}; + {//calculated with personnal special spreadsheat + rt = {0.9908835135, 0.3618940325, -0.0027137400}; cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {-0.03893, -0.08441, 0.81937}; + bt = {-0.0389246557, -0.084405166, 0.8193659780}; cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.01224, 0.72250, 0.00826}; + gt = {0.0122417831, 0.7225104015, 0.0082478587}; cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); } } - if (primariesPreset == "ACES-AP1") { - { - rt = {0.68988, 0.28452, -0.00604}; + if (primariesPreset == "ACES-AP1") {//done + {//calculated with personnal special spreadsheat + rt = {0.6898756188, 0.2845109670, -0.0060455375}; cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {0.12456, 0.04379, 0.82094}; + bt = {0.1245615936, 0.0437959432, 0.8209388333}; cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.14977, 0.67169, 0.01001}; + gt = {0.1497634285, 0.6716923572, 0.0100068009}; cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); } } if (primariesPreset == "ProPhoto") { - { - rt = {0.79771, 0.28806, 0.0}; + {//calculated with personnal special spreadsheat + rt = {0.7977198204, 0.2880493171, -0.0000030551}; cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {0.03133, 0.00008, 0.82489}; + bt = {0.0313194091, 0.0000771282, 0.8248890748}; cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.13516, 0.71187, 0.00002}; + gt = {0.1351614114, 0.7118728221, 0.0000140770}; cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); } } if (primariesPreset == "Widegamut") { - { - rt = {0.71617, 0.25821, 0.0}; + {//calculated with personnal special spreadsheat + rt = {0.7161680478, 0.2582038074, -0.0000027515}; cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {0.14713, 0.01688, 0.77312}; + bt = {0.1471328469, 0.0168600579, 0.7731227232}; cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.10091, 0.72493, 0.05177}; + gt = {0.1008997462, 0.7249354021, 0.0517801251}; cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); } } if (primariesPreset == "BestRGB") { - { - rt = {0.63274, 0.22847, 0.0}; + {//calculated with personnal special spreadsheat + rt = {0.6327383009, 0.2284760022, -0.0000024233}; cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {0.12694, 0.03418, 0.81538}; + bt = {0.1269437333, 0.0341753604, 0.8153773703}; cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.20451, 0.73735, 0.00952}; + gt = {0.2045186067, 0.7373479048, 0.0095251497}; cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); } } if (primariesPreset == "BetaRGB") { - { - rt = {0.67133, 0.30330, 0.0}; + {//calculated with personnal special spreadsheat + rt = {0.6713200674, 0.3033034560, -0.0000012307}; cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {0.11833, 0.03293, 0.78419}; + bt = {0.1183343909, 0.0329265310, 0.7842009909}; cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.17455, 0.66377, 0.04070}; + gt = {0.1745461827, 0.6637692805, 0.0407003365}; cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); } } From 1f04599bc31fbba73879fbb3c73e7575f4814878 Mon Sep 17 00:00:00 2001 From: "U-PC-BUREAU\\jacques" Date: Wed, 14 Nov 2018 11:29:26 +0100 Subject: [PATCH 23/60] change ICCv2 to be in line with the most accurate data XYZ --- rtdata/iccprofiles/output/RTv2_Wide.icc | Bin 25432 -> 25432 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/rtdata/iccprofiles/output/RTv2_Wide.icc b/rtdata/iccprofiles/output/RTv2_Wide.icc index a932f5a06ec1686765ca94d7b8f47859b9a04a26..3d3f72f5359d6d32378b582b17e239990ca237d7 100644 GIT binary patch delta 16 Ycmca{jPb@X#tp9-83Q-JVa!Pc07nJ~ng9R* delta 16 Ycmca{jPb@X#tp9-8G|;zVa!Pc07nc5n*aa+ From e02d4ac24d058ff706df875f65f360c5fd013fa4 Mon Sep 17 00:00:00 2001 From: "U-PC-BUREAU\\jacques" Date: Wed, 14 Nov 2018 13:01:43 +0100 Subject: [PATCH 24/60] Change CmsCIExyY by cmsCIEXYZ in some cases --- rtgui/iccprofilecreator.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rtgui/iccprofilecreator.cc b/rtgui/iccprofilecreator.cc index 10d3614d9..6ac043437 100644 --- a/rtgui/iccprofilecreator.cc +++ b/rtgui/iccprofilecreator.cc @@ -1034,7 +1034,7 @@ void ICCProfileCreator::savePressed() } else { if (v2except) { - cmsCIExyY XYZ; + cmsCIEXYZ XYZ; { XYZ = {0.95045471, 1.0, 1.08905029};//white D65 @@ -1056,9 +1056,9 @@ void ICCProfileCreator::savePressed() cmsWriteTag(profile_v2_except, cmsSigMediaBlackPointTag, &blackpoint); cmsWriteTag(profile_v2_except, cmsSigMediaWhitePointTag, &XYZ); - cmsCIExyY rt; - cmsCIExyY bt; - cmsCIExyY gt; + cmsCIEXYZ rt; + cmsCIEXYZ bt; + cmsCIEXYZ gt; if (primariesPreset == "sRGB") { //calculated with personnal special spreadsheat From 297324794821b13fee28d81ceebc4792bf0bada8 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Wed, 14 Nov 2018 14:42:25 +0100 Subject: [PATCH 25/60] lossless_dnglj92_load_raw(), don't use malloc/free --- rtengine/dcraw.cc | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index 79c0e59f6..f61cd94c2 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -1147,11 +1147,11 @@ void CLASS lossless_dnglj92_load_raw() } else { dataOffset[0] = ifp->pos; } - uint8_t *data = (uint8_t*)malloc(ifp->size); + const int data_length = ifp->size; + const std::unique_ptr data(new uint8_t[data_length]); fseek(ifp, 0, SEEK_SET); // read whole file - int data_length = ifp->size; - fread(data, 1, data_length, ifp); + fread(data.get(), 1, data_length, ifp); lj92 lj; int newwidth, newheight, newbps; lj92_open(&lj, &data[dataOffset[0]], data_length, &newwidth, &newheight, &newbps); @@ -1159,7 +1159,6 @@ void CLASS lossless_dnglj92_load_raw() if (newwidth * newheight * tileCount != raw_width * raw_height) { // not a lj92 file fseek(ifp, save, SEEK_SET); - free(data); lossless_dng_load_raw(); return; } @@ -1173,17 +1172,15 @@ void CLASS lossless_dnglj92_load_raw() int newwidth, newheight, newbps; lj92_open(&lj, &data[dataOffset[t]], data_length, &newwidth, &newheight, &newbps); - uint16_t *target = (uint16_t*)malloc(newwidth * newheight * sizeof *target); - lj92_decode(lj, target, tile_width, 0, lincurve, 0x1000); + const std::unique_ptr target(new uint16_t[newwidth * newheight]); + lj92_decode(lj, target.get(), tile_width, 0, lincurve, 0x1000); for (int y = 0; y < height; ++y) { for(int x = 0; x < tile_width; ++x) { RAW(y, x + tcol) = target[y * tile_width + x]; } } lj92_close(lj); - free(target); } - free(data); } void CLASS lossless_dng_load_raw() From 66bb7ba8540a5bf86b2fa510501c1be3c34de7a3 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Wed, 14 Nov 2018 15:18:14 +0100 Subject: [PATCH 26/60] Fix broken arm builds --- rtengine/boxblur.h | 1 + 1 file changed, 1 insertion(+) diff --git a/rtengine/boxblur.h b/rtengine/boxblur.h index 71452ceae..d686ad43e 100644 --- a/rtengine/boxblur.h +++ b/rtengine/boxblur.h @@ -19,6 +19,7 @@ #ifndef _BOXBLUR_H_ #define _BOXBLUR_H_ +#include #include #include #include From ff8ec9be084b9b887dd222783a158f52eebdda1e Mon Sep 17 00:00:00 2001 From: "U-PC-BUREAU\\jacques" Date: Wed, 14 Nov 2018 17:47:34 +0100 Subject: [PATCH 27/60] Small changes to ICCv2 profiles --- rtdata/iccprofiles/output/RTv2_ACES-AP0.icc | Bin 25444 -> 25444 bytes rtdata/iccprofiles/output/RTv2_ACES-AP1.icc | Bin 25444 -> 25444 bytes rtdata/iccprofiles/output/RTv2_Best.icc | Bin 25432 -> 25432 bytes rtdata/iccprofiles/output/RTv2_Beta.icc | Bin 25432 -> 25432 bytes rtdata/iccprofiles/output/RTv2_Bruce.icc | Bin 25436 -> 25436 bytes rtdata/iccprofiles/output/RTv2_Large.icc | Bin 25436 -> 25436 bytes rtdata/iccprofiles/output/RTv2_Medium.icc | Bin 876 -> 876 bytes rtdata/iccprofiles/output/RTv2_Rec2020.icc | Bin 25444 -> 25444 bytes rtdata/iccprofiles/output/RTv2_Wide.icc | Bin 25432 -> 25432 bytes rtdata/iccprofiles/output/RTv2_sRGB.icc | Bin 25432 -> 25432 bytes rtdata/iccprofiles/output/RTv4_ACES-AP0.icc | Bin 756 -> 756 bytes rtdata/iccprofiles/output/RTv4_ACES-AP1.icc | Bin 756 -> 756 bytes rtgui/iccprofilecreator.cc | 1 - 13 files changed, 1 deletion(-) diff --git a/rtdata/iccprofiles/output/RTv2_ACES-AP0.icc b/rtdata/iccprofiles/output/RTv2_ACES-AP0.icc index a12a57402705fa3564bff99bebd5056c2ab07465..dce81742c5c408e7fef01ee483ed2dcf6acf8e59 100644 GIT binary patch delta 24 gcmaEIjPc1a#tD+#j~KWa_!tBk6d8m!syHMA0BUIl!vFvP delta 24 gcmaEIjPc1a#tD+#ml;?X7#X-2tQgogsyHMA0BF(%rT_o{ diff --git a/rtdata/iccprofiles/output/RTv2_ACES-AP1.icc b/rtdata/iccprofiles/output/RTv2_ACES-AP1.icc index 079eed297c05d9ca44d6c9347de1236be5d87c27..65af92f1ce79354c7453f5e54e96c810ee4dd5c7 100644 GIT binary patch delta 24 gcmaEIjPc1a#tD+#j~KWa_!tBk6d8m!syHMA0BUIl!vFvP delta 24 gcmaEIjPc1a#tD+#ml;?X7#X-2tQgogsyHMA0BF(%rT_o{ diff --git a/rtdata/iccprofiles/output/RTv2_Best.icc b/rtdata/iccprofiles/output/RTv2_Best.icc index 36b0b2c28d718c2b760438d1bffd015e9b3979f9..6390b1f34c055effde63fb82b6cee9c842558985 100644 GIT binary patch delta 24 gcmca{jPb@X#tD+#j~KWa_!tBk6d8m!s+c4L0BAJ^p8x;= delta 24 gcmca{jPb@X#tD+#ml;?X7#X-2tQgogs+c4L0A`*Bf&c&j diff --git a/rtdata/iccprofiles/output/RTv2_Beta.icc b/rtdata/iccprofiles/output/RTv2_Beta.icc index e6772948388f460585a855fc8af1f5d699488605..13907b35a3f3c05f331cefad0ba6a2e88fd68e2f 100644 GIT binary patch delta 24 gcmca{jPb@X#tD+#j~KWa_!tBk6d8m!s+c4L0BAJ^p8x;= delta 24 gcmca{jPb@X#tD+#ml;?X7#X-2tQgogs+c4L0A`*Bf&c&j diff --git a/rtdata/iccprofiles/output/RTv2_Bruce.icc b/rtdata/iccprofiles/output/RTv2_Bruce.icc index 601c485fd5d73571fb12bad7ef194ad604f77523..7dd7f383c831b207ae50de7c31600ee56aa40739 100644 GIT binary patch delta 24 gcmca}jPcGf#tD+#j~KWa_!tBk6d8m!s#qig0BG?Bs{jB1 delta 24 gcmca}jPcGf#tD+#ml;?X7#X-2tQgogs#qig0B2eTjsO4v diff --git a/rtdata/iccprofiles/output/RTv2_Large.icc b/rtdata/iccprofiles/output/RTv2_Large.icc index acb6a91f993470d6bbe4f7c0a548930659e9c6f0..9d2c3fc01171f83e59c50667f3773030697261be 100644 GIT binary patch delta 24 gcmca}jPcGf#tD+#j~KWa_!tBk6d8m!s#qig0BG?Bs{jB1 delta 24 gcmca}jPcGf#tD+#ml;?X7#X-2tQgogs#qig0B2eTjsO4v diff --git a/rtdata/iccprofiles/output/RTv2_Medium.icc b/rtdata/iccprofiles/output/RTv2_Medium.icc index 3ab78bcaad5ee50c985e43433c471d3594a82381..065c43bc44ed6cbe53fd332875a727a48fc03eb0 100644 GIT binary patch delta 22 dcmaFE_J(bOB=;i*ZU#OEK?X$z;f*RD%m7G01o;2} delta 22 dcmaFE_J(bOB==O|X<~A5fp4%|$izgcjc)6h0DOuFp8x;= diff --git a/rtdata/iccprofiles/output/RTv4_ACES-AP1.icc b/rtdata/iccprofiles/output/RTv4_ACES-AP1.icc index ce26048890878eb5acec135e34668d2a3ef857cb..7194ff6dac9f2f388c39a4c7390ae970ee1d50d6 100644 GIT binary patch delta 29 kcmeyu`h|6ZEI%KE0D}&LWnyx1fp4%|$izgcjc)6h0Dn#h#sB~S delta 29 kcmeyu`h|6ZEI%&;H-i9!Wnyx1fp4%|$izgcjc)6h0DRmCqyPW_ diff --git a/rtgui/iccprofilecreator.cc b/rtgui/iccprofilecreator.cc index 6ac043437..e0fc1365f 100644 --- a/rtgui/iccprofilecreator.cc +++ b/rtgui/iccprofilecreator.cc @@ -1387,7 +1387,6 @@ void ICCProfileCreator::savePressed() if (!v2except) { cmsSaveProfileToFile(newProfile, absoluteFName.c_str()); } else { - printf("save except\n"); cmsSaveProfileToFile(profile_v2_except, absoluteFName.c_str()); } From 834f6bafead2813781ea8651c9c6bdccc1f8d18d Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Thu, 15 Nov 2018 07:49:58 +0100 Subject: [PATCH 28/60] Japanese translation updated by firefly, closes #4988 --- rtdata/languages/Japanese | 92 +++++++++++++++++++-------------------- 1 file changed, 46 insertions(+), 46 deletions(-) diff --git a/rtdata/languages/Japanese b/rtdata/languages/Japanese index 8a2f90dfd..e36e77efb 100644 --- a/rtdata/languages/Japanese +++ b/rtdata/languages/Japanese @@ -74,6 +74,10 @@ DYNPROFILEEDITOR_DELETE;削除 DYNPROFILEEDITOR_EDIT;編集 DYNPROFILEEDITOR_EDIT_RULE;ダイナミックプロファイルの規定を変更 DYNPROFILEEDITOR_ENTRY_TOOLTIP;既定の符号は鈍いので\n入力する際に"re:"という接頭語を付けます\n通常の表現を使います +DYNPROFILEEDITOR_IMGTYPE_ANY;任意 +DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +DYNPROFILEEDITOR_IMGTYPE_PS;ピクセルシフト +DYNPROFILEEDITOR_IMGTYPE_STD;標準え DYNPROFILEEDITOR_MOVE_DOWN;下に移動 DYNPROFILEEDITOR_MOVE_UP;上に移動 DYNPROFILEEDITOR_NEW;新規 @@ -146,6 +150,8 @@ FILEBROWSER_AUTOFLATFIELD;オート・フラットフィールド FILEBROWSER_BROWSEPATHBUTTONHINT;クリックで選択したパスをブラウズ FILEBROWSER_BROWSEPATHHINT;参照するパスを入力します\nCtrl-O パスのテキストボックスにフォーカス\nEnter / Ctrl-Enterその場所をブラウズします\nEsc 変更をクリア\nShift-Escフォーカスを削除\nパスのショートカット:\n ~ - ユーザーのホームディレクトリ\n ! - ユーザーの画像ディレクトリ FILEBROWSER_CACHE;cache +FILEBROWSER_CACHECLEARFROMFULL;プロファイルを含めcache内をクリアにする +FILEBROWSER_CACHECLEARFROMPARTIAL;プロファイルを除き、cache内をクリアにする FILEBROWSER_CLEARPROFILE;プロファイルのクリア FILEBROWSER_COLORLABEL_TOOLTIP;カラー・ラベル\n\nドロップダウン・メニューからか、ショートカット:\nShift-Ctrl-1 レッド\nShift-Ctrl-2 イエロー\nShift-Ctrl-3 グリーン\nShift-Ctrl-4 ブルー\nShift-Ctrl-5 パープル FILEBROWSER_COPYPROFILE;プロファイルをコピー @@ -751,12 +757,26 @@ HISTORY_MSG_485;レンズ補正 HISTORY_MSG_486;レンズ補正 - カメラ HISTORY_MSG_487;レンズ補正 - レンズ HISTORY_MSG_488;ダイナミックレンジ圧縮 +HISTORY_MSG_489;DRC - 細部 HISTORY_MSG_490;DRC - 量 HISTORY_MSG_491;ホワイトバランス HISTORY_MSG_492;RGBカーブ HISTORY_MSG_493;L*a*b*調整 HISTORY_MSG_CLAMPOOG;色域外の色を切り取る HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - カラー補正 +HISTORY_MSG_COLORTONING_LABREGION_AB;CT - 色の補正 +HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - 色度のマスク +HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - 色相のマスク +HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - 明度 +HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - 輝度のマスク +HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - リスト +HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - 彩度 +HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - マスクの表示 +HISTORY_MSG_DEHAZE_DEPTH;霞除去 - 深度 +HISTORY_MSG_DEHAZE_ENABLED;霞除去 +HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;霞除去 - 深度マップの表示 +HISTORY_MSG_DEHAZE_STRENGTH;霞除去 - 強さ +HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;デュアルデモザイク - 自動しきい値 HISTORY_MSG_DUALDEMOSAIC_CONTRAST;AMaZE+VNG4 - コントラストのしきい値 HISTORY_MSG_HISTMATCHING;トーンカーブの自動調節 HISTORY_MSG_ICM_OUTPUT_PRIMARIES;出力 - プライマリ @@ -781,6 +801,7 @@ HISTORY_MSG_RAWCACORR_COLORSHIFT;Rawの色収差補正 - 色ずれを回避 HISTORY_MSG_RAW_BORDER;Rawの境界 HISTORY_MSG_RESIZE_ALLOWUPSCALING;リサイズ - アップスケーリングを可能にする HISTORY_MSG_SHARPENING_CONTRAST;シャープ化 - コントラストのしきい値 +HISTORY_MSG_SH_COLORSPACE;S/H - 色空間 HISTORY_MSG_SOFTLIGHT_ENABLED;ソフトライト HISTORY_MSG_SOFTLIGHT_STRENGTH;ソフトライト - 強さ HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - アンカー @@ -982,6 +1003,7 @@ PARTIALPASTE_CROP;切り抜き PARTIALPASTE_DARKFRAMEAUTOSELECT;ダークフレーム自動選択 PARTIALPASTE_DARKFRAMEFILE;ダークフレーム・ファイル PARTIALPASTE_DEFRINGE;フリンジ低減 +PARTIALPASTE_DEHAZE;霞除去 PARTIALPASTE_DETAILGROUP;ディテールの設定 PARTIALPASTE_DIALOGLABEL;処理プロファイルの部分ペースト PARTIALPASTE_DIRPYRDENOISE;ノイズ低減 @@ -1018,6 +1040,7 @@ PARTIALPASTE_PREPROCESS_LINEDENOISE;ラインノイズ フィルタ PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF ラインフィルタ PARTIALPASTE_PRSHARPENING;リサイズ後のシャープ化 PARTIALPASTE_RAWCACORR_AUTO;自動色収差補正 +PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA 色ずれを回避 PARTIALPASTE_RAWCACORR_CAREDBLUE;色収差 レッドとブルー PARTIALPASTE_RAWEXPOS_BLACK;黒レベル PARTIALPASTE_RAWEXPOS_LINEAR;raw ホワイトポイント リニア補正係数 @@ -1055,6 +1078,11 @@ PREFERENCES_BEHAVIOR;ビヘイビア PREFERENCES_BEHSETALL;すべて '設定' PREFERENCES_BEHSETALLHINT;すべてのパラメータを 設定モードにします\nバッチツールパネルで設定される調整値が、各画像の既定値に取って代わり同一になります PREFERENCES_BLACKBODY;タングステン +PREFERENCES_CACHECLEAR;クリア +PREFERENCES_CACHECLEAR_ALL;cacheに入れられたファイルを全てクリア: +PREFERENCES_CACHECLEAR_ALLBUTPROFILES;cacheに入れた処理プロファイル以外をクリア: +PREFERENCES_CACHECLEAR_ONLYPROFILES;cacheに入れた処理プロファイルだけをクリア: +PREFERENCES_CACHECLEAR_SAFETY;casheに入れたファイルだけをクリア。元画像に付随した処理プロファイルはそのまま PREFERENCES_CACHEMAXENTRIES;キャッシュエントリーの最大数 PREFERENCES_CACHEOPTS;cache オプション PREFERENCES_CACHETHUMBHEIGHT;サムネイル縦の最大値 @@ -1481,6 +1509,16 @@ TP_COLORTONING_LAB;L*a*b*モデルでブレンド TP_COLORTONING_LABEL;カラートーン調整 TP_COLORTONING_LABGRID;L*a*b*カラー補正グリッド TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 +TP_COLORTONING_LABREGIONS;L*a*b*の補正領域 +TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +TP_COLORTONING_LABREGION_CHROMATICITYMASK;色度 +TP_COLORTONING_LABREGION_HUEMASK;色相 +TP_COLORTONING_LABREGION_LIGHTNESS;明度 +TP_COLORTONING_LABREGION_LIGHTNESSMASK;明度 +TP_COLORTONING_LABREGION_LIST_TITLE;補正 +TP_COLORTONING_LABREGION_MASK;マスク +TP_COLORTONING_LABREGION_SATURATION;彩度 +TP_COLORTONING_LABREGION_SHOWMASK;マスクの表示 TP_COLORTONING_LUMA;明度 TP_COLORTONING_LUMAMODE;明度を維持 TP_COLORTONING_LUMAMODE_TOOLTIP;カラー(レッド、グリーン、シアン、ブルーなど)を変える際に、これを有効にすると、各ピクセルの明度は維持されます。 @@ -1529,6 +1567,10 @@ TP_DARKFRAME_LABEL;ダークフレーム TP_DEFRINGE_LABEL;フリンジ低減 TP_DEFRINGE_RADIUS;半径 TP_DEFRINGE_THRESHOLD;しきい値 +TP_DEHAZE_DEPTH;深度 +TP_DEHAZE_LABEL;霞除去 +TP_DEHAZE_SHOW_DEPTH_MAP;深度マップの表示 +TP_DEHAZE_STRENGTH;強さ TP_DIRPYRDENOISE_CHROMINANCE_AMZ;自動(多分割方式) TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;自動(分割方式) TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;色ノイズ低減の効果を確認して下さい\n注意:設定値の計算はあくまで平均的なもので、かなり主観的でです @@ -1840,6 +1882,8 @@ TP_RAW_DMETHOD;方式 TP_RAW_DMETHOD_PROGRESSBAR;%1 デモザイク中... TP_RAW_DMETHOD_PROGRESSBAR_REFINE;デモザイク・リファイン中... TP_RAW_DMETHOD_TOOLTIP;注: IGVとLMMSEは高ISO画像に適しています +TP_RAW_DUALDEMOSAICAUTOCONTRAST;自動しきい値 +TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;チェックボックスを有効にすると(推奨), RawTherapeeは画像の滑らかな部分をベースに最適値を計算します。\n画像に滑らかな部分がない、或いはノイズが非常に多い画像の場合、最適値は0に設定されます。\n最適値を手動で設定する場合は、チェックボックスを無効にします(画像に次第で最適値は異なります)。 TP_RAW_DUALDEMOSAICCONTRAST;コントラストのしきい値 TP_RAW_EAHD;EAHD TP_RAW_FALSECOLOR;偽色抑制処理の回数 @@ -1902,7 +1946,7 @@ TP_RESIZE_HEIGHT;高さ TP_RESIZE_LABEL;リサイズ TP_RESIZE_LANCZOS;ランチョス TP_RESIZE_METHOD;方式: -TP_RESIZE_NEAREST;ニアリスト +TP_RESIZE_NEAREST;ニアレスト TP_RESIZE_SCALE;スケール TP_RESIZE_SPECIFY;条件指定: TP_RESIZE_W;幅: @@ -2036,6 +2080,7 @@ TP_SOFTLIGHT_STRENGTH;強さ TP_TM_FATTAL_AMOUNT;量 TP_TM_FATTAL_ANCHOR;アンカー TP_TM_FATTAL_LABEL;ダイナミックレンジ圧縮 +TP_TM_FATTAL_THRESHOLD;細部 TP_VIBRANCE_AVOIDCOLORSHIFT;色ずれを回避 TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;肌色トーン @@ -2283,48 +2328,3 @@ ZOOMPANEL_ZOOMOUT;ズームアウト\nショートカット: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! -!DYNPROFILEEDITOR_IMGTYPE_ANY;Any -!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR -!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift -!DYNPROFILEEDITOR_IMGTYPE_STD;Standard -!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles -!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles -!HISTORY_MSG_489;DRC - Detail -!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction -!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - C mask -!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask -!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness -!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask -!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List -!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation -!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - Show mask -!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth -!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal -!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map -!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength -!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold -!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace -!PARTIALPASTE_DEHAZE;Haze removal -!PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid color shift -!PREFERENCES_CACHECLEAR;Clear -!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: -!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: -!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: -!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. -!TP_COLORTONING_LABREGIONS;L*a*b* correction regions -!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 -!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C -!TP_COLORTONING_LABREGION_HUEMASK;H -!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness -!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L -!TP_COLORTONING_LABREGION_LIST_TITLE;Correction -!TP_COLORTONING_LABREGION_MASK;Mask -!TP_COLORTONING_LABREGION_SATURATION;Saturation -!TP_COLORTONING_LABREGION_SHOWMASK;Show mask -!TP_DEHAZE_DEPTH;Depth -!TP_DEHAZE_LABEL;Haze Removal -!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map -!TP_DEHAZE_STRENGTH;Strength -!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold -!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the check-box first (reasonable values depend on the image). -!TP_TM_FATTAL_THRESHOLD;Detail From a1d2fcdc2c8ec1b68f4525becffa892f346b038c Mon Sep 17 00:00:00 2001 From: "U-PC-BUREAU\\jacques" Date: Thu, 15 Nov 2018 10:47:45 +0100 Subject: [PATCH 29/60] Add comment for RTv2_Beta usage --- rtgui/iccprofilecreator.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtgui/iccprofilecreator.cc b/rtgui/iccprofilecreator.cc index e0fc1365f..0d16a401a 100644 --- a/rtgui/iccprofilecreator.cc +++ b/rtgui/iccprofilecreator.cc @@ -749,7 +749,7 @@ void ICCProfileCreator::savePressed() } } else { //new model for v2 profile different from D50 by entering directly XYZ values and media white point - sNewProfile = "RTv2_Beta";//for copy + sNewProfile = "RTv2_Beta";//for copy generate others v2 profile. To change date of new profile, I used "ICC profile inspector" and "save as" if (primariesPreset == "ACES-AP0") { sPrimariesPreset = "ACES-AP0"; From 220714e376d00f717525aaca40a914fe9b6a52ca Mon Sep 17 00:00:00 2001 From: heckflosse Date: Thu, 15 Nov 2018 15:35:56 +0100 Subject: [PATCH 30/60] Remove some logging, #4985 --- rtengine/dirpyr_equalizer.cc | 8 -------- rtengine/improccoordinator.cc | 4 ---- rtengine/iplab2rgb.cc | 2 -- rtengine/rawimagesource.cc | 4 ++++ 4 files changed, 4 insertions(+), 14 deletions(-) diff --git a/rtengine/dirpyr_equalizer.cc b/rtengine/dirpyr_equalizer.cc index cbee70763..5e33fd3b3 100644 --- a/rtengine/dirpyr_equalizer.cc +++ b/rtengine/dirpyr_equalizer.cc @@ -44,10 +44,6 @@ void ImProcFunctions :: dirpyr_equalizer(float ** src, float ** dst, int srcwidt { int lastlevel = maxlevel; - if(settings->verbose) { - printf("Dirpyr scaleprev=%i\n", scaleprev); - } - float atten123 = (float) settings->level123_cbdl; if(atten123 > 50.f) { @@ -105,10 +101,6 @@ void ImProcFunctions :: dirpyr_equalizer(float ** src, float ** dst, int srcwidt } - if(settings->verbose) { - printf("CbDL mult0=%f 1=%f 2=%f 3=%f 4=%f 5=%f\n", multi[0], multi[1], multi[2], multi[3], multi[4], multi[5]); - } - multi_array2D dirpyrlo (srcwidth, srcheight); level = 0; diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 2eb72a72b..16d94dd57 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -653,10 +653,6 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) } if (params.colorToning.enabled && params.colorToning.autosat && actListener) { - if (settings->verbose) { - printf("ImProcCoordinator / Auto CT: indi=%d satH=%d satPR=%d\n", indi, (int)colourToningSatLimit, (int) colourToningSatLimitOpacity); - } - actListener->autoColorTonChanged(indi, (int) colourToningSatLimit, (int)colourToningSatLimitOpacity); //change sliders autosat } diff --git a/rtengine/iplab2rgb.cc b/rtengine/iplab2rgb.cc index c4707f16f..b2fd20cb8 100644 --- a/rtengine/iplab2rgb.cc +++ b/rtengine/iplab2rgb.cc @@ -335,8 +335,6 @@ Imagefloat* ImProcFunctions::lab2rgbOut(LabImage* lab, int cx, int cy, int cw, i #endif 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("!"); diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 9b8d3794e..85e68745b 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -894,6 +894,10 @@ void RawImageSource::getImage (const ColorTemp &ctemp, int tran, Imagefloat* ima DCPProfile *RawImageSource::getDCP(const ColorManagementParams &cmp, DCPProfile::ApplyState &as) { + if (cmp.inputProfile == "(camera)" || cmp.inputProfile == "(none)") { + return nullptr; + } + DCPProfile *dcpProf = nullptr; cmsHPROFILE dummy; findInputProfile(cmp.inputProfile, nullptr, (static_cast(getMetaData()))->getCamera(), &dcpProf, dummy); From 6074fe3be4386b276f32baad743236dede0a2460 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Thu, 15 Nov 2018 17:16:55 +0100 Subject: [PATCH 31/60] Do not search lensfun modifier if make, model or lens is empty, #4985 --- rtengine/rtlensfun.cc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/rtengine/rtlensfun.cc b/rtengine/rtlensfun.cc index 50b3c8a66..4856909f7 100644 --- a/rtengine/rtlensfun.cc +++ b/rtengine/rtlensfun.cc @@ -501,7 +501,6 @@ std::unique_ptr LFDatabase::getModifier(const LFCamera &camera, cons std::unique_ptr LFDatabase::findModifier(const LensProfParams &lensProf, const FramesMetaData *idata, int width, int height, const CoarseTransformParams &coarse, int rawRotationDeg) { - const LFDatabase *db = getInstance(); Glib::ustring make, model, lens; float focallen = idata->getFocalLen(); if (lensProf.lfAutoMatch()) { @@ -516,6 +515,11 @@ std::unique_ptr LFDatabase::findModifier(const LensProfParams &lensP model = lensProf.lfCameraModel; lens = lensProf.lfLens; } + if (make.empty() || model.empty() || lens.empty()) { + return nullptr; + } + + const LFDatabase *db = getInstance(); LFCamera c = db->findCamera(make, model); LFLens l = db->findLens(lensProf.lfAutoMatch() ? c : LFCamera(), lens); if (focallen <= 0 && l.data_ && l.data_->MinFocal == l.data_->MaxFocal) { From 7c2953986826d4b977e486590a5f17b6bc97e2f2 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Thu, 15 Nov 2018 18:36:11 +0100 Subject: [PATCH 32/60] Don't log filter settings, #4985 --- rtgui/filecatalog.cc | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/rtgui/filecatalog.cc b/rtgui/filecatalog.cc index 49559f93e..0b45d3e3d 100644 --- a/rtgui/filecatalog.cc +++ b/rtgui/filecatalog.cc @@ -1652,28 +1652,6 @@ BrowserFilter FileCatalog::getFilter () filter.showEdited[i] = anyEditedFilterActive ? bEdited[i]->get_active() : true; filter.showRecentlySaved[i] = anyRecentlySavedFilterActive ? bRecentlySaved[i]->get_active() : true; } - - if( options.rtSettings.verbose ) { - printf ("\n**************** FileCatalog::getFilter *** AFTER STEP 2 \n"); - - for (int i = 0; i <= 5; i++) { - printf ("filter.showRanked[%i] = %i\n", i, filter.showRanked[i]); - } - - for (int i = 0; i <= 5; i++) { - printf ("filter.showCLabeled[%i] = %i\n", i, filter.showCLabeled[i]); - } - - for (int i = 0; i < 2; i++) { - printf ("filter.showEdited[%i] = %i\n", i, filter.showEdited[i]); - } - - for (int i = 0; i < 2; i++) { - printf ("filter.showRecentlySaved[%i] = %i\n", i, filter.showRecentlySaved[i]); - } - - printf ("filter.multiselect = %i\n", filter.multiselect); - } } From 94f4afeb6b5f3b743693139c8c3015b62fde2102 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 16 Nov 2018 14:50:51 +0100 Subject: [PATCH 33/60] Fix two issues reported by coverity --- rtengine/ipdehaze.cc | 1 + rtgui/labgrid.h | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/ipdehaze.cc b/rtengine/ipdehaze.cc index 5522107e0..97c1883c9 100644 --- a/rtengine/ipdehaze.cc +++ b/rtengine/ipdehaze.cc @@ -183,6 +183,7 @@ float estimate_ambient_light(const array2D &R, const array2D &G, c } } } + n = std::max(n, 1); ambient[0] = rr / n; ambient[1] = gg / n; ambient[2] = bb / n; diff --git a/rtgui/labgrid.h b/rtgui/labgrid.h index 35e259996..30f6e76e5 100644 --- a/rtgui/labgrid.h +++ b/rtgui/labgrid.h @@ -66,7 +66,6 @@ private: sigc::connection delayconn; static const int inset = 2; - bool grid_visible; bool low_enabled; bool notifyListener(); From 0b8117ef35422825e88f4855c79c2be0fca7d4fa Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 16 Nov 2018 15:00:20 +0100 Subject: [PATCH 34/60] Change line endings --- rtgui/iccprofilecreator.cc | 2790 ++++++++++++++++++------------------ rtgui/iccprofilecreator.h | 214 +-- 2 files changed, 1502 insertions(+), 1502 deletions(-) diff --git a/rtgui/iccprofilecreator.cc b/rtgui/iccprofilecreator.cc index 0d16a401a..b322fa005 100644 --- a/rtgui/iccprofilecreator.cc +++ b/rtgui/iccprofilecreator.cc @@ -1,1395 +1,1395 @@ -/* - * This file is part of RawTherapee. - * - * Copyright (c) 2018 Jacques DESMIS - * Copyright (c) 2018 Jean-Christophe FRISCH - * - * 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 . - */ -#include -#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 -#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) - , appendParamsToDesc(options.ICCPC_appendParamsToDesc) - , profileVersion(options.ICCPC_profileVersion) - , illuminant(options.ICCPC_illuminant) - , description(options.ICCPC_description) - , copyright(options.ICCPC_copyright) - , parent(rtwindow) -{ - - set_default_size(600, -1); - - Gtk::Grid* mainGrid = Gtk::manage(new Gtk::Grid()); - mainGrid->set_column_spacing(3); - mainGrid->set_row_spacing(3); - - //--------------------------------- 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_CUSTOM")); - 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->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.0800, 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 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); - - //--------------------------------- Description - - Gtk::Label* desclab = Gtk::manage(new Gtk::Label(M("ICCPROFCREATOR_DESCRIPTION"))); - setExpandAlignProperties(desclab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_START); - mainGrid->attach(*desclab, 0, 7, 1, 2); - eDescription = Gtk::manage(new Gtk::Entry()); - setExpandAlignProperties(eDescription, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - eDescription->set_tooltip_text(M("ICCPROFCREATOR_DESCRIPTION_TOOLTIP")); - mainGrid->attach(*eDescription, 1, 7, 1, 1); - cAppendParamsToDesc = Gtk::manage(new Gtk::CheckButton(M("ICCPROFCREATOR_DESCRIPTION_ADDPARAM"))); - setExpandAlignProperties(cAppendParamsToDesc, true, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); - mainGrid->attach(*cAppendParamsToDesc, 1, 8, 1, 1); - - //--------------------------------- Copyright - - Gtk::Label* copylab = Gtk::manage(new Gtk::Label(M("ICCPROFCREATOR_COPYRIGHT"))); - setExpandAlignProperties(copylab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); - mainGrid->attach(*copylab, 0, 9, 1, 1); - Gtk::Grid* copygrid = Gtk::manage(new Gtk::Grid()); - setExpandAlignProperties(copygrid, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); - eCopyright = Gtk::manage(new Gtk::Entry()); - setExpandAlignProperties(eCopyright, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - copygrid->attach(*eCopyright, 0, 0, 1, 1); - resetCopyright = Gtk::manage(new Gtk::Button()); - resetCopyright->add(*Gtk::manage(new RTImage("undo-small.png", "redo-small.png"))); - setExpandAlignProperties(resetCopyright, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); - resetCopyright->set_relief(Gtk::RELIEF_NONE); - resetCopyright->set_tooltip_markup(M("ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP")); - resetCopyright->get_style_context()->add_class(GTK_STYLE_CLASS_FLAT); - resetCopyright->set_can_focus(false); - copygrid->attach(*resetCopyright, 1, 0, 1, 1); - mainGrid->attach(*copygrid, 1, 9, 1, 1); - - //--------------------------------- Adding the mainGrid - - get_content_area()->add(*mainGrid); - - //--------------------------------- Setting default values for Adjusters - - aGamma->setDefault(gamma); - aSlope->setDefault(slope); - aPrimariesRedX->setDefault(redPrimaryX); - aPrimariesRedY->setDefault(redPrimaryY); - aPrimariesGreenX->setDefault(greenPrimaryX); - aPrimariesGreenY->setDefault(greenPrimaryY); - aPrimariesBlueX->setDefault(bluePrimaryX); - aPrimariesBlueY->setDefault(bluePrimaryY); - - //--------------- Updating widgets with actual values (from options) - - if (primariesPreset == "custom") { - primaries->set_active_text(M("ICCPROFCREATOR_CUSTOM")); - } else 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")); - } - - trcPresets->set_active(0); - - if (gammaPreset != "Custom") { - trcPresets->set_active_text(gammaPreset); - } - - aGamma->setValue(gamma); - aSlope->setValue(slope); - aPrimariesRedX->setValue(redPrimaryX); - aPrimariesRedY->setValue(redPrimaryY); - aPrimariesGreenX->setValue(greenPrimaryX); - aPrimariesGreenY->setValue(greenPrimaryY); - aPrimariesBlueX->setValue(bluePrimaryX); - aPrimariesBlueY->setValue(bluePrimaryY); - - eDescription->set_text(description); - eCopyright->set_text(copyright); - cAppendParamsToDesc->set_active(appendParamsToDesc); - - 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)); - resetCopyright->signal_clicked().connect(sigc::mem_fun(*this, &ICCProfileCreator::onResetCopyright)); -} - -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::adjusterChanged(Adjuster* a, double newval) -{ - if (a == aPrimariesRedX || a == aPrimariesRedY || - a == aPrimariesGreenX || a == aPrimariesGreenY || - a == aPrimariesBlueX || a == aPrimariesBlueY) { - if (primaries->get_active_row_number() > 0) { - ConnectionBlocker blocker(primariesconn); - primaries->set_active(0); - updateICCVersion(); - } - } else if (a == aGamma || a == aSlope) { - if (trcPresets->get_active_row_number() > 0) { - ConnectionBlocker blocker(trcpresetsconn); - trcPresets->set_active(0); - } - } -} - -void ICCProfileCreator::adjusterAutoToggled(Adjuster* a, bool newval) -{ -} - -void ICCProfileCreator::primariesChanged() -{ - if (primaries->get_active_row_number() > 0) { - float p[6]; - ColorTemp temp; - Glib::ustring activeValue = primaries->get_active_text(); - Glib::ustring primPresetName = getPrimariesPresetName(activeValue); - getPrimaries(primPresetName, p, temp); - aPrimariesRedX->setValue(p[0]); - aPrimariesRedY->setValue(p[1]); - aPrimariesGreenX->setValue(p[2]); - aPrimariesGreenY->setValue(p[3]); - aPrimariesBlueX->setValue(p[4]); - aPrimariesBlueY->setValue(p[5]); - } - - updateICCVersion(); -} - -void ICCProfileCreator::illuminantChanged() -{ - updateICCVersion(); -} - -void ICCProfileCreator::trcPresetsChanged() -{ - aGamma->block(true); - aSlope->block(true); - - double gamma; - double slope; - getGamma(getGammaPresetName(trcPresets->get_active_text()), gamma, slope); - aGamma->setValue(gamma); - aSlope->setValue(slope); - - 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"; - } - - 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"; - } - - options.ICCPC_primariesPreset = primariesPreset = getPrimariesPresetName(primaries->get_active_text()); - options.ICCPC_gammaPreset = gammaPreset = getGammaPresetName(trcPresets->get_active_text()); - 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(); - options.ICCPC_description = description = eDescription->get_text(); - options.ICCPC_copyright = copyright = eCopyright->get_text(); - options.ICCPC_appendParamsToDesc = appendParamsToDesc = cAppendParamsToDesc->get_active(); -} - -Glib::ustring ICCProfileCreator::getPrimariesPresetName(const Glib::ustring &preset) -{ - if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_ACESP0")) { - return Glib::ustring("ACES-AP0"); - } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_ACESP1")) { - return Glib::ustring("ACES-AP1"); - } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_ADOBE")) { - return Glib::ustring("Adobe"); - } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_PROPH")) { - return Glib::ustring("ProPhoto"); - } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_REC2020")) { - return Glib::ustring("Rec2020"); - } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_SRGB")) { - return Glib::ustring("sRGB"); - } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_WIDEG")) { - return Glib::ustring("Widegamut"); - } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_BEST")) { - return Glib::ustring("BestRGB"); - } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_BETA")) { - return Glib::ustring("BetaRGB"); - } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_BRUCE")) { - return Glib::ustring("BruceRGB"); - } else if (primaries->get_active_text() == M("ICCPROFCREATOR_CUSTOM")) { - return Glib::ustring("custom"); - } else { - return Glib::ustring(); - } -} - -void ICCProfileCreator::getPrimaries(const Glib::ustring &preset, float *p, ColorTemp &temp) -{ - temp = ColorTemp::D50; - - if (preset == "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 (preset == "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 (preset == "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 (preset == "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 (preset == "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 (preset == "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 (preset == "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 (preset == "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 (preset == "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 (preset == "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 (preset == "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; - } -} - -Glib::ustring ICCProfileCreator::getGammaPresetName(const Glib::ustring &preset) -{ - Glib::ustring name(trcPresets->get_active_text()); - - if (name == M("ICCPROFCREATOR_CUSTOM")) { - name = "Custom"; - } - - return name; -} - -void ICCProfileCreator::getGamma(const Glib::ustring &preset, double &presetGamma, double &presetSlope) -{ - if (preset == "High_g1.3_s3.35") { - presetGamma = 1.3; - presetSlope = 3.35; - } else if (preset == "Low_g2.6_s6.9") { - presetGamma = 2.6; - presetSlope = 6.9; - } else if (preset == "sRGB_g2.4_s12.92") { - presetGamma = 2.4; - presetSlope = 12.92310; - } else if (preset == "BT709_g2.2_s4.5") { - presetGamma = 2.22; - presetSlope = 4.5; - } else if (preset == "linear_g1.0") { - presetGamma = 1.; - presetSlope = 0.; - } else if (preset == "standard_g2.2") { - presetGamma = 2.2; - presetSlope = 0.; - } else if (preset == "standard_g1.8") { - presetGamma = 1.8; - presetSlope = 0.; - } else if (preset == "Lab_g3.0s9.03296") { - presetGamma = 3.0; - presetSlope = 9.03296; - } else if (preset == "Custom") { - presetGamma = gamma; - presetSlope = slope; - } else { - presetGamma = 2.4; - presetSlope = 12.92310; - } -} - -void ICCProfileCreator::onResetCopyright() -{ - eCopyright->set_text(Options::getICCProfileCopyright()); -} - -// Copyright (c) 2018 Jacques DESMIS -// WARNING: the caller must lock lcmsMutex -void ICCProfileCreator::savePressed() -{ - cmsHPROFILE newProfile = nullptr; - cmsHPROFILE profile_v2_except = nullptr; - - Glib::ustring sNewProfile; - Glib::ustring sPrimariesPreset; - Glib::ustring sGammaPreset; - - storeValues(); - - // -------------------------------------------- Compute the default file name - // -----------------setmedia white point for monitor profile sRGB or AdobeRGB in case of profile used for monitor--------------------- - //instead of calculations made by LCMS..small differences - bool isD65 = (primariesPreset == "sRGB" || primariesPreset == "Adobe" || primariesPreset == "Rec2020" || primariesPreset == "BruceRGB"); - bool isD60 = (primariesPreset == "ACES-AP1" || primariesPreset == "ACES-AP0"); - bool isD50 = (primariesPreset == "ProPhoto" || primariesPreset == "Widegamut" || primariesPreset == "BestRGB" || primariesPreset == "BetaRGB"); - // v2except = (profileVersion == "v2" && (primariesPreset == "sRGB" || primariesPreset == "Adobe" || primariesPreset == "Rec2020" || primariesPreset == "BruceRGB" || primariesPreset == "ACES-AP1" || primariesPreset == "ACES-AP0") && illuminant == "DEF"); - v2except = (profileVersion == "v2" && (isD65 || isD60 || isD50) && illuminant == "DEF"); - - //necessary for V2 profile - - if (!v2except) { - std::string is_RTv4 = ""; - - //used partially for v4, and in case of if we want to back to old manner for v2 - 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)) { - is_RTv4 = options.rtSettings.prophoto.substr(0, 4); - - if (is_RTv4 == "RTv4") { - options.rtSettings.prophoto = "RTv2_Large"; - }; - - sNewProfile = options.rtSettings.prophoto; - - 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)) { - sNewProfile = options.rtSettings.srgb; - sPrimariesPreset = "sRGB"; - } else if (primariesPreset == "Widegamut" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.widegamut)) { - is_RTv4 = options.rtSettings.widegamut.substr(0, 4); - - if (is_RTv4 == "RTv4") { - options.rtSettings.widegamut = "RTv2_Wide"; - }; - - sNewProfile = options.rtSettings.widegamut; - - sPrimariesPreset = "Wide"; - } else if (primariesPreset == "BestRGB" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.best)) { - is_RTv4 = options.rtSettings.best.substr(0, 4); - - if (is_RTv4 == "RTv4") { - options.rtSettings.best = "RTv2_Best"; - }; - - sNewProfile = options.rtSettings.best; - - sPrimariesPreset = "Best"; - } else if (primariesPreset == "BetaRGB" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.beta)) { - sNewProfile = options.rtSettings.beta; - is_RTv4 = options.rtSettings.beta.substr(0, 4); - - if (is_RTv4 == "RTv4") { - options.rtSettings.widegamut = "RTv2_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; - } - } else { - //new model for v2 profile different from D50 by entering directly XYZ values and media white point - sNewProfile = "RTv2_Beta";//for copy generate others v2 profile. To change date of new profile, I used "ICC profile inspector" and "save as" - - if (primariesPreset == "ACES-AP0") { - sPrimariesPreset = "ACES-AP0"; - } else if (primariesPreset == "ACES-AP1") { - sPrimariesPreset = "ACES-AP1"; - } else if (primariesPreset == "Adobe") { - sPrimariesPreset = "Medium"; - } else if (primariesPreset == "Rec2020") { - sPrimariesPreset = "Rec2020"; - } else if (primariesPreset == "BruceRGB") { - sPrimariesPreset = "Bruce"; - } else if (primariesPreset == "sRGB") { - sPrimariesPreset = "sRGB"; - } else if (primariesPreset == "ProPhoto") { - sPrimariesPreset = "Large"; - } else if (primariesPreset == "Widegamut") { - sPrimariesPreset = "Wide"; - } else if (primariesPreset == "BestRGB") { - sPrimariesPreset = "Best"; - } else if (primariesPreset == "BetaRGB") { - sPrimariesPreset = "Beta"; - } - } - - //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()); - } - - if (!v2except) { - newProfile = rtengine::ICCStore::getInstance()->getProfile(sNewProfile); //get output profile - } else { - profile_v2_except = 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; - } - */ - //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 - getGamma(gammaPreset, presetGamma, presetSlope); - - if (gammaPreset == "High_g1.3_s3.35") { - sGammaPreset = "High_g=1.3_s=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"; - 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"; - 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"; - 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"; - 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"; - 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"; - 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"; - 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; - } - - Glib::ustring profileDesc; - Glib::ustring sGammaSlopeParam;//to save gamma and slope in a dmdd - Glib::ustring sGammaSlopeDesc; //to save gamma and slope in a desc - Glib::ustring sGamma; - Glib::ustring sSlope; - - if (gammaPreset == "Custom") { - sGamma = Glib::ustring::format(std::setw(3), std::fixed, std::setprecision(2), gamma); - sSlope = Glib::ustring::format(std::setw(6), std::fixed, std::setprecision(5), slope); - fName = Glib::ustring::compose("RT%1_%2_g%3_s%4.icc", profileVersion, sPrimariesAndIlluminant, sGamma, sSlope); - profileDesc = sPrimariesPreset; - } else { - sGamma = Glib::ustring::format(std::setw(3), std::fixed, std::setprecision(2), presetGamma); - sSlope = Glib::ustring::format(std::setw(6), std::fixed, std::setprecision(5), presetSlope); - fName = Glib::ustring::compose("RT%1_%2_%3.icc", profileVersion, sPrimariesAndIlluminant, sGammaPreset); - profileDesc = sPrimariesPreset + sGammaPreset; - } - - sGammaSlopeParam = Glib::ustring::compose("g%1s%2!", sGamma, sSlope); - sGammaSlopeDesc = Glib::ustring::compose("g=%1 s=%2", sGamma, 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 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 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); - - // --------------- main tags ------------------ - /* - if (profileVersion == "v4") { - cmsSetProfileVersion(newProfile, 4.3); - } else { - cmsSetProfileVersion(newProfile, 2.0); - } - */ - -//change - float p[6]; //primaries - ga[6] = 0.0; - - ColorTemp temp; - getPrimaries(primariesPreset, p, temp); - - 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 - }; - - - if (v2except) { - cmsSetDeviceClass(profile_v2_except, cmsSigDisplayClass); - cmsSetPCS(profile_v2_except, cmsSigXYZData); - cmsSetHeaderRenderingIntent(profile_v2_except, 0); - } - - - if (profileVersion == "v4" && illuminant != "DEF") { - double tempv4 = 5000.; - - 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.; - } - - cmsWhitePointFromTemp(&xyD, tempv4); - - if (illuminant == "D65") { - xyD = {0.312700492, 0.329000939, 1.0}; - } - - if (illuminant == "D60") { - xyD = {0.32168, 0.33767, 1.0}; - } - - if (illuminant == "D50") { - xyD = {0.3457, 0.3585, 1.0};//white D50 near LCMS values but not perfect...it's a compromise!! - } - - if (illuminant == "stdA") { - xyD = {0.447573, 0.407440, 1.0}; - } - - - } else { - if (v2except) { - - cmsCIEXYZ XYZ; - - { - XYZ = {0.95045471, 1.0, 1.08905029};//white D65 - } - - if (primariesPreset == "ACES-AP1" || primariesPreset == "ACES-AP0") { - XYZ = {0.952646075, 1.0, 1.008825184};//white D60 - } - - if (isD50) { - XYZ = {0.964295676, 1.0, 0.825104603};//white D50 room (prophoto) near LCMS values but not perfect...it's a compromise!! - } - - cmsCIExyY blackpoint; - - { - blackpoint = {0., 0., 0.};//White D65 point from the sRGB.icm and AdobeRGB1998 profile specs - } - - cmsWriteTag(profile_v2_except, cmsSigMediaBlackPointTag, &blackpoint); - cmsWriteTag(profile_v2_except, cmsSigMediaWhitePointTag, &XYZ); - cmsCIEXYZ rt; - cmsCIEXYZ bt; - cmsCIEXYZ gt; - - if (primariesPreset == "sRGB") { - //calculated with personnal special spreadsheat - { - //Matrix value from spec Adobe but adapted with wp - rt = {0.4360411843, 0.2224843154, 0.0139201582}; - cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {0.1430457992, 0.0606099658, 0.7139121724}; - cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.3851136574, 0.7169049862, 0.0970677661}; - cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); - - } - - } - - if (primariesPreset == "Adobe") { - { - //Adobe spec adapted with wp calculated with personnal special spreadsheat - rt = {0.6097408852, 0.3111123176, 0.0194653393}; - cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {0.1491866649, 0.0632119133, 0.7445599707}; - cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.2052730908, 0.6256750365, 0.0608747867}; - cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); - } - } - - if (primariesPreset == "Rec2020") { - {//calculated with personnal special spreadsheat - rt = {0.6734800343, 0.2790423273, -0.0019336766}; - cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {0.1250489478, 0.0456126910, 0.7968509159}; - cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.1656716588, 0.6753442491, 0.0299828575}; - cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); - } - } - - if (primariesPreset == "BruceRGB") { - {//calculated with personnal special spreadsheat - rt = {0.4941542253, 0.2521357351, 0.0157753562}; - cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {0.1495175342, 0.0633521060, 0.7462112712}; - cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.3205288814, 0.6845114263, 0.0629134693}; - cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); - } - } - - if (primariesPreset == "ACES-AP0") { - {//calculated with personnal special spreadsheat - rt = {0.9908835135, 0.3618940325, -0.0027137400}; - cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {-0.0389246557, -0.084405166, 0.8193659780}; - cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.0122417831, 0.7225104015, 0.0082478587}; - cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); - } - } - - if (primariesPreset == "ACES-AP1") {//done - {//calculated with personnal special spreadsheat - rt = {0.6898756188, 0.2845109670, -0.0060455375}; - cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {0.1245615936, 0.0437959432, 0.8209388333}; - cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.1497634285, 0.6716923572, 0.0100068009}; - cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); - } - } - - if (primariesPreset == "ProPhoto") { - {//calculated with personnal special spreadsheat - rt = {0.7977198204, 0.2880493171, -0.0000030551}; - cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {0.0313194091, 0.0000771282, 0.8248890748}; - cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.1351614114, 0.7118728221, 0.0000140770}; - cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); - } - } - - if (primariesPreset == "Widegamut") { - {//calculated with personnal special spreadsheat - rt = {0.7161680478, 0.2582038074, -0.0000027515}; - cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {0.1471328469, 0.0168600579, 0.7731227232}; - cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.1008997462, 0.7249354021, 0.0517801251}; - cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); - } - } - - if (primariesPreset == "BestRGB") { - {//calculated with personnal special spreadsheat - rt = {0.6327383009, 0.2284760022, -0.0000024233}; - cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {0.1269437333, 0.0341753604, 0.8153773703}; - cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.2045186067, 0.7373479048, 0.0095251497}; - cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); - } - } - - if (primariesPreset == "BetaRGB") { - {//calculated with personnal special spreadsheat - rt = {0.6713200674, 0.3033034560, -0.0000012307}; - cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {0.1183343909, 0.0329265310, 0.7842009909}; - cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.1745461827, 0.6637692805, 0.0407003365}; - cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); - } - } - - } else { - cmsWhitePointFromTemp(&xyD, (double)temp); - } - } - - - if (isD65 && illuminant == "DEF") { - xyD = {0.312700492, 0.329000939, 1.0}; - } - - if (isD60 && illuminant == "DEF") { - xyD = {0.32168, 0.33767, 1.0}; - } - - if (isD50 && illuminant == "DEF") { - xyD = {0.3457, 0.3585, 1.0}; - } - -// {0.3457, 0.3585, 1.0}; - // Calculate output profile's rTRC gTRC bTRC - - - cmsToneCurve* GammaTRC[3]; - - if (gammaPreset != "standard_g2.2" || gammaPreset != "standard_g1.8" || gammaPreset != "linear_g1.0") { - GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildParametricToneCurve(nullptr, 5, ga); - } - - if (gammaPreset == "standard_g2.2") { - GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildGamma(NULL, 2.19921875);//spec Adobe - } - - if (gammaPreset == "standard_g1.8") { - GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildGamma(NULL, 1.80078125); - } - - if (gammaPreset == "linear_g1.0") { - GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildGamma(NULL, 1.0); - } - - - - if (profileVersion == "v4") { - newProfile = cmsCreateRGBProfile(&xyD, &Primaries, GammaTRC); - } - - if (profileVersion == "v2") { - if (v2except) { - cmsSetProfileVersion(profile_v2_except, 2.2); - } else { - cmsSetProfileVersion(newProfile, 2.2); - } - } - - if (!v2except) { - cmsWriteTag(newProfile, cmsSigRedTRCTag, GammaTRC[0]); - cmsWriteTag(newProfile, cmsSigGreenTRCTag, GammaTRC[1]); - cmsWriteTag(newProfile, cmsSigBlueTRCTag, GammaTRC[2]); - } else { - cmsWriteTag(profile_v2_except, cmsSigRedTRCTag, GammaTRC[0]); - cmsWriteTag(profile_v2_except, cmsSigGreenTRCTag, GammaTRC[1]); - cmsWriteTag(profile_v2_except, cmsSigBlueTRCTag, GammaTRC[2]); - } - - // --------------- set dmnd tag ------------------ - - cmsMLU *dmnd; - dmnd = cmsMLUalloc(nullptr, 1); - cmsMLUsetASCII(dmnd, "en", "US", "RawTherapee"); - - if (!v2except) { - cmsWriteTag(newProfile, cmsSigDeviceMfgDescTag, dmnd); - } else { - cmsWriteTag(profile_v2_except, cmsSigDeviceMfgDescTag, dmnd); - } - - cmsMLUfree(dmnd); - - - -// --------------- set dmdd tag ------------------ - - if (profileVersion == "v2") { - //write in tag 'dmdd' values of current gamma and slope to retrieve after in Output profile - std::wostringstream wGammaSlopeParam; - wGammaSlopeParam << sGammaSlopeParam; - - cmsMLU *dmdd = cmsMLUalloc(nullptr, 1); - - // Language code (2 letters code) : https://www.iso.org/obp/ui/ - // Country code (2 letters code) : http://www.loc.gov/standards/iso639-2/php/code_list.php - if (sGammaSlopeParam.is_ascii()) { - if (cmsMLUsetASCII(dmdd, "en", "US", sGammaSlopeParam.c_str())) { - if (!v2except) { - if (!cmsWriteTag(newProfile, cmsSigProfileDescriptionTag, dmdd)) { - printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); - } - } else { - if (!cmsWriteTag(profile_v2_except, cmsSigProfileDescriptionTag, dmdd)) { - printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); - } - - } - } - } else if (cmsMLUsetWide(dmdd, "en", "US", wGammaSlopeParam.str().c_str())) { - if (!v2except) { - if (!cmsWriteTag(newProfile, cmsSigDeviceModelDescTag, dmdd)) { - printf("Error: Can't write cmsSigDeviceModelDescTag!\n"); - } - } else { - if (!cmsWriteTag(profile_v2_except, cmsSigDeviceModelDescTag, dmdd)) { - printf("Error: Can't write cmsSigDeviceModelDescTag!\n"); - } - } - } else { - printf("Error: cmsMLUsetWide failed for dmdd \"%s\" !\n", sGammaSlopeParam.c_str()); - } - - cmsMLUfree(dmdd); - } - -// --------------- set desc tag ------------------ - - Glib::ustring sDescription; - - if (!description.empty()) { - if (cAppendParamsToDesc->get_active()) { - sDescription = description + " / " + sGammaSlopeDesc; - } else { - sDescription = description; - } - } else { - if (cAppendParamsToDesc->get_active()) { - sDescription = profileDesc + " / " + sGammaSlopeDesc; - } else { - sDescription = profileDesc; - } - } - -//write in tag 'dmdd' values of current gamma and slope to retrieve after in Output profile - std::wostringstream wDescription; - wDescription << sDescription; - - cmsMLU *descMLU = cmsMLUalloc(nullptr, 1); - -// Language code (2 letters code) : https://www.iso.org/obp/ui/ -// Country code (2 letters code) : http://www.loc.gov/standards/iso639-2/php/code_list.php - if (sDescription.is_ascii()) { - if (cmsMLUsetASCII(descMLU, "en", "US", sDescription.c_str())) { - if (!v2except) { - if (!cmsWriteTag(newProfile, cmsSigProfileDescriptionTag, descMLU)) { - printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); - } - } else { - if (!cmsWriteTag(profile_v2_except, cmsSigProfileDescriptionTag, descMLU)) { - printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); - } - } - } - - } else if (cmsMLUsetWide(descMLU, "en", "US", wDescription.str().c_str())) { - if (!v2except) { - - if (!cmsWriteTag(newProfile, cmsSigProfileDescriptionTag, descMLU)) { - printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); - } - } else { - if (!cmsWriteTag(profile_v2_except, cmsSigProfileDescriptionTag, descMLU)) { - printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); - } - } - } else { - printf("Error: cmsMLUsetWide failed for desc \"%s\" !\n", sDescription.c_str()); - } - - cmsMLUfree(descMLU); - -// --------------- set cprt tag ------------------ - - std::wostringstream wCopyright; - wCopyright << copyright; - - cmsMLU *copyMLU = cmsMLUalloc(nullptr, 1); - - if (cmsMLUsetWide(copyMLU, "en", "US", wCopyright.str().c_str())) { - if (!v2except) { - - if (!cmsWriteTag(newProfile, cmsSigCopyrightTag, copyMLU)) { - printf("Error: Can't write cmsSigCopyrightTag!\n"); - } - } else { - if (!cmsWriteTag(profile_v2_except, cmsSigCopyrightTag, copyMLU)) { - printf("Error: Can't write cmsSigCopyrightTag!\n"); - } - - } - } else { - printf("Error: cmsMLUsetWide failed for cprt \"%s\" !\n", copyright.c_str()); - } - - cmsMLUfree(copyMLU); - - - /* //to read XYZ values - cmsCIEXYZ *redT = static_cast(cmsReadTag(newProfile, cmsSigRedMatrixColumnTag)); - cmsCIEXYZ *greenT = static_cast(cmsReadTag(newProfile, cmsSigGreenMatrixColumnTag)); - cmsCIEXYZ *blueT = static_cast(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); - */ - if (!v2except) { - cmsSaveProfileToFile(newProfile, absoluteFName.c_str()); - } else { - cmsSaveProfileToFile(profile_v2_except, absoluteFName.c_str()); - - } - - cmsFreeToneCurve(GammaTRC[0]); -} +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2018 Jacques DESMIS + * Copyright (c) 2018 Jean-Christophe FRISCH + * + * 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 . + */ +#include +#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 +#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) + , appendParamsToDesc(options.ICCPC_appendParamsToDesc) + , profileVersion(options.ICCPC_profileVersion) + , illuminant(options.ICCPC_illuminant) + , description(options.ICCPC_description) + , copyright(options.ICCPC_copyright) + , parent(rtwindow) +{ + + set_default_size(600, -1); + + Gtk::Grid* mainGrid = Gtk::manage(new Gtk::Grid()); + mainGrid->set_column_spacing(3); + mainGrid->set_row_spacing(3); + + //--------------------------------- 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_CUSTOM")); + 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->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.0800, 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 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); + + //--------------------------------- Description + + Gtk::Label* desclab = Gtk::manage(new Gtk::Label(M("ICCPROFCREATOR_DESCRIPTION"))); + setExpandAlignProperties(desclab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_START); + mainGrid->attach(*desclab, 0, 7, 1, 2); + eDescription = Gtk::manage(new Gtk::Entry()); + setExpandAlignProperties(eDescription, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + eDescription->set_tooltip_text(M("ICCPROFCREATOR_DESCRIPTION_TOOLTIP")); + mainGrid->attach(*eDescription, 1, 7, 1, 1); + cAppendParamsToDesc = Gtk::manage(new Gtk::CheckButton(M("ICCPROFCREATOR_DESCRIPTION_ADDPARAM"))); + setExpandAlignProperties(cAppendParamsToDesc, true, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); + mainGrid->attach(*cAppendParamsToDesc, 1, 8, 1, 1); + + //--------------------------------- Copyright + + Gtk::Label* copylab = Gtk::manage(new Gtk::Label(M("ICCPROFCREATOR_COPYRIGHT"))); + setExpandAlignProperties(copylab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); + mainGrid->attach(*copylab, 0, 9, 1, 1); + Gtk::Grid* copygrid = Gtk::manage(new Gtk::Grid()); + setExpandAlignProperties(copygrid, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + eCopyright = Gtk::manage(new Gtk::Entry()); + setExpandAlignProperties(eCopyright, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + copygrid->attach(*eCopyright, 0, 0, 1, 1); + resetCopyright = Gtk::manage(new Gtk::Button()); + resetCopyright->add(*Gtk::manage(new RTImage("undo-small.png", "redo-small.png"))); + setExpandAlignProperties(resetCopyright, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); + resetCopyright->set_relief(Gtk::RELIEF_NONE); + resetCopyright->set_tooltip_markup(M("ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP")); + resetCopyright->get_style_context()->add_class(GTK_STYLE_CLASS_FLAT); + resetCopyright->set_can_focus(false); + copygrid->attach(*resetCopyright, 1, 0, 1, 1); + mainGrid->attach(*copygrid, 1, 9, 1, 1); + + //--------------------------------- Adding the mainGrid + + get_content_area()->add(*mainGrid); + + //--------------------------------- Setting default values for Adjusters + + aGamma->setDefault(gamma); + aSlope->setDefault(slope); + aPrimariesRedX->setDefault(redPrimaryX); + aPrimariesRedY->setDefault(redPrimaryY); + aPrimariesGreenX->setDefault(greenPrimaryX); + aPrimariesGreenY->setDefault(greenPrimaryY); + aPrimariesBlueX->setDefault(bluePrimaryX); + aPrimariesBlueY->setDefault(bluePrimaryY); + + //--------------- Updating widgets with actual values (from options) + + if (primariesPreset == "custom") { + primaries->set_active_text(M("ICCPROFCREATOR_CUSTOM")); + } else 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")); + } + + trcPresets->set_active(0); + + if (gammaPreset != "Custom") { + trcPresets->set_active_text(gammaPreset); + } + + aGamma->setValue(gamma); + aSlope->setValue(slope); + aPrimariesRedX->setValue(redPrimaryX); + aPrimariesRedY->setValue(redPrimaryY); + aPrimariesGreenX->setValue(greenPrimaryX); + aPrimariesGreenY->setValue(greenPrimaryY); + aPrimariesBlueX->setValue(bluePrimaryX); + aPrimariesBlueY->setValue(bluePrimaryY); + + eDescription->set_text(description); + eCopyright->set_text(copyright); + cAppendParamsToDesc->set_active(appendParamsToDesc); + + 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)); + resetCopyright->signal_clicked().connect(sigc::mem_fun(*this, &ICCProfileCreator::onResetCopyright)); +} + +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::adjusterChanged(Adjuster* a, double newval) +{ + if (a == aPrimariesRedX || a == aPrimariesRedY || + a == aPrimariesGreenX || a == aPrimariesGreenY || + a == aPrimariesBlueX || a == aPrimariesBlueY) { + if (primaries->get_active_row_number() > 0) { + ConnectionBlocker blocker(primariesconn); + primaries->set_active(0); + updateICCVersion(); + } + } else if (a == aGamma || a == aSlope) { + if (trcPresets->get_active_row_number() > 0) { + ConnectionBlocker blocker(trcpresetsconn); + trcPresets->set_active(0); + } + } +} + +void ICCProfileCreator::adjusterAutoToggled(Adjuster* a, bool newval) +{ +} + +void ICCProfileCreator::primariesChanged() +{ + if (primaries->get_active_row_number() > 0) { + float p[6]; + ColorTemp temp; + Glib::ustring activeValue = primaries->get_active_text(); + Glib::ustring primPresetName = getPrimariesPresetName(activeValue); + getPrimaries(primPresetName, p, temp); + aPrimariesRedX->setValue(p[0]); + aPrimariesRedY->setValue(p[1]); + aPrimariesGreenX->setValue(p[2]); + aPrimariesGreenY->setValue(p[3]); + aPrimariesBlueX->setValue(p[4]); + aPrimariesBlueY->setValue(p[5]); + } + + updateICCVersion(); +} + +void ICCProfileCreator::illuminantChanged() +{ + updateICCVersion(); +} + +void ICCProfileCreator::trcPresetsChanged() +{ + aGamma->block(true); + aSlope->block(true); + + double gamma; + double slope; + getGamma(getGammaPresetName(trcPresets->get_active_text()), gamma, slope); + aGamma->setValue(gamma); + aSlope->setValue(slope); + + 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"; + } + + 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"; + } + + options.ICCPC_primariesPreset = primariesPreset = getPrimariesPresetName(primaries->get_active_text()); + options.ICCPC_gammaPreset = gammaPreset = getGammaPresetName(trcPresets->get_active_text()); + 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(); + options.ICCPC_description = description = eDescription->get_text(); + options.ICCPC_copyright = copyright = eCopyright->get_text(); + options.ICCPC_appendParamsToDesc = appendParamsToDesc = cAppendParamsToDesc->get_active(); +} + +Glib::ustring ICCProfileCreator::getPrimariesPresetName(const Glib::ustring &preset) +{ + if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_ACESP0")) { + return Glib::ustring("ACES-AP0"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_ACESP1")) { + return Glib::ustring("ACES-AP1"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_ADOBE")) { + return Glib::ustring("Adobe"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_PROPH")) { + return Glib::ustring("ProPhoto"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_REC2020")) { + return Glib::ustring("Rec2020"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_SRGB")) { + return Glib::ustring("sRGB"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_WIDEG")) { + return Glib::ustring("Widegamut"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_BEST")) { + return Glib::ustring("BestRGB"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_BETA")) { + return Glib::ustring("BetaRGB"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_BRUCE")) { + return Glib::ustring("BruceRGB"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_CUSTOM")) { + return Glib::ustring("custom"); + } else { + return Glib::ustring(); + } +} + +void ICCProfileCreator::getPrimaries(const Glib::ustring &preset, float *p, ColorTemp &temp) +{ + temp = ColorTemp::D50; + + if (preset == "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 (preset == "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 (preset == "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 (preset == "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 (preset == "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 (preset == "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 (preset == "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 (preset == "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 (preset == "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 (preset == "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 (preset == "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; + } +} + +Glib::ustring ICCProfileCreator::getGammaPresetName(const Glib::ustring &preset) +{ + Glib::ustring name(trcPresets->get_active_text()); + + if (name == M("ICCPROFCREATOR_CUSTOM")) { + name = "Custom"; + } + + return name; +} + +void ICCProfileCreator::getGamma(const Glib::ustring &preset, double &presetGamma, double &presetSlope) +{ + if (preset == "High_g1.3_s3.35") { + presetGamma = 1.3; + presetSlope = 3.35; + } else if (preset == "Low_g2.6_s6.9") { + presetGamma = 2.6; + presetSlope = 6.9; + } else if (preset == "sRGB_g2.4_s12.92") { + presetGamma = 2.4; + presetSlope = 12.92310; + } else if (preset == "BT709_g2.2_s4.5") { + presetGamma = 2.22; + presetSlope = 4.5; + } else if (preset == "linear_g1.0") { + presetGamma = 1.; + presetSlope = 0.; + } else if (preset == "standard_g2.2") { + presetGamma = 2.2; + presetSlope = 0.; + } else if (preset == "standard_g1.8") { + presetGamma = 1.8; + presetSlope = 0.; + } else if (preset == "Lab_g3.0s9.03296") { + presetGamma = 3.0; + presetSlope = 9.03296; + } else if (preset == "Custom") { + presetGamma = gamma; + presetSlope = slope; + } else { + presetGamma = 2.4; + presetSlope = 12.92310; + } +} + +void ICCProfileCreator::onResetCopyright() +{ + eCopyright->set_text(Options::getICCProfileCopyright()); +} + +// Copyright (c) 2018 Jacques DESMIS +// WARNING: the caller must lock lcmsMutex +void ICCProfileCreator::savePressed() +{ + cmsHPROFILE newProfile = nullptr; + cmsHPROFILE profile_v2_except = nullptr; + + Glib::ustring sNewProfile; + Glib::ustring sPrimariesPreset; + Glib::ustring sGammaPreset; + + storeValues(); + + // -------------------------------------------- Compute the default file name + // -----------------setmedia white point for monitor profile sRGB or AdobeRGB in case of profile used for monitor--------------------- + //instead of calculations made by LCMS..small differences + bool isD65 = (primariesPreset == "sRGB" || primariesPreset == "Adobe" || primariesPreset == "Rec2020" || primariesPreset == "BruceRGB"); + bool isD60 = (primariesPreset == "ACES-AP1" || primariesPreset == "ACES-AP0"); + bool isD50 = (primariesPreset == "ProPhoto" || primariesPreset == "Widegamut" || primariesPreset == "BestRGB" || primariesPreset == "BetaRGB"); + // v2except = (profileVersion == "v2" && (primariesPreset == "sRGB" || primariesPreset == "Adobe" || primariesPreset == "Rec2020" || primariesPreset == "BruceRGB" || primariesPreset == "ACES-AP1" || primariesPreset == "ACES-AP0") && illuminant == "DEF"); + v2except = (profileVersion == "v2" && (isD65 || isD60 || isD50) && illuminant == "DEF"); + + //necessary for V2 profile + + if (!v2except) { + std::string is_RTv4 = ""; + + //used partially for v4, and in case of if we want to back to old manner for v2 + 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)) { + is_RTv4 = options.rtSettings.prophoto.substr(0, 4); + + if (is_RTv4 == "RTv4") { + options.rtSettings.prophoto = "RTv2_Large"; + }; + + sNewProfile = options.rtSettings.prophoto; + + 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)) { + sNewProfile = options.rtSettings.srgb; + sPrimariesPreset = "sRGB"; + } else if (primariesPreset == "Widegamut" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.widegamut)) { + is_RTv4 = options.rtSettings.widegamut.substr(0, 4); + + if (is_RTv4 == "RTv4") { + options.rtSettings.widegamut = "RTv2_Wide"; + }; + + sNewProfile = options.rtSettings.widegamut; + + sPrimariesPreset = "Wide"; + } else if (primariesPreset == "BestRGB" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.best)) { + is_RTv4 = options.rtSettings.best.substr(0, 4); + + if (is_RTv4 == "RTv4") { + options.rtSettings.best = "RTv2_Best"; + }; + + sNewProfile = options.rtSettings.best; + + sPrimariesPreset = "Best"; + } else if (primariesPreset == "BetaRGB" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.beta)) { + sNewProfile = options.rtSettings.beta; + is_RTv4 = options.rtSettings.beta.substr(0, 4); + + if (is_RTv4 == "RTv4") { + options.rtSettings.widegamut = "RTv2_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; + } + } else { + //new model for v2 profile different from D50 by entering directly XYZ values and media white point + sNewProfile = "RTv2_Beta";//for copy generate others v2 profile. To change date of new profile, I used "ICC profile inspector" and "save as" + + if (primariesPreset == "ACES-AP0") { + sPrimariesPreset = "ACES-AP0"; + } else if (primariesPreset == "ACES-AP1") { + sPrimariesPreset = "ACES-AP1"; + } else if (primariesPreset == "Adobe") { + sPrimariesPreset = "Medium"; + } else if (primariesPreset == "Rec2020") { + sPrimariesPreset = "Rec2020"; + } else if (primariesPreset == "BruceRGB") { + sPrimariesPreset = "Bruce"; + } else if (primariesPreset == "sRGB") { + sPrimariesPreset = "sRGB"; + } else if (primariesPreset == "ProPhoto") { + sPrimariesPreset = "Large"; + } else if (primariesPreset == "Widegamut") { + sPrimariesPreset = "Wide"; + } else if (primariesPreset == "BestRGB") { + sPrimariesPreset = "Best"; + } else if (primariesPreset == "BetaRGB") { + sPrimariesPreset = "Beta"; + } + } + + //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()); + } + + if (!v2except) { + newProfile = rtengine::ICCStore::getInstance()->getProfile(sNewProfile); //get output profile + } else { + profile_v2_except = 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; + } + */ + //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 + getGamma(gammaPreset, presetGamma, presetSlope); + + if (gammaPreset == "High_g1.3_s3.35") { + sGammaPreset = "High_g=1.3_s=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"; + 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"; + 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"; + 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"; + 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"; + 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"; + 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"; + 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; + } + + Glib::ustring profileDesc; + Glib::ustring sGammaSlopeParam;//to save gamma and slope in a dmdd + Glib::ustring sGammaSlopeDesc; //to save gamma and slope in a desc + Glib::ustring sGamma; + Glib::ustring sSlope; + + if (gammaPreset == "Custom") { + sGamma = Glib::ustring::format(std::setw(3), std::fixed, std::setprecision(2), gamma); + sSlope = Glib::ustring::format(std::setw(6), std::fixed, std::setprecision(5), slope); + fName = Glib::ustring::compose("RT%1_%2_g%3_s%4.icc", profileVersion, sPrimariesAndIlluminant, sGamma, sSlope); + profileDesc = sPrimariesPreset; + } else { + sGamma = Glib::ustring::format(std::setw(3), std::fixed, std::setprecision(2), presetGamma); + sSlope = Glib::ustring::format(std::setw(6), std::fixed, std::setprecision(5), presetSlope); + fName = Glib::ustring::compose("RT%1_%2_%3.icc", profileVersion, sPrimariesAndIlluminant, sGammaPreset); + profileDesc = sPrimariesPreset + sGammaPreset; + } + + sGammaSlopeParam = Glib::ustring::compose("g%1s%2!", sGamma, sSlope); + sGammaSlopeDesc = Glib::ustring::compose("g=%1 s=%2", sGamma, 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 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 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); + + // --------------- main tags ------------------ + /* + if (profileVersion == "v4") { + cmsSetProfileVersion(newProfile, 4.3); + } else { + cmsSetProfileVersion(newProfile, 2.0); + } + */ + +//change + float p[6]; //primaries + ga[6] = 0.0; + + ColorTemp temp; + getPrimaries(primariesPreset, p, temp); + + 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 + }; + + + if (v2except) { + cmsSetDeviceClass(profile_v2_except, cmsSigDisplayClass); + cmsSetPCS(profile_v2_except, cmsSigXYZData); + cmsSetHeaderRenderingIntent(profile_v2_except, 0); + } + + + if (profileVersion == "v4" && illuminant != "DEF") { + double tempv4 = 5000.; + + 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.; + } + + cmsWhitePointFromTemp(&xyD, tempv4); + + if (illuminant == "D65") { + xyD = {0.312700492, 0.329000939, 1.0}; + } + + if (illuminant == "D60") { + xyD = {0.32168, 0.33767, 1.0}; + } + + if (illuminant == "D50") { + xyD = {0.3457, 0.3585, 1.0};//white D50 near LCMS values but not perfect...it's a compromise!! + } + + if (illuminant == "stdA") { + xyD = {0.447573, 0.407440, 1.0}; + } + + + } else { + if (v2except) { + + cmsCIEXYZ XYZ; + + { + XYZ = {0.95045471, 1.0, 1.08905029};//white D65 + } + + if (primariesPreset == "ACES-AP1" || primariesPreset == "ACES-AP0") { + XYZ = {0.952646075, 1.0, 1.008825184};//white D60 + } + + if (isD50) { + XYZ = {0.964295676, 1.0, 0.825104603};//white D50 room (prophoto) near LCMS values but not perfect...it's a compromise!! + } + + cmsCIExyY blackpoint; + + { + blackpoint = {0., 0., 0.};//White D65 point from the sRGB.icm and AdobeRGB1998 profile specs + } + + cmsWriteTag(profile_v2_except, cmsSigMediaBlackPointTag, &blackpoint); + cmsWriteTag(profile_v2_except, cmsSigMediaWhitePointTag, &XYZ); + cmsCIEXYZ rt; + cmsCIEXYZ bt; + cmsCIEXYZ gt; + + if (primariesPreset == "sRGB") { + //calculated with personnal special spreadsheat + { + //Matrix value from spec Adobe but adapted with wp + rt = {0.4360411843, 0.2224843154, 0.0139201582}; + cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); + bt = {0.1430457992, 0.0606099658, 0.7139121724}; + cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); + gt = {0.3851136574, 0.7169049862, 0.0970677661}; + cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); + + } + + } + + if (primariesPreset == "Adobe") { + { + //Adobe spec adapted with wp calculated with personnal special spreadsheat + rt = {0.6097408852, 0.3111123176, 0.0194653393}; + cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); + bt = {0.1491866649, 0.0632119133, 0.7445599707}; + cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); + gt = {0.2052730908, 0.6256750365, 0.0608747867}; + cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); + } + } + + if (primariesPreset == "Rec2020") { + {//calculated with personnal special spreadsheat + rt = {0.6734800343, 0.2790423273, -0.0019336766}; + cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); + bt = {0.1250489478, 0.0456126910, 0.7968509159}; + cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); + gt = {0.1656716588, 0.6753442491, 0.0299828575}; + cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); + } + } + + if (primariesPreset == "BruceRGB") { + {//calculated with personnal special spreadsheat + rt = {0.4941542253, 0.2521357351, 0.0157753562}; + cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); + bt = {0.1495175342, 0.0633521060, 0.7462112712}; + cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); + gt = {0.3205288814, 0.6845114263, 0.0629134693}; + cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); + } + } + + if (primariesPreset == "ACES-AP0") { + {//calculated with personnal special spreadsheat + rt = {0.9908835135, 0.3618940325, -0.0027137400}; + cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); + bt = {-0.0389246557, -0.084405166, 0.8193659780}; + cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); + gt = {0.0122417831, 0.7225104015, 0.0082478587}; + cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); + } + } + + if (primariesPreset == "ACES-AP1") {//done + {//calculated with personnal special spreadsheat + rt = {0.6898756188, 0.2845109670, -0.0060455375}; + cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); + bt = {0.1245615936, 0.0437959432, 0.8209388333}; + cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); + gt = {0.1497634285, 0.6716923572, 0.0100068009}; + cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); + } + } + + if (primariesPreset == "ProPhoto") { + {//calculated with personnal special spreadsheat + rt = {0.7977198204, 0.2880493171, -0.0000030551}; + cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); + bt = {0.0313194091, 0.0000771282, 0.8248890748}; + cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); + gt = {0.1351614114, 0.7118728221, 0.0000140770}; + cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); + } + } + + if (primariesPreset == "Widegamut") { + {//calculated with personnal special spreadsheat + rt = {0.7161680478, 0.2582038074, -0.0000027515}; + cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); + bt = {0.1471328469, 0.0168600579, 0.7731227232}; + cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); + gt = {0.1008997462, 0.7249354021, 0.0517801251}; + cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); + } + } + + if (primariesPreset == "BestRGB") { + {//calculated with personnal special spreadsheat + rt = {0.6327383009, 0.2284760022, -0.0000024233}; + cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); + bt = {0.1269437333, 0.0341753604, 0.8153773703}; + cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); + gt = {0.2045186067, 0.7373479048, 0.0095251497}; + cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); + } + } + + if (primariesPreset == "BetaRGB") { + {//calculated with personnal special spreadsheat + rt = {0.6713200674, 0.3033034560, -0.0000012307}; + cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); + bt = {0.1183343909, 0.0329265310, 0.7842009909}; + cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); + gt = {0.1745461827, 0.6637692805, 0.0407003365}; + cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); + } + } + + } else { + cmsWhitePointFromTemp(&xyD, (double)temp); + } + } + + + if (isD65 && illuminant == "DEF") { + xyD = {0.312700492, 0.329000939, 1.0}; + } + + if (isD60 && illuminant == "DEF") { + xyD = {0.32168, 0.33767, 1.0}; + } + + if (isD50 && illuminant == "DEF") { + xyD = {0.3457, 0.3585, 1.0}; + } + +// {0.3457, 0.3585, 1.0}; + // Calculate output profile's rTRC gTRC bTRC + + + cmsToneCurve* GammaTRC[3]; + + if (gammaPreset != "standard_g2.2" || gammaPreset != "standard_g1.8" || gammaPreset != "linear_g1.0") { + GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildParametricToneCurve(nullptr, 5, ga); + } + + if (gammaPreset == "standard_g2.2") { + GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildGamma(NULL, 2.19921875);//spec Adobe + } + + if (gammaPreset == "standard_g1.8") { + GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildGamma(NULL, 1.80078125); + } + + if (gammaPreset == "linear_g1.0") { + GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildGamma(NULL, 1.0); + } + + + + if (profileVersion == "v4") { + newProfile = cmsCreateRGBProfile(&xyD, &Primaries, GammaTRC); + } + + if (profileVersion == "v2") { + if (v2except) { + cmsSetProfileVersion(profile_v2_except, 2.2); + } else { + cmsSetProfileVersion(newProfile, 2.2); + } + } + + if (!v2except) { + cmsWriteTag(newProfile, cmsSigRedTRCTag, GammaTRC[0]); + cmsWriteTag(newProfile, cmsSigGreenTRCTag, GammaTRC[1]); + cmsWriteTag(newProfile, cmsSigBlueTRCTag, GammaTRC[2]); + } else { + cmsWriteTag(profile_v2_except, cmsSigRedTRCTag, GammaTRC[0]); + cmsWriteTag(profile_v2_except, cmsSigGreenTRCTag, GammaTRC[1]); + cmsWriteTag(profile_v2_except, cmsSigBlueTRCTag, GammaTRC[2]); + } + + // --------------- set dmnd tag ------------------ + + cmsMLU *dmnd; + dmnd = cmsMLUalloc(nullptr, 1); + cmsMLUsetASCII(dmnd, "en", "US", "RawTherapee"); + + if (!v2except) { + cmsWriteTag(newProfile, cmsSigDeviceMfgDescTag, dmnd); + } else { + cmsWriteTag(profile_v2_except, cmsSigDeviceMfgDescTag, dmnd); + } + + cmsMLUfree(dmnd); + + + +// --------------- set dmdd tag ------------------ + + if (profileVersion == "v2") { + //write in tag 'dmdd' values of current gamma and slope to retrieve after in Output profile + std::wostringstream wGammaSlopeParam; + wGammaSlopeParam << sGammaSlopeParam; + + cmsMLU *dmdd = cmsMLUalloc(nullptr, 1); + + // Language code (2 letters code) : https://www.iso.org/obp/ui/ + // Country code (2 letters code) : http://www.loc.gov/standards/iso639-2/php/code_list.php + if (sGammaSlopeParam.is_ascii()) { + if (cmsMLUsetASCII(dmdd, "en", "US", sGammaSlopeParam.c_str())) { + if (!v2except) { + if (!cmsWriteTag(newProfile, cmsSigProfileDescriptionTag, dmdd)) { + printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); + } + } else { + if (!cmsWriteTag(profile_v2_except, cmsSigProfileDescriptionTag, dmdd)) { + printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); + } + + } + } + } else if (cmsMLUsetWide(dmdd, "en", "US", wGammaSlopeParam.str().c_str())) { + if (!v2except) { + if (!cmsWriteTag(newProfile, cmsSigDeviceModelDescTag, dmdd)) { + printf("Error: Can't write cmsSigDeviceModelDescTag!\n"); + } + } else { + if (!cmsWriteTag(profile_v2_except, cmsSigDeviceModelDescTag, dmdd)) { + printf("Error: Can't write cmsSigDeviceModelDescTag!\n"); + } + } + } else { + printf("Error: cmsMLUsetWide failed for dmdd \"%s\" !\n", sGammaSlopeParam.c_str()); + } + + cmsMLUfree(dmdd); + } + +// --------------- set desc tag ------------------ + + Glib::ustring sDescription; + + if (!description.empty()) { + if (cAppendParamsToDesc->get_active()) { + sDescription = description + " / " + sGammaSlopeDesc; + } else { + sDescription = description; + } + } else { + if (cAppendParamsToDesc->get_active()) { + sDescription = profileDesc + " / " + sGammaSlopeDesc; + } else { + sDescription = profileDesc; + } + } + +//write in tag 'dmdd' values of current gamma and slope to retrieve after in Output profile + std::wostringstream wDescription; + wDescription << sDescription; + + cmsMLU *descMLU = cmsMLUalloc(nullptr, 1); + +// Language code (2 letters code) : https://www.iso.org/obp/ui/ +// Country code (2 letters code) : http://www.loc.gov/standards/iso639-2/php/code_list.php + if (sDescription.is_ascii()) { + if (cmsMLUsetASCII(descMLU, "en", "US", sDescription.c_str())) { + if (!v2except) { + if (!cmsWriteTag(newProfile, cmsSigProfileDescriptionTag, descMLU)) { + printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); + } + } else { + if (!cmsWriteTag(profile_v2_except, cmsSigProfileDescriptionTag, descMLU)) { + printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); + } + } + } + + } else if (cmsMLUsetWide(descMLU, "en", "US", wDescription.str().c_str())) { + if (!v2except) { + + if (!cmsWriteTag(newProfile, cmsSigProfileDescriptionTag, descMLU)) { + printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); + } + } else { + if (!cmsWriteTag(profile_v2_except, cmsSigProfileDescriptionTag, descMLU)) { + printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); + } + } + } else { + printf("Error: cmsMLUsetWide failed for desc \"%s\" !\n", sDescription.c_str()); + } + + cmsMLUfree(descMLU); + +// --------------- set cprt tag ------------------ + + std::wostringstream wCopyright; + wCopyright << copyright; + + cmsMLU *copyMLU = cmsMLUalloc(nullptr, 1); + + if (cmsMLUsetWide(copyMLU, "en", "US", wCopyright.str().c_str())) { + if (!v2except) { + + if (!cmsWriteTag(newProfile, cmsSigCopyrightTag, copyMLU)) { + printf("Error: Can't write cmsSigCopyrightTag!\n"); + } + } else { + if (!cmsWriteTag(profile_v2_except, cmsSigCopyrightTag, copyMLU)) { + printf("Error: Can't write cmsSigCopyrightTag!\n"); + } + + } + } else { + printf("Error: cmsMLUsetWide failed for cprt \"%s\" !\n", copyright.c_str()); + } + + cmsMLUfree(copyMLU); + + + /* //to read XYZ values + cmsCIEXYZ *redT = static_cast(cmsReadTag(newProfile, cmsSigRedMatrixColumnTag)); + cmsCIEXYZ *greenT = static_cast(cmsReadTag(newProfile, cmsSigGreenMatrixColumnTag)); + cmsCIEXYZ *blueT = static_cast(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); + */ + if (!v2except) { + cmsSaveProfileToFile(newProfile, absoluteFName.c_str()); + } else { + cmsSaveProfileToFile(profile_v2_except, absoluteFName.c_str()); + + } + + cmsFreeToneCurve(GammaTRC[0]); +} diff --git a/rtgui/iccprofilecreator.h b/rtgui/iccprofilecreator.h index e8de318d3..605cb9dcd 100644 --- a/rtgui/iccprofilecreator.h +++ b/rtgui/iccprofilecreator.h @@ -1,107 +1,107 @@ -/* - * This file is part of RawTherapee. - * - * Copyright (c) 2018 Jacques DESMIS - * Copyright (c) 2018 Jean-Christophe FRISCH - * - * 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 . - */ -#pragma once - -#include -#include "adjuster.h" -#include "options.h" -#include -#include "rtwindow.h" - -class ICCProfileCreator : public Gtk::Dialog, public AdjusterListener -{ - -private: - - enum class ColorTemp { - D50 = 5003, // for Widegamut, Prophoto Best, Beta -> D50 - D60 = 6005, // for ACESc -> D60 - D65 = 6504 // for sRGB, AdobeRGB, Bruce Rec2020 -> D65 - }; - - cmsFloat64Number ga[7]; // 7 parameters for smoother curves - - //------------------------ Params ----------------------- - Glib::ustring primariesPreset; - double redPrimaryX; - double redPrimaryY; - double greenPrimaryX; - double greenPrimaryY; - double bluePrimaryX; - double bluePrimaryY; - Glib::ustring gammaPreset; - double gamma; - double slope; - bool appendParamsToDesc; - bool v2except; - Glib::ustring profileVersion; - Glib::ustring illuminant; - Glib::ustring description; - Glib::ustring copyright; - //------------------------------------------------------- - - 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; - Gtk::Entry* eDescription; - Gtk::Entry* eCopyright; - Gtk::Button* resetCopyright; - Gtk::CheckButton *cAppendParamsToDesc; - - //Glib::ustring lastPath; - - void initWithDefaults (); - void storeDefaults (); - void storeValues(); - - void updateICCVersion(); - void primariesChanged(); - void illuminantChanged(); - void trcPresetsChanged(); - void adjusterChanged(Adjuster* a, double newval); - void adjusterAutoToggled(Adjuster* a, bool newval); - static std::vector getGamma(); - Glib::ustring getPrimariesPresetName(const Glib::ustring &preset); - void getPrimaries(const Glib::ustring &preset, float *p, ColorTemp &temp); - Glib::ustring getGammaPresetName(const Glib::ustring &preset); - void getGamma(const Glib::ustring &preset, double &gamma, double &slope); - void savePressed(); - void closePressed(); - void onResetCopyright(); - -public: - explicit ICCProfileCreator (RTWindow *rtwindow); -}; +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2018 Jacques DESMIS + * Copyright (c) 2018 Jean-Christophe FRISCH + * + * 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 . + */ +#pragma once + +#include +#include "adjuster.h" +#include "options.h" +#include +#include "rtwindow.h" + +class ICCProfileCreator : public Gtk::Dialog, public AdjusterListener +{ + +private: + + enum class ColorTemp { + D50 = 5003, // for Widegamut, Prophoto Best, Beta -> D50 + D60 = 6005, // for ACESc -> D60 + D65 = 6504 // for sRGB, AdobeRGB, Bruce Rec2020 -> D65 + }; + + cmsFloat64Number ga[7]; // 7 parameters for smoother curves + + //------------------------ Params ----------------------- + Glib::ustring primariesPreset; + double redPrimaryX; + double redPrimaryY; + double greenPrimaryX; + double greenPrimaryY; + double bluePrimaryX; + double bluePrimaryY; + Glib::ustring gammaPreset; + double gamma; + double slope; + bool appendParamsToDesc; + bool v2except; + Glib::ustring profileVersion; + Glib::ustring illuminant; + Glib::ustring description; + Glib::ustring copyright; + //------------------------------------------------------- + + 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; + Gtk::Entry* eDescription; + Gtk::Entry* eCopyright; + Gtk::Button* resetCopyright; + Gtk::CheckButton *cAppendParamsToDesc; + + //Glib::ustring lastPath; + + void initWithDefaults (); + void storeDefaults (); + void storeValues(); + + void updateICCVersion(); + void primariesChanged(); + void illuminantChanged(); + void trcPresetsChanged(); + void adjusterChanged(Adjuster* a, double newval); + void adjusterAutoToggled(Adjuster* a, bool newval); + static std::vector getGamma(); + Glib::ustring getPrimariesPresetName(const Glib::ustring &preset); + void getPrimaries(const Glib::ustring &preset, float *p, ColorTemp &temp); + Glib::ustring getGammaPresetName(const Glib::ustring &preset); + void getGamma(const Glib::ustring &preset, double &gamma, double &slope); + void savePressed(); + void closePressed(); + void onResetCopyright(); + +public: + explicit ICCProfileCreator (RTWindow *rtwindow); +}; From 91706c284a73efc8e8967768d815bba6d037a8b3 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 16 Nov 2018 15:04:08 +0100 Subject: [PATCH 35/60] Fix issue reported by coverity --- rtgui/iccprofilecreator.cc | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/rtgui/iccprofilecreator.cc b/rtgui/iccprofilecreator.cc index b322fa005..3e868ce04 100644 --- a/rtgui/iccprofilecreator.cc +++ b/rtgui/iccprofilecreator.cc @@ -1199,29 +1199,21 @@ void ICCProfileCreator::savePressed() cmsToneCurve* GammaTRC[3]; - if (gammaPreset != "standard_g2.2" || gammaPreset != "standard_g1.8" || gammaPreset != "linear_g1.0") { - GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildParametricToneCurve(nullptr, 5, ga); - } - if (gammaPreset == "standard_g2.2") { GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildGamma(NULL, 2.19921875);//spec Adobe - } - - if (gammaPreset == "standard_g1.8") { + } else if (gammaPreset == "standard_g1.8") { GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildGamma(NULL, 1.80078125); - } - - if (gammaPreset == "linear_g1.0") { + } else if (gammaPreset == "linear_g1.0") { GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildGamma(NULL, 1.0); + } else { + GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildParametricToneCurve(nullptr, 5, ga); } if (profileVersion == "v4") { newProfile = cmsCreateRGBProfile(&xyD, &Primaries, GammaTRC); - } - - if (profileVersion == "v2") { + } else if (profileVersion == "v2") { if (v2except) { cmsSetProfileVersion(profile_v2_except, 2.2); } else { From 1c081965624a88888a9adf1dbf26652c7cd8d1de Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Fri, 16 Nov 2018 18:14:04 +0100 Subject: [PATCH 36/60] Added color-picker-small icon #4986 --- .../themed/png/dark/color-picker-small.png | Bin 0 -> 455 bytes .../themed/png/light/color-picker-small.png | Bin 0 -> 475 bytes .../images/themed/svg/color-picker-small.svg | 133 ++++++++++++++++++ 3 files changed, 133 insertions(+) create mode 100644 rtdata/images/themed/png/dark/color-picker-small.png create mode 100644 rtdata/images/themed/png/light/color-picker-small.png create mode 100644 rtdata/images/themed/svg/color-picker-small.svg diff --git a/rtdata/images/themed/png/dark/color-picker-small.png b/rtdata/images/themed/png/dark/color-picker-small.png new file mode 100644 index 0000000000000000000000000000000000000000..5976b6e11c0f9e7e121e422c9f3a206265ffb36c GIT binary patch literal 455 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}P>E|qiF1BIWl?5&MhSznvw~wu zNl|7}X-Q^&o^EhPVo|DNPG)whLPkkRft9{~a#3nxNoHAUa(-@ZeqOO&eo?x9PG)jy zUU6!%ep01waiYG7o`L@1kR(>1>9QcxT~dpai!uv91~LRCmWO1d79|#>rYdA6=jZ9& zSk*NLs89r?(6O{6Bfp5jH!(RgHA}&zJijP0+co zc5yP$9FPlUzq647D&j2gh%9Dc;5!1sj8nDwq=ACQ0X`wF?gc()&YU@Q>J*SXefl(z zgae2mgaitnJbCi$*|R{#_Ey;*pmxEMAirP+R_O^bTOLneDR{`YBv+%#X4x^v2B2i1 zr;B5V#O2!ajzSFv9Lx?;Tr8`u{@;Hsn!V)M9kT+?i~iFR)5<#(DqA`VcCB8uAb)pj z*2kBESrE|qiF1BIWl?5&MhSznvw~wu zNl|7}X-Q^&o^EhPVo|DNPG)whLPkkRft9{~a#3nxNoHAUa(-@ZeqOO&eo?x9PG)jy zUU6!%ep01waiYG7o`L@1kR(>1>9QcxT~dpai!uv91~LRCmWO1d79|#>rYdA6=jZ9& zSk*NLs89r?(6O{6Bfp5jH!(RgHA}&zJijP0+co zc5yP$9FPlUzq647D&j2gh%9Dc;5!1sj8nDwq=AC=0X`wF?gc(7Dk?TMHb4>xR8>`# zl$3xZ5J0#F&vqgH^D#7{tHTrxm zm-<(6*t8z~ycMV*)YHW=MB;Moc}u + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + From 1fa253ba635707db657b68370d2fc1a555e8d6ff Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 16 Nov 2018 20:48:33 +0100 Subject: [PATCH 37/60] Fix some issues reported by coverity --- rtengine/FTblockDN.cc | 4 ++-- rtengine/image16.cc | 2 +- rtengine/image16.h | 2 +- rtengine/image8.cc | 2 +- rtengine/image8.h | 2 +- rtengine/imagefloat.cc | 2 +- rtengine/imagefloat.h | 2 +- rtengine/imageio.h | 2 +- rtengine/imagesource.h | 2 +- rtengine/rawimagesource.cc | 6 +++--- rtengine/rawimagesource.h | 2 +- rtengine/stdimagesource.cc | 2 +- 12 files changed, 15 insertions(+), 15 deletions(-) diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index 8ced521d3..dfab72089 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -807,8 +807,8 @@ BENCHFUN #endif const std::size_t blox_array_size = denoiseNestedLevels * numthreads; - float *LbloxArray[blox_array_size]; - float *fLbloxArray[blox_array_size]; + float *LbloxArray[blox_array_size] = {}; + float *fLbloxArray[blox_array_size] = {}; for (std::size_t i = 0; i < blox_array_size; ++i) { LbloxArray[i] = nullptr; diff --git a/rtengine/image16.cc b/rtengine/image16.cc index c014d1c06..5ceb4f804 100644 --- a/rtengine/image16.cc +++ b/rtengine/image16.cc @@ -132,7 +132,7 @@ Image16* Image16::copy() return cp; } -void Image16::getStdImage(ColorTemp ctemp, int tran, Imagefloat* image, PreviewProps pp, bool first, procparams::ToneCurveParams hrp) +void Image16::getStdImage(ColorTemp ctemp, int tran, Imagefloat* image, PreviewProps pp) { // compute channel multipliers diff --git a/rtengine/image16.h b/rtengine/image16.h index 1c5504bd9..804f8cc72 100644 --- a/rtengine/image16.h +++ b/rtengine/image16.h @@ -45,7 +45,7 @@ public: Image8* to8(); Imagefloat* tofloat(); - virtual void getStdImage(ColorTemp ctemp, int tran, Imagefloat* image, PreviewProps pp, bool first, procparams::ToneCurveParams hrp); + virtual void getStdImage(ColorTemp ctemp, int tran, Imagefloat* image, PreviewProps pp); virtual const char* getType() const { diff --git a/rtengine/image8.cc b/rtengine/image8.cc index ab7393100..15a6d9acc 100644 --- a/rtengine/image8.cc +++ b/rtengine/image8.cc @@ -97,7 +97,7 @@ Image8* Image8::copy () return cp; } -void Image8::getStdImage (ColorTemp ctemp, int tran, Imagefloat* image, PreviewProps pp, bool first, procparams::ToneCurveParams hrp) +void Image8::getStdImage (ColorTemp ctemp, int tran, Imagefloat* image, PreviewProps pp) { // compute channel multipliers float rm = 1.f, gm = 1.f, bm = 1.f; diff --git a/rtengine/image8.h b/rtengine/image8.h index 59d13c298..9bb5d51e3 100644 --- a/rtengine/image8.h +++ b/rtengine/image8.h @@ -40,7 +40,7 @@ public: Image8* copy (); - virtual void getStdImage (ColorTemp ctemp, int tran, Imagefloat* image, PreviewProps pp, bool first, procparams::ToneCurveParams hrp); + virtual void getStdImage (ColorTemp ctemp, int tran, Imagefloat* image, PreviewProps pp); virtual const char* getType () const { diff --git a/rtengine/imagefloat.cc b/rtengine/imagefloat.cc index 2cf73204d..fd6bc1c75 100644 --- a/rtengine/imagefloat.cc +++ b/rtengine/imagefloat.cc @@ -168,7 +168,7 @@ Imagefloat* Imagefloat::copy () } // This is called by the StdImageSource class. We assume that fp images from StdImageSource don't have to deal with gamma -void Imagefloat::getStdImage (ColorTemp ctemp, int tran, Imagefloat* image, PreviewProps pp, bool first, procparams::ToneCurveParams hrp) +void Imagefloat::getStdImage (ColorTemp ctemp, int tran, Imagefloat* image, PreviewProps pp) { // compute channel multipliers diff --git a/rtengine/imagefloat.h b/rtengine/imagefloat.h index 65c291775..d84e742ce 100644 --- a/rtengine/imagefloat.h +++ b/rtengine/imagefloat.h @@ -49,7 +49,7 @@ public: Image8* to8(); Image16* to16(); - virtual void getStdImage (ColorTemp ctemp, int tran, Imagefloat* image, PreviewProps pp, bool first, procparams::ToneCurveParams hrp); + virtual void getStdImage (ColorTemp ctemp, int tran, Imagefloat* image, PreviewProps pp); virtual const char* getType () const { diff --git a/rtengine/imageio.h b/rtengine/imageio.h index cbf245291..0de1de1c0 100644 --- a/rtengine/imageio.h +++ b/rtengine/imageio.h @@ -106,7 +106,7 @@ public: return sampleArrangement; } - virtual void getStdImage (ColorTemp ctemp, int tran, Imagefloat* image, PreviewProps pp, bool first, procparams::ToneCurveParams hrp) + virtual void getStdImage (ColorTemp ctemp, int tran, Imagefloat* image, PreviewProps pp, bool first) { printf("getStdImage NULL!\n"); } diff --git a/rtengine/imagesource.h b/rtengine/imagesource.h index c1bd8fd64..2c7ded588 100644 --- a/rtengine/imagesource.h +++ b/rtengine/imagesource.h @@ -74,7 +74,7 @@ public: virtual void retinexPrepareBuffers (const ColorManagementParams& cmp, const RetinexParams &retinexParams, multi_array2D &conversionBuffer, LUTu &lhist16RETI) {}; virtual void flushRawData () {}; virtual void flushRGB () {}; - virtual void HLRecovery_Global (ToneCurveParams hrp) {}; + virtual void HLRecovery_Global (const ToneCurveParams &hrp) {}; virtual void HLRecovery_inpaint (float** red, float** green, float** blue) {}; virtual void MSR (LabImage* lab, LUTf & mapcurve, bool &mapcontlutili, int width, int height, int skip, RetinexParams deh, const RetinextransmissionCurve & dehatransmissionCurve, const RetinexgaintransmissionCurve & dehagaintransmissionCurve, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax) {}; diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 85e68745b..086747b1b 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -2825,7 +2825,7 @@ void RawImageSource::flushRGB() } } -void RawImageSource::HLRecovery_Global(ToneCurveParams hrp) +void RawImageSource::HLRecovery_Global(const ToneCurveParams &hrp) { if (hrp.hrenabled && hrp.method == "Color") { if(!rgbSourceModified) { @@ -3236,10 +3236,10 @@ void RawImageSource::copyOriginalPixels(const RAWParams &raw, RawImage *src, Raw } } -void RawImageSource::cfaboxblur(RawImage *riFlatFile, float* cfablur, const int boxH, const int boxW) +void RawImageSource::cfaboxblur(RawImage *riFlatFile, float* cfablur, int boxH, int boxW) { - if(boxW == 0 && boxH == 0) { // nothing to blur + if (boxW < 0 || boxH < 0 || (boxW == 0 && boxH == 0)) { // nothing to blur or negative values memcpy(cfablur, riFlatFile->data[0], W * H * sizeof(float)); return; } diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index af0c1a116..7244f4c7c 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -122,7 +122,7 @@ public: void retinexPrepareBuffers (const ColorManagementParams& cmp, const RetinexParams &retinexParams, multi_array2D &conversionBuffer, LUTu &lhist16RETI); void flushRawData (); void flushRGB (); - void HLRecovery_Global (ToneCurveParams hrp); + void HLRecovery_Global (const ToneCurveParams &hrp); void refinement_lassus (int PassCount); void refinement(int PassCount); void setBorder(unsigned int rawBorder) {border = rawBorder;} diff --git a/rtengine/stdimagesource.cc b/rtengine/stdimagesource.cc index c75995b25..241d5f81d 100644 --- a/rtengine/stdimagesource.cc +++ b/rtengine/stdimagesource.cc @@ -194,7 +194,7 @@ void StdImageSource::getImage (const ColorTemp &ctemp, int tran, Imagefloat* ima // the code will use OpenMP as of now. - img->getStdImage(ctemp, tran, image, pp, true, hrp); + img->getStdImage(ctemp, tran, image, pp, true); // Hombre: we could have rotated the image here too, with just few line of code, but: // 1. it would require other modifications in the engine, so "do not touch that little plonker!" From d66d8ce320f397f80c21a035001c60a891a6cd7c Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 16 Nov 2018 21:49:46 +0100 Subject: [PATCH 38/60] Fix issue reported by coverity --- rtengine/ipresize.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/ipresize.cc b/rtengine/ipresize.cc index b3275b2e4..f33b8f0c9 100644 --- a/rtengine/ipresize.cc +++ b/rtengine/ipresize.cc @@ -231,7 +231,7 @@ void ImProcFunctions::Lanczos (const LabImage* src, LabImage* dst, float scale) float* const la = aligned_buffer_la.data; float* const lb = aligned_buffer_lb.data; // weights for interpolation in y direction - float w[support] ALIGNED64; + float w[support] ALIGNED64 = {}; // Phase 2: do actual interpolation #ifdef _OPENMP From 0ff68afcdfee71269a0addd169880fca5d956dd2 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 16 Nov 2018 22:05:32 +0100 Subject: [PATCH 39/60] Change line endings --- rtgui/iccprofilecreator.cc | 2790 ++++++++++++++++++------------------ rtgui/iccprofilecreator.h | 214 +-- 2 files changed, 1502 insertions(+), 1502 deletions(-) diff --git a/rtgui/iccprofilecreator.cc b/rtgui/iccprofilecreator.cc index 0d16a401a..15823f9d4 100644 --- a/rtgui/iccprofilecreator.cc +++ b/rtgui/iccprofilecreator.cc @@ -1,1395 +1,1395 @@ -/* - * This file is part of RawTherapee. - * - * Copyright (c) 2018 Jacques DESMIS - * Copyright (c) 2018 Jean-Christophe FRISCH - * - * 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 . - */ -#include -#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 -#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) - , appendParamsToDesc(options.ICCPC_appendParamsToDesc) - , profileVersion(options.ICCPC_profileVersion) - , illuminant(options.ICCPC_illuminant) - , description(options.ICCPC_description) - , copyright(options.ICCPC_copyright) - , parent(rtwindow) -{ - - set_default_size(600, -1); - - Gtk::Grid* mainGrid = Gtk::manage(new Gtk::Grid()); - mainGrid->set_column_spacing(3); - mainGrid->set_row_spacing(3); - - //--------------------------------- 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_CUSTOM")); - 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->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.0800, 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 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); - - //--------------------------------- Description - - Gtk::Label* desclab = Gtk::manage(new Gtk::Label(M("ICCPROFCREATOR_DESCRIPTION"))); - setExpandAlignProperties(desclab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_START); - mainGrid->attach(*desclab, 0, 7, 1, 2); - eDescription = Gtk::manage(new Gtk::Entry()); - setExpandAlignProperties(eDescription, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - eDescription->set_tooltip_text(M("ICCPROFCREATOR_DESCRIPTION_TOOLTIP")); - mainGrid->attach(*eDescription, 1, 7, 1, 1); - cAppendParamsToDesc = Gtk::manage(new Gtk::CheckButton(M("ICCPROFCREATOR_DESCRIPTION_ADDPARAM"))); - setExpandAlignProperties(cAppendParamsToDesc, true, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); - mainGrid->attach(*cAppendParamsToDesc, 1, 8, 1, 1); - - //--------------------------------- Copyright - - Gtk::Label* copylab = Gtk::manage(new Gtk::Label(M("ICCPROFCREATOR_COPYRIGHT"))); - setExpandAlignProperties(copylab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); - mainGrid->attach(*copylab, 0, 9, 1, 1); - Gtk::Grid* copygrid = Gtk::manage(new Gtk::Grid()); - setExpandAlignProperties(copygrid, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); - eCopyright = Gtk::manage(new Gtk::Entry()); - setExpandAlignProperties(eCopyright, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - copygrid->attach(*eCopyright, 0, 0, 1, 1); - resetCopyright = Gtk::manage(new Gtk::Button()); - resetCopyright->add(*Gtk::manage(new RTImage("undo-small.png", "redo-small.png"))); - setExpandAlignProperties(resetCopyright, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); - resetCopyright->set_relief(Gtk::RELIEF_NONE); - resetCopyright->set_tooltip_markup(M("ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP")); - resetCopyright->get_style_context()->add_class(GTK_STYLE_CLASS_FLAT); - resetCopyright->set_can_focus(false); - copygrid->attach(*resetCopyright, 1, 0, 1, 1); - mainGrid->attach(*copygrid, 1, 9, 1, 1); - - //--------------------------------- Adding the mainGrid - - get_content_area()->add(*mainGrid); - - //--------------------------------- Setting default values for Adjusters - - aGamma->setDefault(gamma); - aSlope->setDefault(slope); - aPrimariesRedX->setDefault(redPrimaryX); - aPrimariesRedY->setDefault(redPrimaryY); - aPrimariesGreenX->setDefault(greenPrimaryX); - aPrimariesGreenY->setDefault(greenPrimaryY); - aPrimariesBlueX->setDefault(bluePrimaryX); - aPrimariesBlueY->setDefault(bluePrimaryY); - - //--------------- Updating widgets with actual values (from options) - - if (primariesPreset == "custom") { - primaries->set_active_text(M("ICCPROFCREATOR_CUSTOM")); - } else 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")); - } - - trcPresets->set_active(0); - - if (gammaPreset != "Custom") { - trcPresets->set_active_text(gammaPreset); - } - - aGamma->setValue(gamma); - aSlope->setValue(slope); - aPrimariesRedX->setValue(redPrimaryX); - aPrimariesRedY->setValue(redPrimaryY); - aPrimariesGreenX->setValue(greenPrimaryX); - aPrimariesGreenY->setValue(greenPrimaryY); - aPrimariesBlueX->setValue(bluePrimaryX); - aPrimariesBlueY->setValue(bluePrimaryY); - - eDescription->set_text(description); - eCopyright->set_text(copyright); - cAppendParamsToDesc->set_active(appendParamsToDesc); - - 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)); - resetCopyright->signal_clicked().connect(sigc::mem_fun(*this, &ICCProfileCreator::onResetCopyright)); -} - -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::adjusterChanged(Adjuster* a, double newval) -{ - if (a == aPrimariesRedX || a == aPrimariesRedY || - a == aPrimariesGreenX || a == aPrimariesGreenY || - a == aPrimariesBlueX || a == aPrimariesBlueY) { - if (primaries->get_active_row_number() > 0) { - ConnectionBlocker blocker(primariesconn); - primaries->set_active(0); - updateICCVersion(); - } - } else if (a == aGamma || a == aSlope) { - if (trcPresets->get_active_row_number() > 0) { - ConnectionBlocker blocker(trcpresetsconn); - trcPresets->set_active(0); - } - } -} - -void ICCProfileCreator::adjusterAutoToggled(Adjuster* a, bool newval) -{ -} - -void ICCProfileCreator::primariesChanged() -{ - if (primaries->get_active_row_number() > 0) { - float p[6]; - ColorTemp temp; - Glib::ustring activeValue = primaries->get_active_text(); - Glib::ustring primPresetName = getPrimariesPresetName(activeValue); - getPrimaries(primPresetName, p, temp); - aPrimariesRedX->setValue(p[0]); - aPrimariesRedY->setValue(p[1]); - aPrimariesGreenX->setValue(p[2]); - aPrimariesGreenY->setValue(p[3]); - aPrimariesBlueX->setValue(p[4]); - aPrimariesBlueY->setValue(p[5]); - } - - updateICCVersion(); -} - -void ICCProfileCreator::illuminantChanged() -{ - updateICCVersion(); -} - -void ICCProfileCreator::trcPresetsChanged() -{ - aGamma->block(true); - aSlope->block(true); - - double gamma; - double slope; - getGamma(getGammaPresetName(trcPresets->get_active_text()), gamma, slope); - aGamma->setValue(gamma); - aSlope->setValue(slope); - - 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"; - } - - 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"; - } - - options.ICCPC_primariesPreset = primariesPreset = getPrimariesPresetName(primaries->get_active_text()); - options.ICCPC_gammaPreset = gammaPreset = getGammaPresetName(trcPresets->get_active_text()); - 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(); - options.ICCPC_description = description = eDescription->get_text(); - options.ICCPC_copyright = copyright = eCopyright->get_text(); - options.ICCPC_appendParamsToDesc = appendParamsToDesc = cAppendParamsToDesc->get_active(); -} - -Glib::ustring ICCProfileCreator::getPrimariesPresetName(const Glib::ustring &preset) -{ - if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_ACESP0")) { - return Glib::ustring("ACES-AP0"); - } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_ACESP1")) { - return Glib::ustring("ACES-AP1"); - } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_ADOBE")) { - return Glib::ustring("Adobe"); - } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_PROPH")) { - return Glib::ustring("ProPhoto"); - } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_REC2020")) { - return Glib::ustring("Rec2020"); - } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_SRGB")) { - return Glib::ustring("sRGB"); - } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_WIDEG")) { - return Glib::ustring("Widegamut"); - } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_BEST")) { - return Glib::ustring("BestRGB"); - } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_BETA")) { - return Glib::ustring("BetaRGB"); - } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_BRUCE")) { - return Glib::ustring("BruceRGB"); - } else if (primaries->get_active_text() == M("ICCPROFCREATOR_CUSTOM")) { - return Glib::ustring("custom"); - } else { - return Glib::ustring(); - } -} - -void ICCProfileCreator::getPrimaries(const Glib::ustring &preset, float *p, ColorTemp &temp) -{ - temp = ColorTemp::D50; - - if (preset == "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 (preset == "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 (preset == "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 (preset == "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 (preset == "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 (preset == "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 (preset == "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 (preset == "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 (preset == "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 (preset == "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 (preset == "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; - } -} - -Glib::ustring ICCProfileCreator::getGammaPresetName(const Glib::ustring &preset) -{ - Glib::ustring name(trcPresets->get_active_text()); - - if (name == M("ICCPROFCREATOR_CUSTOM")) { - name = "Custom"; - } - - return name; -} - -void ICCProfileCreator::getGamma(const Glib::ustring &preset, double &presetGamma, double &presetSlope) -{ - if (preset == "High_g1.3_s3.35") { - presetGamma = 1.3; - presetSlope = 3.35; - } else if (preset == "Low_g2.6_s6.9") { - presetGamma = 2.6; - presetSlope = 6.9; - } else if (preset == "sRGB_g2.4_s12.92") { - presetGamma = 2.4; - presetSlope = 12.92310; - } else if (preset == "BT709_g2.2_s4.5") { - presetGamma = 2.22; - presetSlope = 4.5; - } else if (preset == "linear_g1.0") { - presetGamma = 1.; - presetSlope = 0.; - } else if (preset == "standard_g2.2") { - presetGamma = 2.2; - presetSlope = 0.; - } else if (preset == "standard_g1.8") { - presetGamma = 1.8; - presetSlope = 0.; - } else if (preset == "Lab_g3.0s9.03296") { - presetGamma = 3.0; - presetSlope = 9.03296; - } else if (preset == "Custom") { - presetGamma = gamma; - presetSlope = slope; - } else { - presetGamma = 2.4; - presetSlope = 12.92310; - } -} - -void ICCProfileCreator::onResetCopyright() -{ - eCopyright->set_text(Options::getICCProfileCopyright()); -} - -// Copyright (c) 2018 Jacques DESMIS -// WARNING: the caller must lock lcmsMutex -void ICCProfileCreator::savePressed() -{ - cmsHPROFILE newProfile = nullptr; - cmsHPROFILE profile_v2_except = nullptr; - - Glib::ustring sNewProfile; - Glib::ustring sPrimariesPreset; - Glib::ustring sGammaPreset; - - storeValues(); - - // -------------------------------------------- Compute the default file name - // -----------------setmedia white point for monitor profile sRGB or AdobeRGB in case of profile used for monitor--------------------- - //instead of calculations made by LCMS..small differences - bool isD65 = (primariesPreset == "sRGB" || primariesPreset == "Adobe" || primariesPreset == "Rec2020" || primariesPreset == "BruceRGB"); - bool isD60 = (primariesPreset == "ACES-AP1" || primariesPreset == "ACES-AP0"); - bool isD50 = (primariesPreset == "ProPhoto" || primariesPreset == "Widegamut" || primariesPreset == "BestRGB" || primariesPreset == "BetaRGB"); - // v2except = (profileVersion == "v2" && (primariesPreset == "sRGB" || primariesPreset == "Adobe" || primariesPreset == "Rec2020" || primariesPreset == "BruceRGB" || primariesPreset == "ACES-AP1" || primariesPreset == "ACES-AP0") && illuminant == "DEF"); - v2except = (profileVersion == "v2" && (isD65 || isD60 || isD50) && illuminant == "DEF"); - - //necessary for V2 profile - - if (!v2except) { - std::string is_RTv4 = ""; - - //used partially for v4, and in case of if we want to back to old manner for v2 - 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)) { - is_RTv4 = options.rtSettings.prophoto.substr(0, 4); - - if (is_RTv4 == "RTv4") { - options.rtSettings.prophoto = "RTv2_Large"; - }; - - sNewProfile = options.rtSettings.prophoto; - - 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)) { - sNewProfile = options.rtSettings.srgb; - sPrimariesPreset = "sRGB"; - } else if (primariesPreset == "Widegamut" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.widegamut)) { - is_RTv4 = options.rtSettings.widegamut.substr(0, 4); - - if (is_RTv4 == "RTv4") { - options.rtSettings.widegamut = "RTv2_Wide"; - }; - - sNewProfile = options.rtSettings.widegamut; - - sPrimariesPreset = "Wide"; - } else if (primariesPreset == "BestRGB" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.best)) { - is_RTv4 = options.rtSettings.best.substr(0, 4); - - if (is_RTv4 == "RTv4") { - options.rtSettings.best = "RTv2_Best"; - }; - - sNewProfile = options.rtSettings.best; - - sPrimariesPreset = "Best"; - } else if (primariesPreset == "BetaRGB" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.beta)) { - sNewProfile = options.rtSettings.beta; - is_RTv4 = options.rtSettings.beta.substr(0, 4); - - if (is_RTv4 == "RTv4") { - options.rtSettings.widegamut = "RTv2_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; - } - } else { - //new model for v2 profile different from D50 by entering directly XYZ values and media white point - sNewProfile = "RTv2_Beta";//for copy generate others v2 profile. To change date of new profile, I used "ICC profile inspector" and "save as" - - if (primariesPreset == "ACES-AP0") { - sPrimariesPreset = "ACES-AP0"; - } else if (primariesPreset == "ACES-AP1") { - sPrimariesPreset = "ACES-AP1"; - } else if (primariesPreset == "Adobe") { - sPrimariesPreset = "Medium"; - } else if (primariesPreset == "Rec2020") { - sPrimariesPreset = "Rec2020"; - } else if (primariesPreset == "BruceRGB") { - sPrimariesPreset = "Bruce"; - } else if (primariesPreset == "sRGB") { - sPrimariesPreset = "sRGB"; - } else if (primariesPreset == "ProPhoto") { - sPrimariesPreset = "Large"; - } else if (primariesPreset == "Widegamut") { - sPrimariesPreset = "Wide"; - } else if (primariesPreset == "BestRGB") { - sPrimariesPreset = "Best"; - } else if (primariesPreset == "BetaRGB") { - sPrimariesPreset = "Beta"; - } - } - - //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()); - } - - if (!v2except) { - newProfile = rtengine::ICCStore::getInstance()->getProfile(sNewProfile); //get output profile - } else { - profile_v2_except = 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; - } - */ - //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 - getGamma(gammaPreset, presetGamma, presetSlope); - - if (gammaPreset == "High_g1.3_s3.35") { - sGammaPreset = "High_g=1.3_s=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"; - 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"; - 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"; - 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"; - 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"; - 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"; - 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"; - 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; - } - - Glib::ustring profileDesc; - Glib::ustring sGammaSlopeParam;//to save gamma and slope in a dmdd - Glib::ustring sGammaSlopeDesc; //to save gamma and slope in a desc - Glib::ustring sGamma; - Glib::ustring sSlope; - - if (gammaPreset == "Custom") { - sGamma = Glib::ustring::format(std::setw(3), std::fixed, std::setprecision(2), gamma); - sSlope = Glib::ustring::format(std::setw(6), std::fixed, std::setprecision(5), slope); - fName = Glib::ustring::compose("RT%1_%2_g%3_s%4.icc", profileVersion, sPrimariesAndIlluminant, sGamma, sSlope); - profileDesc = sPrimariesPreset; - } else { - sGamma = Glib::ustring::format(std::setw(3), std::fixed, std::setprecision(2), presetGamma); - sSlope = Glib::ustring::format(std::setw(6), std::fixed, std::setprecision(5), presetSlope); - fName = Glib::ustring::compose("RT%1_%2_%3.icc", profileVersion, sPrimariesAndIlluminant, sGammaPreset); - profileDesc = sPrimariesPreset + sGammaPreset; - } - - sGammaSlopeParam = Glib::ustring::compose("g%1s%2!", sGamma, sSlope); - sGammaSlopeDesc = Glib::ustring::compose("g=%1 s=%2", sGamma, 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 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 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); - - // --------------- main tags ------------------ - /* - if (profileVersion == "v4") { - cmsSetProfileVersion(newProfile, 4.3); - } else { - cmsSetProfileVersion(newProfile, 2.0); - } - */ - -//change - float p[6]; //primaries - ga[6] = 0.0; - - ColorTemp temp; - getPrimaries(primariesPreset, p, temp); - - 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 - }; - - - if (v2except) { - cmsSetDeviceClass(profile_v2_except, cmsSigDisplayClass); - cmsSetPCS(profile_v2_except, cmsSigXYZData); - cmsSetHeaderRenderingIntent(profile_v2_except, 0); - } - - - if (profileVersion == "v4" && illuminant != "DEF") { - double tempv4 = 5000.; - - 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.; - } - - cmsWhitePointFromTemp(&xyD, tempv4); - - if (illuminant == "D65") { - xyD = {0.312700492, 0.329000939, 1.0}; - } - - if (illuminant == "D60") { - xyD = {0.32168, 0.33767, 1.0}; - } - - if (illuminant == "D50") { - xyD = {0.3457, 0.3585, 1.0};//white D50 near LCMS values but not perfect...it's a compromise!! - } - - if (illuminant == "stdA") { - xyD = {0.447573, 0.407440, 1.0}; - } - - - } else { - if (v2except) { - - cmsCIEXYZ XYZ; - - { - XYZ = {0.95045471, 1.0, 1.08905029};//white D65 - } - - if (primariesPreset == "ACES-AP1" || primariesPreset == "ACES-AP0") { - XYZ = {0.952646075, 1.0, 1.008825184};//white D60 - } - - if (isD50) { - XYZ = {0.964295676, 1.0, 0.825104603};//white D50 room (prophoto) near LCMS values but not perfect...it's a compromise!! - } - - cmsCIExyY blackpoint; - - { - blackpoint = {0., 0., 0.};//White D65 point from the sRGB.icm and AdobeRGB1998 profile specs - } - - cmsWriteTag(profile_v2_except, cmsSigMediaBlackPointTag, &blackpoint); - cmsWriteTag(profile_v2_except, cmsSigMediaWhitePointTag, &XYZ); - cmsCIEXYZ rt; - cmsCIEXYZ bt; - cmsCIEXYZ gt; - - if (primariesPreset == "sRGB") { - //calculated with personnal special spreadsheat - { - //Matrix value from spec Adobe but adapted with wp - rt = {0.4360411843, 0.2224843154, 0.0139201582}; - cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {0.1430457992, 0.0606099658, 0.7139121724}; - cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.3851136574, 0.7169049862, 0.0970677661}; - cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); - - } - - } - - if (primariesPreset == "Adobe") { - { - //Adobe spec adapted with wp calculated with personnal special spreadsheat - rt = {0.6097408852, 0.3111123176, 0.0194653393}; - cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {0.1491866649, 0.0632119133, 0.7445599707}; - cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.2052730908, 0.6256750365, 0.0608747867}; - cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); - } - } - - if (primariesPreset == "Rec2020") { - {//calculated with personnal special spreadsheat - rt = {0.6734800343, 0.2790423273, -0.0019336766}; - cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {0.1250489478, 0.0456126910, 0.7968509159}; - cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.1656716588, 0.6753442491, 0.0299828575}; - cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); - } - } - - if (primariesPreset == "BruceRGB") { - {//calculated with personnal special spreadsheat - rt = {0.4941542253, 0.2521357351, 0.0157753562}; - cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {0.1495175342, 0.0633521060, 0.7462112712}; - cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.3205288814, 0.6845114263, 0.0629134693}; - cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); - } - } - - if (primariesPreset == "ACES-AP0") { - {//calculated with personnal special spreadsheat - rt = {0.9908835135, 0.3618940325, -0.0027137400}; - cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {-0.0389246557, -0.084405166, 0.8193659780}; - cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.0122417831, 0.7225104015, 0.0082478587}; - cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); - } - } - - if (primariesPreset == "ACES-AP1") {//done - {//calculated with personnal special spreadsheat - rt = {0.6898756188, 0.2845109670, -0.0060455375}; - cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {0.1245615936, 0.0437959432, 0.8209388333}; - cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.1497634285, 0.6716923572, 0.0100068009}; - cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); - } - } - - if (primariesPreset == "ProPhoto") { - {//calculated with personnal special spreadsheat - rt = {0.7977198204, 0.2880493171, -0.0000030551}; - cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {0.0313194091, 0.0000771282, 0.8248890748}; - cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.1351614114, 0.7118728221, 0.0000140770}; - cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); - } - } - - if (primariesPreset == "Widegamut") { - {//calculated with personnal special spreadsheat - rt = {0.7161680478, 0.2582038074, -0.0000027515}; - cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {0.1471328469, 0.0168600579, 0.7731227232}; - cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.1008997462, 0.7249354021, 0.0517801251}; - cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); - } - } - - if (primariesPreset == "BestRGB") { - {//calculated with personnal special spreadsheat - rt = {0.6327383009, 0.2284760022, -0.0000024233}; - cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {0.1269437333, 0.0341753604, 0.8153773703}; - cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.2045186067, 0.7373479048, 0.0095251497}; - cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); - } - } - - if (primariesPreset == "BetaRGB") { - {//calculated with personnal special spreadsheat - rt = {0.6713200674, 0.3033034560, -0.0000012307}; - cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {0.1183343909, 0.0329265310, 0.7842009909}; - cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.1745461827, 0.6637692805, 0.0407003365}; - cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); - } - } - - } else { - cmsWhitePointFromTemp(&xyD, (double)temp); - } - } - - - if (isD65 && illuminant == "DEF") { - xyD = {0.312700492, 0.329000939, 1.0}; - } - - if (isD60 && illuminant == "DEF") { - xyD = {0.32168, 0.33767, 1.0}; - } - - if (isD50 && illuminant == "DEF") { - xyD = {0.3457, 0.3585, 1.0}; - } - -// {0.3457, 0.3585, 1.0}; - // Calculate output profile's rTRC gTRC bTRC - - - cmsToneCurve* GammaTRC[3]; - - if (gammaPreset != "standard_g2.2" || gammaPreset != "standard_g1.8" || gammaPreset != "linear_g1.0") { - GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildParametricToneCurve(nullptr, 5, ga); - } - - if (gammaPreset == "standard_g2.2") { - GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildGamma(NULL, 2.19921875);//spec Adobe - } - - if (gammaPreset == "standard_g1.8") { - GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildGamma(NULL, 1.80078125); - } - - if (gammaPreset == "linear_g1.0") { - GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildGamma(NULL, 1.0); - } - - - - if (profileVersion == "v4") { - newProfile = cmsCreateRGBProfile(&xyD, &Primaries, GammaTRC); - } - - if (profileVersion == "v2") { - if (v2except) { - cmsSetProfileVersion(profile_v2_except, 2.2); - } else { - cmsSetProfileVersion(newProfile, 2.2); - } - } - - if (!v2except) { - cmsWriteTag(newProfile, cmsSigRedTRCTag, GammaTRC[0]); - cmsWriteTag(newProfile, cmsSigGreenTRCTag, GammaTRC[1]); - cmsWriteTag(newProfile, cmsSigBlueTRCTag, GammaTRC[2]); - } else { - cmsWriteTag(profile_v2_except, cmsSigRedTRCTag, GammaTRC[0]); - cmsWriteTag(profile_v2_except, cmsSigGreenTRCTag, GammaTRC[1]); - cmsWriteTag(profile_v2_except, cmsSigBlueTRCTag, GammaTRC[2]); - } - - // --------------- set dmnd tag ------------------ - - cmsMLU *dmnd; - dmnd = cmsMLUalloc(nullptr, 1); - cmsMLUsetASCII(dmnd, "en", "US", "RawTherapee"); - - if (!v2except) { - cmsWriteTag(newProfile, cmsSigDeviceMfgDescTag, dmnd); - } else { - cmsWriteTag(profile_v2_except, cmsSigDeviceMfgDescTag, dmnd); - } - - cmsMLUfree(dmnd); - - - -// --------------- set dmdd tag ------------------ - - if (profileVersion == "v2") { - //write in tag 'dmdd' values of current gamma and slope to retrieve after in Output profile - std::wostringstream wGammaSlopeParam; - wGammaSlopeParam << sGammaSlopeParam; - - cmsMLU *dmdd = cmsMLUalloc(nullptr, 1); - - // Language code (2 letters code) : https://www.iso.org/obp/ui/ - // Country code (2 letters code) : http://www.loc.gov/standards/iso639-2/php/code_list.php - if (sGammaSlopeParam.is_ascii()) { - if (cmsMLUsetASCII(dmdd, "en", "US", sGammaSlopeParam.c_str())) { - if (!v2except) { - if (!cmsWriteTag(newProfile, cmsSigProfileDescriptionTag, dmdd)) { - printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); - } - } else { - if (!cmsWriteTag(profile_v2_except, cmsSigProfileDescriptionTag, dmdd)) { - printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); - } - - } - } - } else if (cmsMLUsetWide(dmdd, "en", "US", wGammaSlopeParam.str().c_str())) { - if (!v2except) { - if (!cmsWriteTag(newProfile, cmsSigDeviceModelDescTag, dmdd)) { - printf("Error: Can't write cmsSigDeviceModelDescTag!\n"); - } - } else { - if (!cmsWriteTag(profile_v2_except, cmsSigDeviceModelDescTag, dmdd)) { - printf("Error: Can't write cmsSigDeviceModelDescTag!\n"); - } - } - } else { - printf("Error: cmsMLUsetWide failed for dmdd \"%s\" !\n", sGammaSlopeParam.c_str()); - } - - cmsMLUfree(dmdd); - } - -// --------------- set desc tag ------------------ - - Glib::ustring sDescription; - - if (!description.empty()) { - if (cAppendParamsToDesc->get_active()) { - sDescription = description + " / " + sGammaSlopeDesc; - } else { - sDescription = description; - } - } else { - if (cAppendParamsToDesc->get_active()) { - sDescription = profileDesc + " / " + sGammaSlopeDesc; - } else { - sDescription = profileDesc; - } - } - -//write in tag 'dmdd' values of current gamma and slope to retrieve after in Output profile - std::wostringstream wDescription; - wDescription << sDescription; - - cmsMLU *descMLU = cmsMLUalloc(nullptr, 1); - -// Language code (2 letters code) : https://www.iso.org/obp/ui/ -// Country code (2 letters code) : http://www.loc.gov/standards/iso639-2/php/code_list.php - if (sDescription.is_ascii()) { - if (cmsMLUsetASCII(descMLU, "en", "US", sDescription.c_str())) { - if (!v2except) { - if (!cmsWriteTag(newProfile, cmsSigProfileDescriptionTag, descMLU)) { - printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); - } - } else { - if (!cmsWriteTag(profile_v2_except, cmsSigProfileDescriptionTag, descMLU)) { - printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); - } - } - } - - } else if (cmsMLUsetWide(descMLU, "en", "US", wDescription.str().c_str())) { - if (!v2except) { - - if (!cmsWriteTag(newProfile, cmsSigProfileDescriptionTag, descMLU)) { - printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); - } - } else { - if (!cmsWriteTag(profile_v2_except, cmsSigProfileDescriptionTag, descMLU)) { - printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); - } - } - } else { - printf("Error: cmsMLUsetWide failed for desc \"%s\" !\n", sDescription.c_str()); - } - - cmsMLUfree(descMLU); - -// --------------- set cprt tag ------------------ - - std::wostringstream wCopyright; - wCopyright << copyright; - - cmsMLU *copyMLU = cmsMLUalloc(nullptr, 1); - - if (cmsMLUsetWide(copyMLU, "en", "US", wCopyright.str().c_str())) { - if (!v2except) { - - if (!cmsWriteTag(newProfile, cmsSigCopyrightTag, copyMLU)) { - printf("Error: Can't write cmsSigCopyrightTag!\n"); - } - } else { - if (!cmsWriteTag(profile_v2_except, cmsSigCopyrightTag, copyMLU)) { - printf("Error: Can't write cmsSigCopyrightTag!\n"); - } - - } - } else { - printf("Error: cmsMLUsetWide failed for cprt \"%s\" !\n", copyright.c_str()); - } - - cmsMLUfree(copyMLU); - - - /* //to read XYZ values - cmsCIEXYZ *redT = static_cast(cmsReadTag(newProfile, cmsSigRedMatrixColumnTag)); - cmsCIEXYZ *greenT = static_cast(cmsReadTag(newProfile, cmsSigGreenMatrixColumnTag)); - cmsCIEXYZ *blueT = static_cast(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); - */ - if (!v2except) { - cmsSaveProfileToFile(newProfile, absoluteFName.c_str()); - } else { - cmsSaveProfileToFile(profile_v2_except, absoluteFName.c_str()); - - } - - cmsFreeToneCurve(GammaTRC[0]); -} +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2018 Jacques DESMIS + * Copyright (c) 2018 Jean-Christophe FRISCH + * + * 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 . + */ +#include +#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 +#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) + , appendParamsToDesc(options.ICCPC_appendParamsToDesc) + , profileVersion(options.ICCPC_profileVersion) + , illuminant(options.ICCPC_illuminant) + , description(options.ICCPC_description) + , copyright(options.ICCPC_copyright) + , parent(rtwindow) +{ + + set_default_size(600, -1); + + Gtk::Grid* mainGrid = Gtk::manage(new Gtk::Grid()); + mainGrid->set_column_spacing(3); + mainGrid->set_row_spacing(3); + + //--------------------------------- 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_CUSTOM")); + 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->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.0800, 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 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); + + //--------------------------------- Description + + Gtk::Label* desclab = Gtk::manage(new Gtk::Label(M("ICCPROFCREATOR_DESCRIPTION"))); + setExpandAlignProperties(desclab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_START); + mainGrid->attach(*desclab, 0, 7, 1, 2); + eDescription = Gtk::manage(new Gtk::Entry()); + setExpandAlignProperties(eDescription, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + eDescription->set_tooltip_text(M("ICCPROFCREATOR_DESCRIPTION_TOOLTIP")); + mainGrid->attach(*eDescription, 1, 7, 1, 1); + cAppendParamsToDesc = Gtk::manage(new Gtk::CheckButton(M("ICCPROFCREATOR_DESCRIPTION_ADDPARAM"))); + setExpandAlignProperties(cAppendParamsToDesc, true, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); + mainGrid->attach(*cAppendParamsToDesc, 1, 8, 1, 1); + + //--------------------------------- Copyright + + Gtk::Label* copylab = Gtk::manage(new Gtk::Label(M("ICCPROFCREATOR_COPYRIGHT"))); + setExpandAlignProperties(copylab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); + mainGrid->attach(*copylab, 0, 9, 1, 1); + Gtk::Grid* copygrid = Gtk::manage(new Gtk::Grid()); + setExpandAlignProperties(copygrid, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + eCopyright = Gtk::manage(new Gtk::Entry()); + setExpandAlignProperties(eCopyright, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + copygrid->attach(*eCopyright, 0, 0, 1, 1); + resetCopyright = Gtk::manage(new Gtk::Button()); + resetCopyright->add(*Gtk::manage(new RTImage("undo-small.png", "redo-small.png"))); + setExpandAlignProperties(resetCopyright, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); + resetCopyright->set_relief(Gtk::RELIEF_NONE); + resetCopyright->set_tooltip_markup(M("ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP")); + resetCopyright->get_style_context()->add_class(GTK_STYLE_CLASS_FLAT); + resetCopyright->set_can_focus(false); + copygrid->attach(*resetCopyright, 1, 0, 1, 1); + mainGrid->attach(*copygrid, 1, 9, 1, 1); + + //--------------------------------- Adding the mainGrid + + get_content_area()->add(*mainGrid); + + //--------------------------------- Setting default values for Adjusters + + aGamma->setDefault(gamma); + aSlope->setDefault(slope); + aPrimariesRedX->setDefault(redPrimaryX); + aPrimariesRedY->setDefault(redPrimaryY); + aPrimariesGreenX->setDefault(greenPrimaryX); + aPrimariesGreenY->setDefault(greenPrimaryY); + aPrimariesBlueX->setDefault(bluePrimaryX); + aPrimariesBlueY->setDefault(bluePrimaryY); + + //--------------- Updating widgets with actual values (from options) + + if (primariesPreset == "custom") { + primaries->set_active_text(M("ICCPROFCREATOR_CUSTOM")); + } else 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")); + } + + trcPresets->set_active(0); + + if (gammaPreset != "Custom") { + trcPresets->set_active_text(gammaPreset); + } + + aGamma->setValue(gamma); + aSlope->setValue(slope); + aPrimariesRedX->setValue(redPrimaryX); + aPrimariesRedY->setValue(redPrimaryY); + aPrimariesGreenX->setValue(greenPrimaryX); + aPrimariesGreenY->setValue(greenPrimaryY); + aPrimariesBlueX->setValue(bluePrimaryX); + aPrimariesBlueY->setValue(bluePrimaryY); + + eDescription->set_text(description); + eCopyright->set_text(copyright); + cAppendParamsToDesc->set_active(appendParamsToDesc); + + 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)); + resetCopyright->signal_clicked().connect(sigc::mem_fun(*this, &ICCProfileCreator::onResetCopyright)); +} + +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::adjusterChanged(Adjuster* a, double newval) +{ + if (a == aPrimariesRedX || a == aPrimariesRedY || + a == aPrimariesGreenX || a == aPrimariesGreenY || + a == aPrimariesBlueX || a == aPrimariesBlueY) { + if (primaries->get_active_row_number() > 0) { + ConnectionBlocker blocker(primariesconn); + primaries->set_active(0); + updateICCVersion(); + } + } else if (a == aGamma || a == aSlope) { + if (trcPresets->get_active_row_number() > 0) { + ConnectionBlocker blocker(trcpresetsconn); + trcPresets->set_active(0); + } + } +} + +void ICCProfileCreator::adjusterAutoToggled(Adjuster* a, bool newval) +{ +} + +void ICCProfileCreator::primariesChanged() +{ + if (primaries->get_active_row_number() > 0) { + float p[6]; + ColorTemp temp; + Glib::ustring activeValue = primaries->get_active_text(); + Glib::ustring primPresetName = getPrimariesPresetName(activeValue); + getPrimaries(primPresetName, p, temp); + aPrimariesRedX->setValue(p[0]); + aPrimariesRedY->setValue(p[1]); + aPrimariesGreenX->setValue(p[2]); + aPrimariesGreenY->setValue(p[3]); + aPrimariesBlueX->setValue(p[4]); + aPrimariesBlueY->setValue(p[5]); + } + + updateICCVersion(); +} + +void ICCProfileCreator::illuminantChanged() +{ + updateICCVersion(); +} + +void ICCProfileCreator::trcPresetsChanged() +{ + aGamma->block(true); + aSlope->block(true); + + double gamma; + double slope; + getGamma(getGammaPresetName(trcPresets->get_active_text()), gamma, slope); + aGamma->setValue(gamma); + aSlope->setValue(slope); + + 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"; + } + + 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"; + } + + options.ICCPC_primariesPreset = primariesPreset = getPrimariesPresetName(primaries->get_active_text()); + options.ICCPC_gammaPreset = gammaPreset = getGammaPresetName(trcPresets->get_active_text()); + 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(); + options.ICCPC_description = description = eDescription->get_text(); + options.ICCPC_copyright = copyright = eCopyright->get_text(); + options.ICCPC_appendParamsToDesc = appendParamsToDesc = cAppendParamsToDesc->get_active(); +} + +Glib::ustring ICCProfileCreator::getPrimariesPresetName(const Glib::ustring &preset) +{ + if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_ACESP0")) { + return Glib::ustring("ACES-AP0"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_ACESP1")) { + return Glib::ustring("ACES-AP1"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_ADOBE")) { + return Glib::ustring("Adobe"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_PROPH")) { + return Glib::ustring("ProPhoto"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_REC2020")) { + return Glib::ustring("Rec2020"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_SRGB")) { + return Glib::ustring("sRGB"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_WIDEG")) { + return Glib::ustring("Widegamut"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_BEST")) { + return Glib::ustring("BestRGB"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_BETA")) { + return Glib::ustring("BetaRGB"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_BRUCE")) { + return Glib::ustring("BruceRGB"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_CUSTOM")) { + return Glib::ustring("custom"); + } else { + return Glib::ustring(); + } +} + +void ICCProfileCreator::getPrimaries(const Glib::ustring &preset, float *p, ColorTemp &temp) +{ + temp = ColorTemp::D50; + + if (preset == "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 (preset == "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 (preset == "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 (preset == "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 (preset == "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 (preset == "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 (preset == "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 (preset == "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 (preset == "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 (preset == "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 (preset == "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; + } +} + +Glib::ustring ICCProfileCreator::getGammaPresetName(const Glib::ustring &preset) +{ + Glib::ustring name(trcPresets->get_active_text()); + + if (name == M("ICCPROFCREATOR_CUSTOM")) { + name = "Custom"; + } + + return name; +} + +void ICCProfileCreator::getGamma(const Glib::ustring &preset, double &presetGamma, double &presetSlope) +{ + if (preset == "High_g1.3_s3.35") { + presetGamma = 1.3; + presetSlope = 3.35; + } else if (preset == "Low_g2.6_s6.9") { + presetGamma = 2.6; + presetSlope = 6.9; + } else if (preset == "sRGB_g2.4_s12.92") { + presetGamma = 2.4; + presetSlope = 12.92310; + } else if (preset == "BT709_g2.2_s4.5") { + presetGamma = 2.22; + presetSlope = 4.5; + } else if (preset == "linear_g1.0") { + presetGamma = 1.; + presetSlope = 0.; + } else if (preset == "standard_g2.2") { + presetGamma = 2.2; + presetSlope = 0.; + } else if (preset == "standard_g1.8") { + presetGamma = 1.8; + presetSlope = 0.; + } else if (preset == "Lab_g3.0s9.03296") { + presetGamma = 3.0; + presetSlope = 9.03296; + } else if (preset == "Custom") { + presetGamma = gamma; + presetSlope = slope; + } else { + presetGamma = 2.4; + presetSlope = 12.92310; + } +} + +void ICCProfileCreator::onResetCopyright() +{ + eCopyright->set_text(Options::getICCProfileCopyright()); +} + +// Copyright (c) 2018 Jacques DESMIS +// WARNING: the caller must lock lcmsMutex +void ICCProfileCreator::savePressed() +{ + cmsHPROFILE newProfile = nullptr; + cmsHPROFILE profile_v2_except = nullptr; + + Glib::ustring sNewProfile; + Glib::ustring sPrimariesPreset; + Glib::ustring sGammaPreset; + + storeValues(); + + // -------------------------------------------- Compute the default file name + // -----------------setmedia white point for monitor profile sRGB or AdobeRGB in case of profile used for monitor--------------------- + //instead of calculations made by LCMS..small differences + bool isD65 = (primariesPreset == "sRGB" || primariesPreset == "Adobe" || primariesPreset == "Rec2020" || primariesPreset == "BruceRGB"); + bool isD60 = (primariesPreset == "ACES-AP1" || primariesPreset == "ACES-AP0"); + bool isD50 = (primariesPreset == "ProPhoto" || primariesPreset == "Widegamut" || primariesPreset == "BestRGB" || primariesPreset == "BetaRGB"); + // v2except = (profileVersion == "v2" && (primariesPreset == "sRGB" || primariesPreset == "Adobe" || primariesPreset == "Rec2020" || primariesPreset == "BruceRGB" || primariesPreset == "ACES-AP1" || primariesPreset == "ACES-AP0") && illuminant == "DEF"); + v2except = (profileVersion == "v2" && (isD65 || isD60 || isD50) && illuminant == "DEF"); + + //necessary for V2 profile + + if (!v2except) { + std::string is_RTv4 = ""; + + //used partially for v4, and in case of if we want to back to old manner for v2 + 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)) { + is_RTv4 = options.rtSettings.prophoto.substr(0, 4); + + if (is_RTv4 == "RTv4") { + options.rtSettings.prophoto = "RTv2_Large"; + }; + + sNewProfile = options.rtSettings.prophoto; + + 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)) { + sNewProfile = options.rtSettings.srgb; + sPrimariesPreset = "sRGB"; + } else if (primariesPreset == "Widegamut" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.widegamut)) { + is_RTv4 = options.rtSettings.widegamut.substr(0, 4); + + if (is_RTv4 == "RTv4") { + options.rtSettings.widegamut = "RTv2_Wide"; + }; + + sNewProfile = options.rtSettings.widegamut; + + sPrimariesPreset = "Wide"; + } else if (primariesPreset == "BestRGB" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.best)) { + is_RTv4 = options.rtSettings.best.substr(0, 4); + + if (is_RTv4 == "RTv4") { + options.rtSettings.best = "RTv2_Best"; + }; + + sNewProfile = options.rtSettings.best; + + sPrimariesPreset = "Best"; + } else if (primariesPreset == "BetaRGB" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.beta)) { + sNewProfile = options.rtSettings.beta; + is_RTv4 = options.rtSettings.beta.substr(0, 4); + + if (is_RTv4 == "RTv4") { + options.rtSettings.widegamut = "RTv2_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; + } + } else { + //new model for v2 profile different from D50 by entering directly XYZ values and media white point + sNewProfile = "RTv2_Beta";//for copy generate others v2 profile. To change date of new profile, I used "ICC profile inspector" and "save as" + + if (primariesPreset == "ACES-AP0") { + sPrimariesPreset = "ACES-AP0"; + } else if (primariesPreset == "ACES-AP1") { + sPrimariesPreset = "ACES-AP1"; + } else if (primariesPreset == "Adobe") { + sPrimariesPreset = "Medium"; + } else if (primariesPreset == "Rec2020") { + sPrimariesPreset = "Rec2020"; + } else if (primariesPreset == "BruceRGB") { + sPrimariesPreset = "Bruce"; + } else if (primariesPreset == "sRGB") { + sPrimariesPreset = "sRGB"; + } else if (primariesPreset == "ProPhoto") { + sPrimariesPreset = "Large"; + } else if (primariesPreset == "Widegamut") { + sPrimariesPreset = "Wide"; + } else if (primariesPreset == "BestRGB") { + sPrimariesPreset = "Best"; + } else if (primariesPreset == "BetaRGB") { + sPrimariesPreset = "Beta"; + } + } + + //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()); + } + + if (!v2except) { + newProfile = rtengine::ICCStore::getInstance()->getProfile(sNewProfile); //get output profile + } else { + profile_v2_except = 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; + } + */ + //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 + getGamma(gammaPreset, presetGamma, presetSlope); + + if (gammaPreset == "High_g1.3_s3.35") { + sGammaPreset = "High_g=1.3_s=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"; + 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"; + 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"; + 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"; + 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"; + 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"; + 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"; + 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; + } + + Glib::ustring profileDesc; + Glib::ustring sGammaSlopeParam;//to save gamma and slope in a dmdd + Glib::ustring sGammaSlopeDesc; //to save gamma and slope in a desc + Glib::ustring sGamma; + Glib::ustring sSlope; + + if (gammaPreset == "Custom") { + sGamma = Glib::ustring::format(std::setw(3), std::fixed, std::setprecision(2), gamma); + sSlope = Glib::ustring::format(std::setw(6), std::fixed, std::setprecision(5), slope); + fName = Glib::ustring::compose("RT%1_%2_g%3_s%4.icc", profileVersion, sPrimariesAndIlluminant, sGamma, sSlope); + profileDesc = sPrimariesPreset; + } else { + sGamma = Glib::ustring::format(std::setw(3), std::fixed, std::setprecision(2), presetGamma); + sSlope = Glib::ustring::format(std::setw(6), std::fixed, std::setprecision(5), presetSlope); + fName = Glib::ustring::compose("RT%1_%2_%3.icc", profileVersion, sPrimariesAndIlluminant, sGammaPreset); + profileDesc = sPrimariesPreset + sGammaPreset; + } + + sGammaSlopeParam = Glib::ustring::compose("g%1s%2!", sGamma, sSlope); + sGammaSlopeDesc = Glib::ustring::compose("g=%1 s=%2", sGamma, 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 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 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); + + // --------------- main tags ------------------ + /* + if (profileVersion == "v4") { + cmsSetProfileVersion(newProfile, 4.3); + } else { + cmsSetProfileVersion(newProfile, 2.0); + } + */ + +//change + float p[6]; //primaries + ga[6] = 0.0; + + ColorTemp temp; + getPrimaries(primariesPreset, p, temp); + + 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 + }; + + + if (v2except) { + cmsSetDeviceClass(profile_v2_except, cmsSigDisplayClass); + cmsSetPCS(profile_v2_except, cmsSigXYZData); + cmsSetHeaderRenderingIntent(profile_v2_except, 0); + } + + + if (profileVersion == "v4" && illuminant != "DEF") { + double tempv4 = 5000.; + + 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.; + } + + cmsWhitePointFromTemp(&xyD, tempv4); + + if (illuminant == "D65") { + xyD = {0.312700492, 0.329000939, 1.0}; + } + + if (illuminant == "D60") { + xyD = {0.32168, 0.33767, 1.0}; + } + + if (illuminant == "D50") { + xyD = {0.3457, 0.3585, 1.0};//white D50 near LCMS values but not perfect...it's a compromise!! + } + + if (illuminant == "stdA") { + xyD = {0.447573, 0.407440, 1.0}; + } + + + } else { + if (v2except) { + + cmsCIEXYZ XYZ; + + { + XYZ = {0.95045471, 1.0, 1.08905029};//white D65 + } + + if (primariesPreset == "ACES-AP1" || primariesPreset == "ACES-AP0") { + XYZ = {0.952646075, 1.0, 1.008825184};//white D60 + } + + if (isD50) { + XYZ = {0.964295676, 1.0, 0.825104603};//white D50 room (prophoto) near LCMS values but not perfect...it's a compromise!! + } + + cmsCIExyY blackpoint; + + { + blackpoint = {0., 0., 0.};//White D65 point from the sRGB.icm and AdobeRGB1998 profile specs + } + + cmsWriteTag(profile_v2_except, cmsSigMediaBlackPointTag, &blackpoint); + cmsWriteTag(profile_v2_except, cmsSigMediaWhitePointTag, &XYZ); + cmsCIEXYZ rt; + cmsCIEXYZ bt; + cmsCIEXYZ gt; + + if (primariesPreset == "sRGB") { + //calculated with personnal special spreadsheat + { + //Matrix value from spec Adobe but adapted with wp + rt = {0.4360411843, 0.2224843154, 0.0139201582}; + cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); + bt = {0.1430457992, 0.0606099658, 0.7139121724}; + cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); + gt = {0.3851136574, 0.7169049862, 0.0970677661}; + cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); + + } + + } + + if (primariesPreset == "Adobe") { + { + //Adobe spec adapted with wp calculated with personnal special spreadsheat + rt = {0.6097408852, 0.3111123176, 0.0194653393}; + cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); + bt = {0.1491866649, 0.0632119133, 0.7445599707}; + cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); + gt = {0.2052730908, 0.6256750365, 0.0608747867}; + cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); + } + } + + if (primariesPreset == "Rec2020") { + {//calculated with personnal special spreadsheat + rt = {0.6734800343, 0.2790423273, -0.0019336766}; + cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); + bt = {0.1250489478, 0.0456126910, 0.7968509159}; + cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); + gt = {0.1656716588, 0.6753442491, 0.0299828575}; + cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); + } + } + + if (primariesPreset == "BruceRGB") { + {//calculated with personnal special spreadsheat + rt = {0.4941542253, 0.2521357351, 0.0157753562}; + cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); + bt = {0.1495175342, 0.0633521060, 0.7462112712}; + cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); + gt = {0.3205288814, 0.6845114263, 0.0629134693}; + cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); + } + } + + if (primariesPreset == "ACES-AP0") { + {//calculated with personnal special spreadsheat + rt = {0.9908835135, 0.3618940325, -0.0027137400}; + cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); + bt = {-0.0389246557, -0.084405166, 0.8193659780}; + cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); + gt = {0.0122417831, 0.7225104015, 0.0082478587}; + cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); + } + } + + if (primariesPreset == "ACES-AP1") {//done + {//calculated with personnal special spreadsheat + rt = {0.6898756188, 0.2845109670, -0.0060455375}; + cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); + bt = {0.1245615936, 0.0437959432, 0.8209388333}; + cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); + gt = {0.1497634285, 0.6716923572, 0.0100068009}; + cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); + } + } + + if (primariesPreset == "ProPhoto") { + {//calculated with personnal special spreadsheat + rt = {0.7977198204, 0.2880493171, -0.0000030551}; + cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); + bt = {0.0313194091, 0.0000771282, 0.8248890748}; + cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); + gt = {0.1351614114, 0.7118728221, 0.0000140770}; + cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); + } + } + + if (primariesPreset == "Widegamut") { + {//calculated with personnal special spreadsheat + rt = {0.7161680478, 0.2582038074, -0.0000027515}; + cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); + bt = {0.1471328469, 0.0168600579, 0.7731227232}; + cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); + gt = {0.1008997462, 0.7249354021, 0.0517801251}; + cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); + } + } + + if (primariesPreset == "BestRGB") { + {//calculated with personnal special spreadsheat + rt = {0.6327383009, 0.2284760022, -0.0000024233}; + cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); + bt = {0.1269437333, 0.0341753604, 0.8153773703}; + cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); + gt = {0.2045186067, 0.7373479048, 0.0095251497}; + cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); + } + } + + if (primariesPreset == "BetaRGB") { + {//calculated with personnal special spreadsheat + rt = {0.6713200674, 0.3033034560, -0.0000012307}; + cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); + bt = {0.1183343909, 0.0329265310, 0.7842009909}; + cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); + gt = {0.1745461827, 0.6637692805, 0.0407003365}; + cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); + } + } + + } else { + cmsWhitePointFromTemp(&xyD, (double)temp); + } + } + + + if (isD65 && illuminant == "DEF") { + xyD = {0.312700492, 0.329000939, 1.0}; + } + + if (isD60 && illuminant == "DEF") { + xyD = {0.32168, 0.33767, 1.0}; + } + + if (isD50 && illuminant == "DEF") { + xyD = {0.3457, 0.3585, 1.0}; + } + +// {0.3457, 0.3585, 1.0}; + // Calculate output profile's rTRC gTRC bTRC + + + cmsToneCurve* GammaTRC[3]; + + if (gammaPreset != "standard_g2.2" || gammaPreset != "standard_g1.8" || gammaPreset != "linear_g1.0") { + GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildParametricToneCurve(nullptr, 5, ga); + } + + if (gammaPreset == "standard_g2.2") { + GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildGamma(NULL, 2.19921875);//spec Adobe + } + + if (gammaPreset == "standard_g1.8") { + GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildGamma(NULL, 1.80078125); + } + + if (gammaPreset == "linear_g1.0") { + GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildGamma(NULL, 1.0); + } + + + + if (profileVersion == "v4") { + newProfile = cmsCreateRGBProfile(&xyD, &Primaries, GammaTRC); + } + + if (profileVersion == "v2") { + if (v2except) { + cmsSetProfileVersion(profile_v2_except, 2.2); + } else { + cmsSetProfileVersion(newProfile, 2.2); + } + } + + if (!v2except) { + cmsWriteTag(newProfile, cmsSigRedTRCTag, GammaTRC[0]); + cmsWriteTag(newProfile, cmsSigGreenTRCTag, GammaTRC[1]); + cmsWriteTag(newProfile, cmsSigBlueTRCTag, GammaTRC[2]); + } else { + cmsWriteTag(profile_v2_except, cmsSigRedTRCTag, GammaTRC[0]); + cmsWriteTag(profile_v2_except, cmsSigGreenTRCTag, GammaTRC[1]); + cmsWriteTag(profile_v2_except, cmsSigBlueTRCTag, GammaTRC[2]); + } + + // --------------- set dmnd tag ------------------ + + cmsMLU *dmnd; + dmnd = cmsMLUalloc(nullptr, 1); + cmsMLUsetASCII(dmnd, "en", "US", "RawTherapee"); + + if (!v2except) { + cmsWriteTag(newProfile, cmsSigDeviceMfgDescTag, dmnd); + } else { + cmsWriteTag(profile_v2_except, cmsSigDeviceMfgDescTag, dmnd); + } + + cmsMLUfree(dmnd); + + + +// --------------- set dmdd tag ------------------ + + if (profileVersion == "v2") { + //write in tag 'dmdd' values of current gamma and slope to retrieve after in Output profile + std::wostringstream wGammaSlopeParam; + wGammaSlopeParam << sGammaSlopeParam; + + cmsMLU *dmdd = cmsMLUalloc(nullptr, 1); + + // Language code (2 letters code) : https://www.iso.org/obp/ui/ + // Country code (2 letters code) : http://www.loc.gov/standards/iso639-2/php/code_list.php + if (sGammaSlopeParam.is_ascii()) { + if (cmsMLUsetASCII(dmdd, "en", "US", sGammaSlopeParam.c_str())) { + if (!v2except) { + if (!cmsWriteTag(newProfile, cmsSigProfileDescriptionTag, dmdd)) { + printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); + } + } else { + if (!cmsWriteTag(profile_v2_except, cmsSigProfileDescriptionTag, dmdd)) { + printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); + } + + } + } + } else if (cmsMLUsetWide(dmdd, "en", "US", wGammaSlopeParam.str().c_str())) { + if (!v2except) { + if (!cmsWriteTag(newProfile, cmsSigDeviceModelDescTag, dmdd)) { + printf("Error: Can't write cmsSigDeviceModelDescTag!\n"); + } + } else { + if (!cmsWriteTag(profile_v2_except, cmsSigDeviceModelDescTag, dmdd)) { + printf("Error: Can't write cmsSigDeviceModelDescTag!\n"); + } + } + } else { + printf("Error: cmsMLUsetWide failed for dmdd \"%s\" !\n", sGammaSlopeParam.c_str()); + } + + cmsMLUfree(dmdd); + } + +// --------------- set desc tag ------------------ + + Glib::ustring sDescription; + + if (!description.empty()) { + if (cAppendParamsToDesc->get_active()) { + sDescription = description + " / " + sGammaSlopeDesc; + } else { + sDescription = description; + } + } else { + if (cAppendParamsToDesc->get_active()) { + sDescription = profileDesc + " / " + sGammaSlopeDesc; + } else { + sDescription = profileDesc; + } + } + +//write in tag 'dmdd' values of current gamma and slope to retrieve after in Output profile + std::wostringstream wDescription; + wDescription << sDescription; + + cmsMLU *descMLU = cmsMLUalloc(nullptr, 1); + +// Language code (2 letters code) : https://www.iso.org/obp/ui/ +// Country code (2 letters code) : http://www.loc.gov/standards/iso639-2/php/code_list.php + if (sDescription.is_ascii()) { + if (cmsMLUsetASCII(descMLU, "en", "US", sDescription.c_str())) { + if (!v2except) { + if (!cmsWriteTag(newProfile, cmsSigProfileDescriptionTag, descMLU)) { + printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); + } + } else { + if (!cmsWriteTag(profile_v2_except, cmsSigProfileDescriptionTag, descMLU)) { + printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); + } + } + } + + } else if (cmsMLUsetWide(descMLU, "en", "US", wDescription.str().c_str())) { + if (!v2except) { + + if (!cmsWriteTag(newProfile, cmsSigProfileDescriptionTag, descMLU)) { + printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); + } + } else { + if (!cmsWriteTag(profile_v2_except, cmsSigProfileDescriptionTag, descMLU)) { + printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); + } + } + } else { + printf("Error: cmsMLUsetWide failed for desc \"%s\" !\n", sDescription.c_str()); + } + + cmsMLUfree(descMLU); + +// --------------- set cprt tag ------------------ + + std::wostringstream wCopyright; + wCopyright << copyright; + + cmsMLU *copyMLU = cmsMLUalloc(nullptr, 1); + + if (cmsMLUsetWide(copyMLU, "en", "US", wCopyright.str().c_str())) { + if (!v2except) { + + if (!cmsWriteTag(newProfile, cmsSigCopyrightTag, copyMLU)) { + printf("Error: Can't write cmsSigCopyrightTag!\n"); + } + } else { + if (!cmsWriteTag(profile_v2_except, cmsSigCopyrightTag, copyMLU)) { + printf("Error: Can't write cmsSigCopyrightTag!\n"); + } + + } + } else { + printf("Error: cmsMLUsetWide failed for cprt \"%s\" !\n", copyright.c_str()); + } + + cmsMLUfree(copyMLU); + + + /* //to read XYZ values + cmsCIEXYZ *redT = static_cast(cmsReadTag(newProfile, cmsSigRedMatrixColumnTag)); + cmsCIEXYZ *greenT = static_cast(cmsReadTag(newProfile, cmsSigGreenMatrixColumnTag)); + cmsCIEXYZ *blueT = static_cast(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); + */ + if (!v2except) { + cmsSaveProfileToFile(newProfile, absoluteFName.c_str()); + } else { + cmsSaveProfileToFile(profile_v2_except, absoluteFName.c_str()); + + } + + cmsFreeToneCurve(GammaTRC[0]); +} diff --git a/rtgui/iccprofilecreator.h b/rtgui/iccprofilecreator.h index e8de318d3..605cb9dcd 100644 --- a/rtgui/iccprofilecreator.h +++ b/rtgui/iccprofilecreator.h @@ -1,107 +1,107 @@ -/* - * This file is part of RawTherapee. - * - * Copyright (c) 2018 Jacques DESMIS - * Copyright (c) 2018 Jean-Christophe FRISCH - * - * 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 . - */ -#pragma once - -#include -#include "adjuster.h" -#include "options.h" -#include -#include "rtwindow.h" - -class ICCProfileCreator : public Gtk::Dialog, public AdjusterListener -{ - -private: - - enum class ColorTemp { - D50 = 5003, // for Widegamut, Prophoto Best, Beta -> D50 - D60 = 6005, // for ACESc -> D60 - D65 = 6504 // for sRGB, AdobeRGB, Bruce Rec2020 -> D65 - }; - - cmsFloat64Number ga[7]; // 7 parameters for smoother curves - - //------------------------ Params ----------------------- - Glib::ustring primariesPreset; - double redPrimaryX; - double redPrimaryY; - double greenPrimaryX; - double greenPrimaryY; - double bluePrimaryX; - double bluePrimaryY; - Glib::ustring gammaPreset; - double gamma; - double slope; - bool appendParamsToDesc; - bool v2except; - Glib::ustring profileVersion; - Glib::ustring illuminant; - Glib::ustring description; - Glib::ustring copyright; - //------------------------------------------------------- - - 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; - Gtk::Entry* eDescription; - Gtk::Entry* eCopyright; - Gtk::Button* resetCopyright; - Gtk::CheckButton *cAppendParamsToDesc; - - //Glib::ustring lastPath; - - void initWithDefaults (); - void storeDefaults (); - void storeValues(); - - void updateICCVersion(); - void primariesChanged(); - void illuminantChanged(); - void trcPresetsChanged(); - void adjusterChanged(Adjuster* a, double newval); - void adjusterAutoToggled(Adjuster* a, bool newval); - static std::vector getGamma(); - Glib::ustring getPrimariesPresetName(const Glib::ustring &preset); - void getPrimaries(const Glib::ustring &preset, float *p, ColorTemp &temp); - Glib::ustring getGammaPresetName(const Glib::ustring &preset); - void getGamma(const Glib::ustring &preset, double &gamma, double &slope); - void savePressed(); - void closePressed(); - void onResetCopyright(); - -public: - explicit ICCProfileCreator (RTWindow *rtwindow); -}; +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2018 Jacques DESMIS + * Copyright (c) 2018 Jean-Christophe FRISCH + * + * 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 . + */ +#pragma once + +#include +#include "adjuster.h" +#include "options.h" +#include +#include "rtwindow.h" + +class ICCProfileCreator : public Gtk::Dialog, public AdjusterListener +{ + +private: + + enum class ColorTemp { + D50 = 5003, // for Widegamut, Prophoto Best, Beta -> D50 + D60 = 6005, // for ACESc -> D60 + D65 = 6504 // for sRGB, AdobeRGB, Bruce Rec2020 -> D65 + }; + + cmsFloat64Number ga[7]; // 7 parameters for smoother curves + + //------------------------ Params ----------------------- + Glib::ustring primariesPreset; + double redPrimaryX; + double redPrimaryY; + double greenPrimaryX; + double greenPrimaryY; + double bluePrimaryX; + double bluePrimaryY; + Glib::ustring gammaPreset; + double gamma; + double slope; + bool appendParamsToDesc; + bool v2except; + Glib::ustring profileVersion; + Glib::ustring illuminant; + Glib::ustring description; + Glib::ustring copyright; + //------------------------------------------------------- + + 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; + Gtk::Entry* eDescription; + Gtk::Entry* eCopyright; + Gtk::Button* resetCopyright; + Gtk::CheckButton *cAppendParamsToDesc; + + //Glib::ustring lastPath; + + void initWithDefaults (); + void storeDefaults (); + void storeValues(); + + void updateICCVersion(); + void primariesChanged(); + void illuminantChanged(); + void trcPresetsChanged(); + void adjusterChanged(Adjuster* a, double newval); + void adjusterAutoToggled(Adjuster* a, bool newval); + static std::vector getGamma(); + Glib::ustring getPrimariesPresetName(const Glib::ustring &preset); + void getPrimaries(const Glib::ustring &preset, float *p, ColorTemp &temp); + Glib::ustring getGammaPresetName(const Glib::ustring &preset); + void getGamma(const Glib::ustring &preset, double &gamma, double &slope); + void savePressed(); + void closePressed(); + void onResetCopyright(); + +public: + explicit ICCProfileCreator (RTWindow *rtwindow); +}; From 50936b24476c66c9cb57fd2f620d12417ffe63be Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sat, 17 Nov 2018 01:30:59 +0100 Subject: [PATCH 40/60] Fix two coverity issues --- rtengine/rtthumbnail.cc | 2 +- rtexif/kodakattribs.cc | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index aafdea029..2d911087c 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -2191,7 +2191,7 @@ bool Thumbnail::readEmbProfile (const Glib::ustring& fname) if (!fseek (f, 0, SEEK_SET)) { embProfileData = new unsigned char[embProfileLength]; - fread (embProfileData, 1, embProfileLength, f); + embProfileLength = fread (embProfileData, 1, embProfileLength, f); embProfile = cmsOpenProfileFromMem (embProfileData, embProfileLength); } } diff --git a/rtexif/kodakattribs.cc b/rtexif/kodakattribs.cc index 1b6e522c5..a9c168a70 100644 --- a/rtexif/kodakattribs.cc +++ b/rtexif/kodakattribs.cc @@ -104,12 +104,11 @@ void parseKodakIfdTextualInfo (Tag *textualInfo, Tag* exif_) a = atoi (val.c_str()); b = atoi (&p1[1]); } - t = new Tag (exif, lookupAttrib (exifAttribs, "ExposureTime")); t->initRational (a, b); exif->replaceTag (t); - float ssv = -log2 ((float)a / (float)b); // convert to APEX value + const float ssv = -log2 ((float)a / std::max((float)b, 0.0001f)); // convert to APEX value, avoid division by zero t = new Tag (exif, lookupAttrib (exifAttribs, "ShutterSpeedValue")); t->initRational (1000000 * ssv, 1000000); exif->replaceTag (t); From 7896ffa08f19128d31e02419cea58a79dfcf0f28 Mon Sep 17 00:00:00 2001 From: "U-PC-BUREAU\\jacques" Date: Sat, 17 Nov 2018 14:40:04 +0100 Subject: [PATCH 41/60] Add custom primaries and illuminant choice to ICCv2 - solve some bugs --- rtgui/iccprofilecreator.cc | 346 ++++++++++++++++++++++++------------- rtgui/iccprofilecreator.h | 2 +- 2 files changed, 227 insertions(+), 121 deletions(-) diff --git a/rtgui/iccprofilecreator.cc b/rtgui/iccprofilecreator.cc index 7ec89e190..03d46471d 100644 --- a/rtgui/iccprofilecreator.cc +++ b/rtgui/iccprofilecreator.cc @@ -362,12 +362,14 @@ void ICCProfileCreator::closePressed() 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); - } +// 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); +// } + + iccVersion->set_sensitive(true); } void ICCProfileCreator::adjusterChanged(Adjuster* a, double newval) @@ -395,7 +397,7 @@ void ICCProfileCreator::adjusterAutoToggled(Adjuster* a, bool newval) void ICCProfileCreator::primariesChanged() { if (primaries->get_active_row_number() > 0) { - float p[6]; + double p[6]; ColorTemp temp; Glib::ustring activeValue = primaries->get_active_text(); Glib::ustring primPresetName = getPrimariesPresetName(activeValue); @@ -501,7 +503,7 @@ Glib::ustring ICCProfileCreator::getPrimariesPresetName(const Glib::ustring &pre } } -void ICCProfileCreator::getPrimaries(const Glib::ustring &preset, float *p, ColorTemp &temp) +void ICCProfileCreator::getPrimaries(const Glib::ustring &preset, double *p, ColorTemp &temp) { temp = ColorTemp::D50; @@ -671,7 +673,8 @@ void ICCProfileCreator::savePressed() bool isD60 = (primariesPreset == "ACES-AP1" || primariesPreset == "ACES-AP0"); bool isD50 = (primariesPreset == "ProPhoto" || primariesPreset == "Widegamut" || primariesPreset == "BestRGB" || primariesPreset == "BetaRGB"); // v2except = (profileVersion == "v2" && (primariesPreset == "sRGB" || primariesPreset == "Adobe" || primariesPreset == "Rec2020" || primariesPreset == "BruceRGB" || primariesPreset == "ACES-AP1" || primariesPreset == "ACES-AP0") && illuminant == "DEF"); - v2except = (profileVersion == "v2" && (isD65 || isD60 || isD50) && illuminant == "DEF"); + // v2except = (profileVersion == "v2" && (isD65 || isD60 || isD50) && illuminant == "DEF"); + v2except = (profileVersion == "v2");// && (isD65 || isD60 || isD50)); //necessary for V2 profile @@ -771,6 +774,8 @@ void ICCProfileCreator::savePressed() sPrimariesPreset = "Best"; } else if (primariesPreset == "BetaRGB") { sPrimariesPreset = "Beta"; + } else if (primariesPreset == "custom") { + sPrimariesPreset = "Custom"; } } @@ -812,6 +817,9 @@ void ICCProfileCreator::savePressed() ga[2] = 0.001721; ga[3] = 0.298507; ga[4] = 0.005746; + presetGamma = 1.3; + presetSlope = 3.35; + } else if (gammaPreset == "Low_g2.6_s6.9") { sGammaPreset = "Low_g=2.6_s=6.9"; ga[0] = 2.6 ; //gamma 2.6 variable : for low contrast images @@ -819,6 +827,9 @@ void ICCProfileCreator::savePressed() ga[2] = 0.108839; ga[3] = 0.144928; ga[4] = 0.076332; + presetGamma = 2.6; + presetSlope = 6.9; + } else if (gammaPreset == "sRGB_g2.4_s12.92") { sGammaPreset = "sRGB_g=2.4_s=12.92310"; ga[0] = 2.40; //sRGB 2.4 12.92 - RT default as Lightroom @@ -826,6 +837,9 @@ void ICCProfileCreator::savePressed() ga[2] = 0.052142; ga[3] = 0.077399; ga[4] = 0.039293; + presetGamma = 2.4; + presetSlope = 12.92310; + } else if (gammaPreset == "BT709_g2.2_s4.5") { sGammaPreset = "BT709_g=2.2_s=4.5"; ga[0] = 2.22; //BT709 2.2 4.5 - my preferred as D.Coffin @@ -833,6 +847,9 @@ void ICCProfileCreator::savePressed() ga[2] = 0.090005; ga[3] = 0.222222; ga[4] = 0.081071; + presetGamma = 2.2; + presetSlope = 4.5; + } else if (gammaPreset == "linear_g1.0") { sGammaPreset = "Linear_g=1.0"; ga[0] = 1.0; //gamma=1 linear : for high dynamic images (cf D.Coffin...) @@ -840,6 +857,9 @@ void ICCProfileCreator::savePressed() ga[2] = 0.; ga[3] = 1. / eps; ga[4] = 0.; + presetGamma = 1.0; + presetSlope = 0.0; + } else if (gammaPreset == "standard_g2.2") { sGammaPreset = "g=2.2"; ga[0] = 2.2; //gamma=2.2(as gamma of Adobe, Widegamut...) @@ -847,6 +867,9 @@ void ICCProfileCreator::savePressed() ga[2] = 0.; ga[3] = 1. / eps; ga[4] = 0.; + presetGamma = 2.2; + presetSlope = 0.0; + } else if (gammaPreset == "standard_g1.8") { sGammaPreset = "g=1.8"; ga[0] = 1.8; //gamma=1.8(as gamma of Prophoto) @@ -854,6 +877,9 @@ void ICCProfileCreator::savePressed() ga[2] = 0.; ga[3] = 1. / eps; ga[4] = 0.; + presetGamma = 1.8; + presetSlope = 0.0; + } else if (gammaPreset == "Lab_g3.0s9.03296") { sGammaPreset = "LAB_g3.0_s9.03296"; ga[0] = 3.0; //Lab gamma =3 slope=9.03296 @@ -861,6 +887,9 @@ void ICCProfileCreator::savePressed() ga[2] = 0.1379; ga[3] = 0.1107; ga[4] = 0.08; + presetGamma = 3.0; + presetSlope = 9.03926; + } else if (gammaPreset == "Custom") { rtengine::GammaValues g_a; //gamma parameters double pwr = 1.0 / gamma; @@ -972,7 +1001,7 @@ void ICCProfileCreator::savePressed() */ //change - float p[6]; //primaries + double p[6]; //primaries ga[6] = 0.0; ColorTemp temp; @@ -985,7 +1014,6 @@ void ICCProfileCreator::savePressed() {p[4], p[5], 1.0} // blue }; - if (v2except) { cmsSetDeviceClass(profile_v2_except, cmsSigDisplayClass); cmsSetPCS(profile_v2_except, cmsSigXYZData); @@ -1034,23 +1062,60 @@ void ICCProfileCreator::savePressed() if (v2except) { cmsCIEXYZ XYZ; + double Wx = 1.0; + double Wy = 1.0; + double Wz = 1.0; - { - XYZ = {0.95045471, 1.0, 1.08905029};//white D65 - } + if (illuminant == "DEF") { + { + Wx = 0.95045471; + Wz = 1.08905029; + XYZ = {Wx, 1.0, Wz};//white D65 + } - if (primariesPreset == "ACES-AP1" || primariesPreset == "ACES-AP0") { - XYZ = {0.952646075, 1.0, 1.008825184};//white D60 - } + if (primariesPreset == "ACES-AP1" || primariesPreset == "ACES-AP0") { + Wx = 0.952646075; + Wz = 1.008825184; + XYZ = {Wx, 1.0, Wz};//white D60 + } + + if (isD50) { + Wx = 0.964295676; + Wz = 0.825104603; + XYZ = {Wx, 1.0, Wz};//white D50 room (prophoto) near LCMS values but not perfect...it's a compromise!! + } + } else { + if (illuminant == "D65") { + Wx = 0.95045471; + Wz = 1.08905029; + } else if (illuminant == "D50") { + Wx = 0.964295676; + Wz = 0.825104603; + } else if (illuminant == "D55") { + Wx = 0.956565934; + Wz = 0.920253249; + } else if (illuminant == "D60") { + Wx = 0.952646075; + Wz = 1.008825184; + } else if (illuminant == "D41") { + Wx = 0.991488263; + Wz = 0.631604625; + } else if (illuminant == "D80") { + Wx = 0.950095542; + Wz = 1.284213976; + } else if (illuminant == "stdA") { + Wx = 1.098500393; + Wz = 0.355848714; + } + + XYZ = {Wx, 1.0, Wz}; - if (isD50) { - XYZ = {0.964295676, 1.0, 0.825104603};//white D50 room (prophoto) near LCMS values but not perfect...it's a compromise!! } cmsCIExyY blackpoint; { - blackpoint = {0., 0., 0.};//White D65 point from the sRGB.icm and AdobeRGB1998 profile specs + blackpoint = {0., 0., 0.}; } cmsWriteTag(profile_v2_except, cmsSigMediaBlackPointTag, &blackpoint); @@ -1059,120 +1124,162 @@ void ICCProfileCreator::savePressed() cmsCIEXYZ bt; cmsCIEXYZ gt; - if (primariesPreset == "sRGB") { - //calculated with personnal special spreadsheat - { - //Matrix value from spec Adobe but adapted with wp - rt = {0.4360411843, 0.2224843154, 0.0139201582}; - cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {0.1430457992, 0.0606099658, 0.7139121724}; - cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.3851136574, 0.7169049862, 0.0970677661}; - cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); + //calculate XYZ matrix for each primaries and each temp (D50, D65...) - } + // reduce coordonate of primaries + //printf("p0=%f p1=%f p2=%f p3=%f p4=%f p5=%f \n", p[0], p[1], p[2], p[3],p[4], p[5]); + double Xr = p[0] / p[1]; + double Yr = 1.0; + double Zr = (1.0 - p[0] - p[1]) / p[1]; + double Xg = p[2] / p[3]; + double Yg = 1.0; + double Zg = (1.0 - p[2] - p[3]) / p[3]; + double Xb = p[4] / p[5]; + double Yb = 1.0; + double Zb = (1.0 - p[4] - p[5]) / p[5]; + using Triple = std::array; + + using Matrix = std::array; + + Matrix input_prim; + Matrix inv_input_prim = {}; + + input_prim[0][0] = Xr; + input_prim[0][1] = Yr; + input_prim[0][2] = Zr; + input_prim[1][0] = Xg; + input_prim[1][1] = Yg; + input_prim[1][2] = Zg; + input_prim[2][0] = Xb; + input_prim[2][1] = Yb; + input_prim[2][2] = Zb; + + //printf("in=%f in01=%f in22=%f\n", input_prim[0][0], input_prim[0][1], input_prim[2][2]); + if (!rtengine::invertMatrix(input_prim, inv_input_prim)) { + std::cout << "Matrix is not invertible, skipping" << std::endl; } - if (primariesPreset == "Adobe") { - { - //Adobe spec adapted with wp calculated with personnal special spreadsheat - rt = {0.6097408852, 0.3111123176, 0.0194653393}; - cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {0.1491866649, 0.0632119133, 0.7445599707}; - cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.2052730908, 0.6256750365, 0.0608747867}; - cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); + //printf("inv=%f inv01=%f inv22=%f\n", inv_input_prim[0][0], inv_input_prim[0][1], inv_input_prim[2][2]); + + //white point D50 used by LCMS + double Wdx = 0.96420; + double Wdy = 1.0; + double Wdz = 0.82490; + + double Sr = Wx * inv_input_prim [0][0] + Wy * inv_input_prim [1][0] + Wz * inv_input_prim [2][0]; + double Sg = Wx * inv_input_prim [0][1] + Wy * inv_input_prim [1][1] + Wz * inv_input_prim [2][1]; + double Sb = Wx * inv_input_prim [0][2] + Wy * inv_input_prim [1][2] + Wz * inv_input_prim [2][2]; + //printf("sr=%f sg=%f sb=%f\n", Sr, Sg, Sb); + + //XYZ matrix for primaries and temp + Matrix mat_xyz = {}; + mat_xyz[0][0] = Sr * Xr; + mat_xyz[0][1] = Sr * Yr; + mat_xyz[0][2] = Sr * Zr; + mat_xyz[1][0] = Sg * Xg; + mat_xyz[1][1] = Sg * Yg; + mat_xyz[1][2] = Sg * Zg; + mat_xyz[2][0] = Sb * Xb; + mat_xyz[2][1] = Sb * Yb; + mat_xyz[2][2] = Sb * Zb; + //printf("mat0=%f mat22=%f\n", mat_xyz[0][0], mat_xyz[2][2]); + + //chromatic adaptation Bradford + Matrix MaBradford = {}; + MaBradford[0][0] = 0.8951; + MaBradford[0][1] = -0.7502; + MaBradford[0][2] = 0.0389; + MaBradford[1][0] = 0.2664; + MaBradford[1][1] = 1.7135; + MaBradford[1][2] = -0.0685; + MaBradford[2][0] = -0.1614; + MaBradford[2][1] = 0.0367; + MaBradford[2][2] = 1.0296; + + Matrix Ma_oneBradford = {}; + Ma_oneBradford[0][0] = 0.9869929; + Ma_oneBradford[0][1] = 0.4323053; + Ma_oneBradford[0][2] = -0.0085287; + Ma_oneBradford[1][0] = -0.1470543; + Ma_oneBradford[1][1] = 0.5183603; + Ma_oneBradford[1][2] = 0.0400428; + Ma_oneBradford[2][0] = 0.1599627; + Ma_oneBradford[2][1] = 0.0492912; + Ma_oneBradford[2][2] = 0.9684867; + + //R G B source + double Rs = Wx * MaBradford[0][0] + Wy * MaBradford[1][0] + Wz * MaBradford[2][0]; + double Gs = Wx * MaBradford[0][1] + Wy * MaBradford[1][1] + Wz * MaBradford[2][1]; + double Bs = Wx * MaBradford[0][2] + Wy * MaBradford[1][2] + Wz * MaBradford[2][2]; + + // R G B destination + double Rd = Wdx * MaBradford[0][0] + Wdy * MaBradford[1][0] + Wdz * MaBradford[2][0]; + double Gd = Wdx * MaBradford[0][1] + Wdy * MaBradford[1][1] + Wdz * MaBradford[2][1]; + double Bd = Wdx * MaBradford[0][2] + Wdy * MaBradford[1][2] + Wdz * MaBradford[2][2]; + + //cone destination + Matrix cone_dest_sourc = {}; + cone_dest_sourc [0][0] = Rd / Rs; + cone_dest_sourc [0][1] = 0.; + cone_dest_sourc [0][2] = 0.; + cone_dest_sourc [1][0] = 0.; + cone_dest_sourc [1][1] = Gd / Gs; + cone_dest_sourc [1][2] = 0.; + cone_dest_sourc [2][0] = 0.; + cone_dest_sourc [2][1] = 0.; + cone_dest_sourc [2][2] = Bd / Bs; + + Matrix cone_ma_one = {}; + + for (int i = 0; i < 3; ++i) { + for (int j = 0; j < 3; ++j) { + cone_ma_one[i][j] = 0; + + for (int k = 0; k < 3; ++k) { + cone_ma_one[i][j] += cone_dest_sourc [i][k] * Ma_oneBradford[k][j]; + } } } - if (primariesPreset == "Rec2020") { - {//calculated with personnal special spreadsheat - rt = {0.6734800343, 0.2790423273, -0.0019336766}; - cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {0.1250489478, 0.0456126910, 0.7968509159}; - cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.1656716588, 0.6753442491, 0.0299828575}; - cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); + //generate adaptation bradford matrix + Matrix adapt_chroma = {}; + + for (int i = 0; i < 3; ++i) { + for (int j = 0; j < 3; ++j) { + adapt_chroma [i][j] = 0; + + for (int k = 0; k < 3; ++k) { + adapt_chroma[i][j] += MaBradford[i][k] * cone_ma_one[k][j]; + } } } - if (primariesPreset == "BruceRGB") { - {//calculated with personnal special spreadsheat - rt = {0.4941542253, 0.2521357351, 0.0157753562}; - cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {0.1495175342, 0.0633521060, 0.7462112712}; - cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.3205288814, 0.6845114263, 0.0629134693}; - cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); + //real matrix XYZ for primaries, temp, Bradford + Matrix mat_xyz_brad = {}; + + for (int i = 0; i < 3; ++i) { + for (int j = 0; j < 3; ++j) { + mat_xyz_brad[i][j] = 0; + + for (int k = 0; k < 3; ++k) { + mat_xyz_brad[i][j] += mat_xyz[i][k] * adapt_chroma[k][j]; + } } } - if (primariesPreset == "ACES-AP0") { - {//calculated with personnal special spreadsheat - rt = {0.9908835135, 0.3618940325, -0.0027137400}; - cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {-0.0389246557, -0.084405166, 0.8193659780}; - cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.0122417831, 0.7225104015, 0.0082478587}; - cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); - } - } - if (primariesPreset == "ACES-AP1") {//done - {//calculated with personnal special spreadsheat - rt = {0.6898756188, 0.2845109670, -0.0060455375}; - cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {0.1245615936, 0.0437959432, 0.8209388333}; - cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.1497634285, 0.6716923572, 0.0100068009}; - cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); - } - } +// printf("adc=%1.10f ad2=%1.10f ad22=%1.10f\n", mat_xyz_brad[0][0], mat_xyz_brad[1][0], mat_xyz_brad[2][2]); + //end generate XYZ matrix - if (primariesPreset == "ProPhoto") { - {//calculated with personnal special spreadsheat - rt = {0.7977198204, 0.2880493171, -0.0000030551}; - cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {0.0313194091, 0.0000771282, 0.8248890748}; - cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.1351614114, 0.7118728221, 0.0000140770}; - cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); - } - } + //write tags + rt = {mat_xyz_brad[0][0], mat_xyz_brad[0][1], mat_xyz_brad[0][2]}; + cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); + gt = {mat_xyz_brad[1][0], mat_xyz_brad[1][1], mat_xyz_brad[1][2]}; + cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); + bt = {mat_xyz_brad[2][0], mat_xyz_brad[2][1], mat_xyz_brad[2][2]}; + cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - if (primariesPreset == "Widegamut") { - {//calculated with personnal special spreadsheat - rt = {0.7161680478, 0.2582038074, -0.0000027515}; - cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {0.1471328469, 0.0168600579, 0.7731227232}; - cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.1008997462, 0.7249354021, 0.0517801251}; - cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); - } - } - - if (primariesPreset == "BestRGB") { - {//calculated with personnal special spreadsheat - rt = {0.6327383009, 0.2284760022, -0.0000024233}; - cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {0.1269437333, 0.0341753604, 0.8153773703}; - cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.2045186067, 0.7373479048, 0.0095251497}; - cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); - } - } - - if (primariesPreset == "BetaRGB") { - {//calculated with personnal special spreadsheat - rt = {0.6713200674, 0.3033034560, -0.0000012307}; - cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); - bt = {0.1183343909, 0.0329265310, 0.7842009909}; - cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); - gt = {0.1745461827, 0.6637692805, 0.0407003365}; - cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); - } - } } else { cmsWhitePointFromTemp(&xyD, (double)temp); @@ -1192,7 +1299,6 @@ void ICCProfileCreator::savePressed() xyD = {0.3457, 0.3585, 1.0}; } -// {0.3457, 0.3585, 1.0}; // Calculate output profile's rTRC gTRC bTRC @@ -1264,7 +1370,7 @@ void ICCProfileCreator::savePressed() printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); } } else { - if (!cmsWriteTag(profile_v2_except, cmsSigProfileDescriptionTag, dmdd)) { + if (!cmsWriteTag(profile_v2_except, cmsSigDeviceModelDescTag, dmdd)) { printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); } diff --git a/rtgui/iccprofilecreator.h b/rtgui/iccprofilecreator.h index 605cb9dcd..74fa4bc54 100644 --- a/rtgui/iccprofilecreator.h +++ b/rtgui/iccprofilecreator.h @@ -95,7 +95,7 @@ private: void adjusterAutoToggled(Adjuster* a, bool newval); static std::vector getGamma(); Glib::ustring getPrimariesPresetName(const Glib::ustring &preset); - void getPrimaries(const Glib::ustring &preset, float *p, ColorTemp &temp); + void getPrimaries(const Glib::ustring &preset, double *p, ColorTemp &temp); Glib::ustring getGammaPresetName(const Glib::ustring &preset); void getGamma(const Glib::ustring &preset, double &gamma, double &slope); void savePressed(); From 3824213e4998305b7f1c1cf6882e3552cb4a91c7 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sat, 17 Nov 2018 19:25:32 +0100 Subject: [PATCH 42/60] Fix two coverity issues --- rtengine/iccstore.cc | 14 +++++++------- rtengine/pdaflinesfilter.cc | 3 ++- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/rtengine/iccstore.cc b/rtengine/iccstore.cc index 4d490c0a0..1f24852d0 100644 --- a/rtengine/iccstore.cc +++ b/rtengine/iccstore.cc @@ -1058,8 +1058,8 @@ cmsHPROFILE rtengine::ICCStore::makeStdGammaProfile(cmsHPROFILE iprof) uint32_t size; } tags[tag_count]; - const uint32_t gamma = 0x239; - int gamma_size = 14; + constexpr uint32_t gamma = 0x239; + constexpr int gamma_size = 14; int data_size = (gamma_size + 3) & ~3; for (uint32_t i = 0; i < tag_count; i++) { @@ -1096,13 +1096,13 @@ cmsHPROFILE rtengine::ICCStore::makeStdGammaProfile(cmsHPROFILE iprof) tags[i].sig == 0x6B545243) { // kTRC if (gamma_offset == 0) { gamma_offset = offset; - uint32_t pcurve[] = { htonl(0x63757276), htonl(0), htonl(gamma_size == 12 ? 0U : 1U) }; + uint32_t pcurve[] = { htonl(0x63757276), htonl(0), htonl(/*gamma_size == 12 ? 0U : */1U) }; memcpy(&nd[offset], pcurve, 12); - if (gamma_size == 14) { - uint16_t gm = htons(gamma); - memcpy(&nd[offset + 12], &gm, 2); - } + //if (gamma_size == 14) { + uint16_t gm = htons(gamma); + memcpy(&nd[offset + 12], &gm, 2); + //} offset += (gamma_size + 3) & ~3; } diff --git a/rtengine/pdaflinesfilter.cc b/rtengine/pdaflinesfilter.cc index ee279f3c0..86c6f2d4c 100644 --- a/rtengine/pdaflinesfilter.cc +++ b/rtengine/pdaflinesfilter.cc @@ -171,7 +171,8 @@ private: PDAFLinesFilter::PDAFLinesFilter(RawImage *ri): ri_(ri), W_(ri->get_width()), - H_(ri->get_height()) + H_(ri->get_height()), + offset_(0) { gthresh_ = new PDAFGreenEqulibrateThreshold(W_, H_); From 741bdd97f25c0604e8c91422241e4d8c0608da37 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sat, 17 Nov 2018 20:20:44 +0100 Subject: [PATCH 43/60] Fix another coverity issue --- rtengine/simpleprocess.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index b36f4d6c1..9e23b51a3 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -1260,8 +1260,8 @@ private: Imagefloat* readyImg = nullptr; cmsHPROFILE jprof = nullptr; - bool customGamma = false; - bool useLCMS = false; + constexpr bool customGamma = false; + constexpr bool useLCMS = false; bool bwonly = params.blackwhite.enabled && !params.colorToning.enabled && !autili && !butili ; ///////////// Custom output gamma has been removed, the user now has to create From 2d5c2b933f8e720ecdc7de2de3b36d8865e6988f Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sat, 17 Nov 2018 23:56:57 +0100 Subject: [PATCH 44/60] Fix another coverity issue --- rtgui/filepanel.cc | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/rtgui/filepanel.cc b/rtgui/filepanel.cc index f75983ac0..23b7c3983 100644 --- a/rtgui/filepanel.cc +++ b/rtgui/filepanel.cc @@ -384,16 +384,6 @@ void FilePanel::optionsChanged () bool FilePanel::handleShortcutKey (GdkEventKey* event) { - bool ctrl = event->state & GDK_CONTROL_MASK; - - if (!ctrl) { - switch(event->keyval) { - } - } else { - switch (event->keyval) { - } - } - if(tpc->getToolBar() && tpc->getToolBar()->handleShortcutKey(event)) { return true; } From bda23b935056cfd96a64d49b9325b2cdbc88dd7f Mon Sep 17 00:00:00 2001 From: "U-PC-BUREAU\\jacques" Date: Sun, 18 Nov 2018 08:28:27 +0100 Subject: [PATCH 45/60] Change Tag dmdd for RTv2_Medium and code for TRC=custom and slope=0 --- rtdata/iccprofiles/output/RTv2_Medium.icc | Bin 876 -> 856 bytes rtengine/iplab2rgb.cc | 8 ++++++-- rtgui/iccprofilecreator.cc | 2 ++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/rtdata/iccprofiles/output/RTv2_Medium.icc b/rtdata/iccprofiles/output/RTv2_Medium.icc index 065c43bc44ed6cbe53fd332875a727a48fc03eb0..454f40d9086dc16fbed0f7c4b8a55fb2851b53a6 100644 GIT binary patch delta 100 zcmaFEc7u(Dfq^+s<(j3)f)MtVjD#Rhr? lAfO0T00#UF=?q2;dO&QzPz=O+Kn#P5lP5B{Prk-94FFr86bt|W delta 121 zcmcb?_J)mxfq^+^BFlHtIVrh$DGUruHy9Wg8j`XLN`Mj(n*|un8QnzFjr2?mK%m&r zNYB#9*wDa05vU9dL>bZ Date: Sun, 18 Nov 2018 11:02:30 +0100 Subject: [PATCH 46/60] Small changes to increase precision gamma --- rtdata/iccprofiles/output/RTv2_Medium.icc | Bin 856 -> 868 bytes rtengine/iplab2rgb.cc | 1 + rtgui/iccprofilecreator.cc | 13 ++++++------- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/rtdata/iccprofiles/output/RTv2_Medium.icc b/rtdata/iccprofiles/output/RTv2_Medium.icc index 454f40d9086dc16fbed0f7c4b8a55fb2851b53a6..ebaf4d133aabc2fdc3a71d6aa7ea1b5152b38b94 100644 GIT binary patch delta 90 zcmcb?_Joavfq^+?BFlHtDJi*mDGUru7Z?~A8j`XLN`Mjpn*|un8TEwIjr0sHEsYE< iiw*P)KtK_w2n>W7(iw~x^cV~oEP>DnL{H9SdJh1^lM;;p delta 78 zcmaFDc7u(Dfq^+s<(j7t3JMtVjD#Rhr? YAfO0T00#UF=?q2;dO&P2xs>TW0OZ*an*aa+ diff --git a/rtengine/iplab2rgb.cc b/rtengine/iplab2rgb.cc index 9094f3526..da8e687ed 100644 --- a/rtengine/iplab2rgb.cc +++ b/rtengine/iplab2rgb.cc @@ -368,6 +368,7 @@ Imagefloat* ImProcFunctions::lab2rgbOut(LabImage* lab, int cx, int cy, int cw, i cmsToneCurve* GammaTRC[3]; if(slopetag == 0.) { + //printf("gammatag=%f\n", gammatag); GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildGamma(NULL, gammatag); } else { diff --git a/rtgui/iccprofilecreator.cc b/rtgui/iccprofilecreator.cc index 97d22ca0b..60b45519a 100644 --- a/rtgui/iccprofilecreator.cc +++ b/rtgui/iccprofilecreator.cc @@ -154,7 +154,7 @@ ICCProfileCreator::ICCProfileCreator(RTWindow *rtwindow) //--------------------------------- sliders gampos and slpos - aGamma = Gtk::manage(new Adjuster(M("ICCPROFCREATOR_GAMMA"), 1, 3.5, 0.01, 2.4)); + aGamma = Gtk::manage(new Adjuster(M("ICCPROFCREATOR_GAMMA"), 1, 3.5, 0.00001, 2.4)); setExpandAlignProperties(aGamma, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_BASELINE); if (aGamma->delay < options.adjusterMaxDelay) { @@ -867,9 +867,8 @@ void ICCProfileCreator::savePressed() ga[2] = 0.; ga[3] = 1. / eps; ga[4] = 0.; - presetGamma = 2.2; + presetGamma = 2.19921875; presetSlope = 0.0; - } else if (gammaPreset == "standard_g1.8") { sGammaPreset = "g=1.8"; ga[0] = 1.8; //gamma=1.8(as gamma of Prophoto) @@ -877,7 +876,7 @@ void ICCProfileCreator::savePressed() ga[2] = 0.; ga[3] = 1. / eps; ga[4] = 0.; - presetGamma = 1.8; + presetGamma = 1.80078125; presetSlope = 0.0; } else if (gammaPreset == "Lab_g3.0s9.03296") { @@ -907,7 +906,7 @@ void ICCProfileCreator::savePressed() //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(6), gamma), Glib::ustring::format(std::setw(6), std::fixed, std::setprecision(5), slope)); presetGamma = gamma; presetSlope = slope; @@ -930,12 +929,12 @@ void ICCProfileCreator::savePressed() Glib::ustring sSlope; if (gammaPreset == "Custom") { - sGamma = Glib::ustring::format(std::setw(3), std::fixed, std::setprecision(2), gamma); + sGamma = Glib::ustring::format(std::setw(6), std::fixed, std::setprecision(6), gamma); sSlope = Glib::ustring::format(std::setw(6), std::fixed, std::setprecision(5), slope); fName = Glib::ustring::compose("RT%1_%2_g%3_s%4.icc", profileVersion, sPrimariesAndIlluminant, sGamma, sSlope); profileDesc = sPrimariesPreset; } else { - sGamma = Glib::ustring::format(std::setw(3), std::fixed, std::setprecision(2), presetGamma); + sGamma = Glib::ustring::format(std::setw(6), std::fixed, std::setprecision(6), presetGamma); sSlope = Glib::ustring::format(std::setw(6), std::fixed, std::setprecision(5), presetSlope); fName = Glib::ustring::compose("RT%1_%2_%3.icc", profileVersion, sPrimariesAndIlluminant, sGammaPreset); profileDesc = sPrimariesPreset + sGammaPreset; From 99c8b6061513742e048bb723e24444d11008521c Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sun, 18 Nov 2018 12:15:30 +0100 Subject: [PATCH 47/60] Fix broken non-raw images --- rtengine/imageio.h | 6 +----- rtengine/stdimagesource.cc | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/rtengine/imageio.h b/rtengine/imageio.h index 0de1de1c0..bb9fbc5f4 100644 --- a/rtengine/imageio.h +++ b/rtengine/imageio.h @@ -106,11 +106,7 @@ public: return sampleArrangement; } - virtual void getStdImage (ColorTemp ctemp, int tran, Imagefloat* image, PreviewProps pp, bool first) - { - printf("getStdImage NULL!\n"); - } - + virtual void getStdImage (ColorTemp ctemp, int tran, Imagefloat* image, PreviewProps pp) = 0; virtual int getBPS () = 0; virtual void getScanline (int row, unsigned char* buffer, int bps, bool isFloat = false) {} virtual void setScanline (int row, unsigned char* buffer, int bps, unsigned int numSamples = 3) {} diff --git a/rtengine/stdimagesource.cc b/rtengine/stdimagesource.cc index 241d5f81d..37d438863 100644 --- a/rtengine/stdimagesource.cc +++ b/rtengine/stdimagesource.cc @@ -194,7 +194,7 @@ void StdImageSource::getImage (const ColorTemp &ctemp, int tran, Imagefloat* ima // the code will use OpenMP as of now. - img->getStdImage(ctemp, tran, image, pp, true); + img->getStdImage(ctemp, tran, image, pp); // Hombre: we could have rotated the image here too, with just few line of code, but: // 1. it would require other modifications in the engine, so "do not touch that little plonker!" From bfe84655630db4a5816003dab3782b9b79261e8d Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sun, 18 Nov 2018 15:43:15 +0100 Subject: [PATCH 48/60] Review of image classes interfaces --- rtengine/iimage.h | 6 +-- rtengine/image16.cc | 4 +- rtengine/image16.h | 44 +++++++++++-------- rtengine/image8.cc | 4 +- rtengine/image8.h | 36 ++++++++++------ rtengine/imagefloat.cc | 4 +- rtengine/imagefloat.h | 20 ++++----- rtengine/imageio.cc | 74 ++++++++++++++++++++++++++----- rtengine/imageio.h | 98 ++++++++++++------------------------------ 9 files changed, 158 insertions(+), 132 deletions(-) diff --git a/rtengine/iimage.h b/rtengine/iimage.h index af2969581..f5f0d075e 100644 --- a/rtengine/iimage.h +++ b/rtengine/iimage.h @@ -1751,10 +1751,10 @@ public: /** @brief Returns a mutex that can is useful in many situations. No image operations shuold be performed without locking this mutex. * @return The mutex */ virtual MyMutex& getMutex () = 0; - virtual cmsHPROFILE getProfile () = 0; + virtual cmsHPROFILE getProfile () const = 0; /** @brief Returns the bits per pixel of the image. * @return The bits per pixel of the image */ - virtual int getBitsPerPixel () = 0; + virtual int getBitsPerPixel () const = 0; /** @brief Saves the image to file. It autodetects the format (jpg, tif, png are supported). * @param fname is the name of the file @return the error code, 0 if none */ @@ -1775,7 +1775,7 @@ public: * @param bps can be 8 or 16 depending on the bits per pixels the output file will have * @param isFloat is true for saving float images. Will be ignored by file format not supporting float data @return the error code, 0 if none */ - virtual int saveAsTIFF (Glib::ustring fname, int bps = -1, float isFloat = false, bool uncompressed = false) = 0; + virtual int saveAsTIFF (Glib::ustring fname, int bps = -1, bool isFloat = false, bool uncompressed = false) = 0; /** @brief Sets the progress listener if you want to follow the progress of the image saving operations (optional). * @param pl is the pointer to the class implementing the ProgressListener interface */ virtual void setSaveProgressListener (ProgressListener* pl) = 0; diff --git a/rtengine/image16.cc b/rtengine/image16.cc index 5ceb4f804..42a2df028 100644 --- a/rtengine/image16.cc +++ b/rtengine/image16.cc @@ -60,7 +60,7 @@ Image16::~Image16() { } -void Image16::getScanline(int row, unsigned char* buffer, int bps, bool isFloat) +void Image16::getScanline(int row, unsigned char* buffer, int bps, bool isFloat) const { if (data == nullptr) { @@ -132,7 +132,7 @@ Image16* Image16::copy() return cp; } -void Image16::getStdImage(ColorTemp ctemp, int tran, Imagefloat* image, PreviewProps pp) +void Image16::getStdImage(const ColorTemp &ctemp, int tran, Imagefloat* image, PreviewProps pp) const { // compute channel multipliers diff --git a/rtengine/image16.h b/rtengine/image16.h index 804f8cc72..8e9f686c9 100644 --- a/rtengine/image16.h +++ b/rtengine/image16.h @@ -40,62 +40,70 @@ public: Image16(int width, int height); ~Image16(); - Image16* copy(); + Image16* copy(); - Image8* to8(); - Imagefloat* tofloat(); + Image8* to8(); + Imagefloat* tofloat(); - virtual void getStdImage(ColorTemp ctemp, int tran, Imagefloat* image, PreviewProps pp); + virtual void getStdImage(const ColorTemp &ctemp, int tran, Imagefloat* image, PreviewProps pp) const; - virtual const char* getType() const + virtual const char* getType() const { return sImage16; } - virtual int getBPS() + virtual int getBPS() const { return 8 * sizeof(unsigned short); } - virtual void getScanline(int row, unsigned char* buffer, int bps, bool isFloat = false); - virtual void setScanline(int row, unsigned char* buffer, int bps, unsigned int numSamples); + virtual void getScanline(int row, unsigned char* buffer, int bps, bool isFloat = false) const; + virtual void setScanline(int row, unsigned char* buffer, int bps, unsigned int numSamples); // functions inherited from IImage16: - virtual MyMutex& getMutex() + virtual MyMutex& getMutex() { return mutex(); } - virtual cmsHPROFILE getProfile() + + virtual cmsHPROFILE getProfile() const { return getEmbeddedProfile(); } - virtual int getBitsPerPixel() + + virtual int getBitsPerPixel() const { return 8 * sizeof(unsigned short); } - virtual int saveToFile(Glib::ustring fname) + + virtual int saveToFile(Glib::ustring fname) { return save(fname); } - virtual int saveAsPNG(Glib::ustring fname, int bps = -1) + + virtual int saveAsPNG(Glib::ustring fname, int bps = -1) { return savePNG(fname, bps); } - virtual int saveAsJPEG(Glib::ustring fname, int quality = 100, int subSamp = 3) + + virtual int saveAsJPEG(Glib::ustring fname, int quality = 100, int subSamp = 3) { return saveJPEG(fname, quality, subSamp); } - virtual int saveAsTIFF(Glib::ustring fname, int bps = -1, float isFloat = false, bool uncompressed = false) + + virtual int saveAsTIFF(Glib::ustring fname, int bps = -1, bool isFloat = false, bool uncompressed = false) { return saveTIFF(fname, bps, isFloat, uncompressed); } - virtual void setSaveProgressListener(ProgressListener* pl) + + virtual void setSaveProgressListener(ProgressListener* pl) { setProgressListener(pl); } - virtual void free() + + virtual void free() { delete this; } - void ExecCMSTransform(cmsHTRANSFORM hTransform); + void ExecCMSTransform(cmsHTRANSFORM hTransform); /* void ExecCMSTransform(cmsHTRANSFORM hTransform, const LabImage &labImage, int cx, int cy); */ }; diff --git a/rtengine/image8.cc b/rtengine/image8.cc index 15a6d9acc..64fe59ecd 100644 --- a/rtengine/image8.cc +++ b/rtengine/image8.cc @@ -37,7 +37,7 @@ Image8::~Image8 () { } -void Image8::getScanline (int row, unsigned char* buffer, int bps, bool isFloat) +void Image8::getScanline (int row, unsigned char* buffer, int bps, bool isFloat) const { if (data == nullptr) { @@ -97,7 +97,7 @@ Image8* Image8::copy () return cp; } -void Image8::getStdImage (ColorTemp ctemp, int tran, Imagefloat* image, PreviewProps pp) +void Image8::getStdImage (const ColorTemp &ctemp, int tran, Imagefloat* image, PreviewProps pp) const { // compute channel multipliers float rm = 1.f, gm = 1.f, bm = 1.f; diff --git a/rtengine/image8.h b/rtengine/image8.h index 9bb5d51e3..521605009 100644 --- a/rtengine/image8.h +++ b/rtengine/image8.h @@ -40,53 +40,61 @@ public: Image8* copy (); - virtual void getStdImage (ColorTemp ctemp, int tran, Imagefloat* image, PreviewProps pp); + virtual void getStdImage (const ColorTemp &ctemp, int tran, Imagefloat* image, PreviewProps pp) const; - virtual const char* getType () const + virtual const char* getType () const { return sImage8; } - virtual int getBPS () + virtual int getBPS () const { return 8 * sizeof(unsigned char); } - virtual void getScanline (int row, unsigned char* buffer, int bps, bool isFloat = false); - virtual void setScanline (int row, unsigned char* buffer, int bps, unsigned int numSamples); + virtual void getScanline (int row, unsigned char* buffer, int bps, bool isFloat = false) const; + virtual void setScanline (int row, unsigned char* buffer, int bps, unsigned int numSamples); // functions inherited from IImage*: - virtual MyMutex& getMutex () + virtual MyMutex& getMutex () { return mutex (); } - virtual cmsHPROFILE getProfile () + + virtual cmsHPROFILE getProfile () const { return getEmbeddedProfile (); } - virtual int getBitsPerPixel () + + virtual int getBitsPerPixel () const { return 8 * sizeof(unsigned char); } - virtual int saveToFile (Glib::ustring fname) + + virtual int saveToFile (Glib::ustring fname) { return save (fname); } - virtual int saveAsPNG (Glib::ustring fname, int bps = -1) + + virtual int saveAsPNG (Glib::ustring fname, int bps = -1) { return savePNG (fname, bps); } - virtual int saveAsJPEG (Glib::ustring fname, int quality = 100, int subSamp = 3) + + virtual int saveAsJPEG (Glib::ustring fname, int quality = 100, int subSamp = 3) { return saveJPEG (fname, quality, subSamp); } - virtual int saveAsTIFF (Glib::ustring fname, int bps = -1, float isFloat = false, bool uncompressed = false) + + virtual int saveAsTIFF (Glib::ustring fname, int bps = -1, bool isFloat = false, bool uncompressed = false) { return saveTIFF (fname, bps, isFloat, uncompressed); } - virtual void setSaveProgressListener (ProgressListener* pl) + + virtual void setSaveProgressListener (ProgressListener* pl) { setProgressListener (pl); } - virtual void free () + + virtual void free () { delete this; } diff --git a/rtengine/imagefloat.cc b/rtengine/imagefloat.cc index fd6bc1c75..baf872e44 100644 --- a/rtengine/imagefloat.cc +++ b/rtengine/imagefloat.cc @@ -110,7 +110,7 @@ void Imagefloat::setScanline (int row, unsigned char* buffer, int bps, unsigned namespace rtengine { extern void filmlike_clip(float *r, float *g, float *b); } -void Imagefloat::getScanline (int row, unsigned char* buffer, int bps, bool isFloat) +void Imagefloat::getScanline (int row, unsigned char* buffer, int bps, bool isFloat) const { if (data == nullptr) { @@ -168,7 +168,7 @@ Imagefloat* Imagefloat::copy () } // This is called by the StdImageSource class. We assume that fp images from StdImageSource don't have to deal with gamma -void Imagefloat::getStdImage (ColorTemp ctemp, int tran, Imagefloat* image, PreviewProps pp) +void Imagefloat::getStdImage (const ColorTemp &ctemp, int tran, Imagefloat* image, PreviewProps pp) const { // compute channel multipliers diff --git a/rtengine/imagefloat.h b/rtengine/imagefloat.h index d84e742ce..e163b6d4f 100644 --- a/rtengine/imagefloat.h +++ b/rtengine/imagefloat.h @@ -49,29 +49,29 @@ public: Image8* to8(); Image16* to16(); - virtual void getStdImage (ColorTemp ctemp, int tran, Imagefloat* image, PreviewProps pp); + virtual void getStdImage (const ColorTemp &ctemp, int tran, Imagefloat* image, PreviewProps pp) const; - virtual const char* getType () const + virtual const char* getType () const { return sImagefloat; } - virtual int getBPS () + virtual int getBPS () const { return 8 * sizeof(float); } - virtual void getScanline (int row, unsigned char* buffer, int bps, bool isFloat = false); - virtual void setScanline (int row, unsigned char* buffer, int bps, unsigned int numSamples); + virtual void getScanline (int row, unsigned char* buffer, int bps, bool isFloat = false) const; + virtual void setScanline (int row, unsigned char* buffer, int bps, unsigned int numSamples); // functions inherited from IImagefloat: - virtual MyMutex& getMutex () + virtual MyMutex& getMutex () { return mutex (); } - virtual cmsHPROFILE getProfile () + virtual cmsHPROFILE getProfile () const { return getEmbeddedProfile (); } - virtual int getBitsPerPixel () + virtual int getBitsPerPixel () const { return 8 * sizeof(float); } @@ -87,7 +87,7 @@ public: { return saveJPEG (fname, quality, subSamp); } - virtual int saveAsTIFF (Glib::ustring fname, int bps = -1, float isFloat = false, bool uncompressed = false) + virtual int saveAsTIFF (Glib::ustring fname, int bps = -1, bool isFloat = false, bool uncompressed = false) { return saveTIFF (fname, bps, isFloat, uncompressed); } @@ -100,7 +100,7 @@ public: delete this; } - inline uint16_t DNG_FloatToHalf(float f) + inline uint16_t DNG_FloatToHalf(float f) const { union { float f; diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index 9ac72be58..76a6417ff 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -201,7 +201,7 @@ void png_read_data(png_struct_def *png_ptr, unsigned char *data, size_t length) void png_write_data(png_struct_def *png_ptr, unsigned char *data, size_t length); void png_flush(png_struct_def *png_ptr); -int ImageIO::getPNGSampleFormat (Glib::ustring fname, IIOSampleFormat &sFormat, IIOSampleArrangement &sArrangement) +int ImageIO::getPNGSampleFormat (const Glib::ustring &fname, IIOSampleFormat &sFormat, IIOSampleArrangement &sArrangement) { FILE *file = g_fopen (fname.c_str (), "rb"); @@ -273,7 +273,7 @@ int ImageIO::getPNGSampleFormat (Glib::ustring fname, IIOSampleFormat &sFormat, } } -int ImageIO::loadPNG (Glib::ustring fname) +int ImageIO::loadPNG (const Glib::ustring &fname) { FILE *file = g_fopen (fname.c_str (), "rb"); @@ -543,7 +543,7 @@ int ImageIO::loadJPEGFromMemory (const char* buffer, int bufsize) return IMIO_SUCCESS; } -int ImageIO::loadJPEG (Glib::ustring fname) +int ImageIO::loadJPEG (const Glib::ustring &fname) { FILE *file = g_fopen(fname.c_str (), "rb"); @@ -629,7 +629,7 @@ int ImageIO::loadJPEG (Glib::ustring fname) } } -int ImageIO::getTIFFSampleFormat (Glib::ustring fname, IIOSampleFormat &sFormat, IIOSampleArrangement &sArrangement) +int ImageIO::getTIFFSampleFormat (const Glib::ustring &fname, IIOSampleFormat &sFormat, IIOSampleArrangement &sArrangement) { #ifdef WIN32 wchar_t *wfilename = (wchar_t*)g_utf8_to_utf16 (fname.c_str(), -1, NULL, NULL, NULL); @@ -731,7 +731,7 @@ int ImageIO::getTIFFSampleFormat (Glib::ustring fname, IIOSampleFormat &sFormat, return IMIO_VARIANTNOTSUPPORTED; } -int ImageIO::loadTIFF (Glib::ustring fname) +int ImageIO::loadTIFF (const Glib::ustring &fname) { static MyMutex thumbMutex; @@ -972,7 +972,7 @@ void PNGwriteRawProfile(png_struct *ping, png_info *ping_info, const char *profi } // namespace -int ImageIO::savePNG (Glib::ustring fname, volatile int bps) +int ImageIO::savePNG (const Glib::ustring &fname, int bps) const { if (getWidth() < 1 || getHeight() < 1) { return IMIO_HEADERERROR; @@ -1111,7 +1111,7 @@ int ImageIO::savePNG (Glib::ustring fname, volatile int bps) // Quality 0..100, subsampling: 1=low quality, 2=medium, 3=high -int ImageIO::saveJPEG (Glib::ustring fname, int quality, int subSamp) +int ImageIO::saveJPEG (const Glib::ustring &fname, int quality, int subSamp) const { if (getWidth() < 1 || getHeight() < 1) { return IMIO_HEADERERROR; @@ -1301,7 +1301,7 @@ int ImageIO::saveJPEG (Glib::ustring fname, int quality, int subSamp) return IMIO_SUCCESS; } -int ImageIO::saveTIFF (Glib::ustring fname, int bps, float isFloat, bool uncompressed) +int ImageIO::saveTIFF (const Glib::ustring &fname, int bps, bool isFloat, bool uncompressed) const { if (getWidth() < 1 || getHeight() < 1) { return IMIO_HEADERERROR; @@ -1595,7 +1595,7 @@ void png_flush(png_structp png_ptr) } } -int ImageIO::load (Glib::ustring fname) +int ImageIO::load (const Glib::ustring &fname) { if (hasPngExtension(fname)) { @@ -1609,7 +1609,7 @@ int ImageIO::load (Glib::ustring fname) } } -int ImageIO::save (Glib::ustring fname) +int ImageIO::save (const Glib::ustring &fname) const { if (hasPngExtension(fname)) { return savePNG (fname); @@ -1621,3 +1621,57 @@ int ImageIO::save (Glib::ustring fname) return IMIO_FILETYPENOTSUPPORTED; } } + +void ImageIO::setProgressListener (ProgressListener* l) +{ + pl = l; +} + +void ImageIO::setSampleFormat(IIOSampleFormat sFormat) +{ + sampleFormat = sFormat; +} + +IIOSampleFormat ImageIO::getSampleFormat() const +{ + return sampleFormat; +} + +void ImageIO::setSampleArrangement(IIOSampleArrangement sArrangement) +{ + sampleArrangement = sArrangement; +} + +IIOSampleArrangement ImageIO::getSampleArrangement() const +{ + return sampleArrangement; +} + +cmsHPROFILE ImageIO::getEmbeddedProfile () const +{ + return embProfile; +} + +void ImageIO::getEmbeddedProfileData (int& length, unsigned char*& pdata) const +{ + length = loadedProfileLength; + pdata = (unsigned char*)loadedProfileData; +} + +MyMutex& ImageIO::mutex () +{ + return imutex; +} + +void ImageIO::deleteLoadedProfileData( ) +{ + if(loadedProfileData) { + if(loadedProfileDataJpg) { + free(loadedProfileData); + } else { + delete[] loadedProfileData; + } + } + + loadedProfileData = nullptr; +} diff --git a/rtengine/imageio.h b/rtengine/imageio.h index bb9fbc5f4..09fcbab81 100644 --- a/rtengine/imageio.h +++ b/rtengine/imageio.h @@ -28,11 +28,11 @@ #define IMIO_FILETYPENOTSUPPORTED 6 #define IMIO_CANNOTWRITEFILE 7 +#include +#include #include "rtengine.h" #include "imageformat.h" -#include #include "procparams.h" -#include #include "../rtexif/rtexif.h" #include "imagedimensions.h" #include "iimage.h" @@ -63,18 +63,8 @@ protected: IIOSampleArrangement sampleArrangement; private: - void deleteLoadedProfileData( ) - { - if(loadedProfileData) { - if(loadedProfileDataJpg) { - free(loadedProfileData); - } else { - delete[] loadedProfileData; - } - } + void deleteLoadedProfileData( ); - loadedProfileData = nullptr; - } public: static Glib::ustring errorMsg[6]; @@ -84,75 +74,41 @@ public: virtual ~ImageIO (); - void setProgressListener (ProgressListener* l) - { - pl = l; - } + void setProgressListener (ProgressListener* l); + void setSampleFormat(IIOSampleFormat sFormat); + IIOSampleFormat getSampleFormat() const; + void setSampleArrangement(IIOSampleArrangement sArrangement); + IIOSampleArrangement getSampleArrangement() const; - void setSampleFormat(IIOSampleFormat sFormat) - { - sampleFormat = sFormat; - } - IIOSampleFormat getSampleFormat() - { - return sampleFormat; - } - void setSampleArrangement(IIOSampleArrangement sArrangement) - { - sampleArrangement = sArrangement; - } - IIOSampleArrangement getSampleArrangement() - { - return sampleArrangement; - } + virtual void getStdImage (const ColorTemp &ctemp, int tran, Imagefloat* image, PreviewProps pp) const = 0; + virtual int getBPS () const = 0; + virtual void getScanline (int row, unsigned char* buffer, int bps, bool isFloat = false) const = 0; + virtual void setScanline (int row, unsigned char* buffer, int bps, unsigned int numSamples = 3) = 0; - virtual void getStdImage (ColorTemp ctemp, int tran, Imagefloat* image, PreviewProps pp) = 0; - virtual int getBPS () = 0; - virtual void getScanline (int row, unsigned char* buffer, int bps, bool isFloat = false) {} - virtual void setScanline (int row, unsigned char* buffer, int bps, unsigned int numSamples = 3) {} + int load (const Glib::ustring &fname); + int save (const Glib::ustring &fname) const; - virtual bool readImage (Glib::ustring &fname, FILE *fh) - { - return false; - }; - virtual bool writeImage (Glib::ustring &fname, FILE *fh) - { - return false; - }; - - int load (Glib::ustring fname); - int save (Glib::ustring fname); - - int loadPNG (Glib::ustring fname); - int loadJPEG (Glib::ustring fname); - int loadTIFF (Glib::ustring fname); - static int getPNGSampleFormat (Glib::ustring fname, IIOSampleFormat &sFormat, IIOSampleArrangement &sArrangement); - static int getTIFFSampleFormat (Glib::ustring fname, IIOSampleFormat &sFormat, IIOSampleArrangement &sArrangement); + int loadPNG (const Glib::ustring &fname); + int loadJPEG (const Glib::ustring &fname); + int loadTIFF (const Glib::ustring &fname); + static int getPNGSampleFormat (const Glib::ustring &fname, IIOSampleFormat &sFormat, IIOSampleArrangement &sArrangement); + static int getTIFFSampleFormat (const Glib::ustring &fname, IIOSampleFormat &sFormat, IIOSampleArrangement &sArrangement); int loadJPEGFromMemory (const char* buffer, int bufsize); int loadPPMFromMemory(const char* buffer, int width, int height, bool swap, int bps); - int savePNG (Glib::ustring fname, volatile int bps = -1); - int saveJPEG (Glib::ustring fname, int quality = 100, int subSamp = 3); - int saveTIFF (Glib::ustring fname, int bps = -1, float isFloat = false, bool uncompressed = false); + int savePNG (const Glib::ustring &fname, int bps = -1) const; + int saveJPEG (const Glib::ustring &fname, int quality = 100, int subSamp = 3) const; + int saveTIFF (const Glib::ustring &fname, int bps = -1, bool isFloat = false, bool uncompressed = false) const; - cmsHPROFILE getEmbeddedProfile () - { - return embProfile; - } - void getEmbeddedProfileData (int& length, unsigned char*& pdata) - { - length = loadedProfileLength; - pdata = (unsigned char*)loadedProfileData; - } + cmsHPROFILE getEmbeddedProfile () const; + void getEmbeddedProfileData (int& length, unsigned char*& pdata) const; void setMetadata (const rtexif::TagDirectory* eroot); void setMetadata (const rtexif::TagDirectory* eroot, const rtengine::procparams::ExifPairs& exif, const rtengine::procparams::IPTCPairs& iptcc); - void setOutputProfile (const char* pdata, int plen); - MyMutex& mutex () - { - return imutex; - } + void setOutputProfile (const char* pdata, int plen); + + MyMutex& mutex (); }; } From 512adf5b62c797b646741777e9eedb1b35563e18 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sun, 18 Nov 2018 18:09:40 +0100 Subject: [PATCH 49/60] Review of image classes interfaces, part 2 --- rtengine/iimage.h | 102 ++++++++++++++++++----------------------- rtengine/image16.cc | 8 ++-- rtengine/image16.h | 14 +++--- rtengine/image8.cc | 2 +- rtengine/image8.h | 10 ++-- rtengine/imagefloat.cc | 6 +-- rtengine/imagefloat.h | 16 +++---- rtengine/imageio.h | 1 + 8 files changed, 72 insertions(+), 87 deletions(-) diff --git a/rtengine/iimage.h b/rtengine/iimage.h index f5f0d075e..2def35e06 100644 --- a/rtengine/iimage.h +++ b/rtengine/iimage.h @@ -82,22 +82,18 @@ public: // Read the raw dump of the data void readData (FILE *fh) {} // Write a raw dump of the data - void writeData (FILE *fh) {} + void writeData (FILE *fh) const {} virtual void normalizeInt (int srcMinVal, int srcMaxVal) {}; virtual void normalizeFloat (float srcMinVal, float srcMaxVal) {}; - virtual void computeHistogramAutoWB (double &avg_r, double &avg_g, double &avg_b, int &n, LUTu &histogram, int compression) {} + virtual void computeHistogramAutoWB (double &avg_r, double &avg_g, double &avg_b, int &n, LUTu &histogram, int compression) const {} virtual void getSpotWBData (double &reds, double &greens, double &blues, int &rn, int &gn, int &bn, std::vector &red, std::vector &green, std::vector &blue, - int tran) {} - virtual void getAutoWBMultipliers (double &rm, double &gm, double &bm) + int tran) const {} + virtual void getAutoWBMultipliers (double &rm, double &gm, double &bm) const { rm = gm = bm = 1.0; } - virtual const char* getType () const - { - return "unknown"; - } }; @@ -232,7 +228,7 @@ public: } // Send back the row stride. WARNING: unit = byte, not element! - int getRowStride () + int getRowStride () const { return rowstride; } @@ -316,7 +312,7 @@ public: } /** Copy the data to another PlanarWhateverData */ - void copyData(PlanarWhateverData *dest) + void copyData(PlanarWhateverData *dest) const { assert (dest != NULL); // Make sure that the size is the same, reallocate if necessary @@ -389,7 +385,7 @@ public: } template - void resizeImgTo (int nw, int nh, TypeInterpolation interp, PlanarWhateverData *imgPtr) + void resizeImgTo (int nw, int nh, TypeInterpolation interp, PlanarWhateverData *imgPtr) const { //printf("resizeImgTo: resizing %s image data (%d x %d) to %s (%d x %d)\n", getType(), width, height, imgPtr->getType(), imgPtr->width, imgPtr->height); if (width == nw && height == nh) { @@ -499,17 +495,7 @@ public: #endif } - void calcHist(unsigned int *hist16) - { - for (int row = 0; row < height; row++) - for (int col = 0; col < width; col++) { - unsigned short idx; - convertTo(v(row, col), idx); - hist16[idx]++; - } - } - - void transformPixel (int x, int y, int tran, int& tx, int& ty) + void transformPixel (int x, int y, int tran, int& tx, int& ty) const { if (!tran) { @@ -552,7 +538,7 @@ public: } } - void getPipetteData (T &value, int posX, int posY, int squareSize, int tran) + void getPipetteData (T &value, int posX, int posY, int squareSize, int tran) const { int x; int y; @@ -573,14 +559,14 @@ public: value = n ? T(accumulator / float(n)) : T(0); } - void readData (FILE *f) + void readData (FILE *f) { for (int i = 0; i < height; i++) { fread (v(i), sizeof(T), width, f); } } - void writeData (FILE *f) + void writeData (FILE *f) const { for (int i = 0; i < height; i++) { fwrite (v(i), sizeof(T), width, f); @@ -622,12 +608,12 @@ public: } // Send back the row stride. WARNING: unit = byte, not element! - int getRowStride () + int getRowStride () const { return rowstride; } // Send back the plane stride. WARNING: unit = byte, not element! - int getPlaneStride () + int getPlaneStride () const { return planestride; } @@ -732,7 +718,7 @@ public: } /** Copy the data to another PlanarRGBData */ - void copyData(PlanarRGBData *dest) + void copyData(PlanarRGBData *dest) const { assert (dest != nullptr); // Make sure that the size is the same, reallocate if necessary @@ -820,7 +806,7 @@ public: } template - void resizeImgTo (int nw, int nh, TypeInterpolation interp, IC *imgPtr) + void resizeImgTo (int nw, int nh, TypeInterpolation interp, IC *imgPtr) const { //printf("resizeImgTo: resizing %s image data (%d x %d) to %s (%d x %d)\n", getType(), width, height, imgPtr->getType(), imgPtr->width, imgPtr->height); if (width == nw && height == nh) { @@ -869,9 +855,9 @@ public: // This case should never occur! for (int i = 0; i < nh; i++) { for (int j = 0; j < nw; j++) { - r(i, j) = 0; - g(i, j) = 0; - b(i, j) = 0; + imgPtr->r(i, j) = 0; + imgPtr->g(i, j) = 0; + imgPtr->b(i, j) = 0; } } } @@ -942,7 +928,7 @@ public: #endif } - void calcGrayscaleHist(unsigned int *hist16) + void calcGrayscaleHist(unsigned int *hist16) const { for (int row = 0; row < height; row++) for (int col = 0; col < width; col++) { @@ -956,7 +942,7 @@ public: } } - void computeAutoHistogram (LUTu & histogram, int& histcompr) + void computeAutoHistogram (LUTu & histogram, int& histcompr) const { histcompr = 3; @@ -975,7 +961,7 @@ public: } } - void computeHistogramAutoWB (double &avg_r, double &avg_g, double &avg_b, int &n, LUTu &histogram, const int compression) + void computeHistogramAutoWB (double &avg_r, double &avg_g, double &avg_b, int &n, LUTu &histogram, const int compression) const { histogram.clear(); avg_r = avg_g = avg_b = 0.; @@ -1007,7 +993,7 @@ public: } } - void getAutoWBMultipliers (double &rm, double &gm, double &bm) + void getAutoWBMultipliers (double &rm, double &gm, double &bm) const { double avg_r = 0.; @@ -1038,7 +1024,7 @@ public: bm = avg_b / double(n); } - void transformPixel (int x, int y, int tran, int& tx, int& ty) + void transformPixel (int x, int y, int tran, int& tx, int& ty) const { if (!tran) { @@ -1083,7 +1069,7 @@ public: virtual void getSpotWBData (double &reds, double &greens, double &blues, int &rn, int &gn, int &bn, std::vector &red, std::vector &green, std::vector &blue, - int tran) + int tran) const { int x; int y; @@ -1120,7 +1106,7 @@ public: } } - void getPipetteData (T &valueR, T &valueG, T &valueB, int posX, int posY, int squareSize, int tran) + void getPipetteData (T &valueR, T &valueG, T &valueB, int posX, int posY, int squareSize, int tran) const { int x; int y; @@ -1147,7 +1133,7 @@ public: valueB = n ? T(accumulatorB / float(n)) : T(0); } - void readData (FILE *f) + void readData (FILE *f) { for (int i = 0; i < height; i++) { fread (r(i), sizeof(T), width, f); @@ -1162,7 +1148,7 @@ public: } } - void writeData (FILE *f) + void writeData (FILE *f) const { for (int i = 0; i < height; i++) { fwrite (r(i), sizeof(T), width, f); @@ -1345,7 +1331,7 @@ public: } /** Copy the data to another ChunkyRGBData */ - void copyData(ChunkyRGBData *dest) + void copyData(ChunkyRGBData *dest) const { assert (dest != nullptr); // Make sure that the size is the same, reallocate if necessary @@ -1421,7 +1407,7 @@ public: } template - void resizeImgTo (int nw, int nh, TypeInterpolation interp, IC *imgPtr) + void resizeImgTo (int nw, int nh, TypeInterpolation interp, IC *imgPtr) const { //printf("resizeImgTo: resizing %s image data (%d x %d) to %s (%d x %d)\n", getType(), width, height, imgPtr->getType(), imgPtr->width, imgPtr->height); if (width == nw && height == nh) { @@ -1485,9 +1471,9 @@ public: // This case should never occur! for (int i = 0; i < nh; i++) { for (int j = 0; j < nw; j++) { - r(i, j) = 0; - g(i, j) = 0; - b(i, j) = 0; + imgPtr->r(i, j) = 0; + imgPtr->g(i, j) = 0; + imgPtr->b(i, j) = 0; } } } @@ -1545,7 +1531,7 @@ public: } } - void calcGrayscaleHist(unsigned int *hist16) + void calcGrayscaleHist(unsigned int *hist16) const { for (int row = 0; row < height; row++) for (int col = 0; col < width; col++) { @@ -1559,7 +1545,7 @@ public: } } - void computeAutoHistogram (LUTu & histogram, int& histcompr) + void computeAutoHistogram (LUTu & histogram, int& histcompr) const { histcompr = 3; @@ -1578,7 +1564,7 @@ public: } } - void computeHistogramAutoWB (double &avg_r, double &avg_g, double &avg_b, int &n, LUTu &histogram, const int compression) + void computeHistogramAutoWB (double &avg_r, double &avg_g, double &avg_b, int &n, LUTu &histogram, const int compression) const { histogram.clear(); avg_r = avg_g = avg_b = 0.; @@ -1610,7 +1596,7 @@ public: } } - void getAutoWBMultipliers (double &rm, double &gm, double &bm) + void getAutoWBMultipliers (double &rm, double &gm, double &bm) const { double avg_r = 0.; @@ -1641,7 +1627,7 @@ public: bm = avg_b / double(n); } - void transformPixel (int x, int y, int tran, int& tx, int& ty) + void transformPixel (int x, int y, int tran, int& tx, int& ty) const { if (!tran) { @@ -1686,7 +1672,7 @@ public: virtual void getSpotWBData (double &reds, double &greens, double &blues, int &rn, int &gn, int &bn, std::vector &red, std::vector &green, std::vector &blue, - int tran) + int tran) const { int x; int y; @@ -1723,14 +1709,14 @@ public: } } - void readData (FILE *f) + void readData (FILE *f) { for (int i = 0; i < height; i++) { fread (r(i), sizeof(T), 3 * width, f); } } - void writeData (FILE *f) + void writeData (FILE *f) const { for (int i = 0; i < height; i++) { fwrite (r(i), sizeof(T), 3 * width, f); @@ -1758,24 +1744,24 @@ public: /** @brief Saves the image to file. It autodetects the format (jpg, tif, png are supported). * @param fname is the name of the file @return the error code, 0 if none */ - virtual int saveToFile (Glib::ustring fname) = 0; + virtual int saveToFile (const Glib::ustring &fname) const = 0; /** @brief Saves the image to file in a png format. * @param fname is the name of the file * @param compression is the amount of compression (0-6), -1 corresponds to the default * @param bps can be 8 or 16 depending on the bits per pixels the output file will have @return the error code, 0 if none */ - virtual int saveAsPNG (Glib::ustring fname, int bps = -1) = 0; + virtual int saveAsPNG (const Glib::ustring &fname, int bps = -1) const = 0; /** @brief Saves the image to file in a jpg format. * @param fname is the name of the file * @param quality is the quality of the jpeg (0...100), set it to -1 to use default @return the error code, 0 if none */ - virtual int saveAsJPEG (Glib::ustring fname, int quality = 100, int subSamp = 3 ) = 0; + virtual int saveAsJPEG (const Glib::ustring &fname, int quality = 100, int subSamp = 3 ) const = 0; /** @brief Saves the image to file in a tif format. * @param fname is the name of the file * @param bps can be 8 or 16 depending on the bits per pixels the output file will have * @param isFloat is true for saving float images. Will be ignored by file format not supporting float data @return the error code, 0 if none */ - virtual int saveAsTIFF (Glib::ustring fname, int bps = -1, bool isFloat = false, bool uncompressed = false) = 0; + virtual int saveAsTIFF (const Glib::ustring &fname, int bps = -1, bool isFloat = false, bool uncompressed = false) const = 0; /** @brief Sets the progress listener if you want to follow the progress of the image saving operations (optional). * @param pl is the pointer to the class implementing the ProgressListener interface */ virtual void setSaveProgressListener (ProgressListener* pl) = 0; diff --git a/rtengine/image16.cc b/rtengine/image16.cc index 42a2df028..618d31641 100644 --- a/rtengine/image16.cc +++ b/rtengine/image16.cc @@ -124,7 +124,7 @@ void Image16::setScanline(int row, unsigned char* buffer, int bps, unsigned int */ } -Image16* Image16::copy() +Image16* Image16::copy() const { Image16* cp = new Image16(width, height); @@ -295,8 +295,7 @@ void Image16::getStdImage(const ColorTemp &ctemp, int tran, Imagefloat* image, P #undef GCLIP } -Image8* -Image16::to8() +Image8* Image16::to8() const { Image8* img8 = new Image8(width, height); @@ -311,8 +310,7 @@ Image16::to8() return img8; } -Imagefloat* -Image16::tofloat() +Imagefloat* Image16::tofloat() const { Imagefloat* imgfloat = new Imagefloat(width, height); diff --git a/rtengine/image16.h b/rtengine/image16.h index 8e9f686c9..973b09504 100644 --- a/rtengine/image16.h +++ b/rtengine/image16.h @@ -40,10 +40,10 @@ public: Image16(int width, int height); ~Image16(); - Image16* copy(); + Image16* copy() const; - Image8* to8(); - Imagefloat* tofloat(); + Image8* to8() const; + Imagefloat* tofloat() const; virtual void getStdImage(const ColorTemp &ctemp, int tran, Imagefloat* image, PreviewProps pp) const; @@ -74,22 +74,22 @@ public: return 8 * sizeof(unsigned short); } - virtual int saveToFile(Glib::ustring fname) + virtual int saveToFile(const Glib::ustring &fname) const { return save(fname); } - virtual int saveAsPNG(Glib::ustring fname, int bps = -1) + virtual int saveAsPNG(const Glib::ustring &fname, int bps = -1) const { return savePNG(fname, bps); } - virtual int saveAsJPEG(Glib::ustring fname, int quality = 100, int subSamp = 3) + virtual int saveAsJPEG(const Glib::ustring &fname, int quality = 100, int subSamp = 3) const { return saveJPEG(fname, quality, subSamp); } - virtual int saveAsTIFF(Glib::ustring fname, int bps = -1, bool isFloat = false, bool uncompressed = false) + virtual int saveAsTIFF(const Glib::ustring &fname, int bps = -1, bool isFloat = false, bool uncompressed = false) const { return saveTIFF(fname, bps, isFloat, uncompressed); } diff --git a/rtengine/image8.cc b/rtengine/image8.cc index 64fe59ecd..edced2fe5 100644 --- a/rtengine/image8.cc +++ b/rtengine/image8.cc @@ -89,7 +89,7 @@ void Image8::setScanline (int row, unsigned char* buffer, int bps, unsigned int } } -Image8* Image8::copy () +Image8* Image8::copy () const { Image8* cp = new Image8 (width, height); diff --git a/rtengine/image8.h b/rtengine/image8.h index 521605009..9460a4fbb 100644 --- a/rtengine/image8.h +++ b/rtengine/image8.h @@ -38,7 +38,7 @@ public: Image8 (int width, int height); ~Image8 (); - Image8* copy (); + Image8* copy () const; virtual void getStdImage (const ColorTemp &ctemp, int tran, Imagefloat* image, PreviewProps pp) const; @@ -69,22 +69,22 @@ public: return 8 * sizeof(unsigned char); } - virtual int saveToFile (Glib::ustring fname) + virtual int saveToFile (const Glib::ustring &fname) const { return save (fname); } - virtual int saveAsPNG (Glib::ustring fname, int bps = -1) + virtual int saveAsPNG (const Glib::ustring &fname, int bps = -1) const { return savePNG (fname, bps); } - virtual int saveAsJPEG (Glib::ustring fname, int quality = 100, int subSamp = 3) + virtual int saveAsJPEG (const Glib::ustring &fname, int quality = 100, int subSamp = 3) const { return saveJPEG (fname, quality, subSamp); } - virtual int saveAsTIFF (Glib::ustring fname, int bps = -1, bool isFloat = false, bool uncompressed = false) + virtual int saveAsTIFF (const Glib::ustring &fname, int bps = -1, bool isFloat = false, bool uncompressed = false) const { return saveTIFF (fname, bps, isFloat, uncompressed); } diff --git a/rtengine/imagefloat.cc b/rtengine/imagefloat.cc index baf872e44..63c521040 100644 --- a/rtengine/imagefloat.cc +++ b/rtengine/imagefloat.cc @@ -159,7 +159,7 @@ void Imagefloat::getScanline (int row, unsigned char* buffer, int bps, bool isFl } } -Imagefloat* Imagefloat::copy () +Imagefloat* Imagefloat::copy () const { Imagefloat* cp = new Imagefloat (width, height); @@ -330,7 +330,7 @@ void Imagefloat::getStdImage (const ColorTemp &ctemp, int tran, Imagefloat* imag } Image8* -Imagefloat::to8() +Imagefloat::to8() const { Image8* img8 = new Image8(width, height); #ifdef _OPENMP @@ -349,7 +349,7 @@ Imagefloat::to8() } Image16* -Imagefloat::to16() +Imagefloat::to16() const { Image16* img16 = new Image16(width, height); #ifdef _OPENMP diff --git a/rtengine/imagefloat.h b/rtengine/imagefloat.h index e163b6d4f..49dce8284 100644 --- a/rtengine/imagefloat.h +++ b/rtengine/imagefloat.h @@ -44,10 +44,10 @@ public: Imagefloat (int width, int height); ~Imagefloat (); - Imagefloat* copy (); + Imagefloat* copy () const; - Image8* to8(); - Image16* to16(); + Image8* to8() const; + Image16* to16() const; virtual void getStdImage (const ColorTemp &ctemp, int tran, Imagefloat* image, PreviewProps pp) const; @@ -75,23 +75,23 @@ public: { return 8 * sizeof(float); } - virtual int saveToFile (Glib::ustring fname) + virtual int saveToFile (const Glib::ustring &fname) const { return save (fname); } - virtual int saveAsPNG (Glib::ustring fname, int bps = -1) + virtual int saveAsPNG (const Glib::ustring &fname, int bps = -1) const { return savePNG (fname, bps); } - virtual int saveAsJPEG (Glib::ustring fname, int quality = 100, int subSamp = 3) + virtual int saveAsJPEG (const Glib::ustring &fname, int quality = 100, int subSamp = 3) const { return saveJPEG (fname, quality, subSamp); } - virtual int saveAsTIFF (Glib::ustring fname, int bps = -1, bool isFloat = false, bool uncompressed = false) + virtual int saveAsTIFF (const Glib::ustring &fname, int bps = -1, bool isFloat = false, bool uncompressed = false) const { return saveTIFF (fname, bps, isFloat, uncompressed); } - virtual void setSaveProgressListener (ProgressListener* pl) + virtual void setSaveProgressListener (ProgressListener* pl) { setProgressListener (pl); } diff --git a/rtengine/imageio.h b/rtengine/imageio.h index 09fcbab81..5970866f0 100644 --- a/rtengine/imageio.h +++ b/rtengine/imageio.h @@ -84,6 +84,7 @@ public: virtual int getBPS () const = 0; virtual void getScanline (int row, unsigned char* buffer, int bps, bool isFloat = false) const = 0; virtual void setScanline (int row, unsigned char* buffer, int bps, unsigned int numSamples = 3) = 0; + virtual const char* getType () const = 0; int load (const Glib::ustring &fname); int save (const Glib::ustring &fname) const; From 5b3fd8ddba4933791e147237f2bdb5d2d38d57ad Mon Sep 17 00:00:00 2001 From: heckflosse Date: Mon, 19 Nov 2018 14:12:16 +0100 Subject: [PATCH 50/60] Review of image classes interfaces, part 3 --- rtengine/image16.h | 29 +++++++++++++++-------------- rtengine/image8.h | 30 ++++++++++++++++-------------- rtengine/imagefloat.h | 30 ++++++++++++++++-------------- 3 files changed, 47 insertions(+), 42 deletions(-) diff --git a/rtengine/image16.h b/rtengine/image16.h index 973b09504..3431d8afd 100644 --- a/rtengine/image16.h +++ b/rtengine/image16.h @@ -45,61 +45,62 @@ public: Image8* to8() const; Imagefloat* tofloat() const; - virtual void getStdImage(const ColorTemp &ctemp, int tran, Imagefloat* image, PreviewProps pp) const; + void getStdImage(const ColorTemp &ctemp, int tran, Imagefloat* image, PreviewProps pp) const override; - virtual const char* getType() const + const char* getType() const override { return sImage16; } - virtual int getBPS() const + int getBPS() const override { return 8 * sizeof(unsigned short); } - virtual void getScanline(int row, unsigned char* buffer, int bps, bool isFloat = false) const; - virtual void setScanline(int row, unsigned char* buffer, int bps, unsigned int numSamples); + + void getScanline(int row, unsigned char* buffer, int bps, bool isFloat = false) const override; + void setScanline(int row, unsigned char* buffer, int bps, unsigned int numSamples) override; // functions inherited from IImage16: - virtual MyMutex& getMutex() + MyMutex& getMutex() override { return mutex(); } - virtual cmsHPROFILE getProfile() const + cmsHPROFILE getProfile() const override { return getEmbeddedProfile(); } - virtual int getBitsPerPixel() const + int getBitsPerPixel() const override { return 8 * sizeof(unsigned short); } - virtual int saveToFile(const Glib::ustring &fname) const + int saveToFile(const Glib::ustring &fname) const override { return save(fname); } - virtual int saveAsPNG(const Glib::ustring &fname, int bps = -1) const + saveAsPNG(const Glib::ustring &fname, int bps = -1) const override { return savePNG(fname, bps); } - virtual int saveAsJPEG(const Glib::ustring &fname, int quality = 100, int subSamp = 3) const + int saveAsJPEG(const Glib::ustring &fname, int quality = 100, int subSamp = 3) const override { return saveJPEG(fname, quality, subSamp); } - virtual int saveAsTIFF(const Glib::ustring &fname, int bps = -1, bool isFloat = false, bool uncompressed = false) const + int saveAsTIFF(const Glib::ustring &fname, int bps = -1, bool isFloat = false, bool uncompressed = false) const override { return saveTIFF(fname, bps, isFloat, uncompressed); } - virtual void setSaveProgressListener(ProgressListener* pl) + void setSaveProgressListener(ProgressListener* pl) override { setProgressListener(pl); } - virtual void free() + void free() override { delete this; } diff --git a/rtengine/image8.h b/rtengine/image8.h index 9460a4fbb..2cc670a4a 100644 --- a/rtengine/image8.h +++ b/rtengine/image8.h @@ -40,61 +40,63 @@ public: Image8* copy () const; - virtual void getStdImage (const ColorTemp &ctemp, int tran, Imagefloat* image, PreviewProps pp) const; + void getStdImage (const ColorTemp &ctemp, int tran, Imagefloat* image, PreviewProps pp) const override; - virtual const char* getType () const + const char* getType () const override { return sImage8; } - virtual int getBPS () const + + int getBPS () const override { return 8 * sizeof(unsigned char); } - virtual void getScanline (int row, unsigned char* buffer, int bps, bool isFloat = false) const; - virtual void setScanline (int row, unsigned char* buffer, int bps, unsigned int numSamples); + + void getScanline (int row, unsigned char* buffer, int bps, bool isFloat = false) const override; + void setScanline (int row, unsigned char* buffer, int bps, unsigned int numSamples) override; // functions inherited from IImage*: - virtual MyMutex& getMutex () + MyMutex& getMutex () override { return mutex (); } - virtual cmsHPROFILE getProfile () const + cmsHPROFILE getProfile () const override { return getEmbeddedProfile (); } - virtual int getBitsPerPixel () const + int getBitsPerPixel () const override { return 8 * sizeof(unsigned char); } - virtual int saveToFile (const Glib::ustring &fname) const + int saveToFile (const Glib::ustring &fname) const override { return save (fname); } - virtual int saveAsPNG (const Glib::ustring &fname, int bps = -1) const + int saveAsPNG (const Glib::ustring &fname, int bps = -1) const override { return savePNG (fname, bps); } - virtual int saveAsJPEG (const Glib::ustring &fname, int quality = 100, int subSamp = 3) const + int saveAsJPEG (const Glib::ustring &fname, int quality = 100, int subSamp = 3) const override { return saveJPEG (fname, quality, subSamp); } - virtual int saveAsTIFF (const Glib::ustring &fname, int bps = -1, bool isFloat = false, bool uncompressed = false) const + int saveAsTIFF (const Glib::ustring &fname, int bps = -1, bool isFloat = false, bool uncompressed = false) const override { return saveTIFF (fname, bps, isFloat, uncompressed); } - virtual void setSaveProgressListener (ProgressListener* pl) + void setSaveProgressListener (ProgressListener* pl) override { setProgressListener (pl); } - virtual void free () + void free () override { delete this; } diff --git a/rtengine/imagefloat.h b/rtengine/imagefloat.h index 49dce8284..bd7ae2a46 100644 --- a/rtengine/imagefloat.h +++ b/rtengine/imagefloat.h @@ -49,53 +49,55 @@ public: Image8* to8() const; Image16* to16() const; - virtual void getStdImage (const ColorTemp &ctemp, int tran, Imagefloat* image, PreviewProps pp) const; + void getStdImage (const ColorTemp &ctemp, int tran, Imagefloat* image, PreviewProps pp) const override; - virtual const char* getType () const + const char* getType () const override { return sImagefloat; } - virtual int getBPS () const + + int getBPS () const override { return 8 * sizeof(float); } - virtual void getScanline (int row, unsigned char* buffer, int bps, bool isFloat = false) const; - virtual void setScanline (int row, unsigned char* buffer, int bps, unsigned int numSamples); + + void getScanline (int row, unsigned char* buffer, int bps, bool isFloat = false) const override; + void setScanline (int row, unsigned char* buffer, int bps, unsigned int numSamples) override; // functions inherited from IImagefloat: - virtual MyMutex& getMutex () + MyMutex& getMutex () override { return mutex (); } - virtual cmsHPROFILE getProfile () const + cmsHPROFILE getProfile () const override { return getEmbeddedProfile (); } - virtual int getBitsPerPixel () const + int getBitsPerPixel () const override { return 8 * sizeof(float); } - virtual int saveToFile (const Glib::ustring &fname) const + int saveToFile (const Glib::ustring &fname) const override { return save (fname); } - virtual int saveAsPNG (const Glib::ustring &fname, int bps = -1) const + int saveAsPNG (const Glib::ustring &fname, int bps = -1) const override { return savePNG (fname, bps); } - virtual int saveAsJPEG (const Glib::ustring &fname, int quality = 100, int subSamp = 3) const + int saveAsJPEG (const Glib::ustring &fname, int quality = 100, int subSamp = 3) const override { return saveJPEG (fname, quality, subSamp); } - virtual int saveAsTIFF (const Glib::ustring &fname, int bps = -1, bool isFloat = false, bool uncompressed = false) const + int saveAsTIFF (const Glib::ustring &fname, int bps = -1, bool isFloat = false, bool uncompressed = false) const override { return saveTIFF (fname, bps, isFloat, uncompressed); } - virtual void setSaveProgressListener (ProgressListener* pl) + void setSaveProgressListener (ProgressListener* pl) override { setProgressListener (pl); } - virtual void free () + void free () override { delete this; } From c9044485a6c2c0776b15018728041eca94102af9 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Mon, 19 Nov 2018 21:49:51 +0100 Subject: [PATCH 51/60] Fix some coverity issues --- rtengine/lcp.cc | 7 ++++++- rtengine/rawimage.cc | 10 +++++----- rtengine/rawimage.h | 2 +- rtexif/rtexif.cc | 23 +++++++++++++---------- 4 files changed, 25 insertions(+), 17 deletions(-) diff --git a/rtengine/lcp.cc b/rtengine/lcp.cc index a1484cdf6..94be05ac2 100644 --- a/rtengine/lcp.cc +++ b/rtengine/lcp.cc @@ -931,7 +931,12 @@ std::shared_ptr rtengine::LCPStore::getProfile(const Glib: std::shared_ptr res; if (!cache.get(filename, res)) { - res.reset(new LCPProfile(filename)); + try { + res.reset(new LCPProfile(filename)); + } catch (...) { + return nullptr; + } + cache.set(filename, res); } diff --git a/rtengine/rawimage.cc b/rtengine/rawimage.cc index 6ef110a03..47ca7085f 100644 --- a/rtengine/rawimage.cc +++ b/rtengine/rawimage.cc @@ -479,13 +479,13 @@ int RawImage::loadRaw (bool loadData, unsigned int imageNum, bool closeFile, Pro iwidth = width; if (filters || colors == 1) { - raw_image = (ushort *) calloc ((raw_height + 7) * raw_width, 2); + raw_image = (ushort *) calloc ((static_cast(raw_height) + 7u) * static_cast(raw_width), 2); merror (raw_image, "main()"); } // dcraw needs this global variable to hold pixel data - image = (dcrawImage_t)calloc (height * width * sizeof * image + meta_length, 1); - meta_data = (char *) (image + height * width); + image = (dcrawImage_t)calloc (static_cast(height) * static_cast(width) * sizeof * image + meta_length, 1); + meta_data = (char *) (image + static_cast(height) * static_cast(width)); if(!image) { return 200; @@ -673,7 +673,7 @@ int RawImage::loadRaw (bool loadData, unsigned int imageNum, bool closeFile, Pro return 0; } -float** RawImage::compress_image(int frameNum, bool freeImage) +float** RawImage::compress_image(unsigned int frameNum, bool freeImage) { if( !image ) { return nullptr; @@ -682,7 +682,7 @@ float** RawImage::compress_image(int frameNum, bool freeImage) if (isBayer() || isXtrans()) { if (!allocation) { // shift the beginning of all frames but the first by 32 floats to avoid cache miss conflicts on CPUs which have <= 4-way associative L1-Cache - allocation = new float[height * width + frameNum * 32]; + allocation = new float[static_cast(height) * static_cast(width) + frameNum * 32u]; data = new float*[height]; for (int i = 0; i < height; i++) { diff --git a/rtengine/rawimage.h b/rtengine/rawimage.h index 7595ad196..7017f4c1b 100644 --- a/rtengine/rawimage.h +++ b/rtengine/rawimage.h @@ -121,7 +121,7 @@ public: { return image; } - float** compress_image(int frameNum, bool freeImage = true); // revert to compressed pixels format and release image data + float** compress_image(unsigned int frameNum, bool freeImage = true); // revert to compressed pixels format and release image data float** data; // holds pixel values, data[i][j] corresponds to the ith row and jth column unsigned prefilters; // original filters saved ( used for 4 color processing ) unsigned int getFrameCount() const { return is_raw; } diff --git a/rtexif/rtexif.cc b/rtexif/rtexif.cc index c35ba7e0b..947795c20 100644 --- a/rtexif/rtexif.cc +++ b/rtexif/rtexif.cc @@ -976,16 +976,19 @@ Tag::Tag (TagDirectory* p, FILE* f, int base) if (tag == 0x002e) { // location of the embedded preview image in raw files of Panasonic cameras ExifManager eManager(f, nullptr, true); - eManager.parseJPEG(ftell(f)); // try to parse the exif data from the preview image + const auto fpos = ftell(f); + if (fpos >= 0) { + eManager.parseJPEG(fpos); // try to parse the exif data from the preview image - if (eManager.roots.size()) { - const TagDirectory* const previewdir = eManager.roots.at(0); - if (previewdir->getTag ("Exif")) { - if (previewdir->getTag ("Make")) { - if (previewdir->getTag ("Make")->valueToString() == "Panasonic") { // "make" is not yet available here, so get it from the preview tags to assure we're doing the right thing - Tag* t = new Tag (parent->getRoot(), lookupAttrib (ifdAttribs, "Exif")); // replace raw exif with preview exif assuming there are the same - t->initSubDir (previewdir->getTag ("Exif")->getDirectory()); - parent->getRoot()->addTag (t); + if (eManager.roots.size()) { + const TagDirectory* const previewdir = eManager.roots.at(0); + if (previewdir->getTag ("Exif")) { + if (previewdir->getTag ("Make")) { + if (previewdir->getTag ("Make")->valueToString() == "Panasonic") { // "make" is not yet available here, so get it from the preview tags to assure we're doing the right thing + Tag* t = new Tag (parent->getRoot(), lookupAttrib (ifdAttribs, "Exif")); // replace raw exif with preview exif assuming there are the same + t->initSubDir (previewdir->getTag ("Exif")->getDirectory()); + parent->getRoot()->addTag (t); + } } } } @@ -2474,7 +2477,7 @@ parse_leafdata (TagDirectory* root, ByteOrder order) char *val = (char *)&value[pos]; if (strncmp (&hdr[8], "CameraObj_ISO_speed", 19) == 0) { - iso_speed = 25 * (1 << (atoi (val) - 1)); + iso_speed = 25 * (1 << std::max((atoi (val) - 1), 0)); found_count++; } else if (strncmp (&hdr[8], "ImgProf_rotation_angle", 22) == 0) { rotation_angle = atoi (val); From f8fc658d718a9d9caa70e2703d78d16a0b8190a2 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Mon, 19 Nov 2018 22:02:03 +0100 Subject: [PATCH 52/60] Fixes for Nikon Z raw decoding Fix to curve decoding ported from rawspeed See #4998 --- rtengine/dcraw.cc | 14 ++++++++++---- rtengine/dcraw.h | 6 ++++-- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index f61cd94c2..0d5870b6a 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -1303,10 +1303,10 @@ void CLASS nikon_load_raw() if (ver0 == 0x46) tree = 2; if (tiff_bps == 14) tree += 3; read_shorts (vpred[0], 4); - max = 1 << tiff_bps & 0x7fff; + max = 1 << (tiff_bps - (ver0 == 0x44 && ver1 == 0x40 ? 2 : 0)) & 0x7fff; if ((csize = get2()) > 1) step = max / (csize-1); - if (ver0 == 0x44 && ver1 == 0x20 && step > 0) { + if (ver0 == 0x44 && (ver1 == 0x20 || ver1 == 0x40) && step > 0) { for (int i=0; i < csize; i++) curve[i*step] = get2(); for (int i=0; i < max; i++) @@ -2562,6 +2562,7 @@ void CLASS packed_load_raw() bwide = raw_width * tiff_bps / 8; bwide += bwide & load_flags >> 9; + bwide += row_padding; rbits = bwide * 8 - raw_width * tiff_bps; if (load_flags & 1) bwide = bwide * 16 / 15; bite = 8 + (load_flags & 56); @@ -6759,8 +6760,13 @@ void CLASS apply_tiff() load_raw = &CLASS packed_load_raw; } else if ((raw_width * 2 * tiff_bps / 16 + 8) * raw_height == tiff_ifd[raw].bytes) { // 14 bit uncompressed from Nikon Z7, still wrong - // each line has 8 padding byte. To inform 'packed_load_raw' about his padding, we have to set load_flags = padding << 9 - load_flags = 8 << 9; + // each line has 8 padding byte. + row_padding = 8; + load_raw = &CLASS packed_load_raw; + } else if ((raw_width * 2 * tiff_bps / 16 + 12) * raw_height == tiff_ifd[raw].bytes) { + // 14 bit uncompressed from Nikon Z6, still wrong + // each line has 12 padding byte. + row_padding = 12; load_raw = &CLASS packed_load_raw; } else load_raw = &CLASS nikon_load_raw; break; diff --git a/rtengine/dcraw.h b/rtengine/dcraw.h index f9591b640..dd4831625 100644 --- a/rtengine/dcraw.h +++ b/rtengine/dcraw.h @@ -47,7 +47,9 @@ public: ,order(0x4949) ,ifname(nullptr) ,meta_data(nullptr) - ,shot_select(0),multi_out(0) + ,shot_select(0) + ,multi_out(0) + ,row_padding(0) ,float_raw_image(nullptr) ,image(nullptr) ,bright(1.) @@ -88,7 +90,7 @@ protected: unsigned tiff_nifds, tiff_samples, tiff_bps, tiff_compress; unsigned black, cblack[4102], maximum, mix_green, raw_color, zero_is_bad; unsigned zero_after_ff, is_raw, dng_version, is_foveon, data_error; - unsigned tile_width, tile_length, gpsdata[32], load_flags; + unsigned tile_width, tile_length, gpsdata[32], load_flags, row_padding; bool xtransCompressed = false; struct fuji_compressed_params { From 772fea2a6a5aa044278f5d9a13e82e9cf4005350 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Mon, 19 Nov 2018 22:06:54 +0100 Subject: [PATCH 53/60] added basic camconst entry for Nikon Z 6 --- rtengine/camconst.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/rtengine/camconst.json b/rtengine/camconst.json index eb4174577..894429426 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -1589,6 +1589,11 @@ Camera constants: "pdaf_pattern" : [0, 12], "pdaf_offset" : 29 }, + + { // Quality C, only colour matrix and PDAF lines info + "make_model" : "Nikon Z 6", + "dcraw_matrix" : [8210, -2534, -683, -5355, 13338, 2212, -1143, 1929, 6464] // Adobe DNG Converter 11.1 Beta ColorMatrix2 + }, { // Quality B, 16Mp and 64Mp raw frames "make_model": "OLYMPUS E-M5MarkII", From 093fd9a26a90bd484ad6e294a1f5c1cfbbef7c36 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Mon, 19 Nov 2018 22:11:09 +0100 Subject: [PATCH 54/60] Fix broken build --- rtengine/image16.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/image16.h b/rtengine/image16.h index 3431d8afd..940416254 100644 --- a/rtengine/image16.h +++ b/rtengine/image16.h @@ -80,7 +80,7 @@ public: return save(fname); } - saveAsPNG(const Glib::ustring &fname, int bps = -1) const override + int saveAsPNG(const Glib::ustring &fname, int bps = -1) const override { return savePNG(fname, bps); } From ab2593cf93178c446b2548c63fbf9c3e77a749a3 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 20 Nov 2018 00:10:38 +0100 Subject: [PATCH 55/60] Fix 2 coverity issues --- rtengine/eahd_demosaic.cc | 2 +- rtgui/filebrowser.cc | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/rtengine/eahd_demosaic.cc b/rtengine/eahd_demosaic.cc index aef016386..4ebeb2d66 100644 --- a/rtengine/eahd_demosaic.cc +++ b/rtengine/eahd_demosaic.cc @@ -206,7 +206,7 @@ inline void RawImageSource::interpolate_row_rb (float* ar, float* ab, float* pg, n++; } - nonGreen2[j] = cg[j] + nonGreen / n; + nonGreen2[j] = cg[j] + nonGreen / std::max(n, 1); } } diff --git a/rtgui/filebrowser.cc b/rtgui/filebrowser.cc index f83e39146..8a508c747 100644 --- a/rtgui/filebrowser.cc +++ b/rtgui/filebrowser.cc @@ -127,9 +127,7 @@ void findOriginalEntries (const std::vector& entries) FileBrowser::FileBrowser () : menuLabel(nullptr), -#ifdef WIN32 miOpenDefaultViewer(nullptr), -#endif selectDF(nullptr), thisIsDF(nullptr), autoDF(nullptr), From 61d8a4f2544bbfb8ea4991af8ff311079d1266ca Mon Sep 17 00:00:00 2001 From: TooWaBoo Date: Tue, 20 Nov 2018 00:12:21 +0100 Subject: [PATCH 56/60] Add classes to curves for css styling (#4986) --- rtgui/coordinateadjuster.cc | 1 - rtgui/diagonalcurveeditorsubgroup.cc | 120 ++++++++++++++++++--------- rtgui/flatcurveeditorsubgroup.cc | 37 ++++++--- 3 files changed, 106 insertions(+), 52 deletions(-) diff --git a/rtgui/coordinateadjuster.cc b/rtgui/coordinateadjuster.cc index 209ef0902..2525a07e5 100644 --- a/rtgui/coordinateadjuster.cc +++ b/rtgui/coordinateadjuster.cc @@ -127,7 +127,6 @@ void CoordinateAdjuster::createWidgets(const std::vector &axis) Gtk::Grid *box = Gtk::manage (new Gtk::Grid()); box->set_orientation(Gtk::ORIENTATION_HORIZONTAL); - box->set_column_spacing(3); setExpandAlignProperties(currAdjuster->label, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); setExpandAlignProperties(currAdjuster->spinButton, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); diff --git a/rtgui/diagonalcurveeditorsubgroup.cc b/rtgui/diagonalcurveeditorsubgroup.cc index c23b25f9a..4cbde55cc 100644 --- a/rtgui/diagonalcurveeditorsubgroup.cc +++ b/rtgui/diagonalcurveeditorsubgroup.cc @@ -52,20 +52,34 @@ DiagonalCurveEditorSubGroup::DiagonalCurveEditorSubGroup (CurveEditorGroup* prt, // custom curve customCurveGrid = new Gtk::Grid (); customCurveGrid->set_orientation(Gtk::ORIENTATION_VERTICAL); - customCurveGrid->set_row_spacing(2); - customCurveGrid->set_column_spacing(2); + customCurveGrid->get_style_context()->add_class("curve-mainbox"); customCurve = Gtk::manage (new MyDiagonalCurve ()); customCurve->setType (DCT_Spline); + + Gtk::Grid* customCurveBox= Gtk::manage (new Gtk::Grid ()); + customCurveBox->get_style_context()->add_class("curve-curvebox"); + customCurveBox->add(*customCurve); Gtk::Grid* custombbox = Gtk::manage (new Gtk::Grid ()); // curvebboxpos 0=above, 1=right, 2=below, 3=left + custombbox->get_style_context()->add_class("curve-buttonbox"); - if (options.curvebboxpos == 0 || options.curvebboxpos == 2) { + if (options.curvebboxpos == 0) { custombbox->set_orientation(Gtk::ORIENTATION_HORIZONTAL); setExpandAlignProperties(custombbox, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - } else { + customCurveGrid->get_style_context()->add_class("top"); + } else if (options.curvebboxpos == 2) { + custombbox->set_orientation(Gtk::ORIENTATION_HORIZONTAL); + setExpandAlignProperties(custombbox, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + customCurveGrid->get_style_context()->add_class("bottom"); + } else if (options.curvebboxpos == 1) { custombbox->set_orientation(Gtk::ORIENTATION_VERTICAL); setExpandAlignProperties(custombbox, false, true, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); + customCurveGrid->get_style_context()->add_class("right"); + } else if (options.curvebboxpos == 3){ + custombbox->set_orientation(Gtk::ORIENTATION_VERTICAL); + setExpandAlignProperties(custombbox, false, true, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); + customCurveGrid->get_style_context()->add_class("left"); } editPointCustom = Gtk::manage (new Gtk::ToggleButton ()); @@ -90,22 +104,23 @@ DiagonalCurveEditorSubGroup::DiagonalCurveEditorSubGroup (CurveEditorGroup* prt, custombbox->attach_next_to(*saveCustom, sideEnd, 1, 1); customCoordAdjuster = Gtk::manage (new CoordinateAdjuster(customCurve, this)); + customCoordAdjuster->get_style_context()->add_class("curve-spinbuttonbox"); // Button box position: 0=above, 1=right, 2=below, 3=left - customCurveGrid->add(*customCurve); + customCurveGrid->add(*customCurveBox); customCurve->set_hexpand(true); if (options.curvebboxpos == 0) { - customCurveGrid->attach_next_to(*custombbox, *customCurve, Gtk::POS_TOP, 1, 1); - customCurveGrid->attach_next_to(*customCoordAdjuster, *customCurve, Gtk::POS_BOTTOM, 1, 1); + customCurveGrid->attach_next_to(*custombbox, *customCurveBox, Gtk::POS_TOP, 1, 1); + customCurveGrid->attach_next_to(*customCoordAdjuster, *customCurveBox, Gtk::POS_BOTTOM, 1, 1); } else if (options.curvebboxpos == 1) { - customCurveGrid->attach_next_to(*custombbox, *customCurve, Gtk::POS_RIGHT, 1, 1); - customCurveGrid->attach_next_to(*customCoordAdjuster, *customCurve, Gtk::POS_BOTTOM, 2, 1); + customCurveGrid->attach_next_to(*custombbox, *customCurveBox, Gtk::POS_RIGHT, 1, 1); + customCurveGrid->attach_next_to(*customCoordAdjuster, *customCurveBox, Gtk::POS_BOTTOM, 2, 1); } else if (options.curvebboxpos == 2) { - customCurveGrid->attach_next_to(*customCoordAdjuster, *customCurve, Gtk::POS_BOTTOM, 1, 1); + customCurveGrid->attach_next_to(*customCoordAdjuster, *customCurveBox, Gtk::POS_BOTTOM, 1, 1); customCurveGrid->attach_next_to(*custombbox, *customCoordAdjuster, Gtk::POS_BOTTOM, 1, 1); } else if (options.curvebboxpos == 3) { - customCurveGrid->attach_next_to(*custombbox, *customCurve, Gtk::POS_LEFT, 1, 1); + customCurveGrid->attach_next_to(*custombbox, *customCurveBox, Gtk::POS_LEFT, 1, 1); customCurveGrid->attach_next_to(*customCoordAdjuster, *custombbox, Gtk::POS_BOTTOM, 2, 1); } @@ -128,21 +143,35 @@ DiagonalCurveEditorSubGroup::DiagonalCurveEditorSubGroup (CurveEditorGroup* prt, // NURBS curve NURBSCurveGrid = new Gtk::Grid (); - NURBSCurveGrid->set_row_spacing(4); - NURBSCurveGrid->set_column_spacing(4); NURBSCurveGrid->set_orientation(Gtk::ORIENTATION_VERTICAL); + NURBSCurveGrid->get_style_context()->add_class("curve-mainbox"); NURBSCurve = Gtk::manage (new MyDiagonalCurve ()); NURBSCurve->setType (DCT_NURBS); + + Gtk::Grid* NURBSCurveBox= Gtk::manage (new Gtk::Grid ()); + NURBSCurveBox->get_style_context()->add_class("curve-curvebox"); + NURBSCurveBox->add(*NURBSCurve); Gtk::Grid* NURBSbbox = Gtk::manage (new Gtk::Grid ()); + NURBSbbox->get_style_context()->add_class("curve-buttonbox"); - if (options.curvebboxpos == 0 || options.curvebboxpos == 2) { + if (options.curvebboxpos == 0) { NURBSbbox->set_orientation(Gtk::ORIENTATION_HORIZONTAL); setExpandAlignProperties(NURBSbbox, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - } else { + NURBSCurveGrid->get_style_context()->add_class("top"); + } else if (options.curvebboxpos == 2) { + NURBSbbox->set_orientation(Gtk::ORIENTATION_HORIZONTAL); + setExpandAlignProperties(NURBSbbox, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + NURBSCurveGrid->get_style_context()->add_class("bottom"); + } else if (options.curvebboxpos == 1) { NURBSbbox->set_orientation(Gtk::ORIENTATION_VERTICAL); setExpandAlignProperties(NURBSbbox, false, true, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); + NURBSCurveGrid->get_style_context()->add_class("right"); + } else if (options.curvebboxpos == 3){ + NURBSbbox->set_orientation(Gtk::ORIENTATION_VERTICAL); + setExpandAlignProperties(NURBSbbox, false, true, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); + NURBSCurveGrid->get_style_context()->add_class("left"); } editPointNURBS = Gtk::manage (new Gtk::ToggleButton ()); @@ -167,22 +196,23 @@ DiagonalCurveEditorSubGroup::DiagonalCurveEditorSubGroup (CurveEditorGroup* prt, NURBSbbox->attach_next_to(*saveNURBS, sideEnd, 1, 1); NURBSCoordAdjuster = Gtk::manage (new CoordinateAdjuster(NURBSCurve, this)); + NURBSCoordAdjuster->get_style_context()->add_class("curve-spinbuttonbox"); // Button box position: 0=above, 1=right, 2=below, 3=left - NURBSCurveGrid->add(*NURBSCurve); + NURBSCurveGrid->add(*NURBSCurveBox); NURBSCurve->set_hexpand(true); if (options.curvebboxpos == 0) { - NURBSCurveGrid->attach_next_to(*NURBSbbox, *NURBSCurve, Gtk::POS_TOP, 1, 1); - NURBSCurveGrid->attach_next_to(*NURBSCoordAdjuster, *NURBSCurve, Gtk::POS_BOTTOM, 1, 1); + NURBSCurveGrid->attach_next_to(*NURBSbbox, *NURBSCurveBox, Gtk::POS_TOP, 1, 1); + NURBSCurveGrid->attach_next_to(*NURBSCoordAdjuster, *NURBSCurveBox, Gtk::POS_BOTTOM, 1, 1); } else if (options.curvebboxpos == 1) { - NURBSCurveGrid->attach_next_to(*NURBSbbox, *NURBSCurve, Gtk::POS_RIGHT, 1, 1); - NURBSCurveGrid->attach_next_to(*NURBSCoordAdjuster, *NURBSCurve, Gtk::POS_BOTTOM, 2, 1); + NURBSCurveGrid->attach_next_to(*NURBSbbox, *NURBSCurveBox, Gtk::POS_RIGHT, 1, 1); + NURBSCurveGrid->attach_next_to(*NURBSCoordAdjuster, *NURBSCurveBox, Gtk::POS_BOTTOM, 2, 1); } else if (options.curvebboxpos == 2) { - NURBSCurveGrid->attach_next_to(*NURBSCoordAdjuster, *NURBSCurve, Gtk::POS_BOTTOM, 1, 1); + NURBSCurveGrid->attach_next_to(*NURBSCoordAdjuster, *NURBSCurveBox, Gtk::POS_BOTTOM, 1, 1); NURBSCurveGrid->attach_next_to(*NURBSbbox, *NURBSCoordAdjuster, Gtk::POS_BOTTOM, 1, 1); } else if (options.curvebboxpos == 3) { - NURBSCurveGrid->attach_next_to(*NURBSbbox, *NURBSCurve, Gtk::POS_LEFT, 1, 1); + NURBSCurveGrid->attach_next_to(*NURBSbbox, *NURBSCurveBox, Gtk::POS_LEFT, 1, 1); NURBSCurveGrid->attach_next_to(*NURBSCoordAdjuster, *NURBSbbox, Gtk::POS_BOTTOM, 2, 1); } @@ -205,25 +235,40 @@ DiagonalCurveEditorSubGroup::DiagonalCurveEditorSubGroup (CurveEditorGroup* prt, // parametric curve paramCurveGrid = new Gtk::Grid (); - paramCurveGrid->set_row_spacing(4); - paramCurveGrid->set_column_spacing(4); paramCurveGrid->set_orientation(Gtk::ORIENTATION_VERTICAL); + paramCurveGrid->get_style_context()->add_class("curve-mainbox"); paramCurve = Gtk::manage (new MyDiagonalCurve ()); paramCurve->setType (DCT_Parametric); + + Gtk::Grid* paramCurveBox= Gtk::manage (new Gtk::Grid ()); + paramCurveBox->get_style_context()->add_class("curve-curvebox"); + paramCurveBox->add(*paramCurve); Gtk::Grid* parambbox = Gtk::manage (new Gtk::Grid ()); + parambbox->get_style_context()->add_class("curve-buttonbox"); - if (options.curvebboxpos == 0 || options.curvebboxpos == 2) { + if (options.curvebboxpos == 0) { parambbox->set_orientation(Gtk::ORIENTATION_HORIZONTAL); setExpandAlignProperties(parambbox, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - } else { + paramCurveGrid->get_style_context()->add_class("top"); + } else if (options.curvebboxpos == 2) { + parambbox->set_orientation(Gtk::ORIENTATION_HORIZONTAL); + setExpandAlignProperties(parambbox, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + paramCurveGrid->get_style_context()->add_class("bottom"); + } else if (options.curvebboxpos == 1) { parambbox->set_orientation(Gtk::ORIENTATION_VERTICAL); setExpandAlignProperties(parambbox, false, true, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); + paramCurveGrid->get_style_context()->add_class("right"); + } else if (options.curvebboxpos == 3){ + parambbox->set_orientation(Gtk::ORIENTATION_VERTICAL); + setExpandAlignProperties(parambbox, false, true, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); + paramCurveGrid->get_style_context()->add_class("left"); } shcSelector = Gtk::manage (new SHCSelector ()); - shcSelector->set_name("CurveSHCSelector"); // To handle the 4px gap between the SHCSelector and the curve through CSS + shcSelector->set_name("CurveSHCSelector"); + paramCurveBox->attach_next_to(*shcSelector, *paramCurve, Gtk::POS_BOTTOM, 1, 1); editParam = Gtk::manage (new Gtk::ToggleButton()); initButton(*editParam, Glib::ustring("crosshair-node-curve.png"), Gtk::ALIGN_START, false, "EDIT_PIPETTE_TOOLTIP"); @@ -272,8 +317,7 @@ DiagonalCurveEditorSubGroup::DiagonalCurveEditorSubGroup (CurveEditorGroup* prt, // paramCurveSliderBox needed to set vspacing(4) between curve+shc and sliders without vspacing between each slider Gtk::Grid* paramCurveSliderBox = Gtk::manage (new Gtk::Grid()); paramCurveSliderBox->set_orientation(Gtk::ORIENTATION_VERTICAL); - paramCurveSliderBox->set_column_spacing(2); - paramCurveSliderBox->set_row_spacing(2); + paramCurveSliderBox->get_style_context()->add_class("curve-sliderbox"); paramCurveSliderBox->attach_next_to(*evhighlights, Gtk::POS_TOP, 1, 1); paramCurveSliderBox->attach_next_to(*evlights, Gtk::POS_TOP, 1, 1); @@ -283,24 +327,20 @@ DiagonalCurveEditorSubGroup::DiagonalCurveEditorSubGroup (CurveEditorGroup* prt, paramCurveGrid->show_all (); // Button box position: 0=above, 1=right, 2=below, 3=left - paramCurveGrid->add(*paramCurve); + paramCurveGrid->add(*paramCurveBox); paramCurve->set_hexpand(true); if (options.curvebboxpos == 0) { - paramCurveGrid->attach_next_to(*parambbox, *paramCurve, Gtk::POS_TOP, 1, 1); - paramCurveGrid->attach_next_to(*shcSelector, *paramCurve, Gtk::POS_BOTTOM, 1, 1); - paramCurveGrid->attach_next_to(*paramCurveSliderBox, *shcSelector, Gtk::POS_BOTTOM, 1, 1); + paramCurveGrid->attach_next_to(*parambbox, *paramCurveBox, Gtk::POS_TOP, 1, 1); + paramCurveGrid->attach_next_to(*paramCurveSliderBox, *paramCurveBox, Gtk::POS_BOTTOM, 1, 1); } else if (options.curvebboxpos == 1) { - paramCurveGrid->attach_next_to(*shcSelector, *paramCurve, Gtk::POS_BOTTOM, 1, 1); - paramCurveGrid->attach_next_to(*parambbox, *paramCurve, Gtk::POS_RIGHT, 1, 2); - paramCurveGrid->attach_next_to(*paramCurveSliderBox, *shcSelector, Gtk::POS_BOTTOM, 2, 1); + paramCurveGrid->attach_next_to(*parambbox, *paramCurveBox, Gtk::POS_RIGHT, 1, 1); + paramCurveGrid->attach_next_to(*paramCurveSliderBox, *paramCurveBox, Gtk::POS_BOTTOM, 2, 1); } else if (options.curvebboxpos == 2) { - paramCurveGrid->attach_next_to(*shcSelector, *paramCurve, Gtk::POS_BOTTOM, 1, 1); - paramCurveGrid->attach_next_to(*parambbox, *shcSelector, Gtk::POS_BOTTOM, 1, 1); + paramCurveGrid->attach_next_to(*parambbox, *paramCurveBox, Gtk::POS_BOTTOM, 1, 1); paramCurveGrid->attach_next_to(*paramCurveSliderBox, *parambbox, Gtk::POS_BOTTOM, 1, 1); } else if (options.curvebboxpos == 3) { - paramCurveGrid->attach_next_to(*shcSelector, *paramCurve, Gtk::POS_BOTTOM, 1, 1); - paramCurveGrid->attach_next_to(*parambbox, *paramCurve, Gtk::POS_LEFT, 1, 2); + paramCurveGrid->attach_next_to(*parambbox, *paramCurveBox, Gtk::POS_LEFT, 1, 1); paramCurveGrid->attach_next_to(*paramCurveSliderBox, *parambbox, Gtk::POS_BOTTOM, 2, 1); } diff --git a/rtgui/flatcurveeditorsubgroup.cc b/rtgui/flatcurveeditorsubgroup.cc index 27b7ac940..376bb55c2 100644 --- a/rtgui/flatcurveeditorsubgroup.cc +++ b/rtgui/flatcurveeditorsubgroup.cc @@ -47,21 +47,35 @@ FlatCurveEditorSubGroup::FlatCurveEditorSubGroup (CurveEditorGroup* prt, Glib::u // ControlPoints curve CPointsCurveGrid = new Gtk::Grid (); - CPointsCurveGrid->set_row_spacing(2); - CPointsCurveGrid->set_column_spacing(2); CPointsCurveGrid->set_orientation(Gtk::ORIENTATION_VERTICAL); + CPointsCurveGrid->get_style_context()->add_class("curve-mainbox"); CPointsCurve = Gtk::manage (new MyFlatCurve ()); CPointsCurve->setType (FCT_MinMaxCPoints); + + Gtk::Grid* CPointsCurveBox = Gtk::manage (new Gtk::Grid ()); + CPointsCurveBox->get_style_context()->add_class("curve-curvebox"); + CPointsCurveBox->add(*CPointsCurve); Gtk::Grid* CPointsbbox = Gtk::manage (new Gtk::Grid ()); // curvebboxpos 0=above, 1=right, 2=below, 3=left + CPointsbbox->get_style_context()->add_class("curve-buttonbox"); - if (options.curvebboxpos == 0 || options.curvebboxpos == 2) { + if (options.curvebboxpos == 0) { CPointsbbox->set_orientation(Gtk::ORIENTATION_HORIZONTAL); setExpandAlignProperties(CPointsbbox, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - } else { + CPointsCurveGrid->get_style_context()->add_class("top"); + } else if (options.curvebboxpos == 2) { + CPointsbbox->set_orientation(Gtk::ORIENTATION_HORIZONTAL); + setExpandAlignProperties(CPointsbbox, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + CPointsCurveGrid->get_style_context()->add_class("bottom"); + } else if (options.curvebboxpos == 1) { CPointsbbox->set_orientation(Gtk::ORIENTATION_VERTICAL); setExpandAlignProperties(CPointsbbox, false, true, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); + CPointsCurveGrid->get_style_context()->add_class("right"); + } else if (options.curvebboxpos == 3){ + CPointsbbox->set_orientation(Gtk::ORIENTATION_VERTICAL); + setExpandAlignProperties(CPointsbbox, false, true, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); + CPointsCurveGrid->get_style_context()->add_class("left"); } editCPoints = Gtk::manage (new Gtk::ToggleButton()); @@ -92,23 +106,24 @@ FlatCurveEditorSubGroup::FlatCurveEditorSubGroup (CurveEditorGroup* prt, Glib::u axis.at(2).setValues(M("CURVEEDITOR_AXIS_LEFT_TAN"), 5, 0.01, 0.1, 0., 1.); axis.at(3).setValues(M("CURVEEDITOR_AXIS_RIGHT_TAN"), 5, 0.01, 0.1, 0., 1.); CPointsCoordAdjuster = Gtk::manage (new CoordinateAdjuster(CPointsCurve, this, axis)); + CPointsCoordAdjuster->get_style_context()->add_class("curve-spinbuttonbox"); } // Button box position: 0=above, 1=right, 2=below, 3=left - CPointsCurveGrid->add(*CPointsCurve); + CPointsCurveGrid->add(*CPointsCurveBox); CPointsCurve->set_hexpand(true); if (options.curvebboxpos == 0) { - CPointsCurveGrid->attach_next_to(*CPointsbbox, *CPointsCurve, Gtk::POS_TOP, 1, 1); - CPointsCurveGrid->attach_next_to(*CPointsCoordAdjuster, *CPointsCurve, Gtk::POS_BOTTOM, 1, 1); + CPointsCurveGrid->attach_next_to(*CPointsbbox, *CPointsCurveBox, Gtk::POS_TOP, 1, 1); + CPointsCurveGrid->attach_next_to(*CPointsCoordAdjuster, *CPointsCurveBox, Gtk::POS_BOTTOM, 1, 1); } else if (options.curvebboxpos == 1) { - CPointsCurveGrid->attach_next_to(*CPointsbbox, *CPointsCurve, Gtk::POS_RIGHT, 1, 1); - CPointsCurveGrid->attach_next_to(*CPointsCoordAdjuster, *CPointsCurve, Gtk::POS_BOTTOM, 2, 1); + CPointsCurveGrid->attach_next_to(*CPointsbbox, *CPointsCurveBox, Gtk::POS_RIGHT, 1, 1); + CPointsCurveGrid->attach_next_to(*CPointsCoordAdjuster, *CPointsCurveBox, Gtk::POS_BOTTOM, 2, 1); } else if (options.curvebboxpos == 2) { - CPointsCurveGrid->attach_next_to(*CPointsCoordAdjuster, *CPointsCurve, Gtk::POS_BOTTOM, 1, 1); + CPointsCurveGrid->attach_next_to(*CPointsCoordAdjuster, *CPointsCurveBox, Gtk::POS_BOTTOM, 1, 1); CPointsCurveGrid->attach_next_to(*CPointsbbox, *CPointsCoordAdjuster, Gtk::POS_BOTTOM, 1, 1); } else if (options.curvebboxpos == 3) { - CPointsCurveGrid->attach_next_to(*CPointsbbox, *CPointsCurve, Gtk::POS_LEFT, 1, 1); + CPointsCurveGrid->attach_next_to(*CPointsbbox, *CPointsCurveBox, Gtk::POS_LEFT, 1, 1); CPointsCurveGrid->attach_next_to(*CPointsCoordAdjuster, *CPointsbbox, Gtk::POS_BOTTOM, 2, 1); } From 1cdd814e1bba2e4c95032972de37f13532bcc5e9 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 20 Nov 2018 14:42:39 +0100 Subject: [PATCH 57/60] Fix coverity issues --- rtengine/lcp.cc | 7 ++++--- rtengine/lcp.h | 4 ++-- rtengine/lj92.c | 4 +++- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/rtengine/lcp.cc b/rtengine/lcp.cc index 94be05ac2..34ad7a545 100644 --- a/rtengine/lcp.cc +++ b/rtengine/lcp.cc @@ -760,12 +760,13 @@ void XMLCALL rtengine::LCPProfile::XmlStartHandler(void* pLCPProfile, const char ++src; } - strcpy(pProf->lastTag, src); - + strncpy(pProf->lastTag, src, sizeof(pProf->lastTag) - 1); + pProf->lastTag[sizeof(pProf->lastTag) - 1] = 0; const std::string src_str = src; if (src_str == "VignetteModelPiecewiseParam") { - strcpy(pProf->inInvalidTag, src); + strncpy(pProf->inInvalidTag, src, sizeof(pProf->inInvalidTag) - 1); + pProf->inInvalidTag[sizeof(pProf->inInvalidTag) - 1] = 0; } if (src_str == "CameraProfiles") { diff --git a/rtengine/lcp.h b/rtengine/lcp.h index b50fd335e..d588ac381 100644 --- a/rtengine/lcp.h +++ b/rtengine/lcp.h @@ -131,8 +131,8 @@ private: bool inPerspect; bool inAlternateLensID; bool inAlternateLensNames; - char lastTag[256]; - char inInvalidTag[256]; + char lastTag[257]; + char inInvalidTag[257]; LCPPersModel* pCurPersModel; LCPModelCommon* pCurCommon; diff --git a/rtengine/lj92.c b/rtengine/lj92.c index cfdae6bf9..c4f1cc15c 100644 --- a/rtengine/lj92.c +++ b/rtengine/lj92.c @@ -89,7 +89,7 @@ static int parseHuff(ljp* self) { u8* huffhead = &self->data[self->ix]; // xstruct.unpack('>HB16B',self.data[self.ix:self.ix+19]) u8* bits = &huffhead[2]; bits[0] = 0; // Because table starts from 1 - int hufflen = BEH(huffhead[0]); + unsigned int hufflen = BEH(huffhead[0]); if ((self->ix + hufflen) >= self->datalen) return ret; #ifdef SLOW_HUFF u8* huffval = calloc(hufflen - 19,sizeof(u8)); @@ -546,8 +546,10 @@ static int parseScan(ljp* self) { Px = left + lastrow[col] - lastrow[col-1];break; case 5: Px = left + ((lastrow[col] - lastrow[col-1])>>1);break; + /* case 6 has a shortcut above case 6: Px = lastrow[col] + ((left - lastrow[col-1])>>1);break; + */ case 7: Px = (left + lastrow[col])>>1;break; } From 087e438cdf8f272604a71c61517ae7fc099e7e8e Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 20 Nov 2018 15:45:13 +0100 Subject: [PATCH 58/60] Fix coverity issues --- rtengine/iimage.h | 16 +++++++--- rtengine/rtthumbnail.cc | 68 ++++++++++++++++++++++++----------------- 2 files changed, 52 insertions(+), 32 deletions(-) diff --git a/rtengine/iimage.h b/rtengine/iimage.h index 2def35e06..5598f4f5a 100644 --- a/rtengine/iimage.h +++ b/rtengine/iimage.h @@ -1136,15 +1136,21 @@ public: void readData (FILE *f) { for (int i = 0; i < height; i++) { - fread (r(i), sizeof(T), width, f); + if (fread(r(i), sizeof(T), width, f) < width * sizeof(T)) { + break; + } } for (int i = 0; i < height; i++) { - fread (g(i), sizeof(T), width, f); + if (fread(g(i), sizeof(T), width, f) < width * sizeof(T)) { + break; + } } for (int i = 0; i < height; i++) { - fread (b(i), sizeof(T), width, f); + if (fread(b(i), sizeof(T), width, f) < width * sizeof(T)) { + break; + } } } @@ -1712,7 +1718,9 @@ public: void readData (FILE *f) { for (int i = 0; i < height; i++) { - fread (r(i), sizeof(T), 3 * width, f); + if (fread(r(i), sizeof(T), 3 * width, f) < 3 * width * sizeof(T)) { + break; + } } } diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index 2d911087c..fe5fb9b86 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -1934,46 +1934,53 @@ bool Thumbnail::readImage (const Glib::ustring& fname) Glib::ustring fullFName = fname + ".rtti"; - if (!Glib::file_test (fullFName, Glib::FILE_TEST_EXISTS)) { + if (!Glib::file_test(fullFName, Glib::FILE_TEST_EXISTS)) { return false; } - FILE* f = g_fopen (fullFName.c_str (), "rb"); + FILE* f = g_fopen(fullFName.c_str (), "rb"); if (!f) { return false; } char imgType[31]; // 30 -> arbitrary size, but should be enough for all image type's name - fgets (imgType, 30, f); - imgType[strlen (imgType) - 1] = '\0'; // imgType has a \n trailing character, so we overwrite it by the \0 char + fgets(imgType, 30, f); + imgType[strlen(imgType) - 1] = '\0'; // imgType has a \n trailing character, so we overwrite it by the \0 char guint32 width, height; - fread (&width, 1, sizeof (guint32), f); - fread (&height, 1, sizeof (guint32), f); + + if (fread(&width, 1, sizeof(guint32), f) < sizeof(guint32)) { + width = 0; + } + + if (fread(&height, 1, sizeof(guint32), f) < sizeof(guint32)) { + height = 0; + } bool success = false; - if (!strcmp (imgType, sImage8)) { - Image8 *image = new Image8 (width, height); - image->readData (f); - thumbImg = image; - success = true; - } else if (!strcmp (imgType, sImage16)) { - Image16 *image = new Image16 (width, height); - image->readData (f); - thumbImg = image; - success = true; - } else if (!strcmp (imgType, sImagefloat)) { - Imagefloat *image = new Imagefloat (width, height); - image->readData (f); - thumbImg = image; - success = true; - } else { - printf ("readImage: Unsupported image type \"%s\"!\n", imgType); + if (std::min(width , height) > 0) { + if (!strcmp(imgType, sImage8)) { + Image8 *image = new Image8(width, height); + image->readData(f); + thumbImg = image; + success = true; + } else if (!strcmp(imgType, sImage16)) { + Image16 *image = new Image16(width, height); + image->readData(f); + thumbImg = image; + success = true; + } else if (!strcmp(imgType, sImagefloat)) { + Imagefloat *image = new Imagefloat(width, height); + image->readData(f); + thumbImg = image; + success = true; + } else { + printf ("readImage: Unsupported image type \"%s\"!\n", imgType); + } } - - fclose (f); + fclose(f); return success; } @@ -2223,14 +2230,19 @@ bool Thumbnail::writeEmbProfile (const Glib::ustring& fname) bool Thumbnail::readAEHistogram (const Glib::ustring& fname) { - FILE* f = g_fopen (fname.c_str (), "rb"); + FILE* f = g_fopen(fname.c_str(), "rb"); if (!f) { aeHistogram.reset(); } else { - aeHistogram (65536 >> aeHistCompression); - fread (&aeHistogram[0], 1, (65536 >> aeHistCompression)*sizeof (aeHistogram[0]), f); + aeHistogram(65536 >> aeHistCompression); + const size_t histoBytes = (65536 >> aeHistCompression) * sizeof(aeHistogram[0]); + const int bytesRead = fread(&aeHistogram[0], 1, histoBytes, f); fclose (f); + if (bytesRead != histoBytes) { + aeHistogram.reset(); + return false; + } return true; } From 26f8cde2f5e61bdc65e71bfe4e9a2fe816b94f97 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Tue, 20 Nov 2018 16:45:58 +0100 Subject: [PATCH 59/60] camconst: added PDAF lines info for the Nikon Z 6 --- rtengine/camconst.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/rtengine/camconst.json b/rtengine/camconst.json index 894429426..2113c5532 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -1592,7 +1592,9 @@ Camera constants: { // Quality C, only colour matrix and PDAF lines info "make_model" : "Nikon Z 6", - "dcraw_matrix" : [8210, -2534, -683, -5355, 13338, 2212, -1143, 1929, 6464] // Adobe DNG Converter 11.1 Beta ColorMatrix2 + "dcraw_matrix" : [8210, -2534, -683, -5355, 13338, 2212, -1143, 1929, 6464], // Adobe DNG Converter 11.1 Beta ColorMatrix2 + "pdaf_pattern" : [0, 12], + "pdaf_offset" : 32 }, { // Quality B, 16Mp and 64Mp raw frames From aa286a32f9f610396f79426a51bf399bddd11f61 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 20 Nov 2018 17:16:02 +0100 Subject: [PATCH 60/60] Fix bug I introduced with last commit --- rtengine/iimage.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rtengine/iimage.h b/rtengine/iimage.h index 5598f4f5a..c25425b7d 100644 --- a/rtengine/iimage.h +++ b/rtengine/iimage.h @@ -1136,19 +1136,19 @@ public: void readData (FILE *f) { for (int i = 0; i < height; i++) { - if (fread(r(i), sizeof(T), width, f) < width * sizeof(T)) { + if (fread(r(i), sizeof(T), width, f) < width) { break; } } for (int i = 0; i < height; i++) { - if (fread(g(i), sizeof(T), width, f) < width * sizeof(T)) { + if (fread(g(i), sizeof(T), width, f) < width) { break; } } for (int i = 0; i < height; i++) { - if (fread(b(i), sizeof(T), width, f) < width * sizeof(T)) { + if (fread(b(i), sizeof(T), width, f) < width) { break; } } @@ -1718,7 +1718,7 @@ public: void readData (FILE *f) { for (int i = 0; i < height; i++) { - if (fread(r(i), sizeof(T), 3 * width, f) < 3 * width * sizeof(T)) { + if (fread(r(i), sizeof(T), 3 * width, f) < 3 * width) { break; } }