diff --git a/rtdata/languages/default b/rtdata/languages/default index 747dfa863..141b38a55 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1297,6 +1297,118 @@ HISTORY_MSG_1047;Local - SH and Tone Equalizer strength HISTORY_MSG_1048;Local - DR and Exposure strength HISTORY_MSG_1049;Local - TM strength HISTORY_MSG_1050;Local - Log encoding chroma +HISTORY_MSG_1051;Local - Residual wavelet gamma +HISTORY_MSG_1052;Local - Residual wavelet slope +HISTORY_MSG_1053;Local - Denoise gamma +HISTORY_MSG_1054;Local - Wavelet gamma +HISTORY_MSG_1055;Local - Color and Light gamma +HISTORY_MSG_1056;Local - DR and Exposure gamma +HISTORY_MSG_1057;Local - CIECAM Enabled +HISTORY_MSG_1058;Local - CIECAM Overall strength +HISTORY_MSG_1059;Local - CIECAM Autogray +HISTORY_MSG_1060;Local - CIECAM Mean luminance source +HISTORY_MSG_1061;Local - CIECAM Source absolute +HISTORY_MSG_1062;Local - CIECAM Surround Source +HISTORY_MSG_1063;Local - CIECAM Saturation +HISTORY_MSG_1064;Local - CIECAM Chroma +HISTORY_MSG_1062;Local - CIECAM Lightness +HISTORY_MSG_1063;Local - CIECAM Brightness +HISTORY_MSG_1064;Local - CIECAM threshold +HISTORY_MSG_1065;Local - CIECAM lightness J +HISTORY_MSG_1066;Local - CIECAM brightness +HISTORY_MSG_1067;Local - CIECAM Contrast J +HISTORY_MSG_1068;Local - CIECAM threshold +HISTORY_MSG_1069;Local - CIECAM contrast Q +HISTORY_MSG_1070;Local - CIECAM colorfullness +HISTORY_MSG_1071;Local - CIECAM Absolute luminance +HISTORY_MSG_1072;Local - CIECAM Mean luminance +HISTORY_MSG_1073;Local - CIECAM Cat16 +HISTORY_MSG_1074;Local - CIECAM Local contrast +HISTORY_MSG_1075;Local - CIECAM Surround viewing +HISTORY_MSG_1076;Local - CIECAM Scope +HISTORY_MSG_1077;Local - CIECAM Mode +HISTORY_MSG_1078;Local - Red and skin protection +HISTORY_MSG_1079;Local - CIECAM Sigmoid strength J +HISTORY_MSG_1080;Local - CIECAM Sigmoid threshold +HISTORY_MSG_1081;Local - CIECAM Sigmoid blend +HISTORY_MSG_1082;Local - CIECAM Sigmoid Q J +HISTORY_MSG_1083;Local - CIECAM Hue +HISTORY_MSG_1084;Local - Uses Black Ev - White Ev +HISTORY_MSG_1085;Local - Jz lightness +HISTORY_MSG_1086;Local - Jz contrast +HISTORY_MSG_1087;Local - Jz chroma +HISTORY_MSG_1088;Local - Jz hue +HISTORY_MSG_1089;Local - Jz Sigmoid strength +HISTORY_MSG_1090;Local - Jz Sigmoid threshold +HISTORY_MSG_1091;Local - Jz Sigmoid blend +HISTORY_MSG_1092;Local - Jz adaptation +HISTORY_MSG_1093;Local - CAM model +HISTORY_MSG_1094;Local - Jz highligths +HISTORY_MSG_1095;Local - Jz highligths thr +HISTORY_MSG_1096;Local - Jz shadows +HISTORY_MSG_1097;Local - Jz shadows thr +HISTORY_MSG_1098;Local - Jz radius SH +//HISTORY_MSG_1099;Local - Hz(Hz) Curve +HISTORY_MSG_1099;Local - Cz(Hz) Curve +HISTORY_MSG_1100;Local - Jz reference 100 +HISTORY_MSG_1101;Local - Jz PQ remap +HISTORY_MSG_1102;Local - Jz(Hz) Curve +HISTORY_MSG_1103;Local - Vibrance gamma +HISTORY_MSG_1104;Local - Sharp gamma +HISTORY_MSG_1105;Local - CIECAM Tone method +HISTORY_MSG_1106;Local - CIECAM Tone curve +HISTORY_MSG_1107;Local - CIECAM Color method +HISTORY_MSG_1108;Local - CIECAM Color curve +HISTORY_MSG_1109;Local - Jz(Jz) curve +HISTORY_MSG_1110;Local - Cz(Cz) curve +HISTORY_MSG_1111;Local - Cz(Jz) curve +HISTORY_MSG_1112;Local - forcejz +/* +HISTORY_MSG_1114;Local - ZCAM lightness +HISTORY_MSG_1115;Local - ZCAM brightness +HISTORY_MSG_1116;Local - ZCAM contrast J +HISTORY_MSG_1117;Local - ZCAM contrast Q +HISTORY_MSG_1118;Local - ZCAM contrast threshold +HISTORY_MSG_1119;Local - ZCAM colorfullness +HISTORY_MSG_1120;Local - ZCAM saturation +HISTORY_MSG_1121;Local - ZCAM chroma +*/ +HISTORY_MSG_1113;Local - HDR PQ +HISTORY_MSG_1114;Local - Cie mask enable +HISTORY_MSG_1115;Local - Cie mask curve C +HISTORY_MSG_1116;Local - Cie mask curve L +HISTORY_MSG_1117;Local - Cie mask curve H +HISTORY_MSG_1118;Local - Cie mask blend +HISTORY_MSG_1119;Local - Cie mask radius +HISTORY_MSG_1120;Local - Cie mask chroma +HISTORY_MSG_1121;Local - Cie mask contrast curve +HISTORY_MSG_1122;Local - Cie mask recovery threshold +HISTORY_MSG_1123;Local - Cie mask recovery dark +HISTORY_MSG_1124;Local - Cie mask recovery light +HISTORY_MSG_1125;Local - Cie mask recovery decay +HISTORY_MSG_1126;Local - Cie mask laplacian +HISTORY_MSG_1127;Local - Cie mask gamma +HISTORY_MSG_1128;Local - Cie mask slope +HISTORY_MSG_1129;Local - Cie Relative luminance +HISTORY_MSG_1130;Local - Cie Saturation Jz +HISTORY_MSG_1131;Local - Mask denoise chroma +HISTORY_MSG_1132;Local - Cie Wav sigma Jz +HISTORY_MSG_1133;Local - Cie Wav level Jz +HISTORY_MSG_1134;Local - Cie Wav local contrast Jz +HISTORY_MSG_1135;Local - Cie Wav clarity Jz +HISTORY_MSG_1136;Local - Cie Wav clarity Cz +HISTORY_MSG_1137;Local - Cie Wav clarity Soft +HISTORY_MSG_1138;Local - Local - Hz(Hz) Curve +HISTORY_MSG_1139;Local - Jz soft Curves H +HISTORY_MSG_1140;Local - Jz Threshold chroma +HISTORY_MSG_1141;Local - chroma curve Jz(Hz) +HISTORY_MSG_1142;Local - strength soft +HISTORY_MSG_1143;Local - Jz blackev +HISTORY_MSG_1144;Local - Jz whiteev +HISTORY_MSG_1145;Local - Jz Log encoding +HISTORY_MSG_1146;Local - Jz Log encoding target gray +HISTORY_MSG_1147;Local - Jz BlackEv WhiteEv +HISTORY_MSG_1148;Local - Jz Sigmoid HISTORY_MSG_BLSHAPE;Blur by level HISTORY_MSG_BLURCWAV;Blur chroma HISTORY_MSG_BLURWAV;Blur luminance @@ -2172,8 +2284,8 @@ TP_COLORAPP_VIEWINGF_TOOLTIP;Takes into account the support on which the final i TP_COLORAPP_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16 cd/m²). TP_COLORAPP_WBCAM;WB [RT+CAT02/16] + [output] TP_COLORAPP_WBRT;WB [RT] + [output] -TP_COLORAPP_YBOUT_TOOLTIP;Yb is the relative luminance of the background, expressed in % of gray. A gray at 18% corresponds to a background luminance expressed in CIE L of 50%.\nThis data must take into account the average luminance of the image -TP_COLORAPP_YBSCEN_TOOLTIP;Yb is the relative luminance of the background, expressed in % of gray. A gray at 18% corresponds to a background luminance expressed in CIE L of 50%.\nThis data is calculated from the average luminance of the image +TP_COLORAPP_YBOUT_TOOLTIP;Yb is the relative luminance of the background, expressed in % of gray. 18% gray corresponds to a background luminance of 50% expressed in CIE L.\nThe data is based on the mean luminance of the image +TP_COLORAPP_YBSCEN_TOOLTIP;Yb is the relative luminance of the background, expressed in % of gray. 18% gray corresponds to a background luminance of 50% expressed in CIE L.\nThe data is based on the mean luminance of the image TP_COLORTONING_AB;o C/L TP_COLORTONING_AUTOSAT;Automatic TP_COLORTONING_BALANCE;Balance @@ -2578,9 +2690,13 @@ TP_LOCALLAB_AMOUNT;Amount TP_LOCALLAB_ARTIF;Shape detection TP_LOCALLAB_ARTIF_TOOLTIP;ΔE scope threshold increases the range of deltaE scope. High values are for very wide gamut images.\nIncreasing deltaE decay can improve shape detection, but can also reduce the scope. TP_LOCALLAB_AUTOGRAY;Auto mean luminance (Yb%) +TP_LOCALLAB_AUTOGRAYCIE;Auto +TP_LOCALLAB_AUTOGRAYCIE_TOOLTIP;Automatically calculates the “Mean luminance” and “Absolute luminance”.\nFor Jz Cz Hz: automatically calculates "PU adaptation", "Black Ev" and "White Ev". TP_LOCALLAB_AVOID;Avoid color shift +TP_LOCALLAB_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction (Uniform Perceptual Lab).\nMunsell correction always disabled when Jz or CAM16 is used. TP_LOCALLAB_AVOIDRAD;Soft radius TP_LOCALLAB_AVOIDMUN;Munsell correction only +TP_LOCALLAB_AVOIDMUN_TOOLTIP;Munsell correction always disabled when Jz or CAM16 is used TP_LOCALLAB_BALAN;ab-L balance (ΔE) TP_LOCALLAB_BALANEXP;Laplacian balance TP_LOCALLAB_BALANH;C-H balance (ΔE) @@ -2623,6 +2739,15 @@ TP_LOCALLAB_BUTTON_DEL;Delete TP_LOCALLAB_BUTTON_DUPL;Duplicate TP_LOCALLAB_BUTTON_REN;Rename TP_LOCALLAB_BUTTON_VIS;Show/Hide +TP_LOCALLAB_BWFORCE;Uses Black Ev & White Ev +TP_LOCALLAB_CAM16_FRA;Cam16 Image Adjustments +TP_LOCALLAB_CAM16PQREMAP;HDR PQ (Peak Luminance) +TP_LOCALLAB_CAM16PQREMAP_TOOLTIP;PQ (Perceptual Quantizer) adapted to CAM16. Allows you to change the internal PQ function (usually 10000 cd/m2 - default 100 cd/m2 - disabled for 100 cd/m2).\nCan be used to adapt to different devices and images. +TP_LOCALLAB_CAMMODE;CAM model +TP_LOCALLAB_CAMMODE_ALL;CAM 16 + Jz Cz Hz +TP_LOCALLAB_CAMMODE_CAM16;CAM 16 +TP_LOCALLAB_CAMMODE_ZCAM;ZCAM only +TP_LOCALLAB_CAMMODE_JZ;Jz Cz Hz TP_LOCALLAB_CATAD;Chromatic adaptation/Cat16 TP_LOCALLAB_CBDL;Contrast by Detail Levels TP_LOCALLAB_CBDLCLARI_TOOLTIP;Enhances local contrast of the midtones. @@ -2642,19 +2767,36 @@ TP_LOCALLAB_CHROMASKCOL;Chroma TP_LOCALLAB_CHROMASK_TOOLTIP;Changes the chroma of the mask if one exists (i.e. C(C) or LC(H) is activated). TP_LOCALLAB_CHROML;Chroma (C) TP_LOCALLAB_CHRRT;Chroma +TP_LOCALLAB_CIE_TOOLNAME;Color appearance (Cam16 & JzCzHz) +TP_LOCALLAB_CIE;Color appearance (Cam16 & JzCzHz) TP_LOCALLAB_CIEC;Use Ciecam environment parameters TP_LOCALLAB_CIECAMLOG_TOOLTIP;This module is based on the CIECAM color appearance model which was designed to better simulate how human vision perceives colors under different lighting conditions.\nThe first Ciecam process 'Scene conditions' is carried out by Log encoding, it also uses 'Absolute luminance' at the time of shooting.\nThe second Ciecam process 'Image adjustments' is simplified and uses only 3 variables (local contrast, contrast J, saturation s).\nThe third Ciecam process 'Viewing conditions' adapts the output to the intended viewing conditions (monitor, TV, projector, printer, etc.) so that the chromatic and contrast appearance is preserved across the display environment. +TP_LOCALLAB_CIEMODE;Change tool position +TP_LOCALLAB_CIEMODE_COM;Default +TP_LOCALLAB_CIEMODE_DR;Dynamic Range +TP_LOCALLAB_CIEMODE_TM;Tone-Mapping +TP_LOCALLAB_CIEMODE_WAV;Wavelet +TP_LOCALLAB_CIEMODE_LOG;Log Encoding +TP_LOCALLAB_CIEMODE_TOOLTIP;In Default mode, Ciecam is added at the end of the process. "Mask and modifications" and "Recovery based on luminance mask" are available for"Cam16 and JzCzHz" at your disposal .\nYou can also integrate Ciecam into other tools if you wish (TM, Wavelet, Dynamic Range, Log Encoding). The results for these tools will be different to those without Ciecam. In this mode, you can also use "Mask and modifications" and "Recovery based on luminance mask" +TP_LOCALLAB_CIETOOLEXP;Curves +TP_LOCALLAB_CIECOLORFRA;Color +TP_LOCALLAB_CIECONTFRA;Contrast +TP_LOCALLAB_CIELIGHTFRA;Lighting +TP_LOCALLAB_CIELIGHTCONTFRA;Lighting & Contrast TP_LOCALLAB_CIRCRADIUS;Spot size TP_LOCALLAB_CIRCRAD_TOOLTIP;Contains the references of the RT-spot, useful for shape detection (hue, luma, chroma, Sobel).\nLow values may be useful for processing foliage.\nHigh values may be useful for processing skin. TP_LOCALLAB_CLARICRES;Merge chroma TP_LOCALLAB_CLARIFRA;Clarity & Sharp mask/Blend & Soften Images TP_LOCALLAB_CLARILRES;Merge luma TP_LOCALLAB_CLARISOFT;Soft radius -TP_LOCALLAB_CLARISOFT_TOOLTIP;The ‘Soft radius’ slider (guided filter algorithm) reduces halos and irregularities for both Clarity and Sharp Mask and for all pyramid wavelet processes. To deactivate, set slider to zero. +TP_LOCALLAB_CLARISOFT_TOOLTIP;The ‘Soft radius’ slider (guided filter algorithm) reduces halos and irregularities for Clarity, Sharp Mask and all wavelet pyramid processes. To deactivate, set slider to zero. +TP_LOCALLAB_CLARISOFTJZ_TOOLTIP;The ‘Soft radius’ slider (guided filter algorithm) reduces halos and irregularities for Clarity, Sharp Mask and Local contrast wavelets Jz. TP_LOCALLAB_CLARITYML;Clarity TP_LOCALLAB_CLARI_TOOLTIP;Levels 0 to 4 (included): ‘Sharp mask’ is enabled\nLevels 5 and above: 'Clarity' is enabled.\nUseful if you use 'Wavelet level tone mapping' +TP_LOCALLAB_CLARIJZ_TOOLTIP;Levels 0 to 4 (included): ‘Sharp mask’ is enabled\nLevels 5 and above: 'Clarity' is enabled. TP_LOCALLAB_CLIPTM;Clip restored data (gain) TP_LOCALLAB_COFR;Color & Light +TP_LOCALLAB_COLOR_CIE;Color curve TP_LOCALLAB_COLORDE;ΔE preview color - intensity TP_LOCALLAB_COLORDEPREV_TOOLTIP;Preview ΔE button will only work if you have activated one (and only one) of the tools in ‘Add tool to current spot’ menu.\nTo be able to preview ΔE with several tools enabled, use Mask and modifications - Preview ΔE. TP_LOCALLAB_COLORDE_TOOLTIP;Show a blue color preview for ΔE selection if negative and green if positive.\n\nMask and modifications (show modified areas without mask): show actual modifications if positive, show enhanced modifications (luminance only) with blue and yellow if negative. @@ -2694,6 +2836,7 @@ TP_LOCALLAB_CURVENH;Super TP_LOCALLAB_CURVENHSU;Combined HueChroma (experimental) TP_LOCALLAB_CURVENSOB2;Combined HueChroma + Contrast threshold (experimental) TP_LOCALLAB_CURVNONE;Disable curves +TP_LOCALLAB_CURVES_CIE;Tone curve TP_LOCALLAB_DARKRETI;Darkness TP_LOCALLAB_DEHAFRA;Dehaze TP_LOCALLAB_DEHAZ;Strength @@ -2710,6 +2853,8 @@ TP_LOCALLAB_DENOIEQUAL_TOOLTIP;Allows you to carry out more or less noise reduct TP_LOCALLAB_DENOI1_EXP;Denoise based on luminance mask TP_LOCALLAB_DENOI2_EXP;Recovery based on luminance mask TP_LOCALLAB_DENOILUMDETAIL_TOOLTIP;Allows you to recover luminance detail by progressively applying a Fourier transform (DCT). +TP_LOCALLAB_DENOIMASK;Denoise chroma mask +TP_LOCALLAB_DENOIMASK_TOOLTIP;For all tools, allows you to control the chromatic noise level of the mask.\nUseful for better control of chrominance and to avoid artifacts when using the LC(h) curve. TP_LOCALLAB_DENOIQUA_TOOLTIP;Conservative mode preserves low frequency detail. Aggressive mode removes low frequency detail.\nConservative and Aggressive modes use wavelets and DCT and can be used in conjunction with ‘Non-local Means – Luminance’. TP_LOCALLAB_DENOIS;Denoise TP_LOCALLAB_DENOITHR_TOOLTIP;Adjusts edge detection to help reduce noise in uniform, low-contrast areas. @@ -2754,7 +2899,7 @@ TP_LOCALLAB_EXPCOLOR_TOOLTIP;Adjust color, lightness, contrast and correct small TP_LOCALLAB_EXPCOMP;Exposure compensation ƒ TP_LOCALLAB_EXPCOMPINV;Exposure compensation TP_LOCALLAB_EXPCOMP_TOOLTIP;For portraits or images with a low color gradient. You can change ‘Shape detection’ in "Settings":\n\nIncrease 'ΔE scope threshold'\nReduce 'ΔE decay'\nIncrease 'ab-L balance (ΔE)’ -TP_LOCALLAB_EXPCONTRASTPYR_TOOLTIP;See the documentation for Wavelet Levels.\nThere are some differences in the Locallab version: more tools and more possibilities for working on individual detail levels.\ne.g. Wavelet-level tone mapping. +TP_LOCALLAB_EXPCONTRASTPYR_TOOLTIP;See the documentation for Wavelet Levels.\nThere are some differences in the Local Adjustments version, which has more tools and more possibilities for working on individual detail levels.\ne.g. Wavelet-level tone mapping. TP_LOCALLAB_EXPCONTRAST_TOOLTIP;Avoid spots that are too small ( < 32x32 pixels).\nUse low ‘Transition value’ and high ‘Transition decay’ and ‘Scope’ to simulate small RT-spots and deal with defects.\nUse 'Clarity and Sharp mask and Blend and Soften Images' if necessary by adjusting 'Soft radius' to reduce artifacts. TP_LOCALLAB_EXPCURV;Curves TP_LOCALLAB_EXPGRAD;Graduated Filter @@ -2792,6 +2937,10 @@ TP_LOCALLAB_FFTWBLUR;ƒ - Always Use Fast Fourier Transform TP_LOCALLAB_FULLIMAGE;Black-Ev and White-Ev for whole image TP_LOCALLAB_FULLIMAGELOG_TOOLTIP;Calculates the Ev levels for the whole image. TP_LOCALLAB_GAM;Gamma +TP_LOCALLAB_GAMW;Gamma (wavelet pyramids) +TP_LOCALLAB_GAMC;Gamma +TP_LOCALLAB_GAMCOL_TOOLTIP;Apply a gamma on Luminance L*a*b* datas.\nIf gamma = 3.0 Luminance "linear" is used. +TP_LOCALLAB_GAMC_TOOLTIP;Apply a gamma on Luminance L*a*b* datas before and after treatment Pyramid 1 and Pyramid 2.\nIf gamma = 3.0 Luminance "linear" is used. TP_LOCALLAB_GAMFRA;Tone response curve (TRC) TP_LOCALLAB_GAMM;Gamma TP_LOCALLAB_GAMMASKCOL;Gamma @@ -2827,6 +2976,8 @@ TP_LOCALLAB_GUIDSTRBL_TOOLTIP;Intensity of the guided filter TP_LOCALLAB_HHMASK_TOOLTIP;Fine hue adjustments for example for the skin. TP_LOCALLAB_HIGHMASKCOL;Highlights TP_LOCALLAB_HLH;H +TP_LOCALLAB_HLHZ;Hz +TP_LOCALLAB_HUECIE;Hue TP_LOCALLAB_IND;Independent (mouse) TP_LOCALLAB_INDSL;Independent (mouse + sliders) TP_LOCALLAB_INVBL;Inverse @@ -2835,6 +2986,40 @@ TP_LOCALLAB_INVERS;Inverse TP_LOCALLAB_INVERS_TOOLTIP;Fewer possibilities if selected (Inverse).\n\nAlternative: use two spots\nFirst Spot:\n Full Image\n \nSecond spot: Excluding spot TP_LOCALLAB_INVMASK;Inverse algorithm TP_LOCALLAB_ISOGR;Distribution (ISO) +TP_LOCALLAB_JAB;Uses Black Ev & White Ev +TP_LOCALLAB_JABADAP_TOOLTIP;Perceptual Uniform adaptation.\nAutomatically adjusts the relationship between Jz and saturation taking into account "Absolute luminance". +TP_LOCALLAB_JZ100;Jz reference 100cd/m2 +TP_LOCALLAB_JZLOGYBOUT_TOOLTIP;Yb is the relative luminance of the background, expressed as a percentage of gray. 18% gray corresponds to a background luminance of 50% when expressed in CIE L.\nThe data is based on the mean luminance of the image.\nWhen used with Log Encoding, the mean luminance is used to determine the amount of gain that needs to be applied to the signal prior to the log encoding. Lower values of mean luminance will result in increased gain. +TP_LOCALLAB_JZCLARILRES;Merge Jz +TP_LOCALLAB_JZCLARICRES;Merge chroma Cz +TP_LOCALLAB_JZFORCE;Force max Jz to 1 +TP_LOCALLAB_JZFORCE_TOOLTIP;Allows you to force the maximum Jz value to 1 for better slider and curve response +TP_LOCALLAB_JZMODECAM_TOOLTIP;Jz (only in 'Advanced' mode). Only operational if the output device (monitor) is HDR (peak luminance higher than 100 cd/m2 - ideally between 4000 and 10000 cd/m2. Black point luminance inferior to 0.005 cd/m2). This supposes a) the ICC-PCS for the screen uses Jzazbz (or XYZ), b) works in real precision, c) that the monitor is calibrated (if possible with a DCI-P3 or Rec-2020 gamut), d) that the usual gamma (sRGB or BT709) is replaced by a Perceptual Quantiser (PQ) function. +TP_LOCALLAB_JZPQFRA;Jz remapping +TP_LOCALLAB_JZPQFRA_TOOLTIP;Allows you to adapt the Jz algorithm to an SDR environment or to the characteristics (performance) of an HDR environment as follows:\n a) for luminance values between 0 and 100 cd/m2, the system behaves as if it were in an SDR environment.\n b) for luminance values between 100 and 10000 cd/m2, you can adapt the algorithm to the HDR characteristics of the image and the monitor.\n\nIf “PQ - Peak luminance” is set to 10000, “Jz remappping” behaves in the same way as the original Jzazbz algorithm. +TP_LOCALLAB_JZPQREMAP;PQ - Peak luminance +TP_LOCALLAB_JZPQREMAP_TOOLTIP;PQ (Perceptual Quantizer) - allows you to change the internal PQ function (usually 10000 cd/m2 - default 120 cd/m2).\nCan be used to adapt to different images, processes and devices. +TP_LOCALLAB_JZ100_TOOLTIP;Automatically adjusts the reference Jz 100 cd/m2 level (image signal).\nChanges the saturation level and action of “PU adaptation” (Perceptual Uniform adaptation). +TP_LOCALLAB_JZADAP;PU adaptation +TP_LOCALLAB_JZFRA;Jz Cz Hz Image Adjustments +TP_LOCALLAB_JZLIGHT;Brightness +TP_LOCALLAB_JZCONT;Contrast +TP_LOCALLAB_JZCH;Chroma +TP_LOCALLAB_JZCHROM;Chroma +TP_LOCALLAB_JZHFRA;Curves Hz +TP_LOCALLAB_JZHJZFRA;Curve Jz(Hz) +TP_LOCALLAB_JZHUECIE;Hue Rotation +TP_LOCALLAB_JZLOGWB_TOOLTIP;If Auto is enabled, it will calculate and adjust the Ev levels and the 'Mean luminance Yb%' for the spot area. The resulting values will be used by all Jz operations including "Log Encoding Jz".\nAlso calculates the absolute luminance at the time of shooting. +TP_LOCALLAB_JZSAT;Saturation +TP_LOCALLAB_JZSHFRA;Shadows/Highlights Jz +TP_LOCALLAB_JZSOFTCIE;Soft radius (GuidedFilter) +TP_LOCALLAB_JZTARGET_EV;Viewing Mean luminance (Yb%) +TP_LOCALLAB_JZSTRSOFTCIE;Strength GuidedFilter +TP_LOCALLAB_JZQTOJ;Relative luminance +TP_LOCALLAB_JZQTOJ_TOOLTIP;Allows you to use "Relative luminance" instead of "Absolute luminance" - Brightness becomes Lightness.\nThe changes affect: the Brightness slider, the Contrast slider and the Jz(Jz) curve. +TP_LOCALLAB_JZTHRHCIE;Threshold Chroma for Jz(Hz) +TP_LOCALLAB_JZWAVEXP;Wavelet Jz +TP_LOCALLAB_JZLOG;Log encoding Jz TP_LOCALLAB_LABBLURM;Blur Mask TP_LOCALLAB_LABEL;Local Adjustments TP_LOCALLAB_LABGRID;Color correction grid @@ -2846,8 +3031,8 @@ TP_LOCALLAB_LAPLACE;Laplacian threshold ΔE TP_LOCALLAB_LAPLACEXP;Laplacian threshold TP_LOCALLAB_LAPMASKCOL;Laplacian threshold TP_LOCALLAB_LAPRAD1_TOOLTIP;Increases the contrast of the mask by increasing the luminance values of the lighter areas. Can be used in conjunction with the L(L) and LC(H) curves. -TP_LOCALLAB_LAPRAD2_TOOLTIP;Smooth radius uses a guided filter to decrease artifacts and smooth out the transition -TP_LOCALLAB_LAPRAD_TOOLTIP;Smooth radius uses a guided filter to decrease artifacts and smooth out the transition +TP_LOCALLAB_LAPRAD2_TOOLTIP;Smooth radius uses a guided filter to decrease artifacts and smooth out the transition. +TP_LOCALLAB_LAPRAD_TOOLTIP;Smooth radius uses a guided filter to decrease artifacts and smooth out the transition. TP_LOCALLAB_LAP_MASK_TOOLTIP;Solves PDEs for all Laplacian masks.\nIf enabled the Laplacian threshold mask reduces artifacts and smooths the result.\nIf disabled the response is linear. TP_LOCALLAB_LC_FFTW_TOOLTIP;FFT improves quality and allows the use of large radii, but increases processing time (depends on the area to be processed). Preferable to use only for large radii. The size of the area can be reduced by a few pixels to optimize the FFTW. This can reduce the processing time by a factor of 1.5 to 10. TP_LOCALLAB_LC_TOOLNAME;Local Contrast & Wavelets @@ -2871,14 +3056,14 @@ TP_LOCALLAB_LOC_CONTRASTPYR2LAB; Contrast by level/TM/Directional contrast TP_LOCALLAB_LOC_CONTRASTPYRLAB; Graduated Filter/Edge Sharpness/Blur TP_LOCALLAB_LOC_RESIDPYR;Residual image (Main) TP_LOCALLAB_LOG;Log Encoding -TP_LOCALLAB_LOG1FRA;Image Adjustments +TP_LOCALLAB_LOG1FRA;CAM16 Image Adjustments TP_LOCALLAB_LOG2FRA;Viewing Conditions TP_LOCALLAB_LOGAUTO;Automatic TP_LOCALLAB_LOGAUTOGRAY_TOOLTIP;Automatically calculates the 'Mean luminance' for the scene conditions when the ‘Automatic’ button in Relative Exposure Levels is pressed. TP_LOCALLAB_LOGAUTO_TOOLTIP;Pressing this button will calculate the dynamic range and 'Mean luminance' for the scene conditions if the "Auto mean luminance (Yb%)” is checked).\nAlso calculates the absolute luminance at the time of shooting.\nPress the button again to adjust the automatically calculated values. TP_LOCALLAB_LOGBASE_TOOLTIP;Default = 2.\nValues less than 2 reduce the action of the algorithm making the shadows darker and the highlights brighter.\nWith values greater than 2, the shadows are grayer and the highlights become more washed out. TP_LOCALLAB_LOGBLACKWHEV_TOOLTIP;Estimated values of dynamic range i.e. Black Ev and White Ev -TP_LOCALLAB_LOGCATAD_TOOLTIP;The chromatic adaptation allows us to interpret a color according to its spatio-temporal environment.\nUseful when the white balance deviates significantly from the D50 reference.\nAdapts colors to the illuminant of the output device. +TP_LOCALLAB_LOGCATAD_TOOLTIP;Chromatic adaptation allows us to interpret a color according to its spatio-temporal environment.\nUseful when the white balance deviates significantly from the D50 reference.\nAdapts colors to the illuminant of the output device. TP_LOCALLAB_LOGCOLORFL;Colorfulness (M) TP_LOCALLAB_LOGCOLORF_TOOLTIP;Perceived amount of hue in relation to gray.\nIndicator that a stimulus appears more or less colored. TP_LOCALLAB_LOGCONQL;Contrast (Q) @@ -2888,25 +3073,25 @@ TP_LOCALLAB_LOGCONTL_TOOLTIP;Contrast (J) in CIECAM16 takes into account the inc TP_LOCALLAB_LOGCONTQ_TOOLTIP;Contrast (Q) in CIECAM16 takes into account the increase in perceived coloration with brightness. TP_LOCALLAB_LOGCONTTHRES_TOOLTIP;Adjusts the mid-tone contrast range (J & Q).\nPositive values progressively reduce the effect of the Contrast sliders (J & Q). Negative values progressively increase the effect of the Contrast sliders. TP_LOCALLAB_LOGDETAIL_TOOLTIP;Acts mainly on high frequencies. -TP_LOCALLAB_LOGENCOD_TOOLTIP;Tone Mapping with Logarithmic encoding (ACES).\nUseful for underexposed images or images with high dynamic range.\n\nTwo-step process : 1) Dynamic Range calculation 2) Manual adjustment +TP_LOCALLAB_LOGENCOD_TOOLTIP;Tone Mapping with Logarithmic encoding (ACES).\nUseful for underexposed images or images with high dynamic range.\n\nTwo-step process: 1) Dynamic Range calculation 2) Manual adjustment TP_LOCALLAB_LOGEXP;All tools TP_LOCALLAB_LOGFRA;Scene Conditions -TP_LOCALLAB_LOGFRAME_TOOLTIP;Allows you to calculate and adjust the Ev levels and the 'Mean luminance Yb%' (source gray point) for the spot area. The resulting values will be used by all Lab operations and most RGB operations in the pipeline.\nTakes into account exposure compensation in the main-menu Exposure tab.\nAlso calculates the absolute luminance at the time of shooting. -TP_LOCALLAB_LOGIMAGE_TOOLTIP;Takes into account corresponding Ciecam variables (mainly Contrast 'J' and Saturation 's', and also Contrast (Q) , Brightness (Q), Lightness (J), Colorfulness (M) in Advanced mode). +TP_LOCALLAB_LOGFRAME_TOOLTIP;Allows you to calculate and adjust the Ev levels and the 'Mean luminance Yb%' (source gray point) for the spot area. The resulting values will be used by all Lab operations and most RGB operations in the pipeline.\nAlso calculates the absolute luminance at the time of shooting. +TP_LOCALLAB_LOGIMAGE_TOOLTIP;Takes into account corresponding Ciecam variables: i.e. Contrast (J) and Saturation (s), as well as Contrast (Q), Brightness (Q), Lightness (J) and Colorfulness (M) (in Advanced mode) TP_LOCALLAB_LOGLIGHTL;Lightness (J) -TP_LOCALLAB_LOGLIGHTL_TOOLTIP;Close to lightness (L*a*b*), takes into account the increase in perceived coloration. +TP_LOCALLAB_LOGLIGHTL_TOOLTIP;Close to lightness (L*a*b*). Takes into account the increase in perceived coloration. TP_LOCALLAB_LOGLIGHTQ;Brightness (Q) TP_LOCALLAB_LOGLIGHTQ_TOOLTIP;Perceived amount of light emanating from a stimulus.\nIndicator that a stimulus appears to be more or less bright, clear. TP_LOCALLAB_LOGLIN;Logarithm mode TP_LOCALLAB_LOGPFRA;Relative Exposure Levels TP_LOCALLAB_LOGREPART;Overall strength TP_LOCALLAB_LOGREPART_TOOLTIP;Allows you to adjust the relative strength of the log-encoded image with respect to the original image.\nDoes not affect the Ciecam component. -TP_LOCALLAB_LOGSATURL_TOOLTIP;Saturation (s) in CIECAM16 corresponds to the color of a stimulus in relation to its own brightness.\nActs mainly on medium and highlights tones +TP_LOCALLAB_LOGSATURL_TOOLTIP;Saturation (s) in CIECAM16 corresponds to the color of a stimulus in relation to its own brightness.\nActs mainly on medium tones and on the highlights. TP_LOCALLAB_LOGSCENE_TOOLTIP;Corresponds to the shooting conditions. TP_LOCALLAB_LOGSRCGREY_TOOLTIP;Estimated gray point value of the image. -TP_LOCALLAB_LOGSURSOUR_TOOLTIP;Changes tones and colors to take into account the Scene conditions.\n\nAverage: Average light environment (standard). The image will not change.\n\nDim: Dim environment. The image will become slightly brighter.\n\nDark: Dark environment. The image will become more bright. +TP_LOCALLAB_LOGSURSOUR_TOOLTIP;Changes tones and colors to take into account the Scene conditions.\n\nAverage: Average light conditions (standard). The image will not change.\n\nDim: Dim conditions. The image will become slightly brighter.\n\nDark: Dark conditions. The image will become more bright. TP_LOCALLAB_LOGTARGGREY_TOOLTIP;You can adjust this value to suit. -TP_LOCALLAB_LOGVIEWING_TOOLTIP;Corresponds to the medium on which the final image will be viewed (monitor, TV, projector, printer,..), as well as its environment. +TP_LOCALLAB_LOGVIEWING_TOOLTIP;Corresponds to the medium on which the final image will be viewed (monitor, TV, projector, printer, etc.), as well as the surrounding conditions.. TP_LOCALLAB_LOG_TOOLNAME;Log Encoding TP_LOCALLAB_LUM;LL - CC TP_LOCALLAB_LUMADARKEST;Darkest @@ -2972,7 +3157,7 @@ TP_LOCALLAB_MASKLCTHRMIDCH;Gray area chroma denoise TP_LOCALLAB_MASKUSABLE;Mask enabled (Mask & modifications) TP_LOCALLAB_MASKUNUSABLE;Mask disabled (Mask & modifications) TP_LOCALLAB_MASKRECOTHRES;Recovery threshold -TP_LOCALLAB_MASK_TOOLTIP;You can enable multiple masks for a tool by activating another tool and using only the mask (set the tool sliders to 0 ).\n\nYou can also duplicate the RT-spot and place it close to the first spot. The small variations in the spot references allows you to make fine adjustments. +TP_LOCALLAB_MASK_TOOLTIP;You can enable multiple masks for a tool by activating another tool and using only the mask (set the tool sliders to 0 ).\n\nYou can also duplicate the RT-spot and place it close to the first spot. The small variations in the spot references allow you to make fine adjustments. TP_LOCALLAB_MED;Medium TP_LOCALLAB_MEDIAN;Median Low TP_LOCALLAB_MEDIANITER_TOOLTIP;The number of successive iterations carried out by the median filter. @@ -3030,7 +3215,7 @@ TP_LOCALLAB_NEIGH;Radius TP_LOCALLAB_NLDENOISE_TOOLTIP;“Detail recovery” acts on a Laplacian transform to target uniform areas rather than areas with detail. TP_LOCALLAB_NLDENOISENLPAT_TOOLTIP;Use this slider to adapt the amount of denoise to the size of the objects to be processed. TP_LOCALLAB_NLDENOISENLRAD_TOOLTIP;Higher values increase denoise at the expense of processing time. -TP_LOCALLAB_NLDENOISENLGAM_TOOLTIP;Lower values preserve details and texture, higher values increase denoise. +TP_LOCALLAB_NLDENOISENLGAM_TOOLTIP;Lower values preserve details and texture, higher values increase denoise.\nIf gamma = 3.0 Luminance "linear" is used. TP_LOCALLAB_NLFRA;Non-local Means - Luminance TP_LOCALLAB_NLFRAME_TOOLTIP;Non-local means denoising takes a mean of all pixels in the image, weighted by how similar they are to the target pixel.\nReduces loss of detail compared with local mean algorithms.\nOnly luminance noise is taken into account. Chrominance noise is best processed using wavelets and Fourier transforms (DCT).\nCan be used in conjunction with 'Luminance denoise by level' or on its own. TP_LOCALLAB_NLLUM;Strength @@ -3043,6 +3228,8 @@ TP_LOCALLAB_NOISECHROC_TOOLTIP;If superior to zero, high quality algorithm is en TP_LOCALLAB_NOISECHRODETAIL;Chroma detail recovery TP_LOCALLAB_NOISECHROFINE;Fine chroma (Wav) TP_LOCALLAB_NOISEDETAIL_TOOLTIP;Disabled if slider = 100 +TP_LOCALLAB_NOISEGAM;Gamma +TP_LOCALLAB_NOISEGAM_TOOLTIP;If gamma = 1 Luminance "Lab" is used. If gamma = 3.0 Luminance "linear" is used.\nLower values preserve details and texture, higher values increase denoise. TP_LOCALLAB_NOISELEQUAL;Equalizer white-black TP_LOCALLAB_NOISELUMCOARSE;Luminance coarse (Wav) TP_LOCALLAB_NOISELUMDETAIL;Luma detail recovery @@ -3077,6 +3264,7 @@ TP_LOCALLAB_RADIUS;Radius TP_LOCALLAB_RADIUS_TOOLTIP;Uses a Fast Fourier Transform for radius > 30 TP_LOCALLAB_RADMASKCOL;Smooth radius TP_LOCALLAB_RECT;Rectangle +TP_LOCALLAB_RECOTHRES02_TOOLTIP;If the “Recovery threshold” value is greater than 1, the mask in Mask and Modifications takes into account any previous modifications made to the image but not those made with the current tool (e.g. Color and Light, Wavelet, Cam16, etc.)\nIf the value of the “Recovery threshold” is less than 1, the mask in Mask and Modifications does not take into account any previous modifications to the image.\n\nIn both cases, the “Recovery threshold” acts on the masked image as modified by the current tool (Color and Light, Wavelet, Cam16, etc.). TP_LOCALLAB_RECURS;Recursive references TP_LOCALLAB_RECURS_TOOLTIP;Forces the algorithm to recalculate the references after each tool is applied.\nAlso useful for working with masks. TP_LOCALLAB_REFLABEL;Ref. (0..1) Chroma=%1 Luma=%2 Hue=%3 @@ -3115,6 +3303,7 @@ TP_LOCALLAB_RGB;RGB Tone Curve TP_LOCALLAB_RGBCURVE_TOOLTIP;In RGB mode you have 4 choices : Standard, Weighted standard, Luminance & Film-like. TP_LOCALLAB_ROW_NVIS;Not visible TP_LOCALLAB_ROW_VIS;Visible +TP_LOCALLAB_RSTPROTECT_TOOLTIP;Red and skin-tone protection affects the Saturation, Chroma and Colorfulness sliders. TP_LOCALLAB_SATUR;Saturation TP_LOCALLAB_SATURV;Saturation (s) TP_LOCALLAB_SAVREST;Save - Restore Current Image @@ -3180,10 +3369,17 @@ TP_LOCALLAB_SHOWSTRUC;Show spot structure(Advanced) TP_LOCALLAB_SHOWSTRUCEX;Show spot structure(Advanced) TP_LOCALLAB_SHOWT;Mask and modifications TP_LOCALLAB_SHOWVI;Mask and modifications -TP_LOCALLAB_SHRESFRA;Shadows/Highlights +TP_LOCALLAB_SHRESFRA;Shadows/Highlights & TRC TP_LOCALLAB_SHTRC_TOOLTIP;Based on 'working profile' (only those provided), modifies the tones of the image by acting on a TRC (Tone Response Curve).\nGamma acts mainly on light tones.\nSlope acts mainly on dark tones.\nIt is recommended that the TRC of both devices (monitor and output profile) be sRGB (default). TP_LOCALLAB_SH_TOOLNAME;Shadows/Highlights & Tone Equalizer TP_LOCALLAB_SIGMAWAV;Attenuation response +TP_LOCALLAB_SIGFRA;Sigmoid J & Q +TP_LOCALLAB_SIGJZFRA;Sigmoid Jz +TP_LOCALLAB_SIGMOIDLAMBDA;Contrast +TP_LOCALLAB_SIGMOIDTH;Threshold (Gray point) +TP_LOCALLAB_SIGMOIDBL;Blend +TP_LOCALLAB_SIGMOIDQJ;Use Q instead of J +TP_LOCALLAB_SIGMOID_TOOLTIP;Allows you to simulate a Tone-mapping appearance using both the'Ciecam' and 'Sigmoid' function.\nThree sliders: a) Strength acts on the shape of the sigmoid curve and consequently on the strength; b) Threshold distributes the action according to the luminance; c)Blend acts on the final aspect of the image, contrast and luminance. TP_LOCALLAB_SIM;Simple TP_LOCALLAB_SLOMASKCOL;Slope TP_LOCALLAB_SLOMASK_TOOLTIP;Adjusting Gamma and Slope can provide a soft and artifact-free transformation of the mask by progressively modifying ‘L’ to avoid any discontinuities. @@ -3268,20 +3464,22 @@ TP_LOCALLAB_WAT_BALTHRES_TOOLTIP;Balances the action within each level. TP_LOCALLAB_WAT_BLURLC_TOOLTIP;The default blur setting affects all 3 L*a* b* components (luminance and colour).\nWhen checked, only luminance is blurred. TP_LOCALLAB_WAT_CLARIC_TOOLTIP;“Merge chroma” is used to select the intensity of the desired effect on chrominance. TP_LOCALLAB_WAT_CLARIL_TOOLTIP;“Merge luma” is used to select the intensity of the desired effect on luminance. +TP_LOCALLAB_WAT_CLARICJZ_TOOLTIP;“Merge chroma” is used to select the intensity of the desired effect on chrominance.\nOnly the maximum value of wavelet levels (bottom-right) is taken into account. +TP_LOCALLAB_WAT_CLARILJZ_TOOLTIP;“Merge luma” is used to select the intensity of the desired effect on luminance.\nOnly the maximum value of wavelet levels (bottom-right) is taken into account. TP_LOCALLAB_WAT_CONTCHROMALEV_TOOLTIP;‘Chroma levels’: adjusts the “a” and “b” components of Lab* as a proportion of the luminance value. TP_LOCALLAB_WAT_CONTOFFSET_TOOLTIP;Offset modifies the balance between low-contrast and high-contrast details.\nHigh values will amplify contrast changes to the higher-contrast details, whereas low values will amplify contrast changes to low-contrast details.\nBy using a low ‘Attenuation response’ value you can select which contrast values will be enhanced. TP_LOCALLAB_WAT_DELTABAL_TOOLTIP;By moving the slider to the left, the lower levels are accentuated. To the right, the lower levels are reduced and the higher levels accentuated. TP_LOCALLAB_WAT_EXPRESID_TOOLTIP;The residual image behaves in the same way as the main image when making adjustments to contrast, chroma etc. TP_LOCALLAB_WAT_GRADW_TOOLTIP;The more you move the slider to the right, the more effective the detection algorithm will be and the less noticeable the effects of local contrast. -TP_LOCALLAB_WAT_LEVELLOCCONTRAST_TOOLTIP;Low to high local contrast from left to right on the x-axis.\nIncrease or decrease local contrast on the y-axis. +TP_LOCALLAB_WAT_LEVELLOCCONTRAST_TOOLTIP;Low to high local contrast from left to right on the x-axis.\nIncreases or decreases local contrast on the y-axis. TP_LOCALLAB_WAT_LOCCONTRASTEDG_TOOLTIP;You can adjust the distribution of local contrast by wavelet level based on the initial intensity of the contrast. This will modify the effects of perspective and relief in the image, and/or reduce the contrast values for very low initial contrast levels. TP_LOCALLAB_WAT_ORIGLC_TOOLTIP;‘Merge only with original image’, prevents the ‘Wavelet Pyramid’ settings from interfering with ‘Clarity’ and ‘Sharp mask’. TP_LOCALLAB_WAT_RESIDBLUR_TOOLTIP;Blurs the residual image, independent of the levels. TP_LOCALLAB_WAT_RESIDCOMP_TOOLTIP;Compresses the residual image to increase or reduce contrast. -TP_LOCALLAB_WAT_SIGMALC_TOOLTIP;The effect of the local contrast adjustment is stronger for medium-contrast details, and weaker for high and low-contrast details.\n This slider controls how quickly the effect dampens towards the extreme contrasts.\nThe higher the value of the slider, the wider the range of contrasts that will receive the full effect of the local contrast adjustment, and the higher the risk of generating artifacts.\nThe lower the value, the more the effect will be pinpointed towards a narrow range of contrast values. +TP_LOCALLAB_WAT_SIGMALC_TOOLTIP;The effect of the local contrast adjustment is stronger for medium-contrast details and weaker for high and low-contrast details.\n This slider controls how quickly the effect dampens towards the extreme contrasts.\nThe higher the value of the slider, the wider the range of contrasts that will receive the full effect of the local contrast adjustment and the higher the risk of generating artifacts.\nThe lower the value, the more the effect will be pinpointed towards a narrow range of contrast values. TP_LOCALLAB_WAT_STRENGTHW_TOOLTIP;Intensity of edge-effect detection. TP_LOCALLAB_WAT_STRWAV_TOOLTIP;Allows the local contrast to be varied according to a chosen gradient and angle. The variation of the luminance signal is taken into account and not the luminance. -TP_LOCALLAB_WAT_THRESHOLDWAV_TOOLTIP;Range of wavelet levels used throughout the ‘Wavelets’ module. +TP_LOCALLAB_WAT_THRESHOLDWAV_TOOLTIP;Range of wavelet levels used throughout the Wavelets module. TP_LOCALLAB_WAT_WAVBLURCURV_TOOLTIP;Allows you to blur each level of decomposition.\nThe finest to coarsest levels of decomposition are from left to right. TP_LOCALLAB_WAT_WAVCBDL_TOOLTIP;Similar to Contrast By Detail Levels. Fine to coarse detail levels from left to right on the x-axis. TP_LOCALLAB_WAT_WAVDELTABAL_TOOLTIP;Acts on the balance of the three directions (horizontal, vertical and diagonal) based on the luminance of the image.\nBy default the shadows or highlights are reduced to avoid artifacts. @@ -3313,6 +3511,8 @@ TP_LOCALLAB_WAVMASK_TOOLTIP;Uses wavelets to modify the local contrast of the ma TP_LOCALLAB_WAVMED;Wavelet normal TP_LOCALLAB_WEDIANHI;Median Hi TP_LOCALLAB_WHITE_EV;White Ev +TP_LOCALLAB_ZCAMFRA;ZCAM Image Adjustments +TP_LOCALLAB_ZCAMTHRES;Retrieve high datas TP_LOCAL_HEIGHT;Bottom TP_LOCAL_HEIGHT_T;Top TP_LOCAL_WIDTH;Right diff --git a/rtengine/ciecam02.cc b/rtengine/ciecam02.cc index da452c89b..3895820d2 100644 --- a/rtengine/ciecam02.cc +++ b/rtengine/ciecam02.cc @@ -25,6 +25,19 @@ #undef CLIPD #define CLIPD(a) ((a)>0.f?((a)<1.f?(a):1.f):0.f) #define MAXR(a,b) ((a) > (b) ? (a) : (b)) +#define Jzazbz_b 1.15 +#define Jzazbz_g 0.66 +#define Jzazbz_c1 (3424/4096.0) +#define Jzazbz_c2 (2413/128.0) +#define Jzazbz_c3 (2392/128.0) +#define Jzazbz_n (2610/16384.0) +#define Jzazbz_p (1.7*2523/32.0) +#define Jzazbz_d (-0.56) +#define Jzazbz_d0 (1.6295499532821566e-11) +#define Jzazbz_ni (16384.0/2610.0) +#define Jzazbz_pi (32.0/4289.1) //4289.1 = 2523 * 1.7 + + namespace rtengine { @@ -67,10 +80,12 @@ void Ciecam02::curveJfloat (float br, float contr, float thr, const LUTu & histo brightcurvePoints[5] = 0.7f; // shoulder point brightcurvePoints[6] = min (1.0f, 0.7f + br / 300.0f); //value at shoulder point } else { - brightcurvePoints[3] = 0.1f - br / 150.0f; // toe point + brightcurvePoints[3] = max(0.0, 0.1 - (double) br / 150.0); // toe point + // brightcurvePoints[3] = 0.1f - br / 150.0f; // toe point brightcurvePoints[4] = 0.1f; // value at toe point - brightcurvePoints[5] = min (1.0f, 0.7f - br / 300.0f); // shoulder point + // brightcurvePoints[5] = min (1.0f, 0.7f - br / 300.0f); // shoulder point + brightcurvePoints[5] = 0.7f - br / 300.0f; // shoulder point brightcurvePoints[6] = 0.7f; // value at shoulder point } @@ -109,6 +124,7 @@ void Ciecam02::curveJfloat (float br, float contr, float thr, const LUTu & histo } avg /= sum; + // printf("avg=%f \n", (double) avg); float thrmin = (thr - contr / 250.0f); float thrmax = (thr + contr / 250.0f); @@ -184,14 +200,14 @@ float Ciecam02::calculate_fl_from_la_ciecam02float ( float la ) return (0.2f * k * la5) + (0.1f * (1.0f - k) * (1.0f - k) * std::cbrt (la5)); } -float Ciecam02::achromatic_response_to_whitefloat ( float x, float y, float z, float d, float fl, float nbb, int c16) +float Ciecam02::achromatic_response_to_whitefloat ( float x, float y, float z, float d, float fl, float nbb, int c16, float plum) { float r, g, b; float rc, gc, bc; float rp, gp, bp; float rpa, gpa, bpa; // gamu = 1; - xyz_to_cat02float ( r, g, b, x, y, z, c16); + xyz_to_cat02float ( r, g, b, x, y, z, c16, plum); rc = r * (((y * d) / r) + (1.0f - d)); gc = g * (((y * d) / g) + (1.0f - d)); @@ -216,71 +232,253 @@ float Ciecam02::achromatic_response_to_whitefloat ( float x, float y, float z, f return ((2.0f * rpa) + gpa + ((1.0f / 20.0f) * bpa) - 0.305f) * nbb; } -void Ciecam02::xyz_to_cat02float ( float &r, float &g, float &b, float x, float y, float z, int c16) -{ +void Ciecam02::xyz_to_cat02float ( float &r, float &g, float &b, float x, float y, float z, int c16, float plum) +{ //I use isnan() because I have tested others solutions with std::max(xxx,0) and in some cases crash //original cat02 //r = ( 0.7328 * x) + (0.4296 * y) - (0.1624 * z); //g = (-0.7036 * x) + (1.6975 * y) + (0.0061 * z); //b = ( 0.0000 * x) + (0.0000 * y) + (1.0000 * z); + float peakLum = 1.f/ plum; if(c16 == 1) {//cat02 r = ( 1.007245f * x) + (0.011136f * y) - (0.018381f * z); //Changjun Li g = (-0.318061f * x) + (1.314589f * y) + (0.003471f * z); b = ( 0.0000f * x) + (0.0000f * y) + (1.0000f * z); - } else {//cat16 + } else if (c16 == 16) {//cat16 r = ( 0.401288f * x) + (0.650173f * y) - (0.051461f * z); //cat16 g = (-0.250268f * x) + (1.204414f * y) + (0.045854f * z); b = ( -0.002079f * x) + (0.048952f * y) + (0.953127f * z); + } else if (c16 == 21) {//cam16 PQ + float rp = ( 0.401288f * x) + (0.650173f * y) - (0.051461f * z); //cat16 + float gp = (-0.250268f * x) + (1.204414f * y) + (0.045854f * z); + float bp = ( -0.002079f * x) + (0.048952f * y) + (0.953127f * z); + rp *= 0.01f; + gp *= 0.01f; + bp *= 0.01f; + float tmp = pow_F(rp * peakLum, Jzazbz_n); + if(std::isnan(tmp)) {//to avoid crash + tmp = 0.f; + } + r = 100.f * pow((Jzazbz_c1 + Jzazbz_c2 * tmp) / (1. + Jzazbz_c3 * tmp), Jzazbz_p); + if(std::isnan(r) || r < 0.f) { + r = 0.f; + } + + tmp = pow_F(gp * peakLum, Jzazbz_n); + if(std::isnan(tmp)) {//to avoid crash + tmp = 0.f; + } + g = 100.f * pow((Jzazbz_c1 + Jzazbz_c2 * tmp) / (1. + Jzazbz_c3 * tmp), Jzazbz_p); + if(std::isnan(g) || g < 0.f) { + g = 0.f; + } + tmp = pow_F(bp * peakLum, Jzazbz_n); + if(std::isnan(tmp)) {//to avoid crash + tmp = 0.f; + } + + b = 100.f * pow((Jzazbz_c1 + Jzazbz_c2 * tmp) / (1. + Jzazbz_c3 * tmp), Jzazbz_p); + if(std::isnan(b) || b < 0.f) { + b = 0.f; + } } } + #ifdef __SSE2__ -void Ciecam02::xyz_to_cat02float ( vfloat &r, vfloat &g, vfloat &b, vfloat x, vfloat y, vfloat z, int c16) -{ +void Ciecam02::xyz_to_cat02float ( vfloat &r, vfloat &g, vfloat &b, vfloat x, vfloat y, vfloat z, int c16, vfloat plum) +{ //I use isnan() because I have tested others solutions with std::max(xxx,0) and in some cases crash //gamut correction M.H.Brill S.Susstrunk if(c16 == 1) { r = ( F2V (1.007245f) * x) + (F2V (0.011136f) * y) - (F2V (0.018381f) * z); //Changjun Li g = (F2V (-0.318061f) * x) + (F2V (1.314589f) * y) + (F2V (0.003471f) * z); b = z; - } else { + } else if (c16 == 16) { //cat16 - r = ( F2V (0.401288f) * x) + (F2V (0.650173f) * y) - (F2V (0.051461f) * z); //Changjun Li + r = ( F2V (0.401288f) * x) + (F2V (0.650173f) * y) - (F2V (0.051461f) * z); g = -(F2V (0.250268f) * x) + (F2V (1.204414f) * y) + (F2V (0.045854f) * z); b = -(F2V(0.002079f) * x) + (F2V(0.048952f) * y) + (F2V(0.953127f) * z); + } else if (c16 == 21) { + vfloat rp = ( F2V (0.401288f) * x) + (F2V (0.650173f) * y) - (F2V (0.051461f) * z); + vfloat gp = -(F2V (0.250268f) * x) + (F2V (1.204414f) * y) + (F2V (0.045854f) * z); + vfloat bp = -(F2V(0.002079f) * x) + (F2V(0.048952f) * y) + (F2V(0.953127f) * z); + vfloat Jzazbz_c1v = F2V(Jzazbz_c1); + vfloat Jzazbz_c2v = F2V(Jzazbz_c2); + vfloat Jzazbz_nv = F2V(Jzazbz_n); + vfloat Jzazbz_c3v = F2V(Jzazbz_c3); + vfloat Jzazbz_pv = F2V(Jzazbz_p); + vfloat mulone = F2V(0.01f); + vfloat mulhund = F2V(100.f); + float RR, GG, BB; + vfloat one = F2V(1.); + vfloat peakLumv = one / plum; + rp *= mulone; + gp *= mulone; + bp *= mulone; + vfloat tmp = pow_F(rp * peakLumv, Jzazbz_nv ); + STVF(RR, tmp); + if(std::isnan(RR)) {//to avoid crash + tmp = F2V(0.f);; + } + r = mulhund * pow_F((Jzazbz_c1v + Jzazbz_c2v * tmp) / (one + Jzazbz_c3v * tmp), Jzazbz_pv); + STVF(RR, r); + if(std::isnan(RR) || RR < 0.f) {//to avoid crash + r = F2V(0.f);; + } + tmp = pow_F(gp * peakLumv, Jzazbz_nv ); + STVF(RR, tmp); + if(std::isnan(RR)) {//to avoid crash + tmp = F2V(0.f);; + } + + g = mulhund * pow_F((Jzazbz_c1v + Jzazbz_c2v * tmp) / (one + Jzazbz_c3v * tmp), Jzazbz_pv); + STVF(GG, g); + if(std::isnan(GG) || GG < 0.f) {//to avoid crash + g = F2V(0.f);; + } + + tmp = pow_F(bp * peakLumv, Jzazbz_nv ); + STVF(RR, tmp); + if(std::isnan(RR)) {//to avoid crash + tmp = F2V(0.f);; + } + + b = mulhund * pow_F((Jzazbz_c1v + Jzazbz_c2v * tmp) / (one + Jzazbz_c3v * tmp), Jzazbz_pv); + STVF(BB, b); + if(std::isnan(BB) || BB < 0.f) {//to avoid crash + b = F2V(0.f);; + } + } } #endif -void Ciecam02::cat02_to_xyzfloat ( float &x, float &y, float &z, float r, float g, float b, int c16) -{ +void Ciecam02::cat02_to_xyzfloat ( float &x, float &y, float &z, float r, float g, float b, int c16, float plum) +{ //I use isnan() because I have tested others solutions with std::max(xxx,0) and in some cases crash //original cat02 //x = ( 1.0978566 * r) - (0.277843 * g) + (0.179987 * b); //y = ( 0.455053 * r) + (0.473938 * g) + (0.0710096* b); //z = ( 0.000000 * r) - (0.000000 * g) + (1.000000 * b); + float pl = plum; if(c16 == 1) { x = ( 0.99015849f * r) - (0.00838772f * g) + (0.018229217f * b); //Changjun Li y = ( 0.239565979f * r) + (0.758664642f * g) + (0.001770137f * b); z = ( 0.000000f * r) - (0.000000f * g) + (1.000000f * b); - } else {//cat16 + } else if(c16 == 16){//cat16 x = ( 1.86206786f * r) - (1.01125463f * g) + (0.14918677f * b); //Cat16 y = ( 0.38752654f * r) + (0.62144744f * g) + (-0.00897398f * b); z = ( -0.0158415f * r) - (0.03412294f * g) + (1.04996444f * b); + }else if(c16 == 21){//cam16 PQ + float lp = ( 1.86206786f * r) - (1.01125463f * g) + (0.14918677f * b); //Cat16 + float mp = ( 0.38752654f * r) + (0.62144744f * g) + (-0.00897398f * b); + float sp = ( -0.0158415f * r) - (0.03412294f * g) + (1.04996444f * b); + lp *= 0.01f; + float tmp = pow_F(lp, Jzazbz_pi); + if(std::isnan(tmp)) {//to avoid crash + tmp = 0.f; + } + + float prov = (Jzazbz_c1 - tmp) / ((Jzazbz_c3 * tmp) - Jzazbz_c2); + x = pl * pow_F(prov, Jzazbz_ni); + if(std::isnan(x)) {//to avoid crash + x = 0.f; + } + x *= 100.f; + mp *= 0.01f; + tmp = pow_F(mp, Jzazbz_pi); + if(std::isnan(tmp)) {//to avoid crash + tmp = 0.f; + } + prov = (Jzazbz_c1 - tmp) / ((Jzazbz_c3 * tmp) - Jzazbz_c2); + y = pl * pow_F(prov, Jzazbz_ni); + if(std::isnan(y)) { + y = 0.f; + } + y *= 100.f; + sp *= 0.01f; + tmp = pow_F(sp, Jzazbz_pi); + if(std::isnan(tmp)) {//to avoid crash + tmp = 0.f; + } + prov = (Jzazbz_c1 - tmp) / ((Jzazbz_c3 * tmp) - Jzazbz_c2); + z = pl * pow_F(prov, Jzazbz_ni); + if(std::isnan(z)) { + z = 0.; + } + z *= 100.f; + } } #ifdef __SSE2__ -void Ciecam02::cat02_to_xyzfloat ( vfloat &x, vfloat &y, vfloat &z, vfloat r, vfloat g, vfloat b, int c16 ) -{ +void Ciecam02::cat02_to_xyzfloat ( vfloat &x, vfloat &y, vfloat &z, vfloat r, vfloat g, vfloat b, int c16, vfloat plum ) +{ //I use isnan() because I have tested others solutions with std::max(xxx,0) and in some cases crash + vfloat plv = plum; //gamut correction M.H.Brill S.Susstrunk if(c16 == 1) {//cat02 x = ( F2V (0.99015849f) * r) - (F2V (0.00838772f) * g) + (F2V (0.018229217f) * b); //Changjun Li y = ( F2V (0.239565979f) * r) + (F2V (0.758664642f) * g) + (F2V (0.001770137f) * b); z = b; - } else { + } else if(c16 == 16) { //cat16 x = ( F2V (1.86206786f) * r) - (F2V (1.01125463f) * g) + (F2V (0.14918677f) * b); y = ( F2V (0.38752654f) * r) + (F2V (0.621447744f) * g) - (F2V (0.00897398f) * b); z = -(F2V(0.0158415f) * r) - (F2V(0.03412294f) * g) + (F2V(1.04996444f) * b); + }else if(c16 == 21){//cam16 PQ + vfloat lp = ( F2V (1.86206786f) * r) - (F2V (1.01125463f) * g) + (F2V (0.14918677f) * b); + vfloat mp = ( F2V (0.38752654f) * r) + (F2V (0.621447744f) * g) - (F2V (0.00897398f) * b); + vfloat sp = -(F2V(0.0158415f) * r) - (F2V(0.03412294f) * g) + (F2V(1.04996444f) * b); + float XX,YY,ZZ; + vfloat Jzazbz_c1v = F2V(Jzazbz_c1); + vfloat Jzazbz_c2v = F2V(Jzazbz_c2); + vfloat Jzazbz_c3v = F2V(Jzazbz_c3); + vfloat Jzazbz_piv = F2V(Jzazbz_pi); + vfloat Jzazbz_niv = F2V(Jzazbz_ni); + vfloat mulone = F2V(0.01f); + vfloat mulhund = F2V(100.f); + lp *= mulone; + float pro; + vfloat tmp = pow_F(lp, Jzazbz_piv); + STVF(XX, tmp); + if(std::isnan(XX)) {//to avoid crash + tmp = F2V(0.f);; + } + vfloat prov = (Jzazbz_c1v - tmp) / ((Jzazbz_c3v * tmp) - Jzazbz_c2v); + x = plv * pow_F(prov, Jzazbz_niv); + STVF(XX, x); + if(std::isnan(XX)) {//to avoid crash + x = F2V(0.f);; + } + x *= mulhund; + mp *= mulone; + tmp = pow_F(mp, Jzazbz_piv); + STVF(YY, tmp); + if(std::isnan(YY)) {//to avoid crash + tmp = F2V(0.f);; + } + prov = (Jzazbz_c1v - tmp) / ((Jzazbz_c3v * tmp) - Jzazbz_c2v); + y = plv * pow_F(prov, Jzazbz_niv); + STVF(YY, y); + if(std::isnan(YY)) {//to avoid crash + y = F2V(0.f);; + } + y *= mulhund; + sp *= mulone; + tmp = pow_F(sp, Jzazbz_piv); + STVF(ZZ, tmp); + if(std::isnan(ZZ)) {//to avoid crash + tmp = F2V(0.f);; + } + prov = (Jzazbz_c1v - tmp) / ((Jzazbz_c3v * tmp) - Jzazbz_c2v); + STVF(pro, prov); + z = plv * pow_F(prov, Jzazbz_niv); + STVF(ZZ, z); + if(std::isnan(ZZ)) {//to avoid crash + z = F2V(0.f);; + } + z *= mulhund; + } + } #endif @@ -429,7 +627,7 @@ void Ciecam02::calculate_abfloat ( vfloat &aa, vfloat &bb, vfloat h, vfloat e, v #endif void Ciecam02::initcam1float (float yb, float pilotd, float f, float la, float xw, float yw, float zw, float &n, float &d, float &nbb, float &ncb, - float &cz, float &aw, float &wh, float &pfl, float &fl, float c, int c16) + float &cz, float &aw, float &wh, float &pfl, float &fl, float c, int c16, float plum) { n = yb / yw; @@ -442,13 +640,13 @@ void Ciecam02::initcam1float (float yb, float pilotd, float f, float la, float x fl = calculate_fl_from_la_ciecam02float ( la ); nbb = ncb = 0.725f * pow_F ( 1.0f / n, 0.2f ); cz = 1.48f + sqrt ( n ); - aw = achromatic_response_to_whitefloat ( xw, yw, zw, d, fl, nbb, c16); + aw = achromatic_response_to_whitefloat ( xw, yw, zw, d, fl, nbb, c16, plum); wh = ( 4.0f / c ) * ( aw + 4.0f ) * pow_F ( fl, 0.25f ); pfl = pow_F ( fl, 0.25f ); } void Ciecam02::initcam2float (float yb, float pilotd, float f, float la, float xw, float yw, float zw, float &n, float &d, float &nbb, float &ncb, - float &cz, float &aw, float &fl, int c16) + float &cz, float &aw, float &fl, int c16, float plum) { n = yb / yw; @@ -462,12 +660,135 @@ void Ciecam02::initcam2float (float yb, float pilotd, float f, float la, float x fl = calculate_fl_from_la_ciecam02float ( la ); nbb = ncb = 0.725f * pow_F ( 1.0f / n, 0.2f ); cz = 1.48f + sqrt ( n ); - aw = achromatic_response_to_whitefloat ( xw, yw, zw, d, fl, nbb, c16); + aw = achromatic_response_to_whitefloat ( xw, yw, zw, d, fl, nbb, c16, plum); +} + + +void Ciecam02::xyz2jzczhz ( double &Jz, double &az, double &bz, double x, double y, double z, double pl, double &Lp, double &Mp, double &Sp, bool zcam) +{ //from various web + double Xp, Yp, Zp, L, M, S, Iz; + double peakLum = 1. / pl; + //I change 10000 for peaklum function of la (absolute luminance)- default 10000 + Xp = Jzazbz_b * x - ((Jzazbz_b - 1.) * z); + Yp = Jzazbz_g * y - ((Jzazbz_g - 1.) * x); + Zp = z; + + L = 0.41478972 * Xp + 0.579999 * Yp + 0.0146480 * Zp; + M = -0.2015100 * Xp + 1.120649 * Yp + 0.0531008 * Zp; + S = -0.0166008 * Xp + 0.264800 * Yp + 0.6684799 * Zp; + + //I use isnan() because I have tested others solutions with std::max(xxx,0) and in some cases crash + // Lp = pow((Jzazbz_c1 + Jzazbz_c2 * pow(std::max((L * peakLum), 0.), Jzazbz_n)) / (1. + Jzazbz_c3 * pow((L * peakLum), Jzazbz_n)), Jzazbz_p); + // Mp = pow((Jzazbz_c1 + Jzazbz_c2 * pow(std::max((M * peakLum),0.), Jzazbz_n)) / (1. + Jzazbz_c3 * pow((M * peakLum), Jzazbz_n)), Jzazbz_p); + // Sp = pow((Jzazbz_c1 + Jzazbz_c2 * pow(std::max((S * peakLum), 0.), Jzazbz_n)) / (1. + Jzazbz_c3 * pow((S * peakLum), Jzazbz_n)), Jzazbz_p); + double temp = pow(L * peakLum, Jzazbz_n); + if(std::isnan(temp)) {//to avoid crash + temp = 0.; + } + Lp = pow((Jzazbz_c1 + Jzazbz_c2 * temp) / (1. + Jzazbz_c3 * temp), Jzazbz_p); + if(std::isnan(Lp)) {//to avoid crash + Lp = 0.; + } + + temp = pow(M * peakLum, Jzazbz_n); + if(std::isnan(temp)) {//to avoid crash + temp = 0.; + } + Mp = pow((Jzazbz_c1 + Jzazbz_c2 * temp) / (1. + Jzazbz_c3 * temp), Jzazbz_p); + if(std::isnan(Mp)) {//to avoid crash + Mp = 0.; + } + + temp = pow(S * peakLum, Jzazbz_n); + if(std::isnan(temp)) {//to avoid crash + temp = 0.; + } + Sp = pow((Jzazbz_c1 + Jzazbz_c2 * temp) / (1. + Jzazbz_c3 * temp), Jzazbz_p); + if(std::isnan(Sp)) {//to avoid crash + Sp = 0.; + } + + Iz = 0.5 * Lp + 0.5 * Mp; + az = 3.524000 * Lp - 4.066708 * Mp + 0.542708 * Sp; + bz = 0.199076 * Lp + 1.096799 * Mp - 1.295875 * Sp; + if(!zcam) { + Jz = (((1. + Jzazbz_d) * Iz) / (1. + Jzazbz_d * Iz)) - Jzazbz_d0; + // Jz = std::max((((1. + Jzazbz_d) * Iz) / (1. + Jzazbz_d * Iz)) - Jzazbz_d0, 0.); + } else { + //or if we use ZCAM Jz = Mp - Jzazbz_d0 + Jz = Mp - Jzazbz_d0; + } +} + + +void Ciecam02::jzczhzxyz (double &x, double &y, double &z, double jz, double az, double bz, double pl, double &L, double &M, double &S, bool zcam) +{ //from various web + //I use isnan() because I have tested others solutions with std::max(xxx,0) and in some cases crash + + double Xp, Yp, Zp, Lp, Mp, Sp, Iz, tmp; + + if(!zcam) { + // Iz = std::max((jz + Jzazbz_d0) / (1. + Jzazbz_d - Jzazbz_d * (jz + Jzazbz_d0)), 0.); + Iz = (jz + Jzazbz_d0) / (1. + Jzazbz_d - Jzazbz_d * (jz + Jzazbz_d0)); + } else { + //or if we use ZCAM Iz = Jz + Jzazbz_d0 + Iz = jz + Jzazbz_d0; + } + + Lp = Iz + 0.138605043271539 * az + 0.0580473161561189 * bz; + Mp = Iz - 0.138605043271539 * az - 0.0580473161561189 * bz; + Sp = Iz - 0.0960192420263189 * az - 0.811891896056039 * bz; + //I change optionnaly 10000 for pl function of la(absolute luminance) default 10000 + + tmp = pow(Lp, Jzazbz_pi); + if(std::isnan(tmp)) {//to avoid crash + tmp = 0.; + } + L = pl * pow((Jzazbz_c1 - tmp) / ((Jzazbz_c3 * tmp) - Jzazbz_c2), Jzazbz_ni); + if(std::isnan(L)) {//to avoid crash + L = 0.; + } + + tmp = pow(Mp, Jzazbz_pi); + if(std::isnan(tmp)) {//to avoid crash + tmp = 0.; + } + M = pl * pow((Jzazbz_c1 - tmp) / ((Jzazbz_c3 * tmp) - Jzazbz_c2), Jzazbz_ni); + if(std::isnan(M)) {//to avoid crash + M = 0.; + } + + tmp = pow(Sp, Jzazbz_pi); + if(std::isnan(tmp)) {//to avoid crash + tmp = 0.; + } + S = pl * pow((Jzazbz_c1 - tmp) / ((Jzazbz_c3 * tmp) - Jzazbz_c2), Jzazbz_ni); + if(std::isnan(S)) {//to avoid crash + S = 0.; + } + + Xp = 1.9242264357876067 * L - 1.0047923125953657 * M + 0.0376514040306180 * S; + Yp = 0.3503167620949991 * L + 0.7264811939316552 * M - 0.0653844229480850 * S; + Zp = -0.0909828109828475 * L - 0.3127282905230739 * M + 1.5227665613052603 * S; + + x = (Xp + (Jzazbz_b - 1.) * Zp) / Jzazbz_b; + + if(std::isnan(x)) {//to avoid crash + x = 0.; + } + y = (Yp + (Jzazbz_g - 1.) * x) / Jzazbz_g; + if(std::isnan(y)) { + y = 0.; + } + z = Zp; + if(std::isnan(z)) { + z = 0.; + } } void Ciecam02::xyz2jchqms_ciecam02float ( float &J, float &C, float &h, float &Q, float &M, float &s, float aw, float fl, float wh, float x, float y, float z, float xw, float yw, float zw, - float c, float nc, float pow1, float nbb, float ncb, float pfl, float cz, float d, int c16) + float c, float nc, float pow1, float nbb, float ncb, float pfl, float cz, float d, int c16, float plum) { float r, g, b; @@ -478,8 +799,8 @@ void Ciecam02::xyz2jchqms_ciecam02float ( float &J, float &C, float &h, float &Q float a, ca, cb; float e, t; float myh; - xyz_to_cat02float ( r, g, b, x, y, z, c16); - xyz_to_cat02float ( rw, gw, bw, xw, yw, zw, c16); + xyz_to_cat02float ( r, g, b, x, y, z, c16, plum); + xyz_to_cat02float ( rw, gw, bw, xw, yw, zw, c16, plum); rc = r * (((yw * d) / rw) + (1.f - d)); gc = g * (((yw * d) / gw) + (1.f - d)); bc = b * (((yw * d) / bw) + (1.f - d)); @@ -530,7 +851,7 @@ void Ciecam02::xyz2jchqms_ciecam02float ( float &J, float &C, float &h, float &Q #ifdef __SSE2__ void Ciecam02::xyz2jchqms_ciecam02float ( vfloat &J, vfloat &C, vfloat &h, vfloat &Q, vfloat &M, vfloat &s, vfloat aw, vfloat fl, vfloat wh, vfloat x, vfloat y, vfloat z, vfloat xw, vfloat yw, vfloat zw, - vfloat c, vfloat nc, vfloat pow1, vfloat nbb, vfloat ncb, vfloat pfl, vfloat cz, vfloat d, int c16) + vfloat c, vfloat nc, vfloat pow1, vfloat nbb, vfloat ncb, vfloat pfl, vfloat cz, vfloat d, int c16, vfloat plum) { vfloat r, g, b; @@ -541,8 +862,8 @@ void Ciecam02::xyz2jchqms_ciecam02float ( vfloat &J, vfloat &C, vfloat &h, vfloa vfloat a, ca, cb; vfloat e, t; - xyz_to_cat02float ( r, g, b, x, y, z, c16); - xyz_to_cat02float ( rw, gw, bw, xw, yw, zw, c16); + xyz_to_cat02float ( r, g, b, x, y, z, c16, plum); + xyz_to_cat02float ( rw, gw, bw, xw, yw, zw, c16, plum); vfloat onev = F2V (1.f); rc = r * (((yw * d) / rw) + (onev - d)); gc = g * (((yw * d) / gw) + (onev - d)); @@ -595,7 +916,7 @@ void Ciecam02::xyz2jchqms_ciecam02float ( vfloat &J, vfloat &C, vfloat &h, vfloa void Ciecam02::xyz2jch_ciecam02float ( float &J, float &C, float &h, float aw, float fl, float x, float y, float z, float xw, float yw, float zw, - float c, float nc, float pow1, float nbb, float ncb, float cz, float d, int c16) + float c, float nc, float pow1, float nbb, float ncb, float cz, float d, int c16, float plum) { float r, g, b; @@ -606,8 +927,8 @@ void Ciecam02::xyz2jch_ciecam02float ( float &J, float &C, float &h, float aw, f float a, ca, cb; float e, t; float myh; - xyz_to_cat02float ( r, g, b, x, y, z, c16); - xyz_to_cat02float ( rw, gw, bw, xw, yw, zw, c16); + xyz_to_cat02float ( r, g, b, x, y, z, c16, plum); + xyz_to_cat02float ( rw, gw, bw, xw, yw, zw, c16, plum); rc = r * (((yw * d) / rw) + (1.f - d)); gc = g * (((yw * d) / gw) + (1.f - d)); bc = b * (((yw * d) / bw) + (1.f - d)); @@ -664,7 +985,7 @@ void Ciecam02::xyz2jch_ciecam02float ( float &J, float &C, float &h, float aw, f void Ciecam02::jch2xyz_ciecam02float ( float &x, float &y, float &z, float J, float C, float h, float xw, float yw, float zw, - float c, float nc, float pow1, float nbb, float ncb, float fl, float cz, float d, float aw, int c16) + float c, float nc, float pow1, float nbb, float ncb, float fl, float cz, float d, float aw, int c16, float plum) { float r, g, b; float rc, gc, bc; @@ -673,7 +994,7 @@ void Ciecam02::jch2xyz_ciecam02float ( float &x, float &y, float &z, float J, fl float rw, gw, bw; float a, ca, cb; float e, t; - xyz_to_cat02float(rw, gw, bw, xw, yw, zw, c16); + xyz_to_cat02float(rw, gw, bw, xw, yw, zw, c16, plum); e = ((961.53846f) * nc * ncb) * (xcosf(h * rtengine::RT_PI_F_180 + 2.0f) + 3.8f); #ifdef __SSE2__ @@ -705,7 +1026,7 @@ void Ciecam02::jch2xyz_ciecam02float ( float &x, float &y, float &z, float J, fl if(c16 == 1) {//cat02 hpe_to_xyzfloat(x, y, z, rp, gp, bp, c16); - xyz_to_cat02float(rc, gc, bc, x, y, z, c16); + xyz_to_cat02float(rc, gc, bc, x, y, z, c16, plum); r = rc / (((yw * d) / rw) + (1.0f - d)); g = gc / (((yw * d) / gw) + (1.0f - d)); @@ -716,13 +1037,13 @@ void Ciecam02::jch2xyz_ciecam02float ( float &x, float &y, float &z, float J, fl b = bp / (((yw * d) / bw) + (1.0f - d)); } - cat02_to_xyzfloat(x, y, z, r, g, b, c16); + cat02_to_xyzfloat(x, y, z, r, g, b, c16, plum); } #ifdef __SSE2__ void Ciecam02::jch2xyz_ciecam02float ( vfloat &x, vfloat &y, vfloat &z, vfloat J, vfloat C, vfloat h, vfloat xw, vfloat yw, vfloat zw, - vfloat nc, vfloat pow1, vfloat nbb, vfloat ncb, vfloat fl, vfloat d, vfloat aw, vfloat reccmcz, int c16) + vfloat nc, vfloat pow1, vfloat nbb, vfloat ncb, vfloat fl, vfloat d, vfloat aw, vfloat reccmcz, int c16, vfloat plum) { vfloat r, g, b; vfloat rc, gc, bc; @@ -731,7 +1052,7 @@ void Ciecam02::jch2xyz_ciecam02float ( vfloat &x, vfloat &y, vfloat &z, vfloat J vfloat rw, gw, bw; vfloat a, ca, cb; vfloat e, t; - xyz_to_cat02float ( rw, gw, bw, xw, yw, zw, c16); + xyz_to_cat02float ( rw, gw, bw, xw, yw, zw, c16, plum); e = ((F2V (961.53846f)) * nc * ncb) * (xcosf ( ((h * F2V (rtengine::RT_PI)) / F2V (180.0f)) + F2V (2.0f) ) + F2V (3.8f)); a = pow_F ( J / F2V (100.0f), reccmcz ) * aw; t = pow_F ( F2V (10.f) * C / (vsqrtf ( J ) * pow1), F2V (1.1111111f) ); @@ -745,7 +1066,7 @@ void Ciecam02::jch2xyz_ciecam02float ( vfloat &x, vfloat &y, vfloat &z, vfloat J if(c16 == 1) {//cat02 hpe_to_xyzfloat ( x, y, z, rp, gp, bp, c16); - xyz_to_cat02float ( rc, gc, bc, x, y, z, c16 ); + xyz_to_cat02float ( rc, gc, bc, x, y, z, c16, plum ); r = rc / (((yw * d) / rw) + (F2V (1.0f) - d)); g = gc / (((yw * d) / gw) + (F2V (1.0f) - d)); @@ -756,7 +1077,7 @@ void Ciecam02::jch2xyz_ciecam02float ( vfloat &x, vfloat &y, vfloat &z, vfloat J b = bp / (((yw * d) / bw) + (F2V (1.0f) - d)); } - cat02_to_xyzfloat ( x, y, z, r, g, b, c16 ); + cat02_to_xyzfloat ( x, y, z, r, g, b, c16, plum ); } #endif diff --git a/rtengine/ciecam02.h b/rtengine/ciecam02.h index cd140a702..5312635f6 100644 --- a/rtengine/ciecam02.h +++ b/rtengine/ciecam02.h @@ -37,12 +37,12 @@ class Ciecam02 private: static float d_factorfloat ( float f, float la ); static float calculate_fl_from_la_ciecam02float ( float la ); - static float achromatic_response_to_whitefloat ( float x, float y, float z, float d, float fl, float nbb, int c16); - static void xyz_to_cat02float ( float &r, float &g, float &b, float x, float y, float z, int c16); + static float achromatic_response_to_whitefloat ( float x, float y, float z, float d, float fl, float nbb, int c16, float plum); + static void xyz_to_cat02float ( float &r, float &g, float &b, float x, float y, float z, int c16, float plum); static void cat02_to_hpefloat ( float &rh, float &gh, float &bh, float r, float g, float b, int c16); #ifdef __SSE2__ - static void xyz_to_cat02float ( vfloat &r, vfloat &g, vfloat &b, vfloat x, vfloat y, vfloat z, int c16); + static void xyz_to_cat02float ( vfloat &r, vfloat &g, vfloat &b, vfloat x, vfloat y, vfloat z, int c16, vfloat plum); static void cat02_to_hpefloat ( vfloat &rh, vfloat &gh, vfloat &bh, vfloat r, vfloat g, vfloat b, int c16); static vfloat nonlinear_adaptationfloat ( vfloat c, vfloat fl ); #endif @@ -53,13 +53,13 @@ private: static void calculate_abfloat ( float &aa, float &bb, float h, float e, float t, float nbb, float a ); static void Aab_to_rgbfloat ( float &r, float &g, float &b, float A, float aa, float bb, float nbb ); static void hpe_to_xyzfloat ( float &x, float &y, float &z, float r, float g, float b, int c16); - static void cat02_to_xyzfloat ( float &x, float &y, float &z, float r, float g, float b, int c16); + static void cat02_to_xyzfloat ( float &x, float &y, float &z, float r, float g, float b, int c16, float plum); #ifdef __SSE2__ static vfloat inverse_nonlinear_adaptationfloat ( vfloat c, vfloat fl ); static void calculate_abfloat ( vfloat &aa, vfloat &bb, vfloat h, vfloat e, vfloat t, vfloat nbb, vfloat a ); static void Aab_to_rgbfloat ( vfloat &r, vfloat &g, vfloat &b, vfloat A, vfloat aa, vfloat bb, vfloat nbb ); static void hpe_to_xyzfloat ( vfloat &x, vfloat &y, vfloat &z, vfloat r, vfloat g, vfloat b, int c16); - static void cat02_to_xyzfloat ( vfloat &x, vfloat &y, vfloat &z, vfloat r, vfloat g, vfloat b, int c16); + static void cat02_to_xyzfloat ( vfloat &x, vfloat &y, vfloat &z, vfloat r, vfloat g, vfloat b, int c16, vfloat plum); #endif public: @@ -67,46 +67,52 @@ public: static void curvecolorfloat (float satind, float satval, float &sres, float parsat); static void curveJfloat (float br, float contr, float thr, const LUTu & histogram, LUTf & outCurve ) ; + static void xyz2jzczhz (double &Jz, double &az, double &bz, double x, double y, double z, double pl, double &Lp, double &Mp, double &Sp, bool zcam); + + static void jzczhzxyz (double &x, double &y, double &z, double Jz, double az, double bz, double pl, double &L, double &M, double &S, bool zcam); + + + /** * Inverse transform from CIECAM02 JCh to XYZ. */ static void jch2xyz_ciecam02float ( float &x, float &y, float &z, float J, float C, float h, float xw, float yw, float zw, - float c, float nc, float n, float nbb, float ncb, float fl, float cz, float d, float aw, int c16); + float c, float nc, float n, float nbb, float ncb, float fl, float cz, float d, float aw, int c16, float plum); #ifdef __SSE2__ static void jch2xyz_ciecam02float ( vfloat &x, vfloat &y, vfloat &z, vfloat J, vfloat C, vfloat h, vfloat xw, vfloat yw, vfloat zw, - vfloat nc, vfloat n, vfloat nbb, vfloat ncb, vfloat fl, vfloat d, vfloat aw, vfloat reccmcz, int c16 ); + vfloat nc, vfloat n, vfloat nbb, vfloat ncb, vfloat fl, vfloat d, vfloat aw, vfloat reccmcz, int c16, vfloat plum ); #endif /** * Forward transform from XYZ to CIECAM02 JCh. */ static void initcam1float (float yb, float pilotd, float f, float la, float xw, float yw, float zw, float &n, float &d, float &nbb, float &ncb, - float &cz, float &aw, float &wh, float &pfl, float &fl, float c, int c16); + float &cz, float &aw, float &wh, float &pfl, float &fl, float c, int c16, float plum); static void initcam2float (float yb, float pilotd, float f, float la, float xw, float yw, float zw, float &n, float &d, float &nbb, float &ncb, - float &cz, float &aw, float &fl, int c16); + float &cz, float &aw, float &fl, int c16, float plum); static void xyz2jch_ciecam02float ( float &J, float &C, float &h, float aw, float fl, float x, float y, float z, float xw, float yw, float zw, - float c, float nc, float n, float nbb, float ncb, float cz, float d, int c16); + float c, float nc, float n, float nbb, float ncb, float cz, float d, int c16, float plum); static void xyz2jchqms_ciecam02float ( float &J, float &C, float &h, float &Q, float &M, float &s, float aw, float fl, float wh, float x, float y, float z, float xw, float yw, float zw, - float c, float nc, float n, float nbb, float ncb, float pfl, float cz, float d, int c16); + float c, float nc, float n, float nbb, float ncb, float pfl, float cz, float d, int c16, float plum); #ifdef __SSE2__ static void xyz2jchqms_ciecam02float ( vfloat &J, vfloat &C, vfloat &h, vfloat &Q, vfloat &M, vfloat &s, vfloat aw, vfloat fl, vfloat wh, vfloat x, vfloat y, vfloat z, vfloat xw, vfloat yw, vfloat zw, - vfloat c, vfloat nc, vfloat n, vfloat nbb, vfloat ncb, vfloat pfl, vfloat cz, vfloat d, int c16); + vfloat c, vfloat nc, vfloat n, vfloat nbb, vfloat ncb, vfloat pfl, vfloat cz, vfloat d, int c16, vfloat plum); #endif diff --git a/rtengine/color.h b/rtengine/color.h index 0fae99a5d..f602ade83 100644 --- a/rtengine/color.h +++ b/rtengine/color.h @@ -1889,6 +1889,59 @@ static inline void Lab2XYZ(vfloat L, vfloat a, vfloat b, vfloat &x, vfloat &y, v return (hr); } + static inline double huejz_to_huehsv2 (float HH) + { + //hr=translate Hue Jz value (-Pi +Pi) in approximative hr (hsv values) (0 1) + // with multi linear correspondences (I expect another time with Jz there is no error !!) + double hr = 0.0; + //always put h between 0 and 1 + // make with my chart 468 colors... + // HH ==> Hz value ; hr HSv value + if (HH >= 0.2f && HH < 0.75f) { + hr = 0.12727273 * double(HH) + 0.90454551;//hr 0.93 1.00 full red + } else if (HH >= 0.75f && HH < 1.35f) { + hr = 0.15 * double(HH) - 0.1125;//hr 0.00 0.09 red yellow orange + } else if (HH >= 1.35f && HH < 1.85f) { + hr = 0.32 * double(HH) - 0.342; //hr 0.09 0.25 orange yellow + } else if (HH >= 1.85f && HH < 2.46f) { + hr = 0.23442623 * double(HH) -0.18368853;//hr 0.25 0.393 yellow green green + } else if (HH >= 2.46f && HH < 3.14159f) { + hr = 0.177526 * double(HH) -0.043714;//hr 0.393 0.51315 green ==> 0.42 Lab + } else if (HH >= -3.14159f && HH < -2.89f) { + hr = 0.3009078 * double(HH) + 1.459329;//hr 0.51315 0.5897 green cyan ==> -2.30 Lab + } else if (HH >= -2.89f && HH < -2.7f) { + hr = 0.204542 * double(HH) + 1.1808264;//hr 0.5897 0.628563 cyan + } else if (HH >= -2.7f && HH < -2.17f) { + hr = 0.121547 * double(HH) + 0.956399;//hr 0.628563 0.692642 blue blue-sky + } else if (HH >= -2.17f && HH < -0.9f) { + hr = 0.044882 * double(HH) + 0.789901;//hr 0.692642 0.749563 blue blue-sky + } else if (HH >= -0.9f && HH < -0.1f) { + hr = 0.2125 * double(HH) + 0.940813;//hr 0.749563 0.919563 purple magenta + } else if (HH >= -0.1f && HH < 0.2f) { + hr = 0.03479 * double(HH) + 0.923042;//hr 0.919563 0.93 red + } + // in case of ! + if (hr < 0.0) { + hr += 1.0; + } else if(hr > 1.0) { + hr -= 1.0; + } + + return (hr); + } + +// HSV 0.93 1.0 red - Lab 0.0 0.6 Jz 0.20 0.75 +// HSV 0.00 0.9 red orange - Lab 0.6 1.4 Jz 0.50 1.35 +// HSV 0.09 0.25 oran - yellow - Lab 1.4 2.0 Jz 1.35 1.85 +// HSV 0.25 0.39 yellow - gree - Lab 2.0 3.0 Jz 1.85 2.40 +// HSV 0.39 0.50 green - cyan Lab 3.0 -2.8 Jz 2.40 3.10 +// HSV 0.50 0.58 cyan Lab-2.8 -2.3 Jz 3.10 -2.90 +// HSV 0.58 0.69 blue - sky Lab-2.3 -1.3 Jz -2.90 -2.17 +// HSV 0.69 0.75 blue - Lab-1.3 -0.9 Jz -2.17 -0.90 +// HSV 0.75 0.92 purple - Lab-0.9 -0.1 Jz -0.9 -0.10 +// HSV 0.92 0.93 magenta Lab-0.1 0.0 Jz -0.1 0.20 + + static inline void RGB2Y(const float* R, const float* G, const float* B, float* Y1, float * Y2, int W) { int i = 0; #ifdef __SSE2__ diff --git a/rtengine/curves.cc b/rtengine/curves.cc index c6bf86954..81d5b175b 100644 --- a/rtengine/curves.cc +++ b/rtengine/curves.cc @@ -3460,12 +3460,13 @@ void PerceptualToneCurve::BatchApply(const size_t start, const size_t end, float Color::Prophotoxyz(r, g, b, x, y, z); float J, C, h; - int c16 = 1; + int c16 = 1;//always Cat02....to reserve compatibility + float plum = 100.f; Ciecam02::xyz2jch_ciecam02float(J, C, h, aw, fl, x * 0.0015259022f, y * 0.0015259022f, z * 0.0015259022f, xw, yw, zw, - c, nc, pow1, nbb, ncb, cz, d, c16); + c, nc, pow1, nbb, ncb, cz, d, c16, plum); if (!isfinite(J) || !isfinite(C) || !isfinite(h)) { @@ -3583,7 +3584,7 @@ void PerceptualToneCurve::BatchApply(const size_t start, const size_t end, float Ciecam02::jch2xyz_ciecam02float(x, y, z, J, C, h, xw, yw, zw, - c, nc, pow1, nbb, ncb, fl, cz, d, aw, c16); + c, nc, pow1, nbb, ncb, fl, cz, d, aw, c16, plum); if (!isfinite(x) || !isfinite(y) || !isfinite(z)) { // can happen for colours on the rim of being outside gamut, that worked without chroma scaling but not with. Then we return only the curve's result. @@ -3699,8 +3700,9 @@ void PerceptualToneCurve::init() c = 0.69f; nc = 1.00f; int c16 = 1;//with cat02 for compatibility + float plum = 100.f; Ciecam02::initcam1float(yb, 1.f, f, la, xw, yw, zw, n, d, nbb, ncb, - cz, aw, wh, pfl, fl, c, c16); + cz, aw, wh, pfl, fl, c, c16, plum); pow1 = pow_F(1.64f - pow_F(0.29f, n), 0.73f); { diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 1e67c4f11..f4ac49fc4 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -872,6 +872,12 @@ void Crop::update(int todo) auto& lmaskbllocalcurve2 = parent->lmaskbllocalcurve; auto& lmasklclocalcurve2 = parent->lmasklclocalcurve; auto& lmaskloglocalcurve2 = parent->lmaskloglocalcurve; + auto& lmaskcielocalcurve2 = parent->lmaskcielocalcurve; + auto& cielocalcurve2 = parent->cielocalcurve; + auto& cielocalcurve22 = parent->cielocalcurve2; + auto& jzlocalcurve2 = parent->jzlocalcurve; + auto& czlocalcurve2 = parent->czlocalcurve; + auto& czjzlocalcurve2 = parent->czjzlocalcurve; auto& hltonecurveloc2 = parent->hltonecurveloc; auto& shtonecurveloc2 = parent->shtonecurveloc; auto& tonecurveloc2 = parent->tonecurveloc; @@ -881,6 +887,9 @@ void Crop::update(int todo) auto& loclhCurve = parent->loclhCurve; auto& lochhCurve = parent->lochhCurve; auto& locchCurve = parent->locchCurve; + auto& lochhCurvejz = parent->lochhCurvejz; + auto& locchCurvejz = parent->locchCurvejz; + auto& loclhCurvejz = parent->loclhCurvejz; auto& locccmasCurve = parent->locccmasCurve; auto& locllmasCurve = parent->locllmasCurve; auto& lochhmasCurve = parent->lochhmasCurve; @@ -912,12 +921,16 @@ void Crop::update(int todo) auto& locccmaslogCurve = parent->locccmaslogCurve; auto& locllmaslogCurve = parent->locllmaslogCurve; auto& lochhmaslogCurve = parent->lochhmaslogCurve; + auto& locccmascieCurve = parent->locccmascieCurve; + auto& locllmascieCurve = parent->locllmascieCurve; + auto& lochhmascieCurve = parent->lochhmascieCurve; auto& locccmas_Curve = parent->locccmas_Curve; auto& locllmas_Curve = parent->locllmas_Curve; auto& lochhmas_Curve = parent->lochhmas_Curve; auto& lochhhmas_Curve = parent->lochhhmas_Curve; auto& locwavCurve = parent->locwavCurve; + auto& locwavCurvejz = parent->locwavCurvejz; auto& loclmasCurveblwav = parent->loclmasCurveblwav; auto& loclmasCurvecolwav = parent->loclmasCurvecolwav; auto& loclevwavCurve = parent->loclevwavCurve; @@ -929,13 +942,25 @@ void Crop::update(int todo) auto& locwavCurveden = parent->locwavCurveden; auto& lmasklocal_curve2 = parent->lmasklocal_curve; auto& loclmasCurve_wav = parent->loclmasCurve_wav; - +// const int sizespot = (int)params.locallab.spots.size(); +/* float *huerefp = nullptr; + huerefp = new float[sizespot]; + float *chromarefp = nullptr; + chromarefp = new float[sizespot]; + float *lumarefp = nullptr; + lumarefp = new float[sizespot]; + float *fabrefp = nullptr; + fabrefp = new float[sizespot]; +*/ for (int sp = 0; sp < (int)params.locallab.spots.size(); sp++) { locRETgainCurve.Set(params.locallab.spots.at(sp).localTgaincurve); locRETtransCurve.Set(params.locallab.spots.at(sp).localTtranscurve); const bool LHutili = loclhCurve.Set(params.locallab.spots.at(sp).LHcurve); const bool HHutili = lochhCurve.Set(params.locallab.spots.at(sp).HHcurve); const bool CHutili = locchCurve.Set(params.locallab.spots.at(sp).CHcurve); + const bool HHutilijz = lochhCurvejz.Set(params.locallab.spots.at(sp).HHcurvejz); + const bool CHutilijz = locchCurvejz.Set(params.locallab.spots.at(sp).CHcurvejz); + const bool LHutilijz = loclhCurvejz.Set(params.locallab.spots.at(sp).LHcurvejz); const bool lcmasutili = locccmasCurve.Set(params.locallab.spots.at(sp).CCmaskcurve); const bool llmasutili = locllmasCurve.Set(params.locallab.spots.at(sp).LLmaskcurve); const bool lhmasutili = lochhmasCurve.Set(params.locallab.spots.at(sp).HHmaskcurve); @@ -964,6 +989,9 @@ void Crop::update(int todo) const bool lcmaslogutili = locccmaslogCurve.Set(params.locallab.spots.at(sp).CCmaskcurveL); const bool llmaslogutili = locllmaslogCurve.Set(params.locallab.spots.at(sp).LLmaskcurveL); const bool lhmaslogutili = lochhmaslogCurve.Set(params.locallab.spots.at(sp).HHmaskcurveL); + const bool lcmascieutili = locccmascieCurve.Set(params.locallab.spots.at(sp).CCmaskciecurve); + const bool llmascieutili = locllmascieCurve.Set(params.locallab.spots.at(sp).LLmaskciecurve); + const bool lhmascieutili = lochhmascieCurve.Set(params.locallab.spots.at(sp).HHmaskciecurve); const bool lcmas_utili = locccmas_Curve.Set(params.locallab.spots.at(sp).CCmask_curve); const bool llmas_utili = locllmas_Curve.Set(params.locallab.spots.at(sp).LLmask_curve); @@ -976,6 +1004,7 @@ void Crop::update(int todo) const bool llmaslcutili = locllmaslcCurve.Set(params.locallab.spots.at(sp).LLmasklccurve); const bool lhmaslcutili = lochhmaslcCurve.Set(params.locallab.spots.at(sp).HHmasklccurve); const bool locwavutili = locwavCurve.Set(params.locallab.spots.at(sp).locwavcurve); + const bool locwavutilijz = locwavCurvejz.Set(params.locallab.spots.at(sp).locwavcurvejz); const bool locwavhueutili = locwavCurvehue.Set(params.locallab.spots.at(sp).locwavcurvehue); const bool locwavdenutili = locwavCurveden.Set(params.locallab.spots.at(sp).locwavcurveden); const bool loclevwavutili = loclevwavCurve.Set(params.locallab.spots.at(sp).loclevwavcurve); @@ -1000,6 +1029,12 @@ void Crop::update(int todo) const bool localmaskblutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).Lmaskblcurve, lmaskbllocalcurve2, skip); const bool localmasklogutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).LmaskcurveL, lmaskloglocalcurve2, skip); const bool localmask_utili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).Lmask_curve, lmasklocal_curve2, skip); + const bool localmaskcieutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).Lmaskciecurve, lmaskcielocalcurve2, skip); + const bool localcieutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).ciecurve, cielocalcurve2, skip); + const bool localcieutili2 = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).ciecurve2, cielocalcurve22, skip); + const bool localjzutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).jzcurve, jzlocalcurve2, skip); + const bool localczutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).czcurve, czlocalcurve2, skip); + const bool localczjzutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).czjzcurve, czjzlocalcurve2, skip); double ecomp = params.locallab.spots.at(sp).expcomp; double black = params.locallab.spots.at(sp).black; @@ -1025,7 +1060,7 @@ void Crop::update(int todo) float stdtme = parent->stdtms[sp]; float meanretie = parent->meanretis[sp]; float stdretie = parent->stdretis[sp]; - + float fab = 1.f; float minCD; float maxCD; float mini; @@ -1035,6 +1070,11 @@ void Crop::update(int todo) float Tmin; float Tmax; int lastsav; + +/* huerefp[sp] = huere; + chromarefp[sp] = chromare; + lumarefp[sp] = lumare; +*/ CurveFactory::complexCurvelocal(ecomp, black / 65535., hlcompr, hlcomprthresh, shcompr, br, cont, lumare, hltonecurveloc2, shtonecurveloc2, tonecurveloc2, lightCurveloc2, avge, skip); @@ -1049,6 +1089,8 @@ void Crop::update(int todo) cllocalcurve2, localclutili, lclocalcurve2, locallcutili, loclhCurve, lochhCurve, locchCurve, + lochhCurvejz, locchCurvejz, loclhCurvejz, + lmasklocalcurve2, localmaskutili, lmaskexplocalcurve2, localmaskexputili, lmaskSHlocalcurve2, localmaskSHutili, @@ -1060,6 +1102,12 @@ void Crop::update(int todo) lmasklclocalcurve2, localmasklcutili, lmaskloglocalcurve2, localmasklogutili, lmasklocal_curve2, localmask_utili, + lmaskcielocalcurve2, localmaskcieutili, + cielocalcurve2,localcieutili, + cielocalcurve22,localcieutili2, + jzlocalcurve2,localjzutili, + czlocalcurve2,localczutili, + czjzlocalcurve2,localczjzutili, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, lochhhmasCurve, lhhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, @@ -1072,10 +1120,13 @@ void Crop::update(int todo) locccmaslogCurve, lcmaslogutili, locllmaslogCurve, llmaslogutili, lochhmaslogCurve, lhmaslogutili, locccmas_Curve, lcmas_utili, locllmas_Curve, llmas_utili, lochhmas_Curve, lhmas_utili, + locccmascieCurve, lcmascieutili, locllmascieCurve, llmasSHutili, lochhmascieCurve, lhmascieutili, + lochhhmas_Curve, lhhmas_utili, loclmasCurveblwav,lmasutiliblwav, loclmasCurvecolwav,lmasutilicolwav, locwavCurve, locwavutili, + locwavCurvejz, locwavutilijz, loclevwavCurve, loclevwavutili, locconwavCurve, locconwavutili, loccompwavCurve, loccompwavutili, @@ -1084,12 +1135,14 @@ void Crop::update(int todo) locwavCurveden, locwavdenutili, locedgwavCurve, locedgwavutili, loclmasCurve_wav,lmasutili_wav, - LHutili, HHutili, CHutili, cclocalcurve2, localcutili, rgblocalcurve2, localrgbutili, localexutili, exlocalcurve2, hltonecurveloc2, shtonecurveloc2, tonecurveloc2, lightCurveloc2, + LHutili, HHutili, CHutili, HHutilijz, CHutilijz, LHutilijz, cclocalcurve2, localcutili, rgblocalcurve2, localrgbutili, localexutili, exlocalcurve2, hltonecurveloc2, shtonecurveloc2, tonecurveloc2, lightCurveloc2, huerefblu, chromarefblu, lumarefblu, huere, chromare, lumare, sobelre, lastsav, parent->previewDeltaE, parent->locallColorMask, parent->locallColorMaskinv, parent->locallExpMask, parent->locallExpMaskinv, parent->locallSHMask, parent->locallSHMaskinv, parent->locallvibMask, parent->localllcMask, parent->locallsharMask, parent->locallcbMask, parent->locallretiMask, parent->locallsoftMask, parent->localltmMask, parent->locallblMask, - parent->localllogMask, parent->locall_Mask, minCD, maxCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax, - meantme, stdtme, meanretie, stdretie); - if (parent->previewDeltaE || parent->locallColorMask == 5 || parent->locallvibMask == 4 || parent->locallExpMask == 5 || parent->locallSHMask == 4 || parent->localllcMask == 4 || parent->localltmMask == 4 || parent->localllogMask == 4 || parent->locallsoftMask == 6 || parent->localllcMask == 4) { + parent->localllogMask, parent->locall_Mask, parent->locallcieMask, minCD, maxCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax, + meantme, stdtme, meanretie, stdretie, fab); + // fabrefp[sp] = fab; + + if (parent->previewDeltaE || parent->locallColorMask == 5 || parent->locallvibMask == 4 || parent->locallExpMask == 5 || parent->locallSHMask == 4 || parent->localllcMask == 4 || parent->localltmMask == 4 || parent->localllogMask == 4 || parent->locallsoftMask == 6 || parent->localllcMask == 4 || parent->locallcieMask == 4) { params.blackwhite.enabled = false; params.colorToning.enabled = false; params.rgbCurves.enabled = false; @@ -1112,12 +1165,20 @@ void Crop::update(int todo) params.epd.enabled = false; params.softlight.enabled = false; } + /* + if (parent->locallListener) { + parent->locallListener->refChanged2(huerefp, chromarefp, lumarefp, fabrefp, params.locallab.selspot); + + } + */ + } else { parent->ipf.Lab_Local(1, sp, (float**)shbuffer, labnCrop, labnCrop, reservCrop.get(), savenormtmCrop.get(), savenormretiCrop.get(), lastorigCrop.get(), fw, fh, cropx / skip, cropy / skip, skips(parent->fw, skip), skips(parent->fh, skip), skip, locRETgainCurve, locRETtransCurve, lllocalcurve2,locallutili, cllocalcurve2, localclutili, lclocalcurve2, locallcutili, loclhCurve, lochhCurve, locchCurve, + lochhCurvejz, locchCurvejz, loclhCurvejz, lmasklocalcurve2, localmaskutili, lmaskexplocalcurve2, localmaskexputili, lmaskSHlocalcurve2, localmaskSHutili, @@ -1129,6 +1190,12 @@ void Crop::update(int todo) lmasklclocalcurve2, localmasklcutili, lmaskloglocalcurve2, localmasklogutili, lmasklocal_curve2, localmask_utili, + lmaskcielocalcurve2, localmaskcieutili, + cielocalcurve2,localcieutili, + cielocalcurve22,localcieutili2, + jzlocalcurve2,localjzutili, + czlocalcurve2,localczutili, + czjzlocalcurve2,localczjzutili, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili,lochhhmasCurve, lhhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, @@ -1141,11 +1208,13 @@ void Crop::update(int todo) locccmaslogCurve, lcmaslogutili, locllmaslogCurve, llmaslogutili, lochhmaslogCurve, lhmaslogutili, locccmas_Curve, lcmas_utili, locllmas_Curve, llmas_utili, lochhmas_Curve, lhmas_utili, + locccmascieCurve, lcmascieutili, locllmascieCurve, llmascieutili, lochhmascieCurve, lhmascieutili, lochhhmas_Curve, lhhmas_utili, loclmasCurveblwav,lmasutiliblwav, loclmasCurvecolwav,lmasutilicolwav, locwavCurve, locwavutili, + locwavCurvejz, locwavutilijz, loclevwavCurve, loclevwavutili, locconwavCurve, locconwavutili, loccompwavCurve, loccompwavutili, @@ -1154,10 +1223,10 @@ void Crop::update(int todo) locwavCurveden, locwavdenutili, locedgwavCurve, locedgwavutili, loclmasCurve_wav,lmasutili_wav, - LHutili, HHutili, CHutili, cclocalcurve2, localcutili, rgblocalcurve2, localrgbutili, localexutili, exlocalcurve2, hltonecurveloc2, shtonecurveloc2, tonecurveloc2, lightCurveloc2, - huerefblu, chromarefblu, lumarefblu, huere, chromare, lumare, sobelre, lastsav, false, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + LHutili, HHutili, CHutili, HHutilijz, CHutilijz, LHutilijz, cclocalcurve2, localcutili, rgblocalcurve2, localrgbutili, localexutili, exlocalcurve2, hltonecurveloc2, shtonecurveloc2, tonecurveloc2, lightCurveloc2, + huerefblu, chromarefblu, lumarefblu, huere, chromare, lumare, sobelre, lastsav, false, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, minCD, maxCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax, - meantme, stdtme, meanretie, stdretie); + meantme, stdtme, meanretie, stdretie, fab); } if (sp + 1u < params.locallab.spots.size()) { // do not copy for last spot as it is not needed anymore @@ -1168,6 +1237,13 @@ void Crop::update(int todo) Glib::usleep(settings->cropsleep); //wait to avoid crash when crop 100% and move window } } + /* + delete [] huerefp; + delete [] chromarefp; + delete [] lumarefp; + delete [] fabrefp; + */ + parent->ipf.lab2rgb(*labnCrop, *baseCrop, params.icm.workingProfile); } @@ -1548,8 +1624,9 @@ void Crop::update(int todo) adap = 2000.; } else { double E_V = fcomp + log2(double ((fnum * fnum) / fspeed / (fiso / 100.f))); - E_V += params.toneCurve.expcomp;// exposure compensation in tonecurve ==> direct EV - E_V += log2(params.raw.expos); // exposure raw white point ; log2 ==> linear to EV + double kexp = 0.; + E_V += kexp * params.toneCurve.expcomp;// exposure compensation in tonecurve ==> direct EV + E_V += 0.5 * log2(params.raw.expos); // exposure raw white point ; log2 ==> linear to EV adap = pow(2., E_V - 3.); // cd / m2 // end calculation adaptation scene luminosity } diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index c9cce7c20..33cce1842 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -216,6 +216,12 @@ ImProcCoordinator::ImProcCoordinator() : lmasklclocalcurve(65536, LUT_CLIP_OFF), lmaskloglocalcurve(65536, LUT_CLIP_OFF), lmasklocal_curve(65536, LUT_CLIP_OFF), + lmaskcielocalcurve(65536, LUT_CLIP_OFF), + cielocalcurve(65536, LUT_CLIP_OFF), + cielocalcurve2(65536, LUT_CLIP_OFF), + jzlocalcurve(65536, LUT_CLIP_OFF), + czlocalcurve(65536, LUT_CLIP_OFF), + czjzlocalcurve(65536, LUT_CLIP_OFF), lastspotdup(false), previewDeltaE(false), locallColorMask(0), @@ -234,6 +240,7 @@ ImProcCoordinator::ImProcCoordinator() : locallsharMask(0), localllogMask(0), locall_Mask(0), + locallcieMask(0), retistrsav(nullptr) { } @@ -785,6 +792,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) // Encoding log with locallab if (params->locallab.enabled && !params->locallab.spots.empty()) { const int sizespot = (int)params->locallab.spots.size(); + const LocallabParams::LocallabSpot defSpot; float *sourceg = nullptr; sourceg = new float[sizespot]; @@ -794,6 +802,8 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) targetg = new float[sizespot]; bool *log = nullptr; log = new bool[sizespot]; + bool *cie = nullptr; + cie = new bool[sizespot]; bool *autocomput = nullptr; autocomput = new bool[sizespot]; float *blackev = nullptr; @@ -802,7 +812,10 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) whiteev = new float[sizespot]; bool *Autogr = nullptr; Autogr = new bool[sizespot]; - + bool *autocie = nullptr; + autocie = new bool[sizespot]; + + float *locx = nullptr; locx = new float[sizespot]; float *locy = nullptr; @@ -818,7 +831,9 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) for (int sp = 0; sp < sizespot; sp++) { log[sp] = params->locallab.spots.at(sp).explog; + cie[sp] = params->locallab.spots.at(sp).expcie; autocomput[sp] = params->locallab.spots.at(sp).autocompute; + autocie[sp] = params->locallab.spots.at(sp).Autograycie; blackev[sp] = params->locallab.spots.at(sp).blackEv; whiteev[sp] = params->locallab.spots.at(sp).whiteEv; sourceg[sp] = params->locallab.spots.at(sp).sourceGray; @@ -832,9 +847,10 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) centx[sp] = params->locallab.spots.at(sp).centerX / 2000.0 + 0.5; centy[sp] = params->locallab.spots.at(sp).centerY / 2000.0 + 0.5; - const bool fullim = params->locallab.spots.at(sp).fullimage; + const bool fullimstd = params->locallab.spots.at(sp).fullimage;//for log encoding standard + const bool fullimjz = true;//always force fullimage in log encoding Jz - always possible to put a checkbox if need - if (log[sp] && autocomput[sp]) { + if ((log[sp] && autocomput[sp]) || (cie[sp] && autocie[sp])) { constexpr int SCALE = 10; int fw, fh, tr = TR_NONE; imgsrc->getFullSize(fw, fh, tr); @@ -845,7 +861,14 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) float xsta = std::max(static_cast(centx[sp] - locxL[sp]), 0.f); float xend = std::min(static_cast(centx[sp] + locx[sp]), 1.f); - if (fullim) { + if (fullimstd && (log[sp] && autocomput[sp])) { + ysta = 0.f; + yend = 1.f; + xsta = 0.f; + xend = 1.f; + } + + if (fullimjz && (cie[sp] && autocie[sp])) { ysta = 0.f; yend = 1.f; xsta = 0.f; @@ -853,14 +876,18 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) } ipf.getAutoLogloc(sp, imgsrc, sourceg, blackev, whiteev, Autogr, sourceab, fw, fh, xsta, xend, ysta, yend, SCALE); - //printf("sg=%f sab=%f\n", sourceg[sp], sourceab[sp]); + // printf("sp=%i sg=%f sab=%f\n", sp, sourceg[sp], sourceab[sp]); params->locallab.spots.at(sp).blackEv = blackev[sp]; params->locallab.spots.at(sp).whiteEv = whiteev[sp]; + params->locallab.spots.at(sp).blackEvjz = blackev[sp]; + params->locallab.spots.at(sp).whiteEvjz = whiteev[sp]; params->locallab.spots.at(sp).sourceGray = sourceg[sp]; params->locallab.spots.at(sp).sourceabs = sourceab[sp]; - + params->locallab.spots.at(sp).sourceGraycie = sourceg[sp]; + params->locallab.spots.at(sp).sourceabscie = sourceab[sp]; + float jz1 = defSpot.jz100; if (locallListener) { - locallListener->logencodChanged(blackev[sp], whiteev[sp], sourceg[sp], sourceab[sp], targetg[sp]); + locallListener->logencodChanged(blackev[sp], whiteev[sp], sourceg[sp], sourceab[sp], targetg[sp], autocomput[sp], autocie[sp], jz1); } } } @@ -872,12 +899,14 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) delete [] centx; delete [] centy; + delete [] autocie; delete [] Autogr; delete [] whiteev; delete [] blackev; delete [] targetg; delete [] sourceab; delete [] sourceg; + delete [] cie; delete [] log; delete [] autocomput; } @@ -923,7 +952,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) int sca = 1; double huere, chromare, lumare, huerefblu, chromarefblu, lumarefblu, sobelre; float avge, meantme, stdtme, meanretie, stdretie; - std::vector locallref; + //std::vector locallref; std::vector locallretiminmax; huerefs.resize(params->locallab.spots.size()); huerefblurs.resize(params->locallab.spots.size()); @@ -937,6 +966,16 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) stdtms.resize(params->locallab.spots.size()); meanretis.resize(params->locallab.spots.size()); stdretis.resize(params->locallab.spots.size()); + const int sizespot = (int)params->locallab.spots.size(); + + float *huerefp = nullptr; + huerefp = new float[sizespot]; + float *chromarefp = nullptr; + chromarefp = new float[sizespot]; + float *lumarefp = nullptr; + lumarefp = new float[sizespot]; + float *fabrefp = nullptr; + fabrefp = new float[sizespot]; for (int sp = 0; sp < (int)params->locallab.spots.size(); sp++) { @@ -953,6 +992,9 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) const bool LHutili = loclhCurve.Set(params->locallab.spots.at(sp).LHcurve); const bool HHutili = lochhCurve.Set(params->locallab.spots.at(sp).HHcurve); const bool CHutili = locchCurve.Set(params->locallab.spots.at(sp).CHcurve); + const bool HHutilijz = lochhCurvejz.Set(params->locallab.spots.at(sp).HHcurvejz); + const bool CHutilijz = locchCurvejz.Set(params->locallab.spots.at(sp).CHcurvejz); + const bool LHutilijz = loclhCurvejz.Set(params->locallab.spots.at(sp).LHcurvejz); const bool lcmasutili = locccmasCurve.Set(params->locallab.spots.at(sp).CCmaskcurve); const bool llmasutili = locllmasCurve.Set(params->locallab.spots.at(sp).LLmaskcurve); const bool lhmasutili = lochhmasCurve.Set(params->locallab.spots.at(sp).HHmaskcurve); @@ -984,6 +1026,9 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) const bool llmaslogutili = locllmaslogCurve.Set(params->locallab.spots.at(sp).LLmaskcurveL); const bool lcmaslogutili = locccmaslogCurve.Set(params->locallab.spots.at(sp).CCmaskcurveL); const bool lhmaslogutili = lochhmaslogCurve.Set(params->locallab.spots.at(sp).HHmaskcurveL); + const bool llmascieutili = locllmascieCurve.Set(params->locallab.spots.at(sp).LLmaskciecurve); + const bool lcmascieutili = locccmascieCurve.Set(params->locallab.spots.at(sp).CCmaskciecurve); + const bool lhmascieutili = lochhmascieCurve.Set(params->locallab.spots.at(sp).HHmaskciecurve); const bool lcmas_utili = locccmas_Curve.Set(params->locallab.spots.at(sp).CCmask_curve); const bool llmas_utili = locllmas_Curve.Set(params->locallab.spots.at(sp).LLmask_curve); @@ -992,6 +1037,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) const bool lmasutiliblwav = loclmasCurveblwav.Set(params->locallab.spots.at(sp).LLmaskblcurvewav); const bool lmasutilicolwav = loclmasCurvecolwav.Set(params->locallab.spots.at(sp).LLmaskcolcurvewav); const bool locwavutili = locwavCurve.Set(params->locallab.spots.at(sp).locwavcurve); + const bool locwavutilijz = locwavCurvejz.Set(params->locallab.spots.at(sp).locwavcurvejz); const bool loclevwavutili = loclevwavCurve.Set(params->locallab.spots.at(sp).loclevwavcurve); const bool locconwavutili = locconwavCurve.Set(params->locallab.spots.at(sp).locconwavcurve); const bool loccompwavutili = loccompwavCurve.Set(params->locallab.spots.at(sp).loccompwavcurve); @@ -1017,6 +1063,12 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) const bool localmasklcutili = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).Lmasklccurve, lmasklclocalcurve, sca); const bool localmasklogutili = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).LmaskcurveL, lmaskloglocalcurve, sca); const bool localmask_utili = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).Lmask_curve, lmasklocal_curve, sca); + const bool localmaskcieutili = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).Lmaskciecurve, lmaskcielocalcurve, sca); + const bool localcieutili = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).ciecurve, cielocalcurve, sca); + const bool localcieutili2 = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).ciecurve2, cielocalcurve2, sca); + const bool localjzutili = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).jzcurve, jzlocalcurve, sca); + const bool localczutili = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).czcurve, czlocalcurve, sca); + const bool localczjzutili = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).czjzcurve, czjzlocalcurve, sca); double ecomp = params->locallab.spots.at(sp).expcomp; double black = params->locallab.spots.at(sp).black; double hlcompr = params->locallab.spots.at(sp).hlcompr; @@ -1040,7 +1092,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) stdtme = 0.f; meanretie = 0.f; stdretie = 0.f; - + float fab = 1.f; bool istm = params->locallab.spots.at(sp).equiltm && params->locallab.spots.at(sp).exptonemap; bool isreti = params->locallab.spots.at(sp).equilret && params->locallab.spots.at(sp).expreti; //preparation for mean and sigma on current RT-spot @@ -1093,17 +1145,24 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) float stdtm = stdtms[sp] = stdtme; float meanreti = meanretis[sp] = meanretie; float stdreti = stdretis[sp] = stdretie; + + huerefp[sp] = huer; + chromarefp[sp] = chromar; + lumarefp[sp] = lumar; CurveFactory::complexCurvelocal(ecomp, black / 65535., hlcompr, hlcomprthresh, shcompr, br, cont, lumar, hltonecurveloc, shtonecurveloc, tonecurveloc, lightCurveloc, avg, sca); // Save Locallab mask curve references for current spot + /* LocallabListener::locallabRef spotref; spotref.huer = huer; spotref.lumar = lumar; spotref.chromar = chromar; + spotref.fab = 1.f; locallref.push_back(spotref); + */ // Locallab tools computation /* Notes: * - shbuffer is used as nullptr @@ -1125,6 +1184,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) cllocalcurve, localclutili, lclocalcurve, locallcutili, loclhCurve, lochhCurve, locchCurve, + lochhCurvejz, locchCurvejz, loclhCurvejz, lmasklocalcurve, localmaskutili, lmaskexplocalcurve, localmaskexputili, lmaskSHlocalcurve, localmaskSHutili, @@ -1136,6 +1196,12 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) lmasklclocalcurve, localmasklcutili, lmaskloglocalcurve, localmasklogutili, lmasklocal_curve, localmask_utili, + lmaskcielocalcurve, localmaskcieutili, + cielocalcurve, localcieutili, + cielocalcurve2, localcieutili2, + jzlocalcurve, localjzutili, + czlocalcurve, localczutili, + czjzlocalcurve, localczjzutili, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, lochhhmasCurve, lhhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, @@ -1148,10 +1214,13 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) locccmaslogCurve, lcmaslogutili, locllmaslogCurve, llmaslogutili, lochhmaslogCurve, lhmaslogutili, locccmas_Curve, lcmas_utili, locllmas_Curve, llmas_utili, lochhmas_Curve, lhmas_utili, + locccmascieCurve, lcmascieutili, locllmascieCurve, llmascieutili, lochhmascieCurve, lhmascieutili, + lochhhmas_Curve, lhhmas_utili, loclmasCurveblwav, lmasutiliblwav, loclmasCurvecolwav, lmasutilicolwav, locwavCurve, locwavutili, + locwavCurvejz, locwavutilijz, loclevwavCurve, loclevwavutili, locconwavCurve, locconwavutili, loccompwavCurve, loccompwavutili, @@ -1160,13 +1229,13 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) locwavCurveden, locwavdenutili, locedgwavCurve, locedgwavutili, loclmasCurve_wav, lmasutili_wav, - LHutili, HHutili, CHutili, cclocalcurve, localcutili, rgblocalcurve, localrgbutili, localexutili, exlocalcurve, hltonecurveloc, shtonecurveloc, tonecurveloc, lightCurveloc, - huerblu, chromarblu, lumarblu, huer, chromar, lumar, sobeler, lastsav, false, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + LHutili, HHutili, CHutili, HHutilijz, CHutilijz, LHutilijz, cclocalcurve, localcutili, rgblocalcurve, localrgbutili, localexutili, exlocalcurve, hltonecurveloc, shtonecurveloc, tonecurveloc, lightCurveloc, + huerblu, chromarblu, lumarblu, huer, chromar, lumar, sobeler, lastsav, false, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, minCD, maxCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax, - meantm, stdtm, meanreti, stdreti); + meantm, stdtm, meanreti, stdreti, fab); - + fabrefp[sp] = fab; if (istm) { //calculate mean and sigma on full image for use by normalize_mean_dt float meanf = 0.f; float stdf = 0.f; @@ -1212,17 +1281,44 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) } // Update Locallab reference values according to recurs parameter if (params->locallab.spots.at(sp).recurs) { + /* + spotref.huer = huer; + spotref.lumar = lumar; + spotref.chromar = chromar; + spotref.fab = fab; locallref.at(sp).chromar = chromar; locallref.at(sp).lumar = lumar; locallref.at(sp).huer = huer; + locallref.at(sp).fab = fab; + */ + huerefp[sp] = huer; + chromarefp[sp] = chromar; + lumarefp[sp] = lumar; + fabrefp[sp] = fab; + } + // spotref.fab = fab; + // locallref.at(sp).fab = fab; + + // locallref.push_back(spotref); + if (locallListener) { + // locallListener->refChanged(locallref, params->locallab.selspot); + locallListener->refChanged2(huerefp, chromarefp, lumarefp, fabrefp, params->locallab.selspot); + locallListener->minmaxChanged(locallretiminmax, params->locallab.selspot); } + } + delete [] huerefp; + delete [] chromarefp; + delete [] lumarefp; + delete [] fabrefp; // Transmit Locallab reference values and Locallab Retinex min/max to LocallabListener + /* if (locallListener) { locallListener->refChanged(locallref, params->locallab.selspot); locallListener->minmaxChanged(locallretiminmax, params->locallab.selspot); } + */ ipf.lab2rgb(*nprevl, *oprevi, params->icm.workingProfile); //************************************************************* // end locallab @@ -1802,8 +1898,9 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) adap = 2000.; } else { double E_V = fcomp + log2(double ((fnum * fnum) / fspeed / (fiso / 100.f))); - E_V += params->toneCurve.expcomp;// exposure compensation in tonecurve ==> direct EV - E_V += log2(params->raw.expos); // exposure raw white point ; log2 ==> linear to EV + double kexp = 0.; + E_V += kexp * params->toneCurve.expcomp;// exposure compensation in tonecurve ==> direct EV + E_V += 0.5 * log2(params->raw.expos); // exposure raw white point ; log2 ==> linear to EV adap = pow(2.0, E_V - 3.0); // cd / m2 // end calculation adaptation scene luminosity } diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index 8e4586c6d..85f28004a 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -284,6 +284,12 @@ protected: LUTf lmasklclocalcurve; LUTf lmaskloglocalcurve; LUTf lmasklocal_curve; + LUTf lmaskcielocalcurve; + LUTf cielocalcurve; + LUTf cielocalcurve2; + LUTf jzlocalcurve; + LUTf czlocalcurve; + LUTf czjzlocalcurve; LocretigainCurve locRETgainCurve; LocretitransCurve locRETtransCurve; @@ -291,6 +297,9 @@ protected: LocLHCurve loclhCurve; LocHHCurve lochhCurve; LocCHCurve locchCurve; + LocHHCurve lochhCurvejz; + LocCHCurve locchCurvejz; + LocLHCurve loclhCurvejz; LocCCmaskCurve locccmasCurve; LocLLmaskCurve locllmasCurve; LocHHmaskCurve lochhmasCurve; @@ -326,6 +335,9 @@ protected: LocCCmaskCurve locccmaslogCurve; LocLLmaskCurve locllmaslogCurve; LocHHmaskCurve lochhmaslogCurve; + LocCCmaskCurve locccmascieCurve; + LocLLmaskCurve locllmascieCurve; + LocHHmaskCurve lochhmascieCurve; LocwavCurve locwavCurve; LocwavCurve loclmasCurveblwav; @@ -338,6 +350,7 @@ protected: LocwavCurve locedgwavCurve; LocwavCurve loclmasCurve_wav; LocwavCurve locwavCurvehue; + LocwavCurve locwavCurvejz; std::vector huerefs; std::vector huerefblurs; @@ -369,6 +382,7 @@ protected: int locallsharMask; int localllogMask; int locall_Mask; + int locallcieMask; public: @@ -440,7 +454,7 @@ public: updaterThreadStart.unlock(); } - void setLocallabMaskVisibility(bool previewDeltaE, int locallColorMask, int locallColorMaskinv, int locallExpMask, int locallExpMaskinv, int locallSHMask, int locallSHMaskinv, int locallvibMask, int locallsoftMask, int locallblMask, int localltmMask, int locallretiMask, int locallsharMask, int localllcMask, int locallcbMask, int localllogMask, int locall_Mask) override + void setLocallabMaskVisibility(bool previewDeltaE, int locallColorMask, int locallColorMaskinv, int locallExpMask, int locallExpMaskinv, int locallSHMask, int locallSHMaskinv, int locallvibMask, int locallsoftMask, int locallblMask, int localltmMask, int locallretiMask, int locallsharMask, int localllcMask, int locallcbMask, int localllogMask, int locall_Mask, int locallcieMask) override { this->previewDeltaE = previewDeltaE; this->locallColorMask = locallColorMask; @@ -459,6 +473,7 @@ public: this->locallcbMask = locallcbMask; this->localllogMask = localllogMask; this->locall_Mask = locall_Mask; + this->locallcieMask = locallcieMask; } void setProgressListener (ProgressListener* pl) override diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index b92c5d0d3..15ebcc2e6 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -960,14 +960,14 @@ void ImProcFunctions::ciecam_02float(CieImage* ncie, float adap, int pW, int pwb c16 = 1; }else if (params->colorappearance.modelmethod == "16") { c16 = 16; - } - - Ciecam02::initcam1float (yb, pilot, f, la, xw, yw, zw, n, d, nbb, ncb, cz, aw, wh, pfl, fl, c, c16); + } //I don't use PQ here...hence no 21 + float plum = 100.f; + Ciecam02::initcam1float (yb, pilot, f, la, xw, yw, zw, n, d, nbb, ncb, cz, aw, wh, pfl, fl, c, c16, plum); //printf ("wh=%f \n", wh); const float pow1 = pow_F(1.64f - pow_F(0.29f, n), 0.73f); float nj, nbbj, ncbj, czj, awj, flj; - Ciecam02::initcam2float (yb2, pilotout, f2, la2, xw2, yw2, zw2, nj, dj, nbbj, ncbj, czj, awj, flj, c16); + Ciecam02::initcam2float (yb2, pilotout, f2, la2, xw2, yw2, zw2, nj, dj, nbbj, ncbj, czj, awj, flj, c16, plum); #ifdef __SSE2__ const float reccmcz = 1.f / (c2 * czj); #endif @@ -1054,11 +1054,13 @@ void ImProcFunctions::ciecam_02float(CieImage* ncie, float adap, int pW, int pwb x = x / c655d35; y = y / c655d35; z = z / c655d35; + float plum = 100.f; + vfloat plumv = F2V(plum); Ciecam02::xyz2jchqms_ciecam02float(J, C, h, Q, M, s, F2V(aw), F2V(fl), F2V(wh), x, y, z, F2V(xw1), F2V(yw1), F2V(zw1), - F2V(c), F2V(nc), F2V(pow1), F2V(nbb), F2V(ncb), F2V(pfl), F2V(cz), F2V(d), c16); + F2V(c), F2V(nc), F2V(pow1), F2V(nbb), F2V(ncb), F2V(pfl), F2V(cz), F2V(d), c16, plumv); STVF(Jbuffer[k], J); STVF(Cbuffer[k], C); STVF(hbuffer[k], h); @@ -1082,7 +1084,7 @@ void ImProcFunctions::ciecam_02float(CieImage* ncie, float adap, int pW, int pwb Q, M, s, aw, fl, wh, x, y, z, xw1, yw1, zw1, - c, nc, pow1, nbb, ncb, pfl, cz, d, c16); + c, nc, pow1, nbb, ncb, pfl, cz, d, c16, plum); Jbuffer[k] = J; Cbuffer[k] = C; hbuffer[k] = h; @@ -1120,7 +1122,7 @@ void ImProcFunctions::ciecam_02float(CieImage* ncie, float adap, int pW, int pwb Q, M, s, aw, fl, wh, x, y, z, xw1, yw1, zw1, - c, nc, pow1, nbb, ncb, pfl, cz, d, c16); + c, nc, pow1, nbb, ncb, pfl, cz, d, c16, plum); #endif float Jpro, Cpro, hpro, Qpro, Mpro, spro; Jpro = J; @@ -1458,7 +1460,7 @@ void ImProcFunctions::ciecam_02float(CieImage* ncie, float adap, int pW, int pwb Ciecam02::jch2xyz_ciecam02float(xx, yy, zz, J, C, h, xw2, yw2, zw2, - c2, nc2, pow1n, nbbj, ncbj, flj, czj, dj, awj, c16); + c2, nc2, pow1n, nbbj, ncbj, flj, czj, dj, awj, c16, plum); float x, y, z; x = xx * 655.35f; y = yy * 655.35f; @@ -1510,7 +1512,7 @@ void ImProcFunctions::ciecam_02float(CieImage* ncie, float adap, int pW, int pwb Ciecam02::jch2xyz_ciecam02float(x, y, z, LVF(Jbuffer[k]), LVF(Cbuffer[k]), LVF(hbuffer[k]), F2V(xw2), F2V(yw2), F2V(zw2), - F2V(nc2), F2V(pow1n), F2V(nbbj), F2V(ncbj), F2V(flj), F2V(dj), F2V(awj), F2V(reccmcz), c16); + F2V(nc2), F2V(pow1n), F2V(nbbj), F2V(ncbj), F2V(flj), F2V(dj), F2V(awj), F2V(reccmcz), c16, F2V(plum)); STVF(xbuffer[k], x * c655d35); STVF(ybuffer[k], y * c655d35); STVF(zbuffer[k], z * c655d35); @@ -1767,7 +1769,7 @@ void ImProcFunctions::ciecam_02float(CieImage* ncie, float adap, int pW, int pwb Ciecam02::jch2xyz_ciecam02float(xx, yy, zz, ncie->J_p[i][j], ncie_C_p, ncie->h_p[i][j], xw2, yw2, zw2, - c2, nc2, pow1n, nbbj, ncbj, flj, czj, dj, awj, c16); + c2, nc2, pow1n, nbbj, ncbj, flj, czj, dj, awj, c16, plum); float x = (float)xx * 655.35f; float y = (float)yy * 655.35f; float z = (float)zz * 655.35f; @@ -1815,7 +1817,7 @@ void ImProcFunctions::ciecam_02float(CieImage* ncie, float adap, int pW, int pwb Ciecam02::jch2xyz_ciecam02float(x, y, z, LVF(Jbuffer[k]), LVF(Cbuffer[k]), LVF(hbuffer[k]), F2V(xw2), F2V(yw2), F2V(zw2), - F2V(nc2), F2V(pow1n), F2V(nbbj), F2V(ncbj), F2V(flj), F2V(dj), F2V(awj), F2V(reccmcz), c16); + F2V(nc2), F2V(pow1n), F2V(nbbj), F2V(ncbj), F2V(flj), F2V(dj), F2V(awj), F2V(reccmcz), c16, F2V(plum)); x *= c655d35; y *= c655d35; z *= c655d35; diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 2fec871da..1be1d0371 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -191,12 +191,14 @@ enum class BlurType { void moyeqt(Imagefloat* working, float &moyS, float &eqty); void luminanceCurve(LabImage* lold, LabImage* lnew, const LUTf &curve); - void ciecamloc_02float(int sp, LabImage* lab, int call); + void ciecamloc_02float(const struct local_params& lp, int sp, LabImage* lab, int bfw, int bfh, int call, int sk, const LUTf& cielocalcurve, bool localcieutili, const LUTf& cielocalcurve2, bool localcieutili2, const LUTf& jzlocalcurve, bool localjzutili, const LUTf& czlocalcurve, bool localczutili, const LUTf& czjzlocalcurve, bool localczjzutili, const LocCHCurve& locchCurvejz, const LocHHCurve& lochhCurve, const LocLHCurve& loclhCurve, bool HHcurvejz, bool CHcurvejz, bool LHcurvejz, const LocwavCurve& locwavCurvejz, bool locwavutilijz); void ciecam_02float(CieImage* ncie, float adap, int pW, int pwb, LabImage* lab, const procparams::ProcParams* params, const ColorAppearance & customColCurve1, const ColorAppearance & customColCurve, const ColorAppearance & customColCurve3, LUTu &histLCAM, LUTu &histCCAM, LUTf & CAMBrightCurveJ, LUTf & CAMBrightCurveQ, float &mean, int Iterates, int scale, bool execsharp, float &d, float &dj, float &yb, int rtt, bool showSharpMask = false); + void clarimerge(const struct local_params& lp, float &mL, float &mC, bool &exec, LabImage *tmpresid, int wavelet_level, int sk, int numThreads); + void chromiLuminanceCurve(PipetteBuffer *pipetteBuffer, int pW, LabImage* lold, LabImage* lnew, const LUTf& acurve, const LUTf& bcurve, const LUTf& satcurve, const LUTf& satclcurve, const LUTf& clcurve, LUTf &curve, bool utili, bool autili, bool butili, bool ccutili, bool cclutili, bool clcutili, LUTu &histCCurve, LUTu &histLurve); void vibrance(LabImage* lab, const procparams::VibranceParams &vibranceParams, bool highlight, const Glib::ustring &workingProfile); //Jacques' vibrance void softprocess(const LabImage* bufcolorig, array2D &buflight, /* float ** bufchro, float ** buf_a, float ** buf_b, */ float rad, int bfh, int bfw, double epsilmax, double epsilmin, float thres, int sk, bool multiThread); @@ -253,7 +255,7 @@ enum class BlurType { const LUTf& lmasklocalcurve, bool localmaskutili, const LocwavCurve & loclmasCurvecolwav, bool lmasutilicolwav, int level_bl, int level_hl, int level_br, int level_hr, int shortcu, bool delt, const float hueref, const float chromaref, const float lumaref, - float maxdE, float mindE, float maxdElim, float mindElim, float iterat, float limscope, int scope, bool fftt, float blu_ma, float cont_ma, int indic); + float maxdE, float mindE, float maxdElim, float mindElim, float iterat, float limscope, int scope, bool fftt, float blu_ma, float cont_ma, int indic, float &fab); void avoidcolshi(const struct local_params& lp, int sp, LabImage * original, LabImage *transformed, int cy, int cx, int sk); @@ -263,6 +265,7 @@ enum class BlurType { void laplacian(const array2D &src, array2D &dst, int bfw, int bfh, float threshold, float ceiling, float factor, bool multiThread); void detail_mask(const array2D &src, array2D &mask, int bfw, int bfh, float scaling, float threshold, float ceiling, float factor, BlurType blur_type, float blur, bool multithread); void NLMeans(float **img, int strength, int detail_thresh, int patch, int radius, float gam, int bfw, int bfh, float scale, bool multithread); + void loccont(int bfw, int bfh, LabImage* tmp1, float rad, float stren, int sk); void rex_poisson_dct(float * data, size_t nx, size_t ny, double m); void mean_dt(const float * data, size_t size, double& mean_p, double& dt_p); @@ -307,6 +310,7 @@ enum class BlurType { const LUTf& cllocalcurve, bool localclutili, const LUTf& lclocalcurve, bool locallcutili, const LocLHCurve& loclhCurve, const LocHHCurve& lochhCurve, const LocCHCurve& locchCurve, + const LocHHCurve& lochhCurvejz, const LocCHCurve& locchCurvejz, const LocLHCurve& loclhCurvejz, const LUTf& lmasklocalcurve, bool localmaskutili, const LUTf& lmaskexplocalcurve, bool localmaskexputili, const LUTf& lmaskSHlocalcurve, bool localmaskSHutili, @@ -318,6 +322,12 @@ enum class BlurType { const LUTf& lmasklclocalcurve, bool localmasklcutili, const LUTf& lmaskloglocalcurve, bool localmasklogutili, const LUTf& lmasklocal_curve, bool localmask_utili, + const LUTf& lmaskcielocalcurve, bool localmaskcieutili, + const LUTf& cielocalcurve, bool localcieutili, + const LUTf& cielocalcurve2, bool localcieutili2, + const LUTf& jzlocalcurve, bool localjzutili, + const LUTf& czlocalcurve, bool localczutili, + const LUTf& czjzlocalcurve, bool localczjzutili, const LocCCmaskCurve& locccmasCurve, bool lcmasutili, const LocLLmaskCurve& locllmasCurve, bool llmasutili, const LocHHmaskCurve& lochhmasCurve, bool lhmasutili, const LocHHmaskCurve& llochhhmasCurve, bool lhhmasutili, const LocCCmaskCurve& locccmasexpCurve, bool lcmasexputili, const LocLLmaskCurve& locllmasexpCurve, bool llmasexputili, const LocHHmaskCurve& lochhmasexpCurve, bool lhmasexputili, @@ -330,11 +340,14 @@ enum class BlurType { const LocCCmaskCurve& locccmaslcCurve, bool lcmaslcutili, const LocLLmaskCurve& locllmaslcCurve, bool llmaslcutili, const LocHHmaskCurve& lochhmaslcCurve, bool lhmaslcutili, const LocCCmaskCurve& locccmaslogCurve, bool lcmaslogutili, const LocLLmaskCurve& locllmaslogCurve, bool llmaslogutili, const LocHHmaskCurve& lochhmaslogCurve, bool lhmaslogutili, const LocCCmaskCurve& locccmas_Curve, bool lcmas_utili, const LocLLmaskCurve& locllmas_Curve, bool llmas_utili, const LocHHmaskCurve& lochhmas_Curve, bool lhmas_utili, + const LocCCmaskCurve& locccmascieCurve, bool lcmascieutili, const LocLLmaskCurve& locllmascieCurve, bool llmascieutili, const LocHHmaskCurve& lochhmascieCurve, bool lhmascieutili, + const LocHHmaskCurve& lochhhmas_Curve, bool lhhmas_utili, const LocwavCurve& loclmasCurveblwav, bool lmasutiliblwav, const LocwavCurve& loclmasCurvecolwav, bool lmasutilicolwav, const LocwavCurve& locwavCurve, bool locwavutili, + const LocwavCurve& locwavCurvejz, bool locwavutilijz, const LocwavCurve& loclevwavCurve, bool loclevwavutili, const LocwavCurve& locconwavCurve, bool locconwavutili, const LocwavCurve& loccompwavCurve, bool loccompwavutili, @@ -343,11 +356,11 @@ enum class BlurType { const LocwavCurve& locwavCurveden, bool locwavdenutili, const LocwavCurve& locedgwavCurve, bool locedgwavutili, const LocwavCurve& loclmasCurve_wav, bool lmasutili_wav, - bool LHutili, bool HHutili, bool CHutili, const LUTf& cclocalcurve, bool localcutili, const LUTf& rgblocalcurve, bool localrgbutili, bool localexutili, const LUTf& exlocalcurve, const LUTf& hltonecurveloc, const LUTf& shtonecurveloc, const LUTf& tonecurveloc, const LUTf& lightCurveloc, + bool LHutili, bool HHutili, bool CHutili, bool HHutilijz, bool CHutilijz, bool LHutilijz, const LUTf& cclocalcurve, bool localcutili, const LUTf& rgblocalcurve, bool localrgbutili, bool localexutili, const LUTf& exlocalcurve, const LUTf& hltonecurveloc, const LUTf& shtonecurveloc, const LUTf& tonecurveloc, const LUTf& lightCurveloc, double& huerefblur, double &chromarefblur, double& lumarefblur, double &hueref, double &chromaref, double &lumaref, double &sobelref, int &lastsav, - bool prevDeltaE, int llColorMask, int llColorMaskinv, int llExpMask, int llExpMaskinv, int llSHMask, int llSHMaskinv, int llvibMask, int lllcMask, int llsharMask, int llcbMask, int llretiMask, int llsoftMask, int lltmMask, int llblMask, int lllogMask, int ll_Mask, + bool prevDeltaE, int llColorMask, int llColorMaskinv, int llExpMask, int llExpMaskinv, int llSHMask, int llSHMaskinv, int llvibMask, int lllcMask, int llsharMask, int llcbMask, int llretiMask, int llsoftMask, int lltmMask, int llblMask, int lllogMask, int ll_Mask, int llcieMask, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax, - float& meantm, float& stdtm, float& meanreti, float& stdreti); + float& meantm, float& stdtm, float& meanreti, float& stdreti, float &fab); void addGaNoise(LabImage *lab, LabImage *dst, const float mean, const float variance, const int sk); void BlurNoise_Localold(int call, const struct local_params& lp, LabImage* original, LabImage* transformed, const LabImage* const tmp1, int cx, int cy); @@ -371,6 +384,8 @@ enum class BlurType { const LocwavCurve & loccomprewavCurve, bool loccomprewavutili, float radlevblur, int process, float chromablu, float thres, float sigmadc, float deltad); + void wavlc(wavelet_decomposition& wdspot, int level_bl, int level_hl, int maxlvl, int level_hr, int level_br, float ahigh, float bhigh, float alow, float blow, float sigmalc, float strength, const LocwavCurve & locwavCurve, int numThreads); + void wavcbd(wavelet_decomposition &wdspot, int level_bl, int maxlvl, const LocwavCurve& locconwavCurve, bool locconwavutili, float sigm, float offs, float chromalev, int sk); diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index 11fa79f9f..429d6dbf7 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -37,6 +37,7 @@ #include "settings.h" #include "../rtgui/options.h" #include "utils.h" +#include "iccmatrices.h" #ifdef _OPENMP #include #endif @@ -52,6 +53,8 @@ #include "boxblur.h" #include "rescale.h" + + #pragma GCC diagnostic warning "-Wall" #pragma GCC diagnostic warning "-Wextra" #pragma GCC diagnostic warning "-Wdouble-promotion" @@ -69,6 +72,7 @@ constexpr float MINSCOPE = 0.025f; constexpr int TS = 64; // Tile size constexpr float epsilonw = 0.001f / (TS * TS); //tolerance constexpr int offset = 25; // shift between tiles +constexpr double czlim = rtengine::RT_SQRT1_2;// 0.70710678118654752440; constexpr float clipLoc(float x) { @@ -90,6 +94,22 @@ constexpr float clipChro(float x) return rtengine::LIM(x, 0.f, 140.f); } +constexpr double clipazbz(double x) +{ + return rtengine::LIM(x, -0.5, 0.5); +} + +constexpr double clipcz(double x) +{ + return rtengine::LIM(x, 0., czlim); +} + + +constexpr double clipjz05(double x) +{ + return rtengine::LIM(x, 0.0006, 1.0); +} + float softlig(float a, float b, float minc, float maxc) { // as Photoshop @@ -392,6 +412,7 @@ void SobelCannyLuma(float **sobelL, float **luma, int bfw, int bfh, float radius } } + float igammalog(float x, float p, float s, float g2, float g4) { return x <= g2 ? x / s : pow_F((x + g4) / (1.f + g4), p);//continuous @@ -407,7 +428,7 @@ vfloat igammalog(vfloat x, vfloat p, vfloat s, vfloat g2, vfloat g4) float gammalog(float x, float p, float s, float g3, float g4) { - return x <= g3 ? x * s : (1.f + g4) * xexpf(xlogf(x) / p) - g4;//continuous + return x <= g3 ? x * s : (1.f + g4) * xexpf(xlogf(x) / p) - g4;//used by Nlmeans } #ifdef __SSE2__ @@ -415,6 +436,7 @@ vfloat gammalog(vfloat x, vfloat p, vfloat s, vfloat g3, vfloat g4) { // return x <= g3 ? x * s : (1.f + g4) * xexpf(xlogf(x) / p) - g4;//continuous return vself(vmaskf_le(x, g3), x * s, (F2V(1.f) + g4) * xexpf(xlogf(x) / p) - g4);//improve by Ingo - used by Nlmeans + } #endif } @@ -534,6 +556,9 @@ struct local_params { float contcolmask; float blurSH; float ligh; + float gamc; + float gamlc; + float gamex; float lowA, lowB, highA, highB; float lowBmerg, highBmerg, lowAmerg, highAmerg; int shamo, shdamp, shiter, senssha, sensv; @@ -587,6 +612,7 @@ struct local_params { int showmaskblmet; int showmasklogmet; int showmask_met; + int showmaskciemet; bool fftbl; float laplacexp; float balanexp; @@ -653,6 +679,11 @@ struct local_params { float lowthrl; float higthrl; float decayl; + float recothrcie; + float lowthrcie; + float higthrcie; + float decaycie; + int noiselequal; float noisechrodetail; float bilat; @@ -661,6 +692,7 @@ struct local_params { int nlpat; int nlrad; float nlgam; + float noisegam; float noiselc; float noiselc4; float noiselc5; @@ -695,6 +727,7 @@ struct local_params { bool logena; bool islocal; bool maskena; + bool cieena; bool cut_past; float past; float satur; @@ -731,6 +764,7 @@ struct local_params { bool enablMask; bool enaLMask; bool ena_Mask; + bool enacieMask; int highlihs; int shadowhs; int radiushs; @@ -743,6 +777,7 @@ struct local_params { float whiteev; float detail; int sensilog; + int sensicie; int sensimas; bool Autogray; bool autocompute; @@ -760,6 +795,8 @@ struct local_params { float residshathr; float residhi; float residhithr; + float residgam; + float residslop; bool blwh; bool fftma; float blurma; @@ -769,10 +806,17 @@ struct local_params { float thrhigh; bool usemask; float lnoiselow; + float radmacie; + float blendmacie; + float chromacie; + float denoichmask; + float mLjz; + float mCjz; + float softrjz; }; -static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locallab, struct local_params& lp, bool prevDeltaE, int llColorMask, int llColorMaskinv, int llExpMask, int llExpMaskinv, int llSHMask, int llSHMaskinv, int llvibMask, int lllcMask, int llsharMask, int llcbMask, int llretiMask, int llsoftMask, int lltmMask, int llblMask, int lllogMask, int ll_Mask, const LocwavCurve & locwavCurveden, bool locwavdenutili) +static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locallab, struct local_params& lp, bool prevDeltaE, int llColorMask, int llColorMaskinv, int llExpMask, int llExpMaskinv, int llSHMask, int llSHMaskinv, int llvibMask, int lllcMask, int llsharMask, int llcbMask, int llretiMask, int llsoftMask, int lltmMask, int llblMask, int lllogMask, int ll_Mask, int llcieMask, const LocwavCurve & locwavCurveden, bool locwavdenutili) { int w = oW; int h = oH; @@ -871,22 +915,24 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall lp.showmaskblmet = llblMask; lp.showmasklogmet = lllogMask; lp.showmask_met = ll_Mask; - - lp.enaColorMask = locallab.spots.at(sp).enaColorMask && llsoftMask == 0 && llColorMask == 0 && lllcMask == 0 && llsharMask == 0 && llExpMask == 0 && llSHMask == 0 && llcbMask == 0 && llretiMask == 0 && lltmMask == 0 && llblMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0;// Exposure mask is deactivated if Color & Light mask is visible - lp.enaColorMaskinv = locallab.spots.at(sp).enaColorMask && llColorMaskinv == 0 && llsoftMask == 0 && lllcMask == 0 && llsharMask == 0 && llExpMask == 0 && llSHMask == 0 && llcbMask == 0 && llretiMask == 0 && lltmMask == 0 && llblMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0;// Exposure mask is deactivated if Color & Light mask is visible - lp.enaExpMask = locallab.spots.at(sp).enaExpMask && llExpMask == 0 && llColorMask == 0 && llsoftMask == 0 && lllcMask == 0 && llsharMask == 0 && llSHMask == 0 && llcbMask == 0 && llretiMask == 0 && lltmMask == 0 && llblMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0;// Exposure mask is deactivated if Color & Light mask is visible - lp.enaExpMaskinv = locallab.spots.at(sp).enaExpMask && llExpMaskinv == 0 && llColorMask == 0 && llsoftMask == 0 && lllcMask == 0 && llsharMask == 0 && llSHMask == 0 && llcbMask == 0 && llretiMask == 0 && lltmMask == 0 && llblMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0;// Exposure mask is deactivated if Color & Light mask is visible - lp.enaSHMask = locallab.spots.at(sp).enaSHMask && llSHMask == 0 && llColorMask == 0 && llsoftMask == 0 && lllcMask == 0 && llsharMask == 0 && llExpMask == 0 && llcbMask == 0 && llretiMask == 0 && lltmMask == 0 && llblMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0; - lp.enaSHMaskinv = locallab.spots.at(sp).enaSHMask && llSHMaskinv == 0 && lllcMask == 0 && llsoftMask == 0 && llsharMask == 0 && llColorMask == 0 && llExpMask == 0 && llcbMask == 0 && llretiMask == 0 && lltmMask == 0 && llblMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0; - lp.enacbMask = locallab.spots.at(sp).enacbMask && llcbMask == 0 && lllcMask == 0 && llsoftMask == 0 && llsharMask == 0 && llColorMask == 0 && llExpMask == 0 && llSHMask == 0 && llretiMask == 0 && lltmMask == 0 && llblMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0; - lp.enaretiMask = locallab.spots.at(sp).enaretiMask && lllcMask == 0 && llsharMask == 0 && llsoftMask == 0 && llretiMask == 0 && llColorMask == 0 && llExpMask == 0 && llSHMask == 0 && llcbMask == 0 && lltmMask == 0 && llblMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0; - lp.enatmMask = locallab.spots.at(sp).enatmMask && lltmMask == 0 && lllcMask == 0 && llsoftMask == 0 && llsharMask == 0 && llColorMask == 0 && llExpMask == 0 && llSHMask == 0 && llcbMask == 0 && llretiMask == 0 && llblMask == 0 && llvibMask == 0&& lllogMask == 0 && ll_Mask == 0; - lp.enablMask = locallab.spots.at(sp).enablMask && llblMask == 0 && lllcMask == 0 && llsoftMask == 0 && llsharMask == 0 && llColorMask == 0 && llExpMask == 0 && llSHMask == 0 && llcbMask == 0 && llretiMask == 0 && lltmMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0; - lp.enavibMask = locallab.spots.at(sp).enavibMask && llvibMask == 0 && lllcMask == 0 && llsoftMask == 0 && llsharMask == 0 && llColorMask == 0 && llExpMask == 0 && llcbMask == 0 && llretiMask == 0 && lltmMask == 0 && llblMask == 0 && llSHMask == 0 && lllogMask == 0 && ll_Mask == 0; - lp.enalcMask = locallab.spots.at(sp).enalcMask && lllcMask == 0 && llcbMask == 0 && llsoftMask == 0 && llsharMask == 0 && llColorMask == 0 && llExpMask == 0 && llSHMask == 0 && llretiMask == 0 && lltmMask == 0 && llblMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0 ; - lp.enasharMask = lllcMask == 0 && llcbMask == 0 && llsharMask == 0 && llsoftMask == 0 && llColorMask == 0 && llExpMask == 0 && llSHMask == 0 && llretiMask == 0 && lltmMask == 0 && llblMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0; - lp.ena_Mask = locallab.spots.at(sp).enamask && lllcMask == 0 && llcbMask == 0 && llsoftMask == 0 && llsharMask == 0 && llColorMask == 0 && llExpMask == 0 && llSHMask == 0 && llretiMask == 0 && lltmMask == 0 && llblMask == 0 && lllogMask == 0 && llvibMask == 0; - lp.enaLMask = locallab.spots.at(sp).enaLMask && lllogMask == 0 && llColorMask == 0 && lllcMask == 0 && llsharMask == 0 && llExpMask == 0 && llSHMask == 0 && llcbMask == 0 && llretiMask == 0 && lltmMask == 0 && llblMask == 0 && llvibMask == 0 && ll_Mask == 0;// Exposure mask is deactivated if Color & Light mask is visible + lp.showmaskciemet = llcieMask; +//printf("CIEmask=%i\n", lp.showmaskciemet); + lp.enaColorMask = locallab.spots.at(sp).enaColorMask && llsoftMask == 0 && llColorMask == 0 && lllcMask == 0 && llsharMask == 0 && llExpMask == 0 && llSHMask == 0 && llcbMask == 0 && llretiMask == 0 && lltmMask == 0 && llblMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0 && llcieMask == 0;// Exposure mask is deactivated if Color & Light mask is visible + lp.enaColorMaskinv = locallab.spots.at(sp).enaColorMask && llColorMaskinv == 0 && llsoftMask == 0 && lllcMask == 0 && llsharMask == 0 && llExpMask == 0 && llSHMask == 0 && llcbMask == 0 && llretiMask == 0 && lltmMask == 0 && llblMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0 && llcieMask == 0;// Exposure mask is deactivated if Color & Light mask is visible + lp.enaExpMask = locallab.spots.at(sp).enaExpMask && llExpMask == 0 && llColorMask == 0 && llsoftMask == 0 && lllcMask == 0 && llsharMask == 0 && llSHMask == 0 && llcbMask == 0 && llretiMask == 0 && lltmMask == 0 && llblMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0 && llcieMask == 0;// Exposure mask is deactivated if Color & Light mask is visible + lp.enaExpMaskinv = locallab.spots.at(sp).enaExpMask && llExpMaskinv == 0 && llColorMask == 0 && llsoftMask == 0 && lllcMask == 0 && llsharMask == 0 && llSHMask == 0 && llcbMask == 0 && llretiMask == 0 && lltmMask == 0 && llblMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0 && llcieMask == 0;// Exposure mask is deactivated if Color & Light mask is visible + lp.enaSHMask = locallab.spots.at(sp).enaSHMask && llSHMask == 0 && llColorMask == 0 && llsoftMask == 0 && lllcMask == 0 && llsharMask == 0 && llExpMask == 0 && llcbMask == 0 && llretiMask == 0 && lltmMask == 0 && llblMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0 && llcieMask == 0; + lp.enaSHMaskinv = locallab.spots.at(sp).enaSHMask && llSHMaskinv == 0 && lllcMask == 0 && llsoftMask == 0 && llsharMask == 0 && llColorMask == 0 && llExpMask == 0 && llcbMask == 0 && llretiMask == 0 && lltmMask == 0 && llblMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0 && llcieMask == 0; + lp.enacbMask = locallab.spots.at(sp).enacbMask && llcbMask == 0 && lllcMask == 0 && llsoftMask == 0 && llsharMask == 0 && llColorMask == 0 && llExpMask == 0 && llSHMask == 0 && llretiMask == 0 && lltmMask == 0 && llblMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0 && llcieMask == 0; + lp.enaretiMask = locallab.spots.at(sp).enaretiMask && lllcMask == 0 && llsharMask == 0 && llsoftMask == 0 && llretiMask == 0 && llColorMask == 0 && llExpMask == 0 && llSHMask == 0 && llcbMask == 0 && lltmMask == 0 && llblMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0 && llcieMask == 0; + lp.enatmMask = locallab.spots.at(sp).enatmMask && lltmMask == 0 && lllcMask == 0 && llsoftMask == 0 && llsharMask == 0 && llColorMask == 0 && llExpMask == 0 && llSHMask == 0 && llcbMask == 0 && llretiMask == 0 && llblMask == 0 && llvibMask == 0&& lllogMask == 0 && ll_Mask == 0 && llcieMask == 0; + lp.enablMask = locallab.spots.at(sp).enablMask && llblMask == 0 && lllcMask == 0 && llsoftMask == 0 && llsharMask == 0 && llColorMask == 0 && llExpMask == 0 && llSHMask == 0 && llcbMask == 0 && llretiMask == 0 && lltmMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0 && llcieMask == 0; + lp.enavibMask = locallab.spots.at(sp).enavibMask && llvibMask == 0 && lllcMask == 0 && llsoftMask == 0 && llsharMask == 0 && llColorMask == 0 && llExpMask == 0 && llcbMask == 0 && llretiMask == 0 && lltmMask == 0 && llblMask == 0 && llSHMask == 0 && lllogMask == 0 && ll_Mask == 0 && llcieMask == 0; + lp.enalcMask = locallab.spots.at(sp).enalcMask && lllcMask == 0 && llcbMask == 0 && llsoftMask == 0 && llsharMask == 0 && llColorMask == 0 && llExpMask == 0 && llSHMask == 0 && llretiMask == 0 && lltmMask == 0 && llblMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0 && llcieMask == 0; + lp.enasharMask = lllcMask == 0 && llcbMask == 0 && llsharMask == 0 && llsoftMask == 0 && llColorMask == 0 && llExpMask == 0 && llSHMask == 0 && llretiMask == 0 && lltmMask == 0 && llblMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0 && llcieMask == 0; + lp.ena_Mask = locallab.spots.at(sp).enamask && lllcMask == 0 && llcbMask == 0 && llsoftMask == 0 && llsharMask == 0 && llColorMask == 0 && llExpMask == 0 && llSHMask == 0 && llretiMask == 0 && lltmMask == 0 && llblMask == 0 && lllogMask == 0 && llvibMask == 0 && llcieMask == 0; + lp.enaLMask = locallab.spots.at(sp).enaLMask && lllogMask == 0 && llColorMask == 0 && lllcMask == 0 && llsharMask == 0 && llExpMask == 0 && llSHMask == 0 && llcbMask == 0 && llretiMask == 0 && lltmMask == 0 && llblMask == 0 && llvibMask == 0 && ll_Mask == 0 && llcieMask == 0;// Exposure mask is deactivated if Color & Light mask is visible + lp.enacieMask = locallab.spots.at(sp).enacieMask && llcieMask == 0 && llColorMask == 0 && llsoftMask == 0 && lllcMask == 0 && llsharMask == 0 && llExpMask == 0 && llcbMask == 0 && llretiMask == 0 && lltmMask == 0 && llblMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0; lp.thrlow = locallab.spots.at(sp).levelthrlow; @@ -1180,6 +1226,11 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall float local_higthrs = (float)locallab.spots.at(sp).higthress; float local_decays = (float)locallab.spots.at(sp).decays; + float local_recothrcie = (float)locallab.spots.at(sp).recothrescie; + float local_lowthrcie = (float)locallab.spots.at(sp).lowthrescie; + float local_higthrcie = (float)locallab.spots.at(sp).higthrescie; + float local_decaycie = (float)locallab.spots.at(sp).decaycie; + float local_recothrl = (float)locallab.spots.at(sp).recothresl; float local_lowthrl = (float)locallab.spots.at(sp).lowthresl; float local_higthrl = (float)locallab.spots.at(sp).higthresl; @@ -1228,6 +1279,9 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall float labgridBHighlocmerg = locallab.spots.at(sp).labgridBHighmerg; float labgridALowlocmerg = locallab.spots.at(sp).labgridALowmerg; float labgridAHighlocmerg = locallab.spots.at(sp).labgridAHighmerg; + float local_gamlc = (float) locallab.spots.at(sp).gamlc; + float local_gamc = (float) locallab.spots.at(sp).gamc; + float local_gamex = (float) locallab.spots.at(sp).gamex; float blendmasklc = ((float) locallab.spots.at(sp).blendmasklc) / 100.f ; float radmasklc = ((float) locallab.spots.at(sp).radmasklc); @@ -1361,7 +1415,10 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall lp.autocompute = locallab.spots.at(sp).autocompute; lp.baselog = (float) locallab.spots.at(sp).baselog; lp.sensimas = locallab.spots.at(sp).sensimask; - + lp.sensicie = locallab.spots.at(sp).sensicie; + float blendmaskcie = ((float) locallab.spots.at(sp).blendmaskcie) / 100.f ; + float radmaskcie = ((float) locallab.spots.at(sp).radmaskcie); + float chromaskcie = ((float) locallab.spots.at(sp).chromaskcie); lp.deltaem = locallab.spots.at(sp).deltae; lp.scalereti = scaleret; lp.cir = circr; @@ -1485,6 +1542,9 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall lp.highBmerg = labgridBHighlocmerg; lp.lowAmerg = labgridALowlocmerg; lp.highAmerg = labgridAHighlocmerg; + lp.gamlc = local_gamlc; + lp.gamc = local_gamc; + lp.gamex = local_gamex; lp.senssf = local_sensisf; lp.strng = strlight; @@ -1553,6 +1613,12 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall lp.lowthrs = local_lowthrs; lp.higthrs = local_higthrs; lp.decays = local_decays; + + lp.recothrcie = local_recothrcie; + lp.lowthrcie = local_lowthrcie; + lp.higthrcie = local_higthrcie; + lp.decaycie = local_decaycie; + lp.recothrv = local_recothrv; lp.lowthrv = local_lowthrv; lp.higthrv = local_higthrv; @@ -1596,6 +1662,7 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall lp.nlpat = locallab.spots.at(sp).nlpat; lp.nlrad = locallab.spots.at(sp).nlrad; lp.nlgam = locallab.spots.at(sp).nlgam; + lp.noisegam = locallab.spots.at(sp).noisegam; lp.adjch = (float) locallab.spots.at(sp).adjblur; lp.strengt = streng; lp.gamm = gam; @@ -1608,6 +1675,11 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall lp.fftma = locallab.spots.at(sp).fftmask; lp.contma = (float) locallab.spots.at(sp).contmask; + lp.blendmacie = blendmaskcie; + lp.radmacie = radmaskcie; + lp.chromacie = chromaskcie; + lp.denoichmask = locallab.spots.at(sp).denoichmask; + for (int y = 0; y < 6; y++) { lp.mulloc[y] = LIM(multi[y], 0.f, 4.f);//to prevent crash with old pp3 integer } @@ -1616,27 +1688,28 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall lp.mullocsh[y] = multish[y]; } lp.activspot = locallab.spots.at(sp).activ; - + lp.detailsh = locallab.spots.at(sp).detailSH; lp.threshol = thresho; lp.chromacb = chromcbdl; lp.expvib = locallab.spots.at(sp).expvibrance && lp.activspot ; - lp.colorena = locallab.spots.at(sp).expcolor && lp.activspot && llExpMask == 0 && llsoftMask == 0 && llSHMask == 0 && llcbMask == 0 && lllcMask == 0 && llsharMask == 0 && llretiMask == 0 && lltmMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0; // Color & Light tool is deactivated if Exposure mask is visible or SHMask - lp.blurena = locallab.spots.at(sp).expblur && lp.activspot && llExpMask == 0 && llsoftMask == 0 && llSHMask == 0 && llcbMask == 0 && lllcMask == 0 && llsharMask == 0 && llretiMask == 0 && llColorMask == 0 && lltmMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0; - lp.tonemapena = locallab.spots.at(sp).exptonemap && lp.activspot && llExpMask == 0 && llsoftMask == 0 && llSHMask == 0 && llcbMask == 0 && lllcMask == 0 && llsharMask == 0 && llretiMask == 0 && llColorMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0; - lp.retiena = locallab.spots.at(sp).expreti && lp.activspot && llExpMask == 0 && llsoftMask == 0 && llSHMask == 0 && llcbMask == 0 && lllcMask == 0 && llsharMask == 0 && llColorMask == 0 && lltmMask == 0 && llvibMask == 0 && llSHMask == 0 && lllogMask == 0 && ll_Mask == 0; - lp.lcena = locallab.spots.at(sp).expcontrast && lp.activspot && llExpMask == 0 && llsoftMask == 0 && llSHMask == 0 && llcbMask == 0 && llsharMask == 0 && llColorMask == 0 && lltmMask == 0 && llvibMask == 0 && llSHMask == 0 && lllogMask == 0 && ll_Mask == 0; - lp.cbdlena = locallab.spots.at(sp).expcbdl && lp.activspot && llExpMask == 0 && llsoftMask == 0 && llSHMask == 0 && llretiMask == 0 && lllcMask == 0 && llsharMask == 0 && lllcMask == 0 && llColorMask == 0 && lltmMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0; - lp.exposena = locallab.spots.at(sp).expexpose && lp.activspot && llColorMask == 0 && llsoftMask == 0 && llSHMask == 0 && lllcMask == 0 && llsharMask == 0 && llcbMask == 0 && llretiMask == 0 && lltmMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0; // Exposure tool is deactivated if Color & Light mask SHmask is visible - lp.hsena = locallab.spots.at(sp).expshadhigh && lp.activspot && llColorMask == 0 && llsoftMask == 0 && llExpMask == 0 && llcbMask == 0 && lllcMask == 0 && llsharMask == 0 && llretiMask == 0 && lltmMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0;// Shadow Highlight tool is deactivated if Color & Light mask or SHmask is visible - lp.vibena = locallab.spots.at(sp).expvibrance && lp.activspot && llColorMask == 0 && llsoftMask == 0 && llExpMask == 0 && llcbMask == 0 && lllcMask == 0 && llsharMask == 0 && llretiMask == 0 && llcbMask == 0 && lltmMask == 0 && llSHMask == 0 && lllogMask == 0 && ll_Mask == 0;// vibrance tool is deactivated if Color & Light mask or SHmask is visible - lp.sharpena = locallab.spots.at(sp).expsharp && lp.activspot && llColorMask == 0 && llsoftMask == 0 && llExpMask == 0 && llcbMask == 0 && lllcMask == 0 && llretiMask == 0 && llcbMask == 0 && lltmMask == 0 && llSHMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0; - lp.sfena = locallab.spots.at(sp).expsoft && lp.activspot && llColorMask == 0 && llExpMask == 0 && llcbMask == 0 && lllcMask == 0 && llretiMask == 0 && llcbMask == 0 && lltmMask == 0 && llSHMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0; - lp.maskena = locallab.spots.at(sp).expmask && lp.activspot && llColorMask == 0 && llsoftMask == 0 && llExpMask == 0 && llcbMask == 0 && lllcMask == 0 && llsharMask == 0 && llretiMask == 0 && llcbMask == 0 && lltmMask == 0 && lllogMask == 0 && llSHMask == 0;// vibrance tool is deactivated if Color & Light mask or SHmask is visible - lp.logena = locallab.spots.at(sp).explog && lp.activspot && llColorMask == 0 && llsoftMask == 0 && llExpMask == 0 && llcbMask == 0 && lllcMask == 0 && llsharMask == 0 && llretiMask == 0 && llcbMask == 0 && lltmMask == 0 && llSHMask == 0;// vibrance tool is deactivated if Color & Light mask or SHmask is visible + lp.colorena = locallab.spots.at(sp).expcolor && lp.activspot && llExpMask == 0 && llsoftMask == 0 && llSHMask == 0 && llcbMask == 0 && lllcMask == 0 && llsharMask == 0 && llretiMask == 0 && lltmMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0 && llcieMask == 0; // Color & Light tool is deactivated if Exposure mask is visible or SHMask + lp.blurena = locallab.spots.at(sp).expblur && lp.activspot && llExpMask == 0 && llsoftMask == 0 && llSHMask == 0 && llcbMask == 0 && lllcMask == 0 && llsharMask == 0 && llretiMask == 0 && llColorMask == 0 && lltmMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0 && llcieMask == 0; + lp.tonemapena = locallab.spots.at(sp).exptonemap && lp.activspot && llExpMask == 0 && llsoftMask == 0 && llSHMask == 0 && llcbMask == 0 && lllcMask == 0 && llsharMask == 0 && llretiMask == 0 && llColorMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0 && llcieMask == 0; + lp.retiena = locallab.spots.at(sp).expreti && lp.activspot && llExpMask == 0 && llsoftMask == 0 && llSHMask == 0 && llcbMask == 0 && lllcMask == 0 && llsharMask == 0 && llColorMask == 0 && lltmMask == 0 && llvibMask == 0 && llSHMask == 0 && lllogMask == 0 && ll_Mask == 0 && llcieMask == 0; + lp.lcena = locallab.spots.at(sp).expcontrast && lp.activspot && llExpMask == 0 && llsoftMask == 0 && llSHMask == 0 && llcbMask == 0 && llsharMask == 0 && llColorMask == 0 && lltmMask == 0 && llvibMask == 0 && llSHMask == 0 && lllogMask == 0 && ll_Mask == 0 && llcieMask == 0; + lp.cbdlena = locallab.spots.at(sp).expcbdl && lp.activspot && llExpMask == 0 && llsoftMask == 0 && llSHMask == 0 && llretiMask == 0 && lllcMask == 0 && llsharMask == 0 && lllcMask == 0 && llColorMask == 0 && lltmMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0 && llcieMask == 0; + lp.exposena = locallab.spots.at(sp).expexpose && lp.activspot && llColorMask == 0 && llsoftMask == 0 && llSHMask == 0 && lllcMask == 0 && llsharMask == 0 && llcbMask == 0 && llretiMask == 0 && lltmMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0 && llcieMask == 0; // Exposure tool is deactivated if Color & Light mask SHmask is visible + lp.hsena = locallab.spots.at(sp).expshadhigh && lp.activspot && llColorMask == 0 && llsoftMask == 0 && llExpMask == 0 && llcbMask == 0 && lllcMask == 0 && llsharMask == 0 && llretiMask == 0 && lltmMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0 && llcieMask == 0;// Shadow Highlight tool is deactivated if Color & Light mask or SHmask is visible + lp.vibena = locallab.spots.at(sp).expvibrance && lp.activspot && llColorMask == 0 && llsoftMask == 0 && llExpMask == 0 && llcbMask == 0 && lllcMask == 0 && llsharMask == 0 && llretiMask == 0 && llcbMask == 0 && lltmMask == 0 && llSHMask == 0 && lllogMask == 0 && ll_Mask == 0 && llcieMask == 0;// vibrance tool is deactivated if Color & Light mask or SHmask is visible + lp.sharpena = locallab.spots.at(sp).expsharp && lp.activspot && llColorMask == 0 && llsoftMask == 0 && llExpMask == 0 && llcbMask == 0 && lllcMask == 0 && llretiMask == 0 && llcbMask == 0 && lltmMask == 0 && llSHMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0 && llcieMask == 0; + lp.sfena = locallab.spots.at(sp).expsoft && lp.activspot && llColorMask == 0 && llExpMask == 0 && llcbMask == 0 && lllcMask == 0 && llretiMask == 0 && llcbMask == 0 && lltmMask == 0 && llSHMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0 && llcieMask == 0; + lp.maskena = locallab.spots.at(sp).expmask && lp.activspot && llColorMask == 0 && llsoftMask == 0 && llExpMask == 0 && llcbMask == 0 && lllcMask == 0 && llsharMask == 0 && llretiMask == 0 && llcbMask == 0 && lltmMask == 0 && lllogMask == 0 && llSHMask == 0 && llcieMask == 0;// vibrance tool is deactivated if Color & Light mask or SHmask is visible + lp.logena = locallab.spots.at(sp).explog && lp.activspot && llColorMask == 0 && llsoftMask == 0 && llExpMask == 0 && llcbMask == 0 && lllcMask == 0 && llsharMask == 0 && llretiMask == 0 && llcbMask == 0 && lltmMask == 0 && llSHMask == 0 && ll_Mask == 0 && llcieMask == 0;// vibrance tool is deactivated if Color & Light mask or SHmask is visible + lp.cieena = locallab.spots.at(sp).expcie && lp.activspot && llColorMask == 0 && llsoftMask == 0 && llExpMask == 0 && llcbMask == 0 && lllcMask == 0 && llsharMask == 0 && llretiMask == 0 && lltmMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0;// Shadow Highlight tool is deactivated if Color & Light mask or SHmask is visible - lp.islocal = (lp.expvib || lp.colorena || lp.blurena || lp.tonemapena || lp.retiena || lp.lcena || lp.cbdlena || lp.exposena || lp.hsena || lp.vibena || lp.sharpena || lp.sfena || lp.maskena || lp.logena); + lp.islocal = (lp.expvib || lp.colorena || lp.blurena || lp.tonemapena || lp.retiena || lp.lcena || lp.cbdlena || lp.exposena || lp.hsena || lp.vibena || lp.sharpena || lp.sfena || lp.maskena || lp.logena || lp.cieena); lp.sensv = local_sensiv; lp.past = chromaPastel; @@ -1669,6 +1742,8 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall lp.residshathr = locallab.spots.at(sp).residshathr; lp.residhi = locallab.spots.at(sp).residhi; lp.residhithr = locallab.spots.at(sp).residhithr; + lp.residgam = locallab.spots.at(sp).residgam; + lp.residslop = locallab.spots.at(sp).residslop; lp.blwh = locallab.spots.at(sp).blwh; lp.senscolor = (int) locallab.spots.at(sp).colorscope; //replace scope color vibrance shadows @@ -1676,6 +1751,10 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall lp.sensv = lp.senscolor; lp.senshs = lp.senscolor; + lp.mLjz = locallab.spots.at(sp).clarilresjz / 100.0; + lp.mCjz = locallab.spots.at(sp).claricresjz / 100.0; + lp.softrjz = locallab.spots.at(sp).clarisoftjz; + } static void calcTransitionrect(const float lox, const float loy, const float ach, const local_params& lp, int &zone, float &localFactor) @@ -1772,9 +1851,6 @@ static void calcTransition(const float lox, const float loy, const float ach, co } // Copyright 2018 Alberto Griggio -//J.Desmis 12 2019 - I will try to port a raw process in local adjustments -// I choose this one because, it is "new" -// Perhaps - probably no result, but perhaps ?? float find_gray(float source_gray, float target_gray) { @@ -1793,7 +1869,7 @@ float find_gray(float source_gray, float target_gray) const auto f = [ = ](float x) -> float { - return std::pow(x, source_gray) - 1 - target_gray * x + target_gray; + return std::pow(x, source_gray) - 1.f - target_gray * x + target_gray; }; // first find the interval we are interested in @@ -1853,6 +1929,43 @@ void ImProcFunctions::mean_sig (const float* const * const savenormL, float &mea stdf = std::sqrt(stdd); meanf = meand; } +// taken from darktable +inline float power_norm(float r, float g, float b) +{ + r = std::abs(r); + g = std::abs(g); + b = std::abs(b); + + float r2 = SQR(r); + float g2 = SQR(g); + float b2 = SQR(b); + float d = r2 + g2 + b2; + float n = r*r2 + g*g2 + b*b2; + + return n / std::max(d, 1e-12f); +} + +inline float ev2gray(float ev) +{ + return std::pow(2.f, -ev + std::log2(0.18f)); +} + + +inline float gray2ev(float gray) +{ + return std::log2(0.18f / gray); +} + + +inline float norm2(float r, float g, float b, TMatrix ws) +{ + return (power_norm(r, g, b) + Color::rgbLuminance(r, g, b, ws)) / 2.f; +} + +inline float norm(float r, float g, float b, TMatrix ws) +{ + return (Color::rgbLuminance(r, g, b, ws)); +} // basic log encoding taken from ACESutil.Lin_to_Log2, from @@ -1860,24 +1973,19 @@ void ImProcFunctions::mean_sig (const float* const * const savenormL, float &mea // (as seen on pixls.us) void ImProcFunctions::log_encode(Imagefloat *rgb, struct local_params & lp, bool multiThread, int bfw, int bfh) { - /* J.Desmis 12 2019 - small adaptations to local adjustments - replace log2 by log(lp.baselog) allows diferentiation between low and high lights - */ // BENCHFUN - const float gray = lp.sourcegray / 100.f; + const float gray = 0.01f * lp.sourcegray; const float shadows_range = lp.blackev; - float dynamic_range = lp.whiteev - lp.blackev; - if (dynamic_range < 0.5f) { - dynamic_range = 0.5f; - } + float dynamic_range = max(lp.whiteev - lp.blackev, 0.5f); const float noise = pow_F(2.f, -16.f); - // const float log2 = xlogf(lp.baselog); const float log2 = xlogf(2.f); - const float base = lp.targetgray > 1 && lp.targetgray < 100 && dynamic_range > 0 ? find_gray(std::abs(lp.blackev) / dynamic_range, lp.targetgray / 100.f) : 0.f; - const float linbase = rtengine::max(base, 0.f); + const float base = lp.targetgray > 1 && lp.targetgray < 100 && dynamic_range > 0 ? find_gray(std::abs(lp.blackev) / dynamic_range, 0.01f * lp.targetgray) : 0.f; + const float linbase = rtengine::max(base, 2.f);//2 to avoid bad behavior TMatrix ws = ICCStore::getInstance()->workingSpaceMatrix(params->icm.workingProfile); + if (settings->verbose) { + printf("Base Log encoding std=%5.1f\n", (double) linbase); + } const auto apply = [ = ](float x, bool scale = true) -> float { @@ -1904,35 +2012,6 @@ void ImProcFunctions::log_encode(Imagefloat *rgb, struct local_params & lp, bool } }; - const auto norm = - [&](float r, float g, float b) -> float { - return Color::rgbLuminance(r, g, b, ws); - - // other possible alternatives (so far, luminance seems to work - // fine though). See also - // https://discuss.pixls.us/t/finding-a-norm-to-preserve-ratios-across-non-linear-operations - // - // MAX - //return max(r, g, b); - // - // Euclidean - //return std::sqrt(SQR(r) + SQR(g) + SQR(b)); - - // weighted yellow power norm from https://youtu.be/Z0DS7cnAYPk - // float rr = 1.22f * r / 65535.f; - // float gg = 1.20f * g / 65535.f; - // float bb = 0.58f * b / 65535.f; - // float rr4 = SQR(rr) * SQR(rr); - // float gg4 = SQR(gg) * SQR(gg); - // float bb4 = SQR(bb) * SQR(bb); - // float den = (rr4 + gg4 + bb4); - // if (den > 0.f) { - // return 0.8374319f * ((rr4 * rr + gg4 * gg + bb4 * bb) / den) * 65535.f; - // } else { - // return 0.f; - // } - }; - const float detail = lp.detail; const int W = rgb->getWidth(), H = rgb->getHeight(); @@ -1945,7 +2024,7 @@ void ImProcFunctions::log_encode(Imagefloat *rgb, struct local_params & lp, bool float r = rgb->r(y, x); float g = rgb->g(y, x); float b = rgb->b(y, x); - float m = norm(r, g, b); + float m = norm2(r, g, b, ws); if (m > noise) { float mm = apply(m); @@ -1981,7 +2060,7 @@ void ImProcFunctions::log_encode(Imagefloat *rgb, struct local_params & lp, bool #endif for (int y = 0; y < H; ++y) { for (int x = 0; x < W; ++x) { - Y2[y][x] = norm(rgb->r(y, x), rgb->g(y, x), rgb->b(y, x)) / 65535.f; + Y2[y][x] = norm2(rgb->r(y, x), rgb->g(y, x), rgb->b(y, x), ws) / 65535.f; float l = xlogf(rtengine::max(Y2[y][x], 1e-9f)); float ll = round(l * base_posterization) / base_posterization; Y[y][x] = xexpf(ll); @@ -2005,7 +2084,7 @@ void ImProcFunctions::log_encode(Imagefloat *rgb, struct local_params & lp, bool float t = Y[y][x]; float t2; - if (t > noise && (t2 = norm(r, g, b)) > noise) { + if (t > noise && (t2 = norm2(r, g, b, ws)) > noise) { float c = apply(t, false); float f = c / t; // float t2 = norm(r, g, b); @@ -2026,25 +2105,24 @@ void ImProcFunctions::log_encode(Imagefloat *rgb, struct local_params & lp, bool } } } + } } -void ImProcFunctions::getAutoLogloc(int sp, ImageSource *imgsrc, float *sourceg, float *blackev, float *whiteev, bool *Autogr, float *sourceab, int fw, int fh, float xsta, float xend, float ysta, float yend, int SCALE) +void ImProcFunctions::getAutoLogloc(int sp, ImageSource *imgsrc, float *sourceg, float *blackev, float *whiteev, bool *Autogr, float *sourceab, int fw, int fh, float xsta, float xend, float ysta, float yend, int SCALE) { //BENCHFUN -//adpatation to local adjustments Jacques Desmis 12 2019 +//adpatation to local adjustments Jacques Desmis 12 2019 and 11 2021 (from ART) const PreviewProps pp(0, 0, fw, fh, SCALE); Imagefloat img(int(fw / SCALE + 0.5), int(fh / SCALE + 0.5)); const ProcParams neutral; + imgsrc->getImage(imgsrc->getWB(), TR_NONE, &img, pp, params->toneCurve, neutral.raw); imgsrc->convertColorSpace(&img, params->icm, imgsrc->getWB()); float minVal = RT_INFINITY; float maxVal = -RT_INFINITY; - float ec = 1.f; - if(params->toneCurve.autoexp) {//take into account exposure, only if autoexp, in other cases now it's after LA - ec = std::pow(2.f, params->toneCurve.expcomp); - } + TMatrix ws = ICCStore::getInstance()->workingSpaceMatrix(params->icm.workingProfile); constexpr float noise = 1e-5; const int h = fh / SCALE; @@ -2055,26 +2133,38 @@ void ImProcFunctions::getAutoLogloc(int sp, ImageSource *imgsrc, float *sourceg, const int wsta = xsta * w; const int wend = xend * w; - + int www = int(fw / SCALE + 0.5); + int hhh = int(fh / SCALE + 0.5); + array2D YY(www, hhh); + double mean = 0.0; int nc = 0; for (int y = hsta; y < hend; ++y) { for (int x = wsta; x < wend; ++x) { const float r = img.r(y, x), g = img.g(y, x), b = img.b(y, x); - mean += static_cast(0.2126f * Color::gamma_srgb(r) + 0.7152f * Color::gamma_srgb(g) + 0.0722f * Color::gamma_srgb(b)); + YY[y][x] = norm2(r, g, b, ws) / 65535.f;//norm2 to find a best color luminance response in RGB + mean += static_cast((float) ws[1][0] * Color::gamma_srgb(r) + (float) ws[1][1] * Color::gamma_srgb(g) + (float) ws[1][2] * Color::gamma_srgb(b)); + //alternative to fing gray in case of above process does not works nc++; + } + } - const float m = rtengine::max(0.f, r, g, b) / 65535.f * ec; - if (m > noise) { - const float l = rtengine::min(r, g, b) / 65535.f * ec; - minVal = rtengine::min(minVal, l > noise ? l : m); - maxVal = rtengine::max(maxVal, m); + for (int y = hsta; y < hend; ++y) { + for (int x = wsta; x < wend; ++x) { + float l = YY[y][x]; + if (l > noise) { + minVal = min(minVal, l); + maxVal = max(maxVal, l); } } } - maxVal *= 1.2f; //or 1.5f;slightly increase max - //approximation sourcegray yb source = 0.4 * yb - + + maxVal *= 1.45f; //(or 1.5f...) slightly increase max to take into account illuminance incident light + minVal *= 0.55f; //(or 0.5f...) slightly decrease min to take into account illuminance incident light + //E = 2.5*2^EV => e=2.5 depends on the sensor type C=250 e=2.5 to C=330 e=3.3 + //repartition with 2.5 between 1.45 Light and shadows 0.58 => a little more 0.55... + // https://www.pixelsham.com/2020/12/26/exposure-value-measurements/ + // https://en.wikipedia.org/wiki/Light_meter if (maxVal > minVal) { const float log2 = std::log(2.f); const float dynamic_range = -xlogf(minVal / maxVal) / log2; @@ -2087,6 +2177,7 @@ void ImProcFunctions::getAutoLogloc(int sp, ImageSource *imgsrc, float *sourceg, if (Autogr[sp]) { double tot = 0.0; int n = 0; + //0.05 0.25 arbitrary values around gray point 0.18 to find a good value as "gray" for "gain" const float gmax = rtengine::min(maxVal / 2.f, 0.25f); const float gmin = rtengine::max(minVal * std::pow(2.f, rtengine::max((dynamic_range - 1.f) / 2.f, 1.f)), 0.05f); @@ -2094,7 +2185,7 @@ void ImProcFunctions::getAutoLogloc(int sp, ImageSource *imgsrc, float *sourceg, std::cout << " gray boundaries: " << gmin << ", " << gmax << std::endl; } - for (int y = ysta; y < yend; ++y) { + for (int y = hsta; y < hend; ++y) { for (int x = wsta; x < wend; ++x) { const float l = img.g(y, x) / 65535.f; @@ -2111,33 +2202,18 @@ void ImProcFunctions::getAutoLogloc(int sp, ImageSource *imgsrc, float *sourceg, if (settings->verbose) { std::cout << " computed gray point from " << n << " samples: " << sourceg[sp] << std::endl; } - } else { + } else {//I change slightly this part of algo - more progressivity...best response in very low exposure images mean /= (nc * 65535.0); float yb; + yb = 1.5f + 100.f * pow_F(mean, 1.8f);//empirical formula for Jz and log encode for low exposure images - if (mean < 0.15) { - yb = 3.0f; - } else if (mean < 0.3) { - yb = 5.0f; - } else if (mean < 0.4) { - yb = 10.0f; - } else if (mean < 0.45) { - yb = 15.0f; - } else if (mean < 0.5) { - yb = 18.0f; - } else if (mean < 0.55) { - yb = 23.0f; - } else if (mean < 0.6) { - yb = 30.0f; - } else { - yb = 45.f; - } - sourceg[sp] = 0.4f * yb; + sourceg[sp] = yb; if (settings->verbose) { std::cout << " no samples found in range, resorting to Yb gray point value " << sourceg[sp] << std::endl; } } } + constexpr float MIN_WHITE = 2.f; constexpr float MAX_BLACK = -3.5f; @@ -2169,13 +2245,15 @@ void ImProcFunctions::getAutoLogloc(int sp, ImageSource *imgsrc, float *sourceg, adap = 2000.; } else { double E_V = fcomp + std::log2(double ((fnum * fnum) / fspeed / (fiso / 100.f))); - E_V += params->toneCurve.expcomp;// exposure compensation in tonecurve ==> direct EV - E_V += std::log2(params->raw.expos); // exposure raw white point ; log2 ==> linear to EV - adap = pow(2.0, E_V - 3.0); // cd / m2 + double kexp = 0.; + E_V += kexp * params->toneCurve.expcomp;// exposure compensation in tonecurve ==> direct EV + E_V += 0.5 * std::log2(params->raw.expos); // exposure raw white point ; log2 ==> linear to EV + adap = pow(2.0, E_V - 3.0); // cd / m2 ==> 3.0 = log2(8) =>fnum*fnum/speed = Luminance (average scene) * fiso / K (K is the reflected-light meter calibration constant according to the sensors about 12.5 or 14 // end calculation adaptation scene luminosity } sourceab[sp] = adap; + } } @@ -2405,15 +2483,158 @@ void tone_eq(array2D &R, array2D &G, array2D &B, const str } } - - -void ImProcFunctions::ciecamloc_02float(int sp, LabImage* lab, int call) +void ImProcFunctions::loccont(int bfw, int bfh, LabImage* tmp1, float rad, float stren, int sk) { - //BENCHFUN + if (rad > 0.f) { + array2D guide(bfw, bfh); + array2D LL(bfw, bfh); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw; x++) { + LL[y][x] = tmp1->L[y][x]; + float ll = LL[y][x] / 32768.f; + guide[y][x] = xlin2log(rtengine::max(ll, 0.f), 10.f); + } + } + array2D iL(bfw, bfh, LL, 0); + float gu = stren * rad; + int r = rtengine::max(int(gu / sk), 1); + const double epsil = 0.001 * std::pow(2.f, -10); + float st = 0.01f * rad; + rtengine::guidedFilterLog(guide, 10.f, LL, r, epsil, false); + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw; x++) { + LL[y][x] = intp(st, LL[y][x] , iL[y][x]); + tmp1->L[y][x] = LL[y][x]; + } + } + } +} + +void sigmoidla (float &valj, float thresj, float lambda) +{ + //thres : shifts the action of sigmoid to darker tones or lights + //lambda : changes the "slope" of the sigmoid. Low values give a flat curve, high values a "rectangular / orthogonal" curve + valj = 1.f / (1.f + xexpf(lambda - (lambda / thresj) * valj)); +} + + +void gamutjz (double &Jz, double &az, double &bz, double pl, const double wip[3][3], const float higherCoef, const float lowerCoef) +{//Not used...bad results + constexpr float ClipLevel = 65535.0f; + bool inGamut; + // int nb = 0; + do { + inGamut = true; + double L_, M_, S_; + double xx, yy, zz; + bool zcam = false; + Ciecam02::jzczhzxyz (xx, yy, zz, Jz, az, bz, pl, L_, M_, S_, zcam); + double x, y, z; + x = 65535. * (d65_d50[0][0] * xx + d65_d50[0][1] * yy + d65_d50[0][2] * zz); + y = 65535. * (d65_d50[1][0] * xx + d65_d50[1][1] * yy + d65_d50[1][2] * zz); + z = 65535. * (d65_d50[2][0] * xx + d65_d50[2][1] * yy + d65_d50[2][2] * zz); + float R,G,B; + Color:: xyz2rgb(x, y, z, R, G, B, wip); + if (rtengine::min(R, G, B) < 0.f || rtengine::max(R, G, B) > ClipLevel) { + // nb++; + double hz = xatan2f(bz, az); + float2 sincosval = xsincosf(hz); + double Cz = sqrt(az * az + bz * bz); + // printf("cz=%f jz=%f" , (double) Cz, (double) Jz); + Cz *= (double) higherCoef; + if(Cz < 0.01 && Jz > 0.05) {//empirical values + Jz -= (double) lowerCoef; + } + az = clipazbz(Cz * (double) sincosval.y); + bz = clipazbz(Cz * (double) sincosval.x); + + inGamut = false; + } + } while (!inGamut); +} + +void ImProcFunctions::ciecamloc_02float(const struct local_params& lp, int sp, LabImage* lab, int bfw, int bfh, int call, int sk, const LUTf& cielocalcurve, bool localcieutili, const LUTf& cielocalcurve2, bool localcieutili2, const LUTf& jzlocalcurve, bool localjzutili, const LUTf& czlocalcurve, bool localczutili, const LUTf& czjzlocalcurve, bool localczjzutili, const LocCHCurve& locchCurvejz, const LocHHCurve& lochhCurvejz, const LocLHCurve& loclhCurvejz, bool HHcurvejz, bool CHcurvejz, bool LHcurvejz, const LocwavCurve& locwavCurvejz, bool locwavutilijz +) +{ +// BENCHFUN +//possibility to reenable Zcam + if(!params->locallab.spots.at(sp).activ) {//disable all ciecam functions + return; + } bool ciec = false; + bool iscie = false; if (params->locallab.spots.at(sp).ciecam && params->locallab.spots.at(sp).explog && call == 1) { ciec = true; + iscie = false; } + else if (params->locallab.spots.at(sp).expcie && call == 0) { + ciec = true; + iscie = true; + } + bool z_cam = false; //params->locallab.spots.at(sp).jabcie; //alaways use normal algorithm, Zcam giev often bad results + bool jabcie = false;//always disabled + bool islogjz = params->locallab.spots.at(sp).forcebw; + bool issigjz = params->locallab.spots.at(sp).sigjz; + + //sigmoid J Q variables + const float sigmoidlambda = params->locallab.spots.at(sp).sigmoidldacie; + const float sigmoidth = params->locallab.spots.at(sp).sigmoidthcie; + const float sigmoidbl = params->locallab.spots.at(sp).sigmoidblcie; + const bool sigmoidqj = params->locallab.spots.at(sp).sigmoidqjcie; + + TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix(params->icm.workingProfile); + const double wip[3][3] = {//improve precision with double + {wiprof[0][0], wiprof[0][1], wiprof[0][2]}, + {wiprof[1][0], wiprof[1][1], wiprof[1][2]}, + {wiprof[2][0], wiprof[2][1], wiprof[2][2]} + }; + float plum = (float) params->locallab.spots.at(sp).pqremapcam16; + + int mocam = 1; + if(params->locallab.spots.at(sp).modecam == "all") { + mocam = 10;//à remettre à 0 si modecam = "all" + } else if(params->locallab.spots.at(sp).modecam == "cam16") { + mocam = 1; + } else if(params->locallab.spots.at(sp).modecam == "jz") { + mocam = 2; +// } else if(params->locallab.spots.at(sp).modecam == "zcam") { +// mocam = 3; + } + + int mecamcurve = 0; + if(params->locallab.spots.at(sp).toneMethodcie == "one") { + mecamcurve = 0; + } else if(params->locallab.spots.at(sp).toneMethodcie == "two") { + mecamcurve = 1; + } + + int mecamcurve2 = 0; + if(params->locallab.spots.at(sp).toneMethodcie2 == "onec") { + mecamcurve2 = 0; + } else if(params->locallab.spots.at(sp).toneMethodcie2 == "twoc") { + mecamcurve2 = 1; + } else if(params->locallab.spots.at(sp).toneMethodcie2 == "thrc") { + mecamcurve2 = 2; + } + + float th = 1.f; + const float at = 1.f - sigmoidth; + const float bt = sigmoidth; + + const float ath = sigmoidth - 1.f; + const float bth = 1; + float sila = pow_F(sigmoidlambda, 0.25f); + const float sigm = 1.4f + 25.f *(1.f - sila);//with sigmoidlambda = 0 e^16 = 9000000 e^20=485000000 e^23.5 = 16000000000 e^26.4 = 291000000000 + const float bl = sigmoidbl; + //end sigmoid + int width = lab->W, height = lab->H; float Yw; Yw = 1.0f; @@ -2431,6 +2652,7 @@ void ImProcFunctions::ciecamloc_02float(int sp, LabImage* lab, int call) LUTf CAMBrightCurveJ(32768, LUT_CLIP_BELOW | LUT_CLIP_ABOVE); LUTf CAMBrightCurveQ(32768, LUT_CLIP_BELOW | LUT_CLIP_ABOVE); + #ifdef _OPENMP const int numThreads = min(max(width * height / 65536, 1), omp_get_max_threads()); #pragma omp parallel num_threads(numThreads) if(numThreads>1) @@ -2502,12 +2724,29 @@ void ImProcFunctions::ciecamloc_02float(int sp, LabImage* lab, int call) //evaluate lightness, contrast if (ciec) { - const float contL = 0.6 * params->locallab.spots.at(sp).contl; //0.6 less effect, no need 1. - const float lightL = 0.4 * params->locallab.spots.at(sp).lightl; //0.4 less effect, no need 1. - const float contQ = 0.5 * params->locallab.spots.at(sp).contq; //0.5 less effect, no need 1. - const float lightQ = 0.4 * params->locallab.spots.at(sp).lightq; //0.4 less effect, no need 1. + float contL = 0.f; + float lightL = 0.f; + float contQ = 0.f; + float lightQ = 0.f; + if(iscie) { + contL = 0.6 * params->locallab.spots.at(sp).contlcie; //0.6 less effect, no need 1. + lightL = 0.4 * params->locallab.spots.at(sp).lightlcie; //0.4 less effect, no need 1. + contQ = 0.5 * params->locallab.spots.at(sp).contqcie; //0.5 less effect, no need 1. + lightQ = 0.4 * params->locallab.spots.at(sp).lightqcie; //0.4 less effect, no need 1. + } else { + contL = 0.6 * params->locallab.spots.at(sp).contl; //0.6 less effect, no need 1. + lightL = 0.4 * params->locallab.spots.at(sp).lightl; //0.4 less effect, no need 1. + contQ = 0.5 * params->locallab.spots.at(sp).contq; //0.5 less effect, no need 1. + lightQ = 0.4 * params->locallab.spots.at(sp).lightq; //0.4 less effect, no need 1. + + } + float contthresL = 0.f; - float contthresL = params->locallab.spots.at(sp).contthres; + if(iscie) { + contthresL = params->locallab.spots.at(sp).contthrescie; + } else { + contthresL = params->locallab.spots.at(sp).contthres; + } float contthresQ = contthresL; if(contL < 0.f) { contthresL *= -1; @@ -2525,6 +2764,8 @@ void ImProcFunctions::ciecamloc_02float(int sp, LabImage* lab, int call) Ciecam02::curveJfloat(lightQ, contQ, thQ, hist16Q, CAMBrightCurveQ); //brightness Q and contrast Q } + + int tempo = 5000; if(params->locallab.spots.at(sp).expvibrance && call == 2) { if (params->locallab.spots.at(sp).warm > 0) { @@ -2534,11 +2775,20 @@ void ImProcFunctions::ciecamloc_02float(int sp, LabImage* lab, int call) } } + if(ciec) { - if (params->locallab.spots.at(sp).catad > 0) { - tempo = 5000 - 30 * params->locallab.spots.at(sp).catad; - } else if (params->locallab.spots.at(sp).catad < 0){ - tempo = 5000 - 70 * params->locallab.spots.at(sp).catad; + if(iscie) { + if (params->locallab.spots.at(sp).catadcie > 0) { + tempo = 5000 - 30 * params->locallab.spots.at(sp).catadcie; + } else if (params->locallab.spots.at(sp).catadcie < 0){ + tempo = 5000 - 70 * params->locallab.spots.at(sp).catadcie; + } + } else { + if (params->locallab.spots.at(sp).catad > 0) { + tempo = 5000 - 30 * params->locallab.spots.at(sp).catad; + } else if (params->locallab.spots.at(sp).catad < 0){ + tempo = 5000 - 70 * params->locallab.spots.at(sp).catad; + } } } @@ -2553,34 +2803,67 @@ void ImProcFunctions::ciecamloc_02float(int sp, LabImage* lab, int call) //viewing condition for surround f2 = 1.0f, c2 = 0.69f, nc2 = 1.0f; if(ciec) { + if(iscie) { //surround source with only 2 choices (because Log encoding before) - if (params->locallab.spots.at(sp).sursour == "Average") { - f = 1.0f, c = 0.69f, nc = 1.0f; - } else if (params->locallab.spots.at(sp).sursour == "Dim") { - f = 0.9f; - c = 0.59f; - nc = 0.9f; - } else if (params->locallab.spots.at(sp).sursour == "Dark") { - f = 0.8f; - c = 0.525f; - nc = 0.8f; + if (params->locallab.spots.at(sp).sursourcie == "Average") { + f = 1.0f, c = 0.69f, nc = 1.0f; + } else if (params->locallab.spots.at(sp).sursourcie == "Dim") { + f = 0.9f; + c = 0.59f; + nc = 0.9f; + } else if (params->locallab.spots.at(sp).sursourcie == "Dark") { + f = 0.8f; + c = 0.525f; + nc = 0.8f; + } + } else { + if (params->locallab.spots.at(sp).sursour == "Average") { + f = 1.0f, c = 0.69f, nc = 1.0f; + } else if (params->locallab.spots.at(sp).sursour == "Dim") { + f = 0.9f; + c = 0.59f; + nc = 0.9f; + } else if (params->locallab.spots.at(sp).sursour == "Dark") { + f = 0.8f; + c = 0.525f; + nc = 0.8f; + } } //viewing condition for surround - if (params->locallab.spots.at(sp).surround == "Average") { - f2 = 1.0f, c2 = 0.69f, nc2 = 1.0f; - } else if (params->locallab.spots.at(sp).surround == "Dim") { - f2 = 0.9f; - c2 = 0.59f; - nc2 = 0.9f; - } else if (params->locallab.spots.at(sp).surround == "Dark") { - f2 = 0.8f; - c2 = 0.525f; - nc2 = 0.8f; - } else if (params->locallab.spots.at(sp).surround == "ExtremelyDark") { - f2 = 0.8f; - c2 = 0.41f; - nc2 = 0.8f; + if(iscie) { + if (params->locallab.spots.at(sp).surroundcie == "Average") { + f2 = 1.0f, c2 = 0.69f, nc2 = 1.0f; + } else if (params->locallab.spots.at(sp).surroundcie == "Dim") { + f2 = 0.9f; + c2 = 0.59f; + nc2 = 0.9f; + } else if (params->locallab.spots.at(sp).surroundcie == "Dark") { + f2 = 0.8f; + c2 = 0.525f; + nc2 = 0.8f; + } else if (params->locallab.spots.at(sp).surroundcie == "ExtremelyDark") { + f2 = 0.8f; + c2 = 0.41f; + nc2 = 0.8f; + } + } else { + if (params->locallab.spots.at(sp).surround == "Average") { + f2 = 1.0f, c2 = 0.69f, nc2 = 1.0f; + } else if (params->locallab.spots.at(sp).surround == "Dim") { + f2 = 0.9f; + c2 = 0.59f; + nc2 = 0.9f; + } else if (params->locallab.spots.at(sp).surround == "Dark") { + f2 = 0.8f; + c2 = 0.525f; + nc2 = 0.8f; + } else if (params->locallab.spots.at(sp).surround == "ExtremelyDark") { + f2 = 0.8f; + c2 = 0.41f; + nc2 = 0.8f; + } + } } @@ -2597,51 +2880,115 @@ void ImProcFunctions::ciecamloc_02float(int sp, LabImage* lab, int call) la = 400.f; float la2 = 400.f; if(ciec) { - la = params->locallab.spots.at(sp).sourceabs; - - la2 = params->locallab.spots.at(sp).targabs; + if(iscie) { + la = params->locallab.spots.at(sp).sourceabscie; + la2 = params->locallab.spots.at(sp).targabscie; + } else { + la = params->locallab.spots.at(sp).sourceabs; + la2 = params->locallab.spots.at(sp).targabs; + } } const float pilot = 2.f; const float pilotout = 2.f; - + double avgm = 0.; //algoritm's params float yb = 18.f; yb2 = 18; if(ciec) { - yb = params->locallab.spots.at(sp).targetGray;//target because we are after Log encoding - - yb2 = params->locallab.spots.at(sp).targetGray; + if(iscie) { + yb = params->locallab.spots.at(sp).sourceGraycie;// + avgm = (double) pow_F(0.01f * (yb - 1.f), 0.45f);; + yb2 = params->locallab.spots.at(sp).targetGraycie; + } else { + yb = params->locallab.spots.at(sp).targetGray;//target because we are after Log encoding + yb2 = params->locallab.spots.at(sp).targetGray; + } + } + if(params->locallab.spots.at(sp).expcie && call == 10 && params->locallab.spots.at(sp).modecam == "jz") { + yb = params->locallab.spots.at(sp).sourceGraycie;//for Jz calculate Yb and surround in Lab and cam16 before process Jz + la = params->locallab.spots.at(sp).sourceabscie; + + if (params->locallab.spots.at(sp).sursourcie == "Average") { + f = 1.0f, c = 0.69f, nc = 1.0f; + } else if (params->locallab.spots.at(sp).sursourcie == "Dim") { + f = 0.9f; + c = 0.59f; + nc = 0.9f; + } else if (params->locallab.spots.at(sp).sursourcie == "Dark") { + f = 0.8f; + c = 0.525f; + nc = 0.8f; + } } float schr = 0.f; float mchr = 0.f; float cchr = 0.f; - + float rstprotection = 0.f; + float hue = 0.f; +/* + float mchrz = 0.f; + float schrz = 0.f; + float cchrz = 0.f; +*/ if (ciec) { - - cchr = params->locallab.spots.at(sp).chroml; - if (cchr == -100.0f) { - cchr = -99.8f; - } + if(iscie) { + rstprotection = params->locallab.spots.at(sp).rstprotectcie; + hue = params->locallab.spots.at(sp).huecie; - schr = params->locallab.spots.at(sp).saturl; + cchr = params->locallab.spots.at(sp).chromlcie; + if (cchr == -100.0f) { + cchr = -99.8f; + } - if (schr > 0.f) { - schr = schr / 2.f; //divide sensibility for saturation - } + schr = params->locallab.spots.at(sp).saturlcie; - if (schr == -100.f) { - schr = -99.8f; - } + if (schr > 0.f) { + schr = schr / 2.f; //divide sensibility for saturation + } - mchr = params->locallab.spots.at(sp).colorfl; + if (schr == -100.f) { + schr = -99.8f; + } - if (mchr == -100.0f) { - mchr = -99.8f ; - } - if (mchr == 100.0f) { - mchr = 99.9f; + mchr = params->locallab.spots.at(sp).colorflcie; + + if (mchr == -100.0f) { + mchr = -99.8f ; + } + if (mchr == 100.0f) { + mchr = 99.9f; + } +/* + mchrz = 0.5f * (float) params->locallab.spots.at(sp).colorflzcam; + schrz = 0.5f * (float) params->locallab.spots.at(sp).saturzcam; + cchrz = 0.5f * (float) params->locallab.spots.at(sp).chromzcam; +*/ + } else { + cchr = params->locallab.spots.at(sp).chroml; + if (cchr == -100.0f) { + cchr = -99.8f; + } + + schr = params->locallab.spots.at(sp).saturl; + + if (schr > 0.f) { + schr = schr / 2.f; //divide sensibility for saturation + } + + if (schr == -100.f) { + schr = -99.8f; + } + + mchr = params->locallab.spots.at(sp).colorfl; + + if (mchr == -100.0f) { + mchr = -99.8f ; + } + if (mchr == 100.0f) { + mchr = 99.9f; + } } } @@ -2654,229 +3001,1367 @@ void ImProcFunctions::ciecamloc_02float(int sp, LabImage* lab, int call) float xw1 = xws, yw1 = yws, zw1 = zws, xw2 = xwd, yw2 = ywd, zw2 = zwd; float cz, wh, pfl; int c16 = 16;//always cat16 - Ciecam02::initcam1float(yb, pilot, f, la, xw, yw, zw, n, d, nbb, ncb, cz, aw, wh, pfl, fl, c, c16); + bool c20 = true; + if(c20 && plum > 100.f) { + c16 = 21;//I define 21...for 2021 :) + } + int level_bljz = params->locallab.spots.at(sp).csthresholdjz.getBottomLeft(); + int level_hljz = params->locallab.spots.at(sp).csthresholdjz.getTopLeft(); + int level_brjz = params->locallab.spots.at(sp).csthresholdjz.getBottomRight(); + int level_hrjz = params->locallab.spots.at(sp).csthresholdjz.getTopRight(); + + float alowjz = 1.f; + float blowjz = 0.f; + + if (level_hljz != level_bljz) { + alowjz = 1.f / (level_hljz - level_bljz); + blowjz = -alowjz * level_bljz; + } + + float ahighjz = 1.f; + float bhighjz = 0.f; + + if (level_hrjz != level_brjz) { + ahighjz = 1.f / (level_hrjz - level_brjz); + bhighjz = -ahighjz * level_brjz; + } + float sigmalcjz = params->locallab.spots.at(sp).sigmalcjz; + float jzamountchr = 0.01 * params->locallab.spots.at(sp).thrhjzcie; + bool jzch = params->locallab.spots.at(sp).chjzcie; + double jzamountchroma = 0.01 * settings->amchromajz; + if(jzamountchroma < 0.05) { + jzamountchroma = 0.05; + } + if(jzamountchroma > 2.) { + jzamountchroma = 2.; + } + + Ciecam02::initcam1float(yb, pilot, f, la, xw, yw, zw, n, d, nbb, ncb, cz, aw, wh, pfl, fl, c, c16, plum); const float pow1 = pow_F(1.64f - pow_F(0.29f, n), 0.73f); float nj, nbbj, ncbj, czj, awj, flj; - Ciecam02::initcam2float(yb2, pilotout, f2, la2, xw2, yw2, zw2, nj, dj, nbbj, ncbj, czj, awj, flj, c16); + Ciecam02::initcam2float(yb2, pilotout, f2, la2, xw2, yw2, zw2, nj, dj, nbbj, ncbj, czj, awj, flj, c16, plum); #ifdef __SSE2__ const float reccmcz = 1.f / (c2 * czj); #endif const float epsil = 0.0001f; const float coefQ = 32767.f / wh; + const float coefq = 1 / wh; const float pow1n = pow_F(1.64f - pow_F(0.29f, nj), 0.73f); const float coe = pow_F(fl, 0.25f); const float QproFactor = (0.4f / c) * (aw + 4.0f) ; -#ifdef __SSE2__ - int bufferLength = ((width + 3) / 4) * 4; // bufferLength has to be a multiple of 4 -#endif -#ifdef _OPENMP - #pragma omp parallel if (multiThread) -#endif - { -#ifdef __SSE2__ - // one line buffer per channel and thread - float Jbuffer[bufferLength] ALIGNED16; - float Cbuffer[bufferLength] ALIGNED16; - float hbuffer[bufferLength] ALIGNED16; - float Qbuffer[bufferLength] ALIGNED16; - float Mbuffer[bufferLength] ALIGNED16; - float sbuffer[bufferLength] ALIGNED16; -#endif -#ifdef _OPENMP - #pragma omp for schedule(dynamic, 16) -#endif - for (int i = 0; i < height; i++) { -#ifdef __SSE2__ - // vectorized conversion from Lab to jchqms - int k; - vfloat c655d35 = F2V(655.35f); + if((mocam == 0 || mocam ==2) && call == 0) {//Jz az bz ==> Jz Cz Hz before Ciecam16 + double mini = 1000.; + double maxi = -1000.; + double sum = 0.; + int nc = 0; + double epsiljz = 0.0001; + //Remapping see https://hal.inria.fr/hal-02131890/document I took some ideas in this text, and add my personal adaptation + // image quality assessment of HDR and WCG images https://tel.archives-ouvertes.fr/tel-02378332/document + double adapjz = params->locallab.spots.at(sp).adapjzcie; + double jz100 = params->locallab.spots.at(sp).jz100; + double pl = params->locallab.spots.at(sp).pqremap; + double jzw, azw, bzw; + jzw = 0.18;//Jz white - for (k = 0; k < width - 3; k += 4) { - vfloat x, y, z; - Color::Lab2XYZ(LVFU(lab->L[i][k]), LVFU(lab->a[i][k]), LVFU(lab->b[i][k]), x, y, z); - x = x / c655d35; - y = y / c655d35; - z = z / c655d35; - vfloat J, C, h, Q, M, s; - Ciecam02::xyz2jchqms_ciecam02float(J, C, h, - Q, M, s, F2V(aw), F2V(fl), F2V(wh), - x, y, z, - F2V(xw1), F2V(yw1), F2V(zw1), - F2V(c), F2V(nc), F2V(pow1), F2V(nbb), F2V(ncb), F2V(pfl), F2V(cz), F2V(d), c16); - STVF(Jbuffer[k], J); - STVF(Cbuffer[k], C); - STVF(hbuffer[k], h); - STVF(Qbuffer[k], Q); - STVF(Mbuffer[k], M); - STVF(sbuffer[k], s); - } + bool Qtoj = params->locallab.spots.at(sp).qtoj;//betwwen lightness to brightness + const bool logjz = params->locallab.spots.at(sp).logjz;//log encoding - for (; k < width; k++) { +//calculate min, max, mean for Jz +#ifdef _OPENMP + #pragma omp parallel for reduction(min:mini) reduction(max:maxi) reduction(+:sum) if(multiThread) +#endif + for (int i = 0; i < height; i+=1) { + for (int k = 0; k < width; k+=1) { float L = lab->L[i][k]; float a = lab->a[i][k]; float b = lab->b[i][k]; float x, y, z; //convert Lab => XYZ Color::Lab2XYZ(L, a, b, x, y, z); - x = x / 655.35f; - y = y / 655.35f; - z = z / 655.35f; - float J, C, h, Q, M, s; - Ciecam02::xyz2jchqms_ciecam02float(J, C, h, + x = x / 65535.f; + y = y / 65535.f; + z = z / 65535.f; + double Jz, az, bz; + double xx, yy, zz; + //D50 ==> D65 + xx = (d50_d65[0][0] * (double) x + d50_d65[0][1] * (double) y + d50_d65[0][2] * (double) z); + yy = (d50_d65[1][0] * (double) x + d50_d65[1][1] * (double) y + d50_d65[1][2] * (double) z); + zz = (d50_d65[2][0] * (double) x + d50_d65[2][1] * (double) y + d50_d65[2][2] * (double) z); + + double L_p, M_p, S_p; + bool zcam = z_cam; + + Ciecam02::xyz2jzczhz (Jz, az, bz, xx, yy, zz, pl, L_p, M_p, S_p, zcam); + if(Jz > maxi) { + maxi = Jz; + } + if(Jz < mini) { + mini = Jz; + } + sum += Jz; + // I read bz, az values and Hz ==> with low chroma values Hz are very different from lab always around 1.4 radians ???? for blue... + } + } + nc = height * width; + sum = sum / nc; + maxi += epsiljz; + sum += epsiljz; + //remapping Jz + double ijz100 = 1./jz100; + double ajz = (ijz100 - 1.)/9.;//9 = sqrt(100) - 1 with a parabolic curve after jz100 - we can change for others curve ..log...(you must change also in locallabtool2) + double bjz = 1. - ajz; + //relation between adapjz and Absolute luminance source (La), adapjz =sqrt(La) - see locallabtool2 adapjzcie + double interm = jz100 * (adapjz * ajz + bjz); + double bj = (10. - maxi) / 9.; + double aj = maxi -bj; + double to_screen = (aj * interm + bj) / maxi; + //to screen - remapping of Jz in function real scene absolute luminance + +// if (settings->verbose) { +// printf("ajz=%f bjz=%f adapjz=%f jz100=%f interm=%f to-scrp=%f to_screen=%f\n", ajz, bjz, adapjz, jz100, interm ,to_screenp, to_screen); +// } + double to_one = 1.;//only for calculation in range 0..1 or 0..32768 + to_one = 1 / (maxi * to_screen); + if(adapjz == 10.) {//force original algorithm if La > 10000 + to_screen = 1.; + } + if(Qtoj) { + double xxw = (d50_d65[0][0] * (double) Xw + d50_d65[0][1] * (double) Yw + d50_d65[0][2] * (double) Zw); + double yyw = (d50_d65[1][0] * (double) Xw + d50_d65[1][1] * (double) Yw + d50_d65[1][2] * (double) Zw); + double zzw = (d50_d65[2][0] * (double) Xw + d50_d65[2][1] * (double) Yw + d50_d65[2][2] * (double) Zw); + double L_pa, M_pa, S_pa; + Ciecam02::xyz2jzczhz (jzw, azw, bzw, xxw, yyw, zzw, pl, L_pa, M_pa, S_pa, z_cam); + if (settings->verbose) { //calculate Jz white for use of lightness instead brightness + printf("Jzwhite=%f \n", jzw); + } + + } + const std::unique_ptr temp(new LabImage(width, height)); + const std::unique_ptr tempresid(new LabImage(width, height)); + const std::unique_ptr tempres(new LabImage(width, height)); + array2D JJz(width, height); + array2D Aaz(width, height); + array2D Bbz(width, height); + int highhs = params->locallab.spots.at(sp).hljzcie; + int hltonahs = params->locallab.spots.at(sp).hlthjzcie; + int shadhs = params->locallab.spots.at(sp).shjzcie; + int shtonals = params->locallab.spots.at(sp).shthjzcie; + int radhs = params->locallab.spots.at(sp).radjzcie; + float softjz = (float) params->locallab.spots.at(sp).softjzcie; + + avgm = 0.5 * (sum * to_screen * to_one + avgm);//empirical formula + double miny = 0.1; + double delta = 0.015 * (double) sqrt(std::max(100.f, la) / 100.f);//small adaptation in function La scene + double maxy = 0.65;//empirical value + double maxreal = maxi*to_screen; + double maxjzw = jzw*to_screen; + if (settings->verbose) { + printf("La=%4.1f PU_adap=%2.1f maxi=%f mini=%f mean=%f, avgm=%f to_screen=%f Max_real=%f to_one=%f\n", (double) la, adapjz, maxi, mini, sum, avgm, to_screen, maxreal, to_one); + } + + const float sigmoidlambdajz = params->locallab.spots.at(sp).sigmoidldajzcie; + const float sigmoidthjz = params->locallab.spots.at(sp).sigmoidthjzcie; + const float sigmoidbljz = params->locallab.spots.at(sp).sigmoidbljzcie; + + float thjz = 1.f; + const float atjz = 1.f - sigmoidthjz; + const float btjz = sigmoidthjz; + + const float athjz = sigmoidthjz - 1.f; + const float bthjz = 1; + float powsig = pow_F(sigmoidlambdajz, 0.25f); + const float sigmjz = 1.4f + 25.f *(1.f - powsig);// e^26.4 = 291000000000 + const float bljz = sigmoidbljz; + + double contreal = 0.2 * params->locallab.spots.at(sp).contjzcie; + DiagonalCurve jz_contrast({ + DCT_NURBS, + 0, 0, + avgm - avgm * (0.6 - contreal / 250.0), avgm - avgm * (0.6 + contreal / 250.0), + avgm + (1. - avgm) * (0.6 - contreal / 250.0), avgm + (1. - avgm) * (0.6 + contreal / 250.0), + 1, 1 + }); + //all calculs in double to best results...but slow + double lightreal = 0.2 * params->locallab.spots.at(sp).lightjzcie; + double chromz = params->locallab.spots.at(sp).chromjzcie; + double saturz = params->locallab.spots.at(sp).saturjzcie; + double dhue = 0.0174 * params->locallab.spots.at(sp).huejzcie; + DiagonalCurve jz_light({ + DCT_NURBS, + 0, 0, + miny, miny + lightreal / 150., + maxy, min (1.0, maxy + delta + lightreal / 300.0), + 1, 1 + }); + DiagonalCurve jz_lightn({ + DCT_NURBS, + 0, 0, + max(0.0, miny - lightreal / 150.), miny , + maxy + delta - lightreal / 300.0, maxy + delta, + 1, 1 + }); + bool wavcurvejz = false; + if (locwavCurvejz && locwavutilijz) { + for (int i = 0; i < 500; i++) { + if (locwavCurvejz[i] != 0.5f) { + wavcurvejz = true; + break; + } + } + } + float mjjz = lp.mLjz; + if(wavcurvejz && lp.mLjz == 0.f) { + mjjz = 0.0f;//to enable clarity if need in some cases mjjz = 0.0001f + } + + //log encoding Jz + double gray = 0.15; + const double shadows_range = params->locallab.spots.at(sp).blackEvjz; + const double targetgray = params->locallab.spots.at(sp).targetjz; + double targetgraycor = 0.15; + double dynamic_range = std::max(params->locallab.spots.at(sp).whiteEvjz - shadows_range, 0.5); + const double noise = pow(2., -16.6);//16.6 instead of 16 a little less than others, but we work in double + const double log2 = xlog(2.); + double base = 10.; + double linbase = 10.; + if(logjz) {//with brightness Jz + gray = 0.01 * params->locallab.spots.at(sp).sourceGraycie;//acts as amplifier (gain) : needs same type of modifications than targetgraycor with pow + gray = pow(gray, 1.2);//or 1.15 => modification to increase sensitivity gain, only on defaults, of course we can change this value manually...take into account suuround and Yb Cam16 + targetgraycor = pow(0.01 * targetgray, 1.15);//or 1.2 small reduce effect -> take into account a part of surround (before it was at 1.2) + base = targetgray > 1. && targetgray < 100. && dynamic_range > 0. ? (double) find_gray(std::abs((float) shadows_range) / (float) dynamic_range, (float) (targetgraycor)) : 0.; + linbase = std::max(base, 2.);//2. minimal base log to avoid very bad results + if (settings->verbose) { + printf("Base logarithm encoding Jz=%5.1f\n", linbase); + } + } + + const auto applytojz = + [ = ](double x) -> double { + + x = std::max(x, noise); + x = std::max(x / gray, noise);//gray = gain - before log conversion + x = std::max((xlog(x) / log2 - shadows_range) / dynamic_range, noise);//x in range EV + assert(x == x); + + if (linbase > 0.)//apply log base in function of targetgray blackEvjz and Dynamic Range + { + x = xlog2lin(x, linbase); + } + return x; + }; + +#ifdef _OPENMP + #pragma omp parallel for if(multiThread) +#endif + for (int i = 0; i < height; i++) { + for (int k = 0; k < width; k++) { + float L = lab->L[i][k]; + float a = lab->a[i][k]; + float b = lab->b[i][k]; + float x, y, z; + //convert Lab => XYZ + Color::Lab2XYZ(L, a, b, x, y, z); + x = x / 65535.f; + y = y / 65535.f; + z = z / 65535.f; + double Jz, az, bz;//double need because matrix with const(1.6295499532821566e-11) and others + double xx, yy, zz; + //change WP to D65 + xx = (d50_d65[0][0] * (double) x + d50_d65[0][1] * (double) y + d50_d65[0][2] * (double) z); + yy = (d50_d65[1][0] * (double) x + d50_d65[1][1] * (double) y + d50_d65[1][2] * (double) z); + zz = (d50_d65[2][0] * (double) x + d50_d65[2][1] * (double) y + d50_d65[2][2] * (double) z); + + double L_p, M_p, S_p; + bool zcam = z_cam; + Ciecam02::xyz2jzczhz (Jz, az, bz, xx, yy, zz, pl, L_p, M_p, S_p, zcam); + //remapping Jz + Jz = Jz * to_screen; + az = az * to_screen; + bz = bz * to_screen; + JJz[i][k] = Jz; + Aaz[i][k] = az; + Bbz[i][k] = bz; + if(highhs > 0 || shadhs > 0 || wavcurvejz || mjjz != 0.f || lp.mCjz != 0.f || LHcurvejz || HHcurvejz || CHcurvejz) { + //here we work in float with usual functions SH / wavelets / curves H + temp->L[i][k] = tempresid->L[i][k] = tempres->L[i][k] = (float) to_one * 32768.f * (float) JJz[i][k]; + temp->a[i][k] = tempresid->a[i][k] = tempres->a[i][k] = (float) to_one * 32768.f * (float) Aaz[i][k]; + temp->b[i][k] = tempresid->b[i][k] = tempres->b[i][k] = (float) to_one * 32768.f * (float) Bbz[i][k]; + } + } + } + + if(highhs > 0 || shadhs > 0) { + ImProcFunctions::shadowsHighlights(temp.get(), true, 1, highhs, shadhs, radhs, sk, hltonahs * maxi * to_screen * to_one, shtonals * maxi * to_screen * to_one); +#ifdef _OPENMP + #pragma omp parallel for if(multiThread) +#endif + for (int i = 0; i < height; i++) { + for (int k = 0; k < width; k++) {//reinitialize datas after SH...: guide, etc. + tempresid->L[i][k] = tempres->L[i][k] = temp->L[i][k]; + tempresid->a[i][k] = tempres->a[i][k] = temp->a[i][k]; + tempresid->b[i][k] = tempres->b[i][k] = temp->b[i][k]; + } + } + } + //others "Lab" threatment...to adapt + + if(wavcurvejz || mjjz != 0.f || lp.mCjz != 0.f) {//local contrast wavelet and clarity +#ifdef _OPENMP + const int numThreads = omp_get_max_threads(); +#else + const int numThreads = 1; + +#endif + // adap maximum level wavelet to size of RT-spot + int wavelet_level = 1 + params->locallab.spots.at(sp).csthresholdjz.getBottomRight();//retrieve with +1 maximum wavelet_level + int minwin = rtengine::min(width, height); + int maxlevelspot = 10;//maximum possible + + // adapt maximum level wavelet to size of crop + while ((1 << maxlevelspot) >= (minwin * sk) && maxlevelspot > 1) { + --maxlevelspot ; + } + + + wavelet_level = rtengine::min(wavelet_level, maxlevelspot); + int maxlvl = wavelet_level; + //simple local contrast in function luminance + if (locwavCurvejz && locwavutilijz && wavcurvejz) { + float strengthjz = 1.2; + std::unique_ptr wdspot(new wavelet_decomposition(temp->L[0], bfw, bfh, maxlvl, 1, sk, numThreads, lp.daubLen));//lp.daubLen + if (wdspot->memory_allocation_failed()) { + return; + } + maxlvl = wdspot->maxlevel(); + wavlc(*wdspot, level_bljz, level_hljz, maxlvl, level_hrjz, level_brjz, ahighjz, bhighjz, alowjz, blowjz, sigmalcjz, strengthjz, locwavCurvejz, numThreads); + wdspot->reconstruct(temp->L[0], 1.f); + + } + float thr = 0.001f; + int flag = 2; + + // begin clarity wavelet jz + if(mjjz != 0.f || lp.mCjz != 0.f) { + float mL0 = 0.f; + float mC0 = 0.f; + bool exec = false; + float mL = mjjz; + float mC = lp.mCjz; + clarimerge(lp, mL, mC, exec, tempresid.get(), wavelet_level, sk, numThreads); + + if (maxlvl <= 4) { + mL0 = 0.f; + mC0 = 0.f; + mL = -1.5f * mL;//increase only for sharpen + mC = -mC; + thr = 1.f; + flag = 0; + + } else { + mL0 = mL; + mC0 = mC; + thr = 1.f; + flag = 2; + } + LabImage *mergfile = temp.get(); +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int x = 0; x < height; x++) + for (int y = 0; y < width; y++) { + temp->L[x][y] = clipLoc((1.f + mL0) * mergfile->L[x][y] - mL * tempresid->L[x][y]); + temp->a[x][y] = clipC((1.f + mC0) * mergfile->a[x][y] - mC * tempresid->a[x][y]); + temp->b[x][y] = clipC((1.f + mC0) * mergfile->b[x][y] - mC * tempresid->b[x][y]); + } + } + + if (lp.softrjz >= 0.5f && (wavcurvejz || std::fabs(mjjz) > 0.001f)) {//guidedfilter + softproc(tempres.get(), temp.get(), lp.softrjz, height, width, 0.001, 0.00001, thr, sk, multiThread, flag); + } + } + +//new curves Hz +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int i = 0; i < height; i++) { + for (int k = 0; k < width; k++) { + float j_z = temp->L[i][k]; + float C_z = sqrt(SQR(temp->a[i][k]) + SQR(temp->b[i][k])); + float c_z = C_z / 32768.f; + if (loclhCurvejz && LHcurvejz) {//Jz=f(Hz) curve + float kcz = (float) jzamountchr; + float Hz = xatan2f (temp->b[i][k], temp->a[i][k]); + float l_r = j_z / 32768.f; + float kcc = SQR(c_z / kcz); + jzch = true; + if(jzch == false) { + kcc = 1.f; + } else if(kcc > 1.f) { + kcc = 1.f; //cbrt(kcc); + } + float valparam = loclhCurvejz[500.f *static_cast(Color::huejz_to_huehsv2((float) Hz))] - 0.5f; + + float valparamneg; + valparamneg = valparam; + valparam *= 2.f * kcc; + valparamneg *= kcc; + if (valparam > 0.f) { + l_r = (1.f - valparam) * l_r + valparam * (1.f - SQR(((SQR(1.f - min(l_r, 1.0f)))))); + } else + //for negative + { + float khue = 1.9f; //in reserve in case of! + l_r *= (1.f + khue * valparamneg); + } + temp->L[i][k] = l_r * 32768.f; + } + + if (locchCurvejz && CHcurvejz) {//Cz=f(Hz) curve + float Hz = xatan2f (temp->b[i][k], temp->a[i][k]); + const float valparam = 1.5f * (locchCurvejz[500.f * static_cast(Color::huejz_to_huehsv2((float)Hz))] - 0.5f); //get valp=f(H) + float chromaCzfactor = 1.0f + valparam; + temp->a[i][k] *= chromaCzfactor; + temp->b[i][k] *= chromaCzfactor; + } + + + if (lochhCurvejz && HHcurvejz) { // Hz=f(Hz) + float Hz = xatan2f (temp->b[i][k], temp->a[i][k]); + const float valparam = 1.4f * (lochhCurvejz[500.f * static_cast(Color::huejz_to_huehsv2((float)Hz))] - 0.5f) + static_cast(Hz); + Hz = valparam; + if ( Hz < 0.0f ) { + Hz += (2.f * rtengine::RT_PI_F); + } + + float2 sincosval = xsincosf(Hz); + temp->a[i][k] = C_z * sincosval.y; + temp->b[i][k] = C_z * sincosval.x; + } + } + } + + if (loclhCurvejz && LHcurvejz && softjz > 0.f) {//Guidedilter for artifacts curve J(H) + float thr = 0.00001f; + int flag = 2; + float softjzr = 0.05f * softjz; + softproc(tempres.get(), temp.get(), softjzr, height, width, 0.000001, 0.00000001, thr, sk, multiThread, flag); + } + + + if ((lochhCurvejz && HHcurvejz) || (locchCurvejz && CHcurvejz)) { //for artifacts curve H(H) + if(softjz > 0.f) { + array2D chro(width, height); + array2D hue(width, height); + array2D guid(width, height); + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + hue[y][x] = xatan2f(temp->b[y][x], temp->a[y][x]); + chro[y][x] = sqrt(SQR(temp->b[y][x]) + SQR(temp->a[y][x]))/32768.f; + if ( hue[y][x] < 0.0f ) { + hue[y][x] += (2.f * rtengine::RT_PI_F); + } + hue[y][x] /= (2.f * rtengine::RT_PI_F); + guid[y][x] = tempres->L[y][x] / 32768.f; + } + } + float softr = softjz; + const float tmpblur = softr < 0.f ? -1.f / softr : 1.f + softr; + const int r2 = rtengine::max(10 / sk * tmpblur + 0.2f, 1); + const int r1 = rtengine::max(4 / sk * tmpblur + 0.5f, 1); + constexpr float epsilmax = 0.0005f; + constexpr float epsilmin = 0.0000001f; + constexpr float aepsil = (epsilmax - epsilmin) / 100.f; + constexpr float bepsil = epsilmin; + const float epsil = softr < 0.f ? 0.001f : aepsil * softr + bepsil; + if (lochhCurvejz && HHcurvejz) { + rtengine::guidedFilter(guid, hue, hue, r2, 0.5f * epsil, multiThread); + } + if (locchCurvejz && CHcurvejz) { + rtengine::guidedFilter(guid, chro, chro, r1, 0.4f * epsil, multiThread); + } + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + hue[y][x] *= (2.f * rtengine::RT_PI_F); + chro[y][x] *= 32768.f; + float2 sincosval = xsincosf(hue[y][x]); + temp->a[y][x] = chro[y][x] * sincosval.y; + temp->b[y][x] = chro[y][x] * sincosval.x; + } + } + } + } + + +/////////////////// + + +#ifdef _OPENMP + #pragma omp parallel for if(multiThread) +#endif + for (int i = 0; i < height; i++) { + for (int k = 0; k < width; k++) { + //reconvert to double + if(highhs > 0 || shadhs > 0 || wavcurvejz || mjjz != 0.f || lp.mCjz != 0.f || LHcurvejz || HHcurvejz || CHcurvejz) { + //now we work in double necessary for matrix conversion and when in range 0..1 with use of PQ + JJz[i][k] = (double) (temp->L[i][k] / (32768.f * (float) to_one)); + Aaz[i][k] = (double) (temp->a[i][k] / (32768.f * (float) to_one)); + Bbz[i][k] = (double) (temp->b[i][k] / (32768.f * (float) to_one)); + } + + double az = Aaz[i][k]; + double bz = Bbz[i][k]; + double Jz = LIM01(JJz[i][k]); + Jz *= to_one; + double Cz = sqrt(az * az + bz * bz); + //log encoding + if(logjz) { + double jmz = Jz; + if (jmz > noise) { + double mm = applytojz(jmz); + double f = mm / jmz; + Jz *= f; + //Cz *= f; + Jz = LIM01(Jz);//clip values + //Cz = clipcz(Cz); + } + } + //sigmoid + if(issigjz && iscie) {//sigmoid Jz + float val = Jz; + if(islogjz) { + val = std::max((xlog(Jz) / log2 - shadows_range) / dynamic_range, noise);//in range EV + } + if(sigmoidthjz >= 1.f) { + thjz = athjz * val + bthjz;//threshold + } else { + thjz = atjz * val + btjz; + } + sigmoidla (val, thjz, sigmjz);//sigmz "slope" of sigmoid + + + Jz = LIM01((double) bljz * Jz + (double) val); + } + + if(Qtoj == true) {//lightness instead of brightness + Jz /= to_one; + Jz /= maxjzw;//Jz white + Jz = SQR(Jz); + } + //contrast + Jz= LIM01(jz_contrast.getVal(LIM01(Jz))); + //brightness and lightness + if(lightreal > 0) { + Jz = LIM01(jz_light.getVal(Jz)); + } + if(lightreal < 0) { + Jz = LIM01(jz_lightn.getVal(Jz)); + } + //Jz (Jz) curve + double Jzold = Jz; + if(jzlocalcurve && localjzutili) { + Jz = (double) (jzlocalcurve[(float) Jz * 65535.f] / 65535.f); + Jz = 0.3 * (Jz - Jzold) + Jzold; + } + //reconvert from lightness or Brightness + if(Qtoj == false) { + Jz /= to_one; + } else { + Jz = sqrt(Jz); + Jz *= maxjzw; + } + + double Hz; + //remapping Cz + Hz = xatan2 ( bz, az ); + double Czold = Cz; + //Cz(Cz) curve + if(czlocalcurve && localczutili) { + Cz = (double) (czlocalcurve[(float) Cz * 92666.f * (float) to_one] / (92666.f * (float) to_one)); + Cz = 0.5 * (Cz - Czold) + Czold; + } + //Cz(Jz) curve + if(czjzlocalcurve && localczjzutili) { + double chromaCfactor = (double) (czjzlocalcurve[(float) Jz * 65535.f * (float) to_one]) / (Jz * 65535. * to_one); + Cz *= chromaCfactor; + } + //Hz in 0 2*PI + if ( Hz < 0.0 ) { + Hz += (2. * rtengine::RT_PI); + } + //Chroma slider + if(chromz < 0.) { + Cz = Cz * (1. + 0.01 * chromz); + } else { + double maxcz = czlim / to_one; + double fcz = Cz / maxcz; + double pocz = pow(fcz , 1. - 0.0024 * chromz);//increase value - before 0.0017 + Cz = maxcz * pocz; + // Cz = Cz * (1. + 0.005 * chromz);//linear + } + //saturation slider + if(saturz != 0.) { + double js = Jz/ maxjzw;//divide by Jz white + js = SQR(js); + if(js <= 0.) { + js = 0.0000001; + } + double Sz = Cz / (js); + if(saturz < 0.) { + Sz = Sz * (1. + 0.01 * saturz); + } else { + Sz = Sz * (1. + 0.003 * saturz);//not pow function because Sz is "open" - 0.003 empirical value to have results comparable to Cz + } + Cz = Sz * js; + } + + //rotation hue + Hz += dhue; + if ( Hz < 0.0 ) { + Hz += (2. * rtengine::RT_PI); + } + Cz = clipcz(Cz); + double2 sincosval = xsincos(Hz); + az = clipazbz(Cz * sincosval.y); + bz = clipazbz(Cz * sincosval.x); + Cz = sqrt(az * az + bz * bz); + + + bz = bz / (to_screen); + az = az / (to_screen); + + Jz = LIM01(Jz / (to_screen)); + if(jabcie) {//Not used does not work at all + Jz = clipjz05(Jz); + gamutjz (Jz, az, bz, pl, wip, 0.94, 0.004); + } + + double L_, M_, S_; + double xx, yy, zz; + bool zcam = z_cam; + //reconvert to XYZ in double + Ciecam02::jzczhzxyz (xx, yy, zz, Jz, az, bz, pl, L_, M_, S_, zcam); + //re enable D50 + double x, y, z; + x = 65535. * (d65_d50[0][0] * xx + d65_d50[0][1] * yy + d65_d50[0][2] * zz); + y = 65535. * (d65_d50[1][0] * xx + d65_d50[1][1] * yy + d65_d50[1][2] * zz); + z = 65535. * (d65_d50[2][0] * xx + d65_d50[2][1] * yy + d65_d50[2][2] * zz); + + float Ll, aa, bb; + Color::XYZ2Lab(x, y, z, Ll, aa, bb); + lab->L[i][k] = Ll; + lab->a[i][k] = aa; + lab->b[i][k] = bb; + } + } + } + +if(mocam == 0 || mocam == 1 || call == 1 || call == 2 || call == 10) {//call=2 vibrance warm-cool - call = 10 take into account "mean luminance Yb for Jz +//begin ciecam + if (settings->verbose && (mocam == 0 || mocam == 1 || call == 1)) {//display only if choice cam16 + //informations on Cam16 scene conditions - allows user to see choices's incidences + float maxicam = -1000.f; + float maxicamq = -1000.f; + float maxisat = -1000.f; + float maxiM = -1000.f; + float minicam = 1000000.f; + float minicamq = 1000000.f; + float minisat = 1000000.f; + float miniM = 1000000.f; + int nccam = 0; + float sumcam = 0.f; + float sumcamq = 0.f; + float sumsat = 0.f; + float sumM = 0.f; + if(lp.logena && !(params->locallab.spots.at(sp).expcie && mocam == 1)) {//Log encoding only, but enable for log encoding if we use Cam16 module both with log encoding + plum = 100.f; + } + +#ifdef _OPENMP + #pragma omp parallel for reduction(min:minicam) reduction(max:maxicam) reduction(min:minicamq) reduction(max:maxicamq) reduction(min:minisat) reduction(max:maxisat) reduction(min:miniM) reduction(max:maxiM) reduction(+:sumcam) reduction(+:sumcamq) reduction(+:sumsat) reduction(+:sumM)if(multiThread) +#endif + for (int i = 0; i < height; i+=1) { + for (int k = 0; k < width; k+=1) { + float L = lab->L[i][k]; + float a = lab->a[i][k]; + float b = lab->b[i][k]; + float x, y, z; + //convert Lab => XYZ + Color::Lab2XYZ(L, a, b, x, y, z); + x = x / 655.35f; + y = y / 655.35f; + z = z / 655.35f; + float J, C, h, Q, M, s; + Ciecam02::xyz2jchqms_ciecam02float(J, C, h, Q, M, s, aw, fl, wh, x, y, z, xw1, yw1, zw1, - c, nc, pow1, nbb, ncb, pfl, cz, d, c16); - Jbuffer[k] = J; - Cbuffer[k] = C; - hbuffer[k] = h; - Qbuffer[k] = Q; - Mbuffer[k] = M; - sbuffer[k] = s; + c, nc, pow1, nbb, ncb, pfl, cz, d, c16, plum); + if(J > maxicam) { + maxicam = J; + } + if(J < minicam) { + minicam = J; + } + sumcam += J; + + if(Q > maxicamq) { + maxicamq = Q; + } + if(Q < minicamq) { + minicamq = Q; + } + sumcamq += Q; + + if(s > maxisat) { + maxisat = s; + } + if(s < minisat) { + minisat = s; + } + sumsat += s; + + if(M > maxiM) { + maxiM = M; + } + if(M < miniM) { + miniM = M; + } + sumM += M; + } + } + nccam = height * width; + sumcam = sumcam / nccam; + sumcamq /= nccam; + sumsat /= nccam; + sumM /= nccam; + + printf("Cam16 Scene Lighness_J Brightness_Q- HDR-PQ=%5.1f minJ=%3.1f maxJ=%3.1f meanJ=%3.1f minQ=%3.1f maxQ=%4.1f meanQ=%4.1f\n", (double) plum, (double) minicam, (double) maxicam, (double) sumcam, (double) minicamq, (double) maxicamq, (double) sumcamq); + printf("Cam16 Scene Saturati-s Colorfulln_M- minSat=%3.1f maxSat=%3.1f meanSat=%3.1f minM=%3.1f maxM=%3.1f meanM=%3.1f\n", (double) minisat, (double) maxisat, (double) sumsat, (double) miniM, (double) maxiM, (double) sumM); +} + + + +//Ciecam "old" code not change except sigmoid added +#ifdef __SSE2__ + int bufferLength = ((width + 3) / 4) * 4; // bufferLength has to be a multiple of 4 +#endif +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { +#ifdef __SSE2__ + // one line buffer per channel and thread + float Jbuffer[bufferLength] ALIGNED16; + float Cbuffer[bufferLength] ALIGNED16; + float hbuffer[bufferLength] ALIGNED16; + float Qbuffer[bufferLength] ALIGNED16; + float Mbuffer[bufferLength] ALIGNED16; + float sbuffer[bufferLength] ALIGNED16; +#endif +#ifdef _OPENMP + #pragma omp for schedule(dynamic, 16) +#endif + for (int i = 0; i < height; i++) { +#ifdef __SSE2__ + // vectorized conversion from Lab to jchqms + int k; + vfloat c655d35 = F2V(655.35f); + + for (k = 0; k < width - 3; k += 4) { + vfloat x, y, z; + Color::Lab2XYZ(LVFU(lab->L[i][k]), LVFU(lab->a[i][k]), LVFU(lab->b[i][k]), x, y, z); + x = x / c655d35; + y = y / c655d35; + z = z / c655d35; + vfloat J, C, h, Q, M, s; + Ciecam02::xyz2jchqms_ciecam02float(J, C, h, + Q, M, s, F2V(aw), F2V(fl), F2V(wh), + x, y, z, + F2V(xw1), F2V(yw1), F2V(zw1), + F2V(c), F2V(nc), F2V(pow1), F2V(nbb), F2V(ncb), F2V(pfl), F2V(cz), F2V(d), c16, F2V(plum)); + STVF(Jbuffer[k], J); + STVF(Cbuffer[k], C); + STVF(hbuffer[k], h); + STVF(Qbuffer[k], Q); + STVF(Mbuffer[k], M); + STVF(sbuffer[k], s); + } + + for (; k < width; k++) { + float L = lab->L[i][k]; + float a = lab->a[i][k]; + float b = lab->b[i][k]; + float x, y, z; + //convert Lab => XYZ + Color::Lab2XYZ(L, a, b, x, y, z); + x = x / 655.35f; + y = y / 655.35f; + z = z / 655.35f; + float J, C, h, Q, M, s; + Ciecam02::xyz2jchqms_ciecam02float(J, C, h, + Q, M, s, aw, fl, wh, + x, y, z, + xw1, yw1, zw1, + c, nc, pow1, nbb, ncb, pfl, cz, d, c16, plum); + Jbuffer[k] = J; + Cbuffer[k] = C; + hbuffer[k] = h; + Qbuffer[k] = Q; + Mbuffer[k] = M; + sbuffer[k] = s; + } #endif // __SSE2__ - for (int j = 0; j < width; j++) { - float J, C, h, Q, M, s; + for (int j = 0; j < width; j++) { + float J, C, h, Q, M, s; #ifdef __SSE2__ // use precomputed values from above - J = Jbuffer[j]; - C = Cbuffer[j]; - h = hbuffer[j]; - Q = Qbuffer[j]; - M = Mbuffer[j]; - s = sbuffer[j]; + J = Jbuffer[j]; + C = Cbuffer[j]; + h = hbuffer[j]; + Q = Qbuffer[j]; + M = Mbuffer[j]; + s = sbuffer[j]; #else - float x, y, z; - float L = lab->L[i][j]; - float a = lab->a[i][j]; - float b = lab->b[i][j]; - float x1, y1, z1; - //convert Lab => XYZ - Color::Lab2XYZ(L, a, b, x1, y1, z1); - x = x1 / 655.35f; - y = y1 / 655.35f; - z = z1 / 655.35f; - //process source==> normal - Ciecam02::xyz2jchqms_ciecam02float(J, C, h, + float x, y, z; + float L = lab->L[i][j]; + float a = lab->a[i][j]; + float b = lab->b[i][j]; + float x1, y1, z1; + //convert Lab => XYZ + Color::Lab2XYZ(L, a, b, x1, y1, z1); + x = x1 / 655.35f; + y = y1 / 655.35f; + z = z1 / 655.35f; + //process source==> normal + Ciecam02::xyz2jchqms_ciecam02float(J, C, h, Q, M, s, aw, fl, wh, x, y, z, xw1, yw1, zw1, - c, nc, pow1, nbb, ncb, pfl, cz, d, c16); + c, nc, pow1, nbb, ncb, pfl, cz, d, c16, plum); #endif - float Jpro, Cpro, hpro, Qpro, Mpro, spro; - Jpro = J; - Cpro = C; - hpro = h; - Qpro = Q; - Mpro = M; - spro = s; - /* - */ - if(ciec) { - Qpro = CAMBrightCurveQ[(float)(Qpro * coefQ)] / coefQ; //brightness and contrast - float rstprotection = 50.f;//default value to avoid 1 slider - // float chr = 0.f;//no use of chroma - float Mp, sres; - Mp = Mpro / 100.0f; - Ciecam02::curvecolorfloat(mchr, Mp, sres, 2.5f); - float dred = 100.f; //in C mode - float protect_red = 80.0f; // in C mode - dred *= coe; //in M mode - protect_red *= coe; //M mode - Color::skinredfloat(Jpro, hpro, sres, Mp, dred, protect_red, 0, rstprotection, 100.f, Mpro); - Jpro = SQR((10.f * Qpro) / wh); - Qpro = (Qpro == 0.f ? epsil : Qpro); // avoid division by zero - spro = 100.0f * sqrtf(Mpro / Qpro); + float Jpro, Cpro, hpro, Qpro, Mpro, spro; + Jpro = J; + Cpro = C; + hpro = h; + Qpro = Q; + Mpro = M; + spro = s; + /* + */ + if(ciec) { + bool jp = false; + if ((cielocalcurve && localcieutili) && mecamcurve == 1) { + jp = true; + float Qq = Qpro * coefQ; + float Qold = Qpro; + Qq = 0.5f * cielocalcurve[Qq * 2.f]; + Qq = Qq / coefQ; + Qpro = 0.2f * (Qq - Qold) + Qold; + if(jp) { + Jpro = SQR((10.f * Qpro) / wh); + } + } - if (Jpro > 99.9f) { - Jpro = 99.9f; + Qpro = CAMBrightCurveQ[(float)(Qpro * coefQ)] / coefQ; //brightness and contrast + + if(sigmoidlambda > 0.f && iscie && sigmoidqj == true) {//sigmoid Q only with ciecam module + float val = Qpro * coefq; + if(sigmoidth >= 1.f) { + th = ath * val + bth; + } else { + th = at * val + bt; + } + sigmoidla (val, th, sigm); + float bl2 = 1.f; + Qpro = std::max(bl * Qpro + bl2 * val / coefq, 0.f); + } + + float Mp, sres; + Mp = Mpro / 100.0f; + Ciecam02::curvecolorfloat(mchr, Mp, sres, 2.5f); + float dred = 100.f; //in C mode + float protect_red = 80.0f; // in C mode + dred *= coe; //in M mode + protect_red *= coe; //M mode + Color::skinredfloat(Jpro, hpro, sres, Mp, dred, protect_red, 0, rstprotection, 100.f, Mpro); + Jpro = SQR((10.f * Qpro) / wh); + Qpro = (Qpro == 0.f ? epsil : Qpro); // avoid division by zero + spro = 100.0f * sqrtf(Mpro / Qpro); + + if (Jpro > 99.9f) { + Jpro = 99.9f; + } + + Jpro = CAMBrightCurveJ[(float)(Jpro * 327.68f)]; //lightness CIECAM02 + contrast + + if(sigmoidlambda > 0.f && iscie && sigmoidqj == false) {//sigmoid J only with ciecam module + float val = Jpro / 100.f; + if(sigmoidth >= 1.f) { + th = ath * val + bth; + } else { + th = at * val + bt; + } + sigmoidla (val, th, sigm); + Jpro = 100.f * LIM01(bl * 0.01f * Jpro + val); + if (Jpro > 99.9f) { + Jpro = 99.9f; + } + } + + float Sp = spro / 100.0f; + Ciecam02::curvecolorfloat(schr, Sp, sres, 1.5f); + dred = 100.f; // in C mode + protect_red = 80.0f; // in C mode + dred = 100.0f * sqrtf((dred * coe) / Q); + protect_red = 100.0f * sqrtf((protect_red * coe) / Q); + Color::skinredfloat(Jpro, hpro, sres, Sp, dred, protect_red, 0, rstprotection, 100.f, spro); + Qpro = QproFactor * sqrtf(Jpro); + float Cp = (spro * spro * Qpro) / (1000000.f); + Cpro = Cp * 100.f; + Ciecam02::curvecolorfloat(cchr, Cp, sres, 1.8f); + Color::skinredfloat(Jpro, hpro, sres, Cp, 55.f, 30.f, 1, rstprotection, 100.f, Cpro); + + hpro = hpro + hue; + + if (hpro < 0.0f) { + hpro += 360.0f; //hue + } + + if ((cielocalcurve && localcieutili) && mecamcurve == 0) { + float Jj = (float) Jpro * 327.68f; + float Jold = Jj; + Jj = 0.5f * cielocalcurve[Jj * 2.f]; + Jj = 0.3f * (Jj - Jold) + Jold; //divide sensibility + Jpro = (float)(Jj / 327.68f); + + if (Jpro < 1.f) { + Jpro = 1.f; + } + } + if (cielocalcurve2 && localcieutili2) { + if(mecamcurve2 == 0) { + float parsat = 0.8f; //0.68; + float coef = 327.68f / parsat; + float Cc = (float) Cpro * coef; + float Ccold = Cc; + Cc = 0.5f * cielocalcurve2[Cc * 2.f]; + float dred = 55.f; + float protect_red = 30.0f; + int sk1 = 1; + float ko = 1.f / coef; + Color::skinredfloat(Jpro, hpro, Cc, Ccold, dred, protect_red, sk1, rstprotection, ko, Cpro); + } else if (mecamcurve2 == 1) { + float parsat = 0.8f; //0.6 + float coef = 327.68f / parsat; + float Ss = (float) spro * coef; + float Sold = Ss; + Ss = 0.5f * cielocalcurve2[Ss * 2.f]; + Ss = 0.6f * (Ss - Sold) + Sold; //divide sensibility saturation + float dred = 100.f; // in C mode + float protect_red = 80.0f; // in C mode + dred = 100.0f * sqrtf((dred * coe) / Qpro); + protect_red = 100.0f * sqrtf((protect_red * coe) / Qpro); + float ko = 1.f / coef; + Color::skinredfloat(Jpro, hpro, Ss, Sold, dred, protect_red, 0, rstprotection, ko, spro); + Qpro = (4.0f / c) * sqrtf(Jpro / 100.0f) * (aw + 4.0f) ; + Cpro = (spro * spro * Qpro) / (10000.0f); + } else if (mecamcurve2 == 2) { + float parsat = 0.8f; //0.68; + float coef = 327.68f / parsat; + float Mm = (float) Mpro * coef; + float Mold = Mm; + Mm = 0.5f * cielocalcurve2[Mm * 2.f]; + float dred = 100.f; //in C mode + float protect_red = 80.0f; // in C mode + dred *= coe; //in M mode + protect_red *= coe; + float ko = 1.f / coef; + Color::skinredfloat(Jpro, hpro, Mm, Mold, dred, protect_red, 0, rstprotection, ko, Mpro); + Cpro = Mpro / coe; + } + } + } - Jpro = CAMBrightCurveJ[(float)(Jpro * 327.68f)]; //lightness CIECAM02 + contrast - float Sp = spro / 100.0f; - Ciecam02::curvecolorfloat(schr, Sp, sres, 1.5f); - dred = 100.f; // in C mode - protect_red = 80.0f; // in C mode - dred = 100.0f * sqrtf((dred * coe) / Q); - protect_red = 100.0f * sqrtf((protect_red * coe) / Q); - Color::skinredfloat(Jpro, hpro, sres, Sp, dred, protect_red, 0, rstprotection, 100.f, spro); - Qpro = QproFactor * sqrtf(Jpro); - float Cp = (spro * spro * Qpro) / (1000000.f); - Cpro = Cp * 100.f; - Ciecam02::curvecolorfloat(cchr, Cp, sres, 1.8f); - Color::skinredfloat(Jpro, hpro, sres, Cp, 55.f, 30.f, 1, rstprotection, 100.f, Cpro); - } - - //retrieve values C,J...s - C = Cpro; - J = Jpro; - Q = Qpro; - M = Mpro; - h = hpro; - s = spro; + //retrieve values C,J...s + C = Cpro; + J = Jpro; + Q = Qpro; + M = Mpro; + h = hpro; + s = spro; #ifdef __SSE2__ - // write to line buffers - Jbuffer[j] = J; - Cbuffer[j] = C; - hbuffer[j] = h; + // write to line buffers + Jbuffer[j] = J; + Cbuffer[j] = C; + hbuffer[j] = h; #else - float xx, yy, zz; - //process normal==> viewing + float xx, yy, zz; + //process normal==> viewing - Ciecam02::jch2xyz_ciecam02float(xx, yy, zz, + Ciecam02::jch2xyz_ciecam02float(xx, yy, zz, J, C, h, xw2, yw2, zw2, - c2, nc2, pow1n, nbbj, ncbj, flj, czj, dj, awj, c16); - x = xx * 655.35f; - y = yy * 655.35f; - z = zz * 655.35f; - float Ll, aa, bb; - //convert xyz=>lab - Color::XYZ2Lab(x, y, z, Ll, aa, bb); - lab->L[i][j] = Ll; - lab->a[i][j] = aa; - lab->b[i][j] = bb; + c2, nc2, pow1n, nbbj, ncbj, flj, czj, dj, awj, c16, plum); + x = CLIP(xx * 655.35f); + y = CLIP(yy * 655.35f); + z = CLIP(zz * 655.35f); + float Ll, aa, bb; + //convert xyz=>lab + Color::XYZ2Lab(x, y, z, Ll, aa, bb); + lab->L[i][j] = Ll; + lab->a[i][j] = aa; + lab->b[i][j] = bb; #endif - } + } #ifdef __SSE2__ - // process line buffers - float *xbuffer = Qbuffer; - float *ybuffer = Mbuffer; - float *zbuffer = sbuffer; + // process line buffers + float *xbuffer = Qbuffer; + float *ybuffer = Mbuffer; + float *zbuffer = sbuffer; - for (k = 0; k < bufferLength; k += 4) { - vfloat x, y, z; - Ciecam02::jch2xyz_ciecam02float(x, y, z, + for (k = 0; k < bufferLength; k += 4) { + vfloat x, y, z; + Ciecam02::jch2xyz_ciecam02float(x, y, z, LVF(Jbuffer[k]), LVF(Cbuffer[k]), LVF(hbuffer[k]), F2V(xw2), F2V(yw2), F2V(zw2), - F2V(nc2), F2V(pow1n), F2V(nbbj), F2V(ncbj), F2V(flj), F2V(dj), F2V(awj), F2V(reccmcz), c16); - STVF(xbuffer[k], x * c655d35); - STVF(ybuffer[k], y * c655d35); - STVF(zbuffer[k], z * c655d35); - } + F2V(nc2), F2V(pow1n), F2V(nbbj), F2V(ncbj), F2V(flj), F2V(dj), F2V(awj), F2V(reccmcz), c16, F2V(plum)); + STVF(xbuffer[k], x * c655d35); + STVF(ybuffer[k], y * c655d35); + STVF(zbuffer[k], z * c655d35); + } - // XYZ2Lab uses a lookup table. The function behind that lut is a cube root. - // SSE can't beat the speed of that lut, so it doesn't make sense to use SSE - for (int j = 0; j < width; j++) { - float Ll, aa, bb; - //convert xyz=>lab - Color::XYZ2Lab(xbuffer[j], ybuffer[j], zbuffer[j], Ll, aa, bb); + // XYZ2Lab uses a lookup table. The function behind that lut is a cube root. + // SSE can't beat the speed of that lut, so it doesn't make sense to use SSE + for (int j = 0; j < width; j++) { + float Ll, aa, bb; + //convert xyz=>lab + xbuffer[j] = CLIP(xbuffer[j]); + ybuffer[j] = CLIP(ybuffer[j]); + zbuffer[j] = CLIP(zbuffer[j]); + + Color::XYZ2Lab(xbuffer[j], ybuffer[j], zbuffer[j], Ll, aa, bb); - lab->L[i][j] = Ll; - lab->a[i][j] = aa; - lab->b[i][j] = bb; - } + lab->L[i][j] = Ll; + lab->a[i][j] = aa; + lab->b[i][j] = bb; + } #endif - } + } + } } + +if(mocam == 3) {//Zcam not use but keep in case off +/* + double miniiz = 1000.; + double maxiiz = -1000.; + double sumiz = 0.; + int nciz = 0; + double epsilzcam = 0.0001; + double atten = 2700.; + double epsilzcam2 = 1.; + if(mocam == 3) {//Zcam + double pl = params->locallab.spots.at(sp).pqremap; +//calculate min, max, mean for Jz +#ifdef _OPENMP + #pragma omp parallel for reduction(min:miniiz) reduction(max:maxiiz) reduction(+:sumiz) if(multiThread) +#endif + for (int i = 0; i < height; i+=1) { + for (int k = 0; k < width; k+=1) { + float L = lab->L[i][k]; + float a = lab->a[i][k]; + float b = lab->b[i][k]; + float x, y, z; + //convert Lab => XYZ + Color::Lab2XYZ(L, a, b, x, y, z); + x = x / 65535.f; + y = y / 65535.f; + z = z / 65535.f; + double Jz, az, bz; + double xx, yy, zz; + //D50 ==> D65 + xx = (d50_d65[0][0] * (double) x + d50_d65[0][1] * (double) y + d50_d65[0][2] * (double) z); + yy = (d50_d65[1][0] * (double) x + d50_d65[1][1] * (double) y + d50_d65[1][2] * (double) z); + zz = (d50_d65[2][0] * (double) x + d50_d65[2][1] * (double) y + d50_d65[2][2] * (double) z); + xx = LIM01(xx); + yy = LIM01(yy); + zz = LIM01(zz); + + double L_p, M_p, S_p; + bool zcam = true; + Ciecam02::xyz2jzczhz (Jz, az, bz, xx, yy, zz, pl, L_p, M_p, S_p, zcam); + if(Jz > maxiiz) { + maxiiz = Jz; + } + if(Jz < miniiz) { + miniiz = Jz; + } + + sumiz += Jz; + + } + } + nciz = height * width; + sumiz = sumiz / nciz; + sumiz += epsilzcam; + maxiiz += epsilzcam; + if (settings->verbose) { + printf("Zcam miniiz=%f maxiiz=%f meaniz=%f\n", miniiz, maxiiz, sumiz); + } + } + double avgmz = sumiz; + //calculate various parameter for Zcam - those with ** come from documentation Zcam + // ZCAM, a colour appearance model based on a high dynamic range uniform colour space + //Muhammad Safdar, Jon Yngve Hardeberg, and Ming Ronnier Luo + // https://www.osapublishing.org/oe/fulltext.cfm?uri=oe-29-4-6036&id=447640#e12 + double L_p, M_p, S_p; + double jzw, azw, bzw; + bool zcam = true; + double plz = params->locallab.spots.at(sp).pqremap;// to test or change to 10000 +// double po = 0.1 + params->locallab.spots.at(sp).contthreszcam; + float fb_source = sqrt(yb / 100.f); + float fb_dest = sqrt(yb2 / 100.f); + double flz = 0.171 * pow(la, 0.3333333)*(1. - exp(-(48. * (double) la / 9.))); + double fljz = 0.171 * pow(la2, 0.3333333)*(1. - exp(-(48. * (double) la2 / 9.))); + double cpow = 2.2;//empirical + double cpp = pow( (double) c, 0.5);//empirical + double cpp2 = pow( (double) c2, 0.5);//empirical + double pfl = pow(flz, 0.25); + double cmul_source = 1.26;//empirical + double cmul_source_ch = 1.1;//empirical + double achro_source = pow((double) c, cpow)*(pow((double) flz, - 0.004)* (double) sqrt(fb_source));//I think there is an error in formula documentation step 5 - all parameters are inversed or wrong + double achro_dest = pow((double) c2, cpow)*(pow((double) fljz, - 0.004) * (double) sqrt(fb_dest)); + double kk_source = (1.6 * (double) cpp) / pow((double) fb_source, 0.12); + double ikk_dest = pow((double) fb_dest, 0.12) /(1.6 * (double) cpp2); + Ciecam02::xyz2jzczhz (jzw, azw, bzw, Xw, Yw, Zw, plz, L_p, M_p, S_p, zcam); + double eff = 1.; + double kap = 2.7; + if(maxiiz > (kap * sumiz)) { + kap = 1.7; + } + double qzw = cmul_source * atten * pow(jzw, (double) kk_source) / achro_source;//I think there is an error in formula documentation step 5 - all parameters are inversed + double maxforq = kap * sumiz * eff + epsilzcam2; + if(maxforq > maxiiz) { + maxforq = maxiiz; + } else { + maxforq = 0.9 * maxforq + 0.1 * maxiiz; + } + double qzmax = cmul_source * atten * pow(maxforq, (double) kk_source) / achro_source; + double izw = jzw; + double coefm = pow(flz, 0.2) / (pow((double) fb_source, 0.1) * pow(izw, 0.78)); + if (settings->verbose) { + printf("qzw=%f PL=%f qzmax=%f\n", qzw, plz, qzmax);//huge change with PQ peak luminance + } + array2D Iiz(width, height); + array2D Aaz(width, height); + array2D Bbz(width, height); + +//curve to replace LUT , LUT leads to crash... + double contqz = 0.5 * params->locallab.spots.at(sp).contqzcam; + DiagonalCurve qz_contrast({ + DCT_NURBS, + 0, 0, + avgmz - avgmz * (0.6 - contqz / 250.0), avgmz - avgmz * (0.6 + contqz / 250.0), + avgmz + (1. - avgmz) * (0.6 - contqz / 250.0), avgmz + (1. - avgmz) * (0.6 + contqz / 250.0), + 1, 1 + }); + double contlz = 0.6 * params->locallab.spots.at(sp).contlzcam; + DiagonalCurve ljz_contrast({ + DCT_NURBS, + 0, 0, + avgmz - avgmz * (0.6 - contlz / 250.0), avgmz - avgmz * (0.6 + contlz / 250.0), + avgmz + (1. - avgmz) * (0.6 - contlz / 250.0), avgmz + (1. - avgmz) * (0.6 + contlz / 250.0), + 1, 1 + }); + + //all calculs in double to best results...but slow + double lqz = 0.4 * params->locallab.spots.at(sp).lightqzcam; + if(params->locallab.spots.at(sp).lightqzcam < 0) { + lqz = 0.2 * params->locallab.spots.at(sp).lightqzcam; //0.4 less effect, no need 1. + } + DiagonalCurve qz_light({ + DCT_NURBS, + 0, 0, + 0.1, 0.1 + lqz / 150., + 0.7, min (1.0, 0.7 + lqz / 300.0), + 1, 1 + }); + DiagonalCurve qz_lightn({ + DCT_NURBS, + 0, 0, + max(0.0, 0.1 - lqz / 150.), 0.1 , + 0.7 - lqz / 300.0, 0.7, + 1, 1 + }); + double ljz = 0.4 * params->locallab.spots.at(sp).lightlzcam; + if(params->locallab.spots.at(sp).lightlzcam < 0) { + ljz = 0.2 * params->locallab.spots.at(sp).lightlzcam; + } + DiagonalCurve ljz_light({ + DCT_NURBS, + 0, 0, + 0.1, 0.1 + ljz / 150., + 0.7, min (1.0, 0.7 + ljz / 300.0), + 1, 1 + }); + DiagonalCurve ljz_lightn({ + DCT_NURBS, + 0, 0, + max(0.0, 0.1 - ljz / 150.), 0.1 , + 0.7 - ljz / 300.0, 0.7, + 1, 1 + }); + +#ifdef _OPENMP + #pragma omp parallel for if(multiThread) +#endif + for (int i = 0; i < height; i++) { + for (int k = 0; k < width; k++) { + float L = lab->L[i][k]; + float a = lab->a[i][k]; + float b = lab->b[i][k]; + float x, y, z; + //convert Lab => XYZ + Color::Lab2XYZ(L, a, b, x, y, z); + x = x / 65535.f; + y = y / 65535.f; + z = z / 65535.f; + double iz, az, bz; + double xx, yy, zz; + //change WP to D65 + xx = (d50_d65[0][0] * (double) x + d50_d65[0][1] * (double) y + d50_d65[0][2] * (double) z); + yy = (d50_d65[1][0] * (double) x + d50_d65[1][1] * (double) y + d50_d65[1][2] * (double) z); + zz = (d50_d65[2][0] * (double) x + d50_d65[2][1] * (double) y + d50_d65[2][2] * (double) z); + double L_p, M_p, S_p; + bool zcam = true; + Ciecam02::xyz2jzczhz (iz, az, bz, xx, yy, zz, plz, L_p, M_p, S_p, zcam); + Iiz[i][k] = LIM01(iz); + Aaz[i][k] = clipazbz(az); + Bbz[i][k] = clipazbz(bz); + } + } +#ifdef _OPENMP + #pragma omp parallel for if(multiThread) +#endif + for (int i = 0; i < height; i++) { + for (int k = 0; k < width; k++) { + + double az = Aaz[i][k]; + double bz = Bbz[i][k]; + double iz = Iiz[i][k]; + if(iz > kap * sumiz) { + iz = kap * sumiz * eff; + } + float coefqz = (float) qzmax; + float coefjz = 100.f ; + double qz = cmul_source * atten * pow(iz, (double) kk_source) / achro_source;//partial + az *= cmul_source_ch; + bz *= cmul_source_ch; + + qz= (double) coefqz * LIM01(qz_contrast.getVal((float)qz / coefqz)); + + if(lqz > 0) { + qz = (double) coefqz * LIM01(qz_light.getVal((float)qz / coefqz)); + } + if(lqz < 0) { + qz = (double) coefqz * LIM01(qz_lightn.getVal((float)qz / coefqz)); + } + // double jz = 100. * (qz / qzw); + double jz = SQR((10. * qz) / qzw);//formula CAM16 + jz= (double) coefjz * LIM01(ljz_contrast.getVal((float)jz / coefjz)); + if(ljz > 0) { + jz = (double) coefjz * LIM01(ljz_light.getVal((float)jz / coefjz)); + } + if(ljz < 0) { + jz = (double) coefjz * LIM01(ljz_lightn.getVal((float)jz / coefjz)); + } + if(jz > 100.) jz = 99.; + + + //qzpro = 0.01 * jzpro * qzw; + double qzpro = 0.1 * sqrt(jz) * qzw; + iz = LIM01(pow(qzpro / (atten / achro_dest), ikk_dest)); + double h = atan2(bz, az); + if ( h < 0.0 ) { + h += (double) (2.f * rtengine::RT_PI_F); + } + double hp = h * (360 / (double) (2.f * rtengine::RT_PI_F)); + double ez = 1.015 + cos(89.038 + hp); + if(mchrz != 0.f || schrz != 0.f || cchrz != 0.f){ + //colorfullness + double Mpz = 100. * pow(az * az + bz * bz, 0.37)* pow(ez, 0.068) * coefm; + Mpz *= (double) (1.f + 0.01f * mchrz); + float ccz = sqrt(pow((float) (Mpz / (100. * pow(ez, 0.068) * coefm)), (1.f / 0.37f))); + float2 sincosval = xsincosf(h); + az = (double)(ccz * sincosval.y); + bz = (double)(ccz * sincosval.x); + if(schrz != 0.f){ + //saturation + double Spz = 100. * pow(flz, 0.6) * (Mpz / qz); + Spz *= (double) (1.f + 0.01f * schrz); + Mpz = (Spz * qz) / (100.* pow(flz, 0.6)); + ccz = sqrt(pow((float) (Mpz / (100. * pow(ez, 0.068) * coefm)), (1.f / 0.37f))); + az = (double)(ccz * sincosval.y); + bz = (double)(ccz * sincosval.x); + } + if(cchrz != 0.f){ + // double Cpz = 100. * (Mpz / qzw); + double Cpz = 100. * (Mpz / pfl);//Cam16 formula + Cpz *= (double) (1.f + 0.01f * cchrz); + Mpz = (Cpz * pfl) / 100.; + // double Vpz = sqrt(SQR(jz - 58.) + 3.4 * SQR(Cpz));//vividness not working + // Vpz *= (double) (1.f + 0.01f * cchrz); + //Mpz = (Cpz * qzw) / 100.; + // Mpz = 0.01 * qzw * sqrt((SQR(Vpz) - SQR(jz - 58.)) / 3.4); + ccz = sqrt(pow((float) (Mpz / (100. * pow(ez, 0.068) * coefm)), (1.f / 0.37f))); + az = (double)(ccz * sincosval.y); + bz = (double)(ccz * sincosval.x); + } + + } + double L_, M_, S_; + double xx, yy, zz; + bool zcam = true; + iz=LIM01(iz); + az=clipazbz(az); + bz=clipazbz(bz); + + Ciecam02::jzczhzxyz (xx, yy, zz, iz, az, bz, plz, L_, M_, S_, zcam); + //re enable D50 + double x, y, z; + x = 65535. * (d65_d50[0][0] * xx + d65_d50[0][1] * yy + d65_d50[0][2] * zz); + y = 65535. * (d65_d50[1][0] * xx + d65_d50[1][1] * yy + d65_d50[1][2] * zz); + z = 65535. * (d65_d50[2][0] * xx + d65_d50[2][1] * yy + d65_d50[2][2] * zz); + + float Ll, aa, bb; + Color::XYZ2Lab(x, y, z, Ll, aa, bb); + lab->L[i][k] = Ll; + lab->a[i][k] = aa; + lab->b[i][k] = bb; + } + } +*/ +} + + } void ImProcFunctions::softproc(const LabImage* bufcolorig, const LabImage* bufcolfin, float rad, int bfh, int bfw, float epsilmax, float epsilmin, float thres, int sk, bool multiThread, int flag) @@ -2900,7 +4385,7 @@ void ImProcFunctions::softproc(const LabImage* bufcolorig, const LabImage* bufco const float bepsil = epsilmin; //epsilmax - 100.f * aepsil; // const float epsil = aepsil * 0.1f * rad + bepsil; const float epsil = aepsil * rad + bepsil; - const float blur = 10.f / sk * (thres + 0.8f * rad); + const float blur = 10.f / sk * (thres + 0.f * rad); rtengine::guidedFilter(guid, ble, ble, blur, epsil, multiThread, 4); @@ -2931,6 +4416,34 @@ void ImProcFunctions::softproc(const LabImage* bufcolorig, const LabImage* bufco rtengine::guidedFilter(guid, ble, ble, r2, epsil, multiThread); +#ifdef _OPENMP + #pragma omp parallel for if(multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) { + for (int jr = 0; jr < bfw; jr++) { + bufcolfin->L[ir][jr] = 32768.f * ble[ir][jr]; + } + } + } else if (flag == 2) { + +#ifdef _OPENMP + #pragma omp parallel for if(multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) + for (int jr = 0; jr < bfw; jr++) { + ble[ir][jr] = bufcolfin->L[ir][jr] / 32768.f; + guid[ir][jr] = bufcolorig->L[ir][jr] / 32768.f; + } + + const float aepsil = (epsilmax - epsilmin) / 1000.f; + const float bepsil = epsilmin; //epsilmax - 100.f * aepsil; + const float epsil = rad < 0.f ? 0.0001f : aepsil * 10.f * rad + bepsil; + // const float epsil = bepsil; + const float blur = rad < 0.f ? -1.f / rad : 0.00001f + rad; + const int r2 = rtengine::max(int(20.f / sk * blur + 0.000001f), 1); + + rtengine::guidedFilter(guid, ble, ble, r2, epsil, multiThread); + #ifdef _OPENMP #pragma omp parallel for if(multiThread) #endif @@ -3726,7 +5239,7 @@ void ImProcFunctions::InverseBlurNoise_Local(LabImage * originalmask, const stru -static void mean_fab(int xstart, int ystart, int bfw, int bfh, LabImage* bufexporig, const LabImage* original, float &fab, float &meanfab, float chrom, bool multiThread) +static void mean_fab(int xstart, int ystart, int bfw, int bfh, LabImage* bufexporig, int flag, const LabImage* original, float &fab, float &meanfab, float &maxfab, float chrom, bool multiThread) { const int nbfab = bfw * bfh; @@ -3735,38 +5248,56 @@ static void mean_fab(int xstart, int ystart, int bfw, int bfh, LabImage* bufexpo if (nbfab > 0) { double sumab = 0.0; - -#ifdef _OPENMP +#ifdef _OPENMP #pragma omp parallel for reduction(+:sumab) if(multiThread) #else static_cast(multiThread); #endif for (int y = 0; y < bfh; y++) { for (int x = 0; x < bfw; x++) { - bufexporig->a[y][x] = original->a[y + ystart][x + xstart]; - bufexporig->b[y][x] = original->b[y + ystart][x + xstart]; - sumab += static_cast(std::fabs(bufexporig->a[y][x])); - sumab += static_cast(std::fabs(bufexporig->b[y][x])); + if(flag == 0) { + bufexporig->a[y][x] = original->a[y + ystart][x + xstart]; + bufexporig->b[y][x] = original->b[y + ystart][x + xstart]; + } else { + bufexporig->a[y][x] = original->a[y][x]; + bufexporig->b[y][x] = original->b[y][x]; + } + sumab += static_cast(SQR(std::fabs(bufexporig->a[y][x])) + SQR(std::fabs(bufexporig->b[y][x]))); + + // sumab += static_cast(std::fabs(bufexporig->a[y][x])); + // sumab += static_cast(std::fabs(bufexporig->b[y][x])); } } - meanfab = sumab / (2.0 * nbfab); + meanfab = sqrt(sumab / (2.0 * nbfab)); double som = 0.0; - + double maxm = 0.0; #ifdef _OPENMP - #pragma omp parallel for reduction(+:som) if(multiThread) + #pragma omp parallel for reduction(+:som) reduction(max:maxfab)if(multiThread) #endif for (int y = 0; y < bfh; y++) { for (int x = 0; x < bfw; x++) { som += static_cast(SQR(std::fabs(bufexporig->a[y][x]) - meanfab) + SQR(std::fabs(bufexporig->b[y][x]) - meanfab)); + maxm = static_cast(SQR(std::fabs(bufexporig->a[y][x])) + SQR(std::fabs(bufexporig->b[y][x]))); + maxm = sqrt(maxm); + if(maxm > (double) maxfab) { + maxfab = (float) maxm; + } + } } - const float multsigma = (chrom >= 0.f ? 0.035f : 0.018f) * chrom + 1.f; + const float multsigma = 3.f ;//(chrom >= 0.f ? 0.035f : 0.018f) * chrom + 1.f; //disabled an use 2 stddv + const float kf = 0.f; + const float multchrom = 1.f + kf * chrom; //small correction chrom here 0.f const float stddv = std::sqrt(som / nbfab); - fab = meanfab + multsigma * stddv; + float fabprov = meanfab + multsigma * stddv * multchrom;//with 3 sigma about 99% cases + if(fabprov > maxfab) { + fabprov = maxfab; + } + fab = max(fabprov, 0.90f* maxfab);//Find maxi between mean + 3 sigma and 90% max (90 arbitrary empirical value) if (fab <= 0.f) { fab = 50.f; @@ -4569,7 +6100,7 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int const LocwavCurve & loclmasCurvecolwav, bool lmasutilicolwav, int level_bl, int level_hl, int level_br, int level_hr, int shortcu, bool delt, const float hueref, const float chromaref, const float lumaref, float maxdE, float mindE, float maxdElim, float mindElim, float iterat, float limscope, int scope, - bool fftt, float blu_ma, float cont_ma, int indic + bool fftt, float blu_ma, float cont_ma, int indic, float &fab ) @@ -4579,9 +6110,20 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int array2D hue(bfw, bfh); array2D guid(bfw, bfh); const std::unique_ptr bufreserv(new LabImage(bfw, bfh)); - float meanfab, fab; - mean_fab(xstart, ystart, bfw, bfh, bufcolorig, original, fab, meanfab, chrom, multiThread); - float chromult = 1.f - 0.01f * chrom; + float meanfab, corfab; + float maxfab = -1000.f; + float epsi = 0.001f; + mean_fab(xstart, ystart, bfw, bfh, bufcolorig, 0, original, fab, meanfab, maxfab, chrom, multiThread); + corfab = 0.7f * (65535.f) / (fab + epsi);//empirical values 0.7 link to chromult + + // printf("Fab=%f corfab=%f maxfab=%f\n", (double) fab, (double) corfab, (double) maxfab); + float chromult = 1.f; + if(chrom > 0.f){ + chromult = 1.f + 0.003f * chrom; + } else { + chromult = 1.f + 0.01f * chrom; + } + // chromult * corfab * kmaskC float kinv = 1.f; float kneg = 1.f; @@ -4688,6 +6230,133 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int } } +//denoise mask chroma + + + LabImage tmpab(bfw, bfh); + tmpab.clear(true); + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) + for (int jr = 0; jr < bfw; jr++) { + tmpab.L[ir][jr] = bufcolorig->L[ir][jr]; + tmpab.a[ir][jr] = bufcolorig->a[ir][jr]; + tmpab.b[ir][jr] = bufcolorig->b[ir][jr]; + } + float noisevarab_r = SQR(lp.denoichmask / 10.f); + if(noisevarab_r > 0.f) { + int wavelet_leve = 6; + + int minwin1 = rtengine::min(bfw, bfh); + int maxlevelspot1 = 9; + + while ((1 << maxlevelspot1) >= (minwin1 * sk) && maxlevelspot1 > 1) { + --maxlevelspot1 ; + } + + wavelet_leve = rtengine::min(wavelet_leve, maxlevelspot1); + int maxlvl1 = wavelet_leve; +#ifdef _OPENMP + const int numThreads = omp_get_max_threads(); +#else + const int numThreads = 1; + +#endif + + wavelet_decomposition Ldecomp(tmpab.L[0],tmpab.W, tmpab.H, maxlvl1, 1, sk, numThreads, lp.daubLen); + wavelet_decomposition adecomp(tmpab.a[0],tmpab.W, tmpab.H, maxlvl1, 1, sk, numThreads, lp.daubLen); + wavelet_decomposition bdecomp(tmpab.b[0],tmpab.W, tmpab.H, maxlvl1, 1, sk, numThreads, lp.daubLen); + float* noisevarchrom; + noisevarchrom = new float[bfw*bfh]; + float nvch = 0.6f;//high value + float nvcl = 0.1f;//low value + float seuil = 4000.f;//low + float seuil2 = 15000.f;//high + //ac and bc for transition + float ac = (nvch - nvcl) / (seuil - seuil2); + float bc = nvch - seuil * ac; + int bfw2 = (bfw + 1) / 2; + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) + for (int jr = 0; jr < bfw; jr++) { + float cN = std::sqrt(SQR(tmpab.a[ir][jr]) + SQR(tmpab.b[ir][jr])); + + if (cN < seuil) { + noisevarchrom[(ir >> 1)*bfw2 + (jr >> 1)] = nvch; + } else if (cN < seuil2) { + noisevarchrom[(ir >> 1)*bfw2 + (jr >> 1)] = ac * cN + bc; + } else { + noisevarchrom[(ir >> 1)*bfw2 + (jr >> 1)] = nvcl; + } + } + + float madL[8][3]; + int levred = maxlvl1; + if (!Ldecomp.memory_allocation_failed()) { +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic) collapse(2) if (multiThread) +#endif + for (int lvl = 0; lvl < levred; lvl++) { + for (int dir = 1; dir < 4; dir++) { + int Wlvl_L = Ldecomp.level_W(lvl); + int Hlvl_L = Ldecomp.level_H(lvl); + const float* const* WavCoeffs_L = Ldecomp.level_coeffs(lvl); + + madL[lvl][dir - 1] = SQR(Mad(WavCoeffs_L[dir], Wlvl_L * Hlvl_L)); + } + } + } + + if (!adecomp.memory_allocation_failed() && !bdecomp.memory_allocation_failed()) { + WaveletDenoiseAll_BiShrinkAB(Ldecomp, adecomp, noisevarchrom, madL, nullptr, 0, noisevarab_r, true, false, false, numThreads); + WaveletDenoiseAllAB(Ldecomp, adecomp, noisevarchrom, madL, nullptr, 0, noisevarab_r, true, false, false, numThreads); + + WaveletDenoiseAll_BiShrinkAB(Ldecomp, bdecomp, noisevarchrom, madL, nullptr, 0, noisevarab_r, false, false, false, numThreads); + WaveletDenoiseAllAB(Ldecomp, bdecomp, noisevarchrom, madL, nullptr, 0, noisevarab_r, false, false, false, numThreads); + + } + + delete[] noisevarchrom; + + if (!Ldecomp.memory_allocation_failed()) { + Ldecomp.reconstruct(tmpab.L[0]); + } + if (!adecomp.memory_allocation_failed()) { + adecomp.reconstruct(tmpab.a[0]); + } + if (!bdecomp.memory_allocation_failed()) { + bdecomp.reconstruct(tmpab.b[0]); + } + + float meanfab1, fab1, maxfab1; + std::unique_ptr buforig; + buforig.reset(new LabImage(bfw, bfh)); +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) + for (int jr = 0; jr < bfw; jr++) { + buforig->L[ir][jr] = tmpab.L[ir][jr]; + buforig->a[ir][jr] = tmpab.a[ir][jr]; + buforig->b[ir][jr] = tmpab.b[ir][jr]; + } + + + mean_fab(xstart, ystart, bfw, bfh, buforig.get(), 1, buforig.get(), fab1, meanfab1, maxfab1, chrom, multiThread); + // printf("Fab den=%f \n", (double) fab1); + fab = fab1;//fab denoise + + } +// end code denoise mask chroma + + + + #ifdef _OPENMP #pragma omp parallel if (multiThread) #endif @@ -4706,11 +6375,13 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int int i = 0; for (; i < bfw - 3; i += 4) { - STVF(atan2Buffer[i], xatan2f(LVFU(bufcolorig->b[ir][i]), LVFU(bufcolorig->a[ir][i]))); + // STVF(atan2Buffer[i], xatan2f(LVFU(bufcolorig->b[ir][i]), LVFU(bufcolorig->a[ir][i]))); + STVF(atan2Buffer[i], xatan2f(LVFU(tmpab.b[ir][i]), LVFU(tmpab.a[ir][i]))); } for (; i < bfw; i++) { - atan2Buffer[i] = xatan2f(bufcolorig->b[ir][i], bufcolorig->a[ir][i]); + // atan2Buffer[i] = xatan2f(bufcolorig->b[ir][i], bufcolorig->a[ir][i]); + atan2Buffer[i] = xatan2f(tmpab.b[ir][i], tmpab.a[ir][i]); } } @@ -4745,14 +6416,16 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int } if (!deltaE && locccmasCurve && lcmasutili) { - kmaskC = LIM01(kinv - kneg * locccmasCurve[500.f * (0.0001f + std::sqrt(SQR(bufcolorig->a[ir][jr]) + SQR(bufcolorig->b[ir][jr])) / fab)]); + // kmaskC = LIM01(kinv - kneg * locccmasCurve[500.f * (0.0001f + std::sqrt(SQR(bufcolorig->a[ir][jr]) + SQR(bufcolorig->b[ir][jr])) / (fab))]); + kmaskC = LIM01(kinv - kneg * locccmasCurve[500.f * (0.0001f + std::sqrt(SQR(tmpab.a[ir][jr]) + SQR(tmpab.b[ir][jr])) / fab)]); } if (lochhmasCurve && lhmasutili) { #ifdef __SSE2__ const float huema = atan2Buffer[jr]; #else - const float huema = xatan2f(bufcolorig->b[ir][jr], bufcolorig->a[ir][jr]); + // const float huema = xatan2f(bufcolorig->b[ir][jr], bufcolorig->a[ir][jr]); + const float huema = xatan2f(tmpab.b[ir][jr], tmpab.a[ir][jr]); #endif float h = Color::huelab_to_huehsv2(huema); h += 1.f / 6.f; @@ -4771,8 +6444,8 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int } bufmaskblurcol->L[ir][jr] = clipLoc(kmaskL + kmaskHL + kmasstru + kmasblur); - bufmaskblurcol->a[ir][jr] = clipC((kmaskC + chromult * kmaskH)); - bufmaskblurcol->b[ir][jr] = clipC((kmaskC + chromult * kmaskH)); + bufmaskblurcol->a[ir][jr] = clipC((chromult * corfab * kmaskC + chromult * kmaskH)); + bufmaskblurcol->b[ir][jr] = clipC((chromult * corfab * kmaskC + chromult * kmaskH)); if (shortcu == 1) { //short circuit all L curve bufmaskblurcol->L[ir][jr] = 32768.f - bufcolorig->L[ir][jr]; @@ -4788,6 +6461,7 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int } } } + if (lap > 0.f && pde) { array2D mask; mask(bfw, bfh); @@ -5327,7 +7001,6 @@ void ImProcFunctions::Sharp_Local(int call, float **loctemp, int senstype, const const float maxdE = 5.f + MAXSCOPE * varsens * (1 + 0.1f * lp.thr); const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); - #ifdef _OPENMP #pragma omp for schedule(dynamic,16) #endif @@ -6375,7 +8048,7 @@ void ImProcFunctions::calc_ref(int sp, LabImage * original, LabImage * transform if (params->locallab.enabled) { //always calculate hueref, chromaref, lumaref before others operations use in normal mode for all modules exceprt denoise struct local_params lp; - calcLocalParams(sp, oW, oH, params->locallab, lp, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, locwavCurveden, locwavdenutili); + calcLocalParams(sp, oW, oH, params->locallab, lp, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, locwavCurveden, locwavdenutili); int begy = lp.yc - lp.lyT; int begx = lp.xc - lp.lxL; int yEn = lp.yc + lp.ly; @@ -6863,9 +8536,10 @@ void ImProcFunctions::transit_shapedetect2(int sp, float meantm, float stdtm, in varsens = lp.sensilog; } else if (senstype == 20) { //common mask varsens = lp.sensimas; - } + } else if (senstype == 31) { //ciecam + varsens = lp.sensicie; + } bool delt = lp.deltaem; - //sobel sobelref /= 100.f; meansobel /= 100.f; @@ -6890,6 +8564,7 @@ void ImProcFunctions::transit_shapedetect2(int sp, float meantm, float stdtm, in const bool lcshow = ((lp.showmasklcmet == 1 || lp.showmasklcmet == 2) && senstype == 10); const bool origshow = ((lp.showmasksoftmet == 5) && senstype == 3 && lp.softmet == 1); const bool logshow = ((lp.showmasklogmet == 1 || lp.showmasklogmet == 2) && senstype == 11); + const bool cieshow = ((lp.showmaskciemet == 1 || lp.showmaskciemet == 2) && senstype == 31); const bool masshow = ((lp.showmask_met == 1) && senstype == 20); @@ -6902,6 +8577,7 @@ void ImProcFunctions::transit_shapedetect2(int sp, float meantm, float stdtm, in const bool previeworig = ((lp.showmasksoftmet == 6) && senstype == 3 && lp.softmet == 1); const bool previewmas = ((lp.showmask_met == 3) && senstype == 20); const bool previewlog = ((lp.showmasklogmet == 4) && senstype == 11); + const bool previewcie = ((lp.showmaskciemet == 4) && senstype == 31); float radius = 3.f / sk; @@ -6917,7 +8593,7 @@ void ImProcFunctions::transit_shapedetect2(int sp, float meantm, float stdtm, in std::unique_ptr origblurmask; //balance deltaE - const float kL = lp.balance / SQR(327.68f); + float kL = lp.balance / SQR(327.68f); const float kab = balancedeltaE(lp.balance) / SQR(327.68f); const float kH = lp.balanceh; const float kch = balancedeltaE(kH); @@ -6932,7 +8608,10 @@ void ImProcFunctions::transit_shapedetect2(int sp, float meantm, float stdtm, in float darklim = 5000.f; float aadark = -1.f; float bbdark = darklim; - + bool usemask = true; + if(originalmask == nullptr) { + usemask = false; + } const bool usemaskvib = (lp.showmaskvibmet == 2 || lp.enavibMask || lp.showmaskvibmet == 4) && senstype == 2; const bool usemaskexp = (lp.showmaskexpmet == 2 || lp.enaExpMask || lp.showmaskexpmet == 5) && senstype == 1; const bool usemaskcol = (lp.showmaskcolmet == 2 || lp.enaColorMask || lp.showmaskcolmet == 5) && senstype == 0; @@ -6941,8 +8620,8 @@ void ImProcFunctions::transit_shapedetect2(int sp, float meantm, float stdtm, in const bool usemasklc = (lp.showmasklcmet == 2 || lp.enalcMask || lp.showmasklcmet == 4) && senstype == 10; const bool usemaskmas = (lp.showmask_met == 1 || lp.ena_Mask || lp.showmask_met == 3) && senstype == 20; const bool usemasklog = (lp.showmasklogmet == 2 || lp.enaLMask || lp.showmasklogmet == 4) && senstype == 11; - const bool usemaskall = (usemaskexp || usemaskvib || usemaskcol || usemaskSH || usemasktm || usemasklc || usemasklog || usemaskmas); - + const bool usemaskcie = (lp.showmaskciemet == 2 || lp.enacieMask || lp.showmaskciemet == 4) && senstype == 31; + const bool usemaskall = usemask && (usemaskexp || usemaskvib || usemaskcol || usemaskSH || usemasktm || usemasklc || usemasklog || usemaskcie || usemaskmas); //blur a little mask if (usemaskall) { origblurmask.reset(new LabImage(bfw, bfh)); @@ -7042,6 +8721,13 @@ void ImProcFunctions::transit_shapedetect2(int sp, float meantm, float stdtm, in const LabImage *maskptr = usemaskall ? origblurmask.get() : origblur.get(); //parameters deltaE + //increase a bit lp.thr and lp.iterat and kL if HDR only with log encoding and CAM16 Jz + if(senstype == 11 || senstype == 31) { + lp.thr *= 1.2f; + lp.iterat *= 1.2f; + kL *= 1.2f; + } + const float mindE = 2.f + MINSCOPE * varsens * lp.thr; const float maxdE = 5.f + MAXSCOPE * varsens * (1 + 0.1f * lp.thr); const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; @@ -7160,13 +8846,13 @@ void ImProcFunctions::transit_shapedetect2(int sp, float meantm, float stdtm, in const float difb = factorx * realstrbdE; float maxdifab = rtengine::max(std::fabs(difa), std::fabs(difb)); - if ((expshow || vibshow || colshow || SHshow || tmshow || lcshow || logshow || origshow || masshow) && lp.colorde < 0) { //show modifications with use "b" + if ((expshow || vibshow || colshow || SHshow || tmshow || lcshow || logshow || cieshow || origshow || masshow) && lp.colorde < 0) { //show modifications with use "b" // (origshow && lp.colorde < 0) { //original Retinex transformed->a[y + ystart][x + xstart] = 0.f; transformed->b[y + ystart][x + xstart] = ampli * 8.f * diflc * reducdE; transformed->L[y + ystart][x + xstart] = CLIP(12000.f + 0.5f * ampli * diflc); - } else if ((expshow || vibshow || colshow || SHshow || tmshow || lcshow || logshow || origshow || masshow) && lp.colorde > 0) {//show modifications without use "b" + } else if ((expshow || vibshow || colshow || SHshow || tmshow || lcshow || logshow || cieshow || origshow || masshow) && lp.colorde > 0) {//show modifications without use "b" if (diflc < 1000.f) {//if too low to be view use ab diflc += 0.5f * maxdifab; } @@ -7174,7 +8860,7 @@ void ImProcFunctions::transit_shapedetect2(int sp, float meantm, float stdtm, in transformed->L[y + ystart][x + xstart] = CLIP(12000.f + 0.5f * ampli * diflc); transformed->a[y + ystart][x + xstart] = clipC(ampli * difa); transformed->b[y + ystart][x + xstart] = clipC(ampli * difb); - } else if (previewexp || previewvib || previewcol || previewSH || previewtm || previewlc || previewlog || previeworig || previewmas || lp.prevdE) {//show deltaE + } else if (previewexp || previewvib || previewcol || previewSH || previewtm || previewlc || previewlog || previewcie || previeworig || previewmas || lp.prevdE) {//show deltaE float difbdisp = reducdE * 10000.f * lp.colorde; if (transformed->L[y + ystart][x + xstart] < darklim) { //enhance dark luminance as user can see! @@ -7872,6 +9558,81 @@ void ImProcFunctions::Compresslevels(float **Source, int W_L, int H_L, float com } } +void ImProcFunctions::wavlc(wavelet_decomposition& wdspot, int level_bl, int level_hl, int maxlvl, int level_hr, int level_br, float ahigh, float bhigh, float alow, float blow, float sigmalc, float strength, const LocwavCurve & locwavCurve, int numThreads) +{ + float mean[10]; + float meanN[10]; + float sigma[10]; + float sigmaN[10]; + float MaxP[10]; + float MaxN[10]; + + Evaluate2(wdspot, mean, meanN, sigma, sigmaN, MaxP, MaxN, numThreads); + for (int dir = 1; dir < 4; dir++) { + for (int level = level_bl; level < maxlvl; ++level) { + int W_L = wdspot.level_W(level); + int H_L = wdspot.level_H(level); + float klev = 1.f; + + if (level >= level_hl && level <= level_hr) { + klev = 1.f; + } + + if (level_hl != level_bl) { + if (level >= level_bl && level < level_hl) { + klev = alow * level + blow; + } + } + + if (level_hr != level_br) { + if (level > level_hr && level <= level_br) { + klev = ahigh * level + bhigh; + } + } + float* const* wav_L = wdspot.level_coeffs(level); + + if (MaxP[level] > 0.f && mean[level] != 0.f && sigma[level] != 0.f) { + constexpr float insigma = 0.666f; //SD + const float logmax = log(MaxP[level]); //log Max + const float rapX = (mean[level] + sigmalc * sigma[level]) / MaxP[level]; //rapport between sD / max + const float inx = log(insigma); + const float iny = log(rapX); + const float rap = inx / iny; //koef + const float asig = 0.166f / (sigma[level] * sigmalc); + const float bsig = 0.5f - asig * mean[level]; + const float amean = 0.5f / mean[level]; + const float limit1 = mean[level] + sigmalc * sigma[level]; + const float limit2 = mean[level]; +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic, 16 * W_L) if (multiThread) +#endif + for (int i = 0; i < W_L * H_L; i++) { + const float val = std::fabs(wav_L[dir][i]); + + float absciss; + if (val >= limit1) { //for max + const float valcour = xlogf(val); + absciss = xexpf((valcour - logmax) * rap); + } else if (val >= limit2) { + absciss = asig * val + bsig; + } else { + absciss = amean * val; + } + + const float kc = klev * (locwavCurve[absciss * 500.f] - 0.5f); + const float reduceeffect = kc <= 0.f ? 1.f : strength; + + float kinterm = 1.f + reduceeffect * kc; + kinterm = kinterm <= 0.f ? 0.01f : kinterm; + + wav_L[dir][i] *= kinterm <= 0.f ? 0.01f : kinterm; + } + } + } + } + +} + void ImProcFunctions::wavcont(const struct local_params& lp, float ** tmp, wavelet_decomposition& wdspot, int level_bl, int maxlvl, const LocwavCurve & loclevwavCurve, bool loclevwavutili, const LocwavCurve & loccompwavCurve, bool loccompwavutili, @@ -8632,75 +10393,8 @@ void ImProcFunctions::wavcontrast4(struct local_params& lp, float ** tmp, float //edge sharpness end if (locwavCurve && locwavutili && wavcurve) {//simple local contrast in function luminance - float mean[10]; - float meanN[10]; - float sigma[10]; - float sigmaN[10]; - float MaxP[10]; - float MaxN[10]; - Evaluate2(*wdspot, mean, meanN, sigma, sigmaN, MaxP, MaxN, numThreads); - for (int dir = 1; dir < 4; dir++) { - for (int level = level_bl; level < maxlvl; ++level) { - int W_L = wdspot->level_W(level); - int H_L = wdspot->level_H(level); - float klev = 1.f; - - if (level >= level_hl && level <= level_hr) { - klev = 1.f; - } - - if (level_hl != level_bl) { - if (level >= level_bl && level < level_hl) { - klev = alow * level + blow; - } - } - - if (level_hr != level_br) { - if (level > level_hr && level <= level_br) { - klev = ahigh * level + bhigh; - } - } - float* const* wav_L = wdspot->level_coeffs(level); - - if (MaxP[level] > 0.f && mean[level] != 0.f && sigma[level] != 0.f) { - constexpr float insigma = 0.666f; //SD - const float logmax = log(MaxP[level]); //log Max - const float rapX = (mean[level] + lp.sigmalc * sigma[level]) / MaxP[level]; //rapport between sD / max - const float inx = log(insigma); - const float iny = log(rapX); - const float rap = inx / iny; //koef - const float asig = 0.166f / (sigma[level] * lp.sigmalc); - const float bsig = 0.5f - asig * mean[level]; - const float amean = 0.5f / mean[level]; - const float limit1 = mean[level] + lp.sigmalc * sigma[level]; - const float limit2 = mean[level]; -#ifdef _OPENMP - #pragma omp parallel for schedule(dynamic, 16 * W_L) if (multiThread) -#endif - for (int i = 0; i < W_L * H_L; i++) { - const float val = std::fabs(wav_L[dir][i]); - - float absciss; - if (val >= limit1) { //for max - const float valcour = xlogf(val); - absciss = xexpf((valcour - logmax) * rap); - } else if (val >= limit2) { - absciss = asig * val + bsig; - } else { - absciss = amean * val; - } - - const float kc = klev * (locwavCurve[absciss * 500.f] - 0.5f); - const float reduceeffect = kc <= 0.f ? 1.f : 1.5f; - - float kinterm = 1.f + reduceeffect * kc; - kinterm = kinterm <= 0.f ? 0.01f : kinterm; - - wav_L[dir][i] *= kinterm <= 0.f ? 0.01f : kinterm; - } - } - } - } + float strengthlc = 1.5f; + wavlc(*wdspot, level_bl, level_hl, maxlvl, level_hr, level_br, ahigh, bhigh, alow, blow, lp.sigmalc, strengthlc, locwavCurve, numThreads); } //reconstruct all for L wdspot->reconstruct(tmp[0], 1.f); @@ -8756,6 +10450,74 @@ void ImProcFunctions::wavcontrast4(struct local_params& lp, float ** tmp, float if (reconstruct) { wdspot->reconstruct(tmpb[0], 1.f); } + + + //gamma and slope residual image - be carefull memory + bool tonecur = false; + const Glib::ustring profile = params->icm.workingProfile; + bool isworking = (profile == "sRGB" || profile == "Adobe RGB" || profile == "ProPhoto" || profile == "WideGamut" || profile == "BruceRGB" || profile == "Beta RGB" || profile == "BestRGB" || profile == "Rec2020" || profile == "ACESp0" || profile == "ACESp1"); + + if (isworking && (lp.residgam != 2.4f || lp.residslop != 12.92f)) { + tonecur = true; + } + + if(tonecur) { + std::unique_ptr wdspotL(new wavelet_decomposition(tmp[0], bfw, bfh, maxlvl, 1, sk, numThreads, lp.daubLen)); + if (wdspotL->memory_allocation_failed()) { + return; + } + std::unique_ptr wdspota(new wavelet_decomposition(tmpa[0], bfw, bfh, maxlvl, 1, sk, numThreads, lp.daubLen)); + if (wdspota->memory_allocation_failed()) { + return; + } + std::unique_ptr wdspotb(new wavelet_decomposition(tmpb[0], bfw, bfh, maxlvl, 1, sk, numThreads, lp.daubLen)); + if (wdspotb->memory_allocation_failed()) { + return; + } + int W_Level = wdspotL->level_W(0); + int H_Level = wdspotL->level_H(0); + float *wav_L0 = wdspotL->get_coeff0(); + float *wav_a0 = wdspota->get_coeff0(); + float *wav_b0 = wdspotb->get_coeff0(); + + const std::unique_ptr labresid(new LabImage(W_Level, H_Level)); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < H_Level; y++) { + for (int x = 0; x < W_Level; x++) { + labresid->L[y][x] = wav_L0[y * W_Level + x]; + labresid->a[y][x] = wav_a0[y * W_Level + x]; + labresid->b[y][x] = wav_b0[y * W_Level + x]; + } + } + + Imagefloat *tmpImage = nullptr; + tmpImage = new Imagefloat(W_Level, H_Level); + lab2rgb(*labresid, *tmpImage, params->icm.workingProfile); + Glib::ustring prof = params->icm.workingProfile; + cmsHTRANSFORM dummy = nullptr; + int ill =0; + workingtrc(tmpImage, tmpImage, W_Level, H_Level, -5, prof, 2.4, 12.92310, ill, 0, dummy, true, false, false); + workingtrc(tmpImage, tmpImage, W_Level, H_Level, 1, prof, lp.residgam, lp.residslop, ill, 0, dummy, false, true, true);//be carefull no gamut control + rgb2lab(*tmpImage, *labresid, params->icm.workingProfile); + delete tmpImage; + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < H_Level; y++) { + for (int x = 0; x < W_Level; x++) { + wav_L0[y * W_Level + x] = labresid->L[y][x]; + wav_a0[y * W_Level + x] = labresid->a[y][x]; + wav_b0[y * W_Level + x] = labresid->b[y][x]; + } + } + + wdspotL->reconstruct(tmp[0], 1.f); + wdspota->reconstruct(tmpa[0], 1.f); + wdspotb->reconstruct(tmpb[0], 1.f); + } } @@ -9117,6 +10879,29 @@ void ImProcFunctions::DeNoise(int call, float * slidL, float * slida, float * sl tmp1.b[ir][jr] = original->b[ir][jr]; } + float gamma = lp.noisegam; + rtengine::GammaValues g_a; //gamma parameters + double pwr = 1.0 / (double) lp.noisegam;//default 3.0 - gamma Lab + double ts = 9.03296;//always the same 'slope' in the extrem shadows - slope Lab + rtengine::Color::calcGamma(pwr, ts, g_a); // call to calcGamma with selected gamma and slope + + if(gamma > 1.f) { +#ifdef _OPENMP +# pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < GH; ++y) { + int x = 0; +#ifdef __SSE2__ + for (; x < GW - 3; x += 4) { + STVFU(tmp1.L[y][x], F2V(32768.f) * igammalog(LVFU(tmp1.L[y][x]) / F2V(32768.f), F2V(gamma), F2V(ts), F2V(g_a[2]), F2V(g_a[4]))); + } +#endif + for (;x < GW; ++x) { + tmp1.L[y][x] = 32768.f * igammalog(tmp1.L[y][x] / 32768.f, gamma, ts, g_a[2], g_a[4]); + } + } + } + // int DaubLen = 6; int levwavL = levred; @@ -9663,11 +11448,27 @@ void ImProcFunctions::DeNoise(int call, float * slidL, float * slida, float * sl } + if(gamma > 1.f) { +#ifdef _OPENMP +# pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < GH; ++y) {//apply inverse gamma 3.f and put result in range 32768.f + int x = 0; +#ifdef __SSE2__ + for (; x < GW - 3; x += 4) { + STVFU(tmp1.L[y][x], F2V(32768.f) * gammalog(LVFU(tmp1.L[y][x]) / F2V(32768.f), F2V(gamma), F2V(ts), F2V(g_a[3]), F2V(g_a[4]))); + } +#endif + for (; x < GW; ++x) { + tmp1.L[y][x] = 32768.f * gammalog(tmp1.L[y][x] / 32768.f, gamma, ts, g_a[3], g_a[4]); + } + } + } + if(lp.nlstr > 0) { NLMeans(tmp1.L, lp.nlstr, lp.nldet, lp.nlpat, lp.nlrad, lp.nlgam, GW, GH, float (sk), multiThread); - // NLMeans(*nlm, lp.nlstr, lp.nldet, lp.nlpat, lp.nlrad, lp.nlgam, GW + addsiz, GH + addsiz, float (sk), multiThread); - } + if(lp.smasktyp != 0) { if(lp.enablMask && lp.recothrd != 1.f) { LabImage tmp3(GW, GH); @@ -9793,6 +11594,29 @@ void ImProcFunctions::DeNoise(int call, float * slidL, float * slida, float * sl } + float gamma = lp.noisegam; + rtengine::GammaValues g_a; //gamma parameters + double pwr = 1.0 / (double) lp.noisegam;//default 3.0 - gamma Lab + double ts = 9.03296;//always the same 'slope' in the extrem shadows - slope Lab + rtengine::Color::calcGamma(pwr, ts, g_a); // call to calcGamma with selected gamma and slope + if(gamma > 1.f) { +#ifdef _OPENMP +# pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh; ++y) { + int x = 0; + +#ifdef __SSE2__ + for (; x < bfw - 3; x += 4) { + STVFU(bufwv.L[y][x], F2V(32768.f) * igammalog(LVFU(bufwv.L[y][x]) / F2V(32768.f), F2V(gamma), F2V(ts), F2V(g_a[2]), F2V(g_a[4]))); + } +#endif + for (;x < bfw; ++x) { + bufwv.L[y][x] = 32768.f * igammalog(bufwv.L[y][x] / 32768.f, gamma, ts, g_a[2], g_a[4]); + } + } + } + // int DaubLen = 6; int levwavL = levred; @@ -10335,13 +12159,29 @@ void ImProcFunctions::DeNoise(int call, float * slidL, float * slida, float * sl } } + if(gamma > 1.f) { +#ifdef _OPENMP +# pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh ; ++y) {//apply inverse gamma 3.f and put result in range 32768.f + int x = 0; + +#ifdef __SSE2__ + for (; x < bfw - 3; x += 4) { - if(lp.nlstr > 0) { - NLMeans(bufwv.L, lp.nlstr, lp.nldet, lp.nlpat, lp.nlrad, lp.nlgam, bfw, bfh, 1.f, multiThread); - // NLMeans(*nlm, lp.nlstr, lp.nldet, lp.nlpat, lp.nlrad, lp.nlgam, bfw + addsiz, bfh + addsiz, 1.f, multiThread); + STVFU(bufwv.L[y][x], F2V(32768.f) * gammalog(LVFU(bufwv.L[y][x]) / F2V(32768.f), F2V(gamma), F2V(ts), F2V(g_a[3]), F2V(g_a[4]))); + } +#endif + for (; x < bfw ; ++x) { - - } + bufwv.L[y][x] = 32768.f * gammalog(bufwv.L[y][x] / 32768.f, gamma, ts, g_a[3], g_a[4]); + } + } + } + + if(lp.nlstr > 0) { + NLMeans(bufwv.L, lp.nlstr, lp.nldet, lp.nlpat, lp.nlrad, lp.nlgam, bfw, bfh, 1.f, multiThread); + } if (lp.smasktyp != 0) { @@ -10481,7 +12321,7 @@ void rgbtone(float& maxval, float& medval, float& minval, const LUTf& lutToneCur medval = minval + ((maxval - minval) * (medvalold - minvalold) / (maxvalold - minvalold)); } -void clarimerge(struct local_params& lp, float &mL, float &mC, bool &exec, LabImage *tmpresid, int wavelet_level, int sk, int numThreads) +void ImProcFunctions::clarimerge(const struct local_params& lp, float &mL, float &mC, bool &exec, LabImage *tmpresid, int wavelet_level, int sk, int numThreads) { if (mL != 0.f && mC == 0.f) { mC = 0.0001f; @@ -10617,6 +12457,10 @@ void ImProcFunctions::avoidcolshi(const struct local_params& lp, int sp, LabImag { if (params->locallab.spots.at(sp).avoid && lp.islocal) { const float ach = lp.trans / 100.f; + bool execmunsell = true; + if(params->locallab.spots.at(sp).expcie && (params->locallab.spots.at(sp).modecam == "all" || params->locallab.spots.at(sp).modecam == "jz" || params->locallab.spots.at(sp).modecam == "cam16")) { + execmunsell = false; + } TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix(params->icm.workingProfile); const double wip[3][3] = {//improve precision with double @@ -10762,7 +12606,9 @@ void ImProcFunctions::avoidcolshi(const struct local_params& lp, int sp, LabImag float correctlum = 0.f; const float memChprov = std::sqrt(SQR(original->a[y][x]) + SQR(original->b[y][x])) / 327.68f; float Chprov = std::sqrt(SQR(transformed->a[y][x]) + SQR(transformed->b[y][x])) / 327.68f; - Color::AllMunsellLch(true, Lprov1, Lprov2, HH, Chprov, memChprov, correctionHue, correctlum); + if(execmunsell) { + Color::AllMunsellLch(true, Lprov1, Lprov2, HH, Chprov, memChprov, correctionHue, correctlum); + } if (std::fabs(correctionHue) < 0.015f) { HH += correctlum; // correct only if correct Munsell chroma very small. @@ -10853,7 +12699,6 @@ void ImProcFunctions::avoidcolshi(const struct local_params& lp, int sp, LabImag void maskrecov(const LabImage * bufcolfin, LabImage * original, LabImage * bufmaskblurcol, int bfh, int bfw, int ystart, int xstart, float hig, float low, float recoth, float decay, bool invmask, int sk, bool multiThread) { LabImage tmp3(bfw, bfh); - for (int y = 0; y < bfh; y++){ for (int x = 0; x < bfw; x++) { tmp3.L[y][x] = original->L[y + ystart][x + xstart]; @@ -11289,6 +13134,7 @@ void ImProcFunctions::Lab_Local( const LUTf& cllocalcurve, bool localclutili, const LUTf& lclocalcurve, bool locallcutili, const LocLHCurve& loclhCurve, const LocHHCurve& lochhCurve, const LocCHCurve& locchCurve, + const LocHHCurve& lochhCurvejz, const LocCHCurve& locchCurvejz, const LocLHCurve& loclhCurvejz, const LUTf& lmasklocalcurve, bool localmaskutili, const LUTf& lmaskexplocalcurve, bool localmaskexputili, const LUTf& lmaskSHlocalcurve, bool localmaskSHutili, @@ -11300,6 +13146,12 @@ void ImProcFunctions::Lab_Local( const LUTf& lmasklclocalcurve, bool localmasklcutili, const LUTf& lmaskloglocalcurve, bool localmasklogutili, const LUTf& lmasklocal_curve, bool localmask_utili, + const LUTf& lmaskcielocalcurve, bool localmaskcieutili, + const LUTf& cielocalcurve, bool localcieutili, + const LUTf& cielocalcurve2, bool localcieutili2, + const LUTf& jzlocalcurve, bool localjzutili, + const LUTf& czlocalcurve, bool localczutili, + const LUTf& czjzlocalcurve, bool localczjzutili, const LocCCmaskCurve& locccmasCurve, bool lcmasutili, const LocLLmaskCurve& locllmasCurve, bool llmasutili, const LocHHmaskCurve& lochhmasCurve, bool lhmasutili, const LocHHmaskCurve& llochhhmasCurve, bool lhhmasutili, const LocCCmaskCurve& locccmasexpCurve, bool lcmasexputili, const LocLLmaskCurve& locllmasexpCurve, bool llmasexputili, const LocHHmaskCurve& lochhmasexpCurve, bool lhmasexputili, @@ -11312,10 +13164,13 @@ void ImProcFunctions::Lab_Local( const LocCCmaskCurve& locccmaslcCurve, bool lcmaslcutili, const LocLLmaskCurve& locllmaslcCurve, bool llmaslcutili, const LocHHmaskCurve& lochhmaslcCurve, bool lhmaslcutili, const LocCCmaskCurve& locccmaslogCurve, bool lcmaslogutili, const LocLLmaskCurve& locllmaslogCurve, bool llmaslogutili, const LocHHmaskCurve& lochhmaslogCurve, bool lhmaslogutili, const LocCCmaskCurve& locccmas_Curve, bool lcmas_utili, const LocLLmaskCurve& locllmas_Curve, bool llmas_utili, const LocHHmaskCurve& lochhmas_Curve, bool lhmas_utili, + const LocCCmaskCurve& locccmascieCurve, bool lcmascieutili, const LocLLmaskCurve& locllmascieCurve, bool llmascieutili, const LocHHmaskCurve& lochhmascieCurve, bool lhmascieutili, + const LocHHmaskCurve& lochhhmas_Curve, bool lhhmas_utili, const LocwavCurve& loclmasCurveblwav, bool lmasutiliblwav, const LocwavCurve& loclmasCurvecolwav, bool lmasutilicolwav, const LocwavCurve& locwavCurve, bool locwavutili, + const LocwavCurve& locwavCurvejz, bool locwavutilijz, const LocwavCurve& loclevwavCurve, bool loclevwavutili, const LocwavCurve& locconwavCurve, bool locconwavutili, const LocwavCurve& loccompwavCurve, bool loccompwavutili, @@ -11325,11 +13180,11 @@ void ImProcFunctions::Lab_Local( const LocwavCurve& locedgwavCurve, bool locedgwavutili, const LocwavCurve& loclmasCurve_wav, bool lmasutili_wav, - bool LHutili, bool HHutili, bool CHutili, const LUTf& cclocalcurve, bool localcutili, const LUTf& rgblocalcurve, bool localrgbutili, bool localexutili, const LUTf& exlocalcurve, const LUTf& hltonecurveloc, const LUTf& shtonecurveloc, const LUTf& tonecurveloc, const LUTf& lightCurveloc, + bool LHutili, bool HHutili, bool CHutili, bool HHutilijz, bool CHutilijz, bool LHutilijz, const LUTf& cclocalcurve, bool localcutili, const LUTf& rgblocalcurve, bool localrgbutili, bool localexutili, const LUTf& exlocalcurve, const LUTf& hltonecurveloc, const LUTf& shtonecurveloc, const LUTf& tonecurveloc, const LUTf& lightCurveloc, double& huerefblur, double& chromarefblur, double& lumarefblur, double& hueref, double& chromaref, double& lumaref, double& sobelref, int &lastsav, - bool prevDeltaE, int llColorMask, int llColorMaskinv, int llExpMask, int llExpMaskinv, int llSHMask, int llSHMaskinv, int llvibMask, int lllcMask, int llsharMask, int llcbMask, int llretiMask, int llsoftMask, int lltmMask, int llblMask, int lllogMask, int ll_Mask, + bool prevDeltaE, int llColorMask, int llColorMaskinv, int llExpMask, int llExpMaskinv, int llSHMask, int llSHMaskinv, int llvibMask, int lllcMask, int llsharMask, int llcbMask, int llretiMask, int llsoftMask, int lltmMask, int llblMask, int lllogMask, int ll_Mask, int llcieMask, float& minCD, float& maxCD, float& mini, float& maxi, float& Tmean, float& Tsigma, float& Tmin, float& Tmax, - float& meantm, float& stdtm, float& meanreti, float& stdreti + float& meantm, float& stdtm, float& meanreti, float& stdreti, float &fab ) { //general call of others functions : important return hueref, chromaref, lumaref @@ -11341,7 +13196,7 @@ void ImProcFunctions::Lab_Local( constexpr int del = 3; // to avoid crash with [loy - begy] and [lox - begx] and bfh bfw // with gtk2 [loy - begy-1] [lox - begx -1 ] and del = 1 struct local_params lp; - calcLocalParams(sp, oW, oH, params->locallab, lp, prevDeltaE, llColorMask, llColorMaskinv, llExpMask, llExpMaskinv, llSHMask, llSHMaskinv, llvibMask, lllcMask, llsharMask, llcbMask, llretiMask, llsoftMask, lltmMask, llblMask, lllogMask, ll_Mask, locwavCurveden, locwavdenutili); + calcLocalParams(sp, oW, oH, params->locallab, lp, prevDeltaE, llColorMask, llColorMaskinv, llExpMask, llExpMaskinv, llSHMask, llSHMaskinv, llvibMask, lllcMask, llsharMask, llcbMask, llretiMask, llsoftMask, lltmMask, llblMask, lllogMask, ll_Mask, llcieMask, locwavCurveden, locwavdenutili); avoidcolshi(lp, sp, original, transformed, cy, cx, sk); @@ -11520,7 +13375,7 @@ void ImProcFunctions::Lab_Local( locccmaslogCurve, lcmaslogutili, locllmaslogCurve, llmaslogutili, lochhmaslogCurve, lhmaslogutili, lochhhmasCurve, false, multiThread, enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, highl, amountcd, anchorcd, lmaskloglocalcurve, localmasklogutili, dummy, false, 1, 1, 5, 5, shortcu, delt, hueref, chromaref, lumaref, - maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, false, 0.f, 0.f, -1 + maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, false, 0.f, 0.f, -1, fab ); if (lp.showmasklogmet == 3) { @@ -11564,7 +13419,23 @@ void ImProcFunctions::Lab_Local( tmpImageorig.reset(); tmpImage.reset(); if (params->locallab.spots.at(sp).ciecam) { - ImProcFunctions::ciecamloc_02float(sp, bufexpfin.get(), 1); + bool HHcurvejz = false, CHcurvejz = false, LHcurvejz = false;; + ImProcFunctions::ciecamloc_02float(lp, sp, bufexpfin.get(), bfw, bfh, 1, sk, cielocalcurve, localcieutili, cielocalcurve2, localcieutili2, jzlocalcurve, localjzutili, czlocalcurve, localczutili, czjzlocalcurve, localczjzutili, locchCurvejz, lochhCurvejz, loclhCurvejz, HHcurvejz, CHcurvejz, LHcurvejz, locwavCurvejz, locwavutilijz); + } + + + if (params->locallab.spots.at(sp).expcie && params->locallab.spots.at(sp).modecie == "log") { + bool HHcurvejz = false; + bool CHcurvejz = false; + bool LHcurvejz = false; + if (params->locallab.spots.at(sp).expcie && params->locallab.spots.at(sp).modecam == "jz") {//some cam16 elementsfor Jz + ImProcFunctions::ciecamloc_02float(lp, sp, bufexpfin.get(), bfw, bfh, 10, sk, cielocalcurve, localcieutili, cielocalcurve2, localcieutili2, jzlocalcurve, localjzutili, czlocalcurve, localczutili, czjzlocalcurve, localczjzutili, locchCurvejz, lochhCurvejz, loclhCurvejz, HHcurvejz, CHcurvejz, LHcurvejz, locwavCurvejz, locwavutilijz); + } + + ImProcFunctions::ciecamloc_02float(lp, sp, bufexpfin.get(),bfw, bfh, 0, sk, cielocalcurve, localcieutili, cielocalcurve2, localcieutili2, jzlocalcurve, localjzutili, czlocalcurve, localczutili, czjzlocalcurve, localczjzutili, locchCurvejz, lochhCurvejz, loclhCurvejz, HHcurvejz, CHcurvejz, LHcurvejz, locwavCurvejz, locwavutilijz); + + float rad = params->locallab.spots.at(sp).detailcie; + loccont(bfw, bfh, bufexpfin.get(), rad, 15.f, sk); } //here begin graduated filter @@ -11583,16 +13454,25 @@ void ImProcFunctions::Lab_Local( } //end graduated + float recoth = lp.recothrl; + + if(lp.recothrl < 1.f) { + recoth = -1.f * recoth + 2.f; + } if(lp.enaLMask && lp.recothrl != 1.f) { float hig = lp.higthrl; float low = lp.lowthrl; - float recoth = lp.recothrl; + // float recoth = lp.recothrl; float decay = lp.decayl; bool invmask = false; maskrecov(bufexpfin.get(), original, bufmaskoriglog.get(), bfh, bfw, ystart, xstart, hig, low, recoth, decay, invmask, sk, multiThread); } - transit_shapedetect2(sp, 0.f, 0.f, call, 11, bufexporig.get(), bufexpfin.get(), originalmasklog.get(), hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); + if(lp.recothrl >= 1.f) { + transit_shapedetect2(sp, 0.f, 0.f, call, 11, bufexporig.get(), bufexpfin.get(), originalmasklog.get(), hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); + } else { + transit_shapedetect2(sp, 0.f, 0.f, call, 11, bufexporig.get(), bufexpfin.get(), nullptr, hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); + } } if (lp.recur) { @@ -11697,12 +13577,11 @@ void ImProcFunctions::Lab_Local( LocHHmaskCurve lochhhmasCurve; const float strumask = 0.02 * params->locallab.spots.at(sp).strumaskbl; const bool astool = params->locallab.spots.at(sp).toolbl; - maskcalccol(false, pde, TW, TH, 0, 0, sk, cx, cy, bufblorig.get(), bufmaskblurbl.get(), originalmaskbl.get(), original, reserved, inv, lp, strumask, astool, locccmasblCurve, lcmasblutili, locllmasblCurve, llmasblutili, lochhmasblCurve, lhmasblutili, lochhhmasCurve, false, multiThread, enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, highl, amountcd, anchorcd, lmaskbllocalcurve, localmaskblutili, loclmasCurveblwav, lmasutiliblwav, 1, 1, 5, 5, shortcu, params->locallab.spots.at(sp).deltae, hueref, chromaref, lumaref, - maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, false, 0.f, 0.f, 0 + maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, false, 0.f, 0.f, 0, fab ); if (lp.showmaskblmet == 3) { @@ -12483,13 +14362,12 @@ void ImProcFunctions::Lab_Local( float anchorcd = 50.f; LocHHmaskCurve lochhhmasCurve; const int highl = 0; - maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, bufgbm.get(), bufmaskorigtm.get(), originalmasktm.get(), original, reserved, inv, lp, 0.f, false, locccmastmCurve, lcmastmutili, locllmastmCurve, llmastmutili, lochhmastmCurve, lhmastmutili, lochhhmasCurve, false, multiThread, enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, highl, amountcd, anchorcd, lmasktmlocalcurve, localmasktmutili, dummy, false, 1, 1, 5, 5, shortcu, params->locallab.spots.at(sp).deltae, hueref, chromaref, lumaref, - maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, false, 0.f, 0.f, -1 + maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, false, 0.f, 0.f, -1, fab ); if (lp.showmasktmmet == 3) { @@ -12503,6 +14381,23 @@ void ImProcFunctions::Lab_Local( constexpr int itera = 0; ImProcFunctions::EPDToneMaplocal(sp, bufgb.get(), tmp1.get(), itera, sk);//iterate to 0 calculate with edgstopping, improve result, call=1 dcrop we can put iterate to 5 + if (params->locallab.spots.at(sp).expcie && params->locallab.spots.at(sp).modecie == "tm") { + bool HHcurvejz = false; + bool CHcurvejz = false; + bool LHcurvejz = false; + if (params->locallab.spots.at(sp).modecam == "jz") {//some cam16 elementsfor Jz + ImProcFunctions::ciecamloc_02float(lp, sp, tmp1.get(), bfw, bfh, 10, sk, cielocalcurve, localcieutili, cielocalcurve2, localcieutili2, jzlocalcurve, localjzutili, czlocalcurve, localczutili, czjzlocalcurve, localczjzutili, locchCurvejz, lochhCurvejz, loclhCurvejz, HHcurvejz, CHcurvejz, LHcurvejz, locwavCurvejz, locwavutilijz); + } + + ImProcFunctions::ciecamloc_02float(lp, sp, tmp1.get(), bfw, bfh, 0, sk, cielocalcurve, localcieutili, cielocalcurve2, localcieutili2, jzlocalcurve, localjzutili, czlocalcurve, localczutili, czjzlocalcurve, localczjzutili, locchCurvejz, lochhCurvejz, loclhCurvejz, HHcurvejz, CHcurvejz, LHcurvejz, locwavCurvejz, locwavutilijz); + + float rad = params->locallab.spots.at(sp).detailcie; + loccont(bfw, bfh, tmp1.get(), rad, 15.f, sk); + } + + + + tmp1m->CopyFrom(tmp1.get(), multiThread); //save current result7 if(params->locallab.spots.at(sp).equiltm && params->locallab.spots.at(sp).exptonemap) { if(call == 3) { @@ -12535,13 +14430,12 @@ void ImProcFunctions::Lab_Local( float anchorcd = 50.f; LocHHmaskCurve lochhhmasCurve; const int highl = 0; - maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, tmp1.get(), bufmaskorigtm.get(), originalmasktm.get(), original, reserved, inv, lp, 0.f, false, locccmastmCurve, lcmastmutili, locllmastmCurve, llmastmutili, lochhmastmCurve, lhmastmutili, lochhhmasCurve, false, multiThread, enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, highl, amountcd, anchorcd, lmasktmlocalcurve, localmasktmutili, dummy, false, 1, 1, 5, 5, shortcu, params->locallab.spots.at(sp).deltae, hueref, chromaref, lumaref, - maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, false, 0.f, 0.f, -1 + maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, false, 0.f, 0.f, -1, fab ); if (lp.showmasktmmet == 3) {//display mask @@ -12599,9 +14493,14 @@ void ImProcFunctions::Lab_Local( } if(lp.enatmMask && lp.recothrt != 1.f) { + float recoth = lp.recothrt; + + if(lp.recothrt < 1.f) { + recoth = -1.f * recoth + 2.f; + } float hig = lp.higthrt; float low = lp.lowthrt; - float recoth = lp.recothrt; + // float recoth = lp.recothrt; float decay = lp.decayt; bool invmask = false; maskrecov(tmp1.get(), original, bufmaskorigtm.get(), bfh, bfw, ystart, xstart, hig, low, recoth, decay, invmask, sk, multiThread); @@ -12609,9 +14508,11 @@ void ImProcFunctions::Lab_Local( // transit_shapedetect_retinex(call, 4, bufgb.get(),bufmaskorigtm.get(), originalmasktm.get(), buflight, bufchro, hueref, chromaref, lumaref, lp, original, transformed, cx, cy, sk); - - transit_shapedetect2(sp, meantm, stdtm, call, 8, bufgb.get(), tmp1.get(), originalmasktm.get(), hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); - + if(lp.recothrt >= 1.f) { + transit_shapedetect2(sp, meantm, stdtm, call, 8, bufgb.get(), tmp1.get(), originalmasktm.get(), hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); + } else { + transit_shapedetect2(sp, meantm, stdtm, call, 8, bufgb.get(), tmp1.get(), nullptr, hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); + } // transit_shapedetect(8, tmp1.get(), originalmasktm.get(), bufchro, false, hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); bufgb.reset(); @@ -13440,7 +15341,7 @@ void ImProcFunctions::Lab_Local( locccmascbCurve, lcmascbutili, locllmascbCurve, llmascbutili, lochhmascbCurve, lhmascbutili, lochhhmasCurve, false, multiThread, enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, highl, amountcd, anchorcd, lmaskcblocalcurve, localmaskcbutili, dummy, false, 1, 1, 5, 5, shortcu, params->locallab.spots.at(sp).deltae, hueref, chromaref, lumaref, - maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, false, 0.0f, 0.f, -1 + maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, false, 0.0f, 0.f, -1, fab ); if (lp.showmaskcbmet == 3) { @@ -13575,8 +15476,8 @@ void ImProcFunctions::Lab_Local( //end cbdl_Local //vibrance - - if (lp.expvib && (lp.past != 0.f || lp.satur != 0.f || lp.strvib != 0.f || lp.war != 0 || lp.strvibab != 0.f || lp.strvibh != 0.f || lp.showmaskvibmet == 2 || lp.enavibMask || lp.showmaskvibmet == 3 || lp.showmaskvibmet == 4 || lp.prevdE) && lp.vibena) { //interior ellipse renforced lightness and chroma //locallutili + float vibg = params->locallab.spots.at(sp).vibgam; + if (lp.expvib && (lp.past != 0.f || lp.satur != 0.f || lp.strvib != 0.f || vibg != 1.f || lp.war != 0 || lp.strvibab != 0.f || lp.strvibh != 0.f || lp.showmaskvibmet == 2 || lp.enavibMask || lp.showmaskvibmet == 3 || lp.showmaskvibmet == 4 || lp.prevdE) && lp.vibena) { //interior ellipse renforced lightness and chroma //locallutili if (call <= 3) { //simpleprocess, dcrop, improccoordinator const int ystart = rtengine::max(static_cast(lp.yc - lp.lyT) - cy, 0); const int yend = rtengine::min(static_cast(lp.yc + lp.ly) - cy, original->H); @@ -13660,13 +15561,12 @@ void ImProcFunctions::Lab_Local( float amountcd = 0.f; float anchorcd = 50.f; const int highl = 0; - maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, bufexporig.get(), bufmaskorigvib.get(), originalmaskvib.get(), original, reserved, inv, lp, 0.f, false, locccmasvibCurve, lcmasvibutili, locllmasvibCurve, llmasvibutili, lochhmasvibCurve, lhmasvibutili, lochhhmasCurve, false, multiThread, enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, highl, amountcd, anchorcd, lmaskviblocalcurve, localmaskvibutili, dummy, false, 1, 1, 5, 5, shortcu, params->locallab.spots.at(sp).deltae, hueref, chromaref, lumaref, - maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, false, 0.f, 0.f, -1 + maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, false, 0.f, 0.f, -1, fab ); if (lp.showmaskvibmet == 3) { @@ -13680,6 +15580,7 @@ void ImProcFunctions::Lab_Local( #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) if (multiThread) #endif + /* for (int y = ystart; y < yend; y++) { for (int x = xstart; x < xend; x++) { bufexporig->L[y - ystart][x - xstart] = original->L[y][x]; @@ -13687,6 +15588,14 @@ void ImProcFunctions::Lab_Local( bufexporig->b[y - ystart][x - xstart] = original->b[y][x]; } } + */ + for (int y = 0; y < bfh; y++) { + for (int x = 0; x < bfw; x++) { + // bufexporig->L[y][x] = original->L[y + ystart][x + xstart]; + bufexporig->a[y][x] = original->a[y + ystart][x + xstart]; + bufexporig->b[y][x] = original->b[y + ystart][x + xstart]; + } + } VibranceParams vibranceParams; vibranceParams.enabled = params->locallab.spots.at(sp).expvibrance; @@ -13699,9 +15608,17 @@ void ImProcFunctions::Lab_Local( vibranceParams.skintonescurve = params->locallab.spots.at(sp).skintonescurve; - bufexpfin->CopyFrom(bufexporig.get(), multiThread); + // bufexpfin->CopyFrom(bufexporig.get(), multiThread); + for (int y = 0; y < bfh; y++) { + for (int x = 0; x < bfw; x++) { + bufexpfin->L[y][x] = bufexporig->L[y][x]; + bufexpfin->a[y][x] = bufexporig->a[y][x]; + bufexpfin->b[y][x] = bufexporig->b[y][x]; + } + } if (lp.strvibh != 0.f) { + printf("a\n"); struct grad_params gph; calclocalGradientParams(lp, gph, ystart, xstart, bfw, bfh, 9); #ifdef _OPENMP @@ -13739,6 +15656,8 @@ void ImProcFunctions::Lab_Local( } if (lp.strvib != 0.f) { + printf("b\n"); + struct grad_params gp; calclocalGradientParams(lp, gp, ystart, xstart, bfw, bfh, 7); #ifdef _OPENMP @@ -13752,6 +15671,8 @@ void ImProcFunctions::Lab_Local( } if (lp.strvibab != 0.f) { + printf("c\n"); + struct grad_params gpab; calclocalGradientParams(lp, gpab, ystart, xstart, bfw, bfh, 8); #ifdef _OPENMP @@ -13764,25 +15685,82 @@ void ImProcFunctions::Lab_Local( bufexpfin->b[ir][jr] *= factor; } } + float gamma1 = params->locallab.spots.at(sp).vibgam; + rtengine::GammaValues g_a; //gamma parameters + double pwr1 = 1.0 / (double) gamma1;//default 3.0 - gamma Lab + double ts1 = 9.03296;//always the same 'slope' in the extrem shadows - slope Lab + rtengine::Color::calcGamma(pwr1, ts1, g_a); // call to calcGamma with selected gamma and slope + if(gamma1 != 1.f) { +#ifdef _OPENMP +# pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh; ++y) { + int x = 0; +#ifdef __SSE2__ + for (; x < bfw - 3; x += 4) { + STVFU(bufexpfin->L[y][x], F2V(32768.f) * igammalog(LVFU(bufexpfin->L[y][x]) / F2V(32768.f), F2V(gamma1), F2V(ts1), F2V(g_a[2]), F2V(g_a[4]))); + } +#endif + for (;x < bfw; ++x) { + bufexpfin->L[y][x] = 32768.f * igammalog(bufexpfin->L[y][x] / 32768.f, gamma1, ts1, g_a[2], g_a[4]); + } + } + } + ImProcFunctions::vibrance(bufexpfin.get(), vibranceParams, params->toneCurve.hrenabled, params->icm.workingProfile); + // float gamma = params->locallab.spots.at(sp).vibgam; + // rtengine::GammaValues g_a; //gamma parameters + // double pwr = 1.0 / (double) gamma;//default 3.0 - gamma Lab + // double ts = 9.03296;//always the same 'slope' in the extrem shadows - slope Lab + // rtengine::Color::calcGamma(pwr, ts, g_a); // call to calcGamma with selected gamma and slope + + if(gamma1 != 1.f) { +#ifdef _OPENMP +# pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh; ++y) {//apply inverse gamma 3.f and put result in range 32768.f + int x = 0; +#ifdef __SSE2__ + for (; x < bfw - 3; x += 4) { + STVFU(bufexpfin->L[y][x], F2V(32768.f) * gammalog(LVFU(bufexpfin->L[y][x]) / F2V(32768.f), F2V(gamma1), F2V(ts1), F2V(g_a[3]), F2V(g_a[4]))); + } +#endif + for (; x < bfw; ++x) { + bufexpfin->L[y][x] = 32768.f * gammalog(bufexpfin->L[y][x] / 32768.f, gamma1, ts1, g_a[3], g_a[4]); + } + } + } + + if (params->locallab.spots.at(sp).warm != 0) { - ImProcFunctions::ciecamloc_02float(sp, bufexpfin.get(), 2); + bool HHcurvejz = false, CHcurvejz = false, LHcurvejz = false; + + ImProcFunctions::ciecamloc_02float(lp, sp, bufexpfin.get(), bfw, bfh, 2, sk, cielocalcurve, localcieutili, cielocalcurve2, localcieutili2, jzlocalcurve, localjzutili, czlocalcurve, localczutili, czjzlocalcurve, localczjzutili, locchCurvejz, lochhCurvejz, loclhCurvejz, HHcurvejz, CHcurvejz, LHcurvejz, locwavCurvejz, locwavutilijz); } if(lp.enavibMask && lp.recothrv != 1.f) { + float recoth = lp.recothrv; + + if(lp.recothrv < 1.f) { + recoth = -1.f * recoth + 2.f; + } + float hig = lp.higthrv; float low = lp.lowthrv; - float recoth = lp.recothrv; + // float recoth = lp.recothrv; float decay = lp.decayv; bool invmask = false; maskrecov(bufexpfin.get(), original, bufmaskorigvib.get(), bfh, bfw, ystart, xstart, hig, low, recoth, decay, invmask, sk, multiThread); } - - transit_shapedetect2(sp, 0.f, 0.f, call, 2, bufexporig.get(), bufexpfin.get(), originalmaskvib.get(), hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); - + if(lp.recothrv >= 1.f) { + transit_shapedetect2(sp, 0.f, 0.f, call, 2, bufexporig.get(), bufexpfin.get(), originalmaskvib.get(), hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); + } else { + transit_shapedetect2(sp, 0.f, 0.f, call, 2, bufexporig.get(), bufexpfin.get(), nullptr, hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); + + } } @@ -13897,13 +15875,12 @@ void ImProcFunctions::Lab_Local( int lumask = params->locallab.spots.at(sp).lumask; LocHHmaskCurve lochhhmasCurve; const int highl = 0; - maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, bufexporig.get(), bufmaskorigSH.get(), originalmaskSH.get(), original, reserved, inv, lp, 0.f, false, locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, lochhhmasCurve, false, multiThread, enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, highl, amountcd, anchorcd, lmaskSHlocalcurve, localmaskSHutili, dummy, false, 1, 1, 5, 5, shortcu, params->locallab.spots.at(sp).deltae, hueref, chromaref, lumaref, - maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, false, 0.f, 0.f, -1 + maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, false, 0.f, 0.f, -1, fab ); if (lp.showmaskSHmet == 3) { @@ -13980,9 +15957,15 @@ void ImProcFunctions::Lab_Local( } if(lp.enaSHMask && lp.recothrs != 1.f) { + float recoth = lp.recothrs; + + if(lp.recothrs < 1.f) { + recoth = -1.f * recoth + 2.f; + } + float hig = lp.higthrs; float low = lp.lowthrs; - float recoth = lp.recothrs; + // float recoth = lp.recothrs; float decay = lp.decays; bool invmask = false; maskrecov(bufexpfin.get(), original, bufmaskorigSH.get(), bfh, bfw, ystart, xstart, hig, low, recoth, decay, invmask, sk, multiThread); @@ -14003,8 +15986,11 @@ void ImProcFunctions::Lab_Local( } } - transit_shapedetect2(sp, 0.f, 0.f, call, 9, bufexporig.get(), bufexpfin.get(), originalmaskSH.get(), hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); - + if(lp.recothrs >= 1.f) { + transit_shapedetect2(sp, 0.f, 0.f, call, 9, bufexporig.get(), bufexpfin.get(), originalmaskSH.get(), hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); + } else { + transit_shapedetect2(sp, 0.f, 0.f, call, 9, bufexporig.get(), bufexpfin.get(), nullptr, hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); + } if (lp.recur) { original->CopyFrom(transformed, multiThread); float avge; @@ -14071,13 +16057,12 @@ void ImProcFunctions::Lab_Local( int lumask = params->locallab.spots.at(sp).lumask; LocHHmaskCurve lochhhmasCurve; const int highl = 0; - maskcalccol(false, pde, TW, TH, 0, 0, sk, cx, cy, bufcolorig.get(), bufmaskblurcol.get(), originalmaskSH.get(), original, reserved, inv, lp, 0.f, false, locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, lochhhmasCurve, false, multiThread, enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, highl, amountcd, anchorcd, lmaskSHlocalcurve, localmaskSHutili, dummy, false, 1, 1, 5, 5, shortcu, false, hueref, chromaref, lumaref, - maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, false, 0.f, 0.f, -1 + maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, false, 0.f, 0.f, -1, fab ); @@ -14345,7 +16330,7 @@ void ImProcFunctions::Lab_Local( locccmaslcCurve, lcmaslcutili, locllmaslcCurve, llmaslcutili, lochhmaslcCurve, lhmaslcutili, lochhhmasCurve, false, multiThread, enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, highl, amountcd, anchorcd, lmasklclocalcurve, localmasklcutili, dummy, false, 1, 1, 5, 5, shortcu, params->locallab.spots.at(sp).deltae, hueref, chromaref, lumaref, - maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, false, 0.f, 0.f, -1 + maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, false, 0.f, 0.f, -1, fab ); if (lp.showmasklcmet == 3) { @@ -14451,8 +16436,62 @@ void ImProcFunctions::Lab_Local( const float compress = params->locallab.spots.at(sp).residcomp; const float thres = params->locallab.spots.at(sp).threswav; + float gamma = lp.gamlc; + rtengine::GammaValues g_a; //gamma parameters + double pwr = 1.0 / (double) lp.gamlc;//default 3.0 - gamma Lab + double ts = 9.03296;//always the same 'slope' in the extrem shadows - slope Lab + rtengine::Color::calcGamma(pwr, ts, g_a); // call to calcGamma with selected gamma and slope + + if(gamma != 1.f) { +#ifdef _OPENMP +# pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < tmp1->H; ++y) { + int x = 0; +#ifdef __SSE2__ + for (; x < tmp1->W - 3; x += 4) { + STVFU(tmp1->L[y][x], F2V(32768.f) * igammalog(LVFU(tmp1->L[y][x]) / F2V(32768.f), F2V(gamma), F2V(ts), F2V(g_a[2]), F2V(g_a[4]))); + } +#endif + for (;x < tmp1->W; ++x) { + tmp1->L[y][x] = 32768.f * igammalog(tmp1->L[y][x] / 32768.f, gamma, ts, g_a[2], g_a[4]); + } + } + } + wavcontrast4(lp, tmp1->L, tmp1->a, tmp1->b, contrast, radblur, radlevblur, tmp1->W, tmp1->H, level_bl, level_hl, level_br, level_hr, sk, numThreads, locwavCurve, locwavutili, wavcurve, loclevwavCurve, loclevwavutili, wavcurvelev, locconwavCurve, locconwavutili, wavcurvecon, loccompwavCurve, loccompwavutili, wavcurvecomp, loccomprewavCurve, loccomprewavutili, wavcurvecompre, locedgwavCurve, locedgwavutili, sigma, offs, maxlvl, sigmadc, deltad, chrol, chrobl, blurlc, blurena, levelena, comprena, compreena, compress, thres); + if (params->locallab.spots.at(sp).expcie && params->locallab.spots.at(sp).modecie == "wav") { + bool HHcurvejz = false, CHcurvejz = false, LHcurvejz = false; + if (params->locallab.spots.at(sp).modecam == "jz") {//some cam16 elementsfor Jz + ImProcFunctions::ciecamloc_02float(lp, sp, tmp1.get(), bfw, bfh, 10, sk, cielocalcurve, localcieutili, cielocalcurve2, localcieutili2, jzlocalcurve, localjzutili, czlocalcurve, localczutili, czjzlocalcurve, localczjzutili, locchCurvejz, lochhCurvejz, loclhCurvejz, HHcurvejz, CHcurvejz, LHcurvejz, locwavCurvejz, locwavutilijz); + } + + ImProcFunctions::ciecamloc_02float(lp, sp, tmp1.get(), bfw, bfh, 0, sk, cielocalcurve, localcieutili, cielocalcurve2, localcieutili2, jzlocalcurve, localjzutili, czlocalcurve, localczutili, czjzlocalcurve, localczjzutili, locchCurvejz, lochhCurvejz, loclhCurvejz, HHcurvejz, CHcurvejz, LHcurvejz, locwavCurvejz, locwavutilijz); + + float rad = params->locallab.spots.at(sp).detailcie; + loccont(bfw, bfh, tmp1.get(), rad, 5.f, sk); + } + + + + if(gamma != 1.f) { +#ifdef _OPENMP +# pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < tmp1->H; ++y) {//apply inverse gamma 3.f and put result in range 32768.f + int x = 0; +#ifdef __SSE2__ + for (; x < tmp1->W - 3; x += 4) { + STVFU(tmp1->L[y][x], F2V(32768.f) * gammalog(LVFU(tmp1->L[y][x]) / F2V(32768.f), F2V(gamma), F2V(ts), F2V(g_a[3]), F2V(g_a[4]))); + } +#endif + for (; x < tmp1->W; ++x) { + tmp1->L[y][x] = 32768.f * gammalog(tmp1->L[y][x] / 32768.f, gamma, ts, g_a[3], g_a[4]); + } + } + } + const float satur = params->locallab.spots.at(sp).residchro; @@ -14620,9 +16659,15 @@ void ImProcFunctions::Lab_Local( } if(lp.enalcMask && lp.recothrw != 1.f) { + float recoth = lp.recothrw; + + if(lp.recothrw < 1.f) { + recoth = -1.f * recoth + 2.f; + } + float hig = lp.higthrw; float low = lp.lowthrw; - float recoth = lp.recothrw; + //float recoth = lp.recothrw; float decay = lp.decayw; bool invmask = false; maskrecov(tmp1.get(), original, bufmaskoriglc.get(), bfh, bfw, ystart, xstart, hig, low, recoth, decay, invmask, sk, multiThread); @@ -14641,8 +16686,11 @@ void ImProcFunctions::Lab_Local( tmp1->b[x][y] = intp(repart, bufgb->b[x][y], tmp1->b[x][y]); } } - - transit_shapedetect2(sp, 0.f, 0.f, call, 10, bufgb.get(), tmp1.get(), originalmasklc.get(), hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); + if(lp.recothrw >= 1.f) { + transit_shapedetect2(sp, 0.f, 0.f, call, 10, bufgb.get(), tmp1.get(), originalmasklc.get(), hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); + } else { + transit_shapedetect2(sp, 0.f, 0.f, call, 10, bufgb.get(), tmp1.get(), nullptr, hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); + } tmp1.reset(); } @@ -14687,11 +16735,111 @@ void ImProcFunctions::Lab_Local( } } } + float gamma1 = params->locallab.spots.at(sp).shargam; + rtengine::GammaValues g_a; //gamma parameters + double pwr1 = 1.0 / (double) gamma1;//default 3.0 - gamma Lab + double ts1 = 9.03296;//always the same 'slope' in the extrem shadows - slope Lab + rtengine::Color::calcGamma(pwr1, ts1, g_a); // call to calcGamma with selected gamma and slope + if(gamma1 != 1.f) { +#ifdef _OPENMP +# pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh; ++y) { + int x = 0; +#ifdef __SSE2__ + for (; x < bfw - 3; x += 4) { + STVFU(bufsh[y][x], F2V(32768.f) * igammalog(LVFU(bufsh[y][x]) / F2V(32768.f), F2V(gamma1), F2V(ts1), F2V(g_a[2]), F2V(g_a[4]))); + } +#endif + for (;x < bfw; ++x) { + bufsh[y][x] = 32768.f * igammalog(bufsh[y][x] / 32768.f, gamma1, ts1, g_a[2], g_a[4]); + } + } + } + + + + //sharpen only square area instead of all image + ImProcFunctions::deconvsharpeningloc(bufsh, hbuffer, bfw, bfh, loctemp, params->locallab.spots.at(sp).shardamping, (double)params->locallab.spots.at(sp).sharradius, params->locallab.spots.at(sp).shariter, params->locallab.spots.at(sp).sharamount, params->locallab.spots.at(sp).sharcontrast, (double)params->locallab.spots.at(sp).sharblur, 1); + /* + float gamma = params->locallab.spots.at(sp).shargam; + double pwr = 1.0 / (double) gamma;//default 3.0 - gamma Lab + double ts = 9.03296;//always the same 'slope' in the extrem shadows - slope Lab + rtengine::Color::calcGamma(pwr, ts, g_a); // call to calcGamma with selected gamma and slope + */ + if(gamma1 != 1.f) { +#ifdef _OPENMP +# pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh; ++y) {//apply inverse gamma 3.f and put result in range 32768.f + int x = 0; +#ifdef __SSE2__ + for (; x < bfw - 3; x += 4) { + STVFU(bufsh[y][x], F2V(32768.f) * gammalog(LVFU(bufsh[y][x]) / F2V(32768.f), F2V(gamma1), F2V(ts1), F2V(g_a[3]), F2V(g_a[4]))); + STVFU(loctemp[y][x], F2V(32768.f) * gammalog(LVFU(loctemp[y][x]) / F2V(32768.f), F2V(gamma1), F2V(ts1), F2V(g_a[3]), F2V(g_a[4]))); + } +#endif + for (; x < bfw; ++x) { + bufsh[y][x] = 32768.f * gammalog(bufsh[y][x] / 32768.f, gamma1, ts1, g_a[3], g_a[4]); + loctemp[y][x] = 32768.f * gammalog(loctemp[y][x] / 32768.f, gamma1, ts1, g_a[3], g_a[4]); + } + } + } + + + - //sharpen only square area instead of all image - ImProcFunctions::deconvsharpeningloc(bufsh, hbuffer, bfw, bfh, loctemp, params->locallab.spots.at(sp).shardamping, (double)params->locallab.spots.at(sp).sharradius, params->locallab.spots.at(sp).shariter, params->locallab.spots.at(sp).sharamount, params->locallab.spots.at(sp).sharcontrast, (double)params->locallab.spots.at(sp).sharblur, 1); } else { //call from dcrop.cc - ImProcFunctions::deconvsharpeningloc(original->L, shbuffer, bfw, bfh, loctemp, params->locallab.spots.at(sp).shardamping, (double)params->locallab.spots.at(sp).sharradius, params->locallab.spots.at(sp).shariter, params->locallab.spots.at(sp).sharamount, params->locallab.spots.at(sp).sharcontrast, (double)params->locallab.spots.at(sp).sharblur, sk); + float gamma1 = params->locallab.spots.at(sp).shargam; + rtengine::GammaValues g_a; //gamma parameters + double pwr1 = 1.0 / (double) gamma1;//default 3.0 - gamma Lab + double ts1 = 9.03296;//always the same 'slope' in the extrem shadows - slope Lab + rtengine::Color::calcGamma(pwr1, ts1, g_a); // call to calcGamma with selected gamma and slope + if(gamma1 != 1.f) { +#ifdef _OPENMP +# pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh; ++y) { + int x = 0; +#ifdef __SSE2__ + for (; x < bfw - 3; x += 4) { + STVFU(original->L[y][x], F2V(32768.f) * igammalog(LVFU(original->L[y][x]) / F2V(32768.f), F2V(gamma1), F2V(ts1), F2V(g_a[2]), F2V(g_a[4]))); + } +#endif + for (;x < bfw; ++x) { + original->L[y][x] = 32768.f * igammalog(original->L[y][x] / 32768.f, gamma1, ts1, g_a[2], g_a[4]); + } + } + } + + + ImProcFunctions::deconvsharpeningloc(original->L, shbuffer, bfw, bfh, loctemp, params->locallab.spots.at(sp).shardamping, (double)params->locallab.spots.at(sp).sharradius, params->locallab.spots.at(sp).shariter, params->locallab.spots.at(sp).sharamount, params->locallab.spots.at(sp).sharcontrast, (double)params->locallab.spots.at(sp).sharblur, sk); + /* + float gamma = params->locallab.spots.at(sp).shargam; + double pwr = 1.0 / (double) gamma;//default 3.0 - gamma Lab + double ts = 9.03296;//always the same 'slope' in the extrem shadows - slope Lab + rtengine::Color::calcGamma(pwr, ts, g_a); // call to calcGamma with selected gamma and slope + */ + if(gamma1 != 1.f) { +#ifdef _OPENMP +# pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh; ++y) {//apply inverse gamma 3.f and put result in range 32768.f + int x = 0; +#ifdef __SSE2__ + for (; x < bfw - 3; x += 4) { + STVFU(original->L[y][x], F2V(32768.f) * gammalog(LVFU(original->L[y][x]) / F2V(32768.f), F2V(gamma1), F2V(ts1), F2V(g_a[3]), F2V(g_a[4]))); + STVFU(loctemp[y][x], F2V(32768.f) * gammalog(LVFU(loctemp[y][x]) / F2V(32768.f), F2V(gamma1), F2V(ts1), F2V(g_a[3]), F2V(g_a[4]))); + } +#endif + for (; x < bfw; ++x) { + original->L[y][x] = 32768.f * gammalog(original->L[y][x] / 32768.f, gamma1, ts1, g_a[3], g_a[4]); + loctemp[y][x] = 32768.f * gammalog(loctemp[y][x] / 32768.f, gamma1, ts1, g_a[3], g_a[4]); + } + } + } + + } //sharpen ellipse and transition @@ -14708,7 +16856,56 @@ void ImProcFunctions::Lab_Local( int GH = original->H; JaggedArray loctemp(GW, GH); + float gamma1 = params->locallab.spots.at(sp).shargam; + rtengine::GammaValues g_a; //gamma parameters + double pwr1 = 1.0 / (double) gamma1;//default 3.0 - gamma Lab + double ts1 = 9.03296;//always the same 'slope' in the extrem shadows - slope Lab + rtengine::Color::calcGamma(pwr1, ts1, g_a); // call to calcGamma with selected gamma and slope + if(gamma1 != 1.f) { +#ifdef _OPENMP +# pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < GH; ++y) { + int x = 0; +#ifdef __SSE2__ + for (; x < GW - 3; x += 4) { + STVFU(original->L[y][x], F2V(32768.f) * igammalog(LVFU(original->L[y][x]) / F2V(32768.f), F2V(gamma1), F2V(ts1), F2V(g_a[2]), F2V(g_a[4]))); + } +#endif + for (;x < GW; ++x) { + original->L[y][x] = 32768.f * igammalog(original->L[y][x] / 32768.f, gamma1, ts1, g_a[2], g_a[4]); + } + } + } + + + ImProcFunctions::deconvsharpeningloc(original->L, shbuffer, GW, GH, loctemp, params->locallab.spots.at(sp).shardamping, (double)params->locallab.spots.at(sp).sharradius, params->locallab.spots.at(sp).shariter, params->locallab.spots.at(sp).sharamount, params->locallab.spots.at(sp).sharcontrast, (double)params->locallab.spots.at(sp).sharblur, sk); + /* + float gamma = params->locallab.spots.at(sp).shargam; + double pwr = 1.0 / (double) gamma;//default 3.0 - gamma Lab + double ts = 9.03296;//always the same 'slope' in the extrem shadows - slope Lab + rtengine::Color::calcGamma(pwr, ts, g_a); // call to calcGamma with selected gamma and slope + */ + if(gamma1 != 1.f) { +#ifdef _OPENMP +# pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < GH; ++y) {//apply inverse gamma 3.f and put result in range 32768.f + int x = 0; +#ifdef __SSE2__ + for (; x < GW - 3; x += 4) { + STVFU(original->L[y][x], F2V(32768.f) * gammalog(LVFU(original->L[y][x]) / F2V(32768.f), F2V(gamma1), F2V(ts1), F2V(g_a[3]), F2V(g_a[4]))); + STVFU(loctemp[y][x], F2V(32768.f) * igammalog(LVFU(loctemp[y][x]) / F2V(32768.f), F2V(gamma1), F2V(ts1), F2V(g_a[3]), F2V(g_a[4]))); + } +#endif + for (; x < GW; ++x) { + original->L[y][x] = 32768.f * gammalog(original->L[y][x] / 32768.f, gamma1, ts1, g_a[3], g_a[4]); + loctemp[y][x] = 32768.f * igammalog(loctemp[y][x] / 32768.f, gamma1, ts1, g_a[3], g_a[4]); + } + } + } + InverseSharp_Local(loctemp, hueref, lumaref, chromaref, lp, original, transformed, cx, cy, sk); @@ -14763,13 +16960,36 @@ void ImProcFunctions::Lab_Local( #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) if (multiThread) #endif - for (int y = ystart; y < yend; y++) { - for (int x = xstart; x < xend; x++) { - bufexporig->L[y - ystart][x - xstart] = original->L[y][x]; - buforig->L[y - ystart][x - xstart] = original->L[y][x]; + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw; x++) { + bufexporig->L[y][x] = original->L[y + ystart][x + xstart]; + buforig->a[y][x] = original->a[y + ystart][x + xstart]; } } + float gamma1 = lp.gamex; + rtengine::GammaValues g_a; //gamma parameters + double pwr1 = 1.0 / (double) lp.gamex;//default 3.0 - gamma Lab + double ts1 = 9.03296;//always the same 'slope' in the extrem shadows - slope Lab + rtengine::Color::calcGamma(pwr1, ts1, g_a); // call to calcGamma with selected gamma and slope + + if(gamma1 != 1.f) { +#ifdef _OPENMP +# pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh; ++y) { + int x = 0; +#ifdef __SSE2__ + for (; x < bfw - 3; x += 4) { + STVFU(bufexporig->L[y][x], F2V(32768.f) * igammalog(LVFU(bufexporig->L[y][x]) / F2V(32768.f), F2V(gamma1), F2V(ts1), F2V(g_a[2]), F2V(g_a[4]))); + } +#endif + for (;x < bfw; ++x) { + bufexporig->L[y][x] = 32768.f * igammalog(bufexporig->L[y][x] / 32768.f, gamma1, ts1, g_a[2], g_a[4]); + } + } + } + const int spotSi = rtengine::max(1 + 2 * rtengine::max(1, lp.cir / sk), 5); if (bfw > 2 * spotSi && bfh > 2 * spotSi && lp.struexp > 0.f) { @@ -14847,13 +17067,12 @@ void ImProcFunctions::Lab_Local( int lumask = params->locallab.spots.at(sp).lumask; LocHHmaskCurve lochhhmasCurve; const int highl = 0; - maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, bufexporig.get(), bufmaskblurexp.get(), originalmaskexp.get(), original, reserved, inv, lp, 0.f, false, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, lochhhmasCurve, false, multiThread, enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, highl, amountcd, anchorcd, lmaskexplocalcurve, localmaskexputili, dummy, false, 1, 1, 5, 5, shortcu, params->locallab.spots.at(sp).deltae, hueref, chromaref, lumaref, - maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, false, 0.f, 0.f, 0 + maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, false, 0.f, 0.f, 0, fab ); if (lp.showmaskexpmet == 3) { @@ -14881,7 +17100,7 @@ void ImProcFunctions::Lab_Local( if (exlocalcurve && localexutili) {// L=f(L) curve enhanced - + #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) if (multiThread) #endif @@ -14915,6 +17134,7 @@ void ImProcFunctions::Lab_Local( struct grad_params gp; if (lp.strexp != 0.f) { + calclocalGradientParams(lp, gp, ystart, xstart, bfw, bfh, 1); #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) if (multiThread) @@ -14929,6 +17149,7 @@ void ImProcFunctions::Lab_Local( //exposure_pde if (lp.expmet == 1) { if (enablefat) { + const std::unique_ptr datain(new float[bfwr * bfhr]); const std::unique_ptr dataout(new float[bfwr * bfhr]); #ifdef _OPENMP @@ -14954,10 +17175,22 @@ void ImProcFunctions::Lab_Local( } ToneMapFattal02(tmpImagefat.get(), fatParams, 3, 0, nullptr, 0, 0, alg);//last parameter = 1 ==>ART algorithm rgb2lab(*tmpImagefat, *bufexpfin, params->icm.workingProfile); + if (params->locallab.spots.at(sp).expcie && params->locallab.spots.at(sp).modecie == "dr") { + bool HHcurvejz = false, CHcurvejz = false, LHcurvejz = false; + if (params->locallab.spots.at(sp).modecam == "jz") {//some cam16 elementsfor Jz + ImProcFunctions::ciecamloc_02float(lp, sp, bufexpfin.get(), bfw, bfh, 10, sk, cielocalcurve, localcieutili, cielocalcurve2, localcieutili2, jzlocalcurve, localjzutili, czlocalcurve, localczutili, czjzlocalcurve, localczjzutili, locchCurvejz, lochhCurvejz, loclhCurvejz, HHcurvejz, CHcurvejz, LHcurvejz, locwavCurvejz, locwavutilijz); + } + + ImProcFunctions::ciecamloc_02float(lp, sp, bufexpfin.get(), bfw, bfh, 0, sk, cielocalcurve, localcieutili, cielocalcurve2, localcieutili2, jzlocalcurve, localjzutili, czlocalcurve, localczutili, czjzlocalcurve, localczjzutili, locchCurvejz, lochhCurvejz, loclhCurvejz, HHcurvejz, CHcurvejz, LHcurvejz, locwavCurvejz, locwavutilijz); + + float rad = params->locallab.spots.at(sp).detailcie; + loccont(bfw, bfh, bufexpfin.get(), rad, 15.f, sk); + } } if (lp.laplacexp > 0.1f) { + MyMutex::MyLock lock(*fftwMutex); std::unique_ptr datain(new float[bfwr * bfhr]); std::unique_ptr dataout(new float[bfwr * bfhr]); @@ -15013,12 +17246,14 @@ void ImProcFunctions::Lab_Local( } } if (lp.shadex > 0) { + if (lp.expcomp == 0.f) { lp.expcomp = 0.001f; // to enabled } } if (lp.hlcomp > 0.f) { + if (lp.expcomp == 0.f) { lp.expcomp = 0.001f; // to enabled } @@ -15027,12 +17262,14 @@ void ImProcFunctions::Lab_Local( //shadows with ipshadowshighlight if ((lp.expcomp != 0.f) || (exlocalcurve && localexutili)) { if (lp.shadex > 0) { + ImProcFunctions::shadowsHighlights(bufexpfin.get(), true, 1, 0, lp.shadex, 40, sk, 0, lp.shcomp); } } if (lp.expchroma != 0.f) { if ((lp.expcomp != 0.f && lp.expcomp != 0.001f) || (exlocalcurve && localexutili) || lp.laplacexp > 0.1f) { + constexpr float ampli = 70.f; const float ch = (1.f + 0.02f * lp.expchroma); const float chprosl = ch <= 1.f ? 99.f * ch - 99.f : clipChro(ampli * ch - ampli); @@ -15049,15 +17286,44 @@ void ImProcFunctions::Lab_Local( } } } - + /* + float gamma = lp.gamex; + rtengine::GammaValues g_a; //gamma parameters + double pwr = 1.0 / (double) lp.gamex;//default 3.0 - gamma Lab + double ts = 9.03296;//always the same 'slope' in the extrem shadows - slope Lab + rtengine::Color::calcGamma(pwr, ts, g_a); // call to calcGamma with selected gamma and slope + */ + if(gamma1 != 1.f) { +#ifdef _OPENMP +# pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh; ++y) {//apply inverse gamma 3.f and put result in range 32768.f + int x = 0; +#ifdef __SSE2__ + for (; x < bfw - 3; x += 4) { + STVFU(bufexpfin->L[y][x], F2V(32768.f) * gammalog(LVFU(bufexpfin->L[y][x]) / F2V(32768.f), F2V(gamma1), F2V(ts1), F2V(g_a[3]), F2V(g_a[4]))); + } +#endif + for (; x < bfw; ++x) { + bufexpfin->L[y][x] = 32768.f * gammalog(bufexpfin->L[y][x] / 32768.f, gamma1, ts1, g_a[3], g_a[4]); + } + } + } + if (lp.softradiusexp > 0.f && lp.expmet == 0) { softproc(buforig.get(), bufexpfin.get(), lp.softradiusexp, bfh, bfw, 0.1, 0.001, 0.5f, sk, multiThread, 1); } if(lp.enaExpMask && lp.recothre != 1.f) { + float recoth = lp.recothre; + + if(lp.recothre < 1.f) { + recoth = -1.f * recoth + 2.f; + } + float hig = lp.higthre; float low = lp.lowthre; - float recoth = lp.recothre; + // float recoth = lp.recothre; float decay = lp.decaye; bool invmask = false; maskrecov(bufexpfin.get(), original, bufmaskblurexp.get(), bfh, bfw, ystart, xstart, hig, low, recoth, decay, invmask, sk, multiThread); @@ -15080,7 +17346,11 @@ void ImProcFunctions::Lab_Local( } } - transit_shapedetect2(sp, 0.f, 0.f, call, 1, bufexporig.get(), bufexpfin.get(), originalmaskexp.get(), hueref, chromaref, lumaref, sobelref, meansob, blend2, lp, original, transformed, cx, cy, sk); + if(lp.recothre >= 1.f) { + transit_shapedetect2(sp, 0.f, 0.f, call, 1, bufexporig.get(), bufexpfin.get(), originalmaskexp.get(), hueref, chromaref, lumaref, sobelref, meansob, blend2, lp, original, transformed, cx, cy, sk); + } else { + transit_shapedetect2(sp, 0.f, 0.f, call, 1, bufexporig.get(), bufexpfin.get(), nullptr, hueref, chromaref, lumaref, sobelref, meansob, blend2, lp, original, transformed, cx, cy, sk); + } } if (lp.recur) { @@ -15141,13 +17411,12 @@ void ImProcFunctions::Lab_Local( constexpr float anchorcd = 50.f; LocHHmaskCurve lochhhmasCurve; const int highl = 0; - maskcalccol(false, pde, TW, TH, 0, 0, sk, cx, cy, bufexporig.get(), bufmaskblurexp.get(), originalmaskexp.get(), original, reserved, inv, lp, 0.f, false, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, lochhhmasCurve, false, multiThread, enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, highl, amountcd, anchorcd, lmaskexplocalcurve, localmaskexputili, dummy, false, 1, 1, 5, 5, shortcu, false, hueref, chromaref, lumaref, - maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, false, 0.f, 0.f, 0 + maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, false, 0.f, 0.f, 0, fab ); if (lp.showmaskexpmetinv == 1) { @@ -15257,6 +17526,29 @@ void ImProcFunctions::Lab_Local( } } + float gamma1 = lp.gamc; + rtengine::GammaValues g_a; //gamma parameters + double pwr1 = 1.0 / (double) lp.gamc;//default 3.0 - gamma Lab + double ts1 = 9.03296;//always the same 'slope' in the extrem shadows - slope Lab + rtengine::Color::calcGamma(pwr1, ts1, g_a); // call to calcGamma with selected gamma and slope + + if(gamma1 != 1.f) { +#ifdef _OPENMP +# pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bufcolorig->H; ++y) { + int x = 0; +#ifdef __SSE2__ + for (; x < bufcolorig->W - 3; x += 4) { + STVFU(bufcolorig->L[y][x], F2V(32768.f) * igammalog(LVFU(bufcolorig->L[y][x]) / F2V(32768.f), F2V(gamma1), F2V(ts1), F2V(g_a[2]), F2V(g_a[4]))); + } +#endif + for (;x < bufcolorig->W; ++x) { + bufcolorig->L[y][x] = 32768.f * igammalog(bufcolorig->L[y][x] / 32768.f, gamma1, ts1, g_a[2], g_a[4]); + } + } + } + const int spotSi = rtengine::max(1 + 2 * rtengine::max(1, lp.cir / sk), 5); const bool blends = bfw > 2 * spotSi && bfh > 2 * spotSi && lp.struco > 0.f; @@ -15339,14 +17631,13 @@ void ImProcFunctions::Lab_Local( const float anchorcd = 50.f; const int highl = 0; bool astool = params->locallab.spots.at(sp).toolcol; - maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, bufcolorig.get(), bufmaskblurcol.get(), originalmaskcol.get(), original, reserved, inv, lp, strumask, astool, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, llochhhmasCurve, lhhmasutili, multiThread, enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, highl, amountcd, anchorcd, lmasklocalcurve, localmaskutili, loclmasCurvecolwav, lmasutilicolwav, level_bl, level_hl, level_br, level_hr, shortcu, delt, hueref, chromaref, lumaref, - maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, lp.fftColorMask, lp.blurcolmask, lp.contcolmask, -1 + maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, lp.fftColorMask, lp.blurcolmask, lp.contcolmask, -1, fab ); if (lp.showmaskcolmet == 3) { @@ -15504,6 +17795,31 @@ void ImProcFunctions::Lab_Local( rtengine::min(1.f, 0.7f - satreal / 300.f), 0.7, 1, 1 }); + bool LHcurve = false; + if (loclhCurve && LHutili) { + for (int i = 0; i < 500; i++) { + if (loclhCurve[i] != 0.5f) { + LHcurve = true; + break; + } + } + } + bool CHcurve = false; + if (locchCurve && CHutili) { + for (int i = 0; i < 500; i++) { + if (locchCurve[i] != 0.5f) { + CHcurve = true; + break; + } + } + } + double amountchrom = 0.01 * settings->amchroma; + if(amountchrom < 0.05) { + amountchrom = 0.05; + } + if(amountchrom > 2.) { + amountchrom = 2.; + } #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) if (multiThread) @@ -15578,27 +17894,39 @@ void ImProcFunctions::Lab_Local( bufcolcalcL = 0.5f * lllocalcurve[bufcolcalcL * 2.f]; } - if (loclhCurve && LHutili && lp.qualcurvemet != 0) {//L=f(H) curve + + if (loclhCurve && LHcurve && lp.qualcurvemet != 0) {//L=f(H) curve const float rhue = xatan2f(bufcolcalcb, bufcolcalca); - float l_r = bufcolcalcL / 32768.f; //Luminance Lab in 0..1 - const float valparam = loclhCurve[500.f *static_cast(Color::huelab_to_huehsv2(rhue))] - 0.5f; //get l_r=f(H) + //printf("rhu=%f", (double) rhue); + const float chromat = (std::sqrt(SQR(bufcolcalca) + SQR(bufcolcalcb)))/32768.f; + float l_r = LIM01(bufcolcalcL / 32768.f); //Luminance Lab in 0..1 + float valparam = loclhCurve[500.f *static_cast(Color::huelab_to_huehsv2(rhue))] - 0.5f; //get l_r=f(H) + // printf("rh=%f V=%f", (double) rhue, (double) valparam); + // float kc = 0.05f + 0.02f * params->locallab.spots.at(sp).lightjzcie; + float kc = amountchrom; + float valparamneg; + valparamneg = valparam; + float kcc = SQR(chromat / kc); //take Chroma into account...40 "middle low" of chromaticity (arbitrary and simple), one can imagine other algorithme + // printf("KC=%f", (double) kcc); + //reduce action for low chroma and increase action for high chroma + valparam *= 2.f * kcc; + valparamneg *= kcc; //slightly different for negative if (valparam > 0.f) { - l_r = (1.f - valparam) * l_r + valparam * (1.f - SQR(((SQR(1.f - rtengine::min(l_r, 1.0f)))))); - } else { - constexpr float khu = 1.9f; //in reserve in case of! - //for negative - l_r *= (1.f + khu * valparam); + l_r = (1.f - valparam) * l_r + valparam * (1.f - SQR(((SQR(1.f - min(l_r, 1.0f)))))); + } else + //for negative + { + float khue = 1.9f; //in reserve in case of! + l_r *= (1.f + khue * valparamneg); } bufcolcalcL = l_r * 32768.f; } - - - if (locchCurve && CHutili && lp.qualcurvemet != 0) {//C=f(H) curve + if (locchCurve && CHcurve && lp.qualcurvemet != 0) {//C=f(H) curve const float rhue = xatan2f(bufcolcalcb, bufcolcalca); - const float valparam = locchCurve[500.f * static_cast(Color::huelab_to_huehsv2(rhue))] - 0.5f; //get valp=f(H) + const float valparam = 2.f * locchCurve[500.f * static_cast(Color::huelab_to_huehsv2(rhue))] - 0.5f; //get valp=f(H) float chromaChfactor = 1.0f + valparam; bufcolcalca *= chromaChfactor;//apply C=f(H) bufcolcalcb *= chromaChfactor; @@ -16224,15 +18552,47 @@ void ImProcFunctions::Lab_Local( } + +/* + float gamma = lp.gamc; + rtengine::GammaValues g_a; //gamma parameters + double pwr = 1.0 / (double) lp.gamc;//default 3.0 - gamma Lab + double ts = 9.03296;//always the same 'slope' in the extrem shadows - slope Lab + rtengine::Color::calcGamma(pwr, ts, g_a); // call to calcGamma with selected gamma and slope +*/ + if(gamma1 != 1.f) { +#ifdef _OPENMP +# pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh; ++y) {//apply inverse gamma 3.f and put result in range 32768.f + int x = 0; +#ifdef __SSE2__ + for (; x < bfw - 3; x += 4) { + STVFU(bufcolfin->L[y][x], F2V(32768.f) * gammalog(LVFU(bufcolfin->L[y][x]) / F2V(32768.f), F2V(gamma1), F2V(ts1), F2V(g_a[3]), F2V(g_a[4]))); + } +#endif + for (; x < bfw; ++x) { + bufcolfin->L[y][x] = 32768.f * gammalog(bufcolfin->L[y][x] / 32768.f, gamma1, ts1, g_a[3], g_a[4]); + } + } + } + + if (lp.softradiuscol > 0.f) { softproc(bufcolorig.get(), bufcolfin.get(), lp.softradiuscol, bfh, bfw, 0.001, 0.00001, 0.5f, sk, multiThread, 1); } //mask recovery if(lp.enaColorMask && lp.recothrc != 1.f) { + float recoth = lp.recothrc; + + if(lp.recothrc < 1.f) { + recoth = -1.f * recoth + 2.f; + } + float hig = lp.higthrc; float low = lp.lowthrc; - float recoth = lp.recothrc; + // float recoth = lp.recothrc; float decay = lp.decayc; bool invmask = false; maskrecov(bufcolfin.get(), original, bufmaskblurcol.get(), bfh, bfw, ystart, xstart, hig, low, recoth, decay, invmask, sk, multiThread); @@ -16253,7 +18613,11 @@ void ImProcFunctions::Lab_Local( } float meansob = 0.f; - transit_shapedetect2(sp, 0.f, 0.f, call, 0, bufcolorig.get(), bufcolfin.get(), originalmaskcol.get(), hueref, chromaref, lumaref, sobelref, meansob, blend2, lp, original, transformed, cx, cy, sk); + if(lp.recothrc >= 1.f) { + transit_shapedetect2(sp, 0.f, 0.f, call, 0, bufcolorig.get(), bufcolfin.get(), originalmaskcol.get(), hueref, chromaref, lumaref, sobelref, meansob, blend2, lp, original, transformed, cx, cy, sk); + } else { + transit_shapedetect2(sp, 0.f, 0.f, call, 0, bufcolorig.get(), bufcolfin.get(), nullptr, hueref, chromaref, lumaref, sobelref, meansob, blend2, lp, original, transformed, cx, cy, sk); + } } } @@ -16339,14 +18703,13 @@ void ImProcFunctions::Lab_Local( constexpr float amountcd = 0.f; constexpr float anchorcd = 50.f; const int highl = 0; - maskcalccol(false, pde, TW, TH, 0, 0, sk, cx, cy, bufcolorig.get(), bufmaskblurcol.get(), originalmaskcol.get(), original, reserved, inv, lp, strumask, params->locallab.spots.at(sp).toolcol, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, llochhhmasCurve, lhhmasutili, multiThread, enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, highl, amountcd, anchorcd, lmasklocalcurve, localmaskutili, loclmasCurvecolwav, lmasutilicolwav, level_bl, level_hl, level_br, level_hr, shortcu, false, hueref, chromaref, lumaref, - maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, lp.fftColorMask, lp.blurcolmask, lp.contcolmask, -1 + maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, lp.fftColorMask, lp.blurcolmask, lp.contcolmask, -1, fab ); if (lp.showmaskcolmetinv == 1) { @@ -16461,14 +18824,13 @@ void ImProcFunctions::Lab_Local( const float anchorcd = 50.f; const int highl = 0; bool astool = params->locallab.spots.at(sp).toolmask; - maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, bufcolorig.get(), bufmaskblurcol.get(), originalmaskcol.get(), original, reserved, inv, lp, strumask, astool, locccmas_Curve, lcmas_utili, locllmas_Curve, llmas_utili, lochhmas_Curve, lhmas_utili, lochhhmas_Curve, lhhmas_utili, multiThread, enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendmab, shado, highl, amountcd, anchorcd, lmasklocal_curve, localmask_utili, loclmasCurve_wav, lmasutili_wav, level_bl, level_hl, level_br, level_hr, shortcu, delt, hueref, chromaref, lumaref, - maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, lp.fftma, lp.blurma, lp.contma, 12 + maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, lp.fftma, lp.blurma, lp.contma, 12, fab ); @@ -16535,8 +18897,198 @@ void ImProcFunctions::Lab_Local( } } } - //end common mask + + if(params->locallab.spots.at(sp).expcie && params->locallab.spots.at(sp).modecie == "com" && lp.activspot) {//ciecam + int ystart = rtengine::max(static_cast(lp.yc - lp.lyT) - cy, 0); + int yend = rtengine::min(static_cast(lp.yc + lp.ly) - cy, original->H); + int xstart = rtengine::max(static_cast(lp.xc - lp.lxL) - cx, 0); + int xend = rtengine::min(static_cast(lp.xc + lp.lx) - cx, original->W); + int bfh = yend - ystart; + int bfw = xend - xstart; + + if (bfh >= mSP && bfw >= mSP) { + const std::unique_ptr bufexporig(new LabImage(bfw, bfh)); //buffer for data in zone limit + const std::unique_ptr bufexpfin(new LabImage(bfw, bfh)); //buffer for data in zone limit + std::unique_ptr bufmaskorigcie; + std::unique_ptr bufmaskblurcie; + std::unique_ptr originalmaskcie; + + if (lp.showmaskciemet == 2 || lp.enacieMask || lp.showmaskciemet == 3 || lp.showmaskciemet == 4) { + bufmaskorigcie.reset(new LabImage(bfw, bfh)); + bufmaskblurcie.reset(new LabImage(bfw, bfh)); + originalmaskcie.reset(new LabImage(bfw, bfh)); + } + + + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + + for (int y = 0; y < bfh; y++) { + for (int x = 0; x < bfw; x++) { + bufexporig->L[y][x] = original->L[y + ystart][x + xstart]; + bufexporig->a[y][x] = original->a[y + ystart][x + xstart]; + bufexporig->b[y][x] = original->b[y + ystart][x + xstart]; + } + } + + bool HHcurvejz = false, CHcurvejz = false, LHcurvejz = false; + if (params->locallab.spots.at(sp).expcie && params->locallab.spots.at(sp).modecam == "jz") {//some cam16 elementsfor Jz + ImProcFunctions::ciecamloc_02float(lp, sp, bufexporig.get(), bfw, bfh, 10, sk, cielocalcurve, localcieutili, cielocalcurve2, localcieutili2, jzlocalcurve, localjzutili, czlocalcurve, localczutili, czjzlocalcurve, localczjzutili, locchCurvejz, lochhCurvejz, loclhCurvejz, HHcurvejz, CHcurvejz, LHcurvejz, locwavCurvejz, locwavutilijz); + } + if (lochhCurvejz && HHutilijz) { + for (int i = 0; i < 500; i++) { + if (lochhCurvejz[i] != 0.5f) { + HHcurvejz = true; + break; + } + } + } + + if (locchCurvejz && CHutilijz) { + for (int i = 0; i < 500; i++) { + if (locchCurvejz[i] != 0.5f) { + CHcurvejz = true; + break; + } + } + } + + if (loclhCurvejz && LHutilijz) { + for (int i = 0; i < 500; i++) { + if (loclhCurvejz[i] != 0.5f) { + LHcurvejz = true; + break; + } + } + } + + int inv = 0; + bool showmaske = false; + bool enaMask = false; + bool deltaE = false; + bool modmask = false; + bool zero = false; + bool modif = false; + + if (lp.showmaskciemet == 3) { + showmaske = true; + } + + if (lp.enacieMask) { + enaMask = true; + } + + if (lp.showmaskciemet == 4) { + deltaE = true; + } + + if (lp.showmaskciemet == 2) { + modmask = true; + } + + if (lp.showmaskciemet == 1) { + modif = true; + } + + if (lp.showmaskciemet == 0) { + zero = true; + } + + float chrom = lp.chromacie; + float rad = lp.radmacie; + float gamma = params->locallab.spots.at(sp).gammaskcie; + float slope = params->locallab.spots.at(sp).slomaskcie; + float blendm = lp.blendmacie; + float lap = params->locallab.spots.at(sp).lapmaskcie; + bool pde = params->locallab.spots.at(sp).laplac; + LocwavCurve dummy; + bool delt = params->locallab.spots.at(sp).deltae; + int sco = params->locallab.spots.at(sp).scopemask; + int shortcu = 0;//lp.mergemet; //params->locallab.spots.at(sp).shortc; + int shado = 0; + const int highl = 0; + + const float mindE = 2.f + MINSCOPE * sco * lp.thr; + const float maxdE = 5.f + MAXSCOPE * sco * (1 + 0.1f * lp.thr); + const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; + const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); + int lumask = params->locallab.spots.at(sp).lumask; + float amountcd = 0.f; + float anchorcd = 50.f; + LocHHmaskCurve lochhhmasCurve; + maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, bufexporig.get(), bufmaskorigcie.get(), originalmaskcie.get(), original, reserved, inv, lp, + 0.f, false, + locccmascieCurve, lcmascieutili, locllmascieCurve, llmascieutili, lochhmascieCurve, lhmascieutili, lochhhmasCurve, false, multiThread, + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, highl, amountcd, anchorcd, lmaskcielocalcurve, localmaskcieutili, dummy, false, 1, 1, 5, 5, + shortcu, delt, hueref, chromaref, lumaref, + maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, false, 0.f, 0.f, -1, fab + ); + + if (lp.showmaskciemet == 3) { + showmask(lumask, lp, xstart, ystart, cx, cy, bfw, bfh, bufexporig.get(), transformed, bufmaskorigcie.get(), 0); + + return; + } + + + + if (lp.showmaskciemet == 0 || lp.showmaskciemet == 1 || lp.showmaskciemet == 2 || lp.showmaskciemet == 4 || lp.enacieMask) { + + bufexpfin->CopyFrom(bufexporig.get(), multiThread); + if (params->locallab.spots.at(sp).expcie) { + ImProcFunctions::ciecamloc_02float(lp, sp, bufexpfin.get(), bfw, bfh, 0, sk, cielocalcurve, localcieutili, cielocalcurve2, localcieutili2, jzlocalcurve, localjzutili, czlocalcurve, localczutili, czjzlocalcurve, localczjzutili, locchCurvejz, lochhCurvejz, loclhCurvejz, HHcurvejz, CHcurvejz, LHcurvejz, locwavCurvejz, locwavutilijz); + } + } + + if(lp.enacieMask && lp.recothrcie != 1.f) { + float recoth = lp.recothrcie; + + if(lp.recothrcie < 1.f) { + recoth = -1.f * recoth + 2.f; + } + float hig = lp.higthrcie; + float low = lp.lowthrcie; + //float recoth = lp.recothrcie; + float decay = lp.decaycie; + bool invmask = false; + maskrecov(bufexpfin.get(), original, bufmaskorigcie.get(), bfh, bfw, ystart, xstart, hig, low, recoth, decay, invmask, sk, multiThread); + } + + + float radcie = params->locallab.spots.at(sp).detailcie; + loccont(bfw, bfh, bufexpfin.get(), radcie, 15.f, sk); + + const float repart = 1.0 - 0.01 * params->locallab.spots.at(sp).reparcie; + int bw = bufexporig->W; + int bh = bufexporig->H; + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if(multiThread) +#endif + for (int x = 0; x < bh; x++) { + for (int y = 0; y < bw; y++) { + bufexpfin->L[x][y] = intp(repart, bufexporig->L[x][y], bufexpfin->L[x][y]); + bufexpfin->a[x][y] = intp(repart, bufexporig->a[x][y], bufexpfin->a[x][y]); + bufexpfin->b[x][y] = intp(repart, bufexporig->b[x][y], bufexpfin->b[x][y]); + } + } + + if(lp.recothrcie >= 1.f) { + transit_shapedetect2(sp, 0.f, 0.f, call, 31, bufexporig.get(), bufexpfin.get(), originalmaskcie.get(), hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); + } else { + transit_shapedetect2(sp, 0.f, 0.f, call, 31, bufexporig.get(), bufexpfin.get(), nullptr, hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); + } + if (lp.recur) { + original->CopyFrom(transformed, multiThread); + float avge; + calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); + } + } + } + // Gamut and Munsell control - very important do not deactivated to avoid crash avoidcolshi(lp, sp, original, transformed, cy, cx, sk); diff --git a/rtengine/procevents.h b/rtengine/procevents.h index 0bb673f1e..3ff061df8 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -1073,9 +1073,119 @@ enum ProcEventCode { Evlocallabreparexp = 1047, Evlocallabrepartm = 1048, Evlocallabchroml = 1049, + Evlocallabresidgam = 1050, + Evlocallabresidslop = 1051, + Evlocallabnoisegam = 1052, + Evlocallabgamlc = 1053, + Evlocallabgamc = 1054, + Evlocallabgamex = 1055, + EvLocenacie = 1056, + Evlocallabreparcie = 1057, + EvlocallabAutograycie = 1058, + EvlocallabsourceGraycie = 1059, + Evlocallabsourceabscie = 1060, + Evlocallabsursourcie = 1061, + Evlocallabsaturlcie = 1062, + Evlocallabchromlcie = 1063, + Evlocallablightlcie = 1064, + Evlocallablightqcie = 1065, + Evlocallabcontlcie = 1066, + Evlocallabcontthrescie = 1067, + Evlocallabcontqcie = 1068, + Evlocallabcolorflcie = 1069, + Evlocallabtargabscie = 1070, + EvlocallabtargetGraycie = 1071, + Evlocallabcatadcie = 1072, + Evlocallabdetailcie = 1073, + Evlocallabsurroundcie = 1074, + Evlocallabsensicie = 1075, + Evlocallabmodecie = 1076, + Evlocallabrstprotectcie = 1077, + Evlocallabsigmoidldacie = 1078, + Evlocallabsigmoidthcie = 1079, + Evlocallabsigmoidblcie = 1080, + Evlocallabsigmoidqjcie = 1081, + Evlocallabhuecie = 1082, + Evlocallabjabcie = 1083, + Evlocallablightjzcie = 1084, + Evlocallabcontjzcie = 1085, + Evlocallabchromjzcie = 1086, + Evlocallabhuejzcie = 1087, + Evlocallabsigmoidldajzcie = 1088, + Evlocallabsigmoidthjzcie = 1089, + Evlocallabsigmoidbljzcie = 1090, + Evlocallabadapjzcie = 1091, + Evlocallabmodecam = 1092, + Evlocallabhljzcie = 1093, + Evlocallabhlthjzcie = 1094, + Evlocallabshjzcie = 1095, + Evlocallabshthjzcie = 1096, + Evlocallabradjzcie = 1097, +// EvlocallabHHshapejz = 1098, + EvlocallabCHshapejz = 1098, + Evlocallabjz100 = 1099, + Evlocallabpqremap = 1100, + EvlocallabLHshapejz = 1101, + Evlocallabshargam = 1102, + Evlocallabvibgam = 1103, + EvLocallabtoneMethodcie = 1104, + Evlocallabshapecie = 1105, + EvLocallabtoneMethodcie2 = 1106, + Evlocallabshapecie2 = 1107, + Evlocallabshapejz = 1108, + Evlocallabshapecz = 1109, + Evlocallabshapeczjz = 1110, + Evlocallabforcejz = 1111, + //Evlocallablightlzcam = 1113, + //Evlocallablightqzcam = 1114, + //Evlocallabcontlzcam = 1115, + //Evlocallabcontqzcam = 1116, + //Evlocallabcontthreszcam = 1117, + //Evlocallabcolorflzcam = 1118, + //Evlocallabsaturzcam = 1119, + //Evlocallabchromzcam = 1120, + Evlocallabpqremapcam16 = 1112, + EvLocallabEnacieMask = 1113, + EvlocallabCCmaskcieshape = 1114, + EvlocallabLLmaskcieshape = 1115, + EvlocallabHHmaskcieshape = 1116, + Evlocallabblendmaskcie = 1117, + Evlocallabradmaskcie = 1118, + Evlocallabchromaskcie = 1119, + EvlocallabLmaskcieshape = 1120, + Evlocallabrecothrescie = 1121, + Evlocallablowthrescie = 1122, + Evlocallabhigthrescie = 1123, + Evlocallabdecaycie = 1124, + Evlocallablapmaskcie = 1125, + Evlocallabgammaskcie = 1126, + Evlocallabslomaskcie = 1127, + Evlocallabqtoj = 1128, + Evlocallabsaturjzcie = 1129, + EvLocallabSpotdenoichmask = 1130, + Evlocallabsigmalcjz = 1131, + EvlocallabcsThresholdjz = 1132, + EvlocallabwavCurvejz = 1133, + Evlocallabclarilresjz = 1134, + Evlocallabclaricresjz = 1135, + Evlocallabclarisoftjz = 1136, + EvlocallabHHshapejz = 1137, + Evlocallabsoftjzcie = 1138, + Evlocallabthrhjzcie = 1139, + Evlocallabchjzcie = 1140, + Evlocallabstrsoftjzcie = 1141, + EvlocallabblackEvjz = 1142, + EvlocallabwhiteEvjz = 1143, + Evlocallablogjz = 1144, + Evlocallabtargetjz = 1145, + Evlocallabforcebw = 1146, + Evlocallabsigjz = 1147, NUMOFEVENTS }; + + + class ProcEvent { public: diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 9d6c23db9..891ceec40 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2876,6 +2876,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : shortc(false), savrest(false), scopemask(60), + denoichmask(0.), lumask(10), // Color & Light visicolor(false), @@ -2884,6 +2885,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : curvactiv(false), lightness(0), reparcol(100.), + gamc(1.), contrast(0), chroma(0), labgridALow(0.0), @@ -3131,7 +3133,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : expexpose(false), complexexpose(0), expcomp(0.0), - hlcompr(20), + hlcompr(0), hlcomprthresh(0), black(0), shadex(0), @@ -3140,6 +3142,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : sensiex(60), structexp(0), blurexpde(5), + gamex(1.), strexp(0.), angexp(0.), excurve{ @@ -3319,6 +3322,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : complexvibrance(0), saturated(0), pastels(0), + vibgam(1.0), warm(0), psthreshold({0, 75, false}), protectskins(false), @@ -3445,6 +3449,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : noiselumc(0.), noiselumdetail(50.), noiselequal(7), + noisegam(1.), noisechrof(0.), noisechroc(0.), noisechrodetail(50.), @@ -3785,6 +3790,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : shardamping(0), shariter(30), sharblur(0.2), + shargam(1.0), sensisha(40), inverssha(false), // Local Contrast @@ -3802,6 +3808,9 @@ LocallabParams::LocallabSpot::LocallabSpot() : residshathr(30.0), residhi(0.0), residhithr(70.0), + gamlc(1.0), + residgam(2.40), + residslop(12.94), residblur(0.0), levelblur(0.0), sigmabl(1.0), @@ -4261,7 +4270,276 @@ LocallabParams::LocallabSpot::LocallabSpot() : 0.35, 0.35 }, - csthresholdmask(0, 0, 6, 5, false) + csthresholdmask(0, 0, 6, 5, false), + // ciecam + visicie(false), + expcie(false), + complexcie(0), + reparcie(100.), + sensicie(60), + Autograycie(true), + forcejz(true), + forcebw(true), + qtoj(false), + jabcie(true), + sigmoidqjcie(false), + logjz(false), + sigjz(false), + chjzcie(true), + sourceGraycie(18.), + sourceabscie(2000.), + sursourcie("Average"), + modecie("com"), + modecam("cam16"), + saturlcie(0.), + rstprotectcie(0.), + chromlcie(0.), + huecie(0.), + toneMethodcie("one"), + ciecurve{ + static_cast(DCT_NURBS), + 0.0, + 0.0, + 1.0, + 1.0 + }, + toneMethodcie2("onec"), + ciecurve2{ + static_cast(DCT_NURBS), + 0.0, + 0.0, + 1.0, + 1.0 + }, + chromjzcie(0.), + saturjzcie(0.), + huejzcie(0.), + softjzcie(0.), + strsoftjzcie(100.), + thrhjzcie(60.), + jzcurve{ + static_cast(DCT_NURBS), + 0.0, + 0.0, + 1.0, + 1.0 + }, + czcurve{ + static_cast(DCT_NURBS), + 0.0, + 0.0, + 1.0, + 1.0 + }, + czjzcurve{ + static_cast(DCT_NURBS), + 0.0, + 0.0, + 1.0, + 1.0 + }, + HHcurvejz{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 0.50, + 0.35, + 0.35, + 0.166, + 0.50, + 0.35, + 0.35, + 0.333, + 0.50, + 0.35, + 0.35, + 0.50, + 0.50, + 0.35, + 0.35, + 0.666, + 0.50, + 0.35, + 0.35, + 0.833, + 0.50, + 0.35, + 0.35 + }, + CHcurvejz{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 0.50, + 0.35, + 0.35, + 0.166, + 0.50, + 0.35, + 0.35, + 0.333, + 0.50, + 0.35, + 0.35, + 0.50, + 0.50, + 0.35, + 0.35, + 0.666, + 0.50, + 0.35, + 0.35, + 0.833, + 0.50, + 0.35, + 0.35 + }, + LHcurvejz{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 0.50, + 0.35, + 0.35, + 0.166, + 0.50, + 0.35, + 0.35, + 0.333, + 0.50, + 0.35, + 0.35, + 0.50, + 0.50, + 0.35, + 0.35, + 0.666, + 0.50, + 0.35, + 0.35, + 0.833, + 0.50, + 0.35, + 0.35 + }, + lightlcie(0.), + lightjzcie(0.), + lightqcie(0.), + contlcie(0.), + contjzcie(0.), + adapjzcie(4.0), + jz100(0.25), + pqremap(120.), + pqremapcam16(100.), + hljzcie(0.0), + hlthjzcie(70.0), + shjzcie(0.0), + shthjzcie(40.0), + radjzcie(40.0), + sigmalcjz(1.), + clarilresjz(0.), + claricresjz(0.), + clarisoftjz(0.), + locwavcurvejz{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 0.5, + 0.35, + 0.35, + 1., + 0.5, + 0.35, + 0.35 + }, + csthresholdjz(0, 0, 7, 4, false), + contthrescie(0.), + blackEvjz(-5.0), + whiteEvjz(10.0), + targetjz(18.0), + sigmoidldacie(0.), + sigmoidthcie(1.), + sigmoidblcie(1.), + sigmoidldajzcie(0.5), + sigmoidthjzcie(1.), + sigmoidbljzcie(1.), + contqcie(0.), + colorflcie(0.), +/* + lightlzcam(0.), + lightqzcam(0.), + contlzcam(0.), + contqzcam(0.), + contthreszcam(0.), + colorflzcam(0.), + saturzcam(0.), + chromzcam(0.), +*/ + targabscie(16.), + targetGraycie(18.), + catadcie(0.), + detailcie(0.), + surroundcie("Average"), + enacieMask(false), + CCmaskciecurve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 1.0, + 0.35, + 0.35, + 0.50, + 1.0, + 0.35, + 0.35, + 1.0, + 1.0, + 0.35, + 0.35 + }, + LLmaskciecurve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 1.0, + 0.35, + 0.35, + 0.50, + 1.0, + 0.35, + 0.35, + 1.0, + 1.0, + 0.35, + 0.35 + }, + HHmaskciecurve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 1.0, + 0.35, + 0.35, + 0.50, + 1.0, + 0.35, + 0.35, + 1.0, + 1.0, + 0.35, + 0.35 + }, + blendmaskcie(0), + radmaskcie(0.0), + chromaskcie(0.0), + lapmaskcie(0.0), + gammaskcie(1.0), + slomaskcie(0.0), + Lmaskciecurve{ + static_cast(DCT_NURBS), + 0.0, + 0.0, + 1.0, + 1.0 + }, + recothrescie(1.), + lowthrescie(12.), + higthrescie(85.), + decaycie(2.) + { } @@ -4308,6 +4586,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && shortc == other.shortc && savrest == other.savrest && scopemask == other.scopemask + && denoichmask == other.denoichmask && lumask == other.lumask // Color & Light && visicolor == other.visicolor @@ -4316,6 +4595,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && curvactiv == other.curvactiv && lightness == other.lightness && reparcol == other.reparcol + && gamc == other.gamc && contrast == other.contrast && chroma == other.chroma && labgridALow == other.labgridALow @@ -4392,6 +4672,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && sensiex == other.sensiex && structexp == other.structexp && blurexpde == other.blurexpde + && gamex == other.gamex && strexp == other.strexp && angexp == other.angexp && excurve == other.excurve @@ -4478,6 +4759,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && complexvibrance == other.complexvibrance && saturated == other.saturated && pastels == other.pastels + && vibgam == other.vibgam && warm == other.warm && psthreshold == other.psthreshold && protectskins == other.protectskins @@ -4554,6 +4836,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && noiselumc == other.noiselumc && noiselumdetail == other.noiselumdetail && noiselequal == other.noiselequal + && noisegam == other.noisegam && noisechrof == other.noisechrof && noisechroc == other.noisechroc && noisechrodetail == other.noisechrodetail @@ -4672,6 +4955,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && shardamping == other.shardamping && shariter == other.shariter && sharblur == other.sharblur + && shargam == other.shargam && sensisha == other.sensisha && inverssha == other.inverssha // Local contrast @@ -4689,6 +4973,9 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && residshathr == other.residshathr && residhi == other.residhi && residhithr == other.residhithr + && gamlc == other.gamlc + && residgam == other.residgam + && residslop == other.residslop && residblur == other.residblur && levelblur == other.levelblur && sigmabl == other.sigmabl @@ -4859,7 +5146,109 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && HHhmask_curve == other.HHhmask_curve && Lmask_curve == other.Lmask_curve && LLmask_curvewav == other.LLmask_curvewav - && csthresholdmask == other.csthresholdmask; + && csthresholdmask == other.csthresholdmask + //ciecam + && visicie == other.visicie + && expcie == other.expcie + && complexcie == other.complexcie + && reparcie == other.reparcie + && sensicie == other.sensicie + && Autograycie == other.Autograycie + && forcejz == other.forcejz + && forcebw == other.forcebw + && qtoj == other.qtoj + && jabcie == other.jabcie + && sigmoidqjcie == other.sigmoidqjcie + && logjz == other.logjz + && sigjz == other.sigjz + && chjzcie == other.chjzcie + && sourceGraycie == other.sourceGraycie + && sourceabscie == other.sourceabscie + && sursourcie == other.sursourcie + && modecie == other.modecie + && modecam == other.modecam + && saturlcie == other.saturlcie + && rstprotectcie == other.rstprotectcie + && chromlcie == other.chromlcie + && huecie == other.huecie + && toneMethodcie == other.toneMethodcie + && ciecurve == other.ciecurve + && toneMethodcie2 == other.toneMethodcie2 + && ciecurve2 == other.ciecurve2 + && chromjzcie == other.chromjzcie + && saturjzcie == other.saturjzcie + && huejzcie == other.huejzcie + && softjzcie == other.softjzcie + && strsoftjzcie == other.strsoftjzcie + && thrhjzcie == other.thrhjzcie + && jzcurve == other.jzcurve + && czcurve == other.czcurve + && czjzcurve == other.czjzcurve + && HHcurvejz == other.HHcurvejz + && CHcurvejz == other.CHcurvejz + && LHcurvejz == other.LHcurvejz + && lightlcie == other.lightlcie + && lightjzcie == other.lightjzcie + && lightqcie == other.lightqcie + && contlcie == other.contlcie + && contjzcie == other.contjzcie + && adapjzcie == other.adapjzcie + && jz100 == other.jz100 + && pqremap == other.pqremap + && pqremapcam16 == other.pqremapcam16 + && hljzcie == other.hljzcie + && hlthjzcie == other.hlthjzcie + && shjzcie == other.shjzcie + && shthjzcie == other.shthjzcie + && radjzcie == other.radjzcie + && sigmalcjz == other.sigmalcjz + && clarilresjz == other.clarilresjz + && claricresjz == other.claricresjz + && clarisoftjz == other.clarisoftjz + && locwavcurvejz == other.locwavcurvejz + && csthresholdjz == other.csthresholdjz + && contthrescie == other.contthrescie + && blackEvjz == other.blackEvjz + && whiteEvjz == other.whiteEvjz + && targetjz == other.targetjz + && sigmoidldacie == other.sigmoidldacie + && sigmoidthcie == other.sigmoidthcie + && sigmoidblcie == other.sigmoidblcie + && sigmoidldajzcie == other.sigmoidldajzcie + && sigmoidthjzcie == other.sigmoidthjzcie + && sigmoidbljzcie == other.sigmoidbljzcie + && contqcie == other.contqcie + && colorflcie == other.colorflcie +/* && lightlzcam == other.lightlzcam + && lightqzcam == other.lightqzcam + && contlzcam == other.contlzcam + && contqzcam == other.contqzcam + && contthreszcam == other.contthreszcam + && colorflzcam == other.colorflzcam + && saturzcam == other.saturzcam + && chromzcam == other.chromzcam +*/ + && targabscie == other.targabscie + && targetGraycie == other.targetGraycie + && catadcie == other.catadcie + && detailcie == other.detailcie + && surroundcie == other.surroundcie + && enacieMask == other.enacieMask + && CCmaskciecurve == other.CCmaskciecurve + && LLmaskciecurve == other.LLmaskciecurve + && HHmaskciecurve == other.HHmaskciecurve + && blendmaskcie == other.blendmaskcie + && radmaskcie == other.radmaskcie + && chromaskcie == other.chromaskcie + && lapmaskcie == other.lapmaskcie + && gammaskcie == other.gammaskcie + && slomaskcie == other.slomaskcie + && Lmaskciecurve == other.Lmaskciecurve + && recothrescie == other.recothrescie + && lowthrescie == other.lowthrescie + && higthrescie == other.higthrescie + && decaycie == other.decaycie; + } @@ -5981,6 +6370,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || spot_edited->shortc, "Locallab", "Shortc_" + index_str, spot.shortc, keyFile); saveToKeyfile(!pedited || spot_edited->savrest, "Locallab", "Savrest_" + index_str, spot.savrest, keyFile); saveToKeyfile(!pedited || spot_edited->scopemask, "Locallab", "Scopemask_" + index_str, spot.scopemask, keyFile); + saveToKeyfile(!pedited || spot_edited->denoichmask, "Locallab", "Denoichmask_" + index_str, spot.denoichmask, keyFile); saveToKeyfile(!pedited || spot_edited->lumask, "Locallab", "Lumask_" + index_str, spot.lumask, keyFile); // Color & Light if ((!pedited || spot_edited->visicolor) && spot.visicolor) { @@ -5989,6 +6379,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || spot_edited->curvactiv, "Locallab", "Curvactiv_" + index_str, spot.curvactiv, keyFile); saveToKeyfile(!pedited || spot_edited->lightness, "Locallab", "Lightness_" + index_str, spot.lightness, keyFile); saveToKeyfile(!pedited || spot_edited->reparcol, "Locallab", "Reparcol_" + index_str, spot.reparcol, keyFile); + saveToKeyfile(!pedited || spot_edited->gamc, "Locallab", "Gamc_" + index_str, spot.gamc, keyFile); saveToKeyfile(!pedited || spot_edited->contrast, "Locallab", "Contrast_" + index_str, spot.contrast, keyFile); saveToKeyfile(!pedited || spot_edited->chroma, "Locallab", "Chroma_" + index_str, spot.chroma, keyFile); saveToKeyfile(!pedited || spot_edited->labgridALow, "Locallab", "labgridALow_" + index_str, spot.labgridALow, keyFile); @@ -6066,6 +6457,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || spot_edited->sensiex, "Locallab", "Sensiex_" + index_str, spot.sensiex, keyFile); saveToKeyfile(!pedited || spot_edited->structexp, "Locallab", "Structexp_" + index_str, spot.structexp, keyFile); saveToKeyfile(!pedited || spot_edited->blurexpde, "Locallab", "Blurexpde_" + index_str, spot.blurexpde, keyFile); + saveToKeyfile(!pedited || spot_edited->gamex, "Locallab", "Gamex_" + index_str, spot.gamex, keyFile); saveToKeyfile(!pedited || spot_edited->strexp, "Locallab", "Strexp_" + index_str, spot.strexp, keyFile); saveToKeyfile(!pedited || spot_edited->angexp, "Locallab", "Angexp_" + index_str, spot.angexp, keyFile); saveToKeyfile(!pedited || spot_edited->excurve, "Locallab", "ExCurve_" + index_str, spot.excurve, keyFile); @@ -6149,6 +6541,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || spot_edited->complexvibrance, "Locallab", "Complexvibrance_" + index_str, spot.complexvibrance, keyFile); saveToKeyfile(!pedited || spot_edited->saturated, "Locallab", "Saturated_" + index_str, spot.saturated, keyFile); saveToKeyfile(!pedited || spot_edited->pastels, "Locallab", "Pastels_" + index_str, spot.pastels, keyFile); + saveToKeyfile(!pedited || spot_edited->vibgam, "Locallab", "Vibgam_" + index_str, spot.vibgam, keyFile); saveToKeyfile(!pedited || spot_edited->warm, "Locallab", "Warm_" + index_str, spot.warm, keyFile); saveToKeyfile(!pedited || spot_edited->psthreshold, "Locallab", "PSThreshold_" + index_str, spot.psthreshold.toVector(), keyFile); saveToKeyfile(!pedited || spot_edited->protectskins, "Locallab", "ProtectSkins_" + index_str, spot.protectskins, keyFile); @@ -6227,6 +6620,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || spot_edited->noiselumc, "Locallab", "noiselumc_" + index_str, spot.noiselumc, keyFile); saveToKeyfile(!pedited || spot_edited->noiselumdetail, "Locallab", "noiselumdetail_" + index_str, spot.noiselumdetail, keyFile); saveToKeyfile(!pedited || spot_edited->noiselequal, "Locallab", "noiselequal_" + index_str, spot.noiselequal, keyFile); + saveToKeyfile(!pedited || spot_edited->noisegam, "Locallab", "noisegam_" + index_str, spot.noisegam, keyFile); saveToKeyfile(!pedited || spot_edited->noisechrof, "Locallab", "noisechrof_" + index_str, spot.noisechrof, keyFile); saveToKeyfile(!pedited || spot_edited->noisechroc, "Locallab", "noisechroc_" + index_str, spot.noisechroc, keyFile); saveToKeyfile(!pedited || spot_edited->noisechrodetail, "Locallab", "noisechrodetail_" + index_str, spot.noisechrodetail, keyFile); @@ -6348,6 +6742,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || spot_edited->shardamping, "Locallab", "Shardamping_" + index_str, spot.shardamping, keyFile); saveToKeyfile(!pedited || spot_edited->shariter, "Locallab", "Shariter_" + index_str, spot.shariter, keyFile); saveToKeyfile(!pedited || spot_edited->sharblur, "Locallab", "Sharblur_" + index_str, spot.sharblur, keyFile); + saveToKeyfile(!pedited || spot_edited->shargam, "Locallab", "Shargam_" + index_str, spot.shargam, keyFile); saveToKeyfile(!pedited || spot_edited->sensisha, "Locallab", "Sensisha_" + index_str, spot.sensisha, keyFile); saveToKeyfile(!pedited || spot_edited->inverssha, "Locallab", "Inverssha_" + index_str, spot.inverssha, keyFile); } @@ -6366,6 +6761,9 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || spot_edited->residshathr, "Locallab", "Residshathr_" + index_str, spot.residshathr, keyFile); saveToKeyfile(!pedited || spot_edited->residhi, "Locallab", "Residhi_" + index_str, spot.residhi, keyFile); saveToKeyfile(!pedited || spot_edited->residhithr, "Locallab", "Residhithr_" + index_str, spot.residhithr, keyFile); + saveToKeyfile(!pedited || spot_edited->gamlc, "Locallab", "Gamlc_" + index_str, spot.gamlc, keyFile); + saveToKeyfile(!pedited || spot_edited->residgam, "Locallab", "Residgam_" + index_str, spot.residgam, keyFile); + saveToKeyfile(!pedited || spot_edited->residslop, "Locallab", "Residslop_" + index_str, spot.residslop, keyFile); saveToKeyfile(!pedited || spot_edited->residblur, "Locallab", "Residblur_" + index_str, spot.residblur, keyFile); saveToKeyfile(!pedited || spot_edited->levelblur, "Locallab", "Levelblur_" + index_str, spot.levelblur, keyFile); saveToKeyfile(!pedited || spot_edited->sigmabl, "Locallab", "Sigmabl_" + index_str, spot.sigmabl, keyFile); @@ -6472,7 +6870,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || spot_edited->targetGray, "Locallab", "TargetGray_" + index_str, spot.targetGray, keyFile); saveToKeyfile(!pedited || spot_edited->catad, "Locallab", "Catad_" + index_str, spot.catad, keyFile); saveToKeyfile(!pedited || spot_edited->saturl, "Locallab", "Saturl_" + index_str, spot.saturl, keyFile); - saveToKeyfile(!pedited || spot_edited->saturl, "Locallab", "Chroml_" + index_str, spot.chroml, keyFile); + saveToKeyfile(!pedited || spot_edited->chroml, "Locallab", "Chroml_" + index_str, spot.chroml, keyFile); saveToKeyfile(!pedited || spot_edited->LcurveL, "Locallab", "LCurveL_" + index_str, spot.LcurveL, keyFile); saveToKeyfile(!pedited || spot_edited->lightl, "Locallab", "Lightl_" + index_str, spot.lightl, keyFile); saveToKeyfile(!pedited || spot_edited->lightq, "Locallab", "Brightq_" + index_str, spot.lightq, keyFile); @@ -6480,7 +6878,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || spot_edited->contthres, "Locallab", "Contthres_" + index_str, spot.contthres, keyFile); saveToKeyfile(!pedited || spot_edited->contq, "Locallab", "Contq_" + index_str, spot.contq, keyFile); saveToKeyfile(!pedited || spot_edited->colorfl, "Locallab", "Colorfl_" + index_str, spot.colorfl, keyFile); - saveToKeyfile(!pedited || spot_edited->Autogray, "Locallab", "Autogray_" + index_str, spot.Autogray, keyFile); + saveToKeyfile(!pedited || spot_edited->Autogray, "Locallab", "AutoGray_" + index_str, spot.Autogray, keyFile); saveToKeyfile(!pedited || spot_edited->fullimage, "Locallab", "Fullimage_" + index_str, spot.fullimage, keyFile); saveToKeyfile(!pedited || spot_edited->repar, "Locallab", "Repart_" + index_str, spot.repar, keyFile); saveToKeyfile(!pedited || spot_edited->ciecam, "Locallab", "Ciecam_" + index_str, spot.ciecam, keyFile); @@ -6537,6 +6935,113 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || spot_edited->LLmask_curvewav, "Locallab", "LLmask_Curvewav_" + index_str, spot.LLmask_curvewav, keyFile); saveToKeyfile(!pedited || spot_edited->csthresholdmask, "Locallab", "CSThresholdmask_" + index_str, spot.csthresholdmask.toVector(), keyFile); } + //ciecam + if ((!pedited || spot_edited->visicie) && spot.visicie) { + saveToKeyfile(!pedited || spot_edited->expcie, "Locallab", "Expcie_" + index_str, spot.expcie, keyFile); + saveToKeyfile(!pedited || spot_edited->complexcie, "Locallab", "Complexcie_" + index_str, spot.complexcie, keyFile); + saveToKeyfile(!pedited || spot_edited->reparcie, "Locallab", "Reparcie_" + index_str, spot.reparcie, keyFile); + saveToKeyfile(!pedited || spot_edited->sensicie, "Locallab", "Sensicie_" + index_str, spot.sensicie, keyFile); + saveToKeyfile(!pedited || spot_edited->Autograycie, "Locallab", "AutoGraycie_" + index_str, spot.Autograycie, keyFile); + saveToKeyfile(!pedited || spot_edited->forcejz, "Locallab", "Forcejz_" + index_str, spot.forcejz, keyFile); + saveToKeyfile(!pedited || spot_edited->forcebw, "Locallab", "Forcebw_" + index_str, spot.forcebw, keyFile); + saveToKeyfile(!pedited || spot_edited->qtoj, "Locallab", "Qtoj_" + index_str, spot.qtoj, keyFile); + saveToKeyfile(!pedited || spot_edited->jabcie, "Locallab", "jabcie_" + index_str, spot.jabcie, keyFile); + saveToKeyfile(!pedited || spot_edited->sigmoidqjcie, "Locallab", "sigmoidqjcie_" + index_str, spot.sigmoidqjcie, keyFile); + saveToKeyfile(!pedited || spot_edited->logjz, "Locallab", "Logjz_" + index_str, spot.logjz, keyFile); + saveToKeyfile(!pedited || spot_edited->sigjz, "Locallab", "Sigjz_" + index_str, spot.sigjz, keyFile); + saveToKeyfile(!pedited || spot_edited->chjzcie, "Locallab", "chjzcie_" + index_str, spot.chjzcie, keyFile); + saveToKeyfile(!pedited || spot_edited->sourceGraycie, "Locallab", "SourceGraycie_" + index_str, spot.sourceGraycie, keyFile); + saveToKeyfile(!pedited || spot_edited->sourceabscie, "Locallab", "Sourceabscie_" + index_str, spot.sourceabscie, keyFile); + saveToKeyfile(!pedited || spot_edited->sursourcie, "Locallab", "Sursourcie_" + index_str, spot.sursourcie, keyFile); + saveToKeyfile(!pedited || spot_edited->modecie, "Locallab", "Modecie_" + index_str, spot.modecie, keyFile); + saveToKeyfile(!pedited || spot_edited->modecam, "Locallab", "Modecam_" + index_str, spot.modecam, keyFile); + saveToKeyfile(!pedited || spot_edited->saturlcie, "Locallab", "Saturlcie_" + index_str, spot.saturlcie, keyFile); + saveToKeyfile(!pedited || spot_edited->rstprotectcie, "Locallab", "Rstprotectcie_" + index_str, spot.rstprotectcie, keyFile); + saveToKeyfile(!pedited || spot_edited->chromlcie, "Locallab", "Chromlcie_" + index_str, spot.chromlcie, keyFile); + saveToKeyfile(!pedited || spot_edited->huecie, "Locallab", "Huecie_" + index_str, spot.huecie, keyFile); + saveToKeyfile(!pedited || spot_edited->toneMethodcie, "Locallab", "ToneMethodcie_" + index_str, spot.toneMethodcie, keyFile); + saveToKeyfile(!pedited || spot_edited->ciecurve, "Locallab", "Ciecurve_" + index_str, spot.ciecurve, keyFile); + saveToKeyfile(!pedited || spot_edited->toneMethodcie2, "Locallab", "ToneMethodcie2_" + index_str, spot.toneMethodcie2, keyFile); + saveToKeyfile(!pedited || spot_edited->ciecurve2, "Locallab", "Ciecurve2_" + index_str, spot.ciecurve2, keyFile); + saveToKeyfile(!pedited || spot_edited->chromjzcie, "Locallab", "Chromjzcie_" + index_str, spot.chromjzcie, keyFile); + saveToKeyfile(!pedited || spot_edited->saturjzcie, "Locallab", "Saturjzcie_" + index_str, spot.saturjzcie, keyFile); + saveToKeyfile(!pedited || spot_edited->huejzcie, "Locallab", "Huejzcie_" + index_str, spot.huejzcie, keyFile); + saveToKeyfile(!pedited || spot_edited->softjzcie, "Locallab", "Softjzcie_" + index_str, spot.softjzcie, keyFile); + saveToKeyfile(!pedited || spot_edited->strsoftjzcie, "Locallab", "strSoftjzcie_" + index_str, spot.strsoftjzcie, keyFile); + saveToKeyfile(!pedited || spot_edited->thrhjzcie, "Locallab", "Thrhjzcie_" + index_str, spot.thrhjzcie, keyFile); + saveToKeyfile(!pedited || spot_edited->CHcurvejz, "Locallab", "JzCurve_" + index_str, spot.jzcurve, keyFile); + saveToKeyfile(!pedited || spot_edited->CHcurvejz, "Locallab", "CzCurve_" + index_str, spot.czcurve, keyFile); + saveToKeyfile(!pedited || spot_edited->CHcurvejz, "Locallab", "CzJzCurve_" + index_str, spot.czjzcurve, keyFile); + saveToKeyfile(!pedited || spot_edited->HHcurvejz, "Locallab", "HHCurvejz_" + index_str, spot.HHcurvejz, keyFile); + saveToKeyfile(!pedited || spot_edited->CHcurvejz, "Locallab", "CHCurvejz_" + index_str, spot.CHcurvejz, keyFile); + saveToKeyfile(!pedited || spot_edited->CHcurvejz, "Locallab", "LHCurvejz_" + index_str, spot.LHcurvejz, keyFile); + saveToKeyfile(!pedited || spot_edited->lightlcie, "Locallab", "Lightlcie_" + index_str, spot.lightlcie, keyFile); + saveToKeyfile(!pedited || spot_edited->lightjzcie, "Locallab", "Lightjzcie_" + index_str, spot.lightjzcie, keyFile); + saveToKeyfile(!pedited || spot_edited->lightqcie, "Locallab", "Brightqcie_" + index_str, spot.lightqcie, keyFile); + saveToKeyfile(!pedited || spot_edited->contlcie, "Locallab", "Contlcie_" + index_str, spot.contlcie, keyFile); + saveToKeyfile(!pedited || spot_edited->contjzcie, "Locallab", "Contjzcie_" + index_str, spot.contjzcie, keyFile); + saveToKeyfile(!pedited || spot_edited->adapjzcie, "Locallab", "Adapjzcie_" + index_str, spot.adapjzcie, keyFile); + saveToKeyfile(!pedited || spot_edited->jz100, "Locallab", "Jz100_" + index_str, spot.jz100, keyFile); + saveToKeyfile(!pedited || spot_edited->pqremap, "Locallab", "PQremap_" + index_str, spot.pqremap, keyFile); + saveToKeyfile(!pedited || spot_edited->pqremapcam16, "Locallab", "PQremapcam16_" + index_str, spot.pqremapcam16, keyFile); + saveToKeyfile(!pedited || spot_edited->hljzcie, "Locallab", "Hljzcie_" + index_str, spot.hljzcie, keyFile); + saveToKeyfile(!pedited || spot_edited->hlthjzcie, "Locallab", "Hlthjzcie_" + index_str, spot.hlthjzcie, keyFile); + saveToKeyfile(!pedited || spot_edited->shjzcie, "Locallab", "Shjzcie_" + index_str, spot.shjzcie, keyFile); + saveToKeyfile(!pedited || spot_edited->shthjzcie, "Locallab", "Shthjzcie_" + index_str, spot.shthjzcie, keyFile); + saveToKeyfile(!pedited || spot_edited->radjzcie, "Locallab", "Radjzcie_" + index_str, spot.radjzcie, keyFile); + saveToKeyfile(!pedited || spot_edited->sigmalcjz, "Locallab", "Sigmalcjz_" + index_str, spot.sigmalcjz, keyFile); + saveToKeyfile(!pedited || spot_edited->clarilresjz, "Locallab", "Clarilresjz_" + index_str, spot.clarilresjz, keyFile); + saveToKeyfile(!pedited || spot_edited->claricresjz, "Locallab", "Claricresjz_" + index_str, spot.claricresjz, keyFile); + saveToKeyfile(!pedited || spot_edited->clarisoftjz, "Locallab", "Clarisoftjz_" + index_str, spot.clarisoftjz, keyFile); + saveToKeyfile(!pedited || spot_edited->locwavcurvejz, "Locallab", "LocwavCurvejz_" + index_str, spot.locwavcurvejz, keyFile); + saveToKeyfile(!pedited || spot_edited->csthresholdjz, "Locallab", "CSThresholdjz_" + index_str, spot.csthresholdjz.toVector(), keyFile); + saveToKeyfile(!pedited || spot_edited->contthrescie, "Locallab", "Contthrescie_" + index_str, spot.contthrescie, keyFile); + saveToKeyfile(!pedited || spot_edited->blackEvjz, "Locallab", "BlackEvjz_" + index_str, spot.blackEvjz, keyFile); + saveToKeyfile(!pedited || spot_edited->whiteEvjz, "Locallab", "WhiteEvjz_" + index_str, spot.whiteEvjz, keyFile); + saveToKeyfile(!pedited || spot_edited->targetjz, "Locallab", "Targetjz_" + index_str, spot.targetjz, keyFile); + saveToKeyfile(!pedited || spot_edited->sigmoidldacie, "Locallab", "Sigmoidldacie_" + index_str, spot.sigmoidldacie, keyFile); + saveToKeyfile(!pedited || spot_edited->sigmoidthcie, "Locallab", "Sigmoidthcie_" + index_str, spot.sigmoidthcie, keyFile); + saveToKeyfile(!pedited || spot_edited->sigmoidblcie, "Locallab", "Sigmoidblcie_" + index_str, spot.sigmoidblcie, keyFile); + saveToKeyfile(!pedited || spot_edited->sigmoidldajzcie, "Locallab", "Sigmoidldajzcie_" + index_str, spot.sigmoidldajzcie, keyFile); + saveToKeyfile(!pedited || spot_edited->sigmoidthjzcie, "Locallab", "Sigmoidthjzcie_" + index_str, spot.sigmoidthjzcie, keyFile); + saveToKeyfile(!pedited || spot_edited->sigmoidbljzcie, "Locallab", "Sigmoidbljzcie_" + index_str, spot.sigmoidbljzcie, keyFile); + saveToKeyfile(!pedited || spot_edited->contqcie, "Locallab", "Contqcie_" + index_str, spot.contqcie, keyFile); + saveToKeyfile(!pedited || spot_edited->colorflcie, "Locallab", "Colorflcie_" + index_str, spot.colorflcie, keyFile); +/* + saveToKeyfile(!pedited || spot_edited->lightlzcam, "Locallab", "Lightlzcam_" + index_str, spot.lightlzcam, keyFile); + saveToKeyfile(!pedited || spot_edited->lightqzcam, "Locallab", "Lightqzcam_" + index_str, spot.lightqzcam, keyFile); + saveToKeyfile(!pedited || spot_edited->contlzcam, "Locallab", "Contlzcam_" + index_str, spot.contlzcam, keyFile); + saveToKeyfile(!pedited || spot_edited->contqzcam, "Locallab", "Contqzcam_" + index_str, spot.contqzcam, keyFile); + saveToKeyfile(!pedited || spot_edited->contthreszcam, "Locallab", "Contthreszcam_" + index_str, spot.contthreszcam, keyFile); + saveToKeyfile(!pedited || spot_edited->colorflzcam, "Locallab", "Colorflzcam_" + index_str, spot.colorflzcam, keyFile); + saveToKeyfile(!pedited || spot_edited->saturzcam, "Locallab", "Saturzcam_" + index_str, spot.saturzcam, keyFile); + saveToKeyfile(!pedited || spot_edited->chromzcam, "Locallab", "Chromzcam_" + index_str, spot.chromzcam, keyFile); +*/ + saveToKeyfile(!pedited || spot_edited->targabscie, "Locallab", "Targabscie_" + index_str, spot.targabscie, keyFile); + saveToKeyfile(!pedited || spot_edited->targetGraycie, "Locallab", "TargetGraycie_" + index_str, spot.targetGraycie, keyFile); + saveToKeyfile(!pedited || spot_edited->catadcie, "Locallab", "Catadcie_" + index_str, spot.catadcie, keyFile); + saveToKeyfile(!pedited || spot_edited->detailcie, "Locallab", "Detailcie_" + index_str, spot.detailcie, keyFile); + saveToKeyfile(!pedited || spot_edited->surroundcie, "Locallab", "Surroundcie_" + index_str, spot.surroundcie, keyFile); + saveToKeyfile(!pedited || spot_edited->enacieMask, "Locallab", "EnacieMask_" + index_str, spot.enacieMask, keyFile); + saveToKeyfile(!pedited || spot_edited->CCmaskciecurve, "Locallab", "CCmaskcieCurve_" + index_str, spot.CCmaskciecurve, keyFile); + saveToKeyfile(!pedited || spot_edited->LLmaskciecurve, "Locallab", "LLmaskcieCurve_" + index_str, spot.LLmaskciecurve, keyFile); + saveToKeyfile(!pedited || spot_edited->HHmaskciecurve, "Locallab", "HHmaskcieCurve_" + index_str, spot.HHmaskciecurve, keyFile); + saveToKeyfile(!pedited || spot_edited->blendmaskcie, "Locallab", "Blendmaskcie_" + index_str, spot.blendmaskcie, keyFile); + saveToKeyfile(!pedited || spot_edited->radmaskcie, "Locallab", "Radmaskcie_" + index_str, spot.radmaskcie, keyFile); + saveToKeyfile(!pedited || spot_edited->chromaskcie, "Locallab", "Chromaskcie_" + index_str, spot.chromaskcie, keyFile); + saveToKeyfile(!pedited || spot_edited->lapmaskcie, "Locallab", "Lapmaskcie_" + index_str, spot.lapmaskcie, keyFile); + saveToKeyfile(!pedited || spot_edited->gammaskcie, "Locallab", "Gammaskcie_" + index_str, spot.gammaskcie, keyFile); + saveToKeyfile(!pedited || spot_edited->slomaskcie, "Locallab", "Slomaskcie_" + index_str, spot.slomaskcie, keyFile); + saveToKeyfile(!pedited || spot_edited->Lmaskciecurve, "Locallab", "LmaskcieCurve_" + index_str, spot.Lmaskciecurve, keyFile); + saveToKeyfile(!pedited || spot_edited->recothrescie, "Locallab", "Recothrescie_" + index_str, spot.recothrescie, keyFile); + saveToKeyfile(!pedited || spot_edited->lowthrescie, "Locallab", "Lowthrescie_" + index_str, spot.lowthrescie, keyFile); + saveToKeyfile(!pedited || spot_edited->higthrescie, "Locallab", "Higthrescie_" + index_str, spot.higthrescie, keyFile); + saveToKeyfile(!pedited || spot_edited->decaycie, "Locallab", "Decaycie_" + index_str, spot.decaycie, keyFile); + + + + } + } } @@ -7938,6 +8443,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Shortc_" + index_str, pedited, spot.shortc, spotEdited.shortc); assignFromKeyfile(keyFile, "Locallab", "Savrest_" + index_str, pedited, spot.savrest, spotEdited.savrest); assignFromKeyfile(keyFile, "Locallab", "Scopemask_" + index_str, pedited, spot.scopemask, spotEdited.scopemask); + assignFromKeyfile(keyFile, "Locallab", "Denoichmask_" + index_str, pedited, spot.denoichmask, spotEdited.denoichmask); assignFromKeyfile(keyFile, "Locallab", "Lumask_" + index_str, pedited, spot.lumask, spotEdited.lumask); // Color & Light spot.visicolor = assignFromKeyfile(keyFile, "Locallab", "Expcolor_" + index_str, pedited, spot.expcolor, spotEdited.expcolor); @@ -7950,6 +8456,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Curvactiv_" + index_str, pedited, spot.curvactiv, spotEdited.curvactiv); assignFromKeyfile(keyFile, "Locallab", "Lightness_" + index_str, pedited, spot.lightness, spotEdited.lightness); assignFromKeyfile(keyFile, "Locallab", "Reparcol_" + index_str, pedited, spot.reparcol, spotEdited.reparcol); + assignFromKeyfile(keyFile, "Locallab", "Gamc_" + index_str, pedited, spot.gamc, spotEdited.gamc); assignFromKeyfile(keyFile, "Locallab", "Contrast_" + index_str, pedited, spot.contrast, spotEdited.contrast); assignFromKeyfile(keyFile, "Locallab", "Chroma_" + index_str, pedited, spot.chroma, spotEdited.chroma); assignFromKeyfile(keyFile, "Locallab", "labgridALow_" + index_str, pedited, spot.labgridALow, spotEdited.labgridALow); @@ -8040,6 +8547,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Sensiex_" + index_str, pedited, spot.sensiex, spotEdited.sensiex); assignFromKeyfile(keyFile, "Locallab", "Structexp_" + index_str, pedited, spot.structexp, spotEdited.structexp); assignFromKeyfile(keyFile, "Locallab", "Blurexpde_" + index_str, pedited, spot.blurexpde, spotEdited.blurexpde); + assignFromKeyfile(keyFile, "Locallab", "Gamex_" + index_str, pedited, spot.gamex, spotEdited.gamex); assignFromKeyfile(keyFile, "Locallab", "Strexp_" + index_str, pedited, spot.strexp, spotEdited.strexp); assignFromKeyfile(keyFile, "Locallab", "Angexp_" + index_str, pedited, spot.angexp, spotEdited.angexp); assignFromKeyfile(keyFile, "Locallab", "ExCurve_" + index_str, pedited, spot.excurve, spotEdited.excurve); @@ -8131,6 +8639,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Complexvibrance_" + index_str, pedited, spot.complexvibrance, spotEdited.complexvibrance); assignFromKeyfile(keyFile, "Locallab", "Saturated_" + index_str, pedited, spot.saturated, spotEdited.saturated); assignFromKeyfile(keyFile, "Locallab", "Pastels_" + index_str, pedited, spot.pastels, spotEdited.pastels); + assignFromKeyfile(keyFile, "Locallab", "Vibgam_" + index_str, pedited, spot.vibgam, spotEdited.vibgam); assignFromKeyfile(keyFile, "Locallab", "Warm_" + index_str, pedited, spot.warm, spotEdited.warm); if (keyFile.has_key("Locallab", "PSThreshold_" + index_str)) { @@ -8225,6 +8734,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "noiselumc_" + index_str, pedited, spot.noiselumc, spotEdited.noiselumc); assignFromKeyfile(keyFile, "Locallab", "noiselumdetail_" + index_str, pedited, spot.noiselumdetail, spotEdited.noiselumdetail); assignFromKeyfile(keyFile, "Locallab", "noiselequal_" + index_str, pedited, spot.noiselequal, spotEdited.noiselequal); + assignFromKeyfile(keyFile, "Locallab", "noisegam_" + index_str, pedited, spot.noisegam, spotEdited.noisegam); assignFromKeyfile(keyFile, "Locallab", "noisechrof_" + index_str, pedited, spot.noisechrof, spotEdited.noisechrof); assignFromKeyfile(keyFile, "Locallab", "noisechroc_" + index_str, pedited, spot.noisechroc, spotEdited.noisechroc); assignFromKeyfile(keyFile, "Locallab", "noisechrodetail_" + index_str, pedited, spot.noisechrodetail, spotEdited.noisechrodetail); @@ -8364,6 +8874,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Shardamping_" + index_str, pedited, spot.shardamping, spotEdited.shardamping); assignFromKeyfile(keyFile, "Locallab", "Shariter_" + index_str, pedited, spot.shariter, spotEdited.shariter); assignFromKeyfile(keyFile, "Locallab", "Sharblur_" + index_str, pedited, spot.sharblur, spotEdited.sharblur); + assignFromKeyfile(keyFile, "Locallab", "Shargam_" + index_str, pedited, spot.shargam, spotEdited.shargam); assignFromKeyfile(keyFile, "Locallab", "Sensisha_" + index_str, pedited, spot.sensisha, spotEdited.sensisha); assignFromKeyfile(keyFile, "Locallab", "Inverssha_" + index_str, pedited, spot.inverssha, spotEdited.inverssha); // Local Contrast @@ -8384,7 +8895,10 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Residsha_" + index_str, pedited, spot.residsha, spotEdited.residsha); assignFromKeyfile(keyFile, "Locallab", "Residshathr_" + index_str, pedited, spot.residshathr, spotEdited.residshathr); assignFromKeyfile(keyFile, "Locallab", "Residhi_" + index_str, pedited, spot.residhi, spotEdited.residhi); + assignFromKeyfile(keyFile, "Locallab", "Gamlc_" + index_str, pedited, spot.gamlc, spotEdited.gamlc); assignFromKeyfile(keyFile, "Locallab", "Residhithr_" + index_str, pedited, spot.residhithr, spotEdited.residhithr); + assignFromKeyfile(keyFile, "Locallab", "Residgam_" + index_str, pedited, spot.residgam, spotEdited.residgam); + assignFromKeyfile(keyFile, "Locallab", "Residslop_" + index_str, pedited, spot.residslop, spotEdited.residslop); assignFromKeyfile(keyFile, "Locallab", "Residblur_" + index_str, pedited, spot.residblur, spotEdited.residblur); assignFromKeyfile(keyFile, "Locallab", "Levelblur_" + index_str, pedited, spot.levelblur, spotEdited.levelblur); assignFromKeyfile(keyFile, "Locallab", "Sigmabl_" + index_str, pedited, spot.sigmabl, spotEdited.sigmabl); @@ -8584,6 +9098,122 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) spotEdited.visimask = true; } + // ciecam + spot.visicie = assignFromKeyfile(keyFile, "Locallab", "Expcie_" + index_str, pedited, spot.expcie, spotEdited.expcie); + + if (spot.visicie) { + spotEdited.visicie = true; + } + assignFromKeyfile(keyFile, "Locallab", "Complexcie_" + index_str, pedited, spot.complexcie, spotEdited.complexcie); + assignFromKeyfile(keyFile, "Locallab", "Reparcie_" + index_str, pedited, spot.reparcie, spotEdited.reparcie); + assignFromKeyfile(keyFile, "Locallab", "Sensicie_" + index_str, pedited, spot.sensicie, spotEdited.sensicie); + assignFromKeyfile(keyFile, "Locallab", "AutoGraycie_" + index_str, pedited, spot.Autograycie, spotEdited.Autograycie); + assignFromKeyfile(keyFile, "Locallab", "Forcejz_" + index_str, pedited, spot.forcejz, spotEdited.forcejz); + assignFromKeyfile(keyFile, "Locallab", "Forcebw_" + index_str, pedited, spot.forcebw, spotEdited.forcebw); + assignFromKeyfile(keyFile, "Locallab", "Qtoj_" + index_str, pedited, spot.qtoj, spotEdited.qtoj); + assignFromKeyfile(keyFile, "Locallab", "jabcie_" + index_str, pedited, spot.jabcie, spotEdited.jabcie); + assignFromKeyfile(keyFile, "Locallab", "sigmoidqjcie_" + index_str, pedited, spot.sigmoidqjcie, spotEdited.sigmoidqjcie); + assignFromKeyfile(keyFile, "Locallab", "Logjz_" + index_str, pedited, spot.logjz, spotEdited.logjz); + assignFromKeyfile(keyFile, "Locallab", "Sigjz_" + index_str, pedited, spot.sigjz, spotEdited.sigjz); + assignFromKeyfile(keyFile, "Locallab", "chjzcie_" + index_str, pedited, spot.chjzcie, spotEdited.chjzcie); + assignFromKeyfile(keyFile, "Locallab", "SourceGraycie_" + index_str, pedited, spot.sourceGraycie, spotEdited.sourceGraycie); + assignFromKeyfile(keyFile, "Locallab", "Sourceabscie_" + index_str, pedited, spot.sourceabscie, spotEdited.sourceabscie); + assignFromKeyfile(keyFile, "Locallab", "Sursourcie_" + index_str, pedited, spot.sursourcie, spotEdited.sursourcie); + assignFromKeyfile(keyFile, "Locallab", "Modecie_" + index_str, pedited, spot.modecie, spotEdited.modecie); + assignFromKeyfile(keyFile, "Locallab", "Modecam_" + index_str, pedited, spot.modecam, spotEdited.modecam); + assignFromKeyfile(keyFile, "Locallab", "Saturlcie_" + index_str, pedited, spot.saturlcie, spotEdited.saturlcie); + assignFromKeyfile(keyFile, "Locallab", "Rstprotectcie_" + index_str, pedited, spot.rstprotectcie, spotEdited.rstprotectcie); + assignFromKeyfile(keyFile, "Locallab", "Chromlcie_" + index_str, pedited, spot.chromlcie, spotEdited.chromlcie); + assignFromKeyfile(keyFile, "Locallab", "Huecie_" + index_str, pedited, spot.huecie, spotEdited.huecie); + assignFromKeyfile(keyFile, "Locallab", "ToneMethodcie_" + index_str, pedited, spot.toneMethodcie, spotEdited.toneMethodcie); + assignFromKeyfile(keyFile, "Locallab", "Ciecurve_" + index_str, pedited, spot.ciecurve, spotEdited.ciecurve); + assignFromKeyfile(keyFile, "Locallab", "ToneMethodcie2_" + index_str, pedited, spot.toneMethodcie2, spotEdited.toneMethodcie2); + assignFromKeyfile(keyFile, "Locallab", "Ciecurve2_" + index_str, pedited, spot.ciecurve2, spotEdited.ciecurve2); + assignFromKeyfile(keyFile, "Locallab", "Chromjzcie_" + index_str, pedited, spot.chromjzcie, spotEdited.chromjzcie); + assignFromKeyfile(keyFile, "Locallab", "Saturjzcie_" + index_str, pedited, spot.saturjzcie, spotEdited.saturjzcie); + assignFromKeyfile(keyFile, "Locallab", "Huejzcie_" + index_str, pedited, spot.huejzcie, spotEdited.huejzcie); + assignFromKeyfile(keyFile, "Locallab", "Softjzcie_" + index_str, pedited, spot.softjzcie, spotEdited.softjzcie); + assignFromKeyfile(keyFile, "Locallab", "strSoftjzcie_" + index_str, pedited, spot.strsoftjzcie, spotEdited.strsoftjzcie); + assignFromKeyfile(keyFile, "Locallab", "Thrhjzcie_" + index_str, pedited, spot.thrhjzcie, spotEdited.thrhjzcie); + assignFromKeyfile(keyFile, "Locallab", "JzCurve_" + index_str, pedited, spot.jzcurve, spotEdited.jzcurve); + assignFromKeyfile(keyFile, "Locallab", "CzCurve_" + index_str, pedited, spot.czcurve, spotEdited.czcurve); + assignFromKeyfile(keyFile, "Locallab", "CzJzCurve_" + index_str, pedited, spot.czjzcurve, spotEdited.czjzcurve); + assignFromKeyfile(keyFile, "Locallab", "HHCurvejz_" + index_str, pedited, spot.HHcurvejz, spotEdited.HHcurvejz); + assignFromKeyfile(keyFile, "Locallab", "CHCurvejz_" + index_str, pedited, spot.CHcurvejz, spotEdited.CHcurvejz); + assignFromKeyfile(keyFile, "Locallab", "LHCurvejz_" + index_str, pedited, spot.LHcurvejz, spotEdited.LHcurvejz); + assignFromKeyfile(keyFile, "Locallab", "Lightlcie_" + index_str, pedited, spot.lightlcie, spotEdited.lightlcie); + assignFromKeyfile(keyFile, "Locallab", "Lightjzcie_" + index_str, pedited, spot.lightjzcie, spotEdited.lightjzcie); + assignFromKeyfile(keyFile, "Locallab", "Brightqcie_" + index_str, pedited, spot.lightqcie, spotEdited.lightqcie); + assignFromKeyfile(keyFile, "Locallab", "Contlcie_" + index_str, pedited, spot.contlcie, spotEdited.contlcie); + assignFromKeyfile(keyFile, "Locallab", "Contjzcie_" + index_str, pedited, spot.contjzcie, spotEdited.contjzcie); + assignFromKeyfile(keyFile, "Locallab", "Adapjzcie_" + index_str, pedited, spot.adapjzcie, spotEdited.adapjzcie); + assignFromKeyfile(keyFile, "Locallab", "Jz100_" + index_str, pedited, spot.jz100, spotEdited.jz100); + assignFromKeyfile(keyFile, "Locallab", "PQremap_" + index_str, pedited, spot.pqremap, spotEdited.pqremap); + assignFromKeyfile(keyFile, "Locallab", "PQremapcam16_" + index_str, pedited, spot.pqremapcam16, spotEdited.pqremapcam16); + assignFromKeyfile(keyFile, "Locallab", "Hljzcie_" + index_str, pedited, spot.hljzcie, spotEdited.hljzcie); + assignFromKeyfile(keyFile, "Locallab", "Hlthjzcie_" + index_str, pedited, spot.hlthjzcie, spotEdited.hlthjzcie); + assignFromKeyfile(keyFile, "Locallab", "Shjzcie_" + index_str, pedited, spot.shjzcie, spotEdited.shjzcie); + assignFromKeyfile(keyFile, "Locallab", "Shthjzcie_" + index_str, pedited, spot.shthjzcie, spotEdited.shthjzcie); + assignFromKeyfile(keyFile, "Locallab", "Radjzcie_" + index_str, pedited, spot.radjzcie, spotEdited.radjzcie); + if (keyFile.has_key("Locallab", "CSThresholdjz_" + index_str)) { + + const std::vector thresh = keyFile.get_integer_list("Locallab", "CSThresholdjz_" + index_str); + + if (thresh.size() >= 4) { + spot.csthresholdjz.setValues(thresh[0], thresh[1], min(thresh[2], 10), min(thresh[3], 10)); + } + + spotEdited.csthresholdjz = true; + } + assignFromKeyfile(keyFile, "Locallab", "Sigmalcjz_" + index_str, pedited, spot.sigmalcjz, spotEdited.sigmalcjz); + assignFromKeyfile(keyFile, "Locallab", "Clarilresjz_" + index_str, pedited, spot.clarilresjz, spotEdited.clarilresjz); + assignFromKeyfile(keyFile, "Locallab", "Claricresjz_" + index_str, pedited, spot.claricresjz, spotEdited.claricresjz); + assignFromKeyfile(keyFile, "Locallab", "Clarisoftjz_" + index_str, pedited, spot.clarisoftjz, spotEdited.clarisoftjz); + assignFromKeyfile(keyFile, "Locallab", "LocwavCurvejz_" + index_str, pedited, spot.locwavcurvejz, spotEdited.locwavcurvejz); + assignFromKeyfile(keyFile, "Locallab", "Contthrescie_" + index_str, pedited, spot.contthrescie, spotEdited.contthrescie); + assignFromKeyfile(keyFile, "Locallab", "Contthrescie_" + index_str, pedited, spot.contthrescie, spotEdited.contthrescie); + assignFromKeyfile(keyFile, "Locallab", "BlackEvjz_" + index_str, pedited, spot.blackEvjz, spotEdited.blackEvjz); + assignFromKeyfile(keyFile, "Locallab", "WhiteEvjz_" + index_str, pedited, spot.whiteEvjz, spotEdited.whiteEvjz); + assignFromKeyfile(keyFile, "Locallab", "Targetjz_" + index_str, pedited, spot.targetjz, spotEdited.targetjz); + assignFromKeyfile(keyFile, "Locallab", "Sigmoidthcie_" + index_str, pedited, spot.sigmoidthcie, spotEdited.sigmoidthcie); + assignFromKeyfile(keyFile, "Locallab", "Sigmoidblcie_" + index_str, pedited, spot.sigmoidblcie, spotEdited.sigmoidblcie); + assignFromKeyfile(keyFile, "Locallab", "Sigmoidldajzcie_" + index_str, pedited, spot.sigmoidldajzcie, spotEdited.sigmoidldajzcie); + assignFromKeyfile(keyFile, "Locallab", "Sigmoidthjzcie_" + index_str, pedited, spot.sigmoidthjzcie, spotEdited.sigmoidthjzcie); + assignFromKeyfile(keyFile, "Locallab", "Sigmoidbljzcie_" + index_str, pedited, spot.sigmoidbljzcie, spotEdited.sigmoidbljzcie); + assignFromKeyfile(keyFile, "Locallab", "Contqcie_" + index_str, pedited, spot.contqcie, spotEdited.contqcie); + assignFromKeyfile(keyFile, "Locallab", "Colorflcie_" + index_str, pedited, spot.colorflcie, spotEdited.colorflcie); +/* + assignFromKeyfile(keyFile, "Locallab", "Lightlzcam_" + index_str, pedited, spot.lightlzcam, spotEdited.lightlzcam); + assignFromKeyfile(keyFile, "Locallab", "Lightqzcam_" + index_str, pedited, spot.lightqzcam, spotEdited.lightqzcam); + assignFromKeyfile(keyFile, "Locallab", "Contlzcam_" + index_str, pedited, spot.contlzcam, spotEdited.contlzcam); + assignFromKeyfile(keyFile, "Locallab", "Contqzcam_" + index_str, pedited, spot.contqzcam, spotEdited.contqzcam); + assignFromKeyfile(keyFile, "Locallab", "Contthreszcam_" + index_str, pedited, spot.contthreszcam, spotEdited.contthreszcam); +*/ + assignFromKeyfile(keyFile, "Locallab", "Targabscie_" + index_str, pedited, spot.targabscie, spotEdited.targabscie); + assignFromKeyfile(keyFile, "Locallab", "TargetGraycie_" + index_str, pedited, spot.targetGraycie, spotEdited.targetGraycie); + assignFromKeyfile(keyFile, "Locallab", "Catadcie_" + index_str, pedited, spot.catadcie, spotEdited.catadcie); + assignFromKeyfile(keyFile, "Locallab", "Detailcie_" + index_str, pedited, spot.detailcie, spotEdited.detailcie); +/* + assignFromKeyfile(keyFile, "Locallab", "Colorflzcam_" + index_str, pedited, spot.colorflzcam, spotEdited.colorflzcam); + assignFromKeyfile(keyFile, "Locallab", "Saturzcam_" + index_str, pedited, spot.saturzcam, spotEdited.saturzcam); + assignFromKeyfile(keyFile, "Locallab", "Chromzcam_" + index_str, pedited, spot.chromzcam, spotEdited.chromzcam); +*/ + assignFromKeyfile(keyFile, "Locallab", "EnacieMask_" + index_str, pedited, spot.enacieMask, spotEdited.enacieMask); + assignFromKeyfile(keyFile, "Locallab", "CCmaskcieCurve_" + index_str, pedited, spot.CCmaskciecurve, spotEdited.CCmaskciecurve); + assignFromKeyfile(keyFile, "Locallab", "LLmaskcieCurve_" + index_str, pedited, spot.LLmaskciecurve, spotEdited.LLmaskciecurve); + assignFromKeyfile(keyFile, "Locallab", "HHmaskcieCurve_" + index_str, pedited, spot.HHmaskciecurve, spotEdited.HHmaskciecurve); + assignFromKeyfile(keyFile, "Locallab", "Blendmaskcie_" + index_str, pedited, spot.blendmaskcie, spotEdited.blendmaskcie); + assignFromKeyfile(keyFile, "Locallab", "Radmaskcie_" + index_str, pedited, spot.radmaskcie, spotEdited.radmaskcie); + assignFromKeyfile(keyFile, "Locallab", "Chromaskcie_" + index_str, pedited, spot.chromaskcie, spotEdited.chromaskcie); + assignFromKeyfile(keyFile, "Locallab", "Lapmaskcie_" + index_str, pedited, spot.lapmaskcie, spotEdited.lapmaskcie); + assignFromKeyfile(keyFile, "Locallab", "Gammaskcie_" + index_str, pedited, spot.gammaskcie, spotEdited.gammaskcie); + assignFromKeyfile(keyFile, "Locallab", "Slomaskcie_" + index_str, pedited, spot.slomaskcie, spotEdited.slomaskcie); + assignFromKeyfile(keyFile, "Locallab", "LmaskcieCurve_" + index_str, pedited, spot.Lmaskciecurve, spotEdited.Lmaskciecurve); + assignFromKeyfile(keyFile, "Locallab", "Recothrescie_" + index_str, pedited, spot.recothrescie, spotEdited.recothrescie); + assignFromKeyfile(keyFile, "Locallab", "Lowthrescie_" + index_str, pedited, spot.lowthrescie, spotEdited.lowthrescie); + assignFromKeyfile(keyFile, "Locallab", "Higthrescie_" + index_str, pedited, spot.higthrescie, spotEdited.higthrescie); + assignFromKeyfile(keyFile, "Locallab", "Decaycie_" + index_str, pedited, spot.decaycie, spotEdited.decaycie); + // Append LocallabSpot and LocallabParamsEdited locallab.spots.push_back(spot); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index c9dc2e42f..5ef95bfa2 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1037,6 +1037,7 @@ struct LocallabParams { bool shortc; bool savrest; int scopemask; + double denoichmask; int lumask; // Color & Light bool visicolor; @@ -1045,6 +1046,7 @@ struct LocallabParams { bool curvactiv; int lightness; double reparcol; + double gamc; int contrast; int chroma; double labgridALow; @@ -1121,6 +1123,7 @@ struct LocallabParams { int sensiex; int structexp; int blurexpde; + double gamex; double strexp; double angexp; std::vector excurve; @@ -1199,6 +1202,7 @@ struct LocallabParams { int complexvibrance; int saturated; int pastels; + double vibgam; int warm; Threshold psthreshold; bool protectskins; @@ -1275,6 +1279,7 @@ struct LocallabParams { double noiselumc; double noiselumdetail; int noiselequal; + double noisegam; double noisechrof; double noisechroc; double noisechrodetail; @@ -1393,6 +1398,7 @@ struct LocallabParams { int shardamping; int shariter; double sharblur; + double shargam; int sensisha; bool inverssha; // Local Contrast @@ -1410,6 +1416,9 @@ struct LocallabParams { double residshathr; double residhi; double residhithr; + double gamlc; + double residgam; + double residslop; double residblur; double levelblur; double sigmabl; @@ -1573,6 +1582,108 @@ struct LocallabParams { std::vector Lmask_curve; std::vector LLmask_curvewav; Threshold csthresholdmask; + //ciecam + bool visicie; + bool expcie; + int complexcie; + double reparcie; + int sensicie; + bool Autograycie; + bool forcejz; + bool forcebw; + bool qtoj; + bool jabcie; + bool sigmoidqjcie; + bool logjz; + bool sigjz; + bool chjzcie; + double sourceGraycie; + double sourceabscie; + Glib::ustring sursourcie; + Glib::ustring modecie; + Glib::ustring modecam; + double saturlcie; + double rstprotectcie; + double chromlcie; + double huecie; + Glib::ustring toneMethodcie; + std::vector ciecurve; + Glib::ustring toneMethodcie2; + std::vector ciecurve2; + double chromjzcie; + double saturjzcie; + double huejzcie; + double softjzcie; + double strsoftjzcie; + double thrhjzcie; + std::vector jzcurve; + std::vector czcurve; + std::vector czjzcurve; + std::vector HHcurvejz; + std::vector CHcurvejz; + std::vector LHcurvejz; + double lightlcie; + double lightjzcie; + double lightqcie; + double contlcie; + double contjzcie; + double adapjzcie; + double jz100; + double pqremap; + double pqremapcam16; + double hljzcie; + double hlthjzcie; + double shjzcie; + double shthjzcie; + double radjzcie; + double sigmalcjz; + double clarilresjz; + double claricresjz; + double clarisoftjz; + std::vector locwavcurvejz; + Threshold csthresholdjz; + double contthrescie; + double blackEvjz; + double whiteEvjz; + double targetjz; + double sigmoidldacie; + double sigmoidthcie; + double sigmoidblcie; + double sigmoidldajzcie; + double sigmoidthjzcie; + double sigmoidbljzcie; + double contqcie; + double colorflcie; +/* + double lightlzcam; + double lightqzcam; + double contlzcam; + double contqzcam; + double contthreszcam; + double colorflzcam; + double saturzcam; + double chromzcam; +*/ + double targabscie; + double targetGraycie; + double catadcie; + double detailcie; + Glib::ustring surroundcie; + bool enacieMask; + std::vector CCmaskciecurve; + std::vector LLmaskciecurve; + std::vector HHmaskciecurve; + int blendmaskcie; + double radmaskcie; + double chromaskcie; + double lapmaskcie; + double gammaskcie; + double slomaskcie; + std::vector Lmaskciecurve; + double recothrescie; + double lowthrescie; + double higthrescie; + double decaycie; LocallabSpot(); diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index 722898642..a1fc5b418 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -524,7 +524,7 @@ int refreshmap[rtengine::NUMOFEVENTS] = { DEMOSAIC, // EvPdShrEnabled CAPTURESHARPEN, // EvPdShrMaskToggled AUTOEXP, // EvLocallabSpotDeleted - M_VOID, // EvLocallabSpotSelected + HDR, // EvLocallabSpotSelected M_VOID, // EvLocallabSpotName M_VOID, // EvLocallabSpotVisibility AUTOEXP, // EvLocallabSpotShape @@ -1077,8 +1077,114 @@ int refreshmap[rtengine::NUMOFEVENTS] = { AUTOEXP, // Evlocallabreparsh AUTOEXP, // Evlocallabreparexp AUTOEXP, // Evlocallabrepartm - AUTOEXP // Evlocallabchroml - + AUTOEXP, // Evlocallabchroml + AUTOEXP, // Evlocallabresidgam + AUTOEXP, // Evlocallabresidslop + AUTOEXP, // Evlocallabnoisegam + AUTOEXP, //Evlocallabgamlc + AUTOEXP, //Evlocallabgamc + AUTOEXP, //Evlocallabgamex + AUTOEXP | M_AUTOEXP, // EvLocenacie + AUTOEXP, //Evlocallabreparcie + HDR, //EvlocallabAutograycie + HDR, //EvlocallabsourceGraycie + HDR, //Evlocallabsourceabscie + AUTOEXP, //Evlocallabsursourcie + AUTOEXP, //Evlocallabsaturlcie + AUTOEXP, //Evlocallabchromlcie + AUTOEXP, //Evlocallablightlcie + AUTOEXP, //Evlocallablightqcie + AUTOEXP, //Evlocallabcontlcie + AUTOEXP, //Evlocallabcontthrescie + AUTOEXP, //Evlocallabcontqcie + AUTOEXP, //Evlocallabcolorflcie + AUTOEXP, //Evlocallabtargabscie + AUTOEXP, //EvlocallabtargetGraycie + AUTOEXP, //Evlocallabcatadcie + AUTOEXP, //Evlocallabdetailcie + AUTOEXP, //Evlocallabsurroundcie + AUTOEXP, //Evlocallabsensicie + AUTOEXP, //Evlocallabmodecie + AUTOEXP, //Evlocallabrstprotectcie + AUTOEXP, //Evlocallabsigmoidldacie + AUTOEXP, //Evlocallabsigmoidthcie + AUTOEXP, //Evlocallabsigmoidblcie + AUTOEXP, //Evlocallabsigmoidqjcie + AUTOEXP, //Evlocallabhuecie + AUTOEXP, //Evlocallabjabcie + AUTOEXP, //Evlocallablightjzcie + AUTOEXP, //Evlocallabcontjzcie + AUTOEXP, //Evlocallabchromjzcie + AUTOEXP, //Evlocallabhuejzcie + AUTOEXP, //Evlocallabsigmoidldajzcie + AUTOEXP, //Evlocallabsigmoidthjzcie + AUTOEXP, //Evlocallabsigmoidbljzcie + AUTOEXP, //Evlocallabadapjzcie + AUTOEXP, //Evlocallabmodecam + AUTOEXP, //Evlocallabhljzcie + AUTOEXP, //Evlocallabhlthjzcie + AUTOEXP, //Evlocallabshjzcie + AUTOEXP, //Evlocallabshthjzcie + AUTOEXP, //Evlocallabradjzcie +// AUTOEXP, //EvlocallabHHshapejz + AUTOEXP, //EvlocallabCHshapejz + AUTOEXP, //Evlocallabjz100 + AUTOEXP, //Evlocallabpqremap + AUTOEXP, //EvlocallabLHshapejz + AUTOEXP, //Evlocallabshargam + AUTOEXP, //Evlocallabvibgam + AUTOEXP, //EvLocallabtoneMethodcie + AUTOEXP, //Evlocallabshapecie + AUTOEXP, //EvLocallabtoneMethodcie2 + AUTOEXP, //Evlocallabshapecie2 + AUTOEXP, //Evlocallabshapejz + AUTOEXP, //Evlocallabshapecz + AUTOEXP, //Evlocallabshapeczjz + AUTOEXP, //Evlocallabforcejz +// AUTOEXP, //Evlocallablightlzcam +// AUTOEXP, //Evlocallablightqzcam +// AUTOEXP, //Evlocallabcontlzcam +// AUTOEXP, //Evlocallabcontqzcam +// AUTOEXP, //Evlocallabcontthreszcam +// AUTOEXP, //Evlocallabcolorflzcam +// AUTOEXP, //Evlocallabsaturzcam +// AUTOEXP, //Evlocallabchromzcam + AUTOEXP, //Evlocallabpqremapcam16 + AUTOEXP, //EvLocallabEnacieMask + AUTOEXP, //EvlocallabCCmaskcieshape + AUTOEXP, //EvlocallabLLmaskcieshape + AUTOEXP, //EvlocallabHHmaskcieshape + AUTOEXP, //Evlocallabblendmaskcie + AUTOEXP, //Evlocallabradmaskcie + AUTOEXP, //Evlocallabchromaskcie + AUTOEXP, //EvlocallabLmaskcieshape + AUTOEXP, //Evlocallabrecothrescie + AUTOEXP, //Evlocallablowthrescie + AUTOEXP, //Evlocallabhigthrescie + AUTOEXP, //Evlocallabdecaycie + AUTOEXP, //Evlocallablapmaskcie + AUTOEXP, //Evlocallabgammaskcie + AUTOEXP, //Evlocallabslomaskcie + AUTOEXP, //Evlocallabqtoj + AUTOEXP, //Evlocallabsaturjzcie + AUTOEXP, //EvLocallabSpotdenoichmask + AUTOEXP, //Evlocallabsigmalcjz + AUTOEXP, //EvlocallabcsThresholdjz + AUTOEXP, //EvlocallabwavCurvejz + AUTOEXP, //Evlocallabclarilresjz + AUTOEXP, //Evlocallabclaricresjz + AUTOEXP, //Evlocallabclarisoftjz + AUTOEXP, //EvlocallabHHshapejz + AUTOEXP, //Evlocallabsoftjzcie + AUTOEXP, //Evlocallabthrhjzcie + AUTOEXP, //Evlocallabchjzcie + AUTOEXP, //Evlocallabstrsoftjzcie + AUTOEXP, //EvlocallabblackEvjz + AUTOEXP, //EvlocallabwhiteEvjz + AUTOEXP, //Evlocallablogjz + AUTOEXP, //Evlocallabtargetjz + AUTOEXP, //Evlocallabforcebw + AUTOEXP //Evlocallabsigjz }; diff --git a/rtengine/rtengine.h b/rtengine/rtengine.h index f26cef890..b9fc916f6 100644 --- a/rtengine/rtengine.h +++ b/rtengine/rtengine.h @@ -424,6 +424,7 @@ public: double huer; double lumar; double chromar; + float fab; }; struct locallabRetiMinMax { @@ -438,9 +439,10 @@ public: }; virtual ~LocallabListener() = default; - virtual void refChanged(const std::vector &ref, int selspot) = 0; +// virtual void refChanged(const std::vector &ref, int selspot) = 0; virtual void minmaxChanged(const std::vector &minmax, int selspot) = 0; - virtual void logencodChanged(const float blackev, const float whiteev, const float sourceg, const float sourceab, const float targetg) = 0; + virtual void logencodChanged(const float blackev, const float whiteev, const float sourceg, const float sourceab, const float targetg, const bool autocomput, const bool autocie, const float jz1) = 0; + virtual void refChanged2(float *huerefp, float *chromarefp, float *lumarefp, float *fabrefp, int selspot) = 0; }; class AutoColorTonListener @@ -610,7 +612,7 @@ public: virtual void updateUnLock() = 0; - virtual void setLocallabMaskVisibility(bool previewDeltaE, int locallColorMask, int locallColorMaskinv, int locallExpMask, int locallExpMaskinv, int locallSHMask, int locallSHMaskinv, int locallvibMask, int locallsoftMask, int locallblMask, int localltmMask, int locallretiMask, int locallsharMask, int localllcMask, int locallcbMask, int localllogMask, int locall_Mask) = 0; + virtual void setLocallabMaskVisibility(bool previewDeltaE, int locallColorMask, int locallColorMaskinv, int locallExpMask, int locallExpMaskinv, int locallSHMask, int locallSHMaskinv, int locallvibMask, int locallsoftMask, int locallblMask, int localltmMask, int locallretiMask, int locallsharMask, int localllcMask, int locallcbMask, int localllogMask, int locall_Mask, int locallcieMask) = 0; /** Creates and returns a Crop instance that acts as a window on the image * @param editDataProvider pointer to the EditDataProvider that communicates with the EditSubscriber diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index cf500474f..86f1c1372 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -1489,10 +1489,11 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT adap = 2000.f; } else { float E_V = fcomp + log2 ((fnum * fnum) / fspeed / (fiso / 100.f)); - float expo2 = params.toneCurve.expcomp; // exposure compensation in tonecurve ==> direct EV + double kexp = 0.; + float expo2 = kexp * params.toneCurve.expcomp; // exposure compensation in tonecurve ==> direct EV E_V += expo2; float expo1;//exposure raw white point - expo1 = log2 (params.raw.expos); //log2 ==>linear to EV + expo1 = 0.5 * log2 (params.raw.expos); //log2 ==>linear to EV E_V += expo1; adap = powf (2.f, E_V - 3.f); //cd / m2 //end calculation adaptation scene luminosity diff --git a/rtengine/settings.h b/rtengine/settings.h index 0fb4996df..fc512e9ff 100644 --- a/rtengine/settings.h +++ b/rtengine/settings.h @@ -65,6 +65,7 @@ public: bool HistogramWorking; // true: histogram is display the value of the image computed in the Working profile // false: histogram is display the value of the image computed in the Output profile int amchroma; + int amchromajz; int protectred; double protectredh; double nrauto; diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index e343e6d52..6e75635cf 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -952,6 +952,9 @@ private: LocLHCurve loclhCurve; LocHHCurve lochhCurve; LocCHCurve locchCurve; + LocHHCurve lochhCurvejz; + LocCHCurve locchCurvejz; + LocLHCurve loclhCurvejz; LocCCmaskCurve locccmasCurve; LocLLmaskCurve locllmasCurve; LocHHmaskCurve lochhmasCurve; @@ -983,6 +986,9 @@ private: LocCCmaskCurve locccmaslogCurve; LocLLmaskCurve locllmaslogCurve; LocHHmaskCurve lochhmaslogCurve; + LocCCmaskCurve locccmascieCurve; + LocLLmaskCurve locllmascieCurve; + LocHHmaskCurve lochhmascieCurve; LocCCmaskCurve locccmas_Curve; LocLLmaskCurve locllmas_Curve; @@ -993,6 +999,7 @@ private: LocwavCurve loclmasCurvecolwav; LocwavCurve loclmasCurve_wav; LocwavCurve locwavCurve; + LocwavCurve locwavCurvejz; LocwavCurve loclevwavCurve; LocwavCurve locconwavCurve; LocwavCurve loccompwavCurve; @@ -1021,6 +1028,12 @@ private: LUTf lmasklclocalcurve(65536, LUT_CLIP_OFF); LUTf lmaskloglocalcurve(65536, LUT_CLIP_OFF); LUTf lmasklocal_curve(65536, LUT_CLIP_OFF); + LUTf lmaskcielocalcurve(65536, LUT_CLIP_OFF); + LUTf cielocalcurve(65536, LUT_CLIP_OFF); + LUTf cielocalcurve2(65536, LUT_CLIP_OFF); + LUTf jzlocalcurve(65536, LUT_CLIP_OFF); + LUTf czlocalcurve(65536, LUT_CLIP_OFF); + LUTf czjzlocalcurve(65536, LUT_CLIP_OFF); array2D shbuffer; for (size_t sp = 0; sp < params.locallab.spots.size(); sp++) { @@ -1038,6 +1051,9 @@ private: const bool LHutili = loclhCurve.Set(params.locallab.spots.at(sp).LHcurve); const bool HHutili = lochhCurve.Set(params.locallab.spots.at(sp).HHcurve); const bool CHutili = locchCurve.Set(params.locallab.spots.at(sp).CHcurve); + const bool HHutilijz = lochhCurvejz.Set(params.locallab.spots.at(sp).HHcurvejz); + const bool CHutilijz = locchCurvejz.Set(params.locallab.spots.at(sp).CHcurvejz); + const bool LHutilijz = loclhCurvejz.Set(params.locallab.spots.at(sp).LHcurvejz); const bool lcmasutili = locccmasCurve.Set(params.locallab.spots.at(sp).CCmaskcurve); const bool llmasutili = locllmasCurve.Set(params.locallab.spots.at(sp).LLmaskcurve); const bool lhmasutili = lochhmasCurve.Set(params.locallab.spots.at(sp).HHmaskcurve); @@ -1067,6 +1083,9 @@ private: const bool lcmaslogutili = locccmaslogCurve.Set(params.locallab.spots.at(sp).CCmaskcurveL); const bool llmaslogutili = locllmaslogCurve.Set(params.locallab.spots.at(sp).LLmaskcurveL); const bool lhmaslogutili = lochhmaslogCurve.Set(params.locallab.spots.at(sp).HHmaskcurveL); + const bool lcmascieutili = locccmascieCurve.Set(params.locallab.spots.at(sp).CCmaskciecurve); + const bool llmascieutili = locllmascieCurve.Set(params.locallab.spots.at(sp).LLmaskciecurve); + const bool lhmascieutili = lochhmascieCurve.Set(params.locallab.spots.at(sp).HHmaskciecurve); const bool lcmas_utili = locccmas_Curve.Set(params.locallab.spots.at(sp).CCmask_curve); const bool llmas_utili = locllmas_Curve.Set(params.locallab.spots.at(sp).LLmask_curve); @@ -1078,6 +1097,7 @@ private: const bool llmaslcutili = locllmaslcCurve.Set(params.locallab.spots.at(sp).LLmasklccurve); const bool lmasutili_wav = loclmasCurve_wav.Set(params.locallab.spots.at(sp).LLmask_curvewav); const bool locwavutili = locwavCurve.Set(params.locallab.spots.at(sp).locwavcurve); + const bool locwavutilijz = locwavCurvejz.Set(params.locallab.spots.at(sp).locwavcurvejz); const bool locwavhueutili = locwavCurvehue.Set(params.locallab.spots.at(sp).locwavcurvehue); const bool locwavdenutili = locwavCurveden.Set(params.locallab.spots.at(sp).locwavcurveden); const bool loclevwavutili = loclevwavCurve.Set(params.locallab.spots.at(sp).loclevwavcurve); @@ -1102,6 +1122,12 @@ private: const bool localmasklcutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).Lmasklccurve, lmasklclocalcurve, 1); const bool localmasklogutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).LmaskcurveL, lmaskloglocalcurve, 1); const bool localmask_utili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).Lmask_curve, lmasklocal_curve, 1); + const bool localmaskcieutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).Lmaskciecurve, lmaskcielocalcurve, 1); + const bool localcieutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).ciecurve, cielocalcurve, 1); + const bool localcieutili2 = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).ciecurve2, cielocalcurve2, 1); + const bool localjzutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).jzcurve, jzlocalcurve, 1); + const bool localczutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).czcurve, czlocalcurve, 1); + const bool localczjzutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).czjzcurve, czjzlocalcurve, 1); //provisory double ecomp = params.locallab.spots.at(sp).expcomp; @@ -1123,6 +1149,7 @@ private: float stdtme; float meanretie; float stdretie; + float fab = 1.f; if (params.locallab.spots.at(sp).spotMethod == "exc") { ipf.calc_ref(sp, reservView.get(), reservView.get(), 0, 0, fw, fh, 1, huerefblu, chromarefblu, lumarefblu, huere, chromare, lumare, sobelre, avge, locwavCurveden, locwavdenutili); @@ -1147,6 +1174,7 @@ private: cllocalcurve, localclutili, lclocalcurve, locallcutili, loclhCurve, lochhCurve, locchCurve, + lochhCurvejz, locchCurvejz,loclhCurvejz, lmasklocalcurve, localmaskutili, lmaskexplocalcurve, localmaskexputili, lmaskSHlocalcurve, localmaskSHutili, @@ -1158,6 +1186,12 @@ private: lmasklclocalcurve, localmasklcutili, lmaskloglocalcurve, localmasklogutili, lmasklocal_curve, localmask_utili, + lmaskcielocalcurve, localmaskcieutili, + cielocalcurve, localcieutili, + cielocalcurve2, localcieutili2, + jzlocalcurve, localjzutili, + czlocalcurve, localczutili, + czjzlocalcurve, localczjzutili, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, lochhhmasCurve, lhhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, @@ -1170,10 +1204,12 @@ private: locccmaslogCurve, lcmaslogutili, locllmaslogCurve, llmaslogutili, lochhmaslogCurve, lhmaslogutili, locccmas_Curve, lcmas_utili, locllmas_Curve, llmas_utili, lochhmas_Curve, lhmas_utili, + locccmascieCurve, lcmascieutili, locllmascieCurve, llmascieutili, lochhmascieCurve, lhmascieutili, lochhhmas_Curve, lhhmas_utili, loclmasCurveblwav,lmasutiliblwav, loclmasCurvecolwav,lmasutilicolwav, locwavCurve, locwavutili, + locwavCurvejz, locwavutilijz, loclevwavCurve, loclevwavutili, locconwavCurve, locconwavutili, loccompwavCurve, loccompwavutili, @@ -1182,10 +1218,10 @@ private: locwavCurveden, locwavdenutili, locedgwavCurve, locedgwavutili, loclmasCurve_wav,lmasutili_wav, - LHutili, HHutili, CHutili, cclocalcurve, localcutili, rgblocalcurve, localrgbutili, localexutili, exlocalcurve, hltonecurveloc, shtonecurveloc, tonecurveloc, lightCurveloc, - huerefblu, chromarefblu, lumarefblu, huere, chromare, lumare, sobelre, lastsav, false, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + LHutili, HHutili, CHutili, HHutilijz, CHutilijz, LHutilijz, cclocalcurve, localcutili, rgblocalcurve, localrgbutili, localexutili, exlocalcurve, hltonecurveloc, shtonecurveloc, tonecurveloc, lightCurveloc, + huerefblu, chromarefblu, lumarefblu, huere, chromare, lumare, sobelre, lastsav, false, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, minCD, maxCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax, - meantme, stdtme, meanretie, stdretie + meantme, stdtme, meanretie, stdretie, fab ); if (sp + 1u < params.locallab.spots.size()) { @@ -1653,8 +1689,9 @@ private: }//if no exif data or wrong else { double E_V = fcomp + log2 ((fnum * fnum) / fspeed / (fiso / 100.f)); - E_V += params.toneCurve.expcomp;// exposure compensation in tonecurve ==> direct EV - E_V += log2(params.raw.expos); // exposure raw white point ; log2 ==> linear to EV + double kexp = 0.; + E_V += kexp * params.toneCurve.expcomp;// exposure compensation in tonecurve ==> direct EV + E_V += 0.5 * log2(params.raw.expos); // exposure raw white point ; log2 ==> linear to EV adap = std::pow(2.0, E_V - 3.0); //cd / m2 } diff --git a/rtgui/controlspotpanel.cc b/rtgui/controlspotpanel.cc index 4bab0da9c..400309512 100644 --- a/rtgui/controlspotpanel.cc +++ b/rtgui/controlspotpanel.cc @@ -78,6 +78,7 @@ ControlSpotPanel::ControlSpotPanel(): colorscope_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_COLORSCOPE"), 0., 100.0, 1., 30.))), avoidrad_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_AVOIDRAD"), 0., 30.0, 0.1, 0.7))), scopemask_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SCOPEMASK"), 0, 100, 1, 60))), + denoichmask_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_DENOIMASK"), 0., 100., 0.5, 0))), lumask_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LUMASK"), -50, 30, 1, 10, Gtk::manage(new RTImage("circle-yellow-small.png")), Gtk::manage(new RTImage("circle-gray-small.png")) ))), hishow_(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_PREVSHOW")))), @@ -330,6 +331,7 @@ ControlSpotPanel::ControlSpotPanel(): feather_->set_tooltip_text(M("TP_LOCALLAB_FEATH_TOOLTIP")); transitgrad_->set_tooltip_text(M("TP_LOCALLAB_TRANSITGRAD_TOOLTIP")); scopemask_->set_tooltip_text(M("TP_LOCALLAB_SCOPEMASK_TOOLTIP")); + denoichmask_->set_tooltip_text(M("TP_LOCALLAB_DENOIMASK_TOOLTIP")); } transit_->setAdjusterListener(this); @@ -337,6 +339,7 @@ ControlSpotPanel::ControlSpotPanel(): transitgrad_->setAdjusterListener(this); feather_->setAdjusterListener(this); scopemask_->setAdjusterListener(this); + denoichmask_->setAdjusterListener(this); transitBox->pack_start(*transit_); transitBox->pack_start(*transitweak_); transitBox->pack_start(*transitgrad_); @@ -408,6 +411,10 @@ ControlSpotPanel::ControlSpotPanel(): avFrame->add(*avbox); specCaseBox->pack_start(*avFrame); + if (showtooltip) { + avoidmun_->set_tooltip_text(M("TP_LOCALLAB_AVOIDMUN_TOOLTIP")); + } + blwhConn_ = blwh_->signal_toggled().connect( sigc::mem_fun(*this, &ControlSpotPanel::blwhChanged)); @@ -422,7 +429,7 @@ ControlSpotPanel::ControlSpotPanel(): if (showtooltip) { recurs_->set_tooltip_text(M("TP_LOCALLAB_RECURS_TOOLTIP")); - avoid_->set_tooltip_text(M("TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP")); + avoid_->set_tooltip_text(M("TP_LOCALLAB_AVOIDCOLORSHIFT_TOOLTIP")); } specCaseBox->pack_start(*recurs_); @@ -481,6 +488,7 @@ ControlSpotPanel::ControlSpotPanel(): // maskBox->pack_start(*laplac_); maskBox->pack_start(*deltae_); maskBox->pack_start(*scopemask_); + maskBox->pack_start(*denoichmask_); // maskBox->pack_start(*shortc_); maskBox->pack_start(*lumask_); // maskBox->pack_start(*savrest_); @@ -854,6 +862,7 @@ void ControlSpotPanel::load_ControlSpot_param() laplac_->set_active(true); deltae_->set_active(row[spots_.deltae]); scopemask_->setValue((double)row[spots_.scopemask]); + denoichmask_->setValue(row[spots_.denoichmask]); shortc_->set_active(row[spots_.shortc]); lumask_->setValue((double)row[spots_.lumask]); savrest_->set_active(row[spots_.savrest]); @@ -1516,6 +1525,14 @@ void ControlSpotPanel::adjusterChanged(Adjuster* a, double newval) } } + if (a == denoichmask_) { + row[spots_.denoichmask] = denoichmask_->getValue(); + + if (listener) { + listener->panelChanged(EvLocallabSpotdenoichmask, denoichmask_->getTextValue()); + } + } + if (a == lumask_) { row[spots_.lumask] = lumask_->getIntValue(); @@ -1849,6 +1866,7 @@ void ControlSpotPanel::disableParamlistener(bool cond) laplacConn_.block(cond); deltaeConn_.block(cond); scopemask_->block(cond); + denoichmask_->block(cond); shortcConn_.block(cond); lumask_->block(cond); savrestConn_.block(cond); @@ -1895,6 +1913,7 @@ void ControlSpotPanel::setParamEditable(bool cond) laplac_->set_sensitive(cond); deltae_->set_sensitive(cond); scopemask_->set_sensitive(cond); + denoichmask_->set_sensitive(cond); shortc_->set_sensitive(cond); lumask_->set_sensitive(cond); savrest_->set_sensitive(cond); @@ -2569,6 +2588,7 @@ ControlSpotPanel::SpotRow* ControlSpotPanel::getSpot(const int index) r->transitweak = row[spots_.transitweak]; r->transitgrad = row[spots_.transitgrad]; r->scopemask = row[spots_.scopemask]; + r->denoichmask = row[spots_.denoichmask]; r->lumask = row[spots_.lumask]; r->hishow = row[spots_.hishow]; r->activ = row[spots_.activ]; @@ -2712,6 +2732,7 @@ void ControlSpotPanel::addControlSpot(SpotRow* newSpot) row[spots_.laplac] = newSpot->laplac; row[spots_.deltae] = newSpot->deltae; row[spots_.scopemask] = newSpot->scopemask; + row[spots_.denoichmask] = newSpot->denoichmask; row[spots_.shortc] = newSpot->shortc; row[spots_.lumask] = newSpot->lumask; row[spots_.savrest] = newSpot->savrest; @@ -2779,6 +2800,7 @@ void ControlSpotPanel::setDefaults(const rtengine::procparams::ProcParams * defP colorscope_->setDefault(defSpot.colorscope); avoidrad_->setDefault(defSpot.avoidrad); scopemask_->setDefault((double)defSpot.scopemask); + denoichmask_->setDefault((double)defSpot.denoichmask); lumask_->setDefault((double)defSpot.lumask); } @@ -2830,6 +2852,7 @@ ControlSpotPanel::ControlSpots::ControlSpots() add(laplac); add(deltae); add(scopemask); + add(denoichmask); add(shortc); add(lumask); add(savrest); diff --git a/rtgui/controlspotpanel.h b/rtgui/controlspotpanel.h index 3854692fd..0c7d061dd 100644 --- a/rtgui/controlspotpanel.h +++ b/rtgui/controlspotpanel.h @@ -86,6 +86,7 @@ public: bool laplac; bool deltae; int scopemask; + double denoichmask; bool shortc; int lumask; bool savrest; @@ -321,6 +322,7 @@ private: Gtk::TreeModelColumn laplac; Gtk::TreeModelColumn deltae; Gtk::TreeModelColumn scopemask; + Gtk::TreeModelColumn denoichmask; Gtk::TreeModelColumn shortc; Gtk::TreeModelColumn lumask; Gtk::TreeModelColumn savrest; @@ -402,6 +404,7 @@ private: Adjuster* const colorscope_; Adjuster* const avoidrad_; Adjuster* const scopemask_; + Adjuster* const denoichmask_; Adjuster* const lumask_; Gtk::CheckButton* const hishow_; diff --git a/rtgui/filepanel.cc b/rtgui/filepanel.cc index 682dd1746..304a7cf17 100644 --- a/rtgui/filepanel.cc +++ b/rtgui/filepanel.cc @@ -304,7 +304,8 @@ bool FilePanel::imageLoaded( Thumbnail* thm, ProgressConnector 0 && winGdiHandles <= 8500) // 0 means we don't have the rights to access the function, 8500 because the limit is 10000 and we need about 1500 free handles + if(winGdiHandles > 0 && winGdiHandles <= 6500) //(old settings 8500) 0 means we don't have the rights to access the function, 8500 because the limit is 10000 and we need about 1500 free handles + //J.Desmis october 2021 I change 8500 to 6500..Why ? because whitout while increasing size GUI system crash in multieditor #endif { GThreadLock lock; // Acquiring the GUI... not sure that it's necessary, but it shouldn't harm diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index 880125085..1837d19c8 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -150,6 +150,7 @@ Locallab::Locallab(): // Tool list widget toollist(Gtk::manage(new LocallabToolList())), + // expcie(Gtk::manage(new Locallabcie())), // Other widgets resetshowButton(Gtk::manage(new Gtk::Button(M("TP_LOCALLAB_RESETSHOW")))) { @@ -179,6 +180,7 @@ Locallab::Locallab(): addTool(toolpanel, &expshadhigh); addTool(toolpanel, &expvibrance); addTool(toolpanel, &explog); + addTool(toolpanel, &expcie); addTool(toolpanel, &expexpose); addTool(toolpanel, &expmask); addTool(toolpanel, &expsoft); @@ -311,6 +313,7 @@ void Locallab::read(const rtengine::procparams::ProcParams* pp, const ParamsEdit r->laplac = true; //pp->locallab.spots.at(i).laplac; r->deltae = pp->locallab.spots.at(i).deltae; r->scopemask = pp->locallab.spots.at(i).scopemask; + r->denoichmask = pp->locallab.spots.at(i).denoichmask; r->shortc = pp->locallab.spots.at(i).shortc; r->lumask = pp->locallab.spots.at(i).lumask; r->savrest = pp->locallab.spots.at(i).savrest; @@ -492,6 +495,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited r->laplac = newSpot->laplac; r->deltae = newSpot->deltae; r->scopemask = newSpot->scopemask; + r->denoichmask = newSpot->denoichmask; r->shortc = newSpot->shortc; r->lumask = newSpot->lumask; r->savrest = newSpot->savrest; @@ -651,18 +655,19 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited toollist->addToolRow(tool->getToolName(), toolNb); } } - +/* // Update locallab tools mask background if (pp->locallab.selspot < (int)maskBackRef.size()) { const double huer = maskBackRef.at(pp->locallab.selspot).huer; const double lumar = maskBackRef.at(pp->locallab.selspot).lumar; const double chromar = maskBackRef.at(pp->locallab.selspot).chromar; + const float fab = maskBackRef.at(pp->locallab.selspot).fab; for (auto tool : locallabTools) { - tool->refChanged(huer, lumar, chromar); + tool->refChanged(huer, lumar, chromar, fab); } } - +*/ // Update Locallab Retinex tool min/max if (pp->locallab.selspot < (int)retiMinMax.size()) { const double cdma = retiMinMax.at(pp->locallab.selspot).cdma; @@ -801,6 +806,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited r->laplac = newSpot->laplac; r->deltae = newSpot->deltae; r->scopemask = newSpot->scopemask; + r->denoichmask = newSpot->denoichmask; r->shortc = newSpot->shortc; r->lumask = newSpot->lumask; r->savrest = newSpot->savrest; @@ -956,6 +962,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited pp->locallab.spots.at(pp->locallab.selspot).laplac = r->laplac; pp->locallab.spots.at(pp->locallab.selspot).deltae = r->deltae; pp->locallab.spots.at(pp->locallab.selspot).scopemask = r->scopemask; + pp->locallab.spots.at(pp->locallab.selspot).denoichmask = r->denoichmask; pp->locallab.spots.at(pp->locallab.selspot).shortc = r->shortc; pp->locallab.spots.at(pp->locallab.selspot).lumask = r->lumask; pp->locallab.spots.at(pp->locallab.selspot).savrest = r->savrest; @@ -1036,7 +1043,7 @@ void Locallab::minmaxChanged(const std::vector &minmax, int const double cdmin = retiMinMax.at(selspot).cdmin; const double mini = retiMinMax.at(selspot).mini; const double maxi = retiMinMax.at(selspot).maxi; - const double Tmean = retiMinMax.at(selspot).Tmean; + const double Tmean = retiMinMax.at(selspot).Tmean; const double Tsigma = retiMinMax.at(selspot).Tsigma; const double Tmin = retiMinMax.at(selspot).Tmin; const double Tmax = retiMinMax.at(selspot).Tmax; @@ -1045,12 +1052,28 @@ void Locallab::minmaxChanged(const std::vector &minmax, int } } -void Locallab::logencodChanged(const float blackev, const float whiteev, const float sourceg, const float sourceab, const float targetg) +void Locallab::logencodChanged(const float blackev, const float whiteev, const float sourceg, const float sourceab, const float targetg, const bool autocomput, const bool autocie, const float jz1) { - // Update Locallab Log Encoding accordingly - explog.updateAutocompute(blackev, whiteev, sourceg, sourceab, targetg); -} + // Update Locallab Log Encoding and Ciecam accordingly + if(autocomput) { + explog.updateAutocompute(blackev, whiteev, sourceg, sourceab, targetg, jz1); + } + if(autocie) { + expcie.updateAutocompute(blackev, whiteev, sourceg, sourceab, targetg, jz1); + } +} +void Locallab::refChanged2(float *huerefp, float *chromarefp, float *lumarefp, float *fabrefp, int selspot) +{ + const double huer = huerefp[selspot]; + const double lumar = lumarefp[selspot]; + const double chromar = chromarefp[selspot]; + const float fab = fabrefp[selspot]; + for (auto tool : locallabTools) { + tool->refChanged(huer, lumar, chromar, fab); + } +} +/* void Locallab::refChanged(const std::vector &ref, int selspot) { // Saving transmitted mask background data @@ -1061,13 +1084,14 @@ void Locallab::refChanged(const std::vector &ref, int selspot) const double huer = maskBackRef.at(selspot).huer; const double lumar = maskBackRef.at(selspot).lumar; const double chromar = maskBackRef.at(selspot).chromar; + const float fab = maskBackRef.at(selspot).fab; for (auto tool : locallabTools) { - tool->refChanged(huer, lumar, chromar); + tool->refChanged(huer, lumar, chromar, fab); } } } - +*/ void Locallab::resetMaskVisibility() { // Indicate to spot control panel that no more mask preview is active @@ -1088,20 +1112,20 @@ Locallab::llMaskVisibility Locallab::getMaskVisibility() const const bool prevDeltaE = expsettings->isDeltaEPrevActive(); // Get mask preview from Locallab tools - int colorMask, colorMaskinv, expMask, expMaskinv, shMask, shMaskinv, vibMask, softMask, blMask, tmMask, retiMask, sharMask, lcMask, cbMask, logMask, maskMask; + int colorMask, colorMaskinv, expMask, expMaskinv, shMask, shMaskinv, vibMask, softMask, blMask, tmMask, retiMask, sharMask, lcMask, cbMask, logMask, maskMask, cieMask; for (auto tool : locallabTools) { - tool->getMaskView(colorMask, colorMaskinv, expMask, expMaskinv, shMask, shMaskinv, vibMask, softMask, blMask, tmMask, retiMask, sharMask, lcMask, cbMask, logMask, maskMask); + tool->getMaskView(colorMask, colorMaskinv, expMask, expMaskinv, shMask, shMaskinv, vibMask, softMask, blMask, tmMask, retiMask, sharMask, lcMask, cbMask, logMask, maskMask, cieMask); } // Indicate to spot control panel if one mask preview is active const bool isMaskActive = (colorMask == 0) || (colorMaskinv == 0) || (expMask == 0) || (expMaskinv == 0) || (shMask == 0) || (shMaskinv == 0) || (vibMask == 0) || (softMask == 0) || (blMask == 0) || (tmMask == 0) || (retiMask == 0) || (sharMask == 0) || - (lcMask == 0) || (cbMask == 0) || (logMask == 0) || (maskMask == 0); + (lcMask == 0) || (cbMask == 0) || (logMask == 0) || (maskMask == 0) || (cieMask == 0); expsettings->setMaskPrevActive(isMaskActive); - return {prevDeltaE, colorMask, colorMaskinv, expMask, expMaskinv, shMask, shMaskinv, vibMask, softMask, blMask, tmMask, retiMask, sharMask, lcMask, cbMask, logMask, maskMask}; + return {prevDeltaE, colorMask, colorMaskinv, expMask, expMaskinv, shMask, shMaskinv, vibMask, softMask, blMask, tmMask, retiMask, sharMask, lcMask, cbMask, logMask, maskMask, cieMask}; } void Locallab::resetshowPressed() diff --git a/rtgui/locallab.h b/rtgui/locallab.h index d86d8c5c1..cf5ca4ff5 100644 --- a/rtgui/locallab.h +++ b/rtgui/locallab.h @@ -116,6 +116,7 @@ private: LocallabCBDL expcbdl; LocallabLog explog; LocallabMask expmask; + Locallabcie expcie; std::vector locallabTools; @@ -143,10 +144,11 @@ public: void minmaxChanged(const std::vector &minmax, int selspot) override; // Locallab Log Encoding autocompute function - void logencodChanged(const float blackev, const float whiteev, const float sourceg, const float sourceab, const float targetg) override; + void logencodChanged(const float blackev, const float whiteev, const float sourceg, const float sourceab, const float targetg, const bool autocomput, const bool autocie, const float jz1) override; // Locallab tools mask background management function - void refChanged(const std::vector &ref, int selspot) override; +// void refChanged(const std::vector &ref, int selspot) override; + void refChanged2(float *huerefp, float *chromarefp, float *lumarefp, float *fabrefp, int selspot)override; // Mask visibility management functions struct llMaskVisibility { @@ -167,6 +169,7 @@ public: int cbMask; int logMask; int maskMask; + int cieMask; }; void resetMaskVisibility(); diff --git a/rtgui/locallabtools.cc b/rtgui/locallabtools.cc index 8d3c34204..51da93ab3 100644 --- a/rtgui/locallabtools.cc +++ b/rtgui/locallabtools.cc @@ -266,7 +266,7 @@ bool LocallabTool::isLocallabToolAdded() return exp->get_visible(); } -void LocallabTool::refChanged(const double huer, const double lumar, const double chromar) +void LocallabTool::refChanged(const double huer, const double lumar, const double chromar, const float fab) { // Hue reference normalization (between 0 and 1) double normHuer = huer; @@ -279,14 +279,25 @@ void LocallabTool::refChanged(const double huer, const double lumar, const doubl normHuer = h; + double normHuerjz = huer; + + float hz = Color::huejz_to_huehsv2(normHuerjz); + + if (hz > 1.f) { + hz -= 1.f; + } + normHuerjz = hz; + // Luma reference normalization (between 0 and 1) const double normLumar = lumar / 100.f; // Chroma reference normalization (between 0 and 1) - const double normChromar = chromar / 137.4f; + const double corfap = (65535.) / (double) fab; + //printf("FAB=%f corfap=%f chromar=%f chroret=%f\n", (double) fab, corfap, chromar, (double) corfap * (chromar / 195.f)); + const double normChromar = LIM01(corfap * (chromar / 195.f));//195 a little more than 128 * 1.414 = 181 // Update mask curve backgrounds - updateMaskBackground(normChromar, normLumar, normHuer); + updateMaskBackground(normChromar, normLumar, normHuer, normHuerjz); } void LocallabTool::colorForValue(double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller) @@ -425,6 +436,7 @@ LocallabColor::LocallabColor(): // Color & Light specific widgets lumFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LUMFRA")))), reparcol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LOGREPART"), 1.0, 100.0, 1., 100.0))), + gamc(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GAMC"), 0.5, 3.0, 0.05, 1.))), lightness(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LIGHTNESS"), -100, 500, 1, 0))), contrast(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CONTRAST"), -100, 100, 1, 0))), chroma(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CHROMA"), -100, 150, 1, 0))), @@ -440,7 +452,7 @@ LocallabColor::LocallabColor(): exprecov(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_DENOI2_EXP")))), maskusablec(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUSABLE")))), maskunusablec(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUNUSABLE")))), - recothresc(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKRECOTHRES"), 1., 2., 0.01, 1.))), + recothresc(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKRECOTHRES"), 0., 2., 0.01, 1.))), lowthresc(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHRLOW"), 1., 80., 0.5, 12.))), higthresc(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHR"), 20., 99., 0.5, 85.))), decayc(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKDDECAY"), 0.5, 4., 0.1, 2.))), @@ -534,6 +546,8 @@ LocallabColor::LocallabColor(): lightness->setAdjusterListener(this); + gamc->setAdjusterListener(this); + reparcol->setAdjusterListener(this); contrast->setAdjusterListener(this); @@ -804,6 +818,7 @@ LocallabColor::LocallabColor(): lumBox->pack_start(*lightness); lumBox->pack_start(*contrast); lumBox->pack_start(*chroma); + lumBox->pack_start(*gamc); lumFrame->add(*lumBox); pack_start(*lumFrame); Gtk::Frame* const superFrame = Gtk::manage(new Gtk::Frame()); @@ -959,7 +974,7 @@ void LocallabColor::resetMaskView() showmaskcolMethodConninv.block(false); } -void LocallabColor::getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask) +void LocallabColor::getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) { colorMask = showmaskcolMethod->get_active_row_number(); colorMaskinv = showmaskcolMethodinv->get_active_row_number(); @@ -969,6 +984,8 @@ void LocallabColor::updateAdviceTooltips(const bool showTooltips) { if (showTooltips) { lumFrame->set_tooltip_text(M("TP_LOCALLAB_EXPCOLOR_TOOLTIP")); + recothresc->set_tooltip_text(M("TP_LOCALLAB_RECOTHRES02_TOOLTIP")); + gamc->set_tooltip_text(M("TP_LOCALLAB_GAMCOL_TOOLTIP")); lightness->set_tooltip_text(M("TP_LOCALLAB_LIGHTN_TOOLTIP")); reparcol->set_tooltip_text(M("TP_LOCALLAB_REPARCOL_TOOLTIP")); gridMethod->set_tooltip_text(M("TP_LOCALLAB_GRIDMETH_TOOLTIP")); @@ -1021,7 +1038,9 @@ void LocallabColor::updateAdviceTooltips(const bool showTooltips) higthresc->set_tooltip_text(M("TP_LOCALLAB_MASKHIGTHRESC_TOOLTIP")); } else { lumFrame->set_tooltip_text(""); + recothresc->set_tooltip_text(""); lightness->set_tooltip_text(""); + gamc->set_tooltip_text(""); reparcol->set_tooltip_text(""); gridMethod->set_tooltip_text(""); strengthgrid->set_tooltip_text(""); @@ -1137,6 +1156,7 @@ void LocallabColor::read(const rtengine::procparams::ProcParams* pp, const Param complexity->set_active(spot.complexcolor); lightness->setValue(spot.lightness); + gamc->setValue(spot.gamc); reparcol->setValue(spot.reparcol); contrast->setValue(spot.contrast); chroma->setValue(spot.chroma); @@ -1312,6 +1332,7 @@ void LocallabColor::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pe spot.complexcolor = complexity->get_active_row_number(); spot.lightness = lightness->getIntValue(); + spot.gamc = gamc->getValue(); spot.reparcol = reparcol->getValue(); spot.contrast = contrast->getIntValue(); spot.chroma = chroma->getIntValue(); @@ -1480,6 +1501,7 @@ void LocallabColor::setDefaults(const rtengine::procparams::ProcParams* defParam // Set default value for adjuster, labgrid and threshold adjuster widgets lightness->setDefault((double)defSpot.lightness); + gamc->setDefault((double)defSpot.gamc); reparcol->setDefault(defSpot.reparcol); contrast->setDefault((double)defSpot.contrast); chroma->setDefault((double)defSpot.chroma); @@ -1535,6 +1557,13 @@ void LocallabColor::adjusterChanged(Adjuster* a, double newval) } } + if (a == gamc) { + if (listener) { + listener->panelChanged(Evlocallabgamc, + gamc->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + if (a == reparcol) { if (listener) { listener->panelChanged(Evlocallabreparcol, @@ -1885,6 +1914,7 @@ void LocallabColor::convertParamToNormal() // Disable all listeners disableListener(); + gamc->setValue(defSpot.gamc); // Set hidden GUI widgets in Normal mode to default spot values blurcolde->setValue((double)defSpot.blurcolde); @@ -2009,6 +2039,7 @@ void LocallabColor::convertParamToSimple() softradiuscol->setValue(defSpot.softradiuscol); strcol->setValue(defSpot.strcol); angcol->setValue(defSpot.angcol); + gamc->setValue(defSpot.gamc); if (defSpot.qualitycurveMethod == "none") { qualitycurveMethod->set_active(0); @@ -2053,6 +2084,7 @@ void LocallabColor::updateGUIToMode(const modeType new_type) maskusablec->hide(); maskunusablec->hide(); decayc->hide(); + gamc->hide(); break; case Normal: @@ -2093,6 +2125,7 @@ void LocallabColor::updateGUIToMode(const modeType new_type) if (!invers->get_active()) { // Keep widget hidden when invers is toggled expgradcol->show(); exprecov->show(); + gamc->hide(); } expcurvcol->show(); @@ -2110,6 +2143,7 @@ void LocallabColor::updateGUIToMode(const modeType new_type) softradiuscol->show(); expgradcol->show(); exprecov->show(); + gamc->show(); } strcolab->show(); @@ -2155,7 +2189,7 @@ void LocallabColor::updateGUIToMode(const modeType new_type) } } -void LocallabColor::updateMaskBackground(const double normChromar, const double normLumar, const double normHuer) +void LocallabColor::updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) { idle_register.add( [this, normHuer, normLumar, normChromar]() -> bool { @@ -2406,8 +2440,10 @@ void LocallabColor::updateColorGUI1() contcol->hide(); blurcol->hide(); reparcol->hide(); + gamc->hide(); } else { gridFrame->show(); + gamc->show(); if (mode == Expert) { // Keep widget hidden in Normal and Simple mode structcol->show(); @@ -2532,13 +2568,14 @@ LocallabExposure::LocallabExposure(): norm(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_EQUIL")))), fatlevel(Gtk::manage(new Adjuster(M("TP_LOCALLAB_FATLEVEL"), 0.5, 2.0, 0.01, 1.))), fatanchor(Gtk::manage(new Adjuster(M("TP_LOCALLAB_FATANCHOR"), 0.1, 100.0, 0.01, 50., Gtk::manage(new RTImage("circle-black-small.png")), Gtk::manage(new RTImage("circle-white-small.png"))))), + gamex(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GAMC"), 0.5, 3.0, 0.05, 1.))), sensiex(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSI"), 0, 100, 1, 60))), structexp(Gtk::manage(new Adjuster(M("TP_LOCALLAB_STRUCCOL"), 0, 100, 1, 0))), blurexpde(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLURDE"), 2, 100, 1, 5))), exptoolexp(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_EXPTOOL")))), expcomp(Gtk::manage(new Adjuster(M("TP_LOCALLAB_EXPCOMP"), MINEXP, MAXEXP, 0.01, 0.))), black(Gtk::manage(new Adjuster(M("TP_EXPOSURE_BLACKLEVEL"), -16384, 32768, 10, 0))), - hlcompr(Gtk::manage(new Adjuster(M("TP_EXPOSURE_COMPRHIGHLIGHTS"), 0, 500, 1, 20))), + hlcompr(Gtk::manage(new Adjuster(M("TP_EXPOSURE_COMPRHIGHLIGHTS"), 0, 500, 1, 0))), hlcomprthresh(Gtk::manage(new Adjuster(M("TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD"), 0, 100, 1, 0))), shadex(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SHADEX"), 0, 100, 1, 0))), shcompr(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SHADEXCOMP"), 0, 100, 1, 50))), @@ -2548,7 +2585,7 @@ LocallabExposure::LocallabExposure(): exprecove(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_DENOI2_EXP")))), maskusablee(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUSABLE")))), maskunusablee(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUNUSABLE")))), - recothrese(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKRECOTHRES"), 1., 2., 0.01, 1.))), + recothrese(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKRECOTHRES"), 0., 2., 0.01, 1.))), lowthrese(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHRLOW"), 1., 80., 0.5, 12.))), higthrese(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHR"), 20., 99., 0.5, 85.))), decaye(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKDDECAY"), 0.5, 4., 0.1, 2.))), @@ -2620,6 +2657,8 @@ LocallabExposure::LocallabExposure(): sensiex->setAdjusterListener(this); + gamex->setAdjusterListener(this); + structexp->setAdjusterListener(this); blurexpde->setAdjusterListener(this); @@ -2762,6 +2801,7 @@ LocallabExposure::LocallabExposure(): // pack_start(*fatFrame); pack_start(*expfat); pack_start(*expcomp); + pack_start(*gamex); pack_start(*structexp); pack_start(*blurexpde); ToolParamBlock* const toolBox = Gtk::manage(new ToolParamBlock()); @@ -2837,7 +2877,7 @@ void LocallabExposure::resetMaskView() showmaskexpMethodConninv.block(false); } -void LocallabExposure::getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask) +void LocallabExposure::getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) { expMask = showmaskexpMethod->get_active_row_number(); expMaskinv = showmaskexpMethodinv->get_active_row_number(); @@ -2850,6 +2890,7 @@ void LocallabExposure::updateAdviceTooltips(const bool showTooltips) // expMethod->set_tooltip_text(M("TP_LOCALLAB_EXPMETHOD_TOOLTIP")); // pdeFrame->set_tooltip_text(M("TP_LOCALLAB_PDEFRAME_TOOLTIP")); exppde->set_tooltip_text(M("TP_LOCALLAB_PDEFRAME_TOOLTIP")); + recothrese->set_tooltip_text(M("TP_LOCALLAB_RECOTHRES02_TOOLTIP")); exprecove->set_tooltip_markup(M("TP_LOCALLAB_MASKREEXP_TOOLTIP")); decaye->set_tooltip_text(M("TP_LOCALLAB_MASKDECAY_TOOLTIP")); lowthrese->set_tooltip_text(M("TP_LOCALLAB_MASKLOWTHRESE_TOOLTIP")); @@ -2865,6 +2906,7 @@ void LocallabExposure::updateAdviceTooltips(const bool showTooltips) // fatFrame->set_tooltip_text(M("TP_LOCALLAB_FATFRAME_TOOLTIP")); expfat->set_tooltip_text(M("TP_LOCALLAB_FATFRAME_TOOLTIP")); expcomp->set_tooltip_text(M("TP_LOCALLAB_EXPCOMP_TOOLTIP")); + gamex->set_tooltip_text(M("TP_LOCALLAB_GAMCOL_TOOLTIP")); sensiex->set_tooltip_text(M("TP_LOCALLAB_SENSI_TOOLTIP")); structexp->set_tooltip_text(M("TP_LOCALLAB_STRUCT_TOOLTIP")); expchroma->set_tooltip_text(M("TP_LOCALLAB_EXPCHROMA_TOOLTIP")); @@ -2887,6 +2929,7 @@ void LocallabExposure::updateAdviceTooltips(const bool showTooltips) lapmaskexp->set_tooltip_text(M("TP_LOCALLAB_LAPRAD1_TOOLTIP")); } else { exp->set_tooltip_text(""); + recothrese->set_tooltip_text(""); exppde->set_tooltip_text(""); blurexpde->set_tooltip_text(""); exprecove->set_tooltip_markup(""); @@ -2917,6 +2960,7 @@ void LocallabExposure::updateAdviceTooltips(const bool showTooltips) chromaskexp->set_tooltip_text(""); slomaskexp->set_tooltip_text(""); lapmaskexp->set_tooltip_text(""); + gamex->set_tooltip_text(""); } } @@ -3005,6 +3049,7 @@ void LocallabExposure::read(const rtengine::procparams::ProcParams* pp, const Pa // fatlevel->setValue(1.); // fatanchor->setValue(1.); sensiex->setValue(spot.sensiex); + gamex->setValue(spot.gamex); structexp->setValue(spot.structexp); blurexpde->setValue(spot.blurexpde); expcomp->setValue(spot.expcomp); @@ -3094,6 +3139,7 @@ void LocallabExposure::write(rtengine::procparams::ProcParams* pp, ParamsEdited* spot.fatlevel = fatlevel->getValue(); spot.fatanchor = fatanchor->getValue(); spot.sensiex = sensiex->getIntValue(); + spot.gamex = gamex->getValue(); spot.structexp = structexp->getIntValue(); spot.blurexpde = blurexpde->getIntValue(); spot.expcomp = expcomp->getValue(); @@ -3146,6 +3192,7 @@ void LocallabExposure::setDefaults(const rtengine::procparams::ProcParams* defPa fatlevel->setDefault(defSpot.fatlevel); fatanchor->setDefault(defSpot.fatanchor); sensiex->setDefault((double)defSpot.sensiex); + gamex->setDefault((double)defSpot.gamex); structexp->setDefault((double)defSpot.structexp); blurexpde->setDefault((double)defSpot.blurexpde); expcomp->setDefault(defSpot.expcomp); @@ -3246,6 +3293,13 @@ void LocallabExposure::adjusterChanged(Adjuster* a, double newval) } } + if (a == gamex) { + if (listener) { + listener->panelChanged(Evlocallabgamex, + gamex->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + if (a == recothrese) { if (listener) { listener->panelChanged(Evlocallabrecothrese, @@ -3484,6 +3538,7 @@ void LocallabExposure::convertParamToNormal() // Disable all listeners disableListener(); + gamex->setValue(defSpot.gamex); // Set hidden GUI widgets in Normal mode to default spot values structexp->setValue((double)defSpot.structexp); @@ -3516,6 +3571,7 @@ void LocallabExposure::convertParamToSimple() softradiusexp->setValue(defSpot.softradiusexp); enaExpMask->set_active(defSpot.enaExpMask); enaExpMaskaft->set_active(defSpot.enaExpMaskaft); + gamex->setValue(defSpot.gamex); // CCmaskexpshape->setCurve(defSpot.CCmaskexpcurve); // LLmaskexpshape->setCurve(defSpot.CCmaskexpcurve); // HHmaskexpshape->setCurve(defSpot.HHmaskexpcurve); @@ -3549,6 +3605,7 @@ void LocallabExposure::updateGUIToMode(const modeType new_type) norm->hide(); fatlevel->hide(); fatanchor->hide(); + gamex->hide(); break; @@ -3581,6 +3638,7 @@ void LocallabExposure::updateGUIToMode(const modeType new_type) expgradexp->show(); softradiusexp->show(); exprecove->show(); + gamex->hide(); blurexpde->show(); } @@ -3607,6 +3665,7 @@ void LocallabExposure::updateGUIToMode(const modeType new_type) expgradexp->show(); softradiusexp->show(); exprecove->show(); + gamex->show(); blurexpde->show(); } @@ -3628,7 +3687,7 @@ void LocallabExposure::updateGUIToMode(const modeType new_type) } } -void LocallabExposure::updateMaskBackground(const double normChromar, const double normLumar, const double normHuer) +void LocallabExposure::updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) { idle_register.add( [this, normHuer, normLumar, normChromar]() -> bool { @@ -3829,6 +3888,7 @@ void LocallabExposure::updateExposureGUI3() expcomp->setLabel(M("TP_LOCALLAB_EXPCOMPINV")); exprecove->hide(); reparexp->hide(); + gamex->hide(); expfat->hide(); exppde->hide(); structexp->hide(); @@ -3855,6 +3915,7 @@ void LocallabExposure::updateExposureGUI3() } else { expMethod->show(); expcomp->setLabel(M("TP_LOCALLAB_EXPCOMP")); + gamex->show(); expfat->show(); exppde->show(); @@ -3920,7 +3981,7 @@ LocallabShadow::LocallabShadow(): exprecovs(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_DENOI2_EXP")))), maskusables(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUSABLE")))), maskunusables(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUNUSABLE")))), - recothress(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKRECOTHRES"), 1., 2., 0.01, 1.))), + recothress(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKRECOTHRES"), 0., 2., 0.01, 1.))), lowthress(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHRLOW"), 1., 80., 0.5, 12.))), higthress(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHR"), 20., 99., 0.5, 85.))), decays(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKDDECAY"), 0.5, 4., 0.1, 2.))), @@ -4150,7 +4211,7 @@ void LocallabShadow::resetMaskView() showmaskSHMethodConninv.block(false); } -void LocallabShadow::getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask) +void LocallabShadow::getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) { shMask = showmaskSHMethod->get_active_row_number(); shMaskinv = showmaskSHMethodinv->get_active_row_number(); @@ -4164,7 +4225,7 @@ void LocallabShadow::updateAdviceTooltips(const bool showTooltips) for (const auto multiplier : multipliersh) { multiplier->set_tooltip_text(M("TP_LOCALLAB_MULTIPL_TOOLTIP")); } - + recothress->set_tooltip_text(M("TP_LOCALLAB_RECOTHRES02_TOOLTIP")); gamSH->set_tooltip_text(M("TP_LOCALLAB_SHTRC_TOOLTIP")); reparsh->set_tooltip_text(M("TP_LOCALLAB_REPARSH_TOOLTIP")); sloSH->set_tooltip_text(M("TP_LOCALLAB_SHTRC_TOOLTIP")); @@ -4206,6 +4267,7 @@ void LocallabShadow::updateAdviceTooltips(const bool showTooltips) for (const auto multiplier : multipliersh) { multiplier->set_tooltip_text(""); } + recothress->set_tooltip_text(""); gamSH->set_tooltip_text(""); reparsh->set_tooltip_text(""); sloSH->set_tooltip_text(""); @@ -4813,7 +4875,7 @@ void LocallabShadow::updateGUIToMode(const modeType new_type) } } -void LocallabShadow::updateMaskBackground(const double normChromar, const double normLumar, const double normHuer) +void LocallabShadow::updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) { idle_register.add( [this, normHuer, normLumar, normChromar]() -> bool { @@ -5006,6 +5068,7 @@ LocallabVibrance::LocallabVibrance(): // Vibrance specific widgets saturated(Gtk::manage(new Adjuster(M("TP_VIBRANCE_SATURATED"), -100., 100., 1., 0.))), pastels(Gtk::manage(new Adjuster(M("TP_VIBRANCE_PASTELS"), -100., 100., 1., 0.))), + vibgam(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GAMC"), 0.5, 3., 0.05, 1.))), warm(Gtk::manage(new Adjuster(M("TP_LOCALLAB_WARM"), -100., 100., 1., 0., Gtk::manage(new RTImage("circle-blue-small.png")), Gtk::manage(new RTImage("circle-orange-small.png"))))), psThreshold(Gtk::manage(new ThresholdAdjuster(M("TP_VIBRANCE_PSTHRESHOLD"), -100., 100., 0., M("TP_VIBRANCE_PSTHRESHOLD_WEIGTHING"), 0, 0., 100., 75., M("TP_VIBRANCE_PSTHRESHOLD_SATTHRESH"), 0, this, false))), protectSkins(Gtk::manage(new Gtk::CheckButton(M("TP_VIBRANCE_PROTECTSKINS")))), @@ -5017,7 +5080,7 @@ LocallabVibrance::LocallabVibrance(): exprecovv(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_DENOI2_EXP")))), maskusablev(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUSABLE")))), maskunusablev(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUNUSABLE")))), - recothresv(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKRECOTHRES"), 1., 2., 0.01, 1.))), + recothresv(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKRECOTHRES"), 0., 2., 0.01, 1.))), lowthresv(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHRLOW"), 1., 80., 0.5, 12.))), higthresv(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHR"), 20., 99., 0.5, 85.))), decayv(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKDDECAY"), 0.5, 4., 0.1, 2.))), @@ -5054,6 +5117,8 @@ LocallabVibrance::LocallabVibrance(): pastels->setAdjusterListener(this); + vibgam->setAdjusterListener(this); + warm->setAdjusterListener(this); psThreshold->set_tooltip_markup(M("TP_VIBRANCE_PSTHRESHOLD_TOOLTIP")); @@ -5158,6 +5223,9 @@ LocallabVibrance::LocallabVibrance(): // Add Vibrance specific widgets to GUI pack_start(*saturated, Gtk::PACK_SHRINK, 0); pack_start(*pastels, Gtk::PACK_SHRINK, 0); + pack_start(*vibgam, Gtk::PACK_SHRINK, 0); + Gtk::Separator* const separatorvib = Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); + pack_start(*separatorvib, Gtk::PACK_SHRINK, 2); pack_start(*warm, Gtk::PACK_SHRINK, 0); pack_start(*psThreshold, Gtk::PACK_SHRINK, 0); pack_start(*protectSkins, Gtk::PACK_SHRINK, 0); @@ -5217,7 +5285,7 @@ void LocallabVibrance::resetMaskView() showmaskvibMethodConn.block(false); } -void LocallabVibrance::getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask) +void LocallabVibrance::getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) { vibMask = showmaskvibMethod->get_active_row_number(); } @@ -5227,6 +5295,7 @@ void LocallabVibrance::updateAdviceTooltips(const bool showTooltips) if (showTooltips) { exp->set_tooltip_text(M("TP_LOCALLAB_VIBRA_TOOLTIP")); warm->set_tooltip_text(M("TP_LOCALLAB_WARM_TOOLTIP")); + recothresv->set_tooltip_text(M("TP_LOCALLAB_RECOTHRES02_TOOLTIP")); strvib->set_tooltip_text(M("TP_LOCALLAB_GRADGEN_TOOLTIP")); exprecovv->set_tooltip_markup(M("TP_LOCALLAB_MASKRESVIB_TOOLTIP")); expmaskvib->set_tooltip_markup(M("TP_LOCALLAB_MASK_TOOLTIP")); @@ -5241,6 +5310,8 @@ void LocallabVibrance::updateAdviceTooltips(const bool showTooltips) chromaskvib->set_tooltip_text(M("TP_LOCALLAB_CHROMASK_TOOLTIP")); slomaskvib->set_tooltip_text(M("TP_LOCALLAB_SLOMASK_TOOLTIP")); lapmaskvib->set_tooltip_text(M("TP_LOCALLAB_LAPRAD1_TOOLTIP")); + vibgam->set_tooltip_text(M("TP_LOCALLAB_GAMCOL_TOOLTIP")); + /* saturated->set_tooltip_text(M("TP_LOCALLAB_NUL_TOOLTIP")); pastels->set_tooltip_text(M("TP_LOCALLAB_NUL_TOOLTIP")); @@ -5268,6 +5339,7 @@ void LocallabVibrance::updateAdviceTooltips(const bool showTooltips) exp->set_tooltip_text(""); warm->set_tooltip_text(""); strvib->set_tooltip_text(""); + recothresv->set_tooltip_text(""); expmaskvib->set_tooltip_markup(""); CCmaskvibshape->setTooltip(""); LLmaskvibshape->setTooltip(""); @@ -5292,6 +5364,7 @@ void LocallabVibrance::updateAdviceTooltips(const bool showTooltips) decayv->set_tooltip_text(""); lowthresv->set_tooltip_text(""); higthresv->set_tooltip_text(""); + vibgam->set_tooltip_text(""); } } @@ -5341,6 +5414,7 @@ void LocallabVibrance::read(const rtengine::procparams::ProcParams* pp, const Pa saturated->setValue(spot.saturated); pastels->setValue(spot.pastels); + vibgam->setValue(spot.vibgam); warm->setValue(spot.warm); psThreshold->setValue(spot.psthreshold); protectSkins->set_active(spot.protectskins); @@ -5394,6 +5468,7 @@ void LocallabVibrance::write(rtengine::procparams::ProcParams* pp, ParamsEdited* spot.saturated = saturated->getIntValue(); spot.pastels = pastels->getIntValue(); + spot.vibgam = vibgam->getValue(); spot.warm = warm->getIntValue(); spot.psthreshold = psThreshold->getValue(); spot.protectskins = protectSkins->get_active(); @@ -5435,6 +5510,7 @@ void LocallabVibrance::setDefaults(const rtengine::procparams::ProcParams* defPa // Set default values for adjuster and threshold adjuster widgets saturated->setDefault((double)defSpot.saturated); pastels->setDefault((double)defSpot.pastels); + vibgam->setDefault((double)defSpot.vibgam); warm->setDefault((double)defSpot.warm); psThreshold->setDefault(defSpot.psthreshold); sensiv->setDefault((double)defSpot.sensiv); @@ -5479,6 +5555,13 @@ void LocallabVibrance::adjusterChanged(Adjuster* a, double newval) } } + if (a == vibgam) { + if (listener) { + listener->panelChanged(Evlocallabvibgam, + vibgam->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + if (a == warm) { if (listener) { listener->panelChanged(Evlocallabwarm, @@ -5716,6 +5799,8 @@ void LocallabVibrance::convertParamToNormal() // Set hidden GUI widgets in Normal mode to default spot values saturated->setValue((double)defSpot.saturated); + vibgam->setValue(defSpot.vibgam); + psThreshold->setValue(defSpot.psthreshold); protectSkins->set_active(defSpot.protectskins); avoidColorShift->set_active(defSpot.avoidcolorshift); @@ -5771,6 +5856,7 @@ void LocallabVibrance::updateGUIToMode(const modeType new_type) // Expert and Normal mode widgets are hidden in Simple mode saturated->hide(); pastels->setLabel(M("TP_LOCALLAB_PASTELS2")); + vibgam->hide(); psThreshold->hide(); protectSkins->hide(); avoidColorShift->hide(); @@ -5788,6 +5874,7 @@ void LocallabVibrance::updateGUIToMode(const modeType new_type) case Normal: // Expert mode widgets are hidden in Normal mode saturated->hide(); + vibgam->hide(); pastels->setLabel(M("TP_LOCALLAB_PASTELS2")); psThreshold->hide(); protectSkins->hide(); @@ -5818,6 +5905,7 @@ void LocallabVibrance::updateGUIToMode(const modeType new_type) case Expert: // Show widgets hidden in Normal and Simple mode saturated->show(); + vibgam->show(); pastels->setLabel(M("TP_VIBRANCE_PASTELS")); psThreshold->show(); protectSkins->show(); @@ -5844,7 +5932,7 @@ void LocallabVibrance::updateGUIToMode(const modeType new_type) } } -void LocallabVibrance::updateMaskBackground(const double normChromar, const double normLumar, const double normHuer) +void LocallabVibrance::updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) { idle_register.add( [this, normHuer, normLumar, normChromar]() -> bool { @@ -6020,7 +6108,7 @@ void LocallabSoft::resetMaskView() showmasksoftMethodConn.block(false); } -void LocallabSoft::getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask) +void LocallabSoft::getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) { softMask = showmasksoftMethod->get_active_row_number(); } @@ -6402,6 +6490,7 @@ LocallabBlur::LocallabBlur(): noiselumc(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NOISELUMCOARSE"), MINCHRO, MAXCHROCC, 0.01, 0.))),//unused here, but used for normalize_mean_dt noiselumdetail(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NOISELUMDETAIL"), 0., 100., 0.01, 50.))), noiselequal(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NOISELEQUAL"), -2, 10, 1, 7, Gtk::manage(new RTImage("circle-white-small.png")), Gtk::manage(new RTImage("circle-black-small.png"))))), + noisegam(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NOISEGAM"), 1.0, 5., 0.1, 1.))), LocalcurveEditorwavhue(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_WAVELET_DENOISEHUE"))), wavhue(static_cast(LocalcurveEditorwavhue->addCurve(CT_Flat, "", nullptr, false, true))), noisechrof(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NOISECHROFINE"), MINCHRO, MAXCHRO, 0.01, 0.))), @@ -6571,6 +6660,8 @@ LocallabBlur::LocallabBlur(): noiselequal->setAdjusterListener(this); + noisegam->setAdjusterListener(this); + LocalcurveEditorwavhue->setCurveListener(this); wavhue->setIdentityValue(0.); @@ -6748,6 +6839,7 @@ LocallabBlur::LocallabBlur(): // wavBox->pack_start(*noiselumc);//unused here, but used for normalize_mean_dt wavBox->pack_start(*noiselumdetail); wavBox->pack_start(*noiselequal); + wavBox->pack_start(*noisegam); wavBox->pack_start(*LocalcurveEditorwavhue, Gtk::PACK_SHRINK, 4); ToolParamBlock* const wavBox1 = Gtk::manage(new ToolParamBlock()); wavBox1->pack_start(*maskusable, Gtk::PACK_SHRINK, 0); @@ -6851,7 +6943,7 @@ void LocallabBlur::resetMaskView() showmaskblMethodConn.block(false); } -void LocallabBlur::getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask) +void LocallabBlur::getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) { blMask = showmaskblMethod->get_active_row_number(); } @@ -6884,6 +6976,7 @@ void LocallabBlur::updateAdviceTooltips(const bool showTooltips) invmaskd->set_tooltip_text(M("TP_LOCALLAB_MASKDEINV_TOOLTIP")); LocalcurveEditorwavden->setTooltip(M("TP_LOCALLAB_WASDEN_TOOLTIP")); noiselequal->set_tooltip_text(M("TP_LOCALLAB_DENOIEQUAL_TOOLTIP")); + noisegam->set_tooltip_text(M("TP_LOCALLAB_NOISEGAM_TOOLTIP")); noiselumdetail->set_tooltip_text(M("TP_LOCALLAB_DENOILUMDETAIL_TOOLTIP")); noisechrof->set_tooltip_text(M("TP_LOCALLAB_DENOICHROF_TOOLTIP")); noisechroc->set_tooltip_text(M("TP_LOCALLAB_DENOICHROC_TOOLTIP")); @@ -6950,6 +7043,7 @@ void LocallabBlur::updateAdviceTooltips(const bool showTooltips) invmaskd->set_tooltip_text(""); LocalcurveEditorwavden->setTooltip(""); noiselequal->set_tooltip_text(""); + noisegam->set_tooltip_text(""); noiselumdetail->set_tooltip_text(""); noisechrof->set_tooltip_text(""); noisechroc->set_tooltip_text(""); @@ -7007,6 +7101,7 @@ void LocallabBlur::neutral_pressed () noiselumf0->setValue(defSpot.noiselumf0); noiselumdetail->setValue(defSpot.noiselumdetail); noiselequal->setValue(defSpot.noiselequal); + noisegam->setValue(defSpot.noisegam); noisechrof->setValue(defSpot.noisechrof); noisechroc->setValue(defSpot.noisechroc); noisechrodetail->setValue(defSpot.noisechrodetail); @@ -7189,6 +7284,7 @@ void LocallabBlur::read(const rtengine::procparams::ProcParams* pp, const Params lnoiselow->setValue(spot.lnoiselow); levelthrlow->setValue(spot.levelthrlow); noiselequal->setValue((double)spot.noiselequal); + noisegam->setValue((double)spot.noisegam); noisechrof->setValue(spot.noisechrof); noisechroc->setValue(spot.noisechroc); noisechrodetail->setValue(spot.noisechrodetail); @@ -7336,6 +7432,7 @@ void LocallabBlur::write(rtengine::procparams::ProcParams* pp, ParamsEdited* ped spot.lnoiselow = lnoiselow->getValue(); spot.levelthrlow = levelthrlow->getValue(); spot.noiselequal = noiselequal->getIntValue(); + spot.noisegam = noisegam->getValue(); spot.noisechrof = noisechrof->getValue(); spot.noisechroc = noisechroc->getValue(); spot.noisechrodetail = noisechrodetail->getValue(); @@ -7418,6 +7515,7 @@ void LocallabBlur::setDefaults(const rtengine::procparams::ProcParams* defParams lnoiselow->setDefault(defSpot.lnoiselow); levelthrlow->setDefault(defSpot.levelthrlow); noiselequal->setDefault((double)defSpot.noiselequal); + noisegam->setDefault(defSpot.noisegam); noisechrof->setDefault(defSpot.noisechrof); noisechroc->setDefault(defSpot.noisechroc); noisechrodetail->setDefault(defSpot.noisechrodetail); @@ -7642,6 +7740,13 @@ void LocallabBlur::adjusterChanged(Adjuster* a, double newval) } } + if (a == noisegam) { + if (listener) { + listener->panelChanged(Evlocallabnoisegam, + noisegam->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + if (a == levelthr) { if (listener) { listener->panelChanged(Evlocallablevelthr, @@ -7926,6 +8031,7 @@ void LocallabBlur::convertParamToNormal() csThresholdblur->setValue(defSpot.csthresholdblur); lnoiselow->setValue(defSpot.lnoiselow); nlrad->setValue(defSpot.nlrad); + noisegam->setValue(defSpot.noisegam); // Enable all listeners enableListener(); @@ -7981,6 +8087,7 @@ void LocallabBlur::convertParamToSimple() nlpat->setValue(defSpot.nlpat); nlrad->setValue(defSpot.nlrad); nlgam->setValue(defSpot.nlgam); + noisegam->setValue(defSpot.noisegam); // Enable all listeners enableListener(); @@ -8012,6 +8119,7 @@ void LocallabBlur::updateGUIToMode(const modeType new_type) nlrad->hide(); nlgam->hide(); scalegr->hide(); + noisegam->hide(); break; case Normal: @@ -8037,6 +8145,7 @@ void LocallabBlur::updateGUIToMode(const modeType new_type) nlrad->hide(); nlgam->show(); scalegr->show(); + noisegam->hide(); if (blMethod->get_active_row_number() == 2) { expdenoise2->show(); @@ -8116,6 +8225,7 @@ void LocallabBlur::updateGUIToMode(const modeType new_type) nlpat->show(); nlrad->show(); nlgam->show(); + noisegam->show(); if(lnoiselow->getValue()!= 1.) { if (showmaskblMethodtyp->get_active_row_number() == 0) { @@ -8152,7 +8262,7 @@ void LocallabBlur::updateGUIToMode(const modeType new_type) } } -void LocallabBlur::updateMaskBackground(const double normChromar, const double normLumar, const double normHuer) +void LocallabBlur::updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) { idle_register.add( [this, normHuer, normLumar, normChromar]() -> bool { diff --git a/rtgui/locallabtools.h b/rtgui/locallabtools.h index 82dd8ee31..041fac431 100644 --- a/rtgui/locallabtools.h +++ b/rtgui/locallabtools.h @@ -118,7 +118,7 @@ public: bool isLocallabToolAdded(); // Mask background management function - void refChanged(const double huer, const double lumar, const double chromar); + void refChanged(const double huer, const double lumar, const double chromar, const float fab); // Mask preview functions virtual bool isMaskViewActive() @@ -126,7 +126,7 @@ public: return false; }; virtual void resetMaskView() {}; - virtual void getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask) {}; + virtual void getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) {}; // Advice tooltips management function virtual void updateAdviceTooltips(const bool showTooltips) {}; @@ -151,7 +151,7 @@ public: protected: // To be implemented - virtual void updateMaskBackground(const double normChromar, const double normLumar, const double normHuer) {}; // Only necessary when using mask + virtual void updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) {}; // Only necessary when using mask private: // Remove button event function @@ -180,6 +180,7 @@ private: // Color & Light specific widgets Gtk::Frame* const lumFrame; Adjuster* const reparcol; + Adjuster* const gamc; Adjuster* const lightness; Adjuster* const contrast; Adjuster* const chroma; @@ -277,7 +278,7 @@ public: bool isMaskViewActive() override; void resetMaskView() override; - void getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask) override; + void getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) override; void updateAdviceTooltips(const bool showTooltips) override; @@ -302,7 +303,7 @@ private: void convertParamToSimple() override; void updateGUIToMode(const modeType new_type) override; - void updateMaskBackground(const double normChromar, const double normLumar, const double normHuer) override; + void updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) override; void curvactivChanged(); void gridMethodChanged(); @@ -347,6 +348,7 @@ private: Gtk::CheckButton* const norm; Adjuster* const fatlevel; Adjuster* const fatanchor; + Adjuster* const gamex; Adjuster* const sensiex; Adjuster* const structexp; Adjuster* const blurexpde; @@ -402,7 +404,7 @@ public: bool isMaskViewActive() override; void resetMaskView() override; - void getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask) override; + void getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) override; void updateAdviceTooltips(const bool showTooltips) override; @@ -421,7 +423,7 @@ private: void convertParamToSimple() override; void updateGUIToMode(const modeType new_type) override; - void updateMaskBackground(const double normChromar, const double normLumar, const double normHuer) override; + void updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) override; void expMethodChanged(); void exnoiseMethodChanged(); @@ -438,7 +440,7 @@ private: }; -/* ==== LocallabShadow ==== */ +/* ==== LocallabjShadow ==== */ class LocallabShadow: public Gtk::Box, public LocallabTool @@ -498,7 +500,7 @@ public: bool isMaskViewActive() override; void resetMaskView() override; - void getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask) override; + void getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) override; void updateAdviceTooltips(const bool showTooltips) override; @@ -517,7 +519,7 @@ private: void convertParamToSimple() override; void updateGUIToMode(const modeType new_type) override; - void updateMaskBackground(const double normChromar, const double normLumar, const double normHuer) override; + void updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) override; void shMethodChanged(); void inversshChanged(); @@ -540,6 +542,7 @@ private: // Vibrance specific widgets Adjuster* const saturated; Adjuster* const pastels; + Adjuster* const vibgam; Adjuster* const warm; ThresholdAdjuster* const psThreshold; Gtk::CheckButton* const protectSkins; @@ -584,7 +587,7 @@ public: bool isMaskViewActive() override; void resetMaskView() override; - void getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask) override; + void getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) override; void updateAdviceTooltips(const bool showTooltips) override; @@ -610,7 +613,7 @@ private: void convertParamToSimple() override; void updateGUIToMode(const modeType new_type) override; - void updateMaskBackground(const double normChromar, const double normLumar, const double normHuer) override; + void updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) override; void protectskins_toggled(); void avoidcolorshift_toggled(); @@ -642,7 +645,7 @@ public: bool isMaskViewActive() override; void resetMaskView() override; - void getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask) override; + void getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) override; void updateAdviceTooltips(const bool showTooltips) override; @@ -724,6 +727,7 @@ private: Adjuster* const noiselumc; Adjuster* const noiselumdetail; Adjuster* const noiselequal; + Adjuster* const noisegam; CurveEditorGroup* const LocalcurveEditorwavhue; FlatCurveEditor* wavhue; Adjuster* const noisechrof; @@ -787,7 +791,7 @@ public: bool isMaskViewActive() override; void resetMaskView() override; - void getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask) override; + void getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) override; void updateAdviceTooltips(const bool showTooltips) override; void neutral_pressed(); @@ -813,7 +817,7 @@ private: void convertParamToSimple() override; void updateGUIToMode(const modeType new_type) override; - void updateMaskBackground(const double normChromar, const double normLumar, const double normHuer) override; + void updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) override; void blMethodChanged(); void fftwblChanged(); @@ -884,7 +888,7 @@ public: bool isMaskViewActive() override; void resetMaskView() override; - void getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask) override; + void getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) override; void updateAdviceTooltips(const bool showTooltips) override; @@ -903,7 +907,7 @@ private: void convertParamToSimple() override; void updateGUIToMode(const modeType new_type) override; - void updateMaskBackground(const double normChromar, const double normLumar, const double normHuer) override; + void updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) override; void equiltmChanged(); void showmasktmMethodChanged(); @@ -983,7 +987,7 @@ public: bool isMaskViewActive() override; void resetMaskView() override; - void getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask) override; + void getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) override; void updateAdviceTooltips(const bool showTooltips) override; @@ -1002,7 +1006,7 @@ private: void convertParamToSimple() override; void updateGUIToMode(const modeType new_type) override; - void updateMaskBackground(const double normChromar, const double normLumar, const double normHuer) override; + void updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) override; void loglinChanged(); void retinexMethodChanged(); @@ -1026,6 +1030,7 @@ class LocallabSharp: private: Adjuster* const sharcontrast; Adjuster* const sharblur; + Adjuster* const shargam; Adjuster* const sharamount; Adjuster* const shardamping; Adjuster* const shariter; @@ -1042,7 +1047,7 @@ public: bool isMaskViewActive() override; void resetMaskView() override; - void getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask) override; + void getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) override; void updateAdviceTooltips(const bool showTooltips) override; @@ -1089,6 +1094,9 @@ private: Adjuster* const residshathr; Adjuster* const residhi; Adjuster* const residhithr; + Adjuster* const gamlc; + Adjuster* const residgam; + Adjuster* const residslop; Adjuster* const sensilc; Adjuster* const reparw; Gtk::Frame* const clariFrame; @@ -1173,7 +1181,7 @@ public: bool isMaskViewActive() override; void resetMaskView() override; - void getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask) override; + void getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) override; void updateAdviceTooltips(const bool showTooltips) override; @@ -1198,7 +1206,7 @@ private: void convertParamToSimple() override; void updateGUIToMode(const modeType new_type) override; - void updateMaskBackground(const double normChromar, const double normLumar, const double normHuer) override; + void updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) override; void localcontMethodChanged(); void origlcChanged(); @@ -1272,7 +1280,7 @@ public: bool isMaskViewActive() override; void resetMaskView() override; - void getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask) override; + void getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) override; void updateAdviceTooltips(const bool showTooltips) override; @@ -1291,7 +1299,7 @@ private: void convertParamToSimple() override; void updateGUIToMode(const modeType new_type) override; - void updateMaskBackground(const double normChromar, const double normLumar, const double normHuer) override; + void updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) override; void showmaskcbMethodChanged(); void enacbMaskChanged(); @@ -1375,7 +1383,7 @@ public: bool isMaskViewActive() override; void resetMaskView() override; - void getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask) override; + void getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) override; void updateAdviceTooltips(const bool showTooltips) override; void surroundChanged(); @@ -1390,7 +1398,7 @@ public: void adjusterChanged(Adjuster* a, double newval) override; void curveChanged(CurveEditor* ce) override; - void updateAutocompute(const float blackev, const float whiteev, const float sourceg, const float sourceab, const float targetg); + void updateAutocompute(const float blackev, const float whiteev, const float sourceg, const float sourceab, const float targetg, const float jz1); private: void enabledChanged() override; @@ -1405,7 +1413,7 @@ private: void ciecamChanged(); void showmaskLMethodChanged(); void enaLMaskChanged(); - void updateMaskBackground(const double normChromar, const double normLumar, const double normHuer) override; + void updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) override; void updateLogGUI(); void updateLogGUI2(); @@ -1462,7 +1470,7 @@ public: bool isMaskViewActive() override; void resetMaskView() override; - void getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask) override; + void getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) override; void updateAdviceTooltips(const bool showTooltips) override; @@ -1488,7 +1496,7 @@ private: void convertParamToSimple() override; void updateGUIToMode(const modeType new_type) override; - void updateMaskBackground(const double normChromar, const double normLumar, const double normHuer) override; + void updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) override; void showmask_MethodChanged(); void enamaskChanged(); @@ -1498,4 +1506,221 @@ private: void updateMaskGUI(); }; + +/* ==== Locallabcie ==== */ +class Locallabcie: + public Gtk::Box, + public ThresholdAdjusterListener, + public LocallabTool +{ +private: + Adjuster* const sensicie; + Adjuster* const reparcie; + Gtk::CheckButton* const jabcie; + MyComboBoxText* const modecam; + MyComboBoxText* const modecie; + Gtk::Frame* const jzFrame; + Gtk::Box* const modeHBoxcam; + Gtk::Box* const modeHBoxcie; + Gtk::Frame* const cieFrame; + Gtk::CheckButton* const Autograycie; + Adjuster* const sourceGraycie; + Adjuster* const sourceabscie; + MyComboBoxText* const sursourcie; + Gtk::Box* const surHBoxcie; + Gtk::Frame* const cie1Frame; + Gtk::Frame* const cie1lightFrame; + Gtk::Frame* const cie1contFrame; + Gtk::Frame* const cie1colorFrame; + Gtk::Frame* const czlightFrame; +// Gtk::Frame* const czcontFrame; + Gtk::Frame* const czcolorFrame; + Gtk::Frame* const PQFrame; + Gtk::CheckButton* const qtoj; + Adjuster* const lightlcie; + Adjuster* const lightjzcie; + Adjuster* const contjzcie; + Adjuster* const adapjzcie; + Adjuster* const jz100; + Adjuster* const pqremap; + Adjuster* const pqremapcam16; + Gtk::CheckButton* const forcejz; + MyExpander* const expjz; + Gtk::Frame* const jzshFrame; + Adjuster* const hljzcie; + Adjuster* const hlthjzcie; + Adjuster* const shjzcie; + Adjuster* const shthjzcie; + Adjuster* const radjzcie; + + MyExpander* const expwavjz; + + Gtk::Frame* const contFramejz; + Adjuster* const sigmalcjz; + CurveEditorGroup* const LocalcurveEditorwavjz; + FlatCurveEditor* const wavshapejz; + ThresholdAdjuster* const csThresholdjz; + Gtk::Frame* const clariFramejz; + Adjuster* const clarilresjz; + Adjuster* const claricresjz; + Adjuster* const clarisoftjz; + + MyExpander* const expcam16; + + Adjuster* const lightqcie; + Adjuster* const contlcie; + Adjuster* const contqcie; + Adjuster* const contthrescie; + Gtk::Frame* const logjzFrame; + Gtk::CheckButton* const logjz; + Adjuster* const blackEvjz; + Adjuster* const whiteEvjz; + Adjuster* const targetjz; + Gtk::Frame* const bevwevFrame; + Gtk::CheckButton* const forcebw; + + Gtk::Frame* const sigmoidFrame; + Adjuster* const sigmoidldacie; + Adjuster* const sigmoidthcie; + Adjuster* const sigmoidblcie; + Gtk::CheckButton* const sigmoidqjcie; + Gtk::Frame* const sigmoidjzFrame; + Gtk::CheckButton* const sigjz; + Adjuster* const sigmoidldajzcie; + Adjuster* const sigmoidthjzcie; + Adjuster* const sigmoidbljzcie; + + Adjuster* const colorflcie; + Adjuster* const saturlcie; + Adjuster* const rstprotectcie; + Adjuster* const chromlcie; + Adjuster* const huecie; + CurveEditorGroup* const cieCurveEditorG; + MyComboBoxText* const toneMethodcie; + DiagonalCurveEditor* const shapecie; + CurveEditorGroup* const cieCurveEditorG2; + MyComboBoxText* const toneMethodcie2; + DiagonalCurveEditor* const shapecie2; + + Adjuster* const chromjzcie; + Adjuster* const saturjzcie; + Adjuster* const huejzcie; + CurveEditorGroup* const jz1CurveEditorG; + DiagonalCurveEditor* const shapejz; + DiagonalCurveEditor* const shapecz; + + + Gtk::Frame* const HFramejz; + Gtk::Frame* const JzHFramejz; + CurveEditorGroup* const jz2CurveEditorG; + CurveEditorGroup* const jz3CurveEditorG; + DiagonalCurveEditor* const shapeczjz; + FlatCurveEditor* const HHshapejz; + FlatCurveEditor* const CHshapejz; + FlatCurveEditor* const LHshapejz; + Adjuster* const softjzcie; + Adjuster* const thrhjzcie; + Gtk::CheckButton* const chjzcie; + Adjuster* const strsoftjzcie; + +/* + Gtk::Frame* const ciezFrame; + Adjuster* const lightlzcam; + Adjuster* const lightqzcam; + Adjuster* const contlzcam; + Adjuster* const contqzcam; + Adjuster* const contthreszcam; + Adjuster* const colorflzcam; + Adjuster* const saturzcam; + Adjuster* const chromzcam; +*/ + MyExpander* const expLcie; + Gtk::Frame* const cie2Frame; + Adjuster* const targetGraycie; + Adjuster* const targabscie; + Adjuster* const detailcie; + Adjuster* const catadcie; + MyComboBoxText* const surroundcie; + Gtk::Box* const surrHBoxcie; + + MyExpander* const exprecovcie; + Gtk::Label* const maskusablecie; + Gtk::Label* const maskunusablecie; + Adjuster* const recothrescie; + Adjuster* const lowthrescie; + Adjuster* const higthrescie; + Adjuster* const decaycie; + + MyExpander* const expmaskcie; + MyComboBoxText* const showmaskcieMethod; + Gtk::CheckButton* const enacieMask; + CurveEditorGroup* const maskcieCurveEditorG; + FlatCurveEditor* const CCmaskcieshape; + FlatCurveEditor* const LLmaskcieshape; + FlatCurveEditor* const HHmaskcieshape; + Adjuster* const blendmaskcie; + Adjuster* const radmaskcie; + Adjuster* const lapmaskcie; + Adjuster* const chromaskcie; + Adjuster* const gammaskcie; + Adjuster* const slomaskcie; + + CurveEditorGroup* const mask2cieCurveEditorG; + DiagonalCurveEditor* const Lmaskcieshape; + + sigc::connection AutograycieConn, forcejzConn, forcebwConn, qtojConn, showmaskcieMethodConn, enacieMaskConn, jabcieConn, sursourcieconn, surroundcieconn, modecieconn, modecamconn, sigmoidqjcieconn, logjzconn, sigjzconn, chjzcieconn, toneMethodcieConn, toneMethodcieConn2; +public: + Locallabcie(); + ~Locallabcie(); + + bool isMaskViewActive() override; + void resetMaskView() override; + void getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) override; + + void updateAdviceTooltips(const bool showTooltips) override; + void setDefaultExpanderVisibility() override; + + void disableListener() override; + void enableListener() override; + void read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setDefaults(const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; + void adjusterChanged(Adjuster* a, double newval) override; + void adjusterChanged(ThresholdAdjuster* a, double newBottom, double newTop) override {}; // Not used +// void adjusterChanged3(ThresholdAdjuster* a, double newBottom, double newTop) override {}; + void adjusterChanged(ThresholdAdjuster* a, double newBottomLeft, double newTopLeft, double newBottomRight, double newTopRight) override {}; // Not used + void adjusterChanged(ThresholdAdjuster* a, int newBottom, int newTop) override {}; // Not used + void adjusterChanged(ThresholdAdjuster* a, int newBottomLeft, int newTopLeft, int newBottomRight, int newTopRight) override {}; // Not used + void adjusterChanged2(ThresholdAdjuster* a, int newBottomL, int newTopL, int newBottomR, int newTopR) override; + void sursourcieChanged(); + void surroundcieChanged(); + void modecieChanged(); + void modecamChanged(); + void curveChanged(CurveEditor* ce) override; + void toneMethodcieChanged(); + void toneMethodcie2Changed(); + void updateAutocompute(const float blackev, const float whiteev, const float sourceg, const float sourceab, const float targetg, const float jz1); + +private: + void enabledChanged() override; + void convertParamToNormal() override; + void convertParamToSimple() override; + void updateGUIToMode(const modeType new_type) override; + void complexityModeChanged(); + void AutograycieChanged(); + void forcejzChanged(); + void forcebwChanged(); + void qtojChanged(); + void jabcieChanged(); + void sigmoidqjcieChanged(); + void logjzChanged(); + void sigjzChanged(); + void chjzcieChanged(); + void updatecieGUI(); + void updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) override; + void showmaskcieMethodChanged(); + void enacieMaskChanged(); + +}; + #endif diff --git a/rtgui/locallabtools2.cc b/rtgui/locallabtools2.cc index 55cd98680..e37e657d7 100644 --- a/rtgui/locallabtools2.cc +++ b/rtgui/locallabtools2.cc @@ -24,6 +24,7 @@ #include "../rtengine/procparams.h" #include "locallab.h" #include "rtimage.h" +#include "../rtengine/color.h" #define MINNEIGH 0.1 #define MAXNEIGH 1500 @@ -132,7 +133,7 @@ LocallabTone::LocallabTone(): exprecovt(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_DENOI2_EXP")))), maskusablet(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUSABLE")))), maskunusablet(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUNUSABLE")))), - recothrest(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKRECOTHRES"), 1., 2., 0.01, 1.))), + recothrest(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKRECOTHRES"), 0., 2., 0.01, 1.))), lowthrest(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHRLOW"), 1., 80., 0.5, 12.))), higthrest(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHR"), 20., 99., 0.5, 85.))), decayt(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKDDECAY"), 0.5, 4., 0.1, 2.))), @@ -299,7 +300,7 @@ void LocallabTone::resetMaskView() showmasktmMethodConn.block(false); } -void LocallabTone::getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask) +void LocallabTone::getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) { tmMask = showmasktmMethod->get_active_row_number(); } @@ -308,6 +309,7 @@ void LocallabTone::updateAdviceTooltips(const bool showTooltips) { if (showTooltips) { exp->set_tooltip_text(M("TP_LOCALLAB_TONEMAP_TOOLTIP")); + recothrest->set_tooltip_text(M("TP_LOCALLAB_RECOTHRES02_TOOLTIP")); exprecovt->set_tooltip_markup(M("TP_LOCALLAB_MASKRESTM_TOOLTIP")); equiltm->set_tooltip_text(M("TP_LOCALLAB_EQUILTM_TOOLTIP")); repartm->set_tooltip_text(M("TP_LOCALLAB_REPARTM_TOOLTIP")); @@ -336,6 +338,7 @@ void LocallabTone::updateAdviceTooltips(const bool showTooltips) } else { exp->set_tooltip_text(""); equiltm->set_tooltip_text(""); + recothrest->set_tooltip_text(""); repartm->set_tooltip_text(""); gamma->set_tooltip_text(""); estop->set_tooltip_text(""); @@ -700,7 +703,7 @@ void LocallabTone::updateGUIToMode(const modeType new_type) } } -void LocallabTone::updateMaskBackground(const double normChromar, const double normLumar, const double normHuer) +void LocallabTone::updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) { idle_register.add( [this, normHuer, normLumar, normChromar]() -> bool { @@ -1100,7 +1103,7 @@ void LocallabRetinex::resetMaskView() showmaskretiMethodConn.block(false); } -void LocallabRetinex::getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask) +void LocallabRetinex::getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) { retiMask = showmaskretiMethod->get_active_row_number(); } @@ -1783,7 +1786,7 @@ void LocallabRetinex::updateGUIToMode(const modeType new_type) } } -void LocallabRetinex::updateMaskBackground(const double normChromar, const double normLumar, const double normHuer) +void LocallabRetinex::updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) { idle_register.add( [this, normHuer, normLumar, normChromar]() -> bool { @@ -1980,6 +1983,7 @@ LocallabSharp::LocallabSharp(): // Sharpening specific widgets sharcontrast(Gtk::manage(new Adjuster(M("TP_SHARPENING_CONTRAST"), 0, 200, 1, 20))), sharblur(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SHARBLUR"), 0.2, 2.0, 0.05, 0.2))), + shargam(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GAMC"), 0.5, 3.0, 0.05, 1.))), sharamount(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SHARAMOUNT"), 0, 100, 1, 100))), shardamping(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SHARDAMPING"), 0, 100, 1, 0))), shariter(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SHARITER"), 5, 100, 1, 30))), @@ -2004,6 +2008,8 @@ LocallabSharp::LocallabSharp(): sharblur->setAdjusterListener(this); + shargam->setAdjusterListener(this); + sensisha->setAdjusterListener(this); inversshaConn = inverssha->signal_toggled().connect(sigc::mem_fun(*this, &LocallabSharp::inversshaChanged)); @@ -2019,6 +2025,7 @@ LocallabSharp::LocallabSharp(): pack_start(*sensisha); pack_start(*sharcontrast); pack_start(*sharblur); + pack_start(*shargam); pack_start(*sharradius); pack_start(*sharamount); pack_start(*shardamping); @@ -2044,7 +2051,7 @@ void LocallabSharp::resetMaskView() showmasksharMethodConn.block(false); } -void LocallabSharp::getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask) +void LocallabSharp::getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) { sharMask = showmasksharMethod->get_active_row_number(); } @@ -2054,9 +2061,12 @@ void LocallabSharp::updateAdviceTooltips(const bool showTooltips) if (showTooltips) { exp->set_tooltip_text(M("TP_LOCALLAB_EXPSHARP_TOOLTIP")); sensisha->set_tooltip_text(M("TP_LOCALLAB_SENSI_TOOLTIP")); + shargam->set_tooltip_text(M("TP_LOCALLAB_GAMCOL_TOOLTIP")); + } else { exp->set_tooltip_text(""); sensisha->set_tooltip_text(""); + shargam->set_tooltip_text(""); } } @@ -2097,6 +2107,7 @@ void LocallabSharp::read(const rtengine::procparams::ProcParams* pp, const Param shardamping->setValue((double)spot.shardamping); shariter->setValue((double)spot.shariter); sharblur->setValue(spot.sharblur); + shargam->setValue(spot.shargam); sensisha->setValue((double)spot.sensisha); inverssha->set_active(spot.inverssha); } @@ -2127,6 +2138,7 @@ void LocallabSharp::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pe spot.shardamping = shardamping->getIntValue(); spot.shariter = shariter->getIntValue(); spot.sharblur = sharblur->getValue(); + spot.shargam = shargam->getValue(); spot.sensisha = sensisha->getIntValue(); spot.inverssha = inverssha->get_active(); } @@ -2148,6 +2160,7 @@ void LocallabSharp::setDefaults(const rtengine::procparams::ProcParams* defParam shardamping->setDefault((double)defSpot.shardamping); shariter->setDefault((double)defSpot.shariter); sharblur->setDefault(defSpot.sharblur); + shargam->setDefault(defSpot.shargam); sensisha->setDefault((double)defSpot.sensisha); } @@ -2199,6 +2212,13 @@ void LocallabSharp::adjusterChanged(Adjuster* a, double newval) } } + if (a == shargam) { + if (listener) { + listener->panelChanged(Evlocallabshargam, + shargam->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + if (a == sensisha) { if (listener) { listener->panelChanged(Evlocallabsensis, @@ -2236,6 +2256,7 @@ void LocallabSharp::convertParamToNormal() sharamount->setValue(defSpot.sharamount); shardamping->setValue((double)defSpot.shardamping); shariter->setValue((double)defSpot.shariter); + shargam->setValue(defSpot.shargam); // Enable all listeners enableListener(); @@ -2268,6 +2289,7 @@ void LocallabSharp::updateGUIToMode(const modeType new_type) shardamping->hide(); shariter->hide(); sharFrame->hide(); + shargam->hide(); break; @@ -2275,6 +2297,7 @@ void LocallabSharp::updateGUIToMode(const modeType new_type) // Expert mode widgets are hidden in Normal mode sharcontrast->hide(); sharblur->hide(); + shargam->hide(); sharamount->hide(); shardamping->hide(); shariter->hide(); @@ -2287,6 +2310,7 @@ void LocallabSharp::updateGUIToMode(const modeType new_type) // Show widgets hidden in Normal and Simple mode sharcontrast->show(); sharblur->show(); + shargam->show(); sharamount->show(); shardamping->show(); shariter->show(); @@ -2346,6 +2370,9 @@ LocallabContrast::LocallabContrast(): residshathr(Gtk::manage(new Adjuster(M("TP_LOCALLAB_RESIDSHATHR"), 0., 100., 1., 30.))), residhi(Gtk::manage(new Adjuster(M("TP_LOCALLAB_RESIDHI"), -100., 100., 1., 0.))), residhithr(Gtk::manage(new Adjuster(M("TP_LOCALLAB_RESIDHITHR"), 0., 100., 1., 70.))), + gamlc(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GAMW"), 0.5, 3., 0.01, 1.))), + residgam(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GAMSH"), 0.25, 15.0, 0.01, 2.4))), + residslop(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SLOSH"), 0.0, 500.0, 0.01, 12.92))), sensilc(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSI"), 0, 100, 1, 60))), reparw(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LOGREPART"), 1.0, 100.0, 1., 100.0))), clariFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_CLARIFRA")))), @@ -2405,7 +2432,7 @@ LocallabContrast::LocallabContrast(): exprecovw(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_DENOI2_EXP")))), maskusablew(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUSABLE")))), maskunusablew(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUNUSABLE")))), - recothresw(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKRECOTHRES"), 1., 2., 0.01, 1.))), + recothresw(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKRECOTHRES"), 0., 2., 0.01, 1.))), lowthresw(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHRLOW"), 1., 80., 0.5, 12.))), higthresw(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHR"), 20., 99., 0.5, 85.))), decayw(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKDDECAY"), 0.5, 4., 0.1, 2.))), @@ -2478,6 +2505,14 @@ LocallabContrast::LocallabContrast(): residhithr->setAdjusterListener(this); + gamlc->setAdjusterListener(this); + + + residgam->setAdjusterListener(this); + + residslop->setAdjusterListener(this); + residslop->setLogScale(16, 0); + sensilc->setAdjusterListener(this); reparw->setAdjusterListener(this); @@ -2726,10 +2761,14 @@ LocallabContrast::LocallabContrast(): Gtk::Frame* const shresFrame = Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_SHRESFRA"))); shresFrame->set_label_align(0.025, 0.5); ToolParamBlock* const shresBox = Gtk::manage(new ToolParamBlock()); + Gtk::Separator* const separatorsh = Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); shresBox->pack_start(*residsha); shresBox->pack_start(*residshathr); shresBox->pack_start(*residhi); shresBox->pack_start(*residhithr); + shresBox->pack_start(*separatorsh); + shresBox->pack_start(*residgam); + shresBox->pack_start(*residslop); shresFrame->add(*shresBox); resiBox->pack_start(*shresFrame); expresidpyr->add(*resiBox, false); @@ -2802,6 +2841,7 @@ LocallabContrast::LocallabContrast(): blurlevelFrame->add(*blurlevcontBox); blurcontBox->pack_start(*blurlevelFrame); expcontrastpyr->add(*blurcontBox, false); + pack_start(*gamlc); pack_start(*expcontrastpyr); ToolParamBlock* const blurcontBox2 = Gtk::manage(new ToolParamBlock()); Gtk::Frame* const contFrame2 = Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_CONTFRA"))); @@ -2889,7 +2929,7 @@ void LocallabContrast::resetMaskView() showmasklcMethodConn.block(false); } -void LocallabContrast::getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask) +void LocallabContrast::getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) { lcMask = showmasklcMethod->get_active_row_number(); } @@ -2898,13 +2938,14 @@ void LocallabContrast::updateAdviceTooltips(const bool showTooltips) { if (showTooltips) { contFrame->set_tooltip_text(M("TP_LOCALLAB_EXPCONTRAST_TOOLTIP")); + recothresw->set_tooltip_text(M("TP_LOCALLAB_RECOTHRES02_TOOLTIP")); LocalcurveEditorwav->set_tooltip_markup(M("TP_LOCALLAB_WAT_LEVELLOCCONTRAST_TOOLTIP")); csThreshold->set_tooltip_markup(M("TP_LOCALLAB_WAT_THRESHOLDWAV_TOOLTIP")); levelwav->set_tooltip_markup(M("TP_LOCALLAB_LEVELWAV_TOOLTIP")); clariFrame->set_tooltip_markup(M("TP_LOCALLAB_CLARI_TOOLTIP")); clarisoft->set_tooltip_markup(M("TP_LOCALLAB_CLARISOFT_TOOLTIP")); exprecovw->set_tooltip_markup(M("TP_LOCALLAB_MASKRESWAV_TOOLTIP")); - + gamlc->set_tooltip_text(M("TP_LOCALLAB_GAMC_TOOLTIP")); wavshape->setTooltip(M("TP_LOCALLAB_WAT_WAVSHAPE_TOOLTIP")); clarilres->set_tooltip_text(M("TP_LOCALLAB_WAT_CLARIL_TOOLTIP")); claricres->set_tooltip_text(M("TP_LOCALLAB_WAT_CLARIC_TOOLTIP")); @@ -2969,6 +3010,7 @@ void LocallabContrast::updateAdviceTooltips(const bool showTooltips) higthresw->set_tooltip_text(M("TP_LOCALLAB_MASKHIGTHRESWAV_TOOLTIP")); } else { contFrame->set_tooltip_text(""); + recothresw->set_tooltip_text(""); LocalcurveEditorwav->set_tooltip_markup(""); csThreshold->set_tooltip_markup(""); expresidpyr->set_tooltip_text(""); @@ -2997,6 +3039,7 @@ void LocallabContrast::updateAdviceTooltips(const bool showTooltips) chromasklc->set_tooltip_text(""); sensilc->set_tooltip_text(""); reparw->set_tooltip_text(""); + gamlc->set_tooltip_text(""); wavshape->setTooltip(""); clarilres->set_tooltip_text(""); @@ -3130,6 +3173,9 @@ void LocallabContrast::read(const rtengine::procparams::ProcParams* pp, const Pa residshathr->setValue(spot.residshathr); residhi->setValue(spot.residhi); residhithr->setValue(spot.residhithr); + gamlc->setValue((double)spot.gamlc); + residgam->setValue(spot.residgam); + residslop->setValue(spot.residslop); sensilc->setValue((double)spot.sensilc); reparw->setValue(spot.reparw); clarilres->setValue(spot.clarilres); @@ -3252,6 +3298,9 @@ void LocallabContrast::write(rtengine::procparams::ProcParams* pp, ParamsEdited* spot.residshathr = residshathr->getValue(); spot.residhi = residhi->getValue(); spot.residhithr = residhithr->getValue(); + spot.gamlc = gamlc->getValue(); + spot.residgam = residgam->getValue(); + spot.residslop = residslop->getValue(); spot.sensilc = sensilc->getIntValue(); spot.reparw = reparw->getValue(); spot.clarilres = clarilres->getValue(); @@ -3353,6 +3402,9 @@ void LocallabContrast::setDefaults(const rtengine::procparams::ProcParams* defPa residshathr->setDefault(defSpot.residshathr); residhi->setDefault(defSpot.residhi); residhithr->setDefault(defSpot.residhithr); + gamlc->setDefault((double)defSpot.gamlc); + residgam->setDefault(defSpot.residgam); + residslop->setDefault(defSpot.residslop); sensilc->setDefault((double)defSpot.sensilc); reparw->setDefault(defSpot.reparw); clarilres->setDefault(defSpot.clarilres); @@ -3482,6 +3534,27 @@ void LocallabContrast::adjusterChanged(Adjuster* a, double newval) } } + if (a == gamlc) { + if (listener) { + listener->panelChanged(Evlocallabgamlc, + gamlc->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == residgam) { + if (listener) { + listener->panelChanged(Evlocallabresidgam, + residgam->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == residslop) { + if (listener) { + listener->panelChanged(Evlocallabresidslop, + residslop->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + if (a == sensilc) { if (listener) { listener->panelChanged(Evlocallabsensilc, @@ -3851,6 +3924,7 @@ void LocallabContrast::convertParamToNormal() // Disable all listeners disableListener(); + gamlc->setValue(defSpot.gamlc); // Set hidden GUI widgets in Normal mode to default spot values origlc->set_active(defSpot.origlc); @@ -3927,6 +4001,7 @@ void LocallabContrast::convertParamToSimple() // Disable all listeners disableListener(); + gamlc->setValue(defSpot.gamlc); // Set hidden specific GUI widgets in Simple mode to default spot values if (defSpot.localcontMethod == "loc") { @@ -3973,6 +4048,7 @@ void LocallabContrast::updateGUIToMode(const modeType new_type) decayw->hide(); maskusablew->hide(); maskunusablew->hide(); + gamlc->hide(); break; @@ -3995,6 +4071,7 @@ void LocallabContrast::updateGUIToMode(const modeType new_type) maskusablew->hide(); maskunusablew->show(); } + gamlc->hide(); break; @@ -4006,6 +4083,7 @@ void LocallabContrast::updateGUIToMode(const modeType new_type) if (localcontMethod->get_active_row_number() != 0) { // Keep widgets hidden when localcontMethod is equal to 0 expcontrastpyr->show(); expcontrastpyr2->show(); + gamlc->show(); } if (localcontMethod->get_active_row_number() != 1) { // Keep widget hidden when localcontMethod is equal to 1 @@ -4027,7 +4105,7 @@ void LocallabContrast::updateGUIToMode(const modeType new_type) } } -void LocallabContrast::updateMaskBackground(const double normChromar, const double normLumar, const double normHuer) +void LocallabContrast::updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) { idle_register.add( [this, normHuer, normLumar, normChromar]() -> bool { @@ -4288,7 +4366,7 @@ void LocallabContrast::updateContrastGUI1() clariFrame->hide(); expcontrastpyr->hide(); expcontrastpyr2->hide(); - + gamlc->hide(); if (mode == Expert) { // Keep widget hidden in Normal and Simple mode fftwlc->show(); } @@ -4306,6 +4384,7 @@ void LocallabContrast::updateContrastGUI1() if (mode == Expert) { // Keep widget hidden in Normal and Simple mode expcontrastpyr->show(); expcontrastpyr2->show(); + gamlc->show(); } fftwlc->hide(); @@ -4551,7 +4630,7 @@ void LocallabCBDL::resetMaskView() showmaskcbMethodConn.block(false); } -void LocallabCBDL::getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask) +void LocallabCBDL::getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) { cbMask = showmaskcbMethod->get_active_row_number(); } @@ -5047,7 +5126,7 @@ void LocallabCBDL::updateGUIToMode(const modeType new_type) } } -void LocallabCBDL::updateMaskBackground(const double normChromar, const double normLumar, const double normHuer) +void LocallabCBDL::updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) { idle_register.add( [this, normHuer, normLumar, normChromar]() -> bool { @@ -5153,7 +5232,7 @@ LocallabLog::LocallabLog(): surHBox(Gtk::manage(new Gtk::Box())), log1Frame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LOG1FRA")))), log2Frame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LOG2FRA")))), - targetGray(Gtk::manage(new Adjuster(M("TP_LOCALLAB_TARGET_GRAY"), 5.0, 80.0, 0.1, 18.0))), + targetGray(Gtk::manage(new Adjuster(M("TP_LOCALLAB_TARGET_GRAY"), 4.0, 80.0, 0.1, 18.0))), detail(Gtk::manage(new Adjuster(M("TP_LOCALLAB_DETAIL"), 0., 1., 0.01, 0.6))), catad(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CATAD"), -100., 100., 0.5, 0., Gtk::manage(new RTImage("circle-blue-small.png")), Gtk::manage(new RTImage("circle-orange-small.png"))))), lightl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LOGLIGHTL"), -100., 100., 0.5, 0.))), @@ -5174,7 +5253,7 @@ LocallabLog::LocallabLog(): exprecovl(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_DENOI2_EXP")))), maskusablel(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUSABLE")))), maskunusablel(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUNUSABLE")))), - recothresl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKRECOTHRES"), 1., 2., 0.01, 1.))), + recothresl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKRECOTHRES"), 0., 2., 0.01, 1.))), lowthresl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHRLOW"), 1., 80., 0.5, 12.))), higthresl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHR"), 20., 99., 0.5, 85.))), decayl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKDDECAY"), 0.5, 4., 0.1, 2.))), @@ -5218,12 +5297,14 @@ LocallabLog::LocallabLog(): AutograyConn = Autogray->signal_toggled().connect(sigc::mem_fun(*this, &LocallabLog::AutograyChanged)); sourceGray->setAdjusterListener(this); + sourceGray->setLogScale(10, 18, true); sourceabs->setLogScale(500, 0); sourceabs->setAdjusterListener(this); targetGray->setAdjusterListener(this); + targetGray->setLogScale(10, 18, true); detail->setAdjusterListener(this); @@ -5445,6 +5526,7 @@ void LocallabLog::updateAdviceTooltips(const bool showTooltips) if (showTooltips) { exp->set_tooltip_text(M("TP_LOCALLAB_LOGENCOD_TOOLTIP")); repar->set_tooltip_text(M("TP_LOCALLAB_LOGREPART_TOOLTIP")); + recothresl->set_tooltip_text(M("TP_LOCALLAB_RECOTHRES02_TOOLTIP")); logPFrame->set_tooltip_text(M("TP_LOCALLAB_LOGFRAME_TOOLTIP")); logFrame->set_tooltip_text(M("TP_LOCALLAB_LOGSCENE_TOOLTIP")); log1Frame->set_tooltip_text(M("TP_LOCALLAB_LOGIMAGE_TOOLTIP")); @@ -5456,7 +5538,7 @@ void LocallabLog::updateAdviceTooltips(const bool showTooltips) exprecovl->set_tooltip_markup(M("TP_LOCALLAB_MASKRELOG_TOOLTIP")); blackEv->set_tooltip_text(""); whiteEv->set_tooltip_text(""); - sourceGray->set_tooltip_text(""); + sourceGray->set_tooltip_text(M("TP_LOCALLAB_JZLOGYBOUT_TOOLTIP")); sourceabs->set_tooltip_text(M("TP_COLORAPP_ADAPSCEN_TOOLTIP")); targabs->set_tooltip_text(M("TP_COLORAPP_VIEWING_ABSOLUTELUMINANCE_TOOLTIP")); targetGray->set_tooltip_text(M("TP_COLORAPP_YBOUT_TOOLTIP")); @@ -5493,6 +5575,7 @@ void LocallabLog::updateAdviceTooltips(const bool showTooltips) } else { exp->set_tooltip_text(""); repar->set_tooltip_text(""); + recothresl->set_tooltip_text(""); logPFrame->set_tooltip_text(""); logFrame->set_tooltip_text(""); log1Frame->set_tooltip_text(""); @@ -5580,7 +5663,7 @@ void LocallabLog::resetMaskView() showmaskLMethodConn.block(false); } -void LocallabLog::getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask) +void LocallabLog::getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) { logMask = showmaskLMethod->get_active_row_number(); } @@ -6234,26 +6317,28 @@ void LocallabLog::adjusterChanged(Adjuster* a, double newval) } } -void LocallabLog::updateAutocompute(const float blackev, const float whiteev, const float sourceg, const float sourceab, const float targetg) +void LocallabLog::updateAutocompute(const float blackev, const float whiteev, const float sourceg, const float sourceab, const float targetg, const float jz1) { - idle_register.add( - [this, blackev, whiteev, sourceg, sourceab, targetg]() -> bool { - GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected + if (autocompute->get_active()) { + idle_register.add( + [this, blackev, whiteev, sourceg, sourceab, targetg, jz1]() -> bool { + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected - // Update adjuster values according to autocomputed ones - disableListener(); + // Update adjuster values according to autocomputed ones + disableListener(); - blackEv->setValue(blackev); - whiteEv->setValue(whiteev); - sourceGray->setValue(sourceg); - sourceabs->setValue(sourceab); - targetGray->setValue(targetg); + blackEv->setValue(blackev); + whiteEv->setValue(whiteev); + sourceGray->setValue(sourceg); + sourceabs->setValue(sourceab); + targetGray->setValue(targetg); - enableListener(); + enableListener(); return false; + } + ); } - ); } void LocallabLog::enabledChanged() @@ -6367,7 +6452,7 @@ void LocallabLog::fullimageChanged() } } -void LocallabLog::updateMaskBackground(const double normChromar, const double normLumar, const double normHuer) +void LocallabLog::updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) { idle_register.add( [this, normHuer, normLumar, normChromar]() -> bool { @@ -6662,7 +6747,7 @@ void LocallabMask::resetMaskView() showmask_MethodConn.block(false); } -void LocallabMask::getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask) +void LocallabMask::getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) { maskMask = showmask_Method->get_active_row_number(); } @@ -7199,7 +7284,7 @@ void LocallabMask::updateGUIToMode(const modeType new_type) } -void LocallabMask::updateMaskBackground(const double normChromar, const double normLumar, const double normHuer) +void LocallabMask::updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) { idle_register.add( [this, normHuer, normLumar, normChromar]() -> bool { @@ -7291,3 +7376,2943 @@ void LocallabMask::updateMaskGUI() blurmask->setValue(temp); } + +/*==== Locallabcie ====*/ +Locallabcie::Locallabcie(): + LocallabTool(this, M("TP_LOCALLAB_CIE_TOOLNAME"), M("TP_LOCALLAB_CIE"), false), + // ciecam specific widgets + sensicie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSI"), 0, 100, 1, 60))), + reparcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LOGREPART"), 1.0, 100.0, 1., 100.0))), + jabcie(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_JAB")))), + modecam(Gtk::manage (new MyComboBoxText ())), + modecie(Gtk::manage (new MyComboBoxText ())), + jzFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_JZFRA")))), + modeHBoxcam(Gtk::manage(new Gtk::Box())), + modeHBoxcie(Gtk::manage(new Gtk::Box())), + cieFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LOGFRA")))), + Autograycie(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_AUTOGRAYCIE")))), + sourceGraycie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SOURCE_GRAY"), 1.0, 100.0, 0.1, 18.0))), + sourceabscie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SOURCE_ABS"), 0.01, 16384.0, 0.01, 2000.0))), + sursourcie(Gtk::manage (new MyComboBoxText ())), + surHBoxcie(Gtk::manage(new Gtk::Box())), + cie1Frame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LOG1FRA")))), + cie1lightFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_CIELIGHTFRA")))), + cie1contFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_CIECONTFRA")))), + cie1colorFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_CIECOLORFRA")))), + czlightFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_CIELIGHTCONTFRA")))), + czcolorFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_CIECOLORFRA")))), + PQFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_JZPQFRA")))), + qtoj(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_JZQTOJ")))), + lightlcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LOGLIGHTL"), -100., 100., 0.01, 0.))), + lightjzcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_JZLIGHT"), -100., 100., 0.01, 0.))), + contjzcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_JZCONT"), -100., 100., 0.5, 0.))), + adapjzcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_JZADAP"), 1., 10., 0.05, 4.))), + jz100(Gtk::manage(new Adjuster(M("TP_LOCALLAB_JZ100"), 0.10, 0.90, 0.01, 0.25))), + pqremap(Gtk::manage(new Adjuster(M("TP_LOCALLAB_JZPQREMAP"), 100., 10000., 0.1, 120.))), + pqremapcam16(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CAM16PQREMAP"), 100., 10000., 0.1, 100.))), + forcejz(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_JZFORCE")))), + expjz(Gtk::manage(new MyExpander(false, Gtk::manage(new Gtk::Box())))), + jzshFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_JZSHFRA")))), + hljzcie(Gtk::manage(new Adjuster(M("TP_SHADOWSHLIGHTS_HIGHLIGHTS"), 0., 100., 1., 0.))), + hlthjzcie(Gtk::manage(new Adjuster(M("TP_SHADOWSHLIGHTS_HLTONALW"), 20., 100., 1., 70.))), + shjzcie(Gtk::manage(new Adjuster(M("TP_SHADOWSHLIGHTS_SHADOWS"), 0., 100., 1., 0.))), + shthjzcie(Gtk::manage(new Adjuster(M("TP_SHADOWSHLIGHTS_SHTONALW"), 20., 100., 1., 40.))), + radjzcie(Gtk::manage(new Adjuster(M("TP_SHADOWSHLIGHTS_RADIUS"), 0., 100., 1., 40.))), + expwavjz(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_JZWAVEXP")))), + contFramejz(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_CONTWFRA")))), + sigmalcjz(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SIGMAWAV"), 0.2, 2.5, 0.01, 1.))), + LocalcurveEditorwavjz(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_WAV"))), + wavshapejz(static_cast(LocalcurveEditorwavjz->addCurve(CT_Flat, "", nullptr, false, false))), + csThresholdjz(Gtk::manage(new ThresholdAdjuster(M("TP_LOCALLAB_CSTHRESHOLD"), 0, 9, 0, 0, 7, 4, 0, false))), + clariFramejz(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_CLARIFRA")))), + clarilresjz(Gtk::manage(new Adjuster(M("TP_LOCALLAB_JZCLARILRES"), -20., 100., 0.5, 0.))), + claricresjz(Gtk::manage(new Adjuster(M("TP_LOCALLAB_JZCLARICRES"), -20., 100., 0.5, 0.))), + clarisoftjz(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SOFTRADIUSCOL"), 0.0, 100.0, 0.5, 0.))), + + expcam16(Gtk::manage(new MyExpander(false, Gtk::manage(new Gtk::Box())))), + lightqcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LOGLIGHTQ"), -100., 100., 0.05, 0.))), + contlcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LOGCONTL"), -100., 100., 0.5, 0.))), + contqcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LOGCONQL"), -100., 100., 0.5, 0.))), + contthrescie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LOGCONTHRES"), -1., 1., 0.01, 0.))), + + logjzFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LOGJZFRA")))), + logjz(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_JZLOG")))), + blackEvjz(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLACK_EV"), -16.0, 0.0, 0.1, -5.0))), + whiteEvjz(Gtk::manage(new Adjuster(M("TP_LOCALLAB_WHITE_EV"), 0., 32.0, 0.1, 10.0))), + targetjz(Gtk::manage(new Adjuster(M("TP_LOCALLAB_JZTARGET_EV"), 4., 80.0, 0.1, 18.0))), + bevwevFrame(Gtk::manage(new Gtk::Frame(M("")))), + forcebw(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_BWFORCE")))), + + sigmoidFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_SIGFRA")))), + sigmoidldacie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SIGMOIDLAMBDA"), 0., 1.0, 0.01, 0.))), + sigmoidthcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SIGMOIDTH"), 0.1, 4., 0.01, 1., Gtk::manage(new RTImage("circle-black-small.png")), Gtk::manage(new RTImage("circle-white-small.png"))))), + sigmoidblcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SIGMOIDBL"), 0.5, 1.5, 0.01, 1.))), + sigmoidqjcie(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_SIGMOIDQJ")))), + sigmoidjzFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_SIGJZFRA")))), + sigjz(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_SIGJZFRA")))), + sigmoidldajzcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SIGMOIDLAMBDA"), 0., 1.0, 0.01, 0.5))), + sigmoidthjzcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SIGMOIDTH"), 0.1, 4., 0.01, 1., Gtk::manage(new RTImage("circle-black-small.png")), Gtk::manage(new RTImage("circle-white-small.png"))))), + sigmoidbljzcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SIGMOIDBL"), 0.5, 1.5, 0.01, 1.))), + colorflcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LOGCOLORFL"), -100., 100., 0.5, 0.))), + saturlcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SATURV"), -100., 100., 0.5, 0.))), + rstprotectcie(Gtk::manage(new Adjuster(M("TP_COLORAPP_RSTPRO"), 0., 100., 0.1, 0.))), + chromlcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CHROML"), -100., 100., 0.5, 0.))), + huecie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_HUECIE"), -100., 100., 0.1, 0.))), + cieCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_CURVES_CIE"))), + toneMethodcie(Gtk::manage(new MyComboBoxText())), + shapecie(static_cast(cieCurveEditorG->addCurve(CT_Diagonal, "", toneMethodcie))), + cieCurveEditorG2(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_COLOR_CIE"))), + toneMethodcie2(Gtk::manage(new MyComboBoxText())), + shapecie2(static_cast(cieCurveEditorG2->addCurve(CT_Diagonal, "", toneMethodcie2))), + + chromjzcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_JZCHROM"), -100., 100., 0.5, 0.))), + saturjzcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_JZSAT"), -100., 100., 0.5, 0.))), + huejzcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_JZHUECIE"), -100., 100., 0.1, 0.))), + jz1CurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, "", 1)), + shapejz(static_cast(jz1CurveEditorG->addCurve(CT_Diagonal, "Jz(J)"))), + shapecz(static_cast(jz1CurveEditorG->addCurve(CT_Diagonal, "Cz(C)"))), + + HFramejz(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_JZHFRA")))), + JzHFramejz(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_JZHJZFRA")))), + jz2CurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, "", 1)), + jz3CurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, "", 1)), + shapeczjz(static_cast(jz1CurveEditorG->addCurve(CT_Diagonal, "Cz(J)"))), + HHshapejz(static_cast(jz3CurveEditorG->addCurve(CT_Flat, "Hz(Hz)", nullptr, false, true))), + CHshapejz(static_cast(jz3CurveEditorG->addCurve(CT_Flat, "Cz(Hz)", nullptr, false, true))), + LHshapejz(static_cast(jz2CurveEditorG->addCurve(CT_Flat, "Jz(Hz)", nullptr, false, true))), + softjzcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_JZSOFTCIE"), 0., 100., 0.1, 0.))), + thrhjzcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_JZTHRHCIE"), 40., 150., 0.5, 60.))), + chjzcie(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_JZCH")))), + strsoftjzcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_JZSTRSOFTCIE"), 0, 100., 0.5, 100.))), + +/* + ciezFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_ZCAMFRA")))), + + lightlzcam(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LOGLIGHTL"), -100., 100., 0.5, 0.))), + lightqzcam(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LOGLIGHTQ"), -100., 100., 0.05, 0.))), + contlzcam(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LOGCONTL"), -100., 100., 0.5, 0.))), + contqzcam(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LOGCONQL"), -100., 100., 0.5, 0.))), + contthreszcam(Gtk::manage(new Adjuster(M("TP_LOCALLAB_ZCAMTHRES"), 0., 1., 0.01, 0.))), + colorflzcam(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LOGCOLORFL"), -100., 100., 0.5, 0.))), + saturzcam(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SATURV"), -100., 100., 0.5, 0.))), + chromzcam(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CHROML"), -100., 100., 0.5, 0.))), +*/ + expLcie(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_CIETOOLEXP")))), + cie2Frame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LOG2FRA")))), + targetGraycie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_TARGET_GRAY"), 5.0, 80.0, 0.1, 18.0))), + targabscie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SOURCE_ABS"), 0.01, 16384.0, 0.01, 16.0))), + detailcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_DETAIL"), 0., 100., 0.1, 0.))), + catadcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CATAD"), -100., 100., 0.5, 0., Gtk::manage(new RTImage("circle-blue-small.png")), Gtk::manage(new RTImage("circle-orange-small.png"))))), + surroundcie(Gtk::manage (new MyComboBoxText ())), + surrHBoxcie(Gtk::manage(new Gtk::Box())), + exprecovcie(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_DENOI2_EXP")))), + maskusablecie(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUSABLE")))), + maskunusablecie(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUNUSABLE")))), + recothrescie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKRECOTHRES"), 0., 2., 0.01, 1.))), + lowthrescie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHRLOW"), 1., 80., 0.5, 12.))), + higthrescie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHR"), 20., 99., 0.5, 85.))), + decaycie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKDDECAY"), 0.5, 4., 0.1, 2.))), + expmaskcie(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_SHOWS")))), + showmaskcieMethod(Gtk::manage(new MyComboBoxText())), + enacieMask(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_ENABLE_MASK")))), +// maskSHCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK"))), + maskcieCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, "", 1)), + CCmaskcieshape(static_cast(maskcieCurveEditorG->addCurve(CT_Flat, "C", nullptr, false, false))), + LLmaskcieshape(static_cast(maskcieCurveEditorG->addCurve(CT_Flat, "L", nullptr, false, false))), + HHmaskcieshape(static_cast(maskcieCurveEditorG->addCurve(CT_Flat, "LC(h)", nullptr, false, true))), + blendmaskcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLENDMASKCOL"), -100, 100, 1, 0))), + radmaskcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_RADMASKCOL"), 0.0, 100.0, 0.1, 0.))), + lapmaskcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LAPMASKCOL"), 0.0, 100.0, 0.1, 0.))), + chromaskcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CHROMASKCOL"), -100.0, 100.0, 0.1, 0.))), + gammaskcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GAMMASKCOL"), 0.25, 4.0, 0.01, 1.))), + slomaskcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SLOMASKCOL"), 0.0, 15.0, 0.1, 0.))), + mask2cieCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK2"))), + Lmaskcieshape(static_cast(mask2cieCurveEditorG->addCurve(CT_Diagonal, "L(L)"))) + + + { + set_orientation(Gtk::ORIENTATION_VERTICAL); + + // Parameter Ciecam specific widgets + const LocallabParams::LocallabSpot defSpot; + reparcie->setAdjusterListener(this); + sensicie->setAdjusterListener(this); + + + pack_start(*sensicie); + pack_start(*reparcie); + modeHBoxcam->set_spacing (2); + //modeHBoxcam->set_tooltip_markup (M ("TP_LOCALLAB_CAMMODE_TOOLTIP")); + Gtk::Label* modeLabelcam = Gtk::manage (new Gtk::Label (M ("TP_LOCALLAB_CAMMODE") + ":")); + modeHBoxcam->pack_start (*modeLabelcam, Gtk::PACK_SHRINK); + modecam->append (M ("TP_LOCALLAB_CAMMODE_CAM16")); + modecam->append (M ("TP_LOCALLAB_CAMMODE_JZ")); + // modecam->append (M ("TP_LOCALLAB_CAMMODE_ALL")); +// modecam->append (M ("TP_LOCALLAB_CAMMODE_ZCAM")); + modecam->set_active (0); + modeHBoxcam->pack_start (*modecam); + modecamconn = modecam->signal_changed().connect ( sigc::mem_fun (*this, &Locallabcie::modecamChanged) ); + pack_start(*modeHBoxcam); + + modeHBoxcie->set_spacing (2); + modeHBoxcie->set_tooltip_markup (M ("TP_LOCALLAB_CIEMODE_TOOLTIP")); + Gtk::Label* modeLabel = Gtk::manage (new Gtk::Label (M ("TP_LOCALLAB_CIEMODE") + ":")); + modeHBoxcie->pack_start (*modeLabel, Gtk::PACK_SHRINK); + modecie->append (M ("TP_LOCALLAB_CIEMODE_COM")); + modecie->append (M ("TP_LOCALLAB_CIEMODE_TM")); + modecie->append (M ("TP_LOCALLAB_CIEMODE_WAV")); + modecie->append (M ("TP_LOCALLAB_CIEMODE_DR")); + modecie->append (M ("TP_LOCALLAB_CIEMODE_LOG")); + modecie->set_active (0); + modeHBoxcie->pack_start (*modecie); + modecieconn = modecie->signal_changed().connect ( sigc::mem_fun (*this, &Locallabcie::modecieChanged) ); + pack_start(*modeHBoxcie); + + surHBoxcie->set_spacing (2); + surHBoxcie->set_tooltip_markup (M ("TP_LOCALLAB_LOGSURSOUR_TOOLTIP")); + Gtk::Label* surLabel = Gtk::manage (new Gtk::Label (M ("TP_COLORAPP_SURROUND") + ":")); + surHBoxcie->pack_start (*surLabel, Gtk::PACK_SHRINK); + sursourcie->append (M ("TP_COLORAPP_SURROUND_AVER")); + sursourcie->append (M ("TP_COLORAPP_SURROUND_DIM")); + sursourcie->append (M ("TP_COLORAPP_SURROUND_DARK")); + sursourcie->set_active (0); + surHBoxcie->pack_start (*sursourcie); + sursourcieconn = sursourcie->signal_changed().connect ( sigc::mem_fun (*this, &Locallabcie::sursourcieChanged) ); + + cieFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const cieFBox = Gtk::manage(new ToolParamBlock()); + cieFBox->pack_start(*Autograycie); + cieFBox->pack_start(*sourceGraycie); + cieFBox->pack_start(*sourceabscie); + cieFBox->pack_start(*pqremapcam16); + PQFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const PQFBox = Gtk::manage(new ToolParamBlock()); + PQFBox->pack_start(*adapjzcie); + PQFBox->pack_start(*jz100); + PQFBox->pack_start(*pqremap); +// PQFBox->pack_start(*forcejz); +// PQFBox->pack_start(*contthreszcam); + PQFrame->add(*PQFBox); + cieFBox->pack_start (*PQFrame); + logjzFrame->set_label_align(0.025, 0.5); + logjzFrame->set_label_widget(*logjz); + // Gtk::Separator* const separatorjz = Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); + ToolParamBlock* const logjzBox = Gtk::manage(new ToolParamBlock()); + //logjzBox->pack_start(*blackEvjz); + // logjzBox->pack_start(*whiteEvjz); + // logjzBox->pack_start(*separatorjz); + logjzBox->pack_start(*targetjz); + logjzFrame->add(*logjzBox); + cieFBox->pack_start (*logjzFrame); + bevwevFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const bevwevBox = Gtk::manage(new ToolParamBlock()); + bevwevBox->pack_start(*blackEvjz); + bevwevBox->pack_start(*whiteEvjz); + bevwevFrame->add(*bevwevBox); + cieFBox->pack_start (*bevwevFrame); + + sigmoidjzFrame->set_label_align(0.025, 0.5); + sigmoidjzFrame->set_label_widget(*sigjz); + ToolParamBlock* const sigjzBox = Gtk::manage(new ToolParamBlock()); + sigjzBox->pack_start(*sigmoidldajzcie); + sigjzBox->pack_start(*sigmoidthjzcie); + sigjzBox->pack_start(*sigmoidbljzcie); + sigjzBox->pack_start(*forcebw); + sigmoidjzFrame->add(*sigjzBox); + + // jzBox->pack_start(*sigmoidjzFrame); + cieFBox->pack_start(*sigmoidjzFrame); + + cieFBox->pack_start (*surHBoxcie); + cieFrame->add(*cieFBox); + pack_start(*cieFrame); + + ToolParamBlock* const jzallBox = Gtk::manage(new ToolParamBlock()); + Gtk::Box *TittleVBoxjz; + TittleVBoxjz = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + TittleVBoxjz->set_spacing(2); + Gtk::Box* const LCTitleHBoxjz = Gtk::manage(new Gtk::Box()); + Gtk::Label* const LCLabeljz = Gtk::manage(new Gtk::Label()); + LCLabeljz->set_markup(Glib::ustring("") + (M("TP_LOCALLAB_JZFRA")) + Glib::ustring("")); + LCTitleHBoxjz->pack_start(*LCLabeljz, Gtk::PACK_SHRINK); + TittleVBoxjz->pack_start(*LCTitleHBoxjz, Gtk::PACK_SHRINK); + expjz->setLabel(TittleVBoxjz); + + setExpandAlignProperties(expjz, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + float R, G, B; + std::vector six_shape; + for (int i = 0; i < 6; i++) { + const float x = static_cast(i) * (1.f / 6.f); + Color::hsv2rgb01(x, 0.5f, 0.5f, R, G, B); + six_shape.emplace_back(x, R, G, B); + } + std::vector milestone; + milestone.push_back ( GradientMilestone (0., 0., 0., 0.) ); + milestone.push_back ( GradientMilestone (1., 1., 1., 1.) ); + + jz1CurveEditorG->setCurveListener(this); + shapejz->setResetCurve(DiagonalCurveType(defSpot.jzcurve.at(0)), defSpot.jzcurve); + shapejz->setBottomBarBgGradient (milestone); + shapejz->setLeftBarBgGradient (milestone); + + shapecz->setResetCurve(DiagonalCurveType(defSpot.czcurve.at(0)), defSpot.czcurve); + + std::vector shapeczMilestones; +// float R, G, B; + shapecz->setBottomBarColorProvider (this, 1); + shapecz->setLeftBarColorProvider (this, 1); + shapecz->setRangeDefaultMilestones (0.05, 0.2, 0.58); + + for (int i = 0; i < 7; i++) { + float x = float (i) * (1.0f / 6.f); + Color::hsv2rgb01 (x, 0.5f, 0.5f, R, G, B); + shapeczMilestones.push_back ( GradientMilestone (double (x), double (R), double (G), double (B)) ); + } + + shapecz->setBottomBarBgGradient (shapeczMilestones); + shapecz->setLeftBarBgGradient (shapeczMilestones); + shapecz->setRangeDefaultMilestones (0.05, 0.2, 0.58); + + shapeczjz->setLeftBarColorProvider (this, 1); + shapeczjz->setRangeDefaultMilestones (0.05, 0.2, 0.58); + shapeczjz->setResetCurve(DiagonalCurveType(defSpot.czjzcurve.at(0)), defSpot.czjzcurve); + shapeczjz->setBottomBarBgGradient (milestone); + shapeczjz->setLeftBarBgGradient (shapeczMilestones); + shapeczjz->setRangeDefaultMilestones (0.05, 0.2, 0.58); + + + jz1CurveEditorG->curveListComplete(); +/* + jz2CurveEditorG->setCurveListener(this); + shapeczjz->setLeftBarColorProvider (this, 1); + shapeczjz->setRangeDefaultMilestones (0.05, 0.2, 0.58); + shapeczjz->setResetCurve(DiagonalCurveType(defSpot.czjzcurve.at(0)), defSpot.czjzcurve); + shapeczjz->setBottomBarBgGradient (milestone); + shapeczjz->setLeftBarBgGradient (shapeczMilestones); + shapeczjz->setRangeDefaultMilestones (0.05, 0.2, 0.58); + jz2CurveEditorG->curveListComplete(); +*/ + jz2CurveEditorG->setCurveListener(this); + LHshapejz->setIdentityValue(0.); + LHshapejz->setResetCurve(FlatCurveType(defSpot.LHcurvejz.at(0)), defSpot.LHcurvejz); + LHshapejz->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP")); + LHshapejz->setCurveColorProvider(this, 3); + LHshapejz->setBottomBarBgGradient(six_shape); + jz2CurveEditorG->curveListComplete(); + + jz3CurveEditorG->setCurveListener(this); + + CHshapejz->setIdentityValue(0.); + CHshapejz->setResetCurve(FlatCurveType(defSpot.CHcurvejz.at(0)), defSpot.CHcurvejz); + CHshapejz->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP")); + CHshapejz->setCurveColorProvider(this, 3); + CHshapejz->setBottomBarBgGradient(six_shape); + + HHshapejz->setIdentityValue(0.); + HHshapejz->setResetCurve(FlatCurveType(defSpot.HHcurvejz.at(0)), defSpot.HHcurvejz); + HHshapejz->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP")); + HHshapejz->setCurveColorProvider(this, 3); + HHshapejz->setBottomBarBgGradient(six_shape); + + + jz3CurveEditorG->curveListComplete(); + + jzFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const jzBox = Gtk::manage(new ToolParamBlock()); + jzBox->pack_start(*qtoj); + czlightFrame->set_label_align(0.025, 0.5); + czcolorFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const ciePzlightBox = Gtk::manage(new ToolParamBlock()); + ciePzlightBox->pack_start(*lightjzcie); + ciePzlightBox->pack_start(*contjzcie); + czlightFrame->add(*ciePzlightBox); + jzBox->pack_start(*czlightFrame); + + ToolParamBlock* const ciePzcolorBox = Gtk::manage(new ToolParamBlock()); + ciePzcolorBox->pack_start(*chromjzcie); + ciePzcolorBox->pack_start(*saturjzcie); + ciePzcolorBox->pack_start(*huejzcie); + czcolorFrame->add(*ciePzcolorBox); + jzBox->pack_start(*czcolorFrame); + + jzBox->pack_start(*jz1CurveEditorG, Gtk::PACK_SHRINK, 4); + HFramejz->set_label_align(0.025, 0.5); + ToolParamBlock* const jzHHBox = Gtk::manage(new ToolParamBlock()); + JzHFramejz->set_label_align(0.025, 0.5); + ToolParamBlock* const jzHBox = Gtk::manage(new ToolParamBlock()); + + jzHBox->pack_start(*jz2CurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + jzHBox->pack_start(*thrhjzcie); + JzHFramejz->add(*jzHBox); + jzHHBox->pack_start(*JzHFramejz); + + jzHHBox->pack_start(*jz3CurveEditorG, Gtk::PACK_SHRINK, 4); // jzBox->pack_start(*adapjzcie); + jzHHBox->pack_start(*softjzcie); + HFramejz->add(*jzHHBox); + jzBox->pack_start(*HFramejz); + /* + sigmoidjzFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const sigjzBox = Gtk::manage(new ToolParamBlock()); + sigjzBox->pack_start(*sigmoidldajzcie); + sigjzBox->pack_start(*sigmoidthjzcie); + sigjzBox->pack_start(*sigmoidbljzcie); + sigjzBox->pack_start(*jabcie); + sigmoidjzFrame->add(*sigjzBox); + + // jzBox->pack_start(*sigmoidjzFrame); + */ + jzshFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const jzshBox = Gtk::manage(new ToolParamBlock()); + jzshBox->pack_start(*hljzcie); + jzshBox->pack_start(*hlthjzcie); + jzshBox->pack_start(*shjzcie); + jzshBox->pack_start(*shthjzcie); + jzshBox->pack_start(*radjzcie); + jzshFrame->add(*jzshBox); + jzBox->pack_start(*jzshFrame); + + setExpandAlignProperties(expwavjz, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + contFramejz->set_label_align(0.025, 0.5); + + sigmalcjz->setAdjusterListener(this); + + LocalcurveEditorwavjz->setCurveListener(this); + wavshapejz->setIdentityValue(0.); + wavshapejz->setResetCurve(FlatCurveType(defSpot.locwavcurvejz.at(0)), defSpot.locwavcurvejz); + LocalcurveEditorwavjz->curveListComplete(); + csThresholdjz->setAdjusterListener(this); + + ToolParamBlock* const coBox2jz = Gtk::manage(new ToolParamBlock()); + coBox2jz->pack_start(*csThresholdjz); + ToolParamBlock* const coBoxjz = Gtk::manage(new ToolParamBlock()); + coBoxjz->pack_start(*sigmalcjz); + coBoxjz->pack_start(*LocalcurveEditorwavjz, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + contFramejz->add(*coBoxjz); + coBox2jz->pack_start(*contFramejz); + + clarilresjz->setAdjusterListener(this); + claricresjz->setAdjusterListener(this); + clarisoftjz->setAdjusterListener(this); + + clariFramejz->set_label_align(0.025, 0.5); + ToolParamBlock* const coBox3jz = Gtk::manage(new ToolParamBlock()); + coBox3jz->pack_start(*clarilresjz); + coBox3jz->pack_start(*claricresjz); + coBox3jz->pack_start(*clarisoftjz); + clariFramejz->add(*coBox3jz); + coBox2jz->pack_start(*clariFramejz); + expwavjz->add(*coBox2jz, false); + + jzBox->pack_start(*expwavjz, false, false); + + jzallBox->add(*jzBox); + + expjz->add(*jzallBox, false); + + jabcieConn = jabcie->signal_toggled().connect(sigc::mem_fun(*this, &Locallabcie::jabcieChanged)); + AutograycieConn = Autograycie->signal_toggled().connect(sigc::mem_fun(*this, &Locallabcie::AutograycieChanged)); + sigmoidqjcieconn = sigmoidqjcie->signal_toggled().connect(sigc::mem_fun(*this, &Locallabcie::sigmoidqjcieChanged)); + logjzconn = logjz->signal_toggled().connect(sigc::mem_fun(*this, &Locallabcie::logjzChanged)); + sigjzconn = sigjz->signal_toggled().connect(sigc::mem_fun(*this, &Locallabcie::sigjzChanged)); + forcejzConn = forcejz->signal_toggled().connect(sigc::mem_fun(*this, &Locallabcie::forcejzChanged)); + qtojConn = qtoj->signal_toggled().connect(sigc::mem_fun(*this, &Locallabcie::qtojChanged)); + chjzcieconn = chjzcie->signal_toggled().connect(sigc::mem_fun(*this, &Locallabcie::chjzcieChanged)); + forcebwConn = forcebw->signal_toggled().connect(sigc::mem_fun(*this, &Locallabcie::forcebwChanged)); + + sourceGraycie->setAdjusterListener(this); + sourceGraycie->setLogScale(10, 18, true); + + sourceabscie->setLogScale(500, 0); + + sourceabscie->setAdjusterListener(this); + setExpandAlignProperties(expLcie, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + saturlcie->setAdjusterListener(this); + + rstprotectcie->setAdjusterListener(this); + + chromlcie->setAdjusterListener(this); + huecie->setAdjusterListener(this); + + + cieCurveEditorG->setCurveListener(this); + toneMethodcie->append (M ("TP_COLORAPP_TCMODE_LIGHTNESS")); + toneMethodcie->append (M ("TP_COLORAPP_TCMODE_BRIGHTNESS")); + toneMethodcie->set_active (0); + toneMethodcieConn = toneMethodcie->signal_changed().connect(sigc::mem_fun(*this, &Locallabcie::toneMethodcieChanged)); + shapecie->setResetCurve(DiagonalCurveType(defSpot.ciecurve.at(0)), defSpot.ciecurve); + shapecie->setBottomBarBgGradient (milestone); + shapecie->setLeftBarBgGradient (milestone); + cieCurveEditorG->curveListComplete(); + + cieCurveEditorG2->setCurveListener(this); + toneMethodcie2->append (M ("TP_COLORAPP_TCMODE_CHROMA")); + toneMethodcie2->append (M ("TP_COLORAPP_TCMODE_SATUR")); + toneMethodcie2->append (M ("TP_COLORAPP_TCMODE_COLORF")); + toneMethodcie2->set_active (0); + toneMethodcieConn2 = toneMethodcie2->signal_changed().connect(sigc::mem_fun(*this, &Locallabcie::toneMethodcie2Changed)); + shapecie2->setResetCurve(DiagonalCurveType(defSpot.ciecurve2.at(0)), defSpot.ciecurve2); + shapecie2->setBottomBarColorProvider (this, 1); + shapecie2->setLeftBarColorProvider (this, 1); + shapecie2->setRangeDefaultMilestones (0.05, 0.2, 0.58); + + std::vector shape2Milestones; +// float R, G, B; + + for (int i = 0; i < 7; i++) { + float x = float (i) * (1.0f / 6.f); + Color::hsv2rgb01 (x, 0.5f, 0.5f, R, G, B); + shape2Milestones.push_back ( GradientMilestone (double (x), double (R), double (G), double (B)) ); + } + + shapecie2->setBottomBarBgGradient (shape2Milestones); + shapecie2->setLeftBarBgGradient (shape2Milestones); + + shapecie2->setRangeDefaultMilestones (0.05, 0.2, 0.58); + + cieCurveEditorG2->curveListComplete(); + + + chromjzcie->setAdjusterListener(this); + saturjzcie->setAdjusterListener(this); + huejzcie->setAdjusterListener(this); + softjzcie->setAdjusterListener(this); + thrhjzcie->setAdjusterListener(this); + strsoftjzcie->setAdjusterListener(this); + + lightlcie->setAdjusterListener(this); + lightjzcie->setAdjusterListener(this); + + lightqcie->setAdjusterListener(this); + contlcie->setAdjusterListener(this); + contjzcie->setAdjusterListener(this); + adapjzcie->setAdjusterListener(this); + jz100->setAdjusterListener(this); + pqremap->setAdjusterListener(this); + pqremapcam16->setAdjusterListener(this); + hljzcie->setAdjusterListener(this); + hlthjzcie->setAdjusterListener(this); + shjzcie->setAdjusterListener(this); + shthjzcie->setAdjusterListener(this); + radjzcie->setAdjusterListener(this); + contthrescie->setAdjusterListener(this); + blackEvjz->setLogScale(2, -8); + blackEvjz->setAdjusterListener(this); + whiteEvjz->setLogScale(16, 0); + whiteEvjz->setAdjusterListener(this); + targetjz->setAdjusterListener(this); + targetjz->setLogScale(10, 18, true); + sigmoidldacie->setAdjusterListener(this); + sigmoidthcie->setAdjusterListener(this); + sigmoidblcie->setAdjusterListener(this); + sigmoidldajzcie->setAdjusterListener(this); + sigmoidthjzcie->setAdjusterListener(this); + sigmoidbljzcie->setAdjusterListener(this); + + contqcie->setAdjusterListener(this); + colorflcie->setAdjusterListener(this); +/* + lightlzcam->setAdjusterListener(this); + lightqzcam->setAdjusterListener(this); + contlzcam->setAdjusterListener(this); + contqzcam->setAdjusterListener(this); + contthreszcam->setAdjusterListener(this); + colorflzcam->setAdjusterListener(this); + saturzcam->setAdjusterListener(this); + chromzcam->setAdjusterListener(this); +*/ + targetGraycie->setAdjusterListener(this); + targetGraycie->setLogScale(10, 18, true); + targabscie->setLogScale(500, 0); + + targabscie->setAdjusterListener(this); + + detailcie->setAdjusterListener(this); + + catadcie->setAdjusterListener(this); + + Gtk::Box *TittleVBoxcam16; + TittleVBoxcam16 = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + TittleVBoxcam16->set_spacing(2); + Gtk::Box* const LCTitleHBoxcam16 = Gtk::manage(new Gtk::Box()); + Gtk::Label* const LCLabelcam16 = Gtk::manage(new Gtk::Label()); + LCLabelcam16->set_markup(Glib::ustring("") + (M("TP_LOCALLAB_CAM16_FRA")) + Glib::ustring("")); + LCTitleHBoxcam16->pack_start(*LCLabelcam16, Gtk::PACK_SHRINK); + TittleVBoxcam16->pack_start(*LCTitleHBoxcam16, Gtk::PACK_SHRINK); + expcam16->setLabel(TittleVBoxcam16); + + setExpandAlignProperties(expcam16, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + surrHBoxcie->set_spacing (2); + surrHBoxcie->set_tooltip_markup (M ("TP_COLORAPP_SURROUND_TOOLTIP")); + Gtk::Label* surrLabelcie = Gtk::manage (new Gtk::Label (M ("TP_COLORAPP_SURROUND") + ":")); + surrHBoxcie->pack_start (*surrLabelcie, Gtk::PACK_SHRINK); + surroundcie->append (M ("TP_COLORAPP_SURROUND_AVER")); + surroundcie->append (M ("TP_COLORAPP_SURROUND_DIM")); + surroundcie->append (M ("TP_COLORAPP_SURROUND_DARK")); +// surroundcie->append (M ("TP_COLORAPP_SURROUND_EXDARK")); + surroundcie->set_active (0); + surrHBoxcie->pack_start (*surroundcie); + surroundcieconn = surroundcie->signal_changed().connect ( sigc::mem_fun (*this, &Locallabcie::surroundcieChanged) ); + + cie1Frame->set_label_align(0.025, 0.5); + cie1lightFrame->set_label_align(0.025, 0.5); + cie1contFrame->set_label_align(0.025, 0.5); + cie1colorFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const cieP1Box = Gtk::manage(new ToolParamBlock()); + ToolParamBlock* const cieP1lightBox = Gtk::manage(new ToolParamBlock()); + cieP1lightBox->pack_start(*lightlcie); + cieP1lightBox->pack_start(*lightqcie); + cie1lightFrame->add(*cieP1lightBox); + cieP1Box->pack_start(*cie1lightFrame); + ToolParamBlock* const cieP1contBox = Gtk::manage(new ToolParamBlock()); + cieP1contBox->pack_start(*detailcie); + cieP1contBox->pack_start(*contlcie); + cieP1contBox->pack_start(*contqcie); + cieP1contBox->pack_start(*contthrescie); + cie1contFrame->add(*cieP1contBox); + cieP1Box->pack_start(*cie1contFrame); + ToolParamBlock* const cieP1colorBox = Gtk::manage(new ToolParamBlock()); + cieP1colorBox->pack_start(*chromlcie); + cieP1colorBox->pack_start(*saturlcie); + cieP1colorBox->pack_start(*colorflcie); + cieP1colorBox->pack_start(*huecie); + cieP1colorBox->pack_start(*rstprotectcie); + cie1colorFrame->add(*cieP1colorBox); + cieP1Box->pack_start(*cie1colorFrame); + // pack_start(*blackEvjz); + // pack_start(*whiteEvjz); + + sigmoidFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const sigBox = Gtk::manage(new ToolParamBlock()); + + sigBox->pack_start(*sigmoidldacie); + sigBox->pack_start(*sigmoidthcie); + sigBox->pack_start(*sigmoidblcie); + sigBox->pack_start(*sigmoidqjcie); + sigmoidFrame->add(*sigBox); + cieP1Box->pack_start(*sigmoidFrame); + ToolParamBlock* const cieP11Box = Gtk::manage(new ToolParamBlock()); + cieP11Box->pack_start(*cieCurveEditorG); + cieP11Box->pack_start(*cieCurveEditorG2); + expLcie->add(*cieP11Box, false); + cieP1Box->pack_start(*expLcie, false, false); + // cie1Frame->add(*cieP1Box); + // expcam16->pack_start(*cie1Frame); + expcam16->add(*cieP1Box, false); + + pack_start(*expcam16, false, false); + + pack_start(*expjz, false, false); +/* + ciezFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const ciePzBox = Gtk::manage(new ToolParamBlock()); + ciePzBox->pack_start(*lightlzcam); + ciePzBox->pack_start(*lightqzcam); + ciePzBox->pack_start(*contlzcam); + ciePzBox->pack_start(*contqzcam); +// ciePzBox->pack_start(*contthreszcam); + ciePzBox->pack_start(*colorflzcam); + ciePzBox->pack_start(*saturzcam); + ciePzBox->pack_start(*chromzcam); + ciezFrame->add(*ciePzBox); + pack_start(*ciezFrame); +*/ + + cie2Frame->set_label_align(0.025, 0.5); + ToolParamBlock* const cieP2Box = Gtk::manage(new ToolParamBlock()); + cieP2Box->pack_start(*targetGraycie); + cieP2Box->pack_start(*targabscie); + cieP2Box->pack_start(*catadcie); + cieP2Box->pack_start(*surrHBoxcie); +// cieP2Box->pack_start(*detailcie); +// cieP2Box->pack_start(*jabcie); + + cie2Frame->add(*cieP2Box); + pack_start(*cie2Frame); + + recothrescie->setAdjusterListener(this); + lowthrescie->setAdjusterListener(this); + higthrescie->setAdjusterListener(this); + decaycie->setAdjusterListener(this); + setExpandAlignProperties(exprecovcie, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + + setExpandAlignProperties(expmaskcie, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + showmaskcieMethod->append(M("TP_LOCALLAB_SHOWMNONE")); + showmaskcieMethod->append(M("TP_LOCALLAB_SHOWMODIF")); + showmaskcieMethod->append(M("TP_LOCALLAB_SHOWMODIFMASK")); + showmaskcieMethod->append(M("TP_LOCALLAB_SHOWMASK")); + showmaskcieMethod->append(M("TP_LOCALLAB_SHOWREF")); + showmaskcieMethod->set_active(0); + showmaskcieMethod->set_tooltip_markup(M("TP_LOCALLAB_SHOWMASKCOL_TOOLTIP")); + showmaskcieMethodConn = showmaskcieMethod->signal_changed().connect(sigc::mem_fun(*this, &Locallabcie::showmaskcieMethodChanged)); + + enacieMaskConn = enacieMask->signal_toggled().connect(sigc::mem_fun(*this, &Locallabcie::enacieMaskChanged)); + + maskcieCurveEditorG->setCurveListener(this); + CCmaskcieshape->setIdentityValue(0.); + CCmaskcieshape->setResetCurve(FlatCurveType(defSpot.CCmaskciecurve.at(0)), defSpot.CCmaskciecurve); + CCmaskcieshape->setBottomBarColorProvider(this, 1); + + LLmaskcieshape->setIdentityValue(0.); + LLmaskcieshape->setResetCurve(FlatCurveType(defSpot.LLmaskciecurve.at(0)), defSpot.LLmaskciecurve); + LLmaskcieshape->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + + HHmaskcieshape->setIdentityValue(0.); + HHmaskcieshape->setResetCurve(FlatCurveType(defSpot.HHmaskciecurve.at(0)), defSpot.HHmaskciecurve); + HHmaskcieshape->setCurveColorProvider(this, 2); + HHmaskcieshape->setBottomBarColorProvider(this, 2); + + maskcieCurveEditorG->curveListComplete(); + blendmaskcie->setAdjusterListener(this); + + radmaskcie->setAdjusterListener(this); + lapmaskcie->setAdjusterListener(this); + gammaskcie->setAdjusterListener(this); + slomaskcie->setAdjusterListener(this); + + chromaskcie->setAdjusterListener(this); + mask2cieCurveEditorG->setCurveListener(this); + + Lmaskcieshape->setResetCurve(DiagonalCurveType(defSpot.Lmaskciecurve.at(0)), defSpot.Lmaskciecurve); + Lmaskcieshape->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + Lmaskcieshape->setLeftBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + + mask2cieCurveEditorG->curveListComplete(); + + ToolParamBlock* const cieBox3 = Gtk::manage(new ToolParamBlock()); + cieBox3->pack_start(*maskusablecie, Gtk::PACK_SHRINK, 0); + cieBox3->pack_start(*maskunusablecie, Gtk::PACK_SHRINK, 0); + cieBox3->pack_start(*recothrescie); + cieBox3->pack_start(*lowthrescie); + cieBox3->pack_start(*higthrescie); + cieBox3->pack_start(*decaycie); + exprecovcie->add(*cieBox3, false); + pack_start(*exprecovcie, false, false); + + ToolParamBlock* const maskcieBox = Gtk::manage(new ToolParamBlock()); + maskcieBox->pack_start(*showmaskcieMethod, Gtk::PACK_SHRINK, 4); + maskcieBox->pack_start(*enacieMask, Gtk::PACK_SHRINK, 0); + maskcieBox->pack_start(*maskcieCurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + maskcieBox->pack_start(*blendmaskcie, Gtk::PACK_SHRINK, 0); + maskcieBox->pack_start(*radmaskcie, Gtk::PACK_SHRINK, 0); + maskcieBox->pack_start(*lapmaskcie, Gtk::PACK_SHRINK, 0); + maskcieBox->pack_start(*chromaskcie, Gtk::PACK_SHRINK, 0); + maskcieBox->pack_start(*gammaskcie, Gtk::PACK_SHRINK, 0); + maskcieBox->pack_start(*slomaskcie, Gtk::PACK_SHRINK, 0); + maskcieBox->pack_start(*mask2cieCurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + expmaskcie->add(*maskcieBox, false); + pack_start(*expmaskcie, false, false); + + + + } +Locallabcie::~Locallabcie() +{ + delete jz1CurveEditorG; + delete jz2CurveEditorG; + delete jz3CurveEditorG; + delete cieCurveEditorG; + delete cieCurveEditorG2; + delete maskcieCurveEditorG; + delete mask2cieCurveEditorG; + delete LocalcurveEditorwavjz; + +} + +bool Locallabcie::isMaskViewActive() +{ + return ((showmaskcieMethod->get_active_row_number() != 0)); +} + +void Locallabcie::resetMaskView() +{ + showmaskcieMethodConn.block(true); + + showmaskcieMethod->set_active(0); + + showmaskcieMethodConn.block(false); +} + +void Locallabcie::getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) +{ + cieMask = showmaskcieMethod->get_active_row_number(); +} + +void Locallabcie::setDefaultExpanderVisibility() +{ + expLcie->set_expanded(false); + expjz->set_expanded(false); + expwavjz->set_expanded(false); + expcam16->set_expanded(false); + expmaskcie->set_expanded(false); + exprecovcie->set_expanded(false); +} +void Locallabcie::updateAdviceTooltips(const bool showTooltips) +{ + if (showTooltips) { + recothrescie->set_tooltip_text(M("TP_LOCALLAB_RECOTHRES02_TOOLTIP")); + reparcie->set_tooltip_text(M("TP_LOCALLAB_LOGREPART_TOOLTIP")); + cieFrame->set_tooltip_text(M("TP_LOCALLAB_LOGSCENE_TOOLTIP")); + PQFrame->set_tooltip_text(M("TP_LOCALLAB_JZPQFRA_TOOLTIP")); + qtoj->set_tooltip_text(M("TP_LOCALLAB_JZQTOJ_TOOLTIP")); + modecam->set_tooltip_text(M("TP_LOCALLAB_JZMODECAM_TOOLTIP")); + adapjzcie->set_tooltip_text(M("TP_LOCALLAB_JABADAP_TOOLTIP")); + jz100->set_tooltip_text(M("TP_LOCALLAB_JZ100_TOOLTIP")); + pqremap->set_tooltip_text(M("TP_LOCALLAB_JZPQREMAP_TOOLTIP")); + pqremapcam16->set_tooltip_text(M("TP_LOCALLAB_CAM16PQREMAP_TOOLTIP")); + Autograycie->set_tooltip_text(M("TP_LOCALLAB_AUTOGRAYCIE_TOOLTIP")); + sigmalcjz->set_tooltip_text(M("TP_LOCALLAB_WAT_SIGMALC_TOOLTIP")); + logjzFrame->set_tooltip_text(M("TP_LOCALLAB_JZLOGWB_TOOLTIP")); + blackEvjz->set_tooltip_text(M("TP_LOCALLAB_JZLOGWB_TOOLTIP")); + whiteEvjz->set_tooltip_text(M("TP_LOCALLAB_JZLOGWB_TOOLTIP")); + clariFramejz->set_tooltip_markup(M("TP_LOCALLAB_CLARIJZ_TOOLTIP")); + clarilresjz->set_tooltip_text(M("TP_LOCALLAB_WAT_CLARILJZ_TOOLTIP")); + claricresjz->set_tooltip_text(M("TP_LOCALLAB_WAT_CLARICJZ_TOOLTIP")); + clarisoftjz->set_tooltip_markup(M("TP_LOCALLAB_CLARISOFTJZ_TOOLTIP")); + wavshapejz->setTooltip(M("TP_LOCALLAB_WAT_WAVSHAPE_TOOLTIP")); + LocalcurveEditorwavjz->set_tooltip_markup(M("TP_LOCALLAB_WAT_LEVELLOCCONTRAST_TOOLTIP")); + csThresholdjz->set_tooltip_markup(M("TP_LOCALLAB_WAT_THRESHOLDWAV_TOOLTIP")); + forcejz->set_tooltip_text(M("TP_LOCALLAB_JZFORCE_TOOLTIP")); + sourceGraycie->set_tooltip_text(M("TP_LOCALLAB_JZLOGYBOUT_TOOLTIP")); + sourceabscie->set_tooltip_text(M("TP_COLORAPP_ADAPSCEN_TOOLTIP")); + cie1Frame->set_tooltip_text(M("TP_LOCALLAB_LOGIMAGE_TOOLTIP")); + sigmoidFrame->set_tooltip_text(M("TP_LOCALLAB_SIGMOID_TOOLTIP")); + contlcie->set_tooltip_text(M("TP_LOCALLAB_LOGCONTL_TOOLTIP")); + contqcie->set_tooltip_text(M("TP_LOCALLAB_LOGCONTQ_TOOLTIP")); + contthrescie->set_tooltip_text(M("TP_LOCALLAB_LOGCONTTHRES_TOOLTIP")); + colorflcie->set_tooltip_text(M("TP_LOCALLAB_LOGCOLORF_TOOLTIP")); + lightlcie->set_tooltip_text(M("TP_LOCALLAB_LOGLIGHTL_TOOLTIP")); + lightqcie->set_tooltip_text(M("TP_LOCALLAB_LOGLIGHTQ_TOOLTIP")); + saturlcie->set_tooltip_text(M("TP_LOCALLAB_LOGSATURL_TOOLTIP")); + rstprotectcie->set_tooltip_text(M("TP_LOCALLAB_RSTPROTECT_TOOLTIP")); + chromlcie->set_tooltip_text(M("TP_COLORAPP_CHROMA_TOOLTIP")); + targabscie->set_tooltip_text(M("TP_COLORAPP_VIEWING_ABSOLUTELUMINANCE_TOOLTIP")); + targetGraycie->set_tooltip_text(M("TP_COLORAPP_YBOUT_TOOLTIP")); + detailcie->set_tooltip_text(M("TP_LOCALLAB_LOGDETAIL_TOOLTIP")); + catadcie->set_tooltip_text(M("TP_LOCALLAB_LOGCATAD_TOOLTIP")); + cie2Frame->set_tooltip_text(M("TP_LOCALLAB_LOGVIEWING_TOOLTIP")); + sensicie->set_tooltip_text(M("TP_LOCALLAB_SENSI_TOOLTIP")); + CCmaskcieshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); + LLmaskcieshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); + HHmaskcieshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); + expmaskcie->set_tooltip_markup(M("TP_LOCALLAB_MASK_TOOLTIP")); + blendmaskcie->set_tooltip_text(M("TP_LOCALLAB_BLENDMASK_TOOLTIP")); + radmaskcie->set_tooltip_text(M("TP_LOCALLAB_LAPRAD_TOOLTIP")); + mask2cieCurveEditorG->set_tooltip_text(M("TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP")); + Lmaskcieshape->setTooltip(M("TP_LOCALLAB_LMASK_LL_TOOLTIP")); + exprecovcie->set_tooltip_markup(M("TP_LOCALLAB_MASKRESH_TOOLTIP")); + + + } else { + reparcie->set_tooltip_text(""); + recothrescie->set_tooltip_text(""); + cieFrame->set_tooltip_text(""); + PQFrame->set_tooltip_text(""); + modecam->set_tooltip_text(""); + qtoj->set_tooltip_text(""); + jabcie->set_tooltip_text(""); + adapjzcie->set_tooltip_text(""); + jz100->set_tooltip_text(""); + logjzFrame->set_tooltip_text(""); + blackEvjz->set_tooltip_text(""); + whiteEvjz->set_tooltip_text(""); + pqremap->set_tooltip_text(""); + pqremapcam16->set_tooltip_text(""); + Autograycie->set_tooltip_text(""); + forcejz->set_tooltip_text(""); + sourceGraycie->set_tooltip_text(""); + sourceabscie->set_tooltip_text(""); + cie1Frame->set_tooltip_text(""); + sigmoidFrame->set_tooltip_text(""); + contlcie->set_tooltip_text(""); + contqcie->set_tooltip_text(""); + contthrescie->set_tooltip_text(""); + colorflcie->set_tooltip_text(""); + lightlcie->set_tooltip_text(""); + lightqcie->set_tooltip_text(""); + saturlcie->set_tooltip_text(""); + rstprotectcie->set_tooltip_text(""); + chromlcie->set_tooltip_text(""); + targabscie->set_tooltip_text(""); + targetGraycie->set_tooltip_text(""); + detailcie->set_tooltip_text(""); + catadcie->set_tooltip_text(""); + cie2Frame->set_tooltip_text(""); + sensicie->set_tooltip_text(""); + CCmaskcieshape->setTooltip(""); + LLmaskcieshape->setTooltip(""); + HHmaskcieshape->setTooltip(""); + expmaskcie->set_tooltip_markup(""); + blendmaskcie->set_tooltip_text(""); + radmaskcie->set_tooltip_text(""); + mask2cieCurveEditorG->set_tooltip_text(""); + Lmaskcieshape->setTooltip(""); + exprecovcie->set_tooltip_markup(""); + sigmalcjz->set_tooltip_text(""); + clarilresjz->set_tooltip_text(""); + claricresjz->set_tooltip_text(""); + clarisoftjz->set_tooltip_markup(""); + clariFramejz->set_tooltip_markup(""); + wavshapejz->setTooltip(""); + LocalcurveEditorwavjz->set_tooltip_markup(""); + csThresholdjz->set_tooltip_markup(""); + + } +} +void Locallabcie::disableListener() +{ + LocallabTool::disableListener(); + AutograycieConn.block(true); + forcejzConn.block(true); + forcebwConn.block(true); + qtojConn.block(true); + jabcieConn.block(true); + sigmoidqjcieconn.block(true); + logjzconn.block(true); + sigjzconn.block(true); + chjzcieconn.block(true); + sursourcieconn.block (true); + surroundcieconn.block (true); + modecieconn.block (true); + modecamconn.block (true); + toneMethodcieConn.block(true); + toneMethodcieConn2.block(true); + showmaskcieMethodConn.block(true); + enacieMaskConn.block(true); +} + +void Locallabcie::enableListener() +{ + LocallabTool::enableListener(); + AutograycieConn.block(false); + forcejzConn.block(false); + forcebwConn.block(false); + qtojConn.block(false); + jabcieConn.block(false); + sigmoidqjcieconn.block(false); + logjzconn.block(false); + sigjzconn.block(false); + chjzcieconn.block(false); + sursourcieconn.block (false); + surroundcieconn.block (false); + modecieconn.block (false); + modecamconn.block (false); + toneMethodcieConn.block(false); + toneMethodcieConn2.block(false); + showmaskcieMethodConn.block(false); + enacieMaskConn.block(false); +} + +void Locallabcie::showmaskcieMethodChanged() +{ + // If mask preview is activated, deactivate other Shadow highlight mask preview + + // If mask preview is activated, deactivate all other tool mask preview + if (locToolListener) { + locToolListener->resetOtherMaskView(this); + } + + if(exp->getEnabled()) { + if (listener) { + listener->panelChanged(EvlocallabshowmaskMethod, ""); + } + } +} + + + +void Locallabcie::enacieMaskChanged() +{ + if (enacieMask->get_active()) { + maskusablecie->show(); + maskunusablecie->hide(); + + } else { + maskusablecie->hide(); + maskunusablecie->show(); + } + + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (enacieMask->get_active()) { + listener->panelChanged(EvLocallabEnacieMask, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(EvLocallabEnacieMask, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void Locallabcie::read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited) +{ + disableListener(); + + // Update GUI to selected spot value + const int index = pp->locallab.selspot; + + if (index < (int)pp->locallab.spots.size()) { + const LocallabParams::LocallabSpot& spot = pp->locallab.spots.at(index); + + exp->set_visible(spot.visicie); + exp->setEnabled(spot.expcie); + complexity->set_active(spot.complexcie); + + reparcie->setValue(spot.reparcie); + sensicie->setValue(spot.sensicie); + + if (spot.modecam == "cam16") { + modecam->set_active (0); + } else if (spot.modecam == "jz") { + modecam->set_active (1); +// } else if (spot.modecam == "all") { +// modecam->set_active (2); +// } else if (spot.modecam == "zcam") { +// modecam->set_active (3); + } + + if (spot.modecie == "com") { + modecie->set_active (0); + } else if (spot.modecie == "tm") { + modecie->set_active (1); + } else if (spot.modecie == "wav") { + modecie->set_active (2); + } else if (spot.modecie == "dr") { + modecie->set_active (3); + } else if (spot.modecie == "log") { + modecie->set_active (4); + } + + if (spot.toneMethodcie == "one") { + toneMethodcie->set_active(0); + } else if (spot.toneMethodcie == "two") { + toneMethodcie->set_active(1); + } + + if (spot.toneMethodcie2 == "onec") { + toneMethodcie2->set_active(0); + } else if (spot.toneMethodcie2 == "twoc") { + toneMethodcie2->set_active(1); + } else if (spot.toneMethodcie2 == "thrc") { + toneMethodcie2->set_active(2); + } + + Autograycie->set_active(spot.Autograycie); + forcejz->set_active(spot.forcejz); + forcebw->set_active(spot.forcebw); + qtoj->set_active(spot.qtoj); + sourceGraycie->setValue(spot.sourceGraycie); + sigmoidqjcie->set_active(spot.sigmoidqjcie); + logjz->set_active(spot.logjz); + sigjz->set_active(spot.sigjz); + // chjzcie->set_active(spot.chjzcie); + chjzcie->set_active(true);//force to true to avoid other mode + sourceabscie->setValue(spot.sourceabscie); + jabcie->set_active(spot.jabcie); + jabcieChanged(); + modecamChanged(); + if (spot.sursourcie == "Average") { + sursourcie->set_active (0); + } else if (spot.sursourcie == "Dim") { + sursourcie->set_active (1); + } else if (spot.sursourcie == "Dark") { + sursourcie->set_active (2); + } + + if (spot.surroundcie == "Average") { + surroundcie->set_active (0); + } else if (spot.surroundcie == "Dim") { + surroundcie->set_active (1); + } else if (spot.surroundcie == "Dark") { + surroundcie->set_active (2); +// } else if (spot.surroundcie == "ExtremelyDark") { +// surroundcie->set_active (3); + } + shapecie->setCurve(spot.ciecurve); + shapecie2->setCurve(spot.ciecurve2); + + shapejz->setCurve(spot.jzcurve); + shapecz->setCurve(spot.czcurve); + shapeczjz->setCurve(spot.czjzcurve); + HHshapejz->setCurve(spot.HHcurvejz); + CHshapejz->setCurve(spot.CHcurvejz); + LHshapejz->setCurve(spot.LHcurvejz); + + saturlcie->setValue(spot.saturlcie); + rstprotectcie->setValue(spot.rstprotectcie); + chromlcie->setValue(spot.chromlcie); + huecie->setValue(spot.huecie); + chromjzcie->setValue(spot.chromjzcie); + saturjzcie->setValue(spot.saturjzcie); + huejzcie->setValue(spot.huejzcie); + softjzcie->setValue(spot.softjzcie); + strsoftjzcie->setValue(spot.strsoftjzcie); + thrhjzcie->setValue(spot.thrhjzcie); + lightlcie->setValue(spot.lightlcie); + lightjzcie->setValue(spot.lightjzcie); + lightqcie->setValue(spot.lightqcie); + contlcie->setValue(spot.contlcie); + contjzcie->setValue(spot.contjzcie); + adapjzcie->setValue(spot.adapjzcie); + jz100->setValue(spot.jz100); + pqremap->setValue(spot.pqremap); + pqremapcam16->setValue(spot.pqremapcam16); + hljzcie->setValue(spot.hljzcie); + hlthjzcie->setValue(spot.hlthjzcie); + shjzcie->setValue(spot.shjzcie); + shthjzcie->setValue(spot.shthjzcie); + radjzcie->setValue(spot.radjzcie); + sigmalcjz->setValue(spot.sigmalcjz); + wavshapejz->setCurve(spot.locwavcurvejz); + csThresholdjz->setValue(spot.csthresholdjz); + clarilresjz->setValue(spot.clarilresjz); + claricresjz->setValue(spot.claricresjz); + clarisoftjz->setValue(spot.clarisoftjz); + contthrescie->setValue(spot.contthrescie); + blackEvjz->setValue(spot.blackEvjz); + whiteEvjz->setValue(spot.whiteEvjz); + targetjz->setValue(spot.targetjz); + sigmoidldacie->setValue(spot.sigmoidldacie); + sigmoidthcie->setValue(spot.sigmoidthcie); + sigmoidblcie->setValue(spot.sigmoidblcie); + sigmoidldajzcie->setValue(spot.sigmoidldajzcie); + sigmoidthjzcie->setValue(spot.sigmoidthjzcie); + sigmoidbljzcie->setValue(spot.sigmoidbljzcie); + contqcie->setValue(spot.contqcie); + colorflcie->setValue(spot.colorflcie); + targabscie->setValue(spot.targabscie); + targetGraycie->setValue(spot.targetGraycie); + detailcie->setValue(spot.detailcie); + catadcie->setValue(spot.catadcie); +/* + lightlzcam->setValue(spot.lightlzcam); + lightqzcam->setValue(spot.lightqzcam); + contlzcam->setValue(spot.contlzcam); + contqzcam->setValue(spot.contqzcam); + contthreszcam->setValue(spot.contthreszcam); + colorflzcam->setValue(spot.colorflzcam); + saturzcam->setValue(spot.saturzcam); + chromzcam->setValue(spot.chromzcam); +*/ + enacieMask->set_active(spot.enacieMask); + CCmaskcieshape->setCurve(spot.CCmaskciecurve); + LLmaskcieshape->setCurve(spot.LLmaskciecurve); + HHmaskcieshape->setCurve(spot.HHmaskciecurve); + blendmaskcie->setValue((double)spot.blendmaskcie); + radmaskcie->setValue(spot.radmaskcie); + chromaskcie->setValue(spot.chromaskcie); + lapmaskcie->setValue(spot.lapmaskcie); + gammaskcie->setValue(spot.gammaskcie); + slomaskcie->setValue(spot.slomaskcie); + Lmaskcieshape->setCurve(spot.Lmaskciecurve); + recothrescie->setValue((double)spot.recothrescie); + lowthrescie->setValue((double)spot.lowthrescie); + higthrescie->setValue((double)spot.higthrescie); + decaycie->setValue((double)spot.decaycie); + + + } + enableListener(); + // Update GUI according to complexity mode + updateGUIToMode(static_cast(complexity->get_active_row_number())); + // Update Ciecam GUI + updatecieGUI(); +} + +void Locallabcie::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited) +{ + const int index = pp->locallab.selspot; + + if (index < (int)pp->locallab.spots.size()) { + LocallabParams::LocallabSpot& spot = pp->locallab.spots.at(index); + spot.expcie = exp->getEnabled(); + spot.visicie = exp->get_visible(); + spot.complexcie = complexity->get_active_row_number(); + + spot.reparcie = reparcie->getValue(); + spot.sensicie = sensicie->getIntValue(); + + if (modecam->get_active_row_number() == 0) { + spot.modecam = "cam16"; + } else if (modecam->get_active_row_number() == 1) { + spot.modecam = "jz"; +// } else if (modecam->get_active_row_number() == 2) { +// spot.modecam = "all"; +// } else if (modecam->get_active_row_number() == 3) { +// spot.modecam = "zcam"; + } + + if (modecie->get_active_row_number() == 0) { + spot.modecie = "com"; + } else if (modecie->get_active_row_number() == 1) { + spot.modecie = "tm"; + } else if (modecie->get_active_row_number() == 2) { + spot.modecie = "wav"; + } else if (modecie->get_active_row_number() == 3) { + spot.modecie = "dr"; + } else if (modecie->get_active_row_number() == 4) { + spot.modecie = "log"; + } + + if (toneMethodcie->get_active_row_number() == 0) { + spot.toneMethodcie = "one"; + } else if (toneMethodcie->get_active_row_number() == 1) { + spot.toneMethodcie = "two"; + } + + if (toneMethodcie2->get_active_row_number() == 0) { + spot.toneMethodcie2 = "onec"; + } else if (toneMethodcie2->get_active_row_number() == 1) { + spot.toneMethodcie2 = "twoc"; + } else if (toneMethodcie2->get_active_row_number() == 2) { + spot.toneMethodcie2 = "thrc"; + } + + spot.Autograycie = Autograycie->get_active(); + spot.forcejz = forcejz->get_active(); + spot.forcebw = forcebw->get_active(); + spot.qtoj = qtoj->get_active(); + spot.jabcie = jabcie->get_active(); + spot.sourceGraycie = sourceGraycie->getValue(); + spot.sourceabscie = sourceabscie->getValue(); + spot.sigmoidqjcie = sigmoidqjcie->get_active(); + spot.logjz = logjz->get_active(); + spot.sigjz = sigjz->get_active(); + spot.chjzcie = chjzcie->get_active(); + + if(sursourcie->get_active_row_number() == 0) { + spot.sursourcie = "Average"; + } else if (sursourcie->get_active_row_number() == 1) { + spot.sursourcie = "Dim"; + } else if (sursourcie->get_active_row_number() == 2) { + spot.sursourcie = "Dark"; + } + + if (surroundcie->get_active_row_number() == 0) { + spot.surroundcie = "Average"; + } else if (surroundcie->get_active_row_number() == 1) { + spot.surroundcie = "Dim"; + } else if (surroundcie->get_active_row_number() == 2) { + spot.surroundcie = "Dark"; +// } else if (surroundcie->get_active_row_number() == 3) { +// spot.surroundcie = "ExtremelyDark"; + } + spot.jzcurve = shapejz->getCurve(); + spot.czcurve = shapecz->getCurve(); + spot.czjzcurve = shapeczjz->getCurve(); + spot.HHcurvejz = HHshapejz->getCurve(); + spot.CHcurvejz = CHshapejz->getCurve(); + spot.LHcurvejz = LHshapejz->getCurve(); + spot.ciecurve = shapecie->getCurve(); + spot.ciecurve2 = shapecie2->getCurve(); + + spot.saturlcie = saturlcie->getValue(); + spot.rstprotectcie = rstprotectcie->getValue(); + spot.chromlcie = chromlcie->getValue(); + spot.huejzcie = huejzcie->getValue(); + spot.softjzcie = softjzcie->getValue(); + spot.strsoftjzcie = strsoftjzcie->getValue(); + spot.thrhjzcie = thrhjzcie->getValue(); + spot.chromjzcie = chromjzcie->getValue(); + spot.saturjzcie = saturjzcie->getValue(); + spot.huecie = huecie->getValue(); + spot.lightlcie = lightlcie->getValue(); + spot.lightjzcie = lightjzcie->getValue(); + spot.lightqcie = lightqcie->getValue(); + spot.contlcie = contlcie->getValue(); + spot.contjzcie = contjzcie->getValue(); + spot.adapjzcie = adapjzcie->getValue(); + spot.jz100 = jz100->getValue(); + spot.pqremap = pqremap->getValue(); + spot.pqremapcam16 = pqremapcam16->getValue(); + spot.hljzcie = hljzcie->getValue(); + spot.hlthjzcie = hlthjzcie->getValue(); + spot.shjzcie = shjzcie->getValue(); + spot.shthjzcie = shthjzcie->getValue(); + spot.radjzcie = radjzcie->getValue(); + spot.sigmalcjz = sigmalcjz->getValue(); + spot.locwavcurvejz = wavshapejz->getCurve(); + spot.csthresholdjz = csThresholdjz->getValue(); + spot.clarilresjz = clarilresjz->getValue(); + spot.claricresjz = claricresjz->getValue(); + spot.clarisoftjz = clarisoftjz->getValue(); + spot.contthrescie = contthrescie->getValue(); + spot.blackEvjz = blackEvjz->getValue(); + spot.whiteEvjz = whiteEvjz->getValue(); + spot.targetjz = targetjz->getValue(); + spot.sigmoidldacie = sigmoidldacie->getValue(); + spot.sigmoidthcie = sigmoidthcie->getValue(); + spot.sigmoidblcie = sigmoidblcie->getValue(); + spot.sigmoidldajzcie = sigmoidldajzcie->getValue(); + spot.sigmoidthjzcie = sigmoidthjzcie->getValue(); + spot.sigmoidbljzcie = sigmoidbljzcie->getValue(); + spot.contqcie = contqcie->getValue(); + spot.colorflcie = colorflcie->getValue(); + spot.targabscie = targabscie->getValue(); + spot.targetGraycie = targetGraycie->getValue(); + spot.catadcie = catadcie->getValue(); + spot.detailcie = detailcie->getValue(); +/* + spot.lightlzcam = lightlzcam->getValue(); + spot.lightqzcam = lightqzcam->getValue(); + spot.contlzcam = contlzcam->getValue(); + spot.contqzcam = contqzcam->getValue(); + spot.contthreszcam = contthreszcam->getValue(); + spot.colorflzcam = colorflzcam->getValue(); + spot.saturzcam = saturzcam->getValue(); + spot.chromzcam = chromzcam->getValue(); +*/ + spot.enacieMask = enacieMask->get_active(); + spot.LLmaskciecurve = LLmaskcieshape->getCurve(); + spot.CCmaskciecurve = CCmaskcieshape->getCurve(); + spot.HHmaskciecurve = HHmaskcieshape->getCurve(); + spot.blendmaskcie = blendmaskcie->getIntValue(); + spot.radmaskcie = radmaskcie->getValue(); + spot.chromaskcie = chromaskcie->getValue(); + spot.lapmaskcie = lapmaskcie->getValue(); + spot.gammaskcie = gammaskcie->getValue(); + spot.slomaskcie = slomaskcie->getValue(); + spot.Lmaskciecurve = Lmaskcieshape->getCurve(); + spot.recothrescie = recothrescie->getValue(); + spot.lowthrescie = lowthrescie->getValue(); + spot.higthrescie = higthrescie->getValue(); + spot.decaycie = decaycie->getValue(); + + } +} + +void Locallabcie::toneMethodcieChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + listener->panelChanged(EvLocallabtoneMethodcie, + toneMethodcie->get_active_text() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } +} + +void Locallabcie::toneMethodcie2Changed() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + listener->panelChanged(EvLocallabtoneMethodcie2, + toneMethodcie2->get_active_text() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } +} + + +void Locallabcie::updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) +{ + idle_register.add( + [this, normHuerjz, normHuer, normLumar, normChromar]() -> bool { + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected + + // Update mask background + HHshapejz->updateLocallabBackground(normHuerjz); + CHshapejz->updateLocallabBackground(normHuerjz); + LHshapejz->updateLocallabBackground(normHuerjz); + shapejz->updateLocallabBackground(normLumar); + shapecz->updateLocallabBackground(normChromar); + shapeczjz->updateLocallabBackground(normLumar); + shapecie->updateLocallabBackground(normLumar); + shapecie2->updateLocallabBackground(normChromar); + CCmaskcieshape->updateLocallabBackground(normChromar); + LLmaskcieshape->updateLocallabBackground(normLumar); + HHmaskcieshape->updateLocallabBackground(normHuer); + Lmaskcieshape->updateLocallabBackground(normLumar); + + return false; + } + ); +} + + +void Locallabcie::updateAutocompute(const float blackev, const float whiteev, const float sourceg, const float sourceab, const float targetg, const float jz1) +{ + + if (Autograycie->get_active()) { + idle_register.add( + [this, blackev, whiteev, sourceg, sourceab, targetg, jz1]() -> bool { + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected + + // Update adjuster values according to autocomputed ones + disableListener(); + blackEvjz->setValue(blackev); + whiteEvjz->setValue(whiteev); + sourceGraycie->setValue(sourceg); + sourceabscie->setValue(sourceab); + float sour = std::min((double) sourceab, 10000.) / 10000.f; + float pal = std::max(10. * (double) sqrt(sour), 1.5); + adapjzcie->setValue(pal);//max = 10 and min 1.5 + jz100->setValue(jz1); + enableListener(); + + return false; + } + ); + } +} + + + +void Locallabcie::AutograycieChanged() +{ + + if (Autograycie->get_active()) { + sourceGraycie->set_sensitive(false); + sourceabscie->set_sensitive(false); + adapjzcie->set_sensitive(false); + jz100->set_sensitive(false); + blackEvjz->set_sensitive(false); + whiteEvjz->set_sensitive(false); + } else { + sourceGraycie->set_sensitive(true); + sourceabscie->set_sensitive(true); + adapjzcie->set_sensitive(true); + jz100->set_sensitive(true); + blackEvjz->set_sensitive(true); + whiteEvjz->set_sensitive(true); + // adapjzcie->set_sensitive(false); + // jz100->set_sensitive(false); + } + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (Autograycie->get_active()) { + listener->panelChanged(EvlocallabAutograycie, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(EvlocallabAutograycie, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void Locallabcie::forcejzChanged() +{ + + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (forcejz->get_active()) { + listener->panelChanged(Evlocallabforcejz, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabforcejz, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void Locallabcie::forcebwChanged() +{ + + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (forcebw->get_active()) { + listener->panelChanged(Evlocallabforcebw, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabforcebw, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void Locallabcie::qtojChanged() +{ + + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (qtoj->get_active()) { + listener->panelChanged(Evlocallabqtoj, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabqtoj, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void Locallabcie::jabcieChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (jabcie->get_active()) { + listener->panelChanged(Evlocallabjabcie, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabjabcie, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void Locallabcie::sigmoidqjcieChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (sigmoidqjcie->get_active()) { + listener->panelChanged(Evlocallabsigmoidqjcie, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabsigmoidqjcie, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void Locallabcie::logjzChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (logjz->get_active()) { + listener->panelChanged(Evlocallablogjz, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallablogjz, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void Locallabcie::sigjzChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (sigjz->get_active()) { + listener->panelChanged(Evlocallabsigjz, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabsigjz, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void Locallabcie::chjzcieChanged() +{ + if (chjzcie->get_active()) { + thrhjzcie->set_sensitive(true); + } else { + thrhjzcie->set_sensitive(false); + } + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (chjzcie->get_active()) { + listener->panelChanged(Evlocallabchjzcie, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabchjzcie, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void Locallabcie::modecamChanged() +{ + const int mode = complexity->get_active_row_number(); + + if (modecam->get_active_row_number() == 1 || modecam->get_active_row_number() == 2) { + expjz->show(); + jzFrame->show(); + adapjzcie->show(); + jz100->show(); + pqremap->show(); + jabcie->show(); + PQFrame->show(); + logjzFrame->show(); + bevwevFrame->show(); + sigmoidjzFrame->show(); + forcejz->hide(); + + } else { + expjz->hide(); + jzFrame->hide(); + adapjzcie->hide(); + jz100->hide(); + pqremap->hide(); + pqremapcam16->show(); + jabcie->hide(); + PQFrame->hide(); + logjzFrame->hide(); + bevwevFrame->hide(); + sigmoidjzFrame->hide(); + forcejz->hide(); + catadcie->show(); + } + surHBoxcie->show(); + cie1Frame->show(); + expcam16->show(); + cie2Frame->show(); + sourceGraycie->show(); + cieFrame->show(); + + if (modecam->get_active_row_number() == 1) { + surHBoxcie->show(); + cie1Frame->hide(); + expcam16->hide(); + targetGraycie->hide(); + targabscie->hide(); + surrHBoxcie->hide(); + forcejz->hide(); + pqremapcam16->hide(); + catadcie->hide(); + cie2Frame->hide(); + exprecovcie->hide(); + expmaskcie->hide(); + if(mode == Expert) { + exprecovcie->show(); + expmaskcie->show(); + } + + } + if (modecam->get_active_row_number() == 3) { + if(mode == Expert) { + cieFrame->show(); + cie1Frame->hide(); + expcam16->hide(); + cie2Frame->show(); + targetGraycie->show(); + targabscie->show(); + surrHBoxcie->show(); + PQFrame->show(); + logjzFrame->show(); + adapjzcie->hide(); + jz100->hide(); + forcejz->hide(); + pqremap->show(); + pqremapcam16->hide(); + catadcie->hide(); + cie2Frame->hide(); + + } else { + cieFrame->hide(); + cie1Frame->hide(); + expcam16->hide(); + cie2Frame->hide(); + catadcie->hide(); + cie2Frame->hide(); + + } + } + + if(mode != Expert) { + expjz->hide(); + jzFrame->hide(); + adapjzcie->hide(); + jz100->hide(); + pqremap->show(); + jabcie->hide(); + PQFrame->hide(); + logjzFrame->hide(); + sigmoidjzFrame->hide(); + bevwevFrame->hide(); + forcejz->hide(); + pqremapcam16->show(); + catadcie->show(); + sourceGraycie->show(); + + if (modecam->get_active_row_number() == 1 || modecam->get_active_row_number() == 3) { + pqremapcam16->hide(); + cieFrame->hide(); + cie1Frame->hide(); + expcam16->hide(); + cie2Frame->hide(); + catadcie->hide(); + cie2Frame->hide(); + } + } else { + cieFrame->show(); + cie2Frame->show(); + if (modecam->get_active_row_number() == 1) { + targetGraycie->hide(); + targabscie->hide(); + surrHBoxcie->hide(); + forcejz->hide(); + pqremapcam16->hide(); + PQFrame->show(); + logjzFrame->show(); + sigmoidjzFrame->show(); + bevwevFrame->show(); + catadcie->hide(); + cie2Frame->hide(); + if (chjzcie->get_active()) { + thrhjzcie->set_sensitive(true); + } else { + thrhjzcie->set_sensitive(false); + } + + + } + if (modecam->get_active_row_number() == 3) { + cieFrame->show(); + cie2Frame->show(); + targetGraycie->show(); + targabscie->show(); + surrHBoxcie->show(); + PQFrame->show(); + logjzFrame->show(); + adapjzcie->hide(); + jz100->hide(); + forcejz->hide(); + pqremap->show(); + pqremapcam16->hide(); + catadcie->hide(); + cie2Frame->hide(); + } + + } + if (modecam->get_active_row_number() == 0 || modecam->get_active_row_number() == 2) { + targetGraycie->show(); + targabscie->show(); + surrHBoxcie->show(); + cie2Frame->show(); + pqremapcam16->show(); + } + + + + if (isLocActivated && exp->getEnabled()) { + + if (listener) { + listener->panelChanged(Evlocallabmodecam, + modecam->get_active_text() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } +} + + +void Locallabcie::modecieChanged() +{ + if (isLocActivated && exp->getEnabled()) { + + const int mode = complexity->get_active_row_number(); + exprecovcie->show(); + expmaskcie->show(); + + if (modecie->get_active_row_number() > 0) { + sensicie->hide(); + reparcie->hide(); + exprecovcie->hide(); + expmaskcie->hide(); + + } else { + sensicie->show(); + reparcie->show(); + if(mode == Expert) { + exprecovcie->show(); + expmaskcie->show(); + } + } + if (mode == Simple || mode == Normal) { // Keep widget hidden in Normal and Simple mode + + modecie->set_active (0); + sensicie->show(); + reparcie->show(); + + } + + if (listener) { + listener->panelChanged(Evlocallabmodecie, + modecie->get_active_text() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } +} + + + +void Locallabcie::sursourcieChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + listener->panelChanged(Evlocallabsursourcie, + sursourcie->get_active_text() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } +} + +void Locallabcie::surroundcieChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + listener->panelChanged(Evlocallabsurroundcie, + surroundcie->get_active_text() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } +} + +void Locallabcie::updateGUIToMode(const modeType new_type) +{ + switch (new_type) { + case Simple: + catadcie->show(); + saturlcie->show(); + rstprotectcie->show(); + chromlcie->hide(); + huecie->hide(); + lightlcie->show(); + lightqcie->hide(); + contlcie->show(); + contthrescie->show(); + contqcie->hide(); + colorflcie->hide(); + surrHBoxcie->show(); + expLcie->hide(); + surHBoxcie->show(); + sourceabscie->show(); + targabscie->show(); + detailcie->hide(); + jabcie->hide(); + modeHBoxcie->hide(); + sensicie->show(); + reparcie->show(); + sigmoidblcie->hide(); + + expjz->hide(); + jzFrame->hide(); + adapjzcie->hide(); + jz100->hide(); + pqremap->show(); + pqremapcam16->show(); + jabcie->hide(); + targetGraycie->show(); + targabscie->show(); + surrHBoxcie->show(); + forcejz->hide(); + sourceGraycie->show(); + cieFrame->show(); + exprecovcie->hide(); + maskusablecie->hide(); + maskunusablecie->hide(); + decaycie->hide(); + expmaskcie->hide(); + expmaskcie->hide(); + + if (modecam->get_active_row_number() == 2) { + PQFrame->hide(); + logjzFrame->hide(); + sigmoidjzFrame->hide(); + bevwevFrame->hide(); + } + + if (modecam->get_active_row_number() == 1) { + cieFrame->hide(); + cie1Frame->hide(); + expcam16->hide(); + forcejz->hide(); + pqremapcam16->hide(); + PQFrame->hide(); + logjzFrame->hide(); + bevwevFrame->hide(); + sigmoidjzFrame->hide(); + catadcie->hide(); + cie2Frame->hide(); + maskusablecie->hide(); + maskunusablecie->hide(); + decaycie->hide(); + expmaskcie->hide(); + } + if (modecam->get_active_row_number() == 3) { + cieFrame->hide(); + cie1Frame->hide(); + expcam16->hide(); + cie2Frame->hide(); + pqremapcam16->hide(); + PQFrame->hide(); + logjzFrame->hide(); + catadcie->hide(); + } + + break; + case Normal: + // Expert mode widgets are hidden in Normal mode + + catadcie->show(); + saturlcie->show(); + rstprotectcie->show(); + chromlcie->hide(); + huecie->hide(); + lightlcie->show(); + lightqcie->hide(); + contlcie->show(); + contthrescie->show(); + contqcie->hide(); + colorflcie->hide(); + surrHBoxcie->show(); + expLcie->hide(); + surHBoxcie->show(); + sourceabscie->show(); + targabscie->show(); + detailcie->hide(); + jabcie->hide(); + modeHBoxcie->hide(); + sensicie->show(); + reparcie->show(); + sigmoidblcie->show(); + expjz->hide(); + forcejz->hide(); + + jzFrame->hide(); + adapjzcie->hide(); + jz100->hide(); + pqremap->show(); + jabcie->hide(); + targetGraycie->show(); + targabscie->show(); + surrHBoxcie->show(); + pqremapcam16->show(); + sourceGraycie->show(); + cieFrame->show(); + exprecovcie->show(); + expmaskcie->show(); + decaycie->hide(); + lapmaskcie->hide(); + gammaskcie->hide(); + slomaskcie->hide(); + if (enacieMask->get_active()) { + maskusablecie->show(); + maskunusablecie->hide(); + + } else { + maskusablecie->hide(); + maskunusablecie->show(); + } + + if (modecam->get_active_row_number() == 2) { + PQFrame->hide(); + logjzFrame->hide(); + sigmoidjzFrame->hide(); + bevwevFrame->hide(); + } + + if (modecam->get_active_row_number() == 1) { + cieFrame->hide(); + cie1Frame->hide(); + expcam16->hide(); + forcejz->hide(); + pqremapcam16->hide(); + PQFrame->hide(); + logjzFrame->hide(); + sigmoidjzFrame->hide(); + bevwevFrame->hide(); + catadcie->hide(); + cie2Frame->hide(); + exprecovcie->hide(); + expmaskcie->hide(); + maskusablecie->hide(); + maskunusablecie->hide(); + + } + if (modecam->get_active_row_number() == 3) { + cieFrame->hide(); + cie1Frame->hide(); + expcam16->hide(); + cie2Frame->hide(); + pqremapcam16->hide(); + PQFrame->hide(); + catadcie->hide(); + logjzFrame->hide(); + } + if (modecie->get_active_row_number() > 0) { + exprecovcie->hide(); + expmaskcie->hide(); + } + + break; + + case Expert: + // Show widgets hidden in Normal and Simple mode + catadcie->show(); + saturlcie->show(); + rstprotectcie->show(); + chromlcie->show(); + huecie->show(); + lightlcie->show(); + lightqcie->show(); + contlcie->show(); + contthrescie->show(); + contqcie->show(); + colorflcie->show(); + surrHBoxcie->show(); + expLcie->show(); + surHBoxcie->show(); + sourceabscie->show(); + targabscie->show(); + detailcie->show(); + modeHBoxcie->show(); + sigmoidblcie->show(); + targetGraycie->show(); + targabscie->show(); + surrHBoxcie->show(); + forcejz->hide(); + pqremapcam16->show(); + sourceGraycie->show(); + cieFrame->show(); + exprecovcie->show(); + decaycie->show(); + lapmaskcie->show(); + gammaskcie->show(); + slomaskcie->show(); + expmaskcie->show(); + exprecovcie->show(); + + if (enacieMask->get_active()) { + maskusablecie->show(); + maskunusablecie->hide(); + + } else { + maskusablecie->hide(); + maskunusablecie->show(); + } + + if (modecam->get_active_row_number() == 1 || modecam->get_active_row_number() == 2) { + jabcie->show(); + expjz->show(); + jzFrame->show(); + adapjzcie->show(); + jz100->show(); + pqremap->show(); + PQFrame->show(); + logjzFrame->show(); + bevwevFrame->show(); + sigmoidjzFrame->show(); + forcejz->hide(); + + } + cieFrame->show(); + cie2Frame->show(); + + if (modecam->get_active_row_number() == 0 || modecam->get_active_row_number() == 2) { + targetGraycie->show(); + targabscie->show(); + surrHBoxcie->show(); + pqremapcam16->show(); + PQFrame->hide(); + logjzFrame->hide(); + sigmoidjzFrame->hide(); + bevwevFrame->hide(); + } + if (modecam->get_active_row_number() == 2) { + PQFrame->show(); + logjzFrame->hide(); + sigmoidjzFrame->hide(); + bevwevFrame->hide(); + } + + if (modecam->get_active_row_number() == 1) { + surHBoxcie->show(); + targetGraycie->hide(); + targabscie->hide(); + surrHBoxcie->hide(); + pqremapcam16->hide(); + PQFrame->show(); + logjzFrame->show(); + sigmoidjzFrame->show(); + bevwevFrame->show(); + catadcie->hide(); + cie2Frame->hide(); + exprecovcie->show(); + expmaskcie->show(); + maskusablecie->show(); + maskunusablecie->show(); + if (chjzcie->get_active()) { + thrhjzcie->set_sensitive(true); + } else { + thrhjzcie->set_sensitive(false); + } + + } + + if (modecam->get_active_row_number() == 3) { + cieFrame->show(); + cie1Frame->hide(); + expcam16->hide(); + cie2Frame->show(); + targetGraycie->show(); + targabscie->show(); + surrHBoxcie->show(); + PQFrame->show(); + logjzFrame->show(); + adapjzcie->hide(); + jz100->hide(); + forcejz->hide(); + pqremap->show(); + pqremapcam16->hide(); + catadcie->hide(); + } + if (modecie->get_active_row_number() > 0) { + exprecovcie->hide(); + expmaskcie->hide(); + } + + } +} + +void Locallabcie::updatecieGUI() +{ + const int mode = complexity->get_active_row_number(); + expmaskcie->show(); + exprecovcie->show(); + if (modecie->get_active_row_number() > 0) { + sensicie->hide(); + reparcie->hide(); + exprecovcie->hide(); + expmaskcie->hide(); + } else { + sensicie->show(); + reparcie->show(); + exprecovcie->show(); + expmaskcie->show(); + } + surHBoxcie->show(); + cie1Frame->show(); + cie2Frame->show(); + expcam16->show(); + + if (modecam->get_active_row_number() == 2 && mode == Expert) { + PQFrame->show(); + logjzFrame->show(); + sigmoidjzFrame->show(); + bevwevFrame->show(); + } + sourceGraycie->show(); + cieFrame->show(); + + if (enacieMask->get_active() && mode != Simple) { + maskusablecie->show(); + maskunusablecie->hide(); + + } else { + maskusablecie->hide(); + maskunusablecie->show(); + } + + if (modecam->get_active_row_number() == 1) { + surHBoxcie->show(); + cie1Frame->hide(); + expcam16->hide(); + targetGraycie->hide(); + targabscie->hide(); + surrHBoxcie->hide(); + pqremapcam16->hide(); + PQFrame->show(); + logjzFrame->show(); + sigmoidjzFrame->show(); + bevwevFrame->show(); + catadcie->hide(); + cie2Frame->hide(); + if(mode != Expert) { + cieFrame->hide(); + cie1Frame->hide(); + expcam16->hide(); + cie2Frame->hide(); + PQFrame->hide(); + logjzFrame->hide(); + sigmoidjzFrame->hide(); + bevwevFrame->hide(); + exprecovcie->hide(); + expmaskcie->hide(); + maskusablecie->hide(); + maskunusablecie->hide(); + } + + } + if (modecam->get_active_row_number() == 3) { + if(mode == Expert) { + cie1Frame->hide(); + expcam16->hide(); + cie2Frame->show(); + targetGraycie->show(); + targabscie->show(); + surrHBoxcie->show(); + cieFrame->show(); + PQFrame->show(); + logjzFrame->show(); + adapjzcie->hide(); + jz100->hide(); + forcejz->hide(); + pqremap->show(); + pqremapcam16->hide(); + PQFrame->show(); + catadcie->hide(); + } else { + cie1Frame->hide(); + expcam16->hide(); + cie2Frame->hide(); + PQFrame->hide(); + logjzFrame->hide(); + } + } + + if (Autograycie->get_active()) { + sourceGraycie->set_sensitive(false); + sourceabscie->set_sensitive(false); + adapjzcie->set_sensitive(false); + jz100->set_sensitive(false); + blackEvjz->set_sensitive(false); + whiteEvjz->set_sensitive(false); + } else { + sourceGraycie->set_sensitive(true); + sourceabscie->set_sensitive(true); + adapjzcie->set_sensitive(true); + blackEvjz->set_sensitive(true); + whiteEvjz->set_sensitive(true); + jz100->set_sensitive(true); + } + + if (mode == Simple || mode == Normal) { // Keep widget hidden in Normal and Simple mode + modecie->set_active (0); + sensicie->show(); + reparcie->show(); + } + if (modecie->get_active_row_number() > 0) { + exprecovcie->hide(); + expmaskcie->hide(); + } + +} + + +void Locallabcie::convertParamToSimple() +{ + const LocallabParams::LocallabSpot defSpot; + + // Disable all listeners + disableListener(); + sigmoidblcie->setValue(defSpot.sigmoidblcie); + showmaskcieMethod->set_active(0); + enacieMask->set_active(defSpot.enacieMask); + modecie->set_active(0); + // Enable all listeners + enableListener(); +} + +void Locallabcie::convertParamToNormal() +{ + const LocallabParams::LocallabSpot defSpot; + + // Disable all listeners + disableListener(); + contqcie->setValue(defSpot.contqcie); + colorflcie->setValue(defSpot.colorflcie); + lightqcie->setValue(defSpot.lightqcie); + chromlcie->setValue(defSpot.chromlcie); + huecie->setValue(defSpot.huecie); + detailcie->setValue(defSpot.detailcie); + jabcie->set_active(defSpot.jabcie); + LHshapejz->setCurve(defSpot.LHcurvejz); + CHshapejz->setCurve(defSpot.CHcurvejz); + HHshapejz->setCurve(defSpot.HHcurvejz); + shapejz->setCurve(defSpot.jzcurve); + shapecz->setCurve(defSpot.czcurve); + shapeczjz->setCurve(defSpot.czjzcurve); + shapecie->setCurve(defSpot.ciecurve); + shapecie2->setCurve(defSpot.ciecurve2); + lightjzcie->setValue(defSpot.lightjzcie); + contjzcie->setValue(defSpot.contjzcie); + sigmoidldajzcie->setValue(defSpot.sigmoidldajzcie); + hljzcie->setValue(defSpot.hljzcie); + shjzcie->setValue(defSpot.shjzcie); + chromjzcie->setValue(defSpot.chromjzcie); + saturjzcie->setValue(defSpot.saturjzcie); + huejzcie->setValue(defSpot.huejzcie); + softjzcie->setValue(defSpot.softjzcie); + strsoftjzcie->setValue(defSpot.strsoftjzcie); + thrhjzcie->setValue(defSpot.thrhjzcie); + modecie->set_active(0); + if (modecam->get_active_row_number() == 1) { + showmaskcieMethod->set_active(0); + enacieMask->set_active(defSpot.enacieMask); + logjz->set_active(defSpot.logjz); + sigjz->set_active(defSpot.sigjz); + } + lapmaskcie->setValue(defSpot.lapmaskcie); + gammaskcie->setValue(defSpot.gammaskcie); + slomaskcie->setValue(defSpot.slomaskcie); + + // Enable all listeners + enableListener(); + +} + +void Locallabcie::setDefaults(const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited) +{ + const int index = defParams->locallab.selspot; + + if (index < (int)defParams->locallab.spots.size()) { + const LocallabParams::LocallabSpot& defSpot = defParams->locallab.spots.at(index); + + reparcie->setDefault(defSpot.reparcie); + sensicie->setDefault(defSpot.sensicie); + sourceGraycie->setDefault(defSpot.sourceGraycie); + sourceabscie->setDefault(defSpot.sourceabscie); + saturlcie->setDefault(defSpot.saturlcie); + rstprotectcie->setDefault(defSpot.rstprotectcie); + chromlcie->setDefault(defSpot.chromlcie); + huecie->setDefault(defSpot.huecie); + chromjzcie->setDefault(defSpot.chromjzcie); + saturjzcie->setDefault(defSpot.saturjzcie); + huejzcie->setDefault(defSpot.huejzcie); + softjzcie->setDefault(defSpot.softjzcie); + strsoftjzcie->setDefault(defSpot.strsoftjzcie); + thrhjzcie->setDefault(defSpot.thrhjzcie); + lightlcie->setDefault(defSpot.lightlcie); + lightjzcie->setDefault(defSpot.lightjzcie); + lightqcie->setDefault(defSpot.lightqcie); + contlcie->setDefault(defSpot.contlcie); + contjzcie->setDefault(defSpot.contjzcie); + adapjzcie->setDefault(defSpot.adapjzcie); + jz100->setDefault(defSpot.jz100); + pqremap->setDefault(defSpot.pqremap); + pqremapcam16->setDefault(defSpot.pqremapcam16); + hljzcie->setDefault(defSpot.hljzcie); + hlthjzcie->setDefault(defSpot.hlthjzcie); + shjzcie->setDefault(defSpot.shjzcie); + shthjzcie->setDefault(defSpot.shthjzcie); + radjzcie->setDefault(defSpot.radjzcie); + sigmalcjz->setDefault(defSpot.sigmalcjz); + csThresholdjz->setDefault(defSpot.csthresholdjz); + clarilresjz->setDefault(defSpot.clarilresjz); + claricresjz->setDefault(defSpot.claricresjz); + clarisoftjz->setDefault(defSpot.clarisoftjz); + contthrescie->setDefault(defSpot.contthrescie); + blackEvjz->setDefault(defSpot.blackEvjz); + whiteEvjz->setDefault(defSpot.whiteEvjz); + targetjz->setDefault(defSpot.targetjz); + sigmoidldacie->setDefault(defSpot.sigmoidldacie); + sigmoidthcie->setDefault(defSpot.sigmoidthcie); + sigmoidblcie->setDefault(defSpot.sigmoidblcie); + sigmoidldajzcie->setDefault(defSpot.sigmoidldajzcie); + sigmoidthjzcie->setDefault(defSpot.sigmoidthjzcie); + sigmoidbljzcie->setDefault(defSpot.sigmoidbljzcie); + contqcie->setDefault(defSpot.contqcie); + colorflcie->setDefault(defSpot.colorflcie); + targabscie->setDefault(defSpot.targabscie); + targetGraycie->setDefault(defSpot.targetGraycie); + catadcie->setDefault(defSpot.catadcie); + detailcie->setDefault(defSpot.detailcie); + blendmaskcie->setDefault((double)defSpot.blendmaskcie); + radmaskcie->setDefault(defSpot.radmaskcie); + chromaskcie->setDefault(defSpot.chromaskcie); + lapmaskcie->setDefault(defSpot.lapmaskcie); + gammaskcie->setDefault(defSpot.gammaskcie); + slomaskcie->setDefault(defSpot.slomaskcie); + recothrescie->setDefault((double)defSpot.recothrescie); + lowthrescie->setDefault((double)defSpot.lowthrescie); + higthrescie->setDefault((double)defSpot.higthrescie); + decaycie->setDefault((double)defSpot.decaycie); + + } +} + +void Locallabcie::curveChanged(CurveEditor* ce) +{ + if (isLocActivated && exp->getEnabled()) { + const auto spName = M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"; + if (ce == shapejz) { + if (listener) { + listener->panelChanged(Evlocallabshapejz, spName); + } + } + + if (ce == shapecz) { + if (listener) { + listener->panelChanged(Evlocallabshapecz, spName); + } + } + + if (ce == shapeczjz) { + if (listener) { + listener->panelChanged(Evlocallabshapeczjz, spName); + } + } + + if (ce == HHshapejz) { + if (listener) { + listener->panelChanged(EvlocallabHHshapejz, spName); + } + } + + if (ce == CHshapejz) { + if (listener) { + listener->panelChanged(EvlocallabCHshapejz, spName); + } + } + + if (ce == LHshapejz) { + if (listener) { + listener->panelChanged(EvlocallabLHshapejz, spName); + } + } + + if (ce == shapecie) { + if (listener) { + listener->panelChanged(Evlocallabshapecie, spName); + } + } + + if (ce == shapecie2) { + if (listener) { + listener->panelChanged(Evlocallabshapecie2, spName); + } + } + + if (ce == CCmaskcieshape) { + if (listener) { + listener->panelChanged(EvlocallabCCmaskcieshape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == LLmaskcieshape) { + if (listener) { + listener->panelChanged(EvlocallabLLmaskcieshape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == HHmaskcieshape) { + if (listener) { + listener->panelChanged(EvlocallabHHmaskcieshape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == Lmaskcieshape) { + if (listener) { + listener->panelChanged(EvlocallabLmaskcieshape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == wavshapejz) { + if (listener) { + listener->panelChanged(EvlocallabwavCurvejz, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + + } +} + + +void Locallabcie::adjusterChanged2(ThresholdAdjuster* a, int newBottomL, int newTopL, int newBottomR, int newTopR) +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + listener->panelChanged(EvlocallabcsThresholdjz, + csThresholdjz->getHistoryString() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } +} + + +void Locallabcie::adjusterChanged(Adjuster* a, double newval) +{ + const LocallabParams::LocallabSpot defSpot; + + if (isLocActivated && exp->getEnabled()) { + const auto spName = " (" + escapeHtmlChars(getSpotName()) + ")"; + if (a == reparcie) { + if (listener) { + listener->panelChanged(Evlocallabreparcie, + reparcie->getTextValue() + spName); + } + } + + if (a == sensicie) { + if (listener) { + listener->panelChanged(Evlocallabsensicie, + sensicie->getTextValue() + spName); + } + } + + if (a == sourceGraycie) { + if (listener) { + listener->panelChanged(EvlocallabsourceGraycie, + sourceGraycie->getTextValue() + spName); + } + } + + if (a == sourceabscie) { + float sour = std::min(sourceabscie->getValue(), 10000.) / 10000.f; + float pal = std::max(10. * (double) sqrt(sour), 1.5); + adapjzcie->setValue(pal);//max to 10 if La > 10000 and mini to 1.5 + jz100->setValue(defSpot.jz100); + + if (listener) { + listener->panelChanged(Evlocallabsourceabscie, + sourceabscie->getTextValue() + spName ); + } + } + + if (a == saturlcie) { + if (listener) { + listener->panelChanged(Evlocallabsaturlcie, + saturlcie->getTextValue() + spName); + } + } + + if (a == rstprotectcie) { + if (listener) { + listener->panelChanged(Evlocallabrstprotectcie, + rstprotectcie->getTextValue() + spName); + } + } + + if (a == chromlcie) { + if (listener) { + listener->panelChanged(Evlocallabchromlcie, + chromlcie->getTextValue() + spName); + } + } + + if (a == chromjzcie) { + if (listener) { + listener->panelChanged(Evlocallabchromjzcie, + chromjzcie->getTextValue() + spName); + } + } + + if (a == saturjzcie) { + if (listener) { + listener->panelChanged(Evlocallabsaturjzcie, + saturjzcie->getTextValue() + spName); + } + } + + if (a == huecie) { + if (listener) { + listener->panelChanged(Evlocallabhuecie, + huecie->getTextValue() + spName); + } + } + + if (a == huejzcie) { + if (listener) { + listener->panelChanged(Evlocallabhuejzcie, + huejzcie->getTextValue() + spName); + } + } + + if (a == softjzcie) { + if (listener) { + listener->panelChanged(Evlocallabsoftjzcie, + softjzcie->getTextValue() + spName); + } + } + + if (a == strsoftjzcie) { + if (listener) { + listener->panelChanged(Evlocallabstrsoftjzcie, + strsoftjzcie->getTextValue() + spName); + } + } + + if (a == thrhjzcie) { + if (listener) { + listener->panelChanged(Evlocallabthrhjzcie, + thrhjzcie->getTextValue() + spName); + } + } + + if (a == lightlcie) { + if (listener) { + listener->panelChanged(Evlocallablightlcie, + lightlcie->getTextValue() + spName); + } + } + + if (a == lightjzcie) { + if (listener) { + listener->panelChanged(Evlocallablightjzcie, + lightjzcie->getTextValue() + spName); + } + } + + if (a == lightqcie) { + if (listener) { + listener->panelChanged(Evlocallablightqcie, + lightqcie->getTextValue() + spName); + } + } + + + if (a == contlcie) { + if (listener) { + listener->panelChanged(Evlocallabcontlcie, + contlcie->getTextValue()+ spName); + } + } + + if (a == contjzcie) { + if (listener) { + listener->panelChanged(Evlocallabcontjzcie, + contjzcie->getTextValue() + spName); + } + } + + if (a == adapjzcie) { + if (listener) { + listener->panelChanged(Evlocallabadapjzcie, + adapjzcie->getTextValue() + spName); + } + } + + if (a == jz100) { + if (listener) { + listener->panelChanged(Evlocallabjz100, + jz100->getTextValue() + spName); + } + } + + if (a == pqremap) { + if (listener) { + listener->panelChanged(Evlocallabpqremap, + pqremap->getTextValue()+ spName ); + } + } + + if (a == pqremapcam16) { + if (listener) { + listener->panelChanged(Evlocallabpqremapcam16, + pqremapcam16->getTextValue()+ spName ); + } + } + + if (a == hljzcie) { + if (listener) { + listener->panelChanged(Evlocallabhljzcie, + hljzcie->getTextValue() + spName); + } + } + + if (a == hlthjzcie) { + if (listener) { + listener->panelChanged(Evlocallabhlthjzcie, + hlthjzcie->getTextValue() + spName); + } + } + + if (a == shjzcie) { + if (listener) { + listener->panelChanged(Evlocallabshjzcie, + shjzcie->getTextValue()+ spName ); + } + } + + if (a == shthjzcie) { + if (listener) { + listener->panelChanged(Evlocallabshthjzcie, + shthjzcie->getTextValue() + spName); + } + } + + if (a == radjzcie) { + if (listener) { + listener->panelChanged(Evlocallabradjzcie, + radjzcie->getTextValue() + spName); + } + } + + if (a == sigmalcjz) { + if (listener) { + listener->panelChanged(Evlocallabsigmalcjz, + sigmalcjz->getTextValue() + spName); + } + } + + if (a == clarilresjz) { + if (listener) { + listener->panelChanged(Evlocallabclarilresjz, + clarilresjz->getTextValue() + spName); + } + } + + if (a == claricresjz) { + if (listener) { + listener->panelChanged(Evlocallabclaricresjz, + claricresjz->getTextValue() + spName); + } + } + + if (a == clarisoftjz) { + if (listener) { + listener->panelChanged(Evlocallabclarisoftjz, + clarisoftjz->getTextValue() + spName); + } + } + + if (a == contthrescie) { + if (listener) { + listener->panelChanged(Evlocallabcontthrescie, + contthrescie->getTextValue() + spName); + } + } + + if (a == blackEvjz) { + if (listener) { + listener->panelChanged(EvlocallabblackEvjz, + blackEvjz->getTextValue() + spName); + } + } + + if (a == whiteEvjz) { + if (listener) { + listener->panelChanged(EvlocallabwhiteEvjz, + whiteEvjz->getTextValue() + spName); + } + } + + if (a == targetjz) { + if (listener) { + listener->panelChanged(Evlocallabtargetjz, + targetjz->getTextValue() + spName); + } + } + + if (a == sigmoidldacie) { + if (listener) { + listener->panelChanged(Evlocallabsigmoidldacie, + sigmoidldacie->getTextValue() + spName); + } + } + + if (a == sigmoidldajzcie) { + if (listener) { + listener->panelChanged(Evlocallabsigmoidldajzcie, + sigmoidldajzcie->getTextValue() + spName); + } + } + + if (a == sigmoidthcie) { + if (listener) { + listener->panelChanged(Evlocallabsigmoidthcie, + sigmoidthcie->getTextValue() + spName); + } + } + + if (a == sigmoidthjzcie) { + if (listener) { + listener->panelChanged(Evlocallabsigmoidthjzcie, + sigmoidthjzcie->getTextValue()+ spName ); + } + } + + if (a == sigmoidblcie) { + if (listener) { + listener->panelChanged(Evlocallabsigmoidblcie, + sigmoidblcie->getTextValue() + spName); + } + } + + if (a == sigmoidbljzcie) { + if (listener) { + listener->panelChanged(Evlocallabsigmoidbljzcie, + sigmoidbljzcie->getTextValue() + spName); + } + } + + if (a == contqcie) { + if (listener) { + listener->panelChanged(Evlocallabcontqcie, + contqcie->getTextValue() + spName); + } + } + + if (a == colorflcie) { + if (listener) { + listener->panelChanged(Evlocallabcolorflcie, + colorflcie->getTextValue()+ spName ); + } + } + +/* + if (a == lightlzcam) { + if (listener) { + listener->panelChanged(Evlocallablightlzcam, + lightlzcam->getTextValue()+ spName ); + } + } + + if (a == lightqzcam) { + if (listener) { + listener->panelChanged(Evlocallablightqzcam, + lightqzcam->getTextValue()+ spName ); + } + } + + if (a == contlzcam) { + if (listener) { + listener->panelChanged(Evlocallabcontlzcam, + contlzcam->getTextValue()+ spName ); + } + } + + if (a == contqzcam) { + if (listener) { + listener->panelChanged(Evlocallabcontqzcam, + contqzcam->getTextValue()+ spName ); + } + } + + if (a == contthreszcam) { + if (listener) { + listener->panelChanged(Evlocallabcontthreszcam, + contthreszcam->getTextValue()+ spName ); + } + } + + if (a == colorflzcam) { + if (listener) { + listener->panelChanged(Evlocallabcolorflzcam, + colorflzcam->getTextValue()+ spName ); + } + } + + if (a == saturzcam) { + if (listener) { + listener->panelChanged(Evlocallabsaturzcam, + saturzcam->getTextValue()+ spName ); + } + } + + if (a == chromzcam) { + if (listener) { + listener->panelChanged(Evlocallabchromzcam, + chromzcam->getTextValue()+ spName ); + } + } +*/ + if (a == targabscie) { + if (listener) { + listener->panelChanged(Evlocallabtargabscie, + targabscie->getTextValue() + spName); + } + } + + if (a == targetGraycie) { + if (listener) { + listener->panelChanged(EvlocallabtargetGraycie, + targetGraycie->getTextValue() + spName); + } + } + + if (a == catadcie) { + if (listener) { + listener->panelChanged(Evlocallabcatadcie, + catadcie->getTextValue() + spName); + } + } + + if (a == detailcie) { + if (listener) { + listener->panelChanged(Evlocallabdetailcie, + detailcie->getTextValue() + spName); + } + } + + if (a == blendmaskcie) { + if (listener) { + listener->panelChanged(Evlocallabblendmaskcie, + blendmaskcie->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == radmaskcie) { + if (listener) { + listener->panelChanged(Evlocallabradmaskcie, + radmaskcie->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == chromaskcie) { + if (listener) { + listener->panelChanged(Evlocallabchromaskcie, + chromaskcie->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == lapmaskcie) { + if (listener) { + listener->panelChanged(Evlocallablapmaskcie, + lapmaskcie->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == gammaskcie) { + if (listener) { + listener->panelChanged(Evlocallabgammaskcie, + gammaskcie->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == slomaskcie) { + if (listener) { + listener->panelChanged(Evlocallabslomaskcie, + slomaskcie->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == recothrescie) { + + if (listener) { + listener->panelChanged(Evlocallabrecothrescie, + recothrescie->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == lowthrescie) { + if (listener) { + listener->panelChanged(Evlocallablowthrescie, + lowthrescie->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == higthrescie) { + if (listener) { + listener->panelChanged(Evlocallabhigthrescie, + higthrescie->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == decaycie) { + if (listener) { + listener->panelChanged(Evlocallabdecaycie, + decaycie->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + } +} + +void Locallabcie::enabledChanged() +{ + if (isLocActivated) { + if (listener) { + if (exp->getEnabled()) { + listener->panelChanged(EvLocenacie, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(EvLocenacie, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} diff --git a/rtgui/options.cc b/rtgui/options.cc index 70b0fa010..026d76e4e 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -606,6 +606,7 @@ void Options::setDefaults() rtSettings.gamutICC = true; rtSettings.gamutLch = true; rtSettings.amchroma = 40;//between 20 and 140 low values increase effect..and also artifacts, high values reduces + rtSettings.amchromajz = 40;//between 5 and 100 low values increase effect..and also artifacts, high values reduces rtSettings.level0_cbdl = 0; rtSettings.level123_cbdl = 30; //locallab @@ -1748,6 +1749,10 @@ void Options::readFromFile(Glib::ustring fname) rtSettings.amchroma = keyFile.get_integer("Color Management", "Amountchroma"); } + if (keyFile.has_key("Color Management", "JzAmountchroma")) { + rtSettings.amchromajz = keyFile.get_integer("Color Management", "JzAmountchroma"); + } + if (keyFile.has_key("Color Management", "ClutsDirectory")) { clutsDir = keyFile.get_string("Color Management", "ClutsDirectory"); } @@ -2376,6 +2381,7 @@ void Options::saveToFile(Glib::ustring fname) keyFile.set_boolean("Color Management", "GamutLch", rtSettings.gamutLch); keyFile.set_integer("Color Management", "ProtectRed", rtSettings.protectred); keyFile.set_integer("Color Management", "Amountchroma", rtSettings.amchroma); + keyFile.set_integer("Color Management", "JzAmountchroma", rtSettings.amchromajz); keyFile.set_double("Color Management", "ProtectRedH", rtSettings.protectredh); keyFile.set_integer("Color Management", "CRI", rtSettings.CRI_color); keyFile.set_integer("Color Management", "DenoiseLabgamma", rtSettings.denoiselabgamma); diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 916a166bb..7bdedb723 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -1118,12 +1118,15 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).shortc = locallab.spots.at(j).shortc && pSpot.shortc == otherSpot.shortc; locallab.spots.at(j).savrest = locallab.spots.at(j).savrest && pSpot.savrest == otherSpot.savrest; locallab.spots.at(j).scopemask = locallab.spots.at(j).scopemask && pSpot.scopemask == otherSpot.scopemask; + locallab.spots.at(j).denoichmask = locallab.spots.at(j).denoichmask && pSpot.denoichmask == otherSpot.denoichmask; locallab.spots.at(j).lumask = locallab.spots.at(j).lumask && pSpot.lumask == otherSpot.lumask; // Color & Light locallab.spots.at(j).visicolor = locallab.spots.at(j).visicolor && pSpot.visicolor == otherSpot.visicolor; locallab.spots.at(j).expcolor = locallab.spots.at(j).expcolor && pSpot.expcolor == otherSpot.expcolor; locallab.spots.at(j).complexcolor = locallab.spots.at(j).complexcolor && pSpot.complexcolor == otherSpot.complexcolor; locallab.spots.at(j).curvactiv = locallab.spots.at(j).curvactiv && pSpot.curvactiv == otherSpot.curvactiv; + locallab.spots.at(j).reparcol = locallab.spots.at(j).reparcol && pSpot.reparcol == otherSpot.reparcol; + locallab.spots.at(j).gamc = locallab.spots.at(j).gamc && pSpot.gamc == otherSpot.gamc; locallab.spots.at(j).lightness = locallab.spots.at(j).lightness && pSpot.lightness == otherSpot.lightness; locallab.spots.at(j).contrast = locallab.spots.at(j).contrast && pSpot.contrast == otherSpot.contrast; locallab.spots.at(j).chroma = locallab.spots.at(j).chroma && pSpot.chroma == otherSpot.chroma; @@ -1200,6 +1203,7 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).expchroma = locallab.spots.at(j).expchroma && pSpot.expchroma == otherSpot.expchroma; locallab.spots.at(j).sensiex = locallab.spots.at(j).sensiex && pSpot.sensiex == otherSpot.sensiex; locallab.spots.at(j).structexp = locallab.spots.at(j).structexp && pSpot.structexp == otherSpot.structexp; + locallab.spots.at(j).gamex = locallab.spots.at(j).gamex && pSpot.gamex == otherSpot.gamex; locallab.spots.at(j).blurexpde = locallab.spots.at(j).blurexpde && pSpot.blurexpde == otherSpot.blurexpde; locallab.spots.at(j).strexp = locallab.spots.at(j).strexp && pSpot.strexp == otherSpot.strexp; locallab.spots.at(j).angexp = locallab.spots.at(j).angexp && pSpot.angexp == otherSpot.angexp; @@ -1283,6 +1287,7 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).complexvibrance = locallab.spots.at(j).complexvibrance && pSpot.complexvibrance == otherSpot.complexvibrance; locallab.spots.at(j).saturated = locallab.spots.at(j).saturated && pSpot.saturated == otherSpot.saturated; locallab.spots.at(j).pastels = locallab.spots.at(j).pastels && pSpot.pastels == otherSpot.pastels; + locallab.spots.at(j).vibgam = locallab.spots.at(j).vibgam && pSpot.vibgam == otherSpot.vibgam; locallab.spots.at(j).warm = locallab.spots.at(j).warm && pSpot.warm == otherSpot.warm; locallab.spots.at(j).psthreshold = locallab.spots.at(j).psthreshold && pSpot.psthreshold == otherSpot.psthreshold; locallab.spots.at(j).protectskins = locallab.spots.at(j).protectskins && pSpot.protectskins == otherSpot.protectskins; @@ -1359,6 +1364,7 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).noiselumc = locallab.spots.at(j).noiselumc && pSpot.noiselumc == otherSpot.noiselumc; locallab.spots.at(j).noiselumdetail = locallab.spots.at(j).noiselumdetail && pSpot.noiselumdetail == otherSpot.noiselumdetail; locallab.spots.at(j).noiselequal = locallab.spots.at(j).noiselequal && pSpot.noiselequal == otherSpot.noiselequal; + locallab.spots.at(j).noisegam = locallab.spots.at(j).noisegam && pSpot.noisegam == otherSpot.noisegam; locallab.spots.at(j).noisechrof = locallab.spots.at(j).noisechrof && pSpot.noisechrof == otherSpot.noisechrof; locallab.spots.at(j).noisechroc = locallab.spots.at(j).noisechroc && pSpot.noisechroc == otherSpot.noisechroc; locallab.spots.at(j).noisechrodetail = locallab.spots.at(j).noisechrodetail && pSpot.noisechrodetail == otherSpot.noisechrodetail; @@ -1477,6 +1483,7 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).shardamping = locallab.spots.at(j).shardamping && pSpot.shardamping == otherSpot.shardamping; locallab.spots.at(j).shariter = locallab.spots.at(j).shariter && pSpot.shariter == otherSpot.shariter; locallab.spots.at(j).sharblur = locallab.spots.at(j).sharblur && pSpot.sharblur == otherSpot.sharblur; + locallab.spots.at(j).shargam = locallab.spots.at(j).shargam && pSpot.shargam == otherSpot.shargam; locallab.spots.at(j).sensisha = locallab.spots.at(j).sensisha && pSpot.sensisha == otherSpot.sensisha; locallab.spots.at(j).inverssha = locallab.spots.at(j).inverssha && pSpot.inverssha == otherSpot.inverssha; // Local Contrast @@ -1494,6 +1501,9 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).residshathr = locallab.spots.at(j).residshathr && pSpot.residshathr == otherSpot.residshathr; locallab.spots.at(j).residhi = locallab.spots.at(j).residhi && pSpot.residhi == otherSpot.residhi; locallab.spots.at(j).residhithr = locallab.spots.at(j).residhithr && pSpot.residhithr == otherSpot.residhithr; + locallab.spots.at(j).gamlc = locallab.spots.at(j).gamlc && pSpot.gamlc == otherSpot.gamlc; + locallab.spots.at(j).residgam = locallab.spots.at(j).residgam && pSpot.residgam == otherSpot.residgam; + locallab.spots.at(j).residslop = locallab.spots.at(j).residslop && pSpot.residslop == otherSpot.residslop; locallab.spots.at(j).residblur = locallab.spots.at(j).residblur && pSpot.residblur == otherSpot.residblur; locallab.spots.at(j).levelblur = locallab.spots.at(j).levelblur && pSpot.levelblur == otherSpot.levelblur; locallab.spots.at(j).sigmabl = locallab.spots.at(j).sigmabl && pSpot.sigmabl == otherSpot.sigmabl; @@ -1662,6 +1672,111 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).Lmask_curve = locallab.spots.at(j).Lmask_curve && pSpot.Lmask_curve == otherSpot.Lmask_curve; locallab.spots.at(j).LLmask_curvewav = locallab.spots.at(j).LLmask_curvewav && pSpot.LLmask_curvewav == otherSpot.LLmask_curvewav; locallab.spots.at(j).csthresholdmask = locallab.spots.at(j).csthresholdmask && pSpot.csthresholdmask == otherSpot.csthresholdmask; + + //ciecam + locallab.spots.at(j).visicie = locallab.spots.at(j).visicie && pSpot.visicie == otherSpot.visicie; + locallab.spots.at(j).expcie = locallab.spots.at(j).expcie && pSpot.expcie == otherSpot.expcie; + locallab.spots.at(j).complexcie = locallab.spots.at(j).complexcie && pSpot.complexcie == otherSpot.complexcie; + locallab.spots.at(j).reparcie = locallab.spots.at(j).reparcie && pSpot.reparcie == otherSpot.reparcie; + locallab.spots.at(j).sensicie = locallab.spots.at(j).sensicie && pSpot.sensicie == otherSpot.sensicie; + locallab.spots.at(j).Autograycie = locallab.spots.at(j).Autograycie && pSpot.Autograycie == otherSpot.Autograycie; + locallab.spots.at(j).forcejz = locallab.spots.at(j).forcejz && pSpot.forcejz == otherSpot.forcejz; + locallab.spots.at(j).forcebw = locallab.spots.at(j).forcebw && pSpot.forcebw == otherSpot.forcebw; + locallab.spots.at(j).qtoj = locallab.spots.at(j).qtoj && pSpot.qtoj == otherSpot.qtoj; + locallab.spots.at(j).jabcie = locallab.spots.at(j).jabcie && pSpot.jabcie == otherSpot.jabcie; + locallab.spots.at(j).sigmoidqjcie = locallab.spots.at(j).sigmoidqjcie && pSpot.sigmoidqjcie == otherSpot.sigmoidqjcie; + locallab.spots.at(j).logjz = locallab.spots.at(j).logjz && pSpot.logjz == otherSpot.logjz; + locallab.spots.at(j).sigjz = locallab.spots.at(j).sigjz && pSpot.sigjz == otherSpot.sigjz; + locallab.spots.at(j).chjzcie = locallab.spots.at(j).chjzcie && pSpot.chjzcie == otherSpot.chjzcie; + locallab.spots.at(j).sourceGraycie = locallab.spots.at(j).sourceGraycie && pSpot.sourceGraycie == otherSpot.sourceGraycie; + locallab.spots.at(j).sourceabscie = locallab.spots.at(j).sourceabscie && pSpot.sourceabscie == otherSpot.sourceabscie; + locallab.spots.at(j).sursourcie = locallab.spots.at(j).sursourcie && pSpot.sursourcie == otherSpot.sursourcie; + locallab.spots.at(j).modecam = locallab.spots.at(j).modecam && pSpot.modecam == otherSpot.modecam; + locallab.spots.at(j).modecie = locallab.spots.at(j).modecie && pSpot.modecie == otherSpot.modecie; + locallab.spots.at(j).saturlcie = locallab.spots.at(j).saturlcie && pSpot.saturlcie == otherSpot.saturlcie; + locallab.spots.at(j).rstprotectcie = locallab.spots.at(j).rstprotectcie && pSpot.rstprotectcie == otherSpot.rstprotectcie; + locallab.spots.at(j).chromlcie = locallab.spots.at(j).chromlcie && pSpot.chromlcie == otherSpot.chromlcie; + locallab.spots.at(j).huecie = locallab.spots.at(j).huecie && pSpot.huecie == otherSpot.huecie; + locallab.spots.at(j).toneMethodcie = locallab.spots.at(j).toneMethodcie && pSpot.toneMethodcie == otherSpot.toneMethodcie; + locallab.spots.at(j).ciecurve = locallab.spots.at(j).ciecurve && pSpot.ciecurve == otherSpot.ciecurve; + locallab.spots.at(j).toneMethodcie2 = locallab.spots.at(j).toneMethodcie2 && pSpot.toneMethodcie2 == otherSpot.toneMethodcie2; + locallab.spots.at(j).ciecurve2 = locallab.spots.at(j).ciecurve2 && pSpot.ciecurve2 == otherSpot.ciecurve2; + locallab.spots.at(j).chromjzcie = locallab.spots.at(j).chromjzcie && pSpot.chromjzcie == otherSpot.chromjzcie; + locallab.spots.at(j).saturjzcie = locallab.spots.at(j).saturjzcie && pSpot.saturjzcie == otherSpot.saturjzcie; + locallab.spots.at(j).huejzcie = locallab.spots.at(j).huejzcie && pSpot.huejzcie == otherSpot.huejzcie; + locallab.spots.at(j).softjzcie = locallab.spots.at(j).softjzcie && pSpot.softjzcie == otherSpot.softjzcie; + locallab.spots.at(j).strsoftjzcie = locallab.spots.at(j).strsoftjzcie && pSpot.strsoftjzcie == otherSpot.strsoftjzcie; + locallab.spots.at(j).thrhjzcie = locallab.spots.at(j).thrhjzcie && pSpot.thrhjzcie == otherSpot.thrhjzcie; + locallab.spots.at(j).jzcurve = locallab.spots.at(j).jzcurve && pSpot.jzcurve == otherSpot.jzcurve; + locallab.spots.at(j).czcurve = locallab.spots.at(j).czcurve && pSpot.czcurve == otherSpot.czcurve; + locallab.spots.at(j).czjzcurve = locallab.spots.at(j).czjzcurve && pSpot.czjzcurve == otherSpot.czjzcurve; + locallab.spots.at(j).HHcurvejz = locallab.spots.at(j).HHcurvejz && pSpot.HHcurvejz == otherSpot.HHcurvejz; + locallab.spots.at(j).CHcurvejz = locallab.spots.at(j).CHcurvejz && pSpot.CHcurvejz == otherSpot.CHcurvejz; + locallab.spots.at(j).LHcurvejz = locallab.spots.at(j).LHcurvejz && pSpot.LHcurvejz == otherSpot.LHcurvejz; + locallab.spots.at(j).lightlcie = locallab.spots.at(j).lightlcie && pSpot.lightlcie == otherSpot.lightlcie; + locallab.spots.at(j).lightjzcie = locallab.spots.at(j).lightjzcie && pSpot.lightjzcie == otherSpot.lightjzcie; + locallab.spots.at(j).lightqcie = locallab.spots.at(j).lightqcie && pSpot.lightqcie == otherSpot.lightqcie; + locallab.spots.at(j).contlcie = locallab.spots.at(j).contlcie && pSpot.contlcie == otherSpot.contlcie; + locallab.spots.at(j).contjzcie = locallab.spots.at(j).contjzcie && pSpot.contjzcie == otherSpot.contjzcie; + locallab.spots.at(j).adapjzcie = locallab.spots.at(j).adapjzcie && pSpot.adapjzcie == otherSpot.adapjzcie; + locallab.spots.at(j).jz100 = locallab.spots.at(j).jz100 && pSpot.jz100 == otherSpot.jz100; + locallab.spots.at(j).pqremap = locallab.spots.at(j).pqremap && pSpot.pqremap == otherSpot.pqremap; + locallab.spots.at(j).pqremapcam16 = locallab.spots.at(j).pqremapcam16 && pSpot.pqremapcam16 == otherSpot.pqremapcam16; + locallab.spots.at(j).hljzcie = locallab.spots.at(j).hljzcie && pSpot.hljzcie == otherSpot.hljzcie; + locallab.spots.at(j).hlthjzcie = locallab.spots.at(j).hlthjzcie && pSpot.hlthjzcie == otherSpot.hlthjzcie; + locallab.spots.at(j).shjzcie = locallab.spots.at(j).shjzcie && pSpot.shjzcie == otherSpot.shjzcie; + locallab.spots.at(j).shthjzcie = locallab.spots.at(j).shthjzcie && pSpot.shthjzcie == otherSpot.shthjzcie; + locallab.spots.at(j).radjzcie = locallab.spots.at(j).radjzcie && pSpot.radjzcie == otherSpot.radjzcie; + locallab.spots.at(j).contthrescie = locallab.spots.at(j).contthrescie && pSpot.contthrescie == otherSpot.contthrescie; + locallab.spots.at(j).blackEvjz = locallab.spots.at(j).blackEvjz && pSpot.blackEvjz == otherSpot.blackEvjz; + locallab.spots.at(j).whiteEvjz = locallab.spots.at(j).whiteEvjz && pSpot.whiteEvjz == otherSpot.whiteEvjz; + locallab.spots.at(j).targetjz = locallab.spots.at(j).targetjz && pSpot.targetjz == otherSpot.targetjz; + locallab.spots.at(j).sigmoidldacie = locallab.spots.at(j).sigmoidldacie && pSpot.sigmoidldacie == otherSpot.sigmoidldacie; + locallab.spots.at(j).sigmoidthcie = locallab.spots.at(j).sigmoidthcie && pSpot.sigmoidthcie == otherSpot.sigmoidthcie; + locallab.spots.at(j).sigmoidblcie = locallab.spots.at(j).sigmoidblcie && pSpot.sigmoidblcie == otherSpot.sigmoidblcie; + locallab.spots.at(j).sigmoidldajzcie = locallab.spots.at(j).sigmoidldajzcie && pSpot.sigmoidldajzcie == otherSpot.sigmoidldajzcie; + locallab.spots.at(j).sigmoidthjzcie = locallab.spots.at(j).sigmoidthjzcie && pSpot.sigmoidthjzcie == otherSpot.sigmoidthjzcie; + locallab.spots.at(j).sigmoidbljzcie = locallab.spots.at(j).sigmoidbljzcie && pSpot.sigmoidbljzcie == otherSpot.sigmoidbljzcie; + locallab.spots.at(j).contqcie = locallab.spots.at(j).contqcie && pSpot.contqcie == otherSpot.contqcie; + locallab.spots.at(j).colorflcie = locallab.spots.at(j).colorflcie && pSpot.colorflcie == otherSpot.colorflcie; + locallab.spots.at(j).targabscie = locallab.spots.at(j).targabscie && pSpot.targabscie == otherSpot.targabscie; + locallab.spots.at(j).targetGraycie = locallab.spots.at(j).targetGraycie && pSpot.targetGraycie == otherSpot.targetGraycie; + locallab.spots.at(j).catadcie = locallab.spots.at(j).catadcie && pSpot.catadcie == otherSpot.catadcie; + locallab.spots.at(j).detailcie = locallab.spots.at(j).detailcie && pSpot.detailcie == otherSpot.detailcie; + locallab.spots.at(j).surroundcie = locallab.spots.at(j).surroundcie && pSpot.surroundcie == otherSpot.surroundcie; +/* + locallab.spots.at(j).lightlzcam = locallab.spots.at(j).lightlzcam && pSpot.lightlzcam == otherSpot.lightlzcam; + locallab.spots.at(j).lightqzcam = locallab.spots.at(j).lightqzcam && pSpot.lightqzcam == otherSpot.lightqzcam; + locallab.spots.at(j).contlzcam = locallab.spots.at(j).contlzcam && pSpot.contlzcam == otherSpot.contlzcam; + locallab.spots.at(j).contqzcam = locallab.spots.at(j).contqzcam && pSpot.contqzcam == otherSpot.contqzcam; + locallab.spots.at(j).contthreszcam = locallab.spots.at(j).contthreszcam && pSpot.contthreszcam == otherSpot.contthreszcam; + locallab.spots.at(j).colorflzcam = locallab.spots.at(j).colorflzcam && pSpot.colorflzcam == otherSpot.colorflzcam; + locallab.spots.at(j).saturzcam = locallab.spots.at(j).saturzcam && pSpot.saturzcam == otherSpot.saturzcam; + locallab.spots.at(j).chromzcam = locallab.spots.at(j).chromzcam && pSpot.chromzcam == otherSpot.chromzcam; +*/ + locallab.spots.at(j).enacieMask = locallab.spots.at(j).enaSHMask && pSpot.enaSHMask == otherSpot.enaSHMask; + locallab.spots.at(j).CCmaskciecurve = locallab.spots.at(j).CCmaskciecurve && pSpot.CCmaskciecurve == otherSpot.CCmaskciecurve; + locallab.spots.at(j).LLmaskciecurve = locallab.spots.at(j).LLmaskciecurve && pSpot.LLmaskciecurve == otherSpot.LLmaskciecurve; + locallab.spots.at(j).HHmaskciecurve = locallab.spots.at(j).HHmaskciecurve && pSpot.HHmaskciecurve == otherSpot.HHmaskciecurve; + locallab.spots.at(j).blendmaskcie = locallab.spots.at(j).blendmaskcie && pSpot.blendmaskcie == otherSpot.blendmaskcie; + locallab.spots.at(j).radmaskcie = locallab.spots.at(j).radmaskcie && pSpot.radmaskcie == otherSpot.radmaskcie; + locallab.spots.at(j).chromaskcie = locallab.spots.at(j).chromaskcie && pSpot.chromaskcie == otherSpot.chromaskcie; + locallab.spots.at(j).lapmaskcie = locallab.spots.at(j).lapmaskcie && pSpot.lapmaskcie == otherSpot.lapmaskcie; + locallab.spots.at(j).gammaskcie = locallab.spots.at(j).gammaskcie && pSpot.gammaskcie == otherSpot.gammaskcie; + locallab.spots.at(j).slomaskcie = locallab.spots.at(j).slomaskcie && pSpot.slomaskcie == otherSpot.slomaskcie; + locallab.spots.at(j).Lmaskciecurve = locallab.spots.at(j).Lmaskciecurve && pSpot.Lmaskciecurve == otherSpot.Lmaskciecurve; + locallab.spots.at(j).recothrescie = locallab.spots.at(j).recothrescie && pSpot.recothrescie == otherSpot.recothrescie; + locallab.spots.at(j).lowthrescie = locallab.spots.at(j).lowthrescie && pSpot.lowthrescie == otherSpot.lowthrescie; + locallab.spots.at(j).higthrescie = locallab.spots.at(j).higthrescie && pSpot.higthrescie == otherSpot.higthrescie; + locallab.spots.at(j).decaycie = locallab.spots.at(j).decaycie && pSpot.decaycie == otherSpot.decaycie; + locallab.spots.at(j).locwavcurvejz = locallab.spots.at(j).locwavcurvejz && pSpot.locwavcurvejz == otherSpot.locwavcurvejz; + locallab.spots.at(j).csthresholdjz = locallab.spots.at(j).csthresholdjz && pSpot.csthresholdjz == otherSpot.csthresholdjz; + locallab.spots.at(j).sigmalcjz = locallab.spots.at(j).sigmalcjz && pSpot.sigmalcjz == otherSpot.sigmalcjz; + locallab.spots.at(j).clarilresjz = locallab.spots.at(j).clarilresjz && pSpot.clarilresjz == otherSpot.clarilresjz; + locallab.spots.at(j).claricresjz = locallab.spots.at(j).claricresjz && pSpot.claricresjz == otherSpot.claricresjz; + locallab.spots.at(j).clarisoftjz = locallab.spots.at(j).clarisoftjz && pSpot.clarisoftjz == otherSpot.clarisoftjz; + + } } @@ -3425,6 +3540,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).savrest = mods.locallab.spots.at(i).savrest; } + if (locallab.spots.at(i).denoichmask) { + toEdit.locallab.spots.at(i).denoichmask = mods.locallab.spots.at(i).denoichmask; + } + if (locallab.spots.at(i).scopemask) { toEdit.locallab.spots.at(i).scopemask = mods.locallab.spots.at(i).scopemask; } @@ -3458,6 +3577,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).reparcol = mods.locallab.spots.at(i).reparcol; } + if (locallab.spots.at(i).gamc) { + toEdit.locallab.spots.at(i).gamc = mods.locallab.spots.at(i).gamc; + } + if (locallab.spots.at(i).contrast) { toEdit.locallab.spots.at(i).contrast = mods.locallab.spots.at(i).contrast; } @@ -3755,10 +3878,18 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).structexp = mods.locallab.spots.at(i).structexp; } + if (locallab.spots.at(i).gamex) { + toEdit.locallab.spots.at(i).gamex = mods.locallab.spots.at(i).gamex; + } + if (locallab.spots.at(i).blurexpde) { toEdit.locallab.spots.at(i).blurexpde = mods.locallab.spots.at(i).blurexpde; } + if (locallab.spots.at(i).gamex) { + toEdit.locallab.spots.at(i).gamex = mods.locallab.spots.at(i).gamex; + } + if (locallab.spots.at(i).strexp) { toEdit.locallab.spots.at(i).strexp = mods.locallab.spots.at(i).strexp; } @@ -4067,6 +4198,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).pastels = mods.locallab.spots.at(i).pastels; } + if (locallab.spots.at(i).vibgam) { + toEdit.locallab.spots.at(i).vibgam = mods.locallab.spots.at(i).vibgam; + } + if (locallab.spots.at(i).warm) { toEdit.locallab.spots.at(i).warm = mods.locallab.spots.at(i).warm; } @@ -4365,6 +4500,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).noiselequal = mods.locallab.spots.at(i).noiselequal; } + if (locallab.spots.at(i).noisegam) { + toEdit.locallab.spots.at(i).noisegam = mods.locallab.spots.at(i).noisegam; + } + if (locallab.spots.at(i).noisechrof) { toEdit.locallab.spots.at(i).noisechrof = mods.locallab.spots.at(i).noisechrof; } @@ -4829,6 +4968,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).sharblur = mods.locallab.spots.at(i).sharblur; } + if (locallab.spots.at(i).shargam) { + toEdit.locallab.spots.at(i).shargam = mods.locallab.spots.at(i).shargam; + } + if (locallab.spots.at(i).sensisha) { toEdit.locallab.spots.at(i).sensisha = mods.locallab.spots.at(i).sensisha; } @@ -4894,6 +5037,18 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).residhithr = mods.locallab.spots.at(i).residhithr; } + if (locallab.spots.at(i).gamlc) { + toEdit.locallab.spots.at(i).gamlc = mods.locallab.spots.at(i).gamlc; + } + + if (locallab.spots.at(i).residgam) { + toEdit.locallab.spots.at(i).residgam = mods.locallab.spots.at(i).residgam; + } + + if (locallab.spots.at(i).residslop) { + toEdit.locallab.spots.at(i).residslop = mods.locallab.spots.at(i).residslop; + } + if (locallab.spots.at(i).residblur) { toEdit.locallab.spots.at(i).residblur = mods.locallab.spots.at(i).residblur; } @@ -5536,6 +5691,400 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).csthresholdmask = mods.locallab.spots.at(i).csthresholdmask; } + //ciecam + if (locallab.spots.at(i).visicie) { + toEdit.locallab.spots.at(i).visicie = mods.locallab.spots.at(i).visicie; + } + + if (locallab.spots.at(i).expcie) { + toEdit.locallab.spots.at(i).expcie = mods.locallab.spots.at(i).expcie; + } + + if (locallab.spots.at(i).complexcie) { + toEdit.locallab.spots.at(i).complexcie = mods.locallab.spots.at(i).complexcie; + } + + if (locallab.spots.at(i).reparcie) { + toEdit.locallab.spots.at(i).reparcie = mods.locallab.spots.at(i).reparcie; + } + + if (locallab.spots.at(i).sensicie) { + toEdit.locallab.spots.at(i).sensicie = mods.locallab.spots.at(i).sensicie; + } + + if (locallab.spots.at(i).Autograycie) { + toEdit.locallab.spots.at(i).Autograycie = mods.locallab.spots.at(i).Autograycie; + } + + if (locallab.spots.at(i).forcejz) { + toEdit.locallab.spots.at(i).forcejz = mods.locallab.spots.at(i).forcejz; + } + + if (locallab.spots.at(i).forcebw) { + toEdit.locallab.spots.at(i).forcebw = mods.locallab.spots.at(i).forcebw; + } + + if (locallab.spots.at(i).qtoj) { + toEdit.locallab.spots.at(i).qtoj = mods.locallab.spots.at(i).qtoj; + } + + if (locallab.spots.at(i).jabcie) { + toEdit.locallab.spots.at(i).jabcie = mods.locallab.spots.at(i).jabcie; + } + + if (locallab.spots.at(i).sigmoidqjcie) { + toEdit.locallab.spots.at(i).sigmoidqjcie = mods.locallab.spots.at(i).sigmoidqjcie; + } + + if (locallab.spots.at(i).logjz) { + toEdit.locallab.spots.at(i).logjz = mods.locallab.spots.at(i).logjz; + } + + if (locallab.spots.at(i).sigjz) { + toEdit.locallab.spots.at(i).sigjz = mods.locallab.spots.at(i).sigjz; + } + + if (locallab.spots.at(i).chjzcie) { + toEdit.locallab.spots.at(i).chjzcie = mods.locallab.spots.at(i).chjzcie; + } + + if (locallab.spots.at(i).sourceGraycie) { + toEdit.locallab.spots.at(i).sourceGraycie = mods.locallab.spots.at(i).sourceGraycie; + } + + if (locallab.spots.at(i).sourceabscie) { + toEdit.locallab.spots.at(i).sourceabscie = mods.locallab.spots.at(i).sourceabscie; + } + + if (locallab.spots.at(i).sursourcie) { + toEdit.locallab.spots.at(i).sursourcie = mods.locallab.spots.at(i).sursourcie; + } + + if (locallab.spots.at(i).modecam) { + toEdit.locallab.spots.at(i).modecam = mods.locallab.spots.at(i).modecam; + } + + if (locallab.spots.at(i).modecie) { + toEdit.locallab.spots.at(i).modecie = mods.locallab.spots.at(i).modecie; + } + + if (locallab.spots.at(i).saturlcie) { + toEdit.locallab.spots.at(i).saturlcie = mods.locallab.spots.at(i).saturlcie; + } + + if (locallab.spots.at(i).rstprotectcie) { + toEdit.locallab.spots.at(i).rstprotectcie = mods.locallab.spots.at(i).rstprotectcie; + } + + if (locallab.spots.at(i).chromlcie) { + toEdit.locallab.spots.at(i).chromlcie = mods.locallab.spots.at(i).chromlcie; + } + + if (locallab.spots.at(i).huecie) { + toEdit.locallab.spots.at(i).huecie = mods.locallab.spots.at(i).huecie; + } + + if (locallab.spots.at(i).toneMethodcie) { + toEdit.locallab.spots.at(i).toneMethodcie = mods.locallab.spots.at(i).toneMethodcie; + } + + if (locallab.spots.at(i).toneMethodcie2) { + toEdit.locallab.spots.at(i).toneMethodcie2 = mods.locallab.spots.at(i).toneMethodcie2; + } + + if (locallab.spots.at(i).chromjzcie) { + toEdit.locallab.spots.at(i).chromjzcie = mods.locallab.spots.at(i).chromjzcie; + } + + if (locallab.spots.at(i).saturjzcie) { + toEdit.locallab.spots.at(i).saturjzcie = mods.locallab.spots.at(i).saturjzcie; + } + + if (locallab.spots.at(i).huejzcie) { + toEdit.locallab.spots.at(i).huejzcie = mods.locallab.spots.at(i).huejzcie; + } + + if (locallab.spots.at(i).softjzcie) { + toEdit.locallab.spots.at(i).softjzcie = mods.locallab.spots.at(i).softjzcie; + } + + if (locallab.spots.at(i).strsoftjzcie) { + toEdit.locallab.spots.at(i).strsoftjzcie = mods.locallab.spots.at(i).strsoftjzcie; + } + + if (locallab.spots.at(i).thrhjzcie) { + toEdit.locallab.spots.at(i).thrhjzcie = mods.locallab.spots.at(i).thrhjzcie; + } + + if (locallab.spots.at(i).ciecurve) { + toEdit.locallab.spots.at(i).ciecurve = mods.locallab.spots.at(i).ciecurve; + } + + if (locallab.spots.at(i).ciecurve2) { + toEdit.locallab.spots.at(i).ciecurve2 = mods.locallab.spots.at(i).ciecurve2; + } + + if (locallab.spots.at(i).jzcurve) { + toEdit.locallab.spots.at(i).jzcurve = mods.locallab.spots.at(i).jzcurve; + } + + if (locallab.spots.at(i).czjzcurve) { + toEdit.locallab.spots.at(i).czjzcurve = mods.locallab.spots.at(i).czjzcurve; + } + + if (locallab.spots.at(i).HHcurvejz) { + toEdit.locallab.spots.at(i).HHcurvejz = mods.locallab.spots.at(i).HHcurvejz; + } + + if (locallab.spots.at(i).CHcurvejz) { + toEdit.locallab.spots.at(i).CHcurvejz = mods.locallab.spots.at(i).CHcurvejz; + } + + if (locallab.spots.at(i).LHcurvejz) { + toEdit.locallab.spots.at(i).LHcurvejz = mods.locallab.spots.at(i).LHcurvejz; + } + + if (locallab.spots.at(i).lightlcie) { + toEdit.locallab.spots.at(i).lightlcie = mods.locallab.spots.at(i).lightlcie; + } + + if (locallab.spots.at(i).lightjzcie) { + toEdit.locallab.spots.at(i).lightjzcie = mods.locallab.spots.at(i).lightjzcie; + } + + if (locallab.spots.at(i).lightqcie) { + toEdit.locallab.spots.at(i).lightqcie = mods.locallab.spots.at(i).lightqcie; + } + + if (locallab.spots.at(i).contlcie) { + toEdit.locallab.spots.at(i).contlcie = mods.locallab.spots.at(i).contlcie; + } + + if (locallab.spots.at(i).contjzcie) { + toEdit.locallab.spots.at(i).contjzcie = mods.locallab.spots.at(i).contjzcie; + } + + if (locallab.spots.at(i).adapjzcie) { + toEdit.locallab.spots.at(i).adapjzcie = mods.locallab.spots.at(i).adapjzcie; + } + + if (locallab.spots.at(i).jz100) { + toEdit.locallab.spots.at(i).jz100 = mods.locallab.spots.at(i).jz100; + } + + if (locallab.spots.at(i).pqremap) { + toEdit.locallab.spots.at(i).pqremap = mods.locallab.spots.at(i).pqremap; + } + + if (locallab.spots.at(i).pqremapcam16) { + toEdit.locallab.spots.at(i).pqremapcam16 = mods.locallab.spots.at(i).pqremapcam16; + } + + if (locallab.spots.at(i).hljzcie) { + toEdit.locallab.spots.at(i).hljzcie = mods.locallab.spots.at(i).hljzcie; + } + + if (locallab.spots.at(i).hlthjzcie) { + toEdit.locallab.spots.at(i).hlthjzcie = mods.locallab.spots.at(i).hlthjzcie; + } + + if (locallab.spots.at(i).shjzcie) { + toEdit.locallab.spots.at(i).shjzcie = mods.locallab.spots.at(i).shjzcie; + } + + if (locallab.spots.at(i).shthjzcie) { + toEdit.locallab.spots.at(i).shthjzcie = mods.locallab.spots.at(i).shthjzcie; + } + + if (locallab.spots.at(i).radjzcie) { + toEdit.locallab.spots.at(i).radjzcie = mods.locallab.spots.at(i).radjzcie; + } + + if (locallab.spots.at(i).contthrescie) { + toEdit.locallab.spots.at(i).contthrescie = mods.locallab.spots.at(i).contthrescie; + } + + if (locallab.spots.at(i).blackEvjz) { + toEdit.locallab.spots.at(i).blackEvjz = mods.locallab.spots.at(i).blackEvjz; + } + + if (locallab.spots.at(i).whiteEvjz) { + toEdit.locallab.spots.at(i).whiteEvjz = mods.locallab.spots.at(i).whiteEvjz; + } + + if (locallab.spots.at(i).targetjz) { + toEdit.locallab.spots.at(i).targetjz = mods.locallab.spots.at(i).targetjz; + } + + if (locallab.spots.at(i).sigmoidldacie) { + toEdit.locallab.spots.at(i).sigmoidldacie = mods.locallab.spots.at(i).sigmoidldacie; + } + + if (locallab.spots.at(i).sigmoidthcie) { + toEdit.locallab.spots.at(i).sigmoidthcie = mods.locallab.spots.at(i).sigmoidthcie; + } + + if (locallab.spots.at(i).sigmoidblcie) { + toEdit.locallab.spots.at(i).sigmoidblcie = mods.locallab.spots.at(i).sigmoidblcie; + } + + if (locallab.spots.at(i).sigmoidldajzcie) { + toEdit.locallab.spots.at(i).sigmoidldajzcie = mods.locallab.spots.at(i).sigmoidldajzcie; + } + + if (locallab.spots.at(i).sigmoidthjzcie) { + toEdit.locallab.spots.at(i).sigmoidthjzcie = mods.locallab.spots.at(i).sigmoidthjzcie; + } + + if (locallab.spots.at(i).sigmoidbljzcie) { + toEdit.locallab.spots.at(i).sigmoidbljzcie = mods.locallab.spots.at(i).sigmoidbljzcie; + } + + + if (locallab.spots.at(i).contqcie) { + toEdit.locallab.spots.at(i).contqcie = mods.locallab.spots.at(i).contqcie; + } + + if (locallab.spots.at(i).colorflcie) { + toEdit.locallab.spots.at(i).colorflcie = mods.locallab.spots.at(i).colorflcie; + } +/* + if (locallab.spots.at(i).lightlzcam) { + toEdit.locallab.spots.at(i).lightlzcam = mods.locallab.spots.at(i).lightlzcam; + } + + if (locallab.spots.at(i).lightqzcam) { + toEdit.locallab.spots.at(i).lightqzcam = mods.locallab.spots.at(i).lightqzcam; + } + + if (locallab.spots.at(i).contlzcam) { + toEdit.locallab.spots.at(i).contlzcam = mods.locallab.spots.at(i).contlzcam; + } + + if (locallab.spots.at(i).contqzcam) { + toEdit.locallab.spots.at(i).contqzcam = mods.locallab.spots.at(i).contqzcam; + } + + if (locallab.spots.at(i).contthreszcam) { + toEdit.locallab.spots.at(i).contthreszcam = mods.locallab.spots.at(i).contthreszcam; + } + + if (locallab.spots.at(i).colorflzcam) { + toEdit.locallab.spots.at(i).colorflzcam = mods.locallab.spots.at(i).colorflzcam; + } + + if (locallab.spots.at(i).saturzcam) { + toEdit.locallab.spots.at(i).saturzcam = mods.locallab.spots.at(i).saturzcam; + } + + if (locallab.spots.at(i).chromzcam) { + toEdit.locallab.spots.at(i).chromzcam = mods.locallab.spots.at(i).chromzcam; + } +*/ + if (locallab.spots.at(i).targabscie) { + toEdit.locallab.spots.at(i).targabscie = mods.locallab.spots.at(i).targabscie; + } + + if (locallab.spots.at(i).targetGraycie) { + toEdit.locallab.spots.at(i).targetGraycie = mods.locallab.spots.at(i).targetGraycie; + } + + if (locallab.spots.at(i).catadcie) { + toEdit.locallab.spots.at(i).catadcie = mods.locallab.spots.at(i).catadcie; + } + + if (locallab.spots.at(i).locwavcurvejz) { + toEdit.locallab.spots.at(i).locwavcurvejz = mods.locallab.spots.at(i).locwavcurvejz; + } + + if (locallab.spots.at(i).csthresholdjz) { + toEdit.locallab.spots.at(i).csthresholdjz = mods.locallab.spots.at(i).csthresholdjz; + } + + if (locallab.spots.at(i).sigmalcjz) { + toEdit.locallab.spots.at(i).sigmalcjz = mods.locallab.spots.at(i).sigmalcjz; + } + + if (locallab.spots.at(i).clarilresjz) { + toEdit.locallab.spots.at(i).clarilresjz = mods.locallab.spots.at(i).clarilresjz; + } + + if (locallab.spots.at(i).claricresjz) { + toEdit.locallab.spots.at(i).claricresjz = mods.locallab.spots.at(i).claricresjz; + } + + if (locallab.spots.at(i).clarisoftjz) { + toEdit.locallab.spots.at(i).clarisoftjz = mods.locallab.spots.at(i).clarisoftjz; + } + + if (locallab.spots.at(i).detailcie) { + toEdit.locallab.spots.at(i).detailcie = mods.locallab.spots.at(i).detailcie; + } + + if (locallab.spots.at(i).surroundcie) { + toEdit.locallab.spots.at(i).surroundcie = mods.locallab.spots.at(i).surroundcie; + } + + if (locallab.spots.at(i).enacieMask) { + toEdit.locallab.spots.at(i).enacieMask = mods.locallab.spots.at(i).enacieMask; + } + + if (locallab.spots.at(i).CCmaskciecurve) { + toEdit.locallab.spots.at(i).CCmaskciecurve = mods.locallab.spots.at(i).CCmaskciecurve; + } + + if (locallab.spots.at(i).LLmaskciecurve) { + toEdit.locallab.spots.at(i).LLmaskciecurve = mods.locallab.spots.at(i).LLmaskciecurve; + } + + if (locallab.spots.at(i).HHmaskciecurve) { + toEdit.locallab.spots.at(i).HHmaskciecurve = mods.locallab.spots.at(i).HHmaskciecurve; + } + + if (locallab.spots.at(i).blendmaskcie) { + toEdit.locallab.spots.at(i).blendmaskcie = mods.locallab.spots.at(i).blendmaskcie; + } + + if (locallab.spots.at(i).radmaskcie) { + toEdit.locallab.spots.at(i).radmaskcie = mods.locallab.spots.at(i).radmaskcie; + } + + if (locallab.spots.at(i).chromaskcie) { + toEdit.locallab.spots.at(i).chromaskcie = mods.locallab.spots.at(i).chromaskcie; + } + + if (locallab.spots.at(i).lapmaskcie) { + toEdit.locallab.spots.at(i).lapmaskcie = mods.locallab.spots.at(i).lapmaskcie; + } + + if (locallab.spots.at(i).gammaskcie) { + toEdit.locallab.spots.at(i).gammaskcie = mods.locallab.spots.at(i).gammaskcie; + } + + if (locallab.spots.at(i).slomaskcie) { + toEdit.locallab.spots.at(i).slomaskcie = mods.locallab.spots.at(i).slomaskcie; + } + + if (locallab.spots.at(i).Lmaskciecurve) { + toEdit.locallab.spots.at(i).Lmaskciecurve = mods.locallab.spots.at(i).Lmaskciecurve; + } + + if (locallab.spots.at(i).recothrescie) { + toEdit.locallab.spots.at(i).recothrescie = mods.locallab.spots.at(i).recothrescie; + } + + if (locallab.spots.at(i).lowthrescie) { + toEdit.locallab.spots.at(i).lowthrescie = mods.locallab.spots.at(i).lowthrescie; + } + + if (locallab.spots.at(i).higthrescie) { + toEdit.locallab.spots.at(i).higthrescie = mods.locallab.spots.at(i).higthrescie; + } + + if (locallab.spots.at(i).decaycie) { + toEdit.locallab.spots.at(i).decaycie = mods.locallab.spots.at(i).decaycie; + } + } if (spot.enabled) { @@ -6873,6 +7422,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : shortc(v), savrest(v), scopemask(v), + denoichmask(v), lumask(v), // Color & Light visicolor(v), @@ -6881,6 +7431,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : curvactiv(v), lightness(v), reparcol(v), + gamc(v), contrast(v), chroma(v), labgridALow(v), @@ -6956,6 +7507,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : expchroma(v), sensiex(v), structexp(v), + gamex(v), blurexpde(v), strexp(v), angexp(v), @@ -7035,6 +7587,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : complexvibrance(v), saturated(v), pastels(v), + vibgam(v), warm(v), psthreshold(v), protectskins(v), @@ -7111,6 +7664,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : noiselumc(v), noiselumdetail(v), noiselequal(v), + noisegam(v), noisechrof(v), noisechroc(v), noisechrodetail(v), @@ -7229,6 +7783,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : shardamping(v), shariter(v), sharblur(v), + shargam(v), sensisha(v), inverssha(v), // Local Contrast @@ -7246,6 +7801,9 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : residshathr(v), residhi(v), residhithr(v), + gamlc(v), + residgam(v), + residslop(v), residblur(v), levelblur(v), sigmabl(v), @@ -7407,7 +7965,109 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : HHhmask_curve(v), Lmask_curve(v), LLmask_curvewav(v), - csthresholdmask(v) + csthresholdmask(v), + //ciecam + visicie(v), + complexcie(v), + expcie(v), + reparcie(v), + sensicie(v), + Autograycie(v), + forcejz(v), + forcebw(v), + qtoj(v), + jabcie(v), + sigmoidqjcie(v), + logjz(v), + sigjz(v), + chjzcie(v), + sourceGraycie(v), + sourceabscie(v), + sursourcie(v), + modecam(v), + modecie(v), + saturlcie(v), + rstprotectcie(v), + chromlcie(v), + huecie(v), + toneMethodcie(v), + ciecurve(v), + toneMethodcie2(v), + ciecurve2(v), + chromjzcie(v), + saturjzcie(v), + huejzcie(v), + softjzcie(v), + strsoftjzcie(v), + thrhjzcie(v), + jzcurve(v), + czcurve(v), + czjzcurve(v), + HHcurvejz(v), + CHcurvejz(v), + LHcurvejz(v), + lightlcie(v), + lightjzcie(v), + lightqcie(v), + contlcie(v), + contjzcie(v), + adapjzcie(v), + jz100(v), + pqremap(v), + pqremapcam16(v), + hljzcie(v), + hlthjzcie(v), + shjzcie(v), + shthjzcie(v), + radjzcie(v), + contthrescie(v), + blackEvjz(v), + whiteEvjz(v), + targetjz(v), + sigmoidldacie(v), + sigmoidthcie(v), + sigmoidblcie(v), + sigmoidldajzcie(v), + sigmoidthjzcie(v), + sigmoidbljzcie(v), + contqcie(v), + colorflcie(v), +/* + lightlzcam(v), + lightqzcam(v), + contlzcam(v), + contqzcam(v), + contthreszcam(v), + colorflzcam(v), + saturzcam(v), + chromzcam(v), +*/ + targabscie(v), + targetGraycie(v), + catadcie(v), + detailcie(v), + surroundcie(v), + enacieMask(v), + CCmaskciecurve(v), + LLmaskciecurve(v), + HHmaskciecurve(v), + blendmaskcie(v), + radmaskcie(v), + sigmalcjz(v), + clarilresjz(v), + claricresjz(v), + clarisoftjz(v), + locwavcurvejz(v), + csthresholdjz(v), + chromaskcie(v), + lapmaskcie(v), + gammaskcie(v), + slomaskcie(v), + Lmaskciecurve(v), + recothrescie(v), + lowthrescie(v), + higthrescie(v), + decaycie(v) { } @@ -7452,6 +8112,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) shortc = v; savrest = v; scopemask = v; + denoichmask = v; lumask = v; // Color & Light visicolor = v; @@ -7460,6 +8121,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) curvactiv = v; lightness = v; reparcol = v; + gamc = v; contrast = v; chroma = v; labgridALow = v; @@ -7535,6 +8197,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) expchroma = v; sensiex = v; structexp = v; + gamex = v; blurexpde = v; strexp = v; angexp = v; @@ -7618,6 +8281,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) complexvibrance = v; saturated = v; pastels = v; + vibgam = v; warm = v; psthreshold = v; protectskins = v; @@ -7694,6 +8358,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) noiselumc = v; noiselumdetail = v; noiselequal = v; + noisegam = v; noisechrof = v; noisechroc = v; noisechrodetail = v; @@ -7811,6 +8476,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) shardamping = v; shariter = v; sharblur = v; + shargam = v; sensisha = v; inverssha = v; // Local Contrast @@ -7828,6 +8494,9 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) residshathr = v; residhi = v; residhithr = v; + gamlc = v; + residgam = v; + residslop = v; residblur = v; levelblur = v; sigmabl = v; @@ -7990,10 +8659,113 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) shadmask = v; str_mask = v; ang_mask = v; - HHhmask_curve =(v); - Lmask_curve =(v); - LLmask_curvewav =(v); + HHhmask_curve = v; + Lmask_curve = v; + LLmask_curvewav = v; csthresholdmask = v; + //ciecam + visicie= v; + complexcie= v; + expcie = v; + reparcie = v; + sensicie = v; + Autograycie = v; + forcejz = v; + forcebw = v; + qtoj = v; + jabcie = v; + sigmoidqjcie = v; + logjz = v; + sigjz = v; + chjzcie = v; + sourceGraycie = v; + sourceabscie = v; + sursourcie = v; + modecam = v; + modecie = v; + saturlcie = v; + rstprotectcie = v; + chromlcie = v; + huecie = v; + toneMethodcie = v; + ciecurve = v; + toneMethodcie2 = v; + ciecurve2 = v; + chromjzcie = v; + saturjzcie = v; + huejzcie = v; + softjzcie = v; + strsoftjzcie = v; + thrhjzcie = v; + jzcurve = v; + czcurve = v; + czjzcurve = v; + HHcurvejz = v; + CHcurvejz = v; + LHcurvejz = v; + lightlcie = v; + lightjzcie = v; + lightqcie = v; + contlcie = v; + contjzcie = v; + adapjzcie = v; + jz100 = v; + pqremap = v; + pqremapcam16 = v; + hljzcie = v; + hlthjzcie = v; + shjzcie = v; + shthjzcie = v; + radjzcie = v; + contthrescie = v; + blackEvjz = v; + whiteEvjz = v; + targetjz = v; + sigmoidldacie = v; + sigmoidthcie = v; + sigmoidblcie = v; + sigmoidldajzcie = v; + sigmoidthjzcie = v; + sigmoidbljzcie = v; + contqcie = v; + colorflcie = v; +/* + lightlzcam = v; + lightqzcam = v; + contlzcam = v; + contqzcam = v; + contthreszcam = v; + colorflzcam = v; + saturzcam = v; + chromzcam = v; +*/ + targabscie = v; + targetGraycie = v; + catadcie = v; + detailcie = v; + surroundcie = v; + enacieMask = v; + CCmaskciecurve = v; + LLmaskciecurve = v; + HHmaskciecurve = v; + blendmaskcie = v; + radmaskcie = v; + sigmalcjz = v; + clarilresjz = v; + claricresjz = v; + clarisoftjz = v; + locwavcurvejz = v; + csthresholdjz = v; + chromaskcie = v; + lapmaskcie = v; + gammaskcie = v; + slomaskcie = v; + Lmaskciecurve = v; + recothrescie = v; + lowthrescie = v; + higthrescie = v; + decaycie = v; + } bool CaptureSharpeningParamsEdited::isUnchanged() const diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index da96d8f93..2950d1b6c 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -431,6 +431,7 @@ public: bool shortc; bool savrest; bool scopemask; + bool denoichmask; bool lumask; // Color & Light bool visicolor; @@ -439,6 +440,7 @@ public: bool curvactiv; bool lightness; bool reparcol; + bool gamc; bool contrast; bool chroma; bool labgridALow; @@ -514,6 +516,7 @@ public: bool expchroma; bool sensiex; bool structexp; + bool gamex; bool blurexpde; bool strexp; bool angexp; @@ -593,6 +596,7 @@ public: bool complexvibrance; bool saturated; bool pastels; + bool vibgam; bool warm; bool psthreshold; bool protectskins; @@ -669,6 +673,7 @@ public: bool noiselumc; bool noiselumdetail; bool noiselequal; + bool noisegam; bool noisechrof; bool noisechroc; bool noisechrodetail; @@ -787,6 +792,7 @@ public: bool shardamping; bool shariter; bool sharblur; + bool shargam; bool sensisha; bool inverssha; // Local Contrast @@ -804,6 +810,9 @@ public: bool residshathr; bool residhi; bool residhithr; + bool gamlc; + bool residgam; + bool residslop; bool residblur; bool levelblur; bool sigmabl; @@ -966,6 +975,108 @@ public: bool Lmask_curve; bool LLmask_curvewav; bool csthresholdmask; + //locallabcie + bool visicie; + bool complexcie; + bool expcie; + bool reparcie; + bool sensicie; + bool Autograycie; + bool forcejz; + bool forcebw; + bool qtoj; + bool jabcie; + bool sigmoidqjcie; + bool logjz; + bool sigjz; + bool chjzcie; + bool sourceGraycie; + bool sourceabscie; + bool sursourcie; + bool modecam; + bool modecie; + bool saturlcie; + bool rstprotectcie; + bool chromlcie; + bool huecie; + bool toneMethodcie; + bool ciecurve; + bool toneMethodcie2; + bool ciecurve2; + bool chromjzcie; + bool saturjzcie; + bool huejzcie; + bool softjzcie; + bool strsoftjzcie; + bool thrhjzcie; + bool jzcurve; + bool czcurve; + bool czjzcurve; + bool HHcurvejz; + bool CHcurvejz; + bool LHcurvejz; + bool lightlcie; + bool lightjzcie; + bool lightqcie; + bool contlcie; + bool contjzcie; + bool adapjzcie; + bool jz100; + bool pqremap; + bool pqremapcam16; + bool hljzcie; + bool hlthjzcie; + bool shjzcie; + bool shthjzcie; + bool radjzcie; + bool contthrescie; + bool blackEvjz; + bool whiteEvjz; + bool targetjz; + bool sigmoidldacie; + bool sigmoidthcie; + bool sigmoidblcie; + bool sigmoidldajzcie; + bool sigmoidthjzcie; + bool sigmoidbljzcie; + bool contqcie; + bool colorflcie; +/* + bool lightlzcam; + bool lightqzcam; + bool contlzcam; + bool contqzcam; + bool contthreszcam; + bool colorflzcam; + bool saturzcam; + bool chromzcam; +*/ + bool targabscie; + bool targetGraycie; + bool catadcie; + bool detailcie; + bool surroundcie; + bool enacieMask; + bool CCmaskciecurve; + bool LLmaskciecurve; + bool HHmaskciecurve; + bool blendmaskcie; + bool radmaskcie; + bool sigmalcjz; + bool clarilresjz; + bool claricresjz; + bool clarisoftjz; + bool locwavcurvejz; + bool csthresholdjz; + bool chromaskcie; + bool lapmaskcie; + bool gammaskcie; + bool slomaskcie; + bool Lmaskciecurve; + bool recothrescie; + bool lowthrescie; + bool higthrescie; + bool decaycie; LocallabSpotEdited(bool v); diff --git a/rtgui/toolpanelcoord.cc b/rtgui/toolpanelcoord.cc index 00fcb208d..2c506710f 100644 --- a/rtgui/toolpanelcoord.cc +++ b/rtgui/toolpanelcoord.cc @@ -555,12 +555,12 @@ void ToolPanelCoordinator::panelChanged(const rtengine::ProcEvent& event, const ipc->setLocallabMaskVisibility(maskStruc.previewDeltaE, maskStruc.colorMask, maskStruc.colorMaskinv, maskStruc.expMask, maskStruc.expMaskinv, maskStruc.SHMask, maskStruc.SHMaskinv, maskStruc.vibMask, maskStruc.softMask, maskStruc.blMask, maskStruc.tmMask, maskStruc.retiMask, maskStruc.sharMask, - maskStruc.lcMask, maskStruc.cbMask, maskStruc.logMask, maskStruc.maskMask); + maskStruc.lcMask, maskStruc.cbMask, maskStruc.logMask, maskStruc.maskMask, maskStruc.cieMask); } else if (event == rtengine::EvLocallabSpotCreated || event == rtengine::EvLocallabSpotSelectedWithMask || event == rtengine::EvLocallabSpotDeleted || event == rtengine::Evlocallabshowreset || event == rtengine::EvlocallabToolRemovedWithRefresh) { locallab->resetMaskVisibility(); - ipc->setLocallabMaskVisibility(false, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + ipc->setLocallabMaskVisibility(false, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); } ipc->endUpdateParams(changeFlags); // starts the IPC processing @@ -670,7 +670,7 @@ void ToolPanelCoordinator::profileChange( // Reset Locallab mask visibility locallab->resetMaskVisibility(); - ipc->setLocallabMaskVisibility(false, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + ipc->setLocallabMaskVisibility(false, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); // start the IPC processing if (filterRawRefresh) {