From fce2d61b0cf58064e333041a7e9e9099d83b6090 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Tue, 24 Jul 2018 17:00:54 +0200 Subject: [PATCH 001/122] moved softlight later in the pipeline Gives a better result, more suitable to the final fine-tuning --- rtengine/dcrop.cc | 2 ++ rtengine/improccoordinator.cc | 3 +- rtengine/improcfun.cc | 2 +- rtengine/improcfun.h | 2 +- rtengine/ipsoftlight.cc | 63 ++++++++++++++++++----------------- rtengine/rtthumbnail.cc | 2 ++ rtengine/simpleprocess.cc | 2 ++ rtgui/softlight.cc | 4 +-- 8 files changed, 44 insertions(+), 36 deletions(-) diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 3b1ebfdab..731eca086 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -1011,6 +1011,8 @@ void Crop::update(int todo) parent->ipf.ip_wavelet(labnCrop, labnCrop, kall, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, parent->wavclCurve, skip); } + parent->ipf.softLight(labnCrop); + // } // } diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 832d193a2..84c315ac4 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -782,7 +782,8 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) } - + ipf.softLight(nprevl); + if (params.colorappearance.enabled) { //L histo and Chroma histo for ciecam // histogram well be for Lab (Lch) values, because very difficult to do with J,Q, M, s, C diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 7d9d080e2..57475af9c 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -3186,7 +3186,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer } } - softLight(rtemp, gtemp, btemp, istart, jstart, tW, tH, TS); + //softLight(rtemp, gtemp, btemp, istart, jstart, tW, tH, TS); if (!blackwhite) { if (editImgFloat || editWhatever) { diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index a97ecef40..066d1e306 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -343,7 +343,7 @@ public: void localContrast(LabImage *lab); void colorToningLabGrid(LabImage *lab, int xstart, int xend, int ystart, int yend, bool MultiThread); void shadowsHighlights(LabImage *lab); - void softLight(float *red, float *green, float *blue, int istart, int jstart, int tW, int tH, int TS); + void softLight(LabImage *lab); Image8* lab2rgb(LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm, bool consider_histogram_settings = true); Imagefloat* lab2rgbOut(LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm); diff --git a/rtengine/ipsoftlight.cc b/rtengine/ipsoftlight.cc index 35bf9577a..74fb543aa 100644 --- a/rtengine/ipsoftlight.cc +++ b/rtengine/ipsoftlight.cc @@ -26,48 +26,49 @@ namespace rtengine { -void ImProcFunctions::softLight(float *red, float *green, float *blue, int istart, int jstart, int tW, int tH, int TS) +namespace { + +inline float sl(float blend, float x) +{ + if (!OOG(x)) { + const float orig = 1.f - blend; + float v = Color::gamma_srgb(x) / MAXVALF; + // Pegtop's formula from + // https://en.wikipedia.org/wiki/Blend_modes#Soft_Light + float v2 = v * v; + float v22 = v2 * 2.f; + v = v2 + v22 - v22 * v; + x = blend * Color::igamma_srgb(v * MAXVALF) + orig * x; + } + return x; +} + +} // namespace + + +void ImProcFunctions::softLight(LabImage *lab) { if (!params->softlight.enabled || !params->softlight.strength) { return; } + Imagefloat working(lab->W, lab->H); + lab2rgb(*lab, working, params->icm.workingProfile); + const float blend = params->softlight.strength / 100.f; - const float orig = 1.f - blend; - - const auto apply = - [=](float x) -> float - { - if (!OOG(x)) { - float v = Color::gamma_srgb(x) / MAXVALF; - // Pegtop's formula from - // https://en.wikipedia.org/wiki/Blend_modes#Soft_Light - float v2 = v * v; - float v22 = v2 * 2.f; - v = v2 + v22 - v22 * v; - x = blend * Color::igamma_srgb(v * MAXVALF) + orig * x; - } - return x; - }; #ifdef _OPENMP - #pragma omp parallel if (multiThread) + #pragma omp parallel for #endif - { - int ti = 0; -#ifdef _OPENMP - #pragma omp for -#endif - for (int i = istart; i < tH; i++) { - for (int j = jstart, tj = 0; j < tW; j++, tj++) { - const int idx = ti * TS + tj; - red[idx] = apply(red[idx]); - green[idx] = apply(green[idx]); - blue[idx] = apply(blue[idx]); - } - ++ti; + for (int y = 0; y < working.getHeight(); ++y) { + for (int x = 0; x < working.getWidth(); ++x) { + working.r(y, x) = sl(blend, working.r(y, x)); + working.g(y, x) = sl(blend, working.g(y, x)); + working.b(y, x) = sl(blend, working.b(y, x)); } } + + rgb2lab(working, *lab, params->icm.workingProfile); } } // namespace rtengine diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index 79dee36bf..afd8836a1 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -1368,6 +1368,8 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT ipf.EPDToneMap (labView, 5, 6); } + ipf.softLight(labView); + if (params.colorappearance.enabled) { CurveFactory::curveLightBrightColor ( params.colorappearance.curve, diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index fbee20f44..b74c11d32 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -1133,6 +1133,8 @@ private: wavCLVCurve.Reset(); + ipf.softLight(labView); + //Colorappearance and tone-mapping associated int f_w = 1, f_h = 1; diff --git a/rtgui/softlight.cc b/rtgui/softlight.cc index 0ee4c64b9..072c45e98 100644 --- a/rtgui/softlight.cc +++ b/rtgui/softlight.cc @@ -28,8 +28,8 @@ using namespace rtengine::procparams; SoftLight::SoftLight(): FoldableToolPanel(this, "softlight", M("TP_SOFTLIGHT_LABEL"), false, true) { auto m = ProcEventMapper::getInstance(); - EvSoftLightEnabled = m->newEvent(RGBCURVE, "HISTORY_MSG_SOFTLIGHT_ENABLED"); - EvSoftLightStrength = m->newEvent(RGBCURVE, "HISTORY_MSG_SOFTLIGHT_STRENGTH"); + EvSoftLightEnabled = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_SOFTLIGHT_ENABLED"); + EvSoftLightStrength = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_SOFTLIGHT_STRENGTH"); strength = Gtk::manage(new Adjuster(M("TP_SOFTLIGHT_STRENGTH"), 0., 100., 1., 30.)); strength->setAdjusterListener(this); From 14ac4babec51e1c4e2cb2e3d09542e5afc5d583c Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Wed, 10 Oct 2018 10:02:06 +0200 Subject: [PATCH 002/122] added haze removal tool Based on the paper: "Single Image Haze Removal Using Dark Channel Prior" by He, Sun and Tang using a guided filter for the "soft matting" of the transmission map --- rtdata/languages/default | 35 ++-- rtengine/CMakeLists.txt | 1 + rtengine/color.h | 4 + rtengine/dcrop.cc | 3 +- rtengine/improccoordinator.cc | 3 +- rtengine/improcfun.h | 1 + rtengine/ipdehaze.cc | 335 ++++++++++++++++++++++++++++++++++ rtengine/procparams.cc | 31 ++++ rtengine/procparams.h | 12 ++ rtengine/rtthumbnail.cc | 1 + rtengine/simpleprocess.cc | 1 + rtengine/tmo_fattal02.cc | 2 +- rtgui/CMakeLists.txt | 1 + rtgui/addsetids.h | 1 + rtgui/batchtoolpanelcoord.cc | 2 + rtgui/dehaze.cc | 115 ++++++++++++ rtgui/dehaze.h | 47 +++++ rtgui/paramsedited.cc | 12 ++ rtgui/paramsedited.h | 9 + rtgui/partialpastedlg.cc | 9 + rtgui/partialpastedlg.h | 3 +- rtgui/preferences.cc | 4 + rtgui/toolpanelcoord.cc | 2 + rtgui/toolpanelcoord.h | 2 + 24 files changed, 617 insertions(+), 19 deletions(-) create mode 100644 rtengine/ipdehaze.cc create mode 100644 rtgui/dehaze.cc create mode 100644 rtgui/dehaze.h diff --git a/rtdata/languages/default b/rtdata/languages/default index 963659884..dcf626948 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -398,7 +398,7 @@ HISTORY_MSG_145;Microcontrast - Uniformity HISTORY_MSG_146;Edge sharpening HISTORY_MSG_147;ES - Luminance only HISTORY_MSG_148;Microcontrast -HISTORY_MSG_149;Microcontrast - 3×3 matrix +HISTORY_MSG_149;Microcontrast - 33 matrix HISTORY_MSG_150;Post-demosaic artifact/noise red. HISTORY_MSG_151;Vibrance HISTORY_MSG_152;Vib - Pastel tones @@ -728,6 +728,8 @@ HISTORY_MSG_492;RGB Curves HISTORY_MSG_493;L*a*b* Adjustments HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength HISTORY_MSG_DUALDEMOSAIC_CONTRAST;AMaZE+VNG4 - Contrast threshold HISTORY_MSG_HISTMATCHING;Auto-matched tone curve HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries @@ -807,7 +809,7 @@ IPTCPANEL_CITY;City IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. IPTCPANEL_COPYHINT;Copy IPTC settings to clipboard. IPTCPANEL_COPYRIGHT;Copyright notice -IPTCPANEL_COPYRIGHTHINT;Enter a Notice on the current owner of the Copyright for this image, such as ©2008 Jane Doe. +IPTCPANEL_COPYRIGHTHINT;Enter a Notice on the current owner of the Copyright for this image, such as 2008 Jane Doe. IPTCPANEL_COUNTRY;Country IPTCPANEL_COUNTRYHINT;Enter the name of the country pictured in this image. IPTCPANEL_CREATOR;Creator @@ -954,6 +956,7 @@ PARTIALPASTE_CROP;Crop PARTIALPASTE_DARKFRAMEAUTOSELECT;Dark-frame auto-selection PARTIALPASTE_DARKFRAMEFILE;Dark-frame file PARTIALPASTE_DEFRINGE;Defringe +PARTIALPASTE_DEHAZE;Haze removal PARTIALPASTE_DETAILGROUP;Detail Settings PARTIALPASTE_DIALOGLABEL;Partial paste processing profile PARTIALPASTE_DIRPYRDENOISE;Noise reduction @@ -1366,9 +1369,9 @@ TP_COARSETRAF_TOOLTIP_ROTLEFT;Rotate left.\n\nShortcuts:\n[ - Multiple Ed TP_COARSETRAF_TOOLTIP_ROTRIGHT;Rotate right.\n\nShortcuts:\n] - Multiple Editor Tabs Mode,\nAlt-] - Single Editor Tab Mode. TP_COARSETRAF_TOOLTIP_VFLIP;Flip vertically. TP_COLORAPP_ADAPTSCENE;Scene absolute luminance -TP_COLORAPP_ADAPTSCENE_TOOLTIP;Absolute luminance of the scene environment (cd/m²).\n1) Calculated from the Exif data:\nShutter speed - ISO speed - F number - camera exposure correction.\n2) Calculated from the raw white point and RT's Exposure Compensation slider. -TP_COLORAPP_ADAPTVIEWING;Viewing absolute luminance (cd/m²) -TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16cd/m²). +TP_COLORAPP_ADAPTSCENE_TOOLTIP;Absolute luminance of the scene environment (cd/m).\n1) Calculated from the Exif data:\nShutter speed - ISO speed - F number - camera exposure correction.\n2) Calculated from the raw white point and RT's Exposure Compensation slider. +TP_COLORAPP_ADAPTVIEWING;Viewing absolute luminance (cd/m) +TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16cd/m). TP_COLORAPP_ADAP_AUTO_TOOLTIP;If the checkbox is checked (recommended) RawTherapee calculates an optimum value from the Exif data.\nTo set the value manually, uncheck the checkbox first. TP_COLORAPP_ALGO;Algorithm TP_COLORAPP_ALGO_ALL;All @@ -1405,7 +1408,7 @@ TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] TP_COLORAPP_GAMUT;Gamut control (L*a*b*) TP_COLORAPP_GAMUT_TOOLTIP;Allow gamut control in L*a*b* mode. TP_COLORAPP_HUE;Hue (h) -TP_COLORAPP_HUE_TOOLTIP;Hue (h) - angle between 0° and 360°. +TP_COLORAPP_HUE_TOOLTIP;Hue (h) - angle between 0 and 360. TP_COLORAPP_LABEL;CIE Color Appearance Model 2002 TP_COLORAPP_LABEL_CAM02;Image Adjustments TP_COLORAPP_LABEL_SCENE;Scene Conditions @@ -1505,6 +1508,8 @@ TP_DARKFRAME_LABEL;Dark-Frame TP_DEFRINGE_LABEL;Defringe TP_DEFRINGE_RADIUS;Radius TP_DEFRINGE_THRESHOLD;Threshold +TP_DEHAZE_LABEL;Haze Removal +TP_DEHAZE_STRENGTH;Strength TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! @@ -1552,16 +1557,16 @@ TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations -TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. +TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Applying three median filter iterations with a 33 window size often leads to better results than using one median filter iteration with a 77 window size. TP_DIRPYRDENOISE_MEDIAN_TYPE;Median type -TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. +TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n33 soft: treats 5 pixels in a 33 pixel window.\n33: treats 9 pixels in a 33 pixel window.\n55 soft: treats 13 pixels in a 55 pixel window.\n55: treats 25 pixels in a 55 pixel window.\n77: treats 49 pixels in a 77 pixel window.\n99: treats 81 pixels in a 99 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. TP_DIRPYRDENOISE_SLI;Slider -TP_DIRPYRDENOISE_TYPE_3X3;3×3 -TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft -TP_DIRPYRDENOISE_TYPE_5X5;5×5 -TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft -TP_DIRPYRDENOISE_TYPE_7X7;7×7 -TP_DIRPYRDENOISE_TYPE_9X9;9×9 +TP_DIRPYRDENOISE_TYPE_3X3;33 +TP_DIRPYRDENOISE_TYPE_3X3SOFT;33 soft +TP_DIRPYRDENOISE_TYPE_5X5;55 +TP_DIRPYRDENOISE_TYPE_5X5SOFT;55 soft +TP_DIRPYRDENOISE_TYPE_7X7;77 +TP_DIRPYRDENOISE_TYPE_9X9;99 TP_DIRPYREQUALIZER_ALGO;Skin Color Range TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts @@ -2005,7 +2010,7 @@ TP_SHARPENING_USM;Unsharp Mask TP_SHARPENMICRO_AMOUNT;Quantity TP_SHARPENMICRO_CONTRAST;Contrast threshold TP_SHARPENMICRO_LABEL;Microcontrast -TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5 +TP_SHARPENMICRO_MATRIX;33 matrix instead of 55 TP_SHARPENMICRO_UNIFORMITY;Uniformity TP_SOFTLIGHT_LABEL;Soft Light TP_SOFTLIGHT_STRENGTH;Strength diff --git a/rtengine/CMakeLists.txt b/rtengine/CMakeLists.txt index 759316e33..f610cc8b0 100644 --- a/rtengine/CMakeLists.txt +++ b/rtengine/CMakeLists.txt @@ -128,6 +128,7 @@ set(RTENGINESOURCEFILES vng4_demosaic_RT.cc ipsoftlight.cc guidedfilter.cc + ipdehaze.cc ) if(LENSFUN_HAS_LOAD_DIRECTORY) diff --git a/rtengine/color.h b/rtengine/color.h index 1e6eef578..b6459adc4 100644 --- a/rtengine/color.h +++ b/rtengine/color.h @@ -205,6 +205,10 @@ public: return r * 0.2126729 + g * 0.7151521 + b * 0.0721750; } + static float rgbLuminance(float r, float g, float b, const double workingspace[3][3]) + { + return r * workingspace[1][0] + g * workingspace[1][1] + b * workingspace[1][2]; + } /** * @brief Convert red/green/blue to L*a*b diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 002747070..d72b7389c 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -692,7 +692,7 @@ void Crop::update(int todo) std::unique_ptr fattalCrop; - if ((todo & M_HDR) && params.fattal.enabled) { + if ((todo & M_HDR) && (params.fattal.enabled || params.dehaze.enabled)) { Imagefloat *f = origCrop; int fw = skips(parent->fw, skip); int fh = skips(parent->fh, skip); @@ -741,6 +741,7 @@ void Crop::update(int todo) } if (need_fattal) { + parent->ipf.dehaze(f); parent->ipf.ToneMapFattal02(f); } diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 298c3fc58..dec7fef91 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -413,12 +413,13 @@ void ImProcCoordinator::updatePreviewImage(int todo, Crop* cropCall) readyphase++; - if ((todo & M_HDR) && params.fattal.enabled) { + if ((todo & M_HDR) && (params.fattal.enabled || params.dehaze.enabled)) { if (fattal_11_dcrop_cache) { delete fattal_11_dcrop_cache; fattal_11_dcrop_cache = nullptr; } + ipf.dehaze(orig_prev); ipf.ToneMapFattal02(orig_prev); if (oprevi != orig_prev) { diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index a97ecef40..216641a45 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -339,6 +339,7 @@ public: void Badpixelscam(CieImage * ncie, double radius, int thresh, int mode, float chrom, bool hotbad); void BadpixelsLab(LabImage * lab, double radius, int thresh, float chrom); + void dehaze(Imagefloat *rgb); void ToneMapFattal02(Imagefloat *rgb); void localContrast(LabImage *lab); void colorToningLabGrid(LabImage *lab, int xstart, int xend, int ystart, int yend, bool MultiThread); diff --git a/rtengine/ipdehaze.cc b/rtengine/ipdehaze.cc new file mode 100644 index 000000000..aed647417 --- /dev/null +++ b/rtengine/ipdehaze.cc @@ -0,0 +1,335 @@ +/* -*- C++ -*- + * + * This file is part of RawTherapee. + * + * Copyright (c) 2018 Alberto Griggio + * + * RawTherapee is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RawTherapee is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RawTherapee. If not, see . + */ + +/* + * Haze removal using the algorithm described in the paper: + * + * Single Image Haze Removal Using Dark Channel Prior + * by He, Sun and Tang + * + * using a guided filter for the "soft matting" of the transmission map + * + */ + +#include "improcfun.h" +#include "guidedfilter.h" +#include "rt_math.h" +#include "rt_algo.h" +#include +#include + +extern Options options; + +namespace rtengine { + +namespace { + +#if 0 +# define DEBUG_DUMP(arr) \ + do { \ + Imagefloat im(arr.width(), arr.height()); \ + const char *out = "/tmp/" #arr ".tif"; \ + for (int y = 0; y < im.getHeight(); ++y) { \ + for (int x = 0; x < im.getWidth(); ++x) { \ + im.r(y, x) = im.g(y, x) = im.b(y, x) = arr[y][x] * 65535.f; \ + } \ + } \ + im.saveTIFF(out, 16); \ + } while (false) +#else +# define DEBUG_DUMP(arr) +#endif + + +int get_dark_channel(const Imagefloat &src, array2D &dst, + int patchsize, float *ambient, bool multithread) +{ + const int w = src.getWidth(); + const int h = src.getHeight(); + + int npatches = 0; + +#ifdef _OPENMP + #pragma omp parallel for if (multithread) +#endif + for (int y = 0; y < src.getHeight(); y += patchsize) { + int pH = std::min(y+patchsize, h); + for (int x = 0; x < src.getWidth(); x += patchsize, ++npatches) { + float val = RT_INFINITY_F; + int pW = std::min(x+patchsize, w); + for (int yy = y; yy < pH; ++yy) { + float yval = RT_INFINITY_F; + for (int xx = x; xx < pW; ++xx) { + float r = src.r(yy, xx); + float g = src.g(yy, xx); + float b = src.b(yy, xx); + if (ambient) { + r /= ambient[0]; + g /= ambient[1]; + b /= ambient[2]; + } + yval = min(yval, r, g, b); + } + val = min(val, yval); + } + for (int yy = y; yy < pH; ++yy) { + std::fill(dst[yy]+x, dst[yy]+pW, val); + } + for (int yy = y; yy < pH; ++yy) { + for (int xx = x; xx < pW; ++xx) { + float r = src.r(yy, xx); + float g = src.g(yy, xx); + float b = src.b(yy, xx); + if (ambient) { + r /= ambient[0]; + g /= ambient[1]; + b /= ambient[2]; + } + float l = min(r, g, b); + if (l >= 2.f * val) { + dst[yy][xx] = l; + } + } + } + } + } + + return npatches; +} + + +int estimate_ambient_light(const Imagefloat *img, const array2D &dark, const array2D &Y, int patchsize, int npatches, float ambient[3]) +{ + const int W = img->getWidth(); + const int H = img->getHeight(); + + const auto get_percentile = + [](std::priority_queue &q, float prcnt) -> float + { + size_t n = LIM(q.size() * prcnt, 1, q.size()); + while (q.size() > n) { + q.pop(); + } + return q.top(); + }; + + float lim = RT_INFINITY_F; + { + std::priority_queue p; + for (int y = 0; y < H; y += patchsize) { + for (int x = 0; x < W; x += patchsize) { + p.push(dark[y][x]); + } + } + lim = get_percentile(p, 0.95); + } + + std::vector> patches; + patches.reserve(npatches); + + for (int y = 0; y < H; y += patchsize) { + for (int x = 0; x < W; x += patchsize) { + if (dark[y][x] >= lim) { + patches.push_back(std::make_pair(x, y)); + } + } + } + + if (options.rtSettings.verbose) { + std::cout << "dehaze: computing ambient light from " << patches.size() + << " patches" << std::endl; + } + + { + std::priority_queue l; + + for (auto &p : patches) { + const int pW = std::min(p.first+patchsize, W); + const int pH = std::min(p.second+patchsize, H); + + for (int y = p.second; y < pH; ++y) { + for (int x = p.first; x < pW; ++x) { + l.push(Y[y][x]); + } + } + } + + lim = get_percentile(l, 0.95); + } + + double rr = 0, gg = 0, bb = 0; + int n = 0; + for (auto &p : patches) { + const int pW = std::min(p.first+patchsize, W); + const int pH = std::min(p.second+patchsize, H); + + for (int y = p.second; y < pH; ++y) { + for (int x = p.first; x < pW; ++x) { + if (Y[y][x] >= lim) { + float r = img->r(y, x); + float g = img->g(y, x); + float b = img->b(y, x); + rr += r; + gg += g; + bb += b; + ++n; + } + } + } + } + ambient[0] = rr / n; + ambient[1] = gg / n; + ambient[2] = bb / n; + + return n; +} + + +void get_luminance(Imagefloat *img, array2D &Y, TMatrix ws, bool multithread) +{ + const int W = img->getWidth(); + const int H = img->getHeight(); + +#ifdef _OPENMP + #pragma omp parallel for if (multithread) +#endif + for (int y = 0; y < H; ++y) { + for (int x = 0; x < W; ++x) { + Y[y][x] = Color::rgbLuminance(img->r(y, x), img->g(y, x), img->b(y, x), ws); + } + } +} + + +} // namespace + + +void ImProcFunctions::dehaze(Imagefloat *img) +{ + if (!params->dehaze.enabled) { + return; + } + + img->normalizeFloatTo1(); + + const int W = img->getWidth(); + const int H = img->getHeight(); + const float strength = LIM01(float(params->dehaze.strength) / 100.f * 0.9f); + + if (options.rtSettings.verbose) { + std::cout << "dehaze: strength = " << strength << std::endl; + } + + array2D dark(W, H); + const int patchsize = std::max(W / 200, 2); + int npatches = get_dark_channel(*img, dark, patchsize, nullptr, multiThread); + DEBUG_DUMP(dark); + + TMatrix ws = ICCStore::getInstance()->workingSpaceMatrix(params->icm.workingProfile); + array2D Y(W, H); + get_luminance(img, Y, ws, multiThread); + + float ambient[3]; + int n = estimate_ambient_light(img, dark, Y, patchsize, npatches, ambient); + float ambient_Y = Color::rgbLuminance(ambient[0], ambient[1], ambient[2], ws); + + if (options.rtSettings.verbose) { + std::cout << "dehaze: ambient light is " + << ambient[0] << ", " << ambient[1] << ", " << ambient[2] + << " (average of " << n << ")" + << std::endl; + std::cout << " ambient luminance is " << ambient_Y << std::endl; + } + + if (min(ambient[0], ambient[1], ambient[2]) < 0.01f) { + if (options.rtSettings.verbose) { + std::cout << "dehaze: no haze detected" << std::endl; + } + img->normalizeFloatTo65535(); + return; // probably no haze at all + } + + array2D &t_tilde = dark; + get_dark_channel(*img, dark, patchsize, ambient, multiThread); + DEBUG_DUMP(t_tilde); + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int y = 0; y < H; ++y) { + for (int x = 0; x < W; ++x) { + dark[y][x] = 1.f - strength * dark[y][x]; + } + } + + const int radius = patchsize * 2; + const float epsilon = 2.5e-4; + array2D &t = t_tilde; + + guidedFilter(Y, t_tilde, t, radius, epsilon, multiThread); + + DEBUG_DUMP(t); + + const float t0 = 0.01; +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int y = 0; y < H; ++y) { + for (int x = 0; x < W; ++x) { + float mt = std::max(t[y][x], t0); + float r = (img->r(y, x) - ambient[0]) / mt + ambient[0]; + float g = (img->g(y, x) - ambient[1]) / mt + ambient[1]; + float b = (img->b(y, x) - ambient[2]) / mt + ambient[2]; + img->r(y, x) = r; + img->g(y, x) = g; + img->b(y, x) = b; + } + } + + float oldmed; + findMinMaxPercentile(Y, Y.width() * Y.height(), 0.5, oldmed, 0.5, oldmed, multiThread); + + get_luminance(img, Y, ws, multiThread); + float newmed; + + findMinMaxPercentile(Y, Y.width() * Y.height(), 0.5, newmed, 0.5, newmed, multiThread); + + if (newmed > 1e-5f) { + const float f1 = oldmed / newmed; + const float f = f1 * 65535.f; +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int y = 0; y < H; ++y) { + for (int x = 0; x < W; ++x) { + float r = img->r(y, x); + float g = img->g(y, x); + float b = img->b(y, x); + float h, s, l; + Color::rgb2hslfloat(r * f, g * f, b * f, h, s, l); + s = LIM01(s / f1); + Color::hsl2rgbfloat(h, s, l, img->r(y, x), img->g(y, x), img->b(y, x)); + } + } + } +} + + +} // namespace rtengine diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 4d0c7aed0..ceace7c3b 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2373,6 +2373,26 @@ bool SoftLightParams::operator !=(const SoftLightParams& other) const return !(*this == other); } + +DehazeParams::DehazeParams() : + enabled(false), + strength(50) +{ +} + +bool DehazeParams::operator ==(const DehazeParams& other) const +{ + return + enabled == other.enabled + && strength == other.strength; +} + +bool DehazeParams::operator !=(const DehazeParams& other) const +{ + return !(*this == other); +} + + RAWParams::BayerSensor::BayerSensor() : method(getMethodString(Method::AMAZE)), border(4), @@ -2727,6 +2747,8 @@ void ProcParams::setDefaults() softlight = SoftLightParams(); + dehaze = DehazeParams(); + raw = RAWParams(); metadata = MetaDataParams(); @@ -3037,6 +3059,10 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->defringe.threshold, "Defringing", "Threshold", defringe.threshold, keyFile); saveToKeyfile(!pedited || pedited->defringe.huecurve, "Defringing", "HueCurve", defringe.huecurve, keyFile); +// Dehaze + saveToKeyfile(!pedited || pedited->dehaze.enabled, "Dehaze", "Enabled", dehaze.enabled, keyFile); + saveToKeyfile(!pedited || pedited->dehaze.strength, "Dehaze", "Strength", dehaze.strength, keyFile); + // Directional pyramid denoising saveToKeyfile(!pedited || pedited->dirpyrDenoise.enabled, "Directional Pyramid Denoising", "Enabled", dirpyrDenoise.enabled, keyFile); saveToKeyfile(!pedited || pedited->dirpyrDenoise.enhance, "Directional Pyramid Denoising", "Enhance", dirpyrDenoise.enhance, keyFile); @@ -4618,6 +4644,11 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "SoftLight", "Strength", pedited, softlight.strength, pedited->softlight.strength); } + if (keyFile.has_group("Dehaze")) { + assignFromKeyfile(keyFile, "Dehaze", "Enabled", pedited, dehaze.enabled, pedited->dehaze.enabled); + assignFromKeyfile(keyFile, "Dehaze", "Strength", pedited, dehaze.strength, pedited->dehaze.strength); + } + if (keyFile.has_group("Film Simulation")) { assignFromKeyfile(keyFile, "Film Simulation", "Enabled", pedited, filmSimulation.enabled, pedited->filmSimulation.enabled); assignFromKeyfile(keyFile, "Film Simulation", "ClutFilename", pedited, filmSimulation.clutFilename, pedited->filmSimulation.clutFilename); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 700c6271c..19fe0a376 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1227,6 +1227,17 @@ struct SoftLightParams { }; +struct DehazeParams { + bool enabled; + int strength; + + DehazeParams(); + + bool operator==(const DehazeParams &other) const; + bool operator!=(const DehazeParams &other) const; +}; + + /** * Parameters for RAW demosaicing, common to all sensor type */ @@ -1438,6 +1449,7 @@ public: HSVEqualizerParams hsvequalizer; ///< hsv wavelet parameters FilmSimulationParams filmSimulation; ///< film simulation parameters SoftLightParams softlight; ///< softlight parameters + DehazeParams dehaze; ///< dehaze parameters int rank; ///< Custom image quality ranking int colorlabel; ///< Custom color label bool inTrash; ///< Marks deleted image diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index 79dee36bf..bb710ee83 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -1200,6 +1200,7 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT ipf.firstAnalysis (baseImg, params, hist16); + ipf.dehaze(baseImg); if (params.fattal.enabled) { ipf.ToneMapFattal02(baseImg); } diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index fbee20f44..0846eacbd 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -854,6 +854,7 @@ private: ipf.firstAnalysis (baseImg, params, hist16); + ipf.dehaze(baseImg); if (params.fattal.enabled) { ipf.ToneMapFattal02(baseImg); } diff --git a/rtengine/tmo_fattal02.cc b/rtengine/tmo_fattal02.cc index dc7826501..351d60bc9 100644 --- a/rtengine/tmo_fattal02.cc +++ b/rtengine/tmo_fattal02.cc @@ -952,7 +952,7 @@ inline void rescale_nearest (const Array2Df &src, Array2Df &dst, bool multithrea inline float luminance (float r, float g, float b, TMatrix ws) { - return r * ws[1][0] + g * ws[1][1] + b * ws[1][2]; + return Color::rgbLuminance(r, g, b, ws); } diff --git a/rtgui/CMakeLists.txt b/rtgui/CMakeLists.txt index 8150fbce3..434e8187e 100644 --- a/rtgui/CMakeLists.txt +++ b/rtgui/CMakeLists.txt @@ -156,6 +156,7 @@ set(NONCLISOURCEFILES metadatapanel.cc labgrid.cc softlight.cc + dehaze.cc ) include_directories(BEFORE "${CMAKE_CURRENT_BINARY_DIR}") diff --git a/rtgui/addsetids.h b/rtgui/addsetids.h index 8cf39aa29..1d9c621eb 100644 --- a/rtgui/addsetids.h +++ b/rtgui/addsetids.h @@ -142,6 +142,7 @@ enum { ADDSET_BAYER_DUALDEMOZCONTRAST, ADDSET_XTRANS_FALSE_COLOR_SUPPRESSION, ADDSET_SOFTLIGHT_STRENGTH, + ADDSET_DEHAZE_STRENGTH, ADDSET_PARAM_NUM // THIS IS USED AS A DELIMITER!! }; diff --git a/rtgui/batchtoolpanelcoord.cc b/rtgui/batchtoolpanelcoord.cc index b31f41e4f..13b1f6677 100644 --- a/rtgui/batchtoolpanelcoord.cc +++ b/rtgui/batchtoolpanelcoord.cc @@ -202,6 +202,7 @@ void BatchToolPanelCoordinator::initSession () colortoning->setAdjusterBehavior (options.baBehav[ADDSET_COLORTONING_SPLIT], options.baBehav[ADDSET_COLORTONING_SATTHRESHOLD], options.baBehav[ADDSET_COLORTONING_SATOPACITY], options.baBehav[ADDSET_COLORTONING_STRENGTH], options.baBehav[ADDSET_COLORTONING_BALANCE]); filmSimulation->setAdjusterBehavior(options.baBehav[ADDSET_FILMSIMULATION_STRENGTH]); softlight->setAdjusterBehavior(options.baBehav[ADDSET_SOFTLIGHT_STRENGTH]); + dehaze->setAdjusterBehavior(options.baBehav[ADDSET_DEHAZE_STRENGTH]); retinex->setAdjusterBehavior (options.baBehav[ADDSET_RETI_STR], options.baBehav[ADDSET_RETI_NEIGH], options.baBehav[ADDSET_RETI_LIMD], options.baBehav[ADDSET_RETI_OFFS], options.baBehav[ADDSET_RETI_VART], options.baBehav[ADDSET_RETI_GAM], options.baBehav[ADDSET_RETI_SLO]); chmixer->setAdjusterBehavior (options.baBehav[ADDSET_CHMIXER] ); @@ -292,6 +293,7 @@ void BatchToolPanelCoordinator::initSession () if (options.baBehav[ADDSET_COLORTONING_STRENGTH]) { pparams.colorToning.strength = 0; } if (options.baBehav[ADDSET_FILMSIMULATION_STRENGTH]) { pparams.filmSimulation.strength = 0; } if (options.baBehav[ADDSET_SOFTLIGHT_STRENGTH]) { pparams.softlight.strength = 0; } + if (options.baBehav[ADDSET_DEHAZE_STRENGTH]) { pparams.dehaze.strength = 0; } if (options.baBehav[ADDSET_ROTATE_DEGREE]) { pparams.rotate.degree = 0; } if (options.baBehav[ADDSET_RESIZE_SCALE]) { pparams.resize.scale = 0; } if (options.baBehav[ADDSET_DIST_AMOUNT]) { pparams.distortion.amount = 0; } diff --git a/rtgui/dehaze.cc b/rtgui/dehaze.cc new file mode 100644 index 000000000..6f4814e55 --- /dev/null +++ b/rtgui/dehaze.cc @@ -0,0 +1,115 @@ +/** -*- C++ -*- + * + * This file is part of RawTherapee. + * + * Copyright (c) 2018 Alberto Griggio + * + * RawTherapee is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RawTherapee is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RawTherapee. If not, see . + */ +#include "dehaze.h" +#include "eventmapper.h" +#include +#include + +using namespace rtengine; +using namespace rtengine::procparams; + +Dehaze::Dehaze(): FoldableToolPanel(this, "dehaze", M("TP_DEHAZE_LABEL"), false, true) +{ + auto m = ProcEventMapper::getInstance(); + EvDehazeEnabled = m->newEvent(HDR, "HISTORY_MSG_DEHAZE_ENABLED"); + EvDehazeStrength = m->newEvent(HDR, "HISTORY_MSG_DEHAZE_STRENGTH"); + + strength = Gtk::manage(new Adjuster(M("TP_DEHAZE_STRENGTH"), 0., 100., 1., 50.)); + strength->setAdjusterListener(this); + strength->show(); + + pack_start(*strength); +} + + +void Dehaze::read(const ProcParams *pp, const ParamsEdited *pedited) +{ + disableListener(); + + if (pedited) { + strength->setEditedState(pedited->dehaze.strength ? Edited : UnEdited); + set_inconsistent(multiImage && !pedited->dehaze.enabled); + } + + setEnabled(pp->dehaze.enabled); + strength->setValue(pp->dehaze.strength); + + enableListener(); +} + + +void Dehaze::write(ProcParams *pp, ParamsEdited *pedited) +{ + pp->dehaze.strength = strength->getValue(); + pp->dehaze.enabled = getEnabled(); + + if (pedited) { + pedited->dehaze.strength = strength->getEditedState(); + pedited->dehaze.enabled = !get_inconsistent(); + } +} + +void Dehaze::setDefaults(const ProcParams *defParams, const ParamsEdited *pedited) +{ + strength->setDefault(defParams->dehaze.strength); + + if (pedited) { + strength->setDefaultEditedState(pedited->dehaze.strength ? Edited : UnEdited); + } else { + strength->setDefaultEditedState(Irrelevant); + } +} + + +void Dehaze::adjusterChanged(Adjuster* a, double newval) +{ + if (listener && getEnabled()) { + listener->panelChanged(EvDehazeStrength, a->getTextValue()); + } +} + + +void Dehaze::enabledChanged () +{ + if (listener) { + if (get_inconsistent()) { + listener->panelChanged(EvDehazeEnabled, M("GENERAL_UNCHANGED")); + } else if (getEnabled()) { + listener->panelChanged(EvDehazeEnabled, M("GENERAL_ENABLED")); + } else { + listener->panelChanged(EvDehazeEnabled, M("GENERAL_DISABLED")); + } + } +} + + +void Dehaze::setBatchMode(bool batchMode) +{ + ToolPanel::setBatchMode(batchMode); + + strength->showEditedCB(); +} + + +void Dehaze::setAdjusterBehavior(bool strengthAdd) +{ + strength->setAddMode(strengthAdd); +} + diff --git a/rtgui/dehaze.h b/rtgui/dehaze.h new file mode 100644 index 000000000..3617f13ea --- /dev/null +++ b/rtgui/dehaze.h @@ -0,0 +1,47 @@ +/** -*- C++ -*- + * + * This file is part of RawTherapee. + * + * Copyright (c) 2018 Alberto Griggio + * + * RawTherapee is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RawTherapee is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RawTherapee. If not, see . + */ +#pragma once + +#include +#include "adjuster.h" +#include "toolpanel.h" + +class Dehaze: public ToolParamBlock, public AdjusterListener, public FoldableToolPanel +{ +private: + Adjuster *strength; + + rtengine::ProcEvent EvDehazeEnabled; + rtengine::ProcEvent EvDehazeStrength; + +public: + + Dehaze(); + + void read(const rtengine::procparams::ProcParams *pp, const ParamsEdited *pedited=nullptr); + void write(rtengine::procparams::ProcParams *pp, ParamsEdited *pedited=nullptr); + void setDefaults(const rtengine::procparams::ProcParams *defParams, const ParamsEdited *pedited=nullptr); + void setBatchMode(bool batchMode); + + void adjusterChanged(Adjuster *a, double newval); + void enabledChanged(); + void setAdjusterBehavior(bool strengthAdd); +}; + diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 342d9adf9..fef8da8e6 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -566,6 +566,8 @@ void ParamsEdited::set(bool v) filmSimulation.strength = v; softlight.enabled = v; softlight.strength = v; + dehaze.enabled = v; + dehaze.strength = v; metadata.mode = v; exif = v; @@ -1119,6 +1121,8 @@ void ParamsEdited::initFrom(const std::vector& filmSimulation.strength = filmSimulation.strength && p.filmSimulation.strength == other.filmSimulation.strength; softlight.enabled = softlight.enabled && p.softlight.enabled == other.softlight.enabled; softlight.strength = softlight.strength && p.softlight.strength == other.softlight.strength; + dehaze.enabled = dehaze.enabled && p.dehaze.enabled == other.dehaze.enabled; + dehaze.strength = dehaze.strength && p.dehaze.strength == other.dehaze.strength; metadata.mode = metadata.mode && p.metadata.mode == other.metadata.mode; // How the hell can we handle that??? @@ -3112,6 +3116,14 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng if (softlight.strength) { toEdit.softlight.strength = dontforceSet && options.baBehav[ADDSET_SOFTLIGHT_STRENGTH] ? toEdit.softlight.strength + mods.softlight.strength : mods.softlight.strength; } + + if (dehaze.enabled) { + toEdit.dehaze.enabled = mods.dehaze.enabled; + } + + if (dehaze.strength) { + toEdit.dehaze.strength = dontforceSet && options.baBehav[ADDSET_DEHAZE_STRENGTH] ? toEdit.dehaze.strength + mods.dehaze.strength : mods.dehaze.strength; + } if (metadata.mode) { toEdit.metadata.mode = mods.metadata.mode; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 177b05d85..6a2076032 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -724,6 +724,14 @@ public: bool strength; }; +class DehazeParamsEdited +{ +public: + bool enabled; + bool strength; +}; + + class RAWParamsEdited { @@ -865,6 +873,7 @@ public: HSVEqualizerParamsEdited hsvequalizer; FilmSimulationParamsEdited filmSimulation; SoftLightParamsEdited softlight; + DehazeParamsEdited dehaze; MetaDataParamsEdited metadata; bool exif; bool iptc; diff --git a/rtgui/partialpastedlg.cc b/rtgui/partialpastedlg.cc index 6b192dba9..065deef6a 100644 --- a/rtgui/partialpastedlg.cc +++ b/rtgui/partialpastedlg.cc @@ -65,6 +65,7 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren dirpyrden = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_DIRPYRDENOISE"))); defringe = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_DEFRINGE"))); dirpyreq = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_DIRPYREQUALIZER"))); + dehaze = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_DEHAZE")) ); // Advanced Settings: retinex = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RETINEX"))); @@ -168,6 +169,7 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren vboxes[1]->pack_start (*dirpyrden, Gtk::PACK_SHRINK, 2); vboxes[1]->pack_start (*defringe, Gtk::PACK_SHRINK, 2); vboxes[1]->pack_start (*dirpyreq, Gtk::PACK_SHRINK, 2); + vboxes[1]->pack_start (*dehaze, Gtk::PACK_SHRINK, 2); //COLOR vboxes[2]->pack_start (*color, Gtk::PACK_SHRINK, 2); @@ -327,6 +329,7 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren dirpyrdenConn = dirpyrden->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true)); defringeConn = defringe->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true)); dirpyreqConn = dirpyreq->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true)); + dehazeConn = dehaze->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true)); // Advanced Settings: retinexConn = retinex->signal_toggled().connect (sigc::bind (sigc::mem_fun(*advanced, &Gtk::CheckButton::set_inconsistent), true)); @@ -534,6 +537,7 @@ void PartialPasteDlg::detailToggled () ConnectionBlocker dirpyrdenBlocker(dirpyrdenConn); ConnectionBlocker defringeBlocker(defringeConn); ConnectionBlocker dirpyreqBlocker(dirpyreqConn); + ConnectionBlocker dehazeBlocker(dehazeConn); detail->set_inconsistent (false); @@ -545,6 +549,7 @@ void PartialPasteDlg::detailToggled () dirpyrden->set_active (detail->get_active ()); defringe->set_active (detail->get_active ()); dirpyreq->set_active (detail->get_active ()); + dehaze->set_active (detail->get_active ()); } void PartialPasteDlg::advancedToggled () @@ -762,6 +767,10 @@ void PartialPasteDlg::applyPaste (rtengine::procparams::ProcParams* dstPP, Param filterPE.softlight = falsePE.softlight; } + if (!dehaze->get_active ()) { + filterPE.dehaze = falsePE.dehaze; + } + if (!rgbcurves->get_active ()) { filterPE.rgbCurves = falsePE.rgbCurves; } diff --git a/rtgui/partialpastedlg.h b/rtgui/partialpastedlg.h index 5195d0756..f551ac134 100644 --- a/rtgui/partialpastedlg.h +++ b/rtgui/partialpastedlg.h @@ -63,6 +63,7 @@ public: Gtk::CheckButton* dirpyrden; Gtk::CheckButton* defringe; Gtk::CheckButton* dirpyreq; + Gtk::CheckButton* dehaze; // options in wavelet Gtk::CheckButton* wavelet; @@ -131,7 +132,7 @@ public: sigc::connection everythingConn, basicConn, detailConn, colorConn, lensConn, compositionConn, metaConn, rawConn, advancedConn; sigc::connection wbConn, exposureConn, localcontrastConn, shConn, pcvignetteConn, gradientConn, labcurveConn, colorappearanceConn; - sigc::connection sharpenConn, gradsharpenConn, microcontrastConn, impdenConn, dirpyrdenConn, defringeConn, epdConn, fattalConn, dirpyreqConn, waveletConn, retinexConn; + sigc::connection sharpenConn, gradsharpenConn, microcontrastConn, impdenConn, dirpyrdenConn, defringeConn, epdConn, fattalConn, dirpyreqConn, waveletConn, retinexConn, dehazeConn; sigc::connection vibranceConn, chmixerConn, hsveqConn, rgbcurvesConn, chmixerbwConn, colortoningConn, filmSimulationConn, softlightConn; sigc::connection distortionConn, cacorrConn, vignettingConn, lcpConn; sigc::connection coarserotConn, finerotConn, cropConn, resizeConn, prsharpeningConn, perspectiveConn, commonTransConn; diff --git a/rtgui/preferences.cc b/rtgui/preferences.cc index a7b45c902..33d8489f7 100644 --- a/rtgui/preferences.cc +++ b/rtgui/preferences.cc @@ -255,6 +255,10 @@ Gtk::Widget* Preferences::getBatchProcPanel () appendBehavList (mi, M ("TP_DIRPYRDENOISE_MAIN_GAMMA"), ADDSET_DIRPYRDN_GAMMA, true); appendBehavList (mi, M ("TP_DIRPYRDENOISE_MEDIAN_PASSES"), ADDSET_DIRPYRDN_PASSES, true); + mi = behModel->append (); + mi->set_value ( behavColumns.label, M ("TP_DEHAZE_LABEL") ); + appendBehavList ( mi, M ( "TP_DEHAZE_STRENGTH" ), ADDSET_DEHAZE_STRENGTH, true ); + mi = behModel->append (); mi->set_value (behavColumns.label, M ("TP_WBALANCE_LABEL")); appendBehavList (mi, M ("TP_WBALANCE_TEMPERATURE"), ADDSET_WB_TEMPERATURE, true); diff --git a/rtgui/toolpanelcoord.cc b/rtgui/toolpanelcoord.cc index deecb7682..99367999c 100644 --- a/rtgui/toolpanelcoord.cc +++ b/rtgui/toolpanelcoord.cc @@ -77,6 +77,7 @@ ToolPanelCoordinator::ToolPanelCoordinator (bool batch) : ipc (nullptr), hasChan hsvequalizer = Gtk::manage (new HSVEqualizer ()); filmSimulation = Gtk::manage (new FilmSimulation ()); softlight = Gtk::manage(new SoftLight()); + dehaze = Gtk::manage(new Dehaze()); sensorbayer = Gtk::manage (new SensorBayer ()); sensorxtrans = Gtk::manage (new SensorXTrans ()); bayerprocess = Gtk::manage (new BayerProcess ()); @@ -126,6 +127,7 @@ ToolPanelCoordinator::ToolPanelCoordinator (bool batch) : ipc (nullptr), hasChan addPanel (detailsPanel, dirpyrdenoise); addPanel (detailsPanel, defringe); addPanel (detailsPanel, dirpyrequalizer); + addPanel (detailsPanel, dehaze); addPanel (advancedPanel, wavelet); addPanel (transformPanel, crop); addPanel (transformPanel, resize); diff --git a/rtgui/toolpanelcoord.h b/rtgui/toolpanelcoord.h index 1c46ee54e..ca5c5fac4 100644 --- a/rtgui/toolpanelcoord.h +++ b/rtgui/toolpanelcoord.h @@ -80,6 +80,7 @@ #include "fattaltonemap.h" #include "localcontrast.h" #include "softlight.h" +#include "dehaze.h" #include "guiutils.h" class ImageEditorCoordinator; @@ -136,6 +137,7 @@ protected: DirPyrEqualizer* dirpyrequalizer; HSVEqualizer* hsvequalizer; SoftLight *softlight; + Dehaze *dehaze; FilmSimulation *filmSimulation; SensorBayer * sensorbayer; SensorXTrans * sensorxtrans; From 75964dfd8b767ded7b92ea47f6f57159518e1be4 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Wed, 10 Oct 2018 17:08:36 +0200 Subject: [PATCH 003/122] make sure that dehaze doesn't trigger Fattal tone mapping (bad interaction due to sloppy rebasing) --- rtengine/rtthumbnail.cc | 4 +--- rtengine/simpleprocess.cc | 4 +--- rtengine/tmo_fattal02.cc | 4 ++++ 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index bb710ee83..8a8ce1d9b 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -1201,9 +1201,7 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT ipf.firstAnalysis (baseImg, params, hist16); ipf.dehaze(baseImg); - if (params.fattal.enabled) { - ipf.ToneMapFattal02(baseImg); - } + ipf.ToneMapFattal02(baseImg); // perform transform if (ipf.needsTransform()) { diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 0846eacbd..5cd630315 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -855,9 +855,7 @@ private: ipf.firstAnalysis (baseImg, params, hist16); ipf.dehaze(baseImg); - if (params.fattal.enabled) { - ipf.ToneMapFattal02(baseImg); - } + ipf.ToneMapFattal02(baseImg); // perform transform (excepted resizing) if (ipf.needsTransform()) { diff --git a/rtengine/tmo_fattal02.cc b/rtengine/tmo_fattal02.cc index 351d60bc9..124cdbfb1 100644 --- a/rtengine/tmo_fattal02.cc +++ b/rtengine/tmo_fattal02.cc @@ -1014,6 +1014,10 @@ inline int find_fast_dim (int dim) void ImProcFunctions::ToneMapFattal02 (Imagefloat *rgb) { + if (!params->fattal.enabled) { + return; + } + BENCHFUN const int detail_level = 3; From 34321c70125ae89b8874b592e59faba4b9587709 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Wed, 10 Oct 2018 22:49:12 +0200 Subject: [PATCH 004/122] guided filter: properly validate radius parameter before calling boxblur --- rtengine/boxblur.h | 2 -- rtengine/guidedfilter.cc | 1 + 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/rtengine/boxblur.h b/rtengine/boxblur.h index f38c8f6e4..805575b77 100644 --- a/rtengine/boxblur.h +++ b/rtengine/boxblur.h @@ -35,8 +35,6 @@ namespace rtengine template void boxblur (T** src, A** dst, int radx, int rady, int W, int H) { //box blur image; box range = (radx,rady) - radx = min(radx, W-1); - rady = min(rady, H-1); AlignedBuffer* buffer = new AlignedBuffer (W * H); float* temp = buffer->data; diff --git a/rtengine/guidedfilter.cc b/rtengine/guidedfilter.cc index 4f4c5a247..3000e1d5d 100644 --- a/rtengine/guidedfilter.cc +++ b/rtengine/guidedfilter.cc @@ -110,6 +110,7 @@ void guidedFilter(const array2D &guide, const array2D &src, array2 const auto f_mean = [](array2D &d, array2D &s, int rad) -> void { + rad = min(rad, s.width() / 2, s.height() / 2); boxblur(s, d, rad, rad, s.width(), s.height()); }; From 83f5205006dc1ba8f893691780aede843795a85f Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Thu, 11 Oct 2018 13:41:41 +0200 Subject: [PATCH 005/122] guided filter: proper bounding of the radius before calling boxblur --- rtengine/boxblur.h | 2 ++ rtengine/guidedfilter.cc | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/rtengine/boxblur.h b/rtengine/boxblur.h index 805575b77..71452ceae 100644 --- a/rtengine/boxblur.h +++ b/rtengine/boxblur.h @@ -35,6 +35,8 @@ namespace rtengine template void boxblur (T** src, A** dst, int radx, int rady, int W, int H) { //box blur image; box range = (radx,rady) + assert(2*radx+1 < W); + assert(2*rady+1 < H); AlignedBuffer* buffer = new AlignedBuffer (W * H); float* temp = buffer->data; diff --git a/rtengine/guidedfilter.cc b/rtengine/guidedfilter.cc index 3000e1d5d..f6b702a73 100644 --- a/rtengine/guidedfilter.cc +++ b/rtengine/guidedfilter.cc @@ -110,7 +110,7 @@ void guidedFilter(const array2D &guide, const array2D &src, array2 const auto f_mean = [](array2D &d, array2D &s, int rad) -> void { - rad = min(rad, s.width() / 2, s.height() / 2); + rad = LIM(rad, 0, (min(s.width(), s.height()) - 1) / 2 - 1); boxblur(s, d, rad, rad, s.width(), s.height()); }; From 74ae459bf2c8782ced1ab592e4a2e5416ecf1f04 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Thu, 11 Oct 2018 13:43:45 +0200 Subject: [PATCH 006/122] dehaze: added more user-controllable parameters --- rtdata/languages/default | 6 +++ rtengine/ipdehaze.cc | 95 ++++++++++++++++++++++++++++++++++++---- rtengine/procparams.cc | 16 ++++++- rtengine/procparams.h | 3 ++ rtgui/dehaze.cc | 54 ++++++++++++++++++++++- rtgui/dehaze.h | 7 +++ rtgui/paramsedited.cc | 18 ++++++++ rtgui/paramsedited.h | 3 ++ 8 files changed, 190 insertions(+), 12 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index dcf626948..facf89498 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -728,7 +728,10 @@ HISTORY_MSG_492;RGB Curves HISTORY_MSG_493;L*a*b* Adjustments HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +HISTORY_MSG_DEHAZE_DETAIL;Dehaze - Detail HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength HISTORY_MSG_DUALDEMOSAIC_CONTRAST;AMaZE+VNG4 - Contrast threshold HISTORY_MSG_HISTMATCHING;Auto-matched tone curve @@ -1508,7 +1511,10 @@ TP_DARKFRAME_LABEL;Dark-Frame TP_DEFRINGE_LABEL;Defringe TP_DEFRINGE_RADIUS;Radius TP_DEFRINGE_THRESHOLD;Threshold +TP_DEHAZE_DEPTH;Depth +TP_DEHAZE_DETAIL;Detail TP_DEHAZE_LABEL;Haze Removal +TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map TP_DEHAZE_STRENGTH;Strength TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global diff --git a/rtengine/ipdehaze.cc b/rtengine/ipdehaze.cc index aed647417..7fa1988ce 100644 --- a/rtengine/ipdehaze.cc +++ b/rtengine/ipdehaze.cc @@ -218,6 +218,59 @@ void get_luminance(Imagefloat *img, array2D &Y, TMatrix ws, bool multithr } +void apply_contrast(array2D &dark, int contrast, double scale, bool multithread) +{ + if (contrast) { + const int W = dark.width(); + const int H = dark.height(); + + double tot = 0.0; +#ifdef _OPENMP + #pragma omp parallel for if (multithread) +#endif + for (int y = 0; y < H; ++y) { + double ytot = 0.0; + for (int x = 0; x < W; ++x) { + ytot += dark[y][x]; + } +#ifdef _OPENMP + #pragma omp critical +#endif + { + tot += ytot; + } + } + + float avg = tot / (W * H); + + std::vector pts = { + DCT_NURBS, + 0, //black point. Value in [0 ; 1] range + 0, //black point. Value in [0 ; 1] range + + avg - avg * (0.6 - contrast / 250.0), //toe point + avg - avg * (0.6 + contrast / 250.0), //value at toe point + + avg + (1 - avg) * (0.6 - contrast / 250.0), //shoulder point + avg + (1 - avg) * (0.6 + contrast / 250.0), //value at shoulder point + + 1., // white point + 1. // value at white point + }; + + const DiagonalCurve curve(pts, CURVES_MIN_POLY_POINTS / scale); + +#ifdef _OPENMP + #pragma omp parallel for if (multithread) +#endif + for (int y = 0; y < H; ++y) { + for (int x = 0; x < W; ++x) { + dark[y][x] = curve.getVal(dark[y][x]); + } + } + } +} + } // namespace @@ -231,14 +284,14 @@ void ImProcFunctions::dehaze(Imagefloat *img) const int W = img->getWidth(); const int H = img->getHeight(); - const float strength = LIM01(float(params->dehaze.strength) / 100.f * 0.9f); + float strength = LIM01(float(params->dehaze.strength) / 100.f * 0.9f); if (options.rtSettings.verbose) { std::cout << "dehaze: strength = " << strength << std::endl; } array2D dark(W, H); - const int patchsize = std::max(W / 200, 2); + const int patchsize = std::max(W / (200 + max(params->dehaze.detail, 0)), 2); int npatches = get_dark_channel(*img, dark, patchsize, nullptr, multiThread); DEBUG_DUMP(dark); @@ -268,18 +321,27 @@ void ImProcFunctions::dehaze(Imagefloat *img) array2D &t_tilde = dark; get_dark_channel(*img, dark, patchsize, ambient, multiThread); + apply_contrast(dark, params->dehaze.depth, scale, multiThread); DEBUG_DUMP(t_tilde); - + + if (!params->dehaze.showDepthMap) { #ifdef _OPENMP - #pragma omp parallel for if (multiThread) + #pragma omp parallel for if (multiThread) #endif - for (int y = 0; y < H; ++y) { - for (int x = 0; x < W; ++x) { - dark[y][x] = 1.f - strength * dark[y][x]; + for (int y = 0; y < H; ++y) { + for (int x = 0; x < W; ++x) { + dark[y][x] = 1.f - strength * dark[y][x]; + } } } - const int radius = patchsize * 2; + float mult = 2.f; + if (params->dehaze.detail > 0) { + mult -= (params->dehaze.detail / 100.f) * 1.9f; + } else { + mult -= params->dehaze.detail / 10.f; + } + const int radius = max(int(patchsize * mult), 1); const float epsilon = 2.5e-4; array2D &t = t_tilde; @@ -287,6 +349,19 @@ void ImProcFunctions::dehaze(Imagefloat *img) DEBUG_DUMP(t); + + if (params->dehaze.showDepthMap) { +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int y = 0; y < H; ++y) { + for (int x = 0; x < W; ++x) { + img->r(y, x) = img->g(y, x) = img->b(y, x) = t[y][x] * 65535.f; + } + } + return; + } + const float t0 = 0.01; #ifdef _OPENMP #pragma omp parallel for if (multiThread) @@ -313,7 +388,7 @@ void ImProcFunctions::dehaze(Imagefloat *img) if (newmed > 1e-5f) { const float f1 = oldmed / newmed; - const float f = f1 * 65535.f; + const float f = /* f1 * */ 65535.f; #ifdef _OPENMP #pragma omp parallel for if (multiThread) #endif @@ -328,6 +403,8 @@ void ImProcFunctions::dehaze(Imagefloat *img) Color::hsl2rgbfloat(h, s, l, img->r(y, x), img->g(y, x), img->b(y, x)); } } + } else { + img->normalizeFloatTo65535(); } } diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index ceace7c3b..17afb3371 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2376,7 +2376,10 @@ bool SoftLightParams::operator !=(const SoftLightParams& other) const DehazeParams::DehazeParams() : enabled(false), - strength(50) + strength(50), + showDepthMap(false), + depth(0), + detail(0) { } @@ -2384,7 +2387,10 @@ bool DehazeParams::operator ==(const DehazeParams& other) const { return enabled == other.enabled - && strength == other.strength; + && strength == other.strength + && showDepthMap == other.showDepthMap + && depth == other.depth + && detail == other.detail; } bool DehazeParams::operator !=(const DehazeParams& other) const @@ -3062,6 +3068,9 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo // Dehaze saveToKeyfile(!pedited || pedited->dehaze.enabled, "Dehaze", "Enabled", dehaze.enabled, keyFile); saveToKeyfile(!pedited || pedited->dehaze.strength, "Dehaze", "Strength", dehaze.strength, keyFile); + saveToKeyfile(!pedited || pedited->dehaze.showDepthMap, "Dehaze", "ShowDepthMap", dehaze.showDepthMap, keyFile); + saveToKeyfile(!pedited || pedited->dehaze.depth, "Dehaze", "Depth", dehaze.depth, keyFile); + saveToKeyfile(!pedited || pedited->dehaze.detail, "Dehaze", "Detail", dehaze.detail, keyFile); // Directional pyramid denoising saveToKeyfile(!pedited || pedited->dirpyrDenoise.enabled, "Directional Pyramid Denoising", "Enabled", dirpyrDenoise.enabled, keyFile); @@ -4647,6 +4656,9 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) if (keyFile.has_group("Dehaze")) { assignFromKeyfile(keyFile, "Dehaze", "Enabled", pedited, dehaze.enabled, pedited->dehaze.enabled); assignFromKeyfile(keyFile, "Dehaze", "Strength", pedited, dehaze.strength, pedited->dehaze.strength); + assignFromKeyfile(keyFile, "Dehaze", "ShowDepthMap", pedited, dehaze.showDepthMap, pedited->dehaze.showDepthMap); + assignFromKeyfile(keyFile, "Dehaze", "Depth", pedited, dehaze.depth, pedited->dehaze.depth); + assignFromKeyfile(keyFile, "Dehaze", "Detail", pedited, dehaze.detail, pedited->dehaze.detail); } if (keyFile.has_group("Film Simulation")) { diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 19fe0a376..143fedbe8 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1230,6 +1230,9 @@ struct SoftLightParams { struct DehazeParams { bool enabled; int strength; + bool showDepthMap; + int depth; + int detail; DehazeParams(); diff --git a/rtgui/dehaze.cc b/rtgui/dehaze.cc index 6f4814e55..ef5075ab7 100644 --- a/rtgui/dehaze.cc +++ b/rtgui/dehaze.cc @@ -30,12 +30,30 @@ Dehaze::Dehaze(): FoldableToolPanel(this, "dehaze", M("TP_DEHAZE_LABEL"), false, auto m = ProcEventMapper::getInstance(); EvDehazeEnabled = m->newEvent(HDR, "HISTORY_MSG_DEHAZE_ENABLED"); EvDehazeStrength = m->newEvent(HDR, "HISTORY_MSG_DEHAZE_STRENGTH"); + EvDehazeShowDepthMap = m->newEvent(HDR, "HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP"); + EvDehazeDepth = m->newEvent(HDR, "HISTORY_MSG_DEHAZE_DEPTH"); + EvDehazeDetail = m->newEvent(HDR, "HISTORY_MSG_DEHAZE_DETAIL"); strength = Gtk::manage(new Adjuster(M("TP_DEHAZE_STRENGTH"), 0., 100., 1., 50.)); strength->setAdjusterListener(this); strength->show(); + depth = Gtk::manage(new Adjuster(M("TP_DEHAZE_DEPTH"), -100., 100., 1., 0.)); + depth->setAdjusterListener(this); + depth->show(); + + detail = Gtk::manage(new Adjuster(M("TP_DEHAZE_DETAIL"), -100, 100, 1, 0)); + detail->setAdjusterListener(this); + detail->show(); + + showDepthMap = Gtk::manage(new Gtk::CheckButton(M("TP_DEHAZE_SHOW_DEPTH_MAP"))); + showDepthMap->signal_toggled().connect(sigc::mem_fun(*this, &Dehaze::showDepthMapChanged)); + showDepthMap->show(); + pack_start(*strength); + pack_start(*depth); + pack_start(*detail); + pack_start(*showDepthMap); } @@ -45,11 +63,17 @@ void Dehaze::read(const ProcParams *pp, const ParamsEdited *pedited) if (pedited) { strength->setEditedState(pedited->dehaze.strength ? Edited : UnEdited); + depth->setEditedState(pedited->dehaze.depth ? Edited : UnEdited); + detail->setEditedState(pedited->dehaze.detail ? Edited : UnEdited); set_inconsistent(multiImage && !pedited->dehaze.enabled); + showDepthMap->set_inconsistent(!pedited->dehaze.showDepthMap); } setEnabled(pp->dehaze.enabled); strength->setValue(pp->dehaze.strength); + depth->setValue(pp->dehaze.depth); + detail->setValue(pp->dehaze.detail); + showDepthMap->set_active(pp->dehaze.showDepthMap); enableListener(); } @@ -58,22 +82,34 @@ void Dehaze::read(const ProcParams *pp, const ParamsEdited *pedited) void Dehaze::write(ProcParams *pp, ParamsEdited *pedited) { pp->dehaze.strength = strength->getValue(); + pp->dehaze.depth = depth->getValue(); + pp->dehaze.detail = detail->getValue(); pp->dehaze.enabled = getEnabled(); + pp->dehaze.showDepthMap = showDepthMap->get_active(); if (pedited) { pedited->dehaze.strength = strength->getEditedState(); + pedited->dehaze.depth = depth->getEditedState(); + pedited->dehaze.detail = detail->getEditedState(); pedited->dehaze.enabled = !get_inconsistent(); + pedited->dehaze.showDepthMap = !showDepthMap->get_inconsistent(); } } void Dehaze::setDefaults(const ProcParams *defParams, const ParamsEdited *pedited) { strength->setDefault(defParams->dehaze.strength); + depth->setDefault(defParams->dehaze.depth); + detail->setDefault(defParams->dehaze.detail); if (pedited) { strength->setDefaultEditedState(pedited->dehaze.strength ? Edited : UnEdited); + depth->setDefaultEditedState(pedited->dehaze.depth ? Edited : UnEdited); + detail->setDefaultEditedState(pedited->dehaze.detail ? Edited : UnEdited); } else { strength->setDefaultEditedState(Irrelevant); + depth->setDefaultEditedState(Irrelevant); + detail->setDefaultEditedState(Irrelevant); } } @@ -81,7 +117,13 @@ void Dehaze::setDefaults(const ProcParams *defParams, const ParamsEdited *pedite void Dehaze::adjusterChanged(Adjuster* a, double newval) { if (listener && getEnabled()) { - listener->panelChanged(EvDehazeStrength, a->getTextValue()); + if (a == strength) { + listener->panelChanged(EvDehazeStrength, a->getTextValue()); + } else if (a == depth) { + listener->panelChanged(EvDehazeDepth, a->getTextValue()); + } else if (a == detail) { + listener->panelChanged(EvDehazeDetail, a->getTextValue()); + } } } @@ -100,11 +142,21 @@ void Dehaze::enabledChanged () } +void Dehaze::showDepthMapChanged() +{ + if (listener) { + listener->panelChanged(EvDehazeShowDepthMap, showDepthMap->get_active() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED")); + } +} + + void Dehaze::setBatchMode(bool batchMode) { ToolPanel::setBatchMode(batchMode); strength->showEditedCB(); + depth->showEditedCB(); + detail->showEditedCB(); } diff --git a/rtgui/dehaze.h b/rtgui/dehaze.h index 3617f13ea..ae6097c86 100644 --- a/rtgui/dehaze.h +++ b/rtgui/dehaze.h @@ -27,9 +27,15 @@ class Dehaze: public ToolParamBlock, public AdjusterListener, public FoldableToo { private: Adjuster *strength; + Adjuster *depth; + Adjuster *detail; + Gtk::CheckButton *showDepthMap; rtengine::ProcEvent EvDehazeEnabled; rtengine::ProcEvent EvDehazeStrength; + rtengine::ProcEvent EvDehazeDepth; + rtengine::ProcEvent EvDehazeDetail; + rtengine::ProcEvent EvDehazeShowDepthMap; public: @@ -42,6 +48,7 @@ public: void adjusterChanged(Adjuster *a, double newval); void enabledChanged(); + void showDepthMapChanged(); void setAdjusterBehavior(bool strengthAdd); }; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index fef8da8e6..ffc1bd19c 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -568,6 +568,9 @@ void ParamsEdited::set(bool v) softlight.strength = v; dehaze.enabled = v; dehaze.strength = v; + dehaze.showDepthMap = v; + dehaze.depth = v; + dehaze.detail = v; metadata.mode = v; exif = v; @@ -1123,6 +1126,9 @@ void ParamsEdited::initFrom(const std::vector& softlight.strength = softlight.strength && p.softlight.strength == other.softlight.strength; dehaze.enabled = dehaze.enabled && p.dehaze.enabled == other.dehaze.enabled; dehaze.strength = dehaze.strength && p.dehaze.strength == other.dehaze.strength; + dehaze.showDepthMap = dehaze.showDepthMap && p.dehaze.showDepthMap == other.dehaze.showDepthMap; + dehaze.depth = dehaze.depth && p.dehaze.depth == other.dehaze.depth; + dehaze.detail = dehaze.detail && p.dehaze.detail == other.dehaze.detail; metadata.mode = metadata.mode && p.metadata.mode == other.metadata.mode; // How the hell can we handle that??? @@ -3125,6 +3131,18 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.dehaze.strength = dontforceSet && options.baBehav[ADDSET_DEHAZE_STRENGTH] ? toEdit.dehaze.strength + mods.dehaze.strength : mods.dehaze.strength; } + if (dehaze.depth) { + toEdit.dehaze.depth = mods.dehaze.depth; + } + + if (dehaze.detail) { + toEdit.dehaze.detail = mods.dehaze.detail; + } + + if (dehaze.showDepthMap) { + toEdit.dehaze.showDepthMap = mods.dehaze.showDepthMap; + } + if (metadata.mode) { toEdit.metadata.mode = mods.metadata.mode; } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 6a2076032..73a19db88 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -729,6 +729,9 @@ class DehazeParamsEdited public: bool enabled; bool strength; + bool showDepthMap; + bool depth; + bool detail; }; From 7c10f92ace3ba69ccccc314ceb49f6d9a5b16f7d Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Fri, 12 Oct 2018 16:01:48 +0200 Subject: [PATCH 007/122] dehaze: improved use of the guided filter for less halos --- rtengine/ipdehaze.cc | 152 ++++++++++++++++++++++++++----------------- 1 file changed, 94 insertions(+), 58 deletions(-) diff --git a/rtengine/ipdehaze.cc b/rtengine/ipdehaze.cc index 7fa1988ce..355d7f843 100644 --- a/rtengine/ipdehaze.cc +++ b/rtengine/ipdehaze.cc @@ -58,28 +58,28 @@ namespace { #endif -int get_dark_channel(const Imagefloat &src, array2D &dst, +int get_dark_channel(const array2D &R, const array2D &G, const array2D &B, array2D &dst, int patchsize, float *ambient, bool multithread) { - const int w = src.getWidth(); - const int h = src.getHeight(); + const int W = R.width(); + const int H = R.height(); int npatches = 0; #ifdef _OPENMP #pragma omp parallel for if (multithread) #endif - for (int y = 0; y < src.getHeight(); y += patchsize) { - int pH = std::min(y+patchsize, h); - for (int x = 0; x < src.getWidth(); x += patchsize, ++npatches) { + for (int y = 0; y < H; y += patchsize) { + int pH = std::min(y+patchsize, H); + for (int x = 0; x < W; x += patchsize, ++npatches) { float val = RT_INFINITY_F; - int pW = std::min(x+patchsize, w); + int pW = std::min(x+patchsize, W); for (int yy = y; yy < pH; ++yy) { float yval = RT_INFINITY_F; for (int xx = x; xx < pW; ++xx) { - float r = src.r(yy, xx); - float g = src.g(yy, xx); - float b = src.b(yy, xx); + float r = R[yy][xx]; + float g = G[yy][xx]; + float b = B[yy][xx]; if (ambient) { r /= ambient[0]; g /= ambient[1]; @@ -89,14 +89,16 @@ int get_dark_channel(const Imagefloat &src, array2D &dst, } val = min(val, yval); } + val = LIM01(val); for (int yy = y; yy < pH; ++yy) { std::fill(dst[yy]+x, dst[yy]+pW, val); } + float val2 = RT_INFINITY_F; for (int yy = y; yy < pH; ++yy) { for (int xx = x; xx < pW; ++xx) { - float r = src.r(yy, xx); - float g = src.g(yy, xx); - float b = src.b(yy, xx); + float r = R[yy][xx]; + float g = G[yy][xx]; + float b = B[yy][xx]; if (ambient) { r /= ambient[0]; g /= ambient[1]; @@ -104,7 +106,18 @@ int get_dark_channel(const Imagefloat &src, array2D &dst, } float l = min(r, g, b); if (l >= 2.f * val) { - dst[yy][xx] = l; + val2 = min(val2, l); + dst[yy][xx] = -1; + } + } + } + if (val2 < RT_INFINITY_F) { + val2 = LIM01(val2); + for (int yy = y; yy < pH; ++yy) { + for (int xx = x; xx < pW; ++xx) { + if (dst[yy][xx] < 0.f) { + dst[yy][xx] = val2; + } } } } @@ -115,10 +128,10 @@ int get_dark_channel(const Imagefloat &src, array2D &dst, } -int estimate_ambient_light(const Imagefloat *img, const array2D &dark, const array2D &Y, int patchsize, int npatches, float ambient[3]) +int estimate_ambient_light(const array2D &R, const array2D &G, const array2D &B, const array2D &dark, const array2D &Y, int patchsize, int npatches, float ambient[3]) { - const int W = img->getWidth(); - const int H = img->getHeight(); + const int W = R.width(); + const int H = R.height(); const auto get_percentile = [](std::priority_queue &q, float prcnt) -> float @@ -183,9 +196,9 @@ int estimate_ambient_light(const Imagefloat *img, const array2D &dark, co for (int y = p.second; y < pH; ++y) { for (int x = p.first; x < pW; ++x) { if (Y[y][x] >= lim) { - float r = img->r(y, x); - float g = img->g(y, x); - float b = img->b(y, x); + float r = R[y][x]; + float g = G[y][x]; + float b = B[y][x]; rr += r; gg += g; bb += b; @@ -218,41 +231,25 @@ void get_luminance(Imagefloat *img, array2D &Y, TMatrix ws, bool multithr } -void apply_contrast(array2D &dark, int contrast, double scale, bool multithread) +void apply_contrast(array2D &dark, float ambient, int contrast, double scale, bool multithread) { if (contrast) { const int W = dark.width(); const int H = dark.height(); - double tot = 0.0; -#ifdef _OPENMP - #pragma omp parallel for if (multithread) -#endif - for (int y = 0; y < H; ++y) { - double ytot = 0.0; - for (int x = 0; x < W; ++x) { - ytot += dark[y][x]; - } -#ifdef _OPENMP - #pragma omp critical -#endif - { - tot += ytot; - } - } - - float avg = tot / (W * H); + float avg = ambient * 0.25f; + float c = contrast * 0.3f; std::vector pts = { DCT_NURBS, 0, //black point. Value in [0 ; 1] range 0, //black point. Value in [0 ; 1] range - avg - avg * (0.6 - contrast / 250.0), //toe point - avg - avg * (0.6 + contrast / 250.0), //value at toe point + avg - avg * (0.6 - c / 250.0), //toe point + avg - avg * (0.6 + c / 250.0), //value at toe point - avg + (1 - avg) * (0.6 - contrast / 250.0), //shoulder point - avg + (1 - avg) * (0.6 + contrast / 250.0), //value at shoulder point + avg + (1 - avg) * (0.6 - c / 250.0), //shoulder point + avg + (1 - avg) * (0.6 + c / 250.0), //value at shoulder point 1., // white point 1. // value at white point @@ -271,6 +268,28 @@ void apply_contrast(array2D &dark, int contrast, double scale, bool multi } } + +void extract_channels(Imagefloat *img, const array2D &Y, array2D &r, array2D &g, array2D &b, int radius, float epsilon, bool multithread) +{ + const int W = img->getWidth(); + const int H = img->getHeight(); + +#ifdef _OPENMP + #pragma omp parallel for if (multithread) +#endif + for (int y = 0; y < H; ++y) { + for (int x = 0; x < W; ++x) { + r[y][x] = img->r(y, x); + g[y][x] = img->g(y, x); + b[y][x] = img->b(y, x); + } + } + + guidedFilter(Y, r, r, radius, epsilon, multithread); + guidedFilter(Y, g, g, radius, epsilon, multithread); + guidedFilter(Y, b, b, radius, epsilon, multithread); +} + } // namespace @@ -289,18 +308,24 @@ void ImProcFunctions::dehaze(Imagefloat *img) if (options.rtSettings.verbose) { std::cout << "dehaze: strength = " << strength << std::endl; } - - array2D dark(W, H); - const int patchsize = std::max(W / (200 + max(params->dehaze.detail, 0)), 2); - int npatches = get_dark_channel(*img, dark, patchsize, nullptr, multiThread); - DEBUG_DUMP(dark); TMatrix ws = ICCStore::getInstance()->workingSpaceMatrix(params->icm.workingProfile); array2D Y(W, H); get_luminance(img, Y, ws, multiThread); + + array2D R(W, H); + array2D G(W, H); + array2D B(W, H); + int patchsize = max(int(20 / scale), 2); + extract_channels(img, Y, R, G, B, patchsize, 1e-1, multiThread); + array2D dark(W, H); + patchsize = std::max(W / (200 + params->dehaze.detail * (SGN(params->dehaze.detail) > 0 ? 4 : 1)), 2); + int npatches = get_dark_channel(R, G, B, dark, patchsize, nullptr, multiThread); + DEBUG_DUMP(dark); + float ambient[3]; - int n = estimate_ambient_light(img, dark, Y, patchsize, npatches, ambient); + int n = estimate_ambient_light(R, G, B, dark, Y, patchsize, npatches, ambient); float ambient_Y = Color::rgbLuminance(ambient[0], ambient[1], ambient[2], ws); if (options.rtSettings.verbose) { @@ -320,8 +345,8 @@ void ImProcFunctions::dehaze(Imagefloat *img) } array2D &t_tilde = dark; - get_dark_channel(*img, dark, patchsize, ambient, multiThread); - apply_contrast(dark, params->dehaze.depth, scale, multiThread); + get_dark_channel(R, G, B, dark, patchsize, ambient, multiThread); + apply_contrast(dark, ambient_Y, params->dehaze.depth, scale, multiThread); DEBUG_DUMP(t_tilde); if (!params->dehaze.showDepthMap) { @@ -344,7 +369,8 @@ void ImProcFunctions::dehaze(Imagefloat *img) const int radius = max(int(patchsize * mult), 1); const float epsilon = 2.5e-4; array2D &t = t_tilde; - + + if (!params->dehaze.showDepthMap) guidedFilter(Y, t_tilde, t, radius, epsilon, multiThread); DEBUG_DUMP(t); @@ -362,16 +388,26 @@ void ImProcFunctions::dehaze(Imagefloat *img) return; } - const float t0 = 0.01; + const float t0 = 0.1; + const float teps = 1e-3; #ifdef _OPENMP #pragma omp parallel for if (multiThread) #endif for (int y = 0; y < H; ++y) { for (int x = 0; x < W; ++x) { - float mt = std::max(t[y][x], t0); - float r = (img->r(y, x) - ambient[0]) / mt + ambient[0]; - float g = (img->g(y, x) - ambient[1]) / mt + ambient[1]; - float b = (img->b(y, x) - ambient[2]) / mt + ambient[2]; + float rgb[3] = { img->r(y, x), img->g(y, x), img->b(y, x) }; + float tl = 1.f - min(rgb[0]/ambient[0], rgb[1]/ambient[1], rgb[2]/ambient[2]); + float tu = t0 - teps; + for (int c = 0; c < 3; ++c) { + if (ambient[c] < 1) { + tu = max(tu, (rgb[c] - ambient[c])/(1.f - ambient[c])); + } + } + float mt = max(t[y][x], t0, tl + teps, tu + teps); + float r = (rgb[0] - ambient[0]) / mt + ambient[0]; + float g = (rgb[1] - ambient[1]) / mt + ambient[1]; + float b = (rgb[2] - ambient[2]) / mt + ambient[2]; + img->r(y, x) = r; img->g(y, x) = g; img->b(y, x) = b; @@ -388,7 +424,7 @@ void ImProcFunctions::dehaze(Imagefloat *img) if (newmed > 1e-5f) { const float f1 = oldmed / newmed; - const float f = /* f1 * */ 65535.f; + const float f = f1 * 65535.f; #ifdef _OPENMP #pragma omp parallel for if (multiThread) #endif From 4d0ddd56e53e312a8d5fd29b61dd34708e91e615 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Tue, 16 Oct 2018 23:20:11 +0200 Subject: [PATCH 008/122] revamped and simplified dehaze -- now it's finally usable --- rtdata/languages/default | 2 - rtengine/ipdehaze.cc | 286 ++++++++++++--------------------------- rtengine/procparams.cc | 8 +- rtengine/procparams.h | 1 - rtgui/dehaze.cc | 18 +-- rtgui/dehaze.h | 2 - rtgui/paramsedited.cc | 6 - rtgui/paramsedited.h | 1 - 8 files changed, 87 insertions(+), 237 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index facf89498..7dcefdbc8 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -729,7 +729,6 @@ HISTORY_MSG_493;L*a*b* Adjustments HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth -HISTORY_MSG_DEHAZE_DETAIL;Dehaze - Detail HISTORY_MSG_DEHAZE_ENABLED;Haze Removal HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength @@ -1512,7 +1511,6 @@ TP_DEFRINGE_LABEL;Defringe TP_DEFRINGE_RADIUS;Radius TP_DEFRINGE_THRESHOLD;Threshold TP_DEHAZE_DEPTH;Depth -TP_DEHAZE_DETAIL;Detail TP_DEHAZE_LABEL;Haze Removal TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map TP_DEHAZE_STRENGTH;Strength diff --git a/rtengine/ipdehaze.cc b/rtengine/ipdehaze.cc index 355d7f843..1c5512c2a 100644 --- a/rtengine/ipdehaze.cc +++ b/rtengine/ipdehaze.cc @@ -70,10 +70,10 @@ int get_dark_channel(const array2D &R, const array2D &G, const arr #pragma omp parallel for if (multithread) #endif for (int y = 0; y < H; y += patchsize) { - int pH = std::min(y+patchsize, H); + int pH = min(y+patchsize, H); for (int x = 0; x < W; x += patchsize, ++npatches) { float val = RT_INFINITY_F; - int pW = std::min(x+patchsize, W); + int pW = min(x+patchsize, W); for (int yy = y; yy < pH; ++yy) { float yval = RT_INFINITY_F; for (int xx = x; xx < pW; ++xx) { @@ -93,34 +93,6 @@ int get_dark_channel(const array2D &R, const array2D &G, const arr for (int yy = y; yy < pH; ++yy) { std::fill(dst[yy]+x, dst[yy]+pW, val); } - float val2 = RT_INFINITY_F; - for (int yy = y; yy < pH; ++yy) { - for (int xx = x; xx < pW; ++xx) { - float r = R[yy][xx]; - float g = G[yy][xx]; - float b = B[yy][xx]; - if (ambient) { - r /= ambient[0]; - g /= ambient[1]; - b /= ambient[2]; - } - float l = min(r, g, b); - if (l >= 2.f * val) { - val2 = min(val2, l); - dst[yy][xx] = -1; - } - } - } - if (val2 < RT_INFINITY_F) { - val2 = LIM01(val2); - for (int yy = y; yy < pH; ++yy) { - for (int xx = x; xx < pW; ++xx) { - if (dst[yy][xx] < 0.f) { - dst[yy][xx] = val2; - } - } - } - } } } @@ -128,7 +100,7 @@ int get_dark_channel(const array2D &R, const array2D &G, const arr } -int estimate_ambient_light(const array2D &R, const array2D &G, const array2D &B, const array2D &dark, const array2D &Y, int patchsize, int npatches, float ambient[3]) +float estimate_ambient_light(const array2D &R, const array2D &G, const array2D &B, const array2D &dark, int patchsize, int npatches, float ambient[3]) { const int W = R.width(); const int H = R.height(); @@ -143,7 +115,7 @@ int estimate_ambient_light(const array2D &R, const array2D &G, con return q.top(); }; - float lim = RT_INFINITY_F; + float darklim = RT_INFINITY_F; { std::priority_queue p; for (int y = 0; y < H; y += patchsize) { @@ -151,7 +123,7 @@ int estimate_ambient_light(const array2D &R, const array2D &G, con p.push(dark[y][x]); } } - lim = get_percentile(p, 0.95); + darklim = get_percentile(p, 0.95); } std::vector> patches; @@ -159,7 +131,7 @@ int estimate_ambient_light(const array2D &R, const array2D &G, con for (int y = 0; y < H; y += patchsize) { for (int x = 0; x < W; x += patchsize) { - if (dark[y][x] >= lim) { + if (dark[y][x] >= darklim) { patches.push_back(std::make_pair(x, y)); } } @@ -170,35 +142,36 @@ int estimate_ambient_light(const array2D &R, const array2D &G, con << " patches" << std::endl; } + float bright_lim = RT_INFINITY_F; { std::priority_queue l; for (auto &p : patches) { - const int pW = std::min(p.first+patchsize, W); - const int pH = std::min(p.second+patchsize, H); + const int pW = min(p.first+patchsize, W); + const int pH = min(p.second+patchsize, H); for (int y = p.second; y < pH; ++y) { for (int x = p.first; x < pW; ++x) { - l.push(Y[y][x]); + l.push(R[y][x] + G[y][x] + B[y][x]); } } } - lim = get_percentile(l, 0.95); + bright_lim = get_percentile(l, 0.95); } double rr = 0, gg = 0, bb = 0; int n = 0; for (auto &p : patches) { - const int pW = std::min(p.first+patchsize, W); - const int pH = std::min(p.second+patchsize, H); + const int pW = min(p.first+patchsize, W); + const int pH = min(p.second+patchsize, H); for (int y = p.second; y < pH; ++y) { for (int x = p.first; x < pW; ++x) { - if (Y[y][x] >= lim) { - float r = R[y][x]; - float g = G[y][x]; - float b = B[y][x]; + float r = R[y][x]; + float g = G[y][x]; + float b = B[y][x]; + if (r + g + b >= bright_lim) { rr += r; gg += g; bb += b; @@ -211,65 +184,12 @@ int estimate_ambient_light(const array2D &R, const array2D &G, con ambient[1] = gg / n; ambient[2] = bb / n; - return n; + // taken from darktable + return darklim > 0 ? -1.125f * std::log(darklim) : std::log(std::numeric_limits::max()) / 2; } -void get_luminance(Imagefloat *img, array2D &Y, TMatrix ws, bool multithread) -{ - const int W = img->getWidth(); - const int H = img->getHeight(); - -#ifdef _OPENMP - #pragma omp parallel for if (multithread) -#endif - for (int y = 0; y < H; ++y) { - for (int x = 0; x < W; ++x) { - Y[y][x] = Color::rgbLuminance(img->r(y, x), img->g(y, x), img->b(y, x), ws); - } - } -} - - -void apply_contrast(array2D &dark, float ambient, int contrast, double scale, bool multithread) -{ - if (contrast) { - const int W = dark.width(); - const int H = dark.height(); - - float avg = ambient * 0.25f; - float c = contrast * 0.3f; - - std::vector pts = { - DCT_NURBS, - 0, //black point. Value in [0 ; 1] range - 0, //black point. Value in [0 ; 1] range - - avg - avg * (0.6 - c / 250.0), //toe point - avg - avg * (0.6 + c / 250.0), //value at toe point - - avg + (1 - avg) * (0.6 - c / 250.0), //shoulder point - avg + (1 - avg) * (0.6 + c / 250.0), //value at shoulder point - - 1., // white point - 1. // value at white point - }; - - const DiagonalCurve curve(pts, CURVES_MIN_POLY_POINTS / scale); - -#ifdef _OPENMP - #pragma omp parallel for if (multithread) -#endif - for (int y = 0; y < H; ++y) { - for (int x = 0; x < W; ++x) { - dark[y][x] = curve.getVal(dark[y][x]); - } - } - } -} - - -void extract_channels(Imagefloat *img, const array2D &Y, array2D &r, array2D &g, array2D &b, int radius, float epsilon, bool multithread) +void extract_channels(Imagefloat *img, array2D &r, array2D &g, array2D &b, int radius, float epsilon, bool multithread) { const int W = img->getWidth(); const int H = img->getHeight(); @@ -285,11 +205,12 @@ void extract_channels(Imagefloat *img, const array2D &Y, array2D & } } - guidedFilter(Y, r, r, radius, epsilon, multithread); - guidedFilter(Y, g, g, radius, epsilon, multithread); - guidedFilter(Y, b, b, radius, epsilon, multithread); + guidedFilter(r, r, r, radius, epsilon, multithread, radius / 2); + guidedFilter(g, g, g, radius, epsilon, multithread, radius / 2); + guidedFilter(b, b, b, radius, epsilon, multithread, radius / 2); } + } // namespace @@ -309,31 +230,33 @@ void ImProcFunctions::dehaze(Imagefloat *img) std::cout << "dehaze: strength = " << strength << std::endl; } - TMatrix ws = ICCStore::getInstance()->workingSpaceMatrix(params->icm.workingProfile); - array2D Y(W, H); - get_luminance(img, Y, ws, multiThread); - - array2D R(W, H); - array2D G(W, H); - array2D B(W, H); - int patchsize = max(int(20 / scale), 2); - extract_channels(img, Y, R, G, B, patchsize, 1e-1, multiThread); - array2D dark(W, H); - patchsize = std::max(W / (200 + params->dehaze.detail * (SGN(params->dehaze.detail) > 0 ? 4 : 1)), 2); - int npatches = get_dark_channel(R, G, B, dark, patchsize, nullptr, multiThread); - DEBUG_DUMP(dark); + int patchsize = max(int(5 / scale), 2); + int npatches = 0; float ambient[3]; - int n = estimate_ambient_light(R, G, B, dark, Y, patchsize, npatches, ambient); - float ambient_Y = Color::rgbLuminance(ambient[0], ambient[1], ambient[2], ws); + array2D &t_tilde = dark; + float max_t = 0.f; - if (options.rtSettings.verbose) { - std::cout << "dehaze: ambient light is " - << ambient[0] << ", " << ambient[1] << ", " << ambient[2] - << " (average of " << n << ")" - << std::endl; - std::cout << " ambient luminance is " << ambient_Y << std::endl; + { + array2D R(W, H); + array2D G(W, H); + array2D B(W, H); + extract_channels(img, R, G, B, patchsize, 1e-1, multiThread); + + patchsize = max(max(W, H) / 600, 2); + npatches = get_dark_channel(R, G, B, dark, patchsize, nullptr, multiThread); + DEBUG_DUMP(dark); + + max_t = estimate_ambient_light(R, G, B, dark, patchsize, npatches, ambient); + + if (options.rtSettings.verbose) { + std::cout << "dehaze: ambient light is " + << ambient[0] << ", " << ambient[1] << ", " << ambient[2] + << std::endl; + } + + get_dark_channel(R, G, B, dark, patchsize, ambient, multiThread); } if (min(ambient[0], ambient[1], ambient[2]) < 0.01f) { @@ -344,59 +267,41 @@ void ImProcFunctions::dehaze(Imagefloat *img) return; // probably no haze at all } - array2D &t_tilde = dark; - get_dark_channel(R, G, B, dark, patchsize, ambient, multiThread); - apply_contrast(dark, ambient_Y, params->dehaze.depth, scale, multiThread); DEBUG_DUMP(t_tilde); - if (!params->dehaze.showDepthMap) { -#ifdef _OPENMP - #pragma omp parallel for if (multiThread) -#endif - for (int y = 0; y < H; ++y) { - for (int x = 0; x < W; ++x) { - dark[y][x] = 1.f - strength * dark[y][x]; - } - } - } - - float mult = 2.f; - if (params->dehaze.detail > 0) { - mult -= (params->dehaze.detail / 100.f) * 1.9f; - } else { - mult -= params->dehaze.detail / 10.f; - } - const int radius = max(int(patchsize * mult), 1); - const float epsilon = 2.5e-4; - array2D &t = t_tilde; - - if (!params->dehaze.showDepthMap) - guidedFilter(Y, t_tilde, t, radius, epsilon, multiThread); - - DEBUG_DUMP(t); - - - if (params->dehaze.showDepthMap) { -#ifdef _OPENMP - #pragma omp parallel for if (multiThread) -#endif - for (int y = 0; y < H; ++y) { - for (int x = 0; x < W; ++x) { - img->r(y, x) = img->g(y, x) = img->b(y, x) = t[y][x] * 65535.f; - } - } - return; - } - - const float t0 = 0.1; - const float teps = 1e-3; #ifdef _OPENMP #pragma omp parallel for if (multiThread) #endif for (int y = 0; y < H; ++y) { for (int x = 0; x < W; ++x) { + dark[y][x] = 1.f - strength * dark[y][x]; + } + } + + const int radius = patchsize * 4; + const float epsilon = 1e-7; + array2D &t = t_tilde; + + { + array2D guideB(W, H, img->b.ptrs, ARRAY2D_BYREFERENCE); + guidedFilter(guideB, t_tilde, t, radius, epsilon, multiThread, patchsize); + } + + DEBUG_DUMP(t); + + float depth = -float(params->dehaze.depth) / 100.f; + const float t0 = max(1e-3f, std::exp(depth * max_t)); + const float teps = 1e-3f; +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int y = 0; y < H; ++y) { + for (int x = 0; x < W; ++x) { + // ensure that the transmission is such that to avoid clipping... float rgb[3] = { img->r(y, x), img->g(y, x), img->b(y, x) }; + // ... t >= tl to avoid negative values float tl = 1.f - min(rgb[0]/ambient[0], rgb[1]/ambient[1], rgb[2]/ambient[2]); + // ... t >= tu to avoid values > 1 float tu = t0 - teps; for (int c = 0; c < 3; ++c) { if (ambient[c] < 1) { @@ -404,44 +309,21 @@ void ImProcFunctions::dehaze(Imagefloat *img) } } float mt = max(t[y][x], t0, tl + teps, tu + teps); - float r = (rgb[0] - ambient[0]) / mt + ambient[0]; - float g = (rgb[1] - ambient[1]) / mt + ambient[1]; - float b = (rgb[2] - ambient[2]) / mt + ambient[2]; + if (params->dehaze.showDepthMap) { + img->r(y, x) = img->g(y, x) = img->b(y, x) = 1.f - mt; + } else { + float r = (rgb[0] - ambient[0]) / mt + ambient[0]; + float g = (rgb[1] - ambient[1]) / mt + ambient[1]; + float b = (rgb[2] - ambient[2]) / mt + ambient[2]; - img->r(y, x) = r; - img->g(y, x) = g; - img->b(y, x) = b; - } - } - - float oldmed; - findMinMaxPercentile(Y, Y.width() * Y.height(), 0.5, oldmed, 0.5, oldmed, multiThread); - - get_luminance(img, Y, ws, multiThread); - float newmed; - - findMinMaxPercentile(Y, Y.width() * Y.height(), 0.5, newmed, 0.5, newmed, multiThread); - - if (newmed > 1e-5f) { - const float f1 = oldmed / newmed; - const float f = f1 * 65535.f; -#ifdef _OPENMP - #pragma omp parallel for if (multiThread) -#endif - for (int y = 0; y < H; ++y) { - for (int x = 0; x < W; ++x) { - float r = img->r(y, x); - float g = img->g(y, x); - float b = img->b(y, x); - float h, s, l; - Color::rgb2hslfloat(r * f, g * f, b * f, h, s, l); - s = LIM01(s / f1); - Color::hsl2rgbfloat(h, s, l, img->r(y, x), img->g(y, x), img->b(y, x)); + img->r(y, x) = r; + img->g(y, x) = g; + img->b(y, x) = b; } } - } else { - img->normalizeFloatTo65535(); } + + img->normalizeFloatTo65535(); } diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 17afb3371..78ee78f45 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2378,8 +2378,7 @@ DehazeParams::DehazeParams() : enabled(false), strength(50), showDepthMap(false), - depth(0), - detail(0) + depth(25) { } @@ -2389,8 +2388,7 @@ bool DehazeParams::operator ==(const DehazeParams& other) const enabled == other.enabled && strength == other.strength && showDepthMap == other.showDepthMap - && depth == other.depth - && detail == other.detail; + && depth == other.depth; } bool DehazeParams::operator !=(const DehazeParams& other) const @@ -3070,7 +3068,6 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->dehaze.strength, "Dehaze", "Strength", dehaze.strength, keyFile); saveToKeyfile(!pedited || pedited->dehaze.showDepthMap, "Dehaze", "ShowDepthMap", dehaze.showDepthMap, keyFile); saveToKeyfile(!pedited || pedited->dehaze.depth, "Dehaze", "Depth", dehaze.depth, keyFile); - saveToKeyfile(!pedited || pedited->dehaze.detail, "Dehaze", "Detail", dehaze.detail, keyFile); // Directional pyramid denoising saveToKeyfile(!pedited || pedited->dirpyrDenoise.enabled, "Directional Pyramid Denoising", "Enabled", dirpyrDenoise.enabled, keyFile); @@ -4658,7 +4655,6 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Dehaze", "Strength", pedited, dehaze.strength, pedited->dehaze.strength); assignFromKeyfile(keyFile, "Dehaze", "ShowDepthMap", pedited, dehaze.showDepthMap, pedited->dehaze.showDepthMap); assignFromKeyfile(keyFile, "Dehaze", "Depth", pedited, dehaze.depth, pedited->dehaze.depth); - assignFromKeyfile(keyFile, "Dehaze", "Detail", pedited, dehaze.detail, pedited->dehaze.detail); } if (keyFile.has_group("Film Simulation")) { diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 143fedbe8..d335ad029 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1232,7 +1232,6 @@ struct DehazeParams { int strength; bool showDepthMap; int depth; - int detail; DehazeParams(); diff --git a/rtgui/dehaze.cc b/rtgui/dehaze.cc index ef5075ab7..0f0892ac6 100644 --- a/rtgui/dehaze.cc +++ b/rtgui/dehaze.cc @@ -32,27 +32,21 @@ Dehaze::Dehaze(): FoldableToolPanel(this, "dehaze", M("TP_DEHAZE_LABEL"), false, EvDehazeStrength = m->newEvent(HDR, "HISTORY_MSG_DEHAZE_STRENGTH"); EvDehazeShowDepthMap = m->newEvent(HDR, "HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP"); EvDehazeDepth = m->newEvent(HDR, "HISTORY_MSG_DEHAZE_DEPTH"); - EvDehazeDetail = m->newEvent(HDR, "HISTORY_MSG_DEHAZE_DETAIL"); strength = Gtk::manage(new Adjuster(M("TP_DEHAZE_STRENGTH"), 0., 100., 1., 50.)); strength->setAdjusterListener(this); strength->show(); - depth = Gtk::manage(new Adjuster(M("TP_DEHAZE_DEPTH"), -100., 100., 1., 0.)); + depth = Gtk::manage(new Adjuster(M("TP_DEHAZE_DEPTH"), 0., 100., 1., 25.)); depth->setAdjusterListener(this); depth->show(); - detail = Gtk::manage(new Adjuster(M("TP_DEHAZE_DETAIL"), -100, 100, 1, 0)); - detail->setAdjusterListener(this); - detail->show(); - showDepthMap = Gtk::manage(new Gtk::CheckButton(M("TP_DEHAZE_SHOW_DEPTH_MAP"))); showDepthMap->signal_toggled().connect(sigc::mem_fun(*this, &Dehaze::showDepthMapChanged)); showDepthMap->show(); pack_start(*strength); pack_start(*depth); - pack_start(*detail); pack_start(*showDepthMap); } @@ -64,7 +58,6 @@ void Dehaze::read(const ProcParams *pp, const ParamsEdited *pedited) if (pedited) { strength->setEditedState(pedited->dehaze.strength ? Edited : UnEdited); depth->setEditedState(pedited->dehaze.depth ? Edited : UnEdited); - detail->setEditedState(pedited->dehaze.detail ? Edited : UnEdited); set_inconsistent(multiImage && !pedited->dehaze.enabled); showDepthMap->set_inconsistent(!pedited->dehaze.showDepthMap); } @@ -72,7 +65,6 @@ void Dehaze::read(const ProcParams *pp, const ParamsEdited *pedited) setEnabled(pp->dehaze.enabled); strength->setValue(pp->dehaze.strength); depth->setValue(pp->dehaze.depth); - detail->setValue(pp->dehaze.detail); showDepthMap->set_active(pp->dehaze.showDepthMap); enableListener(); @@ -83,14 +75,12 @@ void Dehaze::write(ProcParams *pp, ParamsEdited *pedited) { pp->dehaze.strength = strength->getValue(); pp->dehaze.depth = depth->getValue(); - pp->dehaze.detail = detail->getValue(); pp->dehaze.enabled = getEnabled(); pp->dehaze.showDepthMap = showDepthMap->get_active(); if (pedited) { pedited->dehaze.strength = strength->getEditedState(); pedited->dehaze.depth = depth->getEditedState(); - pedited->dehaze.detail = detail->getEditedState(); pedited->dehaze.enabled = !get_inconsistent(); pedited->dehaze.showDepthMap = !showDepthMap->get_inconsistent(); } @@ -100,16 +90,13 @@ void Dehaze::setDefaults(const ProcParams *defParams, const ParamsEdited *pedite { strength->setDefault(defParams->dehaze.strength); depth->setDefault(defParams->dehaze.depth); - detail->setDefault(defParams->dehaze.detail); if (pedited) { strength->setDefaultEditedState(pedited->dehaze.strength ? Edited : UnEdited); depth->setDefaultEditedState(pedited->dehaze.depth ? Edited : UnEdited); - detail->setDefaultEditedState(pedited->dehaze.detail ? Edited : UnEdited); } else { strength->setDefaultEditedState(Irrelevant); depth->setDefaultEditedState(Irrelevant); - detail->setDefaultEditedState(Irrelevant); } } @@ -121,8 +108,6 @@ void Dehaze::adjusterChanged(Adjuster* a, double newval) listener->panelChanged(EvDehazeStrength, a->getTextValue()); } else if (a == depth) { listener->panelChanged(EvDehazeDepth, a->getTextValue()); - } else if (a == detail) { - listener->panelChanged(EvDehazeDetail, a->getTextValue()); } } } @@ -156,7 +141,6 @@ void Dehaze::setBatchMode(bool batchMode) strength->showEditedCB(); depth->showEditedCB(); - detail->showEditedCB(); } diff --git a/rtgui/dehaze.h b/rtgui/dehaze.h index ae6097c86..26cbef74a 100644 --- a/rtgui/dehaze.h +++ b/rtgui/dehaze.h @@ -28,13 +28,11 @@ class Dehaze: public ToolParamBlock, public AdjusterListener, public FoldableToo private: Adjuster *strength; Adjuster *depth; - Adjuster *detail; Gtk::CheckButton *showDepthMap; rtengine::ProcEvent EvDehazeEnabled; rtengine::ProcEvent EvDehazeStrength; rtengine::ProcEvent EvDehazeDepth; - rtengine::ProcEvent EvDehazeDetail; rtengine::ProcEvent EvDehazeShowDepthMap; public: diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index ffc1bd19c..610c6d3e2 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -570,7 +570,6 @@ void ParamsEdited::set(bool v) dehaze.strength = v; dehaze.showDepthMap = v; dehaze.depth = v; - dehaze.detail = v; metadata.mode = v; exif = v; @@ -1128,7 +1127,6 @@ void ParamsEdited::initFrom(const std::vector& dehaze.strength = dehaze.strength && p.dehaze.strength == other.dehaze.strength; dehaze.showDepthMap = dehaze.showDepthMap && p.dehaze.showDepthMap == other.dehaze.showDepthMap; dehaze.depth = dehaze.depth && p.dehaze.depth == other.dehaze.depth; - dehaze.detail = dehaze.detail && p.dehaze.detail == other.dehaze.detail; metadata.mode = metadata.mode && p.metadata.mode == other.metadata.mode; // How the hell can we handle that??? @@ -3135,10 +3133,6 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.dehaze.depth = mods.dehaze.depth; } - if (dehaze.detail) { - toEdit.dehaze.detail = mods.dehaze.detail; - } - if (dehaze.showDepthMap) { toEdit.dehaze.showDepthMap = mods.dehaze.showDepthMap; } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 73a19db88..3142b0136 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -731,7 +731,6 @@ public: bool strength; bool showDepthMap; bool depth; - bool detail; }; From 59339644de501ce539a9d35b25ead22a7e7f5518 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Wed, 17 Oct 2018 15:38:35 +0200 Subject: [PATCH 009/122] dehaze: do not consider out-of-gamut pixels when estimating the ambient light --- rtengine/ipdehaze.cc | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/rtengine/ipdehaze.cc b/rtengine/ipdehaze.cc index 1c5512c2a..37bd53704 100644 --- a/rtengine/ipdehaze.cc +++ b/rtengine/ipdehaze.cc @@ -58,8 +58,7 @@ namespace { #endif -int get_dark_channel(const array2D &R, const array2D &G, const array2D &B, array2D &dst, - int patchsize, float *ambient, bool multithread) +int get_dark_channel(const array2D &R, const array2D &G, const array2D &B, array2D &dst, int patchsize, float *ambient, bool clip, bool multithread) { const int W = R.width(); const int H = R.height(); @@ -89,7 +88,9 @@ int get_dark_channel(const array2D &R, const array2D &G, const arr } val = min(val, yval); } - val = LIM01(val); + if (clip) { + val = LIM01(val); + } for (int yy = y; yy < pH; ++yy) { std::fill(dst[yy]+x, dst[yy]+pW, val); } @@ -120,7 +121,9 @@ float estimate_ambient_light(const array2D &R, const array2D &G, c std::priority_queue p; for (int y = 0; y < H; y += patchsize) { for (int x = 0; x < W; x += patchsize) { - p.push(dark[y][x]); + if (!OOG(dark[y][x], 1.f)) { + p.push(dark[y][x]); + } } } darklim = get_percentile(p, 0.95); @@ -131,7 +134,7 @@ float estimate_ambient_light(const array2D &R, const array2D &G, c for (int y = 0; y < H; y += patchsize) { for (int x = 0; x < W; x += patchsize) { - if (dark[y][x] >= darklim) { + if (dark[y][x] >= darklim && !OOG(dark[y][x], 1.f)) { patches.push_back(std::make_pair(x, y)); } } @@ -245,7 +248,7 @@ void ImProcFunctions::dehaze(Imagefloat *img) extract_channels(img, R, G, B, patchsize, 1e-1, multiThread); patchsize = max(max(W, H) / 600, 2); - npatches = get_dark_channel(R, G, B, dark, patchsize, nullptr, multiThread); + npatches = get_dark_channel(R, G, B, dark, patchsize, nullptr, false, multiThread); DEBUG_DUMP(dark); max_t = estimate_ambient_light(R, G, B, dark, patchsize, npatches, ambient); @@ -256,7 +259,7 @@ void ImProcFunctions::dehaze(Imagefloat *img) << std::endl; } - get_dark_channel(R, G, B, dark, patchsize, ambient, multiThread); + get_dark_channel(R, G, B, dark, patchsize, ambient, true, multiThread); } if (min(ambient[0], ambient[1], ambient[2]) < 0.01f) { @@ -289,6 +292,10 @@ void ImProcFunctions::dehaze(Imagefloat *img) DEBUG_DUMP(t); + if (options.rtSettings.verbose) { + std::cout << "dehaze: max distance is " << max_t << std::endl; + } + float depth = -float(params->dehaze.depth) / 100.f; const float t0 = max(1e-3f, std::exp(depth * max_t)); const float teps = 1e-3f; From 2026fe1d1715a77b94ba931a2f89c0f524fb61b9 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Thu, 18 Oct 2018 08:53:02 +0200 Subject: [PATCH 010/122] guided filter: added support for automatic computation of subsampling factor --- rtengine/guidedfilter.cc | 28 ++++++++++++++++++++++++++++ rtengine/guidedfilter.h | 2 +- rtengine/ipdehaze.cc | 8 ++++---- 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/rtengine/guidedfilter.cc b/rtengine/guidedfilter.cc index f6b702a73..a3dccf298 100644 --- a/rtengine/guidedfilter.cc +++ b/rtengine/guidedfilter.cc @@ -52,11 +52,39 @@ namespace rtengine { #endif +namespace { + +int calculate_subsampling(int w, int h, int r) +{ + if (r == 1) { + return 1; + } + + if (max(w, h) <= 600) { + return 1; + } + + for (int s = 5; s > 0; --s) { + if (r % s == 0) { + return s; + } + } + + return LIM(r / 2, 2, 4); +} + +} // namespace + + void guidedFilter(const array2D &guide, const array2D &src, array2D &dst, int r, float epsilon, bool multithread, int subsampling) { const int W = src.width(); const int H = src.height(); + if (subsampling <= 0) { + subsampling = calculate_subsampling(W, H, r); + } + enum Op { MUL, DIVEPSILON, ADD, SUB, ADDMUL, SUBMUL }; const auto apply = diff --git a/rtengine/guidedfilter.h b/rtengine/guidedfilter.h index 3f987f80e..6691af251 100644 --- a/rtengine/guidedfilter.h +++ b/rtengine/guidedfilter.h @@ -24,6 +24,6 @@ namespace rtengine { -void guidedFilter(const array2D &guide, const array2D &src, array2D &dst, int r, float epsilon, bool multithread, int subsampling=4); +void guidedFilter(const array2D &guide, const array2D &src, array2D &dst, int r, float epsilon, bool multithread, int subsampling=0); } // namespace rtengine diff --git a/rtengine/ipdehaze.cc b/rtengine/ipdehaze.cc index 37bd53704..92eaa4062 100644 --- a/rtengine/ipdehaze.cc +++ b/rtengine/ipdehaze.cc @@ -208,9 +208,9 @@ void extract_channels(Imagefloat *img, array2D &r, array2D &g, arr } } - guidedFilter(r, r, r, radius, epsilon, multithread, radius / 2); - guidedFilter(g, g, g, radius, epsilon, multithread, radius / 2); - guidedFilter(b, b, b, radius, epsilon, multithread, radius / 2); + guidedFilter(r, r, r, radius, epsilon, multithread); + guidedFilter(g, g, g, radius, epsilon, multithread); + guidedFilter(b, b, b, radius, epsilon, multithread); } @@ -287,7 +287,7 @@ void ImProcFunctions::dehaze(Imagefloat *img) { array2D guideB(W, H, img->b.ptrs, ARRAY2D_BYREFERENCE); - guidedFilter(guideB, t_tilde, t, radius, epsilon, multiThread, patchsize); + guidedFilter(guideB, t_tilde, t, radius, epsilon, multiThread); } DEBUG_DUMP(t); From 1a3fd9f157858b9e69709dae44afd1482ae68ac4 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Thu, 25 Oct 2018 16:46:11 +0200 Subject: [PATCH 011/122] Added new color toning method "L*a*b* regions" Allows to specify various "regions" of the image with masks, and to correct for hue, saturation and lightness. Inspired by the existing L*a*b* grid (in turn taken from darktable) --- rtdata/languages/default | 48 +++-- rtengine/CMakeLists.txt | 1 + rtengine/dcrop.cc | 1 + rtengine/improccoordinator.cc | 1 + rtengine/improcfun.cc | 36 ++++ rtengine/improcfun.h | 1 + rtengine/iplabregions.cc | 159 ++++++++++++++ rtengine/procparams.cc | 125 +++++++++++- rtengine/procparams.h | 16 ++ rtengine/rt_math.h | 16 ++ rtengine/rtthumbnail.cc | 1 + rtengine/simpleprocess.cc | 1 + rtgui/colortoning.cc | 375 +++++++++++++++++++++++++++++++++- rtgui/colortoning.h | 40 ++++ rtgui/labgrid.cc | 41 +++- rtgui/labgrid.h | 10 +- rtgui/paramsedited.cc | 12 ++ rtgui/paramsedited.h | 2 + 18 files changed, 854 insertions(+), 32 deletions(-) create mode 100644 rtengine/iplabregions.cc diff --git a/rtdata/languages/default b/rtdata/languages/default index cc978ce92..40ff2ff88 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -398,7 +398,7 @@ HISTORY_MSG_145;Microcontrast - Uniformity HISTORY_MSG_146;Edge sharpening HISTORY_MSG_147;ES - Luminance only HISTORY_MSG_148;Microcontrast -HISTORY_MSG_149;Microcontrast - 3×3 matrix +HISTORY_MSG_149;Microcontrast - 33 matrix HISTORY_MSG_150;Post-demosaic artifact/noise red. HISTORY_MSG_151;Vibrance HISTORY_MSG_152;Vib - Pastel tones @@ -728,6 +728,14 @@ HISTORY_MSG_492;RGB Curves HISTORY_MSG_493;L*a*b* Adjustments HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - L*a*b* region list +HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - L*a*b* region saturation +HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - L*a*b* region lightness +HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - L*a*b* region H mask +HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - L*a*b* region C mask +HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L*a*b* region L mask +HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - L*a*b* region show mask HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold HISTORY_MSG_HISTMATCHING;Auto-matched tone curve @@ -808,7 +816,7 @@ IPTCPANEL_CITY;City IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. IPTCPANEL_COPYHINT;Copy IPTC settings to clipboard. IPTCPANEL_COPYRIGHT;Copyright notice -IPTCPANEL_COPYRIGHTHINT;Enter a Notice on the current owner of the Copyright for this image, such as ©2008 Jane Doe. +IPTCPANEL_COPYRIGHTHINT;Enter a Notice on the current owner of the Copyright for this image, such as 2008 Jane Doe. IPTCPANEL_COUNTRY;Country IPTCPANEL_COUNTRYHINT;Enter the name of the country pictured in this image. IPTCPANEL_CREATOR;Creator @@ -1367,9 +1375,9 @@ TP_COARSETRAF_TOOLTIP_ROTLEFT;Rotate left.\n\nShortcuts:\n[ - Multiple Ed TP_COARSETRAF_TOOLTIP_ROTRIGHT;Rotate right.\n\nShortcuts:\n] - Multiple Editor Tabs Mode,\nAlt-] - Single Editor Tab Mode. TP_COARSETRAF_TOOLTIP_VFLIP;Flip vertically. TP_COLORAPP_ADAPTSCENE;Scene absolute luminance -TP_COLORAPP_ADAPTSCENE_TOOLTIP;Absolute luminance of the scene environment (cd/m²).\n1) Calculated from the Exif data:\nShutter speed - ISO speed - F number - camera exposure correction.\n2) Calculated from the raw white point and RT's Exposure Compensation slider. -TP_COLORAPP_ADAPTVIEWING;Viewing absolute luminance (cd/m²) -TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16cd/m²). +TP_COLORAPP_ADAPTSCENE_TOOLTIP;Absolute luminance of the scene environment (cd/m).\n1) Calculated from the Exif data:\nShutter speed - ISO speed - F number - camera exposure correction.\n2) Calculated from the raw white point and RT's Exposure Compensation slider. +TP_COLORAPP_ADAPTVIEWING;Viewing absolute luminance (cd/m) +TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16cd/m). TP_COLORAPP_ADAP_AUTO_TOOLTIP;If the checkbox is checked (recommended) RawTherapee calculates an optimum value from the Exif data.\nTo set the value manually, uncheck the checkbox first. TP_COLORAPP_ALGO;Algorithm TP_COLORAPP_ALGO_ALL;All @@ -1406,7 +1414,7 @@ TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] TP_COLORAPP_GAMUT;Gamut control (L*a*b*) TP_COLORAPP_GAMUT_TOOLTIP;Allow gamut control in L*a*b* mode. TP_COLORAPP_HUE;Hue (h) -TP_COLORAPP_HUE_TOOLTIP;Hue (h) - angle between 0° and 360°. +TP_COLORAPP_HUE_TOOLTIP;Hue (h) - angle between 0 and 360. TP_COLORAPP_LABEL;CIE Color Appearance Model 2002 TP_COLORAPP_LABEL_CAM02;Image Adjustments TP_COLORAPP_LABEL_SCENE;Scene Conditions @@ -1458,6 +1466,16 @@ TP_COLORTONING_LAB;L*a*b* blending TP_COLORTONING_LABEL;Color Toning TP_COLORTONING_LABGRID;L*a*b* color correction grid TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 +TP_COLORTONING_LABREGION_LIST_TITLE;Correction +TP_COLORTONING_LABREGION_SATURATION;Saturation +TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +TP_COLORTONING_LABREGION_MASK;Mask +TP_COLORTONING_LABREGION_HUEMASK;H +TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +TP_COLORTONING_LABREGION_SHOWMASK;Show mask +TP_COLORTONING_LABREGIONS;L*a*b* correction regions TP_COLORTONING_LUMA;Luminance TP_COLORTONING_LUMAMODE;Preserve luminance TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change color (red, green, cyan, blue, etc.) the luminance of each pixel is preserved. @@ -1553,16 +1571,16 @@ TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations -TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. +TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Applying three median filter iterations with a 33 window size often leads to better results than using one median filter iteration with a 77 window size. TP_DIRPYRDENOISE_MEDIAN_TYPE;Median type -TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. +TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n33 soft: treats 5 pixels in a 33 pixel window.\n33: treats 9 pixels in a 33 pixel window.\n55 soft: treats 13 pixels in a 55 pixel window.\n55: treats 25 pixels in a 55 pixel window.\n77: treats 49 pixels in a 77 pixel window.\n99: treats 81 pixels in a 99 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. TP_DIRPYRDENOISE_SLI;Slider -TP_DIRPYRDENOISE_TYPE_3X3;3×3 -TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft -TP_DIRPYRDENOISE_TYPE_5X5;5×5 -TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft -TP_DIRPYRDENOISE_TYPE_7X7;7×7 -TP_DIRPYRDENOISE_TYPE_9X9;9×9 +TP_DIRPYRDENOISE_TYPE_3X3;33 +TP_DIRPYRDENOISE_TYPE_3X3SOFT;33 soft +TP_DIRPYRDENOISE_TYPE_5X5;55 +TP_DIRPYRDENOISE_TYPE_5X5SOFT;55 soft +TP_DIRPYRDENOISE_TYPE_7X7;77 +TP_DIRPYRDENOISE_TYPE_9X9;99 TP_DIRPYREQUALIZER_ALGO;Skin Color Range TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts @@ -2008,7 +2026,7 @@ TP_SHARPENING_USM;Unsharp Mask TP_SHARPENMICRO_AMOUNT;Quantity TP_SHARPENMICRO_CONTRAST;Contrast threshold TP_SHARPENMICRO_LABEL;Microcontrast -TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5 +TP_SHARPENMICRO_MATRIX;33 matrix instead of 55 TP_SHARPENMICRO_UNIFORMITY;Uniformity TP_SOFTLIGHT_LABEL;Soft Light TP_SOFTLIGHT_STRENGTH;Strength diff --git a/rtengine/CMakeLists.txt b/rtengine/CMakeLists.txt index 759316e33..063fec2f7 100644 --- a/rtengine/CMakeLists.txt +++ b/rtengine/CMakeLists.txt @@ -128,6 +128,7 @@ set(RTENGINESOURCEFILES vng4_demosaic_RT.cc ipsoftlight.cc guidedfilter.cc + iplabregions.cc ) if(LENSFUN_HAS_LOAD_DIRECTORY) diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 3b1ebfdab..5859493e7 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -896,6 +896,7 @@ void Crop::update(int todo) // parent->ipf.MSR(labnCrop, labnCrop->W, labnCrop->H, 1); parent->ipf.chromiLuminanceCurve(this, 1, labnCrop, labnCrop, parent->chroma_acurve, parent->chroma_bcurve, parent->satcurve, parent->lhskcurve, parent->clcurve, parent->lumacurve, utili, autili, butili, ccutili, cclutili, clcutili, dummy, dummy); parent->ipf.vibrance(labnCrop); + parent->ipf.labColorCorrectionRegions(labnCrop); if ((params.colorappearance.enabled && !params.colorappearance.tonecie) || (!params.colorappearance.enabled)) { parent->ipf.EPDToneMap(labnCrop, 5, skip); diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 5cc93d3c7..9d552f747 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -717,6 +717,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) histLCurve.clear(); ipf.chromiLuminanceCurve(nullptr, pW, nprevl, nprevl, chroma_acurve, chroma_bcurve, satcurve, lhskcurve, clcurve, lumacurve, utili, autili, butili, ccutili, cclutili, clcutili, histCCurve, histLCurve); ipf.vibrance(nprevl); + ipf.labColorCorrectionRegions(nprevl); if ((params.colorappearance.enabled && !params.colorappearance.tonecie) || (!params.colorappearance.enabled)) { ipf.EPDToneMap(nprevl, 5, scale); diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 7d9d080e2..013a629fd 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -4151,6 +4151,42 @@ void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW } } + //------------------------------------------------------------------------- + // support for pipettes for the new LabRegions color toning mode this is a + // hack to fill the pipette buffers also when + // !params->labCurve.enabled. It is ugly, but it's the smallest code + // change that I could find + //------------------------------------------------------------------------- + class TempParams { + const ProcParams **p_; + const ProcParams *old_; + ProcParams tmp_; + + public: + explicit TempParams(const ProcParams **p): p_(p) + { + old_ = *p; + tmp_.labCurve.enabled = true; + *p_ = &tmp_; + } + + ~TempParams() + { + *p_ = old_; + } + }; + std::unique_ptr tempparams; + bool pipette_for_colortoning_labregions = + editPipette && + params->colorToning.enabled && params->colorToning.method == "LabRegions"; + if (!params->labCurve.enabled && pipette_for_colortoning_labregions) { + utili = autili = butili = ccutili = cclutili = clcutili = false; + tempparams.reset(new TempParams(¶ms)); + curve.makeIdentity(); + } + //------------------------------------------------------------------------- + + if (!params->labCurve.enabled) { if (editPipette && (editID == EUID_Lab_LCurve || editID == EUID_Lab_aCurve || editID == EUID_Lab_bCurve || editID == EUID_Lab_LHCurve || editID == EUID_Lab_CHCurve || editID == EUID_Lab_HHCurve || editID == EUID_Lab_CLCurve || editID == EUID_Lab_CCurve || editID == EUID_Lab_LCCurve)) { // fill pipette buffer with zeros to avoid crashes diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index a97ecef40..982c48cfe 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -344,6 +344,7 @@ public: void colorToningLabGrid(LabImage *lab, int xstart, int xend, int ystart, int yend, bool MultiThread); void shadowsHighlights(LabImage *lab); void softLight(float *red, float *green, float *blue, int istart, int jstart, int tW, int tH, int TS); + void labColorCorrectionRegions(LabImage *lab); Image8* lab2rgb(LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm, bool consider_histogram_settings = true); Imagefloat* lab2rgbOut(LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm); diff --git a/rtengine/iplabregions.cc b/rtengine/iplabregions.cc new file mode 100644 index 000000000..e69f91d5a --- /dev/null +++ b/rtengine/iplabregions.cc @@ -0,0 +1,159 @@ +/* -*- C++ -*- + * + * This file is part of RawTherapee. + * + * Copyright 2018 Alberto Griggio + * + * RawTherapee is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RawTherapee is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RawTherapee. If not, see . + */ + +#ifdef _OPENMP +#include +#endif + +#include "improcfun.h" +#include "guidedfilter.h" + +namespace rtengine { + +void ImProcFunctions::labColorCorrectionRegions(LabImage *lab) +{ + if (!params->colorToning.enabled || params->colorToning.method != "LabRegions") { + return; + } + + const float factor = ColorToningParams::LABGRID_CORR_MAX * 3.f; + const float scaling = 1.f; + + int n = params->colorToning.labregions.size(); + std::vector> hmask(n); + std::vector> cmask(n); + std::vector> lmask(n); + + for (int i = 0; i < n; ++i) { + auto &r = params->colorToning.labregions[i]; + if (!r.hueMask.empty() && r.hueMask[0] != FCT_Linear) { + hmask[i].reset(new FlatCurve(r.hueMask, true)); + } + if (!r.chromaticityMask.empty() && r.chromaticityMask[0] != FCT_Linear) { + cmask[i].reset(new FlatCurve(r.chromaticityMask, false)); + } + if (!r.lightnessMask.empty() && r.lightnessMask[0] != FCT_Linear) { + lmask[i].reset(new FlatCurve(r.lightnessMask, false)); + } + } + + array2D guide(lab->W, lab->H, lab->L, ARRAY2D_BYREFERENCE); + std::vector> abmask(n); + std::vector> Lmask(n); + for (int i = 0; i < n; ++i) { + abmask[i](lab->W, lab->H); + Lmask[i](lab->W, lab->H); + } + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int y = 0; y < lab->H; ++y) { + for (int x = 0; x < lab->W; ++x) { + float l = lab->L[y][x]; + float a = lab->a[y][x]; + float b = lab->b[y][x]; + float c, h; + Color::Lab2Lch(a, b, c, h); + float c1 = lin2log(c * (327.68f / 48000.f), 10.f); + float h1 = Color::huelab_to_huehsv2(h); + h1 = h1 + 1.f/6.f; + if (h1 > 1.f) { + h1 -= 1.f; + } + h1 = lin2log(h1, 3.f); + float l1 = l / 32768.f; + + if (params->colorToning.labregionsShowMask >= 0 && params->colorToning.labregionsShowMask < n) { + int idx = params->colorToning.labregionsShowMask; + auto &hm = hmask[idx]; + auto &cm = cmask[idx]; + auto &lm = lmask[idx]; + float blend = (hm ? hm->getVal(h1) : 1.f) * (cm ? cm->getVal(c1) : 1.f) * (lm ? lm->getVal(l1) : 1.f); + abmask[idx][y][x] = blend; + } else { + for (int i = 0; i < n; ++i) { + auto &hm = hmask[i]; + auto &cm = cmask[i]; + auto &lm = lmask[i]; + float blend = (hm ? hm->getVal(h1) : 1.f) * (cm ? cm->getVal(c1) : 1.f) * (lm ? lm->getVal(l1) : 1.f); + Lmask[i][y][x] = abmask[i][y][x] = blend; + } + } + } + } + + for (int i = 0; i < n; ++i) { + rtengine::guidedFilter(guide, abmask[i], abmask[i], max(int(4 / scale + 0.5), 1), 0.001, multiThread); + rtengine::guidedFilter(guide, Lmask[i], Lmask[i], max(int(25 / scale + 0.5), 1), 0.0001, multiThread); + } + + if (params->colorToning.labregionsShowMask >= 0 && params->colorToning.labregionsShowMask < n) { + int idx = params->colorToning.labregionsShowMask; +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int y = 0; y < lab->H; ++y) { + for (int x = 0; x < lab->W; ++x) { + auto blend = abmask[idx][y][x]; + lab->a[y][x] = 0.f; + lab->b[y][x] = blend * 42000.f; + lab->L[y][x] = LIM(lab->L[y][x] + 32768.f * blend, 0.f, 32768.f); + } + } + + return; + } + + const auto abcoord = + [](float x) -> float + { + const float m = ColorToningParams::LABGRID_CORR_MAX; + return SGN(x) * log2lin(std::abs(x) / m, 4.f) * m; + }; + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int y = 0; y < lab->H; ++y) { + for (int x = 0; x < lab->W; ++x) { + float l = lab->L[y][x]; + float a = lab->a[y][x]; + float b = lab->b[y][x]; + + for (int i = 0; i < n; ++i) { + auto &r = params->colorToning.labregions[i]; + float blend = abmask[i][y][x]; + float s = 1.f + r.saturation / 100.f; + float a_new = s * (a + 32768.f * abcoord(r.a) / factor / scaling); + float b_new = s * (b + 32768.f * abcoord(r.b) / factor / scaling); + float l_new = l * (1.f + r.lightness / 1000.f); + l = intp(Lmask[i][y][x], l_new, l); + a = intp(blend, a_new, a); + b = intp(blend, b_new, b); + } + lab->L[y][x] = l; + lab->a[y][x] = a; + lab->b[y][x] = b; + } + } +} + +} // namespace rtengine diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 526a36765..bfb91aea8 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -614,6 +614,66 @@ bool LocalContrastParams::operator!=(const LocalContrastParams &other) const const double ColorToningParams::LABGRID_CORR_MAX = 12000.f; const double ColorToningParams::LABGRID_CORR_SCALE = 3.f; +ColorToningParams::LabCorrectionRegion::LabCorrectionRegion(): + a(0), + b(0), + saturation(0), + lightness(0), + hueMask{ + FCT_MinMaxCPoints, + 0.166666667, + 1., + 0.35, + 0.35, + 0.8287775246, + 1., + 0.35, + 0.35 + }, + chromaticityMask{ + FCT_MinMaxCPoints, + 0., + 1., + 0.35, + 0.35, + 1., + 1., + 0.35, + 0.35 + }, + lightnessMask{ + FCT_MinMaxCPoints, + 0., + 1., + 0.35, + 0.35, + 1., + 1., + 0.35, + 0.35 + } +{ +} + + +bool ColorToningParams::LabCorrectionRegion::operator==(const LabCorrectionRegion &other) const +{ + return a == other.a + && b == other.b + && saturation == other.saturation + && lightness == other.lightness + && hueMask == other.hueMask + && chromaticityMask == other.chromaticityMask + && lightnessMask == other.lightnessMask; +} + + +bool ColorToningParams::LabCorrectionRegion::operator!=(const LabCorrectionRegion &other) const +{ + return !(*this == other); +} + + ColorToningParams::ColorToningParams() : enabled(false), autosat(true), @@ -688,7 +748,9 @@ ColorToningParams::ColorToningParams() : labgridALow(0.0), labgridBLow(0.0), labgridAHigh(0.0), - labgridBHigh(0.0) + labgridBHigh(0.0), + labregions{LabCorrectionRegion()}, + labregionsShowMask(-1) { } @@ -724,7 +786,9 @@ bool ColorToningParams::operator ==(const ColorToningParams& other) const && labgridALow == other.labgridALow && labgridBLow == other.labgridBLow && labgridAHigh == other.labgridAHigh - && labgridBHigh == other.labgridBHigh; + && labgridBHigh == other.labgridBHigh + && labregions == other.labregions + && labregionsShowMask == other.labregionsShowMask; } bool ColorToningParams::operator !=(const ColorToningParams& other) const @@ -3383,6 +3447,20 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->colorToning.labgridBLow, "ColorToning", "LabGridBLow", colorToning.labgridBLow, keyFile); saveToKeyfile(!pedited || pedited->colorToning.labgridAHigh, "ColorToning", "LabGridAHigh", colorToning.labgridAHigh, keyFile); saveToKeyfile(!pedited || pedited->colorToning.labgridBHigh, "ColorToning", "LabGridBHigh", colorToning.labgridBHigh, keyFile); + if (!pedited || pedited->colorToning.labregions) { + for (size_t j = 0; j < colorToning.labregions.size(); ++j) { + std::string n = std::to_string(j+1); + auto &l = colorToning.labregions[j]; + putToKeyfile("ColorToning", Glib::ustring("LabRegionA_") + n, l.a, keyFile); + putToKeyfile("ColorToning", Glib::ustring("LabRegionB_") + n, l.b, keyFile); + putToKeyfile("ColorToning", Glib::ustring("LabRegionSaturation_") + n, l.saturation, keyFile); + putToKeyfile("ColorToning", Glib::ustring("LabRegionLightness_") + n, l.lightness, keyFile); + putToKeyfile("ColorToning", Glib::ustring("LabRegionHueMask_") + n, l.hueMask, keyFile); + putToKeyfile("ColorToning", Glib::ustring("LabRegionChromaticityMask_") + n, l.chromaticityMask, keyFile); + putToKeyfile("ColorToning", Glib::ustring("LabRegionLightnessMask_") + n, l.lightnessMask, keyFile); + } + } + saveToKeyfile(!pedited || pedited->colorToning.labregionsShowMask, "ColorToning", "LabRegionsShowMask", colorToning.labregionsShowMask, keyFile); // Raw saveToKeyfile(!pedited || pedited->raw.darkFrame, "RAW", "DarkFrame", relativePathIfInside(fname, fnameAbsolute, raw.dark_frame), keyFile); @@ -4740,6 +4818,49 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) colorToning.labgridBLow *= scale; colorToning.labgridBHigh *= scale; } + std::vector lg; + bool found = false; + bool done = false; + for (int i = 1; !done; ++i) { + ColorToningParams::LabCorrectionRegion cur; + done = true; + std::string n = std::to_string(i); + if (assignFromKeyfile(keyFile, "ColorToning", Glib::ustring("LabRegionA_") + n, pedited, cur.a, pedited->colorToning.labregions)) { + found = true; + done = false; + } + if (assignFromKeyfile(keyFile, "ColorToning", Glib::ustring("LabRegionB_") + n, pedited, cur.b, pedited->colorToning.labregions)) { + found = true; + done = false; + } + if (assignFromKeyfile(keyFile, "ColorToning", Glib::ustring("LabRegionSaturation_") + n, pedited, cur.saturation, pedited->colorToning.labregions)) { + found = true; + done = false; + } + if (assignFromKeyfile(keyFile, "ColorToning", Glib::ustring("LabRegionLightness_") + n, pedited, cur.lightness, pedited->colorToning.labregions)) { + found = true; + done = false; + } + if (assignFromKeyfile(keyFile, "ColorToning", Glib::ustring("LabRegionHueMask_") + n, pedited, cur.hueMask, pedited->colorToning.labregions)) { + found = true; + done = false; + } + if (assignFromKeyfile(keyFile, "ColorToning", Glib::ustring("LabRegionChromaticityMask_") + n, pedited, cur.chromaticityMask, pedited->colorToning.labregions)) { + found = true; + done = false; + } + if (assignFromKeyfile(keyFile, "ColorToning", Glib::ustring("LabRegionLightnessMask_") + n, pedited, cur.lightnessMask, pedited->colorToning.labregions)) { + found = true; + done = false; + } + if (!done) { + lg.emplace_back(cur); + } + } + if (found) { + colorToning.labregions = std::move(lg); + } + assignFromKeyfile(keyFile, "ColorToning", "LabRegionsShowMask", pedited, colorToning.labregionsShowMask, pedited->colorToning.labregionsShowMask); } if (keyFile.has_group("RAW")) { diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 22868a844..ad0339325 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -455,6 +455,22 @@ struct ColorToningParams { static const double LABGRID_CORR_MAX; static const double LABGRID_CORR_SCALE; + struct LabCorrectionRegion { + double a; + double b; + double saturation; + double lightness; + std::vector hueMask; + std::vector chromaticityMask; + std::vector lightnessMask; + + LabCorrectionRegion(); + bool operator==(const LabCorrectionRegion &other) const; + bool operator!=(const LabCorrectionRegion &other) const; + }; + std::vector labregions; + int labregionsShowMask; + ColorToningParams(); bool operator ==(const ColorToningParams& other) const; diff --git a/rtengine/rt_math.h b/rtengine/rt_math.h index 8d55b492e..9342f5430 100644 --- a/rtengine/rt_math.h +++ b/rtengine/rt_math.h @@ -220,5 +220,21 @@ std::array dotProduct(const std::array, 3> &a, const std: return res; } + +template +T lin2log(T x, T base) +{ + constexpr T one(1); + return std::log(x * (base - one) + one) / std::log(base); +} + + +template +T log2lin(T x, T base) +{ + constexpr T one(1); + return (std::pow(base, x) - one) / (base - one); +} + } diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index 79dee36bf..7adb88490 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -1363,6 +1363,7 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT ipf.chromiLuminanceCurve (nullptr, 1, labView, labView, curve1, curve2, satcurve, lhskcurve, clcurve, lumacurve, utili, autili, butili, ccutili, cclutili, clcutili, dummy, dummy); ipf.vibrance (labView); + ipf.labColorCorrectionRegions(labView); if ((params.colorappearance.enabled && !params.colorappearance.tonecie) || !params.colorappearance.enabled) { ipf.EPDToneMap (labView, 5, 6); diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 06e2b13bf..cf933bdcb 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -1082,6 +1082,7 @@ private: ipf.vibrance (labView); + ipf.labColorCorrectionRegions(labView); if ((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled)) { ipf.impulsedenoise (labView); diff --git a/rtgui/colortoning.cc b/rtgui/colortoning.cc index 8b357c3f9..79e913019 100644 --- a/rtgui/colortoning.cc +++ b/rtgui/colortoning.cc @@ -11,6 +11,8 @@ using namespace rtengine; using namespace rtengine::procparams; +static constexpr int ID_LABREGION_HUE = 5; + ColorToning::ColorToning () : FoldableToolPanel(this, "colortoning", M("TP_COLORTONING_LABEL"), false, true) { nextbw = 0; @@ -25,6 +27,7 @@ ColorToning::ColorToning () : FoldableToolPanel(this, "colortoning", M("TP_COLOR method->append (M("TP_COLORTONING_SPLITCOCO")); method->append (M("TP_COLORTONING_SPLITLR")); method->append(M("TP_COLORTONING_LABGRID")); + method->append(M("TP_COLORTONING_LABREGIONS")); method->set_active (0); method->set_tooltip_text (M("TP_COLORTONING_METHOD_TOOLTIP")); @@ -321,7 +324,7 @@ ColorToning::ColorToning () : FoldableToolPanel(this, "colortoning", M("TP_COLOR auto m = ProcEventMapper::getInstance(); EvColorToningLabGridValue = m->newEvent(RGBCURVE, "HISTORY_MSG_COLORTONING_LABGRID_VALUE"); labgridBox = Gtk::manage(new Gtk::HBox()); - labgrid = Gtk::manage(new LabGrid(EvColorToningLabGridValue)); + labgrid = Gtk::manage(new LabGrid(EvColorToningLabGridValue, M("TP_COLORTONING_LABGRID_VALUES"))); labgridBox->pack_start(*labgrid, true, true); labgridReset = Gtk::manage(new Gtk::Button ()); labgridReset->add (*Gtk::manage(new RTImage ("undo-small.png", "redo-small.png"))); @@ -336,6 +339,116 @@ ColorToning::ColorToning () : FoldableToolPanel(this, "colortoning", M("TP_COLOR pack_start(*labgridBox, Gtk::PACK_EXPAND_WIDGET, 4); //------------------------------------------------------------------------ + //------------------------------------------------------------------------ + // LAB regions + + const auto add_button = + [&](Gtk::Button *btn, Gtk::Box *box) -> void + { + setExpandAlignProperties(btn, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_START); + btn->set_relief(Gtk::RELIEF_NONE); + btn->get_style_context()->add_class(GTK_STYLE_CLASS_FLAT); + btn->set_can_focus(false); + btn->set_size_request(-1, 20); + box->pack_start(*btn, false, false); + }; + + EvLabRegionList = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_COLORTONING_LABREGION_LIST"); + EvLabRegionAB = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_COLORTONING_LABREGION_AB"); + EvLabRegionSaturation = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_COLORTONING_LABREGION_SATURATION"); + EvLabRegionLightness = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS"); + EvLabRegionHueMask = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_COLORTONING_LABREGION_HUEMASK"); + EvLabRegionChromaticityMask = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK"); + EvLabRegionLightnessMask = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK"); + EvLabRegionShowMask = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK"); + labRegionBox = Gtk::manage(new Gtk::VBox()); + + labRegionList = Gtk::manage(new Gtk::ListViewText(3)); + labRegionList->set_size_request(-1, 100); + labRegionList->set_column_title(0, "#"); + labRegionList->set_column_title(1, M("TP_COLORTONING_LABREGION_LIST_TITLE")); + labRegionList->set_column_title(2, M("TP_COLORTONING_LABREGION_MASK")); + labRegionList->set_activate_on_single_click(true); + labRegionSelectionConn = labRegionList->get_selection()->signal_changed().connect(sigc::mem_fun(this, &ColorToning::onLabRegionSelectionChanged)); + Gtk::HBox *hb = Gtk::manage(new Gtk::HBox()); + hb->pack_start(*labRegionList, Gtk::PACK_EXPAND_WIDGET); + Gtk::VBox *vb = Gtk::manage(new Gtk::VBox()); + labRegionAdd = Gtk::manage(new Gtk::Button()); + labRegionAdd->add(*Gtk::manage(new RTImage("add-small.png"))); + labRegionAdd->signal_clicked().connect(sigc::mem_fun(*this, &ColorToning::labRegionAddPressed)); + add_button(labRegionAdd, vb); + labRegionRemove = Gtk::manage(new Gtk::Button()); + labRegionRemove->add(*Gtk::manage(new RTImage("remove-small.png"))); + labRegionRemove->signal_clicked().connect(sigc::mem_fun(*this, &ColorToning::labRegionRemovePressed)); + add_button(labRegionRemove, vb); + labRegionUp = Gtk::manage(new Gtk::Button()); + labRegionUp->add(*Gtk::manage(new RTImage("arrow-up-small.png"))); + labRegionUp->signal_clicked().connect(sigc::mem_fun(*this, &ColorToning::labRegionUpPressed)); + add_button(labRegionUp, vb); + labRegionDown = Gtk::manage(new Gtk::Button()); + labRegionDown->add(*Gtk::manage(new RTImage("arrow-down-small.png"))); + labRegionDown->signal_clicked().connect(sigc::mem_fun(*this, &ColorToning::labRegionDownPressed)); + add_button(labRegionDown, vb); + hb->pack_start(*vb, Gtk::PACK_SHRINK); + labRegionBox->pack_start(*hb, true, true); + + labRegionAB = Gtk::manage(new LabGrid(EvLabRegionAB, M("TP_COLORTONING_LABREGION_ABVALUES"), false)); + hb = Gtk::manage(new Gtk::HBox()); + hb->pack_start(*labRegionAB, true, true); + labRegionABReset = Gtk::manage(new Gtk::Button()); + labRegionABReset->set_tooltip_markup(M("ADJUSTER_RESET_TO_DEFAULT")); + labRegionABReset->add(*Gtk::manage(new RTImage("undo-small.png", "redo-small.png"))); + labRegionABReset->signal_button_release_event().connect(sigc::mem_fun(*this, &ColorToning::labRegionResetPressed)); + add_button(labRegionABReset, hb); + labRegionBox->pack_start(*hb); + + labRegionSaturation = Gtk::manage(new Adjuster(M("TP_COLORTONING_LABREGION_SATURATION"), -100, 100, 1, 0)); + labRegionSaturation->setAdjusterListener(this); + labRegionBox->pack_start(*labRegionSaturation); + labRegionLightness = Gtk::manage(new Adjuster(M("TP_COLORTONING_LABREGION_LIGHTNESS"), -100, 100, 1, 0)); + labRegionLightness->setAdjusterListener(this); + labRegionBox->pack_start(*labRegionLightness); + + CurveEditorGroup *labRegionEditorG = Gtk::manage(new CurveEditorGroup(options.lastColorToningCurvesDir, M("TP_COLORTONING_LABREGION_MASK"))); + labRegionEditorG->setCurveListener(this); + + labRegionHueMask = static_cast(labRegionEditorG->addCurve(CT_Flat, M("TP_COLORTONING_LABREGION_HUEMASK"), nullptr, false, true)); + labRegionHueMask->setIdentityValue(0.); + labRegionHueMask->setResetCurve(FlatCurveType(default_params.labregions[0].hueMask[0]), default_params.labregions[0].hueMask); + labRegionHueMask->setCurveColorProvider(this, ID_LABREGION_HUE); + labRegionHueMask->setBottomBarColorProvider(this, ID_LABREGION_HUE); + labRegionHueMask->setEditID(EUID_Lab_HHCurve, BT_SINGLEPLANE_FLOAT); + + labRegionChromaticityMask = static_cast(labRegionEditorG->addCurve(CT_Flat, M("TP_COLORTONING_LABREGION_CHROMATICITYMASK"), nullptr, false, false)); + labRegionChromaticityMask->setIdentityValue(0.); + labRegionChromaticityMask->setResetCurve(FlatCurveType(default_params.labregions[0].chromaticityMask[0]), default_params.labregions[0].chromaticityMask); + labRegionChromaticityMask->setBottomBarColorProvider(this, ID_LABREGION_HUE+1); + labRegionChromaticityMask->setEditID(EUID_Lab_CCurve, BT_SINGLEPLANE_FLOAT); + + labRegionLightnessMask = static_cast(labRegionEditorG->addCurve(CT_Flat, M("TP_COLORTONING_LABREGION_LIGHTNESSMASK"), nullptr, false, false)); + labRegionLightnessMask->setIdentityValue(0.); + labRegionLightnessMask->setResetCurve(FlatCurveType(default_params.labregions[0].lightnessMask[0]), default_params.labregions[0].lightnessMask); + labRegionLightnessMask->setBottomBarBgGradient(milestones); + labRegionLightnessMask->setEditID(EUID_Lab_LCurve, BT_SINGLEPLANE_FLOAT); + + labRegionData = default_params.labregions; + labRegionSelected = 0; + { + auto n = labRegionList->append("1"); + labRegionList->set_text(n, 1, "a=0 b=0 s=0 l=0"); + } + + labRegionEditorG->curveListComplete(); + labRegionEditorG->show(); + labRegionBox->pack_start(*labRegionEditorG, Gtk::PACK_SHRINK, 2); + + labRegionShowMask = Gtk::manage(new Gtk::CheckButton(M("TP_COLORTONING_LABREGION_SHOWMASK"))); + labRegionShowMask->signal_toggled().connect(sigc::mem_fun(*this, &ColorToning::labRegionShowMaskChanged)); + labRegionBox->pack_start(*labRegionShowMask, Gtk::PACK_SHRINK, 4); + + pack_start(*labRegionBox, Gtk::PACK_EXPAND_WIDGET, 4); + //------------------------------------------------------------------------ + show_all(); disableListener(); @@ -358,6 +471,7 @@ void ColorToning::setListener(ToolPanelListener *tpl) { ToolPanel::setListener(tpl); labgrid->setListener(tpl); + labRegionAB->setListener(tpl); } /* @@ -409,6 +523,20 @@ void ColorToning::read (const ProcParams* pp, const ParamsEdited* pedited) clshape->setCurve (pp->colorToning.clcurve); cl2shape->setCurve (pp->colorToning.cl2curve); + labRegionData = pp->colorToning.labregions; + if (labRegionData.empty()) { + labRegionData.emplace_back(rtengine::ColorToningParams::LabCorrectionRegion()); + } + if (pp->colorToning.labregionsShowMask >= 0) { + labRegionSelected = pp->colorToning.labregionsShowMask; + labRegionShowMask->set_active(true); + } else { + labRegionSelected = 0; + labRegionShowMask->set_active(false); + } + labRegionPopulateList(); + labRegionShow(labRegionSelected); + if (pedited) { redlow->setEditedState (pedited->colorToning.redlow ? Edited : UnEdited); greenlow->setEditedState (pedited->colorToning.greenlow ? Edited : UnEdited); @@ -433,6 +561,9 @@ void ColorToning::read (const ProcParams* pp, const ParamsEdited* pedited) lumamode->set_inconsistent (!pedited->colorToning.lumamode); labgrid->setEdited(pedited->colorToning.labgridALow || pedited->colorToning.labgridBLow || pedited->colorToning.labgridAHigh || pedited->colorToning.labgridBHigh); + + labRegionAB->setEdited(pedited->colorToning.labregions); + labRegionShowMask->set_inconsistent(!pedited->colorToning.labregionsShowMask); } redlow->setValue (pp->colorToning.redlow); @@ -480,6 +611,8 @@ void ColorToning::read (const ProcParams* pp, const ParamsEdited* pedited) method->set_active (4); } else if (pp->colorToning.method == "LabGrid") { method->set_active(5); + } else if (pp->colorToning.method == "LabRegions") { + method->set_active(6); } methodChanged(); @@ -534,6 +667,15 @@ void ColorToning::write (ProcParams* pp, ParamsEdited* pedited) labgrid->getParams(pp->colorToning.labgridALow, pp->colorToning.labgridBLow, pp->colorToning.labgridAHigh, pp->colorToning.labgridBHigh); + labRegionGet(labRegionSelected); + labRegionShow(labRegionSelected, true); + pp->colorToning.labregions = labRegionData; + if (labRegionShowMask->get_active()) { + pp->colorToning.labregionsShowMask = labRegionSelected; + } else { + pp->colorToning.labregionsShowMask = -1; + } + if (pedited) { pedited->colorToning.redlow = redlow->getEditedState (); pedited->colorToning.greenlow = greenlow->getEditedState (); @@ -560,6 +702,9 @@ void ColorToning::write (ProcParams* pp, ParamsEdited* pedited) pedited->colorToning.shadowsColSat = shadowsColSat->getEditedState (); pedited->colorToning.labgridALow = pedited->colorToning.labgridBLow = pedited->colorToning.labgridAHigh = pedited->colorToning.labgridBHigh = labgrid->getEdited(); + + pedited->colorToning.labregions = labRegionAB->getEdited(); + pedited->colorToning.labregionsShowMask = !labRegionShowMask->get_inconsistent(); } if (method->get_active_row_number() == 0) { @@ -574,6 +719,8 @@ void ColorToning::write (ProcParams* pp, ParamsEdited* pedited) pp->colorToning.method = "Splitlr"; } else if (method->get_active_row_number() == 5) { pp->colorToning.method = "LabGrid"; + } else if (method->get_active_row_number() == 6) { + pp->colorToning.method = "LabRegions"; } if (twocolor->get_active_row_number() == 0) { @@ -631,6 +778,7 @@ void ColorToning::setDefaults (const ProcParams* defParams, const ParamsEdited* shadowsColSat->setDefault (defParams->colorToning.shadowsColSat); strength->setDefault (defParams->colorToning.strength); labgrid->setDefault(defParams->colorToning.labgridALow, defParams->colorToning.labgridBLow, defParams->colorToning.labgridAHigh, defParams->colorToning.labgridBHigh); + if (pedited) { redlow->setDefaultEditedState (pedited->colorToning.redlow ? Edited : UnEdited); @@ -649,6 +797,8 @@ void ColorToning::setDefaults (const ProcParams* defParams, const ParamsEdited* shadowsColSat->setDefaultEditedState (pedited->colorToning.shadowsColSat ? Edited : UnEdited); strength->setDefaultEditedState (pedited->colorToning.strength ? Edited : UnEdited); labgrid->setEdited((pedited->colorToning.labgridALow || pedited->colorToning.labgridBLow || pedited->colorToning.labgridAHigh || pedited->colorToning.labgridBHigh) ? Edited : UnEdited); + + labRegionAB->setEdited(pedited->colorToning.labregions ? Edited : UnEdited); } else { redlow->setDefaultEditedState (Irrelevant); greenlow->setDefaultEditedState (Irrelevant); @@ -666,6 +816,7 @@ void ColorToning::setDefaults (const ProcParams* defParams, const ParamsEdited* shadowsColSat->setDefaultEditedState (Irrelevant); strength->setDefaultEditedState (Irrelevant); labgrid->setEdited(Edited); + labRegionAB->setEdited(Edited); } } @@ -814,6 +965,7 @@ void ColorToning::methodChanged () if (!batchMode) { labgridBox->hide(); + labRegionBox->hide(); if (method->get_active_row_number() == 0) { // Lab colorSep->show(); @@ -962,7 +1114,7 @@ void ColorToning::methodChanged () chanMixerBox->hide(); neutrHBox->hide(); lumamode->show(); - } else if (method->get_active_row_number() == 5) { // Lab Grid + } else if (method->get_active_row_number() == 5 || method->get_active_row_number() == 6) { // Lab Grid or Lab Regions colorSep->hide(); colorCurveEditorG->hide(); twocolor->hide(); @@ -981,7 +1133,11 @@ void ColorToning::methodChanged () neutrHBox->hide(); lumamode->hide(); - labgridBox->show(); + if (method->get_active_row_number() == 5) { + labgridBox->show(); + } else { + labRegionBox->show(); + } } } @@ -1038,6 +1194,17 @@ void ColorToning::colorForValue (double valX, double valY, enum ColorCaller::Ele } } else if (callerId == 4) { // color curve vertical and horizontal crosshair Color::hsv2rgb01(float(valY), 1.0f, 0.5f, R, G, B); + } else if (callerId == ID_LABREGION_HUE) { + // TODO + float x = valX - 1.f/6.f; + if (x < 0.f) { + x += 1.f; + } + x = log2lin(x, 3.f); + // float x = valX; + Color::hsv2rgb01(x, 0.5f, 0.5f, R, G, B); + } else if (callerId == ID_LABREGION_HUE+1) { + Color::hsv2rgb01(float(valY), float(valX), 0.5f, R, G, B); } caller->ccRed = double(R); @@ -1057,6 +1224,12 @@ void ColorToning::curveChanged (CurveEditor* ce) listener->panelChanged (EvColorToningCLCurve, M("HISTORY_CUSTOMCURVE")); } else if (ce == cl2shape) { listener->panelChanged (EvColorToningLLCurve, M("HISTORY_CUSTOMCURVE")); + } else if (ce == labRegionHueMask) { + listener->panelChanged(EvLabRegionHueMask, M("HISTORY_CUSTOMCURVE")); + } else if (ce == labRegionChromaticityMask) { + listener->panelChanged(EvLabRegionChromaticityMask, M("HISTORY_CUSTOMCURVE")); + } else if (ce == labRegionLightnessMask) { + listener->panelChanged(EvLabRegionLightnessMask, M("HISTORY_CUSTOMCURVE")); } } } @@ -1158,6 +1331,10 @@ void ColorToning::adjusterChanged(Adjuster* a, double newval) listener->panelChanged (EvColorToningSatProtection, a->getTextValue()); } else if (a == strength) { listener->panelChanged (EvColorToningStrength, a->getTextValue()); + } else if (a == labRegionSaturation) { + listener->panelChanged(EvLabRegionSaturation, a->getTextValue()); + } else if (a == labRegionLightness) { + listener->panelChanged(EvLabRegionLightness, a->getTextValue()); } } @@ -1195,3 +1372,195 @@ bool ColorToning::resetPressed(GdkEventButton* event) labgrid->reset(event->state & GDK_CONTROL_MASK); return false; } + + +bool ColorToning::labRegionResetPressed(GdkEventButton *event) +{ + labRegionAB->reset(event->state & GDK_CONTROL_MASK); + return false; +} + + +void ColorToning::onLabRegionSelectionChanged() +{ + auto s = labRegionList->get_selected(); + if (!s.empty()) { + // update the selected values + labRegionGet(labRegionSelected); + labRegionSelected = s[0]; + labRegionShow(labRegionSelected); + if (labRegionShowMask->get_active()) { + labRegionShowMaskChanged(); + } + } +} + + +void ColorToning::labRegionGet(int idx) +{ + auto &r = labRegionData[idx]; + double la, lb; + labRegionAB->getParams(la, lb, r.a, r.b); + r.saturation = labRegionSaturation->getValue(); + r.lightness = labRegionLightness->getValue(); + r.hueMask = labRegionHueMask->getCurve(); + r.chromaticityMask = labRegionChromaticityMask->getCurve(); + r.lightnessMask = labRegionLightnessMask->getCurve(); +} + + +void ColorToning::labRegionAddPressed() +{ + labRegionData.insert(labRegionData.begin(), rtengine::ColorToningParams::LabCorrectionRegion()); + labRegionSelected = 0; + labRegionPopulateList(); + labRegionShow(labRegionSelected); + + if (listener) { + listener->panelChanged(EvLabRegionList, M("HISTORY_CHANGED")); + } +} + + +void ColorToning::labRegionRemovePressed() +{ + if (labRegionList->size() > 1) { + labRegionData.erase(labRegionData.begin() + labRegionSelected); + labRegionSelected = LIM(labRegionSelected-1, 0, int(labRegionData.size()-1)); + labRegionPopulateList(); + labRegionShow(labRegionSelected); + + if (listener) { + listener->panelChanged(EvLabRegionList, M("HISTORY_CHANGED")); + } + } +} + + +void ColorToning::labRegionUpPressed() +{ + if (labRegionSelected > 0) { + auto r = labRegionData[labRegionSelected]; + labRegionData.erase(labRegionData.begin() + labRegionSelected); + --labRegionSelected; + labRegionData.insert(labRegionData.begin() + labRegionSelected, r); + labRegionPopulateList(); + + if (listener) { + listener->panelChanged(EvLabRegionList, M("HISTORY_CHANGED")); + } + } +} + + +void ColorToning::labRegionDownPressed() +{ + if (labRegionSelected < int(labRegionData.size()-1)) { + auto r = labRegionData[labRegionSelected]; + labRegionData.erase(labRegionData.begin() + labRegionSelected); + ++labRegionSelected; + labRegionData.insert(labRegionData.begin() + labRegionSelected, r); + labRegionPopulateList(); + + if (listener) { + listener->panelChanged(EvLabRegionList, M("HISTORY_CHANGED")); + } + } +} + + +void ColorToning::labRegionShowMaskChanged() +{ + if (listener) { + listener->panelChanged(EvLabRegionShowMask, labRegionShowMask->get_active() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED")); + } +} + + +namespace { + +bool hasMask(const std::vector &dflt, const std::vector &mask) +{ + if (mask.empty() || mask[0] == FCT_Linear || mask == dflt) { + return false; + } else { + return true; + } +} + +} // namespace + + +void ColorToning::labRegionPopulateList() +{ + ConnectionBlocker b(labRegionSelectionConn); + labRegionList->clear_items(); + rtengine::ColorToningParams::LabCorrectionRegion dflt; + + for (size_t i = 0; i < labRegionData.size(); ++i) { + auto &r = labRegionData[i]; + auto j = labRegionList->append(std::to_string(i+1)); + labRegionList->set_text(j, 1, Glib::ustring::compose("a=%1 b=%2 s=%3 l=%4", int(r.a), int(r.b), r.saturation, r.lightness)); + labRegionList->set_text( + j, 2, Glib::ustring::compose( + "%1%2%3", + hasMask(dflt.hueMask, r.hueMask) ? "H" : "", + hasMask(dflt.chromaticityMask, r.chromaticityMask) ? "C" : "", + hasMask(dflt.lightnessMask, r.lightnessMask) ? "L" : "")); + } +} + + +void ColorToning::labRegionShow(int idx, bool list_only) +{ + bool disable = listener; + if (disable) { + disableListener(); + } + rtengine::ColorToningParams::LabCorrectionRegion dflt; + auto &r = labRegionData[idx]; + if (!list_only) { + labRegionAB->setParams(0, 0, r.a, r.b, false); + labRegionSaturation->setValue(r.saturation); + labRegionLightness->setValue(r.lightness); + labRegionHueMask->setCurve(r.hueMask); + labRegionChromaticityMask->setCurve(r.chromaticityMask); + labRegionLightnessMask->setCurve(r.lightnessMask); + } + labRegionList->set_text(idx, 1, Glib::ustring::compose("a=%1 b=%2 s=%3 l=%4", int(r.a), int(r.b), r.saturation, r.lightness)); + labRegionList->set_text( + idx, 2, Glib::ustring::compose( + "%1%2%3", + hasMask(dflt.hueMask, r.hueMask) ? "H" : "", + hasMask(dflt.chromaticityMask, r.chromaticityMask) ? "C" : "", + hasMask(dflt.lightnessMask, r.lightnessMask) ? "L" : "")); + Gtk::TreePath pth; + pth.push_back(idx); + labRegionList->get_selection()->select(pth); + if (disable) { + enableListener(); + } +} + + +void ColorToning::setEditProvider(EditDataProvider *provider) +{ + labRegionHueMask->setEditProvider(provider); + labRegionChromaticityMask->setEditProvider(provider); + labRegionLightnessMask->setEditProvider(provider); +} + + +float ColorToning::blendPipetteValues(CurveEditor *ce, float chan1, float chan2, float chan3) +{ + if (ce == labRegionChromaticityMask && chan1 > 0.f) { + return lin2log(chan1, 10.f); + } else if (ce == labRegionHueMask && chan1 > 0.f) { + float x = chan1 + 1.f/6.f; + if (x > 1.f) { + x -= 1.f; + } + return lin2log(x, 3.f); + } + return CurveListener::blendPipetteValues(ce, chan1, chan2, chan3); +} diff --git a/rtgui/colortoning.h b/rtgui/colortoning.h index cb021e242..eff26bd46 100644 --- a/rtgui/colortoning.h +++ b/rtgui/colortoning.h @@ -58,8 +58,21 @@ public: void setListener(ToolPanelListener *tpl); + void setEditProvider(EditDataProvider *provider); + float blendPipetteValues(CurveEditor *ce, float chan1, float chan2, float chan3); + private: bool resetPressed(GdkEventButton* event); + bool labRegionResetPressed(GdkEventButton *event); + void onLabRegionSelectionChanged(); + void labRegionAddPressed(); + void labRegionRemovePressed(); + void labRegionUpPressed(); + void labRegionDownPressed(); + void labRegionShowMaskChanged(); + void labRegionPopulateList(); + void labRegionShow(int idx, bool list_only=false); + void labRegionGet(int idx); //Gtk::HSeparator* satLimiterSep; Gtk::HSeparator* colorSep; @@ -117,6 +130,33 @@ private: LabGrid *labgrid; Gtk::HBox *labgridBox; + rtengine::ProcEvent EvLabRegionList; + rtengine::ProcEvent EvLabRegionAB; + rtengine::ProcEvent EvLabRegionSaturation; + rtengine::ProcEvent EvLabRegionLightness; + rtengine::ProcEvent EvLabRegionHueMask; + rtengine::ProcEvent EvLabRegionChromaticityMask; + rtengine::ProcEvent EvLabRegionLightnessMask; + rtengine::ProcEvent EvLabRegionShowMask; + + Gtk::VBox *labRegionBox; + Gtk::ListViewText *labRegionList; + Gtk::Button *labRegionAdd; + Gtk::Button *labRegionRemove; + Gtk::Button *labRegionUp; + Gtk::Button *labRegionDown; + Gtk::Button *labRegionABReset; + LabGrid *labRegionAB; + Adjuster *labRegionSaturation; + Adjuster *labRegionLightness; + FlatCurveEditor *labRegionHueMask; + FlatCurveEditor *labRegionChromaticityMask; + FlatCurveEditor *labRegionLightnessMask; + Gtk::CheckButton *labRegionShowMask; + std::vector labRegionData; + int labRegionSelected; + sigc::connection labRegionSelectionConn; + IdleRegister idle_register; }; diff --git a/rtgui/labgrid.cc b/rtgui/labgrid.cc index a52ba9163..fde03194b 100644 --- a/rtgui/labgrid.cc +++ b/rtgui/labgrid.cc @@ -44,20 +44,22 @@ using rtengine::Color; bool LabGrid::notifyListener() { if (listener) { - listener->panelChanged(evt, Glib::ustring::compose(M("TP_COLORTONING_LABGRID_VALUES"), int(low_a), int(low_b), int(high_a), int(high_b))); + listener->panelChanged(evt, Glib::ustring::compose(evtMsg, int(high_a), int(high_b), int(low_a), int(low_b))); } return false; } -LabGrid::LabGrid(rtengine::ProcEvent evt): +LabGrid::LabGrid(rtengine::ProcEvent evt, const Glib::ustring &msg, bool enable_low): Gtk::DrawingArea(), - evt(evt), litPoint(NONE), + evt(evt), evtMsg(msg), + litPoint(NONE), low_a(0.f), high_a(0.f), low_b(0.f), high_b(0.f), defaultLow_a(0.f), defaultHigh_a(0.f), defaultLow_b(0.f), defaultHigh_b(0.f), listener(nullptr), edited(false), - isDragged(false) + isDragged(false), + low_enabled(enable_low) { set_can_focus(true); add_events(Gdk::EXPOSURE_MASK | Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK | Gdk::POINTER_MOTION_MASK); @@ -201,13 +203,15 @@ bool LabGrid::on_draw(const ::Cairo::RefPtr &crf) cr->stroke(); // drawing points - cr->set_source_rgb(0.1, 0.1, 0.1); - if (litPoint == LOW) { - cr->arc(loa, lob, 5, 0, 2. * rtengine::RT_PI); - } else { - cr->arc(loa, lob, 3, 0, 2. * rtengine::RT_PI); + if (low_enabled) { + cr->set_source_rgb(0.1, 0.1, 0.1); + if (litPoint == LOW) { + cr->arc(loa, lob, 5, 0, 2. * rtengine::RT_PI); + } else { + cr->arc(loa, lob, 3, 0, 2. * rtengine::RT_PI); + } + cr->fill(); } - cr->fill(); cr->set_source_rgb(0.9, 0.9, 0.9); if (litPoint == HIGH) { @@ -298,7 +302,7 @@ bool LabGrid::on_motion_notify_event(GdkEventMotion *event) const float thrs = 0.05f; const float distlo = (la - ma) * (la - ma) + (lb - mb) * (lb - mb); const float disthi = (ha - ma) * (ha - ma) + (hb - mb) * (hb - mb); - if (distlo < thrs * thrs && distlo < disthi) { + if (low_enabled && distlo < thrs * thrs && distlo < disthi) { litPoint = LOW; } else if (disthi < thrs * thrs && disthi <= distlo) { litPoint = HIGH; @@ -328,3 +332,18 @@ void LabGrid::get_preferred_height_for_width_vfunc(int width, int &minimum_heigh { minimum_height = natural_height = width; } + + +bool LabGrid::lowEnabled() const +{ + return low_enabled; +} + + +void LabGrid::setLowEnabled(bool yes) +{ + if (low_enabled != yes) { + low_enabled = yes; + queue_draw(); + } +} diff --git a/rtgui/labgrid.h b/rtgui/labgrid.h index 348ab2398..715175f74 100644 --- a/rtgui/labgrid.h +++ b/rtgui/labgrid.h @@ -46,6 +46,8 @@ class LabGrid: public Gtk::DrawingArea, public BackBuffer { private: rtengine::ProcEvent evt; + Glib::ustring evtMsg; + enum State { NONE, HIGH, LOW }; State litPoint; float low_a; @@ -64,11 +66,14 @@ private: sigc::connection delayconn; static const int inset = 2; + bool grid_visible; + bool low_enabled; + bool notifyListener(); void getLitPoint(); public: - LabGrid(rtengine::ProcEvent evt); + LabGrid(rtengine::ProcEvent evt, const Glib::ustring &msg, bool enable_low=true); void getParams(double &la, double &lb, double &ha, double &hb) const; void setParams(double la, double lb, double ha, double hb, bool notify); @@ -78,6 +83,9 @@ public: void reset(bool toInitial); void setListener(ToolPanelListener *l); + bool lowEnabled() const; + void setLowEnabled(bool yes); + bool on_draw(const ::Cairo::RefPtr &crf); void on_style_updated (); bool on_button_press_event(GdkEventButton *event); diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 570d6ab2b..dc0ae617c 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -141,6 +141,8 @@ void ParamsEdited::set(bool v) colorToning.labgridBLow = v; colorToning.labgridAHigh = v; colorToning.labgridBHigh = v; + colorToning.labregions = v; + colorToning.labregionsShowMask = v; sharpening.enabled = v; sharpening.contrast = v; @@ -699,6 +701,8 @@ void ParamsEdited::initFrom(const std::vector& colorToning.labgridBLow = colorToning.labgridBLow && p.colorToning.labgridBLow == other.colorToning.labgridBLow; colorToning.labgridAHigh = colorToning.labgridAHigh && p.colorToning.labgridAHigh == other.colorToning.labgridAHigh; colorToning.labgridBHigh = colorToning.labgridBHigh && p.colorToning.labgridBHigh == other.colorToning.labgridBHigh; + colorToning.labregions = colorToning.labregions && p.colorToning.labregions == other.colorToning.labregions; + colorToning.labregionsShowMask = colorToning.labregionsShowMask && p.colorToning.labregionsShowMask == other.colorToning.labregionsShowMask; sharpenEdge.enabled = sharpenEdge.enabled && p.sharpenEdge.enabled == other.sharpenEdge.enabled; sharpenEdge.passes = sharpenEdge.passes && p.sharpenEdge.passes == other.sharpenEdge.passes; sharpenEdge.amount = sharpenEdge.amount && p.sharpenEdge.amount == other.sharpenEdge.amount; @@ -1571,6 +1575,14 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.colorToning.labgridBHigh = mods.colorToning.labgridBHigh; } + if (colorToning.labregions) { + toEdit.colorToning.labregions = mods.colorToning.labregions; + } + + if (colorToning.labregionsShowMask) { + toEdit.colorToning.labregionsShowMask = mods.colorToning.labregionsShowMask; + } + if (sharpenEdge.enabled) { toEdit.sharpenEdge.enabled = mods.sharpenEdge.enabled; } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index aa9c01bd9..7a62bed68 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -178,6 +178,8 @@ public: bool labgridBLow; bool labgridAHigh; bool labgridBHigh; + bool labregions; + bool labregionsShowMask; }; class SharpenEdgeParamsEdited From 52c943ca0e5edfcbd82207a99593ae603654f3f2 Mon Sep 17 00:00:00 2001 From: George Hilliard Date: Fri, 26 Oct 2018 00:20:02 -0500 Subject: [PATCH 012/122] Mark BatchQueuePanel implementation functions as private --- rtgui/batchqueuepanel.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/rtgui/batchqueuepanel.h b/rtgui/batchqueuepanel.h index 3f1da85ce..73cb3ba6e 100644 --- a/rtgui/batchqueuepanel.h +++ b/rtgui/batchqueuepanel.h @@ -60,22 +60,23 @@ public: void init (RTWindow* parent); void addBatchQueueJobs(const std::vector& entries , bool head = false); + void saveOptions (); + + bool handleShortcutKey (GdkEventKey* event); // batchqueuelistener interface void queueSizeChanged(int qsize, bool queueEmptied, bool queueError, const Glib::ustring& queueErrorMessage); bool canStartNext(); +private: void startBatchProc (); void stopBatchProc (); void startOrStopBatchProc(); - void saveOptions (); void pathFolderChanged (); void pathFolderButtonPressed (); void formatChanged(const Glib::ustring& format) override; void updateTab (int qsize, int forceOrientation = 0); // forceOrientation=0: base on options / 1: horizontal / 2: vertical - - bool handleShortcutKey (GdkEventKey* event); }; #endif From 7d5fe6d1c8c9e681e64522544055089933e4d2d6 Mon Sep 17 00:00:00 2001 From: George Hilliard Date: Fri, 26 Oct 2018 00:52:15 -0500 Subject: [PATCH 013/122] Reenable batch queue interface on queue length notification This removes the need for canStartNext() to do any UI updates. --- rtgui/batchqueue.cc | 24 +++++++++++------------- rtgui/batchqueue.h | 4 ++-- rtgui/batchqueuepanel.cc | 8 +++++--- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/rtgui/batchqueue.cc b/rtgui/batchqueue.cc index 1d52c96e6..191131352 100644 --- a/rtgui/batchqueue.cc +++ b/rtgui/batchqueue.cc @@ -45,7 +45,7 @@ namespace struct NLParams { BatchQueueListener* listener; int qsize; - bool queueEmptied; + bool queueRunning; bool queueError; Glib::ustring queueErrorMessage; }; @@ -53,7 +53,7 @@ struct NLParams { int bqnotifylistenerUI (void* data) { NLParams* params = static_cast(data); - params->listener->queueSizeChanged (params->qsize, params->queueEmptied, params->queueError, params->queueErrorMessage); + params->listener->queueSizeChanged (params->qsize, params->queueRunning, params->queueError, params->queueErrorMessage); delete params; return 0; } @@ -229,7 +229,7 @@ void BatchQueue::addEntries (const std::vector& entries, bool saveBatchQueue (); redraw (); - notifyListener (false); + notifyListener (true); } bool BatchQueue::saveBatchQueue () @@ -387,7 +387,7 @@ bool BatchQueue::loadBatchQueue () } redraw (); - notifyListener (false); + notifyListener (true); return !fd.empty (); } @@ -460,7 +460,7 @@ void BatchQueue::cancelItems (const std::vector& items) saveBatchQueue (); redraw (); - notifyListener (false); + notifyListener (true); } void BatchQueue::headItems (const std::vector& items) @@ -640,7 +640,7 @@ void BatchQueue::error(const Glib::ustring& descr) if (listener) { NLParams* params = new NLParams; params->listener = listener; - params->queueEmptied = false; + params->queueRunning = false; params->queueError = true; params->queueErrorMessage = descr; idle_register.add(bqnotifylistenerUI, params); @@ -706,7 +706,6 @@ rtengine::ProcessingJob* BatchQueue::imageReady(rtengine::IImagefloat* img) Glib::ustring processedParams = processing->savedParamsFile; // delete from the queue - bool queueEmptied = false; bool remove_button_set = false; { @@ -718,9 +717,7 @@ rtengine::ProcessingJob* BatchQueue::imageReady(rtengine::IImagefloat* img) fd.erase (fd.begin()); // return next job - if (fd.empty()) { - queueEmptied = true; - } else if (listener && listener->canStartNext ()) { + if (!fd.empty() && listener && listener->canStartNext ()) { BatchQueueEntry* next = static_cast(fd[0]); // tag it as selected and set sequence next->processing = true; @@ -778,7 +775,8 @@ rtengine::ProcessingJob* BatchQueue::imageReady(rtengine::IImagefloat* img) } redraw (); - notifyListener (queueEmptied); + const bool queueRunning = (processing != nullptr); + notifyListener (queueRunning); return processing ? processing->job : nullptr; } @@ -973,7 +971,7 @@ void BatchQueue::buttonPressed (LWButton* button, int actionCode, void* actionDa } } -void BatchQueue::notifyListener (bool queueEmptied) +void BatchQueue::notifyListener (bool queueRunning) { if (listener) { @@ -983,7 +981,7 @@ void BatchQueue::notifyListener (bool queueEmptied) MYREADERLOCK(l, entryRW); params->qsize = fd.size(); } - params->queueEmptied = queueEmptied; + params->queueRunning = queueRunning; params->queueError = false; idle_register.add(bqnotifylistenerUI, params); } diff --git a/rtgui/batchqueue.h b/rtgui/batchqueue.h index 41c30da3f..6b0e047cb 100644 --- a/rtgui/batchqueue.h +++ b/rtgui/batchqueue.h @@ -31,7 +31,7 @@ class BatchQueueListener public: virtual ~BatchQueueListener() = default; - virtual void queueSizeChanged(int qsize, bool queueEmptied, bool queueError, const Glib::ustring& queueErrorMessage) = 0; + virtual void queueSizeChanged(int qsize, bool queueRunning, bool queueError, const Glib::ustring& queueErrorMessage) = 0; virtual bool canStartNext() = 0; }; @@ -93,7 +93,7 @@ protected: Glib::ustring autoCompleteFileName (const Glib::ustring& fileName, const Glib::ustring& format); Glib::ustring getTempFilenameForParams( const Glib::ustring &filename ); bool saveBatchQueue (); - void notifyListener (bool queueEmptied); + void notifyListener (bool queueRunning); BatchQueueEntry* processing; // holds the currently processed image FileCatalog* fileCatalog; diff --git a/rtgui/batchqueuepanel.cc b/rtgui/batchqueuepanel.cc index 83a0f37ae..f572a6772 100644 --- a/rtgui/batchqueuepanel.cc +++ b/rtgui/batchqueuepanel.cc @@ -245,7 +245,7 @@ void BatchQueuePanel::updateTab (int qsize, int forceOrientation) } } -void BatchQueuePanel::queueSizeChanged(int qsize, bool queueEmptied, bool queueError, const Glib::ustring& queueErrorMessage) +void BatchQueuePanel::queueSizeChanged(int qsize, bool queueRunning, bool queueError, const Glib::ustring& queueErrorMessage) { updateTab (qsize); @@ -255,12 +255,14 @@ void BatchQueuePanel::queueSizeChanged(int qsize, bool queueEmptied, bool queueE qStartStop->set_sensitive(true); } - if (queueEmptied || queueError) { + if (!queueRunning) { stopBatchProc (); fdir->set_sensitive (true); fformat->set_sensitive (true); - SoundManager::playSoundAsync(options.sndBatchQueueDone); + if (qsize == 0) { + SoundManager::playSoundAsync(options.sndBatchQueueDone); + } } if (queueError) { From 09275b58269b3f3be6c53f600ada5c1cf488ca33 Mon Sep 17 00:00:00 2001 From: George Hilliard Date: Fri, 26 Oct 2018 00:53:39 -0500 Subject: [PATCH 014/122] Store qStartStop state in atomic for background thread Closes #4882. --- rtgui/batchqueuepanel.cc | 13 +++++-------- rtgui/batchqueuepanel.h | 4 ++++ 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/rtgui/batchqueuepanel.cc b/rtgui/batchqueuepanel.cc index f572a6772..b61f60ee7 100644 --- a/rtgui/batchqueuepanel.cc +++ b/rtgui/batchqueuepanel.cc @@ -286,6 +286,7 @@ void BatchQueuePanel::startBatchProc () // Update switch when queue started programmatically qStartStopConn.block (true); qStartStop->set_active(true); + qStartStopState = true; qStartStopConn.block (false); if (batchQueue->hasJobs()) { @@ -308,6 +309,7 @@ void BatchQueuePanel::stopBatchProc () // Update switch when queue started programmatically qStartStopConn.block (true); qStartStop->set_active(false); + qStartStopState = false; qStartStopConn.block (false); updateTab (batchQueue->getEntries().size()); @@ -324,14 +326,9 @@ void BatchQueuePanel::addBatchQueueJobs(const std::vector& ent bool BatchQueuePanel::canStartNext () { -// GThreadLock lock; - if (qStartStop->get_active()) { - return true; - } else { - fdir->set_sensitive (true); - fformat->set_sensitive (true); - return false; - } + // This function is called from the background BatchQueue thread. + // It cannot call UI functions, so grab the stored state of qStartStop. + return qStartStopState; } void BatchQueuePanel::saveOptions () diff --git a/rtgui/batchqueuepanel.h b/rtgui/batchqueuepanel.h index 73cb3ba6e..89b8d8910 100644 --- a/rtgui/batchqueuepanel.h +++ b/rtgui/batchqueuepanel.h @@ -19,6 +19,8 @@ #ifndef _BATCHQUEUEPANEL_ #define _BATCHQUEUEPANEL_ +#include + #include #include "batchqueue.h" #include "saveformatpanel.h" @@ -53,6 +55,8 @@ class BatchQueuePanel : public Gtk::VBox, IdleRegister idle_register; + std::atomic qStartStopState; + public: explicit BatchQueuePanel (FileCatalog* aFileCatalog); ~BatchQueuePanel(); From 8a6e0a7f1929839ef36e3c63d1f43680c8b17bad Mon Sep 17 00:00:00 2001 From: George Hilliard Date: Fri, 26 Oct 2018 01:46:30 -0500 Subject: [PATCH 015/122] Cleanup from code review --- rtgui/batchqueue.cc | 2 +- rtgui/batchqueuepanel.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/rtgui/batchqueue.cc b/rtgui/batchqueue.cc index 191131352..a66fda153 100644 --- a/rtgui/batchqueue.cc +++ b/rtgui/batchqueue.cc @@ -775,7 +775,7 @@ rtengine::ProcessingJob* BatchQueue::imageReady(rtengine::IImagefloat* img) } redraw (); - const bool queueRunning = (processing != nullptr); + const bool queueRunning = processing; notifyListener (queueRunning); return processing ? processing->job : nullptr; diff --git a/rtgui/batchqueuepanel.h b/rtgui/batchqueuepanel.h index 89b8d8910..a05d94fe3 100644 --- a/rtgui/batchqueuepanel.h +++ b/rtgui/batchqueuepanel.h @@ -53,10 +53,10 @@ class BatchQueuePanel : public Gtk::VBox, Gtk::HBox* bottomBox; Gtk::HBox* topBox; - IdleRegister idle_register; - std::atomic qStartStopState; + IdleRegister idle_register; + public: explicit BatchQueuePanel (FileCatalog* aFileCatalog); ~BatchQueuePanel(); From b37d88fb2245fc99c529a377c57f3475c9da3c54 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 26 Oct 2018 14:43:36 +0200 Subject: [PATCH 016/122] Always use auto-contrast threshold when using Amaze+VNG4 as demosaicer for motion areas in pixelshift --- rtengine/pixelshift.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rtengine/pixelshift.cc b/rtengine/pixelshift.cc index cdf4f990a..76d1f836c 100644 --- a/rtengine/pixelshift.cc +++ b/rtengine/pixelshift.cc @@ -326,7 +326,7 @@ BENCHFUN if (bayerParams.pixelShiftDemosaicMethod == bayerParams.getPSDemosaicMethodString(RAWParams::BayerSensor::PSDemosaicMethod::LMMSE)) { lmmse_interpolate_omp(winw, winh, *(rawDataFrames[0]), red, green, blue, bayerParams.lmmse_iterations); } else if (bayerParams.pixelShiftDemosaicMethod == bayerParams.getPSDemosaicMethodString(RAWParams::BayerSensor::PSDemosaicMethod::AMAZEVNG4)) { - dual_demosaic_RT (true, rawParamsIn, winw, winh, *(rawDataFrames[0]), red, green, blue, bayerParams.dualDemosaicContrast); + dual_demosaic_RT (true, rawParamsIn, winw, winh, *(rawDataFrames[0]), red, green, blue, bayerParams.dualDemosaicContrast, true); } else { amaze_demosaic_RT(winx, winy, winw, winh, *(rawDataFrames[0]), red, green, blue); } @@ -338,7 +338,7 @@ BENCHFUN if (bayerParams.pixelShiftDemosaicMethod == bayerParams.getPSDemosaicMethodString(RAWParams::BayerSensor::PSDemosaicMethod::LMMSE)) { lmmse_interpolate_omp(winw, winh, *(rawDataFrames[i + 1]), redTmp[i], greenTmp[i], blueTmp[i], bayerParams.lmmse_iterations); } else if (bayerParams.pixelShiftDemosaicMethod == bayerParams.getPSDemosaicMethodString(RAWParams::BayerSensor::PSDemosaicMethod::AMAZEVNG4)) { - dual_demosaic_RT (true, rawParamsIn, winw, winh, *(rawDataFrames[i + 1]), redTmp[i], greenTmp[i], blueTmp[i], bayerParams.dualDemosaicContrast); + dual_demosaic_RT (true, rawParamsIn, winw, winh, *(rawDataFrames[i + 1]), redTmp[i], greenTmp[i], blueTmp[i], bayerParams.dualDemosaicContrast, true); } else { amaze_demosaic_RT(winx, winy, winw, winh, *(rawDataFrames[i + 1]), redTmp[i], greenTmp[i], blueTmp[i]); } @@ -367,7 +367,7 @@ BENCHFUN } else if (bayerParams.pixelShiftDemosaicMethod == bayerParams.getPSDemosaicMethodString(RAWParams::BayerSensor::PSDemosaicMethod::AMAZEVNG4)) { RAWParams rawParamsTmp = rawParamsIn; rawParamsTmp.bayersensor.method = RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::AMAZEVNG4); - dual_demosaic_RT (true, rawParamsTmp, winw, winh, rawData, red, green, blue, bayerParams.dualDemosaicContrast); + dual_demosaic_RT (true, rawParamsTmp, winw, winh, rawData, red, green, blue, bayerParams.dualDemosaicContrast, true); } else { amaze_demosaic_RT(winx, winy, winw, winh, rawData, red, green, blue); } From cb3cc6cad14b6229564f7efcac252b94495aa15d Mon Sep 17 00:00:00 2001 From: George Hilliard Date: Fri, 26 Oct 2018 09:23:46 -0500 Subject: [PATCH 017/122] Fix permanently disabled button when stopping on next-to-last image --- rtgui/batchqueuepanel.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtgui/batchqueuepanel.cc b/rtgui/batchqueuepanel.cc index b61f60ee7..1679d9365 100644 --- a/rtgui/batchqueuepanel.cc +++ b/rtgui/batchqueuepanel.cc @@ -249,7 +249,7 @@ void BatchQueuePanel::queueSizeChanged(int qsize, bool queueRunning, bool queueE { updateTab (qsize); - if (qsize == 0 || (qsize == 1 && !fdir->get_sensitive())) { + if (qsize == 0 || (qsize == 1 && queueRunning)) { qStartStop->set_sensitive(false); } else { qStartStop->set_sensitive(true); From 9a22e89125c4c9548fd7c5273fb88e1d393d77a9 Mon Sep 17 00:00:00 2001 From: George Hilliard Date: Fri, 26 Oct 2018 09:26:18 -0500 Subject: [PATCH 018/122] Cleanup: make impl function order match header, fix declaration var name --- rtgui/batchqueuepanel.cc | 54 ++++++++++++++++++++-------------------- rtgui/batchqueuepanel.h | 2 +- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/rtgui/batchqueuepanel.cc b/rtgui/batchqueuepanel.cc index 1679d9365..8da66183a 100644 --- a/rtgui/batchqueuepanel.cc +++ b/rtgui/batchqueuepanel.cc @@ -324,13 +324,6 @@ void BatchQueuePanel::addBatchQueueJobs(const std::vector& ent } } -bool BatchQueuePanel::canStartNext () -{ - // This function is called from the background BatchQueue thread. - // It cannot call UI functions, so grab the stored state of qStartStop. - return qStartStopState; -} - void BatchQueuePanel::saveOptions () { @@ -339,6 +332,33 @@ void BatchQueuePanel::saveOptions () options.procQueueEnabled = qAutoStart->get_active(); } +bool BatchQueuePanel::handleShortcutKey (GdkEventKey* event) +{ + bool ctrl = event->state & GDK_CONTROL_MASK; + + if (ctrl) { + switch(event->keyval) { + case GDK_KEY_s: + if (qStartStop->get_active()) { + stopBatchProc(); + } else { + startBatchProc(); + } + + return true; + } + } + + return batchQueue->keyPressed (event); +} + +bool BatchQueuePanel::canStartNext () +{ + // This function is called from the background BatchQueue thread. + // It cannot call UI functions, so grab the stored state of qStartStop. + return qStartStopState; +} + void BatchQueuePanel::pathFolderButtonPressed () { @@ -368,23 +388,3 @@ void BatchQueuePanel::formatChanged(const Glib::ustring& format) { options.saveFormatBatch = saveFormatPanel->getFormat(); } - -bool BatchQueuePanel::handleShortcutKey (GdkEventKey* event) -{ - bool ctrl = event->state & GDK_CONTROL_MASK; - - if (ctrl) { - switch(event->keyval) { - case GDK_KEY_s: - if (qStartStop->get_active()) { - stopBatchProc(); - } else { - startBatchProc(); - } - - return true; - } - } - - return batchQueue->keyPressed (event); -} diff --git a/rtgui/batchqueuepanel.h b/rtgui/batchqueuepanel.h index a05d94fe3..74c9750e7 100644 --- a/rtgui/batchqueuepanel.h +++ b/rtgui/batchqueuepanel.h @@ -69,7 +69,7 @@ public: bool handleShortcutKey (GdkEventKey* event); // batchqueuelistener interface - void queueSizeChanged(int qsize, bool queueEmptied, bool queueError, const Glib::ustring& queueErrorMessage); + void queueSizeChanged(int qsize, bool queueRunning, bool queueError, const Glib::ustring& queueErrorMessage); bool canStartNext(); private: From a5f42c238a7da14c8651617bf0155342d381f975 Mon Sep 17 00:00:00 2001 From: TooWaBoo Date: Fri, 26 Oct 2018 16:28:50 +0200 Subject: [PATCH 019/122] Update TooWaBlue-GTK3-20_.css Changes for "resizing to physical dimensions" --- rtdata/themes/TooWaBlue-GTK3-20_.css | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/rtdata/themes/TooWaBlue-GTK3-20_.css b/rtdata/themes/TooWaBlue-GTK3-20_.css index aa753727d..041b342e3 100644 --- a/rtdata/themes/TooWaBlue-GTK3-20_.css +++ b/rtdata/themes/TooWaBlue-GTK3-20_.css @@ -2,7 +2,7 @@ This file is part of RawTherapee. Copyright (c) 2016-2018 TooWaBoo - Version 2.82 + Version 2.83 RawTherapee is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -135,6 +135,18 @@ tooltip { tooltip label { color: @text-tooltip; } +.grid-spacing > * { + margin-top: 0.166666666666666666em; + margin-bottom: 0.166666666666666666em; +} +.grid-spacing > label:not(:first-child) { + margin-left: 0.75em; + margin-right: 0.25em; +} +.grid-spacing > label:first-child { + margin-left: 0; + margin-right: 0.25em; +} paned { background-color: @bg-light-grey; @@ -1999,7 +2011,7 @@ entry { } spinbutton { - margin: 0.083333333333333333em 0; + margin: 0.083333333333333333em 0 0.083333333333333333em 0.166666666666666666em; padding: 0; min-height: 1.666666666666666666em; min-width: 0; @@ -2010,7 +2022,7 @@ spinbutton { } #MyExpander spinbutton { - margin: 0.166666666666666666em 0; + margin: 0.083333333333333333em 0 0.083333333333333333em 0.166666666666666666em; padding: 0; min-height: 1.333333333333333333em; min-width: 0; From d53e44d45bd72d2a2492816532e1410385188d9d Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 26 Oct 2018 16:51:05 +0200 Subject: [PATCH 020/122] vng4 demosaic: precalculate weight --- rtengine/vng4_demosaic_RT.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rtengine/vng4_demosaic_RT.cc b/rtengine/vng4_demosaic_RT.cc index 8ed05dd09..241c05507 100644 --- a/rtengine/vng4_demosaic_RT.cc +++ b/rtengine/vng4_demosaic_RT.cc @@ -24,7 +24,7 @@ #include "rawimagesource.h" #include "rawimagesource_i.h" #include "../rtgui/multilangmgr.h" -//#define BENCHMARK +#define BENCHMARK #include "StopWatch.h" namespace rtengine @@ -176,7 +176,7 @@ void RawImageSource::vng4_demosaic (const array2D &rawData, array2D &rawData, array2D Date: Fri, 26 Oct 2018 17:09:28 +0200 Subject: [PATCH 021/122] vng4 demosaic: move red/blue interpolation inside main loop for better cache usage, #4633 --- rtengine/vng4_demosaic_RT.cc | 47 ++++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/rtengine/vng4_demosaic_RT.cc b/rtengine/vng4_demosaic_RT.cc index 241c05507..62f5018c5 100644 --- a/rtengine/vng4_demosaic_RT.cc +++ b/rtengine/vng4_demosaic_RT.cc @@ -215,11 +215,18 @@ void RawImageSource::vng4_demosaic (const array2D &rawData, array2D &rawData, array2D firstRow) { + interpolate_row_rb_mul_pp (rawData, red[row - 1], blue[row - 1], green[row - 2], green[row - 1], green[row], row - 1, 1.0, 1.0, 1.0, 0, W, 1); + } if(plistenerActive) { if((row % progressStep) == 0) @@ -311,6 +321,24 @@ void RawImageSource::vng4_demosaic (const array2D &rawData, array2D &rawData, array2DsetProgress (0.98); } - // Interpolate R and B -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int i = 0; i < H; i++) { - if (i == 0) - // rm, gm, bm must be recovered - //interpolate_row_rb_mul_pp (red, blue, NULL, green[i], green[i+1], i, rm, gm, bm, 0, W, 1); - { - interpolate_row_rb_mul_pp (rawData, red[i], blue[i], nullptr, green[i], green[i + 1], i, 1.0, 1.0, 1.0, 0, W, 1); - } else if (i == H - 1) { - interpolate_row_rb_mul_pp (rawData, red[i], blue[i], green[i - 1], green[i], nullptr, i, 1.0, 1.0, 1.0, 0, W, 1); - } else { - interpolate_row_rb_mul_pp (rawData, red[i], blue[i], green[i - 1], green[i], green[i + 1], i, 1.0, 1.0, 1.0, 0, W, 1); - } - } border_interpolate2(W, H, 3, rawData, red, green, blue); if(plistenerActive) { From c4ee5e611d22e1ec9721c6573689f5e21647da9c Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Fri, 26 Oct 2018 18:04:07 +0200 Subject: [PATCH 022/122] guided filter: reuse buffer across boxblur invocations --- rtengine/guidedfilter.cc | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/rtengine/guidedfilter.cc b/rtengine/guidedfilter.cc index a3dccf298..4e31fa300 100644 --- a/rtengine/guidedfilter.cc +++ b/rtengine/guidedfilter.cc @@ -135,11 +135,14 @@ void guidedFilter(const array2D &guide, const array2D &src, array2 const array2D &p = src; array2D &q = dst; + AlignedBuffer blur_buf(I.width() * I.height()); const auto f_mean = - [](array2D &d, array2D &s, int rad) -> void + [&](array2D &d, array2D &s, int rad) -> void { rad = LIM(rad, 0, (min(s.width(), s.height()) - 1) / 2 - 1); - boxblur(s, d, rad, rad, s.width(), s.height()); + float **src = s; + float **dst = d; + boxblur(src, dst, blur_buf.data, rad, rad, s.width(), s.height()); }; const auto f_subsample = From 91f9dfe11084cd1da0d60b500b2944444f205cf8 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Fri, 26 Oct 2018 18:04:41 +0200 Subject: [PATCH 023/122] labregions: properly scale the guide to [0,1] for the guidedFilter calls --- rtengine/iplabregions.cc | 66 ++++++++++++++++++++++------------------ 1 file changed, 37 insertions(+), 29 deletions(-) diff --git a/rtengine/iplabregions.cc b/rtengine/iplabregions.cc index e69f91d5a..3854570d3 100644 --- a/rtengine/iplabregions.cc +++ b/rtengine/iplabregions.cc @@ -37,11 +37,18 @@ void ImProcFunctions::labColorCorrectionRegions(LabImage *lab) const float scaling = 1.f; int n = params->colorToning.labregions.size(); + int show_mask_idx = params->colorToning.labregionsShowMask; + if (show_mask_idx >= n) { + show_mask_idx = -1; + } std::vector> hmask(n); std::vector> cmask(n); std::vector> lmask(n); - for (int i = 0; i < n; ++i) { + const int begin_idx = max(show_mask_idx, 0); + const int end_idx = (show_mask_idx < 0 ? n : show_mask_idx+1); + + for (int i = begin_idx; i < end_idx; ++i) { auto &r = params->colorToning.labregions[i]; if (!r.hueMask.empty() && r.hueMask[0] != FCT_Linear) { hmask[i].reset(new FlatCurve(r.hueMask, true)); @@ -54,10 +61,9 @@ void ImProcFunctions::labColorCorrectionRegions(LabImage *lab) } } - array2D guide(lab->W, lab->H, lab->L, ARRAY2D_BYREFERENCE); std::vector> abmask(n); std::vector> Lmask(n); - for (int i = 0; i < n; ++i) { + for (int i = begin_idx; i < end_idx; ++i) { abmask[i](lab->W, lab->H); Lmask[i](lab->W, lab->H); } @@ -81,38 +87,40 @@ void ImProcFunctions::labColorCorrectionRegions(LabImage *lab) h1 = lin2log(h1, 3.f); float l1 = l / 32768.f; - if (params->colorToning.labregionsShowMask >= 0 && params->colorToning.labregionsShowMask < n) { - int idx = params->colorToning.labregionsShowMask; - auto &hm = hmask[idx]; - auto &cm = cmask[idx]; - auto &lm = lmask[idx]; - float blend = (hm ? hm->getVal(h1) : 1.f) * (cm ? cm->getVal(c1) : 1.f) * (lm ? lm->getVal(l1) : 1.f); - abmask[idx][y][x] = blend; - } else { - for (int i = 0; i < n; ++i) { - auto &hm = hmask[i]; - auto &cm = cmask[i]; - auto &lm = lmask[i]; - float blend = (hm ? hm->getVal(h1) : 1.f) * (cm ? cm->getVal(c1) : 1.f) * (lm ? lm->getVal(l1) : 1.f); - Lmask[i][y][x] = abmask[i][y][x] = blend; - } + for (int i = begin_idx; i < end_idx; ++i) { + auto &hm = hmask[i]; + auto &cm = cmask[i]; + auto &lm = lmask[i]; + float blend = LIM01((hm ? hm->getVal(h1) : 1.f) * (cm ? cm->getVal(c1) : 1.f) * (lm ? lm->getVal(l1) : 1.f)); + Lmask[i][y][x] = abmask[i][y][x] = blend; } } } - for (int i = 0; i < n; ++i) { - rtengine::guidedFilter(guide, abmask[i], abmask[i], max(int(4 / scale + 0.5), 1), 0.001, multiThread); - rtengine::guidedFilter(guide, Lmask[i], Lmask[i], max(int(25 / scale + 0.5), 1), 0.0001, multiThread); - } - - if (params->colorToning.labregionsShowMask >= 0 && params->colorToning.labregionsShowMask < n) { - int idx = params->colorToning.labregionsShowMask; + { + array2D guide(lab->W, lab->H, lab->L); #ifdef _OPENMP #pragma omp parallel for if (multiThread) #endif for (int y = 0; y < lab->H; ++y) { for (int x = 0; x < lab->W; ++x) { - auto blend = abmask[idx][y][x]; + guide[y][x] = LIM01(lab->L[y][x] / 32768.f); + } + } + + for (int i = begin_idx; i < end_idx; ++i) { + rtengine::guidedFilter(guide, abmask[i], abmask[i], max(int(4 / scale + 0.5), 1), 0.001, multiThread); + rtengine::guidedFilter(guide, Lmask[i], Lmask[i], max(int(25 / scale + 0.5), 1), 0.0001, multiThread); + } + } + + if (show_mask_idx >= 0) { +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int y = 0; y < lab->H; ++y) { + for (int x = 0; x < lab->W; ++x) { + auto blend = abmask[show_mask_idx][y][x]; lab->a[y][x] = 0.f; lab->b[y][x] = blend * 42000.f; lab->L[y][x] = LIM(lab->L[y][x] + 32768.f * blend, 0.f, 32768.f); @@ -142,9 +150,9 @@ void ImProcFunctions::labColorCorrectionRegions(LabImage *lab) auto &r = params->colorToning.labregions[i]; float blend = abmask[i][y][x]; float s = 1.f + r.saturation / 100.f; - float a_new = s * (a + 32768.f * abcoord(r.a) / factor / scaling); - float b_new = s * (b + 32768.f * abcoord(r.b) / factor / scaling); - float l_new = l * (1.f + r.lightness / 1000.f); + float a_new = LIM(s * (a + 32768.f * abcoord(r.a) / factor / scaling), -42000.f, 42000.f); + float b_new = LIM(s * (b + 32768.f * abcoord(r.b) / factor / scaling), -42000.f, 42000.f); + float l_new = LIM(l * (1.f + float(r.lightness) / 1000.f), 0.f, 32768.f); l = intp(Lmask[i][y][x], l_new, l); a = intp(blend, a_new, a); b = intp(blend, b_new, b); From db07a8cdd31242937693de5029eeda0e4a37c41e Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Fri, 26 Oct 2018 18:16:12 +0200 Subject: [PATCH 024/122] L*a*b* regions: add new regions at the end of the list, not at the beginning --- rtgui/colortoning.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtgui/colortoning.cc b/rtgui/colortoning.cc index 79e913019..8b08acd70 100644 --- a/rtgui/colortoning.cc +++ b/rtgui/colortoning.cc @@ -1411,8 +1411,8 @@ void ColorToning::labRegionGet(int idx) void ColorToning::labRegionAddPressed() { - labRegionData.insert(labRegionData.begin(), rtengine::ColorToningParams::LabCorrectionRegion()); - labRegionSelected = 0; + labRegionSelected = labRegionData.size(); + labRegionData.push_back(rtengine::ColorToningParams::LabCorrectionRegion()); labRegionPopulateList(); labRegionShow(labRegionSelected); From 3d61eca91f648c8c09f2ad7b62bcdfa69ae39831 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 26 Oct 2018 20:23:27 +0200 Subject: [PATCH 025/122] vng4 demosaic: remove unreachable code, #4633 --- rtengine/vng4_demosaic_RT.cc | 55 ++++++++++++------------------------ 1 file changed, 18 insertions(+), 37 deletions(-) diff --git a/rtengine/vng4_demosaic_RT.cc b/rtengine/vng4_demosaic_RT.cc index 62f5018c5..0e7d8e0f9 100644 --- a/rtengine/vng4_demosaic_RT.cc +++ b/rtengine/vng4_demosaic_RT.cc @@ -71,9 +71,8 @@ void RawImageSource::vng4_demosaic (const array2D &rawData, array2Dprefilters; const int width = W, height = H; constexpr unsigned int colors = 4; - float (*image)[4]; - image = (float (*)[4]) calloc (height * width, sizeof * image); + float (*image)[4] = (float (*)[4]) calloc (height * width, sizeof * image); #ifdef _OPENMP #pragma omp parallel for @@ -87,7 +86,7 @@ void RawImageSource::vng4_demosaic (const array2D &rawData, array2D &rawData, array2D &rawData, array2D &rawData, array2D &rawData, array2D gval[g]) { - gmin = gval[g]; - } - - if (gmax < gval[g]) { - gmax = gval[g]; - } + gmin = std::min(gmin, gval[g]); + gmax = std::max(gmax, gval[g]); } thold = gmin + (gmax / 2); } memset (sum, 0, sizeof sum); - float t1, t2; - t1 = t2 = pix[color]; + float t1p2 = pix[color]; if(color & 1) { int num = 0; @@ -273,7 +266,7 @@ void RawImageSource::vng4_demosaic (const array2D &rawData, array2D &rawData, array2D &rawData, array2D firstRow) { @@ -321,23 +313,12 @@ void RawImageSource::vng4_demosaic (const array2D &rawData, array2D 2 && firstRow < H - 3) { + interpolate_row_rb_mul_pp (rawData, red[firstRow], blue[firstRow], green[firstRow - 1], green[firstRow], green[firstRow + 1], firstRow, 1.0, 1.0, 1.0, 0, W, 1); } - if (lastRow != -1) { - if (lastRow == 0) { - interpolate_row_rb_mul_pp (rawData, red[0], blue[0], nullptr, green[0], green[1], 0, 1.0, 1.0, 1.0, 0, W, 1); - } else if (lastRow == H - 1) { - interpolate_row_rb_mul_pp (rawData, red[lastRow], blue[lastRow], green[lastRow - 1], green[lastRow], nullptr, lastRow, 1.0, 1.0, 1.0, 0, W, 1); - } else { - interpolate_row_rb_mul_pp (rawData, red[lastRow], blue[lastRow], green[lastRow - 1], green[lastRow], green[lastRow + 1], lastRow, 1.0, 1.0, 1.0, 0, W, 1); - } + + if (lastRow > 2 && lastRow < H - 3) { + interpolate_row_rb_mul_pp (rawData, red[lastRow], blue[lastRow], green[lastRow - 1], green[lastRow], green[lastRow + 1], lastRow, 1.0, 1.0, 1.0, 0, W, 1); } } free (code[0][0]); From 1b291aee9bdbed9520f394747a6cffa42932a218 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 26 Oct 2018 22:20:20 +0200 Subject: [PATCH 026/122] vng4 demosaic: minor speedup, #4633 --- rtengine/vng4_demosaic_RT.cc | 46 ++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 26 deletions(-) diff --git a/rtengine/vng4_demosaic_RT.cc b/rtengine/vng4_demosaic_RT.cc index 0e7d8e0f9..500590b04 100644 --- a/rtengine/vng4_demosaic_RT.cc +++ b/rtengine/vng4_demosaic_RT.cc @@ -210,9 +210,7 @@ void RawImageSource::vng4_demosaic (const array2D &rawData, array2D &rawData, array2D &rawData, array2D &rawData, array2D &rawData, array2D firstRow) { - interpolate_row_rb_mul_pp (rawData, red[row - 1], blue[row - 1], green[row - 2], green[row - 1], green[row], row - 1, 1.0, 1.0, 1.0, 0, W, 1); + interpolate_row_rb_mul_pp(rawData, red[row - 1], blue[row - 1], green[row - 2], green[row - 1], green[row], row - 1, 1.0, 1.0, 1.0, 0, W, 1); } if(plistenerActive) { @@ -314,22 +306,24 @@ void RawImageSource::vng4_demosaic (const array2D &rawData, array2D 2 && firstRow < H - 3) { - interpolate_row_rb_mul_pp (rawData, red[firstRow], blue[firstRow], green[firstRow - 1], green[firstRow], green[firstRow + 1], firstRow, 1.0, 1.0, 1.0, 0, W, 1); + interpolate_row_rb_mul_pp(rawData, red[firstRow], blue[firstRow], green[firstRow - 1], green[firstRow], green[firstRow + 1], firstRow, 1.0, 1.0, 1.0, 0, W, 1); } if (lastRow > 2 && lastRow < H - 3) { - interpolate_row_rb_mul_pp (rawData, red[lastRow], blue[lastRow], green[lastRow - 1], green[lastRow], green[lastRow + 1], lastRow, 1.0, 1.0, 1.0, 0, W, 1); + interpolate_row_rb_mul_pp(rawData, red[lastRow], blue[lastRow], green[lastRow - 1], green[lastRow], green[lastRow + 1], lastRow, 1.0, 1.0, 1.0, 0, W, 1); + } +#ifdef _OPENMP + #pragma omp single +#endif + { + // let the first thread, which is out of work, do the border interpolation + border_interpolate2(W, H, 3, rawData, red, green, blue); } } + free (code[0][0]); free (image); - if(plistenerActive) { - plistener->setProgress (0.98); - } - - border_interpolate2(W, H, 3, rawData, red, green, blue); - if(plistenerActive) { plistener->setProgress (1.0); } From 7fb90644d38cfe801e4ab74cee934d7229c903e8 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Sat, 27 Oct 2018 15:25:38 +0200 Subject: [PATCH 027/122] dehaze: tweak epsilon to avoid artifacts in corner cases --- rtengine/ipdehaze.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/ipdehaze.cc b/rtengine/ipdehaze.cc index 92eaa4062..fecc73e7d 100644 --- a/rtengine/ipdehaze.cc +++ b/rtengine/ipdehaze.cc @@ -282,7 +282,7 @@ void ImProcFunctions::dehaze(Imagefloat *img) } const int radius = patchsize * 4; - const float epsilon = 1e-7; + const float epsilon = 1e-5; array2D &t = t_tilde; { From 47cfcd51d49b9f6890558ee0d4dce3e9e69979a5 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sat, 27 Oct 2018 18:46:02 +0200 Subject: [PATCH 028/122] vng4 demosaic: removed StopWatch, fixes #4897 --- rtengine/vng4_demosaic_RT.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtengine/vng4_demosaic_RT.cc b/rtengine/vng4_demosaic_RT.cc index 500590b04..5ed0b35c7 100644 --- a/rtengine/vng4_demosaic_RT.cc +++ b/rtengine/vng4_demosaic_RT.cc @@ -24,13 +24,13 @@ #include "rawimagesource.h" #include "rawimagesource_i.h" #include "../rtgui/multilangmgr.h" -#define BENCHMARK +//#define BENCHMARK #include "StopWatch.h" namespace rtengine { #define fc(row,col) (prefilters >> ((((row) << 1 & 14) + ((col) & 1)) << 1) & 3) -typedef unsigned short ushort; + void RawImageSource::vng4_demosaic (const array2D &rawData, array2D &red, array2D &green, array2D &blue, bool keepGreens) { BENCHFUN From f673a4a881a084856b5193e657aa87303b85edcd Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Sun, 28 Oct 2018 18:38:40 +0100 Subject: [PATCH 029/122] avoid grabbing focus in the L*a*b* region list --- rtgui/colortoning.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/rtgui/colortoning.cc b/rtgui/colortoning.cc index 8b08acd70..c296a6b27 100644 --- a/rtgui/colortoning.cc +++ b/rtgui/colortoning.cc @@ -365,6 +365,7 @@ ColorToning::ColorToning () : FoldableToolPanel(this, "colortoning", M("TP_COLOR labRegionList = Gtk::manage(new Gtk::ListViewText(3)); labRegionList->set_size_request(-1, 100); + labRegionList->set_can_focus(false); labRegionList->set_column_title(0, "#"); labRegionList->set_column_title(1, M("TP_COLORTONING_LABREGION_LIST_TITLE")); labRegionList->set_column_title(2, M("TP_COLORTONING_LABREGION_MASK")); From 50c623802a1db8312e836ff6f2a71df490341bd6 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Sun, 28 Oct 2018 18:38:55 +0100 Subject: [PATCH 030/122] set LabRegions as the default color toning method --- rtengine/procparams.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index bfb91aea8..b8f836f34 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -731,7 +731,7 @@ ColorToningParams::ColorToningParams() : 1.00, 1.00 }, - method("Lab"), + method("LabRegions"), twocolor("Std"), redlow(0.0), greenlow(0.0), From 13abcd0f6c5519744cd6acb523c2a1a86bfa4847 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sun, 28 Oct 2018 20:37:34 +0100 Subject: [PATCH 031/122] vng4 demosaic: another very small speedup, #4633 --- rtengine/rawimagesource.h | 2 +- rtengine/vng4_demosaic_RT.cc | 104 +++++++++++++++-------------------- 2 files changed, 46 insertions(+), 60 deletions(-) diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index f78a4121b..8ee403ea2 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -269,7 +269,7 @@ protected: void nodemosaic(bool bw); void eahd_demosaic(); void hphd_demosaic(); - void vng4_demosaic(const array2D &rawData, array2D &red, array2D &green, array2D &blue, bool keepGreens = false); + void vng4_demosaic(const array2D &rawData, array2D &red, array2D &green, array2D &blue); void ppg_demosaic(); void jdl_interpolate_omp(); void igv_interpolate(int winw, int winh); diff --git a/rtengine/vng4_demosaic_RT.cc b/rtengine/vng4_demosaic_RT.cc index 5ed0b35c7..ed3ef8802 100644 --- a/rtengine/vng4_demosaic_RT.cc +++ b/rtengine/vng4_demosaic_RT.cc @@ -31,7 +31,7 @@ namespace rtengine { #define fc(row,col) (prefilters >> ((((row) << 1 & 14) + ((col) & 1)) << 1) & 3) -void RawImageSource::vng4_demosaic (const array2D &rawData, array2D &red, array2D &green, array2D &blue, bool keepGreens) +void RawImageSource::vng4_demosaic (const array2D &rawData, array2D &red, array2D &green, array2D &blue) { BENCHFUN const signed short int *cp, terms[] = { @@ -227,67 +227,53 @@ void RawImageSource::vng4_demosaic (const array2D &rawData, array2D firstRow) { interpolate_row_rb_mul_pp(rawData, red[row - 1], blue[row - 1], green[row - 2], green[row - 1], green[row], row - 1, 1.0, 1.0, 1.0, 0, W, 1); From 4d9871110bd47bb8399f204d6f6ba75c6267639e Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Mon, 29 Oct 2018 09:36:17 +0100 Subject: [PATCH 032/122] improved GUI for the "image type" field of dynamic profile rules --- rtdata/languages/default | 4 +++ rtgui/dynamicprofilepanel.cc | 50 +++++++++++++++++++++++++++++++----- rtgui/dynamicprofilepanel.h | 3 +-- 3 files changed, 49 insertions(+), 8 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index cc978ce92..1368b43f8 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -43,6 +43,10 @@ DYNPROFILEEDITOR_DELETE;Delete DYNPROFILEEDITOR_EDIT;Edit DYNPROFILEEDITOR_EDIT_RULE;Edit Dynamic Profile Rule DYNPROFILEEDITOR_ENTRY_TOOLTIP;The matching is case insensitive.\nUse the "re:" prefix to enter\na regular expression. +DYNPROFILEEDITOR_IMGTYPE_ANY;Any +DYNPROFILEEDITOR_IMGTYPE_STD;Standard +DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift DYNPROFILEEDITOR_MOVE_DOWN;Move Down DYNPROFILEEDITOR_MOVE_UP;Move Up DYNPROFILEEDITOR_NEW;New diff --git a/rtgui/dynamicprofilepanel.cc b/rtgui/dynamicprofilepanel.cc index d7e8f356a..d83c70669 100644 --- a/rtgui/dynamicprofilepanel.cc +++ b/rtgui/dynamicprofilepanel.cc @@ -41,7 +41,17 @@ DynamicProfilePanel::EditDialog::EditDialog (const Glib::ustring &title, Gtk::Wi add_optional (M ("EXIFFILTER_CAMERA"), has_camera_, camera_); add_optional (M ("EXIFFILTER_LENS"), has_lens_, lens_); - add_optional (M ("EXIFFILTER_IMAGETYPE"), has_imagetype_, imagetype_); + + imagetype_ = Gtk::manage (new MyComboBoxText()); + imagetype_->append(Glib::ustring("(") + M("DYNPROFILEEDITOR_IMGTYPE_ANY") + ")"); + imagetype_->append(M("DYNPROFILEEDITOR_IMGTYPE_STD")); + imagetype_->append(M("DYNPROFILEEDITOR_IMGTYPE_HDR")); + imagetype_->append(M("DYNPROFILEEDITOR_IMGTYPE_PS")); + imagetype_->set_active(0); + hb = Gtk::manage (new Gtk::HBox()); + hb->pack_start (*Gtk::manage (new Gtk::Label (M ("EXIFFILTER_IMAGETYPE"))), false, false, 4); + hb->pack_start (*imagetype_, true, true, 2); + get_content_area()->pack_start (*hb, Gtk::PACK_SHRINK, 4); add_range (M ("EXIFFILTER_ISO"), iso_min_, iso_max_); add_range (M ("EXIFFILTER_APERTURE"), fnumber_min_, fnumber_max_); @@ -82,8 +92,17 @@ void DynamicProfilePanel::EditDialog::set_rule ( has_lens_->set_active (rule.lens.enabled); lens_->set_text (rule.lens.value); - has_imagetype_->set_active (rule.imagetype.enabled); - imagetype_->set_text (rule.imagetype.value); + if (!rule.imagetype.enabled) { + imagetype_->set_active(0); + } else if (rule.imagetype.value == "STD") { + imagetype_->set_active(1); + } else if (rule.imagetype.value == "HDR") { + imagetype_->set_active(2); + } else if (rule.imagetype.value == "PS") { + imagetype_->set_active(3); + } else { + imagetype_->set_active(0); + } profilepath_->updateProfileList(); @@ -116,8 +135,20 @@ DynamicProfileRule DynamicProfilePanel::EditDialog::get_rule() ret.lens.enabled = has_lens_->get_active(); ret.lens.value = lens_->get_text(); - ret.imagetype.enabled = has_imagetype_->get_active(); - ret.imagetype.value = imagetype_->get_text(); + ret.imagetype.enabled = imagetype_->get_active_row_number() > 0; + switch (imagetype_->get_active_row_number()) { + case 1: + ret.imagetype.value = "STD"; + break; + case 2: + ret.imagetype.value = "HDR"; + break; + case 3: + ret.imagetype.value = "PS"; + break; + default: + ret.imagetype.value = ""; + } ret.profilepath = profilepath_->getFullPathFromActiveRow(); @@ -478,7 +509,14 @@ void DynamicProfilePanel::render_lens ( void DynamicProfilePanel::render_imagetype ( Gtk::CellRenderer *cell, const Gtk::TreeModel::iterator &iter) { - RENDER_OPTIONAL_ (imagetype); + auto row = *iter; + Gtk::CellRendererText *ct = static_cast(cell); + DynamicProfileRule::Optional o = row[columns_.imagetype]; + if (o.enabled) { + ct->property_text() = M(std::string("DYNPROFILEEDITOR_IMGTYPE_") + o.value); + } else { \ + ct->property_text() = ""; + } } #undef RENDER_OPTIONAL_ diff --git a/rtgui/dynamicprofilepanel.h b/rtgui/dynamicprofilepanel.h index 3b5bec4df..e271edc5a 100644 --- a/rtgui/dynamicprofilepanel.h +++ b/rtgui/dynamicprofilepanel.h @@ -112,8 +112,7 @@ private: Gtk::CheckButton *has_lens_; Gtk::Entry *lens_; - Gtk::CheckButton *has_imagetype_; - Gtk::Entry *imagetype_; + MyComboBoxText *imagetype_; ProfileStoreComboBox *profilepath_; }; From fb44445f2acb061e5f017b6ea92a834e2002bcdd Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Mon, 29 Oct 2018 11:11:11 +0100 Subject: [PATCH 033/122] Reverted changes to 'default' language file #4893 Commit 1a3fd9 accidentally wiped all non-ASCII characters from the file while adding new keys. This commit restores them. --- rtdata/languages/default | 44 ++++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 40ff2ff88..f6ffc873c 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -398,7 +398,7 @@ HISTORY_MSG_145;Microcontrast - Uniformity HISTORY_MSG_146;Edge sharpening HISTORY_MSG_147;ES - Luminance only HISTORY_MSG_148;Microcontrast -HISTORY_MSG_149;Microcontrast - 33 matrix +HISTORY_MSG_149;Microcontrast - 3×3 matrix HISTORY_MSG_150;Post-demosaic artifact/noise red. HISTORY_MSG_151;Vibrance HISTORY_MSG_152;Vib - Pastel tones @@ -728,14 +728,14 @@ HISTORY_MSG_492;RGB Curves HISTORY_MSG_493;L*a*b* Adjustments HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction -HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - L*a*b* region list +HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction -HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - L*a*b* region saturation -HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - L*a*b* region lightness -HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - L*a*b* region H mask -HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - L*a*b* region C mask -HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L*a*b* region L mask -HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - L*a*b* region show mask +HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - C mask +HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - Show mask HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold HISTORY_MSG_HISTMATCHING;Auto-matched tone curve @@ -816,7 +816,7 @@ IPTCPANEL_CITY;City IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. IPTCPANEL_COPYHINT;Copy IPTC settings to clipboard. IPTCPANEL_COPYRIGHT;Copyright notice -IPTCPANEL_COPYRIGHTHINT;Enter a Notice on the current owner of the Copyright for this image, such as 2008 Jane Doe. +IPTCPANEL_COPYRIGHTHINT;Enter a Notice on the current owner of the Copyright for this image, such as ©2008 Jane Doe. IPTCPANEL_COUNTRY;Country IPTCPANEL_COUNTRYHINT;Enter the name of the country pictured in this image. IPTCPANEL_CREATOR;Creator @@ -1375,9 +1375,9 @@ TP_COARSETRAF_TOOLTIP_ROTLEFT;Rotate left.\n\nShortcuts:\n[ - Multiple Ed TP_COARSETRAF_TOOLTIP_ROTRIGHT;Rotate right.\n\nShortcuts:\n] - Multiple Editor Tabs Mode,\nAlt-] - Single Editor Tab Mode. TP_COARSETRAF_TOOLTIP_VFLIP;Flip vertically. TP_COLORAPP_ADAPTSCENE;Scene absolute luminance -TP_COLORAPP_ADAPTSCENE_TOOLTIP;Absolute luminance of the scene environment (cd/m).\n1) Calculated from the Exif data:\nShutter speed - ISO speed - F number - camera exposure correction.\n2) Calculated from the raw white point and RT's Exposure Compensation slider. -TP_COLORAPP_ADAPTVIEWING;Viewing absolute luminance (cd/m) -TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16cd/m). +TP_COLORAPP_ADAPTSCENE_TOOLTIP;Absolute luminance of the scene environment (cd/m²).\n1) Calculated from the Exif data:\nShutter speed - ISO speed - F number - camera exposure correction.\n2) Calculated from the raw white point and RT's Exposure Compensation slider. +TP_COLORAPP_ADAPTVIEWING;Viewing absolute luminance (cd/m²) +TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16cd/m²). TP_COLORAPP_ADAP_AUTO_TOOLTIP;If the checkbox is checked (recommended) RawTherapee calculates an optimum value from the Exif data.\nTo set the value manually, uncheck the checkbox first. TP_COLORAPP_ALGO;Algorithm TP_COLORAPP_ALGO_ALL;All @@ -1414,7 +1414,7 @@ TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] TP_COLORAPP_GAMUT;Gamut control (L*a*b*) TP_COLORAPP_GAMUT_TOOLTIP;Allow gamut control in L*a*b* mode. TP_COLORAPP_HUE;Hue (h) -TP_COLORAPP_HUE_TOOLTIP;Hue (h) - angle between 0 and 360. +TP_COLORAPP_HUE_TOOLTIP;Hue (h) - angle between 0° and 360°. TP_COLORAPP_LABEL;CIE Color Appearance Model 2002 TP_COLORAPP_LABEL_CAM02;Image Adjustments TP_COLORAPP_LABEL_SCENE;Scene Conditions @@ -1571,16 +1571,16 @@ TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations -TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Applying three median filter iterations with a 33 window size often leads to better results than using one median filter iteration with a 77 window size. +TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. TP_DIRPYRDENOISE_MEDIAN_TYPE;Median type -TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n33 soft: treats 5 pixels in a 33 pixel window.\n33: treats 9 pixels in a 33 pixel window.\n55 soft: treats 13 pixels in a 55 pixel window.\n55: treats 25 pixels in a 55 pixel window.\n77: treats 49 pixels in a 77 pixel window.\n99: treats 81 pixels in a 99 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. +TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. TP_DIRPYRDENOISE_SLI;Slider -TP_DIRPYRDENOISE_TYPE_3X3;33 -TP_DIRPYRDENOISE_TYPE_3X3SOFT;33 soft -TP_DIRPYRDENOISE_TYPE_5X5;55 -TP_DIRPYRDENOISE_TYPE_5X5SOFT;55 soft -TP_DIRPYRDENOISE_TYPE_7X7;77 -TP_DIRPYRDENOISE_TYPE_9X9;99 +TP_DIRPYRDENOISE_TYPE_3X3;3×3 +TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +TP_DIRPYRDENOISE_TYPE_5X5;5×5 +TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +TP_DIRPYRDENOISE_TYPE_7X7;7×7 +TP_DIRPYRDENOISE_TYPE_9X9;9×9 TP_DIRPYREQUALIZER_ALGO;Skin Color Range TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts @@ -2026,7 +2026,7 @@ TP_SHARPENING_USM;Unsharp Mask TP_SHARPENMICRO_AMOUNT;Quantity TP_SHARPENMICRO_CONTRAST;Contrast threshold TP_SHARPENMICRO_LABEL;Microcontrast -TP_SHARPENMICRO_MATRIX;33 matrix instead of 55 +TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5 TP_SHARPENMICRO_UNIFORMITY;Uniformity TP_SOFTLIGHT_LABEL;Soft Light TP_SOFTLIGHT_STRENGTH;Strength From 4a765cc91fde51c1ff2fbc046fdcc4db4e57bff0 Mon Sep 17 00:00:00 2001 From: George Hilliard Date: Mon, 29 Oct 2018 10:52:06 -0500 Subject: [PATCH 034/122] Unify inconsistent notifyListener() logic Previously, this function required a `queueEmptied` bool, which I changed to `queueRunning`. But I goofed the logic on this bool; it should always be "is `processing` nullptr." --- rtgui/batchqueue.cc | 13 ++++++------- rtgui/batchqueue.h | 2 +- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/rtgui/batchqueue.cc b/rtgui/batchqueue.cc index a66fda153..6c42ef89f 100644 --- a/rtgui/batchqueue.cc +++ b/rtgui/batchqueue.cc @@ -229,7 +229,7 @@ void BatchQueue::addEntries (const std::vector& entries, bool saveBatchQueue (); redraw (); - notifyListener (true); + notifyListener (); } bool BatchQueue::saveBatchQueue () @@ -387,7 +387,7 @@ bool BatchQueue::loadBatchQueue () } redraw (); - notifyListener (true); + notifyListener (); return !fd.empty (); } @@ -460,7 +460,7 @@ void BatchQueue::cancelItems (const std::vector& items) saveBatchQueue (); redraw (); - notifyListener (true); + notifyListener (); } void BatchQueue::headItems (const std::vector& items) @@ -775,8 +775,7 @@ rtengine::ProcessingJob* BatchQueue::imageReady(rtengine::IImagefloat* img) } redraw (); - const bool queueRunning = processing; - notifyListener (queueRunning); + notifyListener (); return processing ? processing->job : nullptr; } @@ -971,9 +970,9 @@ void BatchQueue::buttonPressed (LWButton* button, int actionCode, void* actionDa } } -void BatchQueue::notifyListener (bool queueRunning) +void BatchQueue::notifyListener () { - + const bool queueRunning = processing; if (listener) { NLParams* params = new NLParams; params->listener = listener; diff --git a/rtgui/batchqueue.h b/rtgui/batchqueue.h index 6b0e047cb..a922e5e1f 100644 --- a/rtgui/batchqueue.h +++ b/rtgui/batchqueue.h @@ -93,7 +93,7 @@ protected: Glib::ustring autoCompleteFileName (const Glib::ustring& fileName, const Glib::ustring& format); Glib::ustring getTempFilenameForParams( const Glib::ustring &filename ); bool saveBatchQueue (); - void notifyListener (bool queueRunning); + void notifyListener (); BatchQueueEntry* processing; // holds the currently processed image FileCatalog* fileCatalog; From 894fb8d9b3d847b9515742501af5f50e36c750a6 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 30 Oct 2018 13:45:44 +0100 Subject: [PATCH 035/122] vng4 demosaic: another small speedup, #4633 --- rtengine/vng4_demosaic_RT.cc | 216 ++++++++++++++++++++++++----------- 1 file changed, 148 insertions(+), 68 deletions(-) diff --git a/rtengine/vng4_demosaic_RT.cc b/rtengine/vng4_demosaic_RT.cc index ed3ef8802..1c7f27dea 100644 --- a/rtengine/vng4_demosaic_RT.cc +++ b/rtengine/vng4_demosaic_RT.cc @@ -22,12 +22,41 @@ #include "rtengine.h" #include "rawimagesource.h" -#include "rawimagesource_i.h" #include "../rtgui/multilangmgr.h" //#define BENCHMARK #include "StopWatch.h" +namespace { + +using namespace rtengine; + +inline void vng4interpolate_row_redblue (const RawImage *ri, const array2D &rawData, float* ar, float* ab, const float * const pg, const float * const cg, const float * const ng, int i, int width) +{ + if (ri->ISBLUE(i, 0) || ri->ISBLUE(i, 1)) { + std::swap(ar, ab); + } + + // RGRGR or GRGRGR line + for (int j = 3; j < width - 3; ++j) { + if (!ri->ISGREEN(i, j)) { + // keep original value + ar[j] = rawData[i][j]; + // cross interpolation of red/blue + float rb = (rawData[i - 1][j - 1] - pg[j - 1] + rawData[i + 1][j - 1] - ng[j - 1]); + rb += (rawData[i - 1][j + 1] - pg[j + 1] + rawData[i + 1][j + 1] - ng[j + 1]); + ab[j] = cg[j] + rb * 0.25f; + } else { + // linear R/B-G interpolation horizontally + ar[j] = cg[j] + (rawData[i][j - 1] - cg[j - 1] + rawData[i][j + 1] - cg[j + 1]) / 2; + // linear B/R-G interpolation vertically + ab[j] = cg[j] + (rawData[i - 1][j] - pg[j] + rawData[i + 1][j] - ng[j]) / 2; + } + } +} +} + namespace rtengine + { #define fc(row,col) (prefilters >> ((((row) << 1 & 14) + ((col) & 1)) << 1) & 3) @@ -74,65 +103,106 @@ void RawImageSource::vng4_demosaic (const array2D &rawData, array2D firstRow) { + int row = ii - 1; + for (int col = 1; col < width - 1; col++) { + float * pix = image[row * width + col]; + int * ip = lcode[row & 15][col & 15]; + float sum[4] = {}; + + for (int i = 0; i < 8; i++, ip += 2) { + sum[ip[1]] += pix[ip[0]] * mul[row & 15][col & 15][i]; + } + + for (unsigned int i = 0; i < colors - 1; i++, ip++) { + pix[ip[0]] = sum[ip[0]] * csum[row & 15][col & 15][i]; + } + } + } + } + + // now all rows are processed except the first and last row of each chunk + // let's process them now but skip row 0 and row H - 1 + if (firstRow > 0 && firstRow < H - 1) { + const int row = firstRow; for (int col = 1; col < width - 1; col++) { float * pix = image[row * width + col]; int * ip = lcode[row & 15][col & 15]; - float sum[4]; - memset (sum, 0, sizeof sum); + float sum[4] = {}; + + for (int i = 0; i < 8; i++, ip += 2) { + sum[ip[1]] += pix[ip[0]] * mul[row & 15][col & 15][i]; + } + + for (unsigned int i = 0; i < colors - 1; i++, ip++) { + pix[ip[0]] = sum[ip[0]] * csum[row & 15][col & 15][i]; + } + } + } + + if (lastRow > 0 && lastRow < H - 1) { + const int row = lastRow; + for (int col = 1; col < width - 1; col++) { + float * pix = image[row * width + col]; + int * ip = lcode[row & 15][col & 15]; + float sum[4] = {}; for (int i = 0; i < 8; i++, ip += 2) { sum[ip[1]] += pix[ip[0]] * mul[row & 15][col & 15][i]; @@ -145,16 +215,15 @@ void RawImageSource::vng4_demosaic (const array2D &rawData, array2D &rawData, array2D(ip++) = 1 << weight; +#else *ip++ = 1 << weight; - - for (g = 0; g < 8; g++) +#endif + for (int g = 0; g < 8; g++) if (grads & (1 << g)) { *ip++ = g; } @@ -187,7 +260,8 @@ void RawImageSource::vng4_demosaic (const array2D &rawData, array2D &rawData, array2DsetProgress (progress); } @@ -211,7 +285,7 @@ void RawImageSource::vng4_demosaic (const array2D &rawData, array2D &rawData, array2D float conversions + const float diff = std::fabs(pix[ip[0]] - pix[ip[1]]) * reinterpret_cast(ip)[2]; +#else const float diff = std::fabs(pix[ip[0]] - pix[ip[1]]) * ip[2]; +#endif gval[ip[3]] += diff; ip += 5; if (UNLIKELY(ip[-1] != -1)) { @@ -246,17 +325,18 @@ void RawImageSource::vng4_demosaic (const array2D &rawData, array2D &rawData, array2D firstRow) { - interpolate_row_rb_mul_pp(rawData, red[row - 1], blue[row - 1], green[row - 2], green[row - 1], green[row], row - 1, 1.0, 1.0, 1.0, 0, W, 1); + vng4interpolate_row_redblue(ri, rawData, red[row - 1], blue[row - 1], green[row - 2], green[row - 1], green[row], row - 1, W); } if(plistenerActive) { @@ -292,11 +372,11 @@ void RawImageSource::vng4_demosaic (const array2D &rawData, array2D 2 && firstRow < H - 3) { - interpolate_row_rb_mul_pp(rawData, red[firstRow], blue[firstRow], green[firstRow - 1], green[firstRow], green[firstRow + 1], firstRow, 1.0, 1.0, 1.0, 0, W, 1); + vng4interpolate_row_redblue(ri, rawData, red[firstRow], blue[firstRow], green[firstRow - 1], green[firstRow], green[firstRow + 1], firstRow, W); } if (lastRow > 2 && lastRow < H - 3) { - interpolate_row_rb_mul_pp(rawData, red[lastRow], blue[lastRow], green[lastRow - 1], green[lastRow], green[lastRow + 1], lastRow, 1.0, 1.0, 1.0, 0, W, 1); + vng4interpolate_row_redblue(ri, rawData, red[lastRow], blue[lastRow], green[lastRow - 1], green[lastRow], green[lastRow + 1], lastRow, W); } #ifdef _OPENMP #pragma omp single From 1dcf92322dd995f241414b11192b44140c6368b3 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 30 Oct 2018 19:36:37 +0100 Subject: [PATCH 036/122] RT crashes with wrong value in profile (curves), fixes #4398 --- rtengine/curves.cc | 36 ++++++++++++++++++++++++++++ rtengine/curves.h | 8 ++++++- rtengine/procparams.cc | 9 +------ rtgui/diagonalcurveeditorsubgroup.cc | 4 ++++ rtgui/flatcurveeditorsubgroup.cc | 4 ++++ 5 files changed, 52 insertions(+), 9 deletions(-) diff --git a/rtengine/curves.cc b/rtengine/curves.cc index aab74a7de..9e3c6527e 100644 --- a/rtengine/curves.cc +++ b/rtengine/curves.cc @@ -45,6 +45,42 @@ using namespace std; namespace rtengine { +bool sanitizeCurve(std::vector& curve) +{ + // A curve is valid under one of the following conditions: + // 1) Curve has exactly one entry which is D(F)CT_Linear + // 2) Number of curve entries is > 3 and odd + // 3) curve[0] == DCT_Parametric and curve size is >= 8 and curve[1] .. curve[3] are ordered ascending and are distinct + if (curve.empty()) { + curve.push_back (DCT_Linear); + return true; + } else if(curve.size() == 1 && curve[0] != DCT_Linear) { + curve[0] = DCT_Linear; + return true; + } else if((curve.size() % 2 == 0 || curve.size() < 5) && curve[0] != DCT_Parametric) { + curve.clear(); + curve.push_back (DCT_Linear); + return true; + } else if(curve[0] == DCT_Parametric) { + if (curve.size() < 8) { + curve.clear(); + curve.push_back (DCT_Linear); + return true; + } else { + // curve[1] to curve[3] must be ordered ascending and distinct + for (int i = 1; i < 3; i++) { + if (curve[i] >= curve[i + 1]) { + curve[1] = 0.25f; + curve[2] = 0.5f; + curve[3] = 0.75f; + break; + } + } + } + } + return false; +} + Curve::Curve () : N(0), ppn(0), x(nullptr), y(nullptr), mc(0.0), mfc(0.0), msc(0.0), mhc(0.0), hashSize(1000 /* has to be initialized to the maximum value */), ypp(nullptr), x1(0.0), y1(0.0), x2(0.0), y2(0.0), x3(0.0), y3(0.0), firstPointIncluded(false), increment(0.0), nbr_points(0) {} void Curve::AddPolygons () diff --git a/rtengine/curves.h b/rtengine/curves.h index a9f4b4ace..30fb01102 100644 --- a/rtengine/curves.h +++ b/rtengine/curves.h @@ -19,9 +19,12 @@ #ifndef __CURVES_H__ #define __CURVES_H__ -#include #include #include +#include + +#include + #include "rt_math.h" #include "../rtgui/mycurve.h" #include "../rtgui/myflatcurve.h" @@ -42,6 +45,7 @@ using namespace std; namespace rtengine { + class ToneCurve; class ColorAppearance; @@ -55,6 +59,8 @@ void setUnlessOOG(T &r, T &g, T &b, const T &rr, const T &gg, const T &bb) } } +bool sanitizeCurve(std::vector& curve); + namespace curves { inline void setLutVal(const LUTf &lut, float &val) diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 526a36765..b07778c55 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -87,13 +87,6 @@ Glib::ustring relativePathIfInside(const Glib::ustring &procparams_fname, bool f return prefix + embedded_fname.substr(dir1.length()); } -void avoidEmptyCurve(std::vector &curve) -{ - if (curve.empty()) { - curve.push_back(FCT_Linear); - } -} - void getFromKeyfile( const Glib::KeyFile& keyfile, const Glib::ustring& group_name, @@ -142,7 +135,7 @@ void getFromKeyfile( ) { value = keyfile.get_double_list(group_name, key); - avoidEmptyCurve(value); + rtengine::sanitizeCurve(value); } template diff --git a/rtgui/diagonalcurveeditorsubgroup.cc b/rtgui/diagonalcurveeditorsubgroup.cc index a022c8650..c23b25f9a 100644 --- a/rtgui/diagonalcurveeditorsubgroup.cc +++ b/rtgui/diagonalcurveeditorsubgroup.cc @@ -32,6 +32,8 @@ #include "diagonalcurveeditorsubgroup.h" #include "rtimage.h" +#include "../rtengine/curves.h" + DiagonalCurveEditorSubGroup::DiagonalCurveEditorSubGroup (CurveEditorGroup* prt, Glib::ustring& curveDir) : CurveEditorSubGroup(curveDir) { @@ -814,6 +816,8 @@ void DiagonalCurveEditorSubGroup::loadPressed () } } + rtengine::sanitizeCurve(p); + if (p[0] == (double)(DCT_Spline)) { customCurve->setPoints (p); customCurve->queue_draw (); diff --git a/rtgui/flatcurveeditorsubgroup.cc b/rtgui/flatcurveeditorsubgroup.cc index 2cc96a184..27b7ac940 100644 --- a/rtgui/flatcurveeditorsubgroup.cc +++ b/rtgui/flatcurveeditorsubgroup.cc @@ -33,6 +33,8 @@ #include "flatcurveeditorsubgroup.h" #include "rtimage.h" +#include "../rtengine/curves.h" + FlatCurveEditorSubGroup::FlatCurveEditorSubGroup (CurveEditorGroup* prt, Glib::ustring& curveDir) : CurveEditorSubGroup(curveDir) { @@ -418,6 +420,8 @@ void FlatCurveEditorSubGroup::loadPressed () } } + rtengine::sanitizeCurve(p); + if (p[0] == (double)(FCT_MinMaxCPoints)) { CPointsCurve->setPoints (p); CPointsCurve->queue_draw (); From 74a467fb4e20aca7b9b9ba40eefa405f0d32e2c4 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Tue, 30 Oct 2018 21:12:44 +0100 Subject: [PATCH 037/122] labgrid: work on [0,1] values --- rtengine/improcfun.cc | 4 ++-- rtengine/iplabregions.cc | 2 +- rtgui/colortoning.cc | 8 ++++++-- rtgui/labgrid.cc | 37 +++++++++++++++++++++---------------- 4 files changed, 30 insertions(+), 21 deletions(-) diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 013a629fd..748e46187 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -5782,8 +5782,8 @@ void ImProcFunctions::lab2rgb (const LabImage &src, Imagefloat &dst, const Glib: */ void ImProcFunctions::colorToningLabGrid(LabImage *lab, int xstart, int xend, int ystart, int yend, bool MultiThread) { - const float factor = ColorToningParams::LABGRID_CORR_MAX * 3.f; - const float scaling = ColorToningParams::LABGRID_CORR_SCALE; + const float factor = 3.f; + const float scaling = 3.f; float a_scale = (params->colorToning.labgridAHigh - params->colorToning.labgridALow) / factor / scaling; float a_base = params->colorToning.labgridALow / scaling; float b_scale = (params->colorToning.labgridBHigh - params->colorToning.labgridBLow) / factor / scaling; diff --git a/rtengine/iplabregions.cc b/rtengine/iplabregions.cc index 3854570d3..fe3325b1d 100644 --- a/rtengine/iplabregions.cc +++ b/rtengine/iplabregions.cc @@ -33,7 +33,7 @@ void ImProcFunctions::labColorCorrectionRegions(LabImage *lab) return; } - const float factor = ColorToningParams::LABGRID_CORR_MAX * 3.f; + const float factor = 3.f; const float scaling = 1.f; int n = params->colorToning.labregions.size(); diff --git a/rtgui/colortoning.cc b/rtgui/colortoning.cc index c296a6b27..28b2a59ea 100644 --- a/rtgui/colortoning.cc +++ b/rtgui/colortoning.cc @@ -596,7 +596,7 @@ void ColorToning::read (const ProcParams* pp, const ParamsEdited* pedited) lastLumamode = pp->colorToning.lumamode; - labgrid->setParams(pp->colorToning.labgridALow, pp->colorToning.labgridBLow, pp->colorToning.labgridAHigh, pp->colorToning.labgridBHigh, false); + labgrid->setParams(pp->colorToning.labgridALow / ColorToningParams::LABGRID_CORR_MAX, pp->colorToning.labgridBLow / ColorToningParams::LABGRID_CORR_MAX, pp->colorToning.labgridAHigh / ColorToningParams::LABGRID_CORR_MAX, pp->colorToning.labgridBHigh / ColorToningParams::LABGRID_CORR_MAX, false); if (pedited && !pedited->colorToning.method) { method->set_active (5); @@ -667,6 +667,10 @@ void ColorToning::write (ProcParams* pp, ParamsEdited* pedited) pp->colorToning.strength = strength->getIntValue(); labgrid->getParams(pp->colorToning.labgridALow, pp->colorToning.labgridBLow, pp->colorToning.labgridAHigh, pp->colorToning.labgridBHigh); + pp->colorToning.labgridALow *= ColorToningParams::LABGRID_CORR_MAX; + pp->colorToning.labgridAHigh *= ColorToningParams::LABGRID_CORR_MAX; + pp->colorToning.labgridBLow *= ColorToningParams::LABGRID_CORR_MAX; + pp->colorToning.labgridBHigh *= ColorToningParams::LABGRID_CORR_MAX; labRegionGet(labRegionSelected); labRegionShow(labRegionSelected, true); @@ -778,7 +782,7 @@ void ColorToning::setDefaults (const ProcParams* defParams, const ParamsEdited* hlColSat->setDefault (defParams->colorToning.hlColSat); shadowsColSat->setDefault (defParams->colorToning.shadowsColSat); strength->setDefault (defParams->colorToning.strength); - labgrid->setDefault(defParams->colorToning.labgridALow, defParams->colorToning.labgridBLow, defParams->colorToning.labgridAHigh, defParams->colorToning.labgridBHigh); + labgrid->setDefault(defParams->colorToning.labgridALow / ColorToningParams::LABGRID_CORR_MAX, defParams->colorToning.labgridBLow / ColorToningParams::LABGRID_CORR_MAX, defParams->colorToning.labgridAHigh / ColorToningParams::LABGRID_CORR_MAX, defParams->colorToning.labgridBHigh / ColorToningParams::LABGRID_CORR_MAX); if (pedited) { diff --git a/rtgui/labgrid.cc b/rtgui/labgrid.cc index fde03194b..fe984ffe9 100644 --- a/rtgui/labgrid.cc +++ b/rtgui/labgrid.cc @@ -44,7 +44,12 @@ using rtengine::Color; bool LabGrid::notifyListener() { if (listener) { - listener->panelChanged(evt, Glib::ustring::compose(evtMsg, int(high_a), int(high_b), int(low_a), int(low_b))); + const auto round = + [](float v) -> float + { + return int(v * 1000) / 1000.f; + }; + listener->panelChanged(evt, Glib::ustring::compose(evtMsg, round(high_a), round(high_b), round(low_a), round(low_b))); } return false; } @@ -76,8 +81,8 @@ void LabGrid::getParams(double &la, double &lb, double &ha, double &hb) const void LabGrid::setParams(double la, double lb, double ha, double hb, bool notify) { - const double lo = -rtengine::ColorToningParams::LABGRID_CORR_MAX; - const double hi = rtengine::ColorToningParams::LABGRID_CORR_MAX; + const double lo = -1.0; + const double hi = 1.0; low_a = rtengine::LIM(la, lo, hi); low_b = rtengine::LIM(lb, lo, hi); high_a = rtengine::LIM(ha, lo, hi); @@ -172,7 +177,7 @@ bool LabGrid::on_draw(const ::Cairo::RefPtr &crf) cr->translate(0, height); cr->scale(1., -1.); const int cells = 8; - float step = rtengine::ColorToningParams::LABGRID_CORR_MAX / float(cells/2); + float step = 1.f / float(cells/2); for (int j = 0; j < cells; j++) { for (int i = 0; i < cells; i++) { float R, G, B; @@ -192,10 +197,10 @@ bool LabGrid::on_draw(const ::Cairo::RefPtr &crf) // drawing the connection line cr->set_antialias(Cairo::ANTIALIAS_DEFAULT); float loa, hia, lob, hib; - loa = .5f * (width + width * low_a / rtengine::ColorToningParams::LABGRID_CORR_MAX); - hia = .5f * (width + width * high_a / rtengine::ColorToningParams::LABGRID_CORR_MAX); - lob = .5f * (height + height * low_b / rtengine::ColorToningParams::LABGRID_CORR_MAX); - hib = .5f * (height + height * high_b / rtengine::ColorToningParams::LABGRID_CORR_MAX); + loa = .5f * (width + width * low_a); + hia = .5f * (width + width * high_a); + lob = .5f * (height + height * low_b); + hib = .5f * (height + height * high_b); cr->set_line_width(2.); cr->set_source_rgb(0.6, 0.6, 0.6); cr->move_to(loa, lob); @@ -279,11 +284,11 @@ bool LabGrid::on_motion_notify_event(GdkEventMotion *event) const float mb = (2.0 * mouse_y - height) / (float)height; if (isDragged) { if (litPoint == LOW) { - low_a = ma * rtengine::ColorToningParams::LABGRID_CORR_MAX; - low_b = mb * rtengine::ColorToningParams::LABGRID_CORR_MAX; + low_a = ma; + low_b = mb; } else if (litPoint == HIGH) { - high_a = ma * rtengine::ColorToningParams::LABGRID_CORR_MAX; - high_b = mb * rtengine::ColorToningParams::LABGRID_CORR_MAX; + high_a = ma; + high_b = mb; } edited = true; grab_focus(); @@ -295,10 +300,10 @@ bool LabGrid::on_motion_notify_event(GdkEventMotion *event) queue_draw(); } else { litPoint = NONE; - float la = low_a / rtengine::ColorToningParams::LABGRID_CORR_MAX; - float lb = low_b / rtengine::ColorToningParams::LABGRID_CORR_MAX; - float ha = high_a / rtengine::ColorToningParams::LABGRID_CORR_MAX; - float hb = high_b / rtengine::ColorToningParams::LABGRID_CORR_MAX; + float la = low_a; + float lb = low_b; + float ha = high_a; + float hb = high_b; const float thrs = 0.05f; const float distlo = (la - ma) * (la - ma) + (lb - mb) * (lb - mb); const float disthi = (ha - ma) * (ha - ma) + (hb - mb) * (hb - mb); From cef5d12779859965a5f7bddfe9118333f28b95cb Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Tue, 30 Oct 2018 21:18:21 +0100 Subject: [PATCH 038/122] AllowUpscaling=false for old PP3s PP3s from before the Allow Upscaling option's introduction to the Resize tool should defaut to not allow upscaling. Closes #4643 --- rtengine/procparams.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index b07778c55..f5e598b75 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -4207,7 +4207,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) if (ppVersion >= 339) { assignFromKeyfile(keyFile, "Resize", "AllowUpscaling", pedited, resize.allowUpscaling, pedited->resize.allowUpscaling); } else { - resize.allowUpscaling = true; + resize.allowUpscaling = false; if (pedited) { pedited->resize.allowUpscaling = true; } From 4eb93c24f8da371a2d858adb098b07f37dac159d Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Tue, 30 Oct 2018 22:30:12 +0100 Subject: [PATCH 039/122] fixed broken labgrid after previous commit --- rtgui/colortoning.cc | 10 ++++++++-- rtgui/labgrid.cc | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/rtgui/colortoning.cc b/rtgui/colortoning.cc index 28b2a59ea..2b80c6be2 100644 --- a/rtgui/colortoning.cc +++ b/rtgui/colortoning.cc @@ -1493,6 +1493,12 @@ bool hasMask(const std::vector &dflt, const std::vector &mask) } } + +inline float round_ab(float v) +{ + return int(v * 1000) / 1000.f; +} + } // namespace @@ -1505,7 +1511,7 @@ void ColorToning::labRegionPopulateList() for (size_t i = 0; i < labRegionData.size(); ++i) { auto &r = labRegionData[i]; auto j = labRegionList->append(std::to_string(i+1)); - labRegionList->set_text(j, 1, Glib::ustring::compose("a=%1 b=%2 s=%3 l=%4", int(r.a), int(r.b), r.saturation, r.lightness)); + labRegionList->set_text(j, 1, Glib::ustring::compose("a=%1 b=%2 s=%3 l=%4", round_ab(r.a), round_ab(r.b), r.saturation, r.lightness)); labRegionList->set_text( j, 2, Glib::ustring::compose( "%1%2%3", @@ -1532,7 +1538,7 @@ void ColorToning::labRegionShow(int idx, bool list_only) labRegionChromaticityMask->setCurve(r.chromaticityMask); labRegionLightnessMask->setCurve(r.lightnessMask); } - labRegionList->set_text(idx, 1, Glib::ustring::compose("a=%1 b=%2 s=%3 l=%4", int(r.a), int(r.b), r.saturation, r.lightness)); + labRegionList->set_text(idx, 1, Glib::ustring::compose("a=%1 b=%2 s=%3 l=%4", round_ab(r.a), round_ab(r.b), r.saturation, r.lightness)); labRegionList->set_text( idx, 2, Glib::ustring::compose( "%1%2%3", diff --git a/rtgui/labgrid.cc b/rtgui/labgrid.cc index fe984ffe9..5e0d571a5 100644 --- a/rtgui/labgrid.cc +++ b/rtgui/labgrid.cc @@ -177,7 +177,7 @@ bool LabGrid::on_draw(const ::Cairo::RefPtr &crf) cr->translate(0, height); cr->scale(1., -1.); const int cells = 8; - float step = 1.f / float(cells/2); + float step = 12000.f / float(cells/2); for (int j = 0; j < cells; j++) { for (int i = 0; i < cells; i++) { float R, G, B; From 43876abb81471cabbd6219ce6188c68056fc35b2 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Tue, 30 Oct 2018 23:56:49 +0100 Subject: [PATCH 040/122] Reverted changes to 'default' language file #4898 Commit 14ac4b accidentally wiped all non-ASCII characters from the file while adding new keys. This commit restores them. --- rtdata/languages/default | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index d9cc7f4a2..370d8645d 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -398,7 +398,7 @@ HISTORY_MSG_145;Microcontrast - Uniformity HISTORY_MSG_146;Edge sharpening HISTORY_MSG_147;ES - Luminance only HISTORY_MSG_148;Microcontrast -HISTORY_MSG_149;Microcontrast - 33 matrix +HISTORY_MSG_149;Microcontrast - 3×3 matrix HISTORY_MSG_150;Post-demosaic artifact/noise red. HISTORY_MSG_151;Vibrance HISTORY_MSG_152;Vib - Pastel tones @@ -812,7 +812,7 @@ IPTCPANEL_CITY;City IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. IPTCPANEL_COPYHINT;Copy IPTC settings to clipboard. IPTCPANEL_COPYRIGHT;Copyright notice -IPTCPANEL_COPYRIGHTHINT;Enter a Notice on the current owner of the Copyright for this image, such as 2008 Jane Doe. +IPTCPANEL_COPYRIGHTHINT;Enter a Notice on the current owner of the Copyright for this image, such as ©2008 Jane Doe. IPTCPANEL_COUNTRY;Country IPTCPANEL_COUNTRYHINT;Enter the name of the country pictured in this image. IPTCPANEL_CREATOR;Creator @@ -1372,9 +1372,9 @@ TP_COARSETRAF_TOOLTIP_ROTLEFT;Rotate left.\n\nShortcuts:\n[ - Multiple Ed TP_COARSETRAF_TOOLTIP_ROTRIGHT;Rotate right.\n\nShortcuts:\n] - Multiple Editor Tabs Mode,\nAlt-] - Single Editor Tab Mode. TP_COARSETRAF_TOOLTIP_VFLIP;Flip vertically. TP_COLORAPP_ADAPTSCENE;Scene absolute luminance -TP_COLORAPP_ADAPTSCENE_TOOLTIP;Absolute luminance of the scene environment (cd/m).\n1) Calculated from the Exif data:\nShutter speed - ISO speed - F number - camera exposure correction.\n2) Calculated from the raw white point and RT's Exposure Compensation slider. -TP_COLORAPP_ADAPTVIEWING;Viewing absolute luminance (cd/m) -TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16cd/m). +TP_COLORAPP_ADAPTSCENE_TOOLTIP;Absolute luminance of the scene environment (cd/m²).\n1) Calculated from the Exif data:\nShutter speed - ISO speed - F number - camera exposure correction.\n2) Calculated from the raw white point and RT's Exposure Compensation slider. +TP_COLORAPP_ADAPTVIEWING;Viewing absolute luminance (cd/m²) +TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16cd/m²). TP_COLORAPP_ADAP_AUTO_TOOLTIP;If the checkbox is checked (recommended) RawTherapee calculates an optimum value from the Exif data.\nTo set the value manually, uncheck the checkbox first. TP_COLORAPP_ALGO;Algorithm TP_COLORAPP_ALGO_ALL;All @@ -1411,7 +1411,7 @@ TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] TP_COLORAPP_GAMUT;Gamut control (L*a*b*) TP_COLORAPP_GAMUT_TOOLTIP;Allow gamut control in L*a*b* mode. TP_COLORAPP_HUE;Hue (h) -TP_COLORAPP_HUE_TOOLTIP;Hue (h) - angle between 0 and 360. +TP_COLORAPP_HUE_TOOLTIP;Hue (h) - angle between 0° and 360°. TP_COLORAPP_LABEL;CIE Color Appearance Model 2002 TP_COLORAPP_LABEL_CAM02;Image Adjustments TP_COLORAPP_LABEL_SCENE;Scene Conditions @@ -1562,16 +1562,16 @@ TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations -TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Applying three median filter iterations with a 33 window size often leads to better results than using one median filter iteration with a 77 window size. +TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. TP_DIRPYRDENOISE_MEDIAN_TYPE;Median type -TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n33 soft: treats 5 pixels in a 33 pixel window.\n33: treats 9 pixels in a 33 pixel window.\n55 soft: treats 13 pixels in a 55 pixel window.\n55: treats 25 pixels in a 55 pixel window.\n77: treats 49 pixels in a 77 pixel window.\n99: treats 81 pixels in a 99 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. +TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. TP_DIRPYRDENOISE_SLI;Slider -TP_DIRPYRDENOISE_TYPE_3X3;33 -TP_DIRPYRDENOISE_TYPE_3X3SOFT;33 soft -TP_DIRPYRDENOISE_TYPE_5X5;55 -TP_DIRPYRDENOISE_TYPE_5X5SOFT;55 soft -TP_DIRPYRDENOISE_TYPE_7X7;77 -TP_DIRPYRDENOISE_TYPE_9X9;99 +TP_DIRPYRDENOISE_TYPE_3X3;3×3 +TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +TP_DIRPYRDENOISE_TYPE_5X5;5×5 +TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +TP_DIRPYRDENOISE_TYPE_7X7;7×7 +TP_DIRPYRDENOISE_TYPE_9X9;9×9 TP_DIRPYREQUALIZER_ALGO;Skin Color Range TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts @@ -2017,7 +2017,7 @@ TP_SHARPENING_USM;Unsharp Mask TP_SHARPENMICRO_AMOUNT;Quantity TP_SHARPENMICRO_CONTRAST;Contrast threshold TP_SHARPENMICRO_LABEL;Microcontrast -TP_SHARPENMICRO_MATRIX;33 matrix instead of 55 +TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5 TP_SHARPENMICRO_UNIFORMITY;Uniformity TP_SOFTLIGHT_LABEL;Soft Light TP_SOFTLIGHT_STRENGTH;Strength From f6c864d477192a16535b27de21a006024734ff78 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Wed, 31 Oct 2018 15:02:53 +0100 Subject: [PATCH 041/122] Get rid of aehistogram files in RT cache, fixes #4904 --- rtengine/rtthumbnail.cc | 69 +++++++++++++++++++++++++++++++++++++++-- rtengine/rtthumbnail.h | 8 +++++ rtgui/thumbnail.cc | 13 +++++--- 3 files changed, 82 insertions(+), 8 deletions(-) diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index afd8836a1..1210518d4 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -279,6 +279,11 @@ Thumbnail* Thumbnail::loadFromImage (const Glib::ustring& fname, int &w, int &h, printf ("loadFromImage: Unsupported image type \"%s\"!\n", img->getType()); } + ProcParams paramsForAutoExp; // Dummy for constructor + ImProcFunctions ipf (¶msForAutoExp, false); + ipf.getAutoExp (tpp->aeHistogram, tpp->aeHistCompression, 0.02, tpp->aeExposureCompensation, tpp->aeLightness, tpp->aeContrast, tpp->aeBlack, tpp->aeHighlightCompression, tpp->aeHighlightCompressionThreshold); + tpp->aeValid = true; + if (n > 0) { ColorTemp cTemp; @@ -923,6 +928,11 @@ Thumbnail* Thumbnail::loadFromRaw (const Glib::ustring& fname, RawMetaDataLocati } } } + ProcParams paramsForAutoExp; // Dummy for constructor + ImProcFunctions ipf (¶msForAutoExp, false); + ipf.getAutoExp (tpp->aeHistogram, tpp->aeHistCompression, 0.02, tpp->aeExposureCompensation, tpp->aeLightness, tpp->aeContrast, tpp->aeBlack, tpp->aeHighlightCompression, tpp->aeHighlightCompressionThreshold); + tpp->aeValid = true; + if (ri->get_colors() == 1) { pixSum[0] = pixSum[1] = pixSum[2] = 1.; n[0] = n[1] = n[2] = 1; @@ -993,6 +1003,13 @@ Thumbnail::Thumbnail () : wbEqual (-1.0), wbTempBias (0.0), aeHistCompression (3), + aeValid(false), + aeExposureCompensation(0.0), + aeLightness(0), + aeContrast(0), + aeBlack(0), + aeHighlightCompression(0), + aeHighlightCompressionThreshold(0), embProfileLength (0), embProfileData (nullptr), embProfile (nullptr), @@ -1224,8 +1241,17 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT int hlcompr = params.toneCurve.hlcompr; int hlcomprthresh = params.toneCurve.hlcomprthresh; - if (params.toneCurve.autoexp && aeHistogram) { - ipf.getAutoExp (aeHistogram, aeHistCompression, params.toneCurve.clip, expcomp, bright, contr, black, hlcompr, hlcomprthresh); + if (params.toneCurve.autoexp) { + if (aeValid) { + expcomp = aeExposureCompensation; + bright = aeLightness; + contr = aeContrast; + black = aeBlack; + hlcompr = aeHighlightCompression; + hlcomprthresh = aeHighlightCompressionThreshold; + } else if (aeHistogram) { + ipf.getAutoExp (aeHistogram, aeHistCompression, 0.02, expcomp, bright, contr, black, hlcompr, hlcomprthresh); + } } LUTf curve1 (65536); @@ -1992,6 +2018,38 @@ bool Thumbnail::readData (const Glib::ustring& fname) aeHistCompression = keyFile.get_integer ("LiveThumbData", "AEHistCompression"); } + aeValid = true; + if (keyFile.has_key ("LiveThumbData", "AEExposureCompensation")) { + aeExposureCompensation = keyFile.get_double ("LiveThumbData", "AEExposureCompensation"); + } else { + aeValid = false; + } + if (keyFile.has_key ("LiveThumbData", "AELightness")) { + aeLightness = keyFile.get_integer ("LiveThumbData", "AELightness"); + } else { + aeValid = false; + } + if (keyFile.has_key ("LiveThumbData", "AEContrast")) { + aeContrast = keyFile.get_integer ("LiveThumbData", "AEContrast"); + } else { + aeValid = false; + } + if (keyFile.has_key ("LiveThumbData", "AEBlack")) { + aeBlack = keyFile.get_integer ("LiveThumbData", "AEBlack"); + } else { + aeValid = false; + } + if (keyFile.has_key ("LiveThumbData", "AEHighlightCompression")) { + aeHighlightCompression = keyFile.get_integer ("LiveThumbData", "AEHighlightCompression"); + } else { + aeValid = false; + } + if (keyFile.has_key ("LiveThumbData", "AEHighlightCompressionThreshold")) { + aeHighlightCompressionThreshold = keyFile.get_integer ("LiveThumbData", "AEHighlightCompressionThreshold"); + } else { + aeValid = false; + } + if (keyFile.has_key ("LiveThumbData", "RedMultiplier")) { redMultiplier = keyFile.get_double ("LiveThumbData", "RedMultiplier"); } @@ -2065,7 +2123,12 @@ bool Thumbnail::writeData (const Glib::ustring& fname) keyFile.set_double ("LiveThumbData", "RedAWBMul", redAWBMul); keyFile.set_double ("LiveThumbData", "GreenAWBMul", greenAWBMul); keyFile.set_double ("LiveThumbData", "BlueAWBMul", blueAWBMul); - keyFile.set_integer ("LiveThumbData", "AEHistCompression", aeHistCompression); + keyFile.set_double ("LiveThumbData", "AEExposureCompensation", aeExposureCompensation); + keyFile.set_integer ("LiveThumbData", "AELightness", aeLightness); + keyFile.set_integer ("LiveThumbData", "AEContrast", aeContrast); + keyFile.set_integer ("LiveThumbData", "AEBlack", aeBlack); + keyFile.set_integer ("LiveThumbData", "AEHighlightCompression", aeHighlightCompression); + keyFile.set_integer ("LiveThumbData", "AEHighlightCompressionThreshold", aeHighlightCompressionThreshold); keyFile.set_double ("LiveThumbData", "RedMultiplier", redMultiplier); keyFile.set_double ("LiveThumbData", "GreenMultiplier", greenMultiplier); keyFile.set_double ("LiveThumbData", "BlueMultiplier", blueMultiplier); diff --git a/rtengine/rtthumbnail.h b/rtengine/rtthumbnail.h index 558d136ee..667d8e1c9 100644 --- a/rtengine/rtthumbnail.h +++ b/rtengine/rtthumbnail.h @@ -50,6 +50,13 @@ class Thumbnail double autoWBTemp, autoWBGreen, wbEqual, wbTempBias; // autoWBTemp and autoWBGreen are updated each time autoWB is requested and if wbEqual has been modified LUTu aeHistogram; int aeHistCompression; + bool aeValid; + double aeExposureCompensation; + int aeLightness; + int aeContrast; + int aeBlack; + int aeHighlightCompression; + int aeHighlightCompressionThreshold; int embProfileLength; unsigned char* embProfileData; cmsHPROFILE embProfile; @@ -100,6 +107,7 @@ public: bool readAEHistogram (const Glib::ustring& fname); bool writeAEHistogram (const Glib::ustring& fname); + bool isAeValid() { return aeValid; }; unsigned char* getImage8Data(); // accessor to the 8bit image if it is one, which should be the case for the "Inspector" mode. // Hombre: ... let's hope that proper template can make this cleaner diff --git a/rtgui/thumbnail.cc b/rtgui/thumbnail.cc index c2d23eab2..4921a2d56 100644 --- a/rtgui/thumbnail.cc +++ b/rtgui/thumbnail.cc @@ -854,8 +854,10 @@ void Thumbnail::_loadThumbnail(bool firstTrial) } if ( cfs.thumbImgType == CacheImageData::FULL_THUMBNAIL ) { - // load aehistogram - tpp->readAEHistogram (getCacheFileName ("aehistograms", "")); + if(!tpp->isAeValid()) { + // load aehistogram + tpp->readAEHistogram (getCacheFileName ("aehistograms", "")); + } // load embedded profile tpp->readEmbProfile (getCacheFileName ("embprofiles", ".icc")); @@ -907,9 +909,10 @@ void Thumbnail::_saveThumbnail () // save thumbnail image tpp->writeImage (getCacheFileName ("images", "")); - // save aehistogram - tpp->writeAEHistogram (getCacheFileName ("aehistograms", "")); - + if(!tpp->isAeValid()) { + // save aehistogram + tpp->writeAEHistogram (getCacheFileName ("aehistograms", "")); + } // save embedded profile tpp->writeEmbProfile (getCacheFileName ("embprofiles", ".icc")); From 310e7343918d9c34ab7fc2ffd3ef8a670b22dca7 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Wed, 31 Oct 2018 16:21:26 +0100 Subject: [PATCH 042/122] Don't create aehistograms folder in RT cache, #4904 --- rtgui/cachemanager.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/rtgui/cachemanager.cc b/rtgui/cachemanager.cc index 5b18d5d33..c1f81a0d2 100644 --- a/rtgui/cachemanager.cc +++ b/rtgui/cachemanager.cc @@ -57,7 +57,9 @@ void CacheManager::init () auto error = g_mkdir_with_parents (baseDir.c_str(), cacheDirMode); for (const auto& cacheDir : cacheDirs) { - error |= g_mkdir_with_parents (Glib::build_filename (baseDir, cacheDir).c_str(), cacheDirMode); + if (strncmp(cacheDir, "aehistograms", 12)) { // don't create aehistograms folder. + error |= g_mkdir_with_parents (Glib::build_filename (baseDir, cacheDir).c_str(), cacheDirMode); + } } if (error != 0 && options.rtSettings.verbose) { From 473e4bc2369bfa9c7928b9afa1fb9c168b233e58 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Wed, 31 Oct 2018 17:22:03 +0100 Subject: [PATCH 043/122] clear cache data folder, #4904 --- rtgui/cachemanager.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/rtgui/cachemanager.cc b/rtgui/cachemanager.cc index c1f81a0d2..06f4ad237 100644 --- a/rtgui/cachemanager.cc +++ b/rtgui/cachemanager.cc @@ -240,6 +240,7 @@ void CacheManager::clearImages () const { MyMutex::MyLock lock (mutex); + deleteDir ("data"); deleteDir ("images"); deleteDir ("aehistograms"); deleteDir ("embprofiles"); From fb97eeaa5abc5c52767ec0ad7870de816df3c97f Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Wed, 31 Oct 2018 17:53:47 +0100 Subject: [PATCH 044/122] guided filter: fixed bug due to overlapping input and output arrays --- rtengine/guidedfilter.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/guidedfilter.cc b/rtengine/guidedfilter.cc index 4e31fa300..790245b20 100644 --- a/rtengine/guidedfilter.cc +++ b/rtengine/guidedfilter.cc @@ -215,7 +215,7 @@ void guidedFilter(const array2D &guide, const array2D &src, array2 f_upsample(meanA, meana); DEBUG_DUMP(meanA); - array2D &meanB = q; + array2D meanB(W, H); f_upsample(meanB, meanb); DEBUG_DUMP(meanB); From bfe2ce7fe1f43616b0dc0dca06c340d7349cac78 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Wed, 31 Oct 2018 20:52:16 +0100 Subject: [PATCH 045/122] Don't check for .jpg, .cust, .cust16 files in cache/images folder, #4904 --- rtgui/cachemanager.cc | 6 ------ rtgui/thumbnail.cc | 7 +------ 2 files changed, 1 insertion(+), 12 deletions(-) diff --git a/rtgui/cachemanager.cc b/rtgui/cachemanager.cc index 06f4ad237..919f76f6d 100644 --- a/rtgui/cachemanager.cc +++ b/rtgui/cachemanager.cc @@ -185,9 +185,6 @@ void CacheManager::renameEntry (const std::string& oldfilename, const std::strin auto error = g_rename (getCacheFileName ("profiles", oldfilename, paramFileExtension, oldmd5).c_str (), getCacheFileName ("profiles", newfilename, paramFileExtension, newmd5).c_str ()); error |= g_rename (getCacheFileName ("images", oldfilename, ".rtti", oldmd5).c_str (), getCacheFileName ("images", newfilename, ".rtti", newmd5).c_str ()); - error |= g_rename (getCacheFileName ("images", oldfilename, ".cust16", oldmd5).c_str (), getCacheFileName ("images", newfilename, ".cust16", newmd5).c_str ()); - error |= g_rename (getCacheFileName ("images", oldfilename, ".cust", oldmd5).c_str (), getCacheFileName ("images", newfilename, ".cust", newmd5).c_str ()); - error |= g_rename (getCacheFileName ("images", oldfilename, ".jpg", oldmd5).c_str (), getCacheFileName ("images", newfilename, ".jpg", newmd5).c_str ()); error |= g_rename (getCacheFileName ("aehistograms", oldfilename, "", oldmd5).c_str (), getCacheFileName ("aehistograms", newfilename, "", newmd5).c_str ()); error |= g_rename (getCacheFileName ("embprofiles", oldfilename, ".icc", oldmd5).c_str (), getCacheFileName ("embprofiles", newfilename, ".icc", newmd5).c_str ()); error |= g_rename (getCacheFileName ("data", oldfilename, ".txt", oldmd5).c_str (), getCacheFileName ("data", newfilename, ".txt", newmd5).c_str ()); @@ -278,9 +275,6 @@ void CacheManager::deleteFiles (const Glib::ustring& fname, const std::string& m } auto error = g_remove (getCacheFileName ("images", fname, ".rtti", md5).c_str ()); - error |= g_remove (getCacheFileName ("images", fname, ".cust16", md5).c_str ()); - error |= g_remove (getCacheFileName ("images", fname, ".cust", md5).c_str ()); - error |= g_remove (getCacheFileName ("images", fname, ".jpg", md5).c_str ()); error |= g_remove (getCacheFileName ("aehistograms", fname, "", md5).c_str ()); error |= g_remove (getCacheFileName ("embprofiles", fname, ".icc", md5).c_str ()); diff --git a/rtgui/thumbnail.cc b/rtgui/thumbnail.cc index 4921a2d56..d3bf4ca05 100644 --- a/rtgui/thumbnail.cc +++ b/rtgui/thumbnail.cc @@ -899,12 +899,7 @@ void Thumbnail::_saveThumbnail () return; } - if (g_remove (getCacheFileName ("images", ".rtti").c_str ()) != 0) { - // No file deleted, so we try to deleted obsolete files, if any - g_remove (getCacheFileName ("images", ".cust").c_str ()); - g_remove (getCacheFileName ("images", ".cust16").c_str ()); - g_remove (getCacheFileName ("images", ".jpg").c_str ()); - } + g_remove (getCacheFileName ("images", ".rtti").c_str ()) != 0); // save thumbnail image tpp->writeImage (getCacheFileName ("images", "")); From ea5a81b9a16eadf705b6de78dec1350849606b0c Mon Sep 17 00:00:00 2001 From: heckflosse Date: Wed, 31 Oct 2018 20:52:58 +0100 Subject: [PATCH 046/122] Don't check for .jpg, .cust, .cust16 files in cache/images folder, second try, #4904 --- rtgui/thumbnail.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtgui/thumbnail.cc b/rtgui/thumbnail.cc index d3bf4ca05..1365117d7 100644 --- a/rtgui/thumbnail.cc +++ b/rtgui/thumbnail.cc @@ -899,7 +899,7 @@ void Thumbnail::_saveThumbnail () return; } - g_remove (getCacheFileName ("images", ".rtti").c_str ()) != 0); + g_remove (getCacheFileName ("images", ".rtti").c_str ())); // save thumbnail image tpp->writeImage (getCacheFileName ("images", "")); From ebcd737bf857a9d430ea71029770c577470aa44f Mon Sep 17 00:00:00 2001 From: heckflosse Date: Wed, 31 Oct 2018 20:57:21 +0100 Subject: [PATCH 047/122] Don't check for .jpg, .cust, .cust16 files in cache/images folder, third try, #4904 --- rtgui/thumbnail.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtgui/thumbnail.cc b/rtgui/thumbnail.cc index 1365117d7..0ae78dd62 100644 --- a/rtgui/thumbnail.cc +++ b/rtgui/thumbnail.cc @@ -899,7 +899,7 @@ void Thumbnail::_saveThumbnail () return; } - g_remove (getCacheFileName ("images", ".rtti").c_str ())); + g_remove (getCacheFileName ("images", ".rtti").c_str ()); // save thumbnail image tpp->writeImage (getCacheFileName ("images", "")); From d65767a022704d87b654029474210ce553715259 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Wed, 31 Oct 2018 22:21:43 +0100 Subject: [PATCH 048/122] Delete cache file from cache/data when using delete from cache full, #4904 --- rtgui/cachemanager.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtgui/cachemanager.cc b/rtgui/cachemanager.cc index 919f76f6d..5f73e9e0f 100644 --- a/rtgui/cachemanager.cc +++ b/rtgui/cachemanager.cc @@ -174,7 +174,7 @@ void CacheManager::deleteEntry (const Glib::ustring& fname) void CacheManager::clearFromCache (const Glib::ustring& fname, bool purge) const { - deleteFiles (fname, getMD5 (fname), purge, purge); + deleteFiles (fname, getMD5 (fname), true, purge); } void CacheManager::renameEntry (const std::string& oldfilename, const std::string& oldmd5, const std::string& newfilename) From f89755862157db062ddc4c9fb4d0119f1f977486 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Wed, 31 Oct 2018 22:34:28 +0100 Subject: [PATCH 049/122] Renamed cache context menu strings #4907 --- rtdata/languages/Catala | 2 -- rtdata/languages/Chinese (Simplified) | 2 -- rtdata/languages/Chinese (Traditional) | 2 -- rtdata/languages/Czech | 2 -- rtdata/languages/Dansk | 2 -- rtdata/languages/Deutsch | 2 -- rtdata/languages/English (UK) | 2 -- rtdata/languages/English (US) | 2 -- rtdata/languages/Espanol | 2 -- rtdata/languages/Euskara | 2 -- rtdata/languages/Francais | 2 -- rtdata/languages/Greek | 2 -- rtdata/languages/Hebrew | 2 -- rtdata/languages/Italiano | 2 -- rtdata/languages/Japanese | 2 -- rtdata/languages/Latvian | 2 -- rtdata/languages/Magyar | 2 -- rtdata/languages/Nederlands | 2 -- rtdata/languages/Norsk BM | 2 -- rtdata/languages/Polish | 2 -- rtdata/languages/Polish (Latin Characters) | 2 -- rtdata/languages/Portugues (Brasil) | 2 -- rtdata/languages/Russian | 2 -- rtdata/languages/Serbian (Cyrilic Characters) | 2 -- rtdata/languages/Serbian (Latin Characters) | 2 -- rtdata/languages/Slovak | 2 -- rtdata/languages/Suomi | 2 -- rtdata/languages/Swedish | 2 -- rtdata/languages/Turkish | 2 -- rtdata/languages/default | 4 ++-- 30 files changed, 2 insertions(+), 60 deletions(-) diff --git a/rtdata/languages/Catala b/rtdata/languages/Catala index c3a7ea1d0..1c89d23c5 100644 --- a/rtdata/languages/Catala +++ b/rtdata/languages/Catala @@ -84,8 +84,6 @@ FILEBROWSER_AUTOFLATFIELD;Auto camp pla FILEBROWSER_BROWSEPATHBUTTONHINT;Clic per navegar al path escollit FILEBROWSER_BROWSEPATHHINT;Escriviu path on buscar.\nCtrl-O dirigir-se al path de la finestra de text.\nEnter / Ctrl-Enter (en el gestor de fitxers) per a navegar allí;\n\nPath dreceres:\n ~ - directori home de l'usuari\n ! - directori de fotografies de l'usuari FILEBROWSER_CACHE;Cau -FILEBROWSER_CACHECLEARFROMFULL;Esborra el cau - tot -FILEBROWSER_CACHECLEARFROMPARTIAL;Esborra el cau - part FILEBROWSER_CLEARPROFILE;Neteja FILEBROWSER_COPYPROFILE;Copia FILEBROWSER_CURRENT_NAME;Nom actual: diff --git a/rtdata/languages/Chinese (Simplified) b/rtdata/languages/Chinese (Simplified) index 077da51c0..05b11dd4f 100644 --- a/rtdata/languages/Chinese (Simplified) +++ b/rtdata/languages/Chinese (Simplified) @@ -95,8 +95,6 @@ FILEBROWSER_AUTODARKFRAME;自动暗场 FILEBROWSER_AUTOFLATFIELD;自动平场 FILEBROWSER_BROWSEPATHBUTTONHINT;点击浏览选择的路径 FILEBROWSER_CACHE;缓存 -FILEBROWSER_CACHECLEARFROMFULL;清空缓存 -FILEBROWSER_CACHECLEARFROMPARTIAL;清理缓存 FILEBROWSER_CLEARPROFILE;清空配置 FILEBROWSER_COPYPROFILE;复制配置 FILEBROWSER_CURRENT_NAME;当前名称: diff --git a/rtdata/languages/Chinese (Traditional) b/rtdata/languages/Chinese (Traditional) index 2b2477748..d58343b6a 100644 --- a/rtdata/languages/Chinese (Traditional) +++ b/rtdata/languages/Chinese (Traditional) @@ -507,8 +507,6 @@ TP_WBALANCE_TEMPERATURE;色溫 !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to browse to the chosen path. !FILEBROWSER_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory !FILEBROWSER_CACHE;Cache -!FILEBROWSER_CACHECLEARFROMFULL;Clear from cache - full -!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear from cache - partial !FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple !FILEBROWSER_CURRENT_NAME;Current name: !FILEBROWSER_DARKFRAME;Dark-frame diff --git a/rtdata/languages/Czech b/rtdata/languages/Czech index 18af7bf65..dbc606070 100644 --- a/rtdata/languages/Czech +++ b/rtdata/languages/Czech @@ -154,8 +154,6 @@ FILEBROWSER_AUTOFLATFIELD;Auto Flat Field FILEBROWSER_BROWSEPATHBUTTONHINT;Klikněte pro výběr cesty. FILEBROWSER_BROWSEPATHHINT;Vložte cestu pro procházení.\n\nKlávesové zkratky:\nCtrl-o pro přepnutí do adresního řádku.\nEnter/ Ctrl-Enter pro procházení ;\nEsc pro zrušení změn.\nShift-Esc pro zrušení přepnutí.\n\nZkratky pro cesty:\n~\t- domácí složka uživatele.\n!\t- složka s obrázky uživatele. FILEBROWSER_CACHE;Mezipaměť -FILEBROWSER_CACHECLEARFROMFULL;Vymazat z mezipaměti - úplně -FILEBROWSER_CACHECLEARFROMPARTIAL;Vymazat z mezipaměti - částečně FILEBROWSER_CLEARPROFILE;Smazat FILEBROWSER_COLORLABEL_TOOLTIP;Barevný štítek.\n\nPoužijte výběr ze seznamu nebo klávesové zkratky:\nShift-Ctrl-0 Bez barvy\nShift-Ctrl-1 Červený\nShift-Ctrl-2 Žlutý\nShift-Ctrl-3 Zelený\nShift-Ctrl-4 Modrý\nShift-Ctrl-5 Nachový FILEBROWSER_COPYPROFILE;Kopírovat diff --git a/rtdata/languages/Dansk b/rtdata/languages/Dansk index 547c5a6e6..da5616b31 100644 --- a/rtdata/languages/Dansk +++ b/rtdata/languages/Dansk @@ -499,8 +499,6 @@ TP_WBALANCE_TEMPERATURE;Temperatur !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to browse to the chosen path. !FILEBROWSER_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory !FILEBROWSER_CACHE;Cache -!FILEBROWSER_CACHECLEARFROMFULL;Clear from cache - full -!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear from cache - partial !FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple !FILEBROWSER_CURRENT_NAME;Current name: !FILEBROWSER_DARKFRAME;Dark-frame diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index dd0655242..3cf1b32da 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -185,8 +185,6 @@ FILEBROWSER_AUTOFLATFIELD;Automatisches Weißbild FILEBROWSER_BROWSEPATHBUTTONHINT;Ausgewählten Pfad öffnen. FILEBROWSER_BROWSEPATHHINT;Einen Pfad eingeben:\nTaste:\nStrg + o Setzt den Cursor in das Eingabefeld\nEnter Öffnet den Pfad\nEsc Änderungen verwerfen\nUmschalt + Esc Eingabefeld verlassen\n\nSchnellnavigation:\nTaste:\n~ “Home“-Verzeichnis des Benutzers\n! Bilder-Verzeichnis des Benutzers FILEBROWSER_CACHE;Festplatten-Cache -FILEBROWSER_CACHECLEARFROMFULL;Aus dem Festplatten-Cache entfernen (vollständig) -FILEBROWSER_CACHECLEARFROMPARTIAL;Aus dem Festplatten-Cache entfernen (teilweise) FILEBROWSER_CLEARPROFILE;Profil löschen FILEBROWSER_COLORLABEL_TOOLTIP;Farbmarkierung\n\nTaste: Strg + Umschalt + 0 Ohne\nTaste: Strg + Umschalt + 1 Rot\nTaste: Strg + Umschalt + 2 Gelb\nTaste: Strg + Umschalt + 3 Grün\nTaste: Strg + Umschalt + 4 Blau\nTaste: Strg + Umschalt + 5 Violett FILEBROWSER_COPYPROFILE;Profil kopieren diff --git a/rtdata/languages/English (UK) b/rtdata/languages/English (UK) index 800e23527..8fcaafd56 100644 --- a/rtdata/languages/English (UK) +++ b/rtdata/languages/English (UK) @@ -232,8 +232,6 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to browse to the chosen path. !FILEBROWSER_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory !FILEBROWSER_CACHE;Cache -!FILEBROWSER_CACHECLEARFROMFULL;Clear from cache - full -!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear from cache - partial !FILEBROWSER_CLEARPROFILE;Clear !FILEBROWSER_COPYPROFILE;Copy !FILEBROWSER_CURRENT_NAME;Current name: diff --git a/rtdata/languages/English (US) b/rtdata/languages/English (US) index fc2fa83dd..53a2aec91 100644 --- a/rtdata/languages/English (US) +++ b/rtdata/languages/English (US) @@ -116,8 +116,6 @@ !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to browse to the chosen path. !FILEBROWSER_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory !FILEBROWSER_CACHE;Cache -!FILEBROWSER_CACHECLEARFROMFULL;Clear from cache - full -!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear from cache - partial !FILEBROWSER_CLEARPROFILE;Clear !FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple !FILEBROWSER_COPYPROFILE;Copy diff --git a/rtdata/languages/Espanol b/rtdata/languages/Espanol index 5402f6579..4284523ab 100644 --- a/rtdata/languages/Espanol +++ b/rtdata/languages/Espanol @@ -149,8 +149,6 @@ FILEBROWSER_AUTOFLATFIELD;Campo plano automático FILEBROWSER_BROWSEPATHBUTTONHINT;Pulsar para examinar la carpeta seleccionada FILEBROWSER_BROWSEPATHHINT;Ingrese la ruta a examinar \nCtrl-O poner el foco en campo con la ruta\nEnter / Ctrl-Enter para examinar allí;\nEscPara quitar los cambios.\nShift-Esc Para quitar el foco.\n\n\nAbreviaturas de ruta:\n ~ - Carpeta hogar del usuario\n ! - Carpeta de imágenes del usuario FILEBROWSER_CACHE;Caché -FILEBROWSER_CACHECLEARFROMFULL;Limpiar del caché - Total -FILEBROWSER_CACHECLEARFROMPARTIAL;Limpiar del caché - Parcial FILEBROWSER_CLEARPROFILE;Borrar perfil FILEBROWSER_COLORLABEL_TOOLTIP;Etiquetar con color\n\nUse menú desplegable o atajos de teclado:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Rojo\nShift-Ctrl-2 Amarillo\nShift-Ctrl-3 Verde\nShift-Ctrl-4 Azul\nShift-Ctrl-5 Púrpura FILEBROWSER_COPYPROFILE;Copiar perfil diff --git a/rtdata/languages/Euskara b/rtdata/languages/Euskara index 851536a29..a604d6aef 100644 --- a/rtdata/languages/Euskara +++ b/rtdata/languages/Euskara @@ -500,8 +500,6 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to browse to the chosen path. !FILEBROWSER_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory !FILEBROWSER_CACHE;Cache -!FILEBROWSER_CACHECLEARFROMFULL;Clear from cache - full -!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear from cache - partial !FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple !FILEBROWSER_CURRENT_NAME;Current name: !FILEBROWSER_DARKFRAME;Dark-frame diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais index 9c1fcce59..2bf82f6e1 100644 --- a/rtdata/languages/Francais +++ b/rtdata/languages/Francais @@ -111,8 +111,6 @@ FILEBROWSER_AUTOFLATFIELD;Champ Uniforme auto FILEBROWSER_BROWSEPATHBUTTONHINT;Cliquez pour parcourir le chemin saisi FILEBROWSER_BROWSEPATHHINT;Saisissez le chemin à parcourir\nCtrl-O pour placer le focus sur le champ de saisie.\nEntrée / Ctrl-Entrée pour y naviguer;\nEsc pour effacer les modifications.\nShift-Esc pour enlever le focus.\n\n\nRaccourcis pour les chemins:\n ~ - le dossier utilisateur\n ! - le dossier Images de l'utilisateur FILEBROWSER_CACHE;Cache -FILEBROWSER_CACHECLEARFROMFULL;Supprimer du cache (complet) -FILEBROWSER_CACHECLEARFROMPARTIAL;Supprimer du cache (partiel) FILEBROWSER_CLEARPROFILE;Remettre le profil à zéro FILEBROWSER_COLORLABEL_TOOLTIP;Label couleur\n\nUtilisez le menu déroulant ou le raccourci clavier:\nShift-Ctrl-0 Pas de couleur\nShift-Ctrl-1 Rouge\nShift-Ctrl-2 Jaune\nShift-Ctrl-3 Vert\nShift-Ctrl-4 Bleu\nShift-Ctrl-5 Pourpre FILEBROWSER_COPYPROFILE;Copier le profil diff --git a/rtdata/languages/Greek b/rtdata/languages/Greek index 086710b52..0c416e421 100644 --- a/rtdata/languages/Greek +++ b/rtdata/languages/Greek @@ -499,8 +499,6 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to browse to the chosen path. !FILEBROWSER_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory !FILEBROWSER_CACHE;Cache -!FILEBROWSER_CACHECLEARFROMFULL;Clear from cache - full -!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear from cache - partial !FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple !FILEBROWSER_CURRENT_NAME;Current name: !FILEBROWSER_DARKFRAME;Dark-frame diff --git a/rtdata/languages/Hebrew b/rtdata/languages/Hebrew index c7477fd09..358045544 100644 --- a/rtdata/languages/Hebrew +++ b/rtdata/languages/Hebrew @@ -500,8 +500,6 @@ TP_WBALANCE_TEMPERATURE;מידת חום !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to browse to the chosen path. !FILEBROWSER_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory !FILEBROWSER_CACHE;Cache -!FILEBROWSER_CACHECLEARFROMFULL;Clear from cache - full -!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear from cache - partial !FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple !FILEBROWSER_CURRENT_NAME;Current name: !FILEBROWSER_DARKFRAME;Dark-frame diff --git a/rtdata/languages/Italiano b/rtdata/languages/Italiano index ca048d956..e8a49771a 100644 --- a/rtdata/languages/Italiano +++ b/rtdata/languages/Italiano @@ -92,8 +92,6 @@ FILEBROWSER_AUTOFLATFIELD;Flat Field automatico FILEBROWSER_BROWSEPATHBUTTONHINT;Premi per aprire il percorso inserito FILEBROWSER_BROWSEPATHHINT;Inserisci il percorso da aprire\nCtrl-o seleziona il percorso\nEnter, Ctrl-Enter (solo nel Navigatore) porta alla destinazione ;\nScorciatoie:\n ~ - Cartella home\n ! - Cartella Immagini FILEBROWSER_CACHE;Memoria -FILEBROWSER_CACHECLEARFROMFULL;Rimuovi dalla memoria - totale -FILEBROWSER_CACHECLEARFROMPARTIAL;Rimuovi dalla memoria - parziale FILEBROWSER_CLEARPROFILE;Cancella FILEBROWSER_COLORLABEL_TOOLTIP;Etichetta colore.\n\nUsa il menù o le scorciatoie:\nShift-Ctrl-0 Nessun Colore\nShift-Ctrl-1 Rosso\nShift-Ctrl-2 Giallo\nShift-Ctrl-3 Verde\nShift-Ctrl-4 Blu\nShift-Ctrl-5 Viola FILEBROWSER_COPYPROFILE;Copia diff --git a/rtdata/languages/Japanese b/rtdata/languages/Japanese index fe8b79022..0bc015fe9 100644 --- a/rtdata/languages/Japanese +++ b/rtdata/languages/Japanese @@ -146,8 +146,6 @@ FILEBROWSER_AUTOFLATFIELD;オート・フラットフィールド FILEBROWSER_BROWSEPATHBUTTONHINT;クリックで選択したパスをブラウズ FILEBROWSER_BROWSEPATHHINT;参照するパスを入力します\nCtrl-O パスのテキストボックスにフォーカス\nEnter / Ctrl-Enterその場所をブラウズします\nEsc 変更をクリア\nShift-Escフォーカスを削除\nパスのショートカット:\n ~ - ユーザーのホームディレクトリ\n ! - ユーザーの画像ディレクトリ FILEBROWSER_CACHE;cache -FILEBROWSER_CACHECLEARFROMFULL;cacheをクリア - すべて -FILEBROWSER_CACHECLEARFROMPARTIAL;cacheをクリア - 一部 FILEBROWSER_CLEARPROFILE;プロファイルのクリア FILEBROWSER_COLORLABEL_TOOLTIP;カラー・ラベル\n\nドロップダウン・メニューからか、ショートカット:\nShift-Ctrl-1 レッド\nShift-Ctrl-2 イエロー\nShift-Ctrl-3 グリーン\nShift-Ctrl-4 ブルー\nShift-Ctrl-5 パープル FILEBROWSER_COPYPROFILE;プロファイルをコピー diff --git a/rtdata/languages/Latvian b/rtdata/languages/Latvian index 6689e4f95..23887cfb1 100644 --- a/rtdata/languages/Latvian +++ b/rtdata/languages/Latvian @@ -500,8 +500,6 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to browse to the chosen path. !FILEBROWSER_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory !FILEBROWSER_CACHE;Cache -!FILEBROWSER_CACHECLEARFROMFULL;Clear from cache - full -!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear from cache - partial !FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple !FILEBROWSER_CURRENT_NAME;Current name: !FILEBROWSER_DARKFRAME;Dark-frame diff --git a/rtdata/languages/Magyar b/rtdata/languages/Magyar index d0f806fea..4e463a8fd 100644 --- a/rtdata/languages/Magyar +++ b/rtdata/languages/Magyar @@ -82,8 +82,6 @@ FILEBROWSER_AUTOFLATFIELD;Auto Flat Field FILEBROWSER_BROWSEPATHBUTTONHINT;Kattints a kiválasztott útvonal böngészéséhez FILEBROWSER_BROWSEPATHHINT;Gépeld be az elérni kívánt útvonalat.\nCtrl-O-val tudod a fókuszt a beviteli mezőre vinni.\nEnter / Ctrl-Enter (az állományböngészőben) az ottani böngészéshez;\n\nÚtvonalrövidítések:\n ~ - felhasználói fiók (home) könyvtára\n - a felhasználó képkönyvtára FILEBROWSER_CACHE;Gyorsítótár -FILEBROWSER_CACHECLEARFROMFULL;Gyorsítótár ürítése - teljes -FILEBROWSER_CACHECLEARFROMPARTIAL;Gyorsítótár ürítése - részleges FILEBROWSER_CLEARPROFILE;Feldolgozási paraméter törlése FILEBROWSER_COPYPROFILE;Feldolgozási paraméterek másolása FILEBROWSER_CURRENT_NAME;Aktuális név: diff --git a/rtdata/languages/Nederlands b/rtdata/languages/Nederlands index f5948ef26..fd0036952 100644 --- a/rtdata/languages/Nederlands +++ b/rtdata/languages/Nederlands @@ -123,8 +123,6 @@ FILEBROWSER_AUTOFLATFIELD;Selecteer automatisch vlakveldopname FILEBROWSER_BROWSEPATHBUTTONHINT;Klik om te navigeren naar het gekozen pad FILEBROWSER_BROWSEPATHHINT;Typ het pad naar de doelmap.\nCtrl-O markeer het pad in het tekstveld.\nEnter / Ctrl-Enter open de map.\nEsc maak het tekstveld leeg.\nShift-Esc verwijder markering.\n\n\nSneltoetsen:\n ~ - gebruikers home directory\n ! - gebruikers afbeeldingen map FILEBROWSER_CACHE;Cache -FILEBROWSER_CACHECLEARFROMFULL;Verwijder uit cache - volledig -FILEBROWSER_CACHECLEARFROMPARTIAL;Verwijder uit cache - gedeeltelijk FILEBROWSER_CLEARPROFILE;Verwijder profiel FILEBROWSER_COLORLABEL_TOOLTIP;Kleur label\n\nGebruik keuzemenu of nSneltoets:\nShift-Ctrl-0 Geen kleur\nShift-Ctrl-1 Rood\nShift-Ctrl-2 Geel\nShift-Ctrl-3 Groen\nShift-Ctrl-4 Blauw\nShift-Ctrl-5 Paars FILEBROWSER_COPYPROFILE;Kopieer profiel diff --git a/rtdata/languages/Norsk BM b/rtdata/languages/Norsk BM index 4a76fdcda..4a4995aef 100644 --- a/rtdata/languages/Norsk BM +++ b/rtdata/languages/Norsk BM @@ -499,8 +499,6 @@ TP_WBALANCE_TEMPERATURE;Temperatur !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to browse to the chosen path. !FILEBROWSER_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory !FILEBROWSER_CACHE;Cache -!FILEBROWSER_CACHECLEARFROMFULL;Clear from cache - full -!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear from cache - partial !FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple !FILEBROWSER_CURRENT_NAME;Current name: !FILEBROWSER_DARKFRAME;Dark-frame diff --git a/rtdata/languages/Polish b/rtdata/languages/Polish index f54de5593..b271178e0 100644 --- a/rtdata/languages/Polish +++ b/rtdata/languages/Polish @@ -96,8 +96,6 @@ FILEBROWSER_AUTOFLATFIELD;Automatyczne użycie klatki typu puste pole FILEBROWSER_BROWSEPATHBUTTONHINT;Należy kliknąć, aby przeglądać wybraną ścieżkę FILEBROWSER_BROWSEPATHHINT;Umożliwia przeglądanie wprowadzonej ścieżki\nCtrl-o zaznaczenie\nEnter, Ctrl-Enter (w menedżerze plików) przeglądanie\nSkróty:\n ~ - katalog domowy użytkownika\n ! - katalog z obrazami użytkownia FILEBROWSER_CACHE;Pamięć podręczna -FILEBROWSER_CACHECLEARFROMFULL;Czyszczenie pamięci podręcznej - pełne -FILEBROWSER_CACHECLEARFROMPARTIAL;Czyszczenie pamięci podręcznej - częściowe FILEBROWSER_CLEARPROFILE;Wyczyść profil FILEBROWSER_COLORLABEL_TOOLTIP;Kolorowe etykiety\n\nUżyj za pomocą rozwijanej listy lub skrótów:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Czerwona\nShift-Ctrl-2 Żółta\nShift-Ctrl-3 Zielona\nShift-Ctrl-4 Niebieska\nShift-Ctrl-5 Purpurowa FILEBROWSER_COPYPROFILE;Kopiuj profil diff --git a/rtdata/languages/Polish (Latin Characters) b/rtdata/languages/Polish (Latin Characters) index d3e62a777..310a1ed13 100644 --- a/rtdata/languages/Polish (Latin Characters) +++ b/rtdata/languages/Polish (Latin Characters) @@ -96,8 +96,6 @@ FILEBROWSER_AUTOFLATFIELD;Automatyczne uzycie klatki typu puste pole FILEBROWSER_BROWSEPATHBUTTONHINT;Nalezy kliknac, aby przegladac wybrana sciezke FILEBROWSER_BROWSEPATHHINT;Umozliwia przegladanie wprowadzonej sciezki\nCtrl-o zaznaczenie\nEnter, Ctrl-Enter (w menedzerze plikow) przegladanie\nSkroty:\n ~ - katalog domowy uzytkownika\n ! - katalog z obrazami uzytkownia FILEBROWSER_CACHE;Pamiec podreczna -FILEBROWSER_CACHECLEARFROMFULL;Czyszczenie pamieci podrecznej - pelne -FILEBROWSER_CACHECLEARFROMPARTIAL;Czyszczenie pamieci podrecznej - czesciowe FILEBROWSER_CLEARPROFILE;Wyczysc profil FILEBROWSER_COLORLABEL_TOOLTIP;Kolorowe etykiety\n\nUzyj za pomoca rozwijanej listy lub skrotow:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Czerwona\nShift-Ctrl-2 Zolta\nShift-Ctrl-3 Zielona\nShift-Ctrl-4 Niebieska\nShift-Ctrl-5 Purpurowa FILEBROWSER_COPYPROFILE;Kopiuj profil diff --git a/rtdata/languages/Portugues (Brasil) b/rtdata/languages/Portugues (Brasil) index 7acb91cce..c737ddcfd 100644 --- a/rtdata/languages/Portugues (Brasil) +++ b/rtdata/languages/Portugues (Brasil) @@ -113,8 +113,6 @@ FILEBROWSER_AUTOFLATFIELD;Flat-field automático FILEBROWSER_BROWSEPATHBUTTONHINT;Clique para navegar até o caminho escolhido. FILEBROWSER_BROWSEPATHHINT;Digite um caminho para navegar até.\n\nAtalhos do teclado:\nCtrl-o para focar na caixa de texto do caminho.\nEnter / Ctrl-Enter para navegar lá;\nEsc para limpar as alterações.\nShift-Esc para remover o foco.\n\nAtalhos do caminho:\n~ - diretório home do usuário.\n! - diretório de fotos do usuário FILEBROWSER_CACHE;Cache -FILEBROWSER_CACHECLEARFROMFULL;Limpeza do cache - completa -FILEBROWSER_CACHECLEARFROMPARTIAL;Limpeza do cache - partcial FILEBROWSER_CLEARPROFILE;Perfil de limpeza FILEBROWSER_COLORLABEL_TOOLTIP;Etiqueta de cor.\n\nUse o menu suspenso ou atalhos:\nShift-Ctrl-0 Sem Cor\nShift-Ctrl-1 Vermelho\nShift-Ctrl-2 Amarelo\nShift-Ctrl-3 Verde\nShift-Ctrl-4 Azul\nShift-Ctrl-5 Roxo FILEBROWSER_COPYPROFILE;Copiar perfil diff --git a/rtdata/languages/Russian b/rtdata/languages/Russian index 36b63772e..3c89c4a74 100644 --- a/rtdata/languages/Russian +++ b/rtdata/languages/Russian @@ -105,8 +105,6 @@ FILEBROWSER_AUTOFLATFIELD;Автоматическое плоское поле FILEBROWSER_BROWSEPATHBUTTONHINT;Нажмите кнопку мыши чтобы перейти к выбранному каталогу FILEBROWSER_BROWSEPATHHINT;Введите путь для перехода.\nCtrl-O для перехода на диалог ввода текста.\nEnter / Ctrl-Enter (в обозревателе файлов) для перехода;\n\nЯрлыки путей:\n ~ - домашняя папка пользователя\n ! - папка пользователя с изображениями FILEBROWSER_CACHE;Кэш -FILEBROWSER_CACHECLEARFROMFULL;Удалить из кэша - полностью -FILEBROWSER_CACHECLEARFROMPARTIAL;Удалить из кэша - частично FILEBROWSER_CLEARPROFILE;Удалить профиль FILEBROWSER_COLORLABEL_TOOLTIP;Color label\n\nUse dropdown menu or Shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple FILEBROWSER_COPYPROFILE;Скопировать профиль diff --git a/rtdata/languages/Serbian (Cyrilic Characters) b/rtdata/languages/Serbian (Cyrilic Characters) index e69c9b874..34c62bf06 100644 --- a/rtdata/languages/Serbian (Cyrilic Characters) +++ b/rtdata/languages/Serbian (Cyrilic Characters) @@ -85,8 +85,6 @@ FILEBROWSER_AUTOFLATFIELD;Аутоматски одреди равно поље FILEBROWSER_BROWSEPATHBUTTONHINT;Кликните за одлазак на узабрану путању FILEBROWSER_BROWSEPATHHINT;Укуцајте путању за разгледање (Ctrl-o поставља фокус, Ctrl-Enter приказује у разгледачу датотека);nПречице путања: ~ — лични директоријум, ! — директоријум са сликама FILEBROWSER_CACHE;Остава -FILEBROWSER_CACHECLEARFROMFULL;Очисти из оставе — све -FILEBROWSER_CACHECLEARFROMPARTIAL;Очисти из оставе — половично FILEBROWSER_CLEARPROFILE;Обриши профил FILEBROWSER_COLORLABEL_TOOLTIP;Натпис у боји.\n\nКористите приложени мени или пречице:\nShift-Ctrl-0 Без боје\nShift-Ctrl-1 Црвена\nShift-Ctrl-2 Жута\nShift-Ctrl-3 Зелена\nShift-Ctrl-4 Плана\nShift-Ctrl-5 Љубичаста FILEBROWSER_COPYPROFILE;Умножи профил diff --git a/rtdata/languages/Serbian (Latin Characters) b/rtdata/languages/Serbian (Latin Characters) index 727cdeb9a..5dd1fa04d 100644 --- a/rtdata/languages/Serbian (Latin Characters) +++ b/rtdata/languages/Serbian (Latin Characters) @@ -85,8 +85,6 @@ FILEBROWSER_AUTOFLATFIELD;Automatski odredi ravno polje FILEBROWSER_BROWSEPATHBUTTONHINT;Kliknite za odlazak na uzabranu putanju FILEBROWSER_BROWSEPATHHINT;Ukucajte putanju za razgledanje (Ctrl-o postavlja fokus, Ctrl-Enter prikazuje u razgledaču datoteka);nPrečice putanja: ~ — lični direktorijum, ! — direktorijum sa slikama FILEBROWSER_CACHE;Ostava -FILEBROWSER_CACHECLEARFROMFULL;Očisti iz ostave — sve -FILEBROWSER_CACHECLEARFROMPARTIAL;Očisti iz ostave — polovično FILEBROWSER_CLEARPROFILE;Obriši profil FILEBROWSER_COLORLABEL_TOOLTIP;Natpis u boji.\n\nKoristite priloženi meni ili prečice:\nShift-Ctrl-0 Bez boje\nShift-Ctrl-1 Crvena\nShift-Ctrl-2 Žuta\nShift-Ctrl-3 Zelena\nShift-Ctrl-4 Plana\nShift-Ctrl-5 Ljubičasta FILEBROWSER_COPYPROFILE;Umnoži profil diff --git a/rtdata/languages/Slovak b/rtdata/languages/Slovak index 022c715e3..15c4050ad 100644 --- a/rtdata/languages/Slovak +++ b/rtdata/languages/Slovak @@ -578,8 +578,6 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to browse to the chosen path. !FILEBROWSER_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory !FILEBROWSER_CACHE;Cache -!FILEBROWSER_CACHECLEARFROMFULL;Clear from cache - full -!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear from cache - partial !FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple !FILEBROWSER_DARKFRAME;Dark-frame !FILEBROWSER_DELETEDLGMSGINCLPROC;Are you sure you want to delete the selected %1 files including a queue-processed version? diff --git a/rtdata/languages/Suomi b/rtdata/languages/Suomi index 722bf1b0b..b0d075188 100644 --- a/rtdata/languages/Suomi +++ b/rtdata/languages/Suomi @@ -501,8 +501,6 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to browse to the chosen path. !FILEBROWSER_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory !FILEBROWSER_CACHE;Cache -!FILEBROWSER_CACHECLEARFROMFULL;Clear from cache - full -!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear from cache - partial !FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple !FILEBROWSER_CURRENT_NAME;Current name: !FILEBROWSER_DARKFRAME;Dark-frame diff --git a/rtdata/languages/Swedish b/rtdata/languages/Swedish index 44c5dd475..82b11df1e 100644 --- a/rtdata/languages/Swedish +++ b/rtdata/languages/Swedish @@ -94,8 +94,6 @@ FILEBROWSER_AUTOFLATFIELD;Automatisk plattfältskorrigering FILEBROWSER_BROWSEPATHBUTTONHINT;Klicka för att komma till vald sökväg FILEBROWSER_BROWSEPATHHINT;Skriv in en sökväg och tryck Enter (Ctrl-Enter i filhanteraren).\nCtrl-O för att komma till sökfältet.\nEnter / Ctrl-Enter för att bläddra;\nEsc för att rensa ändringar.\nShift-Esc för att ta bort fokus från sökfältet.\n\n\nPath kortkommando:\n ~ - användarens hemkatalog\n ! - användarens bildkatalog FILEBROWSER_CACHE;Cache -FILEBROWSER_CACHECLEARFROMFULL;Rensa från cachen - fullständigt -FILEBROWSER_CACHECLEARFROMPARTIAL;Rensa från cachen - delvis FILEBROWSER_CLEARPROFILE;Återställ profilen FILEBROWSER_COLORLABEL_TOOLTIP;Färgetikett\n\nAnvänd menyn eller kortkommandona:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Röd\nShift-Ctrl-2 Gul\nShift-Ctrl-3 Grön\nShift-Ctrl-4 Blå\nShift-Ctrl-5 Lila FILEBROWSER_COPYPROFILE;Kopiera profil diff --git a/rtdata/languages/Turkish b/rtdata/languages/Turkish index a3dd1d5ea..051c99217 100644 --- a/rtdata/languages/Turkish +++ b/rtdata/languages/Turkish @@ -500,8 +500,6 @@ TP_WBALANCE_TEMPERATURE;Isı !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to browse to the chosen path. !FILEBROWSER_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory !FILEBROWSER_CACHE;Cache -!FILEBROWSER_CACHECLEARFROMFULL;Clear from cache - full -!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear from cache - partial !FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple !FILEBROWSER_CURRENT_NAME;Current name: !FILEBROWSER_DARKFRAME;Dark-frame diff --git a/rtdata/languages/default b/rtdata/languages/default index dd5c7e697..be311113f 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -119,8 +119,8 @@ FILEBROWSER_AUTOFLATFIELD;Auto flat-field FILEBROWSER_BROWSEPATHBUTTONHINT;Click to browse to the chosen path. FILEBROWSER_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory FILEBROWSER_CACHE;Cache -FILEBROWSER_CACHECLEARFROMFULL;Clear from cache - full -FILEBROWSER_CACHECLEARFROMPARTIAL;Clear from cache - partial +FILEBROWSER_CACHECLEARFROMFULL;Clear all except cached profiles +FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all including cached profiles FILEBROWSER_CLEARPROFILE;Clear FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple FILEBROWSER_COPYPROFILE;Copy From 9a4d770faacfb33bd5061907116d22d534b66423 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Wed, 31 Oct 2018 22:40:45 +0100 Subject: [PATCH 050/122] Fixing swapped labels --- rtdata/languages/default | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index be311113f..1a1d4a18b 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -119,8 +119,8 @@ FILEBROWSER_AUTOFLATFIELD;Auto flat-field FILEBROWSER_BROWSEPATHBUTTONHINT;Click to browse to the chosen path. FILEBROWSER_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory FILEBROWSER_CACHE;Cache -FILEBROWSER_CACHECLEARFROMFULL;Clear all except cached profiles -FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all including cached profiles +FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles FILEBROWSER_CLEARPROFILE;Clear FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple FILEBROWSER_COPYPROFILE;Copy From be03d1061a4f1ab45a7d2f59b3c313d279955a18 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Thu, 1 Nov 2018 00:18:59 +0100 Subject: [PATCH 051/122] L*a*b* regions: allow for a bit more latitude in corrections --- rtengine/iplabregions.cc | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/rtengine/iplabregions.cc b/rtengine/iplabregions.cc index fe3325b1d..1d42b39f1 100644 --- a/rtengine/iplabregions.cc +++ b/rtengine/iplabregions.cc @@ -33,9 +33,6 @@ void ImProcFunctions::labColorCorrectionRegions(LabImage *lab) return; } - const float factor = 3.f; - const float scaling = 1.f; - int n = params->colorToning.labregions.size(); int show_mask_idx = params->colorToning.labregionsShowMask; if (show_mask_idx >= n) { @@ -133,8 +130,7 @@ void ImProcFunctions::labColorCorrectionRegions(LabImage *lab) const auto abcoord = [](float x) -> float { - const float m = ColorToningParams::LABGRID_CORR_MAX; - return SGN(x) * log2lin(std::abs(x) / m, 4.f) * m; + return 12000.f * SGN(x) * log2lin(std::abs(x), 4.f); }; #ifdef _OPENMP @@ -150,9 +146,9 @@ void ImProcFunctions::labColorCorrectionRegions(LabImage *lab) auto &r = params->colorToning.labregions[i]; float blend = abmask[i][y][x]; float s = 1.f + r.saturation / 100.f; - float a_new = LIM(s * (a + 32768.f * abcoord(r.a) / factor / scaling), -42000.f, 42000.f); - float b_new = LIM(s * (b + 32768.f * abcoord(r.b) / factor / scaling), -42000.f, 42000.f); - float l_new = LIM(l * (1.f + float(r.lightness) / 1000.f), 0.f, 32768.f); + float a_new = LIM(s * (a + abcoord(r.a)), -42000.f, 42000.f); + float b_new = LIM(s * (b + abcoord(r.b)), -42000.f, 42000.f); + float l_new = LIM(l * (1.f + float(r.lightness) / 500.f), 0.f, 32768.f); l = intp(Lmask[i][y][x], l_new, l); a = intp(blend, a_new, a); b = intp(blend, b_new, b); From 86b282fc688f50df4a8232eed8bb60f2205a49c9 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Thu, 1 Nov 2018 05:42:45 +0100 Subject: [PATCH 052/122] procparams: call DehazeParams::operator== in ProcParams::operator== --- rtengine/procparams.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 64440d222..4a3310fb4 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -5073,7 +5073,8 @@ bool ProcParams::operator ==(const ProcParams& other) const && colorToning == other.colorToning && metadata == other.metadata && exif == other.exif - && iptc == other.iptc; + && iptc == other.iptc + && dehaze == other.dehaze; } bool ProcParams::operator !=(const ProcParams& other) const From cc6cbe8347dcf9c03b21de203a6f18ed377ec7a5 Mon Sep 17 00:00:00 2001 From: George Hilliard Date: Thu, 1 Nov 2018 00:47:06 -0500 Subject: [PATCH 053/122] Distinguish between "desired" and "reported" batch queue state This allows the switch to both reflect the state of the queue and function as an input widget. --- rtgui/batchqueuepanel.cc | 74 +++++++++++++++++++++------------------- rtgui/batchqueuepanel.h | 3 +- 2 files changed, 41 insertions(+), 36 deletions(-) diff --git a/rtgui/batchqueuepanel.cc b/rtgui/batchqueuepanel.cc index 8da66183a..a2358a3b5 100644 --- a/rtgui/batchqueuepanel.cc +++ b/rtgui/batchqueuepanel.cc @@ -249,20 +249,13 @@ void BatchQueuePanel::queueSizeChanged(int qsize, bool queueRunning, bool queueE { updateTab (qsize); - if (qsize == 0 || (qsize == 1 && queueRunning)) { - qStartStop->set_sensitive(false); - } else { - qStartStop->set_sensitive(true); - } + setGuiFromBatchState(queueRunning, qsize); - if (!queueRunning) { - stopBatchProc (); - fdir->set_sensitive (true); - fformat->set_sensitive (true); + if (!queueRunning && qsize == 0 && queueShouldRun) { + // There was work, but it is all done now. + queueShouldRun = false; - if (qsize == 0) { - SoundManager::playSoundAsync(options.sndBatchQueueDone); - } + SoundManager::playSoundAsync(options.sndBatchQueueDone); } if (queueError) { @@ -273,8 +266,7 @@ void BatchQueuePanel::queueSizeChanged(int qsize, bool queueRunning, bool queueE void BatchQueuePanel::startOrStopBatchProc() { - bool state = qStartStop->get_state(); - if (state) { + if (qStartStop->get_state()) { startBatchProc(); } else { stopBatchProc(); @@ -283,22 +275,17 @@ void BatchQueuePanel::startOrStopBatchProc() void BatchQueuePanel::startBatchProc () { - // Update switch when queue started programmatically - qStartStopConn.block (true); - qStartStop->set_active(true); - qStartStopState = true; - qStartStopConn.block (false); - if (batchQueue->hasJobs()) { - fdir->set_sensitive (false); - fformat->set_sensitive (false); - if (batchQueue->getEntries().size() == 1) { - qStartStop->set_sensitive(false); - } + // Update the *desired* state of the queue, then launch it. The switch + // state is not updated here; it is changed by the queueSizeChanged() + // callback in response to the *reported* state. + queueShouldRun = true; + + // Don't need an update callback from the queue to know it is started: + setGuiFromBatchState(true, batchQueue->getEntries().size()); + saveOptions(); batchQueue->startProcessing (); - } else { - stopBatchProc (); } updateTab (batchQueue->getEntries().size()); @@ -306,20 +293,37 @@ void BatchQueuePanel::startBatchProc () void BatchQueuePanel::stopBatchProc () { - // Update switch when queue started programmatically - qStartStopConn.block (true); - qStartStop->set_active(false); - qStartStopState = false; - qStartStopConn.block (false); + // There is nothing much to do here except set the desired state, which the + // background queue thread must check. It will notify queueSizeChanged() + // when it stops. + queueShouldRun = false; updateTab (batchQueue->getEntries().size()); } +void BatchQueuePanel::setGuiFromBatchState(bool queueRunning, int qsize) +{ + // Change the GUI state in response to the reported queue state + if (qsize == 0 || (qsize == 1 && queueRunning)) { + qStartStop->set_sensitive(false); + } else { + qStartStop->set_sensitive(true); + } + + qStartStopConn.block(true); + qStartStop->set_active(queueRunning); + qStartStopConn.block(false); + + fdir->set_sensitive (!queueRunning); + fformat->set_sensitive (!queueRunning); +} + void BatchQueuePanel::addBatchQueueJobs(const std::vector& entries, bool head) { batchQueue->addEntries(entries, head); if (!qStartStop->get_active() && qAutoStart->get_active()) { + // Auto-start as if the user had pressed the qStartStop switch startBatchProc (); } } @@ -354,9 +358,9 @@ bool BatchQueuePanel::handleShortcutKey (GdkEventKey* event) bool BatchQueuePanel::canStartNext () { - // This function is called from the background BatchQueue thread. - // It cannot call UI functions, so grab the stored state of qStartStop. - return qStartStopState; + // This function is called from the background BatchQueue thread. It + // cannot call UI functions; we keep the desired state in an atomic. + return queueShouldRun; } void BatchQueuePanel::pathFolderButtonPressed () diff --git a/rtgui/batchqueuepanel.h b/rtgui/batchqueuepanel.h index 74c9750e7..e21e01352 100644 --- a/rtgui/batchqueuepanel.h +++ b/rtgui/batchqueuepanel.h @@ -53,7 +53,7 @@ class BatchQueuePanel : public Gtk::VBox, Gtk::HBox* bottomBox; Gtk::HBox* topBox; - std::atomic qStartStopState; + std::atomic queueShouldRun; IdleRegister idle_register; @@ -76,6 +76,7 @@ private: void startBatchProc (); void stopBatchProc (); void startOrStopBatchProc(); + void setGuiFromBatchState(bool queueRunning, int qsize); void pathFolderChanged (); void pathFolderButtonPressed (); From 72787cd990d9c0b2b8c2d411debfc1308596307f Mon Sep 17 00:00:00 2001 From: heckflosse Date: Thu, 1 Nov 2018 12:12:01 +0100 Subject: [PATCH 054/122] Set Post-Resize Sharpening Contrast Threshold to 15, fixes #4909 --- rtengine/procparams.cc | 2 +- rtgui/prsharpening.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 4a3310fb4..0a7df04fe 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2685,7 +2685,7 @@ void ProcParams::setDefaults() sharpening = SharpeningParams(); prsharpening = SharpeningParams(); - prsharpening.contrast = 0.0; + prsharpening.contrast = 15.0; prsharpening.method = "rld"; prsharpening.deconvamount = 100; prsharpening.deconvradius = 0.45; diff --git a/rtgui/prsharpening.cc b/rtgui/prsharpening.cc index fd2c85227..c7c2ddf9f 100644 --- a/rtgui/prsharpening.cc +++ b/rtgui/prsharpening.cc @@ -37,7 +37,7 @@ PrSharpening::PrSharpening () : FoldableToolPanel(this, "prsharpening", M("TP_PR Gtk::HBox* hb = Gtk::manage (new Gtk::HBox ()); hb->show (); - contrast = Gtk::manage(new Adjuster (M("TP_SHARPENING_CONTRAST"), 0, 200, 1, 0)); + contrast = Gtk::manage(new Adjuster (M("TP_SHARPENING_CONTRAST"), 0, 200, 1, 15)); contrast->setAdjusterListener (this); pack_start(*contrast); contrast->show(); From e9f0b6ac60089550b23132b3ff24ec75d63a30f6 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Thu, 1 Nov 2018 13:34:10 +0100 Subject: [PATCH 055/122] L*a*b* regions: some code cleanups --- rtengine/iplabregions.cc | 6 ++++-- rtgui/colortoning.cc | 44 ++++++++++++++++++++-------------------- 2 files changed, 26 insertions(+), 24 deletions(-) diff --git a/rtengine/iplabregions.cc b/rtengine/iplabregions.cc index 1d42b39f1..2a4d431e6 100644 --- a/rtengine/iplabregions.cc +++ b/rtengine/iplabregions.cc @@ -75,9 +75,11 @@ void ImProcFunctions::labColorCorrectionRegions(LabImage *lab) float b = lab->b[y][x]; float c, h; Color::Lab2Lch(a, b, c, h); - float c1 = lin2log(c * (327.68f / 48000.f), 10.f); + // magic constant c_factor: normally chromaticity is in [0; 42000] (see color.h), but here we use the constant to match how the chromaticity pipette works (see improcfun.cc lines 4705-4706 and color.cc line 1930 + constexpr float c_factor = 327.68f / 48000.f; + float c1 = lin2log(c * c_factor, 10.f); float h1 = Color::huelab_to_huehsv2(h); - h1 = h1 + 1.f/6.f; + h1 = h1 + 1.f/6.f; // offset the hue because we start from purple instead of red if (h1 > 1.f) { h1 -= 1.f; } diff --git a/rtgui/colortoning.cc b/rtgui/colortoning.cc index 2b80c6be2..b6e001b70 100644 --- a/rtgui/colortoning.cc +++ b/rtgui/colortoning.cc @@ -11,7 +11,23 @@ using namespace rtengine; using namespace rtengine::procparams; -static constexpr int ID_LABREGION_HUE = 5; +namespace { + +constexpr int ID_LABREGION_HUE = 5; + +inline bool hasMask(const std::vector &dflt, const std::vector &mask) +{ + return !(mask.empty() || mask[0] == FCT_Linear || mask == dflt); +} + + +inline float round_ab(float v) +{ + return int(v * 1000) / 1000.f; +} + +} // namespace + ColorToning::ColorToning () : FoldableToolPanel(this, "colortoning", M("TP_COLORTONING_LABEL"), false, true) { @@ -1403,6 +1419,10 @@ void ColorToning::onLabRegionSelectionChanged() void ColorToning::labRegionGet(int idx) { + if (idx < 0 || size_t(idx) >= labRegionData.size()) { + return; + } + auto &r = labRegionData[idx]; double la, lb; labRegionAB->getParams(la, lb, r.a, r.b); @@ -1482,26 +1502,6 @@ void ColorToning::labRegionShowMaskChanged() } -namespace { - -bool hasMask(const std::vector &dflt, const std::vector &mask) -{ - if (mask.empty() || mask[0] == FCT_Linear || mask == dflt) { - return false; - } else { - return true; - } -} - - -inline float round_ab(float v) -{ - return int(v * 1000) / 1000.f; -} - -} // namespace - - void ColorToning::labRegionPopulateList() { ConnectionBlocker b(labRegionSelectionConn); @@ -1524,7 +1524,7 @@ void ColorToning::labRegionPopulateList() void ColorToning::labRegionShow(int idx, bool list_only) { - bool disable = listener; + const bool disable = listener; if (disable) { disableListener(); } From a8bbc9cb8bdf9f8fc383ac8904da39e1be4f300a Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Thu, 1 Nov 2018 14:25:06 +0100 Subject: [PATCH 056/122] labgrid: code refactoring to avoid duplication for adding reset buttons --- rtgui/colortoning.cc | 40 +++-------------------- rtgui/colortoning.h | 5 --- rtgui/labgrid.cc | 75 ++++++++++++++++++++++++++++++++------------ rtgui/labgrid.h | 25 +++++++++++++-- 4 files changed, 82 insertions(+), 63 deletions(-) diff --git a/rtgui/colortoning.cc b/rtgui/colortoning.cc index b6e001b70..3ec149a0a 100644 --- a/rtgui/colortoning.cc +++ b/rtgui/colortoning.cc @@ -339,20 +339,8 @@ ColorToning::ColorToning () : FoldableToolPanel(this, "colortoning", M("TP_COLOR // LAB grid auto m = ProcEventMapper::getInstance(); EvColorToningLabGridValue = m->newEvent(RGBCURVE, "HISTORY_MSG_COLORTONING_LABGRID_VALUE"); - labgridBox = Gtk::manage(new Gtk::HBox()); labgrid = Gtk::manage(new LabGrid(EvColorToningLabGridValue, M("TP_COLORTONING_LABGRID_VALUES"))); - labgridBox->pack_start(*labgrid, true, true); - labgridReset = Gtk::manage(new Gtk::Button ()); - labgridReset->add (*Gtk::manage(new RTImage ("undo-small.png", "redo-small.png"))); - setExpandAlignProperties(labgridReset, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_START); - labgridReset->set_relief(Gtk::RELIEF_NONE); - labgridReset->set_tooltip_markup(M("ADJUSTER_RESET_TO_DEFAULT")); - labgridReset->get_style_context()->add_class(GTK_STYLE_CLASS_FLAT); - labgridReset->set_can_focus(false); - labgridReset->set_size_request(-1, 20); - labgridReset->signal_button_release_event().connect(sigc::mem_fun(*this, &ColorToning::resetPressed)); - labgridBox->pack_start(*labgridReset, false, false); - pack_start(*labgridBox, Gtk::PACK_EXPAND_WIDGET, 4); + pack_start(*labgrid, Gtk::PACK_EXPAND_WIDGET, 4); //------------------------------------------------------------------------ //------------------------------------------------------------------------ @@ -410,14 +398,7 @@ ColorToning::ColorToning () : FoldableToolPanel(this, "colortoning", M("TP_COLOR labRegionBox->pack_start(*hb, true, true); labRegionAB = Gtk::manage(new LabGrid(EvLabRegionAB, M("TP_COLORTONING_LABREGION_ABVALUES"), false)); - hb = Gtk::manage(new Gtk::HBox()); - hb->pack_start(*labRegionAB, true, true); - labRegionABReset = Gtk::manage(new Gtk::Button()); - labRegionABReset->set_tooltip_markup(M("ADJUSTER_RESET_TO_DEFAULT")); - labRegionABReset->add(*Gtk::manage(new RTImage("undo-small.png", "redo-small.png"))); - labRegionABReset->signal_button_release_event().connect(sigc::mem_fun(*this, &ColorToning::labRegionResetPressed)); - add_button(labRegionABReset, hb); - labRegionBox->pack_start(*hb); + labRegionBox->pack_start(*labRegionAB); labRegionSaturation = Gtk::manage(new Adjuster(M("TP_COLORTONING_LABREGION_SATURATION"), -100, 100, 1, 0)); labRegionSaturation->setAdjusterListener(this); @@ -985,7 +966,7 @@ void ColorToning::methodChanged () { if (!batchMode) { - labgridBox->hide(); + labgrid->hide(); labRegionBox->hide(); if (method->get_active_row_number() == 0) { // Lab @@ -1155,7 +1136,7 @@ void ColorToning::methodChanged () lumamode->hide(); if (method->get_active_row_number() == 5) { - labgridBox->show(); + labgrid->show(); } else { labRegionBox->show(); } @@ -1388,19 +1369,6 @@ void ColorToning::setBatchMode (bool batchMode) } -bool ColorToning::resetPressed(GdkEventButton* event) -{ - labgrid->reset(event->state & GDK_CONTROL_MASK); - return false; -} - - -bool ColorToning::labRegionResetPressed(GdkEventButton *event) -{ - labRegionAB->reset(event->state & GDK_CONTROL_MASK); - return false; -} - void ColorToning::onLabRegionSelectionChanged() { diff --git a/rtgui/colortoning.h b/rtgui/colortoning.h index eff26bd46..8fb640cba 100644 --- a/rtgui/colortoning.h +++ b/rtgui/colortoning.h @@ -62,8 +62,6 @@ public: float blendPipetteValues(CurveEditor *ce, float chan1, float chan2, float chan3); private: - bool resetPressed(GdkEventButton* event); - bool labRegionResetPressed(GdkEventButton *event); void onLabRegionSelectionChanged(); void labRegionAddPressed(); void labRegionRemovePressed(); @@ -126,9 +124,7 @@ private: sigc::connection lumamodeConn; rtengine::ProcEvent EvColorToningLabGridValue; - Gtk::Button *labgridReset; LabGrid *labgrid; - Gtk::HBox *labgridBox; rtengine::ProcEvent EvLabRegionList; rtengine::ProcEvent EvLabRegionAB; @@ -145,7 +141,6 @@ private: Gtk::Button *labRegionRemove; Gtk::Button *labRegionUp; Gtk::Button *labRegionDown; - Gtk::Button *labRegionABReset; LabGrid *labRegionAB; Adjuster *labRegionSaturation; Adjuster *labRegionLightness; diff --git a/rtgui/labgrid.cc b/rtgui/labgrid.cc index 5e0d571a5..f680c7322 100644 --- a/rtgui/labgrid.cc +++ b/rtgui/labgrid.cc @@ -41,7 +41,11 @@ using rtengine::Color; -bool LabGrid::notifyListener() +//----------------------------------------------------------------------------- +// LabGridArea +//----------------------------------------------------------------------------- + +bool LabGridArea::notifyListener() { if (listener) { const auto round = @@ -55,7 +59,7 @@ bool LabGrid::notifyListener() } -LabGrid::LabGrid(rtengine::ProcEvent evt, const Glib::ustring &msg, bool enable_low): +LabGridArea::LabGridArea(rtengine::ProcEvent evt, const Glib::ustring &msg, bool enable_low): Gtk::DrawingArea(), evt(evt), evtMsg(msg), litPoint(NONE), @@ -70,7 +74,7 @@ LabGrid::LabGrid(rtengine::ProcEvent evt, const Glib::ustring &msg, bool enable_ add_events(Gdk::EXPOSURE_MASK | Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK | Gdk::POINTER_MOTION_MASK); } -void LabGrid::getParams(double &la, double &lb, double &ha, double &hb) const +void LabGridArea::getParams(double &la, double &lb, double &ha, double &hb) const { la = low_a; ha = high_a; @@ -79,7 +83,7 @@ void LabGrid::getParams(double &la, double &lb, double &ha, double &hb) const } -void LabGrid::setParams(double la, double lb, double ha, double hb, bool notify) +void LabGridArea::setParams(double la, double lb, double ha, double hb, bool notify) { const double lo = -1.0; const double hi = 1.0; @@ -93,7 +97,7 @@ void LabGrid::setParams(double la, double lb, double ha, double hb, bool notify) } } -void LabGrid::setDefault (double la, double lb, double ha, double hb) +void LabGridArea::setDefault (double la, double lb, double ha, double hb) { defaultLow_a = la; defaultLow_b = lb; @@ -102,7 +106,7 @@ void LabGrid::setDefault (double la, double lb, double ha, double hb) } -void LabGrid::reset(bool toInitial) +void LabGridArea::reset(bool toInitial) { if (toInitial) { setParams(defaultLow_a, defaultLow_b, defaultHigh_a, defaultHigh_b, true); @@ -112,32 +116,32 @@ void LabGrid::reset(bool toInitial) } -void LabGrid::setEdited(bool yes) +void LabGridArea::setEdited(bool yes) { edited = yes; } -bool LabGrid::getEdited() const +bool LabGridArea::getEdited() const { return edited; } -void LabGrid::setListener(ToolPanelListener *l) +void LabGridArea::setListener(ToolPanelListener *l) { listener = l; } -void LabGrid::on_style_updated () +void LabGridArea::on_style_updated () { setDirty(true); queue_draw (); } -bool LabGrid::on_draw(const ::Cairo::RefPtr &crf) +bool LabGridArea::on_draw(const ::Cairo::RefPtr &crf) { Gtk::Allocation allocation = get_allocation(); allocation.set_x(0); @@ -232,7 +236,7 @@ bool LabGrid::on_draw(const ::Cairo::RefPtr &crf) } -bool LabGrid::on_button_press_event(GdkEventButton *event) +bool LabGridArea::on_button_press_event(GdkEventButton *event) { if (event->button == 1) { if (event->type == GDK_2BUTTON_PRESS) { @@ -259,7 +263,7 @@ bool LabGrid::on_button_press_event(GdkEventButton *event) } -bool LabGrid::on_button_release_event(GdkEventButton *event) +bool LabGridArea::on_button_release_event(GdkEventButton *event) { if (event->button == 1) { isDragged = false; @@ -269,7 +273,7 @@ bool LabGrid::on_button_release_event(GdkEventButton *event) } -bool LabGrid::on_motion_notify_event(GdkEventMotion *event) +bool LabGridArea::on_motion_notify_event(GdkEventMotion *event) { if (isDragged && delayconn.connected()) { delayconn.disconnect(); @@ -295,7 +299,7 @@ bool LabGrid::on_motion_notify_event(GdkEventMotion *event) if (options.adjusterMinDelay == 0) { notifyListener(); } else { - delayconn = Glib::signal_timeout().connect(sigc::mem_fun(*this, &LabGrid::notifyListener), options.adjusterMinDelay); + delayconn = Glib::signal_timeout().connect(sigc::mem_fun(*this, &LabGridArea::notifyListener), options.adjusterMinDelay); } queue_draw(); } else { @@ -320,35 +324,66 @@ bool LabGrid::on_motion_notify_event(GdkEventMotion *event) } -Gtk::SizeRequestMode LabGrid::get_request_mode_vfunc() const +Gtk::SizeRequestMode LabGridArea::get_request_mode_vfunc() const { return Gtk::SIZE_REQUEST_HEIGHT_FOR_WIDTH; } -void LabGrid::get_preferred_width_vfunc(int &minimum_width, int &natural_width) const +void LabGridArea::get_preferred_width_vfunc(int &minimum_width, int &natural_width) const { minimum_width = 50; natural_width = 150; // same as GRAPH_SIZE from mycurve.h } -void LabGrid::get_preferred_height_for_width_vfunc(int width, int &minimum_height, int &natural_height) const +void LabGridArea::get_preferred_height_for_width_vfunc(int width, int &minimum_height, int &natural_height) const { minimum_height = natural_height = width; } -bool LabGrid::lowEnabled() const +bool LabGridArea::lowEnabled() const { return low_enabled; } -void LabGrid::setLowEnabled(bool yes) +void LabGridArea::setLowEnabled(bool yes) { if (low_enabled != yes) { low_enabled = yes; queue_draw(); } } + + +//----------------------------------------------------------------------------- +// LabGrid +//----------------------------------------------------------------------------- + +LabGrid::LabGrid(rtengine::ProcEvent evt, const Glib::ustring &msg, bool enable_low): + grid(evt, msg, enable_low) +{ + Gtk::Button *reset = Gtk::manage(new Gtk::Button()); + reset->set_tooltip_markup(M("ADJUSTER_RESET_TO_DEFAULT")); + reset->add(*Gtk::manage(new RTImage("undo-small.png", "redo-small.png"))); + reset->signal_button_release_event().connect(sigc::mem_fun(*this, &LabGrid::resetPressed)); + + setExpandAlignProperties(reset, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_START); + reset->set_relief(Gtk::RELIEF_NONE); + reset->get_style_context()->add_class(GTK_STYLE_CLASS_FLAT); + reset->set_can_focus(false); + reset->set_size_request(-1, 20); + + pack_start(grid, true, true); + pack_start(*reset, false, false); + show_all_children(); +} + + +bool LabGrid::resetPressed(GdkEventButton *event) +{ + grid.reset(event->state & GDK_CONTROL_MASK); + return false; +} diff --git a/rtgui/labgrid.h b/rtgui/labgrid.h index 715175f74..35e259996 100644 --- a/rtgui/labgrid.h +++ b/rtgui/labgrid.h @@ -43,7 +43,7 @@ #include "toolpanel.h" -class LabGrid: public Gtk::DrawingArea, public BackBuffer { +class LabGridArea: public Gtk::DrawingArea, public BackBuffer { private: rtengine::ProcEvent evt; Glib::ustring evtMsg; @@ -73,7 +73,7 @@ private: void getLitPoint(); public: - LabGrid(rtengine::ProcEvent evt, const Glib::ustring &msg, bool enable_low=true); + LabGridArea(rtengine::ProcEvent evt, const Glib::ustring &msg, bool enable_low=true); void getParams(double &la, double &lb, double &ha, double &hb) const; void setParams(double la, double lb, double ha, double hb, bool notify); @@ -96,3 +96,24 @@ public: void get_preferred_height_for_width_vfunc (int width, int &minimum_height, int &natural_height) const; }; + +class LabGrid: public Gtk::HBox { +private: + LabGridArea grid; + + bool resetPressed(GdkEventButton *event); + +public: + LabGrid(rtengine::ProcEvent evt, const Glib::ustring &msg, bool enable_low=true); + + void getParams(double &la, double &lb, double &ha, double &hb) const { return grid.getParams(la, lb, ha, hb); } + void setParams(double la, double lb, double ha, double hb, bool notify) { grid.setParams(la, lb, ha, hb, notify); } + void setDefault (double la, double lb, double ha, double hb) { grid.setDefault(la, lb, ha, hb); } + void setEdited(bool yes) { grid.setEdited(yes); } + bool getEdited() const { return grid.getEdited(); } + void reset(bool toInitial) { grid.reset(toInitial); } + void setListener(ToolPanelListener *l) { grid.setListener(l); } + bool lowEnabled() const { return grid.lowEnabled(); } + void setLowEnabled(bool yes) { grid.setLowEnabled(yes); } +}; + From aeae61f67f94a0b980f157690427989957ec3269 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Thu, 1 Nov 2018 17:36:20 +0100 Subject: [PATCH 057/122] Updated Preferences > File Browser > Cache Options - UI updated to use grid so that the options nicely align. - "Clear only cached processing profiles" and "Clear all" buttons are hidden when Preferences > Image Processing > Processing profile saving location is set to "next to the input file", #4911 --- rtdata/languages/Catala | 3 - rtdata/languages/Chinese (Simplified) | 3 - rtdata/languages/Chinese (Traditional) | 3 - rtdata/languages/Czech | 3 - rtdata/languages/Dansk | 3 - rtdata/languages/Deutsch | 3 - rtdata/languages/English (UK) | 3 - rtdata/languages/English (US) | 3 - rtdata/languages/Espanol | 3 - rtdata/languages/Euskara | 3 - rtdata/languages/Francais | 3 - rtdata/languages/Greek | 3 - rtdata/languages/Hebrew | 3 - rtdata/languages/Italiano | 3 - rtdata/languages/Japanese | 3 - rtdata/languages/Latvian | 3 - rtdata/languages/Magyar | 3 - rtdata/languages/Nederlands | 3 - rtdata/languages/Norsk BM | 3 - rtdata/languages/Polish | 3 - rtdata/languages/Polish (Latin Characters) | 3 - rtdata/languages/Portugues (Brasil) | 3 - rtdata/languages/Russian | 3 - rtdata/languages/Serbian (Cyrilic Characters) | 3 - rtdata/languages/Serbian (Latin Characters) | 3 - rtdata/languages/Slovak | 3 - rtdata/languages/Suomi | 3 - rtdata/languages/Swedish | 3 - rtdata/languages/Turkish | 3 - rtdata/languages/default | 8 +- rtgui/preferences.cc | 98 ++++++++++++------- rtgui/preferences.h | 7 +- 32 files changed, 70 insertions(+), 130 deletions(-) diff --git a/rtdata/languages/Catala b/rtdata/languages/Catala index 1c89d23c5..fa7141087 100644 --- a/rtdata/languages/Catala +++ b/rtdata/languages/Catala @@ -491,9 +491,6 @@ PREFERENCES_APPLNEXTSTARTUP;Efectiu en reiniciar PREFERENCES_AUTOMONPROFILE;Usa els perfils dels monitors dels sist. operatius automàticament PREFERENCES_BATCH_PROCESSING;Process. per lots PREFERENCES_BEHAVIOR;Comportament -PREFERENCES_CACHECLEARALL;Esborrar tot -PREFERENCES_CACHECLEARPROFILES;Esborrar perfils -PREFERENCES_CACHECLEARTHUMBS;Esborra minifotos PREFERENCES_CACHEMAXENTRIES;Màxim nombre d'entrades a la mem. cau PREFERENCES_CACHEOPTS;Opcions memòria cau PREFERENCES_CACHETHUMBHEIGHT;Màxima alçada de minifoto diff --git a/rtdata/languages/Chinese (Simplified) b/rtdata/languages/Chinese (Simplified) index 05b11dd4f..ff45df98b 100644 --- a/rtdata/languages/Chinese (Simplified) +++ b/rtdata/languages/Chinese (Simplified) @@ -492,9 +492,6 @@ PREFERENCES_BEHADDALL;全 '添加' PREFERENCES_BEHAVIOR;行为 PREFERENCES_BEHSETALL;全 '设定' PREFERENCES_BLACKBODY;钨丝灯 -PREFERENCES_CACHECLEARALL;全部清除 -PREFERENCES_CACHECLEARPROFILES;清除配置 -PREFERENCES_CACHECLEARTHUMBS;清除缩略图 PREFERENCES_CACHEMAXENTRIES;最大缓存数量 PREFERENCES_CACHEOPTS;缓存选项 PREFERENCES_CACHETHUMBHEIGHT;最大缩略图高度 diff --git a/rtdata/languages/Chinese (Traditional) b/rtdata/languages/Chinese (Traditional) index d58343b6a..47a604554 100644 --- a/rtdata/languages/Chinese (Traditional) +++ b/rtdata/languages/Chinese (Traditional) @@ -239,9 +239,6 @@ PARTIALPASTE_SHARPENING;Sharpening PARTIALPASTE_VIGNETTING;Vignetting correction PARTIALPASTE_WHITEBALANCE;White balance PREFERENCES_APPLNEXTSTARTUP;下次啟動生效 -PREFERENCES_CACHECLEARALL;Clear All -PREFERENCES_CACHECLEARPROFILES;Clear Profiles -PREFERENCES_CACHECLEARTHUMBS;Clear Thumbnails PREFERENCES_CACHEMAXENTRIES;Maximal Number of Cache Entries PREFERENCES_CACHEOPTS;Cache Options PREFERENCES_CACHETHUMBHEIGHT;Maximal Thumbnail Height diff --git a/rtdata/languages/Czech b/rtdata/languages/Czech index dbc606070..4be6bdc58 100644 --- a/rtdata/languages/Czech +++ b/rtdata/languages/Czech @@ -989,9 +989,6 @@ PREFERENCES_BEHAVIOR;Režim PREFERENCES_BEHSETALL;Vše do 'Nastavit' PREFERENCES_BEHSETALLHINT;Nastaví všechny parametry do módu Nastavit.\nZměna parametrů v panelu dávkového zpracování se aplikuje jako absolutní, budou zobrazeny aktuální hodnoty. PREFERENCES_BLACKBODY;Wolfram -PREFERENCES_CACHECLEARALL;Vymazat vše -PREFERENCES_CACHECLEARPROFILES;Smazat profily zpracování -PREFERENCES_CACHECLEARTHUMBS;Vymazat náhledy PREFERENCES_CACHEMAXENTRIES;Maximální počet záznamů v mezipaměti PREFERENCES_CACHEOPTS;Vlastnosti mezipaměti PREFERENCES_CACHETHUMBHEIGHT;Maximální výška náhledu diff --git a/rtdata/languages/Dansk b/rtdata/languages/Dansk index da5616b31..7658914f7 100644 --- a/rtdata/languages/Dansk +++ b/rtdata/languages/Dansk @@ -230,9 +230,6 @@ PARTIALPASTE_SHARPENING;Skarphed PARTIALPASTE_VIGNETTING;Vignettering PARTIALPASTE_WHITEBALANCE;Hvidbalance PREFERENCES_APPLNEXTSTARTUP;Anvendes ved næste opstart -PREFERENCES_CACHECLEARALL;Ryd alt -PREFERENCES_CACHECLEARPROFILES;Ryd profiler -PREFERENCES_CACHECLEARTHUMBS;Ryd miniaturer PREFERENCES_CACHEMAXENTRIES;Maksimalt antal indskrivninger i cache PREFERENCES_CACHEOPTS;Cache-indstillinger PREFERENCES_CACHETHUMBHEIGHT;Maksimal miniaturehøjde diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index 3cf1b32da..fc3374db6 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -1099,9 +1099,6 @@ PREFERENCES_BEHAVIOR;Verhalten PREFERENCES_BEHSETALL;Alle setzen PREFERENCES_BEHSETALLHINT;Setzt alle Parameter auf Setzen.\nAnpassungen der Parameter in der Hintergrundstapelverarbeitung werden als Absolut zu den gespeicherten Werten interpretiert. PREFERENCES_BLACKBODY;Wolfram -PREFERENCES_CACHECLEARALL;Alles löschen -PREFERENCES_CACHECLEARPROFILES;Profile löschen -PREFERENCES_CACHECLEARTHUMBS;Miniaturbilder löschen PREFERENCES_CACHEMAXENTRIES;Maximale Anzahl der Miniaturbilder im Festplatten-Cache PREFERENCES_CACHEOPTS;Einstellungen des Festplatten-Cache für Miniaturbilder PREFERENCES_CACHETHUMBHEIGHT;Maximale Höhe der Miniaturbilder diff --git a/rtdata/languages/English (UK) b/rtdata/languages/English (UK) index 8fcaafd56..6be9b3308 100644 --- a/rtdata/languages/English (UK) +++ b/rtdata/languages/English (UK) @@ -1102,9 +1102,6 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !PREFERENCES_BEHSETALL;All to 'Set' !PREFERENCES_BEHSETALLHINT;Set all parameters to the Set mode.\nAdjustments of parameters in the batch tool panel will be absolute, the actual values will be displayed. !PREFERENCES_BLACKBODY;Tungsten -!PREFERENCES_CACHECLEARALL;Clear All -!PREFERENCES_CACHECLEARPROFILES;Clear Processing Profiles -!PREFERENCES_CACHECLEARTHUMBS;Clear Thumbnails !PREFERENCES_CACHEMAXENTRIES;Maximum number of cache entries !PREFERENCES_CACHEOPTS;Cache Options !PREFERENCES_CACHETHUMBHEIGHT;Maximum thumbnail height diff --git a/rtdata/languages/English (US) b/rtdata/languages/English (US) index 53a2aec91..f8ec04d1f 100644 --- a/rtdata/languages/English (US) +++ b/rtdata/languages/English (US) @@ -1026,9 +1026,6 @@ !PREFERENCES_BEHSETALL;All to 'Set' !PREFERENCES_BEHSETALLHINT;Set all parameters to the Set mode.\nAdjustments of parameters in the batch tool panel will be absolute, the actual values will be displayed. !PREFERENCES_BLACKBODY;Tungsten -!PREFERENCES_CACHECLEARALL;Clear All -!PREFERENCES_CACHECLEARPROFILES;Clear Processing Profiles -!PREFERENCES_CACHECLEARTHUMBS;Clear Thumbnails !PREFERENCES_CACHEMAXENTRIES;Maximum number of cache entries !PREFERENCES_CACHEOPTS;Cache Options !PREFERENCES_CACHETHUMBHEIGHT;Maximum thumbnail height diff --git a/rtdata/languages/Espanol b/rtdata/languages/Espanol index 4284523ab..7b0645778 100644 --- a/rtdata/languages/Espanol +++ b/rtdata/languages/Espanol @@ -721,9 +721,6 @@ PREFERENCES_BEHAVIOR;Comportamiento PREFERENCES_BEHSETALL;Todo para 'Establecer' PREFERENCES_BEHSETALLHINT;Todos los parámetros para el modo Establecer.\nLos ajustes de parámetros en el panel de la herramienta de lotes serán serán absolutos, se mostrarán los valores vigentes PREFERENCES_BLACKBODY;Tungsteno -PREFERENCES_CACHECLEARALL;Borrar todo -PREFERENCES_CACHECLEARPROFILES;Borrar perfiles -PREFERENCES_CACHECLEARTHUMBS;Borrar miniaturas PREFERENCES_CACHEMAXENTRIES;Cantidad máxima de entradas en la memoria intermedia PREFERENCES_CACHEOPTS;Opciones de memoria intermedia PREFERENCES_CACHETHUMBHEIGHT;Altura máxima de las miniaturas diff --git a/rtdata/languages/Euskara b/rtdata/languages/Euskara index a604d6aef..06bfc9ae5 100644 --- a/rtdata/languages/Euskara +++ b/rtdata/languages/Euskara @@ -230,9 +230,6 @@ PARTIALPASTE_SHARPENING;Sharpening PARTIALPASTE_VIGNETTING;Vignetting correction PARTIALPASTE_WHITEBALANCE;White balance PREFERENCES_APPLNEXTSTARTUP;hurrengo abioan aplikatua -PREFERENCES_CACHECLEARALL;Clear All -PREFERENCES_CACHECLEARPROFILES;Clear Profiles -PREFERENCES_CACHECLEARTHUMBS;Clear Thumbnails PREFERENCES_CACHEMAXENTRIES;Maximal Number of Cache Entries PREFERENCES_CACHEOPTS;Cache Options PREFERENCES_CACHETHUMBHEIGHT;Maximal Thumbnail Height diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais index 2bf82f6e1..19a8ce8d4 100644 --- a/rtdata/languages/Francais +++ b/rtdata/languages/Francais @@ -988,9 +988,6 @@ PREFERENCES_BEHAVIOR;Comportement PREFERENCES_BEHSETALL;Tout à 'Remplace' PREFERENCES_BEHSETALLHINT;Règle tous les paramètres sur le mode Remplace.\nLa modification des paramètres dans le panneau d'édition en par lot sera absolue, les valeurs réelles seront affichées PREFERENCES_BLACKBODY;Tungstène -PREFERENCES_CACHECLEARALL;Tout nettoyer -PREFERENCES_CACHECLEARPROFILES;Nettoyer les profils -PREFERENCES_CACHECLEARTHUMBS;Nettoyer les vignettes PREFERENCES_CACHEMAXENTRIES;Nombre maximal d'éléments dans le Cache PREFERENCES_CACHEOPTS;Options du Cache PREFERENCES_CACHETHUMBHEIGHT;Hauteur maximale des vignettes diff --git a/rtdata/languages/Greek b/rtdata/languages/Greek index 0c416e421..cf9aef8ae 100644 --- a/rtdata/languages/Greek +++ b/rtdata/languages/Greek @@ -230,9 +230,6 @@ PARTIALPASTE_SHARPENING;Sharpening PARTIALPASTE_VIGNETTING;Vignetting correction PARTIALPASTE_WHITEBALANCE;White balance PREFERENCES_APPLNEXTSTARTUP;εφαρμόζεται στην επόμενη εκκίνηση -PREFERENCES_CACHECLEARALL;Clear All -PREFERENCES_CACHECLEARPROFILES;Clear Profiles -PREFERENCES_CACHECLEARTHUMBS;Clear Thumbnails PREFERENCES_CACHEMAXENTRIES;Maximal Number of Cache Entries PREFERENCES_CACHEOPTS;Cache Options PREFERENCES_CACHETHUMBHEIGHT;Maximal Thumbnail Height diff --git a/rtdata/languages/Hebrew b/rtdata/languages/Hebrew index 358045544..e8814d80f 100644 --- a/rtdata/languages/Hebrew +++ b/rtdata/languages/Hebrew @@ -230,9 +230,6 @@ PARTIALPASTE_SHARPENING;Sharpening PARTIALPASTE_VIGNETTING;Vignetting correction PARTIALPASTE_WHITEBALANCE;White balance PREFERENCES_APPLNEXTSTARTUP;ייושם באתחול הבא -PREFERENCES_CACHECLEARALL;Clear All -PREFERENCES_CACHECLEARPROFILES;Clear Profiles -PREFERENCES_CACHECLEARTHUMBS;Clear Thumbnails PREFERENCES_CACHEMAXENTRIES;Maximal Number of Cache Entries PREFERENCES_CACHEOPTS;Cache Options PREFERENCES_CACHETHUMBHEIGHT;Maximal Thumbnail Height diff --git a/rtdata/languages/Italiano b/rtdata/languages/Italiano index e8a49771a..1c24cc52e 100644 --- a/rtdata/languages/Italiano +++ b/rtdata/languages/Italiano @@ -627,9 +627,6 @@ PREFERENCES_BEHAVIOR;Comportamento PREFERENCES_BEHSETALL;Tutti a 'Imposta' PREFERENCES_BEHSETALLHINT;Imposta tutti i parametri nella modalità Imposta.\nLe regolazioni dei parametri nel pannello strumenti batch saranno assoluti, verranno mostrati i valori reali. PREFERENCES_BLACKBODY;Tungsteno -PREFERENCES_CACHECLEARALL;Rimuovi tutto -PREFERENCES_CACHECLEARPROFILES;Rimuovi i profili di sviluppo -PREFERENCES_CACHECLEARTHUMBS;Rimuovi le miniature PREFERENCES_CACHEMAXENTRIES;Numero massimo di voci in memoria PREFERENCES_CACHEOPTS;Opzioni della memoria PREFERENCES_CACHETHUMBHEIGHT;Massima altezza delle miniature diff --git a/rtdata/languages/Japanese b/rtdata/languages/Japanese index 0bc015fe9..bc5fa66e0 100644 --- a/rtdata/languages/Japanese +++ b/rtdata/languages/Japanese @@ -1056,9 +1056,6 @@ PREFERENCES_BEHAVIOR;ビヘイビア PREFERENCES_BEHSETALL;すべて '設定' PREFERENCES_BEHSETALLHINT;すべてのパラメータを 設定モードにします\nバッチツールパネルで設定される調整値が、各画像の既定値に取って代わり同一になります PREFERENCES_BLACKBODY;タングステン -PREFERENCES_CACHECLEARALL;すべてクリア -PREFERENCES_CACHECLEARPROFILES;プロファイルのクリア -PREFERENCES_CACHECLEARTHUMBS;サムネイルのクリア PREFERENCES_CACHEMAXENTRIES;キャッシュエントリーの最大数 PREFERENCES_CACHEOPTS;cache オプション PREFERENCES_CACHETHUMBHEIGHT;サムネイル縦の最大値 diff --git a/rtdata/languages/Latvian b/rtdata/languages/Latvian index 23887cfb1..2a3ca3759 100644 --- a/rtdata/languages/Latvian +++ b/rtdata/languages/Latvian @@ -230,9 +230,6 @@ PARTIALPASTE_SHARPENING;Asināšana PARTIALPASTE_VIGNETTING;Vinjetes labošana PARTIALPASTE_WHITEBALANCE;Baltā līdzsvarss PREFERENCES_APPLNEXTSTARTUP;lietos nākamā reizē -PREFERENCES_CACHECLEARALL;Attīrīt visu -PREFERENCES_CACHECLEARPROFILES;Attīrīt Profilus -PREFERENCES_CACHECLEARTHUMBS;Attīrīt sīktēlus PREFERENCES_CACHEMAXENTRIES;Maksimālais keša ierakstu skaits PREFERENCES_CACHEOPTS;Keša opcijas PREFERENCES_CACHETHUMBHEIGHT;Keša maksimālais sīktēla augstums diff --git a/rtdata/languages/Magyar b/rtdata/languages/Magyar index 4e463a8fd..9bd662821 100644 --- a/rtdata/languages/Magyar +++ b/rtdata/languages/Magyar @@ -475,9 +475,6 @@ PREFERENCES_APPLNEXTSTARTUP;újraindítás után érvényes PREFERENCES_AUTOMONPROFILE;Oprendszerben beállított monitor-színprofil automatikus használata PREFERENCES_BATCH_PROCESSING;Kötegelt feldolgozás PREFERENCES_BEHAVIOR;Viselkedés -PREFERENCES_CACHECLEARALL;Teljes gyorsítótár törlése -PREFERENCES_CACHECLEARPROFILES;Feldolg. param. törlése -PREFERENCES_CACHECLEARTHUMBS;Előnézeti képek törlése PREFERENCES_CACHEMAXENTRIES;Gyorsítótárban tárolt képek max. száma PREFERENCES_CACHEOPTS;Gyorsítótár beállítások PREFERENCES_CACHETHUMBHEIGHT;Előnézeti kép maximális magassága diff --git a/rtdata/languages/Nederlands b/rtdata/languages/Nederlands index fd0036952..15f7b959b 100644 --- a/rtdata/languages/Nederlands +++ b/rtdata/languages/Nederlands @@ -912,9 +912,6 @@ PREFERENCES_BEHAVIOR;Gedrag PREFERENCES_BEHSETALL;Alles op 'Activeer' PREFERENCES_BEHSETALLHINT;Zet alle parameters in de Activeer mode.\nWijzigingen van parameters in de batch tool zijn absoluut. De actuele waarden worden gebruikt. PREFERENCES_BLACKBODY;Tungsten(wolfraam) -PREFERENCES_CACHECLEARALL;Wis alles -PREFERENCES_CACHECLEARPROFILES;Wis profielen -PREFERENCES_CACHECLEARTHUMBS;Wis miniaturen PREFERENCES_CACHEMAXENTRIES;Maximaal aantal elementen in cache PREFERENCES_CACHEOPTS;Cache-opties PREFERENCES_CACHETHUMBHEIGHT;Maximale hoogte miniaturen diff --git a/rtdata/languages/Norsk BM b/rtdata/languages/Norsk BM index 4a4995aef..958ed12ad 100644 --- a/rtdata/languages/Norsk BM +++ b/rtdata/languages/Norsk BM @@ -230,9 +230,6 @@ PARTIALPASTE_SHARPENING;Oppskarping PARTIALPASTE_VIGNETTING;Vignetteringskorreksjon PARTIALPASTE_WHITEBALANCE;Hvitbalanse PREFERENCES_APPLNEXTSTARTUP;Endres ved neste oppstart -PREFERENCES_CACHECLEARALL;Slett alle -PREFERENCES_CACHECLEARPROFILES;Slett profiler -PREFERENCES_CACHECLEARTHUMBS;Slett thumbnails PREFERENCES_CACHEMAXENTRIES;Maksimalt antall cache oppføringer PREFERENCES_CACHEOPTS;Cache innstillinger PREFERENCES_CACHETHUMBHEIGHT;Maksimal Thumbnail Høyde diff --git a/rtdata/languages/Polish b/rtdata/languages/Polish index b271178e0..3e853bf20 100644 --- a/rtdata/languages/Polish +++ b/rtdata/languages/Polish @@ -676,9 +676,6 @@ PREFERENCES_BEHAVIOR;Zachowanie PREFERENCES_BEHSETALL;'Ustaw' wszystkie PREFERENCES_BEHSETALLHINT;Ustaw wszystkie narzędzia w tryb Ustaw.\nZmiany parametrów w panelu edycji zbiorczej zostaną traktowane jako absolutne, nie biorąc pod uwagę poprzednich wartości. PREFERENCES_BLACKBODY;Wolfram -PREFERENCES_CACHECLEARALL;Wyczyść wszystko -PREFERENCES_CACHECLEARPROFILES;Wyczyść profile -PREFERENCES_CACHECLEARTHUMBS;Wyczyść miniaturki PREFERENCES_CACHEMAXENTRIES;Maksymalna liczba wpisów w pamięci podręcznej PREFERENCES_CACHEOPTS;Opcje pamięci podręcznej PREFERENCES_CACHETHUMBHEIGHT;Maksymalna wysokość miniatury diff --git a/rtdata/languages/Polish (Latin Characters) b/rtdata/languages/Polish (Latin Characters) index 310a1ed13..f847eb6b9 100644 --- a/rtdata/languages/Polish (Latin Characters) +++ b/rtdata/languages/Polish (Latin Characters) @@ -676,9 +676,6 @@ PREFERENCES_BEHAVIOR;Zachowanie PREFERENCES_BEHSETALL;'Ustaw' wszystkie PREFERENCES_BEHSETALLHINT;Ustaw wszystkie narzedzia w tryb Ustaw.\nZmiany parametrow w panelu edycji zbiorczej zostana traktowane jako absolutne, nie biorac pod uwage poprzednich wartosci. PREFERENCES_BLACKBODY;Wolfram -PREFERENCES_CACHECLEARALL;Wyczysc wszystko -PREFERENCES_CACHECLEARPROFILES;Wyczysc profile -PREFERENCES_CACHECLEARTHUMBS;Wyczysc miniaturki PREFERENCES_CACHEMAXENTRIES;Maksymalna liczba wpisow w pamieci podrecznej PREFERENCES_CACHEOPTS;Opcje pamieci podrecznej PREFERENCES_CACHETHUMBHEIGHT;Maksymalna wysokosc miniatury diff --git a/rtdata/languages/Portugues (Brasil) b/rtdata/languages/Portugues (Brasil) index c737ddcfd..d8e5ccc1f 100644 --- a/rtdata/languages/Portugues (Brasil) +++ b/rtdata/languages/Portugues (Brasil) @@ -1020,9 +1020,6 @@ PREFERENCES_BEHAVIOR;Comportamento PREFERENCES_BEHSETALL;Tudo para 'Configurar' PREFERENCES_BEHSETALLHINT;Definir todos os parâmetros para o Configurar modo.\nAjustes de parâmetros no painel de ferramentas de lote serão absoluto, os valores reais serão exibidos. PREFERENCES_BLACKBODY;Tungstênio -PREFERENCES_CACHECLEARALL;Limpar Tudo -PREFERENCES_CACHECLEARPROFILES;Limpar Perfis de Processamento -PREFERENCES_CACHECLEARTHUMBS;Limpar Miniaturas PREFERENCES_CACHEMAXENTRIES;Número máximo de entradas de cache PREFERENCES_CACHEOPTS;Opções de Cache PREFERENCES_CACHETHUMBHEIGHT;Altura máxima da miniatura diff --git a/rtdata/languages/Russian b/rtdata/languages/Russian index 3c89c4a74..176d86511 100644 --- a/rtdata/languages/Russian +++ b/rtdata/languages/Russian @@ -672,9 +672,6 @@ PREFERENCES_BEHAVIOR;Поведение PREFERENCES_BEHSETALL;Всё в "Установить" PREFERENCES_BEHSETALLHINT;Выставить все параметры в режим Установить.\nНастройки параметров в панели пакетной обработки будут абсолютными, будут показаны используемые значения PREFERENCES_BLACKBODY;Лампа накаливания -PREFERENCES_CACHECLEARALL;Удалить все -PREFERENCES_CACHECLEARPROFILES;Удалить параметры обработки -PREFERENCES_CACHECLEARTHUMBS;Удалить эскизы PREFERENCES_CACHEMAXENTRIES;Максимальное число элементов в кэше PREFERENCES_CACHEOPTS;Параметры кэширования PREFERENCES_CACHETHUMBHEIGHT;Максимальная высота эскиза diff --git a/rtdata/languages/Serbian (Cyrilic Characters) b/rtdata/languages/Serbian (Cyrilic Characters) index 34c62bf06..4b570abb7 100644 --- a/rtdata/languages/Serbian (Cyrilic Characters) +++ b/rtdata/languages/Serbian (Cyrilic Characters) @@ -597,9 +597,6 @@ PREFERENCES_BEHAVIOR;Понашање PREFERENCES_BEHSETALL;Све у „Постави“ PREFERENCES_BEHSETALLHINT;Поставља све параметре у режим Постави.\nЊихово подешавање помоћу алата из панела за заказано ће бити апсолутне вредности као што су и изабране. PREFERENCES_BLACKBODY;Обична сијалица -PREFERENCES_CACHECLEARALL;Обриши све -PREFERENCES_CACHECLEARPROFILES;Обриши профиле -PREFERENCES_CACHECLEARTHUMBS;Обриши приказе PREFERENCES_CACHEMAXENTRIES;Највећи број мест у остави PREFERENCES_CACHEOPTS;Подешавање оставе PREFERENCES_CACHETHUMBHEIGHT;Највећа висина приказа diff --git a/rtdata/languages/Serbian (Latin Characters) b/rtdata/languages/Serbian (Latin Characters) index 5dd1fa04d..a5d5094c6 100644 --- a/rtdata/languages/Serbian (Latin Characters) +++ b/rtdata/languages/Serbian (Latin Characters) @@ -597,9 +597,6 @@ PREFERENCES_BEHAVIOR;Ponašanje PREFERENCES_BEHSETALL;Sve u „Postavi“ PREFERENCES_BEHSETALLHINT;Postavlja sve parametre u režim Postavi.\nNjihovo podešavanje pomoću alata iz panela za zakazano će biti apsolutne vrednosti kao što su i izabrane. PREFERENCES_BLACKBODY;Obična sijalica -PREFERENCES_CACHECLEARALL;Obriši sve -PREFERENCES_CACHECLEARPROFILES;Obriši profile -PREFERENCES_CACHECLEARTHUMBS;Obriši prikaze PREFERENCES_CACHEMAXENTRIES;Najveći broj mest u ostavi PREFERENCES_CACHEOPTS;Podešavanje ostave PREFERENCES_CACHETHUMBHEIGHT;Najveća visina prikaza diff --git a/rtdata/languages/Slovak b/rtdata/languages/Slovak index 15c4050ad..7e7fcdf86 100644 --- a/rtdata/languages/Slovak +++ b/rtdata/languages/Slovak @@ -274,9 +274,6 @@ PREFERENCES_ADD;Pridať PREFERENCES_APPLNEXTSTARTUP;Aplikovaný pri ďalšom spustení PREFERENCES_BATCH_PROCESSING;dávkové spracovanie PREFERENCES_BEHAVIOR;Správanie sa -PREFERENCES_CACHECLEARALL;Vyčistiť všetko -PREFERENCES_CACHECLEARPROFILES;Vyčistiť profily -PREFERENCES_CACHECLEARTHUMBS;Vyčistiť zmenšeniny PREFERENCES_CACHEMAXENTRIES;Maximálny počet vstupov v cache PREFERENCES_CACHEOPTS;Možnosti cache PREFERENCES_CACHETHUMBHEIGHT;Maximálna výška zmenšenín diff --git a/rtdata/languages/Suomi b/rtdata/languages/Suomi index b0d075188..6e32cea61 100644 --- a/rtdata/languages/Suomi +++ b/rtdata/languages/Suomi @@ -230,9 +230,6 @@ PARTIALPASTE_SHARPENING;Terävöinti PARTIALPASTE_VIGNETTING;Vinjetoinnin korjaus PARTIALPASTE_WHITEBALANCE;Valkotasapaino PREFERENCES_APPLNEXTSTARTUP;käytössä käynnistyksen jälkeen -PREFERENCES_CACHECLEARALL;Tyhjennä kaikki -PREFERENCES_CACHECLEARPROFILES;Tyhjennä profiilit -PREFERENCES_CACHECLEARTHUMBS;Tyhjennä esikatselukuvat PREFERENCES_CACHEMAXENTRIES;Välimuistin koko PREFERENCES_CACHEOPTS;Välimuistin asetukset PREFERENCES_CACHETHUMBHEIGHT;Suurin esikatselukuvan korkeus diff --git a/rtdata/languages/Swedish b/rtdata/languages/Swedish index 82b11df1e..510d6696d 100644 --- a/rtdata/languages/Swedish +++ b/rtdata/languages/Swedish @@ -817,9 +817,6 @@ PREFERENCES_BEHAVIOR;Uppträdande PREFERENCES_BEHSETALL;Sätt allt till 'Ange' PREFERENCES_BEHSETALLHINT;Sätt alla parametrar till Ange-läge.\nFörändringar i parametrar i batch-verktyget kommer att vara absoluta och de faktiska värdena kommer att visas. PREFERENCES_BLACKBODY;Glödlampa -PREFERENCES_CACHECLEARALL;Återställ alla -PREFERENCES_CACHECLEARPROFILES;Återställ profiler -PREFERENCES_CACHECLEARTHUMBS;Ta bort cachade miniatyrbilder PREFERENCES_CACHEMAXENTRIES;Maximalt antal cachefiler PREFERENCES_CACHEOPTS;Cacheinställningar PREFERENCES_CACHETHUMBHEIGHT;Maximal höjd på miniatyrbilderna diff --git a/rtdata/languages/Turkish b/rtdata/languages/Turkish index 051c99217..1ab598c2c 100644 --- a/rtdata/languages/Turkish +++ b/rtdata/languages/Turkish @@ -230,9 +230,6 @@ PARTIALPASTE_SHARPENING;Sharpening PARTIALPASTE_VIGNETTING;Vignetting correction PARTIALPASTE_WHITEBALANCE;White balance PREFERENCES_APPLNEXTSTARTUP;Bir sonraki başlamada uygulacacak. -PREFERENCES_CACHECLEARALL;Clear All -PREFERENCES_CACHECLEARPROFILES;Clear Profiles -PREFERENCES_CACHECLEARTHUMBS;Clear Thumbnails PREFERENCES_CACHEMAXENTRIES;Maximal Number of Cache Entries PREFERENCES_CACHEOPTS;Cache Options PREFERENCES_CACHETHUMBHEIGHT;Maximal Thumbnail Height diff --git a/rtdata/languages/default b/rtdata/languages/default index 1a1d4a18b..85a21dfe7 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1038,9 +1038,11 @@ PREFERENCES_BEHAVIOR;Behavior PREFERENCES_BEHSETALL;All to 'Set' PREFERENCES_BEHSETALLHINT;Set all parameters to the Set mode.\nAdjustments of parameters in the batch tool panel will be absolute, the actual values will be displayed. PREFERENCES_BLACKBODY;Tungsten -PREFERENCES_CACHECLEARALL;Clear All -PREFERENCES_CACHECLEARPROFILES;Clear Processing Profiles -PREFERENCES_CACHECLEARTHUMBS;Clear Thumbnails +PREFERENCES_CACHECLEAR;Clear +PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. PREFERENCES_CACHEMAXENTRIES;Maximum number of cache entries PREFERENCES_CACHEOPTS;Cache Options PREFERENCES_CACHETHUMBHEIGHT;Maximum thumbnail height diff --git a/rtgui/preferences.cc b/rtgui/preferences.cc index b15e10e49..9d58244f4 100644 --- a/rtgui/preferences.cc +++ b/rtgui/preferences.cc @@ -1334,40 +1334,66 @@ Gtk::Widget* Preferences::getFileBrowserPanel () fre->add (*vbre); - Gtk::Frame* frc = Gtk::manage ( new Gtk::Frame (M ("PREFERENCES_CACHEOPTS")) ); - Gtk::VBox* vbc = Gtk::manage ( new Gtk::VBox () ); + // Cache + + Gtk::Frame* frc = Gtk::manage (new Gtk::Frame(M("PREFERENCES_CACHEOPTS"))); + Gtk::VBox* vbc = Gtk::manage (new Gtk::VBox()); frc->add (*vbc); - Gtk::HBox* hb3 = Gtk::manage ( new Gtk::HBox () ); - Gtk::Label* chlab = Gtk::manage ( new Gtk::Label (M ("PREFERENCES_CACHETHUMBHEIGHT") + ":") ); - maxThumbSize = Gtk::manage ( new Gtk::SpinButton () ); - hb3->pack_start (*chlab, Gtk::PACK_SHRINK, 4); - hb3->pack_start (*maxThumbSize, Gtk::PACK_SHRINK, 4); + Gtk::Grid* cacheGrid = Gtk::manage(new Gtk::Grid()); + cacheGrid->get_style_context()->add_class("grid-spacing"); + setExpandAlignProperties(cacheGrid, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - maxThumbSize->set_digits (0); - maxThumbSize->set_increments (1, 10); - maxThumbSize->set_range (40, 800); - vbc->pack_start (*hb3, Gtk::PACK_SHRINK, 4); + Gtk::Label* maxThumbHeightLbl = Gtk::manage (new Gtk::Label(M("PREFERENCES_CACHETHUMBHEIGHT") + ":")); + setExpandAlignProperties(maxThumbHeightLbl, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + maxThumbHeightSB = Gtk::manage (new Gtk::SpinButton()); + maxThumbHeightSB->set_digits (0); + maxThumbHeightSB->set_increments (1, 10); + maxThumbHeightSB->set_range (40, 800); - Gtk::HBox* hb4 = Gtk::manage ( new Gtk::HBox () ); - Gtk::Label* celab = Gtk::manage ( new Gtk::Label (M ("PREFERENCES_CACHEMAXENTRIES") + ":") ); - maxCacheEntries = Gtk::manage ( new Gtk::SpinButton () ); - hb4->pack_start (*celab, Gtk::PACK_SHRINK, 4); - hb4->pack_start (*maxCacheEntries, Gtk::PACK_SHRINK, 4); + Gtk::Label* maxCacheEntriesLbl = Gtk::manage (new Gtk::Label(M("PREFERENCES_CACHEMAXENTRIES") + ":")); + setExpandAlignProperties(maxCacheEntriesLbl, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + maxCacheEntriesSB = Gtk::manage (new Gtk::SpinButton()); + maxCacheEntriesSB->set_digits (0); + maxCacheEntriesSB->set_increments (1, 10); + maxCacheEntriesSB->set_range (10, 100000); - maxCacheEntries->set_digits (0); - maxCacheEntries->set_increments (1, 10); - maxCacheEntries->set_range (10, 100000); - vbc->pack_start (*hb4, Gtk::PACK_SHRINK, 4); + // Separation is needed so that a button is not accidentally clicked when one wanted + // to click a spinbox. Ideally, the separation wouldn't require attaching a widget, but how? + Gtk::Label *separator = Gtk::manage (new Gtk::Label()); - Gtk::HBox* hb5 = Gtk::manage ( new Gtk::HBox () ); - clearThumbnails = Gtk::manage ( new Gtk::Button (M ("PREFERENCES_CACHECLEARTHUMBS")) ); - clearProfiles = Gtk::manage ( new Gtk::Button (M ("PREFERENCES_CACHECLEARPROFILES")) ); - clearAll = Gtk::manage ( new Gtk::Button (M ("PREFERENCES_CACHECLEARALL")) ); - hb5->pack_start (*clearThumbnails, Gtk::PACK_SHRINK, 4); - hb5->pack_start (*clearProfiles, Gtk::PACK_SHRINK, 4); - hb5->pack_start (*clearAll, Gtk::PACK_SHRINK, 4); - vbc->pack_start (*hb5, Gtk::PACK_SHRINK, 4); + Gtk::Label* clearThumbsLbl = Gtk::manage (new Gtk::Label(M("PREFERENCES_CACHECLEAR_ALLBUTPROFILES"))); + setExpandAlignProperties(clearThumbsLbl, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + Gtk::Button* clearThumbsBtn = Gtk::manage (new Gtk::Button(M("PREFERENCES_CACHECLEAR"))); + + Gtk::Label* clearProfilesLbl = Gtk::manage (new Gtk::Label(M("PREFERENCES_CACHECLEAR_ONLYPROFILES"))); + setExpandAlignProperties(clearProfilesLbl, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + Gtk::Button* clearProfilesBtn = Gtk::manage (new Gtk::Button(M("PREFERENCES_CACHECLEAR"))); + + Gtk::Label* clearAllLbl = Gtk::manage (new Gtk::Label(M("PREFERENCES_CACHECLEAR_ALL"))); + setExpandAlignProperties(clearAllLbl, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + Gtk::Button* clearAllBtn = Gtk::manage (new Gtk::Button(M("PREFERENCES_CACHECLEAR"))); + + cacheGrid->attach (*maxThumbHeightLbl, 0, 0, 1, 1); + cacheGrid->attach (*maxThumbHeightSB, 1, 0, 1, 1); + cacheGrid->attach (*maxCacheEntriesLbl, 0, 1, 1, 1); + cacheGrid->attach (*maxCacheEntriesSB, 1, 1, 1, 1); + cacheGrid->attach (*separator, 0, 2, 2, 1); + cacheGrid->attach (*clearThumbsLbl, 0, 3, 1, 1); + cacheGrid->attach (*clearThumbsBtn, 1, 3, 1, 1); + if (moptions.saveParamsCache) { + cacheGrid->attach (*clearProfilesLbl, 0, 4, 1, 1); + cacheGrid->attach (*clearProfilesBtn, 1, 4, 1, 1); + cacheGrid->attach (*clearAllLbl, 0, 5, 1, 1); + cacheGrid->attach (*clearAllBtn, 1, 5, 1, 1); + } + + vbc->pack_start (*cacheGrid, Gtk::PACK_SHRINK, 4); + + Gtk::Label* clearSafetyLbl = Gtk::manage (new Gtk::Label(M("PREFERENCES_CACHECLEAR_SAFETY"))); + setExpandAlignProperties(clearSafetyLbl, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + clearSafetyLbl->set_line_wrap(true); + vbc->pack_start(*clearSafetyLbl, Gtk::PACK_SHRINK, 4); Gtk::HBox* hb6 = Gtk::manage ( new Gtk::HBox () ); Gtk::VBox* vb6 = Gtk::manage ( new Gtk::VBox () ); @@ -1386,9 +1412,11 @@ Gtk::Widget* Preferences::getFileBrowserPanel () moveExtUp->signal_clicked().connect ( sigc::mem_fun (*this, &Preferences::moveExtUpPressed) ); moveExtDown->signal_clicked().connect ( sigc::mem_fun (*this, &Preferences::moveExtDownPressed) ); extension->signal_activate().connect ( sigc::mem_fun (*this, &Preferences::addExtPressed) ); - clearThumbnails->signal_clicked().connect ( sigc::mem_fun (*this, &Preferences::clearThumbImagesPressed) ); - clearProfiles->signal_clicked().connect ( sigc::mem_fun (*this, &Preferences::clearProfilesPressed) ); - clearAll->signal_clicked().connect ( sigc::mem_fun (*this, &Preferences::clearAllPressed) ); + clearThumbsBtn->signal_clicked().connect ( sigc::mem_fun (*this, &Preferences::clearThumbImagesPressed) ); + if (moptions.saveParamsCache) { + clearProfilesBtn->signal_clicked().connect(sigc::mem_fun(*this, &Preferences::clearProfilesPressed)); + clearAllBtn->signal_clicked().connect(sigc::mem_fun(*this, &Preferences::clearAllPressed)); + } swFileBrowser->add(*vbFileBrowser); return swFileBrowser; @@ -1701,8 +1729,8 @@ void Preferences::storePreferences () } moptions.maxRecentFolders = (int)maxRecentFolders->get_value(); - moptions.maxThumbnailHeight = (int)maxThumbSize->get_value (); - moptions.maxCacheEntries = (int)maxCacheEntries->get_value (); + moptions.maxThumbnailHeight = (int)maxThumbHeightSB->get_value (); + moptions.maxCacheEntries = (int)maxCacheEntriesSB->get_value (); moptions.overlayedFileNames = overlayedFileNames->get_active (); moptions.filmStripOverlayedFileNames = filmStripOverlayedFileNames->get_active(); moptions.sameThumbSize = sameThumbSize->get_active(); @@ -1917,9 +1945,9 @@ void Preferences::fillPreferences () row[extensionColumns.ext] = moptions.parseExtensions[i]; } - maxThumbSize->set_value (moptions.maxThumbnailHeight); maxRecentFolders->set_value (moptions.maxRecentFolders); - maxCacheEntries->set_value (moptions.maxCacheEntries); + maxThumbHeightSB->set_value (moptions.maxThumbnailHeight); + maxCacheEntriesSB->set_value (moptions.maxCacheEntries); overlayedFileNames->set_active (moptions.overlayedFileNames); filmStripOverlayedFileNames->set_active (moptions.filmStripOverlayedFileNames); sameThumbSize->set_active (moptions.sameThumbSize); diff --git a/rtgui/preferences.h b/rtgui/preferences.h index 949f50376..6019604e5 100644 --- a/rtgui/preferences.h +++ b/rtgui/preferences.h @@ -146,12 +146,9 @@ class Preferences : public Gtk::Dialog, public ProfileStoreListener Gtk::ColorButton* butCropCol; Gtk::ColorButton* butNavGuideCol; - Gtk::SpinButton* maxThumbSize; - Gtk::SpinButton* maxCacheEntries; Gtk::SpinButton* maxRecentFolders; - Gtk::Button* clearThumbnails; - Gtk::Button* clearProfiles; - Gtk::Button* clearAll; + Gtk::SpinButton* maxThumbHeightSB; + Gtk::SpinButton* maxCacheEntriesSB; Gtk::Entry* extension; Gtk::TreeView* extensions; Gtk::Button* addExt; From 41b802bdd34c7d12137fce5c54ab43997b71531e Mon Sep 17 00:00:00 2001 From: heckflosse Date: Thu, 1 Nov 2018 18:51:17 +0100 Subject: [PATCH 058/122] Colortoning Lab regions: use xlogf and xexpf from sleef.c, #4914 --- rtengine/iplabregions.cc | 13 ++++++++----- rtengine/sleef.c | 11 +++++++++++ 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/rtengine/iplabregions.cc b/rtengine/iplabregions.cc index 2a4d431e6..49a426afa 100644 --- a/rtengine/iplabregions.cc +++ b/rtengine/iplabregions.cc @@ -24,6 +24,9 @@ #include "improcfun.h" #include "guidedfilter.h" +#define BENCHMARK +#include "StopWatch.h" +#include "sleef.c" namespace rtengine { @@ -32,7 +35,7 @@ void ImProcFunctions::labColorCorrectionRegions(LabImage *lab) if (!params->colorToning.enabled || params->colorToning.method != "LabRegions") { return; } - +BENCHFUN int n = params->colorToning.labregions.size(); int show_mask_idx = params->colorToning.labregionsShowMask; if (show_mask_idx >= n) { @@ -64,7 +67,7 @@ void ImProcFunctions::labColorCorrectionRegions(LabImage *lab) abmask[i](lab->W, lab->H); Lmask[i](lab->W, lab->H); } - + #ifdef _OPENMP #pragma omp parallel for if (multiThread) #endif @@ -77,13 +80,13 @@ void ImProcFunctions::labColorCorrectionRegions(LabImage *lab) Color::Lab2Lch(a, b, c, h); // magic constant c_factor: normally chromaticity is in [0; 42000] (see color.h), but here we use the constant to match how the chromaticity pipette works (see improcfun.cc lines 4705-4706 and color.cc line 1930 constexpr float c_factor = 327.68f / 48000.f; - float c1 = lin2log(c * c_factor, 10.f); + float c1 = xlin2log(c * c_factor, 10.f); float h1 = Color::huelab_to_huehsv2(h); h1 = h1 + 1.f/6.f; // offset the hue because we start from purple instead of red if (h1 > 1.f) { h1 -= 1.f; } - h1 = lin2log(h1, 3.f); + h1 = xlin2log(h1, 3.f); float l1 = l / 32768.f; for (int i = begin_idx; i < end_idx; ++i) { @@ -132,7 +135,7 @@ void ImProcFunctions::labColorCorrectionRegions(LabImage *lab) const auto abcoord = [](float x) -> float { - return 12000.f * SGN(x) * log2lin(std::abs(x), 4.f); + return 12000.f * SGN(x) * xlog2lin(std::abs(x), 4.f); }; #ifdef _OPENMP diff --git a/rtengine/sleef.c b/rtengine/sleef.c index 901d04f7d..cc92be108 100644 --- a/rtengine/sleef.c +++ b/rtengine/sleef.c @@ -23,6 +23,7 @@ #define L2U .69314718055966295651160180568695068359375 #define L2L .28235290563031577122588448175013436025525412068e-12 #define R_LN2 1.442695040888963407359924681001892137426645954152985934135449406931 +#define pow_F(a,b) (xexpf(b*xlogf(a))) __inline int64_t doubleToRawLongBits(double d) { union { @@ -1263,6 +1264,16 @@ __inline float xdivf( float d, int n){ return uflint.floatval; } +__inline float xlin2log(float x, float base) +{ + constexpr float one(1); + return xlogf(x * (base - one) + one) / xlogf(base); +} +__inline float xlog2lin(float x, float base) +{ + constexpr float one(1); + return (pow_F(base, x) - one) / (base - one); +} #endif From dd635de72cced54dfebc8612e5beadc193413cb0 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Thu, 1 Nov 2018 20:09:30 +0100 Subject: [PATCH 059/122] Colortoning Lab regions: move some calculations outside last loop, #4914 --- rtengine/iplabregions.cc | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/rtengine/iplabregions.cc b/rtengine/iplabregions.cc index 49a426afa..dfa0872b2 100644 --- a/rtengine/iplabregions.cc +++ b/rtengine/iplabregions.cc @@ -138,6 +138,18 @@ BENCHFUN return 12000.f * SGN(x) * xlog2lin(std::abs(x), 4.f); }; + float abca[n]; + float abcb[n]; + float rs[n]; + float rl[n]; + for (int i = 0; i < n; ++i) { + auto &r = params->colorToning.labregions[i]; + abca[i] = abcoord(r.a); + abcb[i] = abcoord(r.b); + rs[i] = 1.f + r.saturation / 100.f; + rl[i] = 1.f + float(r.lightness) / 500.f; + } + #ifdef _OPENMP #pragma omp parallel for if (multiThread) #endif @@ -148,12 +160,11 @@ BENCHFUN float b = lab->b[y][x]; for (int i = 0; i < n; ++i) { - auto &r = params->colorToning.labregions[i]; float blend = abmask[i][y][x]; - float s = 1.f + r.saturation / 100.f; - float a_new = LIM(s * (a + abcoord(r.a)), -42000.f, 42000.f); - float b_new = LIM(s * (b + abcoord(r.b)), -42000.f, 42000.f); - float l_new = LIM(l * (1.f + float(r.lightness) / 500.f), 0.f, 32768.f); + float s = rs[i]; + float a_new = LIM(s * (a + abca[i]), -42000.f, 42000.f); + float b_new = LIM(s * (b + abcb[i]), -42000.f, 42000.f); + float l_new = LIM(l * rl[i], 0.f, 32768.f); l = intp(Lmask[i][y][x], l_new, l); a = intp(blend, a_new, a); b = intp(blend, b_new, b); From 906cf63ecd33569813bcc4c594b096499b76e7e5 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Thu, 1 Nov 2018 22:30:26 +0100 Subject: [PATCH 060/122] Colortoning Lab regions: some vectorized precalculations in first loop, #4914 --- rtengine/color.cc | 18 + rtengine/color.h | 4 +- rtengine/iplabregions.cc | 49 +- rtengine/sleef.c.save-failed | 1288 ++++++++++++++++++++++++++++++++++ 4 files changed, 1354 insertions(+), 5 deletions(-) create mode 100644 rtengine/sleef.c.save-failed diff --git a/rtengine/color.cc b/rtengine/color.cc index 599aceaa1..29844f64d 100644 --- a/rtengine/color.cc +++ b/rtengine/color.cc @@ -1931,6 +1931,24 @@ void Color::Lab2Lch(float a, float b, float &c, float &h) h = xatan2f(b, a); } +#ifdef __SSE2__ +void Color::Lab2Lch(float *a, float *b, float *c, float *h, int w) +{ + int i = 0; + vfloat c327d68v = F2V(327.68f); + for (; i < w - 3; i += 4) { + vfloat av = LVFU(a[i]); + vfloat bv = LVFU(b[i]); + STVFU(c[i], vsqrtf(SQRV(av) + SQRV(bv)) / c327d68v); + STVFU(h[i], xatan2f(bv, av)); + } + for (; i < w; ++i) { + c[i] = sqrtf(SQR(a[i]) + SQR(b[i])) / 327.68f; + h[i] = xatan2f(b[i], a[i]); + } +} +#endif + void Color::Lch2Lab(float c, float h, float &a, float &b) { float2 sincosval = xsincosf(h); diff --git a/rtengine/color.h b/rtengine/color.h index b6459adc4..9f8863343 100644 --- a/rtengine/color.h +++ b/rtengine/color.h @@ -651,7 +651,9 @@ public: * @param h 'h' channel return value, in [-PI ; +PI] (return value) */ static void Lab2Lch(float a, float b, float &c, float &h); - +#ifdef __SSE2__ + static void Lab2Lch(float *a, float *b, float *c, float *h, int w); +#endif /** * @brief Convert 'c' and 'h' channels of the Lch color space to the 'a' and 'b' channels of the L*a*b color space (channel 'L' is identical [0 ; 32768]) diff --git a/rtengine/iplabregions.cc b/rtengine/iplabregions.cc index dfa0872b2..aec6efa6f 100644 --- a/rtengine/iplabregions.cc +++ b/rtengine/iplabregions.cc @@ -28,6 +28,26 @@ #include "StopWatch.h" #include "sleef.c" +namespace { +#ifdef __SSE2__ +void fastlin2log(float *x, float factor, float base, int w) +{ + float baseLog = 1.f / xlogf(base); + vfloat baseLogv = F2V(baseLog); + factor = factor * (base - 1.f); + vfloat factorv = F2V(factor); + vfloat onev = F2V(1.f); + int i = 0; + for (; i < w - 3; i += 4) { + STVFU(x[i], xlogf(LVFU(x[i]) * factorv + onev) * baseLogv); + } + for (; i < w; ++i) { + x[i] = xlogf(x[i] * factor + 1.f) * baseLog; + } +} +#endif +} + namespace rtengine { void ImProcFunctions::labColorCorrectionRegions(LabImage *lab) @@ -69,18 +89,39 @@ BENCHFUN } #ifdef _OPENMP - #pragma omp parallel for if (multiThread) + #pragma omp parallel if (multiThread) +#endif + { +#ifdef __SSE2__ + float cBuffer[lab->W]; + float hBuffer[lab->W]; + // magic constant c_factor: normally chromaticity is in [0; 42000] (see color.h), but here we use the constant to match how the chromaticity pipette works (see improcfun.cc lines 4705-4706 and color.cc line 1930 + constexpr float c_factor = 327.68f / 48000.f; +#endif +#ifdef _OPENMP + #pragma omp for #endif for (int y = 0; y < lab->H; ++y) { +#ifdef __SSE2__ + // vectorized precalculation + Color::Lab2Lch(lab->a[y], lab->b[y], cBuffer, hBuffer, lab->W); + fastlin2log(cBuffer, c_factor, 10.f, lab->W); +#endif for (int x = 0; x < lab->W; ++x) { float l = lab->L[y][x]; +#ifdef __SSE2__ + // use precalculated values + float c1 = cBuffer[x]; + float h = hBuffer[x]; +#else + // magic constant c_factor: normally chromaticity is in [0; 42000] (see color.h), but here we use the constant to match how the chromaticity pipette works (see improcfun.cc lines 4705-4706 and color.cc line 1930 + constexpr float c_factor = 327.68f / 48000.f; float a = lab->a[y][x]; float b = lab->b[y][x]; float c, h; Color::Lab2Lch(a, b, c, h); - // magic constant c_factor: normally chromaticity is in [0; 42000] (see color.h), but here we use the constant to match how the chromaticity pipette works (see improcfun.cc lines 4705-4706 and color.cc line 1930 - constexpr float c_factor = 327.68f / 48000.f; float c1 = xlin2log(c * c_factor, 10.f); +#endif float h1 = Color::huelab_to_huehsv2(h); h1 = h1 + 1.f/6.f; // offset the hue because we start from purple instead of red if (h1 > 1.f) { @@ -98,7 +139,7 @@ BENCHFUN } } } - + } { array2D guide(lab->W, lab->H, lab->L); #ifdef _OPENMP diff --git a/rtengine/sleef.c.save-failed b/rtengine/sleef.c.save-failed new file mode 100644 index 000000000..0cde64be6 --- /dev/null +++ b/rtengine/sleef.c.save-failed @@ -0,0 +1,1288 @@ +//////////////////////////////////////////////////////////////// +// +// this code was taken from http://shibatch.sourceforge.net/ +// Many thanks to the author of original version: Naoki Shibata +// +// This version contains modifications made by Ingo Weyrich +// +//////////////////////////////////////////////////////////////// + +#ifndef _SLEEFC_ +#define _SLEEFC_ + +#include +#include +#include "rt_math.h" +#include "opthelper.h" + +#define PI4_A .7853981554508209228515625 +#define PI4_B .794662735614792836713604629039764404296875e-8 +#define PI4_C .306161699786838294306516483068750264552437361480769e-16 +#define M_4_PI 1.273239544735162542821171882678754627704620361328125 + +#define L2U .69314718055966295651160180568695068359375 +#define L2L .28235290563031577122588448175013436025525412068e-12 +#define R_LN2 1.442695040888963407359924681001892137426645954152985934135449406931 +#define pow_F(a,b) (xexpf(b*xlogf(a))) + +__inline int64_t doubleToRawLongBits(double d) { + union { + double f; + int64_t i; + } tmp; + tmp.f = d; + return tmp.i; +} + +__inline double longBitsToDouble(int64_t i) { + union { + double f; + int64_t i; + } tmp; + tmp.i = i; + return tmp.f; +} + +__inline double xfabs(double x) { + return longBitsToDouble(0x7fffffffffffffffLL & doubleToRawLongBits(x)); +} + +__inline double mulsign(double x, double y) { + return longBitsToDouble(doubleToRawLongBits(x) ^ (doubleToRawLongBits(y) & (1LL << 63))); +} + +__inline double sign(double d) { return mulsign(1, d); } +__inline double mla(double x, double y, double z) { return x * y + z; } +__inline double xrint(double x) { return x < 0 ? (int)(x - 0.5) : (int)(x + 0.5); } + +__inline int xisnan(double x) { return x != x; } +__inline int xisinf(double x) { return x == rtengine::RT_INFINITY || x == -rtengine::RT_INFINITY; } +__inline int xisminf(double x) { return x == -rtengine::RT_INFINITY; } +__inline int xispinf(double x) { return x == rtengine::RT_INFINITY; } + +__inline double ldexpk(double x, int q) { + double u; + int m; + m = q >> 31; + m = (((m + q) >> 9) - m) << 7; + q = q - (m << 2); + u = longBitsToDouble(((int64_t)(m + 0x3ff)) << 52); + double u2 = u*u; + u2 = u2 * u2; + x = x * u2; + u = longBitsToDouble(((int64_t)(q + 0x3ff)) << 52); + return x * u; +} + +__inline double xldexp(double x, int q) { return ldexpk(x, q); } + +__inline int ilogbp1(double d) { + int m = d < 4.9090934652977266E-91; + d = m ? 2.037035976334486E90 * d : d; + int q = (doubleToRawLongBits(d) >> 52) & 0x7ff; + q = m ? q - (300 + 0x03fe) : q - 0x03fe; + return q; +} + +__inline int xilogb(double d) { + int e = ilogbp1(xfabs(d)) - 1; + e = d == 0 ? (-2147483647 - 1) : e; + e = d == rtengine::RT_INFINITY || d == -rtengine::RT_INFINITY ? 2147483647 : e; + return e; +} + +__inline double upper(double d) { + return longBitsToDouble(doubleToRawLongBits(d) & 0xfffffffff8000000LL); +} + +typedef struct { + double x, y; +} double2; + +typedef struct { + float x, y; +} float2; + +__inline double2 dd(double h, double l) { + double2 ret; + ret.x = h; ret.y = l; + return ret; +} + +__inline double2 normalize_d(double2 t) { + double2 s; + + s.x = t.x + t.y; + s.y = t.x - s.x + t.y; + + return s; +} + +__inline double2 scale_d(double2 d, double s) { + double2 r; + + r.x = d.x * s; + r.y = d.y * s; + + return r; +} + +__inline double2 add2_ss(double x, double y) { + double2 r; + + r.x = x + y; + double v = r.x - x; + r.y = (x - (r.x - v)) + (y - v); + + return r; +} + +__inline double2 add_ds(double2 x, double y) { + // |x| >= |y| + + double2 r; + + assert(xisnan(x.x) || xisnan(y) || xfabs(x.x) >= xfabs(y)); + + r.x = x.x + y; + r.y = x.x - r.x + y + x.y; + + return r; +} + +__inline double2 add2_ds(double2 x, double y) { + // |x| >= |y| + + double2 r; + + r.x = x.x + y; + double v = r.x - x.x; + r.y = (x.x - (r.x - v)) + (y - v); + r.y += x.y; + + return r; +} + +__inline double2 add_sd(double x, double2 y) { + // |x| >= |y| + + double2 r; + + assert(xisnan(x) || xisnan(y.x) || xfabs(x) >= xfabs(y.x)); + + r.x = x + y.x; + r.y = x - r.x + y.x + y.y; + + return r; +} + +__inline double2 add_dd(double2 x, double2 y) { + // |x| >= |y| + + double2 r; + + assert(xisnan(x.x) || xisnan(y.x) || xfabs(x.x) >= xfabs(y.x)); + + r.x = x.x + y.x; + r.y = x.x - r.x + y.x + x.y + y.y; + + return r; +} + +__inline double2 add2_dd(double2 x, double2 y) { + double2 r; + + r.x = x.x + y.x; + double v = r.x - x.x; + r.y = (x.x - (r.x - v)) + (y.x - v); + r.y += x.y + y.y; + + return r; +} + +__inline double2 div_dd(double2 n, double2 d) { + double t = 1.0 / d.x; + double dh = upper(d.x), dl = d.x - dh; + double th = upper(t ), tl = t - th; + double nhh = upper(n.x), nhl = n.x - nhh; + + double2 q; + + q.x = n.x * t; + + double u = -q.x + nhh * th + nhh * tl + nhl * th + nhl * tl + + q.x * (1 - dh * th - dh * tl - dl * th - dl * tl); + + q.y = t * (n.y - q.x * d.y) + u; + + return q; +} + +__inline double2 mul_ss(double x, double y) { + double xh = upper(x), xl = x - xh; + double yh = upper(y), yl = y - yh; + double2 r; + + r.x = x * y; + r.y = xh * yh - r.x + xl * yh + xh * yl + xl * yl; + + return r; +} + +__inline double2 mul_ds(double2 x, double y) { + double xh = upper(x.x), xl = x.x - xh; + double yh = upper(y ), yl = y - yh; + double2 r; + + r.x = x.x * y; + r.y = xh * yh - r.x + xl * yh + xh * yl + xl * yl + x.y * y; + + return r; +} + +__inline double2 mul_dd(double2 x, double2 y) { + double xh = upper(x.x), xl = x.x - xh; + double yh = upper(y.x), yl = y.x - yh; + double2 r; + + r.x = x.x * y.x; + r.y = xh * yh - r.x + xl * yh + xh * yl + xl * yl + x.x * y.y + x.y * y.x; + + return r; +} + +__inline double2 squ_d(double2 x) { + double xh = upper(x.x), xl = x.x - xh; + double2 r; + + r.x = x.x * x.x; + r.y = xh * xh - r.x + (xh + xh) * xl + xl * xl + x.x * (x.y + x.y); + + return r; +} + +__inline double2 rec_s(double d) { + double t = 1.0 / d; + double dh = upper(d), dl = d - dh; + double th = upper(t), tl = t - th; + double2 q; + + q.x = t; + q.y = t * (1 - dh * th - dh * tl - dl * th - dl * tl); + + return q; +} + +__inline double2 sqrt_d(double2 d) { + double t = sqrt(d.x + d.y); + return scale_d(mul_dd(add2_dd(d, mul_ss(t, t)), rec_s(t)), 0.5); +} + +__inline double atan2k(double y, double x) { + double s, t, u; + int q = 0; + + if (x < 0) { x = -x; q = -2; } + if (y > x) { t = x; x = y; y = -t; q += 1; } + + s = y / x; + t = s * s; + + u = -1.88796008463073496563746e-05; + u = u * t + (0.000209850076645816976906797); + u = u * t + (-0.00110611831486672482563471); + u = u * t + (0.00370026744188713119232403); + u = u * t + (-0.00889896195887655491740809); + u = u * t + (0.016599329773529201970117); + u = u * t + (-0.0254517624932312641616861); + u = u * t + (0.0337852580001353069993897); + u = u * t + (-0.0407629191276836500001934); + u = u * t + (0.0466667150077840625632675); + u = u * t + (-0.0523674852303482457616113); + u = u * t + (0.0587666392926673580854313); + u = u * t + (-0.0666573579361080525984562); + u = u * t + (0.0769219538311769618355029); + u = u * t + (-0.090908995008245008229153); + u = u * t + (0.111111105648261418443745); + u = u * t + (-0.14285714266771329383765); + u = u * t + (0.199999999996591265594148); + u = u * t + (-0.333333333333311110369124); + + t = u * t * s + s; + t = q * (rtengine::RT_PI_2) + t; + + return t; +} + +__inline double xatan2(double y, double x) { + double r = atan2k(xfabs(y), x); + + r = mulsign(r, x); + if (xisinf(x) || x == 0) r = rtengine::RT_PI_2 - (xisinf(x) ? (sign(x) * (rtengine::RT_PI_2)) : 0); + if (xisinf(y) ) r = rtengine::RT_PI_2 - (xisinf(x) ? (sign(x) * (rtengine::RT_PI*1/4)) : 0); + if ( y == 0) r = (sign(x) == -1 ? rtengine::RT_PI : 0); + + return xisnan(x) || xisnan(y) ? rtengine::RT_NAN : mulsign(r, y); +} + +__inline double xasin(double d) { + return mulsign(atan2k(xfabs(d), sqrt((1+d)*(1-d))), d); +} + +__inline double xacos(double d) { + return mulsign(atan2k(sqrt((1+d)*(1-d)), xfabs(d)), d) + (d < 0 ? rtengine::RT_PI : 0); +} + +__inline double xatan(double s) { + double t, u; + int q = 0; + + if (s < 0) { s = -s; q = 2; } + if (s > 1) { s = 1.0 / s; q |= 1; } + + t = s * s; + + u = -1.88796008463073496563746e-05; + u = u * t + (0.000209850076645816976906797); + u = u * t + (-0.00110611831486672482563471); + u = u * t + (0.00370026744188713119232403); + u = u * t + (-0.00889896195887655491740809); + u = u * t + (0.016599329773529201970117); + u = u * t + (-0.0254517624932312641616861); + u = u * t + (0.0337852580001353069993897); + u = u * t + (-0.0407629191276836500001934); + u = u * t + (0.0466667150077840625632675); + u = u * t + (-0.0523674852303482457616113); + u = u * t + (0.0587666392926673580854313); + u = u * t + (-0.0666573579361080525984562); + u = u * t + (0.0769219538311769618355029); + u = u * t + (-0.090908995008245008229153); + u = u * t + (0.111111105648261418443745); + u = u * t + (-0.14285714266771329383765); + u = u * t + (0.199999999996591265594148); + u = u * t + (-0.333333333333311110369124); + + t = s + s * (t * u); + + if ((q & 1) != 0) t = 1.570796326794896557998982 - t; + if ((q & 2) != 0) t = -t; + + return t; +} + +__inline double xsin(double d) { + int q; + double u, s; + + q = (int)xrint(d * rtengine::RT_1_PI); + + d = mla(q, -PI4_A*4, d); + d = mla(q, -PI4_B*4, d); + d = mla(q, -PI4_C*4, d); + + s = d * d; + + if ((q & 1) != 0) d = -d; + + u = -7.97255955009037868891952e-18; + u = mla(u, s, 2.81009972710863200091251e-15); + u = mla(u, s, -7.64712219118158833288484e-13); + u = mla(u, s, 1.60590430605664501629054e-10); + u = mla(u, s, -2.50521083763502045810755e-08); + u = mla(u, s, 2.75573192239198747630416e-06); + u = mla(u, s, -0.000198412698412696162806809); + u = mla(u, s, 0.00833333333333332974823815); + u = mla(u, s, -0.166666666666666657414808); + + u = mla(s, u * d, d); + + return u; +} + +__inline double xcos(double d) { + int q; + double u, s; + + q = 1 + 2*(int)xrint(d * rtengine::RT_1_PI - 0.5); + + d = mla(q, -PI4_A*2, d); + d = mla(q, -PI4_B*2, d); + d = mla(q, -PI4_C*2, d); + + s = d * d; + + if ((q & 2) == 0) d = -d; + + u = -7.97255955009037868891952e-18; + u = mla(u, s, 2.81009972710863200091251e-15); + u = mla(u, s, -7.64712219118158833288484e-13); + u = mla(u, s, 1.60590430605664501629054e-10); + u = mla(u, s, -2.50521083763502045810755e-08); + u = mla(u, s, 2.75573192239198747630416e-06); + u = mla(u, s, -0.000198412698412696162806809); + u = mla(u, s, 0.00833333333333332974823815); + u = mla(u, s, -0.166666666666666657414808); + + u = mla(s, u * d, d); + + return u; +} + +__inline double2 xsincos(double d) { + int q; + double u, s, t; + double2 r; + + q = (int)xrint(d * (2 * rtengine::RT_1_PI)); + + s = d; + + s = mla(-q, PI4_A*2, s); + s = mla(-q, PI4_B*2, s); + s = mla(-q, PI4_C*2, s); + + t = s; + + s = s * s; + + u = 1.58938307283228937328511e-10; + u = mla(u, s, -2.50506943502539773349318e-08); + u = mla(u, s, 2.75573131776846360512547e-06); + u = mla(u, s, -0.000198412698278911770864914); + u = mla(u, s, 0.0083333333333191845961746); + u = mla(u, s, -0.166666666666666130709393); + u = u * s * t; + + r.x = t + u; + + u = -1.13615350239097429531523e-11; + u = mla(u, s, 2.08757471207040055479366e-09); + u = mla(u, s, -2.75573144028847567498567e-07); + u = mla(u, s, 2.48015872890001867311915e-05); + u = mla(u, s, -0.00138888888888714019282329); + u = mla(u, s, 0.0416666666666665519592062); + u = mla(u, s, -0.5); + + r.y = u * s + 1; + + if ((q & 1) != 0) { s = r.y; r.y = r.x; r.x = s; } + if ((q & 2) != 0) { r.x = -r.x; } + if (((q+1) & 2) != 0) { r.y = -r.y; } + + if (xisinf(d)) { r.x = r.y = rtengine::RT_NAN; } + + return r; +} + +__inline double xtan(double d) { + int q; + double u, s, x; + + q = (int)xrint(d * (2 * rtengine::RT_1_PI)); + + x = mla(q, -PI4_A*2, d); + x = mla(q, -PI4_B*2, x); + x = mla(q, -PI4_C*2, x); + + s = x * x; + + if ((q & 1) != 0) x = -x; + + u = 1.01419718511083373224408e-05; + u = mla(u, s, -2.59519791585924697698614e-05); + u = mla(u, s, 5.23388081915899855325186e-05); + u = mla(u, s, -3.05033014433946488225616e-05); + u = mla(u, s, 7.14707504084242744267497e-05); + u = mla(u, s, 8.09674518280159187045078e-05); + u = mla(u, s, 0.000244884931879331847054404); + u = mla(u, s, 0.000588505168743587154904506); + u = mla(u, s, 0.00145612788922812427978848); + u = mla(u, s, 0.00359208743836906619142924); + u = mla(u, s, 0.00886323944362401618113356); + u = mla(u, s, 0.0218694882853846389592078); + u = mla(u, s, 0.0539682539781298417636002); + u = mla(u, s, 0.133333333333125941821962); + u = mla(u, s, 0.333333333333334980164153); + + u = mla(s, u * x, x); + + if ((q & 1) != 0) u = 1.0 / u; + + if (xisinf(d)) u = rtengine::RT_NAN; + + return u; +} + +__inline double xlog(double d) { + double x, x2, t, m; + int e; + + e = ilogbp1(d * 0.7071); + m = ldexpk(d, -e); + + x = (m-1) / (m+1); + x2 = x * x; + + t = 0.148197055177935105296783; + t = mla(t, x2, 0.153108178020442575739679); + t = mla(t, x2, 0.181837339521549679055568); + t = mla(t, x2, 0.22222194152736701733275); + t = mla(t, x2, 0.285714288030134544449368); + t = mla(t, x2, 0.399999999989941956712869); + t = mla(t, x2, 0.666666666666685503450651); + t = mla(t, x2, 2); + + x = x * t + 0.693147180559945286226764 * e; + + if (xisinf(d)) x = rtengine::RT_INFINITY; + if (d < 0) x = rtengine::RT_NAN; + if (d == 0) x = -rtengine::RT_INFINITY; + + return x; +} + +__inline double xexp(double d) { + int q = (int)xrint(d * R_LN2); + double s, u; + + s = mla(q, -L2U, d); + s = mla(q, -L2L, s); + + u = 2.08860621107283687536341e-09; + u = mla(u, s, 2.51112930892876518610661e-08); + u = mla(u, s, 2.75573911234900471893338e-07); + u = mla(u, s, 2.75572362911928827629423e-06); + u = mla(u, s, 2.4801587159235472998791e-05); + u = mla(u, s, 0.000198412698960509205564975); + u = mla(u, s, 0.00138888888889774492207962); + u = mla(u, s, 0.00833333333331652721664984); + u = mla(u, s, 0.0416666666666665047591422); + u = mla(u, s, 0.166666666666666851703837); + u = mla(u, s, 0.5); + + u = s * s * u + s + 1; + u = ldexpk(u, q); + + if (xisminf(d)) u = 0; + + return u; +} + +__inline double2 logk(double d) { + double2 x, x2; + double m, t; + int e; + + e = ilogbp1(d * 0.7071); + m = ldexpk(d, -e); + + x = div_dd(add2_ss(-1, m), add2_ss(1, m)); + x2 = squ_d(x); + + t = 0.134601987501262130076155; + t = mla(t, x2.x, 0.132248509032032670243288); + t = mla(t, x2.x, 0.153883458318096079652524); + t = mla(t, x2.x, 0.181817427573705403298686); + t = mla(t, x2.x, 0.222222231326187414840781); + t = mla(t, x2.x, 0.285714285651261412873718); + t = mla(t, x2.x, 0.400000000000222439910458); + t = mla(t, x2.x, 0.666666666666666371239645); + + return add2_dd(mul_ds(dd(0.693147180559945286226764, 2.319046813846299558417771e-17), e), + add2_dd(scale_d(x, 2), mul_ds(mul_dd(x2, x), t))); +} + +__inline double expk(double2 d) { + int q = (int)rint((d.x + d.y) * R_LN2); + double2 s, t; + double u; + + s = add2_ds(d, q * -L2U); + s = add2_ds(s, q * -L2L); + + s = normalize_d(s); + + u = 2.51069683420950419527139e-08; + u = mla(u, s.x, 2.76286166770270649116855e-07); + u = mla(u, s.x, 2.75572496725023574143864e-06); + u = mla(u, s.x, 2.48014973989819794114153e-05); + u = mla(u, s.x, 0.000198412698809069797676111); + u = mla(u, s.x, 0.0013888888939977128960529); + u = mla(u, s.x, 0.00833333333332371417601081); + u = mla(u, s.x, 0.0416666666665409524128449); + u = mla(u, s.x, 0.166666666666666740681535); + u = mla(u, s.x, 0.500000000000000999200722); + + t = add_dd(s, mul_ds(squ_d(s), u)); + + t = add_sd(1, t); + return ldexpk(t.x + t.y, q); +} + +__inline double xpow(double x, double y) { + int yisint = (int)y == y; + int yisodd = (1 & (int)y) != 0 && yisint; + + double result = expk(mul_ds(logk(xfabs(x)), y)); + + result = xisnan(result) ? rtengine::RT_INFINITY : result; + result *= (x >= 0 ? 1 : (!yisint ? rtengine::RT_NAN : (yisodd ? -1 : 1))); + + double efx = mulsign(xfabs(x) - 1, y); + if (xisinf(y)) result = efx < 0 ? 0.0 : (efx == 0 ? 1.0 : rtengine::RT_INFINITY); + if (xisinf(x) || x == 0) result = (yisodd ? sign(x) : 1) * ((x == 0 ? -y : y) < 0 ? 0 : rtengine::RT_INFINITY); + if (xisnan(x) || xisnan(y)) result = rtengine::RT_NAN; + if (y == 0 || x == 1) result = 1; + + return result; +} + +__inline double2 expk2(double2 d) { + int q = (int)rint((d.x + d.y) * R_LN2); + double2 s, t; + double u; + + s = add2_ds(d, q * -L2U); + s = add2_ds(s, q * -L2L); + + s = normalize_d(s); + + u = 2.51069683420950419527139e-08; + u = mla(u, s.x, 2.76286166770270649116855e-07); + u = mla(u, s.x, 2.75572496725023574143864e-06); + u = mla(u, s.x, 2.48014973989819794114153e-05); + u = mla(u, s.x, 0.000198412698809069797676111); + u = mla(u, s.x, 0.0013888888939977128960529); + u = mla(u, s.x, 0.00833333333332371417601081); + u = mla(u, s.x, 0.0416666666665409524128449); + u = mla(u, s.x, 0.166666666666666740681535); + u = mla(u, s.x, 0.500000000000000999200722); + + t = add_dd(s, mul_ds(squ_d(s), u)); + + t = add_sd(1, t); + return dd(ldexpk(t.x, q), ldexpk(t.y, q)); +} + +__inline double xsinh(double x) { + double y = xfabs(x); + double2 d = expk2(dd(y, 0)); + d = add2_dd(d, div_dd(dd(-1, 0), d)); + y = (d.x + d.y) * 0.5; + + y = xisinf(x) || xisnan(y) ? rtengine::RT_INFINITY : y; + y = mulsign(y, x); + y = xisnan(x) ? rtengine::RT_NAN : y; + + return y; +} + +__inline double xcosh(double x) { + double2 d = expk2(dd(x, 0)); + d = add2_dd(d, div_dd(dd(1, 0), d)); + double y = (d.x + d.y) * 0.5; + + y = xisinf(x) || xisnan(y) ? rtengine::RT_INFINITY : y; + y = xisnan(x) ? rtengine::RT_NAN : y; + + return y; +} + +__inline double xtanh(double x) { + double y = xfabs(x); + double2 d = expk2(dd(y, 0)); + double2 e = div_dd(dd(1, 0), d); + d = div_dd(add2_dd(d, scale_d(e, -1)), add2_dd(d, e)); + y = d.x + d.y; + + y = xisinf(x) || xisnan(y) ? 1.0 : y; + y = mulsign(y, x); + y = xisnan(x) ? rtengine::RT_NAN : y; + + return y; +} + +__inline double2 logk2(double2 d) { + double2 x, x2, m; + double t; + int e; + + d = normalize_d(d); + e = ilogbp1(d.x * 0.7071); + m = scale_d(d, ldexpk(1, -e)); + + x = div_dd(add2_ds(m, -1), add2_ds(m, 1)); + x2 = squ_d(x); + + t = 0.134601987501262130076155; + t = mla(t, x2.x, 0.132248509032032670243288); + t = mla(t, x2.x, 0.153883458318096079652524); + t = mla(t, x2.x, 0.181817427573705403298686); + t = mla(t, x2.x, 0.222222231326187414840781); + t = mla(t, x2.x, 0.285714285651261412873718); + t = mla(t, x2.x, 0.400000000000222439910458); + t = mla(t, x2.x, 0.666666666666666371239645); + + return add2_dd(mul_ds(dd(0.693147180559945286226764, 2.319046813846299558417771e-17), e), + add2_dd(scale_d(x, 2), mul_ds(mul_dd(x2, x), t))); +} + +__inline double xasinh(double x) { + double y = xfabs(x); + double2 d = logk2(add2_ds(sqrt_d(add2_ds(mul_ss(y, y), 1)), y)); + y = d.x + d.y; + + y = xisinf(x) || xisnan(y) ? rtengine::RT_INFINITY : y; + y = mulsign(y, x); + y = xisnan(x) ? rtengine::RT_NAN : y; + + return y; +} + +__inline double xacosh(double x) { + double2 d = logk2(add2_ds(sqrt_d(add2_ds(mul_ss(x, x), -1)), x)); + double y = d.x + d.y; + + y = xisinf(x) || xisnan(y) ? rtengine::RT_INFINITY : y; + y = x == 1.0 ? 0.0 : y; + y = x < 1.0 ? rtengine::RT_NAN : y; + y = xisnan(x) ? rtengine::RT_NAN : y; + + return y; +} + +__inline double xatanh(double x) { + double y = xfabs(x); + double2 d = logk2(div_dd(add2_ss(1, y), add2_ss(1, -y))); + y = y > 1.0 ? rtengine::RT_NAN : (y == 1.0 ? rtengine::RT_INFINITY : (d.x + d.y) * 0.5); + + y = xisinf(x) || xisnan(y) ? rtengine::RT_NAN : y; + y = mulsign(y, x); + y = xisnan(x) ? rtengine::RT_NAN : y; + + return y; +} + +// + +__inline double xfma(double x, double y, double z) { + union { + double f; + long long int i; + } tmp; + + tmp.f = x; + tmp.i = (tmp.i + 0x4000000) & 0xfffffffff8000000LL; + double xh = tmp.f, xl = x - xh; + + tmp.f = y; + tmp.i = (tmp.i + 0x4000000) & 0xfffffffff8000000LL; + double yh = tmp.f, yl = y - yh; + + double h = x * y; + double l = xh * yh - h + xl * yh + xh * yl + xl * yl; + + double h2, l2, v; + + h2 = h + z; + v = h2 - h; + l2 = (h - (h2 - v)) + (z - v) + l; + + return h2 + l2; +} + +__inline double xsqrt(double d) { // max error : 0.5 ulp + double q = 1; + + if (d < 8.636168555094445E-78) { + d *= 1.157920892373162E77; + q = 2.9387358770557188E-39; + } + + // http://en.wikipedia.org/wiki/Fast_inverse_square_root + double x = longBitsToDouble(0x5fe6ec85e7de30da - (doubleToRawLongBits(d + 1e-320) >> 1)); + + x = x * (1.5 - 0.5 * d * x * x); + x = x * (1.5 - 0.5 * d * x * x); + x = x * (1.5 - 0.5 * d * x * x); + + // You can change xfma to fma if fma is correctly implemented + x = xfma(d * x, d * x, -d) * (x * -0.5) + d * x; + + return d == rtengine::RT_INFINITY ? rtengine::RT_INFINITY : x * q; +} + +__inline double xcbrt(double d) { // max error : 2 ulps + double x, y, q = 1.0; + int e, r; + + e = ilogbp1(d); + d = ldexpk(d, -e); + r = (e + 6144) % 3; + q = (r == 1) ? 1.2599210498948731647672106 : q; + q = (r == 2) ? 1.5874010519681994747517056 : q; + q = ldexpk(q, (e + 6144) / 3 - 2048); + + q = mulsign(q, d); + d = xfabs(d); + + x = -0.640245898480692909870982; + x = x * d + 2.96155103020039511818595; + x = x * d + -5.73353060922947843636166; + x = x * d + 6.03990368989458747961407; + x = x * d + -3.85841935510444988821632; + x = x * d + 2.2307275302496609725722; + + y = x * x; y = y * y; x -= (d * y - x) * (1.0 / 3.0); + y = d * x * x; + y = (y - (2.0 / 3.0) * y * (y * x - 1)) * q; + + return y; +} + +__inline double xexp2(double a) { + double u = expk(mul_ds(dd(0.69314718055994528623, 2.3190468138462995584e-17), a)); + if (xispinf(a)) u = rtengine::RT_INFINITY; + if (xisminf(a)) u = 0; + return u; +} + +__inline double xexp10(double a) { + double u = expk(mul_ds(dd(2.3025850929940459011, -2.1707562233822493508e-16), a)); + if (xispinf(a)) u = rtengine::RT_INFINITY; + if (xisminf(a)) u = 0; + return u; +} + +__inline double xexpm1(double a) { + double2 d = add2_ds(expk2(dd(a, 0)), -1.0); + double x = d.x + d.y; + if (xispinf(a)) x = rtengine::RT_INFINITY; + if (xisminf(a)) x = -1; + return x; +} + +__inline double xlog10(double a) { + double2 d = mul_dd(logk(a), dd(0.43429448190325176116, 6.6494347733425473126e-17)); + double x = d.x + d.y; + + if (xisinf(a)) x = rtengine::RT_INFINITY; + if (a < 0) x = rtengine::RT_NAN; + if (a == 0) x = -rtengine::RT_INFINITY; + + return x; +} + +__inline double xlog1p(double a) { + double2 d = logk2(add2_ss(a, 1)); + double x = d.x + d.y; + + if (xisinf(a)) x = rtengine::RT_INFINITY; + if (a < -1) x = rtengine::RT_NAN; + if (a == -1) x = -rtengine::RT_INFINITY; + + return x; +} + +/////////////////////////////////////////// + +#define PI4_Af 0.78515625f +#define PI4_Bf 0.00024127960205078125f +#define PI4_Cf 6.3329935073852539062e-07f +#define PI4_Df 4.9604681473525147339e-10f + +#define L2Uf 0.693145751953125f +#define L2Lf 1.428606765330187045e-06f + +#define R_LN2f 1.442695040888963407359924681001892137426645954152985934135449406931f + +__inline int32_t floatToRawIntBits(float d) { + union { + float f; + int32_t i; + } tmp; + tmp.f = d; + return tmp.i; +} + +__inline float intBitsToFloat(int32_t i) { + union { + float f; + int32_t i; + } tmp; + tmp.i = i; + return tmp.f; +} + +__inline float xfabsf(float x) { + return intBitsToFloat(0x7fffffffL & floatToRawIntBits(x)); +} + +__inline float mulsignf(float x, float y) { + return intBitsToFloat(floatToRawIntBits(x) ^ (floatToRawIntBits(y) & (1 << 31))); +} + +__inline float signf(float d) { return copysign(1, d); } +__inline float mlaf(float x, float y, float z) { return x * y + z; } + +__inline int xisnanf(float x) { return x != x; } +__inline int xisinff(float x) { return x == rtengine::RT_INFINITY_F || x == -rtengine::RT_INFINITY_F; } +__inline int xisminff(float x) { return x == -rtengine::RT_INFINITY_F; } +__inline int xispinff(float x) { return x == rtengine::RT_INFINITY_F; } + +__inline int ilogbp1f(float d) { + int m = d < 5.421010862427522E-20f; + d = m ? 1.8446744073709552E19f * d : d; + int q = (floatToRawIntBits(d) >> 23) & 0xff; + q = m ? q - (64 + 0x7e) : q - 0x7e; + return q; +} + +__inline float ldexpkf(float x, int q) { + float u; + int m; + m = q >> 31; + m = (((m + q) >> 6) - m) << 4; + q = q - (m << 2); + u = intBitsToFloat(((int32_t)(m + 0x7f)) << 23); + u = u * u; + x = x * u * u; + u = intBitsToFloat(((int32_t)(q + 0x7f)) << 23); + return x * u; +} + +__inline float xcbrtf(float d) { // max error : 2 ulps + float x, y, q = 1.0f; + int e, r; + + e = ilogbp1f(d); + d = ldexpkf(d, -e); + r = (e + 6144) % 3; + q = (r == 1) ? 1.2599210498948731647672106f : q; + q = (r == 2) ? 1.5874010519681994747517056f : q; + q = ldexpkf(q, (e + 6144) / 3 - 2048); + + q = mulsignf(q, d); + d = xfabsf(d); + + x = -0.601564466953277587890625f; + x = mlaf(x, d, 2.8208892345428466796875f); + x = mlaf(x, d, -5.532182216644287109375f); + x = mlaf(x, d, 5.898262500762939453125f); + x = mlaf(x, d, -3.8095417022705078125f); + x = mlaf(x, d, 2.2241256237030029296875f); + + y = d * x * x; + y = (y - (2.0f / 3.0f) * y * (y * x - 1.0f)) * q; + + return y; +} + +__inline float xsinf(float d) { + int q; + float u, s; + + q = rint(d * rtengine::RT_1_PI_F); + + d = mlaf(q, -PI4_Af*4, d); + d = mlaf(q, -PI4_Bf*4, d); + d = mlaf(q, -PI4_Cf*4, d); + d = mlaf(q, -PI4_Df*4, d); + + s = d * d; + + if ((q & 1) != 0) d = -d; + + u = 2.6083159809786593541503e-06f; + u = mlaf(u, s, -0.0001981069071916863322258f); + u = mlaf(u, s, 0.00833307858556509017944336f); + u = mlaf(u, s, -0.166666597127914428710938f); + + u = mlaf(s, u * d, d); + + return u; +} + +__inline float xcosf(float d) { +#ifdef __SSE2__ + // faster than scalar version + return xcosf(_mm_set_ss(d))[0]; +#else + int q; + float u, s; + + q = 1 + 2*rint(d * rtengine::RT_1_PI_F - 0.5f); + + d = mlaf(q, -PI4_Af*2, d); + d = mlaf(q, -PI4_Bf*2, d); + d = mlaf(q, -PI4_Cf*2, d); + d = mlaf(q, -PI4_Df*2, d); + + s = d * d; + + if ((q & 2) == 0) d = -d; + + u = 2.6083159809786593541503e-06f; + u = mlaf(u, s, -0.0001981069071916863322258f); + u = mlaf(u, s, 0.00833307858556509017944336f); + u = mlaf(u, s, -0.166666597127914428710938f); + + u = mlaf(s, u * d, d); + + return u; +#endif +} + +__inline float2 xsincosf(float d) { +#ifdef __SSE2__ + // faster than scalar version + vfloat2 res = xsincosf(_mm_set_ss(d)); + return {res.x[0], res.y[0]}; +#else + int q; + float u, s, t; + float2 r; + + q = rint(d * rtengine::RT_2_PI_F); + + s = d; + + s = mlaf(q, -PI4_Af*2, s); + s = mlaf(q, -PI4_Bf*2, s); + s = mlaf(q, -PI4_Cf*2, s); + s = mlaf(q, -PI4_Df*2, s); + + t = s; + + s = s * s; + + u = -0.000195169282960705459117889f; + u = mlaf(u, s, 0.00833215750753879547119141f); + u = mlaf(u, s, -0.166666537523269653320312f); + u = u * s * t; + + r.x = t + u; + + u = -2.71811842367242206819355e-07f; + u = mlaf(u, s, 2.47990446951007470488548e-05f); + u = mlaf(u, s, -0.00138888787478208541870117f); + u = mlaf(u, s, 0.0416666641831398010253906f); + u = mlaf(u, s, -0.5f); + + r.y = u * s + 1; + + if ((q & 1) != 0) { s = r.y; r.y = r.x; r.x = s; } + if ((q & 2) != 0) { r.x = -r.x; } + if (((q+1) & 2) != 0) { r.y = -r.y; } + + if (xisinff(d)) { r.x = r.y = rtengine::RT_NAN_F; } + + return r; +#endif +} + +__inline float xtanf(float d) { + int q; + float u, s, x; + + q = rint(d * (float)(2 * rtengine::RT_1_PI)); + + x = d; + + x = mlaf(q, -PI4_Af*2, x); + x = mlaf(q, -PI4_Bf*2, x); + x = mlaf(q, -PI4_Cf*2, x); + x = mlaf(q, -PI4_Df*2, x); + + s = x * x; + + if ((q & 1) != 0) x = -x; + + u = 0.00927245803177356719970703f; + u = mlaf(u, s, 0.00331984995864331722259521f); + u = mlaf(u, s, 0.0242998078465461730957031f); + u = mlaf(u, s, 0.0534495301544666290283203f); + u = mlaf(u, s, 0.133383005857467651367188f); + u = mlaf(u, s, 0.333331853151321411132812f); + + u = mlaf(s, u * x, x); + + if ((q & 1) != 0) u = 1.0f / u; + + if (xisinff(d)) u = rtengine::RT_NAN_F; + + return u; +} + +__inline float xatanf(float s) { + float t, u; + int q = 0; + + if (s < 0) { s = -s; q = 2; } + if (s > 1) { s = 1.0f / s; q |= 1; } + + t = s * s; + + u = 0.00282363896258175373077393f; + u = mlaf(u, t, -0.0159569028764963150024414f); + u = mlaf(u, t, 0.0425049886107444763183594f); + u = mlaf(u, t, -0.0748900920152664184570312f); + u = mlaf(u, t, 0.106347933411598205566406f); + u = mlaf(u, t, -0.142027363181114196777344f); + u = mlaf(u, t, 0.199926957488059997558594f); + u = mlaf(u, t, -0.333331018686294555664062f); + + t = s + s * (t * u); + + if ((q & 1) != 0) t = 1.570796326794896557998982f - t; + if ((q & 2) != 0) t = -t; + + return t; +} + +__inline float atan2kf(float y, float x) { + float s, t, u; + float q = 0.f; + + if (x < 0) { x = -x; q = -2.f; } + if (y > x) { t = x; x = y; y = -t; q += 1.f; } + + s = y / x; + t = s * s; + + u = 0.00282363896258175373077393f; + u = mlaf(u, t, -0.0159569028764963150024414f); + u = mlaf(u, t, 0.0425049886107444763183594f); + u = mlaf(u, t, -0.0748900920152664184570312f); + u = mlaf(u, t, 0.106347933411598205566406f); + u = mlaf(u, t, -0.142027363181114196777344f); + u = mlaf(u, t, 0.199926957488059997558594f); + u = mlaf(u, t, -0.333331018686294555664062f); + + t = u * t; + t = mlaf(t,s,s); + return mlaf(q,(float)(rtengine::RT_PI_F_2),t); +} + +__inline float xatan2f(float y, float x) { + float r = atan2kf(xfabsf(y), x); + + r = mulsignf(r, x); + if (xisinff(x) || x == 0) r = rtengine::RT_PI_F/2 - (xisinff(x) ? (signf(x) * (float)(rtengine::RT_PI_F*.5f)) : 0); + if (xisinff(y) ) r = rtengine::RT_PI_F/2 - (xisinff(x) ? (signf(x) * (float)(rtengine::RT_PI_F*.25f)) : 0); + if ( y == 0) r = (signf(x) == -1 ? rtengine::RT_PI_F : 0); + + return xisnanf(x) || xisnanf(y) ? rtengine::RT_NAN_F : mulsignf(r, y); +} + +__inline float xasinf(float d) { + return mulsignf(atan2kf(fabsf(d), sqrtf((1.0f+d)*(1.0f-d))), d); +} + +__inline float xacosf(float d) { + return mulsignf(atan2kf(sqrtf((1.0f+d)*(1.0f-d)), fabsf(d)), d) + (d < 0 ? (float)rtengine::RT_PI : 0.0f); +} + +__inline float xlogf(float d) { + float x, x2, t, m; + int e; + + e = ilogbp1f(d * 0.7071f); + m = ldexpkf(d, -e); + + x = (m-1.0f) / (m+1.0f); + x2 = x * x; + + t = 0.2371599674224853515625f; + t = mlaf(t, x2, 0.285279005765914916992188f); + t = mlaf(t, x2, 0.400005519390106201171875f); + t = mlaf(t, x2, 0.666666567325592041015625f); + t = mlaf(t, x2, 2.0f); + + x = x * t + 0.693147180559945286226764f * e; + + if (xisinff(d)) x = rtengine::RT_INFINITY_F; + if (d < 0) x = rtengine::RT_NAN_F; + if (d == 0) x = -rtengine::RT_INFINITY_F; + + return x; +} + +__inline float xexpf(float d) { + if(d<=-104.0f) return 0.0f; + + int q = rint(d * R_LN2f); + float s, u; + + s = mlaf(q, -L2Uf, d); + s = mlaf(q, -L2Lf, s); + + u = 0.00136324646882712841033936f; + u = mlaf(u, s, 0.00836596917361021041870117f); + u = mlaf(u, s, 0.0416710823774337768554688f); + u = mlaf(u, s, 0.166665524244308471679688f); + u = mlaf(u, s, 0.499999850988388061523438f); + + u = mlaf( s, mlaf(s,u,1.f),1.f); + return ldexpkf(u, q); + +} + +__inline float xmul2f(float d) { + union { + float floatval; + int intval; + } uflint; + uflint.floatval = d; + if (uflint.intval & 0x7FFFFFFF) { // if f==0 do nothing + uflint.intval += 1 << 23; // add 1 to the exponent + } + return uflint.floatval; +} + +__inline float xdiv2f(float d) { + union { + float floatval; + int intval; + } uflint; + uflint.floatval = d; + if (uflint.intval & 0x7FFFFFFF) { // if f==0 do nothing + uflint.intval -= 1 << 23; // sub 1 from the exponent + } + return uflint.floatval; +} + +__inline float xdivf( float d, int n){ + union { + float floatval; + int intval; + } uflint; + uflint.floatval = d; + if (uflint.intval & 0x7FFFFFFF) { // if f==0 do nothing + uflint.intval -= n << 23; // add n to the exponent + } + return uflint.floatval; +} + +__inline float xlin2log(float x, float base) +{ + constexpr float one(1); + return xlogf(x * (base - one) + one) / xlogf(base); +} + +__inline void xlin2log(float *x, float factor, float base, int w) +{ + constexpr float one(1); + base = 1.f / xlogf(base); + for (int i = 0; i < w; ++i) { + x[i] = xlogf(x[i] * factor * (base - one) + one) * base; + } +} + +__inline float xlog2lin(float x, float base) +{ + constexpr float one(1); + return (pow_F(base, x) - one) / (base - one); +} + +#endif From 47d6ee44f8532b4a96736871fc53ebffd61e245c Mon Sep 17 00:00:00 2001 From: heckflosse Date: Thu, 1 Nov 2018 22:31:12 +0100 Subject: [PATCH 061/122] Removed accidently committed file --- rtengine/sleef.c.save-failed | 1288 ---------------------------------- 1 file changed, 1288 deletions(-) delete mode 100644 rtengine/sleef.c.save-failed diff --git a/rtengine/sleef.c.save-failed b/rtengine/sleef.c.save-failed deleted file mode 100644 index 0cde64be6..000000000 --- a/rtengine/sleef.c.save-failed +++ /dev/null @@ -1,1288 +0,0 @@ -//////////////////////////////////////////////////////////////// -// -// this code was taken from http://shibatch.sourceforge.net/ -// Many thanks to the author of original version: Naoki Shibata -// -// This version contains modifications made by Ingo Weyrich -// -//////////////////////////////////////////////////////////////// - -#ifndef _SLEEFC_ -#define _SLEEFC_ - -#include -#include -#include "rt_math.h" -#include "opthelper.h" - -#define PI4_A .7853981554508209228515625 -#define PI4_B .794662735614792836713604629039764404296875e-8 -#define PI4_C .306161699786838294306516483068750264552437361480769e-16 -#define M_4_PI 1.273239544735162542821171882678754627704620361328125 - -#define L2U .69314718055966295651160180568695068359375 -#define L2L .28235290563031577122588448175013436025525412068e-12 -#define R_LN2 1.442695040888963407359924681001892137426645954152985934135449406931 -#define pow_F(a,b) (xexpf(b*xlogf(a))) - -__inline int64_t doubleToRawLongBits(double d) { - union { - double f; - int64_t i; - } tmp; - tmp.f = d; - return tmp.i; -} - -__inline double longBitsToDouble(int64_t i) { - union { - double f; - int64_t i; - } tmp; - tmp.i = i; - return tmp.f; -} - -__inline double xfabs(double x) { - return longBitsToDouble(0x7fffffffffffffffLL & doubleToRawLongBits(x)); -} - -__inline double mulsign(double x, double y) { - return longBitsToDouble(doubleToRawLongBits(x) ^ (doubleToRawLongBits(y) & (1LL << 63))); -} - -__inline double sign(double d) { return mulsign(1, d); } -__inline double mla(double x, double y, double z) { return x * y + z; } -__inline double xrint(double x) { return x < 0 ? (int)(x - 0.5) : (int)(x + 0.5); } - -__inline int xisnan(double x) { return x != x; } -__inline int xisinf(double x) { return x == rtengine::RT_INFINITY || x == -rtengine::RT_INFINITY; } -__inline int xisminf(double x) { return x == -rtengine::RT_INFINITY; } -__inline int xispinf(double x) { return x == rtengine::RT_INFINITY; } - -__inline double ldexpk(double x, int q) { - double u; - int m; - m = q >> 31; - m = (((m + q) >> 9) - m) << 7; - q = q - (m << 2); - u = longBitsToDouble(((int64_t)(m + 0x3ff)) << 52); - double u2 = u*u; - u2 = u2 * u2; - x = x * u2; - u = longBitsToDouble(((int64_t)(q + 0x3ff)) << 52); - return x * u; -} - -__inline double xldexp(double x, int q) { return ldexpk(x, q); } - -__inline int ilogbp1(double d) { - int m = d < 4.9090934652977266E-91; - d = m ? 2.037035976334486E90 * d : d; - int q = (doubleToRawLongBits(d) >> 52) & 0x7ff; - q = m ? q - (300 + 0x03fe) : q - 0x03fe; - return q; -} - -__inline int xilogb(double d) { - int e = ilogbp1(xfabs(d)) - 1; - e = d == 0 ? (-2147483647 - 1) : e; - e = d == rtengine::RT_INFINITY || d == -rtengine::RT_INFINITY ? 2147483647 : e; - return e; -} - -__inline double upper(double d) { - return longBitsToDouble(doubleToRawLongBits(d) & 0xfffffffff8000000LL); -} - -typedef struct { - double x, y; -} double2; - -typedef struct { - float x, y; -} float2; - -__inline double2 dd(double h, double l) { - double2 ret; - ret.x = h; ret.y = l; - return ret; -} - -__inline double2 normalize_d(double2 t) { - double2 s; - - s.x = t.x + t.y; - s.y = t.x - s.x + t.y; - - return s; -} - -__inline double2 scale_d(double2 d, double s) { - double2 r; - - r.x = d.x * s; - r.y = d.y * s; - - return r; -} - -__inline double2 add2_ss(double x, double y) { - double2 r; - - r.x = x + y; - double v = r.x - x; - r.y = (x - (r.x - v)) + (y - v); - - return r; -} - -__inline double2 add_ds(double2 x, double y) { - // |x| >= |y| - - double2 r; - - assert(xisnan(x.x) || xisnan(y) || xfabs(x.x) >= xfabs(y)); - - r.x = x.x + y; - r.y = x.x - r.x + y + x.y; - - return r; -} - -__inline double2 add2_ds(double2 x, double y) { - // |x| >= |y| - - double2 r; - - r.x = x.x + y; - double v = r.x - x.x; - r.y = (x.x - (r.x - v)) + (y - v); - r.y += x.y; - - return r; -} - -__inline double2 add_sd(double x, double2 y) { - // |x| >= |y| - - double2 r; - - assert(xisnan(x) || xisnan(y.x) || xfabs(x) >= xfabs(y.x)); - - r.x = x + y.x; - r.y = x - r.x + y.x + y.y; - - return r; -} - -__inline double2 add_dd(double2 x, double2 y) { - // |x| >= |y| - - double2 r; - - assert(xisnan(x.x) || xisnan(y.x) || xfabs(x.x) >= xfabs(y.x)); - - r.x = x.x + y.x; - r.y = x.x - r.x + y.x + x.y + y.y; - - return r; -} - -__inline double2 add2_dd(double2 x, double2 y) { - double2 r; - - r.x = x.x + y.x; - double v = r.x - x.x; - r.y = (x.x - (r.x - v)) + (y.x - v); - r.y += x.y + y.y; - - return r; -} - -__inline double2 div_dd(double2 n, double2 d) { - double t = 1.0 / d.x; - double dh = upper(d.x), dl = d.x - dh; - double th = upper(t ), tl = t - th; - double nhh = upper(n.x), nhl = n.x - nhh; - - double2 q; - - q.x = n.x * t; - - double u = -q.x + nhh * th + nhh * tl + nhl * th + nhl * tl + - q.x * (1 - dh * th - dh * tl - dl * th - dl * tl); - - q.y = t * (n.y - q.x * d.y) + u; - - return q; -} - -__inline double2 mul_ss(double x, double y) { - double xh = upper(x), xl = x - xh; - double yh = upper(y), yl = y - yh; - double2 r; - - r.x = x * y; - r.y = xh * yh - r.x + xl * yh + xh * yl + xl * yl; - - return r; -} - -__inline double2 mul_ds(double2 x, double y) { - double xh = upper(x.x), xl = x.x - xh; - double yh = upper(y ), yl = y - yh; - double2 r; - - r.x = x.x * y; - r.y = xh * yh - r.x + xl * yh + xh * yl + xl * yl + x.y * y; - - return r; -} - -__inline double2 mul_dd(double2 x, double2 y) { - double xh = upper(x.x), xl = x.x - xh; - double yh = upper(y.x), yl = y.x - yh; - double2 r; - - r.x = x.x * y.x; - r.y = xh * yh - r.x + xl * yh + xh * yl + xl * yl + x.x * y.y + x.y * y.x; - - return r; -} - -__inline double2 squ_d(double2 x) { - double xh = upper(x.x), xl = x.x - xh; - double2 r; - - r.x = x.x * x.x; - r.y = xh * xh - r.x + (xh + xh) * xl + xl * xl + x.x * (x.y + x.y); - - return r; -} - -__inline double2 rec_s(double d) { - double t = 1.0 / d; - double dh = upper(d), dl = d - dh; - double th = upper(t), tl = t - th; - double2 q; - - q.x = t; - q.y = t * (1 - dh * th - dh * tl - dl * th - dl * tl); - - return q; -} - -__inline double2 sqrt_d(double2 d) { - double t = sqrt(d.x + d.y); - return scale_d(mul_dd(add2_dd(d, mul_ss(t, t)), rec_s(t)), 0.5); -} - -__inline double atan2k(double y, double x) { - double s, t, u; - int q = 0; - - if (x < 0) { x = -x; q = -2; } - if (y > x) { t = x; x = y; y = -t; q += 1; } - - s = y / x; - t = s * s; - - u = -1.88796008463073496563746e-05; - u = u * t + (0.000209850076645816976906797); - u = u * t + (-0.00110611831486672482563471); - u = u * t + (0.00370026744188713119232403); - u = u * t + (-0.00889896195887655491740809); - u = u * t + (0.016599329773529201970117); - u = u * t + (-0.0254517624932312641616861); - u = u * t + (0.0337852580001353069993897); - u = u * t + (-0.0407629191276836500001934); - u = u * t + (0.0466667150077840625632675); - u = u * t + (-0.0523674852303482457616113); - u = u * t + (0.0587666392926673580854313); - u = u * t + (-0.0666573579361080525984562); - u = u * t + (0.0769219538311769618355029); - u = u * t + (-0.090908995008245008229153); - u = u * t + (0.111111105648261418443745); - u = u * t + (-0.14285714266771329383765); - u = u * t + (0.199999999996591265594148); - u = u * t + (-0.333333333333311110369124); - - t = u * t * s + s; - t = q * (rtengine::RT_PI_2) + t; - - return t; -} - -__inline double xatan2(double y, double x) { - double r = atan2k(xfabs(y), x); - - r = mulsign(r, x); - if (xisinf(x) || x == 0) r = rtengine::RT_PI_2 - (xisinf(x) ? (sign(x) * (rtengine::RT_PI_2)) : 0); - if (xisinf(y) ) r = rtengine::RT_PI_2 - (xisinf(x) ? (sign(x) * (rtengine::RT_PI*1/4)) : 0); - if ( y == 0) r = (sign(x) == -1 ? rtengine::RT_PI : 0); - - return xisnan(x) || xisnan(y) ? rtengine::RT_NAN : mulsign(r, y); -} - -__inline double xasin(double d) { - return mulsign(atan2k(xfabs(d), sqrt((1+d)*(1-d))), d); -} - -__inline double xacos(double d) { - return mulsign(atan2k(sqrt((1+d)*(1-d)), xfabs(d)), d) + (d < 0 ? rtengine::RT_PI : 0); -} - -__inline double xatan(double s) { - double t, u; - int q = 0; - - if (s < 0) { s = -s; q = 2; } - if (s > 1) { s = 1.0 / s; q |= 1; } - - t = s * s; - - u = -1.88796008463073496563746e-05; - u = u * t + (0.000209850076645816976906797); - u = u * t + (-0.00110611831486672482563471); - u = u * t + (0.00370026744188713119232403); - u = u * t + (-0.00889896195887655491740809); - u = u * t + (0.016599329773529201970117); - u = u * t + (-0.0254517624932312641616861); - u = u * t + (0.0337852580001353069993897); - u = u * t + (-0.0407629191276836500001934); - u = u * t + (0.0466667150077840625632675); - u = u * t + (-0.0523674852303482457616113); - u = u * t + (0.0587666392926673580854313); - u = u * t + (-0.0666573579361080525984562); - u = u * t + (0.0769219538311769618355029); - u = u * t + (-0.090908995008245008229153); - u = u * t + (0.111111105648261418443745); - u = u * t + (-0.14285714266771329383765); - u = u * t + (0.199999999996591265594148); - u = u * t + (-0.333333333333311110369124); - - t = s + s * (t * u); - - if ((q & 1) != 0) t = 1.570796326794896557998982 - t; - if ((q & 2) != 0) t = -t; - - return t; -} - -__inline double xsin(double d) { - int q; - double u, s; - - q = (int)xrint(d * rtengine::RT_1_PI); - - d = mla(q, -PI4_A*4, d); - d = mla(q, -PI4_B*4, d); - d = mla(q, -PI4_C*4, d); - - s = d * d; - - if ((q & 1) != 0) d = -d; - - u = -7.97255955009037868891952e-18; - u = mla(u, s, 2.81009972710863200091251e-15); - u = mla(u, s, -7.64712219118158833288484e-13); - u = mla(u, s, 1.60590430605664501629054e-10); - u = mla(u, s, -2.50521083763502045810755e-08); - u = mla(u, s, 2.75573192239198747630416e-06); - u = mla(u, s, -0.000198412698412696162806809); - u = mla(u, s, 0.00833333333333332974823815); - u = mla(u, s, -0.166666666666666657414808); - - u = mla(s, u * d, d); - - return u; -} - -__inline double xcos(double d) { - int q; - double u, s; - - q = 1 + 2*(int)xrint(d * rtengine::RT_1_PI - 0.5); - - d = mla(q, -PI4_A*2, d); - d = mla(q, -PI4_B*2, d); - d = mla(q, -PI4_C*2, d); - - s = d * d; - - if ((q & 2) == 0) d = -d; - - u = -7.97255955009037868891952e-18; - u = mla(u, s, 2.81009972710863200091251e-15); - u = mla(u, s, -7.64712219118158833288484e-13); - u = mla(u, s, 1.60590430605664501629054e-10); - u = mla(u, s, -2.50521083763502045810755e-08); - u = mla(u, s, 2.75573192239198747630416e-06); - u = mla(u, s, -0.000198412698412696162806809); - u = mla(u, s, 0.00833333333333332974823815); - u = mla(u, s, -0.166666666666666657414808); - - u = mla(s, u * d, d); - - return u; -} - -__inline double2 xsincos(double d) { - int q; - double u, s, t; - double2 r; - - q = (int)xrint(d * (2 * rtengine::RT_1_PI)); - - s = d; - - s = mla(-q, PI4_A*2, s); - s = mla(-q, PI4_B*2, s); - s = mla(-q, PI4_C*2, s); - - t = s; - - s = s * s; - - u = 1.58938307283228937328511e-10; - u = mla(u, s, -2.50506943502539773349318e-08); - u = mla(u, s, 2.75573131776846360512547e-06); - u = mla(u, s, -0.000198412698278911770864914); - u = mla(u, s, 0.0083333333333191845961746); - u = mla(u, s, -0.166666666666666130709393); - u = u * s * t; - - r.x = t + u; - - u = -1.13615350239097429531523e-11; - u = mla(u, s, 2.08757471207040055479366e-09); - u = mla(u, s, -2.75573144028847567498567e-07); - u = mla(u, s, 2.48015872890001867311915e-05); - u = mla(u, s, -0.00138888888888714019282329); - u = mla(u, s, 0.0416666666666665519592062); - u = mla(u, s, -0.5); - - r.y = u * s + 1; - - if ((q & 1) != 0) { s = r.y; r.y = r.x; r.x = s; } - if ((q & 2) != 0) { r.x = -r.x; } - if (((q+1) & 2) != 0) { r.y = -r.y; } - - if (xisinf(d)) { r.x = r.y = rtengine::RT_NAN; } - - return r; -} - -__inline double xtan(double d) { - int q; - double u, s, x; - - q = (int)xrint(d * (2 * rtengine::RT_1_PI)); - - x = mla(q, -PI4_A*2, d); - x = mla(q, -PI4_B*2, x); - x = mla(q, -PI4_C*2, x); - - s = x * x; - - if ((q & 1) != 0) x = -x; - - u = 1.01419718511083373224408e-05; - u = mla(u, s, -2.59519791585924697698614e-05); - u = mla(u, s, 5.23388081915899855325186e-05); - u = mla(u, s, -3.05033014433946488225616e-05); - u = mla(u, s, 7.14707504084242744267497e-05); - u = mla(u, s, 8.09674518280159187045078e-05); - u = mla(u, s, 0.000244884931879331847054404); - u = mla(u, s, 0.000588505168743587154904506); - u = mla(u, s, 0.00145612788922812427978848); - u = mla(u, s, 0.00359208743836906619142924); - u = mla(u, s, 0.00886323944362401618113356); - u = mla(u, s, 0.0218694882853846389592078); - u = mla(u, s, 0.0539682539781298417636002); - u = mla(u, s, 0.133333333333125941821962); - u = mla(u, s, 0.333333333333334980164153); - - u = mla(s, u * x, x); - - if ((q & 1) != 0) u = 1.0 / u; - - if (xisinf(d)) u = rtengine::RT_NAN; - - return u; -} - -__inline double xlog(double d) { - double x, x2, t, m; - int e; - - e = ilogbp1(d * 0.7071); - m = ldexpk(d, -e); - - x = (m-1) / (m+1); - x2 = x * x; - - t = 0.148197055177935105296783; - t = mla(t, x2, 0.153108178020442575739679); - t = mla(t, x2, 0.181837339521549679055568); - t = mla(t, x2, 0.22222194152736701733275); - t = mla(t, x2, 0.285714288030134544449368); - t = mla(t, x2, 0.399999999989941956712869); - t = mla(t, x2, 0.666666666666685503450651); - t = mla(t, x2, 2); - - x = x * t + 0.693147180559945286226764 * e; - - if (xisinf(d)) x = rtengine::RT_INFINITY; - if (d < 0) x = rtengine::RT_NAN; - if (d == 0) x = -rtengine::RT_INFINITY; - - return x; -} - -__inline double xexp(double d) { - int q = (int)xrint(d * R_LN2); - double s, u; - - s = mla(q, -L2U, d); - s = mla(q, -L2L, s); - - u = 2.08860621107283687536341e-09; - u = mla(u, s, 2.51112930892876518610661e-08); - u = mla(u, s, 2.75573911234900471893338e-07); - u = mla(u, s, 2.75572362911928827629423e-06); - u = mla(u, s, 2.4801587159235472998791e-05); - u = mla(u, s, 0.000198412698960509205564975); - u = mla(u, s, 0.00138888888889774492207962); - u = mla(u, s, 0.00833333333331652721664984); - u = mla(u, s, 0.0416666666666665047591422); - u = mla(u, s, 0.166666666666666851703837); - u = mla(u, s, 0.5); - - u = s * s * u + s + 1; - u = ldexpk(u, q); - - if (xisminf(d)) u = 0; - - return u; -} - -__inline double2 logk(double d) { - double2 x, x2; - double m, t; - int e; - - e = ilogbp1(d * 0.7071); - m = ldexpk(d, -e); - - x = div_dd(add2_ss(-1, m), add2_ss(1, m)); - x2 = squ_d(x); - - t = 0.134601987501262130076155; - t = mla(t, x2.x, 0.132248509032032670243288); - t = mla(t, x2.x, 0.153883458318096079652524); - t = mla(t, x2.x, 0.181817427573705403298686); - t = mla(t, x2.x, 0.222222231326187414840781); - t = mla(t, x2.x, 0.285714285651261412873718); - t = mla(t, x2.x, 0.400000000000222439910458); - t = mla(t, x2.x, 0.666666666666666371239645); - - return add2_dd(mul_ds(dd(0.693147180559945286226764, 2.319046813846299558417771e-17), e), - add2_dd(scale_d(x, 2), mul_ds(mul_dd(x2, x), t))); -} - -__inline double expk(double2 d) { - int q = (int)rint((d.x + d.y) * R_LN2); - double2 s, t; - double u; - - s = add2_ds(d, q * -L2U); - s = add2_ds(s, q * -L2L); - - s = normalize_d(s); - - u = 2.51069683420950419527139e-08; - u = mla(u, s.x, 2.76286166770270649116855e-07); - u = mla(u, s.x, 2.75572496725023574143864e-06); - u = mla(u, s.x, 2.48014973989819794114153e-05); - u = mla(u, s.x, 0.000198412698809069797676111); - u = mla(u, s.x, 0.0013888888939977128960529); - u = mla(u, s.x, 0.00833333333332371417601081); - u = mla(u, s.x, 0.0416666666665409524128449); - u = mla(u, s.x, 0.166666666666666740681535); - u = mla(u, s.x, 0.500000000000000999200722); - - t = add_dd(s, mul_ds(squ_d(s), u)); - - t = add_sd(1, t); - return ldexpk(t.x + t.y, q); -} - -__inline double xpow(double x, double y) { - int yisint = (int)y == y; - int yisodd = (1 & (int)y) != 0 && yisint; - - double result = expk(mul_ds(logk(xfabs(x)), y)); - - result = xisnan(result) ? rtengine::RT_INFINITY : result; - result *= (x >= 0 ? 1 : (!yisint ? rtengine::RT_NAN : (yisodd ? -1 : 1))); - - double efx = mulsign(xfabs(x) - 1, y); - if (xisinf(y)) result = efx < 0 ? 0.0 : (efx == 0 ? 1.0 : rtengine::RT_INFINITY); - if (xisinf(x) || x == 0) result = (yisodd ? sign(x) : 1) * ((x == 0 ? -y : y) < 0 ? 0 : rtengine::RT_INFINITY); - if (xisnan(x) || xisnan(y)) result = rtengine::RT_NAN; - if (y == 0 || x == 1) result = 1; - - return result; -} - -__inline double2 expk2(double2 d) { - int q = (int)rint((d.x + d.y) * R_LN2); - double2 s, t; - double u; - - s = add2_ds(d, q * -L2U); - s = add2_ds(s, q * -L2L); - - s = normalize_d(s); - - u = 2.51069683420950419527139e-08; - u = mla(u, s.x, 2.76286166770270649116855e-07); - u = mla(u, s.x, 2.75572496725023574143864e-06); - u = mla(u, s.x, 2.48014973989819794114153e-05); - u = mla(u, s.x, 0.000198412698809069797676111); - u = mla(u, s.x, 0.0013888888939977128960529); - u = mla(u, s.x, 0.00833333333332371417601081); - u = mla(u, s.x, 0.0416666666665409524128449); - u = mla(u, s.x, 0.166666666666666740681535); - u = mla(u, s.x, 0.500000000000000999200722); - - t = add_dd(s, mul_ds(squ_d(s), u)); - - t = add_sd(1, t); - return dd(ldexpk(t.x, q), ldexpk(t.y, q)); -} - -__inline double xsinh(double x) { - double y = xfabs(x); - double2 d = expk2(dd(y, 0)); - d = add2_dd(d, div_dd(dd(-1, 0), d)); - y = (d.x + d.y) * 0.5; - - y = xisinf(x) || xisnan(y) ? rtengine::RT_INFINITY : y; - y = mulsign(y, x); - y = xisnan(x) ? rtengine::RT_NAN : y; - - return y; -} - -__inline double xcosh(double x) { - double2 d = expk2(dd(x, 0)); - d = add2_dd(d, div_dd(dd(1, 0), d)); - double y = (d.x + d.y) * 0.5; - - y = xisinf(x) || xisnan(y) ? rtengine::RT_INFINITY : y; - y = xisnan(x) ? rtengine::RT_NAN : y; - - return y; -} - -__inline double xtanh(double x) { - double y = xfabs(x); - double2 d = expk2(dd(y, 0)); - double2 e = div_dd(dd(1, 0), d); - d = div_dd(add2_dd(d, scale_d(e, -1)), add2_dd(d, e)); - y = d.x + d.y; - - y = xisinf(x) || xisnan(y) ? 1.0 : y; - y = mulsign(y, x); - y = xisnan(x) ? rtengine::RT_NAN : y; - - return y; -} - -__inline double2 logk2(double2 d) { - double2 x, x2, m; - double t; - int e; - - d = normalize_d(d); - e = ilogbp1(d.x * 0.7071); - m = scale_d(d, ldexpk(1, -e)); - - x = div_dd(add2_ds(m, -1), add2_ds(m, 1)); - x2 = squ_d(x); - - t = 0.134601987501262130076155; - t = mla(t, x2.x, 0.132248509032032670243288); - t = mla(t, x2.x, 0.153883458318096079652524); - t = mla(t, x2.x, 0.181817427573705403298686); - t = mla(t, x2.x, 0.222222231326187414840781); - t = mla(t, x2.x, 0.285714285651261412873718); - t = mla(t, x2.x, 0.400000000000222439910458); - t = mla(t, x2.x, 0.666666666666666371239645); - - return add2_dd(mul_ds(dd(0.693147180559945286226764, 2.319046813846299558417771e-17), e), - add2_dd(scale_d(x, 2), mul_ds(mul_dd(x2, x), t))); -} - -__inline double xasinh(double x) { - double y = xfabs(x); - double2 d = logk2(add2_ds(sqrt_d(add2_ds(mul_ss(y, y), 1)), y)); - y = d.x + d.y; - - y = xisinf(x) || xisnan(y) ? rtengine::RT_INFINITY : y; - y = mulsign(y, x); - y = xisnan(x) ? rtengine::RT_NAN : y; - - return y; -} - -__inline double xacosh(double x) { - double2 d = logk2(add2_ds(sqrt_d(add2_ds(mul_ss(x, x), -1)), x)); - double y = d.x + d.y; - - y = xisinf(x) || xisnan(y) ? rtengine::RT_INFINITY : y; - y = x == 1.0 ? 0.0 : y; - y = x < 1.0 ? rtengine::RT_NAN : y; - y = xisnan(x) ? rtengine::RT_NAN : y; - - return y; -} - -__inline double xatanh(double x) { - double y = xfabs(x); - double2 d = logk2(div_dd(add2_ss(1, y), add2_ss(1, -y))); - y = y > 1.0 ? rtengine::RT_NAN : (y == 1.0 ? rtengine::RT_INFINITY : (d.x + d.y) * 0.5); - - y = xisinf(x) || xisnan(y) ? rtengine::RT_NAN : y; - y = mulsign(y, x); - y = xisnan(x) ? rtengine::RT_NAN : y; - - return y; -} - -// - -__inline double xfma(double x, double y, double z) { - union { - double f; - long long int i; - } tmp; - - tmp.f = x; - tmp.i = (tmp.i + 0x4000000) & 0xfffffffff8000000LL; - double xh = tmp.f, xl = x - xh; - - tmp.f = y; - tmp.i = (tmp.i + 0x4000000) & 0xfffffffff8000000LL; - double yh = tmp.f, yl = y - yh; - - double h = x * y; - double l = xh * yh - h + xl * yh + xh * yl + xl * yl; - - double h2, l2, v; - - h2 = h + z; - v = h2 - h; - l2 = (h - (h2 - v)) + (z - v) + l; - - return h2 + l2; -} - -__inline double xsqrt(double d) { // max error : 0.5 ulp - double q = 1; - - if (d < 8.636168555094445E-78) { - d *= 1.157920892373162E77; - q = 2.9387358770557188E-39; - } - - // http://en.wikipedia.org/wiki/Fast_inverse_square_root - double x = longBitsToDouble(0x5fe6ec85e7de30da - (doubleToRawLongBits(d + 1e-320) >> 1)); - - x = x * (1.5 - 0.5 * d * x * x); - x = x * (1.5 - 0.5 * d * x * x); - x = x * (1.5 - 0.5 * d * x * x); - - // You can change xfma to fma if fma is correctly implemented - x = xfma(d * x, d * x, -d) * (x * -0.5) + d * x; - - return d == rtengine::RT_INFINITY ? rtengine::RT_INFINITY : x * q; -} - -__inline double xcbrt(double d) { // max error : 2 ulps - double x, y, q = 1.0; - int e, r; - - e = ilogbp1(d); - d = ldexpk(d, -e); - r = (e + 6144) % 3; - q = (r == 1) ? 1.2599210498948731647672106 : q; - q = (r == 2) ? 1.5874010519681994747517056 : q; - q = ldexpk(q, (e + 6144) / 3 - 2048); - - q = mulsign(q, d); - d = xfabs(d); - - x = -0.640245898480692909870982; - x = x * d + 2.96155103020039511818595; - x = x * d + -5.73353060922947843636166; - x = x * d + 6.03990368989458747961407; - x = x * d + -3.85841935510444988821632; - x = x * d + 2.2307275302496609725722; - - y = x * x; y = y * y; x -= (d * y - x) * (1.0 / 3.0); - y = d * x * x; - y = (y - (2.0 / 3.0) * y * (y * x - 1)) * q; - - return y; -} - -__inline double xexp2(double a) { - double u = expk(mul_ds(dd(0.69314718055994528623, 2.3190468138462995584e-17), a)); - if (xispinf(a)) u = rtengine::RT_INFINITY; - if (xisminf(a)) u = 0; - return u; -} - -__inline double xexp10(double a) { - double u = expk(mul_ds(dd(2.3025850929940459011, -2.1707562233822493508e-16), a)); - if (xispinf(a)) u = rtengine::RT_INFINITY; - if (xisminf(a)) u = 0; - return u; -} - -__inline double xexpm1(double a) { - double2 d = add2_ds(expk2(dd(a, 0)), -1.0); - double x = d.x + d.y; - if (xispinf(a)) x = rtengine::RT_INFINITY; - if (xisminf(a)) x = -1; - return x; -} - -__inline double xlog10(double a) { - double2 d = mul_dd(logk(a), dd(0.43429448190325176116, 6.6494347733425473126e-17)); - double x = d.x + d.y; - - if (xisinf(a)) x = rtengine::RT_INFINITY; - if (a < 0) x = rtengine::RT_NAN; - if (a == 0) x = -rtengine::RT_INFINITY; - - return x; -} - -__inline double xlog1p(double a) { - double2 d = logk2(add2_ss(a, 1)); - double x = d.x + d.y; - - if (xisinf(a)) x = rtengine::RT_INFINITY; - if (a < -1) x = rtengine::RT_NAN; - if (a == -1) x = -rtengine::RT_INFINITY; - - return x; -} - -/////////////////////////////////////////// - -#define PI4_Af 0.78515625f -#define PI4_Bf 0.00024127960205078125f -#define PI4_Cf 6.3329935073852539062e-07f -#define PI4_Df 4.9604681473525147339e-10f - -#define L2Uf 0.693145751953125f -#define L2Lf 1.428606765330187045e-06f - -#define R_LN2f 1.442695040888963407359924681001892137426645954152985934135449406931f - -__inline int32_t floatToRawIntBits(float d) { - union { - float f; - int32_t i; - } tmp; - tmp.f = d; - return tmp.i; -} - -__inline float intBitsToFloat(int32_t i) { - union { - float f; - int32_t i; - } tmp; - tmp.i = i; - return tmp.f; -} - -__inline float xfabsf(float x) { - return intBitsToFloat(0x7fffffffL & floatToRawIntBits(x)); -} - -__inline float mulsignf(float x, float y) { - return intBitsToFloat(floatToRawIntBits(x) ^ (floatToRawIntBits(y) & (1 << 31))); -} - -__inline float signf(float d) { return copysign(1, d); } -__inline float mlaf(float x, float y, float z) { return x * y + z; } - -__inline int xisnanf(float x) { return x != x; } -__inline int xisinff(float x) { return x == rtengine::RT_INFINITY_F || x == -rtengine::RT_INFINITY_F; } -__inline int xisminff(float x) { return x == -rtengine::RT_INFINITY_F; } -__inline int xispinff(float x) { return x == rtengine::RT_INFINITY_F; } - -__inline int ilogbp1f(float d) { - int m = d < 5.421010862427522E-20f; - d = m ? 1.8446744073709552E19f * d : d; - int q = (floatToRawIntBits(d) >> 23) & 0xff; - q = m ? q - (64 + 0x7e) : q - 0x7e; - return q; -} - -__inline float ldexpkf(float x, int q) { - float u; - int m; - m = q >> 31; - m = (((m + q) >> 6) - m) << 4; - q = q - (m << 2); - u = intBitsToFloat(((int32_t)(m + 0x7f)) << 23); - u = u * u; - x = x * u * u; - u = intBitsToFloat(((int32_t)(q + 0x7f)) << 23); - return x * u; -} - -__inline float xcbrtf(float d) { // max error : 2 ulps - float x, y, q = 1.0f; - int e, r; - - e = ilogbp1f(d); - d = ldexpkf(d, -e); - r = (e + 6144) % 3; - q = (r == 1) ? 1.2599210498948731647672106f : q; - q = (r == 2) ? 1.5874010519681994747517056f : q; - q = ldexpkf(q, (e + 6144) / 3 - 2048); - - q = mulsignf(q, d); - d = xfabsf(d); - - x = -0.601564466953277587890625f; - x = mlaf(x, d, 2.8208892345428466796875f); - x = mlaf(x, d, -5.532182216644287109375f); - x = mlaf(x, d, 5.898262500762939453125f); - x = mlaf(x, d, -3.8095417022705078125f); - x = mlaf(x, d, 2.2241256237030029296875f); - - y = d * x * x; - y = (y - (2.0f / 3.0f) * y * (y * x - 1.0f)) * q; - - return y; -} - -__inline float xsinf(float d) { - int q; - float u, s; - - q = rint(d * rtengine::RT_1_PI_F); - - d = mlaf(q, -PI4_Af*4, d); - d = mlaf(q, -PI4_Bf*4, d); - d = mlaf(q, -PI4_Cf*4, d); - d = mlaf(q, -PI4_Df*4, d); - - s = d * d; - - if ((q & 1) != 0) d = -d; - - u = 2.6083159809786593541503e-06f; - u = mlaf(u, s, -0.0001981069071916863322258f); - u = mlaf(u, s, 0.00833307858556509017944336f); - u = mlaf(u, s, -0.166666597127914428710938f); - - u = mlaf(s, u * d, d); - - return u; -} - -__inline float xcosf(float d) { -#ifdef __SSE2__ - // faster than scalar version - return xcosf(_mm_set_ss(d))[0]; -#else - int q; - float u, s; - - q = 1 + 2*rint(d * rtengine::RT_1_PI_F - 0.5f); - - d = mlaf(q, -PI4_Af*2, d); - d = mlaf(q, -PI4_Bf*2, d); - d = mlaf(q, -PI4_Cf*2, d); - d = mlaf(q, -PI4_Df*2, d); - - s = d * d; - - if ((q & 2) == 0) d = -d; - - u = 2.6083159809786593541503e-06f; - u = mlaf(u, s, -0.0001981069071916863322258f); - u = mlaf(u, s, 0.00833307858556509017944336f); - u = mlaf(u, s, -0.166666597127914428710938f); - - u = mlaf(s, u * d, d); - - return u; -#endif -} - -__inline float2 xsincosf(float d) { -#ifdef __SSE2__ - // faster than scalar version - vfloat2 res = xsincosf(_mm_set_ss(d)); - return {res.x[0], res.y[0]}; -#else - int q; - float u, s, t; - float2 r; - - q = rint(d * rtengine::RT_2_PI_F); - - s = d; - - s = mlaf(q, -PI4_Af*2, s); - s = mlaf(q, -PI4_Bf*2, s); - s = mlaf(q, -PI4_Cf*2, s); - s = mlaf(q, -PI4_Df*2, s); - - t = s; - - s = s * s; - - u = -0.000195169282960705459117889f; - u = mlaf(u, s, 0.00833215750753879547119141f); - u = mlaf(u, s, -0.166666537523269653320312f); - u = u * s * t; - - r.x = t + u; - - u = -2.71811842367242206819355e-07f; - u = mlaf(u, s, 2.47990446951007470488548e-05f); - u = mlaf(u, s, -0.00138888787478208541870117f); - u = mlaf(u, s, 0.0416666641831398010253906f); - u = mlaf(u, s, -0.5f); - - r.y = u * s + 1; - - if ((q & 1) != 0) { s = r.y; r.y = r.x; r.x = s; } - if ((q & 2) != 0) { r.x = -r.x; } - if (((q+1) & 2) != 0) { r.y = -r.y; } - - if (xisinff(d)) { r.x = r.y = rtengine::RT_NAN_F; } - - return r; -#endif -} - -__inline float xtanf(float d) { - int q; - float u, s, x; - - q = rint(d * (float)(2 * rtengine::RT_1_PI)); - - x = d; - - x = mlaf(q, -PI4_Af*2, x); - x = mlaf(q, -PI4_Bf*2, x); - x = mlaf(q, -PI4_Cf*2, x); - x = mlaf(q, -PI4_Df*2, x); - - s = x * x; - - if ((q & 1) != 0) x = -x; - - u = 0.00927245803177356719970703f; - u = mlaf(u, s, 0.00331984995864331722259521f); - u = mlaf(u, s, 0.0242998078465461730957031f); - u = mlaf(u, s, 0.0534495301544666290283203f); - u = mlaf(u, s, 0.133383005857467651367188f); - u = mlaf(u, s, 0.333331853151321411132812f); - - u = mlaf(s, u * x, x); - - if ((q & 1) != 0) u = 1.0f / u; - - if (xisinff(d)) u = rtengine::RT_NAN_F; - - return u; -} - -__inline float xatanf(float s) { - float t, u; - int q = 0; - - if (s < 0) { s = -s; q = 2; } - if (s > 1) { s = 1.0f / s; q |= 1; } - - t = s * s; - - u = 0.00282363896258175373077393f; - u = mlaf(u, t, -0.0159569028764963150024414f); - u = mlaf(u, t, 0.0425049886107444763183594f); - u = mlaf(u, t, -0.0748900920152664184570312f); - u = mlaf(u, t, 0.106347933411598205566406f); - u = mlaf(u, t, -0.142027363181114196777344f); - u = mlaf(u, t, 0.199926957488059997558594f); - u = mlaf(u, t, -0.333331018686294555664062f); - - t = s + s * (t * u); - - if ((q & 1) != 0) t = 1.570796326794896557998982f - t; - if ((q & 2) != 0) t = -t; - - return t; -} - -__inline float atan2kf(float y, float x) { - float s, t, u; - float q = 0.f; - - if (x < 0) { x = -x; q = -2.f; } - if (y > x) { t = x; x = y; y = -t; q += 1.f; } - - s = y / x; - t = s * s; - - u = 0.00282363896258175373077393f; - u = mlaf(u, t, -0.0159569028764963150024414f); - u = mlaf(u, t, 0.0425049886107444763183594f); - u = mlaf(u, t, -0.0748900920152664184570312f); - u = mlaf(u, t, 0.106347933411598205566406f); - u = mlaf(u, t, -0.142027363181114196777344f); - u = mlaf(u, t, 0.199926957488059997558594f); - u = mlaf(u, t, -0.333331018686294555664062f); - - t = u * t; - t = mlaf(t,s,s); - return mlaf(q,(float)(rtengine::RT_PI_F_2),t); -} - -__inline float xatan2f(float y, float x) { - float r = atan2kf(xfabsf(y), x); - - r = mulsignf(r, x); - if (xisinff(x) || x == 0) r = rtengine::RT_PI_F/2 - (xisinff(x) ? (signf(x) * (float)(rtengine::RT_PI_F*.5f)) : 0); - if (xisinff(y) ) r = rtengine::RT_PI_F/2 - (xisinff(x) ? (signf(x) * (float)(rtengine::RT_PI_F*.25f)) : 0); - if ( y == 0) r = (signf(x) == -1 ? rtengine::RT_PI_F : 0); - - return xisnanf(x) || xisnanf(y) ? rtengine::RT_NAN_F : mulsignf(r, y); -} - -__inline float xasinf(float d) { - return mulsignf(atan2kf(fabsf(d), sqrtf((1.0f+d)*(1.0f-d))), d); -} - -__inline float xacosf(float d) { - return mulsignf(atan2kf(sqrtf((1.0f+d)*(1.0f-d)), fabsf(d)), d) + (d < 0 ? (float)rtengine::RT_PI : 0.0f); -} - -__inline float xlogf(float d) { - float x, x2, t, m; - int e; - - e = ilogbp1f(d * 0.7071f); - m = ldexpkf(d, -e); - - x = (m-1.0f) / (m+1.0f); - x2 = x * x; - - t = 0.2371599674224853515625f; - t = mlaf(t, x2, 0.285279005765914916992188f); - t = mlaf(t, x2, 0.400005519390106201171875f); - t = mlaf(t, x2, 0.666666567325592041015625f); - t = mlaf(t, x2, 2.0f); - - x = x * t + 0.693147180559945286226764f * e; - - if (xisinff(d)) x = rtengine::RT_INFINITY_F; - if (d < 0) x = rtengine::RT_NAN_F; - if (d == 0) x = -rtengine::RT_INFINITY_F; - - return x; -} - -__inline float xexpf(float d) { - if(d<=-104.0f) return 0.0f; - - int q = rint(d * R_LN2f); - float s, u; - - s = mlaf(q, -L2Uf, d); - s = mlaf(q, -L2Lf, s); - - u = 0.00136324646882712841033936f; - u = mlaf(u, s, 0.00836596917361021041870117f); - u = mlaf(u, s, 0.0416710823774337768554688f); - u = mlaf(u, s, 0.166665524244308471679688f); - u = mlaf(u, s, 0.499999850988388061523438f); - - u = mlaf( s, mlaf(s,u,1.f),1.f); - return ldexpkf(u, q); - -} - -__inline float xmul2f(float d) { - union { - float floatval; - int intval; - } uflint; - uflint.floatval = d; - if (uflint.intval & 0x7FFFFFFF) { // if f==0 do nothing - uflint.intval += 1 << 23; // add 1 to the exponent - } - return uflint.floatval; -} - -__inline float xdiv2f(float d) { - union { - float floatval; - int intval; - } uflint; - uflint.floatval = d; - if (uflint.intval & 0x7FFFFFFF) { // if f==0 do nothing - uflint.intval -= 1 << 23; // sub 1 from the exponent - } - return uflint.floatval; -} - -__inline float xdivf( float d, int n){ - union { - float floatval; - int intval; - } uflint; - uflint.floatval = d; - if (uflint.intval & 0x7FFFFFFF) { // if f==0 do nothing - uflint.intval -= n << 23; // add n to the exponent - } - return uflint.floatval; -} - -__inline float xlin2log(float x, float base) -{ - constexpr float one(1); - return xlogf(x * (base - one) + one) / xlogf(base); -} - -__inline void xlin2log(float *x, float factor, float base, int w) -{ - constexpr float one(1); - base = 1.f / xlogf(base); - for (int i = 0; i < w; ++i) { - x[i] = xlogf(x[i] * factor * (base - one) + one) * base; - } -} - -__inline float xlog2lin(float x, float base) -{ - constexpr float one(1); - return (pow_F(base, x) - one) / (base - one); -} - -#endif From cfb61f6fbfa17d4735bb495ddad9e1e9c7547bc4 Mon Sep 17 00:00:00 2001 From: George Hilliard Date: Thu, 1 Nov 2018 16:02:01 -0500 Subject: [PATCH 062/122] Notify GUI when batch starts Closes #4906 --- rtgui/batchqueue.cc | 2 ++ rtgui/batchqueuepanel.cc | 3 --- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/rtgui/batchqueue.cc b/rtgui/batchqueue.cc index 6c42ef89f..6f09e25f1 100644 --- a/rtgui/batchqueue.cc +++ b/rtgui/batchqueue.cc @@ -597,6 +597,8 @@ void BatchQueue::startProcessing () // start batch processing rtengine::startBatchProcessing (next->job, this); queue_draw (); + + notifyListener(); } } } diff --git a/rtgui/batchqueuepanel.cc b/rtgui/batchqueuepanel.cc index a2358a3b5..57481ef1d 100644 --- a/rtgui/batchqueuepanel.cc +++ b/rtgui/batchqueuepanel.cc @@ -281,9 +281,6 @@ void BatchQueuePanel::startBatchProc () // callback in response to the *reported* state. queueShouldRun = true; - // Don't need an update callback from the queue to know it is started: - setGuiFromBatchState(true, batchQueue->getEntries().size()); - saveOptions(); batchQueue->startProcessing (); } From 424782e8d0546089121f4aa8274c6dd36347aeff Mon Sep 17 00:00:00 2001 From: George Hilliard Date: Thu, 1 Nov 2018 16:02:35 -0500 Subject: [PATCH 063/122] Consolidate updateTab() calls --- rtgui/batchqueuepanel.cc | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/rtgui/batchqueuepanel.cc b/rtgui/batchqueuepanel.cc index 57481ef1d..923b6f786 100644 --- a/rtgui/batchqueuepanel.cc +++ b/rtgui/batchqueuepanel.cc @@ -247,8 +247,6 @@ void BatchQueuePanel::updateTab (int qsize, int forceOrientation) void BatchQueuePanel::queueSizeChanged(int qsize, bool queueRunning, bool queueError, const Glib::ustring& queueErrorMessage) { - updateTab (qsize); - setGuiFromBatchState(queueRunning, qsize); if (!queueRunning && qsize == 0 && queueShouldRun) { @@ -284,8 +282,6 @@ void BatchQueuePanel::startBatchProc () saveOptions(); batchQueue->startProcessing (); } - - updateTab (batchQueue->getEntries().size()); } void BatchQueuePanel::stopBatchProc () @@ -294,8 +290,6 @@ void BatchQueuePanel::stopBatchProc () // background queue thread must check. It will notify queueSizeChanged() // when it stops. queueShouldRun = false; - - updateTab (batchQueue->getEntries().size()); } void BatchQueuePanel::setGuiFromBatchState(bool queueRunning, int qsize) @@ -313,6 +307,8 @@ void BatchQueuePanel::setGuiFromBatchState(bool queueRunning, int qsize) fdir->set_sensitive (!queueRunning); fformat->set_sensitive (!queueRunning); + + updateTab(qsize); } void BatchQueuePanel::addBatchQueueJobs(const std::vector& entries, bool head) From 77eccdf13df8f1190d13d854f5dfd12daca09011 Mon Sep 17 00:00:00 2001 From: George Hilliard Date: Fri, 2 Nov 2018 00:54:02 -0500 Subject: [PATCH 064/122] Fix mismatched malloc/delete leak From the Valgrind report: ``` Mismatched free() / delete / delete [] at 0x4838EAB: operator delete(void*) (vg_replace_malloc.c:576) by 0xBC5C87: std::default_delete::operator()(cJSON*) const (unique_ptr.h:81) by 0xBC4ACA: std::unique_ptr >::~unique_ptr() (unique_ptr.h:274) by 0xBBB755: (anonymous namespace)::getAliases(Glib::ustring const&) (dcp.cc:422) by 0xBC1CCA: rtengine::DCPStore::init(Glib::ustring const&, bool) (dcp.cc:1846) by 0xC3ED4F: rtengine::init(rtengine::Settings const*, Glib::ustring, Glib::ustring, bool) [clone ._omp_fn.0] (init.cc:81) by 0x89743FF: GOMP_parallel_sections (sections.c:158) by 0xC3E906: rtengine::init(rtengine::Settings const*, Glib::ustring, Glib::ustring, bool) (init.cc:52) by 0x9CE10E: Options::load(bool) (options.cc:2358) by 0x982CD6: main (main.cc:603) Address 0xd62d700 is 0 bytes inside a block of size 64 alloc'd at 0x483777F: malloc (vg_replace_malloc.c:299) by 0xE97390: cJSON_New_Item (cJSON.c:205) by 0xE98718: cJSON_ParseWithOpts (cJSON.c:1020) by 0xE9886F: cJSON_Parse (cJSON.c:1083) by 0xBBB4D3: (anonymous namespace)::getAliases(Glib::ustring const&) (dcp.cc:422) by 0xBC1CCA: rtengine::DCPStore::init(Glib::ustring const&, bool) (dcp.cc:1846) by 0xC3ED4F: rtengine::init(rtengine::Settings const*, Glib::ustring, Glib::ustring, bool) [clone ._omp_fn.0] (init.cc:81) by 0x89743FF: GOMP_parallel_sections (sections.c:158) by 0xC3E906: rtengine::init(rtengine::Settings const*, Glib::ustring, Glib::ustring, bool) (init.cc:52) by 0x9CE10E: Options::load(bool) (options.cc:2358) by 0x982CD6: main (main.cc:603) ``` --- rtengine/dcp.cc | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/rtengine/dcp.cc b/rtengine/dcp.cc index c18ee8915..a1b0db323 100644 --- a/rtengine/dcp.cc +++ b/rtengine/dcp.cc @@ -393,6 +393,13 @@ double xyCoordToTemperature(const std::array& white_xy) return res; } +struct cJSON_deleter { + template + void operator()(T *t) { + cJSON_Delete(const_cast::type*>(t)); + } +}; + std::map getAliases(const Glib::ustring& profile_dir) { const std::unique_ptr> file( @@ -419,7 +426,7 @@ std::map getAliases(const Glib::ustring& profile_dir) buffer[read] = 0; cJSON_Minify(buffer.get()); - const std::unique_ptr root(cJSON_Parse(buffer.get())); + const std::unique_ptr root(cJSON_Parse(buffer.get())); if (!root || !root->child) { if (settings->verbose) { std::cout << "Could not parse 'camera_model_aliases.json' file." << std::endl; From 5081c85f26d72446aae40bb4b45ff850dbcd15d1 Mon Sep 17 00:00:00 2001 From: George Hilliard Date: Fri, 2 Nov 2018 01:11:00 -0500 Subject: [PATCH 065/122] Fix leak of heap-allocated mutexes --- rtengine/rtlensfun.cc | 20 +++++++++----------- rtengine/rtlensfun.h | 4 ++-- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/rtengine/rtlensfun.cc b/rtengine/rtlensfun.cc index 792a86b61..50b3c8a66 100644 --- a/rtengine/rtlensfun.cc +++ b/rtengine/rtlensfun.cc @@ -33,7 +33,7 @@ extern const Settings *settings; LFModifier::~LFModifier() { if (data_) { - MyMutex::MyLock lock(*lfModifierMutex); + MyMutex::MyLock lock(lfModifierMutex); data_->Destroy(); } } @@ -113,14 +113,14 @@ void LFModifier::correctCA(double &x, double &y, int cx, int cy, int channel) co void LFModifier::processVignetteLine(int width, int y, float *line) const { - MyMutex::MyLock lock(*lfModifierMutex); + MyMutex::MyLock lock(lfModifierMutex); data_->ApplyColorModification(line, 0, y, width, 1, LF_CR_1(INTENSITY), 0); } void LFModifier::processVignetteLine3Channels(int width, int y, float *line) const { - MyMutex::MyLock lock(*lfModifierMutex); + MyMutex::MyLock lock(lfModifierMutex); data_->ApplyColorModification(line, 0, y, width, 1, LF_CR_3(RED, GREEN, BLUE), 0); } @@ -160,7 +160,6 @@ LFModifier::LFModifier(lfModifier *m, bool swap_xy, int flags): swap_xy_(swap_xy), flags_(flags) { - lfModifierMutex = new MyMutex; } @@ -378,14 +377,13 @@ bool LFDatabase::LoadDirectory(const char *dirname) LFDatabase::LFDatabase(): data_(nullptr) { - lfDBMutex = new MyMutex; } LFDatabase::~LFDatabase() { if (data_) { - MyMutex::MyLock lock(*lfDBMutex); + MyMutex::MyLock lock(lfDBMutex); data_->Destroy(); } } @@ -401,7 +399,7 @@ std::vector LFDatabase::getCameras() const { std::vector ret; if (data_) { - MyMutex::MyLock lock(*lfDBMutex); + MyMutex::MyLock lock(lfDBMutex); auto cams = data_->GetCameras(); while (*cams) { ret.emplace_back(); @@ -417,7 +415,7 @@ std::vector LFDatabase::getLenses() const { std::vector ret; if (data_) { - MyMutex::MyLock lock(*lfDBMutex); + MyMutex::MyLock lock(lfDBMutex); auto lenses = data_->GetLenses(); while (*lenses) { ret.emplace_back(); @@ -433,7 +431,7 @@ LFCamera LFDatabase::findCamera(const Glib::ustring &make, const Glib::ustring & { LFCamera ret; if (data_) { - MyMutex::MyLock lock(*lfDBMutex); + MyMutex::MyLock lock(lfDBMutex); auto found = data_->FindCamerasExt(make.c_str(), model.c_str()); if (found) { ret.data_ = found[0]; @@ -448,7 +446,7 @@ LFLens LFDatabase::findLens(const LFCamera &camera, const Glib::ustring &name) c { LFLens ret; if (data_) { - MyMutex::MyLock lock(*lfDBMutex); + MyMutex::MyLock lock(lfDBMutex); auto found = data_->FindLenses(camera.data_, nullptr, name.c_str()); for (size_t pos = 0; !found && pos < name.size(); ) { // try to split the maker from the model of the lens -- we have to @@ -486,7 +484,7 @@ std::unique_ptr LFDatabase::getModifier(const LFCamera &camera, cons { std::unique_ptr ret; if (data_) { - MyMutex::MyLock lock(*lfDBMutex); + MyMutex::MyLock lock(lfDBMutex); if (camera && lens) { lfModifier *mod = lfModifier::Create(lens.data_, camera.getCropFactor(), width, height); int flags = LF_MODIFY_DISTORTION | LF_MODIFY_SCALE | LF_MODIFY_TCA; diff --git a/rtengine/rtlensfun.h b/rtengine/rtlensfun.h index f75f25d4f..ef6d2192b 100644 --- a/rtengine/rtlensfun.h +++ b/rtengine/rtlensfun.h @@ -57,7 +57,7 @@ private: lfModifier *data_; bool swap_xy_; int flags_; - MyMutex *lfModifierMutex; + mutable MyMutex lfModifierMutex; }; class LFCamera final @@ -122,7 +122,7 @@ private: LFDatabase(); bool LoadDirectory(const char *dirname); - MyMutex *lfDBMutex; + mutable MyMutex lfDBMutex; static LFDatabase instance_; lfDatabase *data_; }; From ec814dbf05b8065f09ec58b74dfce8c1a1432575 Mon Sep 17 00:00:00 2001 From: George Hilliard Date: Fri, 2 Nov 2018 02:25:03 -0500 Subject: [PATCH 066/122] FramesData: Don't leak allocated frames, and remove unused functions Valgrind report: ``` 14,960 (11,544 direct, 3,416 indirect) bytes in 37 blocks are definitely lost in loss record 20,483 of 20,540 at 0x4837DEF: operator new(unsigned long) (vg_replace_malloc.c:334) by 0xC06963: rtengine::FramesData::FramesData(Glib::ustring const&, std::unique_ptr >, bool) (imagedata.cc:1121) by 0xBD774F: rtengine::DFManager::addFileInfo(Glib::ustring const&, bool) (dfmanager.cc:380) by 0xBD6E90: rtengine::DFManager::init(Glib::ustring) (dfmanager.cc:303) by 0xC3EC5D: rtengine::init(rtengine::Settings const*, Glib::ustring, Glib::ustring, bool) [clone ._omp_fn.0] (init.cc:93) by 0x897CABD: gomp_thread_start (team.c:120) by 0x89B7A9C: start_thread (in /usr/lib/libpthread-2.28.so) by 0x8ACCB22: clone (in /usr/lib/libc-2.28.so) ``` --- rtengine/imagedata.cc | 16 +++------------- rtengine/imagedata.h | 4 ++-- rtengine/imagesource.h | 1 - rtengine/rawimagesource.h | 4 ---- rtengine/stdimagesource.h | 4 ---- 5 files changed, 5 insertions(+), 24 deletions(-) diff --git a/rtengine/imagedata.cc b/rtengine/imagedata.cc index 572bd7e42..47bb0b490 100644 --- a/rtengine/imagedata.cc +++ b/rtengine/imagedata.cc @@ -809,11 +809,6 @@ unsigned int FramesData::getFrameCount () const return dcrawFrameCount ? dcrawFrameCount : frames.size(); } -FrameData *FramesData::getFrameData (unsigned int frame) const -{ - return frames.empty() || frame >= frames.size() ? nullptr : frames.at(frame); -} - bool FramesData::getPixelShift () const { // So far only Pentax and Sony provide multi-frame Pixel Shift files. @@ -1118,9 +1113,7 @@ FramesData::FramesData (const Glib::ustring& fname, std::unique_ptrgetRoot(), roots.at(0)); - - frames.push_back(fd); + frames.push_back(std::unique_ptr(new FrameData(currFrame, currFrame->getRoot(), roots.at(0)))); } for (auto currRoot : roots) { rtexif::Tag* t = currRoot->getTag(0x83BB); @@ -1142,8 +1135,7 @@ FramesData::FramesData (const Glib::ustring& fname, std::unique_ptrgetRoot(), roots.at(0)); - frames.push_back(fd); + frames.push_back(std::unique_ptr(new FrameData(currFrame, currFrame->getRoot(), roots.at(0)))); } rewind (exifManager.f); // Not sure this is necessary iptc = iptc_data_new_from_jpeg_file (exifManager.f); @@ -1161,9 +1153,7 @@ FramesData::FramesData (const Glib::ustring& fname, std::unique_ptrgetRoot(), roots.at(0)); - - frames.push_back(fd); + frames.push_back(std::unique_ptr(new FrameData(currFrame, currFrame->getRoot(), roots.at(0)))); } for (auto currRoot : roots) { rtexif::Tag* t = currRoot->getTag(0x83BB); diff --git a/rtengine/imagedata.h b/rtengine/imagedata.h index 0427ee519..1c3aff7e9 100644 --- a/rtengine/imagedata.h +++ b/rtengine/imagedata.h @@ -20,6 +20,7 @@ #define __IMAGEDATA_H__ #include +#include #include "rawimage.h" #include #include @@ -89,7 +90,7 @@ public: class FramesData : public FramesMetaData { private: // frame's root IFD, can be a file root IFD or a SUB-IFD - std::vector frames; + std::vector> frames; // root IFD in the file std::vector roots; IptcData* iptc; @@ -102,7 +103,6 @@ public: void setDCRawFrameCount (unsigned int frameCount); unsigned int getRootCount () const; unsigned int getFrameCount () const; - FrameData *getFrameData (unsigned int frame) const; bool getPixelShift () const; bool getHDR (unsigned int frame = 0) const; std::string getImageType (unsigned int frame) const; diff --git a/rtengine/imagesource.h b/rtengine/imagesource.h index a7c867e08..c1bd8fd64 100644 --- a/rtengine/imagesource.h +++ b/rtengine/imagesource.h @@ -110,7 +110,6 @@ public: return 0; } - virtual FrameData* getImageData (unsigned int frameNum) = 0; virtual ImageMatrices* getImageMatrices () = 0; virtual bool isRAW () const = 0; virtual DCPProfile* getDCP (const ColorManagementParams &cmp, DCPProfile::ApplyState &as) diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index 8ee403ea2..af0c1a116 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -168,10 +168,6 @@ public: return ri->get_rotateDegree(); } - FrameData* getImageData (unsigned int frameNum) - { - return idata->getFrameData (frameNum); - } ImageMatrices* getImageMatrices () { return &imatrices; diff --git a/rtengine/stdimagesource.h b/rtengine/stdimagesource.h index 1dbb65001..605b2926c 100644 --- a/rtengine/stdimagesource.h +++ b/rtengine/stdimagesource.h @@ -69,10 +69,6 @@ public: void getFullSize (int& w, int& h, int tr = TR_NONE); void getSize (const PreviewProps &pp, int& w, int& h); - FrameData* getImageData (unsigned int frameNum) - { - return idata->getFrameData (frameNum); - } ImageIO* getImageIO () { return img; From 4186c2b1394a33ffe58cc6cfec99de6e0420c816 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Fri, 2 Nov 2018 13:47:09 +0100 Subject: [PATCH 067/122] L*a*b* grid color toning: fixed scaling bug introduced in 74a467fb4e20aca7b9b9ba40eefa405f0d32e2c4 --- rtengine/improcfun.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 4dd745eb6..31c44efe4 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -5782,8 +5782,8 @@ void ImProcFunctions::lab2rgb (const LabImage &src, Imagefloat &dst, const Glib: */ void ImProcFunctions::colorToningLabGrid(LabImage *lab, int xstart, int xend, int ystart, int yend, bool MultiThread) { - const float factor = 3.f; - const float scaling = 3.f; + const float factor = ColorToningParams::LABGRID_CORR_MAX * 3.f; + const float scaling = ColorToningParams::LABGRID_CORR_SCALE; float a_scale = (params->colorToning.labgridAHigh - params->colorToning.labgridALow) / factor / scaling; float a_base = params->colorToning.labgridALow / scaling; float b_scale = (params->colorToning.labgridBHigh - params->colorToning.labgridBLow) / factor / scaling; From e611efd6b43b3d37d0e279e90c4a9781bfa95e15 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Fri, 2 Nov 2018 12:01:24 +0100 Subject: [PATCH 068/122] fixed segfault (out of range LUT access) in shadows/highlights Fixes #4922 --- rtengine/ipshadowshighlights.cc | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/rtengine/ipshadowshighlights.cc b/rtengine/ipshadowshighlights.cc index ff56c84ac..450aac221 100644 --- a/rtengine/ipshadowshighlights.cc +++ b/rtengine/ipshadowshighlights.cc @@ -160,7 +160,7 @@ void ImProcFunctions::shadowsHighlights(LabImage *lab) float orig = 1.f - blend; if (l >= 0.f && l < 32768.f) { if (lab_mode) { - lab->L[y][x] = f[l] * blend + l * orig; + lab->L[y][x] = intp(blend, f[l], l); if (!hl && l > 1.f) { // when pushing shadows, scale also the chromaticity float s = max(lab->L[y][x] / l * 0.5f, 1.f) * blend; @@ -173,7 +173,10 @@ void ImProcFunctions::shadowsHighlights(LabImage *lab) float rgb[3]; lab2rgb(l, lab->a[y][x], lab->b[y][x], rgb[0], rgb[1], rgb[2]); for (int i = 0; i < 3; ++i) { - rgb[i] = f[rgb[i]] * blend + rgb[i] * orig; + float c = rgb[i]; + if (!OOG(c)) { + rgb[i] = intp(blend, f[c], c); + } } rgb2lab(rgb[0], rgb[1], rgb[2], lab->L[y][x], lab->a[y][x], lab->b[y][x]); } From 86c661fdeb4c8307cdfaf4c90e45702ffea06261 Mon Sep 17 00:00:00 2001 From: George Hilliard Date: Fri, 2 Nov 2018 09:29:37 -0500 Subject: [PATCH 069/122] Fix startup ding by initializing variable Closes #4923. --- rtgui/batchqueuepanel.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rtgui/batchqueuepanel.cc b/rtgui/batchqueuepanel.cc index 923b6f786..8c6472c70 100644 --- a/rtgui/batchqueuepanel.cc +++ b/rtgui/batchqueuepanel.cc @@ -57,6 +57,8 @@ BatchQueuePanel::BatchQueuePanel (FileCatalog* aFileCatalog) : parent(nullptr) qAutoStart->set_tooltip_text (M("BATCHQUEUE_AUTOSTARTHINT")); qAutoStart->set_active (options.procQueueEnabled); + queueShouldRun = false; + batchQueueButtonBox->pack_start (*qStartStop, Gtk::PACK_SHRINK, 4); batchQueueButtonBox->pack_start (*qAutoStart, Gtk::PACK_SHRINK, 4); Gtk::Frame *bbox = Gtk::manage(new Gtk::Frame(M("MAIN_FRAME_BATCHQUEUE"))); From e199d1ea10fbf55833212cb020856962fb9d8066 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 2 Nov 2018 19:02:05 +0100 Subject: [PATCH 070/122] Colortoning lab regions: Move guid fill into main loop, #4914 --- rtengine/iplabregions.cc | 44 +++++++++++++++------------------------- 1 file changed, 16 insertions(+), 28 deletions(-) diff --git a/rtengine/iplabregions.cc b/rtengine/iplabregions.cc index aec6efa6f..66ab52370 100644 --- a/rtengine/iplabregions.cc +++ b/rtengine/iplabregions.cc @@ -87,6 +87,7 @@ BENCHFUN abmask[i](lab->W, lab->H); Lmask[i](lab->W, lab->H); } + array2D guide(lab->W, lab->H); #ifdef _OPENMP #pragma omp parallel if (multiThread) @@ -99,7 +100,7 @@ BENCHFUN constexpr float c_factor = 327.68f / 48000.f; #endif #ifdef _OPENMP - #pragma omp for + #pragma omp for schedule(dynamic, 16) #endif for (int y = 0; y < lab->H; ++y) { #ifdef __SSE2__ @@ -108,53 +109,40 @@ BENCHFUN fastlin2log(cBuffer, c_factor, 10.f, lab->W); #endif for (int x = 0; x < lab->W; ++x) { - float l = lab->L[y][x]; + float l = lab->L[y][x] / 32768.f; + guide[y][x] = LIM01(l); #ifdef __SSE2__ // use precalculated values - float c1 = cBuffer[x]; + float c = cBuffer[x]; float h = hBuffer[x]; #else // magic constant c_factor: normally chromaticity is in [0; 42000] (see color.h), but here we use the constant to match how the chromaticity pipette works (see improcfun.cc lines 4705-4706 and color.cc line 1930 constexpr float c_factor = 327.68f / 48000.f; - float a = lab->a[y][x]; - float b = lab->b[y][x]; float c, h; - Color::Lab2Lch(a, b, c, h); - float c1 = xlin2log(c * c_factor, 10.f); + Color::Lab2Lch(lab->a[y][x], lab->b[y][x], c, h); + c = xlin2log(c * c_factor, 10.f); #endif - float h1 = Color::huelab_to_huehsv2(h); - h1 = h1 + 1.f/6.f; // offset the hue because we start from purple instead of red - if (h1 > 1.f) { - h1 -= 1.f; + h = Color::huelab_to_huehsv2(h); + h += 1.f/6.f; // offset the hue because we start from purple instead of red + if (h > 1.f) { + h -= 1.f; } - h1 = xlin2log(h1, 3.f); - float l1 = l / 32768.f; + h = xlin2log(h, 3.f); for (int i = begin_idx; i < end_idx; ++i) { auto &hm = hmask[i]; auto &cm = cmask[i]; auto &lm = lmask[i]; - float blend = LIM01((hm ? hm->getVal(h1) : 1.f) * (cm ? cm->getVal(c1) : 1.f) * (lm ? lm->getVal(l1) : 1.f)); + float blend = LIM01((hm ? hm->getVal(h) : 1.f) * (cm ? cm->getVal(c) : 1.f) * (lm ? lm->getVal(l) : 1.f)); Lmask[i][y][x] = abmask[i][y][x] = blend; } } } } - { - array2D guide(lab->W, lab->H, lab->L); -#ifdef _OPENMP - #pragma omp parallel for if (multiThread) -#endif - for (int y = 0; y < lab->H; ++y) { - for (int x = 0; x < lab->W; ++x) { - guide[y][x] = LIM01(lab->L[y][x] / 32768.f); - } - } - for (int i = begin_idx; i < end_idx; ++i) { - rtengine::guidedFilter(guide, abmask[i], abmask[i], max(int(4 / scale + 0.5), 1), 0.001, multiThread); - rtengine::guidedFilter(guide, Lmask[i], Lmask[i], max(int(25 / scale + 0.5), 1), 0.0001, multiThread); - } + for (int i = begin_idx; i < end_idx; ++i) { + rtengine::guidedFilter(guide, abmask[i], abmask[i], max(int(4 / scale + 0.5), 1), 0.001, multiThread); + rtengine::guidedFilter(guide, Lmask[i], Lmask[i], max(int(25 / scale + 0.5), 1), 0.0001, multiThread); } if (show_mask_idx >= 0) { From 64af0e7602393c37bb3b079da0f6de161663e14f Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 2 Nov 2018 21:06:38 +0100 Subject: [PATCH 071/122] Colortoning lab regions: Disabled timing code and removed double declaration of c_factor, #4914 --- rtengine/iplabregions.cc | 74 +++++++++++++++++++++------------------- 1 file changed, 38 insertions(+), 36 deletions(-) diff --git a/rtengine/iplabregions.cc b/rtengine/iplabregions.cc index 66ab52370..5d49ff429 100644 --- a/rtengine/iplabregions.cc +++ b/rtengine/iplabregions.cc @@ -24,11 +24,12 @@ #include "improcfun.h" #include "guidedfilter.h" -#define BENCHMARK +//#define BENCHMARK #include "StopWatch.h" #include "sleef.c" namespace { + #ifdef __SSE2__ void fastlin2log(float *x, float factor, float base, int w) { @@ -46,6 +47,7 @@ void fastlin2log(float *x, float factor, float base, int w) } } #endif + } namespace rtengine { @@ -87,59 +89,59 @@ BENCHFUN abmask[i](lab->W, lab->H); Lmask[i](lab->W, lab->H); } + array2D guide(lab->W, lab->H); + // magic constant c_factor: normally chromaticity is in [0; 42000] (see color.h), but here we use the constant to match how the chromaticity pipette works (see improcfun.cc lines 4705-4706 and color.cc line 1930 + constexpr float c_factor = 327.68f / 48000.f; + #ifdef _OPENMP #pragma omp parallel if (multiThread) #endif { #ifdef __SSE2__ - float cBuffer[lab->W]; - float hBuffer[lab->W]; - // magic constant c_factor: normally chromaticity is in [0; 42000] (see color.h), but here we use the constant to match how the chromaticity pipette works (see improcfun.cc lines 4705-4706 and color.cc line 1930 - constexpr float c_factor = 327.68f / 48000.f; + float cBuffer[lab->W]; + float hBuffer[lab->W]; #endif #ifdef _OPENMP - #pragma omp for schedule(dynamic, 16) + #pragma omp for schedule(dynamic, 16) #endif - for (int y = 0; y < lab->H; ++y) { + for (int y = 0; y < lab->H; ++y) { #ifdef __SSE2__ - // vectorized precalculation - Color::Lab2Lch(lab->a[y], lab->b[y], cBuffer, hBuffer, lab->W); - fastlin2log(cBuffer, c_factor, 10.f, lab->W); + // vectorized precalculation + Color::Lab2Lch(lab->a[y], lab->b[y], cBuffer, hBuffer, lab->W); + fastlin2log(cBuffer, c_factor, 10.f, lab->W); #endif - for (int x = 0; x < lab->W; ++x) { - float l = lab->L[y][x] / 32768.f; - guide[y][x] = LIM01(l); + for (int x = 0; x < lab->W; ++x) { + const float l = lab->L[y][x] / 32768.f; + guide[y][x] = LIM01(l); #ifdef __SSE2__ - // use precalculated values - float c = cBuffer[x]; - float h = hBuffer[x]; + // use precalculated values + const float c = cBuffer[x]; + float h = hBuffer[x]; #else - // magic constant c_factor: normally chromaticity is in [0; 42000] (see color.h), but here we use the constant to match how the chromaticity pipette works (see improcfun.cc lines 4705-4706 and color.cc line 1930 - constexpr float c_factor = 327.68f / 48000.f; - float c, h; - Color::Lab2Lch(lab->a[y][x], lab->b[y][x], c, h); - c = xlin2log(c * c_factor, 10.f); + float c, h; + Color::Lab2Lch(lab->a[y][x], lab->b[y][x], c, h); + c = xlin2log(c * c_factor, 10.f); #endif - h = Color::huelab_to_huehsv2(h); - h += 1.f/6.f; // offset the hue because we start from purple instead of red - if (h > 1.f) { - h -= 1.f; - } - h = xlin2log(h, 3.f); + h = Color::huelab_to_huehsv2(h); + h += 1.f/6.f; // offset the hue because we start from purple instead of red + if (h > 1.f) { + h -= 1.f; + } + h = xlin2log(h, 3.f); - for (int i = begin_idx; i < end_idx; ++i) { - auto &hm = hmask[i]; - auto &cm = cmask[i]; - auto &lm = lmask[i]; - float blend = LIM01((hm ? hm->getVal(h) : 1.f) * (cm ? cm->getVal(c) : 1.f) * (lm ? lm->getVal(l) : 1.f)); - Lmask[i][y][x] = abmask[i][y][x] = blend; + for (int i = begin_idx; i < end_idx; ++i) { + auto &hm = hmask[i]; + auto &cm = cmask[i]; + auto &lm = lmask[i]; + float blend = LIM01((hm ? hm->getVal(h) : 1.f) * (cm ? cm->getVal(c) : 1.f) * (lm ? lm->getVal(l) : 1.f)); + Lmask[i][y][x] = abmask[i][y][x] = blend; + } } } } - } - + for (int i = begin_idx; i < end_idx; ++i) { rtengine::guidedFilter(guide, abmask[i], abmask[i], max(int(4 / scale + 0.5), 1), 0.001, multiThread); rtengine::guidedFilter(guide, Lmask[i], Lmask[i], max(int(25 / scale + 0.5), 1), 0.0001, multiThread); @@ -176,7 +178,7 @@ BENCHFUN abca[i] = abcoord(r.a); abcb[i] = abcoord(r.b); rs[i] = 1.f + r.saturation / 100.f; - rl[i] = 1.f + float(r.lightness) / 500.f; + rl[i] = 1.f + r.lightness / 500.f; } #ifdef _OPENMP From 240f1eac6501cba182bd2b0a06478f7fe78b9de3 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 2 Nov 2018 23:05:40 +0100 Subject: [PATCH 072/122] Colortoning lab regions: vectorized last loop, #4914 --- rtengine/iplabregions.cc | 68 +++++++++++++++++++++++++++++----------- 1 file changed, 50 insertions(+), 18 deletions(-) diff --git a/rtengine/iplabregions.cc b/rtengine/iplabregions.cc index 5d49ff429..d5bbd6302 100644 --- a/rtengine/iplabregions.cc +++ b/rtengine/iplabregions.cc @@ -182,27 +182,59 @@ BENCHFUN } #ifdef _OPENMP - #pragma omp parallel for if (multiThread) + #pragma omp parallel if (multiThread) #endif - for (int y = 0; y < lab->H; ++y) { - for (int x = 0; x < lab->W; ++x) { - float l = lab->L[y][x]; - float a = lab->a[y][x]; - float b = lab->b[y][x]; + { +#ifdef __SSE2__ + vfloat c42000v = F2V(42000.f); + vfloat cm42000v = F2V(-42000.f); + vfloat c32768v = F2V(32768.f); +#endif +#ifdef _OPENMP + #pragma omp for +#endif + for (int y = 0; y < lab->H; ++y) { + int x = 0; +#ifdef __SSE2__ + for (; x < lab->W - 3; x += 4) { + vfloat lv = LVFU(lab->L[y][x]); + vfloat av = LVFU(lab->a[y][x]); + vfloat bv = LVFU(lab->b[y][x]); - for (int i = 0; i < n; ++i) { - float blend = abmask[i][y][x]; - float s = rs[i]; - float a_new = LIM(s * (a + abca[i]), -42000.f, 42000.f); - float b_new = LIM(s * (b + abcb[i]), -42000.f, 42000.f); - float l_new = LIM(l * rl[i], 0.f, 32768.f); - l = intp(Lmask[i][y][x], l_new, l); - a = intp(blend, a_new, a); - b = intp(blend, b_new, b); + for (int i = 0; i < n; ++i) { + vfloat blendv = LVFU(abmask[i][y][x]); + vfloat sv = F2V(rs[i]); + vfloat a_newv = LIMV(sv * (av + F2V(abca[i])), cm42000v, c42000v); + vfloat b_newv = LIMV(sv * (bv + F2V(abcb[i])), cm42000v, c42000v); + vfloat l_newv = LIMV(lv * F2V(rl[i]), ZEROV, c32768v); + lv = vintpf(LVFU(Lmask[i][y][x]), l_newv, lv); + av = vintpf(blendv, a_newv, av); + bv = vintpf(blendv, b_newv, bv); + } + STVFU(lab->L[y][x], lv); + STVFU(lab->a[y][x], av); + STVFU(lab->b[y][x], bv); + } +#endif + for (; x < lab->W; ++x) { + float l = lab->L[y][x]; + float a = lab->a[y][x]; + float b = lab->b[y][x]; + + for (int i = 0; i < n; ++i) { + float blend = abmask[i][y][x]; + float s = rs[i]; + float a_new = LIM(s * (a + abca[i]), -42000.f, 42000.f); + float b_new = LIM(s * (b + abcb[i]), -42000.f, 42000.f); + float l_new = LIM(l * rl[i], 0.f, 32768.f); + l = intp(Lmask[i][y][x], l_new, l); + a = intp(blend, a_new, a); + b = intp(blend, b_new, b); + } + lab->L[y][x] = l; + lab->a[y][x] = a; + lab->b[y][x] = b; } - lab->L[y][x] = l; - lab->a[y][x] = a; - lab->b[y][x] = b; } } } From 0c488eadaf90ade63b738740364c68f6f92575ef Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Sat, 3 Nov 2018 02:36:30 +0100 Subject: [PATCH 073/122] DR Compression: updated defaults and renamed "Threshold" to "Detail" in the GUI Fixes #4912 --- rtdata/languages/default | 4 ++-- rtengine/procparams.cc | 4 ++-- rtgui/fattaltonemap.cc | 3 ++- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 03359ee09..ee4291522 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -725,7 +725,7 @@ HISTORY_MSG_485;Lens Correction HISTORY_MSG_486;Lens Correction - Camera HISTORY_MSG_487;Lens Correction - Lens HISTORY_MSG_488;Dynamic Range Compression -HISTORY_MSG_489;DRC - Threshold +HISTORY_MSG_489;DRC - Detail HISTORY_MSG_490;DRC - Amount HISTORY_MSG_491;White Balance HISTORY_MSG_492;RGB Curves @@ -2046,7 +2046,7 @@ TP_SOFTLIGHT_STRENGTH;Strength TP_TM_FATTAL_AMOUNT;Amount TP_TM_FATTAL_ANCHOR;Anchor TP_TM_FATTAL_LABEL;Dynamic Range Compression -TP_TM_FATTAL_THRESHOLD;Threshold +TP_TM_FATTAL_THRESHOLD;Detail TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 4585b767b..b82a7d440 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -1532,8 +1532,8 @@ bool EPDParams::operator !=(const EPDParams& other) const FattalToneMappingParams::FattalToneMappingParams() : enabled(false), - threshold(0), - amount(30), + threshold(30), + amount(20), anchor(50) { } diff --git a/rtgui/fattaltonemap.cc b/rtgui/fattaltonemap.cc index 4bba72f2a..3a6a15a4d 100644 --- a/rtgui/fattaltonemap.cc +++ b/rtgui/fattaltonemap.cc @@ -31,7 +31,8 @@ FattalToneMapping::FattalToneMapping(): FoldableToolPanel(this, "fattal", M("TP_ EvTMFattalAnchor = m->newEvent(HDR, "HISTORY_MSG_TM_FATTAL_ANCHOR"); amount = Gtk::manage(new Adjuster (M("TP_TM_FATTAL_AMOUNT"), 1., 100., 1., 30.)); - threshold = Gtk::manage(new Adjuster (M("TP_TM_FATTAL_THRESHOLD"), -100., 100., 1., 0.0)); + threshold = Gtk::manage(new Adjuster (M("TP_TM_FATTAL_THRESHOLD"), -100., 300., 1., 0.0)); + threshold->setLogScale(10, 0); Gtk::Image *al = Gtk::manage(new RTImage("circle-black-small.png")); Gtk::Image *ar = Gtk::manage(new RTImage("circle-white-small.png")); anchor = Gtk::manage(new Adjuster(M("TP_TM_FATTAL_ANCHOR"), 1, 100, 1, 50, al, ar)); From 7474598ebcc9d935318643241b3c033845ab0469 Mon Sep 17 00:00:00 2001 From: Hombre Date: Sat, 3 Nov 2018 13:59:04 +0100 Subject: [PATCH 074/122] Fix a crash that can occure when creating the thumbnail (no issue) --- rtengine/rtthumbnail.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index c671cc0a4..f01e87ff7 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -2224,7 +2224,7 @@ bool Thumbnail::readAEHistogram (const Glib::ustring& fname) FILE* f = g_fopen (fname.c_str (), "rb"); if (!f) { - aeHistogram (0); + aeHistogram.reset(); } else { aeHistogram (65536 >> aeHistCompression); fread (&aeHistogram[0], 1, (65536 >> aeHistCompression)*sizeof (aeHistogram[0]), f); From 555b613f21651ae0164b201d90b76a6aaca4478e Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Sat, 3 Nov 2018 14:04:34 +0100 Subject: [PATCH 075/122] Updated undo/redo-small icons The icon's shape made it look off-center even though it was centered, so the icons were nudged a bit to the side. Closes #4927 --- rtdata/images/themed/png/dark/redo-small.png | Bin 448 -> 429 bytes rtdata/images/themed/png/dark/undo-small.png | Bin 422 -> 432 bytes rtdata/images/themed/png/light/redo-small.png | Bin 465 -> 431 bytes rtdata/images/themed/png/light/undo-small.png | Bin 435 -> 430 bytes rtdata/images/themed/svg/redo-small.svg | 31 +++++++----------- rtdata/images/themed/svg/undo-small.svg | 8 ++--- 6 files changed, 15 insertions(+), 24 deletions(-) diff --git a/rtdata/images/themed/png/dark/redo-small.png b/rtdata/images/themed/png/dark/redo-small.png index 84a5988efc9131f5c2d494f702d76f96872f1682..206200d6db0e9e2fb390270a9bb80e939eb80457 100644 GIT binary patch delta 177 zcmX@Wyq0+bD`UM@fKQ04dx6gxFgSPa+_7WF&YnGc^ytx3r%pixA>`@Pr!QQ%u;=>v zXa)ubzLFrnV1~_WQn^K0G<|1OyO_zwPvk8C$~b$vIEHXsPfk$aa*41uP+`c_cXX6} z#>B>Uud}JCsg0M1=brc_aV{>Y2GK%oE=|7%jd+a}Y|AWJT9-9R+AQTe63N1FbTVg* TbhY4opm_|Qu6{1-oD!Me1LfaD`UNGfKQ0)>C>m(3w+L;Idk^xSs)2#T)K1#$Ub-O98dvJ3J8FVBQuxW zXJBC9FA4GsZeUnmv$0LRM`$`%ezaX_W~a3;P%6mN#W95Ada^(Z6I%?Arh)S!?*i?P ziOUxmMYEpp2sceIFwIJtPj--y= l8Db4fmq>lQsj9)jz%)bf+m+U>UO?j+JYD@<);T3K0RSW2SxNu^ diff --git a/rtdata/images/themed/png/dark/undo-small.png b/rtdata/images/themed/png/dark/undo-small.png index 0908ba6d564b883363f3eafea6ec71ee56672bb6..9505829d49e7ff5c4e183a541473f9917546c235 100644 GIT binary patch delta 180 zcmZ3+yn%TGD`UM@fKQ0)nKNhH3w(g&>C>k#U%m`voIH8*{Q2`|&z=Q}02x3LAUJX2 zME?rmRt5$JzLFrn;LQx4nyfQKdGc1p*O|%HT;3}RlyUQPaSY+Oo-EM9#8$&2=vb(0 zD&So4(37pLOu@OMxv{bFt5Wj<7G~z{oolR`7wBj(H!DSKRADxE34g`1qGN%_Cr76+ b2S$eedpv73*{8V!jb!k2^>bP0l+XkKpC?R3 delta 170 zcmdnMyo`ARD`UNSfKQ04dx6gx7&w3a{O#Mf&z?OC6gYS89FRPH`ZSOWBp18b@-r|n z@RkJm1v6}RUn9(}mYb+Q!=jbp-NsCygoCGxV+hCfjH{oFo>FkkY-c?r7(pW(`jIZW)ztP7SL z*YfGAv7-v_Rh_MJ-bAR*lv#zopr08#o!4*&oF diff --git a/rtdata/images/themed/png/light/undo-small.png b/rtdata/images/themed/png/light/undo-small.png index 6d16726acea6587ba5b2d7d668f535bfab561d55..d6f1d01152f0b91b0585c98f079ef587e1c594af 100644 GIT binary patch delta 173 zcmdnYypDMT7h}D9fsd-HsqgffgpVnjVLPdv&E9dBiQ5*}5GR7ArP3 zHYQq4C~Rm{^bAm);CP|opcdDfh&hdlf@cI~ojJg2svgt5Ks11XA?GsR8m~8L+khrA Nc)I$ztaD0e0stzhG(-RZ diff --git a/rtdata/images/themed/svg/redo-small.svg b/rtdata/images/themed/svg/redo-small.svg index be05d9592..639aebb42 100644 --- a/rtdata/images/themed/svg/redo-small.svg +++ b/rtdata/images/themed/svg/redo-small.svg @@ -26,14 +26,14 @@ borderopacity="1.0" inkscape:pageopacity="0" inkscape:pageshadow="2" - inkscape:zoom="22.627417" - inkscape:cx="-2.333987" - inkscape:cy="3.4079617" + inkscape:zoom="50.5" + inkscape:cx="8" + inkscape:cy="8" inkscape:document-units="px" inkscape:current-layer="layer1" showgrid="true" inkscape:window-width="1920" - inkscape:window-height="1019" + inkscape:window-height="1017" inkscape:window-x="0" inkscape:window-y="0" inkscape:window-maximized="1" @@ -63,7 +63,7 @@ image/svg+xml - + Maciej Dworak @@ -100,20 +100,11 @@ inkscape:groupmode="layer" inkscape:label="Layer 1" transform="translate(0,-8)"> - - - - + diff --git a/rtdata/images/themed/svg/undo-small.svg b/rtdata/images/themed/svg/undo-small.svg index 83b4663a0..f06c73392 100644 --- a/rtdata/images/themed/svg/undo-small.svg +++ b/rtdata/images/themed/svg/undo-small.svg @@ -26,14 +26,14 @@ borderopacity="1.0" inkscape:pageopacity="0" inkscape:pageshadow="2" - inkscape:zoom="51.375" + inkscape:zoom="50.625" inkscape:cx="8" inkscape:cy="8" inkscape:document-units="px" inkscape:current-layer="layer1" showgrid="true" inkscape:window-width="1920" - inkscape:window-height="1019" + inkscape:window-height="1017" inkscape:window-x="0" inkscape:window-y="0" inkscape:window-maximized="1" @@ -45,7 +45,7 @@ inkscape:object-nodes="false" inkscape:snap-grids="true" inkscape:snap-bbox-midpoints="false" - inkscape:snap-global="false"> + inkscape:snap-global="true"> From cd4fa4277618d47504cc2139a28000b1641c1eb2 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Sat, 3 Nov 2018 14:14:16 +0100 Subject: [PATCH 076/122] Removed changed locale keys Related to #4912 0c488ea --- rtdata/languages/Catala | 2 -- rtdata/languages/Chinese (Simplified) | 2 -- rtdata/languages/Chinese (Traditional) | 2 -- rtdata/languages/Czech | 2 -- rtdata/languages/Dansk | 2 -- rtdata/languages/Deutsch | 2 -- rtdata/languages/English (UK) | 2 -- rtdata/languages/English (US) | 2 -- rtdata/languages/Espanol | 2 -- rtdata/languages/Euskara | 2 -- rtdata/languages/Francais | 2 -- rtdata/languages/Greek | 2 -- rtdata/languages/Hebrew | 2 -- rtdata/languages/Italiano | 2 -- rtdata/languages/Japanese | 2 -- rtdata/languages/Latvian | 2 -- rtdata/languages/Magyar | 2 -- rtdata/languages/Nederlands | 2 -- rtdata/languages/Norsk BM | 2 -- rtdata/languages/Polish | 2 -- rtdata/languages/Polish (Latin Characters) | 2 -- rtdata/languages/Portugues (Brasil) | 2 -- rtdata/languages/Russian | 2 -- rtdata/languages/Serbian (Cyrilic Characters) | 2 -- rtdata/languages/Serbian (Latin Characters) | 2 -- rtdata/languages/Slovak | 2 -- rtdata/languages/Suomi | 2 -- rtdata/languages/Swedish | 2 -- rtdata/languages/Turkish | 2 -- 29 files changed, 58 deletions(-) diff --git a/rtdata/languages/Catala b/rtdata/languages/Catala index fa7141087..5484f536c 100644 --- a/rtdata/languages/Catala +++ b/rtdata/languages/Catala @@ -1310,7 +1310,6 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens !HISTORY_MSG_488;Dynamic Range Compression -!HISTORY_MSG_489;DRC - Threshold !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves @@ -2087,7 +2086,6 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression -!TP_TM_FATTAL_THRESHOLD;Threshold !TP_WAVELET_1;Level 1 !TP_WAVELET_2;Level 2 !TP_WAVELET_3;Level 3 diff --git a/rtdata/languages/Chinese (Simplified) b/rtdata/languages/Chinese (Simplified) index ff45df98b..bacc0ea58 100644 --- a/rtdata/languages/Chinese (Simplified) +++ b/rtdata/languages/Chinese (Simplified) @@ -1387,7 +1387,6 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens !HISTORY_MSG_488;Dynamic Range Compression -!HISTORY_MSG_489;DRC - Threshold !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves @@ -2064,7 +2063,6 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression -!TP_TM_FATTAL_THRESHOLD;Threshold !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones diff --git a/rtdata/languages/Chinese (Traditional) b/rtdata/languages/Chinese (Traditional) index 47a604554..127fea254 100644 --- a/rtdata/languages/Chinese (Traditional) +++ b/rtdata/languages/Chinese (Traditional) @@ -972,7 +972,6 @@ TP_WBALANCE_TEMPERATURE;色溫 !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens !HISTORY_MSG_488;Dynamic Range Compression -!HISTORY_MSG_489;DRC - Threshold !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves @@ -2026,7 +2025,6 @@ TP_WBALANCE_TEMPERATURE;色溫 !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression -!TP_TM_FATTAL_THRESHOLD;Threshold !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones diff --git a/rtdata/languages/Czech b/rtdata/languages/Czech index 4be6bdc58..a6b19baa7 100644 --- a/rtdata/languages/Czech +++ b/rtdata/languages/Czech @@ -2197,7 +2197,6 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !HISTORY_MSG_273;CT - Color Balance SMH !HISTORY_MSG_392;W - Residual - Color Balance !HISTORY_MSG_488;Dynamic Range Compression -!HISTORY_MSG_489;DRC - Threshold !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_DUALDEMOSAIC_CONTRAST;AMaZE+VNG4 - Contrast threshold !HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries @@ -2298,4 +2297,3 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression -!TP_TM_FATTAL_THRESHOLD;Threshold diff --git a/rtdata/languages/Dansk b/rtdata/languages/Dansk index 7658914f7..9edb918c8 100644 --- a/rtdata/languages/Dansk +++ b/rtdata/languages/Dansk @@ -967,7 +967,6 @@ TP_WBALANCE_TEMPERATURE;Temperatur !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens !HISTORY_MSG_488;Dynamic Range Compression -!HISTORY_MSG_489;DRC - Threshold !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves @@ -2024,7 +2023,6 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression -!TP_TM_FATTAL_THRESHOLD;Threshold !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index fc3374db6..62f258cea 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -790,7 +790,6 @@ HISTORY_MSG_485;(Objektivkorrektur)\nProfil HISTORY_MSG_486;(Objektivkorrektur)\nProfil - Kamera HISTORY_MSG_487;(Objektivkorrektur)\nProfil - Objektiv HISTORY_MSG_488;(Dynamikkompression) -HISTORY_MSG_489;(Dynamikkompression)\nSchwelle HISTORY_MSG_490;(Dynamikkompression)\nIntensität HISTORY_MSG_491;(Weißabgleich) HISTORY_MSG_492;(RGB-Kurven) @@ -2109,7 +2108,6 @@ TP_SOFTLIGHT_STRENGTH;Intensität TP_TM_FATTAL_AMOUNT;Intensität TP_TM_FATTAL_ANCHOR;Helligkeitsverschiebung TP_TM_FATTAL_LABEL;Dynamikkompression -TP_TM_FATTAL_THRESHOLD;Schwelle TP_VIBRANCE_AVOIDCOLORSHIFT;Farbverschiebungen vermeiden TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Hautfarbtöne diff --git a/rtdata/languages/English (UK) b/rtdata/languages/English (UK) index 6be9b3308..1d31bdd3f 100644 --- a/rtdata/languages/English (UK) +++ b/rtdata/languages/English (UK) @@ -811,7 +811,6 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens !HISTORY_MSG_488;Dynamic Range Compression -!HISTORY_MSG_489;DRC - Threshold !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves @@ -2017,7 +2016,6 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression -!TP_TM_FATTAL_THRESHOLD;Threshold !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones !TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE1;Red/Purple diff --git a/rtdata/languages/English (US) b/rtdata/languages/English (US) index f8ec04d1f..4e3829269 100644 --- a/rtdata/languages/English (US) +++ b/rtdata/languages/English (US) @@ -720,7 +720,6 @@ !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens !HISTORY_MSG_488;Dynamic Range Compression -!HISTORY_MSG_489;DRC - Threshold !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves @@ -2007,7 +2006,6 @@ !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression -!TP_TM_FATTAL_THRESHOLD;Threshold !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones diff --git a/rtdata/languages/Espanol b/rtdata/languages/Espanol index 7b0645778..b80fef3d8 100644 --- a/rtdata/languages/Espanol +++ b/rtdata/languages/Espanol @@ -1694,7 +1694,6 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: - !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens !HISTORY_MSG_488;Dynamic Range Compression -!HISTORY_MSG_489;DRC - Threshold !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves @@ -2158,7 +2157,6 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: - !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression -!TP_TM_FATTAL_THRESHOLD;Threshold !TP_WAVELET_1;Level 1 !TP_WAVELET_2;Level 2 !TP_WAVELET_3;Level 3 diff --git a/rtdata/languages/Euskara b/rtdata/languages/Euskara index 06bfc9ae5..61de1ab54 100644 --- a/rtdata/languages/Euskara +++ b/rtdata/languages/Euskara @@ -968,7 +968,6 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens !HISTORY_MSG_488;Dynamic Range Compression -!HISTORY_MSG_489;DRC - Threshold !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves @@ -2025,7 +2024,6 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression -!TP_TM_FATTAL_THRESHOLD;Threshold !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais index 19a8ce8d4..15d8affc3 100644 --- a/rtdata/languages/Francais +++ b/rtdata/languages/Francais @@ -2217,7 +2217,6 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !HISTORY_MSG_273;CT - Color Balance SMH !HISTORY_MSG_392;W - Residual - Color Balance !HISTORY_MSG_488;Dynamic Range Compression -!HISTORY_MSG_489;DRC - Threshold !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_DUALDEMOSAIC_CONTRAST;AMaZE+VNG4 - Contrast threshold @@ -2286,4 +2285,3 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression -!TP_TM_FATTAL_THRESHOLD;Threshold diff --git a/rtdata/languages/Greek b/rtdata/languages/Greek index cf9aef8ae..0641c6a49 100644 --- a/rtdata/languages/Greek +++ b/rtdata/languages/Greek @@ -967,7 +967,6 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens !HISTORY_MSG_488;Dynamic Range Compression -!HISTORY_MSG_489;DRC - Threshold !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves @@ -2024,7 +2023,6 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression -!TP_TM_FATTAL_THRESHOLD;Threshold !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones diff --git a/rtdata/languages/Hebrew b/rtdata/languages/Hebrew index e8814d80f..0e6d6ddd3 100644 --- a/rtdata/languages/Hebrew +++ b/rtdata/languages/Hebrew @@ -968,7 +968,6 @@ TP_WBALANCE_TEMPERATURE;מידת חום !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens !HISTORY_MSG_488;Dynamic Range Compression -!HISTORY_MSG_489;DRC - Threshold !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves @@ -2025,7 +2024,6 @@ TP_WBALANCE_TEMPERATURE;מידת חום !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression -!TP_TM_FATTAL_THRESHOLD;Threshold !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones diff --git a/rtdata/languages/Italiano b/rtdata/languages/Italiano index 1c24cc52e..53fda9e49 100644 --- a/rtdata/languages/Italiano +++ b/rtdata/languages/Italiano @@ -1569,7 +1569,6 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens !HISTORY_MSG_488;Dynamic Range Compression -!HISTORY_MSG_489;DRC - Threshold !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves @@ -2099,7 +2098,6 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression -!TP_TM_FATTAL_THRESHOLD;Threshold !TP_WAVELET_1;Level 1 !TP_WAVELET_2;Level 2 !TP_WAVELET_3;Level 3 diff --git a/rtdata/languages/Japanese b/rtdata/languages/Japanese index bc5fa66e0..28d1b6cfd 100644 --- a/rtdata/languages/Japanese +++ b/rtdata/languages/Japanese @@ -751,7 +751,6 @@ HISTORY_MSG_485;レンズ補正 HISTORY_MSG_486;レンズ補正 - カメラ HISTORY_MSG_487;レンズ補正 - レンズ HISTORY_MSG_488;ダイナミックレンジ圧縮 -HISTORY_MSG_489;DRC - しきい値 HISTORY_MSG_490;DRC - 量 HISTORY_MSG_491;ホワイトバランス HISTORY_MSG_492;RGBカーブ @@ -2037,7 +2036,6 @@ TP_SOFTLIGHT_STRENGTH;強さ TP_TM_FATTAL_AMOUNT;量 TP_TM_FATTAL_ANCHOR;アンカー TP_TM_FATTAL_LABEL;ダイナミックレンジ圧縮 -TP_TM_FATTAL_THRESHOLD;しきい値 TP_VIBRANCE_AVOIDCOLORSHIFT;色ずれを回避 TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;肌色トーン diff --git a/rtdata/languages/Latvian b/rtdata/languages/Latvian index 2a3ca3759..e8b87c19b 100644 --- a/rtdata/languages/Latvian +++ b/rtdata/languages/Latvian @@ -968,7 +968,6 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens !HISTORY_MSG_488;Dynamic Range Compression -!HISTORY_MSG_489;DRC - Threshold !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves @@ -2025,7 +2024,6 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression -!TP_TM_FATTAL_THRESHOLD;Threshold !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones diff --git a/rtdata/languages/Magyar b/rtdata/languages/Magyar index 9bd662821..354c32910 100644 --- a/rtdata/languages/Magyar +++ b/rtdata/languages/Magyar @@ -1240,7 +1240,6 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens !HISTORY_MSG_488;Dynamic Range Compression -!HISTORY_MSG_489;DRC - Threshold !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves @@ -2079,7 +2078,6 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression -!TP_TM_FATTAL_THRESHOLD;Threshold !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones !TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE1;Red/Purple diff --git a/rtdata/languages/Nederlands b/rtdata/languages/Nederlands index 15f7b959b..45f1c5e3f 100644 --- a/rtdata/languages/Nederlands +++ b/rtdata/languages/Nederlands @@ -2103,7 +2103,6 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens !HISTORY_MSG_488;Dynamic Range Compression -!HISTORY_MSG_489;DRC - Threshold !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves @@ -2302,5 +2301,4 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression -!TP_TM_FATTAL_THRESHOLD;Threshold !TP_WAVELET_CB_TOOLTIP;For strong values product color-toning by combining it or not with levels decomposition 'toning'\nFor low values you can change the white balance of the background (sky, ...) without changing that of the front plane, generally more contrasted diff --git a/rtdata/languages/Norsk BM b/rtdata/languages/Norsk BM index 958ed12ad..a4a6fc523 100644 --- a/rtdata/languages/Norsk BM +++ b/rtdata/languages/Norsk BM @@ -967,7 +967,6 @@ TP_WBALANCE_TEMPERATURE;Temperatur !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens !HISTORY_MSG_488;Dynamic Range Compression -!HISTORY_MSG_489;DRC - Threshold !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves @@ -2024,7 +2023,6 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression -!TP_TM_FATTAL_THRESHOLD;Threshold !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones diff --git a/rtdata/languages/Polish b/rtdata/languages/Polish index 3e853bf20..eeb945ef2 100644 --- a/rtdata/languages/Polish +++ b/rtdata/languages/Polish @@ -1651,7 +1651,6 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens !HISTORY_MSG_488;Dynamic Range Compression -!HISTORY_MSG_489;DRC - Threshold !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves @@ -2105,7 +2104,6 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression -!TP_TM_FATTAL_THRESHOLD;Threshold !TP_WAVELET_1;Level 1 !TP_WAVELET_2;Level 2 !TP_WAVELET_3;Level 3 diff --git a/rtdata/languages/Polish (Latin Characters) b/rtdata/languages/Polish (Latin Characters) index f847eb6b9..ed27de93b 100644 --- a/rtdata/languages/Polish (Latin Characters) +++ b/rtdata/languages/Polish (Latin Characters) @@ -1651,7 +1651,6 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens !HISTORY_MSG_488;Dynamic Range Compression -!HISTORY_MSG_489;DRC - Threshold !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves @@ -2105,7 +2104,6 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression -!TP_TM_FATTAL_THRESHOLD;Threshold !TP_WAVELET_1;Level 1 !TP_WAVELET_2;Level 2 !TP_WAVELET_3;Level 3 diff --git a/rtdata/languages/Portugues (Brasil) b/rtdata/languages/Portugues (Brasil) index d8e5ccc1f..28822efbd 100644 --- a/rtdata/languages/Portugues (Brasil) +++ b/rtdata/languages/Portugues (Brasil) @@ -717,7 +717,6 @@ HISTORY_MSG_485;Correção de Lente HISTORY_MSG_486;Correção de Lente - Câmera HISTORY_MSG_487;Correção de Lente - Lente HISTORY_MSG_488;Compressão de Amplitude Dinâmica(DRC) -HISTORY_MSG_489;DRC - Limite HISTORY_MSG_490;DRC - Montante HISTORY_MSG_491;Balanço de Branco HISTORY_MSG_492;Curvas RGB @@ -2000,7 +1999,6 @@ TP_SOFTLIGHT_STRENGTH;Intensidade TP_TM_FATTAL_AMOUNT;Montante TP_TM_FATTAL_ANCHOR;Âncora TP_TM_FATTAL_LABEL;Compressão de Amplitude Dinâmica(DRC) -TP_TM_FATTAL_THRESHOLD;Limite TP_VIBRANCE_AVOIDCOLORSHIFT;Evite mudança de cor TP_VIBRANCE_CURVEEDITOR_SKINTONES;MM TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Tons cor de pele diff --git a/rtdata/languages/Russian b/rtdata/languages/Russian index 176d86511..424be3cbf 100644 --- a/rtdata/languages/Russian +++ b/rtdata/languages/Russian @@ -1633,7 +1633,6 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens !HISTORY_MSG_488;Dynamic Range Compression -!HISTORY_MSG_489;DRC - Threshold !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction @@ -2105,7 +2104,6 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression -!TP_TM_FATTAL_THRESHOLD;Threshold !TP_WAVELET_1;Level 1 !TP_WAVELET_2;Level 2 !TP_WAVELET_3;Level 3 diff --git a/rtdata/languages/Serbian (Cyrilic Characters) b/rtdata/languages/Serbian (Cyrilic Characters) index 4b570abb7..8ea1f8fdb 100644 --- a/rtdata/languages/Serbian (Cyrilic Characters) +++ b/rtdata/languages/Serbian (Cyrilic Characters) @@ -1545,7 +1545,6 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens !HISTORY_MSG_488;Dynamic Range Compression -!HISTORY_MSG_489;DRC - Threshold !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves @@ -2100,7 +2099,6 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression -!TP_TM_FATTAL_THRESHOLD;Threshold !TP_WAVELET_1;Level 1 !TP_WAVELET_2;Level 2 !TP_WAVELET_3;Level 3 diff --git a/rtdata/languages/Serbian (Latin Characters) b/rtdata/languages/Serbian (Latin Characters) index a5d5094c6..1bc4057be 100644 --- a/rtdata/languages/Serbian (Latin Characters) +++ b/rtdata/languages/Serbian (Latin Characters) @@ -1545,7 +1545,6 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens !HISTORY_MSG_488;Dynamic Range Compression -!HISTORY_MSG_489;DRC - Threshold !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves @@ -2100,7 +2099,6 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression -!TP_TM_FATTAL_THRESHOLD;Threshold !TP_WAVELET_1;Level 1 !TP_WAVELET_2;Level 2 !TP_WAVELET_3;Level 3 diff --git a/rtdata/languages/Slovak b/rtdata/languages/Slovak index 7e7fcdf86..dc0351823 100644 --- a/rtdata/languages/Slovak +++ b/rtdata/languages/Slovak @@ -1030,7 +1030,6 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens !HISTORY_MSG_488;Dynamic Range Compression -!HISTORY_MSG_489;DRC - Threshold !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves @@ -2034,7 +2033,6 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression -!TP_TM_FATTAL_THRESHOLD;Threshold !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones diff --git a/rtdata/languages/Suomi b/rtdata/languages/Suomi index 6e32cea61..adbd43d82 100644 --- a/rtdata/languages/Suomi +++ b/rtdata/languages/Suomi @@ -969,7 +969,6 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens !HISTORY_MSG_488;Dynamic Range Compression -!HISTORY_MSG_489;DRC - Threshold !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves @@ -2025,7 +2024,6 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression -!TP_TM_FATTAL_THRESHOLD;Threshold !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones diff --git a/rtdata/languages/Swedish b/rtdata/languages/Swedish index 510d6696d..e491c3c8a 100644 --- a/rtdata/languages/Swedish +++ b/rtdata/languages/Swedish @@ -1906,7 +1906,6 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens !HISTORY_MSG_488;Dynamic Range Compression -!HISTORY_MSG_489;DRC - Threshold !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves @@ -2230,7 +2229,6 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression -!TP_TM_FATTAL_THRESHOLD;Threshold !TP_WAVELET_CBENAB;Toning and Color Balance !TP_WAVELET_CB_TOOLTIP;For strong values product color-toning by combining it or not with levels decomposition 'toning'\nFor low values you can change the white balance of the background (sky, ...) without changing that of the front plane, generally more contrasted !TP_WAVELET_CHRO_TOOLTIP;Sets the wavelet level which will be the threshold between saturated and pastel colors.\n1-x: saturated\nx-9: pastel\n\nIf the value exceeds the amount of wavelet levels you are using then it will be ignored. diff --git a/rtdata/languages/Turkish b/rtdata/languages/Turkish index 1ab598c2c..79fa108c0 100644 --- a/rtdata/languages/Turkish +++ b/rtdata/languages/Turkish @@ -968,7 +968,6 @@ TP_WBALANCE_TEMPERATURE;Isı !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens !HISTORY_MSG_488;Dynamic Range Compression -!HISTORY_MSG_489;DRC - Threshold !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves @@ -2024,7 +2023,6 @@ TP_WBALANCE_TEMPERATURE;Isı !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression -!TP_TM_FATTAL_THRESHOLD;Threshold !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones From fb0d231cb2cb288ddb6ff0683839e2e86e8cf855 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sat, 3 Nov 2018 14:26:39 +0100 Subject: [PATCH 077/122] use double precision gaussian blur if sigma >= 25, #4928 --- rtengine/gauss.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/gauss.cc b/rtengine/gauss.cc index ab080a3c4..b7de67851 100644 --- a/rtengine/gauss.cc +++ b/rtengine/gauss.cc @@ -1143,7 +1143,7 @@ template void gaussianBlurImpl(T** src, T** dst, const int W, const int { static constexpr auto GAUSS_SKIP = 0.25; static constexpr auto GAUSS_3X3_LIMIT = 0.6; - static constexpr auto GAUSS_DOUBLE = 70.0; + static constexpr auto GAUSS_DOUBLE = 25.0; if(buffer) { // special variant for very large sigma, currently only used by retinex algorithm From e9aa5437fe899d08aed03905ef7334daf68b5c97 Mon Sep 17 00:00:00 2001 From: TooWaBoo Date: Sun, 4 Nov 2018 01:14:09 +0100 Subject: [PATCH 078/122] Update TooWaBlue theme v2.85 Minor fixes Code cleanup Made the theme a bit more structured --- rtdata/themes/TooWaBlue-GTK3-20_.css | 896 +++++++++++---------------- 1 file changed, 376 insertions(+), 520 deletions(-) diff --git a/rtdata/themes/TooWaBlue-GTK3-20_.css b/rtdata/themes/TooWaBlue-GTK3-20_.css index 041b342e3..44546d6ec 100644 --- a/rtdata/themes/TooWaBlue-GTK3-20_.css +++ b/rtdata/themes/TooWaBlue-GTK3-20_.css @@ -2,7 +2,7 @@ This file is part of RawTherapee. Copyright (c) 2016-2018 TooWaBoo - Version 2.83 + Version 2.85 RawTherapee is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -113,10 +113,6 @@ window > box { dialog { background-color: @bg-grey; border-radius: 0; - -GtkDialog-button-spacing: 6; - -GtkDialog-content-area-spacing: 4; - -GtkDialog-content-area-border: 0; - -GtkDialog-action-area-border: 0; } dialog > box { padding: 0.666666666666666666em; @@ -135,18 +131,6 @@ tooltip { tooltip label { color: @text-tooltip; } -.grid-spacing > * { - margin-top: 0.166666666666666666em; - margin-bottom: 0.166666666666666666em; -} -.grid-spacing > label:not(:first-child) { - margin-left: 0.75em; - margin-right: 0.25em; -} -.grid-spacing > label:first-child { - margin-left: 0; - margin-right: 0.25em; -} paned { background-color: @bg-light-grey; @@ -176,8 +160,7 @@ undershoot { } label { - padding: 0; - margin: 0; + margin: 0 0.166666666666666666em; } /*** Frames ************************************************************************************/ @@ -219,7 +202,7 @@ frame > border { #BatchQueueButtonsMainContainer > frame > border, #MyExpander frame > border, dialog frame > border { - padding: 0.5em; + padding: 0.416666666666666666em; border-radius: 0; border: 0.083333333333333333em solid @border-color; background-color: transparent; @@ -249,7 +232,7 @@ dialog frame > label { frame > label { margin: 0; - padding: 0.416666666666666666em 0 0.333333333333333333em 0.083333333333333333em; + padding: 0.416666666666666666em 0; color: @headline-frame; } frame > checkbutton label{ @@ -284,7 +267,7 @@ textview:selected, treeview:selected { #RightNotebook > stack > :nth-child(1) checkbutton + scrolledwindow treeview { border-bottom: 0.083333333333333333em solid @bg-dark-grey; } - +/**/ #PlacesPaned > box:nth-child(3) treeview { padding: 0.25em 0.333333333333333333em 0.25em 0.333333333333333333em; @@ -321,27 +304,6 @@ textview:selected, treeview:selected { border-top: 0.083333333333333333em solid @view-grid-border; } -#Snapshots button, -#PlacesPaned > box:nth-child(1) scrolledwindow + grid > button { - margin: 0; - padding: 0; - background-color: transparent; - background-image: none; - border: 0.083333333333333333em solid @bg-dark-grey; - border-radius: 0; - box-shadow: none; - min-height: 2em; -} - -#Snapshots button:hover, -#PlacesPaned > box:nth-child(1) scrolledwindow + grid > button:hover { -background-color: @bg-list-hover; -} -#Snapshots button:active, -#PlacesPaned > box:nth-child(1) scrolledwindow + grid > button:active { -background-color: shade(@bg-list-hover, 1.15); -} - fontchooser scrolledwindow, #PlacesPaned scrolledwindow, #HistoryPanel scrolledwindow, @@ -379,6 +341,15 @@ filechooser box > box box > button { margin-top: 0.5em; } +filechooser image { + opacity: 0.80; +} +filechooser *:selected image, +filechooser *:checked image, +filechooser *:active image { + opacity: 1; +} + filechooser list { background-color: @bg-dark-grey; } @@ -566,17 +537,14 @@ menu separator { padding: 0; } -#EditorTopPanel separator, -#IopsPanel separator, -#FileBrowser separator { +.scrollableToolbar separator:not(.dummy) { background-color: shade(@bg-light-grey,.75); - margin-top: 0.166666666666666666em; - margin-bottom: 0.166666666666666666em; + margin: 0.166666666666666666em; } #MyExpander separator { background-color: @view-grid-border; - margin: 0.333333333333333333em 0; + margin: 0.333333333333333333em 0.166666666666666666em; } #MyFileChooserButton separator { background-color: transparent; @@ -722,7 +690,7 @@ scrollbar:not(.overlay-indicator):hover { scale { padding: 0; min-height: 1.833333333333333333em; - margin: 0; + margin: 0 -0.333333333333333333em; } scale slider { @@ -996,10 +964,7 @@ window.csd:not(.fullscreen) #MainNotebook > header.top { background-color: @bg-dark-grey; padding: 0.75em 0; } - -/* All tool panels have a frame except for Meta which unlike the rest is a notebook itself. - * So we use CSS to make it look like a frame. */ - +/* Meta panel notebook */ #MetaPanelNotebook > header { background-color: @bg-grey; padding: 0.333333333333333333em; @@ -1010,7 +975,7 @@ window.csd:not(.fullscreen) #MainNotebook > header.top { padding-left: 0.333333333333333333em; } #MetaPanelNotebook > header tab label{ - margin: 0.083333333333333333em; + margin: 0.083333333333333333em 0.083333333333333333em 0.166666666666666666em; } #MetaPanelNotebook > stack > box { @@ -1027,68 +992,32 @@ window.csd:not(.fullscreen) #MainNotebook > header.top { } #MetaPanelNotebook > stack > box:nth-child(2) > scrolledwindow > viewport.frame { - padding: 0 0 0 1.166666666666666666em; + padding: 0 0 0 1.083333333333333333em; } #MetaPanelNotebook separator { background-color: @border-color; margin: 0.166666666666666666em 0; } -#MetaPanelNotebook entry, #MetaPanelNotebook button, #MetaPanelNotebook combobox button { - margin-top: 0; - margin-bottom: 0; - min-height: 1.666666666666666666em; - min-width: 0; -} #MetaPanelNotebook entry { padding: 0 0.333333333333333333em; background-color: @bg-dark-grey; - margin: 0; border-radius: 0; + margin-left: 0; + margin-right: 0; } -#MetaPanelNotebook > stack > box:nth-child(1) > :nth-child(1) { +#MetaPanelNotebook .view { border: 0.083333333333333333em solid @bg-dark-grey; + padding: 0.083333333333333333em 0.25em; } -#MetaPanelNotebook > stack > box:nth-child(2) > scrolledwindow scrolledwindow { - background-color: @bg-dark-grey; - padding: 0; - margin: 0; -} -#MetaPanelNotebook > stack > box:nth-child(2) .view { - border: 0.083333333333333333em solid @bg-dark-grey; - padding: 0.166666666666666666em; - margin: 0; -} -#MetaPanelNotebook textview.view { - background-color: @bg-dark-grey; - padding: 0.083333333333333333em 0.333333333333333333em; - margin: 0; -} + #MetaPanelNotebook text { background-color: transparent; - padding: 0; - margin: 0; -} - -#MetaPanelNotebook combobox button { - border-top-left-radius: 0; - border-bottom-left-radius: 0; - border-left: none; -} -#MetaPanelNotebook combobox + button, -#MetaPanelNotebook combobox + button + button { - margin-left: 0.166666666666666666em; - min-width: 1.666666666666666666em; -} -#MetaPanelNotebook > stack > box > grid > button { - margin-top: 0.083333333333333333em; - margin-bottom: 0.083333333333333333em; - min-height: 2.5em; } #MetaPanelNotebook label { - padding: 0.083333333333333333em 0; + padding: 0.083333333333333333em 0 0; } /*** end ***************************************************************************************/ @@ -1110,77 +1039,12 @@ window.csd:not(.fullscreen) #MainNotebook > header.top { } #ToolBarPanelFileBrowser { - margin: 0.416666666666666666em -1px; + margin: 0.416666666666666666em 0; min-height: 0; min-width: 0; padding: 0; } -#ToolBarPanelFileBrowser > box > button, -#ToolBarPanelFileBrowser > button { - margin: 0 0.083333333333333333em; -} -/* Filter */ -#ToolBarPanelFileBrowser .smallbuttonbox { - min-height: 1.333333333333333333em; - padding: 0; - margin: 0; -} -#ToolBarPanelFileBrowser .smallbuttonbox:nth-child(2) { - margin: 0.083333333333333333em 0 -0.166666666666666666em; -} -#ToolBarPanelFileBrowser .smallbuttonbox button.smallbutton image { - margin: -0.166666666666666666em; - min-width: 1.333333333333333333em; - min-height: 1.333333333333333333em; -} -#ToolBarPanelFileBrowser .smallbuttonbox button.smallbutton { - min-height: 0; - min-width: 1.333333333333333333em; - padding: 0; - margin: 0 0.25em; - border: none; - border-radius: 0; - background-color: transparent; - background-image: none; - box-shadow: none; -} -#FileBrowser #ToolBarPanelFileBrowser box:nth-child(7) > box.smallbuttonbox > button.smallbutton:checked, -#EditorLeftPaned #ToolBarPanelFileBrowser box:nth-child(5) > box.smallbuttonbox > button.smallbutton:checked { - background-image: image(rgba(30,30,30,.3)); - background-color: @bg-button-active; -} -/**/ - -#FileBrowserQueryToolbar entry + button.flat, -#FileBrowserIconToolbar entry + button.flat { - min-height: 1.666666666666666666em; - min-width: 1.666666666666666666em; - margin: 0; - border-radius: 0 0.2em 0.2em 0; - box-shadow: inset 0 0.083333333333333333em rgba(0, 0, 0, 0.08), 0 0.083333333333333333em rgba(242, 242, 242, 0.1); - border: 0.083333333333333333em solid @bg-entry-border; - background-color: @bg-scale-entry; - padding: 0; -} -#FileBrowserQueryToolbar entry + button.flat:not(:hover):not(:active), -#FileBrowserIconToolbar entry + button.flat:not(:hover):not(:active) { - border-left: none; - padding-left: 0.083333333333333333em; -} -#FileBrowserQueryToolbar entry, -#FileBrowserIconToolbar entry { - min-height: 1.666666666666666666em; - min-width: 0; - margin: 0; - padding: 0 0.333333333333333333em; - border-right: none; - border-radius: 0.2em 0 0 0.2em; -} -#FileBrowserQueryToolbar label, -#FileBrowserIconToolbar label { - margin: 0 0.333333333333333333em 0 0.5em; -} /*** end ***************************************************************************************/ /*** Image Editor ******************************************************************************/ @@ -1207,59 +1071,23 @@ window.csd:not(.fullscreen) #MainNotebook > header.top { min-height: 2.666666666666666666em; padding: 0 0.5em; } -/* Small Lock Button */ -#BeforeAfterContainer button { - min-height: 2em; - min-width: 2em; - margin: 0.25em 0.25em 0.25em 0; - padding: 0; - border-radius: 0.2em; - border: 0.083333333333333333em solid @bg-button-border; - background-color: transparent; - box-shadow: inset 0 0.083333333333333333em rgba(242, 242, 242, 0.1); - background-image: linear-gradient(to bottom, rgba(100,100,100,.3), rgba(30,30,30,.3)); -} -#BeforeAfterContainer button image{ - margin: 0 0 0 0.083333333333333333em; -} -#BeforeAfterContainer button:checked image{ - margin: 0.083333333333333333em -0.166666666666666666em 0.083333333333333333em 0.25em; -} -/**/ #EditorToolbarTop { - margin: 0 -2px 0; + margin: 0 -1px 0 -1px; padding: 0; min-height: 0; } -#EditorTopPanel button { - margin: 0 0.083333333333333333em; - min-height: 2.5em; - min-width: 2.5em; -} -/* Removes margin from the last button. Otherwise the filmstrip will cut of the right border. */ -#EditorTopPanel :last-child > button:last-child { - margin-right: 0; +#IopsPanel { + margin: 0; + padding: 0; + min-height: 0; } -#EditorTopPanel button.narrowbutton { - min-width: 0.833333333333333333em; - padding: 0 0.166666666666666666em; -} - -/*Button editor bottom*/ #EditorZoomPanel label { min-width: 4em; margin: 0; } -#IopsPanel button.Left image { - padding: 0 2px 0 3px; -} -#EditorZoomPanel button { - margin-left: 0.083333333333333333em; - margin-right: 0.083333333333333333em; -} /*** end ***************************************************************************************/ /*** Toolbox ***********************************************************************************/ @@ -1270,7 +1098,8 @@ window.csd:not(.fullscreen) #MainNotebook > header.top { #MyExpander image { min-width: 1.333333333333333333em; - min-height: 1.333333333333333333em + min-height: 1.333333333333333333em; + margin: 0 0.166666666666666666em; } /*Curve spinbutton background */ @@ -1310,7 +1139,7 @@ window.csd:not(.fullscreen) #MainNotebook > header.top { border: none; border-radius: 0; margin: 0; - padding: 0.5em; + padding: 0.416666666666666666em; } /* Sub-tool (MyExpander) */ @@ -1319,7 +1148,7 @@ window.csd:not(.fullscreen) #MainNotebook > header.top { border: 0.083333333333333333em solid @border-color; border-radius: 0; margin: 0; - padding: 0.5em; + padding: 0.416666666666666666em; } #MyExpanderTitle > box { @@ -1384,11 +1213,12 @@ menuitem:hover > * { color: @text-hl-color; } -menu image { +menu image:not(.dummy), +#MyExpander menu image:not(.dummy) { min-height: 2em; min-width: 1.333333333333333333em; padding: 0; - margin: 0 0.25em 0 -1.166666666666666666em; + margin: 0 0 0 -1.583333333333333333em; } /*** Selection popup list (used in filechooser) ***/ @@ -1440,9 +1270,9 @@ popover.background modelbutton:hover { /*** Switch ***********************************************************************************/ switch { - min-height: 2.5em; + min-height: 2.333333333333333333em; min-width: 11em; - margin: 0; + margin: 0 0.166666666666666666em; padding: 0; border-radius: 0.2em; background-image: none; @@ -1487,45 +1317,17 @@ switch:disabled:not(:checked) { /** end ****************************************************************************************/ /*** Buttons ***********************************************************************************/ -button { - min-height: 2.5em; - min-width: 2.5em; - margin: 0; - padding: 0; /* x */ +button, +#BeforeAfterContainer button { + min-height: 1.666666666666666666em; + min-width: 1.666666666666666666em; + margin: 0.166666666666666666em; border-radius: 0.2em; border: 0.083333333333333333em solid @bg-button-border; background-color: transparent; box-shadow: inset 0 0.083333333333333333em rgba(242, 242, 242, 0.1); background-image: linear-gradient(to bottom, rgba(100,100,100,.3), rgba(30,30,30,.3)); } -button.flat { - padding: 0;/* x */ -} -button.text-button label { - margin: 0 0.5em;/* x */ -} - -button image + label { - margin-left: 0.25em; -} - -#PrefNotebook > stack > :nth-child(5) combobox { - /* margin: 0.166666666666666666em 0; */ - margin: 2px 0; -} -#PrefNotebook > stack > :nth-child(2) #MyFileChooserButton { - /* margin: 0.25em 0.333333333333333333em; */ - margin: 3px 5px; -} - -filechooser button image, -#MyFileChooserButton image { - min-width: 1.333333333333333333em; - min-height: 1.333333333333333333em; - opacity: .85; -} - -#MainNotebook > header > grid > button, button.flat { border: 0.083333333333333333em solid transparent; box-shadow: none; @@ -1533,199 +1335,91 @@ button.flat { background-color: transparent; } -/* Resetbutton */ -#MyExpander button:last-child.flat, -#MyExpander scale + button.flat, -dialog scale + button.flat, -#MainNotebook > stack > :nth-child(2) > box:nth-child(1) scale + button.flat, -entry + button.flat { - min-height: 1.166666666666666666em; - min-width: 1.5em; - margin: 0.083333333333333333em 0 0.083333333333333333em 0.166666666666666666em; - padding: 0 0 0 0.166666666666666666em; -} -dialog entry + button:last-child.flat { - min-height: 1.666666666666666666em; -} - -#MyExpander scale + button:last-child.flat, -#MyExpander spinbutton + button:last-child.flat { - margin: 0 0 0 0.166666666666666666em; -} -#MyExpander image + button:last-child.flat { - margin: 0 0 0 0.25em; -} -/**/ - -/* Buttons Curve drawingarea*/ -#MyExpander grid > grid > grid > button.flat + button.flat, -#MyExpander grid > grid > grid > button.flat:first-child { - min-height: 2.5em; - min-width: 2.5em; - margin: 0.166666666666666666em 0.166666666666666666em 0 0; - padding: 0; -} -/**/ - -#BeforeAfterContainer button:hover, -#ToolBarPanelFileBrowser entry + button:hover, -#FileBrowser entry + button:hover, button.flat:hover, -button:hover { +button:hover, +#BeforeAfterContainer button:hover { border-color: @bg-button-border; box-shadow: inset 0 0.083333333333333333em rgba(242, 242, 242, 0.1); background-image: linear-gradient(to bottom, rgba(100,100,100,.3), rgba(30,30,30,.3)); background-color: @bg-button-hover; } +#MainNotebook > header tab #CloseButton:hover, +#MainNotebook > header > grid > button:hover { + background-color: alpha(@bg-grey, 0.6); + border-color: shade(@bg-dark-grey, 0.6); +} -#BeforeAfterContainer button:checked, -#ToolBarPanelFileBrowser entry + button:active, -#FileBrowser entry + button:active, button.flat:active, button.flat:checked, button:active, -button:checked { +button:checked, +#BeforeAfterContainer button:checked { border-color: @bg-button-border; box-shadow: inset 0 0.083333333333333333em rgba(242, 242, 242, 0.08); background-image: linear-gradient(to bottom, rgba(100,100,100,.3), rgba(30,30,30,.3)); background-color: @bg-button-active; } - -/* Add space between connected buttons */ -button.Right, -button.MiddleH { - margin-left: 0.166666666666666666em; - border: 0.083333333333333333em solid @bg-button-border; -} -/**/ - -/* Applies special styles in main notebook */ -#ProfilePanel { - margin-bottom: -2px; - padding-bottom: 0.416666666666666666em; -} -#ProfilePanel > label { - margin-bottom: 0.083333333333333333em; -} -#ProfilePanel combobox { - margin-left: 0.166666666666666666em; - margin-right: 0.166666666666666666em; -} -#ProfilePanel button.Left { - margin-left: -2px; +#MainNotebook > header tab #CloseButton:active, +#MainNotebook > header > grid > button:active { + background-color: alpha(@bg-light-grey, 0.8); + border-color: shade(@bg-dark-grey, 0.6); } -#PlacesPaned combobox { - margin-bottom: -8px; - padding-bottom: 0.416666666666666666em; +button label { + margin: 0 0.416666666666666666em; } -/**/ - -/* Button base format for Toolbox and dialogs */ -#ToolPanelNotebook > stack > box > box > combobox button, -dialog button, -#MyExpander button, -#BatchQueueButtonsMainContainer button { - min-height: 1.666666666666666666em; - min-width: 0; - padding: 0 0.416666666666666666em; - margin: 0.083333333333333333em 0; +button image:not(.dummy), +#MyExpander button image:not(.dummy) { + margin: 0; } -#MyExpander #MyFileChooserButton + button.image-button{ - min-width: 1.666666666666666666em; - padding: 0; +#MyFileChooserButton label { + margin: 0 0 0 0.416666666666666666em; } - -combobox button.combo, -#ToolPanelNotebook > stack > box > box > combobox button.combo, -dialog combobox button.combo, -#MyExpander combobox button.combo, -#BatchQueueButtonsMainContainer combobox button.combo { - padding: 0 0.166666666666666666em 0 0.25em; +#MyFileChooserButton image { + padding: 0 0.416666666666666666em 0 0; + opacity: 0.85; } - -#ToolPanelNotebook > stack > box > box > combobox { - margin-right: 0.25em; +button.combo { + padding: 0 0 0 0.25em; } - -combobox entry + button { - padding: 0; +combobox arrow { + margin-right: 0.083333333333333333em; } -combobox entry + button arrow{ - margin: 0 -0.166666666666666666em 0 -0.25em; +#MetaPanelNotebook button + button:last-child, +#MetaPanelNotebook scrolledwindow ~ combobox entry + button:not(.dummy) { + margin-right: 0; } - -/* Add/remove space between buttons and labels in toolbox*/ -#ToolPanelNotebook > stack > box > box > label { - margin: 0 0 0 0.25em; -} - -#MyExpander combobox:not(:first-child):not(:only-child), -#MyExpander .image-combo:not(:first-child), -#MyExpander button:not(.flat) + combobox, -#MyExpander combobox + button:not(.flat), -#MyExpander combobox + combobox, -#MyExpander button + label, -#MyExpander combobox + label { - margin-left: 0.166666666666666666em; -} - -#MyExpander label + * > button:not(.flat).Left, -#MyExpander label + combobox:not(:first-child):not(:only-child), -#MyExpander label + button:not(.flat):not(spinbutton) { - margin-left: 0.333333333333333333em; -} - -buttonbox:not(.dialog-action-area) button{ - margin: 0.083333333333333333em 0 0.333333333333333333em 0.166666666666666666em; -} -#PrefNotebook buttonbox:not(.dialog-action-area) { - margin-right: -5px; -} - -/* Arrow toggle combo button */ -#IopsPanel .image-combo button.Right, -#MyExpander .image-combo button.Right { - border-left: none; +#MetaPanelNotebook scrolledwindow + grid > button:first-child, +#MetaPanelNotebook scrolledwindow + grid + grid > button:first-child { margin-left: 0; - padding-left: 0; - padding-right: 0; +} +#MetaPanelNotebook scrolledwindow + grid > button:last-child, +#MetaPanelNotebook scrolledwindow + grid + grid > button:last-child { + margin-right: 0; +} +combobox entry + button:not(.dummy) arrow { + margin-right: 0; +} +combobox entry + button:not(.dummy) { + min-width: 1em; + margin-left: 0; + padding: 0 ; border-top-left-radius: 0; border-bottom-left-radius: 0; - min-width: 1.333333333333333333em; + border-left: none; } -#IopsPanel .image-combo button.Left, -#MyExpander .image-combo button.Left { - border-top-right-radius: 0; - border-bottom-right-radius: 0; - min-width: 2.5em; +#PlacesPaned button.combo { + margin: 0 0 calc(0.416666666666666666em - 8px) 0; } -/**/ -/**/ -#MyExpander button.text-button label { - margin: 0;/* x */ +/* Reset button */ +scale + button.flat, +spinbutton + button.flat, +scale + image + image + button.flat { + min-height: 1.333333333333333333em; } -/* Graduated filter big button */ -#MyExpander button.independent:not(.image-button):not(.text-button):first-child:only-child { - min-height: 2.5em; - min-width: 2.5em; - padding: 0; - margin: 0.25em 0; -} -/**/ -/* Pipette */ -#MyExpander button.independent.image-button { - min-height: 2.5em; -} -#MyExpander button.independent.image-button + label + combobox button { - margin: 0.5em 0; -} -#MyExpander button.independent.image-button + label { - margin-left: 2em ; -} -/**/ +/*Color chooser & buttons */ button.color { min-height: 1.166666666666666666em; min-width: 2.75em; @@ -1741,12 +1435,13 @@ colorchooser colorswatch#add-color-button:first-child { /* Save, Cancel, OK ... buttons */ .dialog-action-area button { - min-height: 2.5em; - margin-top: 0.333333333333333333em; + min-height: 2.166666666666666666em; + margin-top: 1em; + padding: 0; } messagedialog .dialog-action-area button { - margin: 0 0.666666666666666666em 0.666666666666666666em 0.666666666666666666em; - min-height: 2.166666666666666666em;; + min-height: 1.833333333333333333em; + margin: -12px 0.5em 0.5em 0.5em; } messagedialog .dialog-action-area button:not(:only-child):nth-child(1) { margin-right: 0.25em; @@ -1754,25 +1449,224 @@ messagedialog .dialog-action-area button:not(:only-child):nth-child(1) { messagedialog .dialog-action-area button:not(:only-child):nth-child(2) { margin-left: 0.25em; } + +/* Big tool buttons */ +#ToolBarPanelFileBrowser button, +#EditorTopPanel button, +#IopsPanel button, +#ProfilePanel button, +#MainNotebook > header > grid > button, +#MyExpander button.independent:not(.image-button):not(.text-button):first-child:only-child/* Graduated filter big button */, +#MyExpander button.independent.image-button,/* Picker button */ +#MyExpander .drawingarea + grid > button.flat,/* Curve buttons */ +#BatchQueueButtonsMainContainer + grid + box button, +#RightNotebook > stack > scrolledwindow:last-child button.image-button,/* Fast Export */ +#MetaPanelNotebook scrolledwindow + grid > button, +#MetaPanelNotebook scrolledwindow + grid + grid > button { + min-height: 2.5em; + min-width: 2.5em; + margin: 0 0.166666666666666666em; +} +#ToolBarPanelFileBrowser > button:first-child, +#EditorTopPanel > button:first-child, +#IopsPanel > button:nth-child(6), +#ProfilePanel > grid > button:first-child { + margin-left: 0; +} +#ToolBarPanelFileBrowser > button:last-child, +#ToolBarPanelFileBrowser > box:last-child > button:last-child, +#EditorTopPanel > button:last-child, +#EditorTopPanel > box:last-child > button:last-child, +#IopsPanel > button:last-child, +#ProfilePanel > grid > button:last-child, +#BatchQueueButtonsMainContainer + grid + box button { + margin-right: 0; +} +#MyExpander button.independent:not(.image-button):not(.text-button):first-child:only-child/* Graduated filter button */, +#MyExpander button.independent.image-button,/* Picker button */ +#MyExpander .drawingarea + grid > button.flat,/* Curve buttons */ +#MetaPanelNotebook scrolledwindow + grid > button, +#MetaPanelNotebook scrolledwindow + grid + grid > button { + margin: 0.166666666666666666em; +} + +#MyExpander button.independent.image-button + label + combobox button { + margin-top: 0.5em; + margin-bottom: 0.5em; +} + +#ProfilePanel combobox { + margin-right: -2px; +} +#ProfilePanel > grid { + margin-bottom: calc(0.416666666666666666em -2px); +} +#EditorTopPanel button.narrowbutton { + min-width: 0.833333333333333333em; + padding: 0 0.166666666666666666em; +} + +/* Image close button */ +#MainNotebook > header tab #CloseButton { + padding: 0; + margin: 0.333333333333333333em 0 0.416666666666666666em 0.166666666666666666em; + min-width: 1.5em; + min-height: 0; +} +#MainNotebook > header tab #CloseButton image{ + min-width: 1.333333333333333333em; + min-height: 1.333333333333333333em; +} + +/* Filter buttons*/ +#ToolBarPanelFileBrowser .smallbuttonbox { + min-height: 1.333333333333333333em; + padding: 0; + margin: 0; +} +#ToolBarPanelFileBrowser .smallbuttonbox:nth-child(2) { + margin: 0.083333333333333333em 0 -0.166666666666666666em; +} +#ToolBarPanelFileBrowser .smallbuttonbox button.smallbutton image { + margin: -0.166666666666666666em; + min-width: 1.333333333333333333em; + min-height: 1.333333333333333333em; +} +#ToolBarPanelFileBrowser .smallbuttonbox button.smallbutton { + min-height: 0; + min-width: 1.333333333333333333em; + padding: 0; + margin: 0 0.25em; + border: none; + border-radius: 0; + background-color: transparent; + background-image: none; + box-shadow: none; +} +#FileBrowser #ToolBarPanelFileBrowser box:nth-child(7) > box.smallbuttonbox > button.smallbutton:checked, +#EditorLeftPaned #ToolBarPanelFileBrowser box:nth-child(5) > box.smallbuttonbox > button.smallbutton:checked { + background-image: image(rgba(30,30,30,.3)); + background-color: @bg-button-active; +} + +/* Arrow toggle combo button */ +#IopsPanel .image-combo button.Right, +#MyExpander .image-combo button.Right { + border-left: none; + margin-left: 0; + padding: 0; + border-top-left-radius: 0; + border-bottom-left-radius: 0; + min-width: 1.333333333333333333em; +} +#IopsPanel .image-combo button.Right image, +#MyExpander .image-combo button.Right image { + margin: 0 -0.083333333333333333em; +} +#IopsPanel .image-combo button.Left, +#MyExpander .image-combo button.Left { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + min-width: 2.5em; + margin-right: 0; +} +#MyExpander .image-combo button.Left { + min-width: 2.75em; +} +#MyExpander .image-combo button.Left label { + margin-right: 0; +} + +/* Search & Query buttons */ +#FileBrowserQueryToolbar entry + button.flat, +#FileBrowserIconToolbar entry + button.flat { + min-height: 1.666666666666666666em; + min-width: 1.666666666666666666em; + margin: 0; + border-radius: 0 0.2em 0.2em 0; + box-shadow: inset 0 0.083333333333333333em rgba(0, 0, 0, 0.08), 0 0.083333333333333333em rgba(242, 242, 242, 0.1); + border: 0.083333333333333333em solid @bg-entry-border; + background-color: @bg-scale-entry; + padding: 0; +} +#FileBrowserQueryToolbar entry + button.flat:not(:hover):not(:active), +#FileBrowserIconToolbar entry + button.flat:not(:hover):not(:active) { + border-left: none; + padding-left: 0.083333333333333333em; +} +#FileBrowserQueryToolbar entry, +#FileBrowserIconToolbar entry { + min-height: 1.666666666666666666em; + min-width: 0; + margin: 0; + padding: 0 0.333333333333333333em; + border-right: none; + border-radius: 0.2em 0 0 0.2em; +} + +/* Small Lock Button */ +#BeforeAfterContainer button { + min-height: 2em; + min-width: 2em; + margin: 0.25em 0.25em 0.25em 0; + padding: 0; + border-radius: 0.2em; + border: 0.083333333333333333em solid @bg-button-border; + background-color: transparent; + box-shadow: inset 0 0.083333333333333333em rgba(242, 242, 242, 0.1); + background-image: linear-gradient(to bottom, rgba(100,100,100,.3), rgba(30,30,30,.3)); +} +#BeforeAfterContainer button image{ + margin: 0 0 0 0.083333333333333333em; +} +#BeforeAfterContainer button:checked image{ + margin: 0.083333333333333333em -0.166666666666666666em 0.083333333333333333em 0.25em; +} + +/* Snapshot & Places buttons */ +#Snapshots button, +#PlacesPaned > box:nth-child(1) scrolledwindow + grid > button { + margin: 0; + padding: 0; + background-color: transparent; + background-image: none; + border: 0.083333333333333333em solid @bg-dark-grey; + border-radius: 0; + box-shadow: none; + min-height: 1.833333333333333333em; +} + +#Snapshots button:hover, +#PlacesPaned > box:nth-child(1) scrolledwindow + grid > button:hover { +background-color: @bg-list-hover; +} +#Snapshots button:active, +#PlacesPaned > box:nth-child(1) scrolledwindow + grid > button:active { +background-color: shade(@bg-list-hover, 1.15); +} /**/ + /* View & Filechooser Buttons */ -dialog .view button, -window .view button { +.view button { background-color: @bg-dark-grey; background-image: none; box-shadow: none; min-height: 2em; min-width: 1.333333333333333333em; - padding: 0 0.166666666666666666em 0 0.333333333333333333em; + padding: 0 0.166666666666666666em; margin: 0; } +#pathbarbox button { + min-width: 2em; + margin: 0; + padding: 0; + } window treeview > header image { min-width: 1.333333333333333333em; } -dialog .view button.text-button label, -window .view button.text-button label { +.view button.text-button label { margin: 0; } window .view button { @@ -1793,40 +1687,34 @@ dialog .view button { color: @headline-hl; } -dialog .view header button:not(:first-child):not(:only-child), -window .view header button:not(:first-child):not(:only-child), +.view header button:not(:first-child):not(:only-child), .path-bar button:not(:first-child):not(:only-child) { border-left: none; } -dialog .view header button, -window .view header button, +.view header button, .path-bar button { border-radius: 0; } -#pathbarbox button:last-child { - min-height: 2em; - min-width: 2em; - margin: 0; - padding: 0; - } .path-bar button:first-child { border-top-left-radius: 0.2em; border-bottom-left-radius: 0.2em; - min-width: 2em; margin: 0; padding: 0; } .path-bar button:last-child { border-top-right-radius: 0.2em; border-bottom-right-radius: 0.2em; - min-width: 2em; margin: 0; padding: 0; } -.path-bar button label { - margin: 0; - padding: 0 0.333333333333333333em; +#pathbarbox button:not(:first-child):not(:last-child) label { + margin: 0 0.5em; +} + +#pathbarbox button:not(:first-child):not(:last-child) image { + margin: 0 0 0 0.5em; + min-width: 1.333333333333333333em; } /**/ @@ -1861,73 +1749,6 @@ popover button.text-button:active { } /**/ -/* Titlebar & Notebook buttons */ -#MainNotebook > header.top > grid > button { - margin: 0 0 0 0.416666666666666666em; -} -#MainNotebook > header.left > grid > button { - margin: 0.416666666666666666em 0 0; -} - -headerbar button.titlebutton image { - padding: 0; - margin: 0; -} -headerbar button.titlebutton { - margin: 0 0 0 0.333333333333333333em; - background-image: none; - border: 0.083333333333333333em solid transparent; - background-color: transparent; - box-shadow: none; - min-width: 1.5em; - min-height: 1.5em; - padding: 0; -} -messagedialog headerbar button.titlebutton { - min-width: 1.25em; - min-height: 1.25em; - margin: 0; -} - -#MainNotebook tab #CloseButton { - padding: 0; - margin: 0.333333333333333333em 0 0.416666666666666666em 0.25em; - min-width: 1.5em; - min-height: 0; -} -#MainNotebook tab #CloseButton image{ - min-width: 1.333333333333333333em; - min-height: 1.333333333333333333em; -} -#MainNotebook > header > grid > button:hover, -#MainNotebook tab #CloseButton:hover, -headerbar button.titlebutton:hover{ - border-color: rgba(0,0,0,.8); - box-shadow: inset 0 0.083333333333333333em rgba(242, 242, 242, 0.11); - background-image: linear-gradient(to bottom, rgba(100,100,100,.3), rgba(30,30,30,.3)); - background-color: rgba(128, 128, 128,.20); -} -#MainNotebook > header > grid > button:active, -headerbar button.titlebutton:active{ - border-color: rgba(0,0,0,.8); - box-shadow: inset 0 0.083333333333333333em rgba(242, 242, 242, 0.15); - background-image: linear-gradient(to bottom, rgba(100,100,100,.3), rgba(30,30,30,.3)); - background-color: rgba(128, 128, 128,.40); -} -#MainNotebook tab #CloseButton:hover, -headerbar button.titlebutton.close:hover{ - border-color: rgba(0,0,0,.8); - background-image: linear-gradient(to bottom, rgb(180,0,0), rgb(160,0,0) 40%, rgb(130,0,0)); - box-shadow: inset 0 0.083333333333333333em rgba(242, 242, 242, 0.32); -} -#MainNotebook tab #CloseButton:active, -headerbar button.titlebutton.close:active{ - border-color: rgba(0,0,0,.8); - background-image: linear-gradient(to bottom, rgb(215,0,0), rgb(185,0,0) 40%, rgb(150,0,0)); - box-shadow: inset 0 0.083333333333333333em rgba(242, 242, 242, 0.4); -} -/**/ - /*** end ***************************************************************************************/ /*** Ckeckbox & Radio **************************************************************************/ @@ -1948,7 +1769,7 @@ radio { border: 0.105em solid shade(@text-color, 0.95); background-image: none; background-color: transparent; - margin: 0; + margin: 0 0.166666666666666666em; padding: 0; min-height: 1.166666666666666666em; min-width: 1.166666666666666666em; @@ -1958,7 +1779,7 @@ radio { } radiobutton label, checkbutton label { - margin: 0 0.5em; + margin: 0 0.333333333333333333em; padding: 0; } check { @@ -1977,7 +1798,7 @@ frame > checkbutton check{ margin-left: 0.5em; } -#PartialPaste checkbutton/* :not(#PartialPasteHeader) */ { +#PartialPaste checkbutton { min-height: 1.166666666666666666em; margin-top: calc(0.416666666666666666em - 4px); margin-bottom: calc(0.416666666666666666em - 4px) @@ -1991,16 +1812,12 @@ frame > checkbutton check{ padding-top: calc(0.666666666666666666em - 5px) } -#MyExpander button + checkbutton:last-child { - margin-left: 0.333333333333333333em; -} - /*** end ***************************************************************************************/ /*** Entry & Spinbutton ************************************************************************/ #MyExpander entry, entry { - margin: 0.083333333333333333em 0; + margin: 0.166666666666666666em; padding: 0 0.333333333333333333em; min-height: 1.666666666666666666em; min-width: 0; @@ -2011,7 +1828,7 @@ entry { } spinbutton { - margin: 0.083333333333333333em 0 0.083333333333333333em 0.166666666666666666em; + margin: 0.166666666666666666em; padding: 0; min-height: 1.666666666666666666em; min-width: 0; @@ -2022,7 +1839,7 @@ spinbutton { } #MyExpander spinbutton { - margin: 0.083333333333333333em 0 0.083333333333333333em 0.166666666666666666em; + margin: 0.16666666666666666666em; padding: 0; min-height: 1.333333333333333333em; min-width: 0; @@ -2034,7 +1851,7 @@ spinbutton { box-shadow: inset 0.083333333333333333em 0.083333333333333333em rgba(0, 0, 0, .12), 0 0.083333333333333333em rgba(255, 255, 255, 0.12); } #MyExpander button + label + spinbutton { - margin: 0.25em 0; /* Needed for Reset & and Auto button height*/ + margin: 0.333333333333333333em 0; /* Needed for Reset & and Auto button height*/ } #MyExpander checkbutton + label + spinbutton { margin: 0.333333333333333333em 0; /* Needed for Reset & and Auto checkbox button height*/ @@ -2044,19 +1861,24 @@ spinbutton { margin-left: 0.25em; } -#BatchQueueButtonsMainContainer spinbutton button, + #MyExpander spinbutton button, spinbutton button { padding: 0; margin: 0; - min-height: 0; - min-width: 1.333333333333333333em; + min-height: 1.333333333333333333em; + min-width: 1.5em; background-image: none; background-color: transparent; border: none; border-radius: 0; box-shadow: none; } +#MyExpander spinbutton button { + margin: -1px 0; + min-width: 1.333333333333333333em; +} + #MyExpander spinbutton entry, spinbutton entry { padding: 0 0.333333333333333333em; @@ -2071,7 +1893,6 @@ spinbutton entry { padding: 0 0.333333333333333333em 0 0.833333333333333333em; } -#BatchQueueButtonsMainContainer spinbutton button:hover, #MyExpander spinbutton button:hover, spinbutton button:hover { background-color: rgba(0,0,0,0.3); @@ -2079,7 +1900,6 @@ spinbutton button:hover { border: none; box-shadow: none; } -#BatchQueueButtonsMainContainer spinbutton button:active, #MyExpander spinbutton button:active, spinbutton button:active { background-color: rgba(0,0,0,0.5); @@ -2168,11 +1988,47 @@ headerbar:backdrop { headerbar .title:backdrop { color: alpha(@winTitle,.60); } +/* Titlebar buttons*/ + +headerbar button.titlebutton image { + padding: 0; + margin: 0; +} +headerbar button.titlebutton { + margin: 0 0 0 0.333333333333333333em; + background-image: none; + border: 0.083333333333333333em solid transparent; + background-color: transparent; + box-shadow: none; + min-width: 1.5em; + min-height: 1.5em; + padding: 0; +} +messagedialog headerbar button.titlebutton { + min-width: 1.25em; + min-height: 1.25em; + margin: 0; +} +headerbar button.titlebutton:hover{ + border-color: rgba(0,0,0,.8); + box-shadow: inset 0 0.083333333333333333em rgba(242, 242, 242, 0.11); + background-image: linear-gradient(to bottom, rgba(100,100,100,.3), rgba(30,30,30,.3)); + background-color: rgba(128, 128, 128,.20); +} +headerbar button.titlebutton:active{ + border-color: rgba(0,0,0,.8); + box-shadow: inset 0 0.083333333333333333em rgba(242, 242, 242, 0.15); + background-image: linear-gradient(to bottom, rgba(100,100,100,.3), rgba(30,30,30,.3)); + background-color: rgba(128, 128, 128,.40); +} +headerbar button.titlebutton.close:hover{ + border-color: rgba(0,0,0,.8); + background-image: linear-gradient(to bottom, rgb(180,0,0), rgb(160,0,0) 40%, rgb(130,0,0)); + box-shadow: inset 0 0.083333333333333333em rgba(242, 242, 242, 0.32); +} +headerbar button.titlebutton.close:active{ + border-color: rgba(0,0,0,.8); + background-image: linear-gradient(to bottom, rgb(215,0,0), rgb(185,0,0) 40%, rgb(150,0,0)); + box-shadow: inset 0 0.083333333333333333em rgba(242, 242, 242, 0.4); +} /*** end ***************************************************************************************/ - - -/* .view:not(check):not(radio), image:not(check):not(radio), spinbutton button, cellview { - -gtk-icon-transform: scale(calc(( 96 / 96 ) * ( 8 / 9 ))); -} */ -/* * {-gtk-dpi: 144;} */ - From bf19c619aeb505e7c745673e02b301496f8ab435 Mon Sep 17 00:00:00 2001 From: TooWaBoo Date: Sun, 4 Nov 2018 10:24:32 +0100 Subject: [PATCH 079/122] Update TooWaBlue-GTK3-20_.css Some fine tuning. --- rtdata/themes/TooWaBlue-GTK3-20_.css | 49 ++++++++++++---------------- 1 file changed, 21 insertions(+), 28 deletions(-) diff --git a/rtdata/themes/TooWaBlue-GTK3-20_.css b/rtdata/themes/TooWaBlue-GTK3-20_.css index 44546d6ec..e500ad37c 100644 --- a/rtdata/themes/TooWaBlue-GTK3-20_.css +++ b/rtdata/themes/TooWaBlue-GTK3-20_.css @@ -1365,6 +1365,7 @@ button:checked, border-color: shade(@bg-dark-grey, 0.6); } +/* Misc */ button label { margin: 0 0.416666666666666666em; } @@ -1456,7 +1457,7 @@ messagedialog .dialog-action-area button:not(:only-child):nth-child(2) { #IopsPanel button, #ProfilePanel button, #MainNotebook > header > grid > button, -#MyExpander button.independent:not(.image-button):not(.text-button):first-child:only-child/* Graduated filter big button */, +#MyExpander button.independent.toggle:not(.image-button):not(.text-button):first-child:only-child/* Graduated filter big button */, #MyExpander button.independent.image-button,/* Picker button */ #MyExpander .drawingarea + grid > button.flat,/* Curve buttons */ #BatchQueueButtonsMainContainer + grid + box button, @@ -1482,7 +1483,7 @@ messagedialog .dialog-action-area button:not(:only-child):nth-child(2) { #BatchQueueButtonsMainContainer + grid + box button { margin-right: 0; } -#MyExpander button.independent:not(.image-button):not(.text-button):first-child:only-child/* Graduated filter button */, +#MyExpander button.independent.toggle:not(.image-button):not(.text-button):first-child:only-child/* Graduated filter button */, #MyExpander button.independent.image-button,/* Picker button */ #MyExpander .drawingarea + grid > button.flat,/* Curve buttons */ #MetaPanelNotebook scrolledwindow + grid > button, @@ -1725,8 +1726,6 @@ popover button.text-button { border: 0.083333333333333333em solid @border-color; box-shadow: none; background-image: none; - margin: 0.083333333333333333em 0; - min-height: 1.666666666666666666em; padding: 0 0.666666666666666666em; } popover button.text-button label { @@ -1751,16 +1750,15 @@ popover button.text-button:active { /*** end ***************************************************************************************/ -/*** Ckeckbox & Radio **************************************************************************/ -checkbox, -checkbutton, -radiobutton { +/*** Checkbox & Radio **************************************************************************/ +checkbutton { padding: 0; - margin: 0; - min-height: 2em; + margin: 0.083333333333333333em 0.166666666666666666em; + min-height: 1.666666666666666666em; } -#PrefNotebook checkbox, -#PrefNotebook checkbutton { +radiobutton { + padding: 0.083333333333333333em 0; + margin: 0.166666666666666666em; min-height: 1.666666666666666666em; } @@ -1769,7 +1767,7 @@ radio { border: 0.105em solid shade(@text-color, 0.95); background-image: none; background-color: transparent; - margin: 0 0.166666666666666666em; + margin: 0; padding: 0; min-height: 1.166666666666666666em; min-width: 1.166666666666666666em; @@ -1777,11 +1775,6 @@ radio { background-repeat: no-repeat; color: shade(@text-color, 0.95); } -radiobutton label, -checkbutton label { - margin: 0 0.333333333333333333em; - padding: 0; -} check { border-radius: 0.166666666666666666em; } @@ -1794,6 +1787,12 @@ radio:disabled { border-color: @fg-disabled; } +radiobutton label, +checkbutton label { + margin: 0 0 0 0.416666666666666666em; + padding: 0; +} + frame > checkbutton check{ margin-left: 0.5em; } @@ -1808,7 +1807,6 @@ frame > checkbutton check{ } #PartialPasteHeader { margin-left: 0.5em; - padding-top: 0.333333333333333333em; padding-top: calc(0.666666666666666666em - 5px) } @@ -1850,17 +1848,12 @@ spinbutton { color: @text-tbEntry; box-shadow: inset 0.083333333333333333em 0.083333333333333333em rgba(0, 0, 0, .12), 0 0.083333333333333333em rgba(255, 255, 255, 0.12); } +/* Needed for Reset & and Auto button height*/ +#MyExpander checkbutton + label + spinbutton, #MyExpander button + label + spinbutton { - margin: 0.333333333333333333em 0; /* Needed for Reset & and Auto button height*/ + margin-top: 0.333333333333333333em; + margin-bottom: 0.333333333333333333em; } -#MyExpander checkbutton + label + spinbutton { - margin: 0.333333333333333333em 0; /* Needed for Reset & and Auto checkbox button height*/ -} - -#MyExpander image + spinbutton { - margin-left: 0.25em; -} - #MyExpander spinbutton button, spinbutton button { From 918cb434cbd7fa47bec4f7a17bfce9ec6911422f Mon Sep 17 00:00:00 2001 From: TooWaBoo Date: Sun, 4 Nov 2018 15:06:34 +0100 Subject: [PATCH 080/122] Clip label takes to much space The clip label "Clip %" takes to much space. This changes the spacing from 10px to 4px. --- rtgui/tonecurve.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtgui/tonecurve.cc b/rtgui/tonecurve.cc index 06abe1fd2..b0a03cccc 100644 --- a/rtgui/tonecurve.cc +++ b/rtgui/tonecurve.cc @@ -48,7 +48,7 @@ ToneCurve::ToneCurve () : FoldableToolPanel(this, "tonecurve", M("TP_EXPOSURE_LA //----------- Auto Levels ---------------------------------- abox = Gtk::manage (new Gtk::HBox ()); - abox->set_spacing (10); + abox->set_spacing (4); autolevels = Gtk::manage (new Gtk::ToggleButton (M("TP_EXPOSURE_AUTOLEVELS"))); autolevels->set_tooltip_markup (M("TP_EXPOSURE_AUTOLEVELS_TIP")); From 4fefc9433a9c1114630898bab3c0a4c0564b0097 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Sun, 4 Nov 2018 19:06:54 +0100 Subject: [PATCH 081/122] Fixes unspecified bit depth in CLI In rawtherapee-cli, if you did not explcitly specify a bit depth then -1 was used and lead to corrupted saved images. Fixes #4937 --- rtgui/main-cli.cc | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/rtgui/main-cli.cc b/rtgui/main-cli.cc index 26ee4fa81..66e0b9cfc 100644 --- a/rtgui/main-cli.cc +++ b/rtgui/main-cli.cc @@ -410,8 +410,6 @@ int processLineParams ( int argc, char **argv ) return -3; } - std::cout << "Output is " << bits << "-bit " << (isFloat ? "floating-point" : "integer") << "." << std::endl; - break; case 't': @@ -622,6 +620,18 @@ int processLineParams ( int argc, char **argv ) } } + if (bits == -1) { + if (outputType == "jpg") { + bits = 8; + } else if (outputType == "png") { + bits = 8; + } else if (outputType == "tif") { + bits = 16; + } else { + bits = 8; + } + } + if ( !argv1.empty() ) { return 1; } @@ -662,6 +672,7 @@ int processLineParams ( int argc, char **argv ) rtengine::procparams::ProcParams currentParams; Glib::ustring inputFile = inputFiles[iFile]; + std::cout << "Output is " << bits << "-bit " << (isFloat ? "floating-point" : "integer") << "." << std::endl; std::cout << "Processing: " << inputFile << std::endl; rtengine::InitialImage* ii = nullptr; From 70cd2b2033d308f64e886ad71a0fece86d3d7916 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Tue, 30 Oct 2018 23:56:49 +0100 Subject: [PATCH 082/122] Reverted changes to 'default' language file #4932 --- rtdata/languages/default | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 2a5b73e44..68c279e4e 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -402,7 +402,7 @@ HISTORY_MSG_145;Microcontrast - Uniformity HISTORY_MSG_146;Edge sharpening HISTORY_MSG_147;ES - Luminance only HISTORY_MSG_148;Microcontrast -HISTORY_MSG_149;Microcontrast - 33 matrix +HISTORY_MSG_149;Microcontrast - 3×3 matrix HISTORY_MSG_150;Post-demosaic artifact/noise red. HISTORY_MSG_151;Vibrance HISTORY_MSG_152;Vib - Pastel tones @@ -824,7 +824,7 @@ IPTCPANEL_CITY;City IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. IPTCPANEL_COPYHINT;Copy IPTC settings to clipboard. IPTCPANEL_COPYRIGHT;Copyright notice -IPTCPANEL_COPYRIGHTHINT;Enter a Notice on the current owner of the Copyright for this image, such as 2008 Jane Doe. +IPTCPANEL_COPYRIGHTHINT;Enter a Notice on the current owner of the Copyright for this image, such as ©2008 Jane Doe. IPTCPANEL_COUNTRY;Country IPTCPANEL_COUNTRYHINT;Enter the name of the country pictured in this image. IPTCPANEL_CREATOR;Creator @@ -1386,9 +1386,9 @@ TP_COARSETRAF_TOOLTIP_ROTLEFT;Rotate left.\n\nShortcuts:\n[ - Multiple Ed TP_COARSETRAF_TOOLTIP_ROTRIGHT;Rotate right.\n\nShortcuts:\n] - Multiple Editor Tabs Mode,\nAlt-] - Single Editor Tab Mode. TP_COARSETRAF_TOOLTIP_VFLIP;Flip vertically. TP_COLORAPP_ADAPTSCENE;Scene absolute luminance -TP_COLORAPP_ADAPTSCENE_TOOLTIP;Absolute luminance of the scene environment (cd/m).\n1) Calculated from the Exif data:\nShutter speed - ISO speed - F number - camera exposure correction.\n2) Calculated from the raw white point and RT's Exposure Compensation slider. -TP_COLORAPP_ADAPTVIEWING;Viewing absolute luminance (cd/m) -TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16cd/m). +TP_COLORAPP_ADAPTSCENE_TOOLTIP;Absolute luminance of the scene environment (cd/m²).\n1) Calculated from the Exif data:\nShutter speed - ISO speed - F number - camera exposure correction.\n2) Calculated from the raw white point and RT's Exposure Compensation slider. +TP_COLORAPP_ADAPTVIEWING;Viewing absolute luminance (cd/m²) +TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16cd/m²). TP_COLORAPP_ADAP_AUTO_TOOLTIP;If the checkbox is checked (recommended) RawTherapee calculates an optimum value from the Exif data.\nTo set the value manually, uncheck the checkbox first. TP_COLORAPP_ALGO;Algorithm TP_COLORAPP_ALGO_ALL;All @@ -1425,7 +1425,7 @@ TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] TP_COLORAPP_GAMUT;Gamut control (L*a*b*) TP_COLORAPP_GAMUT_TOOLTIP;Allow gamut control in L*a*b* mode. TP_COLORAPP_HUE;Hue (h) -TP_COLORAPP_HUE_TOOLTIP;Hue (h) - angle between 0 and 360. +TP_COLORAPP_HUE_TOOLTIP;Hue (h) - angle between 0° and 360°. TP_COLORAPP_LABEL;CIE Color Appearance Model 2002 TP_COLORAPP_LABEL_CAM02;Image Adjustments TP_COLORAPP_LABEL_SCENE;Scene Conditions @@ -1586,16 +1586,16 @@ TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations -TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Applying three median filter iterations with a 33 window size often leads to better results than using one median filter iteration with a 77 window size. +TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. TP_DIRPYRDENOISE_MEDIAN_TYPE;Median type -TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n33 soft: treats 5 pixels in a 33 pixel window.\n33: treats 9 pixels in a 33 pixel window.\n55 soft: treats 13 pixels in a 55 pixel window.\n55: treats 25 pixels in a 55 pixel window.\n77: treats 49 pixels in a 77 pixel window.\n99: treats 81 pixels in a 99 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. +TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. TP_DIRPYRDENOISE_SLI;Slider -TP_DIRPYRDENOISE_TYPE_3X3;33 -TP_DIRPYRDENOISE_TYPE_3X3SOFT;33 soft -TP_DIRPYRDENOISE_TYPE_5X5;55 -TP_DIRPYRDENOISE_TYPE_5X5SOFT;55 soft -TP_DIRPYRDENOISE_TYPE_7X7;77 -TP_DIRPYRDENOISE_TYPE_9X9;99 +TP_DIRPYRDENOISE_TYPE_3X3;3×3 +TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +TP_DIRPYRDENOISE_TYPE_5X5;5×5 +TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +TP_DIRPYRDENOISE_TYPE_7X7;7×7 +TP_DIRPYRDENOISE_TYPE_9X9;9×9 TP_DIRPYREQUALIZER_ALGO;Skin Color Range TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts @@ -2041,7 +2041,7 @@ TP_SHARPENING_USM;Unsharp Mask TP_SHARPENMICRO_AMOUNT;Quantity TP_SHARPENMICRO_CONTRAST;Contrast threshold TP_SHARPENMICRO_LABEL;Microcontrast -TP_SHARPENMICRO_MATRIX;33 matrix instead of 55 +TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5 TP_SHARPENMICRO_UNIFORMITY;Uniformity TP_SOFTLIGHT_LABEL;Soft Light TP_SOFTLIGHT_STRENGTH;Strength From 4e78bba2eebd12b642bf766b3894da551acf0c89 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Sun, 4 Nov 2018 20:26:08 +0100 Subject: [PATCH 083/122] generateTranslationDiffs --- rtdata/languages/Catala | 46 ++++++++++++++++- rtdata/languages/Chinese (Simplified) | 46 ++++++++++++++++- rtdata/languages/Chinese (Traditional) | 46 ++++++++++++++++- rtdata/languages/Czech | 46 ++++++++++++++++- rtdata/languages/Dansk | 46 ++++++++++++++++- rtdata/languages/Deutsch | 49 +++++++++++++++++++ rtdata/languages/English (UK) | 46 ++++++++++++++++- rtdata/languages/English (US) | 46 ++++++++++++++++- rtdata/languages/Espanol | 46 ++++++++++++++++- rtdata/languages/Euskara | 46 ++++++++++++++++- rtdata/languages/Francais | 46 ++++++++++++++++- rtdata/languages/Greek | 46 ++++++++++++++++- rtdata/languages/Hebrew | 46 ++++++++++++++++- rtdata/languages/Italiano | 46 ++++++++++++++++- rtdata/languages/Japanese | 44 +++++++++++++++++ rtdata/languages/Latvian | 46 ++++++++++++++++- rtdata/languages/Magyar | 46 ++++++++++++++++- rtdata/languages/Nederlands | 46 ++++++++++++++++- rtdata/languages/Norsk BM | 46 ++++++++++++++++- rtdata/languages/Polish | 46 ++++++++++++++++- rtdata/languages/Polish (Latin Characters) | 46 ++++++++++++++++- rtdata/languages/Portugues (Brasil) | 44 +++++++++++++++++ rtdata/languages/Serbian (Cyrilic Characters) | 46 ++++++++++++++++- rtdata/languages/Serbian (Latin Characters) | 46 ++++++++++++++++- rtdata/languages/Slovak | 46 ++++++++++++++++- rtdata/languages/Suomi | 46 ++++++++++++++++- rtdata/languages/Swedish | 46 ++++++++++++++++- rtdata/languages/Turkish | 46 ++++++++++++++++- rtdata/languages/default | 32 ++++++------ 29 files changed, 1278 insertions(+), 41 deletions(-) diff --git a/rtdata/languages/Catala b/rtdata/languages/Catala index 5484f536c..bd9cb8359 100644 --- a/rtdata/languages/Catala +++ b/rtdata/languages/Catala @@ -954,6 +954,10 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !DYNPROFILEEDITOR_EDIT;Edit !DYNPROFILEEDITOR_EDIT_RULE;Edit Dynamic Profile Rule !DYNPROFILEEDITOR_ENTRY_TOOLTIP;The matching is case insensitive.\nUse the "re:" prefix to enter\na regular expression. +!DYNPROFILEEDITOR_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard !DYNPROFILEEDITOR_MOVE_DOWN;Move Down !DYNPROFILEEDITOR_MOVE_UP;Move Up !DYNPROFILEEDITOR_NEW;New @@ -970,6 +974,8 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !EXPORT_USE_FAST_PIPELINE;Dedicated (full processing on resized image) !EXPORT_USE_FAST_PIPELINE_TIP;Use a dedicated processing pipeline for images in Fast Export mode, that trades speed for quality. Resizing of the image is done as early as possible, instead of doing it at the end like in the normal pipeline. The speedup can be significant, but be prepared to see artifacts and a general degradation of output quality. !EXPORT_USE_NORMAL_PIPELINE;Standard (bypass some steps, resize at the end) +!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple !FILEBROWSER_POPUPCOLORLABEL0;Label: None !FILEBROWSER_POPUPCOLORLABEL1;Label: Red @@ -1310,13 +1316,27 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens !HISTORY_MSG_488;Dynamic Range Compression +!HISTORY_MSG_489;DRC - Detail !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction -!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;AMaZE+VNG4 - Contrast threshold +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - Show mask +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold !HISTORY_MSG_HISTMATCHING;Auto-matched tone curve !HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries !HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D @@ -1340,6 +1360,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !HISTORY_MSG_RAW_BORDER;Raw border !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength !HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor @@ -1447,6 +1468,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !PARTIALPASTE_CHANNELMIXERBW;Black-and-white !PARTIALPASTE_COLORAPP;CIECAM02 !PARTIALPASTE_COLORTONING;Color toning +!PARTIALPASTE_DEHAZE;Haze removal !PARTIALPASTE_EQUALIZER;Wavelet levels !PARTIALPASTE_FILMSIMULATION;Film simulation !PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control @@ -1473,6 +1495,11 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !PREFERENCES_BEHSETALL;All to 'Set' !PREFERENCES_BEHSETALLHINT;Set all parameters to the Set mode.\nAdjustments of parameters in the batch tool panel will be absolute, the actual values will be displayed. !PREFERENCES_BLACKBODY;Tungsten +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory @@ -1740,6 +1767,16 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_COLORTONING_LABEL;Color Toning !TP_COLORTONING_LABGRID;L*a*b* color correction grid !TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 +!TP_COLORTONING_LABREGIONS;L*a*b* correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask !TP_COLORTONING_LUMA;Luminance !TP_COLORTONING_LUMAMODE;Preserve luminance !TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change color (red, green, cyan, blue, etc.) the luminance of each pixel is preserved. @@ -1768,6 +1805,10 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones !TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global !TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! @@ -1944,6 +1985,8 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_RAW_DMETHOD_PROGRESSBAR;%1 demosaicing... !TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Demosaicing refinement... !TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the check-box first (reasonable values depend on the image). !TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast @@ -2086,6 +2129,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression +!TP_TM_FATTAL_THRESHOLD;Detail !TP_WAVELET_1;Level 1 !TP_WAVELET_2;Level 2 !TP_WAVELET_3;Level 3 diff --git a/rtdata/languages/Chinese (Simplified) b/rtdata/languages/Chinese (Simplified) index bacc0ea58..5478d820a 100644 --- a/rtdata/languages/Chinese (Simplified) +++ b/rtdata/languages/Chinese (Simplified) @@ -995,6 +995,10 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !CURVEEDITOR_AXIS_OUT;O: !CURVEEDITOR_AXIS_RIGHT_TAN;RT: !CURVEEDITOR_EDITPOINT_HINT;Enable edition of node in/out values.\n\nRight-click on a node to select it.\nRight-click on empty space to de-select the node. +!DYNPROFILEEDITOR_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard !EDIT_OBJECT_TOOLTIP;Displays a widget on the preview window which lets you adjust this tool. !EDIT_PIPETTE_TOOLTIP;To add an adjustment point to the curve, hold the Ctrl key while left-clicking the desired spot in the image preview.\nTo adjust the point, hold the Ctrl key while left-clicking the corresponding area in the preview, then let go of Ctrl (unless you desire fine control) and while still holding the left mouse button move the mouse up or down to move that point up or down in the curve. !EXIFFILTER_IMAGETYPE;Image type @@ -1010,6 +1014,8 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !EXPORT_USE_FAST_PIPELINE_TIP;Use a dedicated processing pipeline for images in Fast Export mode, that trades speed for quality. Resizing of the image is done as early as possible, instead of doing it at the end like in the normal pipeline. The speedup can be significant, but be prepared to see artifacts and a general degradation of output quality. !EXPORT_USE_NORMAL_PIPELINE;Standard (bypass some steps, resize at the end) !FILEBROWSER_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory +!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple !FILEBROWSER_QUERYHINT;Type filenames to search for. Supports partial filenames. Separate the search terms using commas, e.g.\n1001,1004,1199\n\nExclude search terms by prefixing them with !=\ne.g.\n!=1001,1004,1199\n\nShortcuts:\nCtrl-f - focus the Find box,\nEnter - search,\nEsc - clear the Find box,\nShift-Esc - defocus the Find box. !FILEBROWSER_SHOWCOLORLABEL1HINT;Show images labeled Red.\nShortcut: Alt-1 @@ -1387,13 +1393,27 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens !HISTORY_MSG_488;Dynamic Range Compression +!HISTORY_MSG_489;DRC - Detail !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction -!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;AMaZE+VNG4 - Contrast threshold +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - Show mask +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold !HISTORY_MSG_HISTMATCHING;Auto-matched tone curve !HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries !HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D @@ -1417,6 +1437,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !HISTORY_MSG_RAW_BORDER;Raw border !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength !HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor @@ -1516,6 +1537,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. !OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. !PARTIALPASTE_ADVANCEDGROUP;Advanced Settings +!PARTIALPASTE_DEHAZE;Haze removal !PARTIALPASTE_LOCALCONTRAST;Local contrast !PARTIALPASTE_METADATA;Metadata mode !PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter @@ -1526,6 +1548,11 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting !PREFERENCES_BEHADDALLHINT;Set all parameters to the Add mode.\nAdjustments of parameters in the batch tool panel will be deltas to the stored values. !PREFERENCES_BEHSETALLHINT;Set all parameters to the Set mode.\nAdjustments of parameters in the batch tool panel will be absolute, the actual values will be displayed. +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_CROP;Crop editing !PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area !PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop @@ -1692,6 +1719,16 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !TP_COLORTONING_LABEL;Color Toning !TP_COLORTONING_LABGRID;L*a*b* color correction grid !TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 +!TP_COLORTONING_LABREGIONS;L*a*b* correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask !TP_COLORTONING_LUMA;Luminance !TP_COLORTONING_LUMAMODE;Preserve luminance !TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change color (red, green, cyan, blue, etc.) the luminance of each pixel is preserved. @@ -1718,6 +1755,10 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !TP_COLORTONING_TWOCOLOR_TOOLTIP;Standard chroma:\nLinear response, a* = b*.\n\nSpecial chroma:\nLinear response, a* = b*, but unbound - try under the diagonal.\n\nSpecial a* and b*:\nLinear response unbound with separate curves for a* and b*. Intended for special effects.\n\nSpecial chroma 2 colors:\nMore predictable. !TP_COLORTONING_TWOSTD;Standard chroma !TP_DEFRINGE_THRESHOLD;Threshold +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones !TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global !TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! @@ -1919,6 +1960,8 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !TP_RAW_DMETHOD_PROGRESSBAR;%1 demosaicing... !TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Demosaicing refinement... !TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the check-box first (reasonable values depend on the image). !TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_EAHD;EAHD !TP_RAW_FALSECOLOR;False color suppression steps @@ -2063,6 +2106,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression +!TP_TM_FATTAL_THRESHOLD;Detail !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones diff --git a/rtdata/languages/Chinese (Traditional) b/rtdata/languages/Chinese (Traditional) index 127fea254..9404a8a6b 100644 --- a/rtdata/languages/Chinese (Traditional) +++ b/rtdata/languages/Chinese (Traditional) @@ -453,6 +453,10 @@ TP_WBALANCE_TEMPERATURE;色溫 !DYNPROFILEEDITOR_EDIT;Edit !DYNPROFILEEDITOR_EDIT_RULE;Edit Dynamic Profile Rule !DYNPROFILEEDITOR_ENTRY_TOOLTIP;The matching is case insensitive.\nUse the "re:" prefix to enter\na regular expression. +!DYNPROFILEEDITOR_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard !DYNPROFILEEDITOR_MOVE_DOWN;Move Down !DYNPROFILEEDITOR_MOVE_UP;Move Up !DYNPROFILEEDITOR_NEW;New @@ -504,6 +508,8 @@ TP_WBALANCE_TEMPERATURE;色溫 !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to browse to the chosen path. !FILEBROWSER_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory !FILEBROWSER_CACHE;Cache +!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple !FILEBROWSER_CURRENT_NAME;Current name: !FILEBROWSER_DARKFRAME;Dark-frame @@ -972,13 +978,27 @@ TP_WBALANCE_TEMPERATURE;色溫 !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens !HISTORY_MSG_488;Dynamic Range Compression +!HISTORY_MSG_489;DRC - Detail !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction -!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;AMaZE+VNG4 - Contrast threshold +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - Show mask +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold !HISTORY_MSG_HISTMATCHING;Auto-matched tone curve !HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries !HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D @@ -1002,6 +1022,7 @@ TP_WBALANCE_TEMPERATURE;色溫 !HISTORY_MSG_RAW_BORDER;Raw border !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength !HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor @@ -1148,6 +1169,7 @@ TP_WBALANCE_TEMPERATURE;色溫 !PARTIALPASTE_DARKFRAMEAUTOSELECT;Dark-frame auto-selection !PARTIALPASTE_DARKFRAMEFILE;Dark-frame file !PARTIALPASTE_DEFRINGE;Defringe +!PARTIALPASTE_DEHAZE;Haze removal !PARTIALPASTE_DETAILGROUP;Detail Settings !PARTIALPASTE_DIRPYRDENOISE;Noise reduction !PARTIALPASTE_DIRPYREQUALIZER;Contrast by detail levels @@ -1207,6 +1229,11 @@ TP_WBALANCE_TEMPERATURE;色溫 !PREFERENCES_BEHSETALL;All to 'Set' !PREFERENCES_BEHSETALLHINT;Set all parameters to the Set mode.\nAdjustments of parameters in the batch tool panel will be absolute, the actual values will be displayed. !PREFERENCES_BLACKBODY;Tungsten +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory @@ -1540,6 +1567,16 @@ TP_WBALANCE_TEMPERATURE;色溫 !TP_COLORTONING_LABEL;Color Toning !TP_COLORTONING_LABGRID;L*a*b* color correction grid !TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 +!TP_COLORTONING_LABREGIONS;L*a*b* correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask !TP_COLORTONING_LUMA;Luminance !TP_COLORTONING_LUMAMODE;Preserve luminance !TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change color (red, green, cyan, blue, etc.) the luminance of each pixel is preserved. @@ -1577,6 +1614,10 @@ TP_WBALANCE_TEMPERATURE;色溫 !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones !TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global !TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! @@ -1863,6 +1904,8 @@ TP_WBALANCE_TEMPERATURE;色溫 !TP_RAW_DMETHOD_PROGRESSBAR;%1 demosaicing... !TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Demosaicing refinement... !TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the check-box first (reasonable values depend on the image). !TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_EAHD;EAHD !TP_RAW_FALSECOLOR;False color suppression steps @@ -2025,6 +2068,7 @@ TP_WBALANCE_TEMPERATURE;色溫 !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression +!TP_TM_FATTAL_THRESHOLD;Detail !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones diff --git a/rtdata/languages/Czech b/rtdata/languages/Czech index a6b19baa7..caaba31bb 100644 --- a/rtdata/languages/Czech +++ b/rtdata/languages/Czech @@ -2189,6 +2189,12 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !!!!!!!!!!!!!!!!!!!!!!!!! !ADJUSTER_RESET_TO_DEFAULT;Click - reset to default value.\nCtrl+click - reset to initial value. +!DYNPROFILEEDITOR_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard +!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !GENERAL_RESET;Reset !GENERAL_SAVE_AS;Save as... !HISTOGRAM_TOOLTIP_MODE;Toggle between linear, log-linear and log-log scaling of the histogram. @@ -2197,8 +2203,22 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !HISTORY_MSG_273;CT - Color Balance SMH !HISTORY_MSG_392;W - Residual - Color Balance !HISTORY_MSG_488;Dynamic Range Compression +!HISTORY_MSG_489;DRC - Detail !HISTORY_MSG_490;DRC - Amount -!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;AMaZE+VNG4 - Contrast threshold +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - Show mask +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold !HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries !HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D !HISTORY_MSG_ICM_OUTPUT_TYPE;Output - Type @@ -2213,6 +2233,7 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !HISTORY_MSG_RAW_BORDER;Raw border !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength !HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor @@ -2259,11 +2280,17 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !ICCPROFCREATOR_TRC_PRESET;Tone response curve: !MAIN_BUTTON_ICCPROFCREATOR;ICC Profile Creator !MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the Sharpening Contrast Mask.\nShortcut: None\n\nOnly works when sharpening is enabled and zoom >= 100%. +!PARTIALPASTE_DEHAZE;Haze removal !PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid color shift !PARTIALPASTE_RAW_BORDER;Raw border !PARTIALPASTE_SOFTLIGHT;Soft light !PARTIALPASTE_TM_FATTAL;Dynamic range compression +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_PERFORMANCE_THREADS;Threads !PREFERENCES_PERFORMANCE_THREADS_LABEL;Maximum number of threads for Noise Reduction and Wavelet Levels (0 = Automatic) !PREFERENCES_TAB_PERFORMANCE;Performance @@ -2272,6 +2299,20 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !SAVEDLG_FILEFORMAT_FLOAT; floating-point !TP_BWMIX_MIXC;Channel Mixer !TP_BWMIX_NEUTRAL;Reset +!TP_COLORTONING_LABREGIONS;L*a*b* correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !TP_ICM_WORKING_TRC;Tone response curve: !TP_ICM_WORKING_TRC_CUSTOM;Custom !TP_ICM_WORKING_TRC_GAMMA;Gamma @@ -2285,6 +2326,8 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !TP_RAW_AMAZEVNG4;AMaZE+VNG4 !TP_RAW_BORDER;Border !TP_RAW_DCBVNG4;DCB+VNG4 +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the check-box first (reasonable values depend on the image). !TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_PIXELSHIFTDMETHOD;Demosaic method for motion !TP_RAW_RCDVNG4;RCD+VNG4 @@ -2297,3 +2340,4 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression +!TP_TM_FATTAL_THRESHOLD;Detail diff --git a/rtdata/languages/Dansk b/rtdata/languages/Dansk index 9edb918c8..aaa58fce2 100644 --- a/rtdata/languages/Dansk +++ b/rtdata/languages/Dansk @@ -445,6 +445,10 @@ TP_WBALANCE_TEMPERATURE;Temperatur !DYNPROFILEEDITOR_EDIT;Edit !DYNPROFILEEDITOR_EDIT_RULE;Edit Dynamic Profile Rule !DYNPROFILEEDITOR_ENTRY_TOOLTIP;The matching is case insensitive.\nUse the "re:" prefix to enter\na regular expression. +!DYNPROFILEEDITOR_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard !DYNPROFILEEDITOR_MOVE_DOWN;Move Down !DYNPROFILEEDITOR_MOVE_UP;Move Up !DYNPROFILEEDITOR_NEW;New @@ -496,6 +500,8 @@ TP_WBALANCE_TEMPERATURE;Temperatur !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to browse to the chosen path. !FILEBROWSER_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory !FILEBROWSER_CACHE;Cache +!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple !FILEBROWSER_CURRENT_NAME;Current name: !FILEBROWSER_DARKFRAME;Dark-frame @@ -967,13 +973,27 @@ TP_WBALANCE_TEMPERATURE;Temperatur !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens !HISTORY_MSG_488;Dynamic Range Compression +!HISTORY_MSG_489;DRC - Detail !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction -!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;AMaZE+VNG4 - Contrast threshold +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - Show mask +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold !HISTORY_MSG_HISTMATCHING;Auto-matched tone curve !HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries !HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D @@ -997,6 +1017,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !HISTORY_MSG_RAW_BORDER;Raw border !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength !HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor @@ -1145,6 +1166,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !PARTIALPASTE_DARKFRAMEAUTOSELECT;Dark-frame auto-selection !PARTIALPASTE_DARKFRAMEFILE;Dark-frame file !PARTIALPASTE_DEFRINGE;Defringe +!PARTIALPASTE_DEHAZE;Haze removal !PARTIALPASTE_DETAILGROUP;Detail Settings !PARTIALPASTE_DIRPYRDENOISE;Noise reduction !PARTIALPASTE_DIRPYREQUALIZER;Contrast by detail levels @@ -1204,6 +1226,11 @@ TP_WBALANCE_TEMPERATURE;Temperatur !PREFERENCES_BEHSETALL;All to 'Set' !PREFERENCES_BEHSETALLHINT;Set all parameters to the Set mode.\nAdjustments of parameters in the batch tool panel will be absolute, the actual values will be displayed. !PREFERENCES_BLACKBODY;Tungsten +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory @@ -1537,6 +1564,16 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_COLORTONING_LABEL;Color Toning !TP_COLORTONING_LABGRID;L*a*b* color correction grid !TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 +!TP_COLORTONING_LABREGIONS;L*a*b* correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask !TP_COLORTONING_LUMA;Luminance !TP_COLORTONING_LUMAMODE;Preserve luminance !TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change color (red, green, cyan, blue, etc.) the luminance of each pixel is preserved. @@ -1574,6 +1611,10 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones !TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global !TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! @@ -1859,6 +1900,8 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_RAW_DMETHOD_PROGRESSBAR;%1 demosaicing... !TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Demosaicing refinement... !TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the check-box first (reasonable values depend on the image). !TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast @@ -2023,6 +2066,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression +!TP_TM_FATTAL_THRESHOLD;Detail !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index 62f258cea..14debc30f 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -2350,3 +2350,52 @@ ZOOMPANEL_ZOOMFITCROPSCREEN;Ausschnitt an Bildschirm anpassen.\nTaste: f ZOOMPANEL_ZOOMFITSCREEN;An Bildschirm anpassen.\nTaste: Alt + f ZOOMPANEL_ZOOMIN;Hineinzoomen\nTaste: + ZOOMPANEL_ZOOMOUT;Herauszoomen\nTaste: - + +!!!!!!!!!!!!!!!!!!!!!!!!! +! Untranslated keys follow; remove the ! prefix after an entry is translated. +!!!!!!!!!!!!!!!!!!!!!!!!! + +!DYNPROFILEEDITOR_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard +!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles +!HISTORY_MSG_489;DRC - Detail +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - Show mask +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace +!PARTIALPASTE_DEHAZE;Haze removal +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. +!TP_COLORTONING_LABREGIONS;L*a*b* correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the check-box first (reasonable values depend on the image). +!TP_TM_FATTAL_THRESHOLD;Detail diff --git a/rtdata/languages/English (UK) b/rtdata/languages/English (UK) index 1d31bdd3f..791a913ee 100644 --- a/rtdata/languages/English (UK) +++ b/rtdata/languages/English (UK) @@ -26,7 +26,9 @@ HISTORY_MSG_392;W - Residual - Colour Balance HISTORY_MSG_419;Retinex - Colour space HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colours HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Colour correction +HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Colour correction HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correction - Avoid colour shift +HISTORY_MSG_SH_COLORSPACE;S/H - Colourspace MAIN_TAB_COLOR;Colour MAIN_TOOLTIP_BACKCOLOR0;Background colour of the preview: Theme-based\nShortcut: 9 MAIN_TOOLTIP_BACKCOLOR1;Background colour of the preview: Black\nShortcut: 9 @@ -161,6 +163,10 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !DYNPROFILEEDITOR_EDIT;Edit !DYNPROFILEEDITOR_EDIT_RULE;Edit Dynamic Profile Rule !DYNPROFILEEDITOR_ENTRY_TOOLTIP;The matching is case insensitive.\nUse the "re:" prefix to enter\na regular expression. +!DYNPROFILEEDITOR_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard !DYNPROFILEEDITOR_MOVE_DOWN;Move Down !DYNPROFILEEDITOR_MOVE_UP;Move Up !DYNPROFILEEDITOR_NEW;New @@ -232,6 +238,8 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to browse to the chosen path. !FILEBROWSER_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory !FILEBROWSER_CACHE;Cache +!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_CLEARPROFILE;Clear !FILEBROWSER_COPYPROFILE;Copy !FILEBROWSER_CURRENT_NAME;Current name: @@ -811,11 +819,24 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens !HISTORY_MSG_488;Dynamic Range Compression +!HISTORY_MSG_489;DRC - Detail !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments -!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;AMaZE+VNG4 - Contrast threshold +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - Show mask +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold !HISTORY_MSG_HISTMATCHING;Auto-matched tone curve !HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries !HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D @@ -1032,6 +1053,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !PARTIALPASTE_DARKFRAMEAUTOSELECT;Dark-frame auto-selection !PARTIALPASTE_DARKFRAMEFILE;Dark-frame file !PARTIALPASTE_DEFRINGE;Defringe +!PARTIALPASTE_DEHAZE;Haze removal !PARTIALPASTE_DETAILGROUP;Detail Settings !PARTIALPASTE_DIALOGLABEL;Partial paste processing profile !PARTIALPASTE_DIRPYRDENOISE;Noise reduction @@ -1101,6 +1123,11 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !PREFERENCES_BEHSETALL;All to 'Set' !PREFERENCES_BEHSETALLHINT;Set all parameters to the Set mode.\nAdjustments of parameters in the batch tool panel will be absolute, the actual values will be displayed. !PREFERENCES_BLACKBODY;Tungsten +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_CACHEMAXENTRIES;Maximum number of cache entries !PREFERENCES_CACHEOPTS;Cache Options !PREFERENCES_CACHETHUMBHEIGHT;Maximum thumbnail height @@ -1495,6 +1522,16 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_COLORTONING_HUE;Hue !TP_COLORTONING_LAB;L*a*b* blending !TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 +!TP_COLORTONING_LABREGIONS;L*a*b* correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask !TP_COLORTONING_LUMA;Luminance !TP_COLORTONING_LUMAMODE;Preserve luminance !TP_COLORTONING_METHOD;Method @@ -1537,6 +1574,10 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones !TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global !TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! @@ -1823,6 +1864,8 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_RAW_DMETHOD_PROGRESSBAR;%1 demosaicing... !TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Demosaicing refinement... !TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the check-box first (reasonable values depend on the image). !TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast @@ -2016,6 +2059,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression +!TP_TM_FATTAL_THRESHOLD;Detail !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones !TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE1;Red/Purple diff --git a/rtdata/languages/English (US) b/rtdata/languages/English (US) index 4e3829269..fe7565d28 100644 --- a/rtdata/languages/English (US) +++ b/rtdata/languages/English (US) @@ -44,6 +44,10 @@ !DYNPROFILEEDITOR_EDIT;Edit !DYNPROFILEEDITOR_EDIT_RULE;Edit Dynamic Profile Rule !DYNPROFILEEDITOR_ENTRY_TOOLTIP;The matching is case insensitive.\nUse the "re:" prefix to enter\na regular expression. +!DYNPROFILEEDITOR_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard !DYNPROFILEEDITOR_MOVE_DOWN;Move Down !DYNPROFILEEDITOR_MOVE_UP;Move Up !DYNPROFILEEDITOR_NEW;New @@ -116,6 +120,8 @@ !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to browse to the chosen path. !FILEBROWSER_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory !FILEBROWSER_CACHE;Cache +!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_CLEARPROFILE;Clear !FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple !FILEBROWSER_COPYPROFILE;Copy @@ -720,13 +726,27 @@ !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens !HISTORY_MSG_488;Dynamic Range Compression +!HISTORY_MSG_489;DRC - Detail !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction -!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;AMaZE+VNG4 - Contrast threshold +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - Show mask +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold !HISTORY_MSG_HISTMATCHING;Auto-matched tone curve !HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries !HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D @@ -750,6 +770,7 @@ !HISTORY_MSG_RAW_BORDER;Raw border !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength !HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor @@ -951,6 +972,7 @@ !PARTIALPASTE_DARKFRAMEAUTOSELECT;Dark-frame auto-selection !PARTIALPASTE_DARKFRAMEFILE;Dark-frame file !PARTIALPASTE_DEFRINGE;Defringe +!PARTIALPASTE_DEHAZE;Haze removal !PARTIALPASTE_DETAILGROUP;Detail Settings !PARTIALPASTE_DIALOGLABEL;Partial paste processing profile !PARTIALPASTE_DIRPYRDENOISE;Noise reduction @@ -1025,6 +1047,11 @@ !PREFERENCES_BEHSETALL;All to 'Set' !PREFERENCES_BEHSETALLHINT;Set all parameters to the Set mode.\nAdjustments of parameters in the batch tool panel will be absolute, the actual values will be displayed. !PREFERENCES_BLACKBODY;Tungsten +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_CACHEMAXENTRIES;Maximum number of cache entries !PREFERENCES_CACHEOPTS;Cache Options !PREFERENCES_CACHETHUMBHEIGHT;Maximum thumbnail height @@ -1451,6 +1478,16 @@ !TP_COLORTONING_LABEL;Color Toning !TP_COLORTONING_LABGRID;L*a*b* color correction grid !TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 +!TP_COLORTONING_LABREGIONS;L*a*b* correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask !TP_COLORTONING_LUMA;Luminance !TP_COLORTONING_LUMAMODE;Preserve luminance !TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change color (red, green, cyan, blue, etc.) the luminance of each pixel is preserved. @@ -1499,6 +1536,10 @@ !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones !TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global !TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! @@ -1810,6 +1851,8 @@ !TP_RAW_DMETHOD_PROGRESSBAR;%1 demosaicing... !TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Demosaicing refinement... !TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the check-box first (reasonable values depend on the image). !TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_EAHD;EAHD !TP_RAW_FALSECOLOR;False color suppression steps @@ -2006,6 +2049,7 @@ !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression +!TP_TM_FATTAL_THRESHOLD;Detail !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones diff --git a/rtdata/languages/Espanol b/rtdata/languages/Espanol index b80fef3d8..b70f2b3a7 100644 --- a/rtdata/languages/Espanol +++ b/rtdata/languages/Espanol @@ -1480,6 +1480,10 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: - !DYNPROFILEEDITOR_EDIT;Edit !DYNPROFILEEDITOR_EDIT_RULE;Edit Dynamic Profile Rule !DYNPROFILEEDITOR_ENTRY_TOOLTIP;The matching is case insensitive.\nUse the "re:" prefix to enter\na regular expression. +!DYNPROFILEEDITOR_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard !DYNPROFILEEDITOR_MOVE_DOWN;Move Down !DYNPROFILEEDITOR_MOVE_UP;Move Up !DYNPROFILEEDITOR_NEW;New @@ -1493,6 +1497,8 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: - !EXPORT_USE_FAST_PIPELINE;Dedicated (full processing on resized image) !EXPORT_USE_FAST_PIPELINE_TIP;Use a dedicated processing pipeline for images in Fast Export mode, that trades speed for quality. Resizing of the image is done as early as possible, instead of doing it at the end like in the normal pipeline. The speedup can be significant, but be prepared to see artifacts and a general degradation of output quality. !EXPORT_USE_NORMAL_PIPELINE;Standard (bypass some steps, resize at the end) +!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_POPUPCOLORLABEL0;Label: None !FILEBROWSER_RESETDEFAULTPROFILE;Reset to default !FILEBROWSER_SHOWNOTTRASHHINT;Show only non-deleted images. @@ -1694,13 +1700,27 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: - !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens !HISTORY_MSG_488;Dynamic Range Compression +!HISTORY_MSG_489;DRC - Detail !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction -!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;AMaZE+VNG4 - Contrast threshold +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - Show mask +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold !HISTORY_MSG_HISTMATCHING;Auto-matched tone curve !HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries !HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D @@ -1724,6 +1744,7 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: - !HISTORY_MSG_RAW_BORDER;Raw border !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength !HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor @@ -1818,6 +1839,7 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: - !OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. !OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. !PARTIALPASTE_ADVANCEDGROUP;Advanced Settings +!PARTIALPASTE_DEHAZE;Haze removal !PARTIALPASTE_EQUALIZER;Wavelet levels !PARTIALPASTE_GRADIENT;Graduated filter !PARTIALPASTE_LOCALCONTRAST;Local contrast @@ -1833,6 +1855,11 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: - !PARTIALPASTE_SOFTLIGHT;Soft light !PARTIALPASTE_TM_FATTAL;Dynamic range compression !PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CMMBPC;Black point compensation @@ -1930,9 +1957,23 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: - !TP_COLORAPP_YBSCENE_TOOLTIP;If "auto" is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_COLORTONING_LABGRID;L*a*b* color correction grid !TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 +!TP_COLORTONING_LABREGIONS;L*a*b* correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones !TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global !TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! @@ -2024,6 +2065,8 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: - !TP_RAW_BORDER;Border !TP_RAW_DCB;DCB !TP_RAW_DCBVNG4;DCB+VNG4 +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the check-box first (reasonable values depend on the image). !TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast @@ -2157,6 +2200,7 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: - !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression +!TP_TM_FATTAL_THRESHOLD;Detail !TP_WAVELET_1;Level 1 !TP_WAVELET_2;Level 2 !TP_WAVELET_3;Level 3 diff --git a/rtdata/languages/Euskara b/rtdata/languages/Euskara index 61de1ab54..19ec9ba7d 100644 --- a/rtdata/languages/Euskara +++ b/rtdata/languages/Euskara @@ -446,6 +446,10 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !DYNPROFILEEDITOR_EDIT;Edit !DYNPROFILEEDITOR_EDIT_RULE;Edit Dynamic Profile Rule !DYNPROFILEEDITOR_ENTRY_TOOLTIP;The matching is case insensitive.\nUse the "re:" prefix to enter\na regular expression. +!DYNPROFILEEDITOR_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard !DYNPROFILEEDITOR_MOVE_DOWN;Move Down !DYNPROFILEEDITOR_MOVE_UP;Move Up !DYNPROFILEEDITOR_NEW;New @@ -497,6 +501,8 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to browse to the chosen path. !FILEBROWSER_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory !FILEBROWSER_CACHE;Cache +!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple !FILEBROWSER_CURRENT_NAME;Current name: !FILEBROWSER_DARKFRAME;Dark-frame @@ -968,13 +974,27 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens !HISTORY_MSG_488;Dynamic Range Compression +!HISTORY_MSG_489;DRC - Detail !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction -!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;AMaZE+VNG4 - Contrast threshold +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - Show mask +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold !HISTORY_MSG_HISTMATCHING;Auto-matched tone curve !HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries !HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D @@ -998,6 +1018,7 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !HISTORY_MSG_RAW_BORDER;Raw border !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength !HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor @@ -1146,6 +1167,7 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !PARTIALPASTE_DARKFRAMEAUTOSELECT;Dark-frame auto-selection !PARTIALPASTE_DARKFRAMEFILE;Dark-frame file !PARTIALPASTE_DEFRINGE;Defringe +!PARTIALPASTE_DEHAZE;Haze removal !PARTIALPASTE_DETAILGROUP;Detail Settings !PARTIALPASTE_DIRPYRDENOISE;Noise reduction !PARTIALPASTE_DIRPYREQUALIZER;Contrast by detail levels @@ -1205,6 +1227,11 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !PREFERENCES_BEHSETALL;All to 'Set' !PREFERENCES_BEHSETALLHINT;Set all parameters to the Set mode.\nAdjustments of parameters in the batch tool panel will be absolute, the actual values will be displayed. !PREFERENCES_BLACKBODY;Tungsten +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory @@ -1538,6 +1565,16 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !TP_COLORTONING_LABEL;Color Toning !TP_COLORTONING_LABGRID;L*a*b* color correction grid !TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 +!TP_COLORTONING_LABREGIONS;L*a*b* correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask !TP_COLORTONING_LUMA;Luminance !TP_COLORTONING_LUMAMODE;Preserve luminance !TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change color (red, green, cyan, blue, etc.) the luminance of each pixel is preserved. @@ -1575,6 +1612,10 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones !TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global !TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! @@ -1860,6 +1901,8 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !TP_RAW_DMETHOD_PROGRESSBAR;%1 demosaicing... !TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Demosaicing refinement... !TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the check-box first (reasonable values depend on the image). !TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast @@ -2024,6 +2067,7 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression +!TP_TM_FATTAL_THRESHOLD;Detail !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais index 15d8affc3..adc0528ea 100644 --- a/rtdata/languages/Francais +++ b/rtdata/languages/Francais @@ -2209,7 +2209,13 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !!!!!!!!!!!!!!!!!!!!!!!!! !ADJUSTER_RESET_TO_DEFAULT;Click - reset to default value.\nCtrl+click - reset to initial value. +!DYNPROFILEEDITOR_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard !EXIFFILTER_IMAGETYPE;Image type +!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !GENERAL_RESET;Reset !HISTOGRAM_TOOLTIP_MODE;Toggle between linear, log-linear and log-log scaling of the histogram. !HISTORY_MSG_235;B&W - CM - Auto @@ -2217,9 +2223,23 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !HISTORY_MSG_273;CT - Color Balance SMH !HISTORY_MSG_392;W - Residual - Color Balance !HISTORY_MSG_488;Dynamic Range Compression +!HISTORY_MSG_489;DRC - Detail !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors -!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;AMaZE+VNG4 - Contrast threshold +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - Show mask +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold !HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries !HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D !HISTORY_MSG_ICM_OUTPUT_TYPE;Output - Type @@ -2236,17 +2256,24 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !HISTORY_MSG_RAW_BORDER;Raw border !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength !HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor !ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Reset to the default copyright, granted to "RawTherapee, CC0" !ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Append gamma and slope values to the description !MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the Sharpening Contrast Mask.\nShortcut: None\n\nOnly works when sharpening is enabled and zoom >= 100%. +!PARTIALPASTE_DEHAZE;Haze removal !PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid color shift !PARTIALPASTE_RAW_BORDER;Raw border !PARTIALPASTE_SOFTLIGHT;Soft light !PARTIALPASTE_TM_FATTAL;Dynamic range compression +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_PERFORMANCE_THREADS;Threads !PREFERENCES_PERFORMANCE_THREADS_LABEL;Maximum number of threads for Noise Reduction and Wavelet Levels (0 = Automatic) !PREFERENCES_TAB_PERFORMANCE;Performance @@ -2256,6 +2283,20 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;Embedded JPEG if fullsize, neutral raw otherwise !TP_BWMIX_MIXC;Channel Mixer !TP_BWMIX_NEUTRAL;Reset +!TP_COLORTONING_LABREGIONS;L*a*b* correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !TP_EXPOSURE_CLAMPOOG;Clip out-of-gamut colors !TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction !TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both @@ -2271,6 +2312,8 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !TP_RAW_AMAZEVNG4;AMaZE+VNG4 !TP_RAW_BORDER;Border !TP_RAW_DCBVNG4;DCB+VNG4 +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the check-box first (reasonable values depend on the image). !TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_PIXELSHIFTDMETHOD;Demosaic method for motion !TP_RAW_PIXELSHIFTEPERISO;Sensitivity @@ -2285,3 +2328,4 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression +!TP_TM_FATTAL_THRESHOLD;Detail diff --git a/rtdata/languages/Greek b/rtdata/languages/Greek index 0641c6a49..761d0ea77 100644 --- a/rtdata/languages/Greek +++ b/rtdata/languages/Greek @@ -445,6 +445,10 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !DYNPROFILEEDITOR_EDIT;Edit !DYNPROFILEEDITOR_EDIT_RULE;Edit Dynamic Profile Rule !DYNPROFILEEDITOR_ENTRY_TOOLTIP;The matching is case insensitive.\nUse the "re:" prefix to enter\na regular expression. +!DYNPROFILEEDITOR_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard !DYNPROFILEEDITOR_MOVE_DOWN;Move Down !DYNPROFILEEDITOR_MOVE_UP;Move Up !DYNPROFILEEDITOR_NEW;New @@ -496,6 +500,8 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to browse to the chosen path. !FILEBROWSER_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory !FILEBROWSER_CACHE;Cache +!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple !FILEBROWSER_CURRENT_NAME;Current name: !FILEBROWSER_DARKFRAME;Dark-frame @@ -967,13 +973,27 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens !HISTORY_MSG_488;Dynamic Range Compression +!HISTORY_MSG_489;DRC - Detail !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction -!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;AMaZE+VNG4 - Contrast threshold +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - Show mask +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold !HISTORY_MSG_HISTMATCHING;Auto-matched tone curve !HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries !HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D @@ -997,6 +1017,7 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !HISTORY_MSG_RAW_BORDER;Raw border !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength !HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor @@ -1145,6 +1166,7 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !PARTIALPASTE_DARKFRAMEAUTOSELECT;Dark-frame auto-selection !PARTIALPASTE_DARKFRAMEFILE;Dark-frame file !PARTIALPASTE_DEFRINGE;Defringe +!PARTIALPASTE_DEHAZE;Haze removal !PARTIALPASTE_DETAILGROUP;Detail Settings !PARTIALPASTE_DIRPYRDENOISE;Noise reduction !PARTIALPASTE_DIRPYREQUALIZER;Contrast by detail levels @@ -1204,6 +1226,11 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !PREFERENCES_BEHSETALL;All to 'Set' !PREFERENCES_BEHSETALLHINT;Set all parameters to the Set mode.\nAdjustments of parameters in the batch tool panel will be absolute, the actual values will be displayed. !PREFERENCES_BLACKBODY;Tungsten +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory @@ -1537,6 +1564,16 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !TP_COLORTONING_LABEL;Color Toning !TP_COLORTONING_LABGRID;L*a*b* color correction grid !TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 +!TP_COLORTONING_LABREGIONS;L*a*b* correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask !TP_COLORTONING_LUMA;Luminance !TP_COLORTONING_LUMAMODE;Preserve luminance !TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change color (red, green, cyan, blue, etc.) the luminance of each pixel is preserved. @@ -1574,6 +1611,10 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones !TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global !TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! @@ -1859,6 +1900,8 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !TP_RAW_DMETHOD_PROGRESSBAR;%1 demosaicing... !TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Demosaicing refinement... !TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the check-box first (reasonable values depend on the image). !TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast @@ -2023,6 +2066,7 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression +!TP_TM_FATTAL_THRESHOLD;Detail !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones diff --git a/rtdata/languages/Hebrew b/rtdata/languages/Hebrew index 0e6d6ddd3..d909f15c4 100644 --- a/rtdata/languages/Hebrew +++ b/rtdata/languages/Hebrew @@ -446,6 +446,10 @@ TP_WBALANCE_TEMPERATURE;מידת חום !DYNPROFILEEDITOR_EDIT;Edit !DYNPROFILEEDITOR_EDIT_RULE;Edit Dynamic Profile Rule !DYNPROFILEEDITOR_ENTRY_TOOLTIP;The matching is case insensitive.\nUse the "re:" prefix to enter\na regular expression. +!DYNPROFILEEDITOR_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard !DYNPROFILEEDITOR_MOVE_DOWN;Move Down !DYNPROFILEEDITOR_MOVE_UP;Move Up !DYNPROFILEEDITOR_NEW;New @@ -497,6 +501,8 @@ TP_WBALANCE_TEMPERATURE;מידת חום !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to browse to the chosen path. !FILEBROWSER_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory !FILEBROWSER_CACHE;Cache +!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple !FILEBROWSER_CURRENT_NAME;Current name: !FILEBROWSER_DARKFRAME;Dark-frame @@ -968,13 +974,27 @@ TP_WBALANCE_TEMPERATURE;מידת חום !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens !HISTORY_MSG_488;Dynamic Range Compression +!HISTORY_MSG_489;DRC - Detail !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction -!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;AMaZE+VNG4 - Contrast threshold +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - Show mask +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold !HISTORY_MSG_HISTMATCHING;Auto-matched tone curve !HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries !HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D @@ -998,6 +1018,7 @@ TP_WBALANCE_TEMPERATURE;מידת חום !HISTORY_MSG_RAW_BORDER;Raw border !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength !HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor @@ -1146,6 +1167,7 @@ TP_WBALANCE_TEMPERATURE;מידת חום !PARTIALPASTE_DARKFRAMEAUTOSELECT;Dark-frame auto-selection !PARTIALPASTE_DARKFRAMEFILE;Dark-frame file !PARTIALPASTE_DEFRINGE;Defringe +!PARTIALPASTE_DEHAZE;Haze removal !PARTIALPASTE_DETAILGROUP;Detail Settings !PARTIALPASTE_DIRPYRDENOISE;Noise reduction !PARTIALPASTE_DIRPYREQUALIZER;Contrast by detail levels @@ -1205,6 +1227,11 @@ TP_WBALANCE_TEMPERATURE;מידת חום !PREFERENCES_BEHSETALL;All to 'Set' !PREFERENCES_BEHSETALLHINT;Set all parameters to the Set mode.\nAdjustments of parameters in the batch tool panel will be absolute, the actual values will be displayed. !PREFERENCES_BLACKBODY;Tungsten +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory @@ -1538,6 +1565,16 @@ TP_WBALANCE_TEMPERATURE;מידת חום !TP_COLORTONING_LABEL;Color Toning !TP_COLORTONING_LABGRID;L*a*b* color correction grid !TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 +!TP_COLORTONING_LABREGIONS;L*a*b* correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask !TP_COLORTONING_LUMA;Luminance !TP_COLORTONING_LUMAMODE;Preserve luminance !TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change color (red, green, cyan, blue, etc.) the luminance of each pixel is preserved. @@ -1575,6 +1612,10 @@ TP_WBALANCE_TEMPERATURE;מידת חום !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones !TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global !TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! @@ -1860,6 +1901,8 @@ TP_WBALANCE_TEMPERATURE;מידת חום !TP_RAW_DMETHOD_PROGRESSBAR;%1 demosaicing... !TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Demosaicing refinement... !TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the check-box first (reasonable values depend on the image). !TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast @@ -2024,6 +2067,7 @@ TP_WBALANCE_TEMPERATURE;מידת חום !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression +!TP_TM_FATTAL_THRESHOLD;Detail !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones diff --git a/rtdata/languages/Italiano b/rtdata/languages/Italiano index 53fda9e49..173fb2a23 100644 --- a/rtdata/languages/Italiano +++ b/rtdata/languages/Italiano @@ -1316,6 +1316,10 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !DYNPROFILEEDITOR_EDIT;Edit !DYNPROFILEEDITOR_EDIT_RULE;Edit Dynamic Profile Rule !DYNPROFILEEDITOR_ENTRY_TOOLTIP;The matching is case insensitive.\nUse the "re:" prefix to enter\na regular expression. +!DYNPROFILEEDITOR_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard !DYNPROFILEEDITOR_MOVE_DOWN;Move Down !DYNPROFILEEDITOR_MOVE_UP;Move Up !DYNPROFILEEDITOR_NEW;New @@ -1329,6 +1333,8 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !EXPORT_USE_FAST_PIPELINE;Dedicated (full processing on resized image) !EXPORT_USE_FAST_PIPELINE_TIP;Use a dedicated processing pipeline for images in Fast Export mode, that trades speed for quality. Resizing of the image is done as early as possible, instead of doing it at the end like in the normal pipeline. The speedup can be significant, but be prepared to see artifacts and a general degradation of output quality. !EXPORT_USE_NORMAL_PIPELINE;Standard (bypass some steps, resize at the end) +!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_RESETDEFAULTPROFILE;Reset to default !FILEBROWSER_SHOWNOTTRASHHINT;Show only non-deleted images. !FILEBROWSER_SHOWORIGINALHINT;Show only original images.\n\nWhen several images exist with the same filename but different extensions, the one considered original is the one whose extension is nearest the top of the parsed extensions list in Preferences > File Browser > Parsed Extensions. @@ -1569,13 +1575,27 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens !HISTORY_MSG_488;Dynamic Range Compression +!HISTORY_MSG_489;DRC - Detail !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction -!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;AMaZE+VNG4 - Contrast threshold +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - Show mask +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold !HISTORY_MSG_HISTMATCHING;Auto-matched tone curve !HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries !HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D @@ -1599,6 +1619,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !HISTORY_MSG_RAW_BORDER;Raw border !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength !HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor @@ -1686,6 +1707,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. !PARTIALPASTE_ADVANCEDGROUP;Advanced Settings !PARTIALPASTE_COLORTONING;Color toning +!PARTIALPASTE_DEHAZE;Haze removal !PARTIALPASTE_EQUALIZER;Wavelet levels !PARTIALPASTE_FILMSIMULATION;Film simulation !PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control @@ -1704,6 +1726,11 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !PARTIALPASTE_SOFTLIGHT;Soft light !PARTIALPASTE_TM_FATTAL;Dynamic range compression !PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory @@ -1813,6 +1840,16 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !TP_COLORTONING_LABEL;Color Toning !TP_COLORTONING_LABGRID;L*a*b* color correction grid !TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 +!TP_COLORTONING_LABREGIONS;L*a*b* correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask !TP_COLORTONING_LUMA;Luminance !TP_COLORTONING_LUMAMODE;Preserve luminance !TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change color (red, green, cyan, blue, etc.) the luminance of each pixel is preserved. @@ -1841,6 +1878,10 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones !TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global !TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! @@ -1962,6 +2003,8 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !TP_RAW_BORDER;Border !TP_RAW_DCB;DCB !TP_RAW_DCBVNG4;DCB+VNG4 +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the check-box first (reasonable values depend on the image). !TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast @@ -2098,6 +2141,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression +!TP_TM_FATTAL_THRESHOLD;Detail !TP_WAVELET_1;Level 1 !TP_WAVELET_2;Level 2 !TP_WAVELET_3;Level 3 diff --git a/rtdata/languages/Japanese b/rtdata/languages/Japanese index 28d1b6cfd..8a2f90dfd 100644 --- a/rtdata/languages/Japanese +++ b/rtdata/languages/Japanese @@ -2283,4 +2283,48 @@ ZOOMPANEL_ZOOMOUT;ズームアウト\nショートカット: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! +!DYNPROFILEEDITOR_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard +!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles +!HISTORY_MSG_489;DRC - Detail +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - Show mask +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace +!PARTIALPASTE_DEHAZE;Haze removal !PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid color shift +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. +!TP_COLORTONING_LABREGIONS;L*a*b* correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the check-box first (reasonable values depend on the image). +!TP_TM_FATTAL_THRESHOLD;Detail diff --git a/rtdata/languages/Latvian b/rtdata/languages/Latvian index e8b87c19b..22847390d 100644 --- a/rtdata/languages/Latvian +++ b/rtdata/languages/Latvian @@ -446,6 +446,10 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !DYNPROFILEEDITOR_EDIT;Edit !DYNPROFILEEDITOR_EDIT_RULE;Edit Dynamic Profile Rule !DYNPROFILEEDITOR_ENTRY_TOOLTIP;The matching is case insensitive.\nUse the "re:" prefix to enter\na regular expression. +!DYNPROFILEEDITOR_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard !DYNPROFILEEDITOR_MOVE_DOWN;Move Down !DYNPROFILEEDITOR_MOVE_UP;Move Up !DYNPROFILEEDITOR_NEW;New @@ -497,6 +501,8 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to browse to the chosen path. !FILEBROWSER_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory !FILEBROWSER_CACHE;Cache +!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple !FILEBROWSER_CURRENT_NAME;Current name: !FILEBROWSER_DARKFRAME;Dark-frame @@ -968,13 +974,27 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens !HISTORY_MSG_488;Dynamic Range Compression +!HISTORY_MSG_489;DRC - Detail !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction -!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;AMaZE+VNG4 - Contrast threshold +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - Show mask +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold !HISTORY_MSG_HISTMATCHING;Auto-matched tone curve !HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries !HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D @@ -998,6 +1018,7 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !HISTORY_MSG_RAW_BORDER;Raw border !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength !HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor @@ -1146,6 +1167,7 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !PARTIALPASTE_DARKFRAMEAUTOSELECT;Dark-frame auto-selection !PARTIALPASTE_DARKFRAMEFILE;Dark-frame file !PARTIALPASTE_DEFRINGE;Defringe +!PARTIALPASTE_DEHAZE;Haze removal !PARTIALPASTE_DETAILGROUP;Detail Settings !PARTIALPASTE_DIRPYRDENOISE;Noise reduction !PARTIALPASTE_DIRPYREQUALIZER;Contrast by detail levels @@ -1205,6 +1227,11 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !PREFERENCES_BEHSETALL;All to 'Set' !PREFERENCES_BEHSETALLHINT;Set all parameters to the Set mode.\nAdjustments of parameters in the batch tool panel will be absolute, the actual values will be displayed. !PREFERENCES_BLACKBODY;Tungsten +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory @@ -1538,6 +1565,16 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !TP_COLORTONING_LABEL;Color Toning !TP_COLORTONING_LABGRID;L*a*b* color correction grid !TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 +!TP_COLORTONING_LABREGIONS;L*a*b* correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask !TP_COLORTONING_LUMA;Luminance !TP_COLORTONING_LUMAMODE;Preserve luminance !TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change color (red, green, cyan, blue, etc.) the luminance of each pixel is preserved. @@ -1575,6 +1612,10 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones !TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global !TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! @@ -1860,6 +1901,8 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !TP_RAW_DMETHOD_PROGRESSBAR;%1 demosaicing... !TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Demosaicing refinement... !TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the check-box first (reasonable values depend on the image). !TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast @@ -2024,6 +2067,7 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression +!TP_TM_FATTAL_THRESHOLD;Detail !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones diff --git a/rtdata/languages/Magyar b/rtdata/languages/Magyar index 354c32910..600877671 100644 --- a/rtdata/languages/Magyar +++ b/rtdata/languages/Magyar @@ -872,6 +872,10 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !DYNPROFILEEDITOR_EDIT;Edit !DYNPROFILEEDITOR_EDIT_RULE;Edit Dynamic Profile Rule !DYNPROFILEEDITOR_ENTRY_TOOLTIP;The matching is case insensitive.\nUse the "re:" prefix to enter\na regular expression. +!DYNPROFILEEDITOR_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard !DYNPROFILEEDITOR_MOVE_DOWN;Move Down !DYNPROFILEEDITOR_MOVE_UP;Move Up !DYNPROFILEEDITOR_NEW;New @@ -890,6 +894,8 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !EXPORT_USE_NORMAL_PIPELINE;Standard (bypass some steps, resize at the end) !EXTPROGTARGET_1;raw !EXTPROGTARGET_2;queue-processed +!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple !FILEBROWSER_EXTPROGMENU;Open with !FILEBROWSER_OPENDEFAULTVIEWER;Windows default viewer (queue-processed) @@ -1240,13 +1246,27 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens !HISTORY_MSG_488;Dynamic Range Compression +!HISTORY_MSG_489;DRC - Detail !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction -!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;AMaZE+VNG4 - Contrast threshold +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - Show mask +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold !HISTORY_MSG_HISTMATCHING;Auto-matched tone curve !HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries !HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D @@ -1270,6 +1290,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !HISTORY_MSG_RAW_BORDER;Raw border !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength !HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor @@ -1381,6 +1402,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !PARTIALPASTE_CHANNELMIXERBW;Black-and-white !PARTIALPASTE_COLORAPP;CIECAM02 !PARTIALPASTE_COLORTONING;Color toning +!PARTIALPASTE_DEHAZE;Haze removal !PARTIALPASTE_EQUALIZER;Wavelet levels !PARTIALPASTE_FILMSIMULATION;Film simulation !PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control @@ -1408,6 +1430,11 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !PREFERENCES_BEHSETALL;All to 'Set' !PREFERENCES_BEHSETALLHINT;Set all parameters to the Set mode.\nAdjustments of parameters in the batch tool panel will be absolute, the actual values will be displayed. !PREFERENCES_BLACKBODY;Tungsten +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory @@ -1690,6 +1717,16 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_COLORTONING_LABEL;Color Toning !TP_COLORTONING_LABGRID;L*a*b* color correction grid !TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 +!TP_COLORTONING_LABREGIONS;L*a*b* correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask !TP_COLORTONING_LUMA;Luminance !TP_COLORTONING_LUMAMODE;Preserve luminance !TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change color (red, green, cyan, blue, etc.) the luminance of each pixel is preserved. @@ -1719,6 +1756,10 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones !TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global !TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! @@ -1936,6 +1977,8 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_RAW_DMETHOD_PROGRESSBAR;%1 demosaicing... !TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Demosaicing refinement... !TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the check-box first (reasonable values depend on the image). !TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast @@ -2078,6 +2121,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression +!TP_TM_FATTAL_THRESHOLD;Detail !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones !TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE1;Red/Purple diff --git a/rtdata/languages/Nederlands b/rtdata/languages/Nederlands index 45f1c5e3f..315868150 100644 --- a/rtdata/languages/Nederlands +++ b/rtdata/languages/Nederlands @@ -2073,8 +2073,14 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - !ADJUSTER_RESET_TO_DEFAULT;Click - reset to default value.\nCtrl+click - reset to initial value. !BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !DONT_SHOW_AGAIN;Don't show this message again. +!DYNPROFILEEDITOR_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard !EXIFFILTER_IMAGETYPE;Image type !EXIFPANEL_SHOWALL;Show all +!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !GENERAL_RESET;Reset !GENERAL_SAVE_AS;Save as... !GENERAL_SLIDER;Slider @@ -2103,13 +2109,27 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens !HISTORY_MSG_488;Dynamic Range Compression +!HISTORY_MSG_489;DRC - Detail !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction -!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;AMaZE+VNG4 - Contrast threshold +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - Show mask +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold !HISTORY_MSG_HISTMATCHING;Auto-matched tone curve !HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries !HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D @@ -2133,6 +2153,7 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - !HISTORY_MSG_RAW_BORDER;Raw border !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength !HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor @@ -2191,6 +2212,7 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - !OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. !OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. !PARTIALPASTE_ADVANCEDGROUP;Advanced Settings +!PARTIALPASTE_DEHAZE;Haze removal !PARTIALPASTE_LOCALCONTRAST;Local contrast !PARTIALPASTE_METADATA;Metadata mode !PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter @@ -2199,6 +2221,11 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - !PARTIALPASTE_SOFTLIGHT;Soft light !PARTIALPASTE_TM_FATTAL;Dynamic range compression !PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_CROP;Crop editing !PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area !PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop @@ -2246,6 +2273,20 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - !TP_COLORAPP_YBSCENE_TOOLTIP;If "auto" is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_COLORTONING_LABGRID;L*a*b* color correction grid !TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 +!TP_COLORTONING_LABREGIONS;L*a*b* correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. !TP_DIRPYRDENOISE_LABEL;Noise Reduction !TP_EXPOSURE_CLAMPOOG;Clip out-of-gamut colors @@ -2280,6 +2321,8 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - !TP_RAW_AMAZEVNG4;AMaZE+VNG4 !TP_RAW_BORDER;Border !TP_RAW_DCBVNG4;DCB+VNG4 +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the check-box first (reasonable values depend on the image). !TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_PIXELSHIFTDMETHOD;Demosaic method for motion @@ -2301,4 +2344,5 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression +!TP_TM_FATTAL_THRESHOLD;Detail !TP_WAVELET_CB_TOOLTIP;For strong values product color-toning by combining it or not with levels decomposition 'toning'\nFor low values you can change the white balance of the background (sky, ...) without changing that of the front plane, generally more contrasted diff --git a/rtdata/languages/Norsk BM b/rtdata/languages/Norsk BM index a4a6fc523..9ec4fc6e2 100644 --- a/rtdata/languages/Norsk BM +++ b/rtdata/languages/Norsk BM @@ -445,6 +445,10 @@ TP_WBALANCE_TEMPERATURE;Temperatur !DYNPROFILEEDITOR_EDIT;Edit !DYNPROFILEEDITOR_EDIT_RULE;Edit Dynamic Profile Rule !DYNPROFILEEDITOR_ENTRY_TOOLTIP;The matching is case insensitive.\nUse the "re:" prefix to enter\na regular expression. +!DYNPROFILEEDITOR_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard !DYNPROFILEEDITOR_MOVE_DOWN;Move Down !DYNPROFILEEDITOR_MOVE_UP;Move Up !DYNPROFILEEDITOR_NEW;New @@ -496,6 +500,8 @@ TP_WBALANCE_TEMPERATURE;Temperatur !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to browse to the chosen path. !FILEBROWSER_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory !FILEBROWSER_CACHE;Cache +!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple !FILEBROWSER_CURRENT_NAME;Current name: !FILEBROWSER_DARKFRAME;Dark-frame @@ -967,13 +973,27 @@ TP_WBALANCE_TEMPERATURE;Temperatur !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens !HISTORY_MSG_488;Dynamic Range Compression +!HISTORY_MSG_489;DRC - Detail !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction -!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;AMaZE+VNG4 - Contrast threshold +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - Show mask +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold !HISTORY_MSG_HISTMATCHING;Auto-matched tone curve !HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries !HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D @@ -997,6 +1017,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !HISTORY_MSG_RAW_BORDER;Raw border !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength !HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor @@ -1145,6 +1166,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !PARTIALPASTE_DARKFRAMEAUTOSELECT;Dark-frame auto-selection !PARTIALPASTE_DARKFRAMEFILE;Dark-frame file !PARTIALPASTE_DEFRINGE;Defringe +!PARTIALPASTE_DEHAZE;Haze removal !PARTIALPASTE_DETAILGROUP;Detail Settings !PARTIALPASTE_DIRPYRDENOISE;Noise reduction !PARTIALPASTE_DIRPYREQUALIZER;Contrast by detail levels @@ -1204,6 +1226,11 @@ TP_WBALANCE_TEMPERATURE;Temperatur !PREFERENCES_BEHSETALL;All to 'Set' !PREFERENCES_BEHSETALLHINT;Set all parameters to the Set mode.\nAdjustments of parameters in the batch tool panel will be absolute, the actual values will be displayed. !PREFERENCES_BLACKBODY;Tungsten +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory @@ -1537,6 +1564,16 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_COLORTONING_LABEL;Color Toning !TP_COLORTONING_LABGRID;L*a*b* color correction grid !TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 +!TP_COLORTONING_LABREGIONS;L*a*b* correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask !TP_COLORTONING_LUMA;Luminance !TP_COLORTONING_LUMAMODE;Preserve luminance !TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change color (red, green, cyan, blue, etc.) the luminance of each pixel is preserved. @@ -1574,6 +1611,10 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones !TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global !TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! @@ -1859,6 +1900,8 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_RAW_DMETHOD_PROGRESSBAR;%1 demosaicing... !TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Demosaicing refinement... !TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the check-box first (reasonable values depend on the image). !TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast @@ -2023,6 +2066,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression +!TP_TM_FATTAL_THRESHOLD;Detail !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones diff --git a/rtdata/languages/Polish b/rtdata/languages/Polish index eeb945ef2..ec60c307f 100644 --- a/rtdata/languages/Polish +++ b/rtdata/languages/Polish @@ -1438,6 +1438,10 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !DYNPROFILEEDITOR_EDIT;Edit !DYNPROFILEEDITOR_EDIT_RULE;Edit Dynamic Profile Rule !DYNPROFILEEDITOR_ENTRY_TOOLTIP;The matching is case insensitive.\nUse the "re:" prefix to enter\na regular expression. +!DYNPROFILEEDITOR_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard !DYNPROFILEEDITOR_MOVE_DOWN;Move Down !DYNPROFILEEDITOR_MOVE_UP;Move Up !DYNPROFILEEDITOR_NEW;New @@ -1451,6 +1455,8 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !EXPORT_USE_FAST_PIPELINE;Dedicated (full processing on resized image) !EXPORT_USE_FAST_PIPELINE_TIP;Use a dedicated processing pipeline for images in Fast Export mode, that trades speed for quality. Resizing of the image is done as early as possible, instead of doing it at the end like in the normal pipeline. The speedup can be significant, but be prepared to see artifacts and a general degradation of output quality. !EXPORT_USE_NORMAL_PIPELINE;Standard (bypass some steps, resize at the end) +!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_RESETDEFAULTPROFILE;Reset to default !FILEBROWSER_SHOWNOTTRASHHINT;Show only non-deleted images. !FILEBROWSER_SHOWORIGINALHINT;Show only original images.\n\nWhen several images exist with the same filename but different extensions, the one considered original is the one whose extension is nearest the top of the parsed extensions list in Preferences > File Browser > Parsed Extensions. @@ -1651,13 +1657,27 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens !HISTORY_MSG_488;Dynamic Range Compression +!HISTORY_MSG_489;DRC - Detail !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction -!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;AMaZE+VNG4 - Contrast threshold +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - Show mask +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold !HISTORY_MSG_HISTMATCHING;Auto-matched tone curve !HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries !HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D @@ -1681,6 +1701,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !HISTORY_MSG_RAW_BORDER;Raw border !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength !HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor @@ -1767,6 +1788,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. !OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. !PARTIALPASTE_ADVANCEDGROUP;Advanced Settings +!PARTIALPASTE_DEHAZE;Haze removal !PARTIALPASTE_EQUALIZER;Wavelet levels !PARTIALPASTE_LOCALCONTRAST;Local contrast !PARTIALPASTE_METADATA;Metadata mode @@ -1781,6 +1803,11 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !PARTIALPASTE_SOFTLIGHT;Soft light !PARTIALPASTE_TM_FATTAL;Dynamic range compression !PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CMMBPC;Black point compensation @@ -1878,9 +1905,23 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !TP_COLORAPP_YBSCENE_TOOLTIP;If "auto" is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_COLORTONING_LABGRID;L*a*b* color correction grid !TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 +!TP_COLORTONING_LABREGIONS;L*a*b* correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones !TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global !TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! @@ -1971,6 +2012,8 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !TP_RAW_BORDER;Border !TP_RAW_DCB;DCB !TP_RAW_DCBVNG4;DCB+VNG4 +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the check-box first (reasonable values depend on the image). !TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast @@ -2104,6 +2147,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression +!TP_TM_FATTAL_THRESHOLD;Detail !TP_WAVELET_1;Level 1 !TP_WAVELET_2;Level 2 !TP_WAVELET_3;Level 3 diff --git a/rtdata/languages/Polish (Latin Characters) b/rtdata/languages/Polish (Latin Characters) index ed27de93b..a75a3c475 100644 --- a/rtdata/languages/Polish (Latin Characters) +++ b/rtdata/languages/Polish (Latin Characters) @@ -1438,6 +1438,10 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !DYNPROFILEEDITOR_EDIT;Edit !DYNPROFILEEDITOR_EDIT_RULE;Edit Dynamic Profile Rule !DYNPROFILEEDITOR_ENTRY_TOOLTIP;The matching is case insensitive.\nUse the "re:" prefix to enter\na regular expression. +!DYNPROFILEEDITOR_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard !DYNPROFILEEDITOR_MOVE_DOWN;Move Down !DYNPROFILEEDITOR_MOVE_UP;Move Up !DYNPROFILEEDITOR_NEW;New @@ -1451,6 +1455,8 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !EXPORT_USE_FAST_PIPELINE;Dedicated (full processing on resized image) !EXPORT_USE_FAST_PIPELINE_TIP;Use a dedicated processing pipeline for images in Fast Export mode, that trades speed for quality. Resizing of the image is done as early as possible, instead of doing it at the end like in the normal pipeline. The speedup can be significant, but be prepared to see artifacts and a general degradation of output quality. !EXPORT_USE_NORMAL_PIPELINE;Standard (bypass some steps, resize at the end) +!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_RESETDEFAULTPROFILE;Reset to default !FILEBROWSER_SHOWNOTTRASHHINT;Show only non-deleted images. !FILEBROWSER_SHOWORIGINALHINT;Show only original images.\n\nWhen several images exist with the same filename but different extensions, the one considered original is the one whose extension is nearest the top of the parsed extensions list in Preferences > File Browser > Parsed Extensions. @@ -1651,13 +1657,27 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens !HISTORY_MSG_488;Dynamic Range Compression +!HISTORY_MSG_489;DRC - Detail !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction -!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;AMaZE+VNG4 - Contrast threshold +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - Show mask +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold !HISTORY_MSG_HISTMATCHING;Auto-matched tone curve !HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries !HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D @@ -1681,6 +1701,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !HISTORY_MSG_RAW_BORDER;Raw border !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength !HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor @@ -1767,6 +1788,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. !OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. !PARTIALPASTE_ADVANCEDGROUP;Advanced Settings +!PARTIALPASTE_DEHAZE;Haze removal !PARTIALPASTE_EQUALIZER;Wavelet levels !PARTIALPASTE_LOCALCONTRAST;Local contrast !PARTIALPASTE_METADATA;Metadata mode @@ -1781,6 +1803,11 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !PARTIALPASTE_SOFTLIGHT;Soft light !PARTIALPASTE_TM_FATTAL;Dynamic range compression !PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CMMBPC;Black point compensation @@ -1878,9 +1905,23 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !TP_COLORAPP_YBSCENE_TOOLTIP;If "auto" is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_COLORTONING_LABGRID;L*a*b* color correction grid !TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 +!TP_COLORTONING_LABREGIONS;L*a*b* correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones !TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global !TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! @@ -1971,6 +2012,8 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !TP_RAW_BORDER;Border !TP_RAW_DCB;DCB !TP_RAW_DCBVNG4;DCB+VNG4 +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the check-box first (reasonable values depend on the image). !TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast @@ -2104,6 +2147,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression +!TP_TM_FATTAL_THRESHOLD;Detail !TP_WAVELET_1;Level 1 !TP_WAVELET_2;Level 2 !TP_WAVELET_3;Level 3 diff --git a/rtdata/languages/Portugues (Brasil) b/rtdata/languages/Portugues (Brasil) index 28822efbd..cb2c20e1a 100644 --- a/rtdata/languages/Portugues (Brasil) +++ b/rtdata/languages/Portugues (Brasil) @@ -2246,16 +2246,60 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! +!DYNPROFILEEDITOR_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard +!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !HISTOGRAM_TOOLTIP_MODE;Toggle between linear, log-linear and log-log scaling of the histogram. +!HISTORY_MSG_489;DRC - Detail +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - Show mask +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold !HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries !HISTORY_MSG_RAWCACORR_AUTOIT;Raw CA Correction - Iterations !HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correction - Avoid color shift +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace !ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Append gamma and slope values to the description +!PARTIALPASTE_DEHAZE;Haze removal !PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid color shift +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_PERFORMANCE_THREADS;Threads !PREFERENCES_PERFORMANCE_THREADS_LABEL;Maximum number of threads for Noise Reduction and Wavelet Levels (0 = Automatic) !PREFERENCES_TAB_PERFORMANCE;Performance !SAVEDLG_FILEFORMAT_FLOAT; floating-point +!TP_COLORTONING_LABREGIONS;L*a*b* correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !TP_RAWCACORR_AUTOIT;Iterations !TP_RAWCACORR_AVOIDCOLORSHIFT;Avoid color shift +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the check-box first (reasonable values depend on the image). !TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain. +!TP_TM_FATTAL_THRESHOLD;Detail diff --git a/rtdata/languages/Serbian (Cyrilic Characters) b/rtdata/languages/Serbian (Cyrilic Characters) index 8ea1f8fdb..080824fed 100644 --- a/rtdata/languages/Serbian (Cyrilic Characters) +++ b/rtdata/languages/Serbian (Cyrilic Characters) @@ -1274,6 +1274,10 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !DYNPROFILEEDITOR_EDIT;Edit !DYNPROFILEEDITOR_EDIT_RULE;Edit Dynamic Profile Rule !DYNPROFILEEDITOR_ENTRY_TOOLTIP;The matching is case insensitive.\nUse the "re:" prefix to enter\na regular expression. +!DYNPROFILEEDITOR_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard !DYNPROFILEEDITOR_MOVE_DOWN;Move Down !DYNPROFILEEDITOR_MOVE_UP;Move Up !DYNPROFILEEDITOR_NEW;New @@ -1289,6 +1293,8 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !EXPORT_USE_FAST_PIPELINE;Dedicated (full processing on resized image) !EXPORT_USE_FAST_PIPELINE_TIP;Use a dedicated processing pipeline for images in Fast Export mode, that trades speed for quality. Resizing of the image is done as early as possible, instead of doing it at the end like in the normal pipeline. The speedup can be significant, but be prepared to see artifacts and a general degradation of output quality. !EXPORT_USE_NORMAL_PIPELINE;Standard (bypass some steps, resize at the end) +!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_POPUPCOLORLABEL0;Label: None !FILEBROWSER_POPUPCOLORLABEL1;Label: Red !FILEBROWSER_POPUPCOLORLABEL2;Label: Yellow @@ -1545,13 +1551,27 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens !HISTORY_MSG_488;Dynamic Range Compression +!HISTORY_MSG_489;DRC - Detail !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction -!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;AMaZE+VNG4 - Contrast threshold +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - Show mask +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold !HISTORY_MSG_HISTMATCHING;Auto-matched tone curve !HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries !HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D @@ -1575,6 +1595,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !HISTORY_MSG_RAW_BORDER;Raw border !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength !HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor @@ -1671,6 +1692,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. !PARTIALPASTE_ADVANCEDGROUP;Advanced Settings !PARTIALPASTE_COLORTONING;Color toning +!PARTIALPASTE_DEHAZE;Haze removal !PARTIALPASTE_EQUALIZER;Wavelet levels !PARTIALPASTE_FILMSIMULATION;Film simulation !PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control @@ -1690,6 +1712,11 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !PARTIALPASTE_SOFTLIGHT;Soft light !PARTIALPASTE_TM_FATTAL;Dynamic range compression !PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory @@ -1805,6 +1832,16 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_COLORTONING_LABEL;Color Toning !TP_COLORTONING_LABGRID;L*a*b* color correction grid !TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 +!TP_COLORTONING_LABREGIONS;L*a*b* correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask !TP_COLORTONING_LUMA;Luminance !TP_COLORTONING_LUMAMODE;Preserve luminance !TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change color (red, green, cyan, blue, etc.) the luminance of each pixel is preserved. @@ -1833,6 +1870,10 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones !TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global !TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! @@ -1963,6 +2004,8 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_RAW_BORDER;Border !TP_RAW_DCB;DCB !TP_RAW_DCBVNG4;DCB+VNG4 +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the check-box first (reasonable values depend on the image). !TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast @@ -2099,6 +2142,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression +!TP_TM_FATTAL_THRESHOLD;Detail !TP_WAVELET_1;Level 1 !TP_WAVELET_2;Level 2 !TP_WAVELET_3;Level 3 diff --git a/rtdata/languages/Serbian (Latin Characters) b/rtdata/languages/Serbian (Latin Characters) index 1bc4057be..b0d929858 100644 --- a/rtdata/languages/Serbian (Latin Characters) +++ b/rtdata/languages/Serbian (Latin Characters) @@ -1274,6 +1274,10 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !DYNPROFILEEDITOR_EDIT;Edit !DYNPROFILEEDITOR_EDIT_RULE;Edit Dynamic Profile Rule !DYNPROFILEEDITOR_ENTRY_TOOLTIP;The matching is case insensitive.\nUse the "re:" prefix to enter\na regular expression. +!DYNPROFILEEDITOR_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard !DYNPROFILEEDITOR_MOVE_DOWN;Move Down !DYNPROFILEEDITOR_MOVE_UP;Move Up !DYNPROFILEEDITOR_NEW;New @@ -1289,6 +1293,8 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !EXPORT_USE_FAST_PIPELINE;Dedicated (full processing on resized image) !EXPORT_USE_FAST_PIPELINE_TIP;Use a dedicated processing pipeline for images in Fast Export mode, that trades speed for quality. Resizing of the image is done as early as possible, instead of doing it at the end like in the normal pipeline. The speedup can be significant, but be prepared to see artifacts and a general degradation of output quality. !EXPORT_USE_NORMAL_PIPELINE;Standard (bypass some steps, resize at the end) +!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_POPUPCOLORLABEL0;Label: None !FILEBROWSER_POPUPCOLORLABEL1;Label: Red !FILEBROWSER_POPUPCOLORLABEL2;Label: Yellow @@ -1545,13 +1551,27 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens !HISTORY_MSG_488;Dynamic Range Compression +!HISTORY_MSG_489;DRC - Detail !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction -!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;AMaZE+VNG4 - Contrast threshold +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - Show mask +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold !HISTORY_MSG_HISTMATCHING;Auto-matched tone curve !HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries !HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D @@ -1575,6 +1595,7 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !HISTORY_MSG_RAW_BORDER;Raw border !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength !HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor @@ -1671,6 +1692,7 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. !PARTIALPASTE_ADVANCEDGROUP;Advanced Settings !PARTIALPASTE_COLORTONING;Color toning +!PARTIALPASTE_DEHAZE;Haze removal !PARTIALPASTE_EQUALIZER;Wavelet levels !PARTIALPASTE_FILMSIMULATION;Film simulation !PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control @@ -1690,6 +1712,11 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !PARTIALPASTE_SOFTLIGHT;Soft light !PARTIALPASTE_TM_FATTAL;Dynamic range compression !PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory @@ -1805,6 +1832,16 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !TP_COLORTONING_LABEL;Color Toning !TP_COLORTONING_LABGRID;L*a*b* color correction grid !TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 +!TP_COLORTONING_LABREGIONS;L*a*b* correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask !TP_COLORTONING_LUMA;Luminance !TP_COLORTONING_LUMAMODE;Preserve luminance !TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change color (red, green, cyan, blue, etc.) the luminance of each pixel is preserved. @@ -1833,6 +1870,10 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones !TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global !TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! @@ -1963,6 +2004,8 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !TP_RAW_BORDER;Border !TP_RAW_DCB;DCB !TP_RAW_DCBVNG4;DCB+VNG4 +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the check-box first (reasonable values depend on the image). !TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast @@ -2099,6 +2142,7 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression +!TP_TM_FATTAL_THRESHOLD;Detail !TP_WAVELET_1;Level 1 !TP_WAVELET_2;Level 2 !TP_WAVELET_3;Level 3 diff --git a/rtdata/languages/Slovak b/rtdata/languages/Slovak index dc0351823..3f8854ae8 100644 --- a/rtdata/languages/Slovak +++ b/rtdata/languages/Slovak @@ -526,6 +526,10 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !DYNPROFILEEDITOR_EDIT;Edit !DYNPROFILEEDITOR_EDIT_RULE;Edit Dynamic Profile Rule !DYNPROFILEEDITOR_ENTRY_TOOLTIP;The matching is case insensitive.\nUse the "re:" prefix to enter\na regular expression. +!DYNPROFILEEDITOR_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard !DYNPROFILEEDITOR_MOVE_DOWN;Move Down !DYNPROFILEEDITOR_MOVE_UP;Move Up !DYNPROFILEEDITOR_NEW;New @@ -575,6 +579,8 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to browse to the chosen path. !FILEBROWSER_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory !FILEBROWSER_CACHE;Cache +!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple !FILEBROWSER_DARKFRAME;Dark-frame !FILEBROWSER_DELETEDLGMSGINCLPROC;Are you sure you want to delete the selected %1 files including a queue-processed version? @@ -1030,13 +1036,27 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens !HISTORY_MSG_488;Dynamic Range Compression +!HISTORY_MSG_489;DRC - Detail !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction -!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;AMaZE+VNG4 - Contrast threshold +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - Show mask +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold !HISTORY_MSG_HISTMATCHING;Auto-matched tone curve !HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries !HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D @@ -1060,6 +1080,7 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !HISTORY_MSG_RAW_BORDER;Raw border !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength !HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor @@ -1200,6 +1221,7 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !PARTIALPASTE_DARKFRAMEAUTOSELECT;Dark-frame auto-selection !PARTIALPASTE_DARKFRAMEFILE;Dark-frame file !PARTIALPASTE_DEFRINGE;Defringe +!PARTIALPASTE_DEHAZE;Haze removal !PARTIALPASTE_DETAILGROUP;Detail Settings !PARTIALPASTE_DIRPYRDENOISE;Noise reduction !PARTIALPASTE_DIRPYREQUALIZER;Contrast by detail levels @@ -1255,6 +1277,11 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !PREFERENCES_BEHSETALL;All to 'Set' !PREFERENCES_BEHSETALLHINT;Set all parameters to the Set mode.\nAdjustments of parameters in the batch tool panel will be absolute, the actual values will be displayed. !PREFERENCES_BLACKBODY;Tungsten +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory @@ -1577,6 +1604,16 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !TP_COLORTONING_LABEL;Color Toning !TP_COLORTONING_LABGRID;L*a*b* color correction grid !TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 +!TP_COLORTONING_LABREGIONS;L*a*b* correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask !TP_COLORTONING_LUMA;Luminance !TP_COLORTONING_LUMAMODE;Preserve luminance !TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change color (red, green, cyan, blue, etc.) the luminance of each pixel is preserved. @@ -1614,6 +1651,10 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones !TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global !TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! @@ -1872,6 +1913,8 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !TP_RAW_DMETHOD_PROGRESSBAR;%1 demosaicing... !TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Demosaicing refinement... !TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the check-box first (reasonable values depend on the image). !TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast @@ -2033,6 +2076,7 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression +!TP_TM_FATTAL_THRESHOLD;Detail !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones diff --git a/rtdata/languages/Suomi b/rtdata/languages/Suomi index adbd43d82..e304366b7 100644 --- a/rtdata/languages/Suomi +++ b/rtdata/languages/Suomi @@ -447,6 +447,10 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !DYNPROFILEEDITOR_EDIT;Edit !DYNPROFILEEDITOR_EDIT_RULE;Edit Dynamic Profile Rule !DYNPROFILEEDITOR_ENTRY_TOOLTIP;The matching is case insensitive.\nUse the "re:" prefix to enter\na regular expression. +!DYNPROFILEEDITOR_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard !DYNPROFILEEDITOR_MOVE_DOWN;Move Down !DYNPROFILEEDITOR_MOVE_UP;Move Up !DYNPROFILEEDITOR_NEW;New @@ -498,6 +502,8 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to browse to the chosen path. !FILEBROWSER_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory !FILEBROWSER_CACHE;Cache +!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple !FILEBROWSER_CURRENT_NAME;Current name: !FILEBROWSER_DARKFRAME;Dark-frame @@ -969,13 +975,27 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens !HISTORY_MSG_488;Dynamic Range Compression +!HISTORY_MSG_489;DRC - Detail !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction -!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;AMaZE+VNG4 - Contrast threshold +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - Show mask +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold !HISTORY_MSG_HISTMATCHING;Auto-matched tone curve !HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries !HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D @@ -999,6 +1019,7 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !HISTORY_MSG_RAW_BORDER;Raw border !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength !HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor @@ -1147,6 +1168,7 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !PARTIALPASTE_DARKFRAMEAUTOSELECT;Dark-frame auto-selection !PARTIALPASTE_DARKFRAMEFILE;Dark-frame file !PARTIALPASTE_DEFRINGE;Defringe +!PARTIALPASTE_DEHAZE;Haze removal !PARTIALPASTE_DETAILGROUP;Detail Settings !PARTIALPASTE_DIRPYRDENOISE;Noise reduction !PARTIALPASTE_DIRPYREQUALIZER;Contrast by detail levels @@ -1206,6 +1228,11 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !PREFERENCES_BEHSETALL;All to 'Set' !PREFERENCES_BEHSETALLHINT;Set all parameters to the Set mode.\nAdjustments of parameters in the batch tool panel will be absolute, the actual values will be displayed. !PREFERENCES_BLACKBODY;Tungsten +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory @@ -1538,6 +1565,16 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !TP_COLORTONING_LABEL;Color Toning !TP_COLORTONING_LABGRID;L*a*b* color correction grid !TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 +!TP_COLORTONING_LABREGIONS;L*a*b* correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask !TP_COLORTONING_LUMA;Luminance !TP_COLORTONING_LUMAMODE;Preserve luminance !TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change color (red, green, cyan, blue, etc.) the luminance of each pixel is preserved. @@ -1575,6 +1612,10 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones !TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global !TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! @@ -1860,6 +1901,8 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !TP_RAW_DMETHOD_PROGRESSBAR;%1 demosaicing... !TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Demosaicing refinement... !TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the check-box first (reasonable values depend on the image). !TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast @@ -2024,6 +2067,7 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression +!TP_TM_FATTAL_THRESHOLD;Detail !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones diff --git a/rtdata/languages/Swedish b/rtdata/languages/Swedish index e491c3c8a..3c56bbcd1 100644 --- a/rtdata/languages/Swedish +++ b/rtdata/languages/Swedish @@ -1828,6 +1828,10 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !DYNPROFILEEDITOR_EDIT;Edit !DYNPROFILEEDITOR_EDIT_RULE;Edit Dynamic Profile Rule !DYNPROFILEEDITOR_ENTRY_TOOLTIP;The matching is case insensitive.\nUse the "re:" prefix to enter\na regular expression. +!DYNPROFILEEDITOR_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard !DYNPROFILEEDITOR_MOVE_DOWN;Move Down !DYNPROFILEEDITOR_MOVE_UP;Move Up !DYNPROFILEEDITOR_NEW;New @@ -1840,6 +1844,8 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !EXPORT_USE_FAST_PIPELINE;Dedicated (full processing on resized image) !EXPORT_USE_FAST_PIPELINE_TIP;Use a dedicated processing pipeline for images in Fast Export mode, that trades speed for quality. Resizing of the image is done as early as possible, instead of doing it at the end like in the normal pipeline. The speedup can be significant, but be prepared to see artifacts and a general degradation of output quality. !EXPORT_USE_NORMAL_PIPELINE;Standard (bypass some steps, resize at the end) +!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_RESETDEFAULTPROFILE;Reset to default !GENERAL_RESET;Reset !GENERAL_SAVE_AS;Save as... @@ -1906,13 +1912,27 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens !HISTORY_MSG_488;Dynamic Range Compression +!HISTORY_MSG_489;DRC - Detail !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction -!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;AMaZE+VNG4 - Contrast threshold +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - Show mask +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold !HISTORY_MSG_HISTMATCHING;Auto-matched tone curve !HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries !HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D @@ -1936,6 +1956,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !HISTORY_MSG_RAW_BORDER;Raw border !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength !HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor @@ -2020,6 +2041,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. !PARTIALPASTE_ADVANCEDGROUP;Advanced Settings !PARTIALPASTE_COLORTONING;Color toning +!PARTIALPASTE_DEHAZE;Haze removal !PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control !PARTIALPASTE_LOCALCONTRAST;Local contrast !PARTIALPASTE_METADATA;Metadata mode @@ -2032,6 +2054,11 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !PARTIALPASTE_SOFTLIGHT;Soft light !PARTIALPASTE_TM_FATTAL;Dynamic range compression !PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_CMMBPC;Black point compensation !PREFERENCES_CROP;Crop editing !PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area @@ -2094,8 +2121,22 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !TP_COLORTONING_LABEL;Color Toning !TP_COLORTONING_LABGRID;L*a*b* color correction grid !TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 +!TP_COLORTONING_LABREGIONS;L*a*b* correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask !TP_COLORTONING_METHOD_TOOLTIP;"L*a*b* blending", "RGB sliders" and "RGB curves" use interpolated color blending.\n"Color balance (Shadows/Midtones/Highlights)" and "Saturation 2 colors" use direct colors.\n\nThe Black-and-White tool can be enabled when using any color toning method, which allows for color toning. !TP_COLORTONING_TWOCOLOR_TOOLTIP;Standard chroma:\nLinear response, a* = b*.\n\nSpecial chroma:\nLinear response, a* = b*, but unbound - try under the diagonal.\n\nSpecial a* and b*:\nLinear response unbound with separate curves for a* and b*. Intended for special effects.\n\nSpecial chroma 2 colors:\nMore predictable. +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones !TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. !TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. @@ -2155,6 +2196,8 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !TP_RAW_BORDER;Border !TP_RAW_DCB;DCB !TP_RAW_DCBVNG4;DCB+VNG4 +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the check-box first (reasonable values depend on the image). !TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast @@ -2229,6 +2272,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression +!TP_TM_FATTAL_THRESHOLD;Detail !TP_WAVELET_CBENAB;Toning and Color Balance !TP_WAVELET_CB_TOOLTIP;For strong values product color-toning by combining it or not with levels decomposition 'toning'\nFor low values you can change the white balance of the background (sky, ...) without changing that of the front plane, generally more contrasted !TP_WAVELET_CHRO_TOOLTIP;Sets the wavelet level which will be the threshold between saturated and pastel colors.\n1-x: saturated\nx-9: pastel\n\nIf the value exceeds the amount of wavelet levels you are using then it will be ignored. diff --git a/rtdata/languages/Turkish b/rtdata/languages/Turkish index 79fa108c0..812f70f4b 100644 --- a/rtdata/languages/Turkish +++ b/rtdata/languages/Turkish @@ -446,6 +446,10 @@ TP_WBALANCE_TEMPERATURE;Isı !DYNPROFILEEDITOR_EDIT;Edit !DYNPROFILEEDITOR_EDIT_RULE;Edit Dynamic Profile Rule !DYNPROFILEEDITOR_ENTRY_TOOLTIP;The matching is case insensitive.\nUse the "re:" prefix to enter\na regular expression. +!DYNPROFILEEDITOR_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard !DYNPROFILEEDITOR_MOVE_DOWN;Move Down !DYNPROFILEEDITOR_MOVE_UP;Move Up !DYNPROFILEEDITOR_NEW;New @@ -497,6 +501,8 @@ TP_WBALANCE_TEMPERATURE;Isı !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to browse to the chosen path. !FILEBROWSER_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory !FILEBROWSER_CACHE;Cache +!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple !FILEBROWSER_CURRENT_NAME;Current name: !FILEBROWSER_DARKFRAME;Dark-frame @@ -968,13 +974,27 @@ TP_WBALANCE_TEMPERATURE;Isı !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens !HISTORY_MSG_488;Dynamic Range Compression +!HISTORY_MSG_489;DRC - Detail !HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction -!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;AMaZE+VNG4 - Contrast threshold +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - Show mask +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold !HISTORY_MSG_HISTMATCHING;Auto-matched tone curve !HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries !HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D @@ -998,6 +1018,7 @@ TP_WBALANCE_TEMPERATURE;Isı !HISTORY_MSG_RAW_BORDER;Raw border !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength !HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor @@ -1146,6 +1167,7 @@ TP_WBALANCE_TEMPERATURE;Isı !PARTIALPASTE_DARKFRAMEAUTOSELECT;Dark-frame auto-selection !PARTIALPASTE_DARKFRAMEFILE;Dark-frame file !PARTIALPASTE_DEFRINGE;Defringe +!PARTIALPASTE_DEHAZE;Haze removal !PARTIALPASTE_DETAILGROUP;Detail Settings !PARTIALPASTE_DIRPYRDENOISE;Noise reduction !PARTIALPASTE_DIRPYREQUALIZER;Contrast by detail levels @@ -1205,6 +1227,11 @@ TP_WBALANCE_TEMPERATURE;Isı !PREFERENCES_BEHSETALL;All to 'Set' !PREFERENCES_BEHSETALLHINT;Set all parameters to the Set mode.\nAdjustments of parameters in the batch tool panel will be absolute, the actual values will be displayed. !PREFERENCES_BLACKBODY;Tungsten +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory @@ -1537,6 +1564,16 @@ TP_WBALANCE_TEMPERATURE;Isı !TP_COLORTONING_LABEL;Color Toning !TP_COLORTONING_LABGRID;L*a*b* color correction grid !TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 +!TP_COLORTONING_LABREGIONS;L*a*b* correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask !TP_COLORTONING_LUMA;Luminance !TP_COLORTONING_LUMAMODE;Preserve luminance !TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change color (red, green, cyan, blue, etc.) the luminance of each pixel is preserved. @@ -1574,6 +1611,10 @@ TP_WBALANCE_TEMPERATURE;Isı !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones !TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global !TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! @@ -1859,6 +1900,8 @@ TP_WBALANCE_TEMPERATURE;Isı !TP_RAW_DMETHOD_PROGRESSBAR;%1 demosaicing... !TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Demosaicing refinement... !TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the check-box first (reasonable values depend on the image). !TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast @@ -2023,6 +2066,7 @@ TP_WBALANCE_TEMPERATURE;Isı !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression +!TP_TM_FATTAL_THRESHOLD;Detail !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones diff --git a/rtdata/languages/default b/rtdata/languages/default index 68c279e4e..6909db081 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -44,9 +44,9 @@ DYNPROFILEEDITOR_EDIT;Edit DYNPROFILEEDITOR_EDIT_RULE;Edit Dynamic Profile Rule DYNPROFILEEDITOR_ENTRY_TOOLTIP;The matching is case insensitive.\nUse the "re:" prefix to enter\na regular expression. DYNPROFILEEDITOR_IMGTYPE_ANY;Any -DYNPROFILEEDITOR_IMGTYPE_STD;Standard DYNPROFILEEDITOR_IMGTYPE_HDR;HDR DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +DYNPROFILEEDITOR_IMGTYPE_STD;Standard DYNPROFILEEDITOR_MOVE_DOWN;Move Down DYNPROFILEEDITOR_MOVE_UP;Move Up DYNPROFILEEDITOR_NEW;New @@ -732,20 +732,20 @@ HISTORY_MSG_492;RGB Curves HISTORY_MSG_493;L*a*b* Adjustments HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction -HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction -HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation -HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness -HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - C mask +HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - Show mask HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth HISTORY_MSG_DEHAZE_ENABLED;Haze Removal HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength -HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold HISTORY_MSG_HISTMATCHING;Auto-matched tone curve HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D @@ -768,8 +768,8 @@ HISTORY_MSG_RAWCACORR_AUTOIT;Raw CA Correction - Iterations HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correction - Avoid color shift HISTORY_MSG_RAW_BORDER;Raw border HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling -HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor @@ -1477,16 +1477,16 @@ TP_COLORTONING_LAB;L*a*b* blending TP_COLORTONING_LABEL;Color Toning TP_COLORTONING_LABGRID;L*a*b* color correction grid TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 -TP_COLORTONING_LABREGION_LIST_TITLE;Correction -TP_COLORTONING_LABREGION_SATURATION;Saturation -TP_COLORTONING_LABREGION_LIGHTNESS;Lightness -TP_COLORTONING_LABREGION_MASK;Mask -TP_COLORTONING_LABREGION_HUEMASK;H -TP_COLORTONING_LABREGION_CHROMATICITYMASK;C -TP_COLORTONING_LABREGION_LIGHTNESSMASK;L -TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 -TP_COLORTONING_LABREGION_SHOWMASK;Show mask TP_COLORTONING_LABREGIONS;L*a*b* correction regions +TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +TP_COLORTONING_LABREGION_HUEMASK;H +TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +TP_COLORTONING_LABREGION_LIST_TITLE;Correction +TP_COLORTONING_LABREGION_MASK;Mask +TP_COLORTONING_LABREGION_SATURATION;Saturation +TP_COLORTONING_LABREGION_SHOWMASK;Show mask TP_COLORTONING_LUMA;Luminance TP_COLORTONING_LUMAMODE;Preserve luminance TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change color (red, green, cyan, blue, etc.) the luminance of each pixel is preserved. From 1b6e76fc6d3271f7c6dc2cc96a42db66014d2380 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Sun, 4 Nov 2018 20:28:48 +0100 Subject: [PATCH 084/122] Russian translation updated by Kildor Closes #4936 --- rtdata/languages/Russian | 173 ++++++++++++++++++++++++--------------- 1 file changed, 109 insertions(+), 64 deletions(-) diff --git a/rtdata/languages/Russian b/rtdata/languages/Russian index 424be3cbf..6769dd724 100644 --- a/rtdata/languages/Russian +++ b/rtdata/languages/Russian @@ -5,16 +5,19 @@ #05 2010-11-01 Ilia Popov #06 2012-07-17 Roman Milanskij #07 2014-02-12 Kostia (Kildor) Romanov -#07 2018-02-10 Kostia (Kildor) Romanov +#08 2018-02-10 Kostia (Kildor) Romanov +#09 2018-11-04 Kostia (Kildor) Romanov ABOUT_TAB_BUILD;Версия ABOUT_TAB_CREDITS;Авторы ABOUT_TAB_LICENSE;Лицензия ABOUT_TAB_RELEASENOTES;Примечания к выпуску ABOUT_TAB_SPLASH;Заставка +ADJUSTER_RESET_TO_DEFAULT;Click: Сбросить на значение по умолчанию.\nCtrl+click: Сбросить на начальное значение. BATCHQUEUE_AUTOSTART;Автостарт BATCHQUEUE_AUTOSTARTHINT;Автоматически запускать обработку при добавлении файла в очередь BATCHQUEUE_DESTFILENAME;Имя файла и путь к нему +BATCHQUEUE_STARTSTOPHINT;Начать или остановить обработку изображений в очереди.\n\Горячая клавиша: Ctrl-S BATCH_PROCESSING;Пакетная обработка CURVEEDITOR_AXIS_IN;I: CURVEEDITOR_AXIS_OUT;O: @@ -43,6 +46,10 @@ DYNPROFILEEDITOR_DELETE;Удалить DYNPROFILEEDITOR_EDIT;Редактировать DYNPROFILEEDITOR_EDIT_RULE;Редактировать правило подбора DYNPROFILEEDITOR_ENTRY_TOOLTIP;Сопоставление нечувствительно к регистру.\nИспользуйте префикс "re:"\nчтоб ввести регулярное выражение. +DYNPROFILEEDITOR_IMGTYPE_ANY;Любой +DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +DYNPROFILEEDITOR_IMGTYPE_PS;Сдвиг пикселей +DYNPROFILEEDITOR_IMGTYPE_STD;Стандарт DYNPROFILEEDITOR_MOVE_DOWN;Вниз DYNPROFILEEDITOR_MOVE_UP;Вверх DYNPROFILEEDITOR_NEW;Новый @@ -52,8 +59,9 @@ EDITWINDOW_TITLE;Редактор EXIFFILTER_APERTURE;Диафрагма EXIFFILTER_CAMERA;Камера EXIFFILTER_EXPOSURECOMPENSATION;Компенсация экспозиции (EV) -EXIFFILTER_FILETYPE;Тип фильтра +EXIFFILTER_FILETYPE;Тип файла EXIFFILTER_FOCALLEN;Фокусное расстояние +EXIFFILTER_IMAGETYPE;Тип изображения EXIFFILTER_ISO;ISO EXIFFILTER_LENS;Объектив EXIFFILTER_METADATAFILTER;Включить фильтры метаданных @@ -71,6 +79,7 @@ EXIFPANEL_RESET;Сбросить EXIFPANEL_RESETALL;Сбросить все EXIFPANEL_RESETALLHINT;Сбросить все теги в первоначальные значения EXIFPANEL_RESETHINT;Сбросить выбранные теги в первоначальные значения +EXIFPANEL_SHOWALL;Показать всё EXIFPANEL_SUBDIRECTORY;Подкаталог EXPORT_BYPASS_ALL;Выделить все / Снять выделение EXPORT_BYPASS_DEFRINGE;Пропустить подавление ореолов @@ -142,6 +151,7 @@ FILEBROWSER_POPUPPROCESS;Поместить в очередь на обрабо FILEBROWSER_POPUPPROCESSFAST;Поставить в очередь (Быстрый экспорт) FILEBROWSER_POPUPPROFILEOPERATIONS;Обработка операций профиля FILEBROWSER_POPUPRANK;Рейтинг +FILEBROWSER_POPUPRANK0;Снять FILEBROWSER_POPUPRANK1;Рейтинг 1 * FILEBROWSER_POPUPRANK2;Рейтинг 2 ** FILEBROWSER_POPUPRANK3;Рейтинг 3 *** @@ -174,7 +184,7 @@ FILEBROWSER_SHOWCOLORLABEL5HINT;Показать изображения, отм FILEBROWSER_SHOWDIRHINT;Сбросить все фильтры.\nГорячая клавиша: d FILEBROWSER_SHOWEDITEDHINT;Показать измененные изображения.\nГорячая клавиша: 7 FILEBROWSER_SHOWEDITEDNOTHINT;Показать не измененные изображения.\nГорячая клавиша: 6 -FILEBROWSER_SHOWEXIFINFO;Показать информацию EXIF.\nГорячая клавиша: i\n\nГорячая клавиша в режиме Одиночного редактора: Alt-i +FILEBROWSER_SHOWEXIFINFO;Показать информацию EXIF.\nГорячая клавиша: i\n\nГорячая клавиша в режиме Одиночного редактора: Alt-I FILEBROWSER_SHOWNOTTRASHHINT;Показать только неудалённые изображения. FILEBROWSER_SHOWRANK1HINT;Показать изображения с рейтингом 1.\nГорячая клавиша: 1 FILEBROWSER_SHOWRANK2HINT;Показать изображения с рейтингом 2.\nГорячая клавиша: 2 @@ -183,11 +193,11 @@ FILEBROWSER_SHOWRANK4HINT;Показать изображения с рейти FILEBROWSER_SHOWRANK5HINT;Показать изображения с рейтингом 5.\nГорячая клавиша: 5 FILEBROWSER_SHOWRECENTLYSAVEDHINT;Показать изображения, сохранённые недавно.\nГорячая клавиша: Alt-7 FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Показать изображения, сохранённые давно.\nГорячая клавиша: Alt-6 -FILEBROWSER_SHOWTRASHHINT;Показать содержимое корзины.\nГорячая клавиша: Ctrl-t +FILEBROWSER_SHOWTRASHHINT;Показать содержимое корзины.\nГорячая клавиша: Ctrl-T FILEBROWSER_SHOWUNCOLORHINT;Показать изображения без цветовой метки.\nГорячая клавиша: Alt-0 FILEBROWSER_SHOWUNRANKHINT;Показать изображения без рейтинга\nГорячая клавиша: 0 FILEBROWSER_THUMBSIZE;Размер эскиза -FILEBROWSER_UNRANK_TOOLTIP;Удалить рейтинг\nГорячая клавиша: Shift-~ +FILEBROWSER_UNRANK_TOOLTIP;Снять рейтинг\nГорячая клавиша: Shift-~ FILEBROWSER_ZOOMINHINT;Увеличить размер эскиза\nГорячая клавиша: +\n\nГорячая клавиша в режиме Одиночного редактора: Alt-+ FILEBROWSER_ZOOMOUTHINT;Уменьшить размер эскиза\nГорячая клавиша: +\n\nГорячая клавиша в режиме Одиночного редактора: Alt-- FILECHOOSER_FILTER_ANY;Все файлы @@ -215,7 +225,9 @@ GENERAL_NONE;Нет GENERAL_OK;OK GENERAL_OPEN;Открыть GENERAL_PORTRAIT;Портретный +GENERAL_RESET;Сбросить GENERAL_SAVE;Сохранить +GENERAL_SAVE_AS;Сохранить как... GENERAL_SLIDER;Ползунок GENERAL_UNCHANGED;(не менялось) GENERAL_WARNING;Внимание @@ -480,10 +492,21 @@ HISTORY_MSG_249;КпУД: Порог HISTORY_MSG_250;ПШ: Улучшенный HISTORY_MSG_251;Ч&Б: Алгоритм HISTORY_MSG_277;--неиспользуемый-- +HISTORY_MSG_293;Имитация плёнки +HISTORY_MSG_294;Имитация плёнки: Сила +HISTORY_MSG_295;Имитация плёнки: Плёнка +HISTORY_MSG_298;Фильтр битых пикселей HISTORY_MSG_300;- +HISTORY_MSG_488;Компрессия динамического диапазона +HISTORY_MSG_490;КДД: Величина HISTORY_MSG_491;Баланс белого HISTORY_MSG_492;Кривые RGB HISTORY_MSG_493;Настройки L*a*b* +HISTORY_MSG_CLAMPOOG;Обрезание цвета за пределами охвата +HISTORY_MSG_DEHAZE_DEPTH;Убрать дымку: Глубина +HISTORY_MSG_DEHAZE_ENABLED;Убрать дымку +HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Убрать дымку: Маска глубин +HISTORY_MSG_DEHAZE_STRENGTH;Убрать дымку: Сила HISTORY_MSG_HISTMATCHING;Автоподбор тоновой кривой HISTORY_MSG_LOCALCONTRAST_AMOUNT;Лок.контраст: Величина HISTORY_MSG_LOCALCONTRAST_DARKNESS;Лок.контраст: Тёмные тона @@ -491,8 +514,11 @@ HISTORY_MSG_LOCALCONTRAST_ENABLED;Лок.контраст HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Лок.контраст: Светлые тона HISTORY_MSG_LOCALCONTRAST_RADIUS;Лок.контраст: Радиус HISTORY_MSG_METADATA_MODE;Режим копирования метаданных +HISTORY_MSG_SOFTLIGHT_ENABLED;Мягкий свет +HISTORY_MSG_SOFTLIGHT_STRENGTH;Мягкий свет: Сила +HISTORY_MSG_TM_FATTAL_ANCHOR;КДД: Привязка HISTORY_NEWSNAPSHOT;Добавить -HISTORY_NEWSNAPSHOT_TOOLTIP;Горячая клавиша: Alt-s +HISTORY_NEWSNAPSHOT_TOOLTIP;Горячая клавиша: Alt-S HISTORY_SNAPSHOT;Снимок HISTORY_SNAPSHOTS;Снимки IPTCPANEL_CATEGORY;Категория @@ -551,7 +577,7 @@ MAIN_MSG_QOVERWRITE;Вы хотите перезаписать его? MAIN_MSG_SETPATHFIRST;Прежде необходимо установить целевой каталог в настройках\nчтоб использовать эту функцию! MAIN_MSG_WRITEFAILED;Не удалось записать\n\n"%1".\n\nУбедитесь, что каталог существует и у вас есть права на запись в него. MAIN_TAB_ADVANCED;Дополнительные -MAIN_TAB_ADVANCED_TOOLTIP;Горячая клавиша: Alt-w +MAIN_TAB_ADVANCED_TOOLTIP;Горячая клавиша: Alt-W MAIN_TAB_COLOR;Цвет MAIN_TAB_COLOR_TOOLTIP;Горячая клавиша: Alt-C MAIN_TAB_DETAIL;Детализация @@ -584,10 +610,10 @@ MAIN_TOOLTIP_PREVIEWL;Просмотреть Световую составл MAIN_TOOLTIP_PREVIEWR;Просмотреть канал красного.\nГорячая клавиша: r MAIN_TOOLTIP_QINFO;Информация об изображении.\nГорячая клавиша i MAIN_TOOLTIP_SHOWHIDELP1;Показать/скрыть левую панель\nГорячая клавиша: l -MAIN_TOOLTIP_SHOWHIDERP1;Показать/скрыть правую панель\nГорячая клавиша: Alt-l +MAIN_TOOLTIP_SHOWHIDERP1;Показать/скрыть правую панель\nГорячая клавиша: Alt-L MAIN_TOOLTIP_SHOWHIDETP1;Показать/скрыть верхнюю панель\nГорячая клавиша: Shift-L MAIN_TOOLTIP_THRESHOLD;Порог -MAIN_TOOLTIP_TOGGLE;Включить режим "до/после".\nГорячая клавиша Shift-B +MAIN_TOOLTIP_TOGGLE;Включить режим "до/после".\nГорячая клавиша Shift-B NAVIGATOR_B;B: NAVIGATOR_G;G: NAVIGATOR_H;H: @@ -600,6 +626,9 @@ NAVIGATOR_S;S: NAVIGATOR_V;V: NAVIGATOR_XY_FULL;Ширина: %1, Высота: %2 NAVIGATOR_XY_NA;x: --, y: -- +OPTIONS_BUNDLED_MISSING;Встроенный профиль "%1" не найден!\n\nВаша установка может быть повреждена.\n\nБудут использованы внутренние дефолтные значения по умолчанию. +OPTIONS_DEFIMG_MISSING;Профиль по умолчанию для не-raw снимков не найден или не установлен.\n\nПожалуйста, проверьте папку с профилями, она может отсутствовать или быть повреждена.\n\nБудет использован профиль "%1". +OPTIONS_DEFRAW_MISSING;Профиль по умолчанию для raw снимков не найден или не установлен.\n\nПожалуйста, проверьте папку с профилями, она может отсутствовать или быть повреждена.\n\nБудет использован профиль "%1". PARTIALPASTE_ADVANCEDGROUP;Дополнительные параметры PARTIALPASTE_BASICGROUP;Базовые настройки PARTIALPASTE_CACORRECTION;Коррекция C/A @@ -640,7 +669,9 @@ PARTIALPASTE_METADATA;Режим метаданных PARTIALPASTE_METAGROUP;Настройка метаданных PARTIALPASTE_PCVIGNETTE;Фильтр виньетирования PARTIALPASTE_PERSPECTIVE;Перспектива +PARTIALPASTE_PREPROCESS_DEADPIXFILT;Фильтр битых пикселей PARTIALPASTE_PREPROCESS_GREENEQUIL;Выравнивание зелёного канала +PARTIALPASTE_PREPROCESS_HOTPIXFILT;Фильтр горячих пикселей PARTIALPASTE_PREPROCESS_LINEDENOISE;Фильтр полосообразного шума PARTIALPASTE_RAWCACORR_AUTO;Автоматическая коррекция ХА PARTIALPASTE_RAWEXPOS_BLACK;Уровень черного @@ -659,6 +690,8 @@ PARTIALPASTE_SHADOWSHIGHLIGHTS;Тени/света PARTIALPASTE_SHARPENEDGE;Края PARTIALPASTE_SHARPENING;Повышение резкости PARTIALPASTE_SHARPENMICRO;Микроконтраст +PARTIALPASTE_SOFTLIGHT;Мягкий свет +PARTIALPASTE_TM_FATTAL;Компрессия динамического диапазона PARTIALPASTE_VIBRANCE;Красочность PARTIALPASTE_VIGNETTING;Коррекция виньетирования PARTIALPASTE_WHITEBALANCE;Баланс белого @@ -816,10 +849,10 @@ PROFILEPANEL_PINTERNAL;Нейтральный PROFILEPANEL_PLASTSAVED;Последний сохранённый PROFILEPANEL_SAVEDLGLABEL;Сохранить профиль обработки... PROFILEPANEL_SAVEPPASTE;Параметры для сохранения -PROFILEPANEL_TOOLTIPCOPY;Скопировать текущий профиль в буфер обмена.\nCtrl+click для выбора параметров для копирования -PROFILEPANEL_TOOLTIPLOAD;Загрузить профиль из файла\nCtrl+click для выбора параметров для загрузки -PROFILEPANEL_TOOLTIPPASTE;Вставить профиль из буфера обмена\nCtrl+click для выбора параметров для вставки -PROFILEPANEL_TOOLTIPSAVE;Сохранить текущий профиль\nCtrl+click для выбора параметров для сохранения +PROFILEPANEL_TOOLTIPCOPY;Скопировать текущий профиль в буфер обмена.\nCtrl+Click для выбора параметров для копирования +PROFILEPANEL_TOOLTIPLOAD;Загрузить профиль из файла\nCtrl+Click для выбора параметров для загрузки +PROFILEPANEL_TOOLTIPPASTE;Вставить профиль из буфера обмена\nCtrl+Click для выбора параметров для вставки +PROFILEPANEL_TOOLTIPSAVE;Сохранить текущий профиль\nCtrl+Click для выбора параметров для сохранения PROGRESSBAR_LOADING;Загрузка изображения... PROGRESSBAR_LOADINGTHUMBS;Загрузка миниатюр... PROGRESSBAR_LOADJPEG;Чтение JPEG файла... @@ -834,8 +867,11 @@ PROGRESSBAR_SAVEPNG;Сохранение PNG файла... PROGRESSBAR_SAVETIFF;Сохранение TIFF файла... PROGRESSBAR_SNAPSHOT_ADDED;Снимок добавлен PROGRESSDLG_PROFILECHANGEDINBROWSER;Профиль изменён в браузере +QINFO_FRAMECOUNT;%2 кадров +QINFO_HDR;HDR / %2 кадр(ов) QINFO_ISO;ISO QINFO_NOEXIF;Данные Exif недоступны +QINFO_PIXELSHIFT;Сдвиг пикселей / %2 frame(s) SAVEDLG_AUTOSUFFIX;Автоматически добавлять суффикс если файл существует SAVEDLG_FILEFORMAT;Формат файла SAVEDLG_FORCEFORMATOPTS;Принудительно установить настройки сохранения @@ -994,6 +1030,10 @@ TP_DARKFRAME_LABEL;Темновой кадр TP_DEFRINGE_LABEL;Подавление ореолов TP_DEFRINGE_RADIUS;Радиус TP_DEFRINGE_THRESHOLD;Порог +TP_DEHAZE_DEPTH;Глубина +TP_DEHAZE_LABEL;Убрать дымку +TP_DEHAZE_SHOW_DEPTH_MAP;Показать маску глубин +TP_DEHAZE_STRENGTH;Сила TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Автоматический глобальный TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Цветность: синий-жёлтый TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Кривая цветности @@ -1052,6 +1092,7 @@ TP_EXPOSURE_AUTOLEVELS;Автоуровни TP_EXPOSURE_AUTOLEVELS_TIP;Переключение выполнения автоуровней для автоматической установки параметров экспозиции на основе анализа изображения TP_EXPOSURE_BLACKLEVEL;Уровень чёрного TP_EXPOSURE_BRIGHTNESS;Яркость +TP_EXPOSURE_CLAMPOOG;Обрезать цвета за пределами охвата TP_EXPOSURE_CLIP;Ограничить TP_EXPOSURE_CLIP_TIP;Часть пикселей, обрезаемая операцией автоматических уровней TP_EXPOSURE_COMPRHIGHLIGHTS;Сжатие светов @@ -1207,16 +1248,29 @@ TP_PERSPECTIVE_LABEL;Перспектива TP_PERSPECTIVE_VERTICAL;Вертикальная TP_PFCURVE_CURVEEDITOR_CH;Цвет TP_PFCURVE_CURVEEDITOR_CH_TOOLTIP;Контроль силы подавления в зависимости от цвета.\nВыше - сильней, ниже - слабей. +TP_PREPROCESS_DEADPIXFILT;Фильтр битых пикселей +TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Пытается подавить битые пиксели. TP_PREPROCESS_GREENEQUIL;Выравнивание зелёного +TP_PREPROCESS_HOTPIXFILT;Фильтр горячих пикселей +TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Пытается подавить горячие пиксели. TP_PREPROCESS_LABEL;Предобработка TP_PREPROCESS_LINEDENOISE;Фильтр линейного шума TP_PREPROCESS_NO_FOUND;Ничего не найдено TP_RAWCACORR_AUTO;Автоматическая коррекция TP_RAWCACORR_CABLUE;Синий TP_RAWCACORR_CARED;Красный +TP_RAWCACORR_CASTR;Сила TP_RAWEXPOS_BLACKS;Уровни черного +TP_RAWEXPOS_BLACK_0;Зелёный 1 (ведущий) +TP_RAWEXPOS_BLACK_1;Красный +TP_RAWEXPOS_BLACK_2;Синий +TP_RAWEXPOS_BLACK_3;Зелёный 2 +TP_RAWEXPOS_BLACK_BLUE;Синий +TP_RAWEXPOS_BLACK_GREEN;Зелёный +TP_RAWEXPOS_BLACK_RED;Красный TP_RAWEXPOS_LINEAR;Коррекция точки белого TP_RAWEXPOS_PRESER;Сохранение пересветов +TP_RAWEXPOS_RGB;Красный, Зелёный, Синий TP_RAWEXPOS_TWOGREEN;Два зеленых совместно TP_RAW_AHD;AHD TP_RAW_AMAZE;AMaZE @@ -1242,6 +1296,7 @@ TP_RAW_MONO;Моно TP_RAW_NONE;Нет (Показать структуру сенсора) TP_RAW_PIXELSHIFT;Сдвиг пикселей TP_RAW_RCD;RCD +TP_RAW_RCDVNG4;RCD+VNG4 TP_RAW_SENSOR_BAYER_LABEL;Сенсор с матрицей Байера TP_RAW_SENSOR_XTRANS_LABEL;Сенсор с матрицей X-Trans TP_RAW_VNG4;VNG4 @@ -1287,6 +1342,7 @@ TP_SHARPENEDGE_LABEL;Края TP_SHARPENEDGE_PASSES;Подходы TP_SHARPENEDGE_THREE;Только освещенность TP_SHARPENING_AMOUNT;Величина +TP_SHARPENING_CONTRAST;Порог контраста TP_SHARPENING_EDRADIUS;Радиус TP_SHARPENING_EDTOLERANCE;Границы краёв TP_SHARPENING_HALOCONTROL;Регулировка хром. аберраций @@ -1302,9 +1358,16 @@ TP_SHARPENING_RLD_ITERATIONS;Повторений TP_SHARPENING_THRESHOLD;Порог TP_SHARPENING_USM;Маска размытия TP_SHARPENMICRO_AMOUNT;Величина +TP_SHARPENMICRO_CONTRAST;Порог контраста TP_SHARPENMICRO_LABEL;Микроконтраст TP_SHARPENMICRO_MATRIX;Матрица 3×3 вместо 5×5 TP_SHARPENMICRO_UNIFORMITY;Равномерность +TP_SOFTLIGHT_LABEL;Мягкий свет +TP_SOFTLIGHT_STRENGTH;Сила +TP_TM_FATTAL_AMOUNT;Величина +TP_TM_FATTAL_ANCHOR;Якорь +TP_TM_FATTAL_LABEL;Компрессия динамического диапазона +TP_TM_FATTAL_THRESHOLD;Детализация TP_VIBRANCE_AVOIDCOLORSHIFT;Избегать сдвига цветов TP_VIBRANCE_CURVEEDITOR_SKINTONES;ОО TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Оттенки кожи @@ -1381,7 +1444,7 @@ ZOOMPANEL_100;(100%) ZOOMPANEL_NEWCROPWINDOW;Новое окно детального просмотра ZOOMPANEL_ZOOM100;Масштаб 100%\nГорячая клавиша: z ZOOMPANEL_ZOOMFITCROPSCREEN;Уместить кадрированное изображение по размеру экрану\nГорячая клавиша: f -ZOOMPANEL_ZOOMFITSCREEN;Уместить изображение по размерам окна\nГорячая клавиша: Alt-f +ZOOMPANEL_ZOOMFITSCREEN;Уместить изображение по размерам окна\nГорячая клавиша: Alt-F ZOOMPANEL_ZOOMIN;Приблизить\nГорячая клавиша: + ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - @@ -1389,27 +1452,22 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! -!ADJUSTER_RESET_TO_DEFAULT;Click - reset to default value.\nCtrl+click - reset to initial value. -!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !CURVEEDITOR_AXIS_LEFT_TAN;LT: !CURVEEDITOR_AXIS_RIGHT_TAN;RT: !CURVEEDITOR_EDITPOINT_HINT;Enable edition of node in/out values.\n\nRight-click on a node to select it.\nRight-click on empty space to de-select the node. !EDIT_OBJECT_TOOLTIP;Displays a widget on the preview window which lets you adjust this tool. !EDIT_PIPETTE_TOOLTIP;To add an adjustment point to the curve, hold the Ctrl key while left-clicking the desired spot in the image preview.\nTo adjust the point, hold the Ctrl key while left-clicking the corresponding area in the preview, then let go of Ctrl (unless you desire fine control) and while still holding the left mouse button move the mouse up or down to move that point up or down in the curve. -!EXIFFILTER_IMAGETYPE;Image type -!EXIFPANEL_SHOWALL;Show all !EXPORT_BYPASS;Processing steps to bypass !EXPORT_BYPASS_EQUALIZER;Bypass Wavelet Levels !EXPORT_PIPELINE;Processing pipeline !EXPORT_USE_FAST_PIPELINE;Dedicated (full processing on resized image) !EXPORT_USE_FAST_PIPELINE_TIP;Use a dedicated processing pipeline for images in Fast Export mode, that trades speed for quality. Resizing of the image is done as early as possible, instead of doing it at the end like in the normal pipeline. The speedup can be significant, but be prepared to see artifacts and a general degradation of output quality. !EXPORT_USE_NORMAL_PIPELINE;Standard (bypass some steps, resize at the end) -!FILEBROWSER_POPUPRANK0;Unrank +!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_SHOWORIGINALHINT;Show only original images.\n\nWhen several images exist with the same filename but different extensions, the one considered original is the one whose extension is nearest the top of the parsed extensions list in Preferences > File Browser > Parsed Extensions. !FILECHOOSER_FILTER_PP;Processing profiles !FILECHOOSER_FILTER_SAME;Same format as current photo -!GENERAL_RESET;Reset -!GENERAL_SAVE_AS;Save as... !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. !HISTOGRAM_TOOLTIP_MODE;Toggle between linear, log-linear and log-log scaling of the histogram. !HISTORY_MSG_235;B&W - CM - Auto @@ -1454,12 +1512,8 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !HISTORY_MSG_290;Black Level - Red !HISTORY_MSG_291;Black Level - Green !HISTORY_MSG_292;Black Level - Blue -!HISTORY_MSG_293;Film Simulation -!HISTORY_MSG_294;Film Simulation - Strength -!HISTORY_MSG_295;Film Simulation - Film !HISTORY_MSG_296;NR - Luminance curve !HISTORY_MSG_297;NR - Mode -!HISTORY_MSG_298;Dead pixel filter !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_301;NR - Luma control !HISTORY_MSG_302;NR - Chroma method @@ -1632,11 +1686,18 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !HISTORY_MSG_485;Lens Correction !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens -!HISTORY_MSG_488;Dynamic Range Compression -!HISTORY_MSG_490;DRC - Amount -!HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors +!HISTORY_MSG_489;DRC - Detail !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction -!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;AMaZE+VNG4 - Contrast threshold +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - Show mask +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold !HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries !HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D !HISTORY_MSG_ICM_OUTPUT_TYPE;Output - Type @@ -1653,9 +1714,7 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !HISTORY_MSG_RAW_BORDER;Raw border !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold -!HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light -!HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength -!HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace !ICCPROFCREATOR_COPYRIGHT;Copyright: !ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Reset to the default copyright, granted to "RawTherapee, CC0" !ICCPROFCREATOR_CUSTOM;Custom @@ -1727,15 +1786,11 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: Middle grey\nShortcut: 9 !MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the Sharpening Contrast Mask.\nShortcut: None\n\nOnly works when sharpening is enabled and zoom >= 100%. !MONITOR_PROFILE_SYSTEM;System default -!OPTIONS_BUNDLED_MISSING;The bundled profile "%1" could not be found!\n\nYour installation could be damaged.\n\nDefault internal values will be used instead. -!OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. -!OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. !PARTIALPASTE_COLORTONING;Color toning +!PARTIALPASTE_DEHAZE;Haze removal !PARTIALPASTE_EQUALIZER;Wavelet levels !PARTIALPASTE_FILMSIMULATION;Film simulation !PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control -!PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter -!PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hot pixel filter !PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !PARTIALPASTE_PRSHARPENING;Post-resize sharpening !PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid color shift @@ -1744,9 +1799,12 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !PARTIALPASTE_RAW_IMAGENUM;Sub-image !PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift !PARTIALPASTE_RETINEX;Retinex -!PARTIALPASTE_SOFTLIGHT;Soft light -!PARTIALPASTE_TM_FATTAL;Dynamic range compression !PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory @@ -1803,9 +1861,6 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;Embedded JPEG if fullsize, neutral raw otherwise !PREFERENCES_TUNNELMETADATA;Copy Exif/IPTC/XMP unchanged to output file !PROFILEPANEL_PDYNAMIC;Dynamic -!QINFO_FRAMECOUNT;%2 frames -!QINFO_HDR;HDR / %2 frame(s) -!QINFO_PIXELSHIFT;Pixel Shift / %2 frame(s) !SAMPLEFORMAT_0;Unknown data format !SAMPLEFORMAT_1;8-bit unsigned !SAMPLEFORMAT_2;16-bit unsigned @@ -1878,6 +1933,16 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !TP_COLORTONING_LABEL;Color Toning !TP_COLORTONING_LABGRID;L*a*b* color correction grid !TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 +!TP_COLORTONING_LABREGIONS;L*a*b* correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask !TP_COLORTONING_LUMA;Luminance !TP_COLORTONING_LUMAMODE;Preserve luminance !TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change color (red, green, cyan, blue, etc.) the luminance of each pixel is preserved. @@ -1932,7 +1997,6 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !TP_DIRPYREQUALIZER_SKIN_TOOLTIP;At -100 skin-tones are targetted.\nAt 0 all tones are treated equally.\nAt +100 skin-tones are protected while all other tones are affected. !TP_DIRPYREQUALIZER_TOOLTIP;Attempts to reduce artifacts in the transitions between skin colors (hue, chroma, luma) and the rest of the image. !TP_DISTORTION_AUTO_TIP;Automatically corrects lens distortion in raw files by matching it against the embedded JPEG image if one exists and has had its lens disortion auto-corrected by the camera. -!TP_EXPOSURE_CLAMPOOG;Clip out-of-gamut colors !TP_EXPOS_BLACKPOINT_LABEL;Raw Black Points !TP_EXPOS_WHITEPOINT_LABEL;Raw White Points !TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now? @@ -1955,10 +2019,6 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !TP_ICM_WORKING_TRC_NONE;None !TP_ICM_WORKING_TRC_SLOPE;Slope !TP_ICM_WORKING_TRC_TOOLTIP;Only for built-in profiles. -!TP_PREPROCESS_DEADPIXFILT;Dead pixel filter -!TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Tries to suppress dead pixels. -!TP_PREPROCESS_HOTPIXFILT;Hot pixel filter -!TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Tries to suppress hot pixels. !TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction !TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both !TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal @@ -1970,15 +2030,6 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !TP_PRSHARPENING_TOOLTIP;Sharpens the image after resizing. Only works when the "Lanczos" resizing method is used. It is impossible to preview the effects of this tool. See RawPedia for usage instructions. !TP_RAWCACORR_AUTOIT;Iterations !TP_RAWCACORR_AVOIDCOLORSHIFT;Avoid color shift -!TP_RAWCACORR_CASTR;Strength -!TP_RAWEXPOS_BLACK_0;Green 1 (lead) -!TP_RAWEXPOS_BLACK_1;Red -!TP_RAWEXPOS_BLACK_2;Blue -!TP_RAWEXPOS_BLACK_3;Green 2 -!TP_RAWEXPOS_BLACK_BLUE;Blue -!TP_RAWEXPOS_BLACK_GREEN;Green -!TP_RAWEXPOS_BLACK_RED;Red -!TP_RAWEXPOS_RGB;Red, Green, Blue !TP_RAW_1PASSMEDIUM;1-pass (Markesteijn) !TP_RAW_2PASS;1-pass+fast !TP_RAW_3PASSBEST;3-pass (Markesteijn) @@ -1986,6 +2037,8 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !TP_RAW_AMAZEVNG4;AMaZE+VNG4 !TP_RAW_BORDER;Border !TP_RAW_DCBVNG4;DCB+VNG4 +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the check-box first (reasonable values depend on the image). !TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_IMAGENUM;Sub-image !TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. @@ -2018,7 +2071,6 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;The default radius of 1.0 usually fits well for base ISO.\nIncrease the value for high ISO shots, 5.0 is a good starting point.\nWatch the motion mask while changing the value. !TP_RAW_PIXELSHIFTSMOOTH;Smooth transitions !TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Smooth transitions between areas with motion and areas without.\nSet to 0 to disable transition smoothing.\nSet to 1 to either get the AMaZE/LMMSE result of the selected frame (depending on whether "Use LMMSE" is selected), or the median of all four frames if "Use median" is selected. -!TP_RAW_RCDVNG4;RCD+VNG4 !TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-pass gives best results (recommended for low ISO images).\n1-pass is almost undistinguishable from 3-pass for high ISO images and is faster.\n+fast gives less artifacts in flat areas !TP_RESIZE_ALLOW_UPSCALING;Allow Upscaling !TP_RETINEX_CONTEDIT_HSL;Histogram equalizer HSL @@ -2097,13 +2149,6 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !TP_RETINEX_VIEW_TRAN;Transmission - Auto !TP_RETINEX_VIEW_TRAN2;Transmission - Fixed !TP_RETINEX_VIEW_UNSHARP;Unsharp mask -!TP_SHARPENING_CONTRAST;Contrast threshold -!TP_SHARPENMICRO_CONTRAST;Contrast threshold -!TP_SOFTLIGHT_LABEL;Soft Light -!TP_SOFTLIGHT_STRENGTH;Strength -!TP_TM_FATTAL_AMOUNT;Amount -!TP_TM_FATTAL_ANCHOR;Anchor -!TP_TM_FATTAL_LABEL;Dynamic Range Compression !TP_WAVELET_1;Level 1 !TP_WAVELET_2;Level 2 !TP_WAVELET_3;Level 3 From 8f5ffc5f5e6123f543ac182188007cd8fffb5f81 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Sun, 4 Nov 2018 21:50:48 +0100 Subject: [PATCH 085/122] Tooltip tweaks --- rtdata/languages/default | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 6909db081..a5c9976a4 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -920,20 +920,20 @@ MAIN_TAB_RAW;Raw MAIN_TAB_RAW_TOOLTIP;Shortcut: Alt-r MAIN_TAB_TRANSFORM;Transform MAIN_TAB_TRANSFORM_TOOLTIP;Shortcut: Alt-t -MAIN_TOOLTIP_BACKCOLOR0;Background color of the preview: Theme-based\nShortcut: 9 -MAIN_TOOLTIP_BACKCOLOR1;Background color of the preview: Black\nShortcut: 9 -MAIN_TOOLTIP_BACKCOLOR2;Background color of the preview: White\nShortcut: 9 -MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: Middle grey\nShortcut: 9 +MAIN_TOOLTIP_BACKCOLOR0;Background color of the preview: theme-based\nShortcut: 9 +MAIN_TOOLTIP_BACKCOLOR1;Background color of the preview: black\nShortcut: 9 +MAIN_TOOLTIP_BACKCOLOR2;Background color of the preview: white\nShortcut: 9 +MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: middle grey\nShortcut: 9 MAIN_TOOLTIP_BEFOREAFTERLOCK;Lock / Unlock the Before view\n\nLock: keep the Before view unchanged.\nUseful to evaluate the cumulative effect of multiple tools.\nAdditionally, comparisons can be made to any state in the History.\n\nUnlock: the Before view will follow the After view one step behind, showing the image before the effect of the currently used tool. MAIN_TOOLTIP_HIDEHP;Show/Hide the left panel (including the history).\nShortcut: l MAIN_TOOLTIP_INDCLIPPEDH;Clipped highlight indication.\nShortcut: < MAIN_TOOLTIP_INDCLIPPEDS;Clipped shadow indication.\nShortcut: > -MAIN_TOOLTIP_PREVIEWB;Preview the Blue channel.\nShortcut: b -MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the Focus Mask.\nShortcut: Shift-f\n\nMore accurate on images with shallow depth of field, low noise and at higher zoom levels.\n\nTo improve detection accuracy for noisy images evaluate at smaller zoom, about 10-30%. -MAIN_TOOLTIP_PREVIEWG;Preview the Green channel.\nShortcut: g -MAIN_TOOLTIP_PREVIEWL;Preview the Luminosity.\nShortcut: v\n\n0.299*R + 0.587*G + 0.114*B -MAIN_TOOLTIP_PREVIEWR;Preview the Red channel.\nShortcut: r -MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the Sharpening Contrast Mask.\nShortcut: None\n\nOnly works when sharpening is enabled and zoom >= 100%. +MAIN_TOOLTIP_PREVIEWB;Preview the blue channel.\nShortcut: b +MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the focus mask.\nShortcut: Shift-f\n\nMore accurate on images with shallow depth of field, low noise and at higher zoom levels.\nZoom out to 10-30% to improve detection accuracy on noisy images. +MAIN_TOOLTIP_PREVIEWG;Preview the green channel.\nShortcut: g +MAIN_TOOLTIP_PREVIEWL;Preview the luminosity.\nShortcut: v\n\n0.299*R + 0.587*G + 0.114*B +MAIN_TOOLTIP_PREVIEWR;Preview the red channel.\nShortcut: r +MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the sharpening contrast mask.\nShortcut: None\n\nOnly works when sharpening is enabled and zoom >= 100%. MAIN_TOOLTIP_QINFO;Quick info on the image.\nShortcut: i MAIN_TOOLTIP_SHOWHIDELP1;Show/Hide the left panel.\nShortcut: l MAIN_TOOLTIP_SHOWHIDERP1;Show/Hide the right panel.\nShortcut: Alt-l @@ -1306,8 +1306,8 @@ THRESHOLDSELECTOR_HINT;Hold the Shift key to move individual control poin THRESHOLDSELECTOR_T;Top THRESHOLDSELECTOR_TL;Top-left THRESHOLDSELECTOR_TR;Top-right -TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen enabled:\nClick in the preview with left mouse button to add a color picker\nDrag it around while pressing the left mouse button\nDelete the color picker with a right mouse button click\nDelete all color pickers with Shift + Right mouse button click\nRight click away from any color picker to go back to the Hand tool -TOOLBAR_TOOLTIP_CROP;Crop selection.\nShortcut: c\nMove the crop area using Shift-mouse drag +TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen the tool is active:\n- Add a picker: left-click.\n- Drag a picker: left-click and drag.\n- Delete a picker: right-click.\n- Delete all pickers: shift+right-click.\n- Revert to hand tool: right-click. +TOOLBAR_TOOLTIP_CROP;Crop selection.\nShortcut: c\nMove the crop area using Shift+mouse drag. TOOLBAR_TOOLTIP_HAND;Hand tool.\nShortcut: h TOOLBAR_TOOLTIP_STRAIGHTEN;Straighten / fine rotation.\nShortcut: s\n\nIndicate the vertical or horizontal by drawing a guide line over the image preview. Angle of rotation will be shown next to the guide line. Center of rotation is the geometrical center of the image. TOOLBAR_TOOLTIP_WB;Spot white balance.\nShortcut: w From 21e01861748dfb381fee431fc8a0b27f1db8180a Mon Sep 17 00:00:00 2001 From: TooWaBoo Date: Mon, 5 Nov 2018 06:05:50 +0100 Subject: [PATCH 086/122] Update TooWaBlue-GTK3-20_.css To fit the pref changes --- rtdata/themes/TooWaBlue-GTK3-20_.css | 29 ++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/rtdata/themes/TooWaBlue-GTK3-20_.css b/rtdata/themes/TooWaBlue-GTK3-20_.css index e500ad37c..f660f6ac5 100644 --- a/rtdata/themes/TooWaBlue-GTK3-20_.css +++ b/rtdata/themes/TooWaBlue-GTK3-20_.css @@ -113,6 +113,10 @@ window > box { dialog { background-color: @bg-grey; border-radius: 0; + -GtkDialog-button-spacing: 0; + -GtkDialog-content-area-spacing: 0; + -GtkDialog-content-area-border: 0; + -GtkDialog-action-area-border: 0; } dialog > box { padding: 0.666666666666666666em; @@ -336,9 +340,13 @@ fontchooser scrolledwindow, /*** end ***************************************************************************************/ /*** Load - Save dialog ************************************************************************/ +filechooser { +margin-bottom: 0.25em; +} -filechooser box > box box > button { +filechooser box > box box > button { margin-top: 0.5em; +margin-right: 0; } filechooser image { @@ -537,11 +545,14 @@ menu separator { padding: 0; } -.scrollableToolbar separator:not(.dummy) { +.scrollableToolbar separator.vertical { background-color: shade(@bg-light-grey,.75); margin: 0.166666666666666666em; } - +separator#PrefCacheSeparator.horizontal { + margin: 0.25em 0.166666666666666666em; + padding: 0; +} #MyExpander separator { background-color: @view-grid-border; margin: 0.333333333333333333em 0.166666666666666666em; @@ -944,7 +955,8 @@ window.csd:not(.fullscreen) #MainNotebook > header.top { #PrefNotebook > header { margin: -0.666666666666666666em -0.666666666666666666em 0.333333333333333333em; } -#PrefNotebook > header tab label { +#PrefNotebook > header tab label, +#AboutNotebook > header tab label { padding-top: 0.25em; padding-bottom: 0.25em; } @@ -1435,14 +1447,15 @@ colorchooser colorswatch#add-color-button:first-child { } /* Save, Cancel, OK ... buttons */ -.dialog-action-area button { +dialog .dialog-action-area button { min-height: 2.166666666666666666em; - margin-top: 1em; + margin: 0.5em 0 0 0.333333333333333333em; padding: 0; } messagedialog .dialog-action-area button { min-height: 1.833333333333333333em; - margin: -12px 0.5em 0.5em 0.5em; + margin: -12px 0.5em 0.5em; + padding: 0; } messagedialog .dialog-action-area button:not(:only-child):nth-child(1) { margin-right: 0.25em; @@ -1789,7 +1802,7 @@ radio:disabled { radiobutton label, checkbutton label { - margin: 0 0 0 0.416666666666666666em; + margin: 0 0.416666666666666666em; padding: 0; } From 5edf4d13a992dba6fd7c46221f4e032728ccc725 Mon Sep 17 00:00:00 2001 From: TooWaBoo Date: Mon, 5 Nov 2018 06:08:01 +0100 Subject: [PATCH 087/122] Update preferences.cc Save space in File browser tab --- rtgui/preferences.cc | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/rtgui/preferences.cc b/rtgui/preferences.cc index 9d58244f4..54095f429 100644 --- a/rtgui/preferences.cc +++ b/rtgui/preferences.cc @@ -1206,7 +1206,7 @@ Gtk::Widget* Preferences::getFileBrowserPanel () startupdir = Gtk::manage ( new Gtk::Entry () ); Gtk::Button* sdselect = Gtk::manage ( new Gtk::Button () ); - sdselect->set_image (*Gtk::manage (new RTImage ("folder-open.png"))); + sdselect->set_image (*Gtk::manage (new RTImage ("folder-open-small.png"))); Gtk::RadioButton::Group opts = sdcurrent->get_group(); sdlast->set_group (opts); @@ -1275,20 +1275,26 @@ Gtk::Widget* Preferences::getFileBrowserPanel () Gtk::Frame* frmnu = Gtk::manage ( new Gtk::Frame (M ("PREFERENCES_MENUOPTIONS")) ); + + Gtk::Grid* menuGrid = Gtk::manage(new Gtk::Grid()); + menuGrid->get_style_context()->add_class("grid-spacing"); + setExpandAlignProperties(menuGrid, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + ckbmenuGroupRank = Gtk::manage ( new Gtk::CheckButton (M ("PREFERENCES_MENUGROUPRANK")) ); + setExpandAlignProperties(ckbmenuGroupRank, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); ckbmenuGroupLabel = Gtk::manage ( new Gtk::CheckButton (M ("PREFERENCES_MENUGROUPLABEL")) ); ckbmenuGroupFileOperations = Gtk::manage ( new Gtk::CheckButton (M ("PREFERENCES_MENUGROUPFILEOPERATIONS")) ); + setExpandAlignProperties(ckbmenuGroupFileOperations, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); ckbmenuGroupProfileOperations = Gtk::manage ( new Gtk::CheckButton (M ("PREFERENCES_MENUGROUPPROFILEOPERATIONS")) ); ckbmenuGroupExtProg = Gtk::manage ( new Gtk::CheckButton (M ("PREFERENCES_MENUGROUPEXTPROGS")) ); - Gtk::VBox* vbmnu = Gtk::manage ( new Gtk::VBox () ); + + menuGrid->attach (*ckbmenuGroupRank, 0, 0, 1, 1); + menuGrid->attach (*ckbmenuGroupLabel, 1, 0, 1, 1); + menuGrid->attach (*ckbmenuGroupFileOperations, 0, 1, 1, 1); + menuGrid->attach (*ckbmenuGroupProfileOperations, 1, 1, 1, 1); + menuGrid->attach (*ckbmenuGroupExtProg, 0, 2, 2, 1); - vbmnu->pack_start (*ckbmenuGroupRank, Gtk::PACK_SHRINK, 0); - vbmnu->pack_start (*ckbmenuGroupLabel, Gtk::PACK_SHRINK, 0); - vbmnu->pack_start (*ckbmenuGroupFileOperations, Gtk::PACK_SHRINK, 0); - vbmnu->pack_start (*ckbmenuGroupProfileOperations, Gtk::PACK_SHRINK, 0); - vbmnu->pack_start (*ckbmenuGroupExtProg, Gtk::PACK_SHRINK, 0); - - frmnu->add (*vbmnu); + frmnu->add (*menuGrid); Gtk::Frame* fre = Gtk::manage ( new Gtk::Frame (M ("PREFERENCES_PARSEDEXT")) ); @@ -1360,7 +1366,8 @@ Gtk::Widget* Preferences::getFileBrowserPanel () // Separation is needed so that a button is not accidentally clicked when one wanted // to click a spinbox. Ideally, the separation wouldn't require attaching a widget, but how? - Gtk::Label *separator = Gtk::manage (new Gtk::Label()); + Gtk::HSeparator *cacheSeparator = Gtk::manage (new Gtk::HSeparator()); + cacheSeparator->set_name("PrefCacheSeparator"); Gtk::Label* clearThumbsLbl = Gtk::manage (new Gtk::Label(M("PREFERENCES_CACHECLEAR_ALLBUTPROFILES"))); setExpandAlignProperties(clearThumbsLbl, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); @@ -1378,7 +1385,7 @@ Gtk::Widget* Preferences::getFileBrowserPanel () cacheGrid->attach (*maxThumbHeightSB, 1, 0, 1, 1); cacheGrid->attach (*maxCacheEntriesLbl, 0, 1, 1, 1); cacheGrid->attach (*maxCacheEntriesSB, 1, 1, 1, 1); - cacheGrid->attach (*separator, 0, 2, 2, 1); + cacheGrid->attach (*cacheSeparator, 0, 2, 2, 1); cacheGrid->attach (*clearThumbsLbl, 0, 3, 1, 1); cacheGrid->attach (*clearThumbsBtn, 1, 3, 1, 1); if (moptions.saveParamsCache) { From 394f4d9b2b1bffbf4c12696f82e9c351ec273704 Mon Sep 17 00:00:00 2001 From: TooWaBoo Date: Mon, 5 Nov 2018 06:08:44 +0100 Subject: [PATCH 088/122] Update TooWaBlue-GTK3-20_.css --- rtdata/themes/TooWaBlue-GTK3-20_.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtdata/themes/TooWaBlue-GTK3-20_.css b/rtdata/themes/TooWaBlue-GTK3-20_.css index f660f6ac5..f2b631165 100644 --- a/rtdata/themes/TooWaBlue-GTK3-20_.css +++ b/rtdata/themes/TooWaBlue-GTK3-20_.css @@ -2,7 +2,7 @@ This file is part of RawTherapee. Copyright (c) 2016-2018 TooWaBoo - Version 2.85 + Version 2.86 RawTherapee is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by From 56e45087cf556a566032b9db7cc07904ed9344a9 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Mon, 5 Nov 2018 08:17:02 +0100 Subject: [PATCH 089/122] Segfault when using Tonemapping on completely black data, fixes #4934 --- rtengine/EdgePreservingDecomposition.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rtengine/EdgePreservingDecomposition.cc b/rtengine/EdgePreservingDecomposition.cc index 4c56cbb5d..f64caafde 100644 --- a/rtengine/EdgePreservingDecomposition.cc +++ b/rtengine/EdgePreservingDecomposition.cc @@ -941,7 +941,7 @@ void EdgePreservingDecomposition::CompressDynamicRange(float *Source, float Scal cev = xexpf(LVFU(Source[i]) + LVFU(u[i]) * (tempv)) - epsv; uev = xexpf(LVFU(u[i])) - epsv; sourcev = xexpf(LVFU(Source[i])) - epsv; - _mm_storeu_ps( &Source[i], cev + DetailBoostv * (sourcev - uev) ); + _mm_storeu_ps( &Source[i], vmaxf(cev + DetailBoostv * (sourcev - uev), ZEROV)); } } @@ -949,7 +949,7 @@ void EdgePreservingDecomposition::CompressDynamicRange(float *Source, float Scal float ce = xexpf(Source[i] + u[i] * (temp)) - eps; float ue = xexpf(u[i]) - eps; Source[i] = xexpf(Source[i]) - eps; - Source[i] = ce + DetailBoost * (Source[i] - ue); + Source[i] = rtengine::max(ce + DetailBoost * (Source[i] - ue), 0.f); } #else @@ -961,7 +961,7 @@ void EdgePreservingDecomposition::CompressDynamicRange(float *Source, float Scal float ce = xexpf(Source[i] + u[i] * (temp)) - eps; float ue = xexpf(u[i]) - eps; Source[i] = xexpf(Source[i]) - eps; - Source[i] = ce + DetailBoost * (Source[i] - ue); + Source[i] = rtengine::max(ce + DetailBoost * (Source[i] - ue), 0.f); } #endif From fa91103aecbdd9a3091f73cb938ed685de6ebc9e Mon Sep 17 00:00:00 2001 From: heckflosse Date: Mon, 5 Nov 2018 09:43:45 +0100 Subject: [PATCH 090/122] Better fix for #4934 --- rtengine/EdgePreservingDecomposition.cc | 6 +++--- rtengine/improcfun.cc | 4 ++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/rtengine/EdgePreservingDecomposition.cc b/rtengine/EdgePreservingDecomposition.cc index f64caafde..4c56cbb5d 100644 --- a/rtengine/EdgePreservingDecomposition.cc +++ b/rtengine/EdgePreservingDecomposition.cc @@ -941,7 +941,7 @@ void EdgePreservingDecomposition::CompressDynamicRange(float *Source, float Scal cev = xexpf(LVFU(Source[i]) + LVFU(u[i]) * (tempv)) - epsv; uev = xexpf(LVFU(u[i])) - epsv; sourcev = xexpf(LVFU(Source[i])) - epsv; - _mm_storeu_ps( &Source[i], vmaxf(cev + DetailBoostv * (sourcev - uev), ZEROV)); + _mm_storeu_ps( &Source[i], cev + DetailBoostv * (sourcev - uev) ); } } @@ -949,7 +949,7 @@ void EdgePreservingDecomposition::CompressDynamicRange(float *Source, float Scal float ce = xexpf(Source[i] + u[i] * (temp)) - eps; float ue = xexpf(u[i]) - eps; Source[i] = xexpf(Source[i]) - eps; - Source[i] = rtengine::max(ce + DetailBoost * (Source[i] - ue), 0.f); + Source[i] = ce + DetailBoost * (Source[i] - ue); } #else @@ -961,7 +961,7 @@ void EdgePreservingDecomposition::CompressDynamicRange(float *Source, float Scal float ce = xexpf(Source[i] + u[i] * (temp)) - eps; float ue = xexpf(u[i]) - eps; Source[i] = xexpf(Source[i]) - eps; - Source[i] = rtengine::max(ce + DetailBoost * (Source[i] - ue), 0.f); + Source[i] = ce + DetailBoost * (Source[i] - ue); } #endif diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 31c44efe4..840535e6e 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -5264,6 +5264,10 @@ void ImProcFunctions::EPDToneMap (LabImage *lab, unsigned int Iterates, int skip minL = 0.0f; //Disable the shift if there are no negative numbers. I wish there were just no negative numbers to begin with. } + if (maxL == 0.f) { // avoid division by zero + maxL = 1.f; + } + #pragma omp parallel for for (size_t i = 0; i < N; ++i) From 09838174343e31d5465ad3dc9cf51a739a575a41 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Mon, 5 Nov 2018 15:59:41 +0100 Subject: [PATCH 091/122] SSE: Review usage of vminf, vmaxf functions, #4942 --- rtengine/FTblockDN.cc | 2 +- rtengine/LUT.h | 11 ++++++----- rtengine/ciecam02.cc | 18 +++++++++--------- rtengine/clutstore.cc | 2 +- rtengine/color.cc | 6 +++--- rtengine/fast_demo.cc | 4 ++-- rtengine/helpersse2.h | 4 ++++ rtengine/rawimagesource.cc | 4 ++-- 8 files changed, 28 insertions(+), 23 deletions(-) diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index 58e27e118..8ced521d3 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -3340,7 +3340,7 @@ void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat * provicalc, aNv = LVFU(acalc[i >> 1][j >> 1]); bNv = LVFU(bcalc[i >> 1][j >> 1]); _mm_storeu_ps(&noisevarhue[i1 >> 1][j1 >> 1], xatan2f(bNv, aNv)); - _mm_storeu_ps(&noisevarchrom[i1 >> 1][j1 >> 1], _mm_max_ps(c100v, _mm_sqrt_ps(SQRV(aNv) + SQRV(bNv)))); + _mm_storeu_ps(&noisevarchrom[i1 >> 1][j1 >> 1], vmaxf(vsqrtf(SQRV(aNv) + SQRV(bNv)),c100v)); } for (; j < tileright; j += 2) { diff --git a/rtengine/LUT.h b/rtengine/LUT.h index d2f758689..fedc20ca2 100644 --- a/rtengine/LUT.h +++ b/rtengine/LUT.h @@ -320,7 +320,7 @@ public: // Clamp and convert to integer values. Extract out of SSE register because all // lookup operations use regular addresses. - vfloat clampedIndexes = vmaxf(ZEROV, vminf(maxsv, indexv)); + vfloat clampedIndexes = vmaxf(vminf(maxsv, indexv), ZEROV); // this automagically uses ZEROV in case indexv is NaN vint indexes = _mm_cvttps_epi32(clampedIndexes); int indexArray[4]; _mm_storeu_si128(reinterpret_cast<__m128i*>(&indexArray[0]), indexes); @@ -352,7 +352,7 @@ public: // Clamp and convert to integer values. Extract out of SSE register because all // lookup operations use regular addresses. - vfloat clampedIndexes = vmaxf(ZEROV, vminf(maxsv, indexv)); + vfloat clampedIndexes = vmaxf(vminf(maxsv, indexv), ZEROV); // this automagically uses ZEROV in case indexv is NaN vint indexes = _mm_cvttps_epi32(clampedIndexes); int indexArray[4]; _mm_storeu_si128(reinterpret_cast<__m128i*>(&indexArray[0]), indexes); @@ -372,7 +372,7 @@ public: vfloat lower = _mm_castsi128_ps(_mm_unpacklo_epi64(temp0, temp1)); vfloat upper = _mm_castsi128_ps(_mm_unpackhi_epi64(temp0, temp1)); - vfloat diff = vmaxf(ZEROV, vminf(sizev, indexv)) - _mm_cvtepi32_ps(indexes); + vfloat diff = vmaxf(vminf(sizev, indexv), ZEROV) - _mm_cvtepi32_ps(indexes); // this automagically uses ZEROV in case indexv is NaN return vintpf(diff, upper, lower); } @@ -383,7 +383,7 @@ public: // Clamp and convert to integer values. Extract out of SSE register because all // lookup operations use regular addresses. - vfloat clampedIndexes = vmaxf(ZEROV, vminf(maxsv, indexv)); + vfloat clampedIndexes = vmaxf(vminf(maxsv, indexv), ZEROV); // this automagically uses ZEROV in case indexv is NaN vint indexes = _mm_cvttps_epi32(clampedIndexes); int indexArray[4]; _mm_storeu_si128(reinterpret_cast<__m128i*>(&indexArray[0]), indexes); @@ -420,7 +420,8 @@ public: template::value>::type> vfloat operator[](vint idxv) const { - vfloat tempv = vmaxf(ZEROV, vminf(sizev, _mm_cvtepi32_ps(idxv))); // convert to float because SSE2 has no min/max for 32bit integers + // convert to float because SSE2 has no min/max for 32bit integers + vfloat tempv = vmaxf(vminf(sizev, _mm_cvtepi32_ps(idxv)), ZEROV); // this automagically uses ZEROV in case idxv is NaN (which will never happen because it is a vector of int) idxv = _mm_cvttps_epi32(tempv); // access the LUT 4 times. Trust the compiler. It generates good code here, better than hand written SSE code return _mm_setr_ps(data[_mm_cvtsi128_si32(idxv)], diff --git a/rtengine/ciecam02.cc b/rtengine/ciecam02.cc index f9475eb4e..c5e172478 100644 --- a/rtengine/ciecam02.cc +++ b/rtengine/ciecam02.cc @@ -542,9 +542,9 @@ void Ciecam02::xyz2jchqms_ciecam02float ( vfloat &J, vfloat &C, vfloat &h, vfloa cat02_to_hpefloat ( rp, gp, bp, rc, gc, bc); //gamut correction M.H.Brill S.Susstrunk - rp = _mm_max_ps (rp, ZEROV); - gp = _mm_max_ps (gp, ZEROV); - bp = _mm_max_ps (bp, ZEROV); + rp = vmaxf (rp, ZEROV); + gp = vmaxf (gp, ZEROV); + bp = vmaxf (bp, ZEROV); rpa = nonlinear_adaptationfloat ( rp, fl ); gpa = nonlinear_adaptationfloat ( gp, fl ); bpa = nonlinear_adaptationfloat ( bp, fl ); @@ -559,20 +559,20 @@ void Ciecam02::xyz2jchqms_ciecam02float ( vfloat &J, vfloat &C, vfloat &h, vfloa myh = vself (vmaskf_lt (myh, ZEROV), temp, myh); a = ((rpa + rpa) + gpa + (F2V (0.05f) * bpa) - F2V (0.305f)) * nbb; - a = _mm_max_ps (a, ZEROV); //gamut correction M.H.Brill S.Susstrunk + a = vmaxf (a, ZEROV); //gamut correction M.H.Brill S.Susstrunk J = pow_F ( a / aw, c * cz * F2V (0.5f)); e = ((F2V (961.53846f)) * nc * ncb) * (xcosf ( myh + F2V (2.0f) ) + F2V (3.8f)); - t = (e * _mm_sqrt_ps ( (ca * ca) + (cb * cb) )) / (rpa + gpa + (F2V (1.05f) * bpa)); + t = (e * vsqrtf ( (ca * ca) + (cb * cb) )) / (rpa + gpa + (F2V (1.05f) * bpa)); C = pow_F ( t, F2V (0.9f) ) * J * pow1; Q = wh * J; J *= J * F2V (100.0f); M = C * pfl; - Q = _mm_max_ps (Q, F2V (0.0001f)); // avoid division by zero - s = F2V (100.0f) * _mm_sqrt_ps ( M / Q ); + Q = vmaxf (Q, F2V (0.0001f)); // avoid division by zero + s = F2V (100.0f) * vsqrtf ( M / Q ); h = (myh * F2V (180.f)) / F2V (rtengine::RT_PI); } #endif @@ -710,7 +710,7 @@ void Ciecam02::jch2xyz_ciecam02float ( vfloat &x, vfloat &y, vfloat &z, vfloat J xyz_to_cat02float ( rw, gw, bw, xw, yw, zw); 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 / (_mm_sqrt_ps ( J ) * pow1), F2V (1.1111111f) ); + t = pow_F ( F2V (10.f) * C / (vsqrtf ( J ) * pow1), F2V (1.1111111f) ); calculate_abfloat ( ca, cb, h, e, t, nbb, a ); Aab_to_rgbfloat ( rpa, gpa, bpa, a, ca, cb, nbb ); @@ -780,7 +780,7 @@ vfloat Ciecam02::inverse_nonlinear_adaptationfloat ( vfloat c, vfloat fl ) c -= F2V (0.1f); fl = vmulsignf (fl, c); c = vabsf (c); - c = _mm_min_ps ( c, F2V (399.99f)); + c = vminf ( c, F2V (399.99f)); return (F2V (100.0f) / fl) * pow_F ( (F2V (27.13f) * c) / (F2V (400.0f) - c), F2V (2.38095238f) ); } #endif diff --git a/rtengine/clutstore.cc b/rtengine/clutstore.cc index 87ce25d97..1a425d21b 100644 --- a/rtengine/clutstore.cc +++ b/rtengine/clutstore.cc @@ -226,7 +226,7 @@ void rtengine::HaldCLUT::getRGB( #else const vfloat v_in = _mm_set_ps(0.0f, *b, *g, *r); const vfloat v_tmp = v_in * F2V(flevel_minus_one); - const vfloat v_rgb = v_tmp - _mm_cvtepi32_ps(_mm_cvttps_epi32(_mm_min_ps(F2V(flevel_minus_two), v_tmp))); + const vfloat v_rgb = v_tmp - _mm_cvtepi32_ps(_mm_cvttps_epi32(vminf(v_tmp, F2V(flevel_minus_two)))); size_t index = color * 4; diff --git a/rtengine/color.cc b/rtengine/color.cc index 29844f64d..4ace03bc0 100644 --- a/rtengine/color.cc +++ b/rtengine/color.cc @@ -547,8 +547,8 @@ void Color::rgb2hsl(float r, float g, float b, float &h, float &s, float &l) #ifdef __SSE2__ void Color::rgb2hsl(vfloat r, vfloat g, vfloat b, vfloat &h, vfloat &s, vfloat &l) { - vfloat maxv = _mm_max_ps(r, _mm_max_ps(g, b)); - vfloat minv = _mm_min_ps(r, _mm_min_ps(g, b)); + vfloat maxv = vmaxf(r, vmaxf(g, b)); + vfloat minv = vminf(r, vminf(g, b)); vfloat C = maxv - minv; vfloat tempv = maxv + minv; l = (tempv) * F2V(7.6295109e-6f); @@ -2879,7 +2879,7 @@ void Color::LabGamutMunsell(float *labL, float *laba, float *labb, const int N, av = LVFU(laba[k]); bv = LVFU(labb[k]); _mm_storeu_ps(&HHBuffer[k], xatan2f(bv, av)); - _mm_storeu_ps(&CCBuffer[k], _mm_sqrt_ps(SQRV(av) + SQRV(bv)) / c327d68v); + _mm_storeu_ps(&CCBuffer[k], vsqrtf(SQRV(av) + SQRV(bv)) / c327d68v); } for(; k < N; k++) { diff --git a/rtengine/fast_demo.cc b/rtengine/fast_demo.cc index cab38b1f2..e88661485 100644 --- a/rtengine/fast_demo.cc +++ b/rtengine/fast_demo.cc @@ -364,7 +364,7 @@ void RawImageSource::fast_demosaic() for (int j = left + 1, cc = 1; j < right - 1; j += 4, cc += 4) { //interpolate B/R colors at R/B sites _mm_storeu_ps(&bluetile[rr * TS + cc], LVFU(greentile[rr * TS + cc]) - zd25v * ((LVFU(greentile[(rr - 1)*TS + (cc - 1)]) + LVFU(greentile[(rr - 1)*TS + (cc + 1)]) + LVFU(greentile[(rr + 1)*TS + cc + 1]) + LVFU(greentile[(rr + 1)*TS + cc - 1])) - - _mm_min_ps(clip_ptv, LVFU(rawData[i - 1][j - 1]) + LVFU(rawData[i - 1][j + 1]) + LVFU(rawData[i + 1][j + 1]) + LVFU(rawData[i + 1][j - 1])))); + vminf(LVFU(rawData[i - 1][j - 1]) + LVFU(rawData[i - 1][j + 1]) + LVFU(rawData[i + 1][j + 1]) + LVFU(rawData[i + 1][j - 1]), clip_ptv))); } #else @@ -381,7 +381,7 @@ void RawImageSource::fast_demosaic() for (int j = left + 1, cc = 1; j < right - 1; j += 4, cc += 4) { //interpolate B/R colors at R/B sites _mm_storeu_ps(&redtile[rr * TS + cc], LVFU(greentile[rr * TS + cc]) - zd25v * ((LVFU(greentile[(rr - 1)*TS + cc - 1]) + LVFU(greentile[(rr - 1)*TS + cc + 1]) + LVFU(greentile[(rr + 1)*TS + cc + 1]) + LVFU(greentile[(rr + 1)*TS + cc - 1])) - - _mm_min_ps(clip_ptv, LVFU(rawData[i - 1][j - 1]) + LVFU(rawData[i - 1][j + 1]) + LVFU(rawData[i + 1][j + 1]) + LVFU(rawData[i + 1][j - 1])))); + vminf(LVFU(rawData[i - 1][j - 1]) + LVFU(rawData[i - 1][j + 1]) + LVFU(rawData[i + 1][j + 1]) + LVFU(rawData[i + 1][j - 1]), clip_ptv))); } #else diff --git a/rtengine/helpersse2.h b/rtengine/helpersse2.h index 46af3aa89..74780cf48 100644 --- a/rtengine/helpersse2.h +++ b/rtengine/helpersse2.h @@ -157,10 +157,14 @@ static INLINE vfloat vsqrtf(vfloat x) } static INLINE vfloat vmaxf(vfloat x, vfloat y) { + // _mm_max_ps(x, y) returns y if x is NaN + // don't change the order of the parameters return _mm_max_ps(x, y); } static INLINE vfloat vminf(vfloat x, vfloat y) { + // _mm_min_ps(x, y) returns y if x is NaN + // don't change the order of the parameters return _mm_min_ps(x, y); } diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 502da8073..9b8d3794e 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -3101,8 +3101,8 @@ void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile vfloat rowBlackv = blackv[row & 1]; for (; col < W - 3; col += 4) { - vfloat linecorrv = SQRV(vmaxf(epsv, LVFU(cfablur[row * W + col]) - rowBlackv)) / - (vmaxf(epsv, LVFU(cfablur1[row * W + col]) - rowBlackv) * vmaxf(epsv, LVFU(cfablur2[row * W + col]) - rowBlackv)); + vfloat linecorrv = SQRV(vmaxf(LVFU(cfablur[row * W + col]) - rowBlackv, epsv)) / + (vmaxf(LVFU(cfablur1[row * W + col]) - rowBlackv, epsv) * vmaxf(LVFU(cfablur2[row * W + col]) - rowBlackv, epsv)); vfloat valv = LVFU(rawData[row][col]); valv -= rowBlackv; STVFU(rawData[row][col], valv * linecorrv + rowBlackv); From 8a31f0368c2452c257aad7b1d7fe98772bfb7dfb Mon Sep 17 00:00:00 2001 From: heckflosse Date: Mon, 5 Nov 2018 16:02:32 +0100 Subject: [PATCH 092/122] Use vsqrtf instead of _mm_sqrt_ps --- rtengine/EdgePreservingDecomposition.cc | 2 +- rtengine/dirpyr_equalizer.cc | 2 +- rtengine/improcfun.cc | 2 +- rtengine/ipwavelet.cc | 6 +++--- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/rtengine/EdgePreservingDecomposition.cc b/rtengine/EdgePreservingDecomposition.cc index 4c56cbb5d..f71e0043e 100644 --- a/rtengine/EdgePreservingDecomposition.cc +++ b/rtengine/EdgePreservingDecomposition.cc @@ -731,7 +731,7 @@ float *EdgePreservingDecomposition::CreateBlur(float *Source, float Scale, float gxv = (LVFU(rg[x + 1]) - LVFU(rg[x])) + (LVFU(rg[x + w + 1]) - LVFU(rg[x + w])); gyv = (LVFU(rg[x + w]) - LVFU(rg[x])) + (LVFU(rg[x + w + 1]) - LVFU(rg[x + 1])); //Apply power to the magnitude of the gradient to get the edge stopping function. - _mm_storeu_ps( &a[x + w * y], Scalev * pow_F((zd5v * _mm_sqrt_ps(gxv * gxv + gyv * gyv + sqrepsv)), EdgeStoppingv) ); + _mm_storeu_ps( &a[x + w * y], Scalev * pow_F((zd5v * vsqrtf(gxv * gxv + gyv * gyv + sqrepsv)), EdgeStoppingv) ); } for(; x < w1; x++) { diff --git a/rtengine/dirpyr_equalizer.cc b/rtengine/dirpyr_equalizer.cc index 69c01be8c..cbee70763 100644 --- a/rtengine/dirpyr_equalizer.cc +++ b/rtengine/dirpyr_equalizer.cc @@ -191,7 +191,7 @@ void ImProcFunctions :: dirpyr_equalizer(float ** src, float ** dst, int srcwidt int j; for(j = 0; j < srcwidth - 3; j += 4) { - _mm_storeu_ps(&tmpChr[i][j], _mm_sqrt_ps(SQRV(LVFU(l_b[i][j])) + SQRV(LVFU(l_a[i][j]))) / div); + _mm_storeu_ps(&tmpChr[i][j], vsqrtf(SQRV(LVFU(l_b[i][j])) + SQRV(LVFU(l_a[i][j]))) / div); } for(; j < srcwidth; j++) { diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 840535e6e..de4a93556 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -4407,7 +4407,7 @@ void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW av = LVFU (lold->a[i][k]); bv = LVFU (lold->b[i][k]); STVF (HHBuffer[k], xatan2f (bv, av)); - STVF (CCBuffer[k], _mm_sqrt_ps (SQRV (av) + SQRV (bv)) / c327d68v); + STVF (CCBuffer[k], vsqrtf (SQRV (av) + SQRV (bv)) / c327d68v); } for (; k < W; k++) { diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index e4a61caa0..e22e4553c 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -736,7 +736,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const av = LVFU(lab->a[i][j]); bv = LVFU(lab->b[i][j]); huev = xatan2f(bv, av); - chrov = _mm_sqrt_ps(SQRV(av) + SQRV(bv)) / c327d68v; + chrov = vsqrtf(SQRV(av) + SQRV(bv)) / c327d68v; _mm_storeu_ps(&varhue[i1][j1], huev); _mm_storeu_ps(&varchro[i1][j1], chrov); @@ -1104,7 +1104,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const bv = LVFU(labco->b[i1][col]); STVF(atan2Buffer[col], xatan2f(bv, av)); - cv = _mm_sqrt_ps(SQRV(av) + SQRV(bv)); + cv = vsqrtf(SQRV(av) + SQRV(bv)); yv = av / cv; xv = bv / cv; xyMask = vmaskf_eq(zerov, cv); @@ -1992,7 +1992,7 @@ void ImProcFunctions::WaveletAandBAllAB(wavelet_decomposition &WaveletCoeffs_a, __m128 av = LVFU(WavCoeffs_a0[i * W_L + k]); __m128 bv = LVFU(WavCoeffs_b0[i * W_L + k]); __m128 huev = xatan2f(bv, av); - __m128 chrv = _mm_sqrt_ps(SQRV(av) + SQRV(bv)); + __m128 chrv = vsqrtf(SQRV(av) + SQRV(bv)); STVF(huebuffer[k], huev); STVF(chrbuffer[k], chrv); } From b8af63bb047f97a30d78f97818a67ca99cd7f1c0 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Mon, 5 Nov 2018 19:50:24 +0100 Subject: [PATCH 093/122] Use vclampf(value, low, high) whereever possible, #4942 --- rtengine/CA_correct_RT.cc | 2 +- rtengine/LUT.h | 10 +++++----- rtengine/curves.h | 12 ++++++------ rtengine/demosaic_algos.cc | 16 ++++++++-------- rtengine/iplabregions.cc | 6 +++--- rtengine/ipretinex.cc | 4 ++-- rtengine/sleefsseavx.c | 5 +++-- 7 files changed, 28 insertions(+), 27 deletions(-) diff --git a/rtengine/CA_correct_RT.cc b/rtengine/CA_correct_RT.cc index 22ad77e63..2fa589110 100644 --- a/rtengine/CA_correct_RT.cc +++ b/rtengine/CA_correct_RT.cc @@ -1252,7 +1252,7 @@ float* RawImageSource::CA_correct_RT( vfloat factors = oldvals / newvals; factors = vself(vmaskf_le(newvals, onev), onev, factors); factors = vself(vmaskf_le(oldvals, onev), onev, factors); - STVFU((*nonGreen)[i/2][j/2], LIMV(factors, zd5v, twov)); + STVFU((*nonGreen)[i/2][j/2], vclampf(factors, zd5v, twov)); } #endif for (; j < W - 2 * cb; j += 2) { diff --git a/rtengine/LUT.h b/rtengine/LUT.h index fedc20ca2..de668cca8 100644 --- a/rtengine/LUT.h +++ b/rtengine/LUT.h @@ -320,7 +320,7 @@ public: // Clamp and convert to integer values. Extract out of SSE register because all // lookup operations use regular addresses. - vfloat clampedIndexes = vmaxf(vminf(maxsv, indexv), ZEROV); // this automagically uses ZEROV in case indexv is NaN + vfloat clampedIndexes = vclampf(indexv, ZEROV, maxsv); // this automagically uses ZEROV in case indexv is NaN vint indexes = _mm_cvttps_epi32(clampedIndexes); int indexArray[4]; _mm_storeu_si128(reinterpret_cast<__m128i*>(&indexArray[0]), indexes); @@ -352,7 +352,7 @@ public: // Clamp and convert to integer values. Extract out of SSE register because all // lookup operations use regular addresses. - vfloat clampedIndexes = vmaxf(vminf(maxsv, indexv), ZEROV); // this automagically uses ZEROV in case indexv is NaN + vfloat clampedIndexes = vclampf(indexv, ZEROV, maxsv); // this automagically uses ZEROV in case indexv is NaN vint indexes = _mm_cvttps_epi32(clampedIndexes); int indexArray[4]; _mm_storeu_si128(reinterpret_cast<__m128i*>(&indexArray[0]), indexes); @@ -372,7 +372,7 @@ public: vfloat lower = _mm_castsi128_ps(_mm_unpacklo_epi64(temp0, temp1)); vfloat upper = _mm_castsi128_ps(_mm_unpackhi_epi64(temp0, temp1)); - vfloat diff = vmaxf(vminf(sizev, indexv), ZEROV) - _mm_cvtepi32_ps(indexes); // this automagically uses ZEROV in case indexv is NaN + vfloat diff = vclampf(indexv, ZEROV, sizev) - _mm_cvtepi32_ps(indexes); // this automagically uses ZEROV in case indexv is NaN return vintpf(diff, upper, lower); } @@ -383,7 +383,7 @@ public: // Clamp and convert to integer values. Extract out of SSE register because all // lookup operations use regular addresses. - vfloat clampedIndexes = vmaxf(vminf(maxsv, indexv), ZEROV); // this automagically uses ZEROV in case indexv is NaN + vfloat clampedIndexes = vclampf(indexv, ZEROV, maxsv); // this automagically uses ZEROV in case indexv is NaN vint indexes = _mm_cvttps_epi32(clampedIndexes); int indexArray[4]; _mm_storeu_si128(reinterpret_cast<__m128i*>(&indexArray[0]), indexes); @@ -421,7 +421,7 @@ public: vfloat operator[](vint idxv) const { // convert to float because SSE2 has no min/max for 32bit integers - vfloat tempv = vmaxf(vminf(sizev, _mm_cvtepi32_ps(idxv)), ZEROV); // this automagically uses ZEROV in case idxv is NaN (which will never happen because it is a vector of int) + vfloat tempv = vclampf(_mm_cvtepi32_ps(idxv), ZEROV, sizev); // this automagically uses ZEROV in case idxv is NaN (which will never happen because it is a vector of int) idxv = _mm_cvttps_epi32(tempv); // access the LUT 4 times. Trust the compiler. It generates good code here, better than hand written SSE code return _mm_setr_ps(data[_mm_cvtsi128_si32(idxv)], diff --git a/rtengine/curves.h b/rtengine/curves.h index 30fb01102..c66c19a27 100644 --- a/rtengine/curves.h +++ b/rtengine/curves.h @@ -1157,9 +1157,9 @@ inline void WeightedStdToneCurve::BatchApply(const size_t start, const size_t en float tmpb[4] ALIGNED16; for (; i + 3 < end; i += 4) { - vfloat r_val = LIMV(LVF(r[i]), ZEROV, c65535v); - vfloat g_val = LIMV(LVF(g[i]), ZEROV, c65535v); - vfloat b_val = LIMV(LVF(b[i]), ZEROV, c65535v); + vfloat r_val = vclampf(LVF(r[i]), ZEROV, c65535v); + vfloat g_val = vclampf(LVF(g[i]), ZEROV, c65535v); + vfloat b_val = vclampf(LVF(b[i]), ZEROV, c65535v); vfloat r1 = lutToneCurve[r_val]; vfloat g1 = Triangle(r_val, r1, g_val); vfloat b1 = Triangle(r_val, r1, b_val); @@ -1172,9 +1172,9 @@ inline void WeightedStdToneCurve::BatchApply(const size_t start, const size_t en vfloat r3 = Triangle(b_val, b3, r_val); vfloat g3 = Triangle(b_val, b3, g_val); - STVF(tmpr[0], LIMV(r1 * zd5v + r2 * zd25v + r3 * zd25v, ZEROV, c65535v)); - STVF(tmpg[0], LIMV(g1 * zd25v + g2 * zd5v + g3 * zd25v, ZEROV, c65535v)); - STVF(tmpb[0], LIMV(b1 * zd25v + b2 * zd25v + b3 * zd5v, ZEROV, c65535v)); + STVF(tmpr[0], vclampf(r1 * zd5v + r2 * zd25v + r3 * zd25v, ZEROV, c65535v)); + STVF(tmpg[0], vclampf(g1 * zd25v + g2 * zd5v + g3 * zd25v, ZEROV, c65535v)); + STVF(tmpb[0], vclampf(b1 * zd25v + b2 * zd25v + b3 * zd5v, ZEROV, c65535v)); for (int j = 0; j < 4; ++j) { setUnlessOOG(r[i+j], g[i+j], b[i+j], tmpr[j], tmpg[j], tmpb[j]); } diff --git a/rtengine/demosaic_algos.cc b/rtengine/demosaic_algos.cc index 10ef0dd0e..a324a7ca6 100644 --- a/rtengine/demosaic_algos.cc +++ b/rtengine/demosaic_algos.cc @@ -1399,7 +1399,7 @@ void RawImageSource::lmmse_interpolate_omp(int winw, int winh, array2D &r // Adapted to RawTherapee by Jacques Desmis 3/2013 // SSE version by Ingo Weyrich 5/2013 #ifdef __SSE2__ -#define CLIPV(a) LIMV(a,zerov,c65535v) +#define CLIPV(a) vclampf(a,zerov,c65535v) void RawImageSource::igv_interpolate(int winw, int winh) { static const float eps = 1e-5f, epssq = 1e-5f; //mod epssq -10f =>-5f Jacques 3/2013 to prevent artifact (divide by zero) @@ -1513,10 +1513,10 @@ void RawImageSource::igv_interpolate(int winw, int winh) //N,E,W,S Hamilton Adams Interpolation // (48.f * 65535.f) = 3145680.f tempv = c40v * LVFU(rgb[0][indx1]); - nvv = LIMV(((c23v * LVFU(rgb[1][(indx - v1) >> 1]) + c23v * LVFU(rgb[1][(indx - v3) >> 1]) + LVFU(rgb[1][(indx - v5) >> 1]) + LVFU(rgb[1][(indx + v1) >> 1]) + tempv - c32v * LVFU(rgb[0][(indx1 - v1)]) - c8v * LVFU(rgb[0][(indx1 - v2)]))) / c3145680v, zerov, onev); - evv = LIMV(((c23v * LVFU(rgb[1][(indx + h1) >> 1]) + c23v * LVFU(rgb[1][(indx + h3) >> 1]) + LVFU(rgb[1][(indx + h5) >> 1]) + LVFU(rgb[1][(indx - h1) >> 1]) + tempv - c32v * LVFU(rgb[0][(indx1 + h1)]) - c8v * LVFU(rgb[0][(indx1 + h2)]))) / c3145680v, zerov, onev); - wvv = LIMV(((c23v * LVFU(rgb[1][(indx - h1) >> 1]) + c23v * LVFU(rgb[1][(indx - h3) >> 1]) + LVFU(rgb[1][(indx - h5) >> 1]) + LVFU(rgb[1][(indx + h1) >> 1]) + tempv - c32v * LVFU(rgb[0][(indx1 - h1)]) - c8v * LVFU(rgb[0][(indx1 - h2)]))) / c3145680v, zerov, onev); - svv = LIMV(((c23v * LVFU(rgb[1][(indx + v1) >> 1]) + c23v * LVFU(rgb[1][(indx + v3) >> 1]) + LVFU(rgb[1][(indx + v5) >> 1]) + LVFU(rgb[1][(indx - v1) >> 1]) + tempv - c32v * LVFU(rgb[0][(indx1 + v1)]) - c8v * LVFU(rgb[0][(indx1 + v2)]))) / c3145680v, zerov, onev); + nvv = vclampf(((c23v * LVFU(rgb[1][(indx - v1) >> 1]) + c23v * LVFU(rgb[1][(indx - v3) >> 1]) + LVFU(rgb[1][(indx - v5) >> 1]) + LVFU(rgb[1][(indx + v1) >> 1]) + tempv - c32v * LVFU(rgb[0][(indx1 - v1)]) - c8v * LVFU(rgb[0][(indx1 - v2)]))) / c3145680v, zerov, onev); + evv = vclampf(((c23v * LVFU(rgb[1][(indx + h1) >> 1]) + c23v * LVFU(rgb[1][(indx + h3) >> 1]) + LVFU(rgb[1][(indx + h5) >> 1]) + LVFU(rgb[1][(indx - h1) >> 1]) + tempv - c32v * LVFU(rgb[0][(indx1 + h1)]) - c8v * LVFU(rgb[0][(indx1 + h2)]))) / c3145680v, zerov, onev); + wvv = vclampf(((c23v * LVFU(rgb[1][(indx - h1) >> 1]) + c23v * LVFU(rgb[1][(indx - h3) >> 1]) + LVFU(rgb[1][(indx - h5) >> 1]) + LVFU(rgb[1][(indx + h1) >> 1]) + tempv - c32v * LVFU(rgb[0][(indx1 - h1)]) - c8v * LVFU(rgb[0][(indx1 - h2)]))) / c3145680v, zerov, onev); + svv = vclampf(((c23v * LVFU(rgb[1][(indx + v1) >> 1]) + c23v * LVFU(rgb[1][(indx + v3) >> 1]) + LVFU(rgb[1][(indx + v5) >> 1]) + LVFU(rgb[1][(indx - v1) >> 1]) + tempv - c32v * LVFU(rgb[0][(indx1 + v1)]) - c8v * LVFU(rgb[0][(indx1 + v2)]))) / c3145680v, zerov, onev); //Horizontal and vertical color differences tempv = LVFU( rgb[0][indx1] ) / c65535v; _mm_storeu_ps( &vdif[indx1], (sgv * nvv + ngv * svv) / (ngv + sgv) - tempv ); @@ -1561,9 +1561,9 @@ void RawImageSource::igv_interpolate(int winw, int winh) for (col = 7 + (FC(row, 1) & 1), indx1 = (row * width + col) >> 1, d = FC(row, col) / 2; col < width - 14; col += 8, indx1 += 4) { //H&V integrated gaussian vector over variance on color differences //Mod Jacques 3/2013 - ngv = LIMV(epssqv + c78v * SQRV(LVFU(vdif[indx1])) + c69v * (SQRV(LVFU(vdif[indx1 - v1])) + SQRV(LVFU(vdif[indx1 + v1]))) + c51v * (SQRV(LVFU(vdif[indx1 - v2])) + SQRV(LVFU(vdif[indx1 + v2]))) + c21v * (SQRV(LVFU(vdif[indx1 - v3])) + SQRV(LVFU(vdif[indx1 + v3]))) - c6v * SQRV(LVFU(vdif[indx1 - v1]) + LVFU(vdif[indx1]) + LVFU(vdif[indx1 + v1])) + ngv = vclampf(epssqv + c78v * SQRV(LVFU(vdif[indx1])) + c69v * (SQRV(LVFU(vdif[indx1 - v1])) + SQRV(LVFU(vdif[indx1 + v1]))) + c51v * (SQRV(LVFU(vdif[indx1 - v2])) + SQRV(LVFU(vdif[indx1 + v2]))) + c21v * (SQRV(LVFU(vdif[indx1 - v3])) + SQRV(LVFU(vdif[indx1 + v3]))) - c6v * SQRV(LVFU(vdif[indx1 - v1]) + LVFU(vdif[indx1]) + LVFU(vdif[indx1 + v1])) - c10v * (SQRV(LVFU(vdif[indx1 - v2]) + LVFU(vdif[indx1 - v1]) + LVFU(vdif[indx1])) + SQRV(LVFU(vdif[indx1]) + LVFU(vdif[indx1 + v1]) + LVFU(vdif[indx1 + v2]))) - c7v * (SQRV(LVFU(vdif[indx1 - v3]) + LVFU(vdif[indx1 - v2]) + LVFU(vdif[indx1 - v1])) + SQRV(LVFU(vdif[indx1 + v1]) + LVFU(vdif[indx1 + v2]) + LVFU(vdif[indx1 + v3]))), zerov, onev); - egv = LIMV(epssqv + c78v * SQRV(LVFU(hdif[indx1])) + c69v * (SQRV(LVFU(hdif[indx1 - h1])) + SQRV(LVFU(hdif[indx1 + h1]))) + c51v * (SQRV(LVFU(hdif[indx1 - h2])) + SQRV(LVFU(hdif[indx1 + h2]))) + c21v * (SQRV(LVFU(hdif[indx1 - h3])) + SQRV(LVFU(hdif[indx1 + h3]))) - c6v * SQRV(LVFU(hdif[indx1 - h1]) + LVFU(hdif[indx1]) + LVFU(hdif[indx1 + h1])) + egv = vclampf(epssqv + c78v * SQRV(LVFU(hdif[indx1])) + c69v * (SQRV(LVFU(hdif[indx1 - h1])) + SQRV(LVFU(hdif[indx1 + h1]))) + c51v * (SQRV(LVFU(hdif[indx1 - h2])) + SQRV(LVFU(hdif[indx1 + h2]))) + c21v * (SQRV(LVFU(hdif[indx1 - h3])) + SQRV(LVFU(hdif[indx1 + h3]))) - c6v * SQRV(LVFU(hdif[indx1 - h1]) + LVFU(hdif[indx1]) + LVFU(hdif[indx1 + h1])) - c10v * (SQRV(LVFU(hdif[indx1 - h2]) + LVFU(hdif[indx1 - h1]) + LVFU(hdif[indx1])) + SQRV(LVFU(hdif[indx1]) + LVFU(hdif[indx1 + h1]) + LVFU(hdif[indx1 + h2]))) - c7v * (SQRV(LVFU(hdif[indx1 - h3]) + LVFU(hdif[indx1 - h2]) + LVFU(hdif[indx1 - h1])) + SQRV(LVFU(hdif[indx1 + h1]) + LVFU(hdif[indx1 + h2]) + LVFU(hdif[indx1 + h3]))), zerov, onev); //Limit chrominance using H/V neighbourhood nvv = median(d725v * LVFU(vdif[indx1]) + d1375v * LVFU(vdif[indx1 - v1]) + d1375v * LVFU(vdif[indx1 + v1]), LVFU(vdif[indx1 - v1]), LVFU(vdif[indx1 + v1])); @@ -2114,7 +2114,7 @@ void RawImageSource::nodemosaic(bool bw) */ #ifdef __SSE2__ -#define CLIPV(a) LIMV(a,ZEROV,c65535v) +#define CLIPV(a) vclampf(a,ZEROV,c65535v) #endif void RawImageSource::refinement(int PassCount) { diff --git a/rtengine/iplabregions.cc b/rtengine/iplabregions.cc index d5bbd6302..d2380494a 100644 --- a/rtengine/iplabregions.cc +++ b/rtengine/iplabregions.cc @@ -204,9 +204,9 @@ BENCHFUN for (int i = 0; i < n; ++i) { vfloat blendv = LVFU(abmask[i][y][x]); vfloat sv = F2V(rs[i]); - vfloat a_newv = LIMV(sv * (av + F2V(abca[i])), cm42000v, c42000v); - vfloat b_newv = LIMV(sv * (bv + F2V(abcb[i])), cm42000v, c42000v); - vfloat l_newv = LIMV(lv * F2V(rl[i]), ZEROV, c32768v); + vfloat a_newv = vclampf(sv * (av + F2V(abca[i])), cm42000v, c42000v); + vfloat b_newv = vclampf(sv * (bv + F2V(abcb[i])), cm42000v, c42000v); + vfloat l_newv = vclampf(lv * F2V(rl[i]), ZEROV, c32768v); lv = vintpf(LVFU(Lmask[i][y][x]), l_newv, lv); av = vintpf(blendv, a_newv, av); bv = vintpf(blendv, b_newv, bv); diff --git a/rtengine/ipretinex.cc b/rtengine/ipretinex.cc index e79ee52a3..fa961fbbb 100644 --- a/rtengine/ipretinex.cc +++ b/rtengine/ipretinex.cc @@ -504,11 +504,11 @@ void RawImageSource::MSR(float** luminance, float** originalLuminance, float **e if(useHslLin) { for (; j < W_L - 3; j += 4) { - _mm_storeu_ps(&luminance[i][j], LVFU(luminance[i][j]) + pondv * (LIMV(LVFU(src[i][j]) / LVFU(out[i][j]), limMinv, limMaxv) )); + _mm_storeu_ps(&luminance[i][j], LVFU(luminance[i][j]) + pondv * (vclampf(LVFU(src[i][j]) / LVFU(out[i][j]), limMinv, limMaxv) )); } } else { for (; j < W_L - 3; j += 4) { - _mm_storeu_ps(&luminance[i][j], LVFU(luminance[i][j]) + pondv * xlogf(LIMV(LVFU(src[i][j]) / LVFU(out[i][j]), limMinv, limMaxv) )); + _mm_storeu_ps(&luminance[i][j], LVFU(luminance[i][j]) + pondv * xlogf(vclampf(LVFU(src[i][j]) / LVFU(out[i][j]), limMinv, limMaxv) )); } } diff --git a/rtengine/sleefsseavx.c b/rtengine/sleefsseavx.c index c68f11ae0..83d937bd1 100644 --- a/rtengine/sleefsseavx.c +++ b/rtengine/sleefsseavx.c @@ -1368,8 +1368,9 @@ static INLINE vfloat xcbrtf(vfloat d) { return y; } -static INLINE vfloat LIMV( vfloat a, vfloat b, vfloat c ) { -return vmaxf( b, vminf(a,c)); +static INLINE vfloat vclampf(vfloat value, vfloat low, vfloat high) { + // clamps value in [low;high], returns low if value is NaN + return vmaxf(vminf(high, value), low); } static INLINE vfloat SQRV(vfloat a){ From 3b48df2c2c5c417e0b8b2df1e8cee9ad894e259c Mon Sep 17 00:00:00 2001 From: TooWaBoo Date: Tue, 6 Nov 2018 18:26:00 +0100 Subject: [PATCH 094/122] Fixed console warnings Fix for https://github.com/Beep6581/RawTherapee/issues/4941 --- rtdata/themes/TooWaBlue-GTK3-20_.css | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/rtdata/themes/TooWaBlue-GTK3-20_.css b/rtdata/themes/TooWaBlue-GTK3-20_.css index f2b631165..3fe3c5f38 100644 --- a/rtdata/themes/TooWaBlue-GTK3-20_.css +++ b/rtdata/themes/TooWaBlue-GTK3-20_.css @@ -1421,8 +1421,12 @@ combobox entry + button:not(.dummy) { border-bottom-left-radius: 0; border-left: none; } + #PlacesPaned button.combo { - margin: 0 0 calc(0.416666666666666666em - 8px) 0; + margin: 0; +} +#PlacesPaned combobox { + margin-bottom: calc(0.416666666666666666em - 8px); } /* Reset button */ From 7cbf198db8e565bb7c0baca637664dce86f67031 Mon Sep 17 00:00:00 2001 From: George Hilliard Date: Wed, 7 Nov 2018 11:55:02 -0600 Subject: [PATCH 095/122] Revert "Fix mismatched malloc/delete leak" This reverts commit 77eccdf13df8f1190d13d854f5dfd12daca09011. --- rtengine/dcp.cc | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/rtengine/dcp.cc b/rtengine/dcp.cc index a1b0db323..c18ee8915 100644 --- a/rtengine/dcp.cc +++ b/rtengine/dcp.cc @@ -393,13 +393,6 @@ double xyCoordToTemperature(const std::array& white_xy) return res; } -struct cJSON_deleter { - template - void operator()(T *t) { - cJSON_Delete(const_cast::type*>(t)); - } -}; - std::map getAliases(const Glib::ustring& profile_dir) { const std::unique_ptr> file( @@ -426,7 +419,7 @@ std::map getAliases(const Glib::ustring& profile_dir) buffer[read] = 0; cJSON_Minify(buffer.get()); - const std::unique_ptr root(cJSON_Parse(buffer.get())); + const std::unique_ptr root(cJSON_Parse(buffer.get())); if (!root || !root->child) { if (settings->verbose) { std::cout << "Could not parse 'camera_model_aliases.json' file." << std::endl; From a63cd8a87c5e5c880d2e64c99f53c70691a68539 Mon Sep 17 00:00:00 2001 From: George Hilliard Date: Fri, 2 Nov 2018 00:54:02 -0500 Subject: [PATCH 096/122] Fix mismatched malloc/delete leak, take 2 with cJSON_Delete From the Valgrind report: ``` Mismatched free() / delete / delete [] at 0x4838EAB: operator delete(void*) (vg_replace_malloc.c:576) by 0xBC5C87: std::default_delete::operator()(cJSON*) const (unique_ptr.h:81) by 0xBC4ACA: std::unique_ptr >::~unique_ptr() (unique_ptr.h:274) by 0xBBB755: (anonymous namespace)::getAliases(Glib::ustring const&) (dcp.cc:422) by 0xBC1CCA: rtengine::DCPStore::init(Glib::ustring const&, bool) (dcp.cc:1846) by 0xC3ED4F: rtengine::init(rtengine::Settings const*, Glib::ustring, Glib::ustring, bool) [clone ._omp_fn.0] (init.cc:81) by 0x89743FF: GOMP_parallel_sections (sections.c:158) by 0xC3E906: rtengine::init(rtengine::Settings const*, Glib::ustring, Glib::ustring, bool) (init.cc:52) by 0x9CE10E: Options::load(bool) (options.cc:2358) by 0x982CD6: main (main.cc:603) Address 0xd62d700 is 0 bytes inside a block of size 64 alloc'd at 0x483777F: malloc (vg_replace_malloc.c:299) by 0xE97390: cJSON_New_Item (cJSON.c:205) by 0xE98718: cJSON_ParseWithOpts (cJSON.c:1020) by 0xE9886F: cJSON_Parse (cJSON.c:1083) by 0xBBB4D3: (anonymous namespace)::getAliases(Glib::ustring const&) (dcp.cc:422) by 0xBC1CCA: rtengine::DCPStore::init(Glib::ustring const&, bool) (dcp.cc:1846) by 0xC3ED4F: rtengine::init(rtengine::Settings const*, Glib::ustring, Glib::ustring, bool) [clone ._omp_fn.0] (init.cc:81) by 0x89743FF: GOMP_parallel_sections (sections.c:158) by 0xC3E906: rtengine::init(rtengine::Settings const*, Glib::ustring, Glib::ustring, bool) (init.cc:52) by 0x9CE10E: Options::load(bool) (options.cc:2358) by 0x982CD6: main (main.cc:603) ``` --- rtengine/dcp.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/dcp.cc b/rtengine/dcp.cc index c18ee8915..c60e80587 100644 --- a/rtengine/dcp.cc +++ b/rtengine/dcp.cc @@ -419,7 +419,7 @@ std::map getAliases(const Glib::ustring& profile_dir) buffer[read] = 0; cJSON_Minify(buffer.get()); - const std::unique_ptr root(cJSON_Parse(buffer.get())); + const std::unique_ptr root(cJSON_Parse(buffer.get()), cJSON_Delete); if (!root || !root->child) { if (settings->verbose) { std::cout << "Could not parse 'camera_model_aliases.json' file." << std::endl; From b4813273d21f991789749d30eeb2ac437cdcc698 Mon Sep 17 00:00:00 2001 From: George Hilliard Date: Wed, 7 Nov 2018 12:16:16 -0600 Subject: [PATCH 097/122] ImageData: Use terser emplace_back to add unique_ptr to vector --- rtengine/imagedata.cc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/rtengine/imagedata.cc b/rtengine/imagedata.cc index 47bb0b490..849a7199f 100644 --- a/rtengine/imagedata.cc +++ b/rtengine/imagedata.cc @@ -1113,7 +1113,8 @@ FramesData::FramesData (const Glib::ustring& fname, std::unique_ptr(new FrameData(currFrame, currFrame->getRoot(), roots.at(0)))); + // Note: could leak if emplace_back throws (below as well). Unlikely in practice. + frames.emplace_back(new FrameData(currFrame, currFrame->getRoot(), roots.at(0))); } for (auto currRoot : roots) { rtexif::Tag* t = currRoot->getTag(0x83BB); @@ -1135,7 +1136,7 @@ FramesData::FramesData (const Glib::ustring& fname, std::unique_ptr(new FrameData(currFrame, currFrame->getRoot(), roots.at(0)))); + frames.emplace_back(new FrameData(currFrame, currFrame->getRoot(), roots.at(0))); } rewind (exifManager.f); // Not sure this is necessary iptc = iptc_data_new_from_jpeg_file (exifManager.f); @@ -1153,7 +1154,7 @@ FramesData::FramesData (const Glib::ustring& fname, std::unique_ptr(new FrameData(currFrame, currFrame->getRoot(), roots.at(0)))); + frames.emplace_back(new FrameData(currFrame, currFrame->getRoot(), roots.at(0))); } for (auto currRoot : roots) { rtexif::Tag* t = currRoot->getTag(0x83BB); From bb5d8710e8d29bbca1e9d33c0fd5cc64aa3e80a7 Mon Sep 17 00:00:00 2001 From: TooWaBoo Date: Thu, 8 Nov 2018 06:08:51 +0100 Subject: [PATCH 098/122] Removed "#PrefCacheSeparator" ID --- rtdata/themes/TooWaBlue-GTK3-20_.css | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/rtdata/themes/TooWaBlue-GTK3-20_.css b/rtdata/themes/TooWaBlue-GTK3-20_.css index 3fe3c5f38..dbe0041a7 100644 --- a/rtdata/themes/TooWaBlue-GTK3-20_.css +++ b/rtdata/themes/TooWaBlue-GTK3-20_.css @@ -473,7 +473,7 @@ separator, background-color: transparent; } grid separator.horizontal, box separator.horizontal { - margin: 0.166666666666666666em 0; + margin: 0.166666666666666666em; padding: 0; } grid separator.vertical, box separator.vertical { @@ -549,10 +549,7 @@ menu separator { background-color: shade(@bg-light-grey,.75); margin: 0.166666666666666666em; } -separator#PrefCacheSeparator.horizontal { - margin: 0.25em 0.166666666666666666em; - padding: 0; -} + #MyExpander separator { background-color: @view-grid-border; margin: 0.333333333333333333em 0.166666666666666666em; From bbb51b1070f2e90999ea96e82f3f9b268ae8c094 Mon Sep 17 00:00:00 2001 From: TooWaBoo Date: Thu, 8 Nov 2018 06:11:50 +0100 Subject: [PATCH 099/122] Removed "#PrefCacheSeparator" ID and add class "grid-row-separator" --- rtgui/preferences.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtgui/preferences.cc b/rtgui/preferences.cc index 54095f429..147e6badd 100644 --- a/rtgui/preferences.cc +++ b/rtgui/preferences.cc @@ -1367,7 +1367,7 @@ Gtk::Widget* Preferences::getFileBrowserPanel () // Separation is needed so that a button is not accidentally clicked when one wanted // to click a spinbox. Ideally, the separation wouldn't require attaching a widget, but how? Gtk::HSeparator *cacheSeparator = Gtk::manage (new Gtk::HSeparator()); - cacheSeparator->set_name("PrefCacheSeparator"); + cacheSeparator->get_style_context()->add_class("grid-row-separator"); Gtk::Label* clearThumbsLbl = Gtk::manage (new Gtk::Label(M("PREFERENCES_CACHECLEAR_ALLBUTPROFILES"))); setExpandAlignProperties(clearThumbsLbl, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); From 894a3523463a2401da18c65f7dcecf60830b7af3 Mon Sep 17 00:00:00 2001 From: TooWaBoo Date: Thu, 8 Nov 2018 06:33:17 +0100 Subject: [PATCH 100/122] Update TooWaBlue-GTK3-20_.css Changed some separator spacing. --- rtdata/themes/TooWaBlue-GTK3-20_.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtdata/themes/TooWaBlue-GTK3-20_.css b/rtdata/themes/TooWaBlue-GTK3-20_.css index dbe0041a7..3bc6e0bdc 100644 --- a/rtdata/themes/TooWaBlue-GTK3-20_.css +++ b/rtdata/themes/TooWaBlue-GTK3-20_.css @@ -473,7 +473,7 @@ separator, background-color: transparent; } grid separator.horizontal, box separator.horizontal { - margin: 0.166666666666666666em; + margin: 0.333333333333333333em 0.166666666666666666em; padding: 0; } grid separator.vertical, box separator.vertical { @@ -550,7 +550,7 @@ menu separator { margin: 0.166666666666666666em; } -#MyExpander separator { +#MyExpander separator.horizontal { background-color: @view-grid-border; margin: 0.333333333333333333em 0.166666666666666666em; } From 2502312242bf004dcf4ea2527b843c6dee45f215 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Thu, 8 Nov 2018 14:35:03 +0100 Subject: [PATCH 101/122] Small speedup for dehaze, closes #4944 --- rtengine/ipdehaze.cc | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/rtengine/ipdehaze.cc b/rtengine/ipdehaze.cc index fecc73e7d..5522107e0 100644 --- a/rtengine/ipdehaze.cc +++ b/rtengine/ipdehaze.cc @@ -197,23 +197,16 @@ void extract_channels(Imagefloat *img, array2D &r, array2D &g, arr const int W = img->getWidth(); const int H = img->getHeight(); -#ifdef _OPENMP - #pragma omp parallel for if (multithread) -#endif - for (int y = 0; y < H; ++y) { - for (int x = 0; x < W; ++x) { - r[y][x] = img->r(y, x); - g[y][x] = img->g(y, x); - b[y][x] = img->b(y, x); - } - } + array2D imgR(W, H, img->r.ptrs, ARRAY2D_BYREFERENCE); + guidedFilter(imgR, imgR, r, radius, epsilon, multithread); - guidedFilter(r, r, r, radius, epsilon, multithread); - guidedFilter(g, g, g, radius, epsilon, multithread); - guidedFilter(b, b, b, radius, epsilon, multithread); + array2D imgG(W, H, img->g.ptrs, ARRAY2D_BYREFERENCE); + guidedFilter(imgG, imgG, g, radius, epsilon, multithread); + + array2D imgB(W, H, img->b.ptrs, ARRAY2D_BYREFERENCE); + guidedFilter(imgB, imgB, b, radius, epsilon, multithread); } - } // namespace From 6cd50adc54f744ff5d9702548107a27dbb796d20 Mon Sep 17 00:00:00 2001 From: George Hilliard Date: Thu, 8 Nov 2018 09:57:02 -0600 Subject: [PATCH 102/122] Revert "ImageData: Use terser emplace_back to add unique_ptr to vector" This reverts commit b4813273d21f991789749d30eeb2ac437cdcc698. --- rtengine/imagedata.cc | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/rtengine/imagedata.cc b/rtengine/imagedata.cc index 849a7199f..47bb0b490 100644 --- a/rtengine/imagedata.cc +++ b/rtengine/imagedata.cc @@ -1113,8 +1113,7 @@ FramesData::FramesData (const Glib::ustring& fname, std::unique_ptrgetRoot(), roots.at(0))); + frames.push_back(std::unique_ptr(new FrameData(currFrame, currFrame->getRoot(), roots.at(0)))); } for (auto currRoot : roots) { rtexif::Tag* t = currRoot->getTag(0x83BB); @@ -1136,7 +1135,7 @@ FramesData::FramesData (const Glib::ustring& fname, std::unique_ptrgetRoot(), roots.at(0))); + frames.push_back(std::unique_ptr(new FrameData(currFrame, currFrame->getRoot(), roots.at(0)))); } rewind (exifManager.f); // Not sure this is necessary iptc = iptc_data_new_from_jpeg_file (exifManager.f); @@ -1154,7 +1153,7 @@ FramesData::FramesData (const Glib::ustring& fname, std::unique_ptrgetRoot(), roots.at(0))); + frames.push_back(std::unique_ptr(new FrameData(currFrame, currFrame->getRoot(), roots.at(0)))); } for (auto currRoot : roots) { rtexif::Tag* t = currRoot->getTag(0x83BB); From 2833417133a28ad8bee962e1a2cd883413ba8b4b Mon Sep 17 00:00:00 2001 From: heckflosse Date: Thu, 8 Nov 2018 17:16:32 +0100 Subject: [PATCH 103/122] First version of blackmagic native dng support, #4285 --- rtengine/CMakeLists.txt | 1 + rtengine/dcraw.cc | 38 ++- rtengine/dcraw.h | 1 + rtengine/lj92.c | 696 ++++++++++++++++++++++++++++++++++++++++ rtengine/lj92.h | 68 ++++ 5 files changed, 802 insertions(+), 2 deletions(-) create mode 100644 rtengine/lj92.c create mode 100644 rtengine/lj92.h diff --git a/rtengine/CMakeLists.txt b/rtengine/CMakeLists.txt index d31b1f237..7bb35ad01 100644 --- a/rtengine/CMakeLists.txt +++ b/rtengine/CMakeLists.txt @@ -130,6 +130,7 @@ set(RTENGINESOURCEFILES guidedfilter.cc ipdehaze.cc iplabregions.cc + lj92.c ) if(LENSFUN_HAS_LOAD_DIRECTORY) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index 035dab2b2..328b66956 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -23,7 +23,7 @@ /*RT*/#define LOCALTIME /*RT*/#define DJGPP /*RT*/#include "jpeg.h" - +/*RT*/#include "lj92.h" #include #include #include "opthelper.h" @@ -1124,6 +1124,40 @@ void CLASS ljpeg_idct (struct jhead *jh) FORC(64) jh->idct[c] = CLIP(((float *)work[2])[c]+0.5); } +void CLASS lossless_dnglj92_load_raw() +{ + unsigned save, tcol=0; + + while (tcol < raw_width) { + save = ftell(ifp); + if (tile_length < INT_MAX) { + fseek(ifp, get4(), SEEK_SET); + } + int data_length = ifp->size - ifp->pos; + lj92 lj; + uint8_t *data = (uint8_t*)malloc(data_length); + fread(data, 1, data_length, ifp); + + fseek(ifp, save, SEEK_SET); + int newwidth, newheight, newbps; + lj92_open(&lj, data, data_length, &newwidth, &newheight, &newbps); + + uint16_t *target = (uint16_t*)malloc(newwidth * newheight * 2 * sizeof *target); + lj92_decode(lj, target, tile_width, 0, NULL, 0); + tiff_bps = 16; + for (int y = 0; y < height; ++y) { + for(int x = 0; x < tile_width; ++x) { + RAW(y, x + tcol) = target[y * tile_width + x]; + } + } + lj92_close(lj); + tcol += tile_width; + get4(); + free(data); + free (target); + } +} + void CLASS lossless_dng_load_raw() { unsigned save, trow=0, tcol=0, jwide, jrow, jcol, row, col, i, j; @@ -9280,7 +9314,7 @@ void CLASS identify() switch (tiff_compress) { case 0: case 1: load_raw = &CLASS packed_dng_load_raw; break; - case 7: load_raw = &CLASS lossless_dng_load_raw; break; + case 7: load_raw = (!RT_from_adobe_dng_converter && !strncmp(make,"Blackmagic",10)) ? &CLASS lossless_dnglj92_load_raw : &CLASS lossless_dng_load_raw; break; case 8: load_raw = &CLASS deflate_dng_load_raw; break; case 34892: load_raw = &CLASS lossy_dng_load_raw; break; default: load_raw = 0; diff --git a/rtengine/dcraw.h b/rtengine/dcraw.h index 9c6ac4aec..f9591b640 100644 --- a/rtengine/dcraw.h +++ b/rtengine/dcraw.h @@ -290,6 +290,7 @@ void ljpeg_idct (struct jhead *jh); void canon_sraw_load_raw(); void adobe_copy_pixel (unsigned row, unsigned col, ushort **rp); void lossless_dng_load_raw(); +void lossless_dnglj92_load_raw(); void packed_dng_load_raw(); void deflate_dng_load_raw(); void init_fuji_compr(struct fuji_compressed_params* info); diff --git a/rtengine/lj92.c b/rtengine/lj92.c new file mode 100644 index 000000000..cfdae6bf9 --- /dev/null +++ b/rtengine/lj92.c @@ -0,0 +1,696 @@ +/* +lj92.c +(c) Andrew Baldwin 2014 + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +#include +#include +#include +#include + +#include "lj92.h" + +typedef uint8_t u8; +typedef uint16_t u16; +typedef uint32_t u32; + +//#define SLOW_HUFF +//#define DEBUG + +typedef struct _ljp { + u8* data; + u8* dataend; + int datalen; + int scanstart; + int ix; + int x; // Width + int y; // Height + int bits; // Bit depth + int writelen; // Write rows this long + int skiplen; // Skip this many values after each row + u16* linearize; // Linearization table + int linlen; + int sssshist[16]; + + // Huffman table - only one supported, and probably needed +#ifdef SLOW_HUFF + int* maxcode; + int* mincode; + int* valptr; + u8* huffval; + int* huffsize; + int* huffcode; +#else + u16* hufflut; + int huffbits; +#endif + // Parse state + int cnt; + u32 b; + u16* image; + u16* rowcache; + u16* outrow[2]; +} ljp; + +static int find(ljp* self) { + int ix = self->ix; + u8* data = self->data; + while (data[ix] != 0xFF && ix<(self->datalen-1)) { + ix += 1; + } + ix += 2; + if (ix>=self->datalen) return -1; + self->ix = ix; + return data[ix-1]; +} + +#define BEH(ptr) ((((int)(*&ptr))<<8)|(*(&ptr+1))) + +static int parseHuff(ljp* self) { + int ret = LJ92_ERROR_CORRUPT; + u8* huffhead = &self->data[self->ix]; // xstruct.unpack('>HB16B',self.data[self.ix:self.ix+19]) + u8* bits = &huffhead[2]; + bits[0] = 0; // Because table starts from 1 + int hufflen = BEH(huffhead[0]); + if ((self->ix + hufflen) >= self->datalen) return ret; +#ifdef SLOW_HUFF + u8* huffval = calloc(hufflen - 19,sizeof(u8)); + if (huffval == NULL) return LJ92_ERROR_NO_MEMORY; + self->huffval = huffval; + for (int hix=0;hix<(hufflen-19);hix++) { + huffval[hix] = self->data[self->ix+19+hix]; +#ifdef DEBUG + printf("huffval[%d]=%d\n",hix,huffval[hix]); +#endif + } + self->ix += hufflen; + // Generate huffman table + int k = 0; + int i = 1; + int j = 1; + int huffsize_needed = 1; + // First calculate how long huffsize needs to be + while (i<=16) { + while (j<=bits[i]) { + huffsize_needed++; + k = k+1; + j = j+1; + } + i = i+1; + j = 1; + } + // Now allocate and do it + int* huffsize = calloc(huffsize_needed,sizeof(int)); + if (huffsize == NULL) return LJ92_ERROR_NO_MEMORY; + self->huffsize = huffsize; + k = 0; + i = 1; + j = 1; + // First calculate how long huffsize needs to be + int hsix = 0; + while (i<=16) { + while (j<=bits[i]) { + huffsize[hsix++] = i; + k = k+1; + j = j+1; + } + i = i+1; + j = 1; + } + huffsize[hsix++] = 0; + + // Calculate the size of huffcode array + int huffcode_needed = 0; + k = 0; + int code = 0; + int si = huffsize[0]; + while (1) { + while (huffsize[k] == si) { + huffcode_needed++; + code = code+1; + k = k+1; + } + if (huffsize[k] == 0) + break; + while (huffsize[k] != si) { + code = code << 1; + si = si + 1; + } + } + // Now fill it + int* huffcode = calloc(huffcode_needed,sizeof(int)); + if (huffcode == NULL) return LJ92_ERROR_NO_MEMORY; + self->huffcode = huffcode; + int hcix = 0; + k = 0; + code = 0; + si = huffsize[0]; + while (1) { + while (huffsize[k] == si) { + huffcode[hcix++] = code; + code = code+1; + k = k+1; + } + if (huffsize[k] == 0) + break; + while (huffsize[k] != si) { + code = code << 1; + si = si + 1; + } + } + + i = 0; + j = 0; + + int* maxcode = calloc(17,sizeof(int)); + if (maxcode == NULL) return LJ92_ERROR_NO_MEMORY; + self->maxcode = maxcode; + int* mincode = calloc(17,sizeof(int)); + if (mincode == NULL) return LJ92_ERROR_NO_MEMORY; + self->mincode = mincode; + int* valptr = calloc(17,sizeof(int)); + if (valptr == NULL) return LJ92_ERROR_NO_MEMORY; + self->valptr = valptr; + + while (1) { + while (1) { + i++; + if (i>16) + break; + if (bits[i]!=0) + break; + maxcode[i] = -1; + } + if (i>16) + break; + valptr[i] = j; + mincode[i] = huffcode[j]; + j = j+bits[i]-1; + maxcode[i] = huffcode[j]; + j++; + } + free(huffsize); + self->huffsize = NULL; + free(huffcode); + self->huffcode = NULL; + ret = LJ92_ERROR_NONE; +#else + /* Calculate huffman direct lut */ + // How many bits in the table - find highest entry + u8* huffvals = &self->data[self->ix+19]; + int maxbits = 16; + while (maxbits>0) { + if (bits[maxbits]) break; + maxbits--; + } + self->huffbits = maxbits; + /* Now fill the lut */ + u16* hufflut = (u16*)malloc((1<hufflut = hufflut; + int i = 0; + int hv = 0; + int rv = 0; + int vl = 0; // i + int hcode; + int bitsused = 1; +#ifdef DEBUG + printf("%04x:%x:%d:%x\n",i,huffvals[hv],bitsused,1<<(maxbits-bitsused)); +#endif + while (i<1<maxbits) { + break; // Done. Should never get here! + } + if (vl >= bits[bitsused]) { + bitsused++; + vl = 0; + continue; + } + if (rv == 1 << (maxbits-bitsused)) { + rv = 0; + vl++; + hv++; +#ifdef DEBUG + printf("%04x:%x:%d:%x\n",i,huffvals[hv],bitsused,1<<(maxbits-bitsused)); +#endif + continue; + } + hcode = huffvals[hv]; + hufflut[i] = hcode<<8 | bitsused; + //printf("%d %d %d\n",i,bitsused,hcode); + i++; + rv++; + } + ret = LJ92_ERROR_NONE; +#endif + return ret; +} + +static int parseSof3(ljp* self) { + if (self->ix+6 >= self->datalen) return LJ92_ERROR_CORRUPT; + self->y = BEH(self->data[self->ix+3]); + self->x = BEH(self->data[self->ix+5]); + self->bits = self->data[self->ix+2]; + self->ix += BEH(self->data[self->ix]); + return LJ92_ERROR_NONE; +} + +static int parseBlock(ljp* self,int marker) { + self->ix += BEH(self->data[self->ix]); + if (self->ix >= self->datalen) return LJ92_ERROR_CORRUPT; + return LJ92_ERROR_NONE; +} + +#ifdef SLOW_HUFF +static int nextbit(ljp* self) { + u32 b = self->b; + if (self->cnt == 0) { + u8* data = &self->data[self->ix]; + u32 next = *data++; + b = next; + if (next == 0xff) { + data++; + self->ix++; + } + self->ix++; + self->cnt = 8; + } + int bit = b >> 7; + self->cnt--; + self->b = (b << 1)&0xFF; + return bit; +} + +static int decode(ljp* self) { + int i = 1; + int code = nextbit(self); + while (code > self->maxcode[i]) { + i++; + code = (code << 1) + nextbit(self); + } + int j = self->valptr[i]; + j = j + code - self->mincode[i]; + int value = self->huffval[j]; + return value; +} + +static int receive(ljp* self,int ssss) { + int i = 0; + int v = 0; + while (i != ssss) { + i++; + v = (v<<1) + nextbit(self); + } + return v; +} + +static int extend(ljp* self,int v,int t) { + int vt = 1<<(t-1); + if (v < vt) { + vt = (-1 << t) + 1; + v = v + vt; + } + return v; +} +#endif + +inline static int nextdiff(ljp* self, int Px) { +#ifdef SLOW_HUFF + int t = decode(self); + int diff = receive(self,t); + diff = extend(self,diff,t); + //printf("%d %d %d %x\n",Px+diff,Px,diff,t);//,index,usedbits); +#else + u32 b = self->b; + int cnt = self->cnt; + int huffbits = self->huffbits; + int ix = self->ix; + int next; + while (cnt < huffbits) { + next = *(u16*)&self->data[ix]; + int one = next&0xFF; + int two = next>>8; + b = (b<<16)|(one<<8)|two; + cnt += 16; + ix += 2; + if (one==0xFF) { + //printf("%x %x %x %x %d\n",one,two,b,b>>8,cnt); + b >>= 8; + cnt -= 8; + } else if (two==0xFF) ix++; + } + int index = b >> (cnt - huffbits); + u16 ssssused = self->hufflut[index]; + int usedbits = ssssused&0xFF; + int t = ssssused>>8; + self->sssshist[t]++; + cnt -= usedbits; + int keepbitsmask = (1 << cnt)-1; + b &= keepbitsmask; + while (cnt < t) { + next = *(u16*)&self->data[ix]; + int one = next&0xFF; + int two = next>>8; + b = (b<<16)|(one<<8)|two; + cnt += 16; + ix += 2; + if (one==0xFF) { + b >>= 8; + cnt -= 8; + } else if (two==0xFF) ix++; + } + cnt -= t; + int diff = b >> cnt; + int vt = 1<<(t-1); + if (diff < vt) { + vt = (-1 << t) + 1; + diff += vt; + } + keepbitsmask = (1 << cnt)-1; + self->b = b & keepbitsmask; + self->cnt = cnt; + self->ix = ix; + //printf("%d %d\n",t,diff); + //printf("%d %d %d %x %x %d\n",Px+diff,Px,diff,t,index,usedbits); +#ifdef DEBUG +#endif +#endif + return diff; +} + +static int parsePred6(ljp* self) { + int ret = LJ92_ERROR_CORRUPT; + self->ix = self->scanstart; + //int compcount = self->data[self->ix+2]; + self->ix += BEH(self->data[self->ix]); + self->cnt = 0; + self->b = 0; + int write = self->writelen; + // Now need to decode huffman coded values + int c = 0; + int pixels = self->y * self->x; + u16* out = self->image; + u16* temprow; + u16* thisrow = self->outrow[0]; + u16* lastrow = self->outrow[1]; + + // First pixel predicted from base value + int diff; + int Px; + int col = 0; + int row = 0; + int left = 0; + int linear; + + // First pixel + diff = nextdiff(self,0); + Px = 1 << (self->bits-1); + left = Px + diff; + if (self->linearize) + linear = self->linearize[left]; + else + linear = left; + thisrow[col++] = left; + out[c++] = linear; + if (self->ix >= self->datalen) return ret; + --write; + int rowcount = self->x-1; + while (rowcount--) { + diff = nextdiff(self,0); + Px = left; + left = Px + diff; + if (self->linearize) + linear = self->linearize[left]; + else + linear = left; + thisrow[col++] = left; + out[c++] = linear; + //printf("%d %d %d %d %x\n",col-1,diff,left,thisrow[col-1],&thisrow[col-1]); + if (self->ix >= self->datalen) return ret; + if (--write==0) { + out += self->skiplen; + write = self->writelen; + } + } + temprow = lastrow; + lastrow = thisrow; + thisrow = temprow; + row++; + //printf("%x %x\n",thisrow,lastrow); + while (clinearize) { + if (left>self->linlen) return LJ92_ERROR_CORRUPT; + linear = self->linearize[left]; + } else + linear = left; + thisrow[col++] = left; + //printf("%d %d %d %d\n",col,diff,left,lastrow[col]); + out[c++] = linear; + if (self->ix >= self->datalen) break; + rowcount = self->x-1; + if (--write==0) { + out += self->skiplen; + write = self->writelen; + } + while (rowcount--) { + diff = nextdiff(self,0); + Px = lastrow[col] + ((left - lastrow[col-1])>>1); + left = Px + diff; + //printf("%d %d %d %d %d %x\n",col,diff,left,lastrow[col],lastrow[col-1],&lastrow[col]); + if (self->linearize) { + if (left>self->linlen) return LJ92_ERROR_CORRUPT; + linear = self->linearize[left]; + } else + linear = left; + thisrow[col++] = left; + out[c++] = linear; + if (--write==0) { + out += self->skiplen; + write = self->writelen; + } + } + temprow = lastrow; + lastrow = thisrow; + thisrow = temprow; + if (self->ix >= self->datalen) break; + } + if (c >= pixels) ret = LJ92_ERROR_NONE; + return ret; +} + +static int parseScan(ljp* self) { + int ret = LJ92_ERROR_CORRUPT; + memset(self->sssshist,0,sizeof(self->sssshist)); + self->ix = self->scanstart; + int compcount = self->data[self->ix+2]; + int pred = self->data[self->ix+3+2*compcount]; + if (pred<0 || pred>7) return ret; + if (pred==6) return parsePred6(self); // Fast path + self->ix += BEH(self->data[self->ix]); + self->cnt = 0; + self->b = 0; + int write = self->writelen; + // Now need to decode huffman coded values + int c = 0; + int pixels = self->y * self->x; + u16* out = self->image; + u16* thisrow = self->outrow[0]; + u16* lastrow = self->outrow[1]; + + // First pixel predicted from base value + int diff; + int Px; + int col = 0; + int row = 0; + int left = 0; + while (cbits-1); + } else if (row==0) { + Px = left; + } else if (col==0) { + Px = lastrow[col]; // Use value above for first pixel in row + } else { + switch (pred) { + case 0: + Px = 0; break; // No prediction... should not be used + case 1: + Px = left; break; + case 2: + Px = lastrow[col]; break; + case 3: + Px = lastrow[col-1];break; + case 4: + Px = left + lastrow[col] - lastrow[col-1];break; + case 5: + Px = left + ((lastrow[col] - lastrow[col-1])>>1);break; + case 6: + Px = lastrow[col] + ((left - lastrow[col-1])>>1);break; + case 7: + Px = (left + lastrow[col])>>1;break; + } + } + diff = nextdiff(self,Px); + left = Px + diff; + //printf("%d %d %d\n",c,diff,left); + int linear; + if (self->linearize) { + if (left>self->linlen) return LJ92_ERROR_CORRUPT; + linear = self->linearize[left]; + } else + linear = left; + thisrow[col] = left; + out[c++] = linear; + if (++col==self->x) { + col = 0; + row++; + u16* temprow = lastrow; + lastrow = thisrow; + thisrow = temprow; + } + if (--write==0) { + out += self->skiplen; + write = self->writelen; + } + if (self->ix >= self->datalen+2) break; + } + if (c >= pixels) ret = LJ92_ERROR_NONE; + /*for (int h=0;h<17;h++) { + printf("ssss:%d=%d (%f)\n",h,self->sssshist[h],(float)self->sssshist[h]/(float)(pixels)); + }*/ + return ret; +} + +static int parseImage(ljp* self) { + int ret = LJ92_ERROR_NONE; + while (1) { + int nextMarker = find(self); + if (nextMarker == 0xc4) + ret = parseHuff(self); + else if (nextMarker == 0xc3) + ret = parseSof3(self); + else if (nextMarker == 0xfe)// Comment + ret = parseBlock(self,nextMarker); + else if (nextMarker == 0xd9) // End of image + break; + else if (nextMarker == 0xda) { + self->scanstart = self->ix; + ret = LJ92_ERROR_NONE; + break; + } else if (nextMarker == -1) { + ret = LJ92_ERROR_CORRUPT; + break; + } else + ret = parseBlock(self,nextMarker); + if (ret != LJ92_ERROR_NONE) break; + } + return ret; +} + +static int findSoI(ljp* self) { + int ret = LJ92_ERROR_CORRUPT; + if (find(self)==0xd8) + ret = parseImage(self); + return ret; +} + +static void free_memory(ljp* self) { +#ifdef SLOW_HUFF + free(self->maxcode); + self->maxcode = NULL; + free(self->mincode); + self->mincode = NULL; + free(self->valptr); + self->valptr = NULL; + free(self->huffval); + self->huffval = NULL; + free(self->huffsize); + self->huffsize = NULL; + free(self->huffcode); + self->huffcode = NULL; +#else + free(self->hufflut); + self->hufflut = NULL; +#endif + free(self->rowcache); + self->rowcache = NULL; +} + +int lj92_open(lj92* lj, + uint8_t* data, int datalen, + int* width,int* height, int* bitdepth) { + ljp* self = (ljp*)calloc(sizeof(ljp),1); + if (self==NULL) return LJ92_ERROR_NO_MEMORY; + + self->data = (u8*)data; + self->dataend = self->data + datalen; + self->datalen = datalen; + + int ret = findSoI(self); + + if (ret == LJ92_ERROR_NONE) { + u16* rowcache = (u16*)calloc(self->x * 2,sizeof(u16)); + if (rowcache == NULL) ret = LJ92_ERROR_NO_MEMORY; + else { + self->rowcache = rowcache; + self->outrow[0] = rowcache; + self->outrow[1] = &rowcache[self->x]; + } + } + + if (ret != LJ92_ERROR_NONE) { // Failed, clean up + *lj = NULL; + free_memory(self); + free(self); + } else { + *width = self->x; + *height = self->y; + *bitdepth = self->bits; + *lj = self; + } + return ret; +} + +int lj92_decode(lj92 lj, + uint16_t* target,int writeLength, int skipLength, + uint16_t* linearize,int linearizeLength) { + int ret = LJ92_ERROR_NONE; + ljp* self = lj; + if (self == NULL) return LJ92_ERROR_BAD_HANDLE; + self->image = target; + self->writelen = writeLength; + self->skiplen = skipLength; + self->linearize = linearize; + self->linlen = linearizeLength; + ret = parseScan(self); + return ret; +} + +void lj92_close(lj92 lj) { + ljp* self = lj; + if (self != NULL) + free_memory(self); + free(self); +} diff --git a/rtengine/lj92.h b/rtengine/lj92.h new file mode 100644 index 000000000..bc8bf7604 --- /dev/null +++ b/rtengine/lj92.h @@ -0,0 +1,68 @@ +/* +lj92.h +(c) Andrew Baldwin 2014 + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +#ifndef LJ92_H +#define LJ92_H + +#ifdef __cplusplus +extern "C" +{ +#endif +enum LJ92_ERRORS { + LJ92_ERROR_NONE = 0, + LJ92_ERROR_CORRUPT = -1, + LJ92_ERROR_NO_MEMORY = -2, + LJ92_ERROR_BAD_HANDLE = -3, + LJ92_ERROR_TOO_WIDE = -4, +}; + +typedef struct _ljp* lj92; + +/* Parse a lossless JPEG (1992) structure returning + * - a handle that can be used to decode the data + * - width/height/bitdepth of the data + * Returns status code. + * If status == LJ92_ERROR_NONE, handle must be closed with lj92_close + */ +int lj92_open(lj92* lj, // Return handle here + uint8_t* data,int datalen, // The encoded data + int* width,int* height,int* bitdepth); // Width, height and bitdepth + +/* Release a decoder object */ +void lj92_close(lj92 lj); + +/* + * Decode previously opened lossless JPEG (1992) into a 2D tile of memory + * Starting at target, write writeLength 16bit values, then skip 16bit skipLength value before writing again + * If linearize is not NULL, use table at linearize to convert data values from output value to target value + * Data is only correct if LJ92_ERROR_NONE is returned + */ +int lj92_decode(lj92 lj, + uint16_t* target, int writeLength, int skipLength, // The image is written to target as a tile + uint16_t* linearize, int linearizeLength); // If not null, linearize the data using this table + +#endif + +#ifdef __cplusplus +} +#endif From a29a3b19a951be20aa2c8a6bf65fb113d8793a77 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Thu, 8 Nov 2018 21:03:09 +0100 Subject: [PATCH 104/122] multithreaded decoding of LJ92 encoded DNG files (for example Blackmagic native DNG files), #4285 --- rtengine/dcraw.cc | 40 ++++++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index 328b66956..f6c0bb3f6 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -24,10 +24,14 @@ /*RT*/#define DJGPP /*RT*/#include "jpeg.h" /*RT*/#include "lj92.h" +/*RT*/#ifdef _OPENMP +/*RT*/#include +/*RT*/#endif + #include #include #include "opthelper.h" -//#define BENCHMARK +#define BENCHMARK #include "StopWatch.h" /* @@ -1126,36 +1130,40 @@ void CLASS ljpeg_idct (struct jhead *jh) void CLASS lossless_dnglj92_load_raw() { - unsigned save, tcol=0; + BENCHFUN + tiff_bps = 16; + size_t tileCount = raw_width / tile_width; + size_t dataOffset[tileCount]; + for (size_t t = 0; t < tileCount; ++t) { + dataOffset[t] = get4(); + } + uint8_t *data = (uint8_t*)malloc(ifp->size); + fseek(ifp, 0, SEEK_SET); + // read whole file + fread(data, 1, ifp->size, ifp); - while (tcol < raw_width) { - save = ftell(ifp); - if (tile_length < INT_MAX) { - fseek(ifp, get4(), SEEK_SET); - } - int data_length = ifp->size - ifp->pos; +#ifdef _OPENMP + #pragma omp parallel for num_threads(std::min(tileCount, omp_get_max_threads())) +#endif + for (size_t t = 0; t < tileCount; ++t) { + size_t tcol = t * tile_width; + int data_length = ifp->size; lj92 lj; - uint8_t *data = (uint8_t*)malloc(data_length); - fread(data, 1, data_length, ifp); - fseek(ifp, save, SEEK_SET); int newwidth, newheight, newbps; - lj92_open(&lj, data, data_length, &newwidth, &newheight, &newbps); + lj92_open(&lj, &data[dataOffset[t]], data_length, &newwidth, &newheight, &newbps); uint16_t *target = (uint16_t*)malloc(newwidth * newheight * 2 * sizeof *target); lj92_decode(lj, target, tile_width, 0, NULL, 0); - tiff_bps = 16; for (int y = 0; y < height; ++y) { for(int x = 0; x < tile_width; ++x) { RAW(y, x + tcol) = target[y * tile_width + x]; } } lj92_close(lj); - tcol += tile_width; - get4(); - free(data); free (target); } + free(data); } void CLASS lossless_dng_load_raw() From afb3026b703174b58160a735d893327d9f54e5e6 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 9 Nov 2018 12:07:14 +0100 Subject: [PATCH 105/122] Decode Magic Lantern CinemaDNG files, #4285 --- rtengine/dcraw.cc | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index f6c0bb3f6..2fea27133 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -1132,10 +1132,17 @@ void CLASS lossless_dnglj92_load_raw() { BENCHFUN tiff_bps = 16; + + tile_width = tile_length < INT_MAX ? tile_width : raw_width; size_t tileCount = raw_width / tile_width; + size_t dataOffset[tileCount]; - for (size_t t = 0; t < tileCount; ++t) { - dataOffset[t] = get4(); + if(tile_length < INT_MAX) { + for (size_t t = 0; t < tileCount; ++t) { + dataOffset[t] = get4(); + } + } else { + dataOffset[0] = ifp->pos; } uint8_t *data = (uint8_t*)malloc(ifp->size); fseek(ifp, 0, SEEK_SET); @@ -1161,7 +1168,7 @@ void CLASS lossless_dnglj92_load_raw() } } lj92_close(lj); - free (target); + free(target); } free(data); } @@ -9322,7 +9329,7 @@ void CLASS identify() switch (tiff_compress) { case 0: case 1: load_raw = &CLASS packed_dng_load_raw; break; - case 7: load_raw = (!RT_from_adobe_dng_converter && !strncmp(make,"Blackmagic",10)) ? &CLASS lossless_dnglj92_load_raw : &CLASS lossless_dng_load_raw; break; + case 7: load_raw = (!RT_from_adobe_dng_converter && (!strncmp(make,"Blackmagic",10) || !strncmp(make,"Canon",5))) ? &CLASS lossless_dnglj92_load_raw : &CLASS lossless_dng_load_raw; break; case 8: load_raw = &CLASS deflate_dng_load_raw; break; case 34892: load_raw = &CLASS lossy_dng_load_raw; break; default: load_raw = 0; From 0f2fc651687e0067cec86bff073a1aa28fbf717e Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 9 Nov 2018 12:54:37 +0100 Subject: [PATCH 106/122] Fix accidently broken 'Blackmagic Pocket Cinema Camera 4K' decoding, #4285 --- rtengine/dcraw.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index 2fea27133..cdd80e306 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -9329,7 +9329,7 @@ void CLASS identify() switch (tiff_compress) { case 0: case 1: load_raw = &CLASS packed_dng_load_raw; break; - case 7: load_raw = (!RT_from_adobe_dng_converter && (!strncmp(make,"Blackmagic",10) || !strncmp(make,"Canon",5))) ? &CLASS lossless_dnglj92_load_raw : &CLASS lossless_dng_load_raw; break; + case 7: load_raw = (!RT_from_adobe_dng_converter && ((!strncmp(make,"Blackmagic",10) && strncmp(model, "Pocket Cinema Camera 4K", 23)) || !strncmp(make,"Canon",5))) ? &CLASS lossless_dnglj92_load_raw : &CLASS lossless_dng_load_raw; break; case 8: load_raw = &CLASS deflate_dng_load_raw; break; case 34892: load_raw = &CLASS lossy_dng_load_raw; break; default: load_raw = 0; From a1d4acf72f634303625b158ca0acacd06413247c Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 9 Nov 2018 13:55:58 +0100 Subject: [PATCH 107/122] Artefacts with toncurve 2 / weighted standard with RT-dev-1098, fixes #4948 --- rtengine/curves.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rtengine/curves.h b/rtengine/curves.h index c66c19a27..f1b402dd3 100644 --- a/rtengine/curves.h +++ b/rtengine/curves.h @@ -1084,11 +1084,12 @@ inline float WeightedStdToneCurve::Triangle(float a, float a1, float b) const #ifdef __SSE2__ inline vfloat WeightedStdToneCurve::Triangle(vfloat a, vfloat a1, vfloat b) const { + vmask eqmask = vmaskf_eq(b, a); vfloat a2 = a1 - a; vmask cmask = vmaskf_lt(b, a); vfloat b3 = vself(cmask, b, F2V(65535.f) - b); vfloat a3 = vself(cmask, a, F2V(65535.f) - a); - return b + a2 * b3 / a3; + return vself(eqmask, a1, b + a2 * b3 / a3); } #endif From 3a51bcd00a73e16b1fcda74955f9dc748b9ff650 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 9 Nov 2018 14:45:38 +0100 Subject: [PATCH 108/122] Use linearization table for Blackmagic DNG files, #4285 --- rtengine/dcraw.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index cdd80e306..31efe41da 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -1131,8 +1131,10 @@ void CLASS ljpeg_idct (struct jhead *jh) void CLASS lossless_dnglj92_load_raw() { BENCHFUN + tiff_bps = 16; + uint16_t *lincurve = !strncmp(make,"Blackmagic",10) ? curve : nullptr; tile_width = tile_length < INT_MAX ? tile_width : raw_width; size_t tileCount = raw_width / tile_width; @@ -1161,7 +1163,7 @@ void CLASS lossless_dnglj92_load_raw() lj92_open(&lj, &data[dataOffset[t]], data_length, &newwidth, &newheight, &newbps); uint16_t *target = (uint16_t*)malloc(newwidth * newheight * 2 * sizeof *target); - lj92_decode(lj, target, tile_width, 0, NULL, 0); + lj92_decode(lj, target, tile_width, 0, lincurve, 0x1000); for (int y = 0; y < height; ++y) { for(int x = 0; x < tile_width; ++x) { RAW(y, x + tcol) = target[y * tile_width + x]; From 58e26add76b7f476925572f573412855daed5979 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 9 Nov 2018 15:30:29 +0100 Subject: [PATCH 109/122] Fallback to 'UniqueCameraModel' tag if model is 'Unknown' --- rtengine/imagedata.cc | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/rtengine/imagedata.cc b/rtengine/imagedata.cc index 47bb0b490..892a9efed 100644 --- a/rtengine/imagedata.cc +++ b/rtengine/imagedata.cc @@ -156,6 +156,13 @@ FrameData::FrameData (rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* model = "Unknown"; } + if (model == "Unknown") { + tag = newFrameRootDir->findTag("UniqueCameraModel"); + if (tag) { + model = tag->valueToString(); + } + } + tag = newFrameRootDir->findTagUpward("Orientation"); if (tag) { orientation = tag->valueToString (); From f7109eec21b7feade621c77031076a7539b394b9 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 9 Nov 2018 17:36:13 +0100 Subject: [PATCH 110/122] Improved check for lj92 compressed dng files, #4285 --- rtengine/dcraw.cc | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index 31efe41da..51f01469e 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -1134,6 +1134,7 @@ void CLASS lossless_dnglj92_load_raw() tiff_bps = 16; + int save = ifp->pos; uint16_t *lincurve = !strncmp(make,"Blackmagic",10) ? curve : nullptr; tile_width = tile_length < INT_MAX ? tile_width : raw_width; size_t tileCount = raw_width / tile_width; @@ -1149,20 +1150,30 @@ void CLASS lossless_dnglj92_load_raw() uint8_t *data = (uint8_t*)malloc(ifp->size); fseek(ifp, 0, SEEK_SET); // read whole file - fread(data, 1, ifp->size, ifp); + int data_length = ifp->size; + fread(data, 1, data_length, ifp); + lj92 lj; + int newwidth, newheight, newbps; + lj92_open(&lj, &data[dataOffset[0]], data_length, &newwidth, &newheight, &newbps); + lj92_close(lj); + if (newwidth * newheight * tileCount != raw_width * raw_height) { + // not a lj92 file + fseek(ifp, save, SEEK_SET); + free(data); + lossless_dng_load_raw(); + return; + } #ifdef _OPENMP #pragma omp parallel for num_threads(std::min(tileCount, omp_get_max_threads())) #endif for (size_t t = 0; t < tileCount; ++t) { size_t tcol = t * tile_width; - int data_length = ifp->size; lj92 lj; - int newwidth, newheight, newbps; lj92_open(&lj, &data[dataOffset[t]], data_length, &newwidth, &newheight, &newbps); - uint16_t *target = (uint16_t*)malloc(newwidth * newheight * 2 * sizeof *target); + uint16_t *target = (uint16_t*)malloc(newwidth * newheight * sizeof *target); lj92_decode(lj, target, tile_width, 0, lincurve, 0x1000); for (int y = 0; y < height; ++y) { for(int x = 0; x < tile_width; ++x) { @@ -9331,7 +9342,7 @@ void CLASS identify() switch (tiff_compress) { case 0: case 1: load_raw = &CLASS packed_dng_load_raw; break; - case 7: load_raw = (!RT_from_adobe_dng_converter && ((!strncmp(make,"Blackmagic",10) && strncmp(model, "Pocket Cinema Camera 4K", 23)) || !strncmp(make,"Canon",5))) ? &CLASS lossless_dnglj92_load_raw : &CLASS lossless_dng_load_raw; break; + case 7: load_raw = (!strncmp(make,"Blackmagic",10) || !strncmp(make,"Canon",5)) ? &CLASS lossless_dnglj92_load_raw : &CLASS lossless_dng_load_raw; break; case 8: load_raw = &CLASS deflate_dng_load_raw; break; case 34892: load_raw = &CLASS lossy_dng_load_raw; break; default: load_raw = 0; From 0f50e738e49ddb53c5065403a6b304a8c056243a Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sat, 10 Nov 2018 01:12:14 +0100 Subject: [PATCH 111/122] Disabled timing code --- rtengine/dcraw.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index 51f01469e..c9bc8ccad 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -31,7 +31,7 @@ #include #include #include "opthelper.h" -#define BENCHMARK +//#define BENCHMARK #include "StopWatch.h" /* From b488e207e1f7dd82bfa7eacb65509caf961ac8bb Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sat, 10 Nov 2018 01:36:35 +0100 Subject: [PATCH 112/122] Wrong folder selected when rt is started in verbose mode, fixes #4946 --- rtgui/dirbrowser.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtgui/dirbrowser.cc b/rtgui/dirbrowser.cc index 501296860..9ed8455fe 100644 --- a/rtgui/dirbrowser.cc +++ b/rtgui/dirbrowser.cc @@ -64,7 +64,7 @@ std::vector listSubDirs (const Glib::RefPtr& dir, bool } catch (const Glib::Exception& exception) { if (options.rtSettings.verbose) { - std::cerr << exception.what () << std::endl; + std::cerr << exception.what().c_str() << std::endl; } } From 757c1da2923f7696b79768b963b40d91394faf46 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sat, 10 Nov 2018 21:46:55 +0100 Subject: [PATCH 113/122] Fix a memory leak, #4966 --- rtengine/improccoordinator.cc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index f68629564..ac330db23 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -953,6 +953,11 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) hListener->histogramChanged(histRed, histGreen, histBlue, histLuma, histToneCurve, histLCurve, histCCurve, /*histCLurve, histLLCurve,*/ histLCAM, histCCAM, histRedRaw, histGreenRaw, histBlueRaw, histChroma, histLRETI); } } + if (orig_prev != oprevi) { + delete oprevi; + oprevi = nullptr; + } + } From 83975938ef6984d9722ffe1b3df219c16d8845d1 Mon Sep 17 00:00:00 2001 From: Roel Baars <6567747+Thanatomanic@users.noreply.github.com> Date: Sun, 11 Nov 2018 12:34:12 +0100 Subject: [PATCH 114/122] Don't use boolean logic to increment value directly --- rtengine/dcraw.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index c9bc8ccad..79c0e59f6 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -9138,7 +9138,7 @@ void CLASS identify() parse_fuji (get4()); if (thumb_offset > 120) { fseek (ifp, 120, SEEK_SET); - is_raw += (i = get4()) && 1; + is_raw += (i = get4()) != 0 ? 1 : 0; if (is_raw == 2 && shot_select) parse_fuji (i); } From f179eb83331a3cc930f6e2a4b1b401de02e8a7bf Mon Sep 17 00:00:00 2001 From: Roel Baars <6567747+Thanatomanic@users.noreply.github.com> Date: Sun, 11 Nov 2018 14:48:44 +0100 Subject: [PATCH 115/122] Add safeguards for setjmp calls when compiling with clang --- rtengine/imageio.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index 802365d74..9ac72be58 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -447,7 +447,7 @@ void my_error_exit (j_common_ptr cinfo) (*cinfo->err->output_message) (cinfo); /* Return control to the setjmp point */ -#if defined( WIN32 ) && defined( __x86_64__ ) +#if defined( WIN32 ) && defined( __x86_64__ ) && !defined(__clang__) __builtin_longjmp(myerr->setjmp_buffer, 1); #else longjmp(myerr->setjmp_buffer, 1); @@ -471,7 +471,7 @@ int ImageIO::loadJPEGFromMemory (const char* buffer, int bufsize) jerr.pub.error_exit = my_error_exit; /* Establish the setjmp return context for my_error_exit to use. */ -#if defined( WIN32 ) && defined( __x86_64__ ) +#if defined( WIN32 ) && defined( __x86_64__ ) && !defined(__clang__) if (__builtin_setjmp(jerr.setjmp_buffer)) { #else @@ -1134,7 +1134,7 @@ int ImageIO::saveJPEG (Glib::ustring fname, int quality, int subSamp) jerr.pub.error_exit = my_error_exit; /* Establish the setjmp return context for my_error_exit to use. */ -#if defined( WIN32 ) && defined( __x86_64__ ) +#if defined( WIN32 ) && defined( __x86_64__ ) && !defined(__clang__) if (__builtin_setjmp(jerr.setjmp_buffer)) { #else @@ -1252,7 +1252,7 @@ int ImageIO::saveJPEG (Glib::ustring fname, int quality, int subSamp) unsigned char *row = new unsigned char [rowlen]; /* To avoid memory leaks we establish a new setjmp return context for my_error_exit to use. */ -#if defined( WIN32 ) && defined( __x86_64__ ) +#if defined( WIN32 ) && defined( __x86_64__ ) && !defined(__clang__) if (__builtin_setjmp(jerr.setjmp_buffer)) { #else From efccb23a5c95a0152d61edb275201b26698604cb Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sun, 11 Nov 2018 16:16:59 +0100 Subject: [PATCH 116/122] Change line endings to LF --- rtgui/iccprofilecreator.cc | 2074 ++++++++++++++++++------------------ 1 file changed, 1037 insertions(+), 1037 deletions(-) diff --git a/rtgui/iccprofilecreator.cc b/rtgui/iccprofilecreator.cc index 8d6e09553..23c8472c5 100644 --- a/rtgui/iccprofilecreator.cc +++ b/rtgui/iccprofilecreator.cc @@ -1,1037 +1,1037 @@ -/* - * This file is part of RawTherapee. - * - * Copyright (c) 2018 Jacques DESMIS - * Copyright (c) 2018 Jean-Christophe FRISCH - * - * RawTherapee is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * RawTherapee is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with RawTherapee. If not, see . - */ -#include -#include "iccprofilecreator.h" -#include "multilangmgr.h" -#include "cachemanager.h" -#include "addsetids.h" -#include "../rtengine/icons.h" -#include "../rtengine/color.h" -#include "rtimage.h" -#ifdef _OPENMP -#include -#endif - -extern Options options; - -namespace rtengine -{ - -extern const Settings* settings; - -} - -const char* sTRCPreset[] = {"BT709_g2.2_s4.5", "sRGB_g2.4_s12.92", "linear_g1.0", "standard_g2.2", "standard_g1.8", "High_g1.3_s3.35", "Low_g2.6_s6.9", "Lab_g3.0s9.03296"}; //gamma free - -ICCProfileCreator::ICCProfileCreator(RTWindow *rtwindow) - : Gtk::Dialog (M ("MAIN_BUTTON_ICCPROFCREATOR"), *rtwindow, true) - , primariesPreset(options.ICCPC_primariesPreset) - , redPrimaryX(options.ICCPC_redPrimaryX) - , redPrimaryY(options.ICCPC_redPrimaryY) - , greenPrimaryX(options.ICCPC_greenPrimaryX) - , greenPrimaryY(options.ICCPC_greenPrimaryY) - , bluePrimaryX(options.ICCPC_bluePrimaryX) - , bluePrimaryY(options.ICCPC_bluePrimaryY) - , gammaPreset(options.ICCPC_gammaPreset) - , gamma(options.ICCPC_gamma) - , slope(options.ICCPC_slope) - , appendParamsToDesc(options.ICCPC_appendParamsToDesc) - , profileVersion(options.ICCPC_profileVersion) - , illuminant(options.ICCPC_illuminant) - , description(options.ICCPC_description) - , copyright(options.ICCPC_copyright) - , parent(rtwindow) -{ - - set_default_size(600, -1); - - Gtk::Grid* mainGrid = Gtk::manage(new Gtk::Grid()); - mainGrid->set_column_spacing(3); - mainGrid->set_row_spacing(3); - - //--------------------------------- primaries - - Gtk::Label* prilab = Gtk::manage(new Gtk::Label(M("ICCPROFCREATOR_PRIMARIES"))); - setExpandAlignProperties(prilab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); - mainGrid->attach(*prilab, 0, 0, 1, 1); - - primaries = Gtk::manage(new MyComboBoxText()); - setExpandAlignProperties(primaries, false, false, Gtk::ALIGN_FILL, Gtk::ALIGN_BASELINE); - primaries->append(M("ICCPROFCREATOR_CUSTOM")); - primaries->append(M("ICCPROFCREATOR_PRIM_ACESP0")); - primaries->append(M("ICCPROFCREATOR_PRIM_ACESP1")); - primaries->append(M("ICCPROFCREATOR_PRIM_ADOBE")); - primaries->append(M("ICCPROFCREATOR_PRIM_PROPH")); - primaries->append(M("ICCPROFCREATOR_PRIM_REC2020")); - primaries->append(M("ICCPROFCREATOR_PRIM_SRGB")); - primaries->append(M("ICCPROFCREATOR_PRIM_WIDEG")); - primaries->append(M("ICCPROFCREATOR_PRIM_BEST")); - primaries->append(M("ICCPROFCREATOR_PRIM_BETA")); - primaries->append(M("ICCPROFCREATOR_PRIM_BRUCE")); - primaries->set_tooltip_text(M("ICCPROFCREATOR_PRIM_TOOLTIP")); - mainGrid->attach(*primaries, 1, 0, 1, 1); - - primariesGrid = Gtk::manage(new Gtk::Grid()); - setExpandAlignProperties(primariesGrid, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - primariesGrid->set_column_spacing(5); - - /* - Gtk::Image* gamuts0 = Gtk::manage(new RTImage("rt-logo-tiny.png")); - Gtk::Image* gamutl0 = Gtk::manage(new RTImage("rt-logo-small.png")); - Gtk::Image* gamuts1 = Gtk::manage(new RTImage("rt-logo-tiny.png")); - Gtk::Image* gamutl1 = Gtk::manage(new RTImage("rt-logo-small.png")); - Gtk::Image* gamuts2 = Gtk::manage(new RTImage("rt-logo-tiny.png")); - Gtk::Image* gamutl2 = Gtk::manage(new RTImage("rt-logo-small.png")); - Gtk::Image* gamuts3 = Gtk::manage(new RTImage("rt-logo-tiny.png")); - Gtk::Image* gamutl3 = Gtk::manage(new RTImage("rt-logo-small.png")); - Gtk::Image* gamuts4 = Gtk::manage(new RTImage("rt-logo-tiny.png")); - Gtk::Image* gamutl4 = Gtk::manage(new RTImage("rt-logo-small.png")); - Gtk::Image* gamuts5 = Gtk::manage(new RTImage("rt-logo-tiny.png")); - Gtk::Image* gamutl5 = Gtk::manage(new RTImage("rt-logo-small.png")); - */ - - aPrimariesRedX = Gtk::manage(new Adjuster(M("ICCPROFCREATOR_PRIM_REDX"), 0.6300, 0.7350, 0.0001, 0.6400/*, gamuts0, gamutl0*/)); - setExpandAlignProperties(aPrimariesRedX, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - aPrimariesRedY = Gtk::manage(new Adjuster(M("ICCPROFCREATOR_PRIM_REDY"), 0.2650, 0.3350, 0.0001, 0.3300/*, gamutl1, gamuts1*/)); - setExpandAlignProperties(aPrimariesRedY, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - aPrimariesGreenX = Gtk::manage(new Adjuster(M("ICCPROFCREATOR_PRIM_GREX"), 0.0000, 0.3100, 0.0001, 0.3000/*, gamutl2, gamuts2*/)); - setExpandAlignProperties(aPrimariesGreenX, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - aPrimariesGreenY = Gtk::manage(new Adjuster(M("ICCPROFCREATOR_PRIM_GREY"), 0.5900, 1.0000, 0.0001, 0.6000/*, gamuts3, gamutl3*/)); - setExpandAlignProperties(aPrimariesGreenY, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - aPrimariesBlueX = Gtk::manage(new Adjuster(M("ICCPROFCREATOR_PRIM_BLUX"), 0.0001, 0.1600, 0.0001, 0.1500/*, gamutl4, gamuts4*/)); - setExpandAlignProperties(aPrimariesBlueX, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - aPrimariesBlueY = Gtk::manage(new Adjuster(M("ICCPROFCREATOR_PRIM_BLUY"), -0.0800, 0.0700, 0.0001, 0.060/*, gamutl5, gamuts5*/)); - setExpandAlignProperties(aPrimariesBlueY, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - - primariesGrid->attach(*aPrimariesRedX, 0, 0, 1, 1); - primariesGrid->attach(*aPrimariesRedY, 1, 0, 1, 1); - - primariesGrid->attach(*aPrimariesGreenX, 0, 1, 1, 1); - primariesGrid->attach(*aPrimariesGreenY, 1, 1, 1, 1); - - primariesGrid->attach(*aPrimariesBlueX, 0, 2, 1, 1); - primariesGrid->attach(*aPrimariesBlueY, 1, 2, 1, 1); - - mainGrid->attach(*primariesGrid, 1, 1, 1, 1); - - //--------------------------------- output gamma - - Gtk::Label* galab = Gtk::manage(new Gtk::Label(M("ICCPROFCREATOR_TRC_PRESET"))); - setExpandAlignProperties(galab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); - mainGrid->attach(*galab, 0, 2, 1, 1); - - trcPresets = Gtk::manage(new MyComboBoxText()); - setExpandAlignProperties(trcPresets, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_BASELINE); - std::vector outputTRCPresets; - outputTRCPresets.push_back(M("ICCPROFCREATOR_CUSTOM")); - for (unsigned int i = 0; i < sizeof(sTRCPreset) / sizeof(sTRCPreset[0]); i++) { - outputTRCPresets.push_back(sTRCPreset[i]); - } - for (size_t i = 0; i < outputTRCPresets.size(); i++) { - trcPresets->append(outputTRCPresets[i]); - } - mainGrid->attach(*trcPresets, 1, 2, 1, 1); - - //--------------------------------- sliders gampos and slpos - - aGamma = Gtk::manage(new Adjuster(M("ICCPROFCREATOR_GAMMA"), 1, 3.5, 0.01, 2.4)); - setExpandAlignProperties(aGamma, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_BASELINE); - - if (aGamma->delay < options.adjusterMaxDelay) { - aGamma->delay = options.adjusterMaxDelay; - } - aGamma->show(); - mainGrid->attach(*aGamma, 1, 3, 1, 1); //gamma - - aSlope = Gtk::manage(new Adjuster(M("ICCPROFCREATOR_SLOPE"), 0, 15, 0.00001, 12.92310)); - setExpandAlignProperties(aSlope, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_BASELINE); - - if (aSlope->delay < options.adjusterMaxDelay) { - aSlope->delay = options.adjusterMaxDelay; - } - aSlope->show(); - mainGrid->attach(*aSlope, 1, 4, 1, 1); //slope - - //--------------------------------- temperature - - Gtk::Label* illlab = Gtk::manage(new Gtk::Label(M("ICCPROFCREATOR_ILL"))); - setExpandAlignProperties(illlab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); - mainGrid->attach(*illlab, 0, 5, 1, 1); //slope - cIlluminant = Gtk::manage(new MyComboBoxText()); - setExpandAlignProperties(cIlluminant, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_BASELINE); - cIlluminant->append(M("ICCPROFCREATOR_ILL_DEF")); - cIlluminant->append(M("ICCPROFCREATOR_ILL_41")); - cIlluminant->append(M("ICCPROFCREATOR_ILL_50")); - cIlluminant->append(M("ICCPROFCREATOR_ILL_55")); - cIlluminant->append(M("ICCPROFCREATOR_ILL_60")); - cIlluminant->append(M("ICCPROFCREATOR_ILL_65")); - cIlluminant->append(M("ICCPROFCREATOR_ILL_80")); - cIlluminant->append(M("ICCPROFCREATOR_ILL_INC")); - cIlluminant->set_tooltip_text(M("ICCPROFCREATOR_ILL_TOOLTIP")); - mainGrid->attach(*cIlluminant, 1, 5, 1, 1); - - //--------------------------------- V2 or V4 profiles - - Gtk::Label* proflab = Gtk::manage(new Gtk::Label(M("ICCPROFCREATOR_ICCVERSION"))); - setExpandAlignProperties(proflab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); - mainGrid->attach(*proflab, 0, 6, 1, 1); - iccVersion = Gtk::manage(new MyComboBoxText()); - setExpandAlignProperties(iccVersion, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_BASELINE); - iccVersion->append(M("ICCPROFCREATOR_PROF_V4")); - iccVersion->append(M("ICCPROFCREATOR_PROF_V2")); - mainGrid->attach(*iccVersion, 1, 6, 1, 1); - - //--------------------------------- Description - - Gtk::Label* desclab = Gtk::manage(new Gtk::Label(M("ICCPROFCREATOR_DESCRIPTION"))); - setExpandAlignProperties(desclab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_START); - mainGrid->attach(*desclab, 0, 7, 1, 2); - eDescription = Gtk::manage(new Gtk::Entry()); - setExpandAlignProperties(eDescription, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - eDescription->set_tooltip_text(M("ICCPROFCREATOR_DESCRIPTION_TOOLTIP")); - mainGrid->attach(*eDescription, 1, 7, 1, 1); - cAppendParamsToDesc = Gtk::manage(new Gtk::CheckButton(M("ICCPROFCREATOR_DESCRIPTION_ADDPARAM"))); - setExpandAlignProperties(cAppendParamsToDesc, true, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); - mainGrid->attach(*cAppendParamsToDesc, 1, 8, 1, 1); - - //--------------------------------- Copyright - - Gtk::Label* copylab = Gtk::manage(new Gtk::Label(M("ICCPROFCREATOR_COPYRIGHT"))); - setExpandAlignProperties(copylab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); - mainGrid->attach(*copylab, 0, 9, 1, 1); - Gtk::Grid* copygrid = Gtk::manage(new Gtk::Grid()); - setExpandAlignProperties(copygrid, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); - eCopyright = Gtk::manage(new Gtk::Entry()); - setExpandAlignProperties(eCopyright, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - copygrid->attach(*eCopyright, 0, 0, 1, 1); - resetCopyright = Gtk::manage(new Gtk::Button()); - resetCopyright->add (*Gtk::manage (new RTImage ("undo-small.png", "redo-small.png"))); - setExpandAlignProperties(resetCopyright, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); - resetCopyright->set_relief (Gtk::RELIEF_NONE); - resetCopyright->set_tooltip_markup (M("ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP")); - resetCopyright->get_style_context()->add_class(GTK_STYLE_CLASS_FLAT); - resetCopyright->set_can_focus(false); - copygrid->attach(*resetCopyright, 1, 0, 1, 1); - mainGrid->attach(*copygrid, 1, 9, 1, 1); - - //--------------------------------- Adding the mainGrid - - get_content_area()->add(*mainGrid); - - //--------------------------------- Setting default values for Adjusters - - aGamma->setDefault(gamma); - aSlope->setDefault(slope); - aPrimariesRedX->setDefault(redPrimaryX); - aPrimariesRedY->setDefault(redPrimaryY); - aPrimariesGreenX->setDefault(greenPrimaryX); - aPrimariesGreenY->setDefault(greenPrimaryY); - aPrimariesBlueX->setDefault(bluePrimaryX); - aPrimariesBlueY->setDefault(bluePrimaryY); - - //--------------- Updating widgets with actual values (from options) - - if (primariesPreset == "custom") { - primaries->set_active_text(M("ICCPROFCREATOR_CUSTOM")); - } else if (primariesPreset == "ACES-AP0") { - primaries->set_active_text(M("ICCPROFCREATOR_PRIM_ACESP0")); - } else if (primariesPreset == "ACES-AP1") { - primaries->set_active_text(M("ICCPROFCREATOR_PRIM_ACESP1")); - } else if (primariesPreset == "Adobe") { - primaries->set_active_text(M("ICCPROFCREATOR_PRIM_ADOBE")); - } else if (primariesPreset == "ProPhoto") { - primaries->set_active_text(M("ICCPROFCREATOR_PRIM_PROPH")); - } else if (primariesPreset == "Rec2020") { - primaries->set_active_text(M("ICCPROFCREATOR_PRIM_REC2020")); - } else if (primariesPreset == "sRGB") { - primaries->set_active_text(M("ICCPROFCREATOR_PRIM_SRGB")); - } else if (primariesPreset == "Widegamut") { - primaries->set_active_text(M("ICCPROFCREATOR_PRIM_WIDEG")); - } else if (primariesPreset == "BestRGB") { - primaries->set_active_text(M("ICCPROFCREATOR_PRIM_BEST")); - } else if (primariesPreset == "BetaRGB") { - primaries->set_active_text(M("ICCPROFCREATOR_PRIM_BETA")); - } else if (primariesPreset == "BruceRGB") { - primaries->set_active_text(M("ICCPROFCREATOR_PRIM_BRUCE")); - } - - trcPresets->set_active(0); - if (gammaPreset != "Custom") { - trcPresets->set_active_text(gammaPreset); - } - - aGamma->setValue(gamma); - aSlope->setValue(slope); - aPrimariesRedX->setValue(redPrimaryX); - aPrimariesRedY->setValue(redPrimaryY); - aPrimariesGreenX->setValue(greenPrimaryX); - aPrimariesGreenY->setValue(greenPrimaryY); - aPrimariesBlueX->setValue(bluePrimaryX); - aPrimariesBlueY->setValue(bluePrimaryY); - - eDescription->set_text(description); - eCopyright->set_text(copyright); - cAppendParamsToDesc->set_active(appendParamsToDesc); - - if (illuminant == "DEF") { - cIlluminant->set_active_text(M("ICCPROFCREATOR_ILL_DEF")); - } else if (illuminant == "D41") { - cIlluminant->set_active_text(M("ICCPROFCREATOR_ILL_41")); - } else if (illuminant == "D50") { - cIlluminant->set_active_text(M("ICCPROFCREATOR_ILL_50")); - } else if (illuminant == "D55") { - cIlluminant->set_active_text(M("ICCPROFCREATOR_ILL_55")); - } else if (illuminant == "D60") { - cIlluminant->set_active_text(M("ICCPROFCREATOR_ILL_60")); - } else if (illuminant == "D65") { - cIlluminant->set_active_text(M("ICCPROFCREATOR_ILL_65")); - } else if (illuminant == "D80") { - cIlluminant->set_active_text(M("ICCPROFCREATOR_ILL_80")); - } else if (illuminant == "stdA") { - cIlluminant->set_active_text(M("ICCPROFCREATOR_ILL_INC")); - } - - iccVersion->set_active(0); - if (profileVersion == "v2") { - iccVersion->set_active(1); - } - - trcPresetsChanged(); - illuminantChanged(); - primariesChanged(); - - //--------------- Action area button - - Gtk::Button* save = Gtk::manage (new Gtk::Button (M ("GENERAL_SAVE_AS"))); - save->signal_clicked().connect ( sigc::mem_fun (*this, &ICCProfileCreator::savePressed) ); - get_action_area()->pack_start (*save); - - Gtk::Button* close = Gtk::manage (new Gtk::Button (M ("GENERAL_CLOSE"))); - close->signal_clicked().connect ( sigc::mem_fun (*this, &ICCProfileCreator::closePressed) ); - get_action_area()->pack_start (*close); - - //--------------- Show childrens - - show_all_children (); - - //--------------- Connecting the signals - - aPrimariesRedX->setAdjusterListener(this); - aPrimariesRedY->setAdjusterListener(this); - aPrimariesGreenX->setAdjusterListener(this); - aPrimariesGreenY->setAdjusterListener(this); - aPrimariesBlueX->setAdjusterListener(this); - aPrimariesBlueY->setAdjusterListener(this); - aGamma->setAdjusterListener(this); - aSlope->setAdjusterListener(this); - primariesconn = primaries->signal_changed().connect(sigc::mem_fun(*this, &ICCProfileCreator::primariesChanged)); - trcpresetsconn = trcPresets->signal_changed().connect(sigc::mem_fun(*this, &ICCProfileCreator::trcPresetsChanged)); - illconn = cIlluminant->signal_changed().connect(sigc::mem_fun(*this, &ICCProfileCreator::illuminantChanged)); - resetCopyright->signal_clicked().connect(sigc::mem_fun(*this, &ICCProfileCreator::onResetCopyright)); -} - -void ICCProfileCreator::closePressed() -{ - storeValues(); - hide(); -} - -void ICCProfileCreator::updateICCVersion() -{ - if (cIlluminant->get_active_text() != M("ICCPROFCREATOR_ILL_DEF") || primaries->get_active_text() == M("ICCPROFCREATOR_CUSTOM")) { - iccVersion->set_active_text(M("ICCPROFCREATOR_PROF_V4")); - iccVersion->set_sensitive(false); - } else { - iccVersion->set_sensitive(true); - } -} - -void ICCProfileCreator::adjusterChanged(Adjuster* a, double newval) -{ - if (a == aPrimariesRedX || a == aPrimariesRedY || - a == aPrimariesGreenX || a == aPrimariesGreenY || - a == aPrimariesBlueX || a == aPrimariesBlueY) - { - if (primaries->get_active_row_number() > 0) { - ConnectionBlocker blocker(primariesconn); - primaries->set_active(0); - updateICCVersion(); - } - } else if (a == aGamma || a == aSlope) { - if (trcPresets->get_active_row_number() > 0) { - ConnectionBlocker blocker(trcpresetsconn); - trcPresets->set_active(0); - } - } -} - -void ICCProfileCreator::adjusterAutoToggled(Adjuster* a, bool newval) -{ -} - -void ICCProfileCreator::primariesChanged() -{ - if (primaries->get_active_row_number() > 0) { - float p[6]; - ColorTemp temp; - Glib::ustring activeValue = primaries->get_active_text(); - Glib::ustring primPresetName = getPrimariesPresetName(activeValue); - getPrimaries(primPresetName, p, temp); - aPrimariesRedX->setValue(p[0]); - aPrimariesRedY->setValue(p[1]); - aPrimariesGreenX->setValue(p[2]); - aPrimariesGreenY->setValue(p[3]); - aPrimariesBlueX->setValue(p[4]); - aPrimariesBlueY->setValue(p[5]); - } - updateICCVersion(); -} - -void ICCProfileCreator::illuminantChanged() -{ - updateICCVersion(); -} - -void ICCProfileCreator::trcPresetsChanged() -{ - aGamma->block(true); - aSlope->block(true); - - double gamma; - double slope; - getGamma(getGammaPresetName(trcPresets->get_active_text()), gamma, slope); - aGamma->setValue(gamma); - aSlope->setValue(slope); - - aGamma->block(false); - aSlope->block(false); -} - -void ICCProfileCreator::storeValues() -{ - if (iccVersion->get_active_text() == M("ICCPROFCREATOR_PROF_V4")) { - options.ICCPC_profileVersion = profileVersion = "v4"; - } else if (iccVersion->get_active_text() == M("ICCPROFCREATOR_PROF_V2")) { - options.ICCPC_profileVersion = profileVersion = "v2"; - } - - if (cIlluminant->get_active_text() == M("ICCPROFCREATOR_ILL_DEF")) { - options.ICCPC_illuminant = illuminant = "DEF"; - } else if (cIlluminant->get_active_text() == M("ICCPROFCREATOR_ILL_41")) { - options.ICCPC_illuminant = illuminant = "D41"; - } else if (cIlluminant->get_active_text() == M("ICCPROFCREATOR_ILL_50")) { - options.ICCPC_illuminant = illuminant = "D50"; - } else if (cIlluminant->get_active_text() == M("ICCPROFCREATOR_ILL_55")) { - options.ICCPC_illuminant = illuminant = "D55"; - } else if (cIlluminant->get_active_text() == M("ICCPROFCREATOR_ILL_60")) { - options.ICCPC_illuminant = illuminant = "D60"; - } else if (cIlluminant->get_active_text() == M("ICCPROFCREATOR_ILL_65")) { - options.ICCPC_illuminant = illuminant = "D65"; - } else if (cIlluminant->get_active_text() == M("ICCPROFCREATOR_ILL_80")) { - options.ICCPC_illuminant = illuminant = "D80"; - } else if (cIlluminant->get_active_text() == M("ICCPROFCREATOR_ILL_INC")) { - options.ICCPC_illuminant = illuminant = "stdA"; - } - - options.ICCPC_primariesPreset = primariesPreset = getPrimariesPresetName(primaries->get_active_text()); - options.ICCPC_gammaPreset = gammaPreset = getGammaPresetName(trcPresets->get_active_text()); - options.ICCPC_gamma = gamma = aGamma->getValue(); - options.ICCPC_slope = slope = aSlope->getValue(); - options.ICCPC_redPrimaryX = redPrimaryX = aPrimariesRedX->getValue(); - options.ICCPC_redPrimaryY = redPrimaryY = aPrimariesRedY->getValue(); - options.ICCPC_greenPrimaryX = greenPrimaryX = aPrimariesGreenX->getValue(); - options.ICCPC_greenPrimaryY = greenPrimaryY = aPrimariesGreenY->getValue(); - options.ICCPC_bluePrimaryX = bluePrimaryX = aPrimariesBlueX->getValue(); - options.ICCPC_bluePrimaryY = bluePrimaryY = aPrimariesBlueY->getValue(); - options.ICCPC_description = description = eDescription->get_text(); - options.ICCPC_copyright = copyright = eCopyright->get_text(); - options.ICCPC_appendParamsToDesc = appendParamsToDesc = cAppendParamsToDesc->get_active(); -} - -Glib::ustring ICCProfileCreator::getPrimariesPresetName(const Glib::ustring &preset) -{ - if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_ACESP0")) { - return Glib::ustring("ACES-AP0"); - } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_ACESP1")) { - return Glib::ustring("ACES-AP1"); - } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_ADOBE")) { - return Glib::ustring("Adobe"); - } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_PROPH")) { - return Glib::ustring("ProPhoto"); - } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_REC2020")) { - return Glib::ustring("Rec2020"); - } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_SRGB")) { - return Glib::ustring("sRGB"); - } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_WIDEG")) { - return Glib::ustring("Widegamut"); - } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_BEST")) { - return Glib::ustring("BestRGB"); - } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_BETA")) { - return Glib::ustring("BetaRGB"); - } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_BRUCE")) { - return Glib::ustring("BruceRGB"); - } else if (primaries->get_active_text() == M("ICCPROFCREATOR_CUSTOM")) { - return Glib::ustring("custom"); - } else { - return Glib::ustring(); - } -} - -void ICCProfileCreator::getPrimaries(const Glib::ustring &preset, float *p, ColorTemp &temp) -{ - temp = ColorTemp::D50; - if (preset == "Widegamut") { - p[0] = 0.7350; //Widegamut primaries - p[1] = 0.2650; - p[2] = 0.1150; - p[3] = 0.8260; - p[4] = 0.1570; - p[5] = 0.0180; - - } else if (preset == "Adobe") { - p[0] = 0.6400; //Adobe primaries - p[1] = 0.3300; - p[2] = 0.2100; - p[3] = 0.7100; - p[4] = 0.1500; - p[5] = 0.0600; - temp = ColorTemp::D65; - } else if (preset == "sRGB") { - p[0] = 0.6400; // sRGB primaries - p[1] = 0.3300; - p[2] = 0.3000; - p[3] = 0.6000; - p[4] = 0.1500; - p[5] = 0.0600; - temp = ColorTemp::D65; - } else if (preset == "BruceRGB") { - p[0] = 0.6400; // Bruce primaries - p[1] = 0.3300; - p[2] = 0.2800; - p[3] = 0.6500; - p[4] = 0.1500; - p[5] = 0.0600; - temp = ColorTemp::D65; - } else if (preset == "BetaRGB") { - p[0] = 0.6888; // Beta primaries - p[1] = 0.3112; - p[2] = 0.1986; - p[3] = 0.7551; - p[4] = 0.1265; - p[5] = 0.0352; - } else if (preset == "BestRGB") { - p[0] = 0.7347; // Best primaries - p[1] = 0.2653; - p[2] = 0.2150; - p[3] = 0.7750; - p[4] = 0.1300; - p[5] = 0.0350; - } else if (preset == "Rec2020") { - p[0] = 0.7080; // Rec2020 primaries - p[1] = 0.2920; - p[2] = 0.1700; - p[3] = 0.7970; - p[4] = 0.1310; - p[5] = 0.0460; - temp = ColorTemp::D65; - } else if (preset == "ACES-AP0") { - p[0] = 0.7347; // ACES P0 primaries - p[1] = 0.2653; - p[2] = 0.0000; - p[3] = 1.0; - p[4] = 0.0001; - p[5] = -0.0770; - temp = ColorTemp::D60; - } else if (preset == "ACES-AP1") { - p[0] = 0.713; // ACES P1 primaries - p[1] = 0.293; - p[2] = 0.165; - p[3] = 0.830; - p[4] = 0.128; - p[5] = 0.044; - temp = ColorTemp::D60; - } else if (preset == "ProPhoto") { - p[0] = 0.7347; // ProPhoto and default primaries - p[1] = 0.2653; - p[2] = 0.1596; - p[3] = 0.8404; - p[4] = 0.0366; - p[5] = 0.0001; - } else if (preset == "custom") { - p[0] = redPrimaryX; - p[1] = redPrimaryY; - p[2] = greenPrimaryX; - p[3] = greenPrimaryY; - p[4] = bluePrimaryX; - p[5] = bluePrimaryY; - - } else { - p[0] = 0.7347; //default primaries - p[1] = 0.2653; - p[2] = 0.1596; - p[3] = 0.8404; - p[4] = 0.0366; - p[5] = 0.0001; - } -} - -Glib::ustring ICCProfileCreator::getGammaPresetName(const Glib::ustring &preset) -{ - Glib::ustring name(trcPresets->get_active_text()); - if (name == M("ICCPROFCREATOR_CUSTOM")) { - name = "Custom"; - } - return name; -} - -void ICCProfileCreator::getGamma(const Glib::ustring &preset, double &presetGamma, double &presetSlope) -{ - if (preset == "High_g1.3_s3.35") { - presetGamma = 1.3; - presetSlope = 3.35; - } else if (preset == "Low_g2.6_s6.9") { - presetGamma = 2.6; - presetSlope = 6.9; - } else if (preset == "sRGB_g2.4_s12.92") { - presetGamma = 2.4; - presetSlope = 12.92310; - } else if (preset == "BT709_g2.2_s4.5") { - presetGamma = 2.22; - presetSlope = 4.5; - } else if (preset == "linear_g1.0") { - presetGamma = 1.; - presetSlope = 0.; - } else if (preset == "standard_g2.2") { - presetGamma = 2.2; - presetSlope = 0.; - } else if (preset == "standard_g1.8") { - presetGamma = 1.8; - presetSlope = 0.; - } else if (preset == "Lab_g3.0s9.03296") { - presetGamma = 3.0; - presetSlope = 9.03296; - } else if (preset == "Custom") { - presetGamma = gamma; - presetSlope = slope; - } else { - presetGamma = 2.4; - presetSlope = 12.92310; - } -} - -void ICCProfileCreator::onResetCopyright() -{ - eCopyright->set_text(Options::getICCProfileCopyright()); -} - -// Copyright (c) 2018 Jacques DESMIS -// WARNING: the caller must lock lcmsMutex -void ICCProfileCreator::savePressed() -{ - cmsHPROFILE newProfile = nullptr; - Glib::ustring sNewProfile; - Glib::ustring sPrimariesPreset; - Glib::ustring sGammaPreset; - - storeValues(); - - // -------------------------------------------- Compute the default file name - - //necessary for V2 profile - if (primariesPreset == "ACES-AP0" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.ACESp0)) { - sNewProfile = options.rtSettings.ACESp0; - sPrimariesPreset = "ACES-AP0"; - } else if (primariesPreset == "ACES-AP1" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.ACESp1)) { - sNewProfile = options.rtSettings.ACESp1; - sPrimariesPreset = "ACES-AP1"; - } else if (primariesPreset == "Adobe" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.adobe)) { - sNewProfile = options.rtSettings.adobe; - sPrimariesPreset = "Medium"; - } else if (primariesPreset == "ProPhoto" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.prophoto)) { - sNewProfile = options.rtSettings.prophoto; - sPrimariesPreset = "Large"; - } else if (primariesPreset == "Rec2020" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.rec2020)) { - sNewProfile = options.rtSettings.rec2020; - sPrimariesPreset = "Rec2020"; - } else if (primariesPreset == "sRGB" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.srgb)) { - sNewProfile = options.rtSettings.srgb; - sPrimariesPreset = "sRGB"; - } else if (primariesPreset == "Widegamut" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.widegamut)) { - sNewProfile = options.rtSettings.widegamut; - sPrimariesPreset = "Wide"; - } else if (primariesPreset == "BestRGB" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.best)) { - sNewProfile = options.rtSettings.best; - sPrimariesPreset = "Best"; - } else if (primariesPreset == "BetaRGB" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.beta)) { - sNewProfile = options.rtSettings.beta; - sPrimariesPreset = "Beta"; - } else if (primariesPreset == "BruceRGB" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.bruce)) { - sNewProfile = options.rtSettings.bruce; - sPrimariesPreset = "Bruce"; - } else if (primariesPreset == "custom") { - sNewProfile = options.rtSettings.srgb; - sPrimariesPreset = "Custom"; - } else { - // Should not occurs - if (rtengine::settings->verbose) { - printf("\"%s\": unknown working profile! - use LCMS2 substitution\n", primariesPreset.c_str()); - } - return; - } - - //begin adaptation rTRC gTRC bTRC - //"newProfile" profile has the same characteristics than RGB values, but TRC are adapted... for applying profile - if (rtengine::settings->verbose) { - printf("Output Gamma - profile Primaries as RT profile: \"%s\"\n", sNewProfile.c_str()); - } - - newProfile = rtengine::ICCStore::getInstance()->getProfile(sNewProfile); //get output profile - - if (newProfile == nullptr) { - - if (rtengine::settings->verbose) { - printf("\"%s\" ICC output profile not found!\n", sNewProfile.c_str()); - } - return; - } - - //change desc Tag , to "free gamma", or "BT709", etc. - Glib::ustring fName; - Glib::ustring sPrimariesAndIlluminant; - double presetGamma = 2.4; - double presetSlope = 12.92310; - const double eps = 0.000000001; // not divide by zero - getGamma(gammaPreset, presetGamma, presetSlope); - if (gammaPreset == "High_g1.3_s3.35") { - sGammaPreset = "High_g=1.3_s=3.35"; - ga[0] = 1.3 ; //for high dynamic images - ga[1] = 0.998279; - ga[2] = 0.001721; - ga[3] = 0.298507; - ga[4] = 0.005746; - } else if (gammaPreset == "Low_g2.6_s6.9") { - sGammaPreset = "Low_g=2.6_s=6.9"; - ga[0] = 2.6 ; //gamma 2.6 variable : for low contrast images - ga[1] = 0.891161; - ga[2] = 0.108839; - ga[3] = 0.144928; - ga[4] = 0.076332; - } else if (gammaPreset == "sRGB_g2.4_s12.92") { - sGammaPreset = "sRGB_g=2.4_s=12.92310"; - ga[0] = 2.40; //sRGB 2.4 12.92 - RT default as Lightroom - ga[1] = 0.947858; - ga[2] = 0.052142; - ga[3] = 0.077399; - ga[4] = 0.039293; - } else if (gammaPreset == "BT709_g2.2_s4.5") { - sGammaPreset = "BT709_g=2.2_s=4.5"; - ga[0] = 2.22; //BT709 2.2 4.5 - my preferred as D.Coffin - ga[1] = 0.909995; - ga[2] = 0.090005; - ga[3] = 0.222222; - ga[4] = 0.081071; - } else if (gammaPreset == "linear_g1.0") { - sGammaPreset = "Linear_g=1.0"; - ga[0] = 1.0; //gamma=1 linear : for high dynamic images (cf D.Coffin...) - ga[1] = 1.; - ga[2] = 0.; - ga[3] = 1. / eps; - ga[4] = 0.; - } else if (gammaPreset == "standard_g2.2") { - sGammaPreset = "g=2.2"; - ga[0] = 2.2; //gamma=2.2(as gamma of Adobe, Widegamut...) - ga[1] = 1.; - ga[2] = 0.; - ga[3] = 1. / eps; - ga[4] = 0.; - } else if (gammaPreset == "standard_g1.8") { - sGammaPreset = "g=1.8"; - ga[0] = 1.8; //gamma=1.8(as gamma of Prophoto) - ga[1] = 1.; - ga[2] = 0.; - ga[3] = 1. / eps; - ga[4] = 0.; - } else if (gammaPreset == "Lab_g3.0s9.03296") { - sGammaPreset = "LAB_g3.0_s9.03296"; - ga[0] = 3.0; //Lab gamma =3 slope=9.03296 - ga[1] = 0.8621; - ga[2] = 0.1379; - ga[3] = 0.1107; - ga[4] = 0.08; - } else if (gammaPreset == "Custom") { - rtengine::GammaValues g_a; //gamma parameters - double pwr = 1.0 / gamma; - double ts = slope; - double slope2 = slope == 0 ? eps : slope; - - int mode = 0; - rtengine::Color::calcGamma(pwr, ts, mode, g_a); // call to calcGamma with selected gamma and slope : return parameters for LCMS2 - ga[4] = g_a[3] * ts; - //printf("g_a.gamma0=%f g_a.gamma1=%f g_a.gamma2=%f g_a.gamma3=%f g_a.gamma4=%f\n", g_a.gamma0,g_a.gamma1,g_a.gamma2,g_a.gamma3,g_a.gamma4); - ga[0] = gamma; - ga[1] = 1. /(1.0 + g_a[4]); - ga[2] = g_a[4] /(1.0 + g_a[4]); - ga[3] = 1. / slope2; - //printf("ga[0]=%f ga[1]=%f ga[2]=%f ga[3]=%f ga[4]=%f\n", ga[0],ga[1],ga[2],ga[3],ga[4]); - - sGammaPreset = Glib::ustring::compose("g%1_s%2", - Glib::ustring::format (std::setw(3), std::fixed, std::setprecision(2), gamma), - Glib::ustring::format (std::setw(6), std::fixed, std::setprecision(5), slope)); - presetGamma = gamma; - presetSlope = slope; - } - ga[5] = 0.0; - ga[6] = 0.0; - - - sPrimariesAndIlluminant = sPrimariesPreset; - - if (profileVersion == "v4" && illuminant != "DEF") { - sPrimariesPreset += "-" + illuminant; - // printf("outpr=%s \n",outPr.c_str()); - } - - Glib::ustring profileDesc; - Glib::ustring sGammaSlopeParam;//to save gamma and slope in a dmdd - Glib::ustring sGammaSlopeDesc; //to save gamma and slope in a desc - Glib::ustring sGamma; - Glib::ustring sSlope; - - if (gammaPreset == "Custom") { - sGamma = Glib::ustring::format (std::setw(3), std::fixed, std::setprecision(2), gamma); - sSlope = Glib::ustring::format (std::setw(6), std::fixed, std::setprecision(5), slope); - fName = Glib::ustring::compose("RT%1_%2_g%3_s%4.icc", profileVersion, sPrimariesAndIlluminant, sGamma, sSlope); - profileDesc = sPrimariesPreset; - } else { - sGamma = Glib::ustring::format (std::setw(3), std::fixed, std::setprecision(2), presetGamma); - sSlope = Glib::ustring::format (std::setw(6), std::fixed, std::setprecision(5), presetSlope); - fName = Glib::ustring::compose("RT%1_%2_%3.icc", profileVersion, sPrimariesAndIlluminant, sGammaPreset); - profileDesc == sPrimariesPreset + sGammaPreset; - } - sGammaSlopeParam = Glib::ustring::compose("g%1s%2!", sGamma, sSlope); - sGammaSlopeDesc = Glib::ustring::compose("g=%1 s=%2", sGamma, sSlope); - - // -------------------------------------------- Asking the file name - - Gtk::FileChooserDialog dialog(getToplevelWindow(this), M("ICCPROFCREATOR_SAVEDIALOG_TITLE"), Gtk::FILE_CHOOSER_ACTION_SAVE); - bindCurrentFolder(dialog, options.lastICCProfCreatorDir); - dialog.set_current_name(fName); - //dialog.set_current_folder(lastPath); - - dialog.add_button(M("GENERAL_CANCEL"), Gtk::RESPONSE_CANCEL); - dialog.add_button(M("GENERAL_SAVE"), Gtk::RESPONSE_OK); - - Glib::RefPtr filter_icc = Gtk::FileFilter::create(); - filter_icc->set_name(M("FILECHOOSER_FILTER_COLPROF")); - filter_icc->add_pattern("*.icc"); - dialog.add_filter(filter_icc); - - /* - Glib::RefPtr filter_any = Gtk::FileFilter::create(); - filter_any->set_name(M("FILECHOOSER_FILTER_ANY")); - filter_any->add_pattern("*"); - dialog.add_filter(filter_any); - */ - - dialog.show_all_children(); - //dialog.set_do_overwrite_confirmation (true); - - Glib::ustring absoluteFName; - - do { - int result = dialog.run(); - - if (result != Gtk::RESPONSE_OK) { - return; - } else { - absoluteFName = dialog.get_filename(); - Glib::ustring ext = getExtension(absoluteFName); - - if (ext != "icc") { - absoluteFName += ".icc"; - } - - if (confirmOverwrite(dialog, absoluteFName)) { - //lastPath = Glib::path_get_dirname(absoluteFName); - break; - } - } - } while (1); - - // --------------- main tags ------------------ - - if (profileVersion == "v4") { - cmsSetProfileVersion(newProfile, 4.3); - } else { - cmsSetProfileVersion(newProfile, 2.0); - } - -//change - float p[6]; //primaries - ga[6] = 0.0; - - ColorTemp temp; - getPrimaries(primariesPreset, p, temp); - - cmsCIExyY xyD; - cmsCIExyYTRIPLE Primaries = { - {p[0], p[1], 1.0}, // red - {p[2], p[3], 1.0}, // green - {p[4], p[5], 1.0} // blue - }; - - if (profileVersion == "v4" && illuminant != "DEF") { - double tempv4 = 5000.; - if (illuminant == "D41") { - tempv4 = 4100.; - } else if (illuminant == "D50") { - tempv4 = 5003.; - } else if (illuminant == "D55") { - tempv4 = 5500.; - } else if (illuminant == "D60") { - tempv4 = 6004.; - } else if (illuminant == "D65") { - tempv4 = 6504.; - } else if (illuminant == "D80") { - tempv4 = 8000.; - } else if (illuminant == "stdA") { - tempv4 = 5003.; - } - cmsWhitePointFromTemp(&xyD, tempv4); - } else { - cmsWhitePointFromTemp(&xyD, (double)temp); - } - - if (illuminant == "stdA") { - xyD = {0.447573, 0.407440, 1.0}; - } - - // Calculate output profile's rTRC gTRC bTRC - cmsToneCurve* GammaTRC[3]; - GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildParametricToneCurve(nullptr, 5, ga); - - if (profileVersion == "v4") { - newProfile = cmsCreateRGBProfile(&xyD, &Primaries, GammaTRC); - } - - cmsWriteTag(newProfile, cmsSigRedTRCTag, GammaTRC[0]); - cmsWriteTag(newProfile, cmsSigGreenTRCTag, GammaTRC[1]); - cmsWriteTag(newProfile, cmsSigBlueTRCTag, GammaTRC[2]); - - // --------------- set dmnd tag ------------------ - - cmsMLU *dmnd; - dmnd = cmsMLUalloc(nullptr, 1); - cmsMLUsetASCII(dmnd, "en", "US", "RawTherapee"); - cmsWriteTag(newProfile, cmsSigDeviceMfgDescTag, dmnd); - cmsMLUfree(dmnd); - - // --------------- set dmdd tag ------------------ - - if (profileVersion == "v2") { - //write in tag 'dmdd' values of current gamma and slope to retrieve after in Output profile - std::wostringstream wGammaSlopeParam; - wGammaSlopeParam << sGammaSlopeParam; - - cmsMLU *dmdd = cmsMLUalloc(nullptr, 1); - // Language code (2 letters code) : https://www.iso.org/obp/ui/ - // Country code (2 letters code) : http://www.loc.gov/standards/iso639-2/php/code_list.php - if (sGammaSlopeParam.is_ascii()) { - if (cmsMLUsetASCII(dmdd, "en", "US", sGammaSlopeParam.c_str())) { - if (!cmsWriteTag(newProfile, cmsSigProfileDescriptionTag, dmdd)) { - printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); - } - } - } else if (cmsMLUsetWide(dmdd, "en", "US", wGammaSlopeParam.str().c_str())) { - if (!cmsWriteTag(newProfile, cmsSigDeviceModelDescTag, dmdd)) { - printf("Error: Can't write cmsSigDeviceModelDescTag!\n"); - } - } else { - printf("Error: cmsMLUsetWide failed for dmdd \"%s\" !\n", sGammaSlopeParam.c_str()); - } - cmsMLUfree(dmdd); - } - - // --------------- set desc tag ------------------ - - Glib::ustring sDescription; - if (!description.empty()) { - if (cAppendParamsToDesc->get_active()) { - sDescription = description + " / " + sGammaSlopeDesc; - } else { - sDescription = description; - } - } else { - if (cAppendParamsToDesc->get_active()) { - sDescription = profileDesc + " / " + sGammaSlopeDesc; - } else { - sDescription = profileDesc; - } - } - - //write in tag 'dmdd' values of current gamma and slope to retrieve after in Output profile - std::wostringstream wDescription; - wDescription << sDescription; - - cmsMLU *descMLU = cmsMLUalloc(nullptr, 1); - // Language code (2 letters code) : https://www.iso.org/obp/ui/ - // Country code (2 letters code) : http://www.loc.gov/standards/iso639-2/php/code_list.php - if (sDescription.is_ascii()) { - if (cmsMLUsetASCII(descMLU, "en", "US", sDescription.c_str())) { - if (!cmsWriteTag(newProfile, cmsSigProfileDescriptionTag, descMLU)) { - printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); - } - } - } else if (cmsMLUsetWide(descMLU, "en", "US", wDescription.str().c_str())) { - if (!cmsWriteTag(newProfile, cmsSigProfileDescriptionTag, descMLU)) { - printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); - } - } else { - printf("Error: cmsMLUsetWide failed for desc \"%s\" !\n", sDescription.c_str()); - } - cmsMLUfree(descMLU); - - // --------------- set cprt tag ------------------ - - std::wostringstream wCopyright; - wCopyright << copyright; - - cmsMLU *copyMLU = cmsMLUalloc(nullptr, 1); - if (cmsMLUsetWide(copyMLU, "en", "US", wCopyright.str().c_str())) { - if (!cmsWriteTag(newProfile, cmsSigCopyrightTag, copyMLU)) { - printf("Error: Can't write cmsSigCopyrightTag!\n"); - } - } else { - printf("Error: cmsMLUsetWide failed for cprt \"%s\" !\n", copyright.c_str()); - } - cmsMLUfree(copyMLU); - - - /* //to read XYZ values - cmsCIEXYZ *redT = static_cast(cmsReadTag(newProfile, cmsSigRedMatrixColumnTag)); - cmsCIEXYZ *greenT = static_cast(cmsReadTag(newProfile, cmsSigGreenMatrixColumnTag)); - cmsCIEXYZ *blueT = static_cast(cmsReadTag(newProfile, cmsSigBlueMatrixColumnTag)); - printf("rx=%f gx=%f bx=%f ry=%f gy=%f by=%f rz=%f gz=%f bz=%f\n", redT->X, greenT->X, blueT->X, redT->Y, greenT->Y, blueT->Y, redT->Z, greenT->Z, blueT->Z); - */ - - cmsSaveProfileToFile(newProfile, absoluteFName.c_str()); - - cmsFreeToneCurve(GammaTRC[0]); -} +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2018 Jacques DESMIS + * Copyright (c) 2018 Jean-Christophe FRISCH + * + * RawTherapee is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RawTherapee is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RawTherapee. If not, see . + */ +#include +#include "iccprofilecreator.h" +#include "multilangmgr.h" +#include "cachemanager.h" +#include "addsetids.h" +#include "../rtengine/icons.h" +#include "../rtengine/color.h" +#include "rtimage.h" +#ifdef _OPENMP +#include +#endif + +extern Options options; + +namespace rtengine +{ + +extern const Settings* settings; + +} + +const char* sTRCPreset[] = {"BT709_g2.2_s4.5", "sRGB_g2.4_s12.92", "linear_g1.0", "standard_g2.2", "standard_g1.8", "High_g1.3_s3.35", "Low_g2.6_s6.9", "Lab_g3.0s9.03296"}; //gamma free + +ICCProfileCreator::ICCProfileCreator(RTWindow *rtwindow) + : Gtk::Dialog (M ("MAIN_BUTTON_ICCPROFCREATOR"), *rtwindow, true) + , primariesPreset(options.ICCPC_primariesPreset) + , redPrimaryX(options.ICCPC_redPrimaryX) + , redPrimaryY(options.ICCPC_redPrimaryY) + , greenPrimaryX(options.ICCPC_greenPrimaryX) + , greenPrimaryY(options.ICCPC_greenPrimaryY) + , bluePrimaryX(options.ICCPC_bluePrimaryX) + , bluePrimaryY(options.ICCPC_bluePrimaryY) + , gammaPreset(options.ICCPC_gammaPreset) + , gamma(options.ICCPC_gamma) + , slope(options.ICCPC_slope) + , appendParamsToDesc(options.ICCPC_appendParamsToDesc) + , profileVersion(options.ICCPC_profileVersion) + , illuminant(options.ICCPC_illuminant) + , description(options.ICCPC_description) + , copyright(options.ICCPC_copyright) + , parent(rtwindow) +{ + + set_default_size(600, -1); + + Gtk::Grid* mainGrid = Gtk::manage(new Gtk::Grid()); + mainGrid->set_column_spacing(3); + mainGrid->set_row_spacing(3); + + //--------------------------------- primaries + + Gtk::Label* prilab = Gtk::manage(new Gtk::Label(M("ICCPROFCREATOR_PRIMARIES"))); + setExpandAlignProperties(prilab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); + mainGrid->attach(*prilab, 0, 0, 1, 1); + + primaries = Gtk::manage(new MyComboBoxText()); + setExpandAlignProperties(primaries, false, false, Gtk::ALIGN_FILL, Gtk::ALIGN_BASELINE); + primaries->append(M("ICCPROFCREATOR_CUSTOM")); + primaries->append(M("ICCPROFCREATOR_PRIM_ACESP0")); + primaries->append(M("ICCPROFCREATOR_PRIM_ACESP1")); + primaries->append(M("ICCPROFCREATOR_PRIM_ADOBE")); + primaries->append(M("ICCPROFCREATOR_PRIM_PROPH")); + primaries->append(M("ICCPROFCREATOR_PRIM_REC2020")); + primaries->append(M("ICCPROFCREATOR_PRIM_SRGB")); + primaries->append(M("ICCPROFCREATOR_PRIM_WIDEG")); + primaries->append(M("ICCPROFCREATOR_PRIM_BEST")); + primaries->append(M("ICCPROFCREATOR_PRIM_BETA")); + primaries->append(M("ICCPROFCREATOR_PRIM_BRUCE")); + primaries->set_tooltip_text(M("ICCPROFCREATOR_PRIM_TOOLTIP")); + mainGrid->attach(*primaries, 1, 0, 1, 1); + + primariesGrid = Gtk::manage(new Gtk::Grid()); + setExpandAlignProperties(primariesGrid, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + primariesGrid->set_column_spacing(5); + + /* + Gtk::Image* gamuts0 = Gtk::manage(new RTImage("rt-logo-tiny.png")); + Gtk::Image* gamutl0 = Gtk::manage(new RTImage("rt-logo-small.png")); + Gtk::Image* gamuts1 = Gtk::manage(new RTImage("rt-logo-tiny.png")); + Gtk::Image* gamutl1 = Gtk::manage(new RTImage("rt-logo-small.png")); + Gtk::Image* gamuts2 = Gtk::manage(new RTImage("rt-logo-tiny.png")); + Gtk::Image* gamutl2 = Gtk::manage(new RTImage("rt-logo-small.png")); + Gtk::Image* gamuts3 = Gtk::manage(new RTImage("rt-logo-tiny.png")); + Gtk::Image* gamutl3 = Gtk::manage(new RTImage("rt-logo-small.png")); + Gtk::Image* gamuts4 = Gtk::manage(new RTImage("rt-logo-tiny.png")); + Gtk::Image* gamutl4 = Gtk::manage(new RTImage("rt-logo-small.png")); + Gtk::Image* gamuts5 = Gtk::manage(new RTImage("rt-logo-tiny.png")); + Gtk::Image* gamutl5 = Gtk::manage(new RTImage("rt-logo-small.png")); + */ + + aPrimariesRedX = Gtk::manage(new Adjuster(M("ICCPROFCREATOR_PRIM_REDX"), 0.6300, 0.7350, 0.0001, 0.6400/*, gamuts0, gamutl0*/)); + setExpandAlignProperties(aPrimariesRedX, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + aPrimariesRedY = Gtk::manage(new Adjuster(M("ICCPROFCREATOR_PRIM_REDY"), 0.2650, 0.3350, 0.0001, 0.3300/*, gamutl1, gamuts1*/)); + setExpandAlignProperties(aPrimariesRedY, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + aPrimariesGreenX = Gtk::manage(new Adjuster(M("ICCPROFCREATOR_PRIM_GREX"), 0.0000, 0.3100, 0.0001, 0.3000/*, gamutl2, gamuts2*/)); + setExpandAlignProperties(aPrimariesGreenX, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + aPrimariesGreenY = Gtk::manage(new Adjuster(M("ICCPROFCREATOR_PRIM_GREY"), 0.5900, 1.0000, 0.0001, 0.6000/*, gamuts3, gamutl3*/)); + setExpandAlignProperties(aPrimariesGreenY, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + aPrimariesBlueX = Gtk::manage(new Adjuster(M("ICCPROFCREATOR_PRIM_BLUX"), 0.0001, 0.1600, 0.0001, 0.1500/*, gamutl4, gamuts4*/)); + setExpandAlignProperties(aPrimariesBlueX, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + aPrimariesBlueY = Gtk::manage(new Adjuster(M("ICCPROFCREATOR_PRIM_BLUY"), -0.0800, 0.0700, 0.0001, 0.060/*, gamutl5, gamuts5*/)); + setExpandAlignProperties(aPrimariesBlueY, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + + primariesGrid->attach(*aPrimariesRedX, 0, 0, 1, 1); + primariesGrid->attach(*aPrimariesRedY, 1, 0, 1, 1); + + primariesGrid->attach(*aPrimariesGreenX, 0, 1, 1, 1); + primariesGrid->attach(*aPrimariesGreenY, 1, 1, 1, 1); + + primariesGrid->attach(*aPrimariesBlueX, 0, 2, 1, 1); + primariesGrid->attach(*aPrimariesBlueY, 1, 2, 1, 1); + + mainGrid->attach(*primariesGrid, 1, 1, 1, 1); + + //--------------------------------- output gamma + + Gtk::Label* galab = Gtk::manage(new Gtk::Label(M("ICCPROFCREATOR_TRC_PRESET"))); + setExpandAlignProperties(galab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); + mainGrid->attach(*galab, 0, 2, 1, 1); + + trcPresets = Gtk::manage(new MyComboBoxText()); + setExpandAlignProperties(trcPresets, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_BASELINE); + std::vector outputTRCPresets; + outputTRCPresets.push_back(M("ICCPROFCREATOR_CUSTOM")); + for (unsigned int i = 0; i < sizeof(sTRCPreset) / sizeof(sTRCPreset[0]); i++) { + outputTRCPresets.push_back(sTRCPreset[i]); + } + for (size_t i = 0; i < outputTRCPresets.size(); i++) { + trcPresets->append(outputTRCPresets[i]); + } + mainGrid->attach(*trcPresets, 1, 2, 1, 1); + + //--------------------------------- sliders gampos and slpos + + aGamma = Gtk::manage(new Adjuster(M("ICCPROFCREATOR_GAMMA"), 1, 3.5, 0.01, 2.4)); + setExpandAlignProperties(aGamma, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_BASELINE); + + if (aGamma->delay < options.adjusterMaxDelay) { + aGamma->delay = options.adjusterMaxDelay; + } + aGamma->show(); + mainGrid->attach(*aGamma, 1, 3, 1, 1); //gamma + + aSlope = Gtk::manage(new Adjuster(M("ICCPROFCREATOR_SLOPE"), 0, 15, 0.00001, 12.92310)); + setExpandAlignProperties(aSlope, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_BASELINE); + + if (aSlope->delay < options.adjusterMaxDelay) { + aSlope->delay = options.adjusterMaxDelay; + } + aSlope->show(); + mainGrid->attach(*aSlope, 1, 4, 1, 1); //slope + + //--------------------------------- temperature + + Gtk::Label* illlab = Gtk::manage(new Gtk::Label(M("ICCPROFCREATOR_ILL"))); + setExpandAlignProperties(illlab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); + mainGrid->attach(*illlab, 0, 5, 1, 1); //slope + cIlluminant = Gtk::manage(new MyComboBoxText()); + setExpandAlignProperties(cIlluminant, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_BASELINE); + cIlluminant->append(M("ICCPROFCREATOR_ILL_DEF")); + cIlluminant->append(M("ICCPROFCREATOR_ILL_41")); + cIlluminant->append(M("ICCPROFCREATOR_ILL_50")); + cIlluminant->append(M("ICCPROFCREATOR_ILL_55")); + cIlluminant->append(M("ICCPROFCREATOR_ILL_60")); + cIlluminant->append(M("ICCPROFCREATOR_ILL_65")); + cIlluminant->append(M("ICCPROFCREATOR_ILL_80")); + cIlluminant->append(M("ICCPROFCREATOR_ILL_INC")); + cIlluminant->set_tooltip_text(M("ICCPROFCREATOR_ILL_TOOLTIP")); + mainGrid->attach(*cIlluminant, 1, 5, 1, 1); + + //--------------------------------- V2 or V4 profiles + + Gtk::Label* proflab = Gtk::manage(new Gtk::Label(M("ICCPROFCREATOR_ICCVERSION"))); + setExpandAlignProperties(proflab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); + mainGrid->attach(*proflab, 0, 6, 1, 1); + iccVersion = Gtk::manage(new MyComboBoxText()); + setExpandAlignProperties(iccVersion, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_BASELINE); + iccVersion->append(M("ICCPROFCREATOR_PROF_V4")); + iccVersion->append(M("ICCPROFCREATOR_PROF_V2")); + mainGrid->attach(*iccVersion, 1, 6, 1, 1); + + //--------------------------------- Description + + Gtk::Label* desclab = Gtk::manage(new Gtk::Label(M("ICCPROFCREATOR_DESCRIPTION"))); + setExpandAlignProperties(desclab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_START); + mainGrid->attach(*desclab, 0, 7, 1, 2); + eDescription = Gtk::manage(new Gtk::Entry()); + setExpandAlignProperties(eDescription, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + eDescription->set_tooltip_text(M("ICCPROFCREATOR_DESCRIPTION_TOOLTIP")); + mainGrid->attach(*eDescription, 1, 7, 1, 1); + cAppendParamsToDesc = Gtk::manage(new Gtk::CheckButton(M("ICCPROFCREATOR_DESCRIPTION_ADDPARAM"))); + setExpandAlignProperties(cAppendParamsToDesc, true, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); + mainGrid->attach(*cAppendParamsToDesc, 1, 8, 1, 1); + + //--------------------------------- Copyright + + Gtk::Label* copylab = Gtk::manage(new Gtk::Label(M("ICCPROFCREATOR_COPYRIGHT"))); + setExpandAlignProperties(copylab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); + mainGrid->attach(*copylab, 0, 9, 1, 1); + Gtk::Grid* copygrid = Gtk::manage(new Gtk::Grid()); + setExpandAlignProperties(copygrid, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + eCopyright = Gtk::manage(new Gtk::Entry()); + setExpandAlignProperties(eCopyright, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + copygrid->attach(*eCopyright, 0, 0, 1, 1); + resetCopyright = Gtk::manage(new Gtk::Button()); + resetCopyright->add (*Gtk::manage (new RTImage ("undo-small.png", "redo-small.png"))); + setExpandAlignProperties(resetCopyright, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); + resetCopyright->set_relief (Gtk::RELIEF_NONE); + resetCopyright->set_tooltip_markup (M("ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP")); + resetCopyright->get_style_context()->add_class(GTK_STYLE_CLASS_FLAT); + resetCopyright->set_can_focus(false); + copygrid->attach(*resetCopyright, 1, 0, 1, 1); + mainGrid->attach(*copygrid, 1, 9, 1, 1); + + //--------------------------------- Adding the mainGrid + + get_content_area()->add(*mainGrid); + + //--------------------------------- Setting default values for Adjusters + + aGamma->setDefault(gamma); + aSlope->setDefault(slope); + aPrimariesRedX->setDefault(redPrimaryX); + aPrimariesRedY->setDefault(redPrimaryY); + aPrimariesGreenX->setDefault(greenPrimaryX); + aPrimariesGreenY->setDefault(greenPrimaryY); + aPrimariesBlueX->setDefault(bluePrimaryX); + aPrimariesBlueY->setDefault(bluePrimaryY); + + //--------------- Updating widgets with actual values (from options) + + if (primariesPreset == "custom") { + primaries->set_active_text(M("ICCPROFCREATOR_CUSTOM")); + } else if (primariesPreset == "ACES-AP0") { + primaries->set_active_text(M("ICCPROFCREATOR_PRIM_ACESP0")); + } else if (primariesPreset == "ACES-AP1") { + primaries->set_active_text(M("ICCPROFCREATOR_PRIM_ACESP1")); + } else if (primariesPreset == "Adobe") { + primaries->set_active_text(M("ICCPROFCREATOR_PRIM_ADOBE")); + } else if (primariesPreset == "ProPhoto") { + primaries->set_active_text(M("ICCPROFCREATOR_PRIM_PROPH")); + } else if (primariesPreset == "Rec2020") { + primaries->set_active_text(M("ICCPROFCREATOR_PRIM_REC2020")); + } else if (primariesPreset == "sRGB") { + primaries->set_active_text(M("ICCPROFCREATOR_PRIM_SRGB")); + } else if (primariesPreset == "Widegamut") { + primaries->set_active_text(M("ICCPROFCREATOR_PRIM_WIDEG")); + } else if (primariesPreset == "BestRGB") { + primaries->set_active_text(M("ICCPROFCREATOR_PRIM_BEST")); + } else if (primariesPreset == "BetaRGB") { + primaries->set_active_text(M("ICCPROFCREATOR_PRIM_BETA")); + } else if (primariesPreset == "BruceRGB") { + primaries->set_active_text(M("ICCPROFCREATOR_PRIM_BRUCE")); + } + + trcPresets->set_active(0); + if (gammaPreset != "Custom") { + trcPresets->set_active_text(gammaPreset); + } + + aGamma->setValue(gamma); + aSlope->setValue(slope); + aPrimariesRedX->setValue(redPrimaryX); + aPrimariesRedY->setValue(redPrimaryY); + aPrimariesGreenX->setValue(greenPrimaryX); + aPrimariesGreenY->setValue(greenPrimaryY); + aPrimariesBlueX->setValue(bluePrimaryX); + aPrimariesBlueY->setValue(bluePrimaryY); + + eDescription->set_text(description); + eCopyright->set_text(copyright); + cAppendParamsToDesc->set_active(appendParamsToDesc); + + if (illuminant == "DEF") { + cIlluminant->set_active_text(M("ICCPROFCREATOR_ILL_DEF")); + } else if (illuminant == "D41") { + cIlluminant->set_active_text(M("ICCPROFCREATOR_ILL_41")); + } else if (illuminant == "D50") { + cIlluminant->set_active_text(M("ICCPROFCREATOR_ILL_50")); + } else if (illuminant == "D55") { + cIlluminant->set_active_text(M("ICCPROFCREATOR_ILL_55")); + } else if (illuminant == "D60") { + cIlluminant->set_active_text(M("ICCPROFCREATOR_ILL_60")); + } else if (illuminant == "D65") { + cIlluminant->set_active_text(M("ICCPROFCREATOR_ILL_65")); + } else if (illuminant == "D80") { + cIlluminant->set_active_text(M("ICCPROFCREATOR_ILL_80")); + } else if (illuminant == "stdA") { + cIlluminant->set_active_text(M("ICCPROFCREATOR_ILL_INC")); + } + + iccVersion->set_active(0); + if (profileVersion == "v2") { + iccVersion->set_active(1); + } + + trcPresetsChanged(); + illuminantChanged(); + primariesChanged(); + + //--------------- Action area button + + Gtk::Button* save = Gtk::manage (new Gtk::Button (M ("GENERAL_SAVE_AS"))); + save->signal_clicked().connect ( sigc::mem_fun (*this, &ICCProfileCreator::savePressed) ); + get_action_area()->pack_start (*save); + + Gtk::Button* close = Gtk::manage (new Gtk::Button (M ("GENERAL_CLOSE"))); + close->signal_clicked().connect ( sigc::mem_fun (*this, &ICCProfileCreator::closePressed) ); + get_action_area()->pack_start (*close); + + //--------------- Show childrens + + show_all_children (); + + //--------------- Connecting the signals + + aPrimariesRedX->setAdjusterListener(this); + aPrimariesRedY->setAdjusterListener(this); + aPrimariesGreenX->setAdjusterListener(this); + aPrimariesGreenY->setAdjusterListener(this); + aPrimariesBlueX->setAdjusterListener(this); + aPrimariesBlueY->setAdjusterListener(this); + aGamma->setAdjusterListener(this); + aSlope->setAdjusterListener(this); + primariesconn = primaries->signal_changed().connect(sigc::mem_fun(*this, &ICCProfileCreator::primariesChanged)); + trcpresetsconn = trcPresets->signal_changed().connect(sigc::mem_fun(*this, &ICCProfileCreator::trcPresetsChanged)); + illconn = cIlluminant->signal_changed().connect(sigc::mem_fun(*this, &ICCProfileCreator::illuminantChanged)); + resetCopyright->signal_clicked().connect(sigc::mem_fun(*this, &ICCProfileCreator::onResetCopyright)); +} + +void ICCProfileCreator::closePressed() +{ + storeValues(); + hide(); +} + +void ICCProfileCreator::updateICCVersion() +{ + if (cIlluminant->get_active_text() != M("ICCPROFCREATOR_ILL_DEF") || primaries->get_active_text() == M("ICCPROFCREATOR_CUSTOM")) { + iccVersion->set_active_text(M("ICCPROFCREATOR_PROF_V4")); + iccVersion->set_sensitive(false); + } else { + iccVersion->set_sensitive(true); + } +} + +void ICCProfileCreator::adjusterChanged(Adjuster* a, double newval) +{ + if (a == aPrimariesRedX || a == aPrimariesRedY || + a == aPrimariesGreenX || a == aPrimariesGreenY || + a == aPrimariesBlueX || a == aPrimariesBlueY) + { + if (primaries->get_active_row_number() > 0) { + ConnectionBlocker blocker(primariesconn); + primaries->set_active(0); + updateICCVersion(); + } + } else if (a == aGamma || a == aSlope) { + if (trcPresets->get_active_row_number() > 0) { + ConnectionBlocker blocker(trcpresetsconn); + trcPresets->set_active(0); + } + } +} + +void ICCProfileCreator::adjusterAutoToggled(Adjuster* a, bool newval) +{ +} + +void ICCProfileCreator::primariesChanged() +{ + if (primaries->get_active_row_number() > 0) { + float p[6]; + ColorTemp temp; + Glib::ustring activeValue = primaries->get_active_text(); + Glib::ustring primPresetName = getPrimariesPresetName(activeValue); + getPrimaries(primPresetName, p, temp); + aPrimariesRedX->setValue(p[0]); + aPrimariesRedY->setValue(p[1]); + aPrimariesGreenX->setValue(p[2]); + aPrimariesGreenY->setValue(p[3]); + aPrimariesBlueX->setValue(p[4]); + aPrimariesBlueY->setValue(p[5]); + } + updateICCVersion(); +} + +void ICCProfileCreator::illuminantChanged() +{ + updateICCVersion(); +} + +void ICCProfileCreator::trcPresetsChanged() +{ + aGamma->block(true); + aSlope->block(true); + + double gamma; + double slope; + getGamma(getGammaPresetName(trcPresets->get_active_text()), gamma, slope); + aGamma->setValue(gamma); + aSlope->setValue(slope); + + aGamma->block(false); + aSlope->block(false); +} + +void ICCProfileCreator::storeValues() +{ + if (iccVersion->get_active_text() == M("ICCPROFCREATOR_PROF_V4")) { + options.ICCPC_profileVersion = profileVersion = "v4"; + } else if (iccVersion->get_active_text() == M("ICCPROFCREATOR_PROF_V2")) { + options.ICCPC_profileVersion = profileVersion = "v2"; + } + + if (cIlluminant->get_active_text() == M("ICCPROFCREATOR_ILL_DEF")) { + options.ICCPC_illuminant = illuminant = "DEF"; + } else if (cIlluminant->get_active_text() == M("ICCPROFCREATOR_ILL_41")) { + options.ICCPC_illuminant = illuminant = "D41"; + } else if (cIlluminant->get_active_text() == M("ICCPROFCREATOR_ILL_50")) { + options.ICCPC_illuminant = illuminant = "D50"; + } else if (cIlluminant->get_active_text() == M("ICCPROFCREATOR_ILL_55")) { + options.ICCPC_illuminant = illuminant = "D55"; + } else if (cIlluminant->get_active_text() == M("ICCPROFCREATOR_ILL_60")) { + options.ICCPC_illuminant = illuminant = "D60"; + } else if (cIlluminant->get_active_text() == M("ICCPROFCREATOR_ILL_65")) { + options.ICCPC_illuminant = illuminant = "D65"; + } else if (cIlluminant->get_active_text() == M("ICCPROFCREATOR_ILL_80")) { + options.ICCPC_illuminant = illuminant = "D80"; + } else if (cIlluminant->get_active_text() == M("ICCPROFCREATOR_ILL_INC")) { + options.ICCPC_illuminant = illuminant = "stdA"; + } + + options.ICCPC_primariesPreset = primariesPreset = getPrimariesPresetName(primaries->get_active_text()); + options.ICCPC_gammaPreset = gammaPreset = getGammaPresetName(trcPresets->get_active_text()); + options.ICCPC_gamma = gamma = aGamma->getValue(); + options.ICCPC_slope = slope = aSlope->getValue(); + options.ICCPC_redPrimaryX = redPrimaryX = aPrimariesRedX->getValue(); + options.ICCPC_redPrimaryY = redPrimaryY = aPrimariesRedY->getValue(); + options.ICCPC_greenPrimaryX = greenPrimaryX = aPrimariesGreenX->getValue(); + options.ICCPC_greenPrimaryY = greenPrimaryY = aPrimariesGreenY->getValue(); + options.ICCPC_bluePrimaryX = bluePrimaryX = aPrimariesBlueX->getValue(); + options.ICCPC_bluePrimaryY = bluePrimaryY = aPrimariesBlueY->getValue(); + options.ICCPC_description = description = eDescription->get_text(); + options.ICCPC_copyright = copyright = eCopyright->get_text(); + options.ICCPC_appendParamsToDesc = appendParamsToDesc = cAppendParamsToDesc->get_active(); +} + +Glib::ustring ICCProfileCreator::getPrimariesPresetName(const Glib::ustring &preset) +{ + if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_ACESP0")) { + return Glib::ustring("ACES-AP0"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_ACESP1")) { + return Glib::ustring("ACES-AP1"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_ADOBE")) { + return Glib::ustring("Adobe"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_PROPH")) { + return Glib::ustring("ProPhoto"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_REC2020")) { + return Glib::ustring("Rec2020"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_SRGB")) { + return Glib::ustring("sRGB"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_WIDEG")) { + return Glib::ustring("Widegamut"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_BEST")) { + return Glib::ustring("BestRGB"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_BETA")) { + return Glib::ustring("BetaRGB"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_BRUCE")) { + return Glib::ustring("BruceRGB"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_CUSTOM")) { + return Glib::ustring("custom"); + } else { + return Glib::ustring(); + } +} + +void ICCProfileCreator::getPrimaries(const Glib::ustring &preset, float *p, ColorTemp &temp) +{ + temp = ColorTemp::D50; + if (preset == "Widegamut") { + p[0] = 0.7350; //Widegamut primaries + p[1] = 0.2650; + p[2] = 0.1150; + p[3] = 0.8260; + p[4] = 0.1570; + p[5] = 0.0180; + + } else if (preset == "Adobe") { + p[0] = 0.6400; //Adobe primaries + p[1] = 0.3300; + p[2] = 0.2100; + p[3] = 0.7100; + p[4] = 0.1500; + p[5] = 0.0600; + temp = ColorTemp::D65; + } else if (preset == "sRGB") { + p[0] = 0.6400; // sRGB primaries + p[1] = 0.3300; + p[2] = 0.3000; + p[3] = 0.6000; + p[4] = 0.1500; + p[5] = 0.0600; + temp = ColorTemp::D65; + } else if (preset == "BruceRGB") { + p[0] = 0.6400; // Bruce primaries + p[1] = 0.3300; + p[2] = 0.2800; + p[3] = 0.6500; + p[4] = 0.1500; + p[5] = 0.0600; + temp = ColorTemp::D65; + } else if (preset == "BetaRGB") { + p[0] = 0.6888; // Beta primaries + p[1] = 0.3112; + p[2] = 0.1986; + p[3] = 0.7551; + p[4] = 0.1265; + p[5] = 0.0352; + } else if (preset == "BestRGB") { + p[0] = 0.7347; // Best primaries + p[1] = 0.2653; + p[2] = 0.2150; + p[3] = 0.7750; + p[4] = 0.1300; + p[5] = 0.0350; + } else if (preset == "Rec2020") { + p[0] = 0.7080; // Rec2020 primaries + p[1] = 0.2920; + p[2] = 0.1700; + p[3] = 0.7970; + p[4] = 0.1310; + p[5] = 0.0460; + temp = ColorTemp::D65; + } else if (preset == "ACES-AP0") { + p[0] = 0.7347; // ACES P0 primaries + p[1] = 0.2653; + p[2] = 0.0000; + p[3] = 1.0; + p[4] = 0.0001; + p[5] = -0.0770; + temp = ColorTemp::D60; + } else if (preset == "ACES-AP1") { + p[0] = 0.713; // ACES P1 primaries + p[1] = 0.293; + p[2] = 0.165; + p[3] = 0.830; + p[4] = 0.128; + p[5] = 0.044; + temp = ColorTemp::D60; + } else if (preset == "ProPhoto") { + p[0] = 0.7347; // ProPhoto and default primaries + p[1] = 0.2653; + p[2] = 0.1596; + p[3] = 0.8404; + p[4] = 0.0366; + p[5] = 0.0001; + } else if (preset == "custom") { + p[0] = redPrimaryX; + p[1] = redPrimaryY; + p[2] = greenPrimaryX; + p[3] = greenPrimaryY; + p[4] = bluePrimaryX; + p[5] = bluePrimaryY; + + } else { + p[0] = 0.7347; //default primaries + p[1] = 0.2653; + p[2] = 0.1596; + p[3] = 0.8404; + p[4] = 0.0366; + p[5] = 0.0001; + } +} + +Glib::ustring ICCProfileCreator::getGammaPresetName(const Glib::ustring &preset) +{ + Glib::ustring name(trcPresets->get_active_text()); + if (name == M("ICCPROFCREATOR_CUSTOM")) { + name = "Custom"; + } + return name; +} + +void ICCProfileCreator::getGamma(const Glib::ustring &preset, double &presetGamma, double &presetSlope) +{ + if (preset == "High_g1.3_s3.35") { + presetGamma = 1.3; + presetSlope = 3.35; + } else if (preset == "Low_g2.6_s6.9") { + presetGamma = 2.6; + presetSlope = 6.9; + } else if (preset == "sRGB_g2.4_s12.92") { + presetGamma = 2.4; + presetSlope = 12.92310; + } else if (preset == "BT709_g2.2_s4.5") { + presetGamma = 2.22; + presetSlope = 4.5; + } else if (preset == "linear_g1.0") { + presetGamma = 1.; + presetSlope = 0.; + } else if (preset == "standard_g2.2") { + presetGamma = 2.2; + presetSlope = 0.; + } else if (preset == "standard_g1.8") { + presetGamma = 1.8; + presetSlope = 0.; + } else if (preset == "Lab_g3.0s9.03296") { + presetGamma = 3.0; + presetSlope = 9.03296; + } else if (preset == "Custom") { + presetGamma = gamma; + presetSlope = slope; + } else { + presetGamma = 2.4; + presetSlope = 12.92310; + } +} + +void ICCProfileCreator::onResetCopyright() +{ + eCopyright->set_text(Options::getICCProfileCopyright()); +} + +// Copyright (c) 2018 Jacques DESMIS +// WARNING: the caller must lock lcmsMutex +void ICCProfileCreator::savePressed() +{ + cmsHPROFILE newProfile = nullptr; + Glib::ustring sNewProfile; + Glib::ustring sPrimariesPreset; + Glib::ustring sGammaPreset; + + storeValues(); + + // -------------------------------------------- Compute the default file name + + //necessary for V2 profile + if (primariesPreset == "ACES-AP0" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.ACESp0)) { + sNewProfile = options.rtSettings.ACESp0; + sPrimariesPreset = "ACES-AP0"; + } else if (primariesPreset == "ACES-AP1" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.ACESp1)) { + sNewProfile = options.rtSettings.ACESp1; + sPrimariesPreset = "ACES-AP1"; + } else if (primariesPreset == "Adobe" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.adobe)) { + sNewProfile = options.rtSettings.adobe; + sPrimariesPreset = "Medium"; + } else if (primariesPreset == "ProPhoto" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.prophoto)) { + sNewProfile = options.rtSettings.prophoto; + sPrimariesPreset = "Large"; + } else if (primariesPreset == "Rec2020" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.rec2020)) { + sNewProfile = options.rtSettings.rec2020; + sPrimariesPreset = "Rec2020"; + } else if (primariesPreset == "sRGB" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.srgb)) { + sNewProfile = options.rtSettings.srgb; + sPrimariesPreset = "sRGB"; + } else if (primariesPreset == "Widegamut" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.widegamut)) { + sNewProfile = options.rtSettings.widegamut; + sPrimariesPreset = "Wide"; + } else if (primariesPreset == "BestRGB" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.best)) { + sNewProfile = options.rtSettings.best; + sPrimariesPreset = "Best"; + } else if (primariesPreset == "BetaRGB" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.beta)) { + sNewProfile = options.rtSettings.beta; + sPrimariesPreset = "Beta"; + } else if (primariesPreset == "BruceRGB" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.bruce)) { + sNewProfile = options.rtSettings.bruce; + sPrimariesPreset = "Bruce"; + } else if (primariesPreset == "custom") { + sNewProfile = options.rtSettings.srgb; + sPrimariesPreset = "Custom"; + } else { + // Should not occurs + if (rtengine::settings->verbose) { + printf("\"%s\": unknown working profile! - use LCMS2 substitution\n", primariesPreset.c_str()); + } + return; + } + + //begin adaptation rTRC gTRC bTRC + //"newProfile" profile has the same characteristics than RGB values, but TRC are adapted... for applying profile + if (rtengine::settings->verbose) { + printf("Output Gamma - profile Primaries as RT profile: \"%s\"\n", sNewProfile.c_str()); + } + + newProfile = rtengine::ICCStore::getInstance()->getProfile(sNewProfile); //get output profile + + if (newProfile == nullptr) { + + if (rtengine::settings->verbose) { + printf("\"%s\" ICC output profile not found!\n", sNewProfile.c_str()); + } + return; + } + + //change desc Tag , to "free gamma", or "BT709", etc. + Glib::ustring fName; + Glib::ustring sPrimariesAndIlluminant; + double presetGamma = 2.4; + double presetSlope = 12.92310; + const double eps = 0.000000001; // not divide by zero + getGamma(gammaPreset, presetGamma, presetSlope); + if (gammaPreset == "High_g1.3_s3.35") { + sGammaPreset = "High_g=1.3_s=3.35"; + ga[0] = 1.3 ; //for high dynamic images + ga[1] = 0.998279; + ga[2] = 0.001721; + ga[3] = 0.298507; + ga[4] = 0.005746; + } else if (gammaPreset == "Low_g2.6_s6.9") { + sGammaPreset = "Low_g=2.6_s=6.9"; + ga[0] = 2.6 ; //gamma 2.6 variable : for low contrast images + ga[1] = 0.891161; + ga[2] = 0.108839; + ga[3] = 0.144928; + ga[4] = 0.076332; + } else if (gammaPreset == "sRGB_g2.4_s12.92") { + sGammaPreset = "sRGB_g=2.4_s=12.92310"; + ga[0] = 2.40; //sRGB 2.4 12.92 - RT default as Lightroom + ga[1] = 0.947858; + ga[2] = 0.052142; + ga[3] = 0.077399; + ga[4] = 0.039293; + } else if (gammaPreset == "BT709_g2.2_s4.5") { + sGammaPreset = "BT709_g=2.2_s=4.5"; + ga[0] = 2.22; //BT709 2.2 4.5 - my preferred as D.Coffin + ga[1] = 0.909995; + ga[2] = 0.090005; + ga[3] = 0.222222; + ga[4] = 0.081071; + } else if (gammaPreset == "linear_g1.0") { + sGammaPreset = "Linear_g=1.0"; + ga[0] = 1.0; //gamma=1 linear : for high dynamic images (cf D.Coffin...) + ga[1] = 1.; + ga[2] = 0.; + ga[3] = 1. / eps; + ga[4] = 0.; + } else if (gammaPreset == "standard_g2.2") { + sGammaPreset = "g=2.2"; + ga[0] = 2.2; //gamma=2.2(as gamma of Adobe, Widegamut...) + ga[1] = 1.; + ga[2] = 0.; + ga[3] = 1. / eps; + ga[4] = 0.; + } else if (gammaPreset == "standard_g1.8") { + sGammaPreset = "g=1.8"; + ga[0] = 1.8; //gamma=1.8(as gamma of Prophoto) + ga[1] = 1.; + ga[2] = 0.; + ga[3] = 1. / eps; + ga[4] = 0.; + } else if (gammaPreset == "Lab_g3.0s9.03296") { + sGammaPreset = "LAB_g3.0_s9.03296"; + ga[0] = 3.0; //Lab gamma =3 slope=9.03296 + ga[1] = 0.8621; + ga[2] = 0.1379; + ga[3] = 0.1107; + ga[4] = 0.08; + } else if (gammaPreset == "Custom") { + rtengine::GammaValues g_a; //gamma parameters + double pwr = 1.0 / gamma; + double ts = slope; + double slope2 = slope == 0 ? eps : slope; + + int mode = 0; + rtengine::Color::calcGamma(pwr, ts, mode, g_a); // call to calcGamma with selected gamma and slope : return parameters for LCMS2 + ga[4] = g_a[3] * ts; + //printf("g_a.gamma0=%f g_a.gamma1=%f g_a.gamma2=%f g_a.gamma3=%f g_a.gamma4=%f\n", g_a.gamma0,g_a.gamma1,g_a.gamma2,g_a.gamma3,g_a.gamma4); + ga[0] = gamma; + ga[1] = 1. /(1.0 + g_a[4]); + ga[2] = g_a[4] /(1.0 + g_a[4]); + ga[3] = 1. / slope2; + //printf("ga[0]=%f ga[1]=%f ga[2]=%f ga[3]=%f ga[4]=%f\n", ga[0],ga[1],ga[2],ga[3],ga[4]); + + sGammaPreset = Glib::ustring::compose("g%1_s%2", + Glib::ustring::format (std::setw(3), std::fixed, std::setprecision(2), gamma), + Glib::ustring::format (std::setw(6), std::fixed, std::setprecision(5), slope)); + presetGamma = gamma; + presetSlope = slope; + } + ga[5] = 0.0; + ga[6] = 0.0; + + + sPrimariesAndIlluminant = sPrimariesPreset; + + if (profileVersion == "v4" && illuminant != "DEF") { + sPrimariesPreset += "-" + illuminant; + // printf("outpr=%s \n",outPr.c_str()); + } + + Glib::ustring profileDesc; + Glib::ustring sGammaSlopeParam;//to save gamma and slope in a dmdd + Glib::ustring sGammaSlopeDesc; //to save gamma and slope in a desc + Glib::ustring sGamma; + Glib::ustring sSlope; + + if (gammaPreset == "Custom") { + sGamma = Glib::ustring::format (std::setw(3), std::fixed, std::setprecision(2), gamma); + sSlope = Glib::ustring::format (std::setw(6), std::fixed, std::setprecision(5), slope); + fName = Glib::ustring::compose("RT%1_%2_g%3_s%4.icc", profileVersion, sPrimariesAndIlluminant, sGamma, sSlope); + profileDesc = sPrimariesPreset; + } else { + sGamma = Glib::ustring::format (std::setw(3), std::fixed, std::setprecision(2), presetGamma); + sSlope = Glib::ustring::format (std::setw(6), std::fixed, std::setprecision(5), presetSlope); + fName = Glib::ustring::compose("RT%1_%2_%3.icc", profileVersion, sPrimariesAndIlluminant, sGammaPreset); + profileDesc == sPrimariesPreset + sGammaPreset; + } + sGammaSlopeParam = Glib::ustring::compose("g%1s%2!", sGamma, sSlope); + sGammaSlopeDesc = Glib::ustring::compose("g=%1 s=%2", sGamma, sSlope); + + // -------------------------------------------- Asking the file name + + Gtk::FileChooserDialog dialog(getToplevelWindow(this), M("ICCPROFCREATOR_SAVEDIALOG_TITLE"), Gtk::FILE_CHOOSER_ACTION_SAVE); + bindCurrentFolder(dialog, options.lastICCProfCreatorDir); + dialog.set_current_name(fName); + //dialog.set_current_folder(lastPath); + + dialog.add_button(M("GENERAL_CANCEL"), Gtk::RESPONSE_CANCEL); + dialog.add_button(M("GENERAL_SAVE"), Gtk::RESPONSE_OK); + + Glib::RefPtr filter_icc = Gtk::FileFilter::create(); + filter_icc->set_name(M("FILECHOOSER_FILTER_COLPROF")); + filter_icc->add_pattern("*.icc"); + dialog.add_filter(filter_icc); + + /* + Glib::RefPtr filter_any = Gtk::FileFilter::create(); + filter_any->set_name(M("FILECHOOSER_FILTER_ANY")); + filter_any->add_pattern("*"); + dialog.add_filter(filter_any); + */ + + dialog.show_all_children(); + //dialog.set_do_overwrite_confirmation (true); + + Glib::ustring absoluteFName; + + do { + int result = dialog.run(); + + if (result != Gtk::RESPONSE_OK) { + return; + } else { + absoluteFName = dialog.get_filename(); + Glib::ustring ext = getExtension(absoluteFName); + + if (ext != "icc") { + absoluteFName += ".icc"; + } + + if (confirmOverwrite(dialog, absoluteFName)) { + //lastPath = Glib::path_get_dirname(absoluteFName); + break; + } + } + } while (1); + + // --------------- main tags ------------------ + + if (profileVersion == "v4") { + cmsSetProfileVersion(newProfile, 4.3); + } else { + cmsSetProfileVersion(newProfile, 2.0); + } + +//change + float p[6]; //primaries + ga[6] = 0.0; + + ColorTemp temp; + getPrimaries(primariesPreset, p, temp); + + cmsCIExyY xyD; + cmsCIExyYTRIPLE Primaries = { + {p[0], p[1], 1.0}, // red + {p[2], p[3], 1.0}, // green + {p[4], p[5], 1.0} // blue + }; + + if (profileVersion == "v4" && illuminant != "DEF") { + double tempv4 = 5000.; + if (illuminant == "D41") { + tempv4 = 4100.; + } else if (illuminant == "D50") { + tempv4 = 5003.; + } else if (illuminant == "D55") { + tempv4 = 5500.; + } else if (illuminant == "D60") { + tempv4 = 6004.; + } else if (illuminant == "D65") { + tempv4 = 6504.; + } else if (illuminant == "D80") { + tempv4 = 8000.; + } else if (illuminant == "stdA") { + tempv4 = 5003.; + } + cmsWhitePointFromTemp(&xyD, tempv4); + } else { + cmsWhitePointFromTemp(&xyD, (double)temp); + } + + if (illuminant == "stdA") { + xyD = {0.447573, 0.407440, 1.0}; + } + + // Calculate output profile's rTRC gTRC bTRC + cmsToneCurve* GammaTRC[3]; + GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildParametricToneCurve(nullptr, 5, ga); + + if (profileVersion == "v4") { + newProfile = cmsCreateRGBProfile(&xyD, &Primaries, GammaTRC); + } + + cmsWriteTag(newProfile, cmsSigRedTRCTag, GammaTRC[0]); + cmsWriteTag(newProfile, cmsSigGreenTRCTag, GammaTRC[1]); + cmsWriteTag(newProfile, cmsSigBlueTRCTag, GammaTRC[2]); + + // --------------- set dmnd tag ------------------ + + cmsMLU *dmnd; + dmnd = cmsMLUalloc(nullptr, 1); + cmsMLUsetASCII(dmnd, "en", "US", "RawTherapee"); + cmsWriteTag(newProfile, cmsSigDeviceMfgDescTag, dmnd); + cmsMLUfree(dmnd); + + // --------------- set dmdd tag ------------------ + + if (profileVersion == "v2") { + //write in tag 'dmdd' values of current gamma and slope to retrieve after in Output profile + std::wostringstream wGammaSlopeParam; + wGammaSlopeParam << sGammaSlopeParam; + + cmsMLU *dmdd = cmsMLUalloc(nullptr, 1); + // Language code (2 letters code) : https://www.iso.org/obp/ui/ + // Country code (2 letters code) : http://www.loc.gov/standards/iso639-2/php/code_list.php + if (sGammaSlopeParam.is_ascii()) { + if (cmsMLUsetASCII(dmdd, "en", "US", sGammaSlopeParam.c_str())) { + if (!cmsWriteTag(newProfile, cmsSigProfileDescriptionTag, dmdd)) { + printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); + } + } + } else if (cmsMLUsetWide(dmdd, "en", "US", wGammaSlopeParam.str().c_str())) { + if (!cmsWriteTag(newProfile, cmsSigDeviceModelDescTag, dmdd)) { + printf("Error: Can't write cmsSigDeviceModelDescTag!\n"); + } + } else { + printf("Error: cmsMLUsetWide failed for dmdd \"%s\" !\n", sGammaSlopeParam.c_str()); + } + cmsMLUfree(dmdd); + } + + // --------------- set desc tag ------------------ + + Glib::ustring sDescription; + if (!description.empty()) { + if (cAppendParamsToDesc->get_active()) { + sDescription = description + " / " + sGammaSlopeDesc; + } else { + sDescription = description; + } + } else { + if (cAppendParamsToDesc->get_active()) { + sDescription = profileDesc + " / " + sGammaSlopeDesc; + } else { + sDescription = profileDesc; + } + } + + //write in tag 'dmdd' values of current gamma and slope to retrieve after in Output profile + std::wostringstream wDescription; + wDescription << sDescription; + + cmsMLU *descMLU = cmsMLUalloc(nullptr, 1); + // Language code (2 letters code) : https://www.iso.org/obp/ui/ + // Country code (2 letters code) : http://www.loc.gov/standards/iso639-2/php/code_list.php + if (sDescription.is_ascii()) { + if (cmsMLUsetASCII(descMLU, "en", "US", sDescription.c_str())) { + if (!cmsWriteTag(newProfile, cmsSigProfileDescriptionTag, descMLU)) { + printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); + } + } + } else if (cmsMLUsetWide(descMLU, "en", "US", wDescription.str().c_str())) { + if (!cmsWriteTag(newProfile, cmsSigProfileDescriptionTag, descMLU)) { + printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); + } + } else { + printf("Error: cmsMLUsetWide failed for desc \"%s\" !\n", sDescription.c_str()); + } + cmsMLUfree(descMLU); + + // --------------- set cprt tag ------------------ + + std::wostringstream wCopyright; + wCopyright << copyright; + + cmsMLU *copyMLU = cmsMLUalloc(nullptr, 1); + if (cmsMLUsetWide(copyMLU, "en", "US", wCopyright.str().c_str())) { + if (!cmsWriteTag(newProfile, cmsSigCopyrightTag, copyMLU)) { + printf("Error: Can't write cmsSigCopyrightTag!\n"); + } + } else { + printf("Error: cmsMLUsetWide failed for cprt \"%s\" !\n", copyright.c_str()); + } + cmsMLUfree(copyMLU); + + + /* //to read XYZ values + cmsCIEXYZ *redT = static_cast(cmsReadTag(newProfile, cmsSigRedMatrixColumnTag)); + cmsCIEXYZ *greenT = static_cast(cmsReadTag(newProfile, cmsSigGreenMatrixColumnTag)); + cmsCIEXYZ *blueT = static_cast(cmsReadTag(newProfile, cmsSigBlueMatrixColumnTag)); + printf("rx=%f gx=%f bx=%f ry=%f gy=%f by=%f rz=%f gz=%f bz=%f\n", redT->X, greenT->X, blueT->X, redT->Y, greenT->Y, blueT->Y, redT->Z, greenT->Z, blueT->Z); + */ + + cmsSaveProfileToFile(newProfile, absoluteFName.c_str()); + + cmsFreeToneCurve(GammaTRC[0]); +} From 5e0cbd4c683b5edef32635c094536300b0c85a26 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sun, 11 Nov 2018 16:18:06 +0100 Subject: [PATCH 117/122] Bug in iccprofilecreator.cc found by clang, fixes #4973 --- rtgui/iccprofilecreator.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtgui/iccprofilecreator.cc b/rtgui/iccprofilecreator.cc index 23c8472c5..a2c1c60d4 100644 --- a/rtgui/iccprofilecreator.cc +++ b/rtgui/iccprofilecreator.cc @@ -823,7 +823,7 @@ void ICCProfileCreator::savePressed() sGamma = Glib::ustring::format (std::setw(3), std::fixed, std::setprecision(2), presetGamma); sSlope = Glib::ustring::format (std::setw(6), std::fixed, std::setprecision(5), presetSlope); fName = Glib::ustring::compose("RT%1_%2_%3.icc", profileVersion, sPrimariesAndIlluminant, sGammaPreset); - profileDesc == sPrimariesPreset + sGammaPreset; + profileDesc = sPrimariesPreset + sGammaPreset; } sGammaSlopeParam = Glib::ustring::compose("g%1s%2!", sGamma, sSlope); sGammaSlopeDesc = Glib::ustring::compose("g=%1 s=%2", sGamma, sSlope); From 513b582b4d71ecf82e1e22f9e771e1fe533a1f59 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Sun, 11 Nov 2018 22:08:29 +0100 Subject: [PATCH 118/122] Updated rtexif using ExifTool-11.17 Closes #4921 --- rtexif/canonattribs.cc | 52 +++++++++++++++++++++++++++++++----- rtexif/nikonattribs.cc | 39 ++++++++++++++++++++++----- rtexif/pentaxattribs.cc | 1 + rtexif/sonyminoltaattribs.cc | 31 ++++++++++++++++++++- 4 files changed, 109 insertions(+), 14 deletions(-) diff --git a/rtexif/canonattribs.cc b/rtexif/canonattribs.cc index 2e2eea676..17ce4f343 100644 --- a/rtexif/canonattribs.cc +++ b/rtexif/canonattribs.cc @@ -567,6 +567,7 @@ public: {6, "Sigma 18-125mm f/3.5-5.6 DC IF ASP"}, {6, "Tokina AF 193-2 19-35mm f/3.5-4.5"}, {6, "Sigma 28-80mm f/3.5-5.6 II Macro"}, + {6, "Sigma 28-300mm f/3.5-6.3 DG Macro"}, {7, "Canon EF 100-300mm f/5.6L"}, {8, "Canon EF 100-300mm f/5.6 or Sigma or Tokina Lens"}, {8, "Sigma 70-300mm f/4-5.6 [APO] DG Macro"}, @@ -656,7 +657,9 @@ public: {82, "Canon TS-E 135mm f/4L Macro"}, {94, "Canon TS-E 17mm f/4L"}, {95, "Canon TS-E 24mm f/3.5L II"}, - {103, "Samyang AF 14mm f/2.8 EF"}, + {103, "Samyang AF 14mm f/2.8 EF or Rokinon Lens"}, + {103, "Rokinon SP 14mm f/2.4"}, + {103, "Rokinon AF 14mm f/2.8 EF"}, {124, "Canon MP-E 65mm f/2.8 1-5x Macro Photo"}, {125, "Canon TS-E 24mm f/3.5L"}, {126, "Canon TS-E 45mm f/2.8"}, @@ -733,7 +736,7 @@ public: {160, "Tokina AT-X 107 AF DX 10-17mm f/3.5-4.5 Fisheye"}, {160, "Tokina AT-X 116 AF Pro DX 11-16mm f/2.8"}, {160, "Tokina AT-X 11-20 F2.8 PRO DX Aspherical 11-20mm f/2.8"}, - {161, "Canon EF 28-70mm f/2.8L USM or Sigma or Tamron Lens"}, + {161, "Canon EF 28-70mm f/2.8L USM or Other Lens"}, {161, "Sigma 24-70mm f/2.8 EX"}, {161, "Sigma 28-70mm f/2.8 EX"}, {161, "Sigma 24-60mm f/2.8 EX DG"}, @@ -741,6 +744,7 @@ public: {161, "Tamron 90mm f/2.8"}, {161, "Tamron SP AF 17-35mm f/2.8-4 Di LD Aspherical IF"}, {161, "Tamron SP AF 28-75mm f/2.8 XR Di LD Aspherical [IF] Macro"}, + {161, "Tokina AT-X 24-70mm f/2.8 PRO FX (IF)"}, {162, "Canon EF 200mm f/2.8L USM"}, {163, "Canon EF 300mm f/4L"}, {164, "Canon EF 400mm f/5.6L"}, @@ -757,6 +761,7 @@ public: {169, "Sigma 85mm f/1.4 EX DG HSM"}, {169, "Sigma 30mm f/1.4 EX DC HSM"}, {169, "Sigma 35mm f/1.4 DG HSM"}, + {169, "Sigma 35mm f/1.5 FF High-Speed Prime | 017"}, {170, "Canon EF 200mm f/2.8L II USM"}, {171, "Canon EF 300mm f/4L USM"}, {172, "Canon EF 400mm f/5.6L USM or Sigma Lens"}, @@ -780,6 +785,9 @@ public: {180, "Zeiss Milvus 50mm f/1.4"}, {180, "Zeiss Milvus 85mm f/1.4"}, {180, "Zeiss Otus 28mm f/1.4 ZE"}, + {180, "Sigma 24mm f/1.5 FF High-Speed Prime | 017"}, + {180, "Sigma 50mm f/1.5 FF High-Speed Prime | 017"}, + {180, "Sigma 85mm f/1.5 FF High-Speed Prime | 017"}, {181, "Canon EF 100-400mm f/4.5-5.6L IS USM + 1.4x or Sigma Lens"}, {181, "Sigma 150-600mm f/5-6.3 DG OS HSM | S + 1.4x"}, {182, "Canon EF 100-400mm f/4.5-5.6L IS USM + 2x or Sigma Lens"}, @@ -791,6 +799,7 @@ public: {183, "Sigma 150-600mm f/5-6.3 DG OS HSM | C"}, {183, "Sigma 150-600mm f/5-6.3 DG OS HSM | S"}, {183, "Sigma 100-400mm f/5-6.3 DG OS HSM"}, + {183, "Sigma 180mm f/3.5 APO Macro EX DG IF HSM"}, {184, "Canon EF 400mm f/2.8L USM + 2x"}, {185, "Canon EF 600mm f/4L IS USM"}, {186, "Canon EF 70-200mm f/4L USM"}, @@ -798,7 +807,8 @@ public: {188, "Canon EF 70-200mm f/4L USM + 2x"}, {189, "Canon EF 70-200mm f/4L USM + 2.8x"}, {190, "Canon EF 100mm f/2.8 Macro USM"}, - {191, "Canon EF 400mm f/4 DO IS"}, + {191, "Canon EF 400mm f/4 DO IS or Sigma Lens"}, + {191, "Sigma 500mm f/4 DG OS HSM"}, {193, "Canon EF 35-80mm f/4-5.6 USM"}, {194, "Canon EF 80-200mm f/4.5-5.6 USM"}, {195, "Canon EF 35-105mm f/4.5-5.6 USM"}, @@ -808,6 +818,7 @@ public: {198, "Canon EF 50mm f/1.4 USM or Zeiss Lens"}, {198, "Zeiss Otus 55mm f/1.4 ZE"}, {198, "Zeiss Otus 85mm f/1.4 ZE"}, + {198, "Zeiss Milvus 25mm f/1.4"}, {199, "Canon EF 28-80mm f/3.5-5.6 USM"}, {200, "Canon EF 75-300mm f/4-5.6 USM"}, {201, "Canon EF 28-80mm f/3.5-5.6 USM"}, @@ -841,8 +852,10 @@ public: {236, "Canon EF-S 60mm f/2.8 Macro USM"}, {237, "Canon EF 24-105mm f/4L IS USM"}, {238, "Canon EF 70-300mm f/4-5.6 IS USM"}, - {239, "Canon EF 85mm f/1.2L II USM"}, - {240, "Canon EF-S 17-55mm f/2.8 IS USM"}, + {239, "Canon EF 85mm f/1.2L II USM or Rokinon Lens"}, + {239, "Rokinon SP 85mm f/1.2"}, + {240, "Canon EF-S 17-55mm f/2.8 IS USM or Sigma Lens"}, + {240, "Sigma 17-50mm f/2.8 EX DC OS HSM"}, {241, "Canon EF 50mm f/1.2L USM"}, {242, "Canon EF 70-200mm f/4L IS USM"}, {243, "Canon EF 70-200mm f/4L IS USM + 1.4x"}, @@ -852,16 +865,23 @@ public: {247, "Canon EF 14mm f/2.8L II USM"}, {248, "Canon EF 200mm f/2L IS USM or Sigma Lens"}, {248, "Sigma 24-35mm f/2 DG HSM | A"}, + {248, "Sigma 135mm f/2 FF High-Speed Prime | 017"}, + {248, "Sigma 24-35mm f/2.2 FF Zoom | 017"}, {249, "Canon EF 800mm f/5.6L IS USM"}, {250, "Canon EF 24mm f/1.4L II USM or Sigma Lens"}, {250, "Sigma 20mm f/1.4 DG HSM | A"}, + {250, "Sigma 20mm f/1.5 FF High-Speed Prime | 017"}, {251, "Canon EF 70-200mm f/2.8L IS II USM"}, {252, "Canon EF 70-200mm f/2.8L IS II USM + 1.4x"}, {253, "Canon EF 70-200mm f/2.8L IS II USM + 2x"}, {254, "Canon EF 100mm f/2.8L Macro IS USM"}, {255, "Sigma 24-105mm f/4 DG OS HSM | A or Other Sigma Lens"}, {255, "Sigma 180mm f/2.8 EX DG OS HSM APO Macro"}, - {368, "Sigma 14-24mm f/2.8 DG HSM | A"}, + {368, "Sigma 14-24mm f/2.8 DG HSM | A or other Sigma Lens"}, + {368, "Sigma 20mm f/1.4 DG HSM | A"}, + {368, "Sigma 50mm f/1.4 DG HSM | A"}, + {368, "Sigma 40mm f/1.4 DG HSM | A"}, + {368, "Sigma 60-600mm f/4.5-6.3 DG OS HSM | S"}, {488, "Canon EF-S 15-85mm f/3.5-5.6 IS USM"}, {489, "Canon EF 70-300mm f/4-5.6L IS USM"}, {490, "Canon EF 8-15mm f/4L Fisheye USM"}, @@ -869,6 +889,9 @@ public: {491, "Tamron SP 70-200mm f/2.8 Di VC USD G2 (A025)"}, {491, "Tamron 18-400mm f/3.5-6.3 Di II VC HLD (B028)"}, {491, "Tamron 100-400mm f/4.5-6.3 Di VC USD (A035)"}, + {491, "Tamron 70-210mm f/4 Di VC USD (A034)"}, + {491, "Tamron 70-210mm f/4 Di VC USD (A034) + 1.4x"}, + {491, "Tamron SP 24-70mm f/2.8 Di VC USD G2 (A032)"}, {492, "Canon EF 400mm f/2.8L IS II USM"}, {493, "Canon EF 500mm f/4L IS II USM or EF 24-105mm f4L IS USM"}, {493, "Canon EF 24-105mm f/4L IS USM"}, @@ -887,11 +910,18 @@ public: {508, "Tamron 10-24mm f/3.5-4.5 Di II VC HLD"}, {747, "Canon EF 100-400mm f/4.5-5.6L IS II USM or Tamron Lens"}, {747, "Tamron SP 150-600mm f/5-6.3 Di VC USD G2"}, - {748, "Canon EF 100-400mm f/4.5-5.6L IS II USM + 1.4x"}, + {748, "Canon EF 100-400mm f/4.5-5.6L IS II USM + 1.4x or Tamron Lens"}, + {748, "Tamron 100-400mm f/4.5-6.3 Di VC USD A035E + 1.4x"}, + {748, "Tamron 70-210mm f/4 Di VC USD (A034) + 2x"}, + {749, "Tamron 100-400mm f/4.5-6.3 Di VC USD A035E + 2x"}, {750, "Canon EF 35mm f/1.4L II USM"}, {751, "Canon EF 16-35mm f/2.8L III USM"}, {752, "Canon EF 24-105mm f/4L IS II USM"}, {753, "Canon EF 85mm f/1.4L IS USM"}, + {754, "Canon EF 70-200mm f/4L IS II USM"}, + {757, "Canon EF 400mm f/2.8L IS III USM"}, + {758, "Canon EF 600mm f/4L IS III USM"}, + {1136, "Sigma 24-70mm f/2.8 DG OS HSM | Art 017"}, {4142, "Canon EF-S 18-135mm f/3.5-5.6 IS STM"}, {4143, "Canon EF-M 18-55mm f/3.5-5.6 IS STM or Tamron Lens"}, {4143, "Tamron 18-200mm f/3.5-6.3 Di III VC"}, @@ -909,9 +939,14 @@ public: {4156, "Canon EF 50mm f/1.8 STM"}, {4157, "Canon EF-M 18-150mm 1:3.5-6.3 IS STM"}, {4158, "Canon EF-S 18-55mm f/4-5.6 IS STM"}, + {4159, "Canon EF-M 32mm f/1.4 STM"}, {4160, "Canon EF-S 35mm f/2.8 Macro IS STM"}, {36910, "Canon EF 70-300mm f/4-5.6 IS II USM"}, {36912, "Canon EF-S 18-135mm f/3.5-5.6 IS USM"}, + {61182, "Canon RF 35mm F1.8 Macro IS STM or other Canon RF Lens"}, + {61182, "Canon RF 50mm F1.2 L USM"}, + {61182, "Canon RF 24-105mm F4 L IS USM"}, + {61182, "Canon RF 28-70mm F2 L USM"}, {61491, "Canon CN-E 14mm T3.1 L F"}, {61492, "Canon CN-E 24mm T1.5 L F"}, {61494, "Canon CN-E 85mm T1.3 L F"}, @@ -1477,6 +1512,8 @@ public: CAModelIDInterpreter () { choices[1042] = "EOS M50 / Kiss M"; + choices[2049] = "PowerShot SX740 HS"; + choices[2053] = "PowerShot SX70 HS"; choices[16842752] = "PowerShot A30"; choices[17039360] = "PowerShot S300 / Digital IXUS 300 / IXY Digital 300"; choices[17170432] = "PowerShot A20"; @@ -1799,6 +1836,7 @@ public: choices[2147484680] = "EOS 77D / 9000D"; choices[2147484695] = "EOS Rebel SL2 / 200D / Kiss X9"; choices[2147484706] = "EOS Rebel T100 / 4000D / 3000D"; + choices[2147484708] = "EOR R"; choices[2147484722] = "EOS Rebel T7 / 2000D / 1500D / Kiss X90"; } }; diff --git a/rtexif/nikonattribs.cc b/rtexif/nikonattribs.cc index fc0fc22db..e534f8123 100644 --- a/rtexif/nikonattribs.cc +++ b/rtexif/nikonattribs.cc @@ -850,7 +850,9 @@ const std::map NALensDataInterpreter::lenses = { {"49 3C A6 A6 30 30 F2 02", "AF-S Nikkor 600mm f/4D IF-ED + TC-20E"}, {"4A 40 11 11 2C 0C 4D 02", "Samyang 8mm f/3.5 Fish-Eye CS"}, {"4A 48 1E 1E 24 0C 4D 02", "Samyang 12mm f/2.8 ED AS NCS Fish-Eye"}, + {"4A 48 24 24 24 0C 4D 02", "Samyang 10mm f/2.8 ED AS NCS CS"}, {"4A 48 24 24 24 0C 4D 02", "Samyang AE 14mm f/2.8 ED AS IF UMC"}, + {"4A 4C 24 24 1E 6C 4D 06", "Samyang 14mm f/2.4 Premium"}, {"4A 54 29 29 18 0C 4D 02", "Samyang 16mm f/2.0 ED AS UMC CS"}, {"4A 54 62 62 0C 0C 4D 02", "AF Nikkor 85mm f/1.4D IF"}, {"4A 60 36 36 0C 0C 4D 02", "Samyang 24mm f/1.4 ED AS UMC"}, @@ -910,7 +912,7 @@ const std::map NALensDataInterpreter::lenses = { {"74 40 37 62 2C 34 78 06", "AF-S Zoom-Nikkor 24-85mm f/3.5-4.5G IF-ED"}, {"75 40 3C 68 2C 3C 79 06", "AF Zoom-Nikkor 28-100mm f/3.5-5.6G"}, {"76 58 50 50 14 14 7A 02", "AF Nikkor 50mm f/1.8D"}, - {"77 44 60 98 34 3C 7B 0E", "Sigma 80-400mm f4.5-5.6 APO DG D OS"}, + {"77 44 60 98 34 3C 7B 0E", "Sigma 80-400mm f/4.5-5.6 APO DG D OS"}, {"77 44 61 98 34 3C 7B 0E", "Sigma 80-400mm f/4.5-5.6 EX OS"}, {"77 48 5C 80 24 24 7B 0E", "AF-S VR Zoom-Nikkor 70-200mm f/2.8G IF-ED"}, {"78 40 37 6E 2C 3C 7C 0E", "AF-S VR Zoom-Nikkor 24-120mm f/3.5-5.6G IF-ED"}, @@ -953,6 +955,7 @@ const std::map NALensDataInterpreter::lenses = { {"8B 4C 2D 44 14 14 4B 06", "Sigma 18-35mm f/1.8 DC HSM"}, {"8C 40 2D 53 2C 3C 8E 06", "AF-S DX Zoom-Nikkor 18-55mm f/3.5-5.6G ED"}, {"8D 44 5C 8E 34 3C 8F 0E", "AF-S VR Zoom-Nikkor 70-300mm f/4.5-5.6G IF-ED"}, + {"8D 48 6E 8E 24 24 4B 0E", "Sigma 120-300mm f/2.8 DG OS HSM Sports"}, {"8E 3C 2B 5C 24 30 4B 0E", "Sigma 17-70mm f/2.8-4 DC Macro OS HSM | C"}, {"8F 40 2D 72 2C 3C 91 06", "AF-S DX Zoom-Nikkor 18-135mm f/3.5-5.6G IF-ED"}, {"8F 48 2B 50 24 24 4B 0E", "Sigma 17-50mm f/2.8 EX DC OS HSM"}, @@ -963,7 +966,7 @@ const std::map NALensDataInterpreter::lenses = { {"92 48 24 37 24 24 94 06", "AF-S Zoom-Nikkor 14-24mm f/2.8G ED"}, {"93 48 37 5C 24 24 95 06", "AF-S Zoom-Nikkor 24-70mm f/2.8G ED"}, {"94 40 2D 53 2C 3C 96 06", "AF-S DX Zoom-Nikkor 18-55mm f/3.5-5.6G ED II"}, - {"94 48 7C 7C 24 24 4B 0E", "Sigma 180mm f/2.8 APO Macro EX DG OS"}, + {"94 48 7C 7C 24 24 4B 0E", "Sigma APO Macro 180mm f/2.8 EX DG OS HSM"}, {"95 00 37 37 2C 2C 97 06", "PC-E Nikkor 24mm f/3.5D ED"}, {"95 4C 37 37 2C 2C 97 02", "PC-E Nikkor 24mm f/3.5D ED"}, {"96 38 1F 37 34 3C 4B 06", "Sigma 12-24mm f/4.5-5.6 II DG HSM"}, @@ -975,6 +978,7 @@ const std::map NALensDataInterpreter::lenses = { {"99 40 29 62 2C 3C 9B 0E", "AF-S DX VR Zoom-Nikkor 16-85mm f/3.5-5.6G ED"}, {"99 48 76 76 24 24 4B 0E", "Sigma APO Macro 150mm f/2.8 EX DG OS HSM"}, {"9A 40 2D 53 2C 3C 9C 0E", "AF-S DX VR Zoom-Nikkor 18-55mm f/3.5-5.6G"}, + {"9A 4C 50 50 14 14 9C 06", "Yongnuo YN50mm f/1.8N"}, {"9B 00 4C 4C 24 24 9D 06", "PC-E Micro Nikkor 45mm f/2.8D ED"}, {"9B 54 4C 4C 24 24 9D 02", "PC-E Micro Nikkor 45mm f/2.8D ED"}, {"9B 54 62 62 0C 0C 4B 06", "Sigma 85mm f/1.4 EX DG HSM"}, @@ -997,37 +1001,54 @@ const std::map NALensDataInterpreter::lenses = { {"A1 54 55 55 0C 0C BC 06", "AF-S Nikkor 58mm f/1.4G"}, {"A2 40 2D 53 2C 3C BD 0E", "AF-S DX Nikkor 18-55mm f/3.5-5.6G VR II"}, {"A2 48 5C 80 24 24 A4 0E", "AF-S Nikkor 70-200mm f/2.8G ED VR II"}, + {"A3 38 5C 8E 34 40 CE 0E", "AF-P DX Nikkor 70-300mm f/4.5-6.3G ED"}, + {"A3 38 5C 8E 34 40 CE 8E", "AF-P DX Nikkor 70-300mm f/4.5-6.3G ED VR"}, {"A3 3C 29 44 30 30 A5 0E", "AF-S Nikkor 16-35mm f/4G ED VR"}, {"A3 3C 5C 8E 30 3C 4B 0E", "Sigma 70-300mm f/4-5.6 DG OS"}, {"A4 40 2D 8E 2C 40 BF 0E", "AF-S DX Nikkor 18-300mm f/3.5-6.3G ED VR"}, {"A4 47 2D 50 24 34 4B 0E", "Sigma 18-50mm f/2.8-4.5 DC OS HSM"}, {"A4 48 5C 80 24 24 CF 0E", "AF-S Nikkor 70-200mm f/2.8E FL ED VR"}, + {"A4 48 5C 80 24 24 CF 4E", "AF-S Nikkor 70-200mm f/2.8E FL ED VR"}, {"A4 54 37 37 0C 0C A6 06", "AF-S Nikkor 24mm f/1.4G ED"}, {"A5 40 2D 88 2C 40 4B 0E", "Sigma 18-250mm f/3.5-6.3 DC OS HSM"}, {"A5 40 3C 8E 2C 3C A7 0E", "AF-S Nikkor 28-300mm f/3.5-5.6G ED VR"}, {"A5 4C 44 44 14 14 C0 06", "AF-S Nikkor 35mm f/1.8G ED"}, {"A5 54 6A 6A 0C 0C D0 06", "AF-S Nikkor 105mm f/1.4E ED"}, {"A5 54 6A 6A 0C 0C D0 46", "AF-S Nikkor 105mm f/1.4E ED"}, + {"A6 48 2F 2F 30 30 D1 06", "PC Nikkor 19mm f/4E ED"}, + {"A6 48 2F 2F 30 30 D1 46", "PC Nikkor 19mm f/4E ED"}, {"A6 48 37 5C 24 24 4B 06", "Sigma 24-70mm f/2.8 IF EX DG HSM"}, - {"A6 48 8E 8E 24 24 A8 0E", "AF-S VR Nikkor 300mm f/2.8G IF-ED II"}, + {"A6 48 8E 8E 24 24 A8 0E", "AF-S Nikkor 300mm f/2.8G IF-ED VR II"}, {"A6 48 98 98 24 24 C1 0E", "AF-S Nikkor 400mm f/2.8E FL ED VR"}, {"A7 3C 53 80 30 3C C2 0E", "AF-S DX Nikkor 55-200mm f/4-5.6G ED VR II"}, + {"A7 40 11 26 2C 34 D2 06", "AF-S Fisheye Nikkor 8-15mm f/3.5-4.5E ED"}, + {"A7 40 11 26 2C 34 D2 46", "AF-S Fisheye Nikkor 8-15mm f/3.5-4.5E ED"}, {"A7 49 80 A0 24 24 4B 06", "Sigma APO 200-500mm f/2.8 EX DG"}, {"A7 4B 62 62 2C 2C A9 0E", "AF-S DX Micro Nikkor 85mm f/3.5G ED VR"}, + {"A8 38 18 30 34 3C D3 0E", "AF-P DX Nikkor 10-20mm f/4.5-5.6G VR"}, {"A8 38 18 30 34 3C D3 8E", "AF-P DX Nikkor 10-20mm f/4.5-5.6G VR"}, - {"A8 48 80 98 30 30 AA 0E", "AF-S VR Zoom-Nikkor 200-400mm f/4G IF-ED II"}, + {"A8 48 80 98 30 30 AA 0E", "AF-S Zoom-Nikkor 200-400mm f/4G IF-ED VR II"}, {"A8 48 8E 8E 30 30 C3 0E", "AF-S Nikkor 300mm f/4E PF ED VR"}, {"A8 48 8E 8E 30 30 C3 4E", "AF-S Nikkor 300mm f/4E PF ED VR"}, + {"A9 48 7C 98 30 30 D4 0E", "AF-S Nikkor 180-400mm f/4E TC1.4 FL ED VR"}, {"A9 48 7C 98 30 30 D4 4E", "AF-S Nikkor 180-400mm f/4E TC1.4 FL ED VR"}, {"A9 4C 31 31 14 14 C4 06", "AF-S Nikkor 20mm f/1.8G ED"}, {"A9 54 80 80 18 18 AB 0E", "AF-S Nikkor 200mm f/2G ED VR II"}, {"AA 3C 37 6E 30 30 AC 0E", "AF-S Nikkor 24-120mm f/4G ED VR"}, + {"AA 48 37 5C 24 24 C5 0E", "AF-S Nikkor 24-70mm f/2.8E ED VR"}, {"AA 48 37 5C 24 24 C5 4E", "AF-S Nikkor 24-70mm f/2.8E ED VR"}, + {"AA 48 88 A4 3C 3C D5 0E", "AF-S Nikkor 180-400mm f/4E TC1.4 FL ED VR + 1.4x TC"}, {"AA 48 88 A4 3C 3C D5 4E", "AF-S Nikkor 180-400mm f/4E TC1.4 FL ED VR + 1.4x TC"}, {"AB 3C A0 A0 30 30 C6 4E", "AF-S Nikkor 500mm f/4E FL ED VR"}, - {"AC 38 53 8E 34 3C AE 0E", "AF-S DX VR Nikkor 55-300mm f/4.5-5.6G ED"}, + {"AB 44 5C 8E 34 3C D6 0E", "AF-P Nikkor 70-300mm f/4.5-5.6E ED VR"}, + {"AB 44 5C 8E 34 3C D6 CE", "AF-P Nikkor 70-300mm f/4.5-5.6E ED VR"}, + {"AC 38 53 8E 34 3C AE 0E", "AF-S DX Nikkor 55-300mm f/4.5-5.6G ED VR"}, {"AC 3C A6 A6 30 30 C7 4E", "AF-S Nikkor 600mm f/4E FL ED VR"}, + {"AC 54 3C 3C 0C 0C D7 06", "AF-S Nikkor 28mm f/1.4E ED"}, + {"AC 54 3C 3C 0C 0C D7 46", "AF-S Nikkor 28mm f/1.4E ED"}, {"AD 3C 2D 8E 2C 3C AF 0E", "AF-S DX Nikkor 18-300mm f/3.5-5.6G ED VR"}, + {"AD 3C A0 A0 3C 3C D8 0E", "AF-S Nikkor 500mm f/5.6E PF ED VR"}, + {"AD 3C A0 A0 3C 3C D8 4E", "AF-S Nikkor 500mm f/5.6E PF ED VR"}, {"AD 48 28 60 24 30 C8 0E", "AF-S DX Nikkor 16-80mm f/2.8-4E ED VR"}, {"AD 48 28 60 24 30 C8 4E", "AF-S DX Nikkor 16-80mm f/2.8-4E ED VR"}, {"AE 3C 80 A0 3C 3C C9 0E", "AF-S Nikkor 200-500mm f/5.6E ED VR"}, @@ -1039,7 +1060,7 @@ const std::map NALensDataInterpreter::lenses = { {"B1 48 48 48 24 24 B3 06", "AF-S DX Micro Nikkor 40mm f/2.8G"}, {"B2 48 5C 80 30 30 B4 0E", "AF-S Nikkor 70-200mm f/4G ED VR"}, {"B3 4C 62 62 14 14 B5 06", "AF-S Nikkor 85mm f/1.8G"}, - {"B4 40 37 62 2C 34 B6 0E", "AF-S VR Zoom-Nikkor 24-85mm f/3.5-4.5G IF-ED"}, + {"B4 40 37 62 2C 34 B6 0E", "AF-S Zoom-Nikkor 24-85mm f/3.5-4.5G IF-ED VR"}, {"B5 4C 3C 3C 14 14 B7 06", "AF-S Nikkor 28mm f/1.8G"}, {"B6 3C B0 B0 3C 3C B8 0E", "AF-S VR Nikkor 800mm f/5.6E FL ED"}, {"B6 3C B0 B0 3C 3C B8 4E", "AF-S VR Nikkor 800mm f/5.6E FL ED"}, @@ -1048,8 +1069,11 @@ const std::map NALensDataInterpreter::lenses = { {"B8 40 2D 44 2C 34 BA 06", "AF-S Nikkor 18-35mm f/3.5-4.5G ED"}, {"BF 3C 1B 1B 30 30 01 04", "Irix 11mm f/4 Firefly"}, {"BF 4E 26 26 1E 1E 01 04", "Irix 15mm f/2.4 Firefly"}, + {"C1 48 24 37 24 24 4B 46", "Sigma 14-24mm f/2.8 DG HSM | A"}, + {"C2 4C 24 24 14 14 4B 06", "Sigma 14mm f/1.8 DG HSM | A"}, {"C3 34 68 98 38 40 4B 4E", "Sigma 100-400mm f/5-6.3 DG OS HSM | C"}, {"C8 54 62 62 0C 0C 4B 46", "Sigma 85mm f/1.4 DG HSM | A"}, + {"C9 48 37 5C 24 24 4B 4E", "Sigma 24-70mm f/2.8 DG OS HSM | A"}, {"CC 4C 50 68 14 14 4B 06", "Sigma 50-100mm f/1.8 DC HSM | A"}, {"CD 3D 2D 70 2E 3C 4B 0E", "Sigma 18-125mm f/3.8-5.6 DC OS HSM"}, {"CE 34 76 A0 38 40 4B 0E", "Sigma 150-500mm f/5-6.3 DG OS APO HSM"}, @@ -1058,7 +1082,10 @@ const std::map NALensDataInterpreter::lenses = { {"DC 48 19 19 24 24 4B 06", "Sigma 10mm f/2.8 EX DC HSM Fisheye"}, {"DE 54 50 50 0C 0C 4B 06", "Sigma 50mm f/1.4 EX DG HSM"}, {"E0 3C 5C 8E 30 3C 4B 06", "Sigma 70-300mm f/4-5.6 APO DG Macro HSM"}, + {"E0 40 2D 98 2C 41 DF 4E", "Tamron AF 18-400mm f/3.5-6.3 Di II VC HLD (B028)"}, + {"E1 40 19 36 2C 35 DF 4E", "Tamron 10-24mm f/3.5-4.5 Di II VC HLD (B023)"}, {"E1 58 37 37 14 14 1C 02", "Sigma 24mm f/1.8 EX DG Aspherical Macro"}, + {"E2 47 5C 80 24 24 DF 4E", "Tamron SP 70-200mm f/2.8 Di VC USD G2 (A025)"}, {"E3 40 76 A6 38 40 DF 4E", "Tamron SP 150-600mm f/5-6.3 Di VC USD G2"}, {"E3 54 50 50 24 24 35 02", "Sigma Macro 50mm f/2.8 EX DG"}, {"E4 54 64 64 24 24 DF 0E", "Tamron SP 90mm f/2.8 Di VC USD Macro 1:1 (F017)"}, diff --git a/rtexif/pentaxattribs.cc b/rtexif/pentaxattribs.cc index 4d9a31b6f..0968271e5 100644 --- a/rtexif/pentaxattribs.cc +++ b/rtexif/pentaxattribs.cc @@ -937,6 +937,7 @@ public: choices.insert (p_t (256 * 8 + 61, "HD PENTAX-D FA 28-105mm f/3.5-5.6 ED DC WR")); choices.insert (p_t (256 * 8 + 62, "HD PENTAX-D FA 24-70mm f/2.8 ED SDM WR")); choices.insert (p_t (256 * 8 + 63, "HD PENTAX-D FA 15-30mm f/2.8 ED SDM WR")); + choices.insert (p_t (256 * 8 + 64, "HD PENTAX-D FA* 50mm f/1.4 SDM AW")); choices.insert (p_t (256 * 8 + 197, "HD PENTAX-DA 55-300mm f/4.5-6.3 ED PLM WR RE")); choices.insert (p_t (256 * 8 + 198, "smc PENTAX-DA L 18-50mm f/4-5.6 DC WR RE")); choices.insert (p_t (256 * 8 + 199, "HD PENTAX-DA 18-50mm f/4-5.6 DC WR RE")); diff --git a/rtexif/sonyminoltaattribs.cc b/rtexif/sonyminoltaattribs.cc index 834d436f9..76ed788c2 100644 --- a/rtexif/sonyminoltaattribs.cc +++ b/rtexif/sonyminoltaattribs.cc @@ -818,6 +818,7 @@ public: {2672, "Minolta AF 24-105mm f/3.5-4.5 (D)"}, {3046, "Metabones Canon EF Speed Booster"}, {4567, "Tokina 70-210mm f/4-5.6"}, + {4570, "Tamron AF 35-135mm f/3.5-4.5"}, {4571, "Vivitar 70-210mm f/4.5-5.6"}, {4574, "2x Teleconverter or Tamron or Tokina Lens"}, {4574, "Tamron SP AF 90mm f/2.5"}, @@ -851,6 +852,7 @@ public: {6553, "Sony FE 12-24mm f/4 G"}, {6553, "Sony FE 90mm f/2.8 Macro G OSS"}, {6553, "Sony E 18-50mm f/4-5.6"}, + {6553, "Sony FE 24mm f/1.4 GM"}, {6553, "Sony FE 24-105mm f/4 G OSS"}, {6553, "Sony E PZ 18-200mm f/3.5-6.3 OSS"}, {6553, "Sony FE 55mm f/1.8 ZA"}, @@ -874,20 +876,26 @@ public: {6553, "Sony FE 100-400mm f/4.5-5.6 GM OSS"}, {6553, "Sony FE 70-200mm f/2.8 GM OSS"}, {6553, "Sony FE 16-35mm f/2.8 GM"}, + {6553, "Sony FE 400mm f/2.8 GM OSS"}, {6553, "Sony E 18-135mm f/3.5-5.6 OSS"}, {6553, "Sony FE 70-200mm f/2.8 GM OSS + 1.4X Teleconverter"}, {6553, "Sony FE 70-200mm f/2.8 GM OSS + 2X Teleconverter"}, {6553, "Sony FE 100-400mm f/4.5-5.6 GM OSS + 1.4X Teleconverter"}, {6553, "Sony FE 100-400mm f/4.5-5.6 GM OSS + 2X Teleconverter"}, + {6553, "Sony FE 400mm f/2.8 GM OSS + 1.4X Teleconverter"}, + {6553, "Sony FE 400mm f/2.8 GM OSS + 2X Teleconverter"}, {6553, "Samyang AF 50mm f/1.4 FE"}, {6553, "Samyang AF 14mm f/2.8 FE"}, + {6553, "Samyang AF 24mm f/2.8"}, {6553, "Samyang AF 35mm f/2.8 FE"}, {6553, "Samyang AF 35mm f/1.4"}, {6553, "Sigma 19mm f/2.8 [EX] DN"}, {6553, "Sigma 30mm f/2.8 [EX] DN"}, {6553, "Sigma 60mm f/2.8 DN"}, {6553, "Sigma 30mm f/1.4 DC DN | C"}, + {6553, "Sigma 85mm f/1.4 DG HSM | A"}, {6553, "Sigma 16mm f/1.4 DC DN | C"}, + {6553, "Sigma 70mm f/2.8 DG MACRO | A"}, {6553, "Tamron 18-200mm f/3.5-6.3 Di III VC"}, {6553, "Tamron 28-75mm f/2.8 Di III RXD"}, {6553, "Tokina Firin 20mm f/2 FE MF"}, @@ -897,6 +905,7 @@ public: {6553, "Voigtlander MACRO APO-LANTHAR 65mm f/2 Aspherical"}, {6553, "Voigtlander NOKTON 40mm f/1.2 Aspherical"}, {6553, "Voigtlander NOKTON classic 35mm f/1.4"}, + {6553, "Voigtlander COLOR-SKOPAR 21mm f/3.5 Aspherical"}, {6553, "Zeiss Touit 12mm f/2.8"}, {6553, "Zeiss Touit 32mm f/1.8"}, {6553, "Zeiss Touit 50mm f/2.8 Macro"}, @@ -904,6 +913,7 @@ public: {6553, "Zeiss Batis 85mm f/1.8"}, {6553, "Zeiss Batis 18mm f/2.8"}, {6553, "Zeiss Batis 135mm f/2.8"}, + {6553, "Zeiss Batis 40mm f/2 CF"}, {6553, "Zeiss Loxia 50mm f/2"}, {6553, "Zeiss Loxia 35mm f/2"}, {6553, "Zeiss Loxia 21mm f/2.8"}, @@ -1029,6 +1039,7 @@ public: {26721, "Minolta AF 24-105mm f/3.5-4.5 (D)"}, {30464, "Metabones Canon EF Speed Booster"}, {45671, "Tokina 70-210mm f/4-5.6"}, + {45701, "Tamron AF 35-135mm f/3.5-4.5"}, {45711, "Vivitar 70-210mm f/4.5-5.6"}, {45741, "2x Teleconverter or Tamron or Tokina Lens"}, {45741, "Tamron SP AF 90mm f/2.5"}, @@ -1062,6 +1073,7 @@ public: {65535, "Sony FE 12-24mm f/4 G"}, {65535, "Sony FE 90mm f/2.8 Macro G OSS"}, {65535, "Sony E 18-50mm f/4-5.6"}, + {65535, "Sony FE 24mm f/1.4 GM"}, {65535, "Sony FE 24-105mm f/4 G OSS"}, {65535, "Sony E PZ 18-200mm f/3.5-6.3 OSS"}, {65535, "Sony FE 55mm f/1.8 ZA"}, @@ -1085,20 +1097,26 @@ public: {65535, "Sony FE 100-400mm f/4.5-5.6 GM OSS"}, {65535, "Sony FE 70-200mm f/2.8 GM OSS"}, {65535, "Sony FE 16-35mm f/2.8 GM"}, + {65535, "Sony FE 400mm f/2.8 GM OSS"}, {65535, "Sony E 18-135mm f/3.5-5.6 OSS"}, {65535, "Sony FE 70-200mm f/2.8 GM OSS + 1.4X Teleconverter"}, {65535, "Sony FE 70-200mm f/2.8 GM OSS + 2X Teleconverter"}, {65535, "Sony FE 100-400mm f/4.5-5.6 GM OSS + 1.4X Teleconverter"}, {65535, "Sony FE 100-400mm f/4.5-5.6 GM OSS + 2X Teleconverter"}, + {65535, "Sony FE 400mm f/2.8 GM OSS + 1.4X Teleconverter"}, + {65535, "Sony FE 400mm f/2.8 GM OSS + 2X Teleconverter"}, {65535, "Samyang AF 50mm f/1.4 FE"}, {65535, "Samyang AF 14mm f/2.8 FE"}, + {65535, "Samyang AF 24mm f/2.8"}, {65535, "Samyang AF 35mm f/2.8 FE"}, {65535, "Samyang AF 35mm f/1.4"}, {65535, "Sigma 19mm f/2.8 [EX] DN"}, {65535, "Sigma 30mm f/2.8 [EX] DN"}, {65535, "Sigma 60mm f/2.8 DN"}, {65535, "Sigma 30mm f/1.4 DC DN | C"}, + {65535, "Sigma 85mm f/1.4 DG HSM | A"}, {65535, "Sigma 16mm f/1.4 DC DN | C"}, + {65535, "Sigma 70mm f/2.8 DG MACRO | A"}, {65535, "Tamron 18-200mm f/3.5-6.3 Di III VC"}, {65535, "Tamron 28-75mm f/2.8 Di III RXD"}, {65535, "Tokina Firin 20mm f/2 FE MF"}, @@ -1108,6 +1126,7 @@ public: {65535, "Voigtlander MACRO APO-LANTHAR 65mm f/2 Aspherical"}, {65535, "Voigtlander NOKTON 40mm f/1.2 Aspherical"}, {65535, "Voigtlander NOKTON classic 35mm f/1.4"}, + {65535, "Voigtlander COLOR-SKOPAR 21mm f/3.5 Aspherical"}, {65535, "Zeiss Touit 12mm f/2.8"}, {65535, "Zeiss Touit 32mm f/1.8"}, {65535, "Zeiss Touit 50mm f/2.8 Macro"}, @@ -1115,6 +1134,7 @@ public: {65535, "Zeiss Batis 85mm f/1.8"}, {65535, "Zeiss Batis 18mm f/2.8"}, {65535, "Zeiss Batis 135mm f/2.8"}, + {65535, "Zeiss Batis 40mm f/2 CF"}, {65535, "Zeiss Loxia 50mm f/2"}, {65535, "Zeiss Loxia 35mm f/2"}, {65535, "Zeiss Loxia 21mm f/2.8"}, @@ -1190,7 +1210,8 @@ public: choices.insert (p_t (32791, "Sony E 16-70mm f/4 ZA OSS")); choices.insert (p_t (32792, "Sony E 10-18mm f/4 OSS")); choices.insert (p_t (32793, "Sony E PZ 16-50mm f/3.5-5.6 OSS")); - choices.insert (p_t (32794, "Sony FE 35mm f/2.8 ZA")); + choices.insert (p_t (32794, "Sony FE 35mm f/2.8 ZA or Samyang AF 24mm f/2.8 FE")); + choices.insert (p_t (32794, "Samyang AF 24mm f/2.8 FE")); choices.insert (p_t (32795, "Sony FE 24-70mm f/4 ZA OSS")); choices.insert (p_t (32796, "Sony FE 85mm f/1.8")); choices.insert (p_t (32797, "Sony E 18-200mm f/3.5-6.3 OSS LE")); @@ -1200,6 +1221,7 @@ public: choices.insert (p_t (32801, "Sony FE 12-24mm f/4 G")); choices.insert (p_t (32802, "Sony FE 90mm f/2.8 Macro G OSS")); choices.insert (p_t (32803, "Sony E 18-50mm f/4-5.6")); + choices.insert (p_t (32804, "Sony FE 24mm f/1.4 GM")); choices.insert (p_t (32805, "Sony FE 24-105mm f/4 G OSS")); choices.insert (p_t (32807, "Sony E PZ 18-200mm f/3.5-6.3 OSS")); choices.insert (p_t (32808, "Sony FE 55mm f/1.8 ZA")); @@ -1223,12 +1245,15 @@ public: choices.insert (p_t (32829, "Sony FE 100-400mm f/4.5-5.6 GM OSS")); choices.insert (p_t (32830, "Sony FE 70-200mm f/2.8 GM OSS")); choices.insert (p_t (32831, "Sony FE 16-35mm f/2.8 GM")); + choices.insert (p_t (32848, "Sony FE 400mm f/2.8 GM OSS")); choices.insert (p_t (32849, "Sony E 18-135mm f/3.5-5.6 OSS")); choices.insert (p_t (33072, "Sony FE 70-200mm f/2.8 GM OSS + 1.4X Teleconverter")); choices.insert (p_t (33073, "Sony FE 70-200mm f/2.8 GM OSS + 2X Teleconverter")); choices.insert (p_t (33076, "Sony FE 100mm f/2.8 STF GM OSS (macro mode)")); choices.insert (p_t (33077, "Sony FE 100-400mm f/4.5-5.6 GM OSS + 1.4X Teleconverter")); choices.insert (p_t (33078, "Sony FE 100-400mm f/4.5-5.6 GM OSS + 2X Teleconverter")); + choices.insert (p_t (33079, "Sony FE 400mm f/2.8 GM OSS + 1.4X Teleconverter")); + choices.insert (p_t (33080, "Sony FE 400mm f/2.8 GM OSS + 2X Teleconverter")); choices.insert (p_t (49201, "Zeiss Touit 12mm f/2.8")); choices.insert (p_t (49202, "Zeiss Touit 32mm f/1.8")); choices.insert (p_t (49203, "Zeiss Touit 50mm f/2.8 Macro")); @@ -1236,6 +1261,7 @@ public: choices.insert (p_t (49217, "Zeiss Batis 85mm f/1.8")); choices.insert (p_t (49218, "Zeiss Batis 18mm f/2.8")); choices.insert (p_t (49219, "Zeiss Batis 135mm f/2.8")); + choices.insert (p_t (49220, "Zeiss Batis 40mm f/2 CF")); choices.insert (p_t (49232, "Zeiss Loxia 50mm f/2")); choices.insert (p_t (49233, "Zeiss Loxia 35mm f/2")); choices.insert (p_t (49234, "Zeiss Loxia 21mm f/2.8")); @@ -1255,14 +1281,17 @@ public: choices.insert (p_t (50492, "Sigma 24-105mm f/4 DG OS HSM | A + MC-11")); choices.insert (p_t (50493, "Sigma 17-70mm f/2.8-4 DC MACRO OS HSM | C + MC-11")); choices.insert (p_t (50495, "Sigma 50-100mm f/1.8 DC HSM | A + MC-11")); + choices.insert (p_t (50499, "Sigma 85mm f/1.4 DG HSM | A")); choices.insert (p_t (50501, "Sigma 100-400mm f/5-6.3 DG OS HSM | C + MC-11")); choices.insert (p_t (50503, "Sigma 16mm f/1.4 DC DN | C")); + choices.insert (p_t (50513, "Sigma 70mm f/2.8 DG MACRO | A")); choices.insert (p_t (50992, "Voigtlander SUPER WIDE-HELIAR 15mm f/4.5 III")); choices.insert (p_t (50993, "Voigtlander HELIAR-HYPER WIDE 10mm f/5.6")); choices.insert (p_t (50994, "Voigtlander ULTRA WIDE-HELIAR 12mm f/5.6 III")); choices.insert (p_t (50995, "Voigtlander MACRO APO-LANTHAR 65mm f/2 Aspherical")); choices.insert (p_t (50996, "Voigtlander NOKTON 40mm f/1.2 Aspherical")); choices.insert (p_t (50997, "Voigtlander NOKTON classic 35mm f/1.4")); + choices.insert (p_t (50999, "Voigtlander COLOR-SKOPAR 21mm f/3.5 Aspherical")); choices.insert (p_t (51505, "Samyang AF 14mm f/2.8 FE or Samyang AF 35mm f/2.8 FE")); choices.insert (p_t (51505, "Samyang AF 35mm f/2.8 FE")); choices.insert (p_t (51507, "Samyang AF 35mm f/1.4")); From 561ea418562e6353a6b7032f2de7a7263a0d622d Mon Sep 17 00:00:00 2001 From: Hombre Date: Mon, 12 Nov 2018 01:04:14 +0100 Subject: [PATCH 119/122] Updated French translation + minor change in Preferences window (no issue) --- rtdata/languages/Francais | 256 +++++++++++++++++++------------------- rtdata/languages/default | 2 +- rtgui/preferences.cc | 9 +- 3 files changed, 134 insertions(+), 133 deletions(-) diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais index adc0528ea..34c74ea67 100644 --- a/rtdata/languages/Francais +++ b/rtdata/languages/Francais @@ -5,6 +5,7 @@ ABOUT_TAB_CREDITS;Crédits ABOUT_TAB_LICENSE;Licence ABOUT_TAB_RELEASENOTES;Notes de version ABOUT_TAB_SPLASH;Splash +ADJUSTER_RESET_TO_DEFAULT;Clic - réinitialise à la valeur par défaut.\nCtrl+clic - réinitialise à la valeur initiale. BATCHQUEUE_AUTOSTART;Démarrage auto BATCHQUEUE_AUTOSTARTHINT;Démarrer automatiquement le traitement à l'arrivée d'une nouvelle tâche BATCHQUEUE_DESTFILENAME;Chemin et nom de fichier @@ -40,6 +41,10 @@ DYNPROFILEEDITOR_DELETE;Supprimer DYNPROFILEEDITOR_EDIT;Modifier DYNPROFILEEDITOR_EDIT_RULE;Modifier une règle de Profil Dynamique DYNPROFILEEDITOR_ENTRY_TOOLTIP;La correspondance est insensible à la casse.\nUtilisez le préfix "re:" pour entrer\nune expression régulière. +DYNPROFILEEDITOR_IMGTYPE_ANY;Tout +DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +DYNPROFILEEDITOR_IMGTYPE_STD;Standard DYNPROFILEEDITOR_MOVE_DOWN;Déplacer vers le bas DYNPROFILEEDITOR_MOVE_UP;Déplacer vers le haut DYNPROFILEEDITOR_NEW;Nouveau @@ -53,6 +58,7 @@ EXIFFILTER_CAMERA;Appareil photo EXIFFILTER_EXPOSURECOMPENSATION;Compensation d'exposition (EV) EXIFFILTER_FILETYPE;Type de fichier EXIFFILTER_FOCALLEN;Longueur focale +EXIFFILTER_IMAGETYPE;Type d'image EXIFFILTER_ISO;ISO EXIFFILTER_LENS;Objectif EXIFFILTER_METADATAFILTER;Activer les filtres sur les Métadonnées @@ -111,6 +117,8 @@ FILEBROWSER_AUTOFLATFIELD;Champ Uniforme auto FILEBROWSER_BROWSEPATHBUTTONHINT;Cliquez pour parcourir le chemin saisi FILEBROWSER_BROWSEPATHHINT;Saisissez le chemin à parcourir\nCtrl-O pour placer le focus sur le champ de saisie.\nEntrée / Ctrl-Entrée pour y naviguer;\nEsc pour effacer les modifications.\nShift-Esc pour enlever le focus.\n\n\nRaccourcis pour les chemins:\n ~ - le dossier utilisateur\n ! - le dossier Images de l'utilisateur FILEBROWSER_CACHE;Cache +FILEBROWSER_CACHECLEARFROMFULL;Vider tout y compris les profils mis en cache +FILEBROWSER_CACHECLEARFROMPARTIAL;Vider tout sauf les profils mis en cache FILEBROWSER_CLEARPROFILE;Remettre le profil à zéro FILEBROWSER_COLORLABEL_TOOLTIP;Label couleur\n\nUtilisez le menu déroulant ou le raccourci clavier:\nShift-Ctrl-0 Pas de couleur\nShift-Ctrl-1 Rouge\nShift-Ctrl-2 Jaune\nShift-Ctrl-3 Vert\nShift-Ctrl-4 Bleu\nShift-Ctrl-5 Pourpre FILEBROWSER_COPYPROFILE;Copier le profil @@ -225,6 +233,7 @@ GENERAL_NONE;Aucun GENERAL_OK;OK GENERAL_OPEN;Ouvrir GENERAL_PORTRAIT;Portrait +GENERAL_RESET;Réinitialiser GENERAL_SAVE;Enregistrer GENERAL_SAVE_AS;Enregistrer sous... GENERAL_SLIDER;Curseur @@ -237,6 +246,7 @@ HISTOGRAM_TOOLTIP_CHRO;Montrer/Cacher l'histogramme de Chromaticité HISTOGRAM_TOOLTIP_FULL;Basculer la vue de l'histogramme : complet (activé) / zoomé (désactivé) HISTOGRAM_TOOLTIP_G;Montrer/cacher l'histogramme VERT HISTOGRAM_TOOLTIP_L;Montrer/cacher l'histogramme Luminance CIELAB +HISTOGRAM_TOOLTIP_MODE;Bascule entre une échelle linéaire, linéaire-log et log-log de l'histogramme. HISTOGRAM_TOOLTIP_R;Montrer/cacher l'histogramme ROUGE HISTOGRAM_TOOLTIP_RAW;Montrer/Cacher l'histogramme des données RAW HISTORY_CHANGED;Changé @@ -476,7 +486,9 @@ HISTORY_MSG_231;N&B - Courbe 'Avant' HISTORY_MSG_232;N&B - Type de courbe 'Avant' HISTORY_MSG_233;N&B - Courbe 'Après' HISTORY_MSG_234;N&B - Type de courbe 'Après' +HISTORY_MSG_235;N&B - Mixeur de Canaux - Auto HISTORY_MSG_236;--inutilisé-- +HISTORY_MSG_237;N&B - Mixeur de Canaux HISTORY_MSG_238;FD - Étendu HISTORY_MSG_239;FD - Force HISTORY_MSG_240;FD - Centre @@ -512,6 +524,7 @@ HISTORY_MSG_269;Virage Partiel - HL - Rouge HISTORY_MSG_270;Virage Partiel - HL - Vert HISTORY_MSG_271;Virage Partiel - HL - Bleu HISTORY_MSG_272;Virage Partiel - Balance +HISTORY_MSG_273;Virage Partiel - Balance Couleur O/TM/HL HISTORY_MSG_274;Virage Partiel - Saturation des ombres HISTORY_MSG_275;Virage Partiel - Saturation des HL HISTORY_MSG_276;Virage Partiel - Opacité @@ -630,6 +643,7 @@ HISTORY_MSG_388;O - Résiduel - BC vert moyen HISTORY_MSG_389;O - Résiduel - BC bleu moyen HISTORY_MSG_390;O - Résiduel - BC vert bas HISTORY_MSG_391;O - Résiduel - BC bleu bas +HISTORY_MSG_392;O - Résiduel - Balance Couleur HISTORY_MSG_393;DCP - Table de corresp. (LUT) HISTORY_MSG_394;DCP - Exposition de base HISTORY_MSG_395;DCP - Table de base @@ -709,25 +723,65 @@ HISTORY_MSG_484;CAM02 - Yb auto scène HISTORY_MSG_485;Correction d'Objectif HISTORY_MSG_486;Corr. d'Obj. - Appareil HISTORY_MSG_487;Corr. d'Obj. - Objectif +HISTORY_MSG_488;Compression de Plage Dymanique +HISTORY_MSG_489;CPD - Détail +HISTORY_MSG_490;CPD - Quantité HISTORY_MSG_491;Balances des Blancs HISTORY_MSG_492;Courbes RVB HISTORY_MSG_493;Ajustements L*a*b* +HISTORY_MSG_CLAMPOOG;Tronquer les couleurs hors gamut HISTORY_MSG_COLORTONING_LABGRID_VALUE;Virage Partiel - Correction couleur +HISTORY_MSG_COLORTONING_LABREGION_AB;Virage Partiel - Correction couleur +HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;Virage Partiel - Masque C +HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;Virage Partiel - Masque T +HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;Virage Partiel - Luminosité +HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;Virage Partiel - Masque L +HISTORY_MSG_COLORTONING_LABREGION_LIST;Virage Partiel - Liste +HISTORY_MSG_COLORTONING_LABREGION_SATURATION;Virage Partiel - Saturation +HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;Virage Partiel - Montrer le masque +HISTORY_MSG_DEHAZE_DEPTH;EB - Profondeur +HISTORY_MSG_DEHAZE_ENABLED;Élimination de la Brume +HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;EB - Montrer carte de profondeur +HISTORY_MSG_DEHAZE_STRENGTH;EB - Force +HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Double dématriçage - Seuil auto +HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Double dématriçage - Seuil de contraste HISTORY_MSG_HISTMATCHING;Calcul Courbe Tonale svt Aperçu +HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Sortie - Primaires +HISTORY_MSG_ICM_OUTPUT_TEMP;Sortie - ICC-v4 illuminant D +HISTORY_MSG_ICM_OUTPUT_TYPE;Sortie - Type +HISTORY_MSG_ICM_WORKING_GAMMA;Travail - Gamma +HISTORY_MSG_ICM_WORKING_SLOPE;Travail - Pente +HISTORY_MSG_ICM_WORKING_TRC_METHOD;Travail - Méthode TRC HISTORY_MSG_LOCALCONTRAST_AMOUNT;Contraste Local - Quantité HISTORY_MSG_LOCALCONTRAST_DARKNESS;Contraste Local - Ombres HISTORY_MSG_LOCALCONTRAST_ENABLED;Contraste Local HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Contraste Local - H.L. HISTORY_MSG_LOCALCONTRAST_RADIUS;Contraste Local - Rayon HISTORY_MSG_METADATA_MODE;Mode de copie des métadonnées +HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontraste - Seuil de contraste +HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Méthode de dématriçage pour les mouvements +HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Direction du filtre de bruit de ligne +HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;Filtre de ligne PDAF +HISTORY_MSG_PRSHARPEN_CONTRAST;NPR - Seuil de contraste +HISTORY_MSG_RAWCACORR_AUTOIT;A.C. Raw - Itérations +HISTORY_MSG_RAWCACORR_COLORSHIFT;A.C. Raw - Éviter les dérives de teinte +HISTORY_MSG_RAW_BORDER;Bord Raw +HISTORY_MSG_RESIZE_ALLOWUPSCALING;Redim. - Autoriser l'agrandissement +HISTORY_MSG_SHARPENING_CONTRAST;Netteté - Seuil de contraste +HISTORY_MSG_SH_COLORSPACE;O/HL - Espace couleur +HISTORY_MSG_SOFTLIGHT_ENABLED;Lumière douce +HISTORY_MSG_SOFTLIGHT_STRENGTH;Lumière douce - Force +HISTORY_MSG_TM_FATTAL_ANCHOR;CPD - Ancre HISTORY_NEWSNAPSHOT;Ajouter HISTORY_NEWSNAPSHOT_TOOLTIP;Raccourci: Alt-s HISTORY_SNAPSHOT;Capture HISTORY_SNAPSHOTS;Captures ICCPROFCREATOR_ADD_PARAM_IN_DESC;Ajoute le paramètre Gamma et Pente (Slope) à la fin de la description ICCPROFCREATOR_COPYRIGHT;Copyright: +ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Réinitialise au copyright par défaut, attribué à "RawTherapee, CC0" ICCPROFCREATOR_CUSTOM;Personnalisé ICCPROFCREATOR_DESCRIPTION;Description: +ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Ajouter les valeurs gamma et pente à la description ICCPROFCREATOR_DESCRIPTION_TOOLTIP;Laisser vide pour que mettre la description par défaut ICCPROFCREATOR_GAMMA;Gamma ICCPROFCREATOR_ICCVERSION;Version du profil généré: @@ -881,6 +935,7 @@ MAIN_TOOLTIP_PREVIEWFOCUSMASK;Affichage du Masque du focus\nRaccourci: canal Vert\nRaccourci: g MAIN_TOOLTIP_PREVIEWL;Affichage de la Luminosité\nRaccourci: v\n\n0.299*R + 0.587*V + 0.114*B MAIN_TOOLTIP_PREVIEWR;Affichage du canal Rouge\nRaccourci: r +MAIN_TOOLTIP_PREVIEWSHARPMASK;Prévisualiser le masque de contraste de netteté.\nRaccourci: Aucun\n\nNe fonctionne que si l'outil Netteté est activé et pour un zomm >= 100%. MAIN_TOOLTIP_QINFO;Informations rapide sur l'image\nRaccourci: i MAIN_TOOLTIP_SHOWHIDELP1;Montrer/Cacher le panneau gauche\nRaccourci: l MAIN_TOOLTIP_SHOWHIDERP1;Afficher/Cacher le panneau droit\nRaccourci: Alt-l @@ -918,6 +973,7 @@ PARTIALPASTE_CROP;Recadrage PARTIALPASTE_DARKFRAMEAUTOSELECT;Sélection auto de la Trame Noire PARTIALPASTE_DARKFRAMEFILE;Fichier de Trame Noire PARTIALPASTE_DEFRINGE;Aberration chromatique +PARTIALPASTE_DEHAZE;Élimination de la Brume PARTIALPASTE_DETAILGROUP;Détail PARTIALPASTE_DIALOGLABEL;Collage partiel de profil de traitement PARTIALPASTE_DIRPYRDENOISE;Réduction du bruit @@ -951,13 +1007,16 @@ PARTIALPASTE_PREPROCESS_DEADPIXFILT;Filtrage des pixels morts PARTIALPASTE_PREPROCESS_GREENEQUIL;Équilibrage du vert PARTIALPASTE_PREPROCESS_HOTPIXFILT;Filtrage des pixels chauds PARTIALPASTE_PREPROCESS_LINEDENOISE;Filtre de bruit de ligne +PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;Filtre de ligne PDAF PARTIALPASTE_PRSHARPENING;Netteté post-redim. PARTIALPASTE_RAWCACORR_AUTO;Corr. auto. de l'aberr. chromatique -PARTIALPASTE_RAWCACORR_CAREDBLUE;Aberr. chromatique rouge et bleu +PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;A.C. Raw - Éviter les dérives couleurs +PARTIALPASTE_RAWCACORR_CAREDBLUE;A.C. Raw - Rouge et bleu PARTIALPASTE_RAWEXPOS_BLACK;Niveaux de noir PARTIALPASTE_RAWEXPOS_LINEAR;Correction du point blanc PARTIALPASTE_RAWEXPOS_PRESER;Préservation des hautes humières PARTIALPASTE_RAWGROUP;Réglages RAW +PARTIALPASTE_RAW_BORDER;Bord Raw PARTIALPASTE_RAW_DCBENHANCE;Amélioration de DCB PARTIALPASTE_RAW_DCBITERATIONS;Nombre d'itération de DCB PARTIALPASTE_RAW_DMETHOD;Algorithme de dématriçage @@ -973,6 +1032,8 @@ PARTIALPASTE_SHADOWSHIGHLIGHTS;Ombres/Hautes lumières PARTIALPASTE_SHARPENEDGE;Bords PARTIALPASTE_SHARPENING;Netteté PARTIALPASTE_SHARPENMICRO;Microcontraste +PARTIALPASTE_SOFTLIGHT;Lumière douce +PARTIALPASTE_TM_FATTAL;Compression de plage dynamique PARTIALPASTE_VIBRANCE;Vibrance PARTIALPASTE_VIGNETTING;Correction du vignettage PARTIALPASTE_WAVELETGROUP;Niveaux d'ondelette @@ -988,6 +1049,11 @@ PREFERENCES_BEHAVIOR;Comportement PREFERENCES_BEHSETALL;Tout à 'Remplace' PREFERENCES_BEHSETALLHINT;Règle tous les paramètres sur le mode Remplace.\nLa modification des paramètres dans le panneau d'édition en par lot sera absolue, les valeurs réelles seront affichées PREFERENCES_BLACKBODY;Tungstène +PREFERENCES_CACHECLEAR;Vider +PREFERENCES_CACHECLEAR_ALL;Vider tous les fichiers mis en cache : +PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Vider tous les fichiers mis en cache excepté les profils de traitement : +PREFERENCES_CACHECLEAR_ONLYPROFILES;Vider seulement les profils de traitement mis en cache : +PREFERENCES_CACHECLEAR_SAFETY;Seuls les fichiers mis en cache sont effacés. Les profils de traitement enregitrés à côté des images sources ne sont pas touchés. PREFERENCES_CACHEMAXENTRIES;Nombre maximal d'éléments dans le Cache PREFERENCES_CACHEOPTS;Options du Cache PREFERENCES_CACHETHUMBHEIGHT;Hauteur maximale des vignettes @@ -1001,7 +1067,7 @@ PREFERENCES_CLUTSCACHE_LABEL;Nombre maximum de chache CLUT PREFERENCES_CLUTSDIR;Dossier HaldCLUT PREFERENCES_CMMBPC;Compensation du point noir PREFERENCES_CROP;Édition du recadrage -PREFERENCES_CROP_AUTO_FIT;Zommer automatiquement sur la zone recadrée +PREFERENCES_CROP_AUTO_FIT;Zoomer automatiquement sur la zone recadrée lorsque vous double-cliquez sur l'image de prévisualisation PREFERENCES_CROP_GUIDES;Guides affichés en dehors de l'édition du recadrage PREFERENCES_CROP_GUIDES_FRAME;Cadre PREFERENCES_CROP_GUIDES_FULL;Original @@ -1066,8 +1132,8 @@ PREFERENCES_GREYSC;Luminance Yb de la scène (%) PREFERENCES_GREYSC18;Yb=18 CIE L#50 PREFERENCES_GREYSCA;Automatique PREFERENCES_HISTOGRAMPOSITIONLEFT;Histogramme dans le panneau de gauche -PREFERENCES_HISTOGRAMWORKING;Utiliser le profil de travail pour l'histograme principal et le Navigateur -PREFERENCES_HISTOGRAM_TOOLTIP;Si activé, le profil couleur de travail est utilisé pour les données d'histograme et le panneau Navigateur, sinon le profil de travail de sortie "gamma-corrigé" est utilisé. +PREFERENCES_HISTOGRAMWORKING;Utiliser le profil de travail pour l'histogramme principal et le Navigateur +PREFERENCES_HISTOGRAM_TOOLTIP;Si activé, le profil couleur de travail est utilisé pour les données d'histogramme et le panneau Navigateur, sinon le profil de travail de sortie "gamma-corrigé" est utilisé. PREFERENCES_HLTHRESHOLD;Seuil pour le dépassement de domaine supérieur PREFERENCES_ICCDIR;Dossier des profils ICC PREFERENCES_IMG_RELOAD_NEEDED;Ces changements nécessitent un rechargement de l'image (ou l'ouverture d'une autre image) pour prendre effet. @@ -1113,6 +1179,8 @@ PREFERENCES_PARSEDEXTADDHINT;Tapez une extension et cliquez ce bouton pour l'ajo PREFERENCES_PARSEDEXTDELHINT;Supprime de la liste les extensions sélectionnées PREFERENCES_PARSEDEXTDOWNHINT;Déplacer l'extension sélectionnée plus bas dans la liste. PREFERENCES_PARSEDEXTUPHINT;Déplacer l'extension sélectionnée plus haut dans la liste. +PREFERENCES_PERFORMANCE_THREADS;Unités d'exécution (Threads) +PREFERENCES_PERFORMANCE_THREADS_LABEL;Nombre maximum d'unité d'exécution pour la Réduction de Bruit et les Niveaux d'Ondelettes (0 = Automatique) PREFERENCES_PREVDEMO;Méthode de Dématriçage de l'Aperçu PREFERENCES_PREVDEMO_FAST;Rapide PREFERENCES_PREVDEMO_LABEL;Méthode de dématriçage utilisé pour l'aperçu à un zoom <100%: @@ -1159,8 +1227,13 @@ PREFERENCES_TAB_COLORMGR;Gestion des couleurs PREFERENCES_TAB_DYNAMICPROFILE;Règles de Profil Dynamique PREFERENCES_TAB_GENERAL;Général PREFERENCES_TAB_IMPROC;Traitement de l'image +PREFERENCES_TAB_PERFORMANCE;Performance PREFERENCES_TAB_SOUND;Sons PREFERENCES_THEME;Thème +PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Prévisualisation JPEG incluse +PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Image à montrer +PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Rendu Neutre des données Raw +PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;JPEG inclus si pleine taille, rendu Neutre des données Raw sinon PREFERENCES_TP_LABEL;Panneau des outils: PREFERENCES_TP_VSCROLLBAR;Cacher la barre de défilement verticale PREFERENCES_TUNNELMETADATA;Copier les données Exif/IPTC/XMP tel quel dans le fichier de sortie @@ -1277,6 +1350,8 @@ TP_BWMIX_MET;Méthode TP_BWMIX_MET_CHANMIX;Mixeur de Canaux TP_BWMIX_MET_DESAT;Désaturation TP_BWMIX_MET_LUMEQUAL;Égaliseur de Luminance +TP_BWMIX_MIXC;Mixeur de cannaux +TP_BWMIX_NEUTRAL;Réinitialiser TP_BWMIX_RGBLABEL;R: %1%% V: %2%% B: %3%% Total: %4%% TP_BWMIX_RGBLABEL_HINT;Coefficients RVB finaux qui tiennent compte de toutes les options du mixeur\nTotal affiche la somme des valeurs RVB actuellement appliqué:\n- toujours 100% en mode relatif\n- supérieur (plus clair) ou inférieur (plus sombre) à 100% en mode absolu. TP_BWMIX_RGB_TOOLTIP;Mixe les canaux RVB. Utilisez les Préréglages pour vous guider.\nAttention aux valeurs négatives qui peuvent causer des artefacts ou un comportement erratique. @@ -1410,6 +1485,16 @@ TP_COLORTONING_LAB;Mixage Lab TP_COLORTONING_LABEL;Virage Partiel TP_COLORTONING_LABGRID;Grille de correction L*a*b* TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nO: a=%3 b=%4 +TP_COLORTONING_LABREGIONS;Régions de correction L*a*b* +TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +TP_COLORTONING_LABREGION_HUEMASK;T +TP_COLORTONING_LABREGION_LIGHTNESS;Luminosité +TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +TP_COLORTONING_LABREGION_LIST_TITLE;Correction +TP_COLORTONING_LABREGION_MASK;Masque +TP_COLORTONING_LABREGION_SATURATION;Saturation +TP_COLORTONING_LABREGION_SHOWMASK;Montrer le masque TP_COLORTONING_LUMA;Luminance TP_COLORTONING_LUMAMODE;Préserver la luminance TP_COLORTONING_LUMAMODE_TOOLTIP;Si activé, lorsque vous changez la couleur (rouge, vert, cyan, bleu, etc.), la luminance de chaque pixel est préservé @@ -1458,6 +1543,10 @@ TP_DARKFRAME_LABEL;Trame Noire TP_DEFRINGE_LABEL;Aberration chromatique TP_DEFRINGE_RADIUS;Rayon TP_DEFRINGE_THRESHOLD;Seuil +TP_DEHAZE_DEPTH;Profondeur +TP_DEHAZE_LABEL;Élimination de la Brume +TP_DEHAZE_SHOW_DEPTH_MAP;Montrer la Carte de Profondeur +TP_DEHAZE_STRENGTH;Force TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Multi-zones auto TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Global automatique TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Essaie d'évaluer le bruit chroma\nFaites attention, cela calcul une moyenne, et est très subjectif ! @@ -1546,6 +1635,7 @@ TP_EXPOSURE_AUTOLEVELS;Niveaux Auto TP_EXPOSURE_AUTOLEVELS_TIP;Bascule l'usage de Niveaux automatiques afin de régler automatiquement les valeurs basé sur l'analyse de l'image\nActive la Reconstruction des Hautes Lumières si nécessaire. TP_EXPOSURE_BLACKLEVEL;Noir TP_EXPOSURE_BRIGHTNESS;Luminosité +TP_EXPOSURE_CLAMPOOG;Tronquer les couleurs hors gamut TP_EXPOSURE_CLIP;Rognage % TP_EXPOSURE_CLIP_TIP;La fraction de pixels que l'outil Niveaux Auto passera en dehors du domaine TP_EXPOSURE_COMPRHIGHLIGHTS;Compression hautes lumières @@ -1730,10 +1820,19 @@ TP_PREPROCESS_HOTPIXFILT;Filtrer les pixels chauds TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Essaie de supprimer les pixels chauds TP_PREPROCESS_LABEL;Traitement pre-dématriçage TP_PREPROCESS_LINEDENOISE;Filtre de bruit de ligne +TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction +TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Toutes +TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontale +TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontale seulement sur les lignes PDAF +TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Verticale TP_PREPROCESS_NO_FOUND;Aucun trouvé +TP_PREPROCESS_PDAFLINESFILTER;Filtre de ligne PDAF +TP_PREPROCESS_PDAFLINESFILTER_TOOLTIP;Essaie de supprimer les bandes de bruit causées par les pixel PDAF sur le capteur, arrivant sur certains mirrorless Sony cameras avec des scènes en contre-jour avec un flare visible. TP_PRSHARPENING_LABEL;Netteté post-redimensionnement TP_PRSHARPENING_TOOLTIP;Augmente la netteté de l'image après le redimentionnement. Ne fonctionne que si la méthode de redimensionnement "Lanczos" est utilisé. Il est impossible de prévisualiser les effets de cet outil. Cf. RawPedia pour les instructions d'utilisation. TP_RAWCACORR_AUTO;Correction automatique +TP_RAWCACORR_AUTOIT;Itérations +TP_RAWCACORR_AVOIDCOLORSHIFT;Éviter les dérives couleurs TP_RAWCACORR_CABLUE;Bleu TP_RAWCACORR_CARED;Rouge TP_RAWCACORR_CASTR;Force @@ -1750,16 +1849,24 @@ TP_RAWEXPOS_PRESER;Préservation des HL TP_RAWEXPOS_RGB;Rouge, Vert, Bleu TP_RAWEXPOS_TWOGREEN;Lier les verts TP_RAW_1PASSMEDIUM;1-Passe (Medium) +TP_RAW_2PASS;1-passe+Fast TP_RAW_3PASSBEST;3-Passes (Meilleur) +TP_RAW_4PASS;3-passes+Fast TP_RAW_AHD;AHD TP_RAW_AMAZE;AMaZE +TP_RAW_AMAZEVNG4;AMaZE+VNG4 +TP_RAW_BORDER;Bord TP_RAW_DCB;DCB TP_RAW_DCBENHANCE;Amélioration de DCB TP_RAW_DCBITERATIONS;Nombre d'itération de DCB +TP_RAW_DCBVNG4;DCB+VNG4 TP_RAW_DMETHOD;Méthode TP_RAW_DMETHOD_PROGRESSBAR;Dématriçage %1... TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Affinage du dématriçage... TP_RAW_DMETHOD_TOOLTIP;Note: IGV et LMMSE sont dédiés aux images à haut ISO +TP_RAW_DUALDEMOSAICAUTOCONTRAST;Seuil auto +TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;Si la case est cochée (recommandé), RawTherapee calcul une valeur optimum basée sur les régions de "couleur unie" de l'image.\nS'il n'y en a pas ou que l'image est trop bruité, la valeur sera réglée à 0.\nPour régler la valeur manuellement, décochez la case d'abord (les valeurs raisonables dépendent de l'image). +TP_RAW_DUALDEMOSAICCONTRAST;Seuil de contraste TP_RAW_EAHD;EAHD TP_RAW_FALSECOLOR;Itérations pour la suppression\ndes fausses couleurs TP_RAW_FAST;Fast @@ -1778,6 +1885,9 @@ TP_RAW_NONE;Aucun (montre ce que voit le capteur) TP_RAW_PIXELSHIFT;Pixel Shift TP_RAW_PIXELSHIFTADAPTIVE;Détection adaptative TP_RAW_PIXELSHIFTBLUR;Flouter le masque de mouvement +TP_RAW_PIXELSHIFTDMETHOD;Méthode de dématriçage pour les mouvements +TP_RAW_PIXELSHIFTEPERISO;Sensibilité +TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;La valeur par défaut de 0 devrait bien fonctionner pour l'ISO de base.\nLes valeurs plus hautes augmentent la sensibilité de la détection de mouvement.\nChangez par petits incréments et observez le masque de mouvement se mettre à jour pendant votre ajustement.\nAugmentez la sensibilité pour les images sous-exposées ou à haut ISO. TP_RAW_PIXELSHIFTEQUALBRIGHT;Égaliser la luminosité des sous-images TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL;Égaliser par canal TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL_TOOLTIP;Activé: Égalise les canaux RVB individuellement.\nDésactivé: Utilise le même facteur d'égalisation pour tous les canaux. @@ -1813,6 +1923,7 @@ TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Poid Rouge&Bleu TP_RAW_PIXELSHIFTSHOWMOTION;Voir le masque de mouvement TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;Voir uniquement le masque TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;Affiche le masque sans l'image. +TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Applique un masque vert montrant les régions contenant du mouvement. TP_RAW_PIXELSHIFTSIGMA;Rayon de floutage TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;Le rayon par défaut de 1.0 fonctionne généralement bien pour l'ISO de base.\nAugmentez cette valeur pour les images de haut ISO, 5.0 est un bon point de départ.\nContrôlez le masque de mouvement à chaque nouvelle valeur. TP_RAW_PIXELSHIFTSMOOTH;Adoucir les transitions @@ -1821,10 +1932,12 @@ TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;Facteur DevStd Bleu TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;Facteur DevStd Vert TP_RAW_PIXELSHIFTSTDDEVFACTORRED;Facteur DevStd Rouge TP_RAW_RCD;RCD +TP_RAW_RCDVNG4;RCD+VNG4 TP_RAW_SENSOR_BAYER_LABEL;Capteur à matrice de Bayer TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-passes donne les meilleurs résultats (recommendé pour les images de faible ISO).\n1-passe est presque indifférentiable de 3-passes pour les images à haut ISO et est plus rapide. TP_RAW_SENSOR_XTRANS_LABEL;Capteur à matrice X-Trans TP_RAW_VNG4;VNG4 +TP_RESIZE_ALLOW_UPSCALING;Autoriser l'Agrandissement TP_RESIZE_APPLIESTO;S'applique à: TP_RESIZE_CROPPEDAREA;La zone recadrée TP_RESIZE_FITBOX;Boîte englobante @@ -1943,6 +2056,7 @@ TP_SHARPENEDGE_LABEL;Bords TP_SHARPENEDGE_PASSES;Itérations TP_SHARPENEDGE_THREE;Luminance uniquement TP_SHARPENING_AMOUNT;Quantité +TP_SHARPENING_CONTRAST;Seuil de contraste TP_SHARPENING_EDRADIUS;Rayon TP_SHARPENING_EDTOLERANCE;Tolérance des bords TP_SHARPENING_HALOCONTROL;Contrôle du halo @@ -1958,9 +2072,16 @@ TP_SHARPENING_RLD_ITERATIONS;Itérations TP_SHARPENING_THRESHOLD;Seuil TP_SHARPENING_USM;Masque flou (USM) TP_SHARPENMICRO_AMOUNT;Quantité +TP_SHARPENMICRO_CONTRAST;Seuil de contraste TP_SHARPENMICRO_LABEL;Microcontraste TP_SHARPENMICRO_MATRIX;Matrice 3×3 au lieu de 5×5 TP_SHARPENMICRO_UNIFORMITY;Uniformité +TP_SOFTLIGHT_LABEL;Lumière douce +TP_SOFTLIGHT_STRENGTH;Force +TP_TM_FATTAL_AMOUNT;Quantité +TP_TM_FATTAL_ANCHOR;Ancre +TP_TM_FATTAL_LABEL;Compression de Plage Dynamique +TP_TM_FATTAL_THRESHOLD;Détail TP_VIBRANCE_AVOIDCOLORSHIFT;Éviter les dérives de teinte TP_VIBRANCE_CURVEEDITOR_SKINTONES;TT TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Tons chair @@ -2024,7 +2145,7 @@ TP_WAVELET_CHTYPE;Méthode de chrominance TP_WAVELET_COLORT;Opacité Rouge-Vert TP_WAVELET_COMPCONT;Contraste TP_WAVELET_COMPGAMMA;Compression gamma -TP_WAVELET_COMPGAMMA_TOOLTIP;Ajuster le gamma de l'image résiduelle vous permet d'équiilibrer les données de l'histograme. +TP_WAVELET_COMPGAMMA_TOOLTIP;Ajuster le gamma de l'image résiduelle vous permet d'équiilibrer les données de l'histogramme. TP_WAVELET_COMPTM;Compression tonale TP_WAVELET_CONTEDIT;Courbe de contraste 'Après' TP_WAVELET_CONTR;Gamut @@ -2204,128 +2325,3 @@ ZOOMPANEL_ZOOMFITSCREEN;Affiche l'image entière\nRaccourci: Alt-f ZOOMPANEL_ZOOMIN;Zoom Avant\nRaccourci: + ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - -!!!!!!!!!!!!!!!!!!!!!!!!! -! Untranslated keys follow; remove the ! prefix after an entry is translated. -!!!!!!!!!!!!!!!!!!!!!!!!! - -!ADJUSTER_RESET_TO_DEFAULT;Click - reset to default value.\nCtrl+click - reset to initial value. -!DYNPROFILEEDITOR_IMGTYPE_ANY;Any -!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR -!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift -!DYNPROFILEEDITOR_IMGTYPE_STD;Standard -!EXIFFILTER_IMAGETYPE;Image type -!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles -!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles -!GENERAL_RESET;Reset -!HISTOGRAM_TOOLTIP_MODE;Toggle between linear, log-linear and log-log scaling of the histogram. -!HISTORY_MSG_235;B&W - CM - Auto -!HISTORY_MSG_237;B&W - CM -!HISTORY_MSG_273;CT - Color Balance SMH -!HISTORY_MSG_392;W - Residual - Color Balance -!HISTORY_MSG_488;Dynamic Range Compression -!HISTORY_MSG_489;DRC - Detail -!HISTORY_MSG_490;DRC - Amount -!HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors -!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction -!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - C mask -!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask -!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness -!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask -!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List -!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation -!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - Show mask -!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth -!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal -!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map -!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength -!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold -!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold -!HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries -!HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D -!HISTORY_MSG_ICM_OUTPUT_TYPE;Output - Type -!HISTORY_MSG_ICM_WORKING_GAMMA;Working - Gamma -!HISTORY_MSG_ICM_WORKING_SLOPE;Working - Slope -!HISTORY_MSG_ICM_WORKING_TRC_METHOD;Working - TRC method -!HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold -!HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion -!HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction -!HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter -!HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrast threshold -!HISTORY_MSG_RAWCACORR_AUTOIT;Raw CA Correction - Iterations -!HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correction - Avoid color shift -!HISTORY_MSG_RAW_BORDER;Raw border -!HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling -!HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold -!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace -!HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light -!HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength -!HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor -!ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Reset to the default copyright, granted to "RawTherapee, CC0" -!ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Append gamma and slope values to the description -!MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the Sharpening Contrast Mask.\nShortcut: None\n\nOnly works when sharpening is enabled and zoom >= 100%. -!PARTIALPASTE_DEHAZE;Haze removal -!PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter -!PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid color shift -!PARTIALPASTE_RAW_BORDER;Raw border -!PARTIALPASTE_SOFTLIGHT;Soft light -!PARTIALPASTE_TM_FATTAL;Dynamic range compression -!PREFERENCES_CACHECLEAR;Clear -!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: -!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: -!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: -!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. -!PREFERENCES_PERFORMANCE_THREADS;Threads -!PREFERENCES_PERFORMANCE_THREADS_LABEL;Maximum number of threads for Noise Reduction and Wavelet Levels (0 = Automatic) -!PREFERENCES_TAB_PERFORMANCE;Performance -!PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Embedded JPEG preview -!PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Image to show -!PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Neutral raw rendering -!PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;Embedded JPEG if fullsize, neutral raw otherwise -!TP_BWMIX_MIXC;Channel Mixer -!TP_BWMIX_NEUTRAL;Reset -!TP_COLORTONING_LABREGIONS;L*a*b* correction regions -!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 -!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C -!TP_COLORTONING_LABREGION_HUEMASK;H -!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness -!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L -!TP_COLORTONING_LABREGION_LIST_TITLE;Correction -!TP_COLORTONING_LABREGION_MASK;Mask -!TP_COLORTONING_LABREGION_SATURATION;Saturation -!TP_COLORTONING_LABREGION_SHOWMASK;Show mask -!TP_DEHAZE_DEPTH;Depth -!TP_DEHAZE_LABEL;Haze Removal -!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map -!TP_DEHAZE_STRENGTH;Strength -!TP_EXPOSURE_CLAMPOOG;Clip out-of-gamut colors -!TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction -!TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both -!TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal -!TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontal only on PDAF rows -!TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Vertical -!TP_PREPROCESS_PDAFLINESFILTER;PDAF lines filter -!TP_PREPROCESS_PDAFLINESFILTER_TOOLTIP;Tries to suppress stripe noise caused by on-sensor PDAF pixels, occurring with some Sony mirrorless cameras on some backlit scenes with visible flare. -!TP_RAWCACORR_AUTOIT;Iterations -!TP_RAWCACORR_AVOIDCOLORSHIFT;Avoid color shift -!TP_RAW_2PASS;1-pass+fast -!TP_RAW_4PASS;3-pass+fast -!TP_RAW_AMAZEVNG4;AMaZE+VNG4 -!TP_RAW_BORDER;Border -!TP_RAW_DCBVNG4;DCB+VNG4 -!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold -!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the check-box first (reasonable values depend on the image). -!TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold -!TP_RAW_PIXELSHIFTDMETHOD;Demosaic method for motion -!TP_RAW_PIXELSHIFTEPERISO;Sensitivity -!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nHigher values increase sensitivity of motion detection.\nChange in small steps and watch the motion mask while changing.\nIncrease sensitivity for underexposed or high ISO images. -!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a green mask showing the regions with motion. -!TP_RAW_RCDVNG4;RCD+VNG4 -!TP_RESIZE_ALLOW_UPSCALING;Allow Upscaling -!TP_SHARPENING_CONTRAST;Contrast threshold -!TP_SHARPENMICRO_CONTRAST;Contrast threshold -!TP_SOFTLIGHT_LABEL;Soft Light -!TP_SOFTLIGHT_STRENGTH;Strength -!TP_TM_FATTAL_AMOUNT;Amount -!TP_TM_FATTAL_ANCHOR;Anchor -!TP_TM_FATTAL_LABEL;Dynamic Range Compression -!TP_TM_FATTAL_THRESHOLD;Detail diff --git a/rtdata/languages/default b/rtdata/languages/default index a5c9976a4..5a66807ca 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1060,7 +1060,7 @@ PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs PREFERENCES_CLUTSDIR;HaldCLUT directory PREFERENCES_CMMBPC;Black point compensation PREFERENCES_CROP;Crop editing -PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area when double clicking in the preview image PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop PREFERENCES_CROP_GUIDES_FRAME;Frame PREFERENCES_CROP_GUIDES_FULL;Original diff --git a/rtgui/preferences.cc b/rtgui/preferences.cc index 147e6badd..06654c7cf 100644 --- a/rtgui/preferences.cc +++ b/rtgui/preferences.cc @@ -609,7 +609,12 @@ Gtk::Widget* Preferences::getImageProcessingPanel () crophb->pack_start(*Gtk::manage(new Gtk::Label(M("PREFERENCES_CROP_GUIDES") + ": ")), Gtk::PACK_SHRINK, 4); crophb->pack_start(*cropGuides); cropvb->pack_start(*crophb); - cropAutoFit = Gtk::manage(new Gtk::CheckButton(M("PREFERENCES_CROP_AUTO_FIT"))); + Gtk::Label *cropAutoFitLabel = Gtk::manage(new Gtk::Label(M("PREFERENCES_CROP_AUTO_FIT"))); + cropAutoFitLabel->set_line_wrap(true); + setExpandAlignProperties(cropAutoFitLabel, false, false, Gtk::ALIGN_START, Gtk::ALIGN_START); + cropAutoFit = Gtk::manage(new Gtk::CheckButton()); + setExpandAlignProperties(cropAutoFit, false, true, Gtk::ALIGN_START, Gtk::ALIGN_START); + cropAutoFit->add(*cropAutoFitLabel); cropvb->pack_start(*cropAutoFit); cropframe->add(*cropvb); vbImageProcessing->pack_start(*cropframe, Gtk::PACK_SHRINK, 4); @@ -1398,7 +1403,7 @@ Gtk::Widget* Preferences::getFileBrowserPanel () vbc->pack_start (*cacheGrid, Gtk::PACK_SHRINK, 4); Gtk::Label* clearSafetyLbl = Gtk::manage (new Gtk::Label(M("PREFERENCES_CACHECLEAR_SAFETY"))); - setExpandAlignProperties(clearSafetyLbl, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + setExpandAlignProperties(clearSafetyLbl, false, false, Gtk::ALIGN_START, Gtk::ALIGN_START); clearSafetyLbl->set_line_wrap(true); vbc->pack_start(*clearSafetyLbl, Gtk::PACK_SHRINK, 4); From 847e20969b256047a10ea4b24578b44a844bc18f Mon Sep 17 00:00:00 2001 From: heckflosse Date: Mon, 12 Nov 2018 18:52:26 +0100 Subject: [PATCH 120/122] Add tooltip for raw auto ca-correction iterations slider --- rtdata/languages/default | 1 + rtgui/rawcacorrection.cc | 1 + 2 files changed, 2 insertions(+) diff --git a/rtdata/languages/default b/rtdata/languages/default index 5a66807ca..02ded5378 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1818,6 +1818,7 @@ TP_PRSHARPENING_LABEL;Post-Resize Sharpening TP_PRSHARPENING_TOOLTIP;Sharpens the image after resizing. Only works when the "Lanczos" resizing method is used. It is impossible to preview the effects of this tool. See RawPedia for usage instructions. TP_RAWCACORR_AUTO;Auto-correction TP_RAWCACORR_AUTOIT;Iterations +TP_RAWCACORR_AUTOIT_TOOLTIP;This setting is available if "Auto-correction" is checked.\nAuto-correction is conservative, means it often does not correct all Chromatic Aberration.\nTo correct the remaining Chromatic Aberration, you can use up to 5 iterations of automatic Chromatic Aberration correction.\nEach iteration will reduce the remaining Chromatic Aberration from the last iteration at the cost of additional processing time. TP_RAWCACORR_AVOIDCOLORSHIFT;Avoid color shift TP_RAWCACORR_CABLUE;Blue TP_RAWCACORR_CARED;Red diff --git a/rtgui/rawcacorrection.cc b/rtgui/rawcacorrection.cc index b208f5509..2daeb102f 100644 --- a/rtgui/rawcacorrection.cc +++ b/rtgui/rawcacorrection.cc @@ -41,6 +41,7 @@ RAWCACorr::RAWCACorr () : FoldableToolPanel(this, "rawcacorrection", M("TP_CHROM caAutoiterations = Gtk::manage(new Adjuster (M("TP_RAWCACORR_AUTOIT"), 1, 5, 1, 2)); caAutoiterations->setAdjusterListener (this); + caAutoiterations->set_tooltip_markup(M("TP_RAWCACORR_AUTOIT_TOOLTIP")); if (caAutoiterations->delay < options.adjusterMaxDelay) { caAutoiterations->delay = options.adjusterMaxDelay; From 53a99837e50ea30c3421b45791a3d603d048e5e3 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Mon, 12 Nov 2018 22:23:25 +0100 Subject: [PATCH 121/122] histmatching: avoid concavities in the upper part of the matched curve (assumed to be S-shaped) Fixes #4979 --- rtengine/histmatching.cc | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/rtengine/histmatching.cc b/rtengine/histmatching.cc index b2fe436fd..2bc0e940e 100644 --- a/rtengine/histmatching.cc +++ b/rtengine/histmatching.cc @@ -216,6 +216,45 @@ void mappingToCurve(const std::vector &mapping, std::vector &curve) curve.push_back(1.0); curve.push_back(1.0); + + // we assume we are matching an S-shaped curve, so try to avoid + // concavities in the upper part of the S + const auto getpos = + [](float x, float xa, float ya, float xb, float yb) + { + // line equation: + // (x - xa) / (xb - xa) = (y - ya) / (yb - ya) + return (x - xa) / (xb - xa) * (yb - ya) + ya; + }; + idx = -1; + for (size_t i = curve.size()-1; i > 0; i -= 2) { + if (curve[i] <= 0.f) { + idx = i+1; + break; + } + } + if (idx >= 0 && size_t(idx) < curve.size()) { + // idx is the position of the first point in the upper part of the S + // for each 3 consecutive points (xa, ya), (x, y), (xb, yb) we check + // that y is above the point at x of the line between the other two + // if this is not the case, we remove (x, y) from the curve + while (size_t(idx+5) < curve.size()) { + float xa = curve[idx]; + float ya = curve[idx+1]; + float x = curve[idx+2]; + float y = curve[idx+3]; + float xb = curve[idx+4]; + float yb = curve[idx+5]; + float yy = getpos(x, xa, ya, xb, yb); + if (yy > y) { + // we have to remove (x, y) from the curve + curve.erase(curve.begin()+(idx+2), curve.begin()+(idx+4)); + } else { + // move on to the next point + idx += 2; + } + } + } if (curve.size() < 4) { curve = { DCT_Linear }; // not enough points, fall back to linear From b0bc0c7addef9894cca0545c464a6e17c3330f99 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 13 Nov 2018 15:02:08 +0100 Subject: [PATCH 122/122] Fix bug in pdaf lines filter --- rtengine/pdaflinesfilter.cc | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/rtengine/pdaflinesfilter.cc b/rtengine/pdaflinesfilter.cc index 92fd68b41..ee279f3c0 100644 --- a/rtengine/pdaflinesfilter.cc +++ b/rtengine/pdaflinesfilter.cc @@ -151,12 +151,10 @@ public: if (it > pattern_.begin()) { int b2 = *(it-1); int d2 = key - b2; - float f = BORDER[std::min(std::min(d, d2), BORDER_WIDTH)]; - return f; - } else { - float f = BORDER[std::min(d, BORDER_WIDTH)]; - return f; + d = std::min(d, d2); } + float f = (d <= BORDER_WIDTH) ? BORDER[d] : 0.f; + return f; } return 0.f; }