From 506254ce4631985bd2832d490dd760a2dc925949 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Wed, 14 Aug 2019 17:19:26 +0200 Subject: [PATCH 01/50] capture sharpening: first mockup --- rtdata/languages/default | 8 ++ rtengine/color.h | 12 ++ rtengine/imagesource.h | 3 +- rtengine/improccoordinator.cc | 6 +- rtengine/improcfun.h | 2 +- rtengine/ipsharpen.cc | 8 +- rtengine/procparams.cc | 25 ++++ rtengine/procparams.h | 2 + rtengine/rawimagesource.cc | 33 +++++ rtengine/rawimagesource.h | 2 +- rtengine/simpleprocess.cc | 3 + rtengine/stdimagesource.h | 2 +- rtgui/CMakeLists.txt | 1 + rtgui/addsetids.h | 1 + rtgui/paramsedited.cc | 46 +++++++ rtgui/paramsedited.h | 3 + rtgui/pdsharpening.cc | 221 ++++++++++++++++++++++++++++++++++ rtgui/pdsharpening.h | 62 ++++++++++ rtgui/toolpanelcoord.cc | 10 +- rtgui/toolpanelcoord.h | 3 +- 20 files changed, 441 insertions(+), 12 deletions(-) create mode 100644 rtgui/pdsharpening.cc create mode 100644 rtgui/pdsharpening.h diff --git a/rtdata/languages/default b/rtdata/languages/default index e8392db6b..9aa743ab0 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -763,6 +763,11 @@ HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius HISTORY_MSG_METADATA_MODE;Metadata copy mode HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold +HISTORY_MSG_PDSHARPEN_CONTRAST;CAS - Contrast threshold +HISTORY_MSG_PDSHARPEN_ENABLED;Capture Sharpening +HISTORY_MSG_PDSHARPEN_GAMMA;CAS - Gamma +HISTORY_MSG_PDSHARPEN_ITERATIONS;CAS - Iterations +HISTORY_MSG_PDSHARPEN_RADIUS;CAS - Radius 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 @@ -773,6 +778,7 @@ HISTORY_MSG_RAW_BORDER;Raw border HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +HISTORY_MSG_SHARPENING_GAMMA;Sharpening - Gamma HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength @@ -1792,6 +1798,7 @@ TP_PCVIGNETTE_ROUNDNESS;Roundness TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Roundness:\n0 = rectangle,\n50 = fitted ellipse,\n100 = circle. TP_PCVIGNETTE_STRENGTH;Strength TP_PCVIGNETTE_STRENGTH_TOOLTIP;Filter strength in stops (reached in corners). +TP_PDSHARPENING_LABEL;Capture Sharpening TP_PERSPECTIVE_HORIZONTAL;Horizontal TP_PERSPECTIVE_LABEL;Perspective TP_PERSPECTIVE_VERTICAL;Vertical @@ -2020,6 +2027,7 @@ TP_SHARPENING_BLUR;Blur radius TP_SHARPENING_CONTRAST;Contrast threshold TP_SHARPENING_EDRADIUS;Radius TP_SHARPENING_EDTOLERANCE;Edge tolerance +TP_SHARPENING_GAMMA;Gamma TP_SHARPENING_HALOCONTROL;Halo control TP_SHARPENING_HCAMOUNT;Amount TP_SHARPENING_LABEL;Sharpening diff --git a/rtengine/color.h b/rtengine/color.h index 5bf178636..22a648634 100644 --- a/rtengine/color.h +++ b/rtengine/color.h @@ -1804,6 +1804,18 @@ public: return (hr); } + static inline void RGB2YCbCr(float R, float G, float B, float &Y, float &Cb, float &Cr) { + Y = 0.2627f * R + 0.6780f * G + 0.0593f * B; + Cb = -0.2627f * R - 0.6780f * G + (1.f - 0.0593f) * B; + Cr = (1.f - 0.2627f) * R - 0.6780f * G - 0.0593f * B; + + } + + static inline void YCbCr2RGB(float Y, float Cb, float Cr, float &R, float &G, float &B) { + R = std::max(Y + Cr, 0.f); + G = std::max(Y - (0.0593f / 0.6780f) * Cb - (0.2627f / 0.6780f) * Cr, 0.f); + B = std::max(Y + Cb, 0.f); + } }; } diff --git a/rtengine/imagesource.h b/rtengine/imagesource.h index bf73b5bb2..6e57bd532 100644 --- a/rtengine/imagesource.h +++ b/rtengine/imagesource.h @@ -46,7 +46,7 @@ struct LensProfParams; struct RAWParams; struct RetinexParams; struct ToneCurveParams; - +struct SharpeningParams; } class ImageMatrices @@ -182,6 +182,7 @@ public: return this; } virtual void getRawValues(int x, int y, int rotate, int &R, int &G, int &B) = 0; + virtual void captureSharpening(const procparams::SharpeningParams &sharpeningParams) = 0; }; } diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 6f471eedf..2e2ae9084 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -332,6 +332,9 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) double contrastThreshold = imgsrc->getSensorType() == ST_BAYER ? params->raw.bayersensor.dualDemosaicContrast : params->raw.xtranssensor.dualDemosaicContrast; imgsrc->demosaic(rp, autoContrast, contrastThreshold); //enabled demosaic + if (params->pdsharpening.enabled) { + imgsrc->captureSharpening(params->pdsharpening); + } if (imgsrc->getSensorType() == ST_BAYER && bayerAutoContrastListener && autoContrast) { bayerAutoContrastListener->autoContrastChanged(autoContrast ? contrastThreshold : -1.0); } @@ -1546,7 +1549,8 @@ void ImProcCoordinator::process() || params->retinex != nextParams->retinex || params->wavelet != nextParams->wavelet || params->dirpyrequalizer != nextParams->dirpyrequalizer - || params->dehaze != nextParams->dehaze; + || params->dehaze != nextParams->dehaze + || params->pdsharpening != nextParams->pdsharpening; *params = *nextParams; int change = changeSinceLast; diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 987a460d7..65f0f5a96 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -248,7 +248,7 @@ public: void Lanczos(const LabImage* src, LabImage* dst, float scale); void Lanczos(const Imagefloat* src, Imagefloat* dst, float scale); - void deconvsharpening(float** luminance, float** buffer, int W, int H, const procparams::SharpeningParams &sharpenParam); + void deconvsharpening(float** luminance, float** buffer, int W, int H, const procparams::SharpeningParams &sharpenParam, double Scale); void MLsharpen(LabImage* lab); // Manuel's clarity / sharpening void MLmicrocontrast(float** luminance, int W, int H); //Manuel's microcontrast void MLmicrocontrast(LabImage* lab); //Manuel's microcontrast diff --git a/rtengine/ipsharpen.cc b/rtengine/ipsharpen.cc index 9d7358fa9..eeda786a5 100644 --- a/rtengine/ipsharpen.cc +++ b/rtengine/ipsharpen.cc @@ -158,7 +158,7 @@ namespace rtengine extern const Settings* settings; -void ImProcFunctions::deconvsharpening (float** luminance, float** tmp, int W, int H, const SharpeningParams &sharpenParam) +void ImProcFunctions::deconvsharpening (float** luminance, float** tmp, int W, int H, const SharpeningParams &sharpenParam, double Scale) { if (sharpenParam.deconvamount == 0 && sharpenParam.blurradius < 0.25f) { return; @@ -201,7 +201,7 @@ BENCHFUN } const float damping = sharpenParam.deconvdamping / 5.0; const bool needdamp = sharpenParam.deconvdamping > 0; - const double sigma = sharpenParam.deconvradius / scale; + const double sigma = sharpenParam.deconvradius / Scale; const float amount = sharpenParam.deconvamount / 100.f; #ifdef _OPENMP @@ -274,7 +274,7 @@ void ImProcFunctions::sharpening (LabImage* lab, const SharpeningParams &sharpen JaggedArray b2(W, H); if (sharpenParam.method == "rld") { - deconvsharpening (lab->L, b2, lab->W, lab->H, sharpenParam); + deconvsharpening (lab->L, b2, lab->W, lab->H, sharpenParam, scale); return; } BENCHFUN @@ -905,7 +905,7 @@ void ImProcFunctions::sharpeningcam (CieImage* ncie, float** b2, bool showMask) if (params->sharpening.method == "rld") { - deconvsharpening (ncie->sh_p, b2, ncie->W, ncie->H, params->sharpening); + deconvsharpening (ncie->sh_p, b2, ncie->W, ncie->H, params->sharpening, scale); return; } diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 66837f89b..4f2cdce2e 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -1080,6 +1080,7 @@ SharpeningParams::SharpeningParams() : enabled(false), contrast(20.0), blurradius(0.2), + gamma(1.0), radius(0.5), amount(200), threshold(20, 80, 2000, 1200, false), @@ -1102,6 +1103,7 @@ bool SharpeningParams::operator ==(const SharpeningParams& other) const enabled == other.enabled && contrast == other.contrast && blurradius == other.blurradius + && gamma == other.gamma && radius == other.radius && amount == other.amount && threshold == other.threshold @@ -2787,6 +2789,13 @@ void ProcParams::setDefaults() prsharpening.deconviter = 100; prsharpening.deconvdamping = 0; + pdsharpening = {}; + pdsharpening.contrast = 0.0; + prsharpening.method = "rld"; + pdsharpening.gamma = 1.0; + pdsharpening.deconvradius = 0.75; + pdsharpening.deconviter = 30; + vibrance = {}; wb = {}; @@ -3296,6 +3305,13 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->resize.height, "Resize", "Height", resize.height, keyFile); saveToKeyfile(!pedited || pedited->resize.allowUpscaling, "Resize", "AllowUpscaling", resize.allowUpscaling, keyFile); +// Post demosaic sharpening + saveToKeyfile(!pedited || pedited->pdsharpening.enabled, "PostDemosaicSharpening", "Enabled", pdsharpening.enabled, keyFile); + saveToKeyfile(!pedited || pedited->pdsharpening.contrast, "PostDemosaicSharpening", "Contrast", pdsharpening.contrast, keyFile); + saveToKeyfile(!pedited || pedited->pdsharpening.gamma, "PostDemosaicSharpening", "DeconvGamma", pdsharpening.gamma, keyFile); + saveToKeyfile(!pedited || pedited->pdsharpening.deconvradius, "PostDemosaicSharpening", "DeconvRadius", pdsharpening.deconvradius, keyFile); + saveToKeyfile(!pedited || pedited->pdsharpening.deconviter, "PostDemosaicSharpening", "DeconvIterations", pdsharpening.deconviter, keyFile); + // Post resize sharpening saveToKeyfile(!pedited || pedited->prsharpening.enabled, "PostResizeSharpening", "Enabled", prsharpening.enabled, keyFile); saveToKeyfile(!pedited || pedited->prsharpening.contrast, "PostResizeSharpening", "Contrast", prsharpening.contrast, keyFile); @@ -4376,6 +4392,15 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } } + if (keyFile.has_group("PostDemosaicSharpening")) { + assignFromKeyfile(keyFile, "PostDemosaicSharpening", "Enabled", pedited, pdsharpening.enabled, pedited->pdsharpening.enabled); + assignFromKeyfile(keyFile, "PostDemosaicSharpening", "Contrast", pedited, pdsharpening.contrast, pedited->pdsharpening.contrast); + + assignFromKeyfile(keyFile, "PostDemosaicSharpening", "DeconvGamma", pedited, pdsharpening.gamma, pedited->pdsharpening.gamma); + assignFromKeyfile(keyFile, "PostDemosaicSharpening", "DeconvRadius", pedited, pdsharpening.deconvradius, pedited->pdsharpening.deconvradius); + assignFromKeyfile(keyFile, "PostDemosaicSharpening", "DeconvIterations", pedited, pdsharpening.deconviter, pedited->pdsharpening.deconviter); + } + if (keyFile.has_group("PostResizeSharpening")) { assignFromKeyfile(keyFile, "PostResizeSharpening", "Enabled", pedited, prsharpening.enabled, pedited->prsharpening.enabled); assignFromKeyfile(keyFile, "PostResizeSharpening", "Contrast", pedited, prsharpening.contrast, pedited->prsharpening.contrast); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 369af85fa..f9255f815 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -494,6 +494,7 @@ struct SharpeningParams { bool enabled; double contrast; double blurradius; + double gamma; double radius; int amount; Threshold threshold; @@ -1526,6 +1527,7 @@ public: ColorToningParams colorToning; ///< Color Toning parameters SharpeningParams sharpening; ///< Sharpening parameters SharpeningParams prsharpening; ///< Sharpening parameters for post resize sharpening + SharpeningParams pdsharpening; ///< Sharpening parameters for post demosaic sharpening SharpenEdgeParams sharpenEdge; ///< Sharpen edge parameters SharpenMicroParams sharpenMicro; ///< Sharpen microcontrast parameters VibranceParams vibrance; ///< Vibrance parameters diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 6cb6fff16..5d8dd8448 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -37,6 +37,9 @@ #include "pdaflinesfilter.h" #include "camconst.h" #include "procparams.h" +#include "color.h" +#define BENCHMARK +#include "StopWatch.h" #ifdef _OPENMP #include #endif @@ -4949,6 +4952,36 @@ void RawImageSource::getRawValues(int x, int y, int rotate, int &R, int &G, int } } +void RawImageSource::captureSharpening(const procparams::SharpeningParams &sharpeningParams) { +BENCHFUN + + array2D Y(W,H); + array2D Cb(W,H); + array2D Cr(W,H); + const float gamma = sharpeningParams.gamma; + StopWatch Stop1("rgb2Y"); + #pragma omp parallel for + for (int i = 0; i < H; ++i) { + for (int j = 0; j < W ; ++j) { + Color::RGB2YCbCr(std::max(red[i][j], 0.f), std::max(green[i][j], 0.f), std::max(blue[i][j], 0.f), Y[i][j], Cb[i][j], Cr[i][j]); + Y[i][j] = pow_F(Y[i][j], 1.f / gamma); + } + } + Stop1.stop(); + array2D tmp(W, H); + ProcParams dummy; + ImProcFunctions ipf(&dummy); + ipf.deconvsharpening(Y, tmp, W, H, sharpeningParams, 1.0); + StopWatch Stop2("Y2RGB"); + #pragma omp parallel for + for (int i = 0; i < H; ++i) { + for (int j = 0; j < W ; ++j) { + Y[i][j] = pow_F(Y[i][j], gamma); + Color::YCbCr2RGB(Y[i][j], Cb[i][j], Cr[i][j], red[i][j], green[i][j], blue[i][j]); + } + } + Stop2.stop(); +} void RawImageSource::cleanup () { delete phaseOneIccCurve; diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index 7c50991c0..7b86111af 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -305,7 +305,7 @@ protected: void hflip (Imagefloat* im); void vflip (Imagefloat* im); void getRawValues(int x, int y, int rotate, int &R, int &G, int &B) override; - + void captureSharpening(const procparams::SharpeningParams &sharpeningParams) override; }; } diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 2d594e0af..a9d32dbac 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -221,6 +221,9 @@ private: double contrastThreshold = imgsrc->getSensorType() == ST_BAYER ? params.raw.bayersensor.dualDemosaicContrast : params.raw.xtranssensor.dualDemosaicContrast; imgsrc->demosaic (params.raw, autoContrast, contrastThreshold); + if (params.pdsharpening.enabled) { + imgsrc->captureSharpening(params.pdsharpening); + } if (pl) { diff --git a/rtengine/stdimagesource.h b/rtengine/stdimagesource.h index 8f16880dc..a8251ade0 100644 --- a/rtengine/stdimagesource.h +++ b/rtengine/stdimagesource.h @@ -102,7 +102,7 @@ public: void getRawValues(int x, int y, int rotate, int &R, int &G, int &B) override { R = G = B = 0;} void flushRGB () override; - + void captureSharpening(const procparams::SharpeningParams &sharpeningParams) override {}; }; } #endif diff --git a/rtgui/CMakeLists.txt b/rtgui/CMakeLists.txt index bdd166938..bc52b64b0 100644 --- a/rtgui/CMakeLists.txt +++ b/rtgui/CMakeLists.txt @@ -106,6 +106,7 @@ set(NONCLISOURCEFILES partialpastedlg.cc pathutils.cc pcvignette.cc + pdsharpening.cc perspective.cc placesbrowser.cc popupbutton.cc diff --git a/rtgui/addsetids.h b/rtgui/addsetids.h index 163bc27ef..6a4ea83d3 100644 --- a/rtgui/addsetids.h +++ b/rtgui/addsetids.h @@ -142,6 +142,7 @@ enum { ADDSET_XTRANS_FALSE_COLOR_SUPPRESSION, ADDSET_SOFTLIGHT_STRENGTH, ADDSET_DEHAZE_STRENGTH, + ADDSET_SHARP_GAMMA, ADDSET_PARAM_NUM // THIS IS USED AS A DELIMITER!! }; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index cb3d4151c..da65cbf8e 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -152,6 +152,7 @@ void ParamsEdited::set(bool v) sharpening.contrast = v; sharpening.radius = v; sharpening.blurradius = v; + sharpening.gamma = v; sharpening.amount = v; sharpening.threshold = v; sharpening.edgesonly = v; @@ -164,6 +165,12 @@ void ParamsEdited::set(bool v) sharpening.deconvradius = v; sharpening.deconviter = v; sharpening.deconvdamping = v; + pdsharpening.enabled = v; + pdsharpening.contrast = v; + pdsharpening.gamma = v; + pdsharpening.deconvamount = v; + pdsharpening.deconvradius = v; + pdsharpening.deconviter = v; prsharpening.enabled = v; prsharpening.contrast = v; prsharpening.radius = v; @@ -729,6 +736,7 @@ void ParamsEdited::initFrom(const std::vector& sharpening.contrast = sharpening.contrast && p.sharpening.contrast == other.sharpening.contrast; sharpening.radius = sharpening.radius && p.sharpening.radius == other.sharpening.radius; sharpening.blurradius = sharpening.blurradius && p.sharpening.blurradius == other.sharpening.blurradius; + sharpening.gamma = sharpening.gamma && p.sharpening.gamma == other.sharpening.gamma; sharpening.amount = sharpening.amount && p.sharpening.amount == other.sharpening.amount; sharpening.threshold = sharpening.threshold && p.sharpening.threshold == other.sharpening.threshold; sharpening.edgesonly = sharpening.edgesonly && p.sharpening.edgesonly == other.sharpening.edgesonly; @@ -741,6 +749,11 @@ void ParamsEdited::initFrom(const std::vector& sharpening.deconvradius = sharpening.deconvradius && p.sharpening.deconvradius == other.sharpening.deconvradius; sharpening.deconviter = sharpening.deconviter && p.sharpening.deconviter == other.sharpening.deconviter; sharpening.deconvdamping = sharpening.deconvdamping && p.sharpening.deconvdamping == other.sharpening.deconvdamping; + pdsharpening.enabled = pdsharpening.enabled && p.pdsharpening.enabled == other.pdsharpening.enabled; + pdsharpening.contrast = pdsharpening.contrast && p.pdsharpening.contrast == other.pdsharpening.contrast; + pdsharpening.gamma = pdsharpening.gamma && p.pdsharpening.gamma == other.pdsharpening.gamma; + pdsharpening.deconvradius = pdsharpening.deconvradius && p.pdsharpening.deconvradius == other.pdsharpening.deconvradius; + pdsharpening.deconviter = pdsharpening.deconviter && p.pdsharpening.deconviter == other.pdsharpening.deconviter; prsharpening.enabled = prsharpening.enabled && p.prsharpening.enabled == other.prsharpening.enabled; prsharpening.contrast = prsharpening.contrast && p.prsharpening.contrast == other.prsharpening.contrast; prsharpening.radius = prsharpening.radius && p.prsharpening.radius == other.prsharpening.radius; @@ -1654,6 +1667,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.sharpening.blurradius = dontforceSet && options.baBehav[ADDSET_SHARP_RADIUS] ? toEdit.sharpening.blurradius + mods.sharpening.blurradius : mods.sharpening.blurradius; } + if (sharpening.gamma) { + toEdit.sharpening.gamma = dontforceSet && options.baBehav[ADDSET_SHARP_RADIUS] ? toEdit.sharpening.gamma + mods.sharpening.gamma : mods.sharpening.gamma; + } + if (sharpening.amount) { toEdit.sharpening.amount = dontforceSet && options.baBehav[ADDSET_SHARP_AMOUNT] ? toEdit.sharpening.amount + mods.sharpening.amount : mods.sharpening.amount; } @@ -1702,6 +1719,30 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.sharpening.deconvdamping = dontforceSet && options.baBehav[ADDSET_SHARP_DAMPING] ? toEdit.sharpening.deconvdamping + mods.sharpening.deconvdamping : mods.sharpening.deconvdamping; } + if (pdsharpening.enabled) { + toEdit.pdsharpening.enabled = mods.pdsharpening.enabled; + } + + if (pdsharpening.contrast) { + toEdit.pdsharpening.contrast = dontforceSet && options.baBehav[ADDSET_SHARP_CONTRAST] ? toEdit.pdsharpening.contrast + mods.pdsharpening.contrast : mods.pdsharpening.contrast; + } + + if (pdsharpening.deconvamount) { + toEdit.pdsharpening.deconvamount = dontforceSet && options.baBehav[ADDSET_SHARP_AMOUNT] ? toEdit.pdsharpening.deconvamount + mods.pdsharpening.deconvamount : mods.pdsharpening.deconvamount; + } + + if (pdsharpening.gamma) { + toEdit.pdsharpening.gamma = dontforceSet && options.baBehav[ADDSET_SHARP_GAMMA] ? toEdit.pdsharpening.gamma + mods.pdsharpening.gamma : mods.pdsharpening.gamma; + } + + if (pdsharpening.deconvradius) { + toEdit.pdsharpening.deconvradius = dontforceSet && options.baBehav[ADDSET_SHARP_RADIUS] ? toEdit.pdsharpening.deconvradius + mods.pdsharpening.deconvradius : mods.pdsharpening.deconvradius; + } + + if (pdsharpening.deconviter) { + toEdit.pdsharpening.deconviter = dontforceSet && options.baBehav[ADDSET_SHARP_ITER] ? toEdit.pdsharpening.deconviter + mods.pdsharpening.deconviter : mods.pdsharpening.deconviter; + } + if (prsharpening.enabled) { toEdit.prsharpening.enabled = mods.prsharpening.enabled; } @@ -3244,3 +3285,8 @@ bool FilmNegativeParamsEdited::isUnchanged() const { return enabled && redRatio && greenExp && blueRatio; } + +bool SharpeningParamsEdited::isUnchanged() const +{ + return enabled && contrast && gamma && deconvradius && deconviter; +} \ No newline at end of file diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 08a41fc7a..5191bce56 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -180,6 +180,7 @@ struct SharpeningParamsEdited { bool enabled; bool contrast; bool blurradius; + bool gamma; bool radius; bool amount; bool threshold; @@ -194,6 +195,7 @@ struct SharpeningParamsEdited { bool deconvradius; bool deconviter; bool deconvdamping; + bool isUnchanged() const; }; struct VibranceParamsEdited { @@ -684,6 +686,7 @@ struct ParamsEdited { ColorToningEdited colorToning; RetinexParamsEdited retinex; SharpeningParamsEdited sharpening; + SharpeningParamsEdited pdsharpening; SharpeningParamsEdited prsharpening; SharpenEdgeParamsEdited sharpenEdge; SharpenMicroParamsEdited sharpenMicro; diff --git a/rtgui/pdsharpening.cc b/rtgui/pdsharpening.cc new file mode 100644 index 000000000..a33da813d --- /dev/null +++ b/rtgui/pdsharpening.cc @@ -0,0 +1,221 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2004-2010 Gabor Horvath + * + * 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 "eventmapper.h" +#include "pdsharpening.h" + +using namespace rtengine; +using namespace rtengine::procparams; + +PdSharpening::PdSharpening () : FoldableToolPanel(this, "pdsharpening", M("TP_PDSHARPENING_LABEL"), false, true) +{ + + auto m = ProcEventMapper::getInstance(); + EvPdShrEnabled = m->newEvent(DEMOSAIC, "HISTORY_MSG_PDSHARPEN_ENABLED"); + EvPdShrContrast = m->newEvent(DEMOSAIC, "HISTORY_MSG_PDSHARPEN_CONTRAST"); + EvPdSharpenGamma = m->newEvent(DEMOSAIC, "HISTORY_MSG_PDSHARPEN_GAMMA"); + EvPdShrDRadius = m->newEvent(DEMOSAIC, "HISTORY_MSG_PDSHARPEN_RADIUS"); + EvPdShrDIterations = m->newEvent(DEMOSAIC, "HISTORY_MSG_PDSHARPEN_ITERATIONS"); + + Gtk::HBox* hb = Gtk::manage (new Gtk::HBox ()); + hb->show (); + contrast = Gtk::manage(new Adjuster (M("TP_SHARPENING_CONTRAST"), 0, 200, 1, 15)); + contrast->setAdjusterListener (this); + pack_start(*contrast); + contrast->show(); + + pack_start (*hb); + + rld = new Gtk::VBox (); + gamma = Gtk::manage (new Adjuster (M("TP_SHARPENING_GAMMA"), 0.5, 3.0, 0.05, 1.0)); + dradius = Gtk::manage (new Adjuster (M("TP_SHARPENING_EDRADIUS"), 0.4, 2.5, 0.01, 0.75)); + diter = Gtk::manage (new Adjuster (M("TP_SHARPENING_RLD_ITERATIONS"), 5, 100, 1, 30)); + rld->pack_start (*gamma); + rld->pack_start (*dradius); + rld->pack_start (*diter); + gamma->show(); + dradius->show (); + diter->show (); + rld->show (); + pack_start(*rld); + + dradius->setAdjusterListener (this); + gamma->setAdjusterListener (this); + diter->setAdjusterListener (this); + + rld->reference(); +} + +PdSharpening::~PdSharpening () +{ + + delete rld; +} + + +void PdSharpening::read (const ProcParams* pp, const ParamsEdited* pedited) +{ + + disableListener (); + + if (pedited) { + contrast->setEditedState (pedited->pdsharpening.contrast ? Edited : UnEdited); + gamma->setEditedState (pedited->pdsharpening.gamma ? Edited : UnEdited); + dradius->setEditedState (pedited->pdsharpening.deconvradius ? Edited : UnEdited); + diter->setEditedState (pedited->pdsharpening.deconviter ? Edited : UnEdited); + + set_inconsistent (multiImage && !pedited->pdsharpening.enabled); + } + + setEnabled(pp->pdsharpening.enabled); + + contrast->setValue (pp->pdsharpening.contrast); + gamma->setValue (pp->pdsharpening.gamma); + dradius->setValue (pp->pdsharpening.deconvradius); + diter->setValue (pp->pdsharpening.deconviter); + + enableListener (); +} + +void PdSharpening::write (ProcParams* pp, ParamsEdited* pedited) +{ + + pp->pdsharpening.contrast = contrast->getValue (); + pp->pdsharpening.enabled = getEnabled (); + pp->pdsharpening.gamma = gamma->getValue (); + pp->pdsharpening.deconvradius = dradius->getValue (); + pp->pdsharpening.deconviter = (int)diter->getValue (); + + if (pedited) { + pedited->pdsharpening.contrast = contrast->getEditedState (); + pedited->pdsharpening.gamma = gamma->getEditedState (); + pedited->pdsharpening.deconvradius = dradius->getEditedState (); + pedited->pdsharpening.deconviter = diter->getEditedState (); + pedited->pdsharpening.enabled = !get_inconsistent(); + } +} + +void PdSharpening::setDefaults (const ProcParams* defParams, const ParamsEdited* pedited) +{ + + contrast->setDefault (defParams->pdsharpening.contrast); + gamma->setDefault (defParams->pdsharpening.gamma); + dradius->setDefault (defParams->pdsharpening.deconvradius); + diter->setDefault (defParams->pdsharpening.deconviter); + + if (pedited) { + contrast->setDefaultEditedState (pedited->pdsharpening.contrast ? Edited : UnEdited); + gamma->setDefaultEditedState (pedited->pdsharpening.gamma ? Edited : UnEdited); + dradius->setDefaultEditedState (pedited->pdsharpening.deconvradius ? Edited : UnEdited); + diter->setDefaultEditedState (pedited->pdsharpening.deconviter ? Edited : UnEdited); + } else { + contrast->setDefaultEditedState (Irrelevant); + gamma->setDefaultEditedState (Irrelevant); + dradius->setDefaultEditedState (Irrelevant); + diter->setDefaultEditedState (Irrelevant); + } +} + +void PdSharpening::adjusterChanged (Adjuster* a, double newval) +{ + if (listener && (multiImage || getEnabled()) ) { + + Glib::ustring costr; + + if (a == gamma || a == dradius) { + costr = Glib::ustring::format (std::setw(3), std::fixed, std::setprecision(2), a->getValue()); + } else { + costr = Glib::ustring::format ((int)a->getValue()); + } + + if (a == contrast) { + listener->panelChanged (EvPdShrContrast, costr); + } else if (a == gamma) { + listener->panelChanged (EvPdSharpenGamma, costr); + } else if (a == dradius) { + listener->panelChanged (EvPdShrDRadius, costr); + } else if (a == diter) { + listener->panelChanged (EvPdShrDIterations, costr); + } + } +} + +void PdSharpening::enabledChanged () +{ + if (listener) { + if (get_inconsistent()) { + listener->panelChanged (EvPdShrEnabled, M("GENERAL_UNCHANGED")); + } else if (getEnabled()) { + listener->panelChanged (EvPdShrEnabled, M("GENERAL_ENABLED")); + } else { + listener->panelChanged (EvPdShrEnabled, M("GENERAL_DISABLED")); + } + } +} + +void PdSharpening::adjusterChanged(ThresholdAdjuster* a, double newBottom, double newTop) +{ +} + +void PdSharpening::adjusterChanged(ThresholdAdjuster* a, double newBottomLeft, double newTopLeft, double newBottomRight, double newTopRight) +{ +} + +void PdSharpening::adjusterChanged(ThresholdAdjuster* a, int newBottom, int newTop) +{ +} + +void PdSharpening::adjusterChanged(ThresholdAdjuster* a, int newBottomLeft, int newTopLeft, int newBottomRight, int newTopRight) +{ +} + +void PdSharpening::adjusterChanged2(ThresholdAdjuster* a, int newBottomL, int newTopL, int newBottomR, int newTopR) +{ +} + +void PdSharpening::setBatchMode (bool batchMode) +{ + + ToolPanel::setBatchMode (batchMode); + +// pack_start (*rld); + + contrast->showEditedCB (); + gamma->showEditedCB (); + dradius->showEditedCB (); + diter->showEditedCB (); +} + +void PdSharpening::setAdjusterBehavior (bool contrastadd, bool gammaadd, bool radiusadd, bool amountadd, bool dampingadd, bool iteradd, bool edgetoladd, bool haloctrladd) +{ + + contrast->setAddMode(contrastadd); + gamma->setAddMode(gammaadd); + dradius->setAddMode(radiusadd); + diter->setAddMode(iteradd); +} + +void PdSharpening::trimValues (rtengine::procparams::ProcParams* pp) +{ + + contrast->trimValue(pp->pdsharpening.contrast); + gamma->trimValue(pp->pdsharpening.gamma); + dradius->trimValue(pp->pdsharpening.deconvradius); + diter->trimValue(pp->pdsharpening.deconviter); +} diff --git a/rtgui/pdsharpening.h b/rtgui/pdsharpening.h new file mode 100644 index 000000000..998322fe4 --- /dev/null +++ b/rtgui/pdsharpening.h @@ -0,0 +1,62 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2019 Ingo Weyrich (heckflosse67@gmx.de) + * + * 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 "thresholdadjuster.h" +#include "toolpanel.h" + +class PdSharpening : public ToolParamBlock, public ThresholdAdjusterListener, public AdjusterListener, public FoldableToolPanel +{ + +protected: + Adjuster* contrast; + Adjuster* gamma; + Adjuster* dradius; + Adjuster* diter; + Gtk::VBox* rld; + + rtengine::ProcEvent EvPdShrEnabled; + rtengine::ProcEvent EvPdShrContrast; + rtengine::ProcEvent EvPdShrDRadius; + rtengine::ProcEvent EvPdSharpenGamma; + rtengine::ProcEvent EvPdShrDIterations; +public: + + PdSharpening (); + ~PdSharpening () override; + + void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; + void setBatchMode (bool batchMode) override; + + void adjusterChanged (Adjuster* a, double newval) override; + void enabledChanged () override; + + void adjusterChanged(ThresholdAdjuster* a, double newBottom, double newTop) override; + void adjusterChanged(ThresholdAdjuster* a, double newBottomLeft, double newTopLeft, double newBottomRight, double newTopRight) override; + void adjusterChanged(ThresholdAdjuster* a, int newBottom, int newTop) override; + void adjusterChanged(ThresholdAdjuster* a, int newBottomLeft, int newTopLeft, int newBottomRight, int newTopRight) override; + void adjusterChanged2(ThresholdAdjuster* a, int newBottomL, int newTopL, int newBottomR, int newTopR) override; + + void setAdjusterBehavior (bool contrastadd, bool gammaadd, bool radiusadd, bool amountadd, bool dampingadd, bool iteradd, bool edgetoladd, bool haloctrladd); + void trimValues (rtengine::procparams::ProcParams* pp) override; +}; diff --git a/rtgui/toolpanelcoord.cc b/rtgui/toolpanelcoord.cc index f7e2991e1..64e44b3fb 100644 --- a/rtgui/toolpanelcoord.cc +++ b/rtgui/toolpanelcoord.cc @@ -93,7 +93,7 @@ ToolPanelCoordinator::ToolPanelCoordinator (bool batch) : ipc (nullptr), favorit xtransrawexposure = Gtk::manage (new XTransRAWExposure ()); fattal = Gtk::manage (new FattalToneMapping ()); filmNegative = Gtk::manage (new FilmNegative ()); - + pdSharpening = Gtk::manage (new PdSharpening()); // So Demosaic, Line noise filter, Green Equilibration, Ca-Correction (garder le nom de section identique!) and Black-Level will be moved in a "Bayer sensor" tool, // and a separate Demosaic and Black Level tool will be created in an "X-Trans sensor" tool @@ -156,6 +156,7 @@ ToolPanelCoordinator::ToolPanelCoordinator (bool batch) : ipc (nullptr), favorit addfavoritePanel (rawPanel, darkframe); addfavoritePanel (rawPanel, flatfield); addfavoritePanel (rawPanel, filmNegative); + addfavoritePanel (rawPanel, pdSharpening); int favoriteCount = 0; for(auto it = favorites.begin(); it != favorites.end(); ++it) { @@ -309,6 +310,7 @@ void ToolPanelCoordinator::imageTypeChanged (bool isRaw, bool isBayer, bool isXt preprocess->FoldableToolPanel::show(); flatfield->FoldableToolPanel::show(); filmNegative->FoldableToolPanel::show(); + pdSharpening->FoldableToolPanel::show(); retinex->FoldableToolPanel::setGrayedOut(false); return false; @@ -325,6 +327,7 @@ void ToolPanelCoordinator::imageTypeChanged (bool isRaw, bool isBayer, bool isXt preprocess->FoldableToolPanel::show(); flatfield->FoldableToolPanel::show(); filmNegative->FoldableToolPanel::show(); + pdSharpening->FoldableToolPanel::show(); retinex->FoldableToolPanel::setGrayedOut(false); return false; @@ -341,6 +344,7 @@ void ToolPanelCoordinator::imageTypeChanged (bool isRaw, bool isBayer, bool isXt preprocess->FoldableToolPanel::hide(); flatfield->FoldableToolPanel::show(); filmNegative->FoldableToolPanel::hide(); + pdSharpening->FoldableToolPanel::hide(); retinex->FoldableToolPanel::setGrayedOut(false); return false; @@ -356,6 +360,7 @@ void ToolPanelCoordinator::imageTypeChanged (bool isRaw, bool isBayer, bool isXt preprocess->FoldableToolPanel::hide(); flatfield->FoldableToolPanel::hide(); filmNegative->FoldableToolPanel::hide(); + pdSharpening->FoldableToolPanel::hide(); retinex->FoldableToolPanel::setGrayedOut(false); return false; @@ -368,6 +373,7 @@ void ToolPanelCoordinator::imageTypeChanged (bool isRaw, bool isBayer, bool isXt { rawPanelSW->set_sensitive(false); filmNegative->FoldableToolPanel::hide(); + pdSharpening->FoldableToolPanel::hide(); retinex->FoldableToolPanel::setGrayedOut(true); return false; @@ -484,7 +490,7 @@ void ToolPanelCoordinator::profileChange( lParams[1] = *mergedParams; pe.initFrom (lParams); - filterRawRefresh = pe.raw.isUnchanged() && pe.lensProf.isUnchanged() && pe.retinex.isUnchanged() && pe.filmNegative.isUnchanged(); + filterRawRefresh = pe.raw.isUnchanged() && pe.lensProf.isUnchanged() && pe.retinex.isUnchanged() && pe.filmNegative.isUnchanged() && pe.pdsharpening.isUnchanged(); } *params = *mergedParams; diff --git a/rtgui/toolpanelcoord.h b/rtgui/toolpanelcoord.h index a1b26b29f..b88fef124 100644 --- a/rtgui/toolpanelcoord.h +++ b/rtgui/toolpanelcoord.h @@ -77,6 +77,7 @@ #include "colortoning.h" #include "filmsimulation.h" #include "prsharpening.h" +#include "pdsharpening.h" #include "fattaltonemap.h" #include "localcontrast.h" #include "softlight.h" @@ -157,7 +158,7 @@ protected: FattalToneMapping *fattal; MetaDataPanel* metadata; FilmNegative* filmNegative; - + PdSharpening* pdSharpening; std::vector paramcListeners; rtengine::StagedImageProcessor* ipc; From 8421f8780a1c404d72ed92b33ba57f5acecee0c6 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 15 Aug 2019 20:40:32 +0200 Subject: [PATCH 02/50] capture sharpening: contrast threshold --- rtdata/languages/default | 2 +- rtengine/imagesource.h | 2 +- rtengine/improccoordinator.cc | 18 +++++++++--- rtengine/improccoordinator.h | 4 +-- rtengine/improcfun.h | 2 +- rtengine/ipsharpen.cc | 38 ++++++++---------------- rtengine/procevents.h | 2 +- rtengine/procparams.cc | 4 +-- rtengine/rawimagesource.cc | 55 ++++++++++++++++++++++++++++++----- rtengine/rawimagesource.h | 2 +- rtengine/refreshmap.cc | 4 ++- rtengine/rtengine.h | 2 +- rtengine/simpleprocess.cc | 2 +- rtengine/stdimagesource.h | 2 +- rtgui/pdsharpening.cc | 19 ++++++++++-- rtgui/pdsharpening.h | 1 - rtgui/toolpanelcoord.cc | 3 +- 17 files changed, 106 insertions(+), 56 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 9aa743ab0..ba96a43cb 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -726,6 +726,7 @@ HISTORY_MSG_490;DRC - Amount HISTORY_MSG_491;White Balance HISTORY_MSG_492;RGB Curves HISTORY_MSG_493;L*a*b* Adjustments +HISTORY_MSG_494;Capture Sharpening HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction @@ -764,7 +765,6 @@ HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius HISTORY_MSG_METADATA_MODE;Metadata copy mode HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold HISTORY_MSG_PDSHARPEN_CONTRAST;CAS - Contrast threshold -HISTORY_MSG_PDSHARPEN_ENABLED;Capture Sharpening HISTORY_MSG_PDSHARPEN_GAMMA;CAS - Gamma HISTORY_MSG_PDSHARPEN_ITERATIONS;CAS - Iterations HISTORY_MSG_PDSHARPEN_RADIUS;CAS - Radius diff --git a/rtengine/imagesource.h b/rtengine/imagesource.h index 6e57bd532..006fe59a6 100644 --- a/rtengine/imagesource.h +++ b/rtengine/imagesource.h @@ -182,7 +182,7 @@ public: return this; } virtual void getRawValues(int x, int y, int rotate, int &R, int &G, int &B) = 0; - virtual void captureSharpening(const procparams::SharpeningParams &sharpeningParams) = 0; + virtual void captureSharpening(const procparams::SharpeningParams &sharpeningParams, bool showMask) = 0; }; } diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 2e2ae9084..29d56e79e 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -53,6 +53,7 @@ ImProcCoordinator::ImProcCoordinator() : softProof(false), gamutCheck(false), sharpMask(false), + sharpMaskChanged(false), scale(10), highDetailPreprocessComputed(false), highDetailRawComputed(false), @@ -333,7 +334,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) imgsrc->demosaic(rp, autoContrast, contrastThreshold); //enabled demosaic if (params->pdsharpening.enabled) { - imgsrc->captureSharpening(params->pdsharpening); + imgsrc->captureSharpening(params->pdsharpening, sharpMask); } if (imgsrc->getSensorType() == ST_BAYER && bayerAutoContrastListener && autoContrast) { bayerAutoContrastListener->autoContrastChanged(autoContrast ? contrastThreshold : -1.0); @@ -1347,9 +1348,16 @@ void ImProcCoordinator::getSoftProofing(bool &softProof, bool &gamutCheck) gamutCheck = this->gamutCheck; } -void ImProcCoordinator::setSharpMask (bool sharpMask) +ProcEvent ImProcCoordinator::setSharpMask (bool sharpMask) { - this->sharpMask = sharpMask; + if (this->sharpMask != sharpMask) { + sharpMaskChanged = true; + this->sharpMask = sharpMask; + return params->pdsharpening.enabled ? rtengine::EvPdShrEnabled : rtengine::EvShrEnabled; + } else { + sharpMaskChanged = false; + return rtengine::EvShrEnabled; + } } void ImProcCoordinator::saveInputICCReference(const Glib::ustring& fname, bool apply_wb) @@ -1550,8 +1558,10 @@ void ImProcCoordinator::process() || params->wavelet != nextParams->wavelet || params->dirpyrequalizer != nextParams->dirpyrequalizer || params->dehaze != nextParams->dehaze - || params->pdsharpening != nextParams->pdsharpening; + || params->pdsharpening != nextParams->pdsharpening + || sharpMaskChanged; + sharpMaskChanged = false; *params = *nextParams; int change = changeSinceLast; changeSinceLast = 0; diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index fdf74d297..0315bc180 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -77,7 +77,7 @@ protected: bool softProof; bool gamutCheck; bool sharpMask; - + bool sharpMaskChanged; int scale; bool highDetailPreprocessComputed; bool highDetailRawComputed; @@ -277,7 +277,7 @@ public: void getMonitorProfile (Glib::ustring& profile, RenderingIntent& intent) const override; void setSoftProofing (bool softProof, bool gamutCheck) override; void getSoftProofing (bool &softProof, bool &gamutCheck) override; - void setSharpMask (bool sharpMask) override; + ProcEvent setSharpMask (bool sharpMask) override; bool updateTryLock () override { return updaterThreadStart.trylock(); diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 65f0f5a96..6fe8a785d 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -248,7 +248,7 @@ public: void Lanczos(const LabImage* src, LabImage* dst, float scale); void Lanczos(const Imagefloat* src, Imagefloat* dst, float scale); - void deconvsharpening(float** luminance, float** buffer, int W, int H, const procparams::SharpeningParams &sharpenParam, double Scale); + void deconvsharpening(float** luminance, float** buffer, float** blend, int W, int H, const procparams::SharpeningParams &sharpenParam, double Scale); void MLsharpen(LabImage* lab); // Manuel's clarity / sharpening void MLmicrocontrast(float** luminance, int W, int H); //Manuel's microcontrast void MLmicrocontrast(LabImage* lab); //Manuel's microcontrast diff --git a/rtengine/ipsharpen.cc b/rtengine/ipsharpen.cc index eeda786a5..897aaf7b5 100644 --- a/rtengine/ipsharpen.cc +++ b/rtengine/ipsharpen.cc @@ -158,7 +158,7 @@ namespace rtengine extern const Settings* settings; -void ImProcFunctions::deconvsharpening (float** luminance, float** tmp, int W, int H, const SharpeningParams &sharpenParam, double Scale) +void ImProcFunctions::deconvsharpening (float** luminance, float** tmp, float ** blend, int W, int H, const SharpeningParams &sharpenParam, double Scale) { if (sharpenParam.deconvamount == 0 && sharpenParam.blurradius < 0.25f) { return; @@ -175,10 +175,6 @@ BENCHFUN } } - // calculate contrast based blend factors to reduce sharpening in regions with low contrast - JaggedArray blend(W, H); - float contrast = sharpenParam.contrast / 100.f; - buildBlendMask(luminance, blend, W, H, contrast, 1.f); JaggedArray* blurbuffer = nullptr; if (sharpenParam.blurradius >= 0.25f) { @@ -254,11 +250,12 @@ void ImProcFunctions::sharpening (LabImage* lab, const SharpeningParams &sharpen int W = lab->W, H = lab->H; + // calculate contrast based blend factors to reduce sharpening in regions with low contrast + JaggedArray blend(W, H); + float contrast = sharpenParam.contrast / 100.f; + buildBlendMask(lab->L, blend, W, H, contrast, 1.f); + if(showMask) { - // calculate contrast based blend factors to reduce sharpening in regions with low contrast - JaggedArray blend(W, H); - float contrast = sharpenParam.contrast / 100.f; - buildBlendMask(lab->L, blend, W, H, contrast, 1.f); #ifdef _OPENMP #pragma omp parallel for #endif @@ -274,7 +271,7 @@ void ImProcFunctions::sharpening (LabImage* lab, const SharpeningParams &sharpen JaggedArray b2(W, H); if (sharpenParam.method == "rld") { - deconvsharpening (lab->L, b2, lab->W, lab->H, sharpenParam, scale); + deconvsharpening (lab->L, b2, blend, lab->W, lab->H, sharpenParam, scale); return; } BENCHFUN @@ -290,11 +287,6 @@ BENCHFUN } } - // calculate contrast based blend factors to reduce sharpening in regions with low contrast - JaggedArray blend(W, H); - float contrast = sharpenParam.contrast / 100.f; - buildBlendMask(lab->L, blend, W, H, contrast); - JaggedArray blur(W, H); if (sharpenParam.blurradius >= 0.25f) { @@ -886,11 +878,11 @@ void ImProcFunctions::sharpeningcam (CieImage* ncie, float** b2, bool showMask) int W = ncie->W, H = ncie->H; + // calculate contrast based blend factors to reduce sharpening in regions with low contrast + JaggedArray blend(W, H); + float contrast = params->sharpening.contrast / 100.f; + buildBlendMask(ncie->sh_p, blend, W, H, contrast); if(showMask) { - // calculate contrast based blend factors to reduce sharpening in regions with low contrast - JaggedArray blend(W, H); - float contrast = params->sharpening.contrast / 100.f; - buildBlendMask(ncie->sh_p, blend, W, H, contrast); #ifdef _OPENMP #pragma omp parallel for #endif @@ -903,9 +895,8 @@ void ImProcFunctions::sharpeningcam (CieImage* ncie, float** b2, bool showMask) return; } - if (params->sharpening.method == "rld") { - deconvsharpening (ncie->sh_p, b2, ncie->W, ncie->H, params->sharpening, scale); + deconvsharpening (ncie->sh_p, b2, blend, ncie->W, ncie->H, params->sharpening, scale); return; } @@ -921,11 +912,6 @@ void ImProcFunctions::sharpeningcam (CieImage* ncie, float** b2, bool showMask) } } - // calculate contrast based blend factors to reduce sharpening in regions with low contrast - JaggedArray blend(W, H); - float contrast = params->sharpening.contrast / 100.f; - buildBlendMask(ncie->sh_p, blend, W, H, contrast); - #ifdef _OPENMP #pragma omp parallel #endif diff --git a/rtengine/procevents.h b/rtengine/procevents.h index bb6a30038..670c0c102 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -520,7 +520,7 @@ enum ProcEventCode { EvWBEnabled = 490, EvRGBEnabled = 491, EvLEnabled = 492, -// EvPixelShiftOneGreen = 493, can be reused + EvPdShrEnabled = 493, NUMOFEVENTS diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 4f2cdce2e..e1e66d99c 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2790,9 +2790,9 @@ void ProcParams::setDefaults() prsharpening.deconvdamping = 0; pdsharpening = {}; - pdsharpening.contrast = 0.0; + pdsharpening.contrast = 10.0; prsharpening.method = "rld"; - pdsharpening.gamma = 1.0; + pdsharpening.gamma = 1.35; pdsharpening.deconvradius = 0.75; pdsharpening.deconviter = 30; diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 5d8dd8448..96f161d9f 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -38,6 +38,7 @@ #include "camconst.h" #include "procparams.h" #include "color.h" +#include "rt_algo.h" #define BENCHMARK #include "StopWatch.h" #ifdef _OPENMP @@ -4952,26 +4953,65 @@ void RawImageSource::getRawValues(int x, int y, int rotate, int &R, int &G, int } } -void RawImageSource::captureSharpening(const procparams::SharpeningParams &sharpeningParams) { +void RawImageSource::captureSharpening(const procparams::SharpeningParams &sharpeningParams, bool showMask) { BENCHFUN - array2D Y(W,H); - array2D Cb(W,H); - array2D Cr(W,H); + const float xyz_rgb[3][3] = { // XYZ from RGB + { 0.412453, 0.357580, 0.180423 }, + { 0.212671, 0.715160, 0.072169 }, + { 0.019334, 0.119193, 0.950227 } + }; + + float contrast = sharpeningParams.contrast / 100.f; + + if (showMask) { + StopWatch Stop1("Show mask"); + array2D& L = blue; // blue will be overridden anyway => we can use its buffer to store L +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int i = 0; i < H; ++i) { + Color::RGB2L(red[i], green[i], blue[i], L[i], xyz_rgb, W); + } + array2D& blend = red; // red will be overridden anyway => we can use its buffer to store the blend mask + buildBlendMask(L, blend, W, H, contrast, 1.f); + +#ifdef _OPENMP + #pragma omp parallel for +#endif + for (int i = 0; i < H; ++i) { + for (int j = 0; j < W; ++j) { + red[i][j] = green[i][j] = blue[i][j] = blend[i][j] * 16384.f; + } + } + return; + } + + array2D L(W,H); + array2D& Y = red; // red will be overridden anyway => we can use its buffer to store Y + array2D& Cb = green; // green will be overridden anyway => we can use its buffer to store Cb + array2D& Cr = blue; // blue will be overridden anyway => we can use its buffer to store Cr const float gamma = sharpeningParams.gamma; + StopWatch Stop1("rgb2Y"); #pragma omp parallel for for (int i = 0; i < H; ++i) { - for (int j = 0; j < W ; ++j) { + Color::RGB2L(red[i], green[i], blue[i], L[i], xyz_rgb, W); + for (int j = 0; j < W; ++j) { Color::RGB2YCbCr(std::max(red[i][j], 0.f), std::max(green[i][j], 0.f), std::max(blue[i][j], 0.f), Y[i][j], Cb[i][j], Cr[i][j]); Y[i][j] = pow_F(Y[i][j], 1.f / gamma); } } + // calculate contrast based blend factors to reduce sharpening in regions with low contrast + JaggedArray blend(W, H); + buildBlendMask(L, blend, W, H, contrast, 1.f); + Stop1.stop(); - array2D tmp(W, H); + array2D& tmp = L; // L is not used anymore now => we can use its buffer as the needed temporary buffer ProcParams dummy; ImProcFunctions ipf(&dummy); - ipf.deconvsharpening(Y, tmp, W, H, sharpeningParams, 1.0); + ipf.deconvsharpening(Y, tmp, blend, W, H, sharpeningParams, 1.0); StopWatch Stop2("Y2RGB"); #pragma omp parallel for for (int i = 0; i < H; ++i) { @@ -4982,6 +5022,7 @@ BENCHFUN } Stop2.stop(); } + void RawImageSource::cleanup () { delete phaseOneIccCurve; diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index 7b86111af..a7aee0843 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -305,7 +305,7 @@ protected: void hflip (Imagefloat* im); void vflip (Imagefloat* im); void getRawValues(int x, int y, int rotate, int &R, int &G, int &B) override; - void captureSharpening(const procparams::SharpeningParams &sharpeningParams) override; + void captureSharpening(const procparams::SharpeningParams &sharpeningParams, bool showMask) override; }; } diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index d741b1744..8282f5b4b 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -519,7 +519,9 @@ int refreshmap[rtengine::NUMOFEVENTS] = { HDR, // EvTMFattalAmount ALLNORAW, // EvWBEnabled RGBCURVE, // EvRGBEnabled - LUMINANCECURVE // EvLEnabled + LUMINANCECURVE, // EvLEnabled + DEMOSAIC // EvPdShrEnabled + }; diff --git a/rtengine/rtengine.h b/rtengine/rtengine.h index f772975b0..ca4cebe2e 100644 --- a/rtengine/rtengine.h +++ b/rtengine/rtengine.h @@ -535,7 +535,7 @@ public: virtual void getMonitorProfile (Glib::ustring& monitorProfile, RenderingIntent& intent) const = 0; virtual void setSoftProofing (bool softProof, bool gamutCheck) = 0; virtual void getSoftProofing (bool &softProof, bool &gamutCheck) = 0; - virtual void setSharpMask (bool sharpMask) = 0; + virtual ProcEvent setSharpMask (bool sharpMask) = 0; virtual ~StagedImageProcessor () {} diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index a9d32dbac..24a3f3263 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -222,7 +222,7 @@ private: imgsrc->demosaic (params.raw, autoContrast, contrastThreshold); if (params.pdsharpening.enabled) { - imgsrc->captureSharpening(params.pdsharpening); + imgsrc->captureSharpening(params.pdsharpening, false); } diff --git a/rtengine/stdimagesource.h b/rtengine/stdimagesource.h index a8251ade0..5acb8d113 100644 --- a/rtengine/stdimagesource.h +++ b/rtengine/stdimagesource.h @@ -102,7 +102,7 @@ public: void getRawValues(int x, int y, int rotate, int &R, int &G, int &B) override { R = G = B = 0;} void flushRGB () override; - void captureSharpening(const procparams::SharpeningParams &sharpeningParams) override {}; + void captureSharpening(const procparams::SharpeningParams &sharpeningParams, bool showMask) override {}; }; } #endif diff --git a/rtgui/pdsharpening.cc b/rtgui/pdsharpening.cc index a33da813d..896d416b5 100644 --- a/rtgui/pdsharpening.cc +++ b/rtgui/pdsharpening.cc @@ -19,6 +19,7 @@ #include #include "eventmapper.h" #include "pdsharpening.h" +#include "options.h" using namespace rtengine; using namespace rtengine::procparams; @@ -27,7 +28,6 @@ PdSharpening::PdSharpening () : FoldableToolPanel(this, "pdsharpening", M("TP_PD { auto m = ProcEventMapper::getInstance(); - EvPdShrEnabled = m->newEvent(DEMOSAIC, "HISTORY_MSG_PDSHARPEN_ENABLED"); EvPdShrContrast = m->newEvent(DEMOSAIC, "HISTORY_MSG_PDSHARPEN_CONTRAST"); EvPdSharpenGamma = m->newEvent(DEMOSAIC, "HISTORY_MSG_PDSHARPEN_GAMMA"); EvPdShrDRadius = m->newEvent(DEMOSAIC, "HISTORY_MSG_PDSHARPEN_RADIUS"); @@ -35,7 +35,7 @@ PdSharpening::PdSharpening () : FoldableToolPanel(this, "pdsharpening", M("TP_PD Gtk::HBox* hb = Gtk::manage (new Gtk::HBox ()); hb->show (); - contrast = Gtk::manage(new Adjuster (M("TP_SHARPENING_CONTRAST"), 0, 200, 1, 15)); + contrast = Gtk::manage(new Adjuster (M("TP_SHARPENING_CONTRAST"), 0, 200, 1, 10)); contrast->setAdjusterListener (this); pack_start(*contrast); contrast->show(); @@ -43,7 +43,7 @@ PdSharpening::PdSharpening () : FoldableToolPanel(this, "pdsharpening", M("TP_PD pack_start (*hb); rld = new Gtk::VBox (); - gamma = Gtk::manage (new Adjuster (M("TP_SHARPENING_GAMMA"), 0.5, 3.0, 0.05, 1.0)); + gamma = Gtk::manage (new Adjuster (M("TP_SHARPENING_GAMMA"), 0.5, 3.0, 0.05, 1.35)); dradius = Gtk::manage (new Adjuster (M("TP_SHARPENING_EDRADIUS"), 0.4, 2.5, 0.01, 0.75)); diter = Gtk::manage (new Adjuster (M("TP_SHARPENING_RLD_ITERATIONS"), 5, 100, 1, 30)); rld->pack_start (*gamma); @@ -59,6 +59,19 @@ PdSharpening::PdSharpening () : FoldableToolPanel(this, "pdsharpening", M("TP_PD gamma->setAdjusterListener (this); diter->setAdjusterListener (this); + if (contrast->delay < options.adjusterMaxDelay) { + contrast->delay = options.adjusterMaxDelay; + } + if (dradius->delay < options.adjusterMaxDelay) { + dradius->delay = options.adjusterMaxDelay; + } + if (gamma->delay < options.adjusterMaxDelay) { + gamma->delay = options.adjusterMaxDelay; + } + if (diter->delay < options.adjusterMaxDelay) { + diter->delay = options.adjusterMaxDelay; + } + rld->reference(); } diff --git a/rtgui/pdsharpening.h b/rtgui/pdsharpening.h index 998322fe4..fe9359349 100644 --- a/rtgui/pdsharpening.h +++ b/rtgui/pdsharpening.h @@ -33,7 +33,6 @@ protected: Adjuster* diter; Gtk::VBox* rld; - rtengine::ProcEvent EvPdShrEnabled; rtengine::ProcEvent EvPdShrContrast; rtengine::ProcEvent EvPdShrDRadius; rtengine::ProcEvent EvPdSharpenGamma; diff --git a/rtgui/toolpanelcoord.cc b/rtgui/toolpanelcoord.cc index 64e44b3fb..93f45aefe 100644 --- a/rtgui/toolpanelcoord.cc +++ b/rtgui/toolpanelcoord.cc @@ -695,8 +695,7 @@ void ToolPanelCoordinator::sharpMaskSelected(bool sharpMask) return; } ipc->beginUpdateParams (); - ipc->setSharpMask(sharpMask); - ipc->endUpdateParams (rtengine::EvShrEnabled); + ipc->endUpdateParams (ipc->setSharpMask(sharpMask)); } int ToolPanelCoordinator::getSpotWBRectSize() const From e4b955523e7a46882bd1982c962cfe2bc9e72467 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 15 Aug 2019 23:23:28 +0200 Subject: [PATCH 03/50] Capture sharpening: small speedup --- rtengine/color.h | 58 ++++++++++++++++++++++++++++++++++++-- rtengine/rawimagesource.cc | 10 ++----- 2 files changed, 58 insertions(+), 10 deletions(-) diff --git a/rtengine/color.h b/rtengine/color.h index 22a648634..7b198f284 100644 --- a/rtengine/color.h +++ b/rtengine/color.h @@ -1806,9 +1806,37 @@ public: static inline void RGB2YCbCr(float R, float G, float B, float &Y, float &Cb, float &Cr) { Y = 0.2627f * R + 0.6780f * G + 0.0593f * B; - Cb = -0.2627f * R - 0.6780f * G + (1.f - 0.0593f) * B; - Cr = (1.f - 0.2627f) * R - 0.6780f * G - 0.0593f * B; + Cb = (1.f - 0.0593f) * B - (0.2627f * R + 0.6780f * G); + Cr = (1.f - 0.2627f) * R - (0.6780f * G + 0.0593f * B); + } + static inline void RGB2YCbCr(float* R, float* G, float* B, float* Y, float* Cb, float *Cr, float gamma, int W) { + gamma = 1.f / gamma; + int i = 0; +#ifdef __SSE2__ + const vfloat gammav = F2V(gamma); + const vfloat c1v = F2V(0.2627f); + const vfloat c2v = F2V(0.6780f); + const vfloat c3v = F2V(0.0593f); + const vfloat c4v = F2V(1.f - 0.0593f); + const vfloat c5v = F2V(1.f - 0.2627f); + for (; i < W - 3; i += 4) { + const vfloat Rv = vmaxf(LVFU(R[i]), ZEROV); + const vfloat Gv = vmaxf(LVFU(G[i]), ZEROV); + const vfloat Bv = vmaxf(LVFU(B[i]), ZEROV); + STVFU(Y[i], pow_F(c1v * Rv + c2v * Gv + c3v * Bv, gammav)); + STVFU(Cb[i], c4v * Bv - (c1v * Rv + c2v * Gv)); + STVFU(Cr[i], c5v * Rv - (c2v * Gv + c3v * Bv)); + } +#endif + for (; i < W; ++i) { + const float r = std::max(R[i], 0.f); + const float g = std::max(G[i], 0.f); + const float b = std::max(B[i], 0.f); + Y[i] = pow_F(0.2627f * r + 0.6780f * g + 0.0593f * b, gamma); + Cb[i] = (1.f - 0.0593f) * b - (0.2627f * r + 0.6780f * g); + Cr[i] = (1.f - 0.2627f) * r - (0.6780f * g + 0.0593f * b); + } } static inline void YCbCr2RGB(float Y, float Cb, float Cr, float &R, float &G, float &B) { @@ -1816,6 +1844,32 @@ public: G = std::max(Y - (0.0593f / 0.6780f) * Cb - (0.2627f / 0.6780f) * Cr, 0.f); B = std::max(Y + Cb, 0.f); } + + static inline void YCbCr2RGB(float* Y, float* Cb, float* Cr, float* R, float* G, float* B, float gamma, int W) { + int i = 0; +#ifdef __SSE2__ + const vfloat gammav = F2V(gamma); + const vfloat c1v = F2V(0.0593f / 0.6780f); + const vfloat c2v = F2V(0.2627f / 0.6780f); + + for (; i < W - 3; i += 4) { + const vfloat Yv = pow_F(LVFU(Y[i]), gammav); + const vfloat Crv = LVFU(Cr[i]); + const vfloat Cbv = LVFU(Cb[i]); + STVFU(R[i], vmaxf(Yv + Crv, ZEROV)); + STVFU(G[i], vmaxf(Yv - c1v * Cbv - c2v * Crv, ZEROV)); + STVFU(B[i], vmaxf(Yv + Cbv, ZEROV)); + } +#endif + for (; i < W; ++i) { + const float y = pow_F(Y[i], gamma); + const float cr = Cr[i]; + const float cb = Cb[i]; + R[i] = std::max(y + cr, 0.f); + G[i] = std::max(y - (0.0593f / 0.6780f) * cb - (0.2627f / 0.6780f) * cr, 0.f); + B[i] = std::max(y + cb, 0.f); + } + } }; } diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 96f161d9f..25beb6208 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -4998,10 +4998,7 @@ BENCHFUN #pragma omp parallel for for (int i = 0; i < H; ++i) { Color::RGB2L(red[i], green[i], blue[i], L[i], xyz_rgb, W); - for (int j = 0; j < W; ++j) { - Color::RGB2YCbCr(std::max(red[i][j], 0.f), std::max(green[i][j], 0.f), std::max(blue[i][j], 0.f), Y[i][j], Cb[i][j], Cr[i][j]); - Y[i][j] = pow_F(Y[i][j], 1.f / gamma); - } + Color::RGB2YCbCr(red[i], green[i], blue[i], Y[i], Cb[i], Cr[i], gamma, W); } // calculate contrast based blend factors to reduce sharpening in regions with low contrast JaggedArray blend(W, H); @@ -5015,10 +5012,7 @@ BENCHFUN StopWatch Stop2("Y2RGB"); #pragma omp parallel for for (int i = 0; i < H; ++i) { - for (int j = 0; j < W ; ++j) { - Y[i][j] = pow_F(Y[i][j], gamma); - Color::YCbCr2RGB(Y[i][j], Cb[i][j], Cr[i][j], red[i][j], green[i][j], blue[i][j]); - } + Color::YCbCr2RGB(Y[i], Cb[i], Cr[i], red[i], green[i], blue[i], gamma, W); } Stop2.stop(); } From 7b3c50bc315e865259945ed246ab08926439d440 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sat, 17 Aug 2019 15:18:24 +0200 Subject: [PATCH 04/50] Capture sharpening: auto contrast threshold --- rtdata/languages/default | 1 + rtengine/imagesource.h | 2 +- rtengine/improccoordinator.cc | 18 ++++++--- rtengine/improccoordinator.h | 6 +++ rtengine/procparams.cc | 5 +++ rtengine/procparams.h | 1 + rtengine/rawimagesource.cc | 11 +++--- rtengine/rawimagesource.h | 2 +- rtengine/rtengine.h | 1 + rtengine/simpleprocess.cc | 2 +- rtengine/stdimagesource.h | 2 +- rtgui/paramsedited.cc | 8 +++- rtgui/paramsedited.h | 1 + rtgui/pdsharpening.cc | 72 +++++++++++++++++++++++++---------- rtgui/pdsharpening.h | 15 ++++---- rtgui/toolpanelcoord.cc | 1 + 16 files changed, 103 insertions(+), 45 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index ba96a43cb..d891d8692 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -765,6 +765,7 @@ HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius HISTORY_MSG_METADATA_MODE;Metadata copy mode HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold HISTORY_MSG_PDSHARPEN_CONTRAST;CAS - Contrast threshold +HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CAS - Auto threshold HISTORY_MSG_PDSHARPEN_GAMMA;CAS - Gamma HISTORY_MSG_PDSHARPEN_ITERATIONS;CAS - Iterations HISTORY_MSG_PDSHARPEN_RADIUS;CAS - Radius diff --git a/rtengine/imagesource.h b/rtengine/imagesource.h index 006fe59a6..46cbc28a6 100644 --- a/rtengine/imagesource.h +++ b/rtengine/imagesource.h @@ -182,7 +182,7 @@ public: return this; } virtual void getRawValues(int x, int y, int rotate, int &R, int &G, int &B) = 0; - virtual void captureSharpening(const procparams::SharpeningParams &sharpeningParams, bool showMask) = 0; + virtual void captureSharpening(const procparams::SharpeningParams &sharpeningParams, bool showMask, double &conrastThreshold) = 0; }; } diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 29d56e79e..7d485fd19 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -121,6 +121,7 @@ ImProcCoordinator::ImProcCoordinator() : flatFieldAutoClipListener(nullptr), bayerAutoContrastListener(nullptr), xtransAutoContrastListener(nullptr), + pdSharpenAutoContrastListener(nullptr), frameCountListener(nullptr), imageTypeListener(nullptr), actListener(nullptr), @@ -333,16 +334,21 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) double contrastThreshold = imgsrc->getSensorType() == ST_BAYER ? params->raw.bayersensor.dualDemosaicContrast : params->raw.xtranssensor.dualDemosaicContrast; imgsrc->demosaic(rp, autoContrast, contrastThreshold); //enabled demosaic - if (params->pdsharpening.enabled) { - imgsrc->captureSharpening(params->pdsharpening, sharpMask); - } if (imgsrc->getSensorType() == ST_BAYER && bayerAutoContrastListener && autoContrast) { - bayerAutoContrastListener->autoContrastChanged(autoContrast ? contrastThreshold : -1.0); - } - if (imgsrc->getSensorType() == ST_FUJI_XTRANS && xtransAutoContrastListener && autoContrast) { + bayerAutoContrastListener->autoContrastChanged(contrastThreshold); + } else if (imgsrc->getSensorType() == ST_FUJI_XTRANS && xtransAutoContrastListener && autoContrast) { xtransAutoContrastListener->autoContrastChanged(autoContrast ? contrastThreshold : -1.0); } + if (params->pdsharpening.enabled) { + double pdSharpencontrastThreshold = params->pdsharpening.contrast; + imgsrc->captureSharpening(params->pdsharpening, sharpMask, pdSharpencontrastThreshold); + if (pdSharpenAutoContrastListener && params->pdsharpening.autoContrast) { + pdSharpenAutoContrastListener->autoContrastChanged(pdSharpencontrastThreshold); + } + } + + // if a demosaic happened we should also call getimage later, so we need to set the M_INIT flag todo |= M_INIT; diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index 0315bc180..ef1c52bc6 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -161,6 +161,7 @@ protected: FlatFieldAutoClipListener *flatFieldAutoClipListener; AutoContrastListener *bayerAutoContrastListener; AutoContrastListener *xtransAutoContrastListener; + AutoContrastListener *pdSharpenAutoContrastListener; FrameCountListener *frameCountListener; ImageTypeListener *imageTypeListener; @@ -363,6 +364,11 @@ public: xtransAutoContrastListener = acl; } + void setpdSharpenAutoContrastListener (AutoContrastListener* acl) override + { + pdSharpenAutoContrastListener = acl; + } + void setImageTypeListener (ImageTypeListener* itl) override { imageTypeListener = itl; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index e1e66d99c..467f1446a 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -1079,6 +1079,7 @@ void ColorToningParams::getCurves(ColorGradientCurve& colorCurveLUT, OpacityCurv SharpeningParams::SharpeningParams() : enabled(false), contrast(20.0), + autoContrast(false), blurradius(0.2), gamma(1.0), radius(0.5), @@ -1107,6 +1108,7 @@ bool SharpeningParams::operator ==(const SharpeningParams& other) const && radius == other.radius && amount == other.amount && threshold == other.threshold + && autoContrast == other.autoContrast && edgesonly == other.edgesonly && edges_radius == other.edges_radius && edges_tolerance == other.edges_tolerance @@ -2791,6 +2793,7 @@ void ProcParams::setDefaults() pdsharpening = {}; pdsharpening.contrast = 10.0; + pdsharpening.autoContrast = true; prsharpening.method = "rld"; pdsharpening.gamma = 1.35; pdsharpening.deconvradius = 0.75; @@ -3308,6 +3311,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo // Post demosaic sharpening saveToKeyfile(!pedited || pedited->pdsharpening.enabled, "PostDemosaicSharpening", "Enabled", pdsharpening.enabled, keyFile); saveToKeyfile(!pedited || pedited->pdsharpening.contrast, "PostDemosaicSharpening", "Contrast", pdsharpening.contrast, keyFile); + saveToKeyfile(!pedited || pedited->pdsharpening.autoContrast, "PostDemosaicSharpening", "AutoContrast", pdsharpening.autoContrast, keyFile); saveToKeyfile(!pedited || pedited->pdsharpening.gamma, "PostDemosaicSharpening", "DeconvGamma", pdsharpening.gamma, keyFile); saveToKeyfile(!pedited || pedited->pdsharpening.deconvradius, "PostDemosaicSharpening", "DeconvRadius", pdsharpening.deconvradius, keyFile); saveToKeyfile(!pedited || pedited->pdsharpening.deconviter, "PostDemosaicSharpening", "DeconvIterations", pdsharpening.deconviter, keyFile); @@ -4395,6 +4399,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) if (keyFile.has_group("PostDemosaicSharpening")) { assignFromKeyfile(keyFile, "PostDemosaicSharpening", "Enabled", pedited, pdsharpening.enabled, pedited->pdsharpening.enabled); assignFromKeyfile(keyFile, "PostDemosaicSharpening", "Contrast", pedited, pdsharpening.contrast, pedited->pdsharpening.contrast); + assignFromKeyfile(keyFile, "PostDemosaicSharpening", "AutoContrast", pedited, pdsharpening.autoContrast, pedited->pdsharpening.autoContrast); assignFromKeyfile(keyFile, "PostDemosaicSharpening", "DeconvGamma", pedited, pdsharpening.gamma, pedited->pdsharpening.gamma); assignFromKeyfile(keyFile, "PostDemosaicSharpening", "DeconvRadius", pedited, pdsharpening.deconvradius, pedited->pdsharpening.deconvradius); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index f9255f815..83b6c3e44 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -493,6 +493,7 @@ struct ColorToningParams { struct SharpeningParams { bool enabled; double contrast; + bool autoContrast; double blurradius; double gamma; double radius; diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 25beb6208..d84c0436a 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -4953,7 +4953,7 @@ void RawImageSource::getRawValues(int x, int y, int rotate, int &R, int &G, int } } -void RawImageSource::captureSharpening(const procparams::SharpeningParams &sharpeningParams, bool showMask) { +void RawImageSource::captureSharpening(const procparams::SharpeningParams &sharpeningParams, bool showMask, double &conrastThreshold) { BENCHFUN const float xyz_rgb[3][3] = { // XYZ from RGB @@ -4962,7 +4962,7 @@ BENCHFUN { 0.019334, 0.119193, 0.950227 } }; - float contrast = sharpeningParams.contrast / 100.f; + float contrast = conrastThreshold / 100.f; if (showMask) { StopWatch Stop1("Show mask"); @@ -4975,8 +4975,8 @@ BENCHFUN Color::RGB2L(red[i], green[i], blue[i], L[i], xyz_rgb, W); } array2D& blend = red; // red will be overridden anyway => we can use its buffer to store the blend mask - buildBlendMask(L, blend, W, H, contrast, 1.f); - + buildBlendMask(L, blend, W, H, contrast, 1.f, sharpeningParams.autoContrast); + conrastThreshold = contrast * 100.f; #ifdef _OPENMP #pragma omp parallel for #endif @@ -5002,7 +5002,8 @@ BENCHFUN } // calculate contrast based blend factors to reduce sharpening in regions with low contrast JaggedArray blend(W, H); - buildBlendMask(L, blend, W, H, contrast, 1.f); + buildBlendMask(L, blend, W, H, contrast, 1.f, sharpeningParams.autoContrast); + conrastThreshold = contrast * 100.f; Stop1.stop(); array2D& tmp = L; // L is not used anymore now => we can use its buffer as the needed temporary buffer diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index a7aee0843..8cf6b08a9 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -305,7 +305,7 @@ protected: void hflip (Imagefloat* im); void vflip (Imagefloat* im); void getRawValues(int x, int y, int rotate, int &R, int &G, int &B) override; - void captureSharpening(const procparams::SharpeningParams &sharpeningParams, bool showMask) override; + void captureSharpening(const procparams::SharpeningParams &sharpeningParams, bool showMask, double &conrastThreshold) override; }; } diff --git a/rtengine/rtengine.h b/rtengine/rtengine.h index ca4cebe2e..86e9ade75 100644 --- a/rtengine/rtengine.h +++ b/rtengine/rtengine.h @@ -523,6 +523,7 @@ public: virtual void setFrameCountListener (FrameCountListener* l) = 0; virtual void setBayerAutoContrastListener (AutoContrastListener* l) = 0; virtual void setXtransAutoContrastListener (AutoContrastListener* l) = 0; + virtual void setpdSharpenAutoContrastListener (AutoContrastListener* l) = 0; virtual void setAutoBWListener (AutoBWListener* l) = 0; virtual void setAutoWBListener (AutoWBListener* l) = 0; virtual void setAutoColorTonListener (AutoColorTonListener* l) = 0; diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 24a3f3263..0524734e0 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -222,7 +222,7 @@ private: imgsrc->demosaic (params.raw, autoContrast, contrastThreshold); if (params.pdsharpening.enabled) { - imgsrc->captureSharpening(params.pdsharpening, false); + imgsrc->captureSharpening(params.pdsharpening, false, params.pdsharpening.contrast); } diff --git a/rtengine/stdimagesource.h b/rtengine/stdimagesource.h index 5acb8d113..175f664f8 100644 --- a/rtengine/stdimagesource.h +++ b/rtengine/stdimagesource.h @@ -102,7 +102,7 @@ public: void getRawValues(int x, int y, int rotate, int &R, int &G, int &B) override { R = G = B = 0;} void flushRGB () override; - void captureSharpening(const procparams::SharpeningParams &sharpeningParams, bool showMask) override {}; + void captureSharpening(const procparams::SharpeningParams &sharpeningParams, bool showMask, double &conrastThreshold) override {}; }; } #endif diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index da65cbf8e..4029d0b9b 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -167,6 +167,7 @@ void ParamsEdited::set(bool v) sharpening.deconvdamping = v; pdsharpening.enabled = v; pdsharpening.contrast = v; + pdsharpening.autoContrast = v; pdsharpening.gamma = v; pdsharpening.deconvamount = v; pdsharpening.deconvradius = v; @@ -751,6 +752,7 @@ void ParamsEdited::initFrom(const std::vector& sharpening.deconvdamping = sharpening.deconvdamping && p.sharpening.deconvdamping == other.sharpening.deconvdamping; pdsharpening.enabled = pdsharpening.enabled && p.pdsharpening.enabled == other.pdsharpening.enabled; pdsharpening.contrast = pdsharpening.contrast && p.pdsharpening.contrast == other.pdsharpening.contrast; + pdsharpening.autoContrast = pdsharpening.autoContrast && p.pdsharpening.autoContrast == other.pdsharpening.autoContrast; pdsharpening.gamma = pdsharpening.gamma && p.pdsharpening.gamma == other.pdsharpening.gamma; pdsharpening.deconvradius = pdsharpening.deconvradius && p.pdsharpening.deconvradius == other.pdsharpening.deconvradius; pdsharpening.deconviter = pdsharpening.deconviter && p.pdsharpening.deconviter == other.pdsharpening.deconviter; @@ -1727,6 +1729,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.pdsharpening.contrast = dontforceSet && options.baBehav[ADDSET_SHARP_CONTRAST] ? toEdit.pdsharpening.contrast + mods.pdsharpening.contrast : mods.pdsharpening.contrast; } + if (pdsharpening.autoContrast) { + toEdit.pdsharpening.autoContrast = mods.pdsharpening.autoContrast; + } + if (pdsharpening.deconvamount) { toEdit.pdsharpening.deconvamount = dontforceSet && options.baBehav[ADDSET_SHARP_AMOUNT] ? toEdit.pdsharpening.deconvamount + mods.pdsharpening.deconvamount : mods.pdsharpening.deconvamount; } @@ -3288,5 +3294,5 @@ bool FilmNegativeParamsEdited::isUnchanged() const bool SharpeningParamsEdited::isUnchanged() const { - return enabled && contrast && gamma && deconvradius && deconviter; + return enabled && contrast && autoContrast && gamma && deconvradius && deconviter; } \ No newline at end of file diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 5191bce56..6d229e689 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -179,6 +179,7 @@ struct SharpenMicroParamsEdited { struct SharpeningParamsEdited { bool enabled; bool contrast; + bool autoContrast; bool blurradius; bool gamma; bool radius; diff --git a/rtgui/pdsharpening.cc b/rtgui/pdsharpening.cc index 896d416b5..43b32ce7e 100644 --- a/rtgui/pdsharpening.cc +++ b/rtgui/pdsharpening.cc @@ -20,6 +20,7 @@ #include "eventmapper.h" #include "pdsharpening.h" #include "options.h" +#include "../rtengine/procparams.h" using namespace rtengine; using namespace rtengine::procparams; @@ -32,11 +33,15 @@ PdSharpening::PdSharpening () : FoldableToolPanel(this, "pdsharpening", M("TP_PD EvPdSharpenGamma = m->newEvent(DEMOSAIC, "HISTORY_MSG_PDSHARPEN_GAMMA"); EvPdShrDRadius = m->newEvent(DEMOSAIC, "HISTORY_MSG_PDSHARPEN_RADIUS"); EvPdShrDIterations = m->newEvent(DEMOSAIC, "HISTORY_MSG_PDSHARPEN_ITERATIONS"); + EvPdShrAutoContrast = m->newEvent(DEMOSAIC, "HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST"); Gtk::HBox* hb = Gtk::manage (new Gtk::HBox ()); hb->show (); contrast = Gtk::manage(new Adjuster (M("TP_SHARPENING_CONTRAST"), 0, 200, 1, 10)); contrast->setAdjusterListener (this); + contrast->addAutoButton(M("TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP")); + contrast->setAutoValue(true); + pack_start(*contrast); contrast->show(); @@ -77,7 +82,7 @@ PdSharpening::PdSharpening () : FoldableToolPanel(this, "pdsharpening", M("TP_PD PdSharpening::~PdSharpening () { - + idle_register.destroy(); delete rld; } @@ -89,6 +94,7 @@ void PdSharpening::read (const ProcParams* pp, const ParamsEdited* pedited) if (pedited) { contrast->setEditedState (pedited->pdsharpening.contrast ? Edited : UnEdited); + contrast->setAutoInconsistent (multiImage && !pedited->pdsharpening.autoContrast); gamma->setEditedState (pedited->pdsharpening.gamma ? Edited : UnEdited); dradius->setEditedState (pedited->pdsharpening.deconvradius ? Edited : UnEdited); diter->setEditedState (pedited->pdsharpening.deconviter ? Edited : UnEdited); @@ -99,9 +105,11 @@ void PdSharpening::read (const ProcParams* pp, const ParamsEdited* pedited) setEnabled(pp->pdsharpening.enabled); contrast->setValue (pp->pdsharpening.contrast); + contrast->setAutoValue (pp->pdsharpening.autoContrast); gamma->setValue (pp->pdsharpening.gamma); dradius->setValue (pp->pdsharpening.deconvradius); diter->setValue (pp->pdsharpening.deconviter); + lastAutoContrast = pp->pdsharpening.autoContrast; enableListener (); } @@ -110,6 +118,7 @@ void PdSharpening::write (ProcParams* pp, ParamsEdited* pedited) { pp->pdsharpening.contrast = contrast->getValue (); + pp->pdsharpening.autoContrast = contrast->getAutoValue(); pp->pdsharpening.enabled = getEnabled (); pp->pdsharpening.gamma = gamma->getValue (); pp->pdsharpening.deconvradius = dradius->getValue (); @@ -117,6 +126,7 @@ void PdSharpening::write (ProcParams* pp, ParamsEdited* pedited) if (pedited) { pedited->pdsharpening.contrast = contrast->getEditedState (); + pedited->pdsharpening.autoContrast = !contrast->getAutoInconsistent (); pedited->pdsharpening.gamma = gamma->getEditedState (); pedited->pdsharpening.deconvradius = dradius->getEditedState (); pedited->pdsharpening.deconviter = diter->getEditedState (); @@ -182,26 +192,6 @@ void PdSharpening::enabledChanged () } } -void PdSharpening::adjusterChanged(ThresholdAdjuster* a, double newBottom, double newTop) -{ -} - -void PdSharpening::adjusterChanged(ThresholdAdjuster* a, double newBottomLeft, double newTopLeft, double newBottomRight, double newTopRight) -{ -} - -void PdSharpening::adjusterChanged(ThresholdAdjuster* a, int newBottom, int newTop) -{ -} - -void PdSharpening::adjusterChanged(ThresholdAdjuster* a, int newBottomLeft, int newTopLeft, int newBottomRight, int newTopRight) -{ -} - -void PdSharpening::adjusterChanged2(ThresholdAdjuster* a, int newBottomL, int newTopL, int newBottomR, int newTopR) -{ -} - void PdSharpening::setBatchMode (bool batchMode) { @@ -232,3 +222,43 @@ void PdSharpening::trimValues (rtengine::procparams::ProcParams* pp) dradius->trimValue(pp->pdsharpening.deconvradius); diter->trimValue(pp->pdsharpening.deconviter); } + +void PdSharpening::autoContrastChanged (double autoContrast) +{ + idle_register.add( + [this, autoContrast]() -> bool + { + disableListener(); + contrast->setValue(autoContrast); + enableListener(); + return false; + } + ); +} + +void PdSharpening::adjusterAutoToggled(Adjuster* a, bool newval) +{ + if (multiImage) { + if (contrast->getAutoInconsistent()) { + contrast->setAutoInconsistent (false); + contrast->setAutoValue (false); + } else if (lastAutoContrast) { + contrast->setAutoInconsistent (true); + } + + lastAutoContrast = contrast->getAutoValue(); + } + + if (listener) { + + if (a == contrast) { + if (contrast->getAutoInconsistent()) { + listener->panelChanged (EvPdShrAutoContrast, M ("GENERAL_UNCHANGED")); + } else if (contrast->getAutoValue()) { + listener->panelChanged (EvPdShrAutoContrast, M ("GENERAL_ENABLED")); + } else { + listener->panelChanged (EvPdShrAutoContrast, M ("GENERAL_DISABLED")); + } + } + } +} diff --git a/rtgui/pdsharpening.h b/rtgui/pdsharpening.h index fe9359349..af09a9b6b 100644 --- a/rtgui/pdsharpening.h +++ b/rtgui/pdsharpening.h @@ -20,10 +20,9 @@ #include #include "adjuster.h" -#include "thresholdadjuster.h" #include "toolpanel.h" -class PdSharpening : public ToolParamBlock, public ThresholdAdjusterListener, public AdjusterListener, public FoldableToolPanel +class PdSharpening : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel, public rtengine::AutoContrastListener { protected: @@ -32,11 +31,14 @@ protected: Adjuster* dradius; Adjuster* diter; Gtk::VBox* rld; - + bool lastAutoContrast; rtengine::ProcEvent EvPdShrContrast; rtengine::ProcEvent EvPdShrDRadius; rtengine::ProcEvent EvPdSharpenGamma; rtengine::ProcEvent EvPdShrDIterations; + rtengine::ProcEvent EvPdShrAutoContrast; + IdleRegister idle_register; + public: PdSharpening (); @@ -47,14 +49,11 @@ public: void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; void setBatchMode (bool batchMode) override; + void adjusterAutoToggled (Adjuster* a, bool newval) override; void adjusterChanged (Adjuster* a, double newval) override; void enabledChanged () override; - void adjusterChanged(ThresholdAdjuster* a, double newBottom, double newTop) override; - void adjusterChanged(ThresholdAdjuster* a, double newBottomLeft, double newTopLeft, double newBottomRight, double newTopRight) override; - void adjusterChanged(ThresholdAdjuster* a, int newBottom, int newTop) override; - void adjusterChanged(ThresholdAdjuster* a, int newBottomLeft, int newTopLeft, int newBottomRight, int newTopRight) override; - void adjusterChanged2(ThresholdAdjuster* a, int newBottomL, int newTopL, int newBottomR, int newTopR) override; + void autoContrastChanged (double autoContrast) override; void setAdjusterBehavior (bool contrastadd, bool gammaadd, bool radiusadd, bool amountadd, bool dampingadd, bool iteradd, bool edgetoladd, bool haloctrladd); void trimValues (rtengine::procparams::ProcParams* pp) override; diff --git a/rtgui/toolpanelcoord.cc b/rtgui/toolpanelcoord.cc index 93f45aefe..f64205219 100644 --- a/rtgui/toolpanelcoord.cc +++ b/rtgui/toolpanelcoord.cc @@ -572,6 +572,7 @@ void ToolPanelCoordinator::initImage (rtengine::StagedImageProcessor* ipc_, bool ipc->setFlatFieldAutoClipListener (flatfield); ipc->setBayerAutoContrastListener (bayerprocess); ipc->setXtransAutoContrastListener (xtransprocess); + ipc->setpdSharpenAutoContrastListener (pdSharpening); ipc->setAutoWBListener (whitebalance); ipc->setAutoColorTonListener (colortoning); ipc->setAutoChromaListener (dirpyrdenoise); From ce3ca966f6c8a5e11cd7a4cbeecf40a505a46d22 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sun, 18 Aug 2019 11:16:53 +0200 Subject: [PATCH 05/50] Capture sharpening: some cleanups --- rtengine/rawimagesource.cc | 9 +- rtgui/batchtoolpanelcoord.cc | 1 + rtgui/pdsharpening.cc | 207 ++++++++++++++++------------------- rtgui/pdsharpening.h | 21 ++-- 4 files changed, 113 insertions(+), 125 deletions(-) diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index d84c0436a..ed0fac707 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -4992,13 +4992,14 @@ BENCHFUN array2D& Y = red; // red will be overridden anyway => we can use its buffer to store Y array2D& Cb = green; // green will be overridden anyway => we can use its buffer to store Cb array2D& Cr = blue; // blue will be overridden anyway => we can use its buffer to store Cr - const float gamma = sharpeningParams.gamma; StopWatch Stop1("rgb2Y"); +#ifdef _OPENMP #pragma omp parallel for +#endif for (int i = 0; i < H; ++i) { Color::RGB2L(red[i], green[i], blue[i], L[i], xyz_rgb, W); - Color::RGB2YCbCr(red[i], green[i], blue[i], Y[i], Cb[i], Cr[i], gamma, W); + Color::RGB2YCbCr(red[i], green[i], blue[i], Y[i], Cb[i], Cr[i], sharpeningParams.gamma, W); } // calculate contrast based blend factors to reduce sharpening in regions with low contrast JaggedArray blend(W, H); @@ -5011,9 +5012,11 @@ BENCHFUN ImProcFunctions ipf(&dummy); ipf.deconvsharpening(Y, tmp, blend, W, H, sharpeningParams, 1.0); StopWatch Stop2("Y2RGB"); +#ifdef _OPENMP #pragma omp parallel for +#endif for (int i = 0; i < H; ++i) { - Color::YCbCr2RGB(Y[i], Cb[i], Cr[i], red[i], green[i], blue[i], gamma, W); + Color::YCbCr2RGB(Y[i], Cb[i], Cr[i], red[i], green[i], blue[i], sharpeningParams.gamma, W); } Stop2.stop(); } diff --git a/rtgui/batchtoolpanelcoord.cc b/rtgui/batchtoolpanelcoord.cc index 1a0eaeb28..62867996e 100644 --- a/rtgui/batchtoolpanelcoord.cc +++ b/rtgui/batchtoolpanelcoord.cc @@ -152,6 +152,7 @@ void BatchToolPanelCoordinator::initSession () cacorrection->setAdjusterBehavior (false); sharpening->setAdjusterBehavior (false, false, false, false, false, false, false); prsharpening->setAdjusterBehavior (false, false, false, false, false, false, false); + pdSharpening->setAdjusterBehavior (false, false, false, false); sharpenEdge->setAdjusterBehavior (false, false); sharpenMicro->setAdjusterBehavior (false, false, false); epd->setAdjusterBehavior (false, false, false, false, false); diff --git a/rtgui/pdsharpening.cc b/rtgui/pdsharpening.cc index 43b32ce7e..1151684e7 100644 --- a/rtgui/pdsharpening.cc +++ b/rtgui/pdsharpening.cc @@ -1,7 +1,7 @@ /* * This file is part of RawTherapee. * - * Copyright (c) 2004-2010 Gabor Horvath + * Copyright (c) 2019 Ingo Weyrich (heckflosse67@gmx.de) * * RawTherapee is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -15,7 +15,8 @@ * * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . - */ +*/ + #include #include "eventmapper.h" #include "pdsharpening.h" @@ -25,7 +26,7 @@ using namespace rtengine; using namespace rtengine::procparams; -PdSharpening::PdSharpening () : FoldableToolPanel(this, "pdsharpening", M("TP_PDSHARPENING_LABEL"), false, true) +PdSharpening::PdSharpening() : FoldableToolPanel(this, "pdsharpening", M("TP_PDSHARPENING_LABEL"), false, true) { auto m = ProcEventMapper::getInstance(); @@ -35,177 +36,164 @@ PdSharpening::PdSharpening () : FoldableToolPanel(this, "pdsharpening", M("TP_PD EvPdShrDIterations = m->newEvent(DEMOSAIC, "HISTORY_MSG_PDSHARPEN_ITERATIONS"); EvPdShrAutoContrast = m->newEvent(DEMOSAIC, "HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST"); - Gtk::HBox* hb = Gtk::manage (new Gtk::HBox ()); - hb->show (); - contrast = Gtk::manage(new Adjuster (M("TP_SHARPENING_CONTRAST"), 0, 200, 1, 10)); - contrast->setAdjusterListener (this); + Gtk::HBox* hb = Gtk::manage(new Gtk::HBox()); + hb->show(); + contrast = Gtk::manage(new Adjuster(M("TP_SHARPENING_CONTRAST"), 0, 200, 1, 10)); + contrast->setAdjusterListener(this); contrast->addAutoButton(M("TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP")); contrast->setAutoValue(true); pack_start(*contrast); contrast->show(); - pack_start (*hb); + pack_start(*hb); - rld = new Gtk::VBox (); - gamma = Gtk::manage (new Adjuster (M("TP_SHARPENING_GAMMA"), 0.5, 3.0, 0.05, 1.35)); - dradius = Gtk::manage (new Adjuster (M("TP_SHARPENING_EDRADIUS"), 0.4, 2.5, 0.01, 0.75)); - diter = Gtk::manage (new Adjuster (M("TP_SHARPENING_RLD_ITERATIONS"), 5, 100, 1, 30)); - rld->pack_start (*gamma); - rld->pack_start (*dradius); - rld->pack_start (*diter); + Gtk::VBox* rld = Gtk::manage(new Gtk::VBox()); + gamma = Gtk::manage(new Adjuster(M("TP_SHARPENING_GAMMA"), 0.5, 3.0, 0.05, 1.35)); + dradius = Gtk::manage(new Adjuster(M("TP_SHARPENING_EDRADIUS"), 0.4, 2.5, 0.01, 0.75)); + diter = Gtk::manage(new Adjuster(M("TP_SHARPENING_RLD_ITERATIONS"), 5, 100, 1, 30)); + rld->pack_start(*gamma); + rld->pack_start(*dradius); + rld->pack_start(*diter); gamma->show(); - dradius->show (); - diter->show (); - rld->show (); + dradius->show(); + diter->show(); + rld->show(); pack_start(*rld); - dradius->setAdjusterListener (this); - gamma->setAdjusterListener (this); - diter->setAdjusterListener (this); + dradius->setAdjusterListener(this); + gamma->setAdjusterListener(this); + diter->setAdjusterListener(this); - if (contrast->delay < options.adjusterMaxDelay) { - contrast->delay = options.adjusterMaxDelay; - } - if (dradius->delay < options.adjusterMaxDelay) { - dradius->delay = options.adjusterMaxDelay; - } - if (gamma->delay < options.adjusterMaxDelay) { - gamma->delay = options.adjusterMaxDelay; - } - if (diter->delay < options.adjusterMaxDelay) { - diter->delay = options.adjusterMaxDelay; - } - - rld->reference(); + contrast->delay = std::max(contrast->delay, options.adjusterMaxDelay); + dradius->delay = std::max(dradius->delay, options.adjusterMaxDelay); + gamma->delay = std::max(gamma->delay, options.adjusterMaxDelay); + diter->delay = std::max(diter->delay, options.adjusterMaxDelay); } -PdSharpening::~PdSharpening () +PdSharpening::~PdSharpening() { idle_register.destroy(); - delete rld; } -void PdSharpening::read (const ProcParams* pp, const ParamsEdited* pedited) +void PdSharpening::read(const ProcParams* pp, const ParamsEdited* pedited) { - disableListener (); + disableListener(); if (pedited) { - contrast->setEditedState (pedited->pdsharpening.contrast ? Edited : UnEdited); - contrast->setAutoInconsistent (multiImage && !pedited->pdsharpening.autoContrast); - gamma->setEditedState (pedited->pdsharpening.gamma ? Edited : UnEdited); - dradius->setEditedState (pedited->pdsharpening.deconvradius ? Edited : UnEdited); - diter->setEditedState (pedited->pdsharpening.deconviter ? Edited : UnEdited); + contrast->setEditedState(pedited->pdsharpening.contrast ? Edited : UnEdited); + contrast->setAutoInconsistent(multiImage && !pedited->pdsharpening.autoContrast); + gamma->setEditedState(pedited->pdsharpening.gamma ? Edited : UnEdited); + dradius->setEditedState(pedited->pdsharpening.deconvradius ? Edited : UnEdited); + diter->setEditedState(pedited->pdsharpening.deconviter ? Edited : UnEdited); - set_inconsistent (multiImage && !pedited->pdsharpening.enabled); + set_inconsistent(multiImage && !pedited->pdsharpening.enabled); } setEnabled(pp->pdsharpening.enabled); - contrast->setValue (pp->pdsharpening.contrast); - contrast->setAutoValue (pp->pdsharpening.autoContrast); - gamma->setValue (pp->pdsharpening.gamma); - dradius->setValue (pp->pdsharpening.deconvradius); - diter->setValue (pp->pdsharpening.deconviter); + contrast->setValue(pp->pdsharpening.contrast); + contrast->setAutoValue(pp->pdsharpening.autoContrast); + gamma->setValue(pp->pdsharpening.gamma); + dradius->setValue(pp->pdsharpening.deconvradius); + diter->setValue(pp->pdsharpening.deconviter); lastAutoContrast = pp->pdsharpening.autoContrast; - enableListener (); + enableListener(); } -void PdSharpening::write (ProcParams* pp, ParamsEdited* pedited) +void PdSharpening::write(ProcParams* pp, ParamsEdited* pedited) { - pp->pdsharpening.contrast = contrast->getValue (); + pp->pdsharpening.contrast = contrast->getValue(); pp->pdsharpening.autoContrast = contrast->getAutoValue(); - pp->pdsharpening.enabled = getEnabled (); - pp->pdsharpening.gamma = gamma->getValue (); - pp->pdsharpening.deconvradius = dradius->getValue (); - pp->pdsharpening.deconviter = (int)diter->getValue (); + pp->pdsharpening.enabled = getEnabled(); + pp->pdsharpening.gamma = gamma->getValue(); + pp->pdsharpening.deconvradius = dradius->getValue(); + pp->pdsharpening.deconviter =(int)diter->getValue(); if (pedited) { - pedited->pdsharpening.contrast = contrast->getEditedState (); - pedited->pdsharpening.autoContrast = !contrast->getAutoInconsistent (); - pedited->pdsharpening.gamma = gamma->getEditedState (); - pedited->pdsharpening.deconvradius = dradius->getEditedState (); - pedited->pdsharpening.deconviter = diter->getEditedState (); - pedited->pdsharpening.enabled = !get_inconsistent(); + pedited->pdsharpening.contrast = contrast->getEditedState(); + pedited->pdsharpening.autoContrast = !contrast->getAutoInconsistent(); + pedited->pdsharpening.gamma = gamma->getEditedState(); + pedited->pdsharpening.deconvradius = dradius->getEditedState(); + pedited->pdsharpening.deconviter = diter->getEditedState(); + pedited->pdsharpening.enabled = !get_inconsistent(); } } -void PdSharpening::setDefaults (const ProcParams* defParams, const ParamsEdited* pedited) +void PdSharpening::setDefaults(const ProcParams* defParams, const ParamsEdited* pedited) { - contrast->setDefault (defParams->pdsharpening.contrast); - gamma->setDefault (defParams->pdsharpening.gamma); - dradius->setDefault (defParams->pdsharpening.deconvradius); - diter->setDefault (defParams->pdsharpening.deconviter); + contrast->setDefault(defParams->pdsharpening.contrast); + gamma->setDefault(defParams->pdsharpening.gamma); + dradius->setDefault(defParams->pdsharpening.deconvradius); + diter->setDefault(defParams->pdsharpening.deconviter); if (pedited) { - contrast->setDefaultEditedState (pedited->pdsharpening.contrast ? Edited : UnEdited); - gamma->setDefaultEditedState (pedited->pdsharpening.gamma ? Edited : UnEdited); - dradius->setDefaultEditedState (pedited->pdsharpening.deconvradius ? Edited : UnEdited); - diter->setDefaultEditedState (pedited->pdsharpening.deconviter ? Edited : UnEdited); + contrast->setDefaultEditedState(pedited->pdsharpening.contrast ? Edited : UnEdited); + gamma->setDefaultEditedState(pedited->pdsharpening.gamma ? Edited : UnEdited); + dradius->setDefaultEditedState(pedited->pdsharpening.deconvradius ? Edited : UnEdited); + diter->setDefaultEditedState(pedited->pdsharpening.deconviter ? Edited : UnEdited); } else { - contrast->setDefaultEditedState (Irrelevant); - gamma->setDefaultEditedState (Irrelevant); - dradius->setDefaultEditedState (Irrelevant); - diter->setDefaultEditedState (Irrelevant); + contrast->setDefaultEditedState(Irrelevant); + gamma->setDefaultEditedState(Irrelevant); + dradius->setDefaultEditedState(Irrelevant); + diter->setDefaultEditedState(Irrelevant); } } -void PdSharpening::adjusterChanged (Adjuster* a, double newval) +void PdSharpening::adjusterChanged(Adjuster* a, double newval) { - if (listener && (multiImage || getEnabled()) ) { + if (listener && (multiImage || getEnabled())) { Glib::ustring costr; if (a == gamma || a == dradius) { - costr = Glib::ustring::format (std::setw(3), std::fixed, std::setprecision(2), a->getValue()); + costr = Glib::ustring::format(std::setw(3), std::fixed, std::setprecision(2), a->getValue()); } else { - costr = Glib::ustring::format ((int)a->getValue()); + costr = Glib::ustring::format((int)a->getValue()); } if (a == contrast) { - listener->panelChanged (EvPdShrContrast, costr); + listener->panelChanged(EvPdShrContrast, costr); } else if (a == gamma) { - listener->panelChanged (EvPdSharpenGamma, costr); + listener->panelChanged(EvPdSharpenGamma, costr); } else if (a == dradius) { - listener->panelChanged (EvPdShrDRadius, costr); + listener->panelChanged(EvPdShrDRadius, costr); } else if (a == diter) { - listener->panelChanged (EvPdShrDIterations, costr); + listener->panelChanged(EvPdShrDIterations, costr); } } } -void PdSharpening::enabledChanged () +void PdSharpening::enabledChanged() { if (listener) { if (get_inconsistent()) { - listener->panelChanged (EvPdShrEnabled, M("GENERAL_UNCHANGED")); + listener->panelChanged(EvPdShrEnabled, M("GENERAL_UNCHANGED")); } else if (getEnabled()) { - listener->panelChanged (EvPdShrEnabled, M("GENERAL_ENABLED")); + listener->panelChanged(EvPdShrEnabled, M("GENERAL_ENABLED")); } else { - listener->panelChanged (EvPdShrEnabled, M("GENERAL_DISABLED")); + listener->panelChanged(EvPdShrEnabled, M("GENERAL_DISABLED")); } } } -void PdSharpening::setBatchMode (bool batchMode) +void PdSharpening::setBatchMode(bool batchMode) { - ToolPanel::setBatchMode (batchMode); + ToolPanel::setBatchMode(batchMode); -// pack_start (*rld); - - contrast->showEditedCB (); - gamma->showEditedCB (); - dradius->showEditedCB (); - diter->showEditedCB (); + contrast->showEditedCB(); + gamma->showEditedCB(); + dradius->showEditedCB(); + diter->showEditedCB(); } -void PdSharpening::setAdjusterBehavior (bool contrastadd, bool gammaadd, bool radiusadd, bool amountadd, bool dampingadd, bool iteradd, bool edgetoladd, bool haloctrladd) +void PdSharpening::setAdjusterBehavior(bool contrastadd, bool gammaadd, bool radiusadd, bool iteradd) { contrast->setAddMode(contrastadd); @@ -214,7 +202,7 @@ void PdSharpening::setAdjusterBehavior (bool contrastadd, bool gammaadd, bool ra diter->setAddMode(iteradd); } -void PdSharpening::trimValues (rtengine::procparams::ProcParams* pp) +void PdSharpening::trimValues(rtengine::procparams::ProcParams* pp) { contrast->trimValue(pp->pdsharpening.contrast); @@ -223,7 +211,7 @@ void PdSharpening::trimValues (rtengine::procparams::ProcParams* pp) diter->trimValue(pp->pdsharpening.deconviter); } -void PdSharpening::autoContrastChanged (double autoContrast) +void PdSharpening::autoContrastChanged(double autoContrast) { idle_register.add( [this, autoContrast]() -> bool @@ -240,25 +228,22 @@ void PdSharpening::adjusterAutoToggled(Adjuster* a, bool newval) { if (multiImage) { if (contrast->getAutoInconsistent()) { - contrast->setAutoInconsistent (false); - contrast->setAutoValue (false); + contrast->setAutoInconsistent(false); + contrast->setAutoValue(false); } else if (lastAutoContrast) { - contrast->setAutoInconsistent (true); + contrast->setAutoInconsistent(true); } lastAutoContrast = contrast->getAutoValue(); } if (listener) { - - if (a == contrast) { - if (contrast->getAutoInconsistent()) { - listener->panelChanged (EvPdShrAutoContrast, M ("GENERAL_UNCHANGED")); - } else if (contrast->getAutoValue()) { - listener->panelChanged (EvPdShrAutoContrast, M ("GENERAL_ENABLED")); - } else { - listener->panelChanged (EvPdShrAutoContrast, M ("GENERAL_DISABLED")); - } + if (contrast->getAutoInconsistent()) { + listener->panelChanged(EvPdShrAutoContrast, M("GENERAL_UNCHANGED")); + } else if (contrast->getAutoValue()) { + listener->panelChanged(EvPdShrAutoContrast, M("GENERAL_ENABLED")); + } else { + listener->panelChanged(EvPdShrAutoContrast, M("GENERAL_DISABLED")); } } } diff --git a/rtgui/pdsharpening.h b/rtgui/pdsharpening.h index af09a9b6b..b2f7b6e57 100644 --- a/rtgui/pdsharpening.h +++ b/rtgui/pdsharpening.h @@ -15,14 +15,13 @@ * * 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 PdSharpening : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel, public rtengine::AutoContrastListener +class PdSharpening final : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel, public rtengine::AutoContrastListener { protected: @@ -30,7 +29,7 @@ protected: Adjuster* gamma; Adjuster* dradius; Adjuster* diter; - Gtk::VBox* rld; + bool lastAutoContrast; rtengine::ProcEvent EvPdShrContrast; rtengine::ProcEvent EvPdShrDRadius; @@ -44,17 +43,17 @@ public: PdSharpening (); ~PdSharpening () override; - void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; - void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; - void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; - void setBatchMode (bool batchMode) override; + void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; + void setBatchMode (bool batchMode) override; void adjusterAutoToggled (Adjuster* a, bool newval) override; void adjusterChanged (Adjuster* a, double newval) override; - void enabledChanged () override; + void enabledChanged () override; void autoContrastChanged (double autoContrast) override; - void setAdjusterBehavior (bool contrastadd, bool gammaadd, bool radiusadd, bool amountadd, bool dampingadd, bool iteradd, bool edgetoladd, bool haloctrladd); - void trimValues (rtengine::procparams::ProcParams* pp) override; + void setAdjusterBehavior (bool contrastadd, bool gammaadd, bool radiusadd, bool iteradds); + void trimValues (rtengine::procparams::ProcParams* pp) override; }; From dab39dae76888c71b05e3cfdd382a71f8848f33a Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Mon, 19 Aug 2019 21:17:25 +0200 Subject: [PATCH 06/50] Capture Sharpening: avoid hue shift --- rtengine/color.cc | 16 ++++++++-------- rtengine/color.h | 36 ++++++++++++++++++++++++------------ rtengine/rawimagesource.cc | 25 ++++++++++++++++++------- rtengine/rt_algo.cc | 8 ++++---- rtengine/rt_algo.h | 2 +- rtgui/pdsharpening.cc | 2 +- 6 files changed, 56 insertions(+), 33 deletions(-) diff --git a/rtengine/color.cc b/rtengine/color.cc index 7c12c0ca5..26c2cf7c9 100644 --- a/rtengine/color.cc +++ b/rtengine/color.cc @@ -1835,21 +1835,21 @@ void Color::RGB2L(float *R, float *G, float *B, float *L, const float wp[3][3], { #ifdef __SSE2__ - vfloat minvalfv = F2V(0.f); - vfloat maxvalfv = F2V(MAXVALF); + const vfloat maxvalfv = F2V(MAXVALF); + const vfloat rmv = F2V(wp[1][0]); + const vfloat gmv = F2V(wp[1][1]); + const vfloat bmv = F2V(wp[1][2]); #endif int i = 0; #ifdef __SSE2__ - for(;i < width - 3; i+=4) { + for(; i < width - 3; i+=4) { const vfloat rv = LVFU(R[i]); const vfloat gv = LVFU(G[i]); const vfloat bv = LVFU(B[i]); - const vfloat yv = F2V(wp[1][0]) * rv + F2V(wp[1][1]) * gv + F2V(wp[1][2]) * bv; + const vfloat yv = rmv * rv + gmv * gv + bmv * bv; - vmask maxMask = vmaskf_gt(yv, maxvalfv); - vmask minMask = vmaskf_lt(yv, minvalfv); - if (_mm_movemask_ps((vfloat)vorm(maxMask, minMask))) { + if (_mm_movemask_ps((vfloat)vorm(vmaskf_gt(yv, maxvalfv), vmaskf_lt(yv, ZEROV)))) { // take slower code path for all 4 pixels if one of the values is > MAXVALF. Still faster than non SSE2 version for(int k = 0; k < 4; ++k) { float y = yv[k]; @@ -1860,7 +1860,7 @@ void Color::RGB2L(float *R, float *G, float *B, float *L, const float wp[3][3], } } #endif - for(;i < width; ++i) { + for(; i < width; ++i) { const float rv = R[i]; const float gv = G[i]; const float bv = B[i]; diff --git a/rtengine/color.h b/rtengine/color.h index 7b198f284..7cc7368b3 100644 --- a/rtengine/color.h +++ b/rtengine/color.h @@ -1804,12 +1804,6 @@ public: return (hr); } - static inline void RGB2YCbCr(float R, float G, float B, float &Y, float &Cb, float &Cr) { - Y = 0.2627f * R + 0.6780f * G + 0.0593f * B; - Cb = (1.f - 0.0593f) * B - (0.2627f * R + 0.6780f * G); - Cr = (1.f - 0.2627f) * R - (0.6780f * G + 0.0593f * B); - } - static inline void RGB2YCbCr(float* R, float* G, float* B, float* Y, float* Cb, float *Cr, float gamma, int W) { gamma = 1.f / gamma; int i = 0; @@ -1839,12 +1833,6 @@ public: } } - static inline void YCbCr2RGB(float Y, float Cb, float Cr, float &R, float &G, float &B) { - R = std::max(Y + Cr, 0.f); - G = std::max(Y - (0.0593f / 0.6780f) * Cb - (0.2627f / 0.6780f) * Cr, 0.f); - B = std::max(Y + Cb, 0.f); - } - static inline void YCbCr2RGB(float* Y, float* Cb, float* Cr, float* R, float* G, float* B, float gamma, int W) { int i = 0; #ifdef __SSE2__ @@ -1870,6 +1858,30 @@ public: B[i] = std::max(y + cb, 0.f); } } + + static inline void RGB2Y(float* R, float* G, float* B, float* Y, float gamma, int W) { + gamma = 1.f / gamma; + int i = 0; +#ifdef __SSE2__ + const vfloat gammav = F2V(gamma); + const vfloat c1v = F2V(0.2627f); + const vfloat c2v = F2V(0.6780f); + const vfloat c3v = F2V(0.0593f); + for (; i < W - 3; i += 4) { + const vfloat Rv = vmaxf(LVFU(R[i]), ZEROV); + const vfloat Gv = vmaxf(LVFU(G[i]), ZEROV); + const vfloat Bv = vmaxf(LVFU(B[i]), ZEROV); + STVFU(Y[i], pow_F(c1v * Rv + c2v * Gv + c3v * Bv, gammav)); + } +#endif + for (; i < W; ++i) { + const float r = std::max(R[i], 0.f); + const float g = std::max(G[i], 0.f); + const float b = std::max(B[i], 0.f); + Y[i] = pow_F(0.2627f * r + 0.6780f * g + 0.0593f * b, gamma); + } + } + }; } diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 050b62692..d947d4195 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -4987,17 +4987,22 @@ BENCHFUN } array2D L(W,H); - array2D& Y = red; // red will be overridden anyway => we can use its buffer to store Y - array2D& Cb = green; // green will be overridden anyway => we can use its buffer to store Cb - array2D& Cr = blue; // blue will be overridden anyway => we can use its buffer to store Cr + array2D YOld(W,H); + array2D YNew(W,H); +// array2D& Y = red; // red will be overridden anyway => we can use its buffer to store Y +// array2D& Cb = green; // green will be overridden anyway => we can use its buffer to store Cb +// array2D& Cr = blue; // blue will be overridden anyway => we can use its buffer to store Cr StopWatch Stop1("rgb2Y"); #ifdef _OPENMP - #pragma omp parallel for + #pragma omp parallel for schedule(dynamic, 16) #endif for (int i = 0; i < H; ++i) { Color::RGB2L(red[i], green[i], blue[i], L[i], xyz_rgb, W); - Color::RGB2YCbCr(red[i], green[i], blue[i], Y[i], Cb[i], Cr[i], sharpeningParams.gamma, W); + Color::RGB2Y(red[i], green[i], blue[i], YOld[i], sharpeningParams.gamma, W); + for (int j = 0; j < W; ++j) { + YNew[i][j] = YOld[i][j]; + } } // calculate contrast based blend factors to reduce sharpening in regions with low contrast JaggedArray blend(W, H); @@ -5008,13 +5013,19 @@ BENCHFUN array2D& tmp = L; // L is not used anymore now => we can use its buffer as the needed temporary buffer ProcParams dummy; ImProcFunctions ipf(&dummy); - ipf.deconvsharpening(Y, tmp, blend, W, H, sharpeningParams, 1.0); + ipf.deconvsharpening(YNew, tmp, blend, W, H, sharpeningParams, 1.0); StopWatch Stop2("Y2RGB"); + const float gamma = sharpeningParams.gamma; #ifdef _OPENMP #pragma omp parallel for #endif for (int i = 0; i < H; ++i) { - Color::YCbCr2RGB(Y[i], Cb[i], Cr[i], red[i], green[i], blue[i], sharpeningParams.gamma, W); + for (int j = 0; j < W; ++j) { + const float factor = pow_F(YNew[i][j] / (YOld[i][j] == 0.f ? 0.00001f : YOld[i][j]), gamma); + red[i][j] *= factor; + green[i][j] *= factor; + blue[i][j] *= factor; + } } Stop2.stop(); } diff --git a/rtengine/rt_algo.cc b/rtengine/rt_algo.cc index 1011ae7b7..97c44dfc1 100644 --- a/rtengine/rt_algo.cc +++ b/rtengine/rt_algo.cc @@ -52,7 +52,7 @@ vfloat calcBlendFactor(vfloat valv, vfloat thresholdv) { } #endif -float tileAverage(float **data, size_t tileY, size_t tileX, size_t tilesize) { +float tileAverage(const float * const *data, size_t tileY, size_t tileX, size_t tilesize) { float avg = 0.f; #ifdef __SSE2__ @@ -75,7 +75,7 @@ float tileAverage(float **data, size_t tileY, size_t tileX, size_t tilesize) { return avg / rtengine::SQR(tilesize); } -float tileVariance(float **data, size_t tileY, size_t tileX, size_t tilesize, float avg) { +float tileVariance(const float * const *data, size_t tileY, size_t tileX, size_t tilesize, float avg) { float var = 0.f; #ifdef __SSE2__ @@ -99,7 +99,7 @@ float tileVariance(float **data, size_t tileY, size_t tileX, size_t tilesize, fl return var / (rtengine::SQR(tilesize) * avg); } -float calcContrastThreshold(float** luminance, int tileY, int tileX, int tilesize) { +float calcContrastThreshold(const float* const * luminance, int tileY, int tileX, int tilesize) { constexpr float scale = 0.0625f / 327.68f; std::vector> blend(tilesize - 4, std::vector(tilesize - 4)); @@ -299,7 +299,7 @@ void findMinMaxPercentile(const float* data, size_t size, float minPrct, float& maxOut = rtengine::LIM(maxOut, minVal, maxVal); } -void buildBlendMask(float** luminance, float **blend, int W, int H, float &contrastThreshold, float amount, bool autoContrast) { +void buildBlendMask(const float* const * luminance, float **blend, int W, int H, float &contrastThreshold, float amount, bool autoContrast) { if (autoContrast) { constexpr float minLuminance = 2000.f; diff --git a/rtengine/rt_algo.h b/rtengine/rt_algo.h index a8e2e3e23..a13f3cb8e 100644 --- a/rtengine/rt_algo.h +++ b/rtengine/rt_algo.h @@ -24,5 +24,5 @@ namespace rtengine { void findMinMaxPercentile(const float* data, size_t size, float minPrct, float& minOut, float maxPrct, float& maxOut, bool multiThread = true); -void buildBlendMask(float** luminance, float **blend, int W, int H, float &contrastThreshold, float amount = 1.f, bool autoContrast = false); +void buildBlendMask(const float* const * luminance, float **blend, int W, int H, float &contrastThreshold, float amount = 1.f, bool autoContrast = false); } diff --git a/rtgui/pdsharpening.cc b/rtgui/pdsharpening.cc index 1151684e7..7a428806f 100644 --- a/rtgui/pdsharpening.cc +++ b/rtgui/pdsharpening.cc @@ -49,7 +49,7 @@ PdSharpening::PdSharpening() : FoldableToolPanel(this, "pdsharpening", M("TP_PDS pack_start(*hb); Gtk::VBox* rld = Gtk::manage(new Gtk::VBox()); - gamma = Gtk::manage(new Adjuster(M("TP_SHARPENING_GAMMA"), 0.5, 3.0, 0.05, 1.35)); + gamma = Gtk::manage(new Adjuster(M("TP_SHARPENING_GAMMA"), 0.5, 6.0, 0.05, 1.35)); dradius = Gtk::manage(new Adjuster(M("TP_SHARPENING_EDRADIUS"), 0.4, 2.5, 0.01, 0.75)); diter = Gtk::manage(new Adjuster(M("TP_SHARPENING_RLD_ITERATIONS"), 5, 100, 1, 30)); rld->pack_start(*gamma); From 0c1caf6c3658f8230eb16d0e1ba4ccac892463eb Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 20 Aug 2019 18:41:06 +0200 Subject: [PATCH 07/50] capture sharpening: further improvements and speedups --- rtengine/color.h | 25 ++++ rtengine/gauss.cc | 269 ++++++++++++++++++++++++++++++++++++- rtengine/improcfun.h | 2 +- rtengine/ipsharpen.cc | 2 +- rtengine/rawimagesource.cc | 27 ++-- 5 files changed, 307 insertions(+), 18 deletions(-) diff --git a/rtengine/color.h b/rtengine/color.h index 7cc7368b3..789bf27c6 100644 --- a/rtengine/color.h +++ b/rtengine/color.h @@ -1882,6 +1882,31 @@ public: } } + static inline void RGB2Y(const float* R, const float* G, const float* B, float* Y1, float * Y2, float gamma, int W) { + gamma = 1.f / gamma; + int i = 0; +#ifdef __SSE2__ + const vfloat gammav = F2V(gamma); + const vfloat c1v = F2V(0.2627f); + const vfloat c2v = F2V(0.6780f); + const vfloat c3v = F2V(0.0593f); + for (; i < W - 3; i += 4) { + const vfloat Rv = vmaxf(LVFU(R[i]), ZEROV); + const vfloat Gv = vmaxf(LVFU(G[i]), ZEROV); + const vfloat Bv = vmaxf(LVFU(B[i]), ZEROV); + vfloat yv = pow_F(c1v * Rv + c2v * Gv + c3v * Bv, gammav); + STVFU(Y1[i], yv); + STVFU(Y2[i], yv); + } +#endif + for (; i < W; ++i) { + const float r = std::max(R[i], 0.f); + const float g = std::max(G[i], 0.f); + const float b = std::max(B[i], 0.f); + Y1[i] = Y2[i] = pow_F(0.2627f * r + 0.6780f * g + 0.0593f * b, gamma); + } + } + }; } diff --git a/rtengine/gauss.cc b/rtengine/gauss.cc index b7de67851..171ed84e8 100644 --- a/rtengine/gauss.cc +++ b/rtengine/gauss.cc @@ -17,14 +17,48 @@ * along with RawTherapee. If not, see . */ #include "gauss.h" +#include "rt_math.h" #include #include #include "opthelper.h" #include "boxblur.h" - namespace { +void compute7x7kernel(float sigma, float kernel[7][7]) { + const double temp = -2.f * rtengine::SQR(sigma); + float sum = 0.f; + for (int i = -3; i <= 3; ++i) { + for (int j = -3; j <= 3; ++j) { + kernel[i + 3][j + 3] = std::exp((rtengine::SQR(i) + rtengine::SQR(j)) / temp); + sum += kernel[i + 3][j + 3]; + } + } + + for (int i = 0; i < 7; ++i) { + for (int j = 0; j < 7; ++j) { + kernel[i][j] /= sum; + } + } +} + +void compute5x5kernel(float sigma, float kernel[5][5]) { + const double temp = -2.f * rtengine::SQR(sigma); + float sum = 0.f; + for (int i = -2; i <= 2; ++i) { + for (int j = -2; j <= 2; ++j) { + kernel[i + 2][j + 2] = std::exp((rtengine::SQR(i) + rtengine::SQR(j)) / temp); + sum += kernel[i + 2][j + 2]; + } + } + + for (int i = 0; i < 5; ++i) { + for (int j = 0; j < 5; ++j) { + kernel[i][j] /= sum; + } + } +} + template void calculateYvVFactors( const T sigma, T &b1, T &b2, T &b3, T &B, T M[3][3]) { // coefficient calculation @@ -207,6 +241,219 @@ template void gauss3x3div (T** RESTRICT src, T** RESTRICT dst, T** REST } } +template void gauss7x7div (T** RESTRICT src, T** RESTRICT dst, T** RESTRICT divBuffer, const int W, const int H, float sigma) +{ + + float kernel[7][7]; + compute7x7kernel(sigma, kernel); + +#ifdef __SSE2__ + vfloat kernelv[7][7] ALIGNED16; + for (int i = 0; i < 7; ++i) { + for (int j = 0; j < 7; ++j) { + kernelv[i][j] = F2V(kernel[i][j]); + } + } + const vfloat onev = F2V(1.f); +#endif + +#ifdef _OPENMP + #pragma omp for schedule(dynamic, 16) nowait +#endif + + for (int i = 3; i < H - 3; ++i) { + dst[i][0] = dst[i][1] = dst[i][2] = 1.f; + int j = 3; +#ifdef __SSE2__ + for (; j < W - 6; j += 4) { + vfloat valv = ZEROV; + for (int k = -3; k <= 3; ++k) { + for (int l = -3; l <= 3; ++l) { + valv += LVFU(src[i + k][j + l]) * LVF(kernelv[k + 3][l + 3]); + } + } + STVFU(dst[i][j], vmaxf(LVFU(divBuffer[i][j]) / (vself(vmaskf_gt(valv, ZEROV), valv, onev)), ZEROV)); + } +#endif + for (; j < W - 3; ++j) { + float val = 0; + for (int k = -3; k <= 3; ++k) { + for (int l = -3; l <= 3; ++l) { + val += src[i + k][j + l] * kernel[k + 3][l + 3]; + } + } + dst[i][j] = rtengine::max(divBuffer[i][j] / (val > 0.f ? val : 1.f), 0.f); + } + dst[i][W - 3] = dst[i][W - 2] = dst[i][W - 1] = 1.f; + } + + // first and last rows +#ifdef _OPENMP + #pragma omp single +#endif + { + for (int i = 0; i < 3; ++i) { + for (int j = 0; j < W; ++j) { + dst[i][j] = 1.f; + } + } + for (int i = H - 3 ; i < H; ++i) { + for (int j = 0; j < W; ++j) { + dst[i][j] = 1.f; + } + } + } +} + +template void gauss5x5div (T** RESTRICT src, T** RESTRICT dst, T** RESTRICT divBuffer, const int W, const int H, float sigma) +{ + + float kernel[5][5]; + compute5x5kernel(sigma, kernel); + +#ifdef __SSE2__ + vfloat kernelv[5][5] ALIGNED16; + for (int i = 0; i < 5; ++i) { + for (int j = 0; j < 5; ++j) { + kernelv[i][j] = F2V(kernel[i][j]); + } + } + const vfloat onev = F2V(1.f); +#endif + +#ifdef _OPENMP + #pragma omp for schedule(dynamic, 16) nowait +#endif + + for (int i = 2; i < H - 2; ++i) { + dst[i][0] = dst[i][1] = 1.f; + int j = 2; +#ifdef __SSE2__ + for (; j < W - 5; j += 4) { + vfloat valv = ZEROV; + for (int k = -2; k <= 2; ++k) { + for (int l = -2; l <= 2; ++l) { + valv += LVFU(src[i + k][j + l]) * LVF(kernelv[k + 2][l + 2]); + } + } + STVFU(dst[i][j], vmaxf(LVFU(divBuffer[i][j]) / (vself(vmaskf_gt(valv, ZEROV), valv, onev)), ZEROV)); + } +#endif + for (; j < W - 2; ++j) { + float val = 0; + for (int k = -2; k <= 2; ++k) { + for (int l = -2; l <= 2; ++l) { + val += src[i + k][j + l] * kernel[k + 2][l + 2]; + } + } + dst[i][j] = rtengine::max(divBuffer[i][j] / (val > 0.f ? val : 1.f), 0.f); + } + dst[i][W - 2] = dst[i][W - 1] = 1.f; + } + + // first and last rows +#ifdef _OPENMP + #pragma omp single +#endif + { + for (int i = 0; i < 2; ++i) { + for (int j = 0; j < W; ++j) { + dst[i][j] = 1.f; + } + } + for (int i = H - 2 ; i < H; ++i) { + for (int j = 0; j < W; ++j) { + dst[i][j] = 1.f; + } + } + } +} + +template void gauss7x7mult (T** RESTRICT src, T** RESTRICT dst, const int W, const int H, float sigma) +{ + + float kernel[7][7]; + compute7x7kernel(sigma, kernel); +#ifdef __SSE2__ + vfloat kernelv[7][7] ALIGNED16; + for (int i = 0; i < 7; ++i) { + for (int j = 0; j < 7; ++j) { + kernelv[i][j] = F2V(kernel[i][j]); + } + } +#endif + +#ifdef _OPENMP + #pragma omp for schedule(dynamic, 16) +#endif + + for (int i = 3; i < H - 3; ++i) { + int j = 3; +#ifdef __SSE2__ + for (; j < W - 6; j += 4) { + vfloat valv = ZEROV; + for (int k = -3; k <= 3; ++k) { + for (int l = -3; l <= 3; ++l) { + valv += LVFU(src[i + k][j + l]) * LVF(kernelv[k + 3][l + 3]); + } + } + STVFU(dst[i][j], LVFU(dst[i][j]) * valv); + } +#endif + for (; j < W - 3; ++j) { + float val = 0; + for (int k = -3; k <= 3; ++k) { + for (int l = -3; l <= 3; ++l) { + val += src[i + k][j + l] * kernel[k + 3][l + 3]; + } + } + dst[i][j] *= val; + } + } +} + +template void gauss5x5mult (T** RESTRICT src, T** RESTRICT dst, const int W, const int H, float sigma) +{ + + float kernel[5][5]; + compute5x5kernel(sigma, kernel); +#ifdef __SSE2__ + vfloat kernelv[5][5] ALIGNED16; + for (int i = 0; i < 5; ++i) { + for (int j = 0; j < 5; ++j) { + kernelv[i][j] = F2V(kernel[i][j]); + } + } +#endif + +#ifdef _OPENMP + #pragma omp for schedule(dynamic, 16) +#endif + + for (int i = 2; i < H - 2; ++i) { + int j = 2; +#ifdef __SSE2__ + for (; j < W - 5; j += 4) { + vfloat valv = ZEROV; + for (int k = -2; k <= 2; ++k) { + for (int l = -2; l <= 2; ++l) { + valv += LVFU(src[i + k][j + l]) * LVF(kernelv[k + 2][l + 2]); + } + } + STVFU(dst[i][j], LVFU(dst[i][j]) * valv); + } +#endif + for (; j < W - 2; ++j) { + float val = 0; + for (int k = -2; k <= 2; ++k) { + for (int l = -2; l <= 2; ++l) { + val += src[i + k][j + l] * kernel[k + 2][l + 2]; + } + } + dst[i][j] *= val; + } + } +} // use separated filter if the support window is small and src == dst template void gaussHorizontal3 (T** src, T** dst, int W, int H, const float c0, const float c1) @@ -1241,14 +1488,26 @@ template void gaussianBlurImpl(T** src, T** dst, const int W, const int if (sigma < GAUSS_DOUBLE) { switch (gausstype) { case GAUSS_MULT : { - gaussHorizontalSse (src, src, W, H, sigma); - gaussVerticalSsemult (src, dst, W, H, sigma); + if (sigma < 0.84 && src != dst) { + gauss5x5mult(src, dst, W, H, sigma); + } else if (sigma < 1.15f && src != dst) { + gauss7x7mult(src, dst, W, H, sigma); + } else { + gaussHorizontalSse (src, src, W, H, sigma); + gaussVerticalSsemult (src, dst, W, H, sigma); + } break; } case GAUSS_DIV : { - gaussHorizontalSse (src, dst, W, H, sigma); - gaussVerticalSsediv (dst, dst, buffer2, W, H, sigma); + if (sigma < 0.84f && src != dst) { + gauss5x5div (src, dst, buffer2, W, H, sigma); + } else if (sigma < 1.15f && src != dst) { + gauss7x7div (src, dst, buffer2, W, H, sigma); + } else { + gaussHorizontalSse (src, dst, W, H, sigma); + gaussVerticalSsediv (dst, dst, buffer2, W, H, sigma); + } break; } diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 6fe8a785d..5cd65cad8 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -248,7 +248,7 @@ public: void Lanczos(const LabImage* src, LabImage* dst, float scale); void Lanczos(const Imagefloat* src, Imagefloat* dst, float scale); - void deconvsharpening(float** luminance, float** buffer, float** blend, int W, int H, const procparams::SharpeningParams &sharpenParam, double Scale); + void deconvsharpening(float** luminance, float** buffer, const float* const * blend, int W, int H, const procparams::SharpeningParams &sharpenParam, double Scale); void MLsharpen(LabImage* lab); // Manuel's clarity / sharpening void MLmicrocontrast(float** luminance, int W, int H); //Manuel's microcontrast void MLmicrocontrast(LabImage* lab); //Manuel's microcontrast diff --git a/rtengine/ipsharpen.cc b/rtengine/ipsharpen.cc index 897aaf7b5..1d3d6375e 100644 --- a/rtengine/ipsharpen.cc +++ b/rtengine/ipsharpen.cc @@ -158,7 +158,7 @@ namespace rtengine extern const Settings* settings; -void ImProcFunctions::deconvsharpening (float** luminance, float** tmp, float ** blend, int W, int H, const SharpeningParams &sharpenParam, double Scale) +void ImProcFunctions::deconvsharpening (float** luminance, float** tmp, const float * const * blend, int W, int H, const SharpeningParams &sharpenParam, double Scale) { if (sharpenParam.deconvamount == 0 && sharpenParam.blurradius < 0.25f) { return; diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index d947d4195..0602c770b 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -4989,20 +4989,14 @@ BENCHFUN array2D L(W,H); array2D YOld(W,H); array2D YNew(W,H); -// array2D& Y = red; // red will be overridden anyway => we can use its buffer to store Y -// array2D& Cb = green; // green will be overridden anyway => we can use its buffer to store Cb -// array2D& Cr = blue; // blue will be overridden anyway => we can use its buffer to store Cr - StopWatch Stop1("rgb2Y"); + StopWatch Stop1("rgb2YL"); #ifdef _OPENMP #pragma omp parallel for schedule(dynamic, 16) #endif for (int i = 0; i < H; ++i) { Color::RGB2L(red[i], green[i], blue[i], L[i], xyz_rgb, W); - Color::RGB2Y(red[i], green[i], blue[i], YOld[i], sharpeningParams.gamma, W); - for (int j = 0; j < W; ++j) { - YNew[i][j] = YOld[i][j]; - } + Color::RGB2Y(red[i], green[i], blue[i], YOld[i], YNew[i], sharpeningParams.gamma, W); } // calculate contrast based blend factors to reduce sharpening in regions with low contrast JaggedArray blend(W, H); @@ -5017,11 +5011,22 @@ BENCHFUN StopWatch Stop2("Y2RGB"); const float gamma = sharpeningParams.gamma; #ifdef _OPENMP - #pragma omp parallel for + #pragma omp parallel for schedule(dynamic, 16) #endif for (int i = 0; i < H; ++i) { - for (int j = 0; j < W; ++j) { - const float factor = pow_F(YNew[i][j] / (YOld[i][j] == 0.f ? 0.00001f : YOld[i][j]), gamma); + int j = 0; +#ifdef __SSE2__ + const vfloat gammav = F2V(gamma); + for (; j < W - 3; j += 4) { + const vfloat factor = pow_F(LVFU(YNew[i][j]) / vmaxf(LVFU(YOld[i][j]), F2V(0.00001f)), gammav); + STVFU(red[i][j], LVFU(red[i][j]) * factor); + STVFU(green[i][j], LVFU(green[i][j]) * factor); + STVFU(blue[i][j], LVFU(blue[i][j]) * factor); + } + +#endif + for (; j < W; ++j) { + const float factor = pow_F(YNew[i][j] / std::max(YOld[i][j], 0.00001f), gamma); red[i][j] *= factor; green[i][j] *= factor; blue[i][j] *= factor; From a0f95fe9e6f53ce9f9e653b6283b291518f560ae Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Wed, 21 Aug 2019 17:29:59 +0200 Subject: [PATCH 08/50] Speedup for gauss5x5 and gauss7x7 --- rtengine/gauss.cc | 337 +++++++++++++++++++++++++++++----------------- 1 file changed, 213 insertions(+), 124 deletions(-) diff --git a/rtengine/gauss.cc b/rtengine/gauss.cc index 171ed84e8..5665394cc 100644 --- a/rtengine/gauss.cc +++ b/rtengine/gauss.cc @@ -30,8 +30,12 @@ void compute7x7kernel(float sigma, float kernel[7][7]) { float sum = 0.f; for (int i = -3; i <= 3; ++i) { for (int j = -3; j <= 3; ++j) { - kernel[i + 3][j + 3] = std::exp((rtengine::SQR(i) + rtengine::SQR(j)) / temp); - sum += kernel[i + 3][j + 3]; + if((rtengine::SQR(i) + rtengine::SQR(j)) <= rtengine::SQR(3.0 * 1.15)) { + kernel[i + 3][j + 3] = std::exp((rtengine::SQR(i) + rtengine::SQR(j)) / temp); + sum += kernel[i + 3][j + 3]; + } else { + kernel[i + 3][j + 3] = 0.f; + } } } @@ -47,8 +51,12 @@ void compute5x5kernel(float sigma, float kernel[5][5]) { float sum = 0.f; for (int i = -2; i <= 2; ++i) { for (int j = -2; j <= 2; ++j) { - kernel[i + 2][j + 2] = std::exp((rtengine::SQR(i) + rtengine::SQR(j)) / temp); - sum += kernel[i + 2][j + 2]; + if((rtengine::SQR(i) + rtengine::SQR(j)) <= rtengine::SQR(3.0 * 0.84)) { + kernel[i + 2][j + 2] = std::exp((rtengine::SQR(i) + rtengine::SQR(j)) / temp); + sum += kernel[i + 2][j + 2]; + } else { + kernel[i + 2][j + 2] = 0.f; + } } } @@ -247,15 +255,14 @@ template void gauss7x7div (T** RESTRICT src, T** RESTRICT dst, T** REST float kernel[7][7]; compute7x7kernel(sigma, kernel); -#ifdef __SSE2__ - vfloat kernelv[7][7] ALIGNED16; - for (int i = 0; i < 7; ++i) { - for (int j = 0; j < 7; ++j) { - kernelv[i][j] = F2V(kernel[i][j]); - } - } - const vfloat onev = F2V(1.f); -#endif + const float c31 = kernel[0][2]; + const float c30 = kernel[0][3]; + const float c22 = kernel[1][1]; + const float c21 = kernel[1][2]; + const float c20 = kernel[1][3]; + const float c11 = kernel[2][2]; + const float c10 = kernel[2][3]; + const float c00 = kernel[3][3]; #ifdef _OPENMP #pragma omp for schedule(dynamic, 16) nowait @@ -263,26 +270,54 @@ template void gauss7x7div (T** RESTRICT src, T** RESTRICT dst, T** REST for (int i = 3; i < H - 3; ++i) { dst[i][0] = dst[i][1] = dst[i][2] = 1.f; - int j = 3; -#ifdef __SSE2__ - for (; j < W - 6; j += 4) { - vfloat valv = ZEROV; - for (int k = -3; k <= 3; ++k) { - for (int l = -3; l <= 3; ++l) { - valv += LVFU(src[i + k][j + l]) * LVF(kernelv[k + 3][l + 3]); - } - } - STVFU(dst[i][j], vmaxf(LVFU(divBuffer[i][j]) / (vself(vmaskf_gt(valv, ZEROV), valv, onev)), ZEROV)); - } -#endif - for (; j < W - 3; ++j) { - float val = 0; - for (int k = -3; k <= 3; ++k) { - for (int l = -3; l <= 3; ++l) { - val += src[i + k][j + l] * kernel[k + 3][l + 3]; - } - } - dst[i][j] = rtengine::max(divBuffer[i][j] / (val > 0.f ? val : 1.f), 0.f); + // I tried hand written SSE code but gcc vectorizes better + for (int j = 3; j < W - 3; ++j) { + float val = src[i - 3][j - 1] * c31; + val += src[i - 3][j - 0] * c30; + val += src[i - 3][j + 1] * c31; + + val += src[i - 2][j - 2] * c22; + val += src[i - 2][j - 1] * c21; + val += src[i - 2][j - 0] * c20; + val += src[i - 2][j + 1] * c21; + val += src[i - 2][j + 2] * c22; + + val += src[i - 1][j - 3] * c31; + val += src[i - 1][j - 2] * c21; + val += src[i - 1][j - 1] * c11; + val += src[i - 1][j - 0] * c10; + val += src[i - 1][j + 1] * c11; + val += src[i - 1][j + 2] * c21; + val += src[i - 1][j + 3] * c31; + + val += src[i][j - 3] * c30; + val += src[i][j - 2] * c20; + val += src[i][j - 1] * c10; + val += src[i][j - 0] * c00; + val += src[i][j + 1] * c10; + val += src[i][j + 2] * c20; + val += src[i][j + 3] * c30; + + val += src[i + 1][j - 3] * c31; + val += src[i + 1][j - 2] * c21; + val += src[i + 1][j - 1] * c11; + val += src[i + 1][j - 0] * c10; + val += src[i + 1][j + 1] * c11; + val += src[i + 1][j + 2] * c21; + val += src[i + 1][j + 3] * c31; + + val += src[i + 2][j - 2] * c22; + val += src[i + 2][j - 1] * c21; + val += src[i + 2][j - 0] * c20; + val += src[i + 2][j + 1] * c21; + val += src[i + 2][j + 2] * c22; + + val += src[i + 3][j - 1] * c31; + val += src[i + 3][j - 0] * c30; + val += src[i + 3][j + 1] * c31; + + val = val > 0.f ? val : 1.f; + dst[i][j] = std::max(divBuffer[i][j] / val, 0.f); } dst[i][W - 3] = dst[i][W - 2] = dst[i][W - 1] = 1.f; } @@ -311,15 +346,11 @@ template void gauss5x5div (T** RESTRICT src, T** RESTRICT dst, T** REST float kernel[5][5]; compute5x5kernel(sigma, kernel); -#ifdef __SSE2__ - vfloat kernelv[5][5] ALIGNED16; - for (int i = 0; i < 5; ++i) { - for (int j = 0; j < 5; ++j) { - kernelv[i][j] = F2V(kernel[i][j]); - } - } - const vfloat onev = F2V(1.f); -#endif + const float c21 = kernel[0][1]; + const float c20 = kernel[0][2]; + const float c11 = kernel[1][1]; + const float c10 = kernel[1][2]; + const float c00 = kernel[2][2]; #ifdef _OPENMP #pragma omp for schedule(dynamic, 16) nowait @@ -327,26 +358,36 @@ template void gauss5x5div (T** RESTRICT src, T** RESTRICT dst, T** REST for (int i = 2; i < H - 2; ++i) { dst[i][0] = dst[i][1] = 1.f; - int j = 2; -#ifdef __SSE2__ - for (; j < W - 5; j += 4) { - vfloat valv = ZEROV; - for (int k = -2; k <= 2; ++k) { - for (int l = -2; l <= 2; ++l) { - valv += LVFU(src[i + k][j + l]) * LVF(kernelv[k + 2][l + 2]); - } - } - STVFU(dst[i][j], vmaxf(LVFU(divBuffer[i][j]) / (vself(vmaskf_gt(valv, ZEROV), valv, onev)), ZEROV)); - } -#endif - for (; j < W - 2; ++j) { - float val = 0; - for (int k = -2; k <= 2; ++k) { - for (int l = -2; l <= 2; ++l) { - val += src[i + k][j + l] * kernel[k + 2][l + 2]; - } - } - dst[i][j] = rtengine::max(divBuffer[i][j] / (val > 0.f ? val : 1.f), 0.f); + // I tried hand written SSE code but gcc vectorizes better + for (int j = 2; j < W - 2; ++j) { + float val = src[i - 2][j - 1] * c21; + val += src[i - 2][j - 0] * c20; + val += src[i - 2][j + 1] * c21; + + val += src[i - 1][j - 2] * c21; + val += src[i - 1][j - 1] * c11; + val += src[i - 1][j - 0] * c10; + val += src[i - 1][j + 1] * c11; + val += src[i - 1][j + 2] * c21; + + val += src[i - 0][j - 2] * c20; + val += src[i - 0][j - 1] * c10; + val += src[i - 0][j - 0] * c00; + val += src[i - 0][j + 1] * c10; + val += src[i - 0][j + 2] * c20; + + val += src[i + 1][j - 2] * c21; + val += src[i + 1][j - 1] * c11; + val += src[i + 1][j - 0] * c10; + val += src[i + 1][j + 1] * c11; + val += src[i + 1][j + 2] * c21; + + val += src[i + 2][j - 1] * c21; + val += src[i + 2][j - 0] * c20; + val += src[i + 2][j + 1] * c21; + + val = val > 0.f ? val : 1.f; + dst[i][j] = std::max(divBuffer[i][j] / val, 0.f); } dst[i][W - 2] = dst[i][W - 1] = 1.f; } @@ -374,39 +415,66 @@ template void gauss7x7mult (T** RESTRICT src, T** RESTRICT dst, const i float kernel[7][7]; compute7x7kernel(sigma, kernel); -#ifdef __SSE2__ - vfloat kernelv[7][7] ALIGNED16; - for (int i = 0; i < 7; ++i) { - for (int j = 0; j < 7; ++j) { - kernelv[i][j] = F2V(kernel[i][j]); - } - } -#endif + const float c31 = kernel[0][2]; + const float c30 = kernel[0][3]; + const float c22 = kernel[1][1]; + const float c21 = kernel[1][2]; + const float c20 = kernel[1][3]; + const float c11 = kernel[2][2]; + const float c10 = kernel[2][3]; + const float c00 = kernel[3][3]; #ifdef _OPENMP #pragma omp for schedule(dynamic, 16) #endif for (int i = 3; i < H - 3; ++i) { - int j = 3; -#ifdef __SSE2__ - for (; j < W - 6; j += 4) { - vfloat valv = ZEROV; - for (int k = -3; k <= 3; ++k) { - for (int l = -3; l <= 3; ++l) { - valv += LVFU(src[i + k][j + l]) * LVF(kernelv[k + 3][l + 3]); - } - } - STVFU(dst[i][j], LVFU(dst[i][j]) * valv); - } -#endif - for (; j < W - 3; ++j) { - float val = 0; - for (int k = -3; k <= 3; ++k) { - for (int l = -3; l <= 3; ++l) { - val += src[i + k][j + l] * kernel[k + 3][l + 3]; - } - } + // I tried hand written SSE code but gcc vectorizes better + for (int j = 3; j < W - 3; ++j) { + float val = src[i - 3][j - 1] * c31; + val += src[i - 3][j - 0] * c30; + val += src[i - 3][j + 1] * c31; + + val += src[i - 2][j - 2] * c22; + val += src[i - 2][j - 1] * c21; + val += src[i - 2][j - 0] * c20; + val += src[i - 2][j + 1] * c21; + val += src[i - 2][j + 2] * c22; + + val += src[i - 1][j - 3] * c31; + val += src[i - 1][j - 2] * c21; + val += src[i - 1][j - 1] * c11; + val += src[i - 1][j - 0] * c10; + val += src[i - 1][j + 1] * c11; + val += src[i - 1][j + 2] * c21; + val += src[i - 1][j + 3] * c31; + + val += src[i][j - 3] * c30; + val += src[i][j - 2] * c20; + val += src[i][j - 1] * c10; + val += src[i][j - 0] * c00; + val += src[i][j + 1] * c10; + val += src[i][j + 2] * c20; + val += src[i][j + 3] * c30; + + val += src[i + 1][j - 3] * c31; + val += src[i + 1][j - 2] * c21; + val += src[i + 1][j - 1] * c11; + val += src[i + 1][j - 0] * c10; + val += src[i + 1][j + 1] * c11; + val += src[i + 1][j + 2] * c21; + val += src[i + 1][j + 3] * c31; + + val += src[i + 2][j - 2] * c22; + val += src[i + 2][j - 1] * c21; + val += src[i + 2][j - 0] * c20; + val += src[i + 2][j + 1] * c21; + val += src[i + 2][j + 2] * c22; + + val += src[i + 3][j - 1] * c31; + val += src[i + 3][j - 0] * c30; + val += src[i + 3][j + 1] * c31; + dst[i][j] *= val; } } @@ -417,39 +485,46 @@ template void gauss5x5mult (T** RESTRICT src, T** RESTRICT dst, const i float kernel[5][5]; compute5x5kernel(sigma, kernel); -#ifdef __SSE2__ - vfloat kernelv[5][5] ALIGNED16; - for (int i = 0; i < 5; ++i) { - for (int j = 0; j < 5; ++j) { - kernelv[i][j] = F2V(kernel[i][j]); - } - } -#endif + + const float c21 = kernel[0][1]; + const float c20 = kernel[0][2]; + const float c11 = kernel[1][1]; + const float c10 = kernel[1][2]; + const float c00 = kernel[2][2]; #ifdef _OPENMP #pragma omp for schedule(dynamic, 16) #endif for (int i = 2; i < H - 2; ++i) { - int j = 2; -#ifdef __SSE2__ - for (; j < W - 5; j += 4) { - vfloat valv = ZEROV; - for (int k = -2; k <= 2; ++k) { - for (int l = -2; l <= 2; ++l) { - valv += LVFU(src[i + k][j + l]) * LVF(kernelv[k + 2][l + 2]); - } - } - STVFU(dst[i][j], LVFU(dst[i][j]) * valv); - } -#endif - for (; j < W - 2; ++j) { - float val = 0; - for (int k = -2; k <= 2; ++k) { - for (int l = -2; l <= 2; ++l) { - val += src[i + k][j + l] * kernel[k + 2][l + 2]; - } - } + // I tried hand written SSE code but gcc vectorizes better + for (int j = 2; j < W - 2; ++j) { + float val = src[i - 2][j - 1] * c21; + val += src[i - 2][j - 0] * c20; + val += src[i - 2][j + 1] * c21; + + val += src[i - 1][j - 2] * c21; + val += src[i - 1][j - 1] * c11; + val += src[i - 1][j - 0] * c10; + val += src[i - 1][j + 1] * c11; + val += src[i - 1][j + 2] * c21; + + val += src[i - 0][j - 2] * c20; + val += src[i - 0][j - 1] * c10; + val += src[i - 0][j - 0] * c00; + val += src[i - 0][j + 1] * c10; + val += src[i - 0][j + 2] * c20; + + val += src[i + 1][j - 2] * c21; + val += src[i + 1][j - 1] * c11; + val += src[i + 1][j - 0] * c10; + val += src[i + 1][j + 1] * c11; + val += src[i + 1][j + 2] * c21; + + val += src[i + 2][j - 1] * c21; + val += src[i + 2][j - 0] * c20; + val += src[i + 2][j + 1] * c21; + dst[i][j] *= val; } } @@ -1390,6 +1465,8 @@ 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_5X5_LIMIT = 0.84; + static constexpr auto GAUSS_7X7_LIMIT = 1.15; static constexpr auto GAUSS_DOUBLE = 25.0; if(buffer) { @@ -1488,9 +1565,9 @@ template void gaussianBlurImpl(T** src, T** dst, const int W, const int if (sigma < GAUSS_DOUBLE) { switch (gausstype) { case GAUSS_MULT : { - if (sigma < 0.84 && src != dst) { + if (sigma <= GAUSS_5X5_LIMIT && src != dst) { gauss5x5mult(src, dst, W, H, sigma); - } else if (sigma < 1.15f && src != dst) { + } else if (sigma <= GAUSS_7X7_LIMIT && src != dst) { gauss7x7mult(src, dst, W, H, sigma); } else { gaussHorizontalSse (src, src, W, H, sigma); @@ -1500,9 +1577,9 @@ template void gaussianBlurImpl(T** src, T** dst, const int W, const int } case GAUSS_DIV : { - if (sigma < 0.84f && src != dst) { + if (sigma <= GAUSS_5X5_LIMIT && src != dst) { gauss5x5div (src, dst, buffer2, W, H, sigma); - } else if (sigma < 1.15f && src != dst) { + } else if (sigma <= GAUSS_7X7_LIMIT && src != dst) { gauss7x7div (src, dst, buffer2, W, H, sigma); } else { gaussHorizontalSse (src, dst, W, H, sigma); @@ -1527,14 +1604,26 @@ template void gaussianBlurImpl(T** src, T** dst, const int W, const int if (sigma < GAUSS_DOUBLE) { switch (gausstype) { case GAUSS_MULT : { - gaussHorizontal (src, src, W, H, sigma); - gaussVerticalmult (src, dst, W, H, sigma); + if (sigma <= GAUSS_5X5_LIMIT && src != dst) { + gauss5x5mult(src, dst, W, H, sigma); + } else if (sigma <= GAUSS_7X7_LIMIT && src != dst) { + gauss7x7mult(src, dst, W, H, sigma); + } else { + gaussHorizontal (src, src, W, H, sigma); + gaussVerticalmult (src, dst, W, H, sigma); + } break; } case GAUSS_DIV : { - gaussHorizontal (src, dst, W, H, sigma); - gaussVerticaldiv (dst, dst, buffer2, W, H, sigma); + if (sigma <= GAUSS_5X5_LIMIT && src != dst) { + gauss5x5div (src, dst, buffer2, W, H, sigma); + } else if (sigma <= GAUSS_7X7_LIMIT && src != dst) { + gauss7x7div (src, dst, buffer2, W, H, sigma); + } else { + gaussHorizontal (src, dst, W, H, sigma); + gaussVerticaldiv (dst, dst, buffer2, W, H, sigma); + } break; } From d4ffcde1a3416ff96a6ac845577d77001e7b4b81 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Wed, 21 Aug 2019 21:22:22 +0200 Subject: [PATCH 09/50] Capture sharpening: reduce upper limit of radius adjuster to 1.0 --- rtgui/pdsharpening.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtgui/pdsharpening.cc b/rtgui/pdsharpening.cc index 7a428806f..5c14c052f 100644 --- a/rtgui/pdsharpening.cc +++ b/rtgui/pdsharpening.cc @@ -50,7 +50,7 @@ PdSharpening::PdSharpening() : FoldableToolPanel(this, "pdsharpening", M("TP_PDS Gtk::VBox* rld = Gtk::manage(new Gtk::VBox()); gamma = Gtk::manage(new Adjuster(M("TP_SHARPENING_GAMMA"), 0.5, 6.0, 0.05, 1.35)); - dradius = Gtk::manage(new Adjuster(M("TP_SHARPENING_EDRADIUS"), 0.4, 2.5, 0.01, 0.75)); + dradius = Gtk::manage(new Adjuster(M("TP_SHARPENING_EDRADIUS"), 0.4, 1.0, 0.01, 0.75)); diter = Gtk::manage(new Adjuster(M("TP_SHARPENING_RLD_ITERATIONS"), 5, 100, 1, 30)); rld->pack_start(*gamma); rld->pack_start(*dradius); From cb7b31f3a4c760e305174d7b7ad5d9e609a41878 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sat, 24 Aug 2019 12:14:54 +0200 Subject: [PATCH 10/50] Allow Capture Sharpening for monochrome raw files --- rtgui/toolpanelcoord.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtgui/toolpanelcoord.cc b/rtgui/toolpanelcoord.cc index f64205219..0bf976c2b 100644 --- a/rtgui/toolpanelcoord.cc +++ b/rtgui/toolpanelcoord.cc @@ -344,7 +344,7 @@ void ToolPanelCoordinator::imageTypeChanged (bool isRaw, bool isBayer, bool isXt preprocess->FoldableToolPanel::hide(); flatfield->FoldableToolPanel::show(); filmNegative->FoldableToolPanel::hide(); - pdSharpening->FoldableToolPanel::hide(); + pdSharpening->FoldableToolPanel::show(); retinex->FoldableToolPanel::setGrayedOut(false); return false; From bca760c8baa7ca9298f85f4ddc8980c3aa8ee1c7 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sat, 24 Aug 2019 20:52:36 +0200 Subject: [PATCH 11/50] Capture sharpening: removed unused code, also small speedup for 5x5 and 7x7 gauss --- rtengine/color.h | 78 --------------------- rtengine/gauss.cc | 168 ++++++++-------------------------------------- 2 files changed, 28 insertions(+), 218 deletions(-) diff --git a/rtengine/color.h b/rtengine/color.h index 789bf27c6..d36a7db8e 100644 --- a/rtengine/color.h +++ b/rtengine/color.h @@ -1804,84 +1804,6 @@ public: return (hr); } - static inline void RGB2YCbCr(float* R, float* G, float* B, float* Y, float* Cb, float *Cr, float gamma, int W) { - gamma = 1.f / gamma; - int i = 0; -#ifdef __SSE2__ - const vfloat gammav = F2V(gamma); - const vfloat c1v = F2V(0.2627f); - const vfloat c2v = F2V(0.6780f); - const vfloat c3v = F2V(0.0593f); - const vfloat c4v = F2V(1.f - 0.0593f); - const vfloat c5v = F2V(1.f - 0.2627f); - for (; i < W - 3; i += 4) { - const vfloat Rv = vmaxf(LVFU(R[i]), ZEROV); - const vfloat Gv = vmaxf(LVFU(G[i]), ZEROV); - const vfloat Bv = vmaxf(LVFU(B[i]), ZEROV); - STVFU(Y[i], pow_F(c1v * Rv + c2v * Gv + c3v * Bv, gammav)); - STVFU(Cb[i], c4v * Bv - (c1v * Rv + c2v * Gv)); - STVFU(Cr[i], c5v * Rv - (c2v * Gv + c3v * Bv)); - } -#endif - for (; i < W; ++i) { - const float r = std::max(R[i], 0.f); - const float g = std::max(G[i], 0.f); - const float b = std::max(B[i], 0.f); - Y[i] = pow_F(0.2627f * r + 0.6780f * g + 0.0593f * b, gamma); - Cb[i] = (1.f - 0.0593f) * b - (0.2627f * r + 0.6780f * g); - Cr[i] = (1.f - 0.2627f) * r - (0.6780f * g + 0.0593f * b); - } - } - - static inline void YCbCr2RGB(float* Y, float* Cb, float* Cr, float* R, float* G, float* B, float gamma, int W) { - int i = 0; -#ifdef __SSE2__ - const vfloat gammav = F2V(gamma); - const vfloat c1v = F2V(0.0593f / 0.6780f); - const vfloat c2v = F2V(0.2627f / 0.6780f); - - for (; i < W - 3; i += 4) { - const vfloat Yv = pow_F(LVFU(Y[i]), gammav); - const vfloat Crv = LVFU(Cr[i]); - const vfloat Cbv = LVFU(Cb[i]); - STVFU(R[i], vmaxf(Yv + Crv, ZEROV)); - STVFU(G[i], vmaxf(Yv - c1v * Cbv - c2v * Crv, ZEROV)); - STVFU(B[i], vmaxf(Yv + Cbv, ZEROV)); - } -#endif - for (; i < W; ++i) { - const float y = pow_F(Y[i], gamma); - const float cr = Cr[i]; - const float cb = Cb[i]; - R[i] = std::max(y + cr, 0.f); - G[i] = std::max(y - (0.0593f / 0.6780f) * cb - (0.2627f / 0.6780f) * cr, 0.f); - B[i] = std::max(y + cb, 0.f); - } - } - - static inline void RGB2Y(float* R, float* G, float* B, float* Y, float gamma, int W) { - gamma = 1.f / gamma; - int i = 0; -#ifdef __SSE2__ - const vfloat gammav = F2V(gamma); - const vfloat c1v = F2V(0.2627f); - const vfloat c2v = F2V(0.6780f); - const vfloat c3v = F2V(0.0593f); - for (; i < W - 3; i += 4) { - const vfloat Rv = vmaxf(LVFU(R[i]), ZEROV); - const vfloat Gv = vmaxf(LVFU(G[i]), ZEROV); - const vfloat Bv = vmaxf(LVFU(B[i]), ZEROV); - STVFU(Y[i], pow_F(c1v * Rv + c2v * Gv + c3v * Bv, gammav)); - } -#endif - for (; i < W; ++i) { - const float r = std::max(R[i], 0.f); - const float g = std::max(G[i], 0.f); - const float b = std::max(B[i], 0.f); - Y[i] = pow_F(0.2627f * r + 0.6780f * g + 0.0593f * b, gamma); - } - } - static inline void RGB2Y(const float* R, const float* G, const float* B, float* Y1, float * Y2, float gamma, int W) { gamma = 1.f / gamma; int i = 0; diff --git a/rtengine/gauss.cc b/rtengine/gauss.cc index 5665394cc..dfb7cb225 100644 --- a/rtengine/gauss.cc +++ b/rtengine/gauss.cc @@ -272,52 +272,16 @@ template void gauss7x7div (T** RESTRICT src, T** RESTRICT dst, T** REST dst[i][0] = dst[i][1] = dst[i][2] = 1.f; // I tried hand written SSE code but gcc vectorizes better for (int j = 3; j < W - 3; ++j) { - float val = src[i - 3][j - 1] * c31; - val += src[i - 3][j - 0] * c30; - val += src[i - 3][j + 1] * c31; + const float val = c31 * (src[i - 3][j - 1] + src[i - 3][j + 1] + src[i - 1][j - 3] + src[i - 1][j + 3] + src[i + 1][j - 3] + src[i + 1][j + 3] + src[i + 3][j - 1] + src[i + 3][j + 1]) + + c30 * (src[i - 3][j] + src[i][j - 3] + src[i][j + 3] + src[i + 3][j]) + + c22 * (src[i - 2][j - 2] + src[i - 2][j + 2] + src[i + 2][j - 2] + src[i + 2][j + 2]) + + c21 * (src[i - 2][j - 1] + src[i - 2][j + 1] * c21 + src[i - 1][j - 2] + src[i - 1][j + 2] + src[i + 1][j - 2] + src[i + 1][j + 2] + src[i + 2][j - 1] + src[i + 2][j + 1]) + + c20 * (src[i - 2][j] + src[i][j - 2] + src[i][j + 2] + src[i + 2][j]) + + c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) + + c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) + + c00 * src[i][j]; - val += src[i - 2][j - 2] * c22; - val += src[i - 2][j - 1] * c21; - val += src[i - 2][j - 0] * c20; - val += src[i - 2][j + 1] * c21; - val += src[i - 2][j + 2] * c22; - - val += src[i - 1][j - 3] * c31; - val += src[i - 1][j - 2] * c21; - val += src[i - 1][j - 1] * c11; - val += src[i - 1][j - 0] * c10; - val += src[i - 1][j + 1] * c11; - val += src[i - 1][j + 2] * c21; - val += src[i - 1][j + 3] * c31; - - val += src[i][j - 3] * c30; - val += src[i][j - 2] * c20; - val += src[i][j - 1] * c10; - val += src[i][j - 0] * c00; - val += src[i][j + 1] * c10; - val += src[i][j + 2] * c20; - val += src[i][j + 3] * c30; - - val += src[i + 1][j - 3] * c31; - val += src[i + 1][j - 2] * c21; - val += src[i + 1][j - 1] * c11; - val += src[i + 1][j - 0] * c10; - val += src[i + 1][j + 1] * c11; - val += src[i + 1][j + 2] * c21; - val += src[i + 1][j + 3] * c31; - - val += src[i + 2][j - 2] * c22; - val += src[i + 2][j - 1] * c21; - val += src[i + 2][j - 0] * c20; - val += src[i + 2][j + 1] * c21; - val += src[i + 2][j + 2] * c22; - - val += src[i + 3][j - 1] * c31; - val += src[i + 3][j - 0] * c30; - val += src[i + 3][j + 1] * c31; - - val = val > 0.f ? val : 1.f; - dst[i][j] = std::max(divBuffer[i][j] / val, 0.f); + dst[i][j] = divBuffer[i][j] / std::max(val, 0.00001f); } dst[i][W - 3] = dst[i][W - 2] = dst[i][W - 1] = 1.f; } @@ -360,34 +324,13 @@ template void gauss5x5div (T** RESTRICT src, T** RESTRICT dst, T** REST dst[i][0] = dst[i][1] = 1.f; // I tried hand written SSE code but gcc vectorizes better for (int j = 2; j < W - 2; ++j) { - float val = src[i - 2][j - 1] * c21; - val += src[i - 2][j - 0] * c20; - val += src[i - 2][j + 1] * c21; + const float val = c21 * (src[i - 2][j - 1] + src[i - 2][j + 1] + src[i - 1][j - 2] + src[i - 1][j + 2] + src[i + 1][j - 2] + src[i + 1][j + 2] + src[i + 2][j - 1] + src[i + 2][j + 1]) + + c20 * (src[i - 2][j] + src[i][j - 2] + src[i][j + 2] + src[i + 2][j]) + + c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) + + c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) + + c00 * src[i][j]; - val += src[i - 1][j - 2] * c21; - val += src[i - 1][j - 1] * c11; - val += src[i - 1][j - 0] * c10; - val += src[i - 1][j + 1] * c11; - val += src[i - 1][j + 2] * c21; - - val += src[i - 0][j - 2] * c20; - val += src[i - 0][j - 1] * c10; - val += src[i - 0][j - 0] * c00; - val += src[i - 0][j + 1] * c10; - val += src[i - 0][j + 2] * c20; - - val += src[i + 1][j - 2] * c21; - val += src[i + 1][j - 1] * c11; - val += src[i + 1][j - 0] * c10; - val += src[i + 1][j + 1] * c11; - val += src[i + 1][j + 2] * c21; - - val += src[i + 2][j - 1] * c21; - val += src[i + 2][j - 0] * c20; - val += src[i + 2][j + 1] * c21; - - val = val > 0.f ? val : 1.f; - dst[i][j] = std::max(divBuffer[i][j] / val, 0.f); + dst[i][j] = divBuffer[i][j] / std::max(val, 0.00001f); } dst[i][W - 2] = dst[i][W - 1] = 1.f; } @@ -431,49 +374,14 @@ template void gauss7x7mult (T** RESTRICT src, T** RESTRICT dst, const i for (int i = 3; i < H - 3; ++i) { // I tried hand written SSE code but gcc vectorizes better for (int j = 3; j < W - 3; ++j) { - float val = src[i - 3][j - 1] * c31; - val += src[i - 3][j - 0] * c30; - val += src[i - 3][j + 1] * c31; - - val += src[i - 2][j - 2] * c22; - val += src[i - 2][j - 1] * c21; - val += src[i - 2][j - 0] * c20; - val += src[i - 2][j + 1] * c21; - val += src[i - 2][j + 2] * c22; - - val += src[i - 1][j - 3] * c31; - val += src[i - 1][j - 2] * c21; - val += src[i - 1][j - 1] * c11; - val += src[i - 1][j - 0] * c10; - val += src[i - 1][j + 1] * c11; - val += src[i - 1][j + 2] * c21; - val += src[i - 1][j + 3] * c31; - - val += src[i][j - 3] * c30; - val += src[i][j - 2] * c20; - val += src[i][j - 1] * c10; - val += src[i][j - 0] * c00; - val += src[i][j + 1] * c10; - val += src[i][j + 2] * c20; - val += src[i][j + 3] * c30; - - val += src[i + 1][j - 3] * c31; - val += src[i + 1][j - 2] * c21; - val += src[i + 1][j - 1] * c11; - val += src[i + 1][j - 0] * c10; - val += src[i + 1][j + 1] * c11; - val += src[i + 1][j + 2] * c21; - val += src[i + 1][j + 3] * c31; - - val += src[i + 2][j - 2] * c22; - val += src[i + 2][j - 1] * c21; - val += src[i + 2][j - 0] * c20; - val += src[i + 2][j + 1] * c21; - val += src[i + 2][j + 2] * c22; - - val += src[i + 3][j - 1] * c31; - val += src[i + 3][j - 0] * c30; - val += src[i + 3][j + 1] * c31; + const float val = c31 * (src[i - 3][j - 1] + src[i - 3][j + 1] + src[i - 1][j - 3] + src[i - 1][j + 3] + src[i + 1][j - 3] + src[i + 1][j + 3] + src[i + 3][j - 1] + src[i + 3][j + 1]) + + c30 * (src[i - 3][j] + src[i][j - 3] + src[i][j + 3] + src[i + 3][j]) + + c22 * (src[i - 2][j - 2] + src[i - 2][j + 2] + src[i + 2][j - 2] + src[i + 2][j + 2]) + + c21 * (src[i - 2][j - 1] + src[i - 2][j + 1] * c21 + src[i - 1][j - 2] + src[i - 1][j + 2] + src[i + 1][j - 2] + src[i + 1][j + 2] + src[i + 2][j - 1] + src[i + 2][j + 1]) + + c20 * (src[i - 2][j] + src[i][j - 2] + src[i][j + 2] + src[i + 2][j]) + + c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) + + c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) + + c00 * src[i][j]; dst[i][j] *= val; } @@ -499,31 +407,11 @@ template void gauss5x5mult (T** RESTRICT src, T** RESTRICT dst, const i for (int i = 2; i < H - 2; ++i) { // I tried hand written SSE code but gcc vectorizes better for (int j = 2; j < W - 2; ++j) { - float val = src[i - 2][j - 1] * c21; - val += src[i - 2][j - 0] * c20; - val += src[i - 2][j + 1] * c21; - - val += src[i - 1][j - 2] * c21; - val += src[i - 1][j - 1] * c11; - val += src[i - 1][j - 0] * c10; - val += src[i - 1][j + 1] * c11; - val += src[i - 1][j + 2] * c21; - - val += src[i - 0][j - 2] * c20; - val += src[i - 0][j - 1] * c10; - val += src[i - 0][j - 0] * c00; - val += src[i - 0][j + 1] * c10; - val += src[i - 0][j + 2] * c20; - - val += src[i + 1][j - 2] * c21; - val += src[i + 1][j - 1] * c11; - val += src[i + 1][j - 0] * c10; - val += src[i + 1][j + 1] * c11; - val += src[i + 1][j + 2] * c21; - - val += src[i + 2][j - 1] * c21; - val += src[i + 2][j - 0] * c20; - val += src[i + 2][j + 1] * c21; + const float val = c21 * (src[i - 2][j - 1] + src[i - 2][j + 1] + src[i - 1][j - 2] + src[i - 1][j + 2] + src[i + 1][j - 2] + src[i + 1][j + 2] + src[i + 2][j - 1] + src[i + 2][j + 1]) + + c20 * (src[i - 2][j] + src[i][j - 2] + src[i][j + 2] + src[i + 2][j]) + + c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) + + c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) + + c00 * src[i][j]; dst[i][j] *= val; } From ba8c3d15bf5e553e3f28c5b323ca1a2793b082f0 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Wed, 28 Aug 2019 18:03:31 +0200 Subject: [PATCH 12/50] capture sharpening: do not trigger demosaic when changing adjusters --- rtengine/imagesource.h | 2 +- rtengine/improccoordinator.cc | 27 +++++---- rtengine/rawimagesource.cc | 109 ++++++++++++++++++++++++++++++---- rtengine/rawimagesource.h | 8 ++- rtengine/simpleprocess.cc | 2 +- rtgui/pdsharpening.cc | 10 ++-- 6 files changed, 128 insertions(+), 30 deletions(-) diff --git a/rtengine/imagesource.h b/rtengine/imagesource.h index 46cbc28a6..1a5469744 100644 --- a/rtengine/imagesource.h +++ b/rtengine/imagesource.h @@ -83,7 +83,7 @@ public: virtual void preprocess (const procparams::RAWParams &raw, const procparams::LensProfParams &lensProf, const procparams::CoarseTransformParams& coarse, bool prepareDenoise = true) {}; virtual void filmNegativeProcess (const procparams::FilmNegativeParams ¶ms) {}; virtual bool getFilmNegativeExponents (Coord2D spotA, Coord2D spotB, int tran, const FilmNegativeParams& currentParams, std::array& newExps) { return false; }; - virtual void demosaic (const procparams::RAWParams &raw, bool autoContrast, double &contrastThreshold) {}; + virtual void demosaic (const procparams::RAWParams &raw, bool autoContrast, double &contrastThreshold, bool cache = false) {}; virtual void retinex (const procparams::ColorManagementParams& cmp, const procparams::RetinexParams &deh, const procparams::ToneCurveParams& Tc, LUTf & cdcurve, LUTf & mapcurve, const RetinextransmissionCurve & dehatransmissionCurve, const RetinexgaintransmissionCurve & dehagaintransmissionCurve, multi_array2D &conversionBuffer, bool dehacontlutili, bool mapcontlutili, bool useHsl, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax, LUTu &histLRETI) {}; virtual void retinexPrepareCurves (const procparams::RetinexParams &retinexParams, LUTf &cdcurve, LUTf &mapcurve, RetinextransmissionCurve &retinextransmissionCurve, RetinexgaintransmissionCurve &retinexgaintransmissionCurve, bool &retinexcontlutili, bool &mapcontlutili, bool &useHsl, LUTu & lhist16RETI, LUTu & histLRETI) {}; virtual void retinexPrepareBuffers (const procparams::ColorManagementParams& cmp, const procparams::RetinexParams &retinexParams, multi_array2D &conversionBuffer, LUTu &lhist16RETI) {}; diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 7d485fd19..7496cb2aa 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -332,26 +332,31 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) } bool autoContrast = imgsrc->getSensorType() == ST_BAYER ? params->raw.bayersensor.dualDemosaicAutoContrast : params->raw.xtranssensor.dualDemosaicAutoContrast; double contrastThreshold = imgsrc->getSensorType() == ST_BAYER ? params->raw.bayersensor.dualDemosaicContrast : params->raw.xtranssensor.dualDemosaicContrast; - imgsrc->demosaic(rp, autoContrast, contrastThreshold); //enabled demosaic + imgsrc->demosaic(rp, autoContrast, contrastThreshold, params->pdsharpening.enabled); if (imgsrc->getSensorType() == ST_BAYER && bayerAutoContrastListener && autoContrast) { bayerAutoContrastListener->autoContrastChanged(contrastThreshold); } else if (imgsrc->getSensorType() == ST_FUJI_XTRANS && xtransAutoContrastListener && autoContrast) { xtransAutoContrastListener->autoContrastChanged(autoContrast ? contrastThreshold : -1.0); } - - if (params->pdsharpening.enabled) { - double pdSharpencontrastThreshold = params->pdsharpening.contrast; - imgsrc->captureSharpening(params->pdsharpening, sharpMask, pdSharpencontrastThreshold); - if (pdSharpenAutoContrastListener && params->pdsharpening.autoContrast) { - pdSharpenAutoContrastListener->autoContrastChanged(pdSharpencontrastThreshold); - } - } - - // if a demosaic happened we should also call getimage later, so we need to set the M_INIT flag todo |= M_INIT; + } + + if ((todo & M_INIT) && params->pdsharpening.enabled) { + double pdSharpencontrastThreshold = params->pdsharpening.contrast; + imgsrc->captureSharpening(params->pdsharpening, sharpMask, pdSharpencontrastThreshold); + if (pdSharpenAutoContrastListener && params->pdsharpening.autoContrast) { + pdSharpenAutoContrastListener->autoContrastChanged(pdSharpencontrastThreshold); + } + } + + + if ((todo & M_RAW) + || (!highDetailRawComputed && highDetailNeeded) + || (params->toneCurve.hrenabled && params->toneCurve.method != "Color" && imgsrc->isRGBSourceModified()) + || (!params->toneCurve.hrenabled && params->toneCurve.method == "Color" && imgsrc->isRGBSourceModified())) { if (highDetailNeeded) { highDetailRawComputed = true; } else { diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 0602c770b..82863267f 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -45,6 +45,7 @@ #include #endif #include "opthelper.h" +#include "../rtgui/multilangmgr.h" #define clipretinex( val, minv, maxv ) (( val = (val < minv ? minv : val ) ) > maxv ? maxv : val ) #undef CLIPD #define CLIPD(a) ((a)>0.0f?((a)<1.0f?(a):1.0f):0.0f) @@ -457,6 +458,9 @@ RawImageSource::RawImageSource () , green(0, 0) , red(0, 0) , blue(0, 0) + , greenCache(nullptr) + , redCache(nullptr) + , blueCache(nullptr) , rawDirty(true) , histMatchingParams(new procparams::ColorManagementParams) { @@ -474,6 +478,9 @@ RawImageSource::~RawImageSource () { delete idata; + delete redCache; + delete greenCache; + delete blueCache; for(size_t i = 0; i < numFrames; ++i) { delete riFrames[i]; @@ -1524,7 +1531,7 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -void RawImageSource::demosaic(const RAWParams &raw, bool autoContrast, double &contrastThreshold) +void RawImageSource::demosaic(const RAWParams &raw, bool autoContrast, double &contrastThreshold, bool cache) { MyTime t1, t2; t1.set(); @@ -1595,7 +1602,49 @@ void RawImageSource::demosaic(const RAWParams &raw, bool autoContrast, double &c rgbSourceModified = false; - + if (cache) { + if (!redCache) { + redCache = new array2D(W, H); + greenCache = new array2D(W, H); + blueCache = new array2D(W, H); + } +#ifdef _OPENMP + #pragma omp parallel sections +#endif + { +#ifdef _OPENMP + #pragma omp section +#endif + for (int i = 0; i < H; ++i) { + for (int j = 0; j < W; ++j) { + (*redCache)[i][j] = red[i][j]; + } + } +#ifdef _OPENMP + #pragma omp section +#endif + for (int i = 0; i < H; ++i) { + for (int j = 0; j < W; ++j) { + (*greenCache)[i][j] = green[i][j]; + } + } +#ifdef _OPENMP + #pragma omp section +#endif + for (int i = 0; i < H; ++i) { + for (int j = 0; j < W; ++j) { + (*blueCache)[i][j] = blue[i][j]; + } + } + } + } else { + delete redCache; + redCache = nullptr; + delete greenCache; + greenCache = nullptr; + delete blueCache; + blueCache = nullptr; + } if( settings->verbose ) { if (getSensorType() == ST_BAYER) { printf("Demosaicing Bayer data: %s - %d usec\n", raw.bayersensor.method.c_str(), t2.etime(t1)); @@ -4954,6 +5003,12 @@ void RawImageSource::getRawValues(int x, int y, int rotate, int &R, int &G, int void RawImageSource::captureSharpening(const procparams::SharpeningParams &sharpeningParams, bool showMask, double &conrastThreshold) { BENCHFUN + + if (plistener) { + plistener->setProgressStr(M("TP_PDSHARPENING_LABEL")); + plistener->setProgress(0.0); + } + const float xyz_rgb[3][3] = { // XYZ from RGB { 0.412453, 0.357580, 0.180423 }, { 0.212671, 0.715160, 0.072169 }, @@ -4962,6 +5017,10 @@ BENCHFUN float contrast = conrastThreshold / 100.f; + array2D& redVals = redCache ? *redCache : red; + array2D& greenVals = greenCache ? *greenCache : green; + array2D& blueVals = blueCache ? *blueCache : blue; + if (showMask) { StopWatch Stop1("Show mask"); array2D& L = blue; // blue will be overridden anyway => we can use its buffer to store L @@ -4970,10 +5029,18 @@ BENCHFUN #endif for (int i = 0; i < H; ++i) { - Color::RGB2L(red[i], green[i], blue[i], L[i], xyz_rgb, W); + Color::RGB2L(redVals[i], greenVals[i], blueVals[i], L[i], xyz_rgb, W); + } + if (plistener) { + plistener->setProgressStr(M("TP_PDSHARPENING_LABEL")); + plistener->setProgress(0.1); } array2D& blend = red; // red will be overridden anyway => we can use its buffer to store the blend mask buildBlendMask(L, blend, W, H, contrast, 1.f, sharpeningParams.autoContrast); + if (plistener) { + plistener->setProgressStr(M("TP_PDSHARPENING_LABEL")); + plistener->setProgress(0.2); + } conrastThreshold = contrast * 100.f; #ifdef _OPENMP #pragma omp parallel for @@ -4983,6 +5050,10 @@ BENCHFUN red[i][j] = green[i][j] = blue[i][j] = blend[i][j] * 16384.f; } } + if (plistener) { + plistener->setProgressStr(M("TP_PDSHARPENING_LABEL")); + plistener->setProgress(1.0); + } return; } @@ -4995,12 +5066,20 @@ BENCHFUN #pragma omp parallel for schedule(dynamic, 16) #endif for (int i = 0; i < H; ++i) { - Color::RGB2L(red[i], green[i], blue[i], L[i], xyz_rgb, W); - Color::RGB2Y(red[i], green[i], blue[i], YOld[i], YNew[i], sharpeningParams.gamma, W); + Color::RGB2L(redVals[i], greenVals[i], blueVals[i], L[i], xyz_rgb, W); + Color::RGB2Y(redVals[i], greenVals[i], blueVals[i], YOld[i], YNew[i], sharpeningParams.gamma, W); + } + if (plistener) { + plistener->setProgressStr(M("TP_PDSHARPENING_LABEL")); + plistener->setProgress(0.1); } // calculate contrast based blend factors to reduce sharpening in regions with low contrast JaggedArray blend(W, H); buildBlendMask(L, blend, W, H, contrast, 1.f, sharpeningParams.autoContrast); + if (plistener) { + plistener->setProgressStr(M("TP_PDSHARPENING_LABEL")); + plistener->setProgress(0.2); + } conrastThreshold = contrast * 100.f; Stop1.stop(); @@ -5008,6 +5087,10 @@ BENCHFUN ProcParams dummy; ImProcFunctions ipf(&dummy); ipf.deconvsharpening(YNew, tmp, blend, W, H, sharpeningParams, 1.0); + if (plistener) { + plistener->setProgressStr(M("TP_PDSHARPENING_LABEL")); + plistener->setProgress(0.9); + } StopWatch Stop2("Y2RGB"); const float gamma = sharpeningParams.gamma; #ifdef _OPENMP @@ -5019,20 +5102,24 @@ BENCHFUN const vfloat gammav = F2V(gamma); for (; j < W - 3; j += 4) { const vfloat factor = pow_F(LVFU(YNew[i][j]) / vmaxf(LVFU(YOld[i][j]), F2V(0.00001f)), gammav); - STVFU(red[i][j], LVFU(red[i][j]) * factor); - STVFU(green[i][j], LVFU(green[i][j]) * factor); - STVFU(blue[i][j], LVFU(blue[i][j]) * factor); + STVFU(red[i][j], LVFU(redVals[i][j]) * factor); + STVFU(green[i][j], LVFU(greenVals[i][j]) * factor); + STVFU(blue[i][j], LVFU(blueVals[i][j]) * factor); } #endif for (; j < W; ++j) { const float factor = pow_F(YNew[i][j] / std::max(YOld[i][j], 0.00001f), gamma); - red[i][j] *= factor; - green[i][j] *= factor; - blue[i][j] *= factor; + red[i][j] = redVals[i][j] * factor; + green[i][j] = greenVals[i][j] * factor; + blue[i][j] = blueVals[i][j] * factor; } } Stop2.stop(); + if (plistener) { + plistener->setProgressStr(M("TP_PDSHARPENING_LABEL")); + plistener->setProgress(1.0); + } } void RawImageSource::cleanup () diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index 8cf6b08a9..bbc15c448 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -88,6 +88,12 @@ protected: array2D red; // the interpolated blue plane: array2D blue; + // the interpolated green plane: + array2D* greenCache; + // the interpolated red plane: + array2D* redCache; + // the interpolated blue plane: + array2D* blueCache; bool rawDirty; float psRedBrightness[4]; float psGreenBrightness[4]; @@ -117,7 +123,7 @@ public: void preprocess (const procparams::RAWParams &raw, const procparams::LensProfParams &lensProf, const procparams::CoarseTransformParams& coarse, bool prepareDenoise = true) override; void filmNegativeProcess (const procparams::FilmNegativeParams ¶ms) override; bool getFilmNegativeExponents (Coord2D spotA, Coord2D spotB, int tran, const FilmNegativeParams ¤tParams, std::array& newExps) override; - void demosaic (const procparams::RAWParams &raw, bool autoContrast, double &contrastThreshold) override; + void demosaic (const procparams::RAWParams &raw, bool autoContrast, double &contrastThreshold, bool cache = false) override; void retinex (const procparams::ColorManagementParams& cmp, const procparams::RetinexParams &deh, const procparams::ToneCurveParams& Tc, LUTf & cdcurve, LUTf & mapcurve, const RetinextransmissionCurve & dehatransmissionCurve, const RetinexgaintransmissionCurve & dehagaintransmissionCurve, multi_array2D &conversionBuffer, bool dehacontlutili, bool mapcontlutili, bool useHsl, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax, LUTu &histLRETI) override; void retinexPrepareCurves (const procparams::RetinexParams &retinexParams, LUTf &cdcurve, LUTf &mapcurve, RetinextransmissionCurve &retinextransmissionCurve, RetinexgaintransmissionCurve &retinexgaintransmissionCurve, bool &retinexcontlutili, bool &mapcontlutili, bool &useHsl, LUTu & lhist16RETI, LUTu & histLRETI) override; void retinexPrepareBuffers (const procparams::ColorManagementParams& cmp, const procparams::RetinexParams &retinexParams, multi_array2D &conversionBuffer, LUTu &lhist16RETI) override; diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 0524734e0..1751a7cea 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -220,7 +220,7 @@ private: bool autoContrast = imgsrc->getSensorType() == ST_BAYER ? params.raw.bayersensor.dualDemosaicAutoContrast : params.raw.xtranssensor.dualDemosaicAutoContrast; double contrastThreshold = imgsrc->getSensorType() == ST_BAYER ? params.raw.bayersensor.dualDemosaicContrast : params.raw.xtranssensor.dualDemosaicContrast; - imgsrc->demosaic (params.raw, autoContrast, contrastThreshold); + imgsrc->demosaic (params.raw, autoContrast, contrastThreshold, params.pdsharpening.enabled && pl); if (params.pdsharpening.enabled) { imgsrc->captureSharpening(params.pdsharpening, false, params.pdsharpening.contrast); } diff --git a/rtgui/pdsharpening.cc b/rtgui/pdsharpening.cc index 5c14c052f..8e7c0e8b8 100644 --- a/rtgui/pdsharpening.cc +++ b/rtgui/pdsharpening.cc @@ -30,11 +30,11 @@ PdSharpening::PdSharpening() : FoldableToolPanel(this, "pdsharpening", M("TP_PDS { auto m = ProcEventMapper::getInstance(); - EvPdShrContrast = m->newEvent(DEMOSAIC, "HISTORY_MSG_PDSHARPEN_CONTRAST"); - EvPdSharpenGamma = m->newEvent(DEMOSAIC, "HISTORY_MSG_PDSHARPEN_GAMMA"); - EvPdShrDRadius = m->newEvent(DEMOSAIC, "HISTORY_MSG_PDSHARPEN_RADIUS"); - EvPdShrDIterations = m->newEvent(DEMOSAIC, "HISTORY_MSG_PDSHARPEN_ITERATIONS"); - EvPdShrAutoContrast = m->newEvent(DEMOSAIC, "HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST"); + EvPdShrContrast = m->newEvent(ALLNORAW, "HISTORY_MSG_PDSHARPEN_CONTRAST"); + EvPdSharpenGamma = m->newEvent(ALLNORAW, "HISTORY_MSG_PDSHARPEN_GAMMA"); + EvPdShrDRadius = m->newEvent(ALLNORAW, "HISTORY_MSG_PDSHARPEN_RADIUS"); + EvPdShrDIterations = m->newEvent(ALLNORAW, "HISTORY_MSG_PDSHARPEN_ITERATIONS"); + EvPdShrAutoContrast = m->newEvent(ALLNORAW, "HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST"); Gtk::HBox* hb = Gtk::manage(new Gtk::HBox()); hb->show(); From d3ec7f52773864d21c39c6ca5b930e576360dc6e Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Wed, 28 Aug 2019 19:26:09 +0200 Subject: [PATCH 13/50] capture sharpening: Do not trigger demosaic when toggling mask preview, #5412 --- rtengine/improccoordinator.cc | 2 +- rtengine/procevents.h | 1 + rtengine/rawimagesource.cc | 7 ------- rtengine/refreshmap.cc | 5 +++-- 4 files changed, 5 insertions(+), 10 deletions(-) diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 7496cb2aa..4b255d663 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -1364,7 +1364,7 @@ ProcEvent ImProcCoordinator::setSharpMask (bool sharpMask) if (this->sharpMask != sharpMask) { sharpMaskChanged = true; this->sharpMask = sharpMask; - return params->pdsharpening.enabled ? rtengine::EvPdShrEnabled : rtengine::EvShrEnabled; + return params->pdsharpening.enabled ? rtengine::EvPdShrMaskToggled : rtengine::EvShrEnabled; } else { sharpMaskChanged = false; return rtengine::EvShrEnabled; diff --git a/rtengine/procevents.h b/rtengine/procevents.h index 670c0c102..d8491e533 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -521,6 +521,7 @@ enum ProcEventCode { EvRGBEnabled = 491, EvLEnabled = 492, EvPdShrEnabled = 493, + EvPdShrMaskToggled = 494, NUMOFEVENTS diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 82863267f..487bb1959 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -5032,13 +5032,11 @@ BENCHFUN Color::RGB2L(redVals[i], greenVals[i], blueVals[i], L[i], xyz_rgb, W); } if (plistener) { - plistener->setProgressStr(M("TP_PDSHARPENING_LABEL")); plistener->setProgress(0.1); } array2D& blend = red; // red will be overridden anyway => we can use its buffer to store the blend mask buildBlendMask(L, blend, W, H, contrast, 1.f, sharpeningParams.autoContrast); if (plistener) { - plistener->setProgressStr(M("TP_PDSHARPENING_LABEL")); plistener->setProgress(0.2); } conrastThreshold = contrast * 100.f; @@ -5051,7 +5049,6 @@ BENCHFUN } } if (plistener) { - plistener->setProgressStr(M("TP_PDSHARPENING_LABEL")); plistener->setProgress(1.0); } return; @@ -5070,14 +5067,12 @@ BENCHFUN Color::RGB2Y(redVals[i], greenVals[i], blueVals[i], YOld[i], YNew[i], sharpeningParams.gamma, W); } if (plistener) { - plistener->setProgressStr(M("TP_PDSHARPENING_LABEL")); plistener->setProgress(0.1); } // calculate contrast based blend factors to reduce sharpening in regions with low contrast JaggedArray blend(W, H); buildBlendMask(L, blend, W, H, contrast, 1.f, sharpeningParams.autoContrast); if (plistener) { - plistener->setProgressStr(M("TP_PDSHARPENING_LABEL")); plistener->setProgress(0.2); } conrastThreshold = contrast * 100.f; @@ -5088,7 +5083,6 @@ BENCHFUN ImProcFunctions ipf(&dummy); ipf.deconvsharpening(YNew, tmp, blend, W, H, sharpeningParams, 1.0); if (plistener) { - plistener->setProgressStr(M("TP_PDSHARPENING_LABEL")); plistener->setProgress(0.9); } StopWatch Stop2("Y2RGB"); @@ -5117,7 +5111,6 @@ BENCHFUN } Stop2.stop(); if (plistener) { - plistener->setProgressStr(M("TP_PDSHARPENING_LABEL")); plistener->setProgress(1.0); } } diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index 8282f5b4b..56db1f71b 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -519,8 +519,9 @@ int refreshmap[rtengine::NUMOFEVENTS] = { HDR, // EvTMFattalAmount ALLNORAW, // EvWBEnabled RGBCURVE, // EvRGBEnabled - LUMINANCECURVE, // EvLEnabled - DEMOSAIC // EvPdShrEnabled + LUMINANCECURVE, // EvLEnabled + DEMOSAIC, // EvPdShrEnabled + ALLNORAW // EvPdShrMaskToggled }; From cca484f6c9251d4200c8c81e28e36e29fed3f469 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Wed, 28 Aug 2019 19:59:55 +0200 Subject: [PATCH 14/50] capture sharpening: reduce memory usage in preview mode, #5412 --- rtengine/rawimagesource.cc | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 487bb1959..2b45bfe38 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -5054,9 +5054,23 @@ BENCHFUN return; } - array2D L(W,H); - array2D YOld(W,H); - array2D YNew(W,H); + array2D* Lbuffer = nullptr; + if (!redCache) { + Lbuffer = new array2D(W, H); + } + + array2D* YOldbuffer = nullptr; + if (!greenCache) { + YOldbuffer = new array2D(W, H); + } + + array2D* YNewbuffer = nullptr; + if (!blueCache) { + YNewbuffer = new array2D(W, H); + } + array2D& L = Lbuffer ? *Lbuffer : red; + array2D& YOld = YOldbuffer ? * YOldbuffer : green; + array2D& YNew = YNewbuffer ? * YNewbuffer : blue; StopWatch Stop1("rgb2YL"); #ifdef _OPENMP @@ -5110,6 +5124,9 @@ BENCHFUN } } Stop2.stop(); + delete Lbuffer; + delete YOldbuffer; + delete YNewbuffer; if (plistener) { plistener->setProgress(1.0); } From b72d4e27eb935e2894933016587a1bd386b5539c Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 29 Aug 2019 13:02:54 +0200 Subject: [PATCH 15/50] capture sharpening: early exit if Autocontrast is changed from true to false, #5412 --- rtengine/rawimagesource.cc | 7 ++++++- rtengine/rawimagesource.h | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 2b45bfe38..3cab9b6b1 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -461,6 +461,7 @@ RawImageSource::RawImageSource () , greenCache(nullptr) , redCache(nullptr) , blueCache(nullptr) + , captureSharpeningAutoContrast(false) , rawDirty(true) , histMatchingParams(new procparams::ColorManagementParams) { @@ -5003,7 +5004,11 @@ void RawImageSource::getRawValues(int x, int y, int rotate, int &R, int &G, int void RawImageSource::captureSharpening(const procparams::SharpeningParams &sharpeningParams, bool showMask, double &conrastThreshold) { BENCHFUN - + if (!sharpeningParams.autoContrast && captureSharpeningAutoContrast) { + captureSharpeningAutoContrast = false; + return; + } + captureSharpeningAutoContrast = sharpeningParams.autoContrast; if (plistener) { plistener->setProgressStr(M("TP_PDSHARPENING_LABEL")); plistener->setProgress(0.0); diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index bbc15c448..cebedd32f 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -94,6 +94,7 @@ protected: array2D* redCache; // the interpolated blue plane: array2D* blueCache; + bool captureSharpeningAutoContrast; bool rawDirty; float psRedBrightness[4]; float psGreenBrightness[4]; From 205db936f9a3f5556e442e2a57820ca3ecea0e3f Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 29 Aug 2019 13:58:46 +0200 Subject: [PATCH 16/50] Revert "capture sharpening: early exit if Autocontrast is changed from true to false, #5412" This reverts commit b72d4e27eb935e2894933016587a1bd386b5539c. --- rtengine/rawimagesource.cc | 7 +------ rtengine/rawimagesource.h | 1 - 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 3cab9b6b1..2b45bfe38 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -461,7 +461,6 @@ RawImageSource::RawImageSource () , greenCache(nullptr) , redCache(nullptr) , blueCache(nullptr) - , captureSharpeningAutoContrast(false) , rawDirty(true) , histMatchingParams(new procparams::ColorManagementParams) { @@ -5004,11 +5003,7 @@ void RawImageSource::getRawValues(int x, int y, int rotate, int &R, int &G, int void RawImageSource::captureSharpening(const procparams::SharpeningParams &sharpeningParams, bool showMask, double &conrastThreshold) { BENCHFUN - if (!sharpeningParams.autoContrast && captureSharpeningAutoContrast) { - captureSharpeningAutoContrast = false; - return; - } - captureSharpeningAutoContrast = sharpeningParams.autoContrast; + if (plistener) { plistener->setProgressStr(M("TP_PDSHARPENING_LABEL")); plistener->setProgress(0.0); diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index cebedd32f..bbc15c448 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -94,7 +94,6 @@ protected: array2D* redCache; // the interpolated blue plane: array2D* blueCache; - bool captureSharpeningAutoContrast; bool rawDirty; float psRedBrightness[4]; float psGreenBrightness[4]; From 1ff505432c4496b71bf03db35f5fde19cc1eecaa Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 29 Aug 2019 21:04:56 +0200 Subject: [PATCH 17/50] Do not treat changes of tonecurve.fromHistMatching as related to panning --- rtengine/improccoordinator.cc | 2 +- rtengine/procparams.cc | 23 +++++++++++++++++++++++ rtengine/procparams.h | 1 + 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 6f471eedf..766c7ba84 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -1514,7 +1514,7 @@ void ImProcCoordinator::process() while (changeSinceLast) { const bool panningRelatedChange = - params->toneCurve != nextParams->toneCurve + params->toneCurve.isPanningRelatedChange(nextParams->toneCurve) || params->labCurve != nextParams->labCurve || params->localContrast != nextParams->localContrast || params->rgbCurves != nextParams->rgbCurves diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 66837f89b..9fbc260ce 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -330,6 +330,29 @@ ToneCurveParams::ToneCurveParams() : { } +bool ToneCurveParams::isPanningRelatedChange(const ToneCurveParams& other) const +{ + return ! + (autoexp == other.autoexp + && clip == other.clip + && hrenabled == other.hrenabled + && method == other.method + && expcomp == other.expcomp + && curve == other.curve + && curve2 == other.curve2 + && curveMode == other.curveMode + && curveMode2 == other.curveMode2 + && brightness == other.brightness + && black == other.black + && contrast == other.contrast + && saturation == other.saturation + && shcompr == other.shcompr + && hlcompr == other.hlcompr + && hlcomprthresh == other.hlcomprthresh + && histmatching == other.histmatching + && clampOOG == other.clampOOG); +} + bool ToneCurveParams::operator ==(const ToneCurveParams& other) const { return diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 369af85fa..2d042f571 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -284,6 +284,7 @@ struct ToneCurveParams { ToneCurveParams(); + bool isPanningRelatedChange(const ToneCurveParams& other) const; bool operator ==(const ToneCurveParams& other) const; bool operator !=(const ToneCurveParams& other) const; From df8367558ba81c34a8fb67852685f2ec4e97349b Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 29 Aug 2019 22:07:15 +0200 Subject: [PATCH 18/50] Do not treat white balance changes as related to panning if before and after uses camera whitebalance --- rtengine/improccoordinator.cc | 2 +- rtengine/procparams.cc | 15 +++++++++++++++ rtengine/procparams.h | 1 + 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 766c7ba84..daadcb16c 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -1520,7 +1520,7 @@ void ImProcCoordinator::process() || params->rgbCurves != nextParams->rgbCurves || params->colorToning != nextParams->colorToning || params->vibrance != nextParams->vibrance - || params->wb != nextParams->wb + || params->wb.isPanningRelatedChange(nextParams->wb) || params->colorappearance != nextParams->colorappearance || params->epd != nextParams->epd || params->fattal != nextParams->fattal diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 9fbc260ce..f14d72871 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -1233,6 +1233,21 @@ WBParams::WBParams() : { } +bool WBParams::isPanningRelatedChange(const WBParams& other) const +{ + return ! + (enabled == other.enabled + && ((method == "Camera" && other.method == "Camera") + || + (method == other.method + && temperature == other.temperature + && green == other.green + && equal == other.equal + && tempBias == other.tempBias) + ) + ); +} + bool WBParams::operator ==(const WBParams& other) const { return diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 2d042f571..6ae807d7e 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -598,6 +598,7 @@ struct WBParams { WBParams(); + bool isPanningRelatedChange(const WBParams& other) const; bool operator ==(const WBParams& other) const; bool operator !=(const WBParams& other) const; From 48bcf9e71a1348a15f91bd92285638edd97bd93e Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 29 Aug 2019 22:46:09 +0200 Subject: [PATCH 19/50] Fix broken export when filmnegative was used on xtrans files --- rtengine/simpleprocess.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 1751a7cea..b14b4435d 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -210,7 +210,7 @@ private: imgsrc->preprocess ( params.raw, params.lensProf, params.coarse, params.dirpyrDenoise.enabled); // After preprocess, run film negative processing if enabled - if (imgsrc->getSensorType() == ST_BAYER && params.filmNegative.enabled) { + if ((imgsrc->getSensorType() == ST_BAYER || (imgsrc->getSensorType() == ST_FUJI_XTRANS)) && params.filmNegative.enabled) { imgsrc->filmNegativeProcess (params.filmNegative); } From a5cba6261a59e37e9c9e9ae6ddf15c09469ccdb1 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 29 Aug 2019 22:50:45 +0200 Subject: [PATCH 20/50] Fix broken export when filmnegative was used on xtrans files --- rtengine/simpleprocess.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 2d594e0af..8d24514d6 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -210,7 +210,7 @@ private: imgsrc->preprocess ( params.raw, params.lensProf, params.coarse, params.dirpyrDenoise.enabled); // After preprocess, run film negative processing if enabled - if (imgsrc->getSensorType() == ST_BAYER && params.filmNegative.enabled) { + if ((imgsrc->getSensorType() == ST_BAYER || (imgsrc->getSensorType() == ST_FUJI_XTRANS)) && params.filmNegative.enabled) { imgsrc->filmNegativeProcess (params.filmNegative); } From f882309f594444abcce2df5eee6f8c8969822e06 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Fri, 30 Aug 2019 14:45:45 +0200 Subject: [PATCH 21/50] capture sharpening: own compilation unit, smooth progressbar, #5412 --- rtengine/CMakeLists.txt | 1 + rtengine/capturesharpening.cc | 218 ++++++++++++++++++++++++++++++++++ rtengine/imagesource.h | 4 +- rtengine/procparams.cc | 32 ++++- rtengine/procparams.h | 16 ++- rtengine/rawimagesource.cc | 138 +-------------------- rtengine/rawimagesource.h | 2 +- rtengine/stdimagesource.h | 2 +- rtgui/paramsedited.cc | 7 +- rtgui/paramsedited.h | 11 +- 10 files changed, 277 insertions(+), 154 deletions(-) create mode 100644 rtengine/capturesharpening.cc diff --git a/rtengine/CMakeLists.txt b/rtengine/CMakeLists.txt index c5c8afa82..f52cfa256 100644 --- a/rtengine/CMakeLists.txt +++ b/rtengine/CMakeLists.txt @@ -32,6 +32,7 @@ set(CAMCONSTSFILE "camconst.json") set(RTENGINESOURCEFILES badpixels.cc CA_correct_RT.cc + capturesharpening.cc EdgePreservingDecomposition.cc FTblockDN.cc PF_correct_RT.cc diff --git a/rtengine/capturesharpening.cc b/rtengine/capturesharpening.cc new file mode 100644 index 000000000..71cefaca6 --- /dev/null +++ b/rtengine/capturesharpening.cc @@ -0,0 +1,218 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2019 Ingo Weyrich (heckflosse67@gmx.de) + * + * 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 + +#include "jaggedarray.h" +#include "rtengine.h" +#include "rawimagesource.h" +#include "rt_math.h" +#include "improcfun.h" +#include "procparams.h" +#include "color.h" +#include "gauss.h" +#include "rt_algo.h" +#define BENCHMARK +#include "StopWatch.h" +#ifdef _OPENMP +#include +#endif +#include "opthelper.h" +#include "../rtgui/multilangmgr.h" + +namespace { +void CaptureDeconvSharpening (float** luminance, float** tmp, const float * const * blend, int W, int H, double sigma, int iterations, rtengine::ProgressListener* plistener, double start, double step) +{ + + rtengine::JaggedArray tmpI(W, H); + +#ifdef _OPENMP + #pragma omp parallel +#endif + { +#ifdef _OPENMP + #pragma omp for +#endif + for (int i = 0; i < H; i++) { + for(int j = 0; j < W; j++) { + tmpI[i][j] = max(luminance[i][j], 0.f); + } + } + + for (int k = 0; k < iterations; k++) { + // apply gaussian blur and divide luminance by result of gaussian blur + gaussianBlur(tmpI, tmp, W, H, sigma, nullptr, GAUSS_DIV, luminance); + gaussianBlur(tmp, tmpI, W, H, sigma, nullptr, GAUSS_MULT); + if (plistener) { +#ifdef _OPENMP + #pragma omp single +#endif + start += step; + plistener->setProgress(start); + } + } // end for + +#ifdef _OPENMP + #pragma omp for +#endif + + for (int i = 0; i < H; ++i) { + for (int j = 0; j < W; ++j) { + luminance[i][j] = rtengine::intp(blend[i][j], max(tmpI[i][j], 0.0f), luminance[i][j]); + } + } + } // end parallel +} + +} + +namespace rtengine +{ + +void RawImageSource::captureSharpening(const procparams::CaptureSharpeningParams &sharpeningParams, bool showMask, double &conrastThreshold) { +BENCHFUN + + + if (plistener) { + plistener->setProgressStr(M("TP_PDSHARPENING_LABEL")); + plistener->setProgress(0.0); + } + + const float xyz_rgb[3][3] = { // XYZ from RGB + { 0.412453, 0.357580, 0.180423 }, + { 0.212671, 0.715160, 0.072169 }, + { 0.019334, 0.119193, 0.950227 } + }; + + float contrast = conrastThreshold / 100.f; + + array2D& redVals = redCache ? *redCache : red; + array2D& greenVals = greenCache ? *greenCache : green; + array2D& blueVals = blueCache ? *blueCache : blue; + + if (showMask) { + StopWatch Stop1("Show mask"); + array2D& L = blue; // blue will be overridden anyway => we can use its buffer to store L +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int i = 0; i < H; ++i) { + Color::RGB2L(redVals[i], greenVals[i], blueVals[i], L[i], xyz_rgb, W); + } + if (plistener) { + plistener->setProgress(0.1); + } + array2D& blend = red; // red will be overridden anyway => we can use its buffer to store the blend mask + buildBlendMask(L, blend, W, H, contrast, 1.f, sharpeningParams.autoContrast); + if (plistener) { + plistener->setProgress(0.2); + } + conrastThreshold = contrast * 100.f; +#ifdef _OPENMP + #pragma omp parallel for +#endif + for (int i = 0; i < H; ++i) { + for (int j = 0; j < W; ++j) { + red[i][j] = green[i][j] = blue[i][j] = blend[i][j] * 16384.f; + } + } + if (plistener) { + plistener->setProgress(1.0); + } + return; + } + + array2D* Lbuffer = nullptr; + if (!redCache) { + Lbuffer = new array2D(W, H); + } + + array2D* YOldbuffer = nullptr; + if (!greenCache) { + YOldbuffer = new array2D(W, H); + } + + array2D* YNewbuffer = nullptr; + if (!blueCache) { + YNewbuffer = new array2D(W, H); + } + array2D& L = Lbuffer ? *Lbuffer : red; + array2D& YOld = YOldbuffer ? * YOldbuffer : green; + array2D& YNew = YNewbuffer ? * YNewbuffer : blue; + + StopWatch Stop1("rgb2YL"); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic, 16) +#endif + for (int i = 0; i < H; ++i) { + Color::RGB2L(redVals[i], greenVals[i], blueVals[i], L[i], xyz_rgb, W); + Color::RGB2Y(redVals[i], greenVals[i], blueVals[i], YOld[i], YNew[i], sharpeningParams.gamma, W); + } + if (plistener) { + plistener->setProgress(0.1); + } + // calculate contrast based blend factors to reduce sharpening in regions with low contrast + JaggedArray blend(W, H); + buildBlendMask(L, blend, W, H, contrast, 1.f, sharpeningParams.autoContrast); + if (plistener) { + plistener->setProgress(0.2); + } + conrastThreshold = contrast * 100.f; + + Stop1.stop(); + array2D& tmp = L; // L is not used anymore now => we can use its buffer as the needed temporary buffer + CaptureDeconvSharpening(YNew, tmp, blend, W, H, sharpeningParams.deconvradius, sharpeningParams.deconviter, plistener, 0.2, (0.9 - 0.2) / sharpeningParams.deconviter); + if (plistener) { + plistener->setProgress(0.9); + } + StopWatch Stop2("Y2RGB"); + const float gamma = sharpeningParams.gamma; +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic, 16) +#endif + for (int i = 0; i < H; ++i) { + int j = 0; +#ifdef __SSE2__ + const vfloat gammav = F2V(gamma); + for (; j < W - 3; j += 4) { + const vfloat factor = pow_F(LVFU(YNew[i][j]) / vmaxf(LVFU(YOld[i][j]), F2V(0.00001f)), gammav); + STVFU(red[i][j], LVFU(redVals[i][j]) * factor); + STVFU(green[i][j], LVFU(greenVals[i][j]) * factor); + STVFU(blue[i][j], LVFU(blueVals[i][j]) * factor); + } + +#endif + for (; j < W; ++j) { + const float factor = pow_F(YNew[i][j] / std::max(YOld[i][j], 0.00001f), gamma); + red[i][j] = redVals[i][j] * factor; + green[i][j] = greenVals[i][j] * factor; + blue[i][j] = blueVals[i][j] * factor; + } + } + Stop2.stop(); + delete Lbuffer; + delete YOldbuffer; + delete YNewbuffer; + if (plistener) { + plistener->setProgress(1.0); + } +} + +} /* namespace */ diff --git a/rtengine/imagesource.h b/rtengine/imagesource.h index 1a5469744..64bb53a49 100644 --- a/rtengine/imagesource.h +++ b/rtengine/imagesource.h @@ -46,7 +46,7 @@ struct LensProfParams; struct RAWParams; struct RetinexParams; struct ToneCurveParams; -struct SharpeningParams; +struct CaptureSharpeningParams; } class ImageMatrices @@ -182,7 +182,7 @@ public: return this; } virtual void getRawValues(int x, int y, int rotate, int &R, int &G, int &B) = 0; - virtual void captureSharpening(const procparams::SharpeningParams &sharpeningParams, bool showMask, double &conrastThreshold) = 0; + virtual void captureSharpening(const procparams::CaptureSharpeningParams &sharpeningParams, bool showMask, double &conrastThreshold) = 0; }; } diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 60b95a2e8..d88892a3b 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -1149,6 +1149,32 @@ bool SharpeningParams::operator !=(const SharpeningParams& other) const return !(*this == other); } +CaptureSharpeningParams::CaptureSharpeningParams() : + enabled(false), + autoContrast(true), + contrast(10.0), + gamma(1.35), + deconvradius(0.75), + deconviter(30) +{ +} + +bool CaptureSharpeningParams::operator ==(const CaptureSharpeningParams& other) const +{ + return + enabled == other.enabled + && contrast == other.contrast + && gamma == other.gamma + && autoContrast == other.autoContrast + && deconvradius == other.deconvradius + && deconviter == other.deconviter; +} + +bool CaptureSharpeningParams::operator !=(const CaptureSharpeningParams& other) const +{ + return !(*this == other); +} + SharpenEdgeParams::SharpenEdgeParams() : enabled(false), passes(2), @@ -2830,12 +2856,6 @@ void ProcParams::setDefaults() prsharpening.deconvdamping = 0; pdsharpening = {}; - pdsharpening.contrast = 10.0; - pdsharpening.autoContrast = true; - prsharpening.method = "rld"; - pdsharpening.gamma = 1.35; - pdsharpening.deconvradius = 0.75; - pdsharpening.deconviter = 30; vibrance = {}; diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 4be6de254..cbcec0e18 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -542,6 +542,20 @@ struct SharpenMicroParams { bool operator !=(const SharpenMicroParams& other) const; }; +struct CaptureSharpeningParams { + bool enabled; + bool autoContrast; + double contrast; + double gamma; + double deconvradius; + int deconviter; + + CaptureSharpeningParams(); + + bool operator ==(const CaptureSharpeningParams& other) const; + bool operator !=(const CaptureSharpeningParams& other) const; +}; + /** * Parameters of the vibrance */ @@ -1530,7 +1544,7 @@ public: ColorToningParams colorToning; ///< Color Toning parameters SharpeningParams sharpening; ///< Sharpening parameters SharpeningParams prsharpening; ///< Sharpening parameters for post resize sharpening - SharpeningParams pdsharpening; ///< Sharpening parameters for post demosaic sharpening + CaptureSharpeningParams pdsharpening; ///< Sharpening parameters for post demosaic sharpening SharpenEdgeParams sharpenEdge; ///< Sharpen edge parameters SharpenMicroParams sharpenMicro; ///< Sharpen microcontrast parameters VibranceParams vibrance; ///< Vibrance parameters diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 2b45bfe38..931a46ede 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -38,14 +38,12 @@ #include "camconst.h" #include "procparams.h" #include "color.h" -#include "rt_algo.h" -#define BENCHMARK -#include "StopWatch.h" +//#define BENCHMARK +//#include "StopWatch.h" #ifdef _OPENMP #include #endif #include "opthelper.h" -#include "../rtgui/multilangmgr.h" #define clipretinex( val, minv, maxv ) (( val = (val < minv ? minv : val ) ) > maxv ? maxv : val ) #undef CLIPD #define CLIPD(a) ((a)>0.0f?((a)<1.0f?(a):1.0f):0.0f) @@ -5000,138 +4998,6 @@ void RawImageSource::getRawValues(int x, int y, int rotate, int &R, int &G, int } } -void RawImageSource::captureSharpening(const procparams::SharpeningParams &sharpeningParams, bool showMask, double &conrastThreshold) { -BENCHFUN - - - if (plistener) { - plistener->setProgressStr(M("TP_PDSHARPENING_LABEL")); - plistener->setProgress(0.0); - } - - const float xyz_rgb[3][3] = { // XYZ from RGB - { 0.412453, 0.357580, 0.180423 }, - { 0.212671, 0.715160, 0.072169 }, - { 0.019334, 0.119193, 0.950227 } - }; - - float contrast = conrastThreshold / 100.f; - - array2D& redVals = redCache ? *redCache : red; - array2D& greenVals = greenCache ? *greenCache : green; - array2D& blueVals = blueCache ? *blueCache : blue; - - if (showMask) { - StopWatch Stop1("Show mask"); - array2D& L = blue; // blue will be overridden anyway => we can use its buffer to store L -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int i = 0; i < H; ++i) { - Color::RGB2L(redVals[i], greenVals[i], blueVals[i], L[i], xyz_rgb, W); - } - if (plistener) { - plistener->setProgress(0.1); - } - array2D& blend = red; // red will be overridden anyway => we can use its buffer to store the blend mask - buildBlendMask(L, blend, W, H, contrast, 1.f, sharpeningParams.autoContrast); - if (plistener) { - plistener->setProgress(0.2); - } - conrastThreshold = contrast * 100.f; -#ifdef _OPENMP - #pragma omp parallel for -#endif - for (int i = 0; i < H; ++i) { - for (int j = 0; j < W; ++j) { - red[i][j] = green[i][j] = blue[i][j] = blend[i][j] * 16384.f; - } - } - if (plistener) { - plistener->setProgress(1.0); - } - return; - } - - array2D* Lbuffer = nullptr; - if (!redCache) { - Lbuffer = new array2D(W, H); - } - - array2D* YOldbuffer = nullptr; - if (!greenCache) { - YOldbuffer = new array2D(W, H); - } - - array2D* YNewbuffer = nullptr; - if (!blueCache) { - YNewbuffer = new array2D(W, H); - } - array2D& L = Lbuffer ? *Lbuffer : red; - array2D& YOld = YOldbuffer ? * YOldbuffer : green; - array2D& YNew = YNewbuffer ? * YNewbuffer : blue; - - StopWatch Stop1("rgb2YL"); -#ifdef _OPENMP - #pragma omp parallel for schedule(dynamic, 16) -#endif - for (int i = 0; i < H; ++i) { - Color::RGB2L(redVals[i], greenVals[i], blueVals[i], L[i], xyz_rgb, W); - Color::RGB2Y(redVals[i], greenVals[i], blueVals[i], YOld[i], YNew[i], sharpeningParams.gamma, W); - } - if (plistener) { - plistener->setProgress(0.1); - } - // calculate contrast based blend factors to reduce sharpening in regions with low contrast - JaggedArray blend(W, H); - buildBlendMask(L, blend, W, H, contrast, 1.f, sharpeningParams.autoContrast); - if (plistener) { - plistener->setProgress(0.2); - } - conrastThreshold = contrast * 100.f; - - Stop1.stop(); - array2D& tmp = L; // L is not used anymore now => we can use its buffer as the needed temporary buffer - ProcParams dummy; - ImProcFunctions ipf(&dummy); - ipf.deconvsharpening(YNew, tmp, blend, W, H, sharpeningParams, 1.0); - if (plistener) { - plistener->setProgress(0.9); - } - StopWatch Stop2("Y2RGB"); - const float gamma = sharpeningParams.gamma; -#ifdef _OPENMP - #pragma omp parallel for schedule(dynamic, 16) -#endif - for (int i = 0; i < H; ++i) { - int j = 0; -#ifdef __SSE2__ - const vfloat gammav = F2V(gamma); - for (; j < W - 3; j += 4) { - const vfloat factor = pow_F(LVFU(YNew[i][j]) / vmaxf(LVFU(YOld[i][j]), F2V(0.00001f)), gammav); - STVFU(red[i][j], LVFU(redVals[i][j]) * factor); - STVFU(green[i][j], LVFU(greenVals[i][j]) * factor); - STVFU(blue[i][j], LVFU(blueVals[i][j]) * factor); - } - -#endif - for (; j < W; ++j) { - const float factor = pow_F(YNew[i][j] / std::max(YOld[i][j], 0.00001f), gamma); - red[i][j] = redVals[i][j] * factor; - green[i][j] = greenVals[i][j] * factor; - blue[i][j] = blueVals[i][j] * factor; - } - } - Stop2.stop(); - delete Lbuffer; - delete YOldbuffer; - delete YNewbuffer; - if (plistener) { - plistener->setProgress(1.0); - } -} - void RawImageSource::cleanup () { delete phaseOneIccCurve; diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index bbc15c448..5e1c9b424 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -311,7 +311,7 @@ protected: void hflip (Imagefloat* im); void vflip (Imagefloat* im); void getRawValues(int x, int y, int rotate, int &R, int &G, int &B) override; - void captureSharpening(const procparams::SharpeningParams &sharpeningParams, bool showMask, double &conrastThreshold) override; + void captureSharpening(const procparams::CaptureSharpeningParams &sharpeningParams, bool showMask, double &conrastThreshold) override; }; } diff --git a/rtengine/stdimagesource.h b/rtengine/stdimagesource.h index 175f664f8..6b4a67773 100644 --- a/rtengine/stdimagesource.h +++ b/rtengine/stdimagesource.h @@ -102,7 +102,7 @@ public: void getRawValues(int x, int y, int rotate, int &R, int &G, int &B) override { R = G = B = 0;} void flushRGB () override; - void captureSharpening(const procparams::SharpeningParams &sharpeningParams, bool showMask, double &conrastThreshold) override {}; + void captureSharpening(const procparams::CaptureSharpeningParams &sharpeningParams, bool showMask, double &conrastThreshold) override {}; }; } #endif diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 4029d0b9b..db0c24123 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -169,7 +169,6 @@ void ParamsEdited::set(bool v) pdsharpening.contrast = v; pdsharpening.autoContrast = v; pdsharpening.gamma = v; - pdsharpening.deconvamount = v; pdsharpening.deconvradius = v; pdsharpening.deconviter = v; prsharpening.enabled = v; @@ -1733,10 +1732,6 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.pdsharpening.autoContrast = mods.pdsharpening.autoContrast; } - if (pdsharpening.deconvamount) { - toEdit.pdsharpening.deconvamount = dontforceSet && options.baBehav[ADDSET_SHARP_AMOUNT] ? toEdit.pdsharpening.deconvamount + mods.pdsharpening.deconvamount : mods.pdsharpening.deconvamount; - } - if (pdsharpening.gamma) { toEdit.pdsharpening.gamma = dontforceSet && options.baBehav[ADDSET_SHARP_GAMMA] ? toEdit.pdsharpening.gamma + mods.pdsharpening.gamma : mods.pdsharpening.gamma; } @@ -3292,7 +3287,7 @@ bool FilmNegativeParamsEdited::isUnchanged() const return enabled && redRatio && greenExp && blueRatio; } -bool SharpeningParamsEdited::isUnchanged() const +bool CaptureSharpeningParamsEdited::isUnchanged() const { return enabled && contrast && autoContrast && gamma && deconvradius && deconviter; } \ No newline at end of file diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 6d229e689..c697aaacd 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -196,6 +196,15 @@ struct SharpeningParamsEdited { bool deconvradius; bool deconviter; bool deconvdamping; +}; + +struct CaptureSharpeningParamsEdited { + bool enabled; + bool contrast; + bool autoContrast; + bool gamma; + bool deconvradius; + bool deconviter; bool isUnchanged() const; }; @@ -687,7 +696,7 @@ struct ParamsEdited { ColorToningEdited colorToning; RetinexParamsEdited retinex; SharpeningParamsEdited sharpening; - SharpeningParamsEdited pdsharpening; + CaptureSharpeningParamsEdited pdsharpening; SharpeningParamsEdited prsharpening; SharpenEdgeParamsEdited sharpenEdge; SharpenMicroParamsEdited sharpenMicro; From a060b57ff607bf595c7e1e154ada078b40d85edf Mon Sep 17 00:00:00 2001 From: Andy Dodd Date: Tue, 27 Aug 2019 17:44:35 -0400 Subject: [PATCH 22/50] rtgui/thumbbrowserbase - Improve behavior with smooth scrolling devices Devices such as trackpads will emit smooth scrolling (GDK_SMOOTH_SCROLL) events with deltas smaller than +/-1.0 at high frequency. Quantizing these to +/-1.0 leads to significant amplification of scroll speed to the point of unusability Scroll by delta instead of +/-1.0 in these cases, permitting smooth scrolling through thumbnails Some mice emit GDK_SMOOTH_SCROLL with deltas of +/-1.0 per detent. This patch will not change behavior with such devices. However, if any mice emit deltas of smaller magnitude, the per-detent behavior will change. --- rtgui/thumbbrowserbase.cc | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/rtgui/thumbbrowserbase.cc b/rtgui/thumbbrowserbase.cc index caf7d7b97..13709d8f7 100644 --- a/rtgui/thumbbrowserbase.cc +++ b/rtgui/thumbbrowserbase.cc @@ -79,10 +79,19 @@ void ThumbBrowserBase::scroll (int direction, double deltaX, double deltaY) delta = deltaY; } if (direction == GDK_SCROLL_SMOOTH && delta == 0.0) { - // sometimes this case happens. To avoid scrolling the wrong direction in this case, we just do nothing + // sometimes this case happens. To avoid scrolling the wrong direction in this case, we just do nothing + // This is probably no longer necessary now that coef is no longer quantized to +/-1.0 but why waste CPU cycles? return; } - double coef = direction == GDK_SCROLL_DOWN || (direction == GDK_SCROLL_SMOOTH && delta > 0.0) ? +1.0 : -1.0; + //GDK_SCROLL_SMOOTH can come in as many events with small deltas, don't quantize these to +/-1.0 so trackpads work well + double coef; + if(direction == GDK_SCROLL_SMOOTH) { + coef = delta; + } else if (direction == GDK_SCROLL_DOWN) { + coef = +1.0; + } else { + coef = -1.0; + } // GUI already acquired when here if (direction == GDK_SCROLL_UP || direction == GDK_SCROLL_DOWN || direction == GDK_SCROLL_SMOOTH) { From dadf01fe95b9f7ef61226703b1071e037dd553d1 Mon Sep 17 00:00:00 2001 From: Andy Dodd Date: Wed, 28 Aug 2019 18:19:53 -0400 Subject: [PATCH 23/50] rtgui/guiutils - Improve behavior with smooth scrolling devices Devices such as trackpads will emit smooth scrolling (GDK_SMOOTH_SCROLL) events with deltas smaller than +/-1.0 at high frequency. Quantizing these to +/-1.0 leads to significant amplification of scroll speed to the point of unusability Scroll by delta instead of +/-1.0 in these cases, permitting smooth scrolling through panels that use this code Some mice emit GDK_SMOOTH_SCROLL with deltas of +/-1.0 per detent. This patch will not change behavior with such devices. However, if any mice emit deltas of smaller magnitude, the per-detent behavior will change. --- rtgui/guiutils.cc | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/rtgui/guiutils.cc b/rtgui/guiutils.cc index ec0bf6588..19762fd92 100644 --- a/rtgui/guiutils.cc +++ b/rtgui/guiutils.cc @@ -971,9 +971,8 @@ bool MyScrolledWindow::on_scroll_event (GdkEventScroll* event) scroll->set_value(value2); } } else if (event->direction == GDK_SCROLL_SMOOTH) { - if (abs(event->delta_y) > 0.1) { - value2 = rtengine::LIM(value + (event->delta_y > 0 ? step : -step), lowerBound, upperBound); - } + value2 = rtengine::LIM(value + event->delta_y * step, lowerBound, upperBound); + if (value2 != value) { scroll->set_value(value2); } From 1a6d1b038fa446d60715838344dd8cb25356d05b Mon Sep 17 00:00:00 2001 From: Andy Dodd Date: Wed, 28 Aug 2019 18:40:00 -0400 Subject: [PATCH 24/50] rtgui/cropwindow: Improve behavior with smooth scrolling devices Accumulate/coalesce GDK_SCROLL_SMOOTH events until we equal or exceed +/-1.0 This avoids having one zoom adjustment for every single event which makes touchpad zooming unusable due to frequent small deltas This makes trackpad zooming usable while having no effect on mice that emit GDK_SMOOTH_SCROLL with values of +/-1.0 instead of GDK_SCROLL_UP and GDK_SCROLL_DOWN If any mice exist that have scroll wheel detents but emit smaller values per detent, this may have the negative effect of requiring multiple detents per zoom level. It remains to be seen whether any mice behave like this. The discrete step implementation of zoomSteps requires us to coalesce events instead of smoothly zooming in and out. --- rtgui/cropwindow.cc | 15 ++++++++++----- rtgui/cropwindow.h | 1 + 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/rtgui/cropwindow.cc b/rtgui/cropwindow.cc index 575afd54b..1364855b0 100644 --- a/rtgui/cropwindow.cc +++ b/rtgui/cropwindow.cc @@ -51,7 +51,7 @@ CropWindow::CropWindow (ImageArea* parent, bool isLowUpdatePriority_, bool isDet backColor(options.bgcolor), decorated(true), isFlawnOver(false), titleHeight(30), sideBorderWidth(3), lowerBorderWidth(3), upperBorderWidth(1), sepWidth(2), xpos(30), ypos(30), width(0), height(0), imgAreaX(0), imgAreaY(0), imgAreaW(0), imgAreaH(0), imgX(-1), imgY(-1), imgW(1), imgH(1), iarea(parent), cropZoom(0), zoomVersion(0), exposeVersion(0), cropgl(nullptr), - pmlistener(nullptr), pmhlistener(nullptr), observedCropWin(nullptr), + pmlistener(nullptr), pmhlistener(nullptr), scrollAccum(0.0), observedCropWin(nullptr), crop_custom_ratio(0.f) { initZoomSteps(); @@ -295,11 +295,16 @@ void CropWindow::scroll (int state, GdkScrollDirection direction, int x, int y, } else { delta = deltaY; } - if (delta == 0.0 && direction == GDK_SCROLL_SMOOTH) { - // sometimes this case happens. To avoid zooming into the wrong direction in this case, we just do nothing - return; + + if (direction == GDK_SCROLL_SMOOTH) { + scrollAccum += delta; + //Only change zoom level if we've accumulated +/- 1.0 of deltas. This conditional handles the previous delta=0.0 case + if (abs(scrollAccum) < 1.0) { + return; + } } - bool isUp = direction == GDK_SCROLL_UP || (direction == GDK_SCROLL_SMOOTH && delta < 0.0); + bool isUp = direction == GDK_SCROLL_UP || (direction == GDK_SCROLL_SMOOTH && scrollAccum < 0.0); + scrollAccum = 0.0; if ((state & GDK_CONTROL_MASK) && onArea(ColorPicker, x, y)) { // resizing a color picker if (isUp) { diff --git a/rtgui/cropwindow.h b/rtgui/cropwindow.h index 26edf69ee..8c944cf0a 100644 --- a/rtgui/cropwindow.h +++ b/rtgui/cropwindow.h @@ -102,6 +102,7 @@ class CropWindow : public LWButtonListener, public CropDisplayHandler, public Ed PointerMotionListener* pmlistener; PointerMotionListener* pmhlistener; std::list listeners; + double scrollAccum; CropWindow* observedCropWin; // Pointer to the currently active detail CropWindow From 5ea18efeb862ec323e57eace05f98eec83812776 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sun, 1 Sep 2019 20:22:42 +0200 Subject: [PATCH 25/50] RT crashes on loading Hasselblad H6D-100cMS pixelshift files, fixes #5433 --- rtengine/rawimagesource.cc | 36 ++++++++++++++++++++++++++++++++++-- rtengine/rawimagesource.h | 6 +++--- rtengine/rtthumbnail.cc | 11 +++++++++++ rtgui/bayerprocess.cc | 2 +- 4 files changed, 49 insertions(+), 6 deletions(-) diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index e8eb17c31..838d49ce9 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -999,11 +999,43 @@ int RawImageSource::load (const Glib::ustring &fname, bool firstFrameOnly) if (errCode) { return errCode; } - numFrames = firstFrameOnly ? 1 : ri->getFrameCount(); + numFrames = firstFrameOnly ? (numFrames < 7 ? 1 : ri->getFrameCount()) : ri->getFrameCount(); errCode = 0; - if(numFrames > 1) { + if(numFrames >= 7) { + // special case to avoid crash when loading Hasselblad H6D-100cMS pixelshift files + // limit to 6 frames and skip first frame, as first frame is not bayer + if (firstFrameOnly) { + numFrames = 1; + } else { + numFrames = 6; + } +#ifdef _OPENMP99 + #pragma omp parallel +#endif + { + int errCodeThr = 0; +#ifdef _OPENMP99 + #pragma omp for nowait +#endif + for(unsigned int i = 0; i < numFrames; ++i) { + if(i == 0) { + riFrames[i] = ri; + errCodeThr = riFrames[i]->loadRaw (true, i + 1, true, plistener, 0.8); + } else { + riFrames[i] = new RawImage(fname); + errCodeThr = riFrames[i]->loadRaw (true, i + 1); + } + } +#ifdef _OPENMP99 + #pragma omp critical +#endif + { + errCode = errCodeThr ? errCodeThr : errCode; + } + } + } else if(numFrames > 1) { #ifdef _OPENMP #pragma omp parallel #endif diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index 7c50991c0..940773271 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -74,13 +74,13 @@ protected: bool rgbSourceModified; RawImage* ri; // Copy of raw pixels, NOT corrected for initial gain, blackpoint etc. - RawImage* riFrames[4] = {nullptr}; + RawImage* riFrames[6] = {nullptr}; unsigned int currFrame = 0; unsigned int numFrames = 0; int flatFieldAutoClipValue = 0; array2D rawData; // holds preprocessed pixel values, rowData[i][j] corresponds to the ith row and jth column - array2D *rawDataFrames[4] = {nullptr}; - array2D *rawDataBuffer[3] = {nullptr}; + array2D *rawDataFrames[6] = {nullptr}; + array2D *rawDataBuffer[5] = {nullptr}; // the interpolated green plane: array2D green; diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index 2a35176e6..5efb75d48 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -547,6 +547,17 @@ Thumbnail* Thumbnail::loadFromRaw (const Glib::ustring& fname, RawMetaDataLocati return nullptr; } + if (ri->getFrameCount() == 7) { + // special case for Hasselblad H6D-100cMS pixelshift files + // first frame is not bayer, load second frame + int r = ri->loadRaw (1, 1, 0); + + if ( r ) { + delete ri; + sensorType = ST_NONE; + return nullptr; + } + } sensorType = ri->getSensorType(); int width = ri->get_width(); diff --git a/rtgui/bayerprocess.cc b/rtgui/bayerprocess.cc index 6f38f4c43..c361ded16 100644 --- a/rtgui/bayerprocess.cc +++ b/rtgui/bayerprocess.cc @@ -729,7 +729,7 @@ void BayerProcess::FrameCountChanged(int n, int frameNum) imageNumber->remove_all(); imageNumber->append("1"); - for (int i = 2; i <= std::min(n, 4); ++i) { + for (int i = 2; i <= std::min(n, 6); ++i) { std::ostringstream entry; entry << i; imageNumber->append(entry.str()); From bb97a30058b38d34f33fc388ecf3a7d6156ffbbb Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sun, 1 Sep 2019 21:39:28 +0200 Subject: [PATCH 26/50] Update rawimagesource.cc Enable parallel decoding for Hasselblad H6D-100cMS pixelshift frames --- rtengine/rawimagesource.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 838d49ce9..a1762af93 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -1011,12 +1011,12 @@ int RawImageSource::load (const Glib::ustring &fname, bool firstFrameOnly) } else { numFrames = 6; } -#ifdef _OPENMP99 +#ifdef _OPENMP #pragma omp parallel #endif { int errCodeThr = 0; -#ifdef _OPENMP99 +#ifdef _OPENMP #pragma omp for nowait #endif for(unsigned int i = 0; i < numFrames; ++i) { @@ -1028,7 +1028,7 @@ int RawImageSource::load (const Glib::ustring &fname, bool firstFrameOnly) errCodeThr = riFrames[i]->loadRaw (true, i + 1); } } -#ifdef _OPENMP99 +#ifdef _OPENMP #pragma omp critical #endif { From fb51c4ca920f840d250938324f64ac06f828d3c5 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 3 Sep 2019 17:08:37 +0200 Subject: [PATCH 27/50] capture sharpening: Fix crash when using gamma < 1.0, #5412 --- rtengine/capturesharpening.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtengine/capturesharpening.cc b/rtengine/capturesharpening.cc index 71cefaca6..eb95d2633 100644 --- a/rtengine/capturesharpening.cc +++ b/rtengine/capturesharpening.cc @@ -192,7 +192,7 @@ BENCHFUN #ifdef __SSE2__ const vfloat gammav = F2V(gamma); for (; j < W - 3; j += 4) { - const vfloat factor = pow_F(LVFU(YNew[i][j]) / vmaxf(LVFU(YOld[i][j]), F2V(0.00001f)), gammav); + const vfloat factor = pow_F(vmaxf(LVFU(YNew[i][j]), ZEROV) / vmaxf(LVFU(YOld[i][j]), F2V(0.00001f)), gammav); STVFU(red[i][j], LVFU(redVals[i][j]) * factor); STVFU(green[i][j], LVFU(greenVals[i][j]) * factor); STVFU(blue[i][j], LVFU(blueVals[i][j]) * factor); @@ -200,7 +200,7 @@ BENCHFUN #endif for (; j < W; ++j) { - const float factor = pow_F(YNew[i][j] / std::max(YOld[i][j], 0.00001f), gamma); + const float factor = pow_F(std::max(YNew[i][j], 0.f) / std::max(YOld[i][j], 0.00001f), gamma); red[i][j] = redVals[i][j] * factor; green[i][j] = greenVals[i][j] * factor; blue[i][j] = blueVals[i][j] * factor; From ce04447c7a98b675071f565b0dfe38aedcf41fd9 Mon Sep 17 00:00:00 2001 From: Hombre Date: Tue, 3 Sep 2019 22:18:20 +0200 Subject: [PATCH 28/50] Fix crash while rotating several thumbnails in File Browser Fix issue #4858 and possibly #5310 --- rtengine/rtthumbnail.cc | 28 ++++++++++++---------- rtgui/filebrowserentry.cc | 43 +++++++++++++++++++++++++++++++--- rtgui/thumbbrowserentrybase.cc | 9 ++++--- rtgui/thumbnail.h | 10 ++++---- 4 files changed, 66 insertions(+), 24 deletions(-) diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index 5efb75d48..1ffaf939a 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -1483,6 +1483,7 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT delete labView; delete baseImg; + /* // calculate scale if (params.coarse.rotate == 90 || params.coarse.rotate == 270) { myscale = scale * thumbImg->getWidth() / fh; @@ -1491,19 +1492,20 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT } myscale = 1.0 / myscale; - /* // apply crop - if (params.crop.enabled) { - int ix = 0; - for (int i=0; i(params.crop.y+params.crop.h)/myscale || j(params.crop.x+params.crop.w)/myscale) { - readyImg->data[ix++] /= 3; - readyImg->data[ix++] /= 3; - readyImg->data[ix++] /= 3; - } - else - ix += 3; - }*/ + // apply crop + if (params.crop.enabled) { + int ix = 0; + for (int i=0; i(params.crop.y+params.crop.h)/myscale || j(params.crop.x+params.crop.w)/myscale) { + readyImg->data[ix++] /= 3; + readyImg->data[ix++] /= 3; + readyImg->data[ix++] /= 3; + } + else + ix += 3; + } + */ return readyImg; } diff --git a/rtgui/filebrowserentry.cc b/rtgui/filebrowserentry.cc index 8b518335c..87a48a7ea 100644 --- a/rtgui/filebrowserentry.cc +++ b/rtgui/filebrowserentry.cc @@ -255,17 +255,20 @@ void FileBrowserEntry::_updateImage(rtengine::IImage8* img, double s, const rten const bool resize = !preview || prew != img->getWidth(); prew = img->getWidth (); - GThreadLock lock; - // Check if image has been rotated since last time rotated = preview && newLandscape != landscape; if (resize) { - delete [] preview; + if (preview) { + delete [] preview; + } preview = new guint8 [prew * preh * 3]; } memcpy(preview, img->getData(), prew * preh * 3); + { + GThreadLock lock; updateBackBuffer (); + } } landscape = newLandscape; @@ -318,24 +321,36 @@ bool FileBrowserEntry::motionNotify (int x, int y) cropParams->y = action_y + (y - press_y) / scale; cropParams->h += oy - cropParams->y; cropgl->cropHeight1Resized (cropParams->x, cropParams->y, cropParams->w, cropParams->h, crop_custom_ratio); + { + MYREADERLOCK(l, lockRW); updateBackBuffer (); + } parent->redrawNeeded (this); } else if (state == SResizeH2 && cropgl) { cropParams->h = action_y + (y - press_y) / scale; cropgl->cropHeight2Resized (cropParams->x, cropParams->y, cropParams->w, cropParams->h, crop_custom_ratio); + { + MYREADERLOCK(l, lockRW); updateBackBuffer (); + } parent->redrawNeeded (this); } else if (state == SResizeW1 && cropgl) { int ox = cropParams->x; cropParams->x = action_x + (x - press_x) / scale; cropParams->w += ox - cropParams->x; cropgl->cropWidth1Resized (cropParams->x, cropParams->y, cropParams->w, cropParams->h, crop_custom_ratio); + { + MYREADERLOCK(l, lockRW); updateBackBuffer (); + } parent->redrawNeeded (this); } else if (state == SResizeW2 && cropgl) { cropParams->w = action_x + (x - press_x) / scale; cropgl->cropWidth2Resized (cropParams->x, cropParams->y, cropParams->w, cropParams->h, crop_custom_ratio); + { + MYREADERLOCK(l, lockRW); updateBackBuffer (); + } parent->redrawNeeded (this); } else if (state == SResizeTL && cropgl) { int ox = cropParams->x; @@ -345,7 +360,10 @@ bool FileBrowserEntry::motionNotify (int x, int y) cropParams->y = action_y + (y - press_y) / scale; cropParams->h += oy - cropParams->y; cropgl->cropTopLeftResized (cropParams->x, cropParams->y, cropParams->w, cropParams->h, crop_custom_ratio); + { + MYREADERLOCK(l, lockRW); updateBackBuffer (); + } parent->redrawNeeded (this); } else if (state == SResizeTR && cropgl) { cropParams->w = action_x + (x - press_x) / scale; @@ -353,7 +371,10 @@ bool FileBrowserEntry::motionNotify (int x, int y) cropParams->y = action_y + (y - press_y) / scale; cropParams->h += oy - cropParams->y; cropgl->cropTopRightResized (cropParams->x, cropParams->y, cropParams->w, cropParams->h, crop_custom_ratio); + { + MYREADERLOCK(l, lockRW); updateBackBuffer (); + } parent->redrawNeeded (this); } else if (state == SResizeBL && cropgl) { int ox = cropParams->x; @@ -361,19 +382,28 @@ bool FileBrowserEntry::motionNotify (int x, int y) cropParams->w += ox - cropParams->x; cropParams->h = action_y + (y - press_y) / scale; cropgl->cropBottomLeftResized (cropParams->x, cropParams->y, cropParams->w, cropParams->h, crop_custom_ratio); + { + MYREADERLOCK(l, lockRW); updateBackBuffer (); + } parent->redrawNeeded (this); } else if (state == SResizeBR && cropgl) { cropParams->w = action_x + (x - press_x) / scale; cropParams->h = action_y + (y - press_y) / scale; cropgl->cropBottomRightResized (cropParams->x, cropParams->y, cropParams->w, cropParams->h, crop_custom_ratio); + { + MYREADERLOCK(l, lockRW); updateBackBuffer (); + } parent->redrawNeeded (this); } else if (state == SCropMove && cropgl) { cropParams->x = action_x + (x - press_x) / scale; cropParams->y = action_y + (y - press_y) / scale; cropgl->cropMoved (cropParams->x, cropParams->y, cropParams->w, cropParams->h); + { + MYREADERLOCK(l, lockRW); updateBackBuffer (); + } parent->redrawNeeded (this); } else if (state == SCropSelecting && cropgl) { int cx1 = press_x, cy1 = press_y; @@ -396,7 +426,10 @@ bool FileBrowserEntry::motionNotify (int x, int y) cropParams->h = cy1 - cy2 + 1; } + { + MYREADERLOCK(l, lockRW); updateBackBuffer (); + } parent->redrawNeeded (this); } @@ -564,6 +597,7 @@ bool FileBrowserEntry::releaseNotify (int button, int type, int bstate, int x, i bool FileBrowserEntry::onArea (CursorArea a, int x, int y) { + MYREADERLOCK(l, lockRW); if (!drawable || !preview) { return false; } @@ -764,6 +798,8 @@ void FileBrowserEntry::drawStraightenGuide (Cairo::RefPtr cr) int y2 = action_y; int x2 = action_x; + { + MYREADERLOCK(l, lockRW); if (x2 < prex + ofsX + startx) { y2 = y1 - (double)(y1 - y2) * (x1 - (prex + ofsX + startx)) / (x1 - x2); x2 = prex + ofsX + startx; @@ -779,6 +815,7 @@ void FileBrowserEntry::drawStraightenGuide (Cairo::RefPtr cr) x2 = x1 - (double)(x1 - x2) * (y1 - (preh + prey + ofsY + starty - 1)) / (y1 - y2); y2 = preh + prey + ofsY + starty - 1; } + } cr->set_line_width (1.5); cr->set_source_rgb (1.0, 1.0, 1.0); diff --git a/rtgui/thumbbrowserentrybase.cc b/rtgui/thumbbrowserentrybase.cc index e660e794b..4dacb1adf 100644 --- a/rtgui/thumbbrowserentrybase.cc +++ b/rtgui/thumbbrowserentrybase.cc @@ -494,6 +494,7 @@ void ThumbBrowserEntryBase::resize (int h) height = h; int old_preh = preh; + int old_prew = prew; // dimensions of the button set int bsw = 0, bsh = 0; @@ -555,9 +556,11 @@ void ThumbBrowserEntryBase::resize (int h) width = bsw + 2 * sideMargin + 2 * borderWidth; } - if (preh != old_preh) { - delete [] preview; - preview = nullptr; + if (preh != old_preh || prew != old_prew) { // if new thumbnail height or new orientation + if (preview) { + delete [] preview; + preview = nullptr; + } refreshThumbnailImage (); } else if (backBuffer) { backBuffer->setDirty(true); // This will force a backBuffer update on queue_draw diff --git a/rtgui/thumbnail.h b/rtgui/thumbnail.h index 0bcdd470a..e3196778c 100644 --- a/rtgui/thumbnail.h +++ b/rtgui/thumbnail.h @@ -49,17 +49,17 @@ class Thumbnail rtengine::Thumbnail* tpp; int tw, th; // dimensions of timgdata (it stores tpp->width and tpp->height in processed mode for simplicity) float imgRatio; // hack to avoid rounding error -// double scale; // portion of the sizes of the processed thumbnail image and the full scale image +// double scale; // portion of the sizes of the processed thumbnail image and the full scale image const std::unique_ptr pparams; bool pparamsValid; bool imageLoading; // these are the data of the result image of the last getthumbnailimage call (for caching purposes) - unsigned char* lastImg; - int lastW; - int lastH; - double lastScale; + unsigned char* lastImg; // pointer to the processed and scaled base ImageIO image + int lastW; // non rotated width of the cached ImageIO image + int lastH; // non rotated height of the cached ImageIO image + double lastScale; // scale of the cached ImageIO image // exif & date/time strings Glib::ustring exifString; From e9ac64a49534f2d130cc9e4a567c505f79a905e1 Mon Sep 17 00:00:00 2001 From: Roel Baars <6567747+Thanatomanic@users.noreply.github.com> Date: Wed, 4 Sep 2019 19:35:13 +0200 Subject: [PATCH 29/50] Fixes #5436 --- rtgui/histogrampanel.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index 12da0cc0d..ae5ca1e4f 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -151,6 +151,8 @@ HistogramPanel::HistogramPanel () else showMode->set_image(*mode2Image); showBAR->set_image (showBAR->get_active() ? *barImage : *barImage_g); + + raw_toggled(); // Make sure the luma/chroma toggles are enabled or disabled setExpandAlignProperties(showRed , false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); setExpandAlignProperties(showGreen, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); From 20ca4946b53eac795fe620b941dbbf7dda19a4fd Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Wed, 4 Sep 2019 22:05:24 +0200 Subject: [PATCH 30/50] Improve SAMSUNG EX2F support #1897 Improved raw crop eliminates white border on ISO >=800 shots, lower ISO shots did not exhibit white border. Patch by Ingo Weyrich --- rtengine/camconst.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/rtengine/camconst.json b/rtengine/camconst.json index 4dbfe80f9..7f481e104 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -2250,6 +2250,11 @@ Camera constants: } }, + { // Quality C, only raw crop + "make_model": "Samsung EX2F", + "raw_crop": [ 16, 7, -4, -4 ] + }, + { // Quality B, corrections for raw crop vs dcraw9.21, matched to Samsung's default "make_model": "Samsung NX mini", "dcraw_matrix": [ 5222,-1196,-550,-6540,14649,2009,-1666,2819,5657 ], // dng 8.6 d65 From d0c6440af94b147f79d42ec182541a43c4de7c07 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Wed, 4 Sep 2019 22:12:53 +0200 Subject: [PATCH 31/50] Suppress debug output in CA correction Debug output still visible in verbose mode. Closes #5437 --- rtengine/CA_correct_RT.cc | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/rtengine/CA_correct_RT.cc b/rtengine/CA_correct_RT.cc index bad95a4d8..46a62cc4b 100644 --- a/rtengine/CA_correct_RT.cc +++ b/rtengine/CA_correct_RT.cc @@ -106,6 +106,10 @@ bool LinEqSolve(int nDim, double* pfMatr, double* pfVect, double* pfSolution) //end of linear equation solver } +namespace rtengine { + extern const Settings* settings; +} + using namespace std; using namespace rtengine; @@ -701,7 +705,9 @@ float* RawImageSource::CA_correct_RT( blockvar[dir][c] = blocksqave[dir][c] / blockdenom[dir][c] - SQR(blockave[dir][c] / blockdenom[dir][c]); } else { processpasstwo = false; - std::cout << "blockdenom vanishes" << std::endl; + if (settings->verbose) { + std::cout << "blockdenom vanishes" << std::endl; + } break; } } @@ -801,7 +807,9 @@ float* RawImageSource::CA_correct_RT( numpar = 4; if (numblox[1] < 10) { - std::cout << "numblox = " << numblox[1] << std::endl; + if (settings->verbose) { + std::cout << "numblox = " << numblox[1] << std::endl; + } processpasstwo = false; } } From 500fac34cd539e60ecb1788226d5de25b68cf05a Mon Sep 17 00:00:00 2001 From: Hombre Date: Thu, 5 Sep 2019 01:09:48 +0200 Subject: [PATCH 32/50] The svg2png icon cache is now cleared on new minor version The `version` value from the `Options` file is compared to the harcoded value (computed at build time) of the running application. If the major or minor version is different, the `svg2png` folder is cleaned at startup-time. --- rtgui/options.cc | 12 ++++++++++++ rtgui/options.h | 1 + rtgui/rtimage.cc | 4 ++-- rtgui/rtimage.h | 2 +- rtgui/rtscalable.cc | 4 ++-- rtgui/rtscalable.h | 2 +- rtgui/rtwindow.cc | 13 ++++--------- rtgui/rtwindow.h | 1 - 8 files changed, 23 insertions(+), 16 deletions(-) diff --git a/rtgui/options.cc b/rtgui/options.cc index 640aa0243..b667f8679 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -2475,6 +2475,18 @@ bool Options::has_retained_extention(const Glib::ustring& fname) return parsedExtensionsSet.find(getExtension(fname).lowercase()) != parsedExtensionsSet.end(); } +// Pattern matches "5.1" from "5.1-23-g12345678", when comparing option.version to RTVERSION +bool Options::is_new_version() { + const std::string vs[] = {versionString, version}; + std::vector vMajor; + + for (const auto& v : vs) { + vMajor.emplace_back(v, 0, v.find_first_not_of("0123456789.")); + } + + return vMajor.size() == 2 && vMajor[0] != vMajor[1]; +} + /* * return true if ext is an enabled extension */ diff --git a/rtgui/options.h b/rtgui/options.h index d1d14a11f..0c580b034 100644 --- a/rtgui/options.h +++ b/rtgui/options.h @@ -426,6 +426,7 @@ public: Glib::ustring findProfilePath (Glib::ustring &profName); bool is_parse_extention (Glib::ustring fname); bool has_retained_extention (const Glib::ustring& fname); + bool is_new_version(); bool is_extention_enabled (const Glib::ustring& ext); bool is_defProfRawMissing(); bool is_bundledDefProfRawMissing(); diff --git a/rtgui/rtimage.cc b/rtgui/rtimage.cc index 3fdf743f5..5ae3e4ddb 100644 --- a/rtgui/rtimage.cc +++ b/rtgui/rtimage.cc @@ -169,7 +169,7 @@ void RTImage::init() scaleBack = RTScalable::getScale(); } -void RTImage::cleanup() +void RTImage::cleanup(bool all) { for (auto& entry : pixbufCache) { entry.second.reset(); @@ -177,7 +177,7 @@ void RTImage::cleanup() for (auto& entry : surfaceCache) { entry.second.clear(); } - RTScalable::cleanup(); + RTScalable::cleanup(all); } void RTImage::updateImages() diff --git a/rtgui/rtimage.h b/rtgui/rtimage.h index 244d0030a..15978f65c 100644 --- a/rtgui/rtimage.h +++ b/rtgui/rtimage.h @@ -52,7 +52,7 @@ public: static void init(); - static void cleanup(); + static void cleanup(bool all = false); static void updateImages (); static void setDPInScale (const double newDPI, const int newScale); static void setScale (const int newScale); diff --git a/rtgui/rtscalable.cc b/rtgui/rtscalable.cc index 079ece8d2..ae3214520 100644 --- a/rtgui/rtscalable.cc +++ b/rtgui/rtscalable.cc @@ -119,7 +119,7 @@ void RTScalable::deleteDir(const Glib::ustring& path) } } -void RTScalable::cleanup() +void RTScalable::cleanup(bool all) { Glib::ustring imagesCacheFolder = Glib::build_filename (options.cacheBaseDir, "svg2png"); Glib::ustring sDPI = Glib::ustring::compose("%1", (int)getTweakedDPI()); @@ -134,7 +134,7 @@ void RTScalable::cleanup() continue; } - if (fileName != sDPI) { + if (all || fileName != sDPI) { deleteDir(filePath); } } diff --git a/rtgui/rtscalable.h b/rtgui/rtscalable.h index e6180eaa1..b8db9953c 100644 --- a/rtgui/rtscalable.h +++ b/rtgui/rtscalable.h @@ -50,7 +50,7 @@ public: #endif static void init(Gtk::Window *window); - static void cleanup(); + static void cleanup(bool all = false); static double getDPI (); static double getTweakedDPI (); // The returned value is tweaked DPI to adapt to main the font size. Maybe not an ideal solution. static int getScale (); diff --git a/rtgui/rtwindow.cc b/rtgui/rtwindow.cc index 85b902727..131016cb0 100644 --- a/rtgui/rtwindow.cc +++ b/rtgui/rtwindow.cc @@ -95,6 +95,9 @@ RTWindow::RTWindow () , fpanel (nullptr) { + if (options.is_new_version()) { + RTImage::cleanup(true); + } cacheMgr->init (); ProfilePanel::init (this); @@ -475,16 +478,8 @@ void RTWindow::on_realize () mainWindowCursorManager.init (get_window()); // Display release notes only if new major version. - // Pattern matches "5.1" from "5.1-23-g12345678" - const std::string vs[] = {versionString, options.version}; - std::vector vMajor; - - for (const auto& v : vs) { - vMajor.emplace_back(v, 0, v.find_first_not_of("0123456789.")); - } - bool waitForSplash = false; - if (vMajor.size() == 2 && vMajor[0] != vMajor[1]) { + if (options.is_new_version()) { // Update the version parameter with the right value options.version = versionString; diff --git a/rtgui/rtwindow.h b/rtgui/rtwindow.h index d037d8875..48662858f 100644 --- a/rtgui/rtwindow.h +++ b/rtgui/rtwindow.h @@ -53,7 +53,6 @@ private: { return !options.tabbedUI && ! (options.multiDisplayMode > 0); }; - void findVerNumbers (int* numbers, Glib::ustring versionStr); bool on_expose_event_epanel (GdkEventExpose* event); bool on_expose_event_fpanel (GdkEventExpose* event); From 10a346113f6ccbabfd2cfd4a36914f5cb6cbf505 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Thu, 5 Sep 2019 01:44:45 +0200 Subject: [PATCH 33/50] Increase visibility of blue histogram, closes #5438 --- rtgui/histogrampanel.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index ae5ca1e4f..b82df7ebf 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -142,7 +142,7 @@ HistogramPanel::HistogramPanel () showGreen->set_image (showGreen->get_active() ? *greenImage : *greenImage_g); showBlue->set_image (showBlue->get_active() ? *blueImage : *blueImage_g); showValue->set_image (showValue->get_active() ? *valueImage : *valueImage_g); - showChro->set_image (showChro->get_active() ? *chroImage : *chroImage_g); + showChro->set_image (showChro->get_active() ? *chroImage : *chroImage_g); showRAW->set_image (showRAW->get_active() ? *rawImage : *rawImage_g); if (options.histogramDrawMode == 0) showMode->set_image(*mode0Image); @@ -504,7 +504,7 @@ void HistogramRGBArea::updateBackBuffer (int r, int g, int b, const Glib::ustrin if (needBlue) { // Blue - cc->set_source_rgb(0.0, 0.0, 1.0); + cc->set_source_rgb(0.0, 0.4, 1.0); if (options.histogramDrawMode < 2) { cc->move_to(b * (winw - 1.) / 255.0 + 0.5*s, 0); cc->line_to(b * (winw - 1.) / 255.0 + 0.5*s, winh - 0); @@ -964,7 +964,7 @@ void HistogramArea::updateBackBuffer () if (needBlue) { drawCurve(cr, bhchanged, realhistheight, w, h); - cr->set_source_rgb (0.0, 0.0, 1.0); + cr->set_source_rgb (0.0, 0.4, 1.0); cr->stroke (); drawMarks(cr, bhchanged, realhistheight, w, ui, oi); } From 9165d0acb7ba312d6eb57010cbf48f3eb0688602 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 5 Sep 2019 12:08:36 +0200 Subject: [PATCH 34/50] Crop area not shown on File Browser window thumbnails, fixes #5440 --- rtengine/rtthumbnail.cc | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index 1ffaf939a..2c78e84bf 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -1483,29 +1483,33 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT delete labView; delete baseImg; - /* - // calculate scale - if (params.coarse.rotate == 90 || params.coarse.rotate == 270) { - myscale = scale * thumbImg->getWidth() / fh; - } else { - myscale = scale * thumbImg->getHeight() / fh; - } - myscale = 1.0 / myscale; + // apply crop if (params.crop.enabled) { + double lscale; + // calculate scale + if (params.coarse.rotate == 90 || params.coarse.rotate == 270) { + lscale = scale * thumbImg->getWidth() / fh; + } else { + lscale = scale * thumbImg->getHeight() / fh; + } + + lscale = 1.0 / lscale; int ix = 0; - for (int i=0; i(params.crop.y+params.crop.h)/myscale || j(params.crop.x+params.crop.w)/myscale) { + for (int i = 0; i < fh; ++i) { + for (int j = 0; j < fw; ++j) { + if (i < params.crop.y * lscale || i > (params.crop.y + params.crop.h) * lscale || j < params.crop.x * lscale || j > (params.crop.x + params.crop.w) * lscale) { readyImg->data[ix++] /= 3; readyImg->data[ix++] /= 3; readyImg->data[ix++] /= 3; - } - else + } else { ix += 3; + } + } + } } - */ + return readyImg; } From 11bf7e5eb5e79642feafcc9b9217b43a39824d75 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 5 Sep 2019 15:16:24 +0200 Subject: [PATCH 35/50] fix broken crop lines in file browser, fixes #5440 --- rtengine/rtthumbnail.cc | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index 2c78e84bf..3e970ed0d 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -1483,23 +1483,20 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT delete labView; delete baseImg; + // calculate scale + if (params.coarse.rotate == 90 || params.coarse.rotate == 270) { + myscale = scale * thumbImg->getWidth() / fh; + } else { + myscale = scale * thumbImg->getHeight() / fh; + } - + myscale = 1.0 / myscale; // apply crop if (params.crop.enabled) { - double lscale; - // calculate scale - if (params.coarse.rotate == 90 || params.coarse.rotate == 270) { - lscale = scale * thumbImg->getWidth() / fh; - } else { - lscale = scale * thumbImg->getHeight() / fh; - } - - lscale = 1.0 / lscale; int ix = 0; for (int i = 0; i < fh; ++i) { for (int j = 0; j < fw; ++j) { - if (i < params.crop.y * lscale || i > (params.crop.y + params.crop.h) * lscale || j < params.crop.x * lscale || j > (params.crop.x + params.crop.w) * lscale) { + if (i < params.crop.y * myscale || i > (params.crop.y + params.crop.h) * myscale || j < params.crop.x * myscale || j > (params.crop.x + params.crop.w) * myscale) { readyImg->data[ix++] /= 3; readyImg->data[ix++] /= 3; readyImg->data[ix++] /= 3; From b858bfb2c98a0dd4dd75cd607fd0e57af279c96f Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Fri, 6 Sep 2019 22:15:37 +0200 Subject: [PATCH 36/50] Update "Advanced" tab shortcut to Alt-a Back when it was called the "Wavelet" tab the Alt-w shortcut was used. Closes #4322 --- rtdata/languages/Catala | 2 +- rtdata/languages/Chinese (Simplified) | 2 +- rtdata/languages/Czech | 2 +- rtdata/languages/Deutsch | 2 +- rtdata/languages/English (UK) | 2 +- rtdata/languages/English (US) | 2 +- rtdata/languages/Espanol | 2 +- rtdata/languages/Francais | 2 +- rtdata/languages/Italiano | 2 +- rtdata/languages/Japanese | 2 +- rtdata/languages/Magyar | 2 +- rtdata/languages/Nederlands | 2 +- rtdata/languages/Polish | 2 +- rtdata/languages/Portugues | 2 +- rtdata/languages/Portugues (Brasil) | 2 +- rtdata/languages/Russian | 2 +- rtdata/languages/Serbian (Cyrilic Characters) | 2 +- rtdata/languages/Swedish | 2 +- rtdata/languages/default | 2 +- rtgui/toolpanelcoord.cc | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/rtdata/languages/Catala b/rtdata/languages/Catala index 8b2bc5992..407348417 100644 --- a/rtdata/languages/Catala +++ b/rtdata/languages/Catala @@ -1423,7 +1423,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. !MAIN_MSG_WRITEFAILED;Failed to write\n"%1"\n\nMake sure that the folder exists and that you have write permission to it. !MAIN_TAB_ADVANCED;Advanced -!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w +!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-a !MAIN_TAB_FAVORITES;Favorites !MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u !MAIN_TAB_INSPECT; Inspect diff --git a/rtdata/languages/Chinese (Simplified) b/rtdata/languages/Chinese (Simplified) index b01c39d84..b93aed7af 100644 --- a/rtdata/languages/Chinese (Simplified) +++ b/rtdata/languages/Chinese (Simplified) @@ -1468,7 +1468,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. !MAIN_MSG_WRITEFAILED;Failed to write\n"%1"\n\nMake sure that the folder exists and that you have write permission to it. !MAIN_TAB_ADVANCED;Advanced -!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w +!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-a !MAIN_TAB_FAVORITES;Favorites !MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u !MAIN_TOOLTIP_BACKCOLOR0;Background color of the preview: theme-based\nShortcut: 9 diff --git a/rtdata/languages/Czech b/rtdata/languages/Czech index ce16e057f..d0b4d89f3 100644 --- a/rtdata/languages/Czech +++ b/rtdata/languages/Czech @@ -934,7 +934,7 @@ MAIN_MSG_SETPATHFIRST;K použití této funkce musíte nejprve zadat cílovou ce MAIN_MSG_TOOMANYOPENEDITORS;Příliš mnoho otevřených editorů.\nPro pokračování nejprve některý ukončete. MAIN_MSG_WRITEFAILED;Chyba zápisu\n"%1"\n\nUjistěte se, že složka existuje a máte práva do ní zapisovat. MAIN_TAB_ADVANCED;Pokročilé -MAIN_TAB_ADVANCED_TOOLTIP;Zkratka: Alt-w +MAIN_TAB_ADVANCED_TOOLTIP;Zkratka: Alt-a MAIN_TAB_COLOR;Barvy MAIN_TAB_COLOR_TOOLTIP;Zkratka: Alt-c MAIN_TAB_DETAIL;Detaily diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index 7967786dd..57236e1e6 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -984,7 +984,7 @@ MAIN_MSG_SETPATHFIRST;Um diese Funktion zu nutzen, müssen Sie zuerst in den Ein MAIN_MSG_TOOMANYOPENEDITORS;Zu viele geöffnete Editorfenster.\nUm fortzufahren, schließen sie bitte ein Editorfenster. MAIN_MSG_WRITEFAILED;Fehler beim Schreiben von\n\n"%1"\n\nStellen Sie sicher, dass das Verzeichnis existiert und dass Sie Schreibrechte besitzen. MAIN_TAB_ADVANCED;Erweitert -MAIN_TAB_ADVANCED_TOOLTIP;Taste: Alt + w +MAIN_TAB_ADVANCED_TOOLTIP;Taste: Alt + a MAIN_TAB_COLOR;Farbe MAIN_TAB_COLOR_TOOLTIP;Taste: Alt + c MAIN_TAB_DETAIL;Details diff --git a/rtdata/languages/English (UK) b/rtdata/languages/English (UK) index 503e63860..c6b521c12 100644 --- a/rtdata/languages/English (UK) +++ b/rtdata/languages/English (UK) @@ -990,7 +990,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. !MAIN_MSG_WRITEFAILED;Failed to write\n"%1"\n\nMake sure that the folder exists and that you have write permission to it. !MAIN_TAB_ADVANCED;Advanced -!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w +!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-a !MAIN_TAB_COLOR_TOOLTIP;Shortcut: Alt-c !MAIN_TAB_DETAIL;Detail !MAIN_TAB_DETAIL_TOOLTIP;Shortcut: Alt-d diff --git a/rtdata/languages/English (US) b/rtdata/languages/English (US) index 52caa23e4..9b8eda038 100644 --- a/rtdata/languages/English (US) +++ b/rtdata/languages/English (US) @@ -902,7 +902,7 @@ !MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. !MAIN_MSG_WRITEFAILED;Failed to write\n"%1"\n\nMake sure that the folder exists and that you have write permission to it. !MAIN_TAB_ADVANCED;Advanced -!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w +!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-a !MAIN_TAB_COLOR;Color !MAIN_TAB_COLOR_TOOLTIP;Shortcut: Alt-c !MAIN_TAB_DETAIL;Detail diff --git a/rtdata/languages/Espanol b/rtdata/languages/Espanol index c91bd4a6b..1e3b84371 100644 --- a/rtdata/languages/Espanol +++ b/rtdata/languages/Espanol @@ -954,7 +954,7 @@ MAIN_MSG_SETPATHFIRST;Para poder usar esta función, primero tiene que establece MAIN_MSG_TOOMANYOPENEDITORS;Demasiados editores abiertos.\nPor favor cierre un editor para continuar. MAIN_MSG_WRITEFAILED;Falla al escribir\n\n"%1"\n\nAsegurese de que el folder exista y que usted tenga permiso de escritura sobre él. MAIN_TAB_ADVANCED;Avanzado -MAIN_TAB_ADVANCED_TOOLTIP;Tecla de Atajo: Alt-w +MAIN_TAB_ADVANCED_TOOLTIP;Tecla de Atajo: Alt-a MAIN_TAB_COLOR;Color MAIN_TAB_COLOR_TOOLTIP;Tecla de Atajo: Alt-C MAIN_TAB_DETAIL;Detalle diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais index 2c5017a6e..082cff1f1 100644 --- a/rtdata/languages/Francais +++ b/rtdata/languages/Francais @@ -889,7 +889,7 @@ MAIN_MSG_SETPATHFIRST;Vous devez d'abord choisir un dossier cible dans Préfére MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. MAIN_MSG_WRITEFAILED;Échec de l'enregistrement du fichier\n\n"%1"\n\nAssurez-vous que le dossier existe et qu'il est permis d'y écrire. MAIN_TAB_ADVANCED;Avancé -MAIN_TAB_ADVANCED_TOOLTIP;Raccourci: Alt-w +MAIN_TAB_ADVANCED_TOOLTIP;Raccourci: Alt-a MAIN_TAB_COLOR;Couleur MAIN_TAB_COLOR_TOOLTIP;Raccourci:Alt-c MAIN_TAB_DETAIL;Détail diff --git a/rtdata/languages/Italiano b/rtdata/languages/Italiano index 977277a73..f11423d7a 100644 --- a/rtdata/languages/Italiano +++ b/rtdata/languages/Italiano @@ -1640,7 +1640,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !MAIN_FRAME_PLACES_DEL;Remove !MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. !MAIN_TAB_ADVANCED;Advanced -!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w +!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-a !MAIN_TAB_FAVORITES;Favorites !MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u !MAIN_TAB_INSPECT; Inspect diff --git a/rtdata/languages/Japanese b/rtdata/languages/Japanese index 96ffea174..16dafb297 100644 --- a/rtdata/languages/Japanese +++ b/rtdata/languages/Japanese @@ -933,7 +933,7 @@ MAIN_MSG_SETPATHFIRST;この関数を使用するには、最初に環境設定 MAIN_MSG_TOOMANYOPENEDITORS;編集画面が多すぎます\n操作を続けるには何れかの画面を閉じてください MAIN_MSG_WRITEFAILED;書き込みに失敗しました\n\n"%1"\n\nフォルダが在るか書き込み権限を持っているか確認してください MAIN_TAB_ADVANCED;高度な機能 -MAIN_TAB_ADVANCED_TOOLTIP;ショートカット: Alt-w +MAIN_TAB_ADVANCED_TOOLTIP;ショートカット: Alt-a MAIN_TAB_COLOR;カラー MAIN_TAB_COLOR_TOOLTIP;ショートカット: Alt-c MAIN_TAB_DETAIL;CbDL diff --git a/rtdata/languages/Magyar b/rtdata/languages/Magyar index 26f1b1aa0..5879bf130 100644 --- a/rtdata/languages/Magyar +++ b/rtdata/languages/Magyar @@ -1357,7 +1357,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. !MAIN_MSG_WRITEFAILED;Failed to write\n"%1"\n\nMake sure that the folder exists and that you have write permission to it. !MAIN_TAB_ADVANCED;Advanced -!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w +!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-a !MAIN_TAB_FAVORITES;Favorites !MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u !MAIN_TAB_INSPECT; Inspect diff --git a/rtdata/languages/Nederlands b/rtdata/languages/Nederlands index 43afc8efa..d39173a52 100644 --- a/rtdata/languages/Nederlands +++ b/rtdata/languages/Nederlands @@ -2111,7 +2111,7 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - !MAIN_FRAME_PLACES_DEL;Remove !MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. !MAIN_TAB_ADVANCED;Advanced -!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w +!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-a !MAIN_TAB_FAVORITES;Favorites !MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u !MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: middle grey\nShortcut: 9 diff --git a/rtdata/languages/Polish b/rtdata/languages/Polish index 528b6a198..a631353c3 100644 --- a/rtdata/languages/Polish +++ b/rtdata/languages/Polish @@ -1722,7 +1722,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !MAIN_FRAME_PLACES_DEL;Remove !MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. !MAIN_TAB_ADVANCED;Advanced -!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w +!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-a !MAIN_TAB_FAVORITES;Favorites !MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u !MAIN_TAB_INSPECT; Inspect diff --git a/rtdata/languages/Portugues b/rtdata/languages/Portugues index e68f93e56..766b14e0b 100644 --- a/rtdata/languages/Portugues +++ b/rtdata/languages/Portugues @@ -889,7 +889,7 @@ MAIN_MSG_SETPATHFIRST;Para usar esta função, primeiro tem de configurar um cam MAIN_MSG_TOOMANYOPENEDITORS;Existem demasiados editores abertos.\nPor favor, feche um editor para continuar. MAIN_MSG_WRITEFAILED;Falha ao gravar\n"%1"\n\nVerifique se a pasta existe e se tem permissão para gravar nela. MAIN_TAB_ADVANCED;Avançado -MAIN_TAB_ADVANCED_TOOLTIP;Atalho: Alt-w +MAIN_TAB_ADVANCED_TOOLTIP;Atalho: Alt-a MAIN_TAB_COLOR;Cor MAIN_TAB_COLOR_TOOLTIP;Atalho: Alt-c MAIN_TAB_DETAIL;Detalhe diff --git a/rtdata/languages/Portugues (Brasil) b/rtdata/languages/Portugues (Brasil) index c7cc2dfe7..aef5fcde9 100644 --- a/rtdata/languages/Portugues (Brasil) +++ b/rtdata/languages/Portugues (Brasil) @@ -888,7 +888,7 @@ MAIN_MSG_SETPATHFIRST;Para usar esta função primeiro defina um objetivo em Pre MAIN_MSG_TOOMANYOPENEDITORS;Muitos editores abertos.\nPor favor, feche um editor para continuar. MAIN_MSG_WRITEFAILED;Falha ao escrever\n"%1"\n\nVerifique se a pasta existe e se tens permissão para gravar nela. MAIN_TAB_ADVANCED;Avançado -MAIN_TAB_ADVANCED_TOOLTIP;Atalho: Alt-w +MAIN_TAB_ADVANCED_TOOLTIP;Atalho: Alt-a MAIN_TAB_COLOR;Cor MAIN_TAB_COLOR_TOOLTIP;Atalho: Alt-c MAIN_TAB_DETAIL;Detalhe diff --git a/rtdata/languages/Russian b/rtdata/languages/Russian index a33458ef6..79c6bebfc 100644 --- a/rtdata/languages/Russian +++ b/rtdata/languages/Russian @@ -589,7 +589,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-a MAIN_TAB_COLOR;Цвет MAIN_TAB_COLOR_TOOLTIP;Горячая клавиша: Alt-C MAIN_TAB_DETAIL;Детализация diff --git a/rtdata/languages/Serbian (Cyrilic Characters) b/rtdata/languages/Serbian (Cyrilic Characters) index 98d74a5dd..2b98cfe2a 100644 --- a/rtdata/languages/Serbian (Cyrilic Characters) +++ b/rtdata/languages/Serbian (Cyrilic Characters) @@ -1614,7 +1614,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !MAIN_FRAME_PLACES_DEL;Remove !MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. !MAIN_TAB_ADVANCED;Advanced -!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w +!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-a !MAIN_TAB_FAVORITES;Favorites !MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u !MAIN_TAB_INSPECT; Inspect diff --git a/rtdata/languages/Swedish b/rtdata/languages/Swedish index 17bf0299f..220339a45 100644 --- a/rtdata/languages/Swedish +++ b/rtdata/languages/Swedish @@ -1963,7 +1963,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !MAIN_FRAME_PLACES_DEL;Remove !MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. !MAIN_TAB_ADVANCED;Advanced -!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w +!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-a !MAIN_TAB_FAVORITES;Favorites !MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u !MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: middle grey\nShortcut: 9 diff --git a/rtdata/languages/default b/rtdata/languages/default index e8392db6b..499005d32 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -901,7 +901,7 @@ MAIN_MSG_SETPATHFIRST;You first have to set a target path in Preferences in orde MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. MAIN_MSG_WRITEFAILED;Failed to write\n"%1"\n\nMake sure that the folder exists and that you have write permission to it. MAIN_TAB_ADVANCED;Advanced -MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w +MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-a MAIN_TAB_COLOR;Color MAIN_TAB_COLOR_TOOLTIP;Shortcut: Alt-c MAIN_TAB_DETAIL;Detail diff --git a/rtgui/toolpanelcoord.cc b/rtgui/toolpanelcoord.cc index f7e2991e1..d9bc6fc2a 100644 --- a/rtgui/toolpanelcoord.cc +++ b/rtgui/toolpanelcoord.cc @@ -922,7 +922,7 @@ bool ToolPanelCoordinator::handleShortcutKey (GdkEventKey* event) toolPanelNotebook->set_current_page (toolPanelNotebook->page_num (*rawPanelSW)); return true; - case GDK_KEY_w: + case GDK_KEY_a: toolPanelNotebook->set_current_page (toolPanelNotebook->page_num (*advancedPanelSW)); return true; From 50f9be3e600d5eeadb72a00fa1eeb44f5a4598e5 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Fri, 6 Sep 2019 22:51:46 +0200 Subject: [PATCH 37/50] Preparing for release 5.7 --- RELEASE_NOTES.txt | 21 ++++--- com.rawtherapee.RawTherapee.appdata.xml | 1 + rtdata/images/svg/splash.svg | 77 ++++--------------------- 3 files changed, 22 insertions(+), 77 deletions(-) diff --git a/RELEASE_NOTES.txt b/RELEASE_NOTES.txt index 17cf14fd6..6765177d4 100644 --- a/RELEASE_NOTES.txt +++ b/RELEASE_NOTES.txt @@ -1,17 +1,10 @@ -RAWTHERAPEE 5.6-dev RELEASE NOTES +RAWTHERAPEE 5.7 RELEASE NOTES -This is a development version of RawTherapee. We update the code almost daily. Every few months, once enough changes have accumulated and the code is stabilized, we make a new official release. Every code change between these releases is known as a "development" version, and this is one of them. +This is RawTherapee 5.7, released on 2019-09-08. Start by reading the "Getting Started" article on RawPedia: http://rawpedia.rawtherapee.com/ -While we only commit tested and relatively stable code and so the development versions should be fairly stable, you should be aware that: -- Development versions only had limited testing, so there may be bugs unknown to us. -- You should report these bugs so that they get fixed for the next stable release. See - www.rawpedia.rawtherapee.com/How_to_write_useful_bug_reports -- The way new tools work in the development versions is likely to change as we tweak and tune them, so your processing profiles may produce different results when used in a future stable version. -- Bugs present in the stable versions get fixed in the development versions, and make it into the next stable version when we make a new official release. That means that in some ways the development versions can be "more stable" than the latest stable release. At the same time, new features may introduce new bugs. This is a trade-off you should be aware of. - NEWS RELEVANT TO PHOTOGRAPHERS @@ -27,15 +20,21 @@ In order to use RawTherapee efficiently you should know that: - There are many keyboard shortcuts which make working with RawTherapee much faster and give you greater control. Make sure you familiarize yourself with them on RawPedia's "Keyboard Shortcuts" page! New features since 5.6: -TODO. +- Film Negative tool, for easily developing raw photographs of film negatives. +- Support for reading "rating" tags from Exif and XMP, shown in the File Browser/Filmstrip using RawTherapee's star rating system. +- Hundreds of bug fixes, speed optimizations and raw format support improvements. NEWS RELEVANT TO PACKAGE MAINTAINERS +New since 5.6: +- Requires CMake >=3.5. + In general: - To get the source code, either clone from git or use the tarball from http://rawtherapee.com/shared/source/ . Do not use the auto-generated GitHub release tarballs. -- Requires GTK+ version >=3.16, though >=3.22.24 is recommended. GTK+ versions 3.24.2 - 3.24.6 have an issue with missing combobox menu arrows and are to be avoided. +- Requires GTK+ version >=3.16, though >=3.22.24 is recommended. +- GTK+ versions 3.24.2 - 3.24.6 have an issue where combobox menu scroll-arrows are missing when the combobox list does not fit vertically on the screen. As a result, users would not be able to scroll in the following comboboxes: Processing Profiles, Film Simulation, and the camera and lens profiles in Profiled Lens Correction. - RawTherapee 5 requires GCC-4.9 or higher, or Clang. - Do not use -ffast-math, it will not make RawTherapee faster but will introduce artifacts. - Use -O3, it will make RawTherapee faster with no known side-effects. diff --git a/com.rawtherapee.RawTherapee.appdata.xml b/com.rawtherapee.RawTherapee.appdata.xml index a53ccbf06..efe6224b3 100644 --- a/com.rawtherapee.RawTherapee.appdata.xml +++ b/com.rawtherapee.RawTherapee.appdata.xml @@ -36,6 +36,7 @@ https://discuss.pixls.us/t/localization-how-to-translate-rawtherapee-and-rawpedia/2594 rawtherapee.desktop + diff --git a/rtdata/images/svg/splash.svg b/rtdata/images/svg/splash.svg index 2e46f0e6d..a3bf9f8d2 100644 --- a/rtdata/images/svg/splash.svg +++ b/rtdata/images/svg/splash.svg @@ -15,7 +15,7 @@ viewBox="0 0 146.05 91.545836" version="1.1" id="svg783" - inkscape:version="0.92.2 2405546, 2018-03-11" + inkscape:version="0.92.4 5da689c313, 2019-01-14" sodipodi:docname="splash.svg" inkscape:export-filename="/tmp/splash.png" inkscape:export-xdpi="96" @@ -480,8 +480,8 @@ inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="0.93979686" - inkscape:cx="-66.836581" - inkscape:cy="136.82017" + inkscape:cx="-57.792073" + inkscape:cy="126.17957" inkscape:document-units="px" inkscape:current-layer="layer1" showgrid="false" @@ -574,7 +574,7 @@ RawTherapee splash screen - 2019-02-27 + Maciej Dworak @@ -996,7 +996,7 @@ id="tspan595" x="283.85016" y="2.2370076" - style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:49.34799576px;line-height:1.25;font-family:'Eras Bold ITC';-inkscape-font-specification:'Eras Bold ITC Bold';letter-spacing:-7.09514618px">. 6 + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:49.34799576px;line-height:1.25;font-family:'Eras Bold ITC';-inkscape-font-specification:'Eras Bold ITC Bold';letter-spacing:-7.09514618px">. 8 Raw + id="text191"> + id="path193" /> - - - - - - - - - - - - - - - + id="path195" /> From 062b5a6bbc4333ab7d95d766e63e834835adc389 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sat, 7 Sep 2019 16:16:28 +0200 Subject: [PATCH 38/50] Capture Sharpening: change default values for iterations and gamma --- rtengine/procparams.cc | 4 ++-- rtgui/pdsharpening.cc | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index d88892a3b..4f31d7539 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -1153,9 +1153,9 @@ CaptureSharpeningParams::CaptureSharpeningParams() : enabled(false), autoContrast(true), contrast(10.0), - gamma(1.35), + gamma(1.00), deconvradius(0.75), - deconviter(30) + deconviter(20) { } diff --git a/rtgui/pdsharpening.cc b/rtgui/pdsharpening.cc index 8e7c0e8b8..85d174df8 100644 --- a/rtgui/pdsharpening.cc +++ b/rtgui/pdsharpening.cc @@ -49,9 +49,9 @@ PdSharpening::PdSharpening() : FoldableToolPanel(this, "pdsharpening", M("TP_PDS pack_start(*hb); Gtk::VBox* rld = Gtk::manage(new Gtk::VBox()); - gamma = Gtk::manage(new Adjuster(M("TP_SHARPENING_GAMMA"), 0.5, 6.0, 0.05, 1.35)); - dradius = Gtk::manage(new Adjuster(M("TP_SHARPENING_EDRADIUS"), 0.4, 1.0, 0.01, 0.75)); - diter = Gtk::manage(new Adjuster(M("TP_SHARPENING_RLD_ITERATIONS"), 5, 100, 1, 30)); + gamma = Gtk::manage(new Adjuster(M("TP_SHARPENING_GAMMA"), 0.5, 6.0, 0.05, 1.00)); + dradius = Gtk::manage(new Adjuster(M("TP_SHARPENING_EDRADIUS"), 0.4, 1.15, 0.01, 0.75)); + diter = Gtk::manage(new Adjuster(M("TP_SHARPENING_RLD_ITERATIONS"), 1, 100, 1, 20)); rld->pack_start(*gamma); rld->pack_start(*dradius); rld->pack_start(*diter); From ec2f7778bbedcfbd6c70d7af74ebb150fae30ef2 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Mon, 9 Sep 2019 15:48:00 +0200 Subject: [PATCH 39/50] trigger capture sharpening less often --- rtengine/improccoordinator.cc | 4 ++-- rtengine/refreshmap.h | 2 ++ rtgui/pdsharpening.cc | 10 +++++----- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 10d484495..ee7d07b11 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -340,11 +340,11 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) xtransAutoContrastListener->autoContrastChanged(autoContrast ? contrastThreshold : -1.0); } // if a demosaic happened we should also call getimage later, so we need to set the M_INIT flag - todo |= M_INIT; + todo |= (M_INIT | M_CSHARP); } - if ((todo & M_INIT) && params->pdsharpening.enabled) { + if ((todo & (M_RAW | M_CSHARP)) && params->pdsharpening.enabled) { double pdSharpencontrastThreshold = params->pdsharpening.contrast; imgsrc->captureSharpening(params->pdsharpening, sharpMask, pdSharpencontrastThreshold); if (pdSharpenAutoContrastListener && params->pdsharpening.autoContrast) { diff --git a/rtengine/refreshmap.h b/rtengine/refreshmap.h index b9ccc2b65..72d8dcadd 100644 --- a/rtengine/refreshmap.h +++ b/rtengine/refreshmap.h @@ -32,6 +32,7 @@ // Elementary functions that can be done to // the preview image when an event occurs +#define M_CSHARP (1<<18) #define M_MONITOR (1<<14) #define M_RETINEX (1<<13) #define M_CROP (1<<12) @@ -56,6 +57,7 @@ #define FLATFIELD (M_PREPROC|M_RAW|M_INIT|M_LINDENOISE|M_HDR|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) #define DEMOSAIC (M_RAW|M_INIT|M_LINDENOISE|M_HDR|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) #define ALLNORAW (M_INIT|M_LINDENOISE|M_HDR|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) +#define CAPTURESHARPEN (M_INIT|M_LINDENOISE|M_HDR|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR|M_CSHARP) #define HDR (M_LINDENOISE|M_HDR|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) #define TRANSFORM (M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) #define AUTOEXP (M_HDR|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) diff --git a/rtgui/pdsharpening.cc b/rtgui/pdsharpening.cc index 85d174df8..c85b42e95 100644 --- a/rtgui/pdsharpening.cc +++ b/rtgui/pdsharpening.cc @@ -30,11 +30,11 @@ PdSharpening::PdSharpening() : FoldableToolPanel(this, "pdsharpening", M("TP_PDS { auto m = ProcEventMapper::getInstance(); - EvPdShrContrast = m->newEvent(ALLNORAW, "HISTORY_MSG_PDSHARPEN_CONTRAST"); - EvPdSharpenGamma = m->newEvent(ALLNORAW, "HISTORY_MSG_PDSHARPEN_GAMMA"); - EvPdShrDRadius = m->newEvent(ALLNORAW, "HISTORY_MSG_PDSHARPEN_RADIUS"); - EvPdShrDIterations = m->newEvent(ALLNORAW, "HISTORY_MSG_PDSHARPEN_ITERATIONS"); - EvPdShrAutoContrast = m->newEvent(ALLNORAW, "HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST"); + EvPdShrContrast = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_CONTRAST"); + EvPdSharpenGamma = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_GAMMA"); + EvPdShrDRadius = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_RADIUS"); + EvPdShrDIterations = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_ITERATIONS"); + EvPdShrAutoContrast = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST"); Gtk::HBox* hb = Gtk::manage(new Gtk::HBox()); hb->show(); From 37d6b98ee3bb55da48ee77f0e357f67509aaa8ff Mon Sep 17 00:00:00 2001 From: Beep6581 Date: Tue, 10 Sep 2019 12:30:54 +0200 Subject: [PATCH 40/50] Update RELEASE_NOTES.txt --- RELEASE_NOTES.txt | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/RELEASE_NOTES.txt b/RELEASE_NOTES.txt index 6765177d4..0974af86c 100644 --- a/RELEASE_NOTES.txt +++ b/RELEASE_NOTES.txt @@ -1,9 +1,9 @@ RAWTHERAPEE 5.7 RELEASE NOTES -This is RawTherapee 5.7, released on 2019-09-08. +This is RawTherapee 5.7, released on 2019-09-10. Start by reading the "Getting Started" article on RawPedia: -http://rawpedia.rawtherapee.com/ +https://rawpedia.rawtherapee.com/ @@ -32,7 +32,7 @@ New since 5.6: - Requires CMake >=3.5. In general: -- To get the source code, either clone from git or use the tarball from http://rawtherapee.com/shared/source/ . Do not use the auto-generated GitHub release tarballs. +- To get the source code, either clone from git or use the tarball from https://rawtherapee.com/shared/source/ . Do not use the auto-generated GitHub release tarballs. - Requires GTK+ version >=3.16, though >=3.22.24 is recommended. - GTK+ versions 3.24.2 - 3.24.6 have an issue where combobox menu scroll-arrows are missing when the combobox list does not fit vertically on the screen. As a result, users would not be able to scroll in the following comboboxes: Processing Profiles, Film Simulation, and the camera and lens profiles in Profiled Lens Correction. - RawTherapee 5 requires GCC-4.9 or higher, or Clang. @@ -51,15 +51,14 @@ See CONTRIBUTING.md DOCUMENTATION -http://rawpedia.rawtherapee.com/ -http://rawtherapee.com/blog/documentation +https://rawpedia.rawtherapee.com/ REPORTING BUGS If you found a problem, don't keep it to yourself. Read the "How to write useful bug reports" article to get the problem fixed: -http://rawpedia.rawtherapee.com/How_to_write_useful_bug_reports +https://rawpedia.rawtherapee.com/How_to_write_useful_bug_reports @@ -77,8 +76,8 @@ Server: chat.freenode.net Channel: #rawtherapee You can use freenode webchat to communicate without installing anything: -http://webchat.freenode.net/?randomnick=1&channels=rawtherapee&prompt=1 -More information here: http://rawpedia.rawtherapee.com/IRC +https://webchat.freenode.net/?randomnick=1&channels=rawtherapee&prompt=1 +More information here: https://rawpedia.rawtherapee.com/IRC From ef722d37cbd6a64eef1279cf9c7b3b0988100d1c Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Tue, 10 Sep 2019 12:34:40 +0200 Subject: [PATCH 41/50] Updated appdata --- com.rawtherapee.RawTherapee.appdata.xml | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/com.rawtherapee.RawTherapee.appdata.xml b/com.rawtherapee.RawTherapee.appdata.xml index efe6224b3..0e5dfef50 100644 --- a/com.rawtherapee.RawTherapee.appdata.xml +++ b/com.rawtherapee.RawTherapee.appdata.xml @@ -31,12 +31,12 @@ GPL-3.0+ https://github.com/Beep6581/RawTherapee/issues/new https://www.paypal.me/rawtherapee - http://rawpedia.rawtherapee.com/ - http://rawtherapee.com/ + https://rawpedia.rawtherapee.com/ + https://www.rawtherapee.com/ https://discuss.pixls.us/t/localization-how-to-translate-rawtherapee-and-rawpedia/2594 rawtherapee.desktop - + @@ -48,16 +48,20 @@ + Color-correcting a drosera rotundifolia in RawTherapee 5.7. + https://rawtherapee.com/images/screenshots/rt570_1.jpg + + HDR DNG of a misty morning in the countryside - http://rawtherapee.com/images/screenshots/rt540_1.jpg + https://rawtherapee.com/images/screenshots/rt540_1.jpg Straight-out-of-camera vs RawTherapee - http://rawtherapee.com/images/screenshots/rt540_2.jpg + https://rawtherapee.com/images/screenshots/rt540_2.jpg RawTherapee using the Auto-Matched Tone Curve tool - http://rawtherapee.com/images/screenshots/rt540_3.jpg + https://rawtherapee.com/images/screenshots/rt540_3.jpg contactus@rawtherapee.com From 60b2196bcefd7be06bc8cfed28b5cd869e861977 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Tue, 10 Sep 2019 12:34:57 +0200 Subject: [PATCH 42/50] Updated gnu.org links to use HTTPS --- LICENSE.txt | 2 +- cmake/modules/FindUnalignedMalloc.cmake | 2 +- cmake/modules/FindX87Math.cmake | 2 +- header | 2 +- rtdata/languages/LICENSE | 2 +- rtdata/themes/RawTherapee-GTK3-20_.css | 2 +- rtdata/themes/RawTherapee-GTK3-_19.css | 2 +- rtdata/themes/TooWaBlue - Bright-GTK3-20_.css | 2 +- rtdata/themes/TooWaBlue - Dark-GTK3-20_.css | 2 +- rtdata/themes/TooWaBlue-GTK3-20_.css | 2 +- rtdata/themes/TooWaBlue-GTK3-_19.css | 2 +- rtdata/themes/TooWaGrey - Average Surround-GTK3-20_.css | 2 +- rtdata/themes/TooWaGrey - Bright-GTK3-20_.css | 2 +- rtdata/themes/TooWaGrey - Dark-GTK3-20_.css | 2 +- rtdata/themes/TooWaGrey-GTK3-20_.css | 2 +- rtengine/CA_correct_RT.cc | 2 +- rtengine/FTblockDN.cc | 2 +- rtengine/LUT.h | 2 +- rtengine/PF_correct_RT.cc | 2 +- rtengine/StopWatch.h | 2 +- rtengine/ahd_demosaic_RT.cc | 2 +- rtengine/alignedbuffer.h | 2 +- rtengine/amaze_demosaic_RT.cc | 2 +- rtengine/array2D.h | 2 +- rtengine/badpixels.cc | 2 +- rtengine/bilateral2.h | 2 +- rtengine/boxblur.h | 2 +- rtengine/cache.h | 2 +- rtengine/cfa_linedn_RT.cc | 2 +- rtengine/ciecam02.cc | 2 +- rtengine/ciecam02.h | 2 +- rtengine/cieimage.h | 2 +- rtengine/color.cc | 2 +- rtengine/color.h | 2 +- rtengine/colortemp.cc | 2 +- rtengine/colortemp.h | 2 +- rtengine/coord.cc | 2 +- rtengine/coord.h | 2 +- rtengine/coord2d.h | 2 +- rtengine/cplx_wavelet_dec.cc | 2 +- rtengine/cplx_wavelet_dec.h | 2 +- rtengine/cplx_wavelet_filter_coeffs.h | 2 +- rtengine/cplx_wavelet_level.h | 2 +- rtengine/curves.cc | 2 +- rtengine/curves.h | 2 +- rtengine/dcp.cc | 2 +- rtengine/dcp.h | 2 +- rtengine/dcraw.h | 2 +- rtengine/dcrop.cc | 2 +- rtengine/dcrop.h | 2 +- rtengine/demosaic_algos.cc | 4 ++-- rtengine/dfmanager.cc | 2 +- rtengine/dfmanager.h | 2 +- rtengine/diagonalcurves.cc | 2 +- rtengine/dirpyr_equalizer.cc | 2 +- rtengine/dual_demosaic_RT.cc | 2 +- rtengine/dynamicprofile.cc | 2 +- rtengine/dynamicprofile.h | 2 +- rtengine/eahd_demosaic.cc | 2 +- rtengine/fast_demo.cc | 2 +- rtengine/ffmanager.cc | 2 +- rtengine/ffmanager.h | 2 +- rtengine/filmnegativeproc.cc | 2 +- rtengine/filmnegativethumb.cc | 2 +- rtengine/flatcurves.cc | 2 +- rtengine/gamutwarning.cc | 2 +- rtengine/gamutwarning.h | 2 +- rtengine/gauss.cc | 2 +- rtengine/gauss.h | 2 +- rtengine/green_equil_RT.cc | 2 +- rtengine/guidedfilter.cc | 2 +- rtengine/guidedfilter.h | 2 +- rtengine/hilite_recon.cc | 2 +- rtengine/histmatching.cc | 2 +- rtengine/hphd_demosaic_RT.cc | 2 +- rtengine/iccmatrices.h | 2 +- rtengine/iccstore.cc | 2 +- rtengine/iccstore.h | 2 +- rtengine/iimage.cc | 2 +- rtengine/iimage.h | 2 +- rtengine/image16.cc | 2 +- rtengine/image16.h | 2 +- rtengine/image8.cc | 2 +- rtengine/image8.h | 2 +- rtengine/imagedata.cc | 2 +- rtengine/imagedata.h | 2 +- rtengine/imagedimensions.cc | 2 +- rtengine/imagedimensions.h | 2 +- rtengine/imagefloat.cc | 2 +- rtengine/imagefloat.h | 2 +- rtengine/imageformat.h | 2 +- rtengine/imageio.cc | 2 +- rtengine/imageio.h | 2 +- rtengine/imagesource.h | 2 +- rtengine/improccoordinator.cc | 2 +- rtengine/improccoordinator.h | 2 +- rtengine/improcfun.cc | 4 ++-- rtengine/improcfun.h | 2 +- rtengine/impulse_denoise.cc | 2 +- rtengine/init.cc | 2 +- rtengine/ipdehaze.cc | 2 +- rtengine/iplab2rgb.cc | 2 +- rtengine/iplabregions.cc | 2 +- rtengine/iplocalcontrast.cc | 2 +- rtengine/ipresize.cc | 2 +- rtengine/ipretinex.cc | 2 +- rtengine/ipshadowshighlights.cc | 2 +- rtengine/ipsharpen.cc | 2 +- rtengine/ipsoftlight.cc | 2 +- rtengine/iptcpairs.h | 2 +- rtengine/iptransform.cc | 2 +- rtengine/ipvibrance.cc | 2 +- rtengine/ipwavelet.cc | 2 +- rtengine/jaggedarray.h | 2 +- rtengine/labimage.cc | 2 +- rtengine/labimage.h | 2 +- rtengine/lcp.cc | 2 +- rtengine/lcp.h | 2 +- rtengine/loadinitial.cc | 2 +- rtengine/median.h | 2 +- rtengine/myfile.cc | 2 +- rtengine/myfile.h | 2 +- rtengine/mytime.h | 2 +- rtengine/noncopyable.h | 2 +- rtengine/opthelper.h | 2 +- rtengine/pdaflinesfilter.cc | 2 +- rtengine/pdaflinesfilter.h | 2 +- rtengine/pipettebuffer.cc | 2 +- rtengine/pipettebuffer.h | 2 +- rtengine/pixelshift.cc | 2 +- rtengine/pixelsmap.h | 2 +- rtengine/previewimage.cc | 2 +- rtengine/previewimage.h | 2 +- rtengine/processingjob.cc | 2 +- rtengine/processingjob.h | 2 +- rtengine/procevents.h | 2 +- rtengine/procparams.cc | 2 +- rtengine/procparams.h | 2 +- rtengine/profilestore.cc | 2 +- rtengine/profilestore.h | 2 +- rtengine/rawimage.h | 2 +- rtengine/rawimagesource.cc | 2 +- rtengine/rawimagesource.h | 2 +- rtengine/rawimagesource_i.h | 2 +- rtengine/rawmetadatalocation.h | 2 +- rtengine/rcd_demosaic.cc | 2 +- rtengine/refreshmap.cc | 2 +- rtengine/refreshmap.h | 2 +- rtengine/rescale.h | 2 +- rtengine/rt_algo.cc | 2 +- rtengine/rt_algo.h | 2 +- rtengine/rtengine.h | 2 +- rtengine/rtlensfun.cc | 2 +- rtengine/rtlensfun.h | 2 +- rtengine/rtthumbnail.cc | 2 +- rtengine/rtthumbnail.h | 2 +- rtengine/settings.h | 2 +- rtengine/shmap.cc | 2 +- rtengine/shmap.h | 2 +- rtengine/simpleprocess.cc | 2 +- rtengine/slicer.cc | 2 +- rtengine/slicer.h | 2 +- rtengine/stdimagesource.cc | 2 +- rtengine/stdimagesource.h | 2 +- rtengine/tmo_fattal02.cc | 2 +- rtengine/utils.cc | 2 +- rtengine/utils.h | 2 +- rtengine/vng4_demosaic_RT.cc | 2 +- rtengine/xtrans_demosaic.cc | 2 +- rtexif/canonattribs.cc | 2 +- rtexif/fujiattribs.cc | 2 +- rtexif/nikonattribs.cc | 2 +- rtexif/olympusattribs.cc | 2 +- rtexif/pentaxattribs.cc | 2 +- rtexif/rtexif.cc | 2 +- rtexif/rtexif.h | 2 +- rtexif/sonyminoltaattribs.cc | 2 +- rtexif/stdattribs.cc | 2 +- rtgui/adjuster.cc | 2 +- rtgui/adjuster.h | 2 +- rtgui/alignedmalloc.cc | 2 +- rtgui/batchqueue.cc | 2 +- rtgui/batchqueue.h | 2 +- rtgui/batchqueuebuttonset.cc | 2 +- rtgui/batchqueuebuttonset.h | 2 +- rtgui/batchqueueentry.cc | 2 +- rtgui/batchqueueentry.h | 2 +- rtgui/batchqueuepanel.cc | 2 +- rtgui/batchqueuepanel.h | 2 +- rtgui/batchtoolpanelcoord.cc | 2 +- rtgui/batchtoolpanelcoord.h | 2 +- rtgui/bayerpreprocess.cc | 2 +- rtgui/bayerpreprocess.h | 2 +- rtgui/bayerprocess.cc | 2 +- rtgui/bayerprocess.h | 2 +- rtgui/bayerrawexposure.cc | 2 +- rtgui/bayerrawexposure.h | 2 +- rtgui/blackwhite.cc | 2 +- rtgui/blackwhite.h | 2 +- rtgui/bqentryupdater.cc | 2 +- rtgui/bqentryupdater.h | 2 +- rtgui/browserfilter.cc | 2 +- rtgui/browserfilter.h | 2 +- rtgui/cacheimagedata.cc | 2 +- rtgui/cacheimagedata.h | 2 +- rtgui/cachemanager.cc | 2 +- rtgui/cachemanager.h | 2 +- rtgui/cacorrection.cc | 2 +- rtgui/cacorrection.h | 2 +- rtgui/checkbox.cc | 2 +- rtgui/checkbox.h | 2 +- rtgui/chmixer.cc | 2 +- rtgui/chmixer.h | 2 +- rtgui/clipboard.cc | 2 +- rtgui/clipboard.h | 2 +- rtgui/coarsepanel.cc | 2 +- rtgui/coarsepanel.h | 2 +- rtgui/colorappearance.cc | 2 +- rtgui/colorappearance.h | 2 +- rtgui/coloredbar.cc | 2 +- rtgui/coloredbar.h | 2 +- rtgui/colorprovider.h | 2 +- rtgui/config.h.in | 2 +- rtgui/coordinateadjuster.cc | 2 +- rtgui/coordinateadjuster.h | 2 +- rtgui/crop.cc | 2 +- rtgui/crop.h | 2 +- rtgui/cropguilistener.h | 2 +- rtgui/crophandler.cc | 2 +- rtgui/crophandler.h | 2 +- rtgui/cropwindow.cc | 2 +- rtgui/cropwindow.h | 2 +- rtgui/cursormanager.cc | 2 +- rtgui/cursormanager.h | 2 +- rtgui/curveeditor.cc | 2 +- rtgui/curveeditor.h | 2 +- rtgui/curveeditorgroup.cc | 2 +- rtgui/curveeditorgroup.h | 2 +- rtgui/curvelistener.h | 2 +- rtgui/darkframe.cc | 2 +- rtgui/darkframe.h | 2 +- rtgui/defringe.cc | 2 +- rtgui/defringe.h | 2 +- rtgui/dehaze.cc | 2 +- rtgui/dehaze.h | 2 +- rtgui/diagonalcurveeditorsubgroup.cc | 2 +- rtgui/diagonalcurveeditorsubgroup.h | 2 +- rtgui/dirbrowser.cc | 2 +- rtgui/dirbrowser.h | 2 +- rtgui/dirpyrdenoise.cc | 2 +- rtgui/dirpyrdenoise.h | 2 +- rtgui/dirpyrequalizer.cc | 2 +- rtgui/dirpyrequalizer.h | 2 +- rtgui/distortion.cc | 2 +- rtgui/distortion.h | 2 +- rtgui/dynamicprofilepanel.cc | 2 +- rtgui/dynamicprofilepanel.h | 2 +- rtgui/editbuffer.cc | 2 +- rtgui/editbuffer.h | 2 +- rtgui/editcallbacks.cc | 2 +- rtgui/editcallbacks.h | 2 +- rtgui/editcoordsys.h | 2 +- rtgui/editedstate.h | 2 +- rtgui/editenums.h | 2 +- rtgui/editid.h | 2 +- rtgui/editorpanel.cc | 2 +- rtgui/editorpanel.h | 2 +- rtgui/editwidgets.cc | 2 +- rtgui/editwidgets.h | 2 +- rtgui/editwindow.cc | 2 +- rtgui/editwindow.h | 2 +- rtgui/epd.cc | 2 +- rtgui/epd.h | 2 +- rtgui/eventmapper.cc | 2 +- rtgui/eventmapper.h | 2 +- rtgui/exiffiltersettings.cc | 2 +- rtgui/exiffiltersettings.h | 2 +- rtgui/exifpanel.cc | 2 +- rtgui/exifpanel.h | 2 +- rtgui/exportpanel.cc | 2 +- rtgui/exportpanel.h | 2 +- rtgui/extprog.cc | 2 +- rtgui/extprog.h | 2 +- rtgui/fattaltonemap.cc | 2 +- rtgui/fattaltonemap.h | 2 +- rtgui/favoritbrowser.cc | 2 +- rtgui/favoritbrowser.h | 2 +- rtgui/filebrowser.cc | 2 +- rtgui/filebrowser.h | 2 +- rtgui/filebrowserentry.cc | 2 +- rtgui/filebrowserentry.h | 2 +- rtgui/filecatalog.cc | 2 +- rtgui/filecatalog.h | 2 +- rtgui/filepanel.cc | 2 +- rtgui/filepanel.h | 2 +- rtgui/fileselectionchangelistener.h | 2 +- rtgui/fileselectionlistener.h | 2 +- rtgui/filethumbnailbuttonset.cc | 2 +- rtgui/filethumbnailbuttonset.h | 2 +- rtgui/filmnegative.cc | 2 +- rtgui/filmnegative.h | 2 +- rtgui/filterpanel.cc | 2 +- rtgui/filterpanel.h | 2 +- rtgui/flatcurveeditorsubgroup.cc | 2 +- rtgui/flatcurveeditorsubgroup.h | 2 +- rtgui/flatfield.cc | 2 +- rtgui/flatfield.h | 2 +- rtgui/guiutils.cc | 2 +- rtgui/guiutils.h | 2 +- rtgui/histogrampanel.cc | 2 +- rtgui/histogrampanel.h | 2 +- rtgui/history.cc | 2 +- rtgui/history.h | 2 +- rtgui/hsvequalizer.cc | 2 +- rtgui/hsvequalizer.h | 2 +- rtgui/iccprofilecreator.cc | 2 +- rtgui/iccprofilecreator.h | 2 +- rtgui/icmpanel.cc | 2 +- rtgui/icmpanel.h | 2 +- rtgui/ilabel.cc | 2 +- rtgui/ilabel.h | 2 +- rtgui/imagearea.cc | 2 +- rtgui/imagearea.h | 2 +- rtgui/imageareapanel.cc | 2 +- rtgui/imageareapanel.h | 2 +- rtgui/imageareatoollistener.h | 2 +- rtgui/impulsedenoise.cc | 2 +- rtgui/impulsedenoise.h | 2 +- rtgui/indclippedpanel.cc | 2 +- rtgui/indclippedpanel.h | 2 +- rtgui/inspector.cc | 2 +- rtgui/inspector.h | 2 +- rtgui/iptcpanel.cc | 2 +- rtgui/iptcpanel.h | 2 +- rtgui/labcurve.cc | 2 +- rtgui/labcurve.h | 2 +- rtgui/labgrid.cc | 4 ++-- rtgui/labgrid.h | 4 ++-- rtgui/lensgeom.cc | 2 +- rtgui/lensgeom.h | 2 +- rtgui/lensgeomlistener.h | 2 +- rtgui/lensprofile.cc | 2 +- rtgui/lensprofile.h | 2 +- rtgui/localcontrast.cc | 2 +- rtgui/localcontrast.h | 2 +- rtgui/lockablecolorpicker.cc | 2 +- rtgui/lockablecolorpicker.h | 2 +- rtgui/lwbutton.cc | 2 +- rtgui/lwbutton.h | 2 +- rtgui/lwbuttonset.cc | 2 +- rtgui/lwbuttonset.h | 2 +- rtgui/main-cli.cc | 2 +- rtgui/main.cc | 2 +- rtgui/metadatapanel.cc | 2 +- rtgui/metadatapanel.h | 2 +- rtgui/multilangmgr.cc | 2 +- rtgui/multilangmgr.h | 2 +- rtgui/mycurve.cc | 2 +- rtgui/mycurve.h | 2 +- rtgui/mydiagonalcurve.cc | 2 +- rtgui/mydiagonalcurve.h | 2 +- rtgui/myflatcurve.cc | 2 +- rtgui/myflatcurve.h | 2 +- rtgui/navigator.cc | 2 +- rtgui/navigator.h | 2 +- rtgui/options.cc | 2 +- rtgui/options.h | 2 +- rtgui/paramsedited.cc | 2 +- rtgui/paramsedited.h | 2 +- rtgui/partialpastedlg.cc | 2 +- rtgui/partialpastedlg.h | 2 +- rtgui/pathutils.cc | 2 +- rtgui/pathutils.h | 2 +- rtgui/perspective.cc | 2 +- rtgui/perspective.h | 2 +- rtgui/placesbrowser.cc | 2 +- rtgui/placesbrowser.h | 2 +- rtgui/pointermotionlistener.h | 2 +- rtgui/popupbutton.cc | 2 +- rtgui/popupbutton.h | 2 +- rtgui/popupcommon.cc | 2 +- rtgui/popupcommon.h | 2 +- rtgui/popuptogglebutton.cc | 2 +- rtgui/popuptogglebutton.h | 2 +- rtgui/pparamschangelistener.h | 2 +- rtgui/preferences.cc | 2 +- rtgui/preferences.h | 2 +- rtgui/preprocess.cc | 2 +- rtgui/preprocess.h | 2 +- rtgui/previewhandler.cc | 2 +- rtgui/previewhandler.h | 2 +- rtgui/previewloader.cc | 2 +- rtgui/previewloader.h | 2 +- rtgui/previewmodepanel.cc | 2 +- rtgui/previewmodepanel.h | 2 +- rtgui/previewwindow.cc | 2 +- rtgui/previewwindow.h | 2 +- rtgui/procparamchangers.h | 2 +- rtgui/profilechangelistener.h | 2 +- rtgui/profilepanel.cc | 2 +- rtgui/profilepanel.h | 2 +- rtgui/profilestorecombobox.cc | 2 +- rtgui/profilestorecombobox.h | 2 +- rtgui/progressconnector.h | 2 +- rtgui/prsharpening.cc | 2 +- rtgui/prsharpening.h | 2 +- rtgui/rawcacorrection.cc | 2 +- rtgui/rawcacorrection.h | 2 +- rtgui/rawexposure.cc | 2 +- rtgui/rawexposure.h | 2 +- rtgui/recentbrowser.cc | 2 +- rtgui/recentbrowser.h | 2 +- rtgui/renamedlg.cc | 2 +- rtgui/renamedlg.h | 2 +- rtgui/resize.cc | 2 +- rtgui/resize.h | 2 +- rtgui/rgbcurves.cc | 2 +- rtgui/rgbcurves.h | 2 +- rtgui/rotate.cc | 2 +- rtgui/rotate.h | 2 +- rtgui/rtimage.cc | 2 +- rtgui/rtimage.h | 2 +- rtgui/rtscalable.cc | 2 +- rtgui/rtscalable.h | 2 +- rtgui/rtsurface.cc | 2 +- rtgui/rtsurface.h | 2 +- rtgui/rtwindow.cc | 2 +- rtgui/rtwindow.h | 2 +- rtgui/saveasdlg.cc | 2 +- rtgui/saveasdlg.h | 2 +- rtgui/saveformatpanel.cc | 2 +- rtgui/saveformatpanel.h | 2 +- rtgui/sensorbayer.cc | 2 +- rtgui/sensorbayer.h | 2 +- rtgui/sensorxtrans.cc | 2 +- rtgui/sensorxtrans.h | 2 +- rtgui/shadowshighlights.cc | 2 +- rtgui/shadowshighlights.h | 2 +- rtgui/sharpenedge.cc | 2 +- rtgui/sharpenedge.h | 2 +- rtgui/sharpening.cc | 2 +- rtgui/sharpening.h | 2 +- rtgui/sharpenmicro.cc | 2 +- rtgui/sharpenmicro.h | 2 +- rtgui/shcselector.cc | 2 +- rtgui/shcselector.h | 2 +- rtgui/softlight.cc | 2 +- rtgui/softlight.h | 2 +- rtgui/soundman.cc | 2 +- rtgui/soundman.h | 2 +- rtgui/splash.cc | 2 +- rtgui/splash.h | 2 +- rtgui/threadutils.cc | 2 +- rtgui/threadutils.h | 2 +- rtgui/thresholdadjuster.cc | 2 +- rtgui/thresholdadjuster.h | 2 +- rtgui/thresholdselector.cc | 2 +- rtgui/thresholdselector.h | 2 +- rtgui/thumbbrowserbase.cc | 2 +- rtgui/thumbbrowserbase.h | 2 +- rtgui/thumbbrowserentrybase.cc | 2 +- rtgui/thumbbrowserentrybase.h | 2 +- rtgui/thumbimageupdater.cc | 2 +- rtgui/thumbimageupdater.h | 2 +- rtgui/thumbnail.cc | 2 +- rtgui/thumbnail.h | 2 +- rtgui/thumbnailbrowser.h | 2 +- rtgui/thumbnaillistener.h | 2 +- rtgui/tonecurve.cc | 2 +- rtgui/tonecurve.h | 2 +- rtgui/toolbar.cc | 2 +- rtgui/toolbar.h | 2 +- rtgui/toolenum.h | 2 +- rtgui/toolpanel.cc | 2 +- rtgui/toolpanel.h | 2 +- rtgui/toolpanelcoord.cc | 2 +- rtgui/toolpanelcoord.h | 2 +- rtgui/vibrance.cc | 2 +- rtgui/vibrance.h | 2 +- rtgui/vignetting.cc | 2 +- rtgui/vignetting.h | 2 +- rtgui/wavelet.cc | 2 +- rtgui/wavelet.h | 2 +- rtgui/wbprovider.h | 2 +- rtgui/whitebalance.cc | 2 +- rtgui/whitebalance.h | 2 +- rtgui/xtransprocess.cc | 2 +- rtgui/xtransprocess.h | 2 +- rtgui/xtransrawexposure.cc | 2 +- rtgui/xtransrawexposure.h | 2 +- rtgui/zoompanel.cc | 2 +- rtgui/zoompanel.h | 2 +- tools/gimp-plugin/file-formats.h | 2 +- tools/gimp-plugin/file-rawtherapee.c | 2 +- 494 files changed, 498 insertions(+), 498 deletions(-) diff --git a/LICENSE.txt b/LICENSE.txt index 0aa0df7c8..653f0ac50 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -13,7 +13,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program. If not, see . + along with this program. If not, see . GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 diff --git a/cmake/modules/FindUnalignedMalloc.cmake b/cmake/modules/FindUnalignedMalloc.cmake index 4ddfb2afc..bce150c14 100644 --- a/cmake/modules/FindUnalignedMalloc.cmake +++ b/cmake/modules/FindUnalignedMalloc.cmake @@ -13,7 +13,7 @@ # 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 . +# along with RawTherapee. If not, see . include(CheckCXXSourceCompiles) diff --git a/cmake/modules/FindX87Math.cmake b/cmake/modules/FindX87Math.cmake index b25ba3292..c079c584b 100644 --- a/cmake/modules/FindX87Math.cmake +++ b/cmake/modules/FindX87Math.cmake @@ -13,7 +13,7 @@ # 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 . +# along with RawTherapee. If not, see . include(CheckCXXSourceCompiles) diff --git a/header b/header index c42b87574..966153c0e 100644 --- a/header +++ b/header @@ -14,5 +14,5 @@ * 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 . + * along with RawTherapee. If not, see . */ diff --git a/rtdata/languages/LICENSE b/rtdata/languages/LICENSE index fbc14b67e..b269339a6 100755 --- a/rtdata/languages/LICENSE +++ b/rtdata/languages/LICENSE @@ -13,6 +13,6 @@ # 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 . +# along with RawTherapee. If not, see . # diff --git a/rtdata/themes/RawTherapee-GTK3-20_.css b/rtdata/themes/RawTherapee-GTK3-20_.css index 45dec6e39..3f5072f48 100644 --- a/rtdata/themes/RawTherapee-GTK3-20_.css +++ b/rtdata/themes/RawTherapee-GTK3-20_.css @@ -16,7 +16,7 @@ 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 . + along with RawTherapee. If not, see . */ /***************************/ diff --git a/rtdata/themes/RawTherapee-GTK3-_19.css b/rtdata/themes/RawTherapee-GTK3-_19.css index a796b60a1..58742e8ca 100644 --- a/rtdata/themes/RawTherapee-GTK3-_19.css +++ b/rtdata/themes/RawTherapee-GTK3-_19.css @@ -15,7 +15,7 @@ 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 . + along with RawTherapee. If not, see . */ * { diff --git a/rtdata/themes/TooWaBlue - Bright-GTK3-20_.css b/rtdata/themes/TooWaBlue - Bright-GTK3-20_.css index d1bb4fdbc..19e2eb049 100644 --- a/rtdata/themes/TooWaBlue - Bright-GTK3-20_.css +++ b/rtdata/themes/TooWaBlue - Bright-GTK3-20_.css @@ -15,7 +15,7 @@ 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 . + along with RawTherapee. If not, see . */ diff --git a/rtdata/themes/TooWaBlue - Dark-GTK3-20_.css b/rtdata/themes/TooWaBlue - Dark-GTK3-20_.css index 581549750..5875e2132 100644 --- a/rtdata/themes/TooWaBlue - Dark-GTK3-20_.css +++ b/rtdata/themes/TooWaBlue - Dark-GTK3-20_.css @@ -15,7 +15,7 @@ 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 . + along with RawTherapee. If not, see . */ diff --git a/rtdata/themes/TooWaBlue-GTK3-20_.css b/rtdata/themes/TooWaBlue-GTK3-20_.css index 7b5089430..ce4bb8d28 100644 --- a/rtdata/themes/TooWaBlue-GTK3-20_.css +++ b/rtdata/themes/TooWaBlue-GTK3-20_.css @@ -15,7 +15,7 @@ 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 . + along with RawTherapee. If not, see . */ /*** Change me *** rgb(red,green,blue) *** allowed values from 0 to 255 for each color ***/ diff --git a/rtdata/themes/TooWaBlue-GTK3-_19.css b/rtdata/themes/TooWaBlue-GTK3-_19.css index 530ae3d3a..31676ca8d 100644 --- a/rtdata/themes/TooWaBlue-GTK3-_19.css +++ b/rtdata/themes/TooWaBlue-GTK3-_19.css @@ -15,7 +15,7 @@ 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 . + along with RawTherapee. If not, see . */ /*** Change me *** rgb(red,green,blue) *** allowed values from 0 to 255 for each color ***/ diff --git a/rtdata/themes/TooWaGrey - Average Surround-GTK3-20_.css b/rtdata/themes/TooWaGrey - Average Surround-GTK3-20_.css index 29ebd6c96..8f045e206 100644 --- a/rtdata/themes/TooWaGrey - Average Surround-GTK3-20_.css +++ b/rtdata/themes/TooWaGrey - Average Surround-GTK3-20_.css @@ -15,7 +15,7 @@ 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 . + along with RawTherapee. If not, see . */ diff --git a/rtdata/themes/TooWaGrey - Bright-GTK3-20_.css b/rtdata/themes/TooWaGrey - Bright-GTK3-20_.css index 74dd5c7f0..579ca7a00 100644 --- a/rtdata/themes/TooWaGrey - Bright-GTK3-20_.css +++ b/rtdata/themes/TooWaGrey - Bright-GTK3-20_.css @@ -15,7 +15,7 @@ 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 . + along with RawTherapee. If not, see . */ diff --git a/rtdata/themes/TooWaGrey - Dark-GTK3-20_.css b/rtdata/themes/TooWaGrey - Dark-GTK3-20_.css index 0f61e0935..8d6d05152 100644 --- a/rtdata/themes/TooWaGrey - Dark-GTK3-20_.css +++ b/rtdata/themes/TooWaGrey - Dark-GTK3-20_.css @@ -15,7 +15,7 @@ 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 . + along with RawTherapee. If not, see . */ diff --git a/rtdata/themes/TooWaGrey-GTK3-20_.css b/rtdata/themes/TooWaGrey-GTK3-20_.css index f681ef374..0b29ed2e7 100644 --- a/rtdata/themes/TooWaGrey-GTK3-20_.css +++ b/rtdata/themes/TooWaGrey-GTK3-20_.css @@ -15,7 +15,7 @@ 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 . + along with RawTherapee. If not, see . */ diff --git a/rtengine/CA_correct_RT.cc b/rtengine/CA_correct_RT.cc index 46a62cc4b..a2d68402f 100644 --- a/rtengine/CA_correct_RT.cc +++ b/rtengine/CA_correct_RT.cc @@ -18,7 +18,7 @@ // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License -// along with this program. If not, see . +// along with this program. If not, see . // //////////////////////////////////////////////////////////////// diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index ccffbe59c..d1e659114 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -18,7 +18,7 @@ // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License -// along with this program. If not, see . +// along with this program. If not, see . // //////////////////////////////////////////////////////////////// diff --git a/rtengine/LUT.h b/rtengine/LUT.h index 6584eefe6..34f572f58 100644 --- a/rtengine/LUT.h +++ b/rtengine/LUT.h @@ -15,7 +15,7 @@ * 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 . + * along with RawTherapee. If not, see . */ /* diff --git a/rtengine/PF_correct_RT.cc b/rtengine/PF_correct_RT.cc index fe89a7b65..7df042663 100644 --- a/rtengine/PF_correct_RT.cc +++ b/rtengine/PF_correct_RT.cc @@ -23,7 +23,7 @@ // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License -// along with this program. If not, see . +// along with this program. If not, see . // //////////////////////////////////////////////////////////////// diff --git a/rtengine/StopWatch.h b/rtengine/StopWatch.h index 5eb103da4..94be402e4 100644 --- a/rtengine/StopWatch.h +++ b/rtengine/StopWatch.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . * * Author: reine */ diff --git a/rtengine/ahd_demosaic_RT.cc b/rtengine/ahd_demosaic_RT.cc index 13cbd4d2a..b3a34295c 100644 --- a/rtengine/ahd_demosaic_RT.cc +++ b/rtengine/ahd_demosaic_RT.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ // diff --git a/rtengine/alignedbuffer.h b/rtengine/alignedbuffer.h index 846c4c47d..b2c720bd8 100644 --- a/rtengine/alignedbuffer.h +++ b/rtengine/alignedbuffer.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _ALIGNEDBUFFER_ #define _ALIGNEDBUFFER_ diff --git a/rtengine/amaze_demosaic_RT.cc b/rtengine/amaze_demosaic_RT.cc index 47aa45c14..43aef0f71 100644 --- a/rtengine/amaze_demosaic_RT.cc +++ b/rtengine/amaze_demosaic_RT.cc @@ -22,7 +22,7 @@ // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License -// along with this program. If not, see . +// along with this program. If not, see . // //////////////////////////////////////////////////////////////// diff --git a/rtengine/array2D.h b/rtengine/array2D.h index 84728f043..7713cd55c 100644 --- a/rtengine/array2D.h +++ b/rtengine/array2D.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ /* diff --git a/rtengine/badpixels.cc b/rtengine/badpixels.cc index 376e58b3b..79b8187f7 100644 --- a/rtengine/badpixels.cc +++ b/rtengine/badpixels.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "array2D.h" diff --git a/rtengine/bilateral2.h b/rtengine/bilateral2.h index e754ac891..d0496810d 100644 --- a/rtengine/bilateral2.h +++ b/rtengine/bilateral2.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _BILATERAL2_ #define _BILATERAL2_ diff --git a/rtengine/boxblur.h b/rtengine/boxblur.h index d686ad43e..da302964b 100644 --- a/rtengine/boxblur.h +++ b/rtengine/boxblur.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _BOXBLUR_H_ #define _BOXBLUR_H_ diff --git a/rtengine/cache.h b/rtengine/cache.h index ec284b2ae..6c1dacf43 100644 --- a/rtengine/cache.h +++ b/rtengine/cache.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #pragma once diff --git a/rtengine/cfa_linedn_RT.cc b/rtengine/cfa_linedn_RT.cc index a7b789caf..5f6e46f8f 100644 --- a/rtengine/cfa_linedn_RT.cc +++ b/rtengine/cfa_linedn_RT.cc @@ -18,7 +18,7 @@ // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License -// along with this program. If not, see . +// along with this program. If not, see . // //////////////////////////////////////////////////////////////// diff --git a/rtengine/ciecam02.cc b/rtengine/ciecam02.cc index 86b67e000..dfef273d6 100644 --- a/rtengine/ciecam02.cc +++ b/rtengine/ciecam02.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "ciecam02.h" #include "rtengine.h" diff --git a/rtengine/ciecam02.h b/rtengine/ciecam02.h index 68763b965..fea35ab12 100644 --- a/rtengine/ciecam02.h +++ b/rtengine/ciecam02.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _CIECAM02_ #define _CIECAM02_ diff --git a/rtengine/cieimage.h b/rtengine/cieimage.h index 23b080ae3..660d40e78 100644 --- a/rtengine/cieimage.h +++ b/rtengine/cieimage.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _CIEIMAGE_H_ #define _CIEIMAGE_H_ diff --git a/rtengine/color.cc b/rtengine/color.cc index 7c12c0ca5..24266e52d 100644 --- a/rtengine/color.cc +++ b/rtengine/color.cc @@ -14,7 +14,7 @@ * 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 . +* along with RawTherapee. If not, see . */ #include "rtengine.h" diff --git a/rtengine/color.h b/rtengine/color.h index 5bf178636..214f420d7 100644 --- a/rtengine/color.h +++ b/rtengine/color.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #pragma once diff --git a/rtengine/colortemp.cc b/rtengine/colortemp.cc index a22caddb8..3ddbdc28a 100644 --- a/rtengine/colortemp.cc +++ b/rtengine/colortemp.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "colortemp.h" #include "rtengine.h" diff --git a/rtengine/colortemp.h b/rtengine/colortemp.h index d529d844e..da83177be 100644 --- a/rtengine/colortemp.h +++ b/rtengine/colortemp.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _COLORTEMP_ #define _COLORTEMP_ diff --git a/rtengine/coord.cc b/rtengine/coord.cc index bf9ee816e..0a73cc29d 100644 --- a/rtengine/coord.cc +++ b/rtengine/coord.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "coord.h" diff --git a/rtengine/coord.h b/rtengine/coord.h index 2f1325434..5f16cf606 100644 --- a/rtengine/coord.h +++ b/rtengine/coord.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef __COORD__ diff --git a/rtengine/coord2d.h b/rtengine/coord2d.h index bc030f22e..252219e47 100644 --- a/rtengine/coord2d.h +++ b/rtengine/coord2d.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef __COORD2D__ #define __COORD2D__ diff --git a/rtengine/cplx_wavelet_dec.cc b/rtengine/cplx_wavelet_dec.cc index a43a7b8b6..5b3650adc 100644 --- a/rtengine/cplx_wavelet_dec.cc +++ b/rtengine/cplx_wavelet_dec.cc @@ -12,7 +12,7 @@ * 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 . + * along with RawTherapee. If not, see . * * 2010 Ilya Popov * 2012 Emil Martinec diff --git a/rtengine/cplx_wavelet_dec.h b/rtengine/cplx_wavelet_dec.h index fab6119d9..91e71fcd5 100644 --- a/rtengine/cplx_wavelet_dec.h +++ b/rtengine/cplx_wavelet_dec.h @@ -12,7 +12,7 @@ * 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 . + * along with RawTherapee. If not, see . * * 2010 Ilya Popov * 2012 Emil Martinec diff --git a/rtengine/cplx_wavelet_filter_coeffs.h b/rtengine/cplx_wavelet_filter_coeffs.h index bd333d4b9..6b8255b89 100644 --- a/rtengine/cplx_wavelet_filter_coeffs.h +++ b/rtengine/cplx_wavelet_filter_coeffs.h @@ -12,7 +12,7 @@ * 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 . + * along with RawTherapee. If not, see . * * 2012 Emil Martinec * 2014 Jacques Desmis diff --git a/rtengine/cplx_wavelet_level.h b/rtengine/cplx_wavelet_level.h index cab0d8e3e..4c98addfe 100644 --- a/rtengine/cplx_wavelet_level.h +++ b/rtengine/cplx_wavelet_level.h @@ -12,7 +12,7 @@ * 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 . + * along with RawTherapee. If not, see . * * 2010 Ilya Popov * 2012 Emil Martinec diff --git a/rtengine/curves.cc b/rtengine/curves.cc index ef2a5bf92..a7e3337c8 100644 --- a/rtengine/curves.cc +++ b/rtengine/curves.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include #include diff --git a/rtengine/curves.h b/rtengine/curves.h index 55068630a..25272d44c 100644 --- a/rtengine/curves.h +++ b/rtengine/curves.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef __CURVES_H__ #define __CURVES_H__ diff --git a/rtengine/dcp.cc b/rtengine/dcp.cc index 6c948717a..8127ebfcb 100644 --- a/rtengine/dcp.cc +++ b/rtengine/dcp.cc @@ -14,7 +14,7 @@ * 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 . +* along with RawTherapee. If not, see . */ #include diff --git a/rtengine/dcp.h b/rtengine/dcp.h index 48b881661..826f073a5 100644 --- a/rtengine/dcp.h +++ b/rtengine/dcp.h @@ -14,7 +14,7 @@ * 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 . +* along with RawTherapee. If not, see . */ #pragma once diff --git a/rtengine/dcraw.h b/rtengine/dcraw.h index 81da41718..fdebda0cc 100644 --- a/rtengine/dcraw.h +++ b/rtengine/dcraw.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef DCRAW_H diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 69af056bf..61b96b3a3 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -15,7 +15,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "curves.h" #include "dcrop.h" diff --git a/rtengine/dcrop.h b/rtengine/dcrop.h index 04274ca0c..6ce034f3f 100644 --- a/rtengine/dcrop.h +++ b/rtengine/dcrop.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #pragma once diff --git a/rtengine/demosaic_algos.cc b/rtengine/demosaic_algos.cc index dc12bc01a..49b386b0a 100644 --- a/rtengine/demosaic_algos.cc +++ b/rtengine/demosaic_algos.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include #include @@ -1121,7 +1121,7 @@ void RawImageSource::lmmse_interpolate_omp(int winw, int winh, array2D &r * Contact info: luis.sanz.rodriguez@gmail.com * * This code is distributed under a GNU General Public License, version 3. -* Visit for more information. +* Visit for more information. * ***/ // Adapted to RawTherapee by Jacques Desmis 3/2013 diff --git a/rtengine/dfmanager.cc b/rtengine/dfmanager.cc index 311921c52..4877aacd8 100644 --- a/rtengine/dfmanager.cc +++ b/rtengine/dfmanager.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "dfmanager.h" #include "../rtgui/options.h" diff --git a/rtengine/dfmanager.h b/rtengine/dfmanager.h index 541981492..23ca97d14 100644 --- a/rtengine/dfmanager.h +++ b/rtengine/dfmanager.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #pragma once diff --git a/rtengine/diagonalcurves.cc b/rtengine/diagonalcurves.cc index dd85b87de..bb20b7cc1 100644 --- a/rtengine/diagonalcurves.cc +++ b/rtengine/diagonalcurves.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include #include diff --git a/rtengine/dirpyr_equalizer.cc b/rtengine/dirpyr_equalizer.cc index 94826e06e..e822d8492 100644 --- a/rtengine/dirpyr_equalizer.cc +++ b/rtengine/dirpyr_equalizer.cc @@ -12,7 +12,7 @@ * 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 . + * along with RawTherapee. If not, see . * * (C) 2010 Emil Martinec * diff --git a/rtengine/dual_demosaic_RT.cc b/rtengine/dual_demosaic_RT.cc index 4873ee670..60cce506b 100644 --- a/rtengine/dual_demosaic_RT.cc +++ b/rtengine/dual_demosaic_RT.cc @@ -19,7 +19,7 @@ // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License -// along with this program. If not, see . +// along with this program. If not, see . // //////////////////////////////////////////////////////////////// diff --git a/rtengine/dynamicprofile.cc b/rtengine/dynamicprofile.cc index 7b7f2a517..af6ecd2ff 100644 --- a/rtengine/dynamicprofile.cc +++ b/rtengine/dynamicprofile.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "../rtengine/dynamicprofile.h" diff --git a/rtengine/dynamicprofile.h b/rtengine/dynamicprofile.h index fc5c85e4c..aaffc5c4f 100644 --- a/rtengine/dynamicprofile.h +++ b/rtengine/dynamicprofile.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _DYNAMICPROFILE_H_ #define _DYNAMICPROFILE_H_ diff --git a/rtengine/eahd_demosaic.cc b/rtengine/eahd_demosaic.cc index 1663a087d..aa8fdf485 100644 --- a/rtengine/eahd_demosaic.cc +++ b/rtengine/eahd_demosaic.cc @@ -15,7 +15,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include diff --git a/rtengine/fast_demo.cc b/rtengine/fast_demo.cc index 4e3fbdabe..a40f107af 100644 --- a/rtengine/fast_demo.cc +++ b/rtengine/fast_demo.cc @@ -18,7 +18,7 @@ // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License -// along with this program. If not, see . +// along with this program. If not, see . // //////////////////////////////////////////////////////////////// diff --git a/rtengine/ffmanager.cc b/rtengine/ffmanager.cc index 56660a82a..e1a9134a8 100644 --- a/rtengine/ffmanager.cc +++ b/rtengine/ffmanager.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "ffmanager.h" #include "../rtgui/options.h" diff --git a/rtengine/ffmanager.h b/rtengine/ffmanager.h index 43fb2f368..537f8ee46 100644 --- a/rtengine/ffmanager.h +++ b/rtengine/ffmanager.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #pragma once diff --git a/rtengine/filmnegativeproc.cc b/rtengine/filmnegativeproc.cc index 12f19fba9..1a7270b82 100644 --- a/rtengine/filmnegativeproc.cc +++ b/rtengine/filmnegativeproc.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include #include diff --git a/rtengine/filmnegativethumb.cc b/rtengine/filmnegativethumb.cc index 8c7564b86..6a4da31b0 100644 --- a/rtengine/filmnegativethumb.cc +++ b/rtengine/filmnegativethumb.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include diff --git a/rtengine/flatcurves.cc b/rtengine/flatcurves.cc index fe5ecc5e1..d24c20a70 100644 --- a/rtengine/flatcurves.cc +++ b/rtengine/flatcurves.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "curves.h" #include diff --git a/rtengine/gamutwarning.cc b/rtengine/gamutwarning.cc index c76e2a285..3fc20d43a 100644 --- a/rtengine/gamutwarning.cc +++ b/rtengine/gamutwarning.cc @@ -15,7 +15,7 @@ * 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 . + * along with RawTherapee. If not, see . */ /** diff --git a/rtengine/gamutwarning.h b/rtengine/gamutwarning.h index 19a27cdfd..e0aaa98d9 100644 --- a/rtengine/gamutwarning.h +++ b/rtengine/gamutwarning.h @@ -15,7 +15,7 @@ * 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 . + * along with RawTherapee. If not, see . */ /** diff --git a/rtengine/gauss.cc b/rtengine/gauss.cc index b7de67851..40014f211 100644 --- a/rtengine/gauss.cc +++ b/rtengine/gauss.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "gauss.h" #include diff --git a/rtengine/gauss.h b/rtengine/gauss.h index 72f115cc4..b63301d2b 100644 --- a/rtengine/gauss.h +++ b/rtengine/gauss.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _GAUSS_H_ #define _GAUSS_H_ diff --git a/rtengine/green_equil_RT.cc b/rtengine/green_equil_RT.cc index 361bde882..fc4f18548 100644 --- a/rtengine/green_equil_RT.cc +++ b/rtengine/green_equil_RT.cc @@ -19,7 +19,7 @@ // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License -// along with this program. If not, see . +// along with this program. If not, see . // //////////////////////////////////////////////////////////////// diff --git a/rtengine/guidedfilter.cc b/rtengine/guidedfilter.cc index e7fe9b8af..0ebe6c172 100644 --- a/rtengine/guidedfilter.cc +++ b/rtengine/guidedfilter.cc @@ -15,7 +15,7 @@ * 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 . + * along with RawTherapee. If not, see . */ /** diff --git a/rtengine/guidedfilter.h b/rtengine/guidedfilter.h index 6691af251..af8ed0901 100644 --- a/rtengine/guidedfilter.h +++ b/rtengine/guidedfilter.h @@ -15,7 +15,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #pragma once diff --git a/rtengine/hilite_recon.cc b/rtengine/hilite_recon.cc index 7134ac34f..35dd74463 100644 --- a/rtengine/hilite_recon.cc +++ b/rtengine/hilite_recon.cc @@ -20,7 +20,7 @@ // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License -// along with this program. If not, see . +// along with this program. If not, see . // //////////////////////////////////////////////////////////////// diff --git a/rtengine/histmatching.cc b/rtengine/histmatching.cc index f9268ea5d..212b11d00 100644 --- a/rtengine/histmatching.cc +++ b/rtengine/histmatching.cc @@ -15,7 +15,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "rawimagesource.h" diff --git a/rtengine/hphd_demosaic_RT.cc b/rtengine/hphd_demosaic_RT.cc index 7e27b90a5..0e56eae48 100644 --- a/rtengine/hphd_demosaic_RT.cc +++ b/rtengine/hphd_demosaic_RT.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include diff --git a/rtengine/iccmatrices.h b/rtengine/iccmatrices.h index 29426c62d..3e0d0b5d6 100644 --- a/rtengine/iccmatrices.h +++ b/rtengine/iccmatrices.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _ICCMATRICES_ #define _ICCMATRICES_ diff --git a/rtengine/iccstore.cc b/rtengine/iccstore.cc index 268a6b1c2..a8d54b810 100644 --- a/rtengine/iccstore.cc +++ b/rtengine/iccstore.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include diff --git a/rtengine/iccstore.h b/rtengine/iccstore.h index 6b57fd072..5c76660e5 100644 --- a/rtengine/iccstore.h +++ b/rtengine/iccstore.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #pragma once diff --git a/rtengine/iimage.cc b/rtengine/iimage.cc index c9a4f223a..a1ec979a1 100644 --- a/rtengine/iimage.cc +++ b/rtengine/iimage.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "procparams.h" diff --git a/rtengine/iimage.h b/rtengine/iimage.h index ff016df1a..b04b4bf9a 100644 --- a/rtengine/iimage.h +++ b/rtengine/iimage.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _IIMAGE_ #define _IIMAGE_ diff --git a/rtengine/image16.cc b/rtengine/image16.cc index 7d4d3e41d..0cdcc578f 100644 --- a/rtengine/image16.cc +++ b/rtengine/image16.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "image16.h" #include "imagefloat.h" diff --git a/rtengine/image16.h b/rtengine/image16.h index f31626939..07747a172 100644 --- a/rtengine/image16.h +++ b/rtengine/image16.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ // // A class representing a 16 bit rgb image with separate planes and 16 byte aligned data diff --git a/rtengine/image8.cc b/rtengine/image8.cc index 850ec87c0..abcd4efae 100644 --- a/rtengine/image8.cc +++ b/rtengine/image8.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include #include diff --git a/rtengine/image8.h b/rtengine/image8.h index 57852b7af..969627f69 100644 --- a/rtengine/image8.h +++ b/rtengine/image8.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ // // A class representing a 8 bit rgb image without alpha channel diff --git a/rtengine/imagedata.cc b/rtengine/imagedata.cc index b074cdbb2..403f4708c 100644 --- a/rtengine/imagedata.cc +++ b/rtengine/imagedata.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include #include diff --git a/rtengine/imagedata.h b/rtengine/imagedata.h index 774547487..99caaf361 100644 --- a/rtengine/imagedata.h +++ b/rtengine/imagedata.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef __IMAGEDATA_H__ #define __IMAGEDATA_H__ diff --git a/rtengine/imagedimensions.cc b/rtengine/imagedimensions.cc index 7dec1358a..5b60e5da7 100644 --- a/rtengine/imagedimensions.cc +++ b/rtengine/imagedimensions.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "imagedimensions.h" diff --git a/rtengine/imagedimensions.h b/rtengine/imagedimensions.h index 63b1a1062..eb92798c3 100644 --- a/rtengine/imagedimensions.h +++ b/rtengine/imagedimensions.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #pragma once diff --git a/rtengine/imagefloat.cc b/rtengine/imagefloat.cc index 793915604..8a9a511a6 100644 --- a/rtengine/imagefloat.cc +++ b/rtengine/imagefloat.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include #include "imagefloat.h" diff --git a/rtengine/imagefloat.h b/rtengine/imagefloat.h index 805971e7a..261a0677c 100644 --- a/rtengine/imagefloat.h +++ b/rtengine/imagefloat.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ // // A class representing a 16 bit rgb image with separate planes and 16 byte aligned data diff --git a/rtengine/imageformat.h b/rtengine/imageformat.h index 22708daef..dc40cf147 100644 --- a/rtengine/imageformat.h +++ b/rtengine/imageformat.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _IMAGEFORMAT_ #define _IMAGEFORMAT_ diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index 1e4f8c008..f335f5be8 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -15,7 +15,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include #include diff --git a/rtengine/imageio.h b/rtengine/imageio.h index fd2cbc2b9..89c482ca3 100644 --- a/rtengine/imageio.h +++ b/rtengine/imageio.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _IMAGEIO_ #define _IMAGEIO_ diff --git a/rtengine/imagesource.h b/rtengine/imagesource.h index bf73b5bb2..705d29d62 100644 --- a/rtengine/imagesource.h +++ b/rtengine/imagesource.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #pragma once diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index daadcb16c..b74c14e2e 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "improccoordinator.h" #include "curves.h" diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index fdf74d297..fbe233607 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _IMPROCCOORDINATOR_H_ #define _IMPROCCOORDINATOR_H_ diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 23dc4b1ba..db77e02fa 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include #include @@ -5815,7 +5815,7 @@ void ImProcFunctions::lab2rgb (const LabImage &src, Imagefloat &dst, const Glib: GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with darktable. If not, see . + along with darktable. If not, see . */ void ImProcFunctions::colorToningLabGrid(LabImage *lab, int xstart, int xend, int ystart, int yend, bool MultiThread) { diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 987a460d7..8278e2f37 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _IMPROCFUN_H_ #define _IMPROCFUN_H_ diff --git a/rtengine/impulse_denoise.cc b/rtengine/impulse_denoise.cc index 907afc1a1..c08f55700 100644 --- a/rtengine/impulse_denoise.cc +++ b/rtengine/impulse_denoise.cc @@ -12,7 +12,7 @@ * 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 . + * along with RawTherapee. If not, see . * * 2010 Emil Martinec * diff --git a/rtengine/init.cc b/rtengine/init.cc index 8d7ee451f..8d3ee96cb 100644 --- a/rtengine/init.cc +++ b/rtengine/init.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include #include "../rtgui/profilestorecombobox.h" diff --git a/rtengine/ipdehaze.cc b/rtengine/ipdehaze.cc index 42a5f92b3..60d4cb9ff 100644 --- a/rtengine/ipdehaze.cc +++ b/rtengine/ipdehaze.cc @@ -15,7 +15,7 @@ * 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 . + * along with RawTherapee. If not, see . */ /* diff --git a/rtengine/iplab2rgb.cc b/rtengine/iplab2rgb.cc index 8b5a2cb71..14aeb4049 100644 --- a/rtengine/iplab2rgb.cc +++ b/rtengine/iplab2rgb.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "rtengine.h" #include "improcfun.h" diff --git a/rtengine/iplabregions.cc b/rtengine/iplabregions.cc index 5945398d2..af6567c3c 100644 --- a/rtengine/iplabregions.cc +++ b/rtengine/iplabregions.cc @@ -15,7 +15,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifdef _OPENMP diff --git a/rtengine/iplocalcontrast.cc b/rtengine/iplocalcontrast.cc index 1bf21829e..6143f48a3 100644 --- a/rtengine/iplocalcontrast.cc +++ b/rtengine/iplocalcontrast.cc @@ -19,7 +19,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifdef _OPENMP diff --git a/rtengine/ipresize.cc b/rtengine/ipresize.cc index 2a66e68cb..0c1fb1ad8 100644 --- a/rtengine/ipresize.cc +++ b/rtengine/ipresize.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "improcfun.h" diff --git a/rtengine/ipretinex.cc b/rtengine/ipretinex.cc index 309c7073b..7117c9f2a 100644 --- a/rtengine/ipretinex.cc +++ b/rtengine/ipretinex.cc @@ -14,7 +14,7 @@ * 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 . +* along with RawTherapee. If not, see . * adaptation to RawTherapee * 2015 Jacques Desmis diff --git a/rtengine/ipshadowshighlights.cc b/rtengine/ipshadowshighlights.cc index 2433ca13c..cddc8734b 100644 --- a/rtengine/ipshadowshighlights.cc +++ b/rtengine/ipshadowshighlights.cc @@ -15,7 +15,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "improcfun.h" diff --git a/rtengine/ipsharpen.cc b/rtengine/ipsharpen.cc index 9d7358fa9..73510fe92 100644 --- a/rtengine/ipsharpen.cc +++ b/rtengine/ipsharpen.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "improcfun.h" diff --git a/rtengine/ipsoftlight.cc b/rtengine/ipsoftlight.cc index 6aca9b8eb..c7a4d1af7 100644 --- a/rtengine/ipsoftlight.cc +++ b/rtengine/ipsoftlight.cc @@ -15,7 +15,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifdef _OPENMP diff --git a/rtengine/iptcpairs.h b/rtengine/iptcpairs.h index e0b34180f..21099735a 100644 --- a/rtengine/iptcpairs.h +++ b/rtengine/iptcpairs.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _IPTCPAIRS_ #define _IPTCPAIRS_ diff --git a/rtengine/iptransform.cc b/rtengine/iptransform.cc index 5b1e7c458..8dee92479 100644 --- a/rtengine/iptransform.cc +++ b/rtengine/iptransform.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "rtengine.h" #include "improcfun.h" diff --git a/rtengine/ipvibrance.cc b/rtengine/ipvibrance.cc index ca938fbbe..a7199064a 100644 --- a/rtengine/ipvibrance.cc +++ b/rtengine/ipvibrance.cc @@ -15,7 +15,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "rt_math.h" diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index ff7aefa19..07e9da85b 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -16,7 +16,7 @@ // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License -// along with this program. If not, see . +// along with this program. If not, see . // * 2014 Jacques Desmis // * 2014 Ingo Weyrich diff --git a/rtengine/jaggedarray.h b/rtengine/jaggedarray.h index 01da776a6..59c1485d8 100644 --- a/rtengine/jaggedarray.h +++ b/rtengine/jaggedarray.h @@ -15,7 +15,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #pragma once diff --git a/rtengine/labimage.cc b/rtengine/labimage.cc index 81b1a4303..b31bc89a1 100644 --- a/rtengine/labimage.cc +++ b/rtengine/labimage.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include diff --git a/rtengine/labimage.h b/rtengine/labimage.h index 28bb891a9..bcc2484ab 100644 --- a/rtengine/labimage.h +++ b/rtengine/labimage.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _LABIMAGE_H_ #define _LABIMAGE_H_ diff --git a/rtengine/lcp.cc b/rtengine/lcp.cc index cf025ddbe..b456fc478 100644 --- a/rtengine/lcp.cc +++ b/rtengine/lcp.cc @@ -14,7 +14,7 @@ * 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 . +* along with RawTherapee. If not, see . */ #include diff --git a/rtengine/lcp.h b/rtengine/lcp.h index 2d9707907..30b7e5191 100644 --- a/rtengine/lcp.h +++ b/rtengine/lcp.h @@ -14,7 +14,7 @@ * 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 . +* along with RawTherapee. If not, see . */ #pragma once diff --git a/rtengine/loadinitial.cc b/rtengine/loadinitial.cc index 6192ca6db..00dbbf836 100644 --- a/rtengine/loadinitial.cc +++ b/rtengine/loadinitial.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "rtengine.h" #include "stdimagesource.h" diff --git a/rtengine/median.h b/rtengine/median.h index 30adbacb3..acd92235c 100644 --- a/rtengine/median.h +++ b/rtengine/median.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . * * These median implementations from Flössie and Ingo Weyrich are inspired by this work: * diff --git a/rtengine/myfile.cc b/rtengine/myfile.cc index 28d187e4c..259e08565 100644 --- a/rtengine/myfile.cc +++ b/rtengine/myfile.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "myfile.h" #include diff --git a/rtengine/myfile.h b/rtengine/myfile.h index e4609c697..f2ed4150c 100644 --- a/rtengine/myfile.h +++ b/rtengine/myfile.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _MYFILE_ #define _MYFILE_ diff --git a/rtengine/mytime.h b/rtengine/mytime.h index a0ce15bc7..80fb0899a 100644 --- a/rtengine/mytime.h +++ b/rtengine/mytime.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #pragma once diff --git a/rtengine/noncopyable.h b/rtengine/noncopyable.h index d34c42441..d915a6f78 100644 --- a/rtengine/noncopyable.h +++ b/rtengine/noncopyable.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #pragma once diff --git a/rtengine/opthelper.h b/rtengine/opthelper.h index ce1f620e1..b65ede227 100644 --- a/rtengine/opthelper.h +++ b/rtengine/opthelper.h @@ -15,7 +15,7 @@ // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License -// along with this program. If not, see . +// along with this program. If not, see . // //////////////////////////////////////////////////////////////// diff --git a/rtengine/pdaflinesfilter.cc b/rtengine/pdaflinesfilter.cc index 0c5b2d786..d0694fd11 100644 --- a/rtengine/pdaflinesfilter.cc +++ b/rtengine/pdaflinesfilter.cc @@ -15,7 +15,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "pdaflinesfilter.h" diff --git a/rtengine/pdaflinesfilter.h b/rtengine/pdaflinesfilter.h index 3ae406ec8..7f4c7985b 100644 --- a/rtengine/pdaflinesfilter.h +++ b/rtengine/pdaflinesfilter.h @@ -15,7 +15,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #pragma once diff --git a/rtengine/pipettebuffer.cc b/rtengine/pipettebuffer.cc index 4ad8afad1..d915381ef 100644 --- a/rtengine/pipettebuffer.cc +++ b/rtengine/pipettebuffer.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "pipettebuffer.h" diff --git a/rtengine/pipettebuffer.h b/rtengine/pipettebuffer.h index ab9ba6197..01b24720c 100644 --- a/rtengine/pipettebuffer.h +++ b/rtengine/pipettebuffer.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #pragma once diff --git a/rtengine/pixelshift.cc b/rtengine/pixelshift.cc index b31ff62c9..4b93f3f61 100644 --- a/rtengine/pixelshift.cc +++ b/rtengine/pixelshift.cc @@ -16,7 +16,7 @@ // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License -// along with this program. If not, see . +// along with this program. If not, see . // //////////////////////////////////////////////////////////////// diff --git a/rtengine/pixelsmap.h b/rtengine/pixelsmap.h index b359d61d9..f747c52d9 100644 --- a/rtengine/pixelsmap.h +++ b/rtengine/pixelsmap.h @@ -16,7 +16,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include diff --git a/rtengine/previewimage.cc b/rtengine/previewimage.cc index e62a1adea..7216e6a34 100644 --- a/rtengine/previewimage.cc +++ b/rtengine/previewimage.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "previewimage.h" diff --git a/rtengine/previewimage.h b/rtengine/previewimage.h index 26b9a85d2..71ddefe8a 100644 --- a/rtengine/previewimage.h +++ b/rtengine/previewimage.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _PREVIEWIMAGE_ #define _PREVIEWIMAGE_ diff --git a/rtengine/processingjob.cc b/rtengine/processingjob.cc index a377e3963..2f9c15196 100644 --- a/rtengine/processingjob.cc +++ b/rtengine/processingjob.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "processingjob.h" diff --git a/rtengine/processingjob.h b/rtengine/processingjob.h index b2a81e4c2..004eb006f 100644 --- a/rtengine/processingjob.h +++ b/rtengine/processingjob.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _PROCESSINGJOB_ #define _PROCESSINGJOB_ diff --git a/rtengine/procevents.h b/rtengine/procevents.h index bb6a30038..32fdb0f4e 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef __PROCEVENT__ #define __PROCEVENT__ diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index f14d72871..0d7d55286 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 6ae807d7e..253ed26eb 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #pragma once diff --git a/rtengine/profilestore.cc b/rtengine/profilestore.cc index 776dd7caa..5c38cf705 100644 --- a/rtengine/profilestore.cc +++ b/rtengine/profilestore.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "profilestore.h" diff --git a/rtengine/profilestore.h b/rtengine/profilestore.h index d8c193935..384aa2a46 100644 --- a/rtengine/profilestore.h +++ b/rtengine/profilestore.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _PROFILESTORE_ #define _PROFILESTORE_ diff --git a/rtengine/rawimage.h b/rtengine/rawimage.h index ae0bcea84..9c6d42969 100644 --- a/rtengine/rawimage.h +++ b/rtengine/rawimage.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef __RAWIMAGE_H #define __RAWIMAGE_H diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index a1762af93..d0fb87313 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include #include diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index 940773271..decdcef12 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #pragma once diff --git a/rtengine/rawimagesource_i.h b/rtengine/rawimagesource_i.h index b24115e0a..485205d9d 100644 --- a/rtengine/rawimagesource_i.h +++ b/rtengine/rawimagesource_i.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef RAWIMAGESOURCE_I_H_INCLUDED diff --git a/rtengine/rawmetadatalocation.h b/rtengine/rawmetadatalocation.h index de6c6a0d7..559815a4f 100644 --- a/rtengine/rawmetadatalocation.h +++ b/rtengine/rawmetadatalocation.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _RAWMETADATALOCATION_ #define _RAWMETADATALOCATION_ diff --git a/rtengine/rcd_demosaic.cc b/rtengine/rcd_demosaic.cc index 95c5b4792..48c3ad334 100644 --- a/rtengine/rcd_demosaic.cc +++ b/rtengine/rcd_demosaic.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index d741b1744..94c3e71f8 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "refreshmap.h" #include "procevents.h" diff --git a/rtengine/refreshmap.h b/rtengine/refreshmap.h index b9ccc2b65..2890d8f19 100644 --- a/rtengine/refreshmap.h +++ b/rtengine/refreshmap.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef __REFRESHMAP__ #define __REFRESHMAP__ diff --git a/rtengine/rescale.h b/rtengine/rescale.h index ba9a01c99..e9d476fea 100644 --- a/rtengine/rescale.h +++ b/rtengine/rescale.h @@ -15,7 +15,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #pragma once diff --git a/rtengine/rt_algo.cc b/rtengine/rt_algo.cc index 1011ae7b7..5c5da6bca 100644 --- a/rtengine/rt_algo.cc +++ b/rtengine/rt_algo.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include diff --git a/rtengine/rt_algo.h b/rtengine/rt_algo.h index a8e2e3e23..bf442b9be 100644 --- a/rtengine/rt_algo.h +++ b/rtengine/rt_algo.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #pragma once diff --git a/rtengine/rtengine.h b/rtengine/rtengine.h index f772975b0..a0be5a7f6 100644 --- a/rtengine/rtengine.h +++ b/rtengine/rtengine.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #pragma once diff --git a/rtengine/rtlensfun.cc b/rtengine/rtlensfun.cc index 5f0ffdd91..8c634eaa8 100644 --- a/rtengine/rtlensfun.cc +++ b/rtengine/rtlensfun.cc @@ -15,7 +15,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "rtlensfun.h" diff --git a/rtengine/rtlensfun.h b/rtengine/rtlensfun.h index 8b097b30e..092e2bf01 100644 --- a/rtengine/rtlensfun.h +++ b/rtengine/rtlensfun.h @@ -15,7 +15,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #pragma once diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index 3e970ed0d..25f50980d 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "rtengine.h" #include "rtthumbnail.h" diff --git a/rtengine/rtthumbnail.h b/rtengine/rtthumbnail.h index 09a0510eb..8b3f27a8b 100644 --- a/rtengine/rtthumbnail.h +++ b/rtengine/rtthumbnail.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _THUMBPROCESSINGPARAMETERS_ #define _THUMBPROCESSINGPARAMETERS_ diff --git a/rtengine/settings.h b/rtengine/settings.h index 1fc3b222c..8852c05c8 100644 --- a/rtengine/settings.h +++ b/rtengine/settings.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _RTSETTINGS_ #define _RTSETTINGS_ diff --git a/rtengine/shmap.cc b/rtengine/shmap.cc index 1eb911220..6b59c4b40 100644 --- a/rtengine/shmap.cc +++ b/rtengine/shmap.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "shmap.h" #include "gauss.h" diff --git a/rtengine/shmap.h b/rtengine/shmap.h index 4234e203d..539ef99ff 100644 --- a/rtengine/shmap.h +++ b/rtengine/shmap.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef __SHMAP__ #define __SHMAP__ diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 8d24514d6..d80abe045 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "rtengine.h" #include "colortemp.h" diff --git a/rtengine/slicer.cc b/rtengine/slicer.cc index 72a42e07e..96c0a0ee8 100644 --- a/rtengine/slicer.cc +++ b/rtengine/slicer.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include diff --git a/rtengine/slicer.h b/rtengine/slicer.h index 06e1522cd..658133e5f 100644 --- a/rtengine/slicer.h +++ b/rtengine/slicer.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _SLICER_ #define _SLICER_ diff --git a/rtengine/stdimagesource.cc b/rtengine/stdimagesource.cc index e5c98a93a..2ec1529f7 100644 --- a/rtengine/stdimagesource.cc +++ b/rtengine/stdimagesource.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "stdimagesource.h" diff --git a/rtengine/stdimagesource.h b/rtengine/stdimagesource.h index 8f16880dc..8ad8cb8ea 100644 --- a/rtengine/stdimagesource.h +++ b/rtengine/stdimagesource.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _STDIMAGESOURCE_ #define _STDIMAGESOURCE_ diff --git a/rtengine/tmo_fattal02.cc b/rtengine/tmo_fattal02.cc index 76da1f03d..6b5460ffd 100644 --- a/rtengine/tmo_fattal02.cc +++ b/rtengine/tmo_fattal02.cc @@ -15,7 +15,7 @@ * 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 . + * along with RawTherapee. If not, see . */ /** diff --git a/rtengine/utils.cc b/rtengine/utils.cc index 613b67be8..a07a1235f 100644 --- a/rtengine/utils.cc +++ b/rtengine/utils.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include #include diff --git a/rtengine/utils.h b/rtengine/utils.h index 14593edae..e0097d76e 100644 --- a/rtengine/utils.h +++ b/rtengine/utils.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #pragma once diff --git a/rtengine/vng4_demosaic_RT.cc b/rtengine/vng4_demosaic_RT.cc index f9a4c5bc2..66413e4c7 100644 --- a/rtengine/vng4_demosaic_RT.cc +++ b/rtengine/vng4_demosaic_RT.cc @@ -16,7 +16,7 @@ // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License -// along with this program. If not, see . +// along with this program. If not, see . // //////////////////////////////////////////////////////////////// diff --git a/rtengine/xtrans_demosaic.cc b/rtengine/xtrans_demosaic.cc index 866bc9714..e84b5217e 100644 --- a/rtengine/xtrans_demosaic.cc +++ b/rtengine/xtrans_demosaic.cc @@ -15,7 +15,7 @@ // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License -// along with this program. If not, see . +// along with this program. If not, see . // //////////////////////////////////////////////////////////////// diff --git a/rtexif/canonattribs.cc b/rtexif/canonattribs.cc index 2dcbdd96f..0e6f7eb2f 100644 --- a/rtexif/canonattribs.cc +++ b/rtexif/canonattribs.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _CANONATTRIBS_ #define _CANONATTRIBS_ diff --git a/rtexif/fujiattribs.cc b/rtexif/fujiattribs.cc index 2e17a68f9..0eaa505f6 100644 --- a/rtexif/fujiattribs.cc +++ b/rtexif/fujiattribs.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _FUJIATTRIBS_ #define _FUJIATTRIBS_ diff --git a/rtexif/nikonattribs.cc b/rtexif/nikonattribs.cc index 678b4b568..77720dde0 100644 --- a/rtexif/nikonattribs.cc +++ b/rtexif/nikonattribs.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _NIKONATTRIBS_ #define _NIKONATTRIBS_ diff --git a/rtexif/olympusattribs.cc b/rtexif/olympusattribs.cc index e42763e35..f9869f13e 100644 --- a/rtexif/olympusattribs.cc +++ b/rtexif/olympusattribs.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _OLYMPUSATTRIBS_ #define _OLYMPUSATTRIBS_ diff --git a/rtexif/pentaxattribs.cc b/rtexif/pentaxattribs.cc index 7e861d64f..898150696 100644 --- a/rtexif/pentaxattribs.cc +++ b/rtexif/pentaxattribs.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _PENTAXATTRIBS_ #define _PENTAXATTRIBS_ diff --git a/rtexif/rtexif.cc b/rtexif/rtexif.cc index dcc0ed56d..4e3be8486 100644 --- a/rtexif/rtexif.cc +++ b/rtexif/rtexif.cc @@ -16,7 +16,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include #include diff --git a/rtexif/rtexif.h b/rtexif/rtexif.h index 0ee18ec7e..f4b0e089e 100644 --- a/rtexif/rtexif.h +++ b/rtexif/rtexif.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _MEXIF3_ #define _MEXIF3_ diff --git a/rtexif/sonyminoltaattribs.cc b/rtexif/sonyminoltaattribs.cc index 0c6e433ff..4410a4051 100644 --- a/rtexif/sonyminoltaattribs.cc +++ b/rtexif/sonyminoltaattribs.cc @@ -13,7 +13,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _SONYMINOLTAATTRIBS_ #define _SONYMINOLTAATTRIBS_ diff --git a/rtexif/stdattribs.cc b/rtexif/stdattribs.cc index ec5534381..8e076152d 100644 --- a/rtexif/stdattribs.cc +++ b/rtexif/stdattribs.cc @@ -15,7 +15,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _STDATTRIBS_ #define _STDATTRIBS_ diff --git a/rtgui/adjuster.cc b/rtgui/adjuster.cc index 5a3f783db..5182cd825 100644 --- a/rtgui/adjuster.cc +++ b/rtgui/adjuster.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "adjuster.h" #include diff --git a/rtgui/adjuster.h b/rtgui/adjuster.h index f3f256940..52857a3d2 100644 --- a/rtgui/adjuster.h +++ b/rtgui/adjuster.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _ADJUSTER_H_ #define _ADJUSTER_H_ diff --git a/rtgui/alignedmalloc.cc b/rtgui/alignedmalloc.cc index 91fe15a85..85517e5c0 100644 --- a/rtgui/alignedmalloc.cc +++ b/rtgui/alignedmalloc.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "config.h" diff --git a/rtgui/batchqueue.cc b/rtgui/batchqueue.cc index 3fb2cd438..abb37b24d 100644 --- a/rtgui/batchqueue.cc +++ b/rtgui/batchqueue.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include #include diff --git a/rtgui/batchqueue.h b/rtgui/batchqueue.h index 6f1b8f7f8..f61b7b5c4 100644 --- a/rtgui/batchqueue.h +++ b/rtgui/batchqueue.h @@ -13,7 +13,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _BATCHQUEUE_ #define _BATCHQUEUE_ diff --git a/rtgui/batchqueuebuttonset.cc b/rtgui/batchqueuebuttonset.cc index b42d3c773..a8be9eedf 100644 --- a/rtgui/batchqueuebuttonset.cc +++ b/rtgui/batchqueuebuttonset.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "batchqueuebuttonset.h" diff --git a/rtgui/batchqueuebuttonset.h b/rtgui/batchqueuebuttonset.h index e97819719..19479ccc1 100644 --- a/rtgui/batchqueuebuttonset.h +++ b/rtgui/batchqueuebuttonset.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _BATCHQUEUEBUTTONSET_ #define _BATCHQUEUEBUTTONSET_ diff --git a/rtgui/batchqueueentry.cc b/rtgui/batchqueueentry.cc index 78e3991c7..424c8e486 100644 --- a/rtgui/batchqueueentry.cc +++ b/rtgui/batchqueueentry.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "batchqueueentry.h" diff --git a/rtgui/batchqueueentry.h b/rtgui/batchqueueentry.h index 4972eaf7a..03097e55e 100644 --- a/rtgui/batchqueueentry.h +++ b/rtgui/batchqueueentry.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _BATCHQUEUEENTRY_ #define _BATCHQUEUEENTRY_ diff --git a/rtgui/batchqueuepanel.cc b/rtgui/batchqueuepanel.cc index b800907e9..9107aaaa8 100644 --- a/rtgui/batchqueuepanel.cc +++ b/rtgui/batchqueuepanel.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "batchqueuepanel.h" #include "options.h" diff --git a/rtgui/batchqueuepanel.h b/rtgui/batchqueuepanel.h index a1ee7326f..2f8e27057 100644 --- a/rtgui/batchqueuepanel.h +++ b/rtgui/batchqueuepanel.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _BATCHQUEUEPANEL_ #define _BATCHQUEUEPANEL_ diff --git a/rtgui/batchtoolpanelcoord.cc b/rtgui/batchtoolpanelcoord.cc index 1a0eaeb28..592b59a4f 100644 --- a/rtgui/batchtoolpanelcoord.cc +++ b/rtgui/batchtoolpanelcoord.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "multilangmgr.h" #include "batchtoolpanelcoord.h" diff --git a/rtgui/batchtoolpanelcoord.h b/rtgui/batchtoolpanelcoord.h index f5889f967..f03d1d4b2 100644 --- a/rtgui/batchtoolpanelcoord.h +++ b/rtgui/batchtoolpanelcoord.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef __BATCHTOOLPANELCCORD__ #define __BATCHTOOLPANELCCORD__ diff --git a/rtgui/bayerpreprocess.cc b/rtgui/bayerpreprocess.cc index 0ba60d045..0c01213e7 100644 --- a/rtgui/bayerpreprocess.cc +++ b/rtgui/bayerpreprocess.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include diff --git a/rtgui/bayerpreprocess.h b/rtgui/bayerpreprocess.h index f50ac90bb..5d2b101d9 100644 --- a/rtgui/bayerpreprocess.h +++ b/rtgui/bayerpreprocess.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _BAYERPREPROCESS_H_ #define _BAYERPREPROCESS_H_ diff --git a/rtgui/bayerprocess.cc b/rtgui/bayerprocess.cc index c361ded16..aa09067e4 100644 --- a/rtgui/bayerprocess.cc +++ b/rtgui/bayerprocess.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "bayerprocess.h" diff --git a/rtgui/bayerprocess.h b/rtgui/bayerprocess.h index df0c39d00..893010e65 100644 --- a/rtgui/bayerprocess.h +++ b/rtgui/bayerprocess.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _BAYERPROCESS_H_ #define _BAYERPROCESS_H_ diff --git a/rtgui/bayerrawexposure.cc b/rtgui/bayerrawexposure.cc index 12158c774..9d8f9fff8 100644 --- a/rtgui/bayerrawexposure.cc +++ b/rtgui/bayerrawexposure.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "bayerrawexposure.h" diff --git a/rtgui/bayerrawexposure.h b/rtgui/bayerrawexposure.h index e955afc12..5825383be 100644 --- a/rtgui/bayerrawexposure.h +++ b/rtgui/bayerrawexposure.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _BAYERRAWEXPOSURE_H_ #define _BAYERRAWEXPOSURE_H_ diff --git a/rtgui/blackwhite.cc b/rtgui/blackwhite.cc index 2b97188e2..b5ecb96bd 100644 --- a/rtgui/blackwhite.cc +++ b/rtgui/blackwhite.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include #include diff --git a/rtgui/blackwhite.h b/rtgui/blackwhite.h index 242926924..36234cda5 100644 --- a/rtgui/blackwhite.h +++ b/rtgui/blackwhite.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _BLACKWHITE_H_ #define _BLACKWHITE_H_ diff --git a/rtgui/bqentryupdater.cc b/rtgui/bqentryupdater.cc index 46aedc869..21a0f5ad0 100644 --- a/rtgui/bqentryupdater.cc +++ b/rtgui/bqentryupdater.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "bqentryupdater.h" #include diff --git a/rtgui/bqentryupdater.h b/rtgui/bqentryupdater.h index e25f5aed4..efd63f9de 100644 --- a/rtgui/bqentryupdater.h +++ b/rtgui/bqentryupdater.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _BQENTRYUPDATER_ #define _BQENTRYUPDATER_ diff --git a/rtgui/browserfilter.cc b/rtgui/browserfilter.cc index cd3af072e..c6a8ae46b 100644 --- a/rtgui/browserfilter.cc +++ b/rtgui/browserfilter.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "browserfilter.h" diff --git a/rtgui/browserfilter.h b/rtgui/browserfilter.h index ac9818ce5..f5dac180e 100644 --- a/rtgui/browserfilter.h +++ b/rtgui/browserfilter.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _BROWSERFILTER_ #define _BROWSERFILTER_ diff --git a/rtgui/cacheimagedata.cc b/rtgui/cacheimagedata.cc index 1756f523b..d31b6c7a5 100644 --- a/rtgui/cacheimagedata.cc +++ b/rtgui/cacheimagedata.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "cacheimagedata.h" #include diff --git a/rtgui/cacheimagedata.h b/rtgui/cacheimagedata.h index 9de9d186f..72bf55749 100644 --- a/rtgui/cacheimagedata.h +++ b/rtgui/cacheimagedata.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _CACHEIMAGEDATA_ #define _CACHEIMAGEDATA_ diff --git a/rtgui/cachemanager.cc b/rtgui/cachemanager.cc index b270c3795..419538656 100644 --- a/rtgui/cachemanager.cc +++ b/rtgui/cachemanager.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include diff --git a/rtgui/cachemanager.h b/rtgui/cachemanager.h index 99c732e88..3e987866d 100644 --- a/rtgui/cachemanager.h +++ b/rtgui/cachemanager.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _CACHEMANAGER_ #define _CACHEMANAGER_ diff --git a/rtgui/cacorrection.cc b/rtgui/cacorrection.cc index 5b66dd6c3..971c0a284 100644 --- a/rtgui/cacorrection.cc +++ b/rtgui/cacorrection.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include diff --git a/rtgui/cacorrection.h b/rtgui/cacorrection.h index 4fa85038c..f6e1f89e3 100644 --- a/rtgui/cacorrection.h +++ b/rtgui/cacorrection.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _CACORRECTION_H_ #define _CACORRECTION_H_ diff --git a/rtgui/checkbox.cc b/rtgui/checkbox.cc index 1e3c2b61e..e05ba061a 100644 --- a/rtgui/checkbox.cc +++ b/rtgui/checkbox.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include diff --git a/rtgui/checkbox.h b/rtgui/checkbox.h index b5ab4945f..48324d4c8 100644 --- a/rtgui/checkbox.h +++ b/rtgui/checkbox.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _CHECKBOX_H_ #define _CHECKBOX_H_ diff --git a/rtgui/chmixer.cc b/rtgui/chmixer.cc index 82e885f08..4b243f13c 100644 --- a/rtgui/chmixer.cc +++ b/rtgui/chmixer.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "chmixer.h" diff --git a/rtgui/chmixer.h b/rtgui/chmixer.h index a0fff9b26..94f54ed3d 100644 --- a/rtgui/chmixer.h +++ b/rtgui/chmixer.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _CHMIXER_H_ #define _CHMIXER_H_ diff --git a/rtgui/clipboard.cc b/rtgui/clipboard.cc index c8eb94d7b..4cd50f574 100644 --- a/rtgui/clipboard.cc +++ b/rtgui/clipboard.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "clipboard.h" diff --git a/rtgui/clipboard.h b/rtgui/clipboard.h index 74c9f6770..4c0ec452f 100644 --- a/rtgui/clipboard.h +++ b/rtgui/clipboard.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _CLIPBOARD_ #define _CLIPBOARD_ diff --git a/rtgui/coarsepanel.cc b/rtgui/coarsepanel.cc index 92c312554..c64d53017 100644 --- a/rtgui/coarsepanel.cc +++ b/rtgui/coarsepanel.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "coarsepanel.h" diff --git a/rtgui/coarsepanel.h b/rtgui/coarsepanel.h index bd4668eea..2da56b904 100644 --- a/rtgui/coarsepanel.h +++ b/rtgui/coarsepanel.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef __COARSEPANEL__ #define __COARSEPANEL__ diff --git a/rtgui/colorappearance.cc b/rtgui/colorappearance.cc index f78a1f32b..f8eb736d4 100644 --- a/rtgui/colorappearance.cc +++ b/rtgui/colorappearance.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include diff --git a/rtgui/colorappearance.h b/rtgui/colorappearance.h index 3f95d9f74..da2e3c8b9 100644 --- a/rtgui/colorappearance.h +++ b/rtgui/colorappearance.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _COLORAPPEARANCE_H_ #define _COLORAPPEARANCE_H_ diff --git a/rtgui/coloredbar.cc b/rtgui/coloredbar.cc index 7d623949e..ca9a381cf 100644 --- a/rtgui/coloredbar.cc +++ b/rtgui/coloredbar.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "coloredbar.h" diff --git a/rtgui/coloredbar.h b/rtgui/coloredbar.h index 010d0dcb6..089dfa8cd 100644 --- a/rtgui/coloredbar.h +++ b/rtgui/coloredbar.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _COLOREDBAR_ #define _COLOREDBAR_ diff --git a/rtgui/colorprovider.h b/rtgui/colorprovider.h index ab6fb2865..feea792b6 100644 --- a/rtgui/colorprovider.h +++ b/rtgui/colorprovider.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _COLORPROVIDER_ #define _COLORPROVIDER_ diff --git a/rtgui/config.h.in b/rtgui/config.h.in index 2d1f41dbc..95217b689 100644 --- a/rtgui/config.h.in +++ b/rtgui/config.h.in @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef __CONFIG_H__ diff --git a/rtgui/coordinateadjuster.cc b/rtgui/coordinateadjuster.cc index 5065606d9..ebf36b7e7 100644 --- a/rtgui/coordinateadjuster.cc +++ b/rtgui/coordinateadjuster.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "coordinateadjuster.h" diff --git a/rtgui/coordinateadjuster.h b/rtgui/coordinateadjuster.h index 33ea92bb2..d705915ab 100644 --- a/rtgui/coordinateadjuster.h +++ b/rtgui/coordinateadjuster.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _COORDINATEADJUSTER_ #define _COORDINATEADJUSTER_ diff --git a/rtgui/crop.cc b/rtgui/crop.cc index a8b12819e..b1780538e 100644 --- a/rtgui/crop.cc +++ b/rtgui/crop.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "crop.h" diff --git a/rtgui/crop.h b/rtgui/crop.h index ed0661598..1bbad548d 100644 --- a/rtgui/crop.h +++ b/rtgui/crop.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _CROP_H_ #define _CROP_H_ diff --git a/rtgui/cropguilistener.h b/rtgui/cropguilistener.h index 7a791ef93..c20d6556a 100644 --- a/rtgui/cropguilistener.h +++ b/rtgui/cropguilistener.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef __CROPGUILISTENER__ #define __CROPGUILISTENER__ diff --git a/rtgui/crophandler.cc b/rtgui/crophandler.cc index ab2f3626c..c6ecde027 100644 --- a/rtgui/crophandler.cc +++ b/rtgui/crophandler.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "crophandler.h" #undef THREAD_PRIORITY_NORMAL diff --git a/rtgui/crophandler.h b/rtgui/crophandler.h index e90b96c25..77355b868 100644 --- a/rtgui/crophandler.h +++ b/rtgui/crophandler.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef __CROPHANDLER__ #define __CROPHANDLER__ diff --git a/rtgui/cropwindow.cc b/rtgui/cropwindow.cc index 1364855b0..ef682cf1f 100644 --- a/rtgui/cropwindow.cc +++ b/rtgui/cropwindow.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include diff --git a/rtgui/cropwindow.h b/rtgui/cropwindow.h index 8c944cf0a..99b0fd897 100644 --- a/rtgui/cropwindow.h +++ b/rtgui/cropwindow.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _CROPWINDOW_ #define _CROPWINDOW_ diff --git a/rtgui/cursormanager.cc b/rtgui/cursormanager.cc index 3181d288e..76b4eabfb 100644 --- a/rtgui/cursormanager.cc +++ b/rtgui/cursormanager.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "cursormanager.h" diff --git a/rtgui/cursormanager.h b/rtgui/cursormanager.h index 111652726..aec5110d1 100644 --- a/rtgui/cursormanager.h +++ b/rtgui/cursormanager.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _CURSORMANAGER_ #define _CURSORMANAGER_ diff --git a/rtgui/curveeditor.cc b/rtgui/curveeditor.cc index 528378423..2b3c100e0 100644 --- a/rtgui/curveeditor.cc +++ b/rtgui/curveeditor.cc @@ -13,7 +13,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "curveeditor.h" #include "curveeditorgroup.h" diff --git a/rtgui/curveeditor.h b/rtgui/curveeditor.h index e38d3f205..bdd6d6b48 100644 --- a/rtgui/curveeditor.h +++ b/rtgui/curveeditor.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _CURVEEDITOR_ #define _CURVEEDITOR_ diff --git a/rtgui/curveeditorgroup.cc b/rtgui/curveeditorgroup.cc index 495e4324b..0e7205518 100644 --- a/rtgui/curveeditorgroup.cc +++ b/rtgui/curveeditorgroup.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . * * Class created by Jean-Christophe FRISCH, aka 'Hombre' */ diff --git a/rtgui/curveeditorgroup.h b/rtgui/curveeditorgroup.h index ae0ebee07..6f7b98d9b 100644 --- a/rtgui/curveeditorgroup.h +++ b/rtgui/curveeditorgroup.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _CURVEEDITORGROUP_ #define _CURVEEDITORGROUP_ diff --git a/rtgui/curvelistener.h b/rtgui/curvelistener.h index 3c85db712..05a9a4e99 100644 --- a/rtgui/curvelistener.h +++ b/rtgui/curvelistener.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _CURVELISTENER_ #define _CURVELISTENER_ diff --git a/rtgui/darkframe.cc b/rtgui/darkframe.cc index 8ffca7544..af7ffeace 100644 --- a/rtgui/darkframe.cc +++ b/rtgui/darkframe.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include diff --git a/rtgui/darkframe.h b/rtgui/darkframe.h index c385a2153..c576712a8 100644 --- a/rtgui/darkframe.h +++ b/rtgui/darkframe.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _DARKFRAME_H_ #define _DARKFRAME_H_ diff --git a/rtgui/defringe.cc b/rtgui/defringe.cc index 03bf648dd..659d41960 100644 --- a/rtgui/defringe.cc +++ b/rtgui/defringe.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include #include diff --git a/rtgui/defringe.h b/rtgui/defringe.h index c02fd8d6a..8a6eb0753 100644 --- a/rtgui/defringe.h +++ b/rtgui/defringe.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _DEFRINGE_H_ #define _DEFRINGE_H_ diff --git a/rtgui/dehaze.cc b/rtgui/dehaze.cc index 8204210db..6f60d08d6 100644 --- a/rtgui/dehaze.cc +++ b/rtgui/dehaze.cc @@ -15,7 +15,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include #include diff --git a/rtgui/dehaze.h b/rtgui/dehaze.h index 66720a9fd..3120dfc91 100644 --- a/rtgui/dehaze.h +++ b/rtgui/dehaze.h @@ -15,7 +15,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #pragma once diff --git a/rtgui/diagonalcurveeditorsubgroup.cc b/rtgui/diagonalcurveeditorsubgroup.cc index 9e2406309..21b42a6ce 100644 --- a/rtgui/diagonalcurveeditorsubgroup.cc +++ b/rtgui/diagonalcurveeditorsubgroup.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "clipboard.h" diff --git a/rtgui/diagonalcurveeditorsubgroup.h b/rtgui/diagonalcurveeditorsubgroup.h index 68047e0c2..077ef590e 100644 --- a/rtgui/diagonalcurveeditorsubgroup.h +++ b/rtgui/diagonalcurveeditorsubgroup.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _DIAGONALCURVEEDITORSUBGROUP_ #define _DIAGONALCURVEEDITORSUBGROUP_ diff --git a/rtgui/dirbrowser.cc b/rtgui/dirbrowser.cc index fcc40abc9..32361d5c5 100644 --- a/rtgui/dirbrowser.cc +++ b/rtgui/dirbrowser.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "dirbrowser.h" diff --git a/rtgui/dirbrowser.h b/rtgui/dirbrowser.h index 15b6dd201..68422f8be 100644 --- a/rtgui/dirbrowser.h +++ b/rtgui/dirbrowser.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _DIRBROWSER_ #define _DIRBROWSER_ diff --git a/rtgui/dirpyrdenoise.cc b/rtgui/dirpyrdenoise.cc index c3528d5dd..2a0bba596 100644 --- a/rtgui/dirpyrdenoise.cc +++ b/rtgui/dirpyrdenoise.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include #include diff --git a/rtgui/dirpyrdenoise.h b/rtgui/dirpyrdenoise.h index 7bdaff853..a513eb262 100644 --- a/rtgui/dirpyrdenoise.h +++ b/rtgui/dirpyrdenoise.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _DIRPYRDENOISE_H_ #define _DIRPYRDENOISE_H_ diff --git a/rtgui/dirpyrequalizer.cc b/rtgui/dirpyrequalizer.cc index be6f9c97b..fc03c83ad 100644 --- a/rtgui/dirpyrequalizer.cc +++ b/rtgui/dirpyrequalizer.cc @@ -12,7 +12,7 @@ * 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 . + * along with RawTherapee. If not, see . * * (C) 2010 Emil Martinec */ diff --git a/rtgui/dirpyrequalizer.h b/rtgui/dirpyrequalizer.h index 4eb110428..e236dc29b 100644 --- a/rtgui/dirpyrequalizer.h +++ b/rtgui/dirpyrequalizer.h @@ -12,7 +12,7 @@ * 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 . + * along with RawTherapee. If not, see . * * (C) 2010 Emil Martinec */ diff --git a/rtgui/distortion.cc b/rtgui/distortion.cc index 3620dbc21..165ccee06 100644 --- a/rtgui/distortion.cc +++ b/rtgui/distortion.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include diff --git a/rtgui/distortion.h b/rtgui/distortion.h index a279913cb..5e1cf6a6b 100644 --- a/rtgui/distortion.h +++ b/rtgui/distortion.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _DISTORTION_H_ #define _DISTORTION_H_ diff --git a/rtgui/dynamicprofilepanel.cc b/rtgui/dynamicprofilepanel.cc index d83c70669..38029af71 100644 --- a/rtgui/dynamicprofilepanel.cc +++ b/rtgui/dynamicprofilepanel.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "dynamicprofilepanel.h" diff --git a/rtgui/dynamicprofilepanel.h b/rtgui/dynamicprofilepanel.h index e271edc5a..fd4a6e80e 100644 --- a/rtgui/dynamicprofilepanel.h +++ b/rtgui/dynamicprofilepanel.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _DYNAMICPROFILEPANEL_H_ #define _DYNAMICPROFILEPANEL_H_ diff --git a/rtgui/editbuffer.cc b/rtgui/editbuffer.cc index 882f3c084..80114ed11 100644 --- a/rtgui/editbuffer.cc +++ b/rtgui/editbuffer.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "editbuffer.h" diff --git a/rtgui/editbuffer.h b/rtgui/editbuffer.h index ffb80c48d..77afb6449 100644 --- a/rtgui/editbuffer.h +++ b/rtgui/editbuffer.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #pragma once diff --git a/rtgui/editcallbacks.cc b/rtgui/editcallbacks.cc index d51d672a5..1538ef7ba 100644 --- a/rtgui/editcallbacks.cc +++ b/rtgui/editcallbacks.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "editcallbacks.h" diff --git a/rtgui/editcallbacks.h b/rtgui/editcallbacks.h index c4003f9ca..c2efcf53e 100644 --- a/rtgui/editcallbacks.h +++ b/rtgui/editcallbacks.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #pragma once diff --git a/rtgui/editcoordsys.h b/rtgui/editcoordsys.h index 829225e3f..eff339ab9 100644 --- a/rtgui/editcoordsys.h +++ b/rtgui/editcoordsys.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ /** @file diff --git a/rtgui/editedstate.h b/rtgui/editedstate.h index db416c531..2cee07eb9 100644 --- a/rtgui/editedstate.h +++ b/rtgui/editedstate.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _EDITEDSTATE_ #define _EDITEDSTATE_ diff --git a/rtgui/editenums.h b/rtgui/editenums.h index 264576789..8fc28e922 100644 --- a/rtgui/editenums.h +++ b/rtgui/editenums.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _EDITENUMS_ #define _EDITENUMS_ diff --git a/rtgui/editid.h b/rtgui/editid.h index 5c1cf2389..88d77f859 100644 --- a/rtgui/editid.h +++ b/rtgui/editid.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _EDITID_H_ #define _EDITID_H_ diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc index e0cc8fd92..6aab153a1 100644 --- a/rtgui/editorpanel.cc +++ b/rtgui/editorpanel.cc @@ -15,7 +15,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "editorpanel.h" diff --git a/rtgui/editorpanel.h b/rtgui/editorpanel.h index 7fe79b827..c4349f693 100644 --- a/rtgui/editorpanel.h +++ b/rtgui/editorpanel.h @@ -15,7 +15,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _EDITORPANEL_ #define _EDITORPANEL_ diff --git a/rtgui/editwidgets.cc b/rtgui/editwidgets.cc index 16cd67cd4..a7996ee42 100644 --- a/rtgui/editwidgets.cc +++ b/rtgui/editwidgets.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "editwidgets.h" diff --git a/rtgui/editwidgets.h b/rtgui/editwidgets.h index 1ae185f7a..9154db31f 100644 --- a/rtgui/editwidgets.h +++ b/rtgui/editwidgets.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #pragma once diff --git a/rtgui/editwindow.cc b/rtgui/editwindow.cc index ec7201f84..50a1484cf 100644 --- a/rtgui/editwindow.cc +++ b/rtgui/editwindow.cc @@ -12,7 +12,7 @@ * 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 . +* along with RawTherapee. If not, see . */ #include "editwindow.h" diff --git a/rtgui/editwindow.h b/rtgui/editwindow.h index 42c8ec20e..8a2ade6ba 100644 --- a/rtgui/editwindow.h +++ b/rtgui/editwindow.h @@ -12,7 +12,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _EDITWINDOW_ #define _EDITWINDOW_ diff --git a/rtgui/epd.cc b/rtgui/epd.cc index ab6341866..307790ff7 100644 --- a/rtgui/epd.cc +++ b/rtgui/epd.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include #include diff --git a/rtgui/epd.h b/rtgui/epd.h index 6b44d9147..d8781ef27 100644 --- a/rtgui/epd.h +++ b/rtgui/epd.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _EPD_H_ #define _EPD_H_ diff --git a/rtgui/eventmapper.cc b/rtgui/eventmapper.cc index 81160c58e..b2e5067c7 100644 --- a/rtgui/eventmapper.cc +++ b/rtgui/eventmapper.cc @@ -15,7 +15,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "eventmapper.h" diff --git a/rtgui/eventmapper.h b/rtgui/eventmapper.h index f977b0ff4..5cbb45388 100644 --- a/rtgui/eventmapper.h +++ b/rtgui/eventmapper.h @@ -15,7 +15,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #pragma once diff --git a/rtgui/exiffiltersettings.cc b/rtgui/exiffiltersettings.cc index 0218677d8..567a22868 100644 --- a/rtgui/exiffiltersettings.cc +++ b/rtgui/exiffiltersettings.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "exiffiltersettings.h" diff --git a/rtgui/exiffiltersettings.h b/rtgui/exiffiltersettings.h index d692eb510..e820a2cac 100644 --- a/rtgui/exiffiltersettings.h +++ b/rtgui/exiffiltersettings.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _EXIFFILTERSETTINGS_ #define _EXIFFILTERSETTINGS_ diff --git a/rtgui/exifpanel.cc b/rtgui/exifpanel.cc index f9324e90c..341d0f303 100644 --- a/rtgui/exifpanel.cc +++ b/rtgui/exifpanel.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "exifpanel.h" diff --git a/rtgui/exifpanel.h b/rtgui/exifpanel.h index c8597a287..f054f37c7 100644 --- a/rtgui/exifpanel.h +++ b/rtgui/exifpanel.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _EXIFPANEL_ #define _EXIFPANEL_ diff --git a/rtgui/exportpanel.cc b/rtgui/exportpanel.cc index 9a4c930d5..b4332f4a4 100644 --- a/rtgui/exportpanel.cc +++ b/rtgui/exportpanel.cc @@ -15,7 +15,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "exportpanel.h" #include "multilangmgr.h" diff --git a/rtgui/exportpanel.h b/rtgui/exportpanel.h index dc9aa34a5..d13ca08ad 100644 --- a/rtgui/exportpanel.h +++ b/rtgui/exportpanel.h @@ -15,7 +15,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _EXPORTPANEL_ #define _EXPORTPANEL_ diff --git a/rtgui/extprog.cc b/rtgui/extprog.cc index 33424fac9..a6a9050c0 100644 --- a/rtgui/extprog.cc +++ b/rtgui/extprog.cc @@ -14,7 +14,7 @@ * 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 . +* along with RawTherapee. If not, see . */ #include "extprog.h" diff --git a/rtgui/extprog.h b/rtgui/extprog.h index 154a825e1..ea2749a61 100644 --- a/rtgui/extprog.h +++ b/rtgui/extprog.h @@ -14,7 +14,7 @@ * 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 . +* along with RawTherapee. If not, see . */ #ifndef _EXTPROG_ diff --git a/rtgui/fattaltonemap.cc b/rtgui/fattaltonemap.cc index 032df6f40..a0baf3531 100644 --- a/rtgui/fattaltonemap.cc +++ b/rtgui/fattaltonemap.cc @@ -15,7 +15,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include #include diff --git a/rtgui/fattaltonemap.h b/rtgui/fattaltonemap.h index e6eafb605..9f788351c 100644 --- a/rtgui/fattaltonemap.h +++ b/rtgui/fattaltonemap.h @@ -15,7 +15,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #pragma once diff --git a/rtgui/favoritbrowser.cc b/rtgui/favoritbrowser.cc index 09deacfab..2d49ab087 100644 --- a/rtgui/favoritbrowser.cc +++ b/rtgui/favoritbrowser.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include #include "multilangmgr.h" diff --git a/rtgui/favoritbrowser.h b/rtgui/favoritbrowser.h index ed522c1c4..292f17de6 100644 --- a/rtgui/favoritbrowser.h +++ b/rtgui/favoritbrowser.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _FAVORITBROWSER_ #define _FAVORITBROWSER_ diff --git a/rtgui/filebrowser.cc b/rtgui/filebrowser.cc index f60e47518..f9afcef48 100644 --- a/rtgui/filebrowser.cc +++ b/rtgui/filebrowser.cc @@ -16,7 +16,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include #include diff --git a/rtgui/filebrowser.h b/rtgui/filebrowser.h index 03c7fc86c..6911a944f 100644 --- a/rtgui/filebrowser.h +++ b/rtgui/filebrowser.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _FILEBROWSER_ #define _FILEBROWSER_ diff --git a/rtgui/filebrowserentry.cc b/rtgui/filebrowserentry.cc index 87a48a7ea..44146b990 100644 --- a/rtgui/filebrowserentry.cc +++ b/rtgui/filebrowserentry.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "filebrowserentry.h" diff --git a/rtgui/filebrowserentry.h b/rtgui/filebrowserentry.h index bd3a266aa..646e8e67e 100644 --- a/rtgui/filebrowserentry.h +++ b/rtgui/filebrowserentry.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _FILEBROWSERENTRY_ #define _FILEBROWSERENTRY_ diff --git a/rtgui/filecatalog.cc b/rtgui/filecatalog.cc index 6eb8faab1..674501322 100644 --- a/rtgui/filecatalog.cc +++ b/rtgui/filecatalog.cc @@ -15,7 +15,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "filecatalog.h" diff --git a/rtgui/filecatalog.h b/rtgui/filecatalog.h index 0ff2fb1e8..09e2cc1ed 100644 --- a/rtgui/filecatalog.h +++ b/rtgui/filecatalog.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _FILECATALOG_ #define _FILECATALOG_ diff --git a/rtgui/filepanel.cc b/rtgui/filepanel.cc index da33caddf..3e23cbc5d 100644 --- a/rtgui/filepanel.cc +++ b/rtgui/filepanel.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "filepanel.h" diff --git a/rtgui/filepanel.h b/rtgui/filepanel.h index 0385c48d3..bdeb266f4 100644 --- a/rtgui/filepanel.h +++ b/rtgui/filepanel.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _FILEPANEL_ #define _FILEPANEL_ diff --git a/rtgui/fileselectionchangelistener.h b/rtgui/fileselectionchangelistener.h index 5f1b20fcc..1f3b8e612 100644 --- a/rtgui/fileselectionchangelistener.h +++ b/rtgui/fileselectionchangelistener.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _FILESELECTIONCHANGELISTENER_ #define _FILESELECTIONCHANGELISTENER_ diff --git a/rtgui/fileselectionlistener.h b/rtgui/fileselectionlistener.h index 0cac24d46..a7f7fb284 100644 --- a/rtgui/fileselectionlistener.h +++ b/rtgui/fileselectionlistener.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _FILESELECTIONLISTENER_ #define _FILESELECTIONLISTENER_ diff --git a/rtgui/filethumbnailbuttonset.cc b/rtgui/filethumbnailbuttonset.cc index 4c7d8743d..ef497a535 100644 --- a/rtgui/filethumbnailbuttonset.cc +++ b/rtgui/filethumbnailbuttonset.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "filethumbnailbuttonset.h" diff --git a/rtgui/filethumbnailbuttonset.h b/rtgui/filethumbnailbuttonset.h index 13265b8c0..102b573c8 100644 --- a/rtgui/filethumbnailbuttonset.h +++ b/rtgui/filethumbnailbuttonset.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _FILETHUMBNAILBUTTONSET_ #define _FILETHUMBNAILBUTTONSET_ diff --git a/rtgui/filmnegative.cc b/rtgui/filmnegative.cc index 6e93b2364..90cedf148 100644 --- a/rtgui/filmnegative.cc +++ b/rtgui/filmnegative.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include diff --git a/rtgui/filmnegative.h b/rtgui/filmnegative.h index a1efdc455..85919bef9 100644 --- a/rtgui/filmnegative.h +++ b/rtgui/filmnegative.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #pragma once diff --git a/rtgui/filterpanel.cc b/rtgui/filterpanel.cc index c140acfb0..301a7b188 100644 --- a/rtgui/filterpanel.cc +++ b/rtgui/filterpanel.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "filterpanel.h" #include "multilangmgr.h" diff --git a/rtgui/filterpanel.h b/rtgui/filterpanel.h index 7f32a88d9..e6e41a416 100644 --- a/rtgui/filterpanel.h +++ b/rtgui/filterpanel.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _FILTERPANEL_ #define _FILTERPANEL_ diff --git a/rtgui/flatcurveeditorsubgroup.cc b/rtgui/flatcurveeditorsubgroup.cc index 376bb55c2..6dc3a1f5b 100644 --- a/rtgui/flatcurveeditorsubgroup.cc +++ b/rtgui/flatcurveeditorsubgroup.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "clipboard.h" diff --git a/rtgui/flatcurveeditorsubgroup.h b/rtgui/flatcurveeditorsubgroup.h index f931bf660..e9253cd08 100644 --- a/rtgui/flatcurveeditorsubgroup.h +++ b/rtgui/flatcurveeditorsubgroup.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _FLATCURVEEDITORSUBGROUP_ #define _FLATCURVEEDITORSUBGROUP_ diff --git a/rtgui/flatfield.cc b/rtgui/flatfield.cc index f69b90170..03204c037 100644 --- a/rtgui/flatfield.cc +++ b/rtgui/flatfield.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include diff --git a/rtgui/flatfield.h b/rtgui/flatfield.h index 46e2f6ddd..b9997f65e 100644 --- a/rtgui/flatfield.h +++ b/rtgui/flatfield.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _FLATFIELD_H_ #define _FLATFIELD_H_ diff --git a/rtgui/guiutils.cc b/rtgui/guiutils.cc index 19762fd92..189cf6178 100644 --- a/rtgui/guiutils.cc +++ b/rtgui/guiutils.cc @@ -13,7 +13,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include #include "../rtengine/rt_math.h" diff --git a/rtgui/guiutils.h b/rtgui/guiutils.h index 73cd27171..b09e20abb 100644 --- a/rtgui/guiutils.h +++ b/rtgui/guiutils.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef __GUI_UTILS_ #define __GUI_UTILS_ diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index b82df7ebf..36803ddf2 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "histogrampanel.h" #include "multilangmgr.h" diff --git a/rtgui/histogrampanel.h b/rtgui/histogrampanel.h index f66d2e654..1515db97a 100644 --- a/rtgui/histogrampanel.h +++ b/rtgui/histogrampanel.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _HISTOGRAMPANEL_ #define _HISTOGRAMPANEL_ diff --git a/rtgui/history.cc b/rtgui/history.cc index ec5e006bc..5305c258b 100644 --- a/rtgui/history.cc +++ b/rtgui/history.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "history.h" diff --git a/rtgui/history.h b/rtgui/history.h index 196b29b67..abf0d1ba5 100644 --- a/rtgui/history.h +++ b/rtgui/history.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _HISTORY_ #define _HISTORY_ diff --git a/rtgui/hsvequalizer.cc b/rtgui/hsvequalizer.cc index f489696d2..b6b5b04f2 100644 --- a/rtgui/hsvequalizer.cc +++ b/rtgui/hsvequalizer.cc @@ -12,7 +12,7 @@ * 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 . + * along with RawTherapee. If not, see . * * 2010 Ilya Popov */ diff --git a/rtgui/hsvequalizer.h b/rtgui/hsvequalizer.h index 8d34b486b..2ffa9fa0f 100644 --- a/rtgui/hsvequalizer.h +++ b/rtgui/hsvequalizer.h @@ -12,7 +12,7 @@ * 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 . + * along with RawTherapee. If not, see . * * 2010 Ilya Popov */ diff --git a/rtgui/iccprofilecreator.cc b/rtgui/iccprofilecreator.cc index ed880bd0e..9efa4360b 100644 --- a/rtgui/iccprofilecreator.cc +++ b/rtgui/iccprofilecreator.cc @@ -15,7 +15,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include #include "iccprofilecreator.h" diff --git a/rtgui/iccprofilecreator.h b/rtgui/iccprofilecreator.h index 5265d5ab2..b28ac29f2 100644 --- a/rtgui/iccprofilecreator.h +++ b/rtgui/iccprofilecreator.h @@ -15,7 +15,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #pragma once diff --git a/rtgui/icmpanel.cc b/rtgui/icmpanel.cc index a6857eaa9..012aeca78 100644 --- a/rtgui/icmpanel.cc +++ b/rtgui/icmpanel.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include diff --git a/rtgui/icmpanel.h b/rtgui/icmpanel.h index a03bd6fa7..9b4706ecd 100644 --- a/rtgui/icmpanel.h +++ b/rtgui/icmpanel.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _ICMPANEL_ #define _ICMPANEL_ diff --git a/rtgui/ilabel.cc b/rtgui/ilabel.cc index 65040b93b..9dfd50b89 100644 --- a/rtgui/ilabel.cc +++ b/rtgui/ilabel.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "ilabel.h" diff --git a/rtgui/ilabel.h b/rtgui/ilabel.h index 1f5340fa2..06da470b1 100644 --- a/rtgui/ilabel.h +++ b/rtgui/ilabel.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _ILABEL_ #define _ILABEL_ diff --git a/rtgui/imagearea.cc b/rtgui/imagearea.cc index 24b793fd9..b086f8baf 100644 --- a/rtgui/imagearea.cc +++ b/rtgui/imagearea.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "imagearea.h" #include diff --git a/rtgui/imagearea.h b/rtgui/imagearea.h index 0e8794840..375e3a536 100644 --- a/rtgui/imagearea.h +++ b/rtgui/imagearea.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef __IMAGEAREA_H__ #define __IMAGEAREA_H__ diff --git a/rtgui/imageareapanel.cc b/rtgui/imageareapanel.cc index b0e680ade..f693c3181 100644 --- a/rtgui/imageareapanel.cc +++ b/rtgui/imageareapanel.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "imageareapanel.h" diff --git a/rtgui/imageareapanel.h b/rtgui/imageareapanel.h index 13fd6650b..4ec3ffcf3 100644 --- a/rtgui/imageareapanel.h +++ b/rtgui/imageareapanel.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _IMAGEAREAPANEL_ #define _IMAGEAREAPANEL_ diff --git a/rtgui/imageareatoollistener.h b/rtgui/imageareatoollistener.h index 705888676..d387b595c 100644 --- a/rtgui/imageareatoollistener.h +++ b/rtgui/imageareatoollistener.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _IMAGEAREATOOLLISTENER_ #define _IMAGEAREATOOLLISTENER_ diff --git a/rtgui/impulsedenoise.cc b/rtgui/impulsedenoise.cc index d4ecebfb5..cc2e10899 100644 --- a/rtgui/impulsedenoise.cc +++ b/rtgui/impulsedenoise.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include #include diff --git a/rtgui/impulsedenoise.h b/rtgui/impulsedenoise.h index ae6aaa6a8..1ebdc430b 100644 --- a/rtgui/impulsedenoise.h +++ b/rtgui/impulsedenoise.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _IMPULSEDENOISE_H_ #define _IMPULSEDENOISE_H_ diff --git a/rtgui/indclippedpanel.cc b/rtgui/indclippedpanel.cc index aff5035fe..df9f632ab 100644 --- a/rtgui/indclippedpanel.cc +++ b/rtgui/indclippedpanel.cc @@ -13,7 +13,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "indclippedpanel.h" #include "options.h" diff --git a/rtgui/indclippedpanel.h b/rtgui/indclippedpanel.h index c026d4611..54476af10 100644 --- a/rtgui/indclippedpanel.h +++ b/rtgui/indclippedpanel.h @@ -13,7 +13,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _INDCLIPPEDPANEL_ #define _INDCLIPPEDPANEL_ diff --git a/rtgui/inspector.cc b/rtgui/inspector.cc index 85c5f463d..8bd9862a7 100644 --- a/rtgui/inspector.cc +++ b/rtgui/inspector.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "inspector.h" #include "guiutils.h" diff --git a/rtgui/inspector.h b/rtgui/inspector.h index 86ad9114e..681b90aa3 100644 --- a/rtgui/inspector.h +++ b/rtgui/inspector.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _INSPECTOR_ #define _INSPECTOR_ diff --git a/rtgui/iptcpanel.cc b/rtgui/iptcpanel.cc index 7347927a0..25cd20560 100644 --- a/rtgui/iptcpanel.cc +++ b/rtgui/iptcpanel.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "iptcpanel.h" #include "clipboard.h" diff --git a/rtgui/iptcpanel.h b/rtgui/iptcpanel.h index 25683ccec..0317314a1 100644 --- a/rtgui/iptcpanel.h +++ b/rtgui/iptcpanel.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _IPTCPANEL_ #define _IPTCPANEL_ diff --git a/rtgui/labcurve.cc b/rtgui/labcurve.cc index eeb0cd18e..237f9ea9b 100644 --- a/rtgui/labcurve.cc +++ b/rtgui/labcurve.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include diff --git a/rtgui/labcurve.h b/rtgui/labcurve.h index db75a686a..51ba0fdd6 100644 --- a/rtgui/labcurve.h +++ b/rtgui/labcurve.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _LABCURVE_H_ #define _LABCURVE_H_ diff --git a/rtgui/labgrid.cc b/rtgui/labgrid.cc index 4576885e8..b6393f6f5 100644 --- a/rtgui/labgrid.cc +++ b/rtgui/labgrid.cc @@ -15,7 +15,7 @@ * 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 . + * along with RawTherapee. If not, see . */ // adapted from the "color correction" module of Darktable. Original copyright follows @@ -33,7 +33,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with darktable. If not, see . + along with darktable. If not, see . */ #include "labgrid.h" diff --git a/rtgui/labgrid.h b/rtgui/labgrid.h index dbb0cc427..227b4cacc 100644 --- a/rtgui/labgrid.h +++ b/rtgui/labgrid.h @@ -15,7 +15,7 @@ * 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 . + * along with RawTherapee. If not, see . */ // adapted from the "color correction" module of Darktable. Original copyright follows @@ -33,7 +33,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with darktable. If not, see . + along with darktable. If not, see . */ #pragma once diff --git a/rtgui/lensgeom.cc b/rtgui/lensgeom.cc index baf816c8b..76e0635eb 100644 --- a/rtgui/lensgeom.cc +++ b/rtgui/lensgeom.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "lensgeom.h" #include "guiutils.h" diff --git a/rtgui/lensgeom.h b/rtgui/lensgeom.h index 20bb4b7eb..06b8e5689 100644 --- a/rtgui/lensgeom.h +++ b/rtgui/lensgeom.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _LENSGEOM_H_ #define _LENSGEOM_H_ diff --git a/rtgui/lensgeomlistener.h b/rtgui/lensgeomlistener.h index c6ba966b1..dbe58f1fa 100644 --- a/rtgui/lensgeomlistener.h +++ b/rtgui/lensgeomlistener.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _LENSGEOMLISTENER_H_ #define _LENSGEOMLISTENER_H_ diff --git a/rtgui/lensprofile.cc b/rtgui/lensprofile.cc index 0dd3cb1b7..389f15461 100644 --- a/rtgui/lensprofile.cc +++ b/rtgui/lensprofile.cc @@ -14,7 +14,7 @@ * 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 . +* along with RawTherapee. If not, see . */ #include #include diff --git a/rtgui/lensprofile.h b/rtgui/lensprofile.h index 76c15aa9a..7e740e26e 100644 --- a/rtgui/lensprofile.h +++ b/rtgui/lensprofile.h @@ -14,7 +14,7 @@ * 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 . +* along with RawTherapee. If not, see . */ #pragma once diff --git a/rtgui/localcontrast.cc b/rtgui/localcontrast.cc index cc4922a65..d91642b6c 100644 --- a/rtgui/localcontrast.cc +++ b/rtgui/localcontrast.cc @@ -15,7 +15,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include #include diff --git a/rtgui/localcontrast.h b/rtgui/localcontrast.h index 529c95c89..b23bac697 100644 --- a/rtgui/localcontrast.h +++ b/rtgui/localcontrast.h @@ -15,7 +15,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #pragma once diff --git a/rtgui/lockablecolorpicker.cc b/rtgui/lockablecolorpicker.cc index 859057e2c..ef16df6ec 100644 --- a/rtgui/lockablecolorpicker.cc +++ b/rtgui/lockablecolorpicker.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "lockablecolorpicker.h" diff --git a/rtgui/lockablecolorpicker.h b/rtgui/lockablecolorpicker.h index cafea26be..f1a63d533 100644 --- a/rtgui/lockablecolorpicker.h +++ b/rtgui/lockablecolorpicker.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef __COLORPICKER__ diff --git a/rtgui/lwbutton.cc b/rtgui/lwbutton.cc index 3c97ff6bb..b5c10c532 100644 --- a/rtgui/lwbutton.cc +++ b/rtgui/lwbutton.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "lwbutton.h" #include "guiutils.h" diff --git a/rtgui/lwbutton.h b/rtgui/lwbutton.h index 12dbb6346..16e53a875 100644 --- a/rtgui/lwbutton.h +++ b/rtgui/lwbutton.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _LWBUTTON_ #define _LWBUTTON_ diff --git a/rtgui/lwbuttonset.cc b/rtgui/lwbuttonset.cc index d4d39bfe3..a03b3064b 100644 --- a/rtgui/lwbuttonset.cc +++ b/rtgui/lwbuttonset.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "lwbuttonset.h" diff --git a/rtgui/lwbuttonset.h b/rtgui/lwbuttonset.h index fa33620ae..07d17a135 100644 --- a/rtgui/lwbuttonset.h +++ b/rtgui/lwbuttonset.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #pragma once diff --git a/rtgui/main-cli.cc b/rtgui/main-cli.cc index f71d7099d..09aab1cff 100644 --- a/rtgui/main-cli.cc +++ b/rtgui/main-cli.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifdef __GNUC__ diff --git a/rtgui/main.cc b/rtgui/main.cc index 5cfe93718..098963e0e 100644 --- a/rtgui/main.cc +++ b/rtgui/main.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifdef __GNUC__ diff --git a/rtgui/metadatapanel.cc b/rtgui/metadatapanel.cc index fed7622ea..f92152763 100644 --- a/rtgui/metadatapanel.cc +++ b/rtgui/metadatapanel.cc @@ -15,7 +15,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "metadatapanel.h" diff --git a/rtgui/metadatapanel.h b/rtgui/metadatapanel.h index d34a04585..b39ffd2c1 100644 --- a/rtgui/metadatapanel.h +++ b/rtgui/metadatapanel.h @@ -15,7 +15,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #pragma once diff --git a/rtgui/multilangmgr.cc b/rtgui/multilangmgr.cc index 298f5d2dd..ecf744519 100644 --- a/rtgui/multilangmgr.cc +++ b/rtgui/multilangmgr.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "multilangmgr.h" diff --git a/rtgui/multilangmgr.h b/rtgui/multilangmgr.h index 649865217..0c76b4c01 100644 --- a/rtgui/multilangmgr.h +++ b/rtgui/multilangmgr.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _MULTILANGMGR_ #define _MULTILANGMGR_ diff --git a/rtgui/mycurve.cc b/rtgui/mycurve.cc index 5684bec33..6c00e3f56 100644 --- a/rtgui/mycurve.cc +++ b/rtgui/mycurve.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "mycurve.h" #include "../rtengine/curves.h" diff --git a/rtgui/mycurve.h b/rtgui/mycurve.h index 81a747bcd..62d8d30f2 100644 --- a/rtgui/mycurve.h +++ b/rtgui/mycurve.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _MYCURVE_ #define _MYCURVE_ diff --git a/rtgui/mydiagonalcurve.cc b/rtgui/mydiagonalcurve.cc index cb96c039f..d393c7200 100644 --- a/rtgui/mydiagonalcurve.cc +++ b/rtgui/mydiagonalcurve.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include diff --git a/rtgui/mydiagonalcurve.h b/rtgui/mydiagonalcurve.h index 5b0f6f01e..33fac6090 100644 --- a/rtgui/mydiagonalcurve.h +++ b/rtgui/mydiagonalcurve.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _MYDIAGONALCURVE_ #define _MYDIAGONALCURVE_ diff --git a/rtgui/myflatcurve.cc b/rtgui/myflatcurve.cc index ebd0a9d0c..ec46908ce 100644 --- a/rtgui/myflatcurve.cc +++ b/rtgui/myflatcurve.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include diff --git a/rtgui/myflatcurve.h b/rtgui/myflatcurve.h index c0223bfcf..fa4466b8d 100644 --- a/rtgui/myflatcurve.h +++ b/rtgui/myflatcurve.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _MYFLATCURVE_ #define _MYFLATCURVE_ diff --git a/rtgui/navigator.cc b/rtgui/navigator.cc index 732b9f323..de07ffcd7 100644 --- a/rtgui/navigator.cc +++ b/rtgui/navigator.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include #include "navigator.h" diff --git a/rtgui/navigator.h b/rtgui/navigator.h index 1b898f895..eb4584f42 100644 --- a/rtgui/navigator.h +++ b/rtgui/navigator.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _NAVIGATOR_ #define _NAVIGATOR_ diff --git a/rtgui/options.cc b/rtgui/options.cc index b667f8679..20e20620a 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "options.h" #include diff --git a/rtgui/options.h b/rtgui/options.h index 0c580b034..3bd83cd5b 100644 --- a/rtgui/options.h +++ b/rtgui/options.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _OPTIONS_ #define _OPTIONS_ diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index cb3d4151c..e0e3ea47b 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 08a41fc7a..0b765db22 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #pragma once diff --git a/rtgui/partialpastedlg.cc b/rtgui/partialpastedlg.cc index 52adcfbf7..a7d2bd0d1 100644 --- a/rtgui/partialpastedlg.cc +++ b/rtgui/partialpastedlg.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "partialpastedlg.h" #include "multilangmgr.h" diff --git a/rtgui/partialpastedlg.h b/rtgui/partialpastedlg.h index b5b93b11a..eebb08705 100644 --- a/rtgui/partialpastedlg.h +++ b/rtgui/partialpastedlg.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _PARTIALPASTEDLG_ #define _PARTIALPASTEDLG_ diff --git a/rtgui/pathutils.cc b/rtgui/pathutils.cc index 21c452d4c..71ff8b0b2 100644 --- a/rtgui/pathutils.cc +++ b/rtgui/pathutils.cc @@ -13,7 +13,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "pathutils.h" diff --git a/rtgui/pathutils.h b/rtgui/pathutils.h index ce58103b9..ed7d21984 100644 --- a/rtgui/pathutils.h +++ b/rtgui/pathutils.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef __PATH_UTILS_ #define __PATH_UTILS_ diff --git a/rtgui/perspective.cc b/rtgui/perspective.cc index 752b2289b..b86da6a52 100644 --- a/rtgui/perspective.cc +++ b/rtgui/perspective.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "perspective.h" diff --git a/rtgui/perspective.h b/rtgui/perspective.h index 77fedc84a..9b36ed24d 100644 --- a/rtgui/perspective.h +++ b/rtgui/perspective.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _PERSPECTIVE_PANEL_H_ #define _PERSPECTIVE_PANEL_H_ diff --git a/rtgui/placesbrowser.cc b/rtgui/placesbrowser.cc index 6fb04ac53..f1450cea2 100644 --- a/rtgui/placesbrowser.cc +++ b/rtgui/placesbrowser.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "placesbrowser.h" diff --git a/rtgui/placesbrowser.h b/rtgui/placesbrowser.h index b3bed867c..6325bdb45 100644 --- a/rtgui/placesbrowser.h +++ b/rtgui/placesbrowser.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _PLACESBROWSER_ #define _PLACESBROWSER_ diff --git a/rtgui/pointermotionlistener.h b/rtgui/pointermotionlistener.h index 88a4b2279..0a2931262 100644 --- a/rtgui/pointermotionlistener.h +++ b/rtgui/pointermotionlistener.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _POINTERMOTIONLISTENER_ #define _POINTERMOTIONLISTENER_ diff --git a/rtgui/popupbutton.cc b/rtgui/popupbutton.cc index 2aa43ddcb..7c15255c6 100644 --- a/rtgui/popupbutton.cc +++ b/rtgui/popupbutton.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . * * Class created by Jean-Christophe FRISCH, aka 'Hombre' */ diff --git a/rtgui/popupbutton.h b/rtgui/popupbutton.h index be08cd1ba..fb0b66e0d 100644 --- a/rtgui/popupbutton.h +++ b/rtgui/popupbutton.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . * * Class created by Jean-Christophe FRISCH, aka 'Hombre' */ diff --git a/rtgui/popupcommon.cc b/rtgui/popupcommon.cc index c5a5a03e3..8c4c9dda1 100644 --- a/rtgui/popupcommon.cc +++ b/rtgui/popupcommon.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . * * Class created by Jean-Christophe FRISCH, aka 'Hombre' */ diff --git a/rtgui/popupcommon.h b/rtgui/popupcommon.h index 92d6a6214..44ad0886a 100644 --- a/rtgui/popupcommon.h +++ b/rtgui/popupcommon.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . * * Class created by Jean-Christophe FRISCH, aka 'Hombre' */ diff --git a/rtgui/popuptogglebutton.cc b/rtgui/popuptogglebutton.cc index 9676a2bea..47c3e4088 100644 --- a/rtgui/popuptogglebutton.cc +++ b/rtgui/popuptogglebutton.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . * * Class created by Jean-Christophe FRISCH, aka 'Hombre' */ diff --git a/rtgui/popuptogglebutton.h b/rtgui/popuptogglebutton.h index 58a7ff82a..b2949a0b8 100644 --- a/rtgui/popuptogglebutton.h +++ b/rtgui/popuptogglebutton.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . * * Class created by Jean-Christophe FRISCH, aka 'Hombre' */ diff --git a/rtgui/pparamschangelistener.h b/rtgui/pparamschangelistener.h index c8338745e..2c73ea3f6 100644 --- a/rtgui/pparamschangelistener.h +++ b/rtgui/pparamschangelistener.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _PPARAMSCHANGELISTENER_ #define _PPARAMSCHANGELISTENER_ diff --git a/rtgui/preferences.cc b/rtgui/preferences.cc index 16a58f334..b4447fd44 100644 --- a/rtgui/preferences.cc +++ b/rtgui/preferences.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include #include "preferences.h" diff --git a/rtgui/preferences.h b/rtgui/preferences.h index 4f92e9e22..6ca302fe8 100644 --- a/rtgui/preferences.h +++ b/rtgui/preferences.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef __PREFERENCES_H__ #define __PREFERENCES_H__ diff --git a/rtgui/preprocess.cc b/rtgui/preprocess.cc index 07e378832..4a663ad07 100644 --- a/rtgui/preprocess.cc +++ b/rtgui/preprocess.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include diff --git a/rtgui/preprocess.h b/rtgui/preprocess.h index ced119d7d..015fa3650 100644 --- a/rtgui/preprocess.h +++ b/rtgui/preprocess.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _PREPROCESS_H_ #define _PREPROCESS_H_ diff --git a/rtgui/previewhandler.cc b/rtgui/previewhandler.cc index a1640b39c..1dad0676e 100644 --- a/rtgui/previewhandler.cc +++ b/rtgui/previewhandler.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "previewhandler.h" #include diff --git a/rtgui/previewhandler.h b/rtgui/previewhandler.h index 7a93ed480..7fe7b96f4 100644 --- a/rtgui/previewhandler.h +++ b/rtgui/previewhandler.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _PREVIEWHANDLER_ #define _PREVIEWHANDLER_ diff --git a/rtgui/previewloader.cc b/rtgui/previewloader.cc index 34b42dcb7..67de50113 100644 --- a/rtgui/previewloader.cc +++ b/rtgui/previewloader.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include diff --git a/rtgui/previewloader.h b/rtgui/previewloader.h index 311d9d5ce..52dbee43c 100644 --- a/rtgui/previewloader.h +++ b/rtgui/previewloader.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _PREVIEWLOADER_ #define _PREVIEWLOADER_ diff --git a/rtgui/previewmodepanel.cc b/rtgui/previewmodepanel.cc index 086f6ab17..37b3f6468 100644 --- a/rtgui/previewmodepanel.cc +++ b/rtgui/previewmodepanel.cc @@ -13,7 +13,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "previewmodepanel.h" #include "options.h" diff --git a/rtgui/previewmodepanel.h b/rtgui/previewmodepanel.h index 4924b77af..b43e8484c 100644 --- a/rtgui/previewmodepanel.h +++ b/rtgui/previewmodepanel.h @@ -13,7 +13,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _PREVIEWMODEPANEL_ #define _PREVIEWMODEPANEL_ diff --git a/rtgui/previewwindow.cc b/rtgui/previewwindow.cc index 7688c0470..54d785313 100644 --- a/rtgui/previewwindow.cc +++ b/rtgui/previewwindow.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "previewwindow.h" #include "guiutils.h" diff --git a/rtgui/previewwindow.h b/rtgui/previewwindow.h index c89c89d4e..64aa84afd 100644 --- a/rtgui/previewwindow.h +++ b/rtgui/previewwindow.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _PREVIEWWINDOW_ #define _PREVIEWWINDOW_ diff --git a/rtgui/procparamchangers.h b/rtgui/procparamchangers.h index aeebae4fb..8dd3769c6 100644 --- a/rtgui/procparamchangers.h +++ b/rtgui/procparamchangers.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #define UNKNOWN -1 #define FILEBROWSER 1 diff --git a/rtgui/profilechangelistener.h b/rtgui/profilechangelistener.h index e333933ea..fa7e1b877 100644 --- a/rtgui/profilechangelistener.h +++ b/rtgui/profilechangelistener.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _PROFILECHANGELISTENER_ #define _PROFILECHANGELISTENER_ diff --git a/rtgui/profilepanel.cc b/rtgui/profilepanel.cc index c969d13c0..b4b85dfd0 100644 --- a/rtgui/profilepanel.cc +++ b/rtgui/profilepanel.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "profilepanel.h" diff --git a/rtgui/profilepanel.h b/rtgui/profilepanel.h index bc42f96c3..c5717d523 100644 --- a/rtgui/profilepanel.h +++ b/rtgui/profilepanel.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _PROFILEPANEL_ #define _PROFILEPANEL_ diff --git a/rtgui/profilestorecombobox.cc b/rtgui/profilestorecombobox.cc index ae84bd951..bb294189f 100644 --- a/rtgui/profilestorecombobox.cc +++ b/rtgui/profilestorecombobox.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "../rtengine/profilestore.h" #include "profilestorecombobox.h" diff --git a/rtgui/profilestorecombobox.h b/rtgui/profilestorecombobox.h index 3796e0471..5d04813d6 100644 --- a/rtgui/profilestorecombobox.h +++ b/rtgui/profilestorecombobox.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _PROFILESTORECOMBOBOX_ #define _PROFILESTORECOMBOBOX_ diff --git a/rtgui/progressconnector.h b/rtgui/progressconnector.h index 394ad3909..012039ba6 100644 --- a/rtgui/progressconnector.h +++ b/rtgui/progressconnector.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _PROGRESSCONNECTOR_ #define _PROGRESSCONNECTOR_ diff --git a/rtgui/prsharpening.cc b/rtgui/prsharpening.cc index b12da977d..d065dbc07 100644 --- a/rtgui/prsharpening.cc +++ b/rtgui/prsharpening.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include #include "eventmapper.h" diff --git a/rtgui/prsharpening.h b/rtgui/prsharpening.h index d8a27c188..9d37fa8ba 100644 --- a/rtgui/prsharpening.h +++ b/rtgui/prsharpening.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _PRSHARPENING_H_ #define _PRSHARPENING_H_ diff --git a/rtgui/rawcacorrection.cc b/rtgui/rawcacorrection.cc index 003d8b629..9e5c592ef 100644 --- a/rtgui/rawcacorrection.cc +++ b/rtgui/rawcacorrection.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "rawcacorrection.h" diff --git a/rtgui/rawcacorrection.h b/rtgui/rawcacorrection.h index ab80bd3ea..d3874d9f9 100644 --- a/rtgui/rawcacorrection.h +++ b/rtgui/rawcacorrection.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _RAWCACORRECTION_H_ #define _RAWCACORRECTION_H_ diff --git a/rtgui/rawexposure.cc b/rtgui/rawexposure.cc index f8885eb76..7548bf4be 100644 --- a/rtgui/rawexposure.cc +++ b/rtgui/rawexposure.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include diff --git a/rtgui/rawexposure.h b/rtgui/rawexposure.h index 95a15ade2..1dafd4d64 100644 --- a/rtgui/rawexposure.h +++ b/rtgui/rawexposure.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _RAWEXPOSURE_H_ #define _RAWEXPOSURE_H_ diff --git a/rtgui/recentbrowser.cc b/rtgui/recentbrowser.cc index ec97f6ded..fca97cafa 100644 --- a/rtgui/recentbrowser.cc +++ b/rtgui/recentbrowser.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "recentbrowser.h" #include "multilangmgr.h" diff --git a/rtgui/recentbrowser.h b/rtgui/recentbrowser.h index 2d1e210f4..1ba2c17f4 100644 --- a/rtgui/recentbrowser.h +++ b/rtgui/recentbrowser.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _RECENTBROWSER_ #define _RECENTBROWSER_ diff --git a/rtgui/renamedlg.cc b/rtgui/renamedlg.cc index 14931817f..8f55b3653 100644 --- a/rtgui/renamedlg.cc +++ b/rtgui/renamedlg.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "renamedlg.h" #include "multilangmgr.h" diff --git a/rtgui/renamedlg.h b/rtgui/renamedlg.h index ab51a43c6..a3e16ad0a 100644 --- a/rtgui/renamedlg.h +++ b/rtgui/renamedlg.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _RENAMEDLG_ #define _RENAMEDLG_ diff --git a/rtgui/resize.cc b/rtgui/resize.cc index 0525d64af..456b924ef 100644 --- a/rtgui/resize.cc +++ b/rtgui/resize.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "resize.h" diff --git a/rtgui/resize.h b/rtgui/resize.h index 3bcfe3f84..1d38ae674 100644 --- a/rtgui/resize.h +++ b/rtgui/resize.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _RESIZE_H_ #define _RESIZE_H_ diff --git a/rtgui/rgbcurves.cc b/rtgui/rgbcurves.cc index 81d997add..2350783e0 100644 --- a/rtgui/rgbcurves.cc +++ b/rtgui/rgbcurves.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "rgbcurves.h" diff --git a/rtgui/rgbcurves.h b/rtgui/rgbcurves.h index a7846f9ab..e62fdd7c7 100644 --- a/rtgui/rgbcurves.h +++ b/rtgui/rgbcurves.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _RGBCURVES_H_ #define _RGBCURVES_H_ diff --git a/rtgui/rotate.cc b/rtgui/rotate.cc index 822443cf8..7436186c3 100644 --- a/rtgui/rotate.cc +++ b/rtgui/rotate.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include diff --git a/rtgui/rotate.h b/rtgui/rotate.h index c3d18fecb..bd0613609 100644 --- a/rtgui/rotate.h +++ b/rtgui/rotate.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _ROTATE_H_ #define _ROTATE_H_ diff --git a/rtgui/rtimage.cc b/rtgui/rtimage.cc index 5ae3e4ddb..e35a6d164 100644 --- a/rtgui/rtimage.cc +++ b/rtgui/rtimage.cc @@ -15,7 +15,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "rtimage.h" diff --git a/rtgui/rtimage.h b/rtgui/rtimage.h index 15978f65c..b68becd82 100644 --- a/rtgui/rtimage.h +++ b/rtgui/rtimage.h @@ -15,7 +15,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #pragma once diff --git a/rtgui/rtscalable.cc b/rtgui/rtscalable.cc index ae3214520..15211a7ee 100644 --- a/rtgui/rtscalable.cc +++ b/rtgui/rtscalable.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "rtscalable.h" diff --git a/rtgui/rtscalable.h b/rtgui/rtscalable.h index b8db9953c..28ebf7be8 100644 --- a/rtgui/rtscalable.h +++ b/rtgui/rtscalable.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #pragma once diff --git a/rtgui/rtsurface.cc b/rtgui/rtsurface.cc index 230c3ff4f..62dfe36d5 100644 --- a/rtgui/rtsurface.cc +++ b/rtgui/rtsurface.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include diff --git a/rtgui/rtsurface.h b/rtgui/rtsurface.h index b442b7493..1944cc2dc 100644 --- a/rtgui/rtsurface.h +++ b/rtgui/rtsurface.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #pragma once diff --git a/rtgui/rtwindow.cc b/rtgui/rtwindow.cc index 131016cb0..3983f93b1 100644 --- a/rtgui/rtwindow.cc +++ b/rtgui/rtwindow.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include diff --git a/rtgui/rtwindow.h b/rtgui/rtwindow.h index 48662858f..93e1c31b9 100644 --- a/rtgui/rtwindow.h +++ b/rtgui/rtwindow.h @@ -13,7 +13,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _RTWINDOW_ #define _RTWINDOW_ diff --git a/rtgui/saveasdlg.cc b/rtgui/saveasdlg.cc index f2a7206b9..1b61d7d3d 100644 --- a/rtgui/saveasdlg.cc +++ b/rtgui/saveasdlg.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include diff --git a/rtgui/saveasdlg.h b/rtgui/saveasdlg.h index e02be340f..dd120337d 100644 --- a/rtgui/saveasdlg.h +++ b/rtgui/saveasdlg.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _SAVEASDLG_ #define _SAVEASDLG_ diff --git a/rtgui/saveformatpanel.cc b/rtgui/saveformatpanel.cc index 483565446..00f6e7b2b 100644 --- a/rtgui/saveformatpanel.cc +++ b/rtgui/saveformatpanel.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include #include diff --git a/rtgui/saveformatpanel.h b/rtgui/saveformatpanel.h index 7d7210282..ab5ffef3e 100644 --- a/rtgui/saveformatpanel.h +++ b/rtgui/saveformatpanel.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef __SAVEFORMATPANEL_H__ #define __SAVEFORMATPANEL_H__ diff --git a/rtgui/sensorbayer.cc b/rtgui/sensorbayer.cc index 44afdd2e8..39ed5cb91 100644 --- a/rtgui/sensorbayer.cc +++ b/rtgui/sensorbayer.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "sensorbayer.h" #include "guiutils.h" diff --git a/rtgui/sensorbayer.h b/rtgui/sensorbayer.h index f3c620d88..2d68411ce 100644 --- a/rtgui/sensorbayer.h +++ b/rtgui/sensorbayer.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _SENSORBAYER_H_ #define _SENSORBAYER_H_ diff --git a/rtgui/sensorxtrans.cc b/rtgui/sensorxtrans.cc index c0a704ebf..f13e6607f 100644 --- a/rtgui/sensorxtrans.cc +++ b/rtgui/sensorxtrans.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "sensorxtrans.h" #include "guiutils.h" diff --git a/rtgui/sensorxtrans.h b/rtgui/sensorxtrans.h index d723d29f7..fbf71b401 100644 --- a/rtgui/sensorxtrans.h +++ b/rtgui/sensorxtrans.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _SENSORXTRANS_H_ #define _SENSORXTRANS_H_ diff --git a/rtgui/shadowshighlights.cc b/rtgui/shadowshighlights.cc index f58790051..3e3c277c7 100644 --- a/rtgui/shadowshighlights.cc +++ b/rtgui/shadowshighlights.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "shadowshighlights.h" diff --git a/rtgui/shadowshighlights.h b/rtgui/shadowshighlights.h index 5e56e0766..d675f40d6 100644 --- a/rtgui/shadowshighlights.h +++ b/rtgui/shadowshighlights.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _SHADOWSHIGHLIGHTS_H_ #define _SHADOWSHIGHLIGHTS_H_ diff --git a/rtgui/sharpenedge.cc b/rtgui/sharpenedge.cc index 9d6466543..f4415bb15 100644 --- a/rtgui/sharpenedge.cc +++ b/rtgui/sharpenedge.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include #include diff --git a/rtgui/sharpenedge.h b/rtgui/sharpenedge.h index a08c63b8a..b136d8e5e 100644 --- a/rtgui/sharpenedge.h +++ b/rtgui/sharpenedge.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . * * * Manuel Llorens' algorithm of edge sharpening diff --git a/rtgui/sharpening.cc b/rtgui/sharpening.cc index e698872dd..e16511279 100644 --- a/rtgui/sharpening.cc +++ b/rtgui/sharpening.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include #include "eventmapper.h" diff --git a/rtgui/sharpening.h b/rtgui/sharpening.h index b9f093aae..ac846a2b6 100644 --- a/rtgui/sharpening.h +++ b/rtgui/sharpening.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _SHARPENING_H_ #define _SHARPENING_H_ diff --git a/rtgui/sharpenmicro.cc b/rtgui/sharpenmicro.cc index 1d765652b..78228d27c 100644 --- a/rtgui/sharpenmicro.cc +++ b/rtgui/sharpenmicro.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include #include diff --git a/rtgui/sharpenmicro.h b/rtgui/sharpenmicro.h index 8cb95b806..7c292413b 100644 --- a/rtgui/sharpenmicro.h +++ b/rtgui/sharpenmicro.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . * * * Manuel Llorens' algorithm of micro-contrast sharpening diff --git a/rtgui/shcselector.cc b/rtgui/shcselector.cc index d55ce30fd..6137c3ec8 100644 --- a/rtgui/shcselector.cc +++ b/rtgui/shcselector.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "shcselector.h" diff --git a/rtgui/shcselector.h b/rtgui/shcselector.h index ac6c8afed..d3ef2adb8 100644 --- a/rtgui/shcselector.h +++ b/rtgui/shcselector.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _SHCSELECTOR_ #define _SHCSELECTOR_ diff --git a/rtgui/softlight.cc b/rtgui/softlight.cc index 90c3890cd..84461f169 100644 --- a/rtgui/softlight.cc +++ b/rtgui/softlight.cc @@ -15,7 +15,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include #include diff --git a/rtgui/softlight.h b/rtgui/softlight.h index f6ed8370d..a584d3a73 100644 --- a/rtgui/softlight.h +++ b/rtgui/softlight.h @@ -15,7 +15,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #pragma once diff --git a/rtgui/soundman.cc b/rtgui/soundman.cc index 62c7d59b6..a4cf5337b 100644 --- a/rtgui/soundman.cc +++ b/rtgui/soundman.cc @@ -14,7 +14,7 @@ * 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 . +* along with RawTherapee. If not, see . * */ diff --git a/rtgui/soundman.h b/rtgui/soundman.h index dd8e515fc..6d065c87a 100644 --- a/rtgui/soundman.h +++ b/rtgui/soundman.h @@ -14,7 +14,7 @@ * 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 . +* along with RawTherapee. If not, see . * */ diff --git a/rtgui/splash.cc b/rtgui/splash.cc index 36b796c4d..7ae5bf4d7 100644 --- a/rtgui/splash.cc +++ b/rtgui/splash.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "splash.h" diff --git a/rtgui/splash.h b/rtgui/splash.h index 00e9f556e..29dbb62cf 100644 --- a/rtgui/splash.h +++ b/rtgui/splash.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef __SPLASH__ #define __SPLASH__ diff --git a/rtgui/threadutils.cc b/rtgui/threadutils.cc index 7ba296081..025abf300 100644 --- a/rtgui/threadutils.cc +++ b/rtgui/threadutils.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "threadutils.h" diff --git a/rtgui/threadutils.h b/rtgui/threadutils.h index 1215d53a1..f8107d74c 100644 --- a/rtgui/threadutils.h +++ b/rtgui/threadutils.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _THREADUTILS_ #define _THREADUTILS_ diff --git a/rtgui/thresholdadjuster.cc b/rtgui/thresholdadjuster.cc index 210f63333..c6ba96111 100644 --- a/rtgui/thresholdadjuster.cc +++ b/rtgui/thresholdadjuster.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "thresholdadjuster.h" #include diff --git a/rtgui/thresholdadjuster.h b/rtgui/thresholdadjuster.h index 54026a183..ea3822875 100644 --- a/rtgui/thresholdadjuster.h +++ b/rtgui/thresholdadjuster.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _THRESHOLDADJUSTER_H_ #define _THRESHOLDADJUSTER_H_ diff --git a/rtgui/thresholdselector.cc b/rtgui/thresholdselector.cc index d9b0921ce..b44425be4 100644 --- a/rtgui/thresholdselector.cc +++ b/rtgui/thresholdselector.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include diff --git a/rtgui/thresholdselector.h b/rtgui/thresholdselector.h index fff707959..6b9dda3d0 100644 --- a/rtgui/thresholdselector.h +++ b/rtgui/thresholdselector.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _THRESHOLDSELECTOR_ #define _THRESHOLDSELECTOR_ diff --git a/rtgui/thumbbrowserbase.cc b/rtgui/thumbbrowserbase.cc index 13709d8f7..adf451f05 100644 --- a/rtgui/thumbbrowserbase.cc +++ b/rtgui/thumbbrowserbase.cc @@ -12,7 +12,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include diff --git a/rtgui/thumbbrowserbase.h b/rtgui/thumbbrowserbase.h index aefd72044..890c37c87 100644 --- a/rtgui/thumbbrowserbase.h +++ b/rtgui/thumbbrowserbase.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _THUMBNAILBROWSERBASE_ #define _THUMBNAILBROWSERBASE_ diff --git a/rtgui/thumbbrowserentrybase.cc b/rtgui/thumbbrowserentrybase.cc index 4dacb1adf..9d74fbd79 100644 --- a/rtgui/thumbbrowserentrybase.cc +++ b/rtgui/thumbbrowserentrybase.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "thumbbrowserentrybase.h" diff --git a/rtgui/thumbbrowserentrybase.h b/rtgui/thumbbrowserentrybase.h index 6cbcb37d0..5f018eefd 100644 --- a/rtgui/thumbbrowserentrybase.h +++ b/rtgui/thumbbrowserentrybase.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #pragma once diff --git a/rtgui/thumbimageupdater.cc b/rtgui/thumbimageupdater.cc index c0df751a5..182eba704 100644 --- a/rtgui/thumbimageupdater.cc +++ b/rtgui/thumbimageupdater.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include diff --git a/rtgui/thumbimageupdater.h b/rtgui/thumbimageupdater.h index a3be44d7c..0e46b11d7 100644 --- a/rtgui/thumbimageupdater.h +++ b/rtgui/thumbimageupdater.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _THUMBIMAGEUPDATER_ #define _THUMBIMAGEUPDATER_ diff --git a/rtgui/thumbnail.cc b/rtgui/thumbnail.cc index 79291c423..7ec1fef4e 100644 --- a/rtgui/thumbnail.cc +++ b/rtgui/thumbnail.cc @@ -13,7 +13,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "multilangmgr.h" #include "thumbnail.h" diff --git a/rtgui/thumbnail.h b/rtgui/thumbnail.h index e3196778c..ec5dbd249 100644 --- a/rtgui/thumbnail.h +++ b/rtgui/thumbnail.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _THUMBNAIL_ #define _THUMBNAIL_ diff --git a/rtgui/thumbnailbrowser.h b/rtgui/thumbnailbrowser.h index 0c2d6ebab..9d40d1f7d 100644 --- a/rtgui/thumbnailbrowser.h +++ b/rtgui/thumbnailbrowser.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _THUMBNAILBROWSER_ #define _THUMBNAILBROWSER_ diff --git a/rtgui/thumbnaillistener.h b/rtgui/thumbnaillistener.h index 99a9a9286..97503c420 100644 --- a/rtgui/thumbnaillistener.h +++ b/rtgui/thumbnaillistener.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _THUMBNAILLISTENER_ #define _THUMBNAILLISTENER_ diff --git a/rtgui/tonecurve.cc b/rtgui/tonecurve.cc index e0e475b4e..fa1c80ed8 100644 --- a/rtgui/tonecurve.cc +++ b/rtgui/tonecurve.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include diff --git a/rtgui/tonecurve.h b/rtgui/tonecurve.h index 512dd4d5f..fb08c02c2 100644 --- a/rtgui/tonecurve.h +++ b/rtgui/tonecurve.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _TONECURVE_H_ #define _TONECURVE_H_ diff --git a/rtgui/toolbar.cc b/rtgui/toolbar.cc index 9bed78768..b8e0d64dc 100644 --- a/rtgui/toolbar.cc +++ b/rtgui/toolbar.cc @@ -15,7 +15,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "toolbar.h" #include "multilangmgr.h" diff --git a/rtgui/toolbar.h b/rtgui/toolbar.h index 2d859eac7..52f4dcbd4 100644 --- a/rtgui/toolbar.h +++ b/rtgui/toolbar.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef __TOOLBAR_H__ #define __TOOLBAR_H__ diff --git a/rtgui/toolenum.h b/rtgui/toolenum.h index 85a7b954a..e90a0f685 100644 --- a/rtgui/toolenum.h +++ b/rtgui/toolenum.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _TOOLENUM_ #define _TOOLENUM_ diff --git a/rtgui/toolpanel.cc b/rtgui/toolpanel.cc index 1fe9808cd..27f68767e 100644 --- a/rtgui/toolpanel.cc +++ b/rtgui/toolpanel.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "toolpanel.h" #include "toolpanelcoord.h" diff --git a/rtgui/toolpanel.h b/rtgui/toolpanel.h index 1d3630c6d..8d4a55eab 100644 --- a/rtgui/toolpanel.h +++ b/rtgui/toolpanel.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef __TOOLPANEL__ #define __TOOLPANEL__ diff --git a/rtgui/toolpanelcoord.cc b/rtgui/toolpanelcoord.cc index d9bc6fc2a..e920e0e97 100644 --- a/rtgui/toolpanelcoord.cc +++ b/rtgui/toolpanelcoord.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "multilangmgr.h" #include "toolpanelcoord.h" diff --git a/rtgui/toolpanelcoord.h b/rtgui/toolpanelcoord.h index a1b26b29f..fea55990e 100644 --- a/rtgui/toolpanelcoord.h +++ b/rtgui/toolpanelcoord.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef __TOOLPANELCCORD__ #define __TOOLPANELCCORD__ diff --git a/rtgui/vibrance.cc b/rtgui/vibrance.cc index 82944bb81..461c4a79f 100644 --- a/rtgui/vibrance.cc +++ b/rtgui/vibrance.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "vibrance.h" diff --git a/rtgui/vibrance.h b/rtgui/vibrance.h index 81d811f14..606bfa80a 100644 --- a/rtgui/vibrance.h +++ b/rtgui/vibrance.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _VIBRANCE_ #define _VIBRANCE_ diff --git a/rtgui/vignetting.cc b/rtgui/vignetting.cc index 87a835625..04a350b99 100644 --- a/rtgui/vignetting.cc +++ b/rtgui/vignetting.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "vignetting.h" diff --git a/rtgui/vignetting.h b/rtgui/vignetting.h index edd818431..094869f67 100644 --- a/rtgui/vignetting.h +++ b/rtgui/vignetting.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _VIGNETTING_H_ #define _VIGNETTING_H_ diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index bc59de087..94f96e0cc 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -12,7 +12,7 @@ * 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 . + * along with RawTherapee. If not, see . * * 2014 Jacques Desmis */ diff --git a/rtgui/wavelet.h b/rtgui/wavelet.h index 4df743fa7..feec85fc9 100644 --- a/rtgui/wavelet.h +++ b/rtgui/wavelet.h @@ -12,7 +12,7 @@ * 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 . + * along with RawTherapee. If not, see . * * 2014 Jacques Desmis */ diff --git a/rtgui/wbprovider.h b/rtgui/wbprovider.h index df1329c84..31ba8331a 100644 --- a/rtgui/wbprovider.h +++ b/rtgui/wbprovider.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _WBPROVIDER_ #define _WBPROVIDER_ diff --git a/rtgui/whitebalance.cc b/rtgui/whitebalance.cc index aa3443829..109fb7502 100644 --- a/rtgui/whitebalance.cc +++ b/rtgui/whitebalance.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "whitebalance.h" diff --git a/rtgui/whitebalance.h b/rtgui/whitebalance.h index 52c4b7f8c..fd7efe7ce 100644 --- a/rtgui/whitebalance.h +++ b/rtgui/whitebalance.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _WB_H_ #define _WB_H_ diff --git a/rtgui/xtransprocess.cc b/rtgui/xtransprocess.cc index 115fa3868..52c46be65 100644 --- a/rtgui/xtransprocess.cc +++ b/rtgui/xtransprocess.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "xtransprocess.h" diff --git a/rtgui/xtransprocess.h b/rtgui/xtransprocess.h index e5389b566..dae93822f 100644 --- a/rtgui/xtransprocess.h +++ b/rtgui/xtransprocess.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _XTRANSPROCESS_H_ #define _XTRANSPROCESS_H_ diff --git a/rtgui/xtransrawexposure.cc b/rtgui/xtransrawexposure.cc index c4f7d7059..28059e69c 100644 --- a/rtgui/xtransrawexposure.cc +++ b/rtgui/xtransrawexposure.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include diff --git a/rtgui/xtransrawexposure.h b/rtgui/xtransrawexposure.h index 54b3de767..08cdcc8bf 100644 --- a/rtgui/xtransrawexposure.h +++ b/rtgui/xtransrawexposure.h @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #ifndef _XTRANSRAWEXPOSURE_H_ #define _XTRANSRAWEXPOSURE_H_ diff --git a/rtgui/zoompanel.cc b/rtgui/zoompanel.cc index ea57b7fdc..c10ec97b9 100644 --- a/rtgui/zoompanel.cc +++ b/rtgui/zoompanel.cc @@ -14,7 +14,7 @@ * 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 . + * along with RawTherapee. If not, see . */ #include "zoompanel.h" #include "multilangmgr.h" diff --git a/rtgui/zoompanel.h b/rtgui/zoompanel.h index 69fe418d4..e1cb651e3 100644 --- a/rtgui/zoompanel.h +++ b/rtgui/zoompanel.h @@ -14,7 +14,7 @@ * GNU General Public License for more details. *l * You should have received a copy of the GNU General Public License - * along with RawTherapee. If not, see . + * along with RawTherapee. If not, see . */ #ifndef _ZOOMPANEL_ #define _ZOOMPANEL_ diff --git a/tools/gimp-plugin/file-formats.h b/tools/gimp-plugin/file-formats.h index fc6697ec7..ac8c2fa54 100644 --- a/tools/gimp-plugin/file-formats.h +++ b/tools/gimp-plugin/file-formats.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . */ /* These are the raw formats that file-rawtherapee will register */ diff --git a/tools/gimp-plugin/file-rawtherapee.c b/tools/gimp-plugin/file-rawtherapee.c index d78c30a10..2848e74fa 100644 --- a/tools/gimp-plugin/file-rawtherapee.c +++ b/tools/gimp-plugin/file-rawtherapee.c @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . */ #include "config.h" From 28dd16c4431c0b1ba8798809822ab7e68d1cc095 Mon Sep 17 00:00:00 2001 From: Beep6581 Date: Tue, 10 Sep 2019 12:41:29 +0200 Subject: [PATCH 43/50] Update README.md --- README.md | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 6d2c04875..ae9efd9c8 100644 --- a/README.md +++ b/README.md @@ -1,41 +1,41 @@ -![RawTherapee logo](http://rawtherapee.com/images/logos/rawtherapee_logo_discuss.png) +![RawTherapee logo](https://www.rawtherapee.com/images/logos/rawtherapee_logo_discuss.png) -RawTherapee is a powerful, cross-platform raw photo processing program, released as [libre software](https://en.wikipedia.org/wiki/Free_software) under the [GNU General Public License Version 3](https://opensource.org/licenses/gpl-3.0.html). It is written mostly in C++ using a [GTK+](http://www.gtk.org/) front-end. It uses a patched version of [dcraw](http://www.cybercom.net/~dcoffin/dcraw/) for reading raw files, with an in-house solution which adds the highest quality support for certain camera models unsupported by dcraw and enhances the accuracy of certain raw files already supported by dcraw. It is notable for the advanced control it gives the user over the demosaicing and development process. +RawTherapee is a powerful, cross-platform raw photo processing program, released as [libre software](https://en.wikipedia.org/wiki/Free_software) under the [GNU General Public License Version 3](https://opensource.org/licenses/gpl-3.0.html). It is written mostly in C++ using a [GTK+](https://www.gtk.org) front-end. It uses a patched version of [dcraw](https://www.dechifro.org/dcraw/) for reading raw files, with an in-house solution which adds the highest quality support for certain camera models unsupported by dcraw and enhances the accuracy of certain raw files already supported by dcraw. It is notable for the advanced control it gives the user over the demosaicing and development process. -## Target audience +## Target Audience -RawTherapee is designed for developing raw files from a broad range of digital cameras, as well as [HDR DNG](https://helpx.adobe.com/photoshop/digital-negative.html) files and non-raw image formats ([JPEG](https://en.wikipedia.org/wiki/JPEG), [TIFF](https://en.wikipedia.org/wiki/Tagged_Image_File_Format) and [PNG](https://en.wikipedia.org/wiki/Portable_Network_Graphics)). The target audience ranges from enthusiast newcomers who wish to broaden their understanding of how digital imaging works to semi-professional photographers. Knowledge in color science is not compulsory, but it is recommended that you are eager to learn and ready to read our documentation ([RawPedia](http://rawpedia.rawtherapee.com/)) as well as look up basic concepts which lie outside the scope of RawPedia, such as [color balance](https://en.wikipedia.org/wiki/Color_balance), elsewhere. +RawTherapee is designed for developing raw files from a broad range of digital cameras, as well as [HDR DNG](https://helpx.adobe.com/photoshop/digital-negative.html) files and non-raw image formats ([JPEG](https://en.wikipedia.org/wiki/JPEG), [TIFF](https://en.wikipedia.org/wiki/Tagged_Image_File_Format) and [PNG](https://en.wikipedia.org/wiki/Portable_Network_Graphics)). The target audience ranges from enthusiast newcomers who wish to broaden their understanding of how digital imaging works to semi-professional photographers. Knowledge in color science is not compulsory, but it is recommended that you are eager to learn and ready to read our documentation ([RawPedia](https://rawpedia.rawtherapee.com/)) as well as look up basic concepts which lie outside the scope of RawPedia, such as [color balance](https://en.wikipedia.org/wiki/Color_balance), elsewhere. -Of course, professionals may use RawTherapee too while enjoying complete freedom, but will probably lack some peripheral features such as [Digital Asset Management](https://en.wikipedia.org/wiki/Digital_asset_management), printing, uploading, etc. RawTherapee is not aimed at being an inclusive all-in-one program, and the [open-source community](https://en.wikipedia.org/wiki/Open-source_movement) is sufficiently developed by now to offer all those peripheral features in other specialized software. +Professionals may use RawTherapee as well while enjoying complete freedom, but will probably lack some peripheral features such as [Digital Asset Management](https://en.wikipedia.org/wiki/Digital_asset_management), printing, uploading, etc. RawTherapee is not aimed at being an inclusive all-in-one program, and the [open-source community](https://en.wikipedia.org/wiki/Open-source_movement) is sufficiently developed by now to offer all those peripheral features in other specialized software. ## Links Website: -http://rawtherapee.com/ +https://www.rawtherapee.com/ Forum: https://discuss.pixls.us/c/software/rawtherapee Features: -http://rawpedia.rawtherapee.com/Features +https://rawpedia.rawtherapee.com/Features -Official documentation: -http://rawpedia.rawtherapee.com/ +Documentation: +https://rawpedia.rawtherapee.com/ Download RawTherapee: -http://rawtherapee.com/downloads +https://www.rawtherapee.com/downloads Download source code tarballs: -http://rawtherapee.com/shared/source/ +https://www.rawtherapee.com/shared/source/ -## Compilation, branches and Git +## Compilation, Branches and Git Refer to RawPedia for a detailed explanation of how to get the necessary dependencies and how to compile RawTherapee. Linux: -http://rawpedia.rawtherapee.com/Linux +https://rawpedia.rawtherapee.com/Linux Windows: -http://rawpedia.rawtherapee.com/Windows +https://rawpedia.rawtherapee.com/Windows macOS: -http://rawpedia.rawtherapee.com/macOS +https://rawpedia.rawtherapee.com/macOS From f335efe6a7c07c49b146f5885965dad2e7252af1 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Tue, 10 Sep 2019 12:45:01 +0200 Subject: [PATCH 44/50] Minor splash screen cleanup --- rtdata/images/svg/splash.svg | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rtdata/images/svg/splash.svg b/rtdata/images/svg/splash.svg index a3bf9f8d2..102916d0f 100644 --- a/rtdata/images/svg/splash.svg +++ b/rtdata/images/svg/splash.svg @@ -479,9 +479,9 @@ borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" - inkscape:zoom="0.93979686" - inkscape:cx="-57.792073" - inkscape:cy="126.17957" + inkscape:zoom="0.90075514" + inkscape:cx="-60.984253" + inkscape:cy="136.82017" inkscape:document-units="px" inkscape:current-layer="layer1" showgrid="false" @@ -574,7 +574,7 @@ RawTherapee splash screen - + Maciej Dworak From b643c90ba77e78168923e6c7dc56193fbb4b498a Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Tue, 10 Sep 2019 19:23:02 +0200 Subject: [PATCH 45/50] Changes for merging release 5.7 back into dev --- RELEASE_NOTES.txt | 21 ++++++----- rtdata/images/svg/splash.svg | 70 ++++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+), 8 deletions(-) diff --git a/RELEASE_NOTES.txt b/RELEASE_NOTES.txt index 0974af86c..33a984c1c 100644 --- a/RELEASE_NOTES.txt +++ b/RELEASE_NOTES.txt @@ -1,10 +1,17 @@ -RAWTHERAPEE 5.7 RELEASE NOTES +RAWTHERAPEE 5.7-dev RELEASE NOTES -This is RawTherapee 5.7, released on 2019-09-10. +This is a development version of RawTherapee. We update the code almost daily. Every few months, once enough changes have accumulated and the code is stabilized, we make a new official release. Every code change between these releases is known as a "development" version, and this is one of them. Start by reading the "Getting Started" article on RawPedia: https://rawpedia.rawtherapee.com/ +While we only commit tested and relatively stable code and so the development versions should be fairly stable, you should be aware that: +- Development versions only had limited testing, so there may be bugs unknown to us. +- You should report these bugs so that they get fixed for the next stable release. See + www.rawpedia.rawtherapee.com/How_to_write_useful_bug_reports +- The way new tools work in the development versions is likely to change as we tweak and tune them, so your processing profiles may produce different results when used in a future stable version. +- Bugs present in the stable versions get fixed in the development versions, and make it into the next stable version when we make a new official release. That means that in some ways the development versions can be "more stable" than the latest stable release. At the same time, new features may introduce new bugs. This is a trade-off you should be aware of. + NEWS RELEVANT TO PHOTOGRAPHERS @@ -19,17 +26,15 @@ In order to use RawTherapee efficiently you should know that: - All curves support the Shift and Ctrl keys while dragging a point. Shift+drag makes the point snap to a meaningful axis (top, bottom, diagonal, other), while Ctrl+drag makes your mouse movement super-fine for precise point positioning. - There are many keyboard shortcuts which make working with RawTherapee much faster and give you greater control. Make sure you familiarize yourself with them on RawPedia's "Keyboard Shortcuts" page! -New features since 5.6: -- Film Negative tool, for easily developing raw photographs of film negatives. -- Support for reading "rating" tags from Exif and XMP, shown in the File Browser/Filmstrip using RawTherapee's star rating system. -- Hundreds of bug fixes, speed optimizations and raw format support improvements. +New features since 5.7: +- TODO NEWS RELEVANT TO PACKAGE MAINTAINERS -New since 5.6: -- Requires CMake >=3.5. +New since 5.7: +- TODO In general: - To get the source code, either clone from git or use the tarball from https://rawtherapee.com/shared/source/ . Do not use the auto-generated GitHub release tarballs. diff --git a/rtdata/images/svg/splash.svg b/rtdata/images/svg/splash.svg index 102916d0f..0989bfdb6 100644 --- a/rtdata/images/svg/splash.svg +++ b/rtdata/images/svg/splash.svg @@ -1061,5 +1061,75 @@ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:49.34799576px;line-height:1.25;font-family:'Eras Bold ITC';-inkscape-font-specification:'Eras Bold ITC Bold';letter-spacing:-7.09514618px" id="path195" /> + + + + + + + + + + + + + + + + From 4079bb9920be8cf6c568c1b0f91bfbe3a2544b30 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Wed, 11 Sep 2019 18:56:07 +0200 Subject: [PATCH 46/50] Capture Sharpening: automatic radius calculation --- rtdata/languages/default | 2 + rtengine/capturesharpening.cc | 307 ++++++++++++++++++++++++++++++++-- rtengine/imagesource.h | 2 +- rtengine/improccoordinator.cc | 7 +- rtengine/improccoordinator.h | 6 + rtengine/procparams.cc | 4 + rtengine/procparams.h | 1 + rtengine/rawimagesource.h | 2 +- rtengine/refreshmap.cc | 2 +- rtengine/rt_algo.cc | 23 ++- rtengine/rt_algo.h | 2 +- rtengine/rtengine.h | 8 + rtengine/simpleprocess.cc | 2 +- rtengine/stdimagesource.h | 2 +- rtgui/paramsedited.cc | 8 +- rtgui/paramsedited.h | 1 + rtgui/pdsharpening.cc | 74 ++++++-- rtgui/pdsharpening.h | 5 +- rtgui/toolpanelcoord.cc | 1 + rtgui/toolpanelcoord.h | 1 - 20 files changed, 416 insertions(+), 44 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 5bf1863df..3749a706a 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -766,6 +766,7 @@ HISTORY_MSG_METADATA_MODE;Metadata copy mode HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold HISTORY_MSG_PDSHARPEN_CONTRAST;CAS - Contrast threshold HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CAS - Auto threshold +HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CAS - Auto radius HISTORY_MSG_PDSHARPEN_GAMMA;CAS - Gamma HISTORY_MSG_PDSHARPEN_ITERATIONS;CAS - Iterations HISTORY_MSG_PDSHARPEN_RADIUS;CAS - Radius @@ -1800,6 +1801,7 @@ TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Roundness:\n0 = rectangle,\n50 = fitted ellipse, TP_PCVIGNETTE_STRENGTH;Strength TP_PCVIGNETTE_STRENGTH_TOOLTIP;Filter strength in stops (reached in corners). TP_PDSHARPENING_LABEL;Capture Sharpening +TP_PDSHARPENING_AUTORADIUS_TOOLTIP;If the checkbox is checked, RawTherapee calculates a value based on the raw data of the image. TP_PERSPECTIVE_HORIZONTAL;Horizontal TP_PERSPECTIVE_LABEL;Perspective TP_PERSPECTIVE_VERTICAL;Vertical diff --git a/rtengine/capturesharpening.cc b/rtengine/capturesharpening.cc index eb95d2633..e741016db 100644 --- a/rtengine/capturesharpening.cc +++ b/rtengine/capturesharpening.cc @@ -37,6 +37,243 @@ #include "../rtgui/multilangmgr.h" namespace { + +void buildClipMaskBayer(const float * const *rawData, int W, int H, float** clipMask, const float whites[2][2]) +{ + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic, 16) +#endif + for (int row = 0; row < H; ++row) { + for (int col = 0; col < W; ++col) { + clipMask[row][col] = 1.f; + } + } + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic, 16) +#endif + for (int row = 2; row < H - 2; ++row) { + float clip0 = whites[row & 1][0]; + float clip1 = whites[row & 1][1]; + for (int col = 2; col < W - 2; ++col) { + if (rawData[row][col] >= clip0) { + clipMask[row - 2][col - 1] = clipMask[row - 2][col] = clipMask[row - 2][col + 1] = 0.f; + clipMask[row - 1][col - 2] = clipMask[row - 1][col - 1] = clipMask[row - 1][col] = clipMask[row - 1][col + 1] = clipMask[row - 1][col + 2] = 0.f; + clipMask[row][col - 2] = clipMask[row][col - 1] = clipMask[row][col] = clipMask[row][col + 1] = clipMask[row][col + 2] = 0.f; + clipMask[row + 1][col - 2] = clipMask[row + 1][col - 1] = clipMask[row + 1][col] = clipMask[row + 1][col + 1] = clipMask[row + 1][col + 2] = 0.f; + clipMask[row + 2][col - 1] = clipMask[row + 2][col] = clipMask[row + 2][col + 1] = 0.f; + } + std::swap(clip0, clip1); + } + } +} + +void buildClipMaskXtrans(const float * const *rawData, int W, int H, float** clipMask, const float whites[6][6]) +{ + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic, 16) +#endif + for (int row = 0; row < H; ++row) { + for (int col = 0; col < W; ++col) { + clipMask[row][col] = 1.f; + } + } + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic, 16) +#endif + for (int row = 2; row < H - 2; ++row) { + for (int col = 2; col < W - 2; ++col) { + const float clip = whites[row % 6][col % 6]; + if (rawData[row][col] >= clip) { + clipMask[row - 2][col - 1] = clipMask[row - 2][col] = clipMask[row - 2][col + 1] = 0.f; + clipMask[row - 1][col - 2] = clipMask[row - 1][col - 1] = clipMask[row - 1][col] = clipMask[row - 1][col + 1] = clipMask[row - 1][col + 2] = 0.f; + clipMask[row][col - 2] = clipMask[row][col - 1] = clipMask[row][col] = clipMask[row][col + 1] = clipMask[row][col + 2] = 0.f; + clipMask[row + 1][col - 2] = clipMask[row + 1][col - 1] = clipMask[row + 1][col] = clipMask[row + 1][col + 1] = clipMask[row + 1][col + 2] = 0.f; + clipMask[row + 2][col - 1] = clipMask[row + 2][col] = clipMask[row + 2][col + 1] = 0.f; + } + } + } +} + +void buildClipMaskMono(const float * const *rawData, int W, int H, float** clipMask, float white) +{ + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic, 16) +#endif + for (int row = 0; row < H; ++row) { + for (int col = 0; col < W; ++col) { + clipMask[row][col] = 1.f; + } + } + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic, 16) +#endif + for (int row = 2; row < H - 2; ++row) { + for (int col = 2; col < W - 2; ++col) { + if (rawData[row][col] >= white) { + clipMask[row - 2][col - 1] = clipMask[row - 2][col] = clipMask[row - 2][col + 1] = 0.f; + clipMask[row - 1][col - 2] = clipMask[row - 1][col - 1] = clipMask[row - 1][col] = clipMask[row - 1][col + 1] = clipMask[row - 1][col + 2] = 0.f; + clipMask[row][col - 2] = clipMask[row][col - 1] = clipMask[row][col] = clipMask[row][col + 1] = clipMask[row][col + 2] = 0.f; + clipMask[row + 1][col - 2] = clipMask[row + 1][col - 1] = clipMask[row + 1][col] = clipMask[row + 1][col + 1] = clipMask[row + 1][col + 2] = 0.f; + clipMask[row + 2][col - 1] = clipMask[row + 2][col] = clipMask[row + 2][col + 1] = 0.f; + } + } + } +} + +float calcRadiusBayer(const float * const *rawData, int W, int H, float lowerLimit, float upperLimit, const unsigned int fc[2]) +{ + + float maxRatio = 1.f; +#ifdef _OPENMP + #pragma omp parallel for reduction(max:maxRatio) schedule(dynamic, 16) +#endif + for (int row = 4; row < H - 4; ++row) { + for (int col = 5 + (fc[row & 1] & 1); col < W - 4; col += 2) { + const float val00 = rawData[row][col]; + if (val00 > 0.f) { + const float val1m1 = rawData[row + 1][col - 1]; + const float val1p1 = rawData[row + 1][col + 1]; + const float maxVal0 = std::max(val00, val1m1); + if (val1m1 > 0.f && maxVal0 > lowerLimit) { + const float minVal = std::min(val00, val1m1); + if (UNLIKELY(maxVal0 > maxRatio * minVal)) { + bool clipped = false; + if (maxVal0 == val00) { // check for influence by clipped green in neighborhood + if (rtengine::max(rawData[row - 1][col - 1], rawData[row - 1][col + 1], val1p1) >= upperLimit) { + clipped = true; + } + } else { // check for influence by clipped green in neighborhood + if (rtengine::max(rawData[row][col - 2], val00, rawData[row + 2][col - 2], rawData[row + 2][col]) >= upperLimit) { + clipped = true; + } + } + if (!clipped) { + maxRatio = maxVal0 / minVal; + } + } + } + const float maxVal1 = std::max(val00, val1p1); + if (val1p1 > 0.f && maxVal1 > lowerLimit) { + const float minVal = std::min(val00, val1p1); + if (UNLIKELY(maxVal1 > maxRatio * minVal)) { + if (maxVal1 == val00) { // check for influence by clipped green in neighborhood + if (rtengine::max(rawData[row - 1][col - 1], rawData[row - 1][col + 1], val1p1) >= upperLimit) { + continue; + } + } else { // check for influence by clipped green in neighborhood + if (rtengine::max(val00, rawData[row][col + 2], rawData[row + 2][col], rawData[row + 2][col + 2]) >= upperLimit) { + continue; + } + } + maxRatio = maxVal1 / minVal; + } + } + } + } + } + return std::sqrt((1.f / (std::log(1.f / maxRatio) / 2.f)) / -2.f); +} + +float calcRadiusXtrans(const float * const *rawData, int W, int H, float lowerLimit, float upperLimit, unsigned int starty, unsigned int startx) +{ + + float maxRatio = 1.f; +#ifdef _OPENMP + #pragma omp parallel for reduction(max:maxRatio) schedule(dynamic, 16) +#endif + for (int row = starty + 3; row < H - 4; row += 3) { + for (int col = startx + 3; col < W - 4; col += 3) { + const float valtl = rawData[row][col]; + const float valtr = rawData[row][col + 1]; + const float valbl = rawData[row + 1][col]; + const float valbr = rawData[row + 1][col + 1]; + if (valtl > 1.f) { + const float maxValtltr = std::max(valtl, valtr); + if (valtr > 1.f && maxValtltr > lowerLimit) { + const float minVal = std::min(valtl, valtr); + if (UNLIKELY(maxValtltr > maxRatio * minVal)) { + bool clipped = false; + if (maxValtltr == valtl) { // check for influence by clipped green in neighborhood + if (rtengine::max(rawData[row - 1][col - 1], valtr, valbl, valbr) >= upperLimit) { + clipped = true; + } + } else { // check for influence by clipped green in neighborhood + if (rtengine::max(rawData[row - 1][col + 2], valtl, valbl, valbr) >= upperLimit) { + clipped = true; + } + } + if (!clipped) { + maxRatio = maxValtltr / minVal; + } + } + } + const float maxValtlbl = std::max(valtl, valbl); + if (valbl > 1.f && maxValtlbl > lowerLimit) { + const float minVal = std::min(valtl, valbl); + if (UNLIKELY(maxValtlbl > maxRatio * minVal)) { + bool clipped = false; + if (maxValtlbl == valtl) { // check for influence by clipped green in neighborhood + if (rtengine::max(rawData[row - 1][col - 1], valtr, valbl, valbr) >= upperLimit) { + clipped = true; + } + } else { // check for influence by clipped green in neighborhood + if (rtengine::max(valtl, valtr, rawData[row + 2][col - 1], valbr) >= upperLimit) { + clipped = true; + } + } + if (!clipped) { + maxRatio = maxValtlbl / minVal; + } + } + } + } + if (valbr > 1.f) { + const float maxValblbr = std::max(valbl, valbr); + if (valbl > 1.f && maxValblbr > lowerLimit) { + const float minVal = std::min(valbl, valbr); + if (UNLIKELY(maxValblbr > maxRatio * minVal)) { + bool clipped = false; + if (maxValblbr == valbr) { // check for influence by clipped green in neighborhood + if (rtengine::max(valtl, valtr, valbl, rawData[row + 2][col + 2]) >= upperLimit) { + clipped = true; + } + } else { // check for influence by clipped green in neighborhood + if (rtengine::max(valtl, valtr, rawData[row + 2][col - 1], valbr) >= upperLimit) { + clipped = true; + } + } + if (!clipped) { + maxRatio = maxValblbr / minVal; + } + } + } + const float maxValtrbr = std::max(valtr, valbr); + if (valtr > 1.f && maxValtrbr > lowerLimit) { + const float minVal = std::min(valtr, valbr); + if (UNLIKELY(maxValtrbr > maxRatio * minVal)) { + if (maxValtrbr == valbr) { // check for influence by clipped green in neighborhood + if (rtengine::max(valtl, valtr, valbl, rawData[row + 2][col + 2]) >= upperLimit) { + continue; + } + } else { // check for influence by clipped green in neighborhood + if (rtengine::max(rawData[row - 1][col + 2], valtl, valbl, valbr) >= upperLimit) { + continue; + } + } + maxRatio = maxValtrbr / minVal; + } + } + } + } + } + return std::sqrt((1.f / (std::log(1.f / maxRatio))) / -2.f); +} void CaptureDeconvSharpening (float** luminance, float** tmp, const float * const * blend, int W, int H, double sigma, int iterations, rtengine::ProgressListener* plistener, double start, double step) { @@ -54,7 +291,7 @@ void CaptureDeconvSharpening (float** luminance, float** tmp, const float * cons tmpI[i][j] = max(luminance[i][j], 0.f); } } - + for (int k = 0; k < iterations; k++) { // apply gaussian blur and divide luminance by result of gaussian blur gaussianBlur(tmpI, tmp, W, H, sigma, nullptr, GAUSS_DIV, luminance); @@ -85,9 +322,7 @@ void CaptureDeconvSharpening (float** luminance, float** tmp, const float * cons namespace rtengine { -void RawImageSource::captureSharpening(const procparams::CaptureSharpeningParams &sharpeningParams, bool showMask, double &conrastThreshold) { -BENCHFUN - +void RawImageSource::captureSharpening(const procparams::CaptureSharpeningParams &sharpeningParams, bool showMask, double &conrastThreshold, double &radius) { if (plistener) { plistener->setProgressStr(M("TP_PDSHARPENING_LABEL")); @@ -102,12 +337,62 @@ BENCHFUN float contrast = conrastThreshold / 100.f; + const float clipVal = (ri->get_white(1) - ri->get_cblack(1)) * scale_mul[1]; + array2D& redVals = redCache ? *redCache : red; array2D& greenVals = greenCache ? *greenCache : green; array2D& blueVals = blueCache ? *blueCache : blue; + array2D clipMask(W, H); + constexpr float clipLimit = 0.95f; + if (ri->getSensorType() == ST_BAYER) { + const float whites[2][2] = { + {(ri->get_white(FC(0,0)) - c_black[FC(0,0)]) * scale_mul[FC(0,0)] * clipLimit, (ri->get_white(FC(0,1)) - c_black[FC(0,1)]) * scale_mul[FC(0,1)] * clipLimit}, + {(ri->get_white(FC(1,0)) - c_black[FC(1,0)]) * scale_mul[FC(1,0)] * clipLimit, (ri->get_white(FC(1,1)) - c_black[FC(1,1)]) * scale_mul[FC(1,1)] * clipLimit} + }; + buildClipMaskBayer(rawData, W, H, clipMask, whites); + const unsigned int fc[2] = {FC(0,0), FC(1,0)}; + if (sharpeningParams.autoRadius) { + radius = calcRadiusBayer(rawData, W, H, 1000.f, clipVal, fc); + } + } else if (ri->getSensorType() == ST_FUJI_XTRANS) { + float whites[6][6]; + for (int i = 0; i < 6; ++i) { + for (int j = 0; j < 6; ++j) { + const auto color = ri->XTRANSFC(i, j); + whites[i][j] = (ri->get_white(color) - c_black[color]) * scale_mul[color] * clipLimit; + } + } + buildClipMaskXtrans(rawData, W, H, clipMask, whites); + bool found = false; + int i, j; + for (i = 6; i < 12 && !found; ++i) { + for (j = 6; j < 12 && !found; ++j) { + if (ri->XTRANSFC(i, j) == 1) { + if (ri->XTRANSFC(i, j - 1) != ri->XTRANSFC(i, j + 1)) { + if (ri->XTRANSFC(i - 1, j) != 1) { + if (ri->XTRANSFC(i, j - 1) != 1) { + found = true; + break; + } + } + } + } + } + } + if (sharpeningParams.autoRadius) { + radius = calcRadiusXtrans(rawData, W, H, 1000.f, clipVal, i, j); + } + + } else if (ri->get_colors() == 1) { + buildClipMaskMono(rawData, W, H, clipMask, (ri->get_white(0) - c_black[0]) * scale_mul[0] * clipLimit); + if (sharpeningParams.autoRadius) { + const unsigned int fc[2] = {0, 0}; + radius = calcRadiusBayer(rawData, W, H, 1000.f, clipVal, fc); + } + } + if (showMask) { - StopWatch Stop1("Show mask"); array2D& L = blue; // blue will be overridden anyway => we can use its buffer to store L #ifdef _OPENMP #pragma omp parallel for @@ -119,8 +404,9 @@ BENCHFUN if (plistener) { plistener->setProgress(0.1); } + array2D& blend = red; // red will be overridden anyway => we can use its buffer to store the blend mask - buildBlendMask(L, blend, W, H, contrast, 1.f, sharpeningParams.autoContrast); + buildBlendMask(L, blend, W, H, contrast, 1.f, sharpeningParams.autoContrast, clipMask); if (plistener) { plistener->setProgress(0.2); } @@ -157,7 +443,6 @@ BENCHFUN array2D& YOld = YOldbuffer ? * YOldbuffer : green; array2D& YNew = YNewbuffer ? * YNewbuffer : blue; - StopWatch Stop1("rgb2YL"); #ifdef _OPENMP #pragma omp parallel for schedule(dynamic, 16) #endif @@ -170,19 +455,17 @@ BENCHFUN } // calculate contrast based blend factors to reduce sharpening in regions with low contrast JaggedArray blend(W, H); - buildBlendMask(L, blend, W, H, contrast, 1.f, sharpeningParams.autoContrast); + buildBlendMask(L, blend, W, H, contrast, 1.f, sharpeningParams.autoContrast, clipMask); if (plistener) { plistener->setProgress(0.2); } conrastThreshold = contrast * 100.f; - Stop1.stop(); array2D& tmp = L; // L is not used anymore now => we can use its buffer as the needed temporary buffer - CaptureDeconvSharpening(YNew, tmp, blend, W, H, sharpeningParams.deconvradius, sharpeningParams.deconviter, plistener, 0.2, (0.9 - 0.2) / sharpeningParams.deconviter); + CaptureDeconvSharpening(YNew, tmp, blend, W, H, radius, sharpeningParams.deconviter, plistener, 0.2, (0.9 - 0.2) / sharpeningParams.deconviter); if (plistener) { plistener->setProgress(0.9); } - StopWatch Stop2("Y2RGB"); const float gamma = sharpeningParams.gamma; #ifdef _OPENMP #pragma omp parallel for schedule(dynamic, 16) @@ -206,7 +489,7 @@ BENCHFUN blue[i][j] = blueVals[i][j] * factor; } } - Stop2.stop(); + delete Lbuffer; delete YOldbuffer; delete YNewbuffer; diff --git a/rtengine/imagesource.h b/rtengine/imagesource.h index c62dfe7d8..edc1102c4 100644 --- a/rtengine/imagesource.h +++ b/rtengine/imagesource.h @@ -182,7 +182,7 @@ public: return this; } virtual void getRawValues(int x, int y, int rotate, int &R, int &G, int &B) = 0; - virtual void captureSharpening(const procparams::CaptureSharpeningParams &sharpeningParams, bool showMask, double &conrastThreshold) = 0; + virtual void captureSharpening(const procparams::CaptureSharpeningParams &sharpeningParams, bool showMask, double &conrastThreshold, double &radius) = 0; }; } diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index c6268576a..8b9e49124 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -122,6 +122,7 @@ ImProcCoordinator::ImProcCoordinator() : bayerAutoContrastListener(nullptr), xtransAutoContrastListener(nullptr), pdSharpenAutoContrastListener(nullptr), + pdSharpenAutoRadiusListener(nullptr), frameCountListener(nullptr), imageTypeListener(nullptr), actListener(nullptr), @@ -346,10 +347,14 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) if ((todo & (M_RAW | M_CSHARP)) && params->pdsharpening.enabled) { double pdSharpencontrastThreshold = params->pdsharpening.contrast; - imgsrc->captureSharpening(params->pdsharpening, sharpMask, pdSharpencontrastThreshold); + double pdSharpenRadius = params->pdsharpening.deconvradius; + imgsrc->captureSharpening(params->pdsharpening, sharpMask, pdSharpencontrastThreshold, pdSharpenRadius); if (pdSharpenAutoContrastListener && params->pdsharpening.autoContrast) { pdSharpenAutoContrastListener->autoContrastChanged(pdSharpencontrastThreshold); } + if (pdSharpenAutoRadiusListener && params->pdsharpening.autoRadius) { + pdSharpenAutoRadiusListener->autoRadiusChanged(pdSharpenRadius); + } } diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index df4ec8134..379a3fb20 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -162,6 +162,7 @@ protected: AutoContrastListener *bayerAutoContrastListener; AutoContrastListener *xtransAutoContrastListener; AutoContrastListener *pdSharpenAutoContrastListener; + AutoRadiusListener *pdSharpenAutoRadiusListener; FrameCountListener *frameCountListener; ImageTypeListener *imageTypeListener; @@ -364,6 +365,11 @@ public: xtransAutoContrastListener = acl; } + void setpdSharpenAutoRadiusListener (AutoRadiusListener* acl) override + { + pdSharpenAutoRadiusListener = acl; + } + void setpdSharpenAutoContrastListener (AutoContrastListener* acl) override { pdSharpenAutoContrastListener = acl; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 2fcc5d358..f88220c4e 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -1152,6 +1152,7 @@ bool SharpeningParams::operator !=(const SharpeningParams& other) const CaptureSharpeningParams::CaptureSharpeningParams() : enabled(false), autoContrast(true), + autoRadius(true), contrast(10.0), gamma(1.00), deconvradius(0.75), @@ -1166,6 +1167,7 @@ bool CaptureSharpeningParams::operator ==(const CaptureSharpeningParams& other) && contrast == other.contrast && gamma == other.gamma && autoContrast == other.autoContrast + && autoRadius == other.autoRadius && deconvradius == other.deconvradius && deconviter == other.deconviter; } @@ -3370,6 +3372,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->pdsharpening.enabled, "PostDemosaicSharpening", "Enabled", pdsharpening.enabled, keyFile); saveToKeyfile(!pedited || pedited->pdsharpening.contrast, "PostDemosaicSharpening", "Contrast", pdsharpening.contrast, keyFile); saveToKeyfile(!pedited || pedited->pdsharpening.autoContrast, "PostDemosaicSharpening", "AutoContrast", pdsharpening.autoContrast, keyFile); + saveToKeyfile(!pedited || pedited->pdsharpening.autoRadius, "PostDemosaicSharpening", "AutoRadius", pdsharpening.autoRadius, keyFile); saveToKeyfile(!pedited || pedited->pdsharpening.gamma, "PostDemosaicSharpening", "DeconvGamma", pdsharpening.gamma, keyFile); saveToKeyfile(!pedited || pedited->pdsharpening.deconvradius, "PostDemosaicSharpening", "DeconvRadius", pdsharpening.deconvradius, keyFile); saveToKeyfile(!pedited || pedited->pdsharpening.deconviter, "PostDemosaicSharpening", "DeconvIterations", pdsharpening.deconviter, keyFile); @@ -4458,6 +4461,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "PostDemosaicSharpening", "Enabled", pedited, pdsharpening.enabled, pedited->pdsharpening.enabled); assignFromKeyfile(keyFile, "PostDemosaicSharpening", "Contrast", pedited, pdsharpening.contrast, pedited->pdsharpening.contrast); assignFromKeyfile(keyFile, "PostDemosaicSharpening", "AutoContrast", pedited, pdsharpening.autoContrast, pedited->pdsharpening.autoContrast); + assignFromKeyfile(keyFile, "PostDemosaicSharpening", "AutoRadius", pedited, pdsharpening.autoRadius, pedited->pdsharpening.autoRadius); assignFromKeyfile(keyFile, "PostDemosaicSharpening", "DeconvGamma", pedited, pdsharpening.gamma, pedited->pdsharpening.gamma); assignFromKeyfile(keyFile, "PostDemosaicSharpening", "DeconvRadius", pedited, pdsharpening.deconvradius, pedited->pdsharpening.deconvradius); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index e8f846a1d..ce03efc7d 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -545,6 +545,7 @@ struct SharpenMicroParams { struct CaptureSharpeningParams { bool enabled; bool autoContrast; + bool autoRadius; double contrast; double gamma; double deconvradius; diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index e20024f3c..e52adea18 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -311,7 +311,7 @@ protected: void hflip (Imagefloat* im); void vflip (Imagefloat* im); void getRawValues(int x, int y, int rotate, int &R, int &G, int &B) override; - void captureSharpening(const procparams::CaptureSharpeningParams &sharpeningParams, bool showMask, double &conrastThreshold) override; + void captureSharpening(const procparams::CaptureSharpeningParams &sharpeningParams, bool showMask, double &conrastThreshold, double &radius) override; }; } diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index db56500b8..6917d856e 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -521,7 +521,7 @@ int refreshmap[rtengine::NUMOFEVENTS] = { RGBCURVE, // EvRGBEnabled LUMINANCECURVE, // EvLEnabled DEMOSAIC, // EvPdShrEnabled - ALLNORAW // EvPdShrMaskToggled + CAPTURESHARPEN // EvPdShrMaskToggled }; diff --git a/rtengine/rt_algo.cc b/rtengine/rt_algo.cc index 9fdb59652..4afd8ac73 100644 --- a/rtengine/rt_algo.cc +++ b/rtengine/rt_algo.cc @@ -156,7 +156,7 @@ float calcContrastThreshold(const float* const * luminance, int tileY, int tileX } } - return c / 100.f; + return (c + 1) / 100.f; } } @@ -299,7 +299,7 @@ void findMinMaxPercentile(const float* data, size_t size, float minPrct, float& maxOut = rtengine::LIM(maxOut, minVal, maxVal); } -void buildBlendMask(const float* const * luminance, float **blend, int W, int H, float &contrastThreshold, float amount, bool autoContrast) { +void buildBlendMask(const float* const * luminance, float **blend, int W, int H, float &contrastThreshold, float amount, bool autoContrast, float ** clipMask) { if (autoContrast) { constexpr float minLuminance = 2000.f; @@ -424,11 +424,20 @@ void buildBlendMask(const float* const * luminance, float **blend, int W, int H, for(int j = 2; j < H - 2; ++j) { int i = 2; #ifdef __SSE2__ - for(; i < W - 5; i += 4) { - vfloat contrastv = vsqrtf(SQRV(LVFU(luminance[j][i+1]) - LVFU(luminance[j][i-1])) + SQRV(LVFU(luminance[j+1][i]) - LVFU(luminance[j-1][i])) + - SQRV(LVFU(luminance[j][i+2]) - LVFU(luminance[j][i-2])) + SQRV(LVFU(luminance[j+2][i]) - LVFU(luminance[j-2][i]))) * scalev; + if (clipMask) { + for(; i < W - 5; i += 4) { + vfloat contrastv = vsqrtf(SQRV(LVFU(luminance[j][i+1]) - LVFU(luminance[j][i-1])) + SQRV(LVFU(luminance[j+1][i]) - LVFU(luminance[j-1][i])) + + SQRV(LVFU(luminance[j][i+2]) - LVFU(luminance[j][i-2])) + SQRV(LVFU(luminance[j+2][i]) - LVFU(luminance[j-2][i]))) * scalev; - STVFU(blend[j][i], amountv * calcBlendFactor(contrastv, contrastThresholdv)); + STVFU(blend[j][i], LVFU(clipMask[j][i]) * amountv * calcBlendFactor(contrastv, contrastThresholdv)); + } + } else { + for(; i < W - 5; i += 4) { + vfloat contrastv = vsqrtf(SQRV(LVFU(luminance[j][i+1]) - LVFU(luminance[j][i-1])) + SQRV(LVFU(luminance[j+1][i]) - LVFU(luminance[j-1][i])) + + SQRV(LVFU(luminance[j][i+2]) - LVFU(luminance[j][i-2])) + SQRV(LVFU(luminance[j+2][i]) - LVFU(luminance[j-2][i]))) * scalev; + + STVFU(blend[j][i], amountv * calcBlendFactor(contrastv, contrastThresholdv)); + } } #endif for(; i < W - 2; ++i) { @@ -436,7 +445,7 @@ void buildBlendMask(const float* const * luminance, float **blend, int W, int H, float contrast = sqrtf(rtengine::SQR(luminance[j][i+1] - luminance[j][i-1]) + rtengine::SQR(luminance[j+1][i] - luminance[j-1][i]) + rtengine::SQR(luminance[j][i+2] - luminance[j][i-2]) + rtengine::SQR(luminance[j+2][i] - luminance[j-2][i])) * scale; - blend[j][i] = amount * calcBlendFactor(contrast, contrastThreshold); + blend[j][i] = (clipMask ? clipMask[j][i] : 1.f) * amount * calcBlendFactor(contrast, contrastThreshold); } } diff --git a/rtengine/rt_algo.h b/rtengine/rt_algo.h index 0ea000a26..5485346c7 100644 --- a/rtengine/rt_algo.h +++ b/rtengine/rt_algo.h @@ -24,5 +24,5 @@ namespace rtengine { void findMinMaxPercentile(const float* data, size_t size, float minPrct, float& minOut, float maxPrct, float& maxOut, bool multiThread = true); -void buildBlendMask(const float* const * luminance, float **blend, int W, int H, float &contrastThreshold, float amount = 1.f, bool autoContrast = false); +void buildBlendMask(const float* const * luminance, float **blend, int W, int H, float &contrastThreshold, float amount = 1.f, bool autoContrast = false, float ** clipmask = nullptr); } diff --git a/rtengine/rtengine.h b/rtengine/rtengine.h index 33cca1aba..c188622af 100644 --- a/rtengine/rtengine.h +++ b/rtengine/rtengine.h @@ -415,6 +415,13 @@ public : virtual void autoContrastChanged (double autoContrast) = 0; }; +class AutoRadiusListener +{ +public : + virtual ~AutoRadiusListener() = default; + virtual void autoRadiusChanged (double autoRadius) = 0; +}; + class WaveletListener { public: @@ -524,6 +531,7 @@ public: virtual void setBayerAutoContrastListener (AutoContrastListener* l) = 0; virtual void setXtransAutoContrastListener (AutoContrastListener* l) = 0; virtual void setpdSharpenAutoContrastListener (AutoContrastListener* l) = 0; + virtual void setpdSharpenAutoRadiusListener (AutoRadiusListener* l) = 0; virtual void setAutoBWListener (AutoBWListener* l) = 0; virtual void setAutoWBListener (AutoWBListener* l) = 0; virtual void setAutoColorTonListener (AutoColorTonListener* l) = 0; diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 2022d2d15..6dbb0e649 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -222,7 +222,7 @@ private: imgsrc->demosaic (params.raw, autoContrast, contrastThreshold, params.pdsharpening.enabled && pl); if (params.pdsharpening.enabled) { - imgsrc->captureSharpening(params.pdsharpening, false, params.pdsharpening.contrast); + imgsrc->captureSharpening(params.pdsharpening, false, params.pdsharpening.contrast, params.pdsharpening.deconvradius); } diff --git a/rtengine/stdimagesource.h b/rtengine/stdimagesource.h index ef1294dea..0dffe2fd0 100644 --- a/rtengine/stdimagesource.h +++ b/rtengine/stdimagesource.h @@ -102,7 +102,7 @@ public: void getRawValues(int x, int y, int rotate, int &R, int &G, int &B) override { R = G = B = 0;} void flushRGB () override; - void captureSharpening(const procparams::CaptureSharpeningParams &sharpeningParams, bool showMask, double &conrastThreshold) override {}; + void captureSharpening(const procparams::CaptureSharpeningParams &sharpeningParams, bool showMask, double &conrastThreshold, double &radius) override {}; }; } #endif diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 84860329f..2ab5702ea 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -168,6 +168,7 @@ void ParamsEdited::set(bool v) pdsharpening.enabled = v; pdsharpening.contrast = v; pdsharpening.autoContrast = v; + pdsharpening.autoRadius = v; pdsharpening.gamma = v; pdsharpening.deconvradius = v; pdsharpening.deconviter = v; @@ -752,6 +753,7 @@ void ParamsEdited::initFrom(const std::vector& pdsharpening.enabled = pdsharpening.enabled && p.pdsharpening.enabled == other.pdsharpening.enabled; pdsharpening.contrast = pdsharpening.contrast && p.pdsharpening.contrast == other.pdsharpening.contrast; pdsharpening.autoContrast = pdsharpening.autoContrast && p.pdsharpening.autoContrast == other.pdsharpening.autoContrast; + pdsharpening.autoRadius = pdsharpening.autoRadius && p.pdsharpening.autoRadius == other.pdsharpening.autoRadius; pdsharpening.gamma = pdsharpening.gamma && p.pdsharpening.gamma == other.pdsharpening.gamma; pdsharpening.deconvradius = pdsharpening.deconvradius && p.pdsharpening.deconvradius == other.pdsharpening.deconvradius; pdsharpening.deconviter = pdsharpening.deconviter && p.pdsharpening.deconviter == other.pdsharpening.deconviter; @@ -1732,6 +1734,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.pdsharpening.autoContrast = mods.pdsharpening.autoContrast; } + if (pdsharpening.autoRadius) { + toEdit.pdsharpening.autoRadius = mods.pdsharpening.autoRadius; + } + if (pdsharpening.gamma) { toEdit.pdsharpening.gamma = dontforceSet && options.baBehav[ADDSET_SHARP_GAMMA] ? toEdit.pdsharpening.gamma + mods.pdsharpening.gamma : mods.pdsharpening.gamma; } @@ -3289,5 +3295,5 @@ bool FilmNegativeParamsEdited::isUnchanged() const bool CaptureSharpeningParamsEdited::isUnchanged() const { - return enabled && contrast && autoContrast && gamma && deconvradius && deconviter; + return enabled && contrast && autoContrast && autoRadius && gamma && deconvradius && deconviter; } \ No newline at end of file diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 860ffc551..1bd7170d4 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -202,6 +202,7 @@ struct CaptureSharpeningParamsEdited { bool enabled; bool contrast; bool autoContrast; + bool autoRadius; bool gamma; bool deconvradius; bool deconviter; diff --git a/rtgui/pdsharpening.cc b/rtgui/pdsharpening.cc index c85b42e95..ef0ad90c2 100644 --- a/rtgui/pdsharpening.cc +++ b/rtgui/pdsharpening.cc @@ -35,6 +35,7 @@ PdSharpening::PdSharpening() : FoldableToolPanel(this, "pdsharpening", M("TP_PDS EvPdShrDRadius = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_RADIUS"); EvPdShrDIterations = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_ITERATIONS"); EvPdShrAutoContrast = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST"); + EvPdShrAutoRadius = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_AUTO_RADIUS"); Gtk::HBox* hb = Gtk::manage(new Gtk::HBox()); hb->show(); @@ -51,6 +52,8 @@ PdSharpening::PdSharpening() : FoldableToolPanel(this, "pdsharpening", M("TP_PDS Gtk::VBox* rld = Gtk::manage(new Gtk::VBox()); gamma = Gtk::manage(new Adjuster(M("TP_SHARPENING_GAMMA"), 0.5, 6.0, 0.05, 1.00)); dradius = Gtk::manage(new Adjuster(M("TP_SHARPENING_EDRADIUS"), 0.4, 1.15, 0.01, 0.75)); + dradius->addAutoButton(M("TP_PDSHARPENING_AUTORADIUS_TOOLTIP")); + dradius->setAutoValue(true); diter = Gtk::manage(new Adjuster(M("TP_SHARPENING_RLD_ITERATIONS"), 1, 100, 1, 20)); rld->pack_start(*gamma); rld->pack_start(*dradius); @@ -85,6 +88,7 @@ void PdSharpening::read(const ProcParams* pp, const ParamsEdited* pedited) if (pedited) { contrast->setEditedState(pedited->pdsharpening.contrast ? Edited : UnEdited); contrast->setAutoInconsistent(multiImage && !pedited->pdsharpening.autoContrast); + dradius->setAutoInconsistent(multiImage && !pedited->pdsharpening.autoRadius); gamma->setEditedState(pedited->pdsharpening.gamma ? Edited : UnEdited); dradius->setEditedState(pedited->pdsharpening.deconvradius ? Edited : UnEdited); diter->setEditedState(pedited->pdsharpening.deconviter ? Edited : UnEdited); @@ -98,8 +102,10 @@ void PdSharpening::read(const ProcParams* pp, const ParamsEdited* pedited) contrast->setAutoValue(pp->pdsharpening.autoContrast); gamma->setValue(pp->pdsharpening.gamma); dradius->setValue(pp->pdsharpening.deconvradius); + dradius->setAutoValue(pp->pdsharpening.autoRadius); diter->setValue(pp->pdsharpening.deconviter); lastAutoContrast = pp->pdsharpening.autoContrast; + lastAutoRadius = pp->pdsharpening.autoRadius; enableListener(); } @@ -112,6 +118,7 @@ void PdSharpening::write(ProcParams* pp, ParamsEdited* pedited) pp->pdsharpening.enabled = getEnabled(); pp->pdsharpening.gamma = gamma->getValue(); pp->pdsharpening.deconvradius = dradius->getValue(); + pp->pdsharpening.autoRadius = dradius->getAutoValue(); pp->pdsharpening.deconviter =(int)diter->getValue(); if (pedited) { @@ -119,6 +126,7 @@ void PdSharpening::write(ProcParams* pp, ParamsEdited* pedited) pedited->pdsharpening.autoContrast = !contrast->getAutoInconsistent(); pedited->pdsharpening.gamma = gamma->getEditedState(); pedited->pdsharpening.deconvradius = dradius->getEditedState(); + pedited->pdsharpening.autoRadius = !dradius->getAutoInconsistent(); pedited->pdsharpening.deconviter = diter->getEditedState(); pedited->pdsharpening.enabled = !get_inconsistent(); } @@ -224,26 +232,62 @@ void PdSharpening::autoContrastChanged(double autoContrast) ); } +void PdSharpening::autoRadiusChanged(double autoRadius) +{ + idle_register.add( + [this, autoRadius]() -> bool + { + disableListener(); + dradius->setValue(autoRadius); + enableListener(); + return false; + } + ); +} + void PdSharpening::adjusterAutoToggled(Adjuster* a, bool newval) { - if (multiImage) { - if (contrast->getAutoInconsistent()) { - contrast->setAutoInconsistent(false); - contrast->setAutoValue(false); - } else if (lastAutoContrast) { - contrast->setAutoInconsistent(true); + if (a == contrast) { + if (multiImage) { + if (contrast->getAutoInconsistent()) { + contrast->setAutoInconsistent(false); + contrast->setAutoValue(false); + } else if (lastAutoContrast) { + contrast->setAutoInconsistent(true); + } + + lastAutoContrast = contrast->getAutoValue(); } - lastAutoContrast = contrast->getAutoValue(); - } + if (listener) { + if (contrast->getAutoInconsistent()) { + listener->panelChanged(EvPdShrAutoContrast, M("GENERAL_UNCHANGED")); + } else if (contrast->getAutoValue()) { + listener->panelChanged(EvPdShrAutoContrast, M("GENERAL_ENABLED")); + } else { + listener->panelChanged(EvPdShrAutoContrast, M("GENERAL_DISABLED")); + } + } + } else { // must be dradius + if (multiImage) { + if (dradius->getAutoInconsistent()) { + dradius->setAutoInconsistent(false); + dradius->setAutoValue(false); + } else if (lastAutoRadius) { + dradius->setAutoInconsistent(true); + } - if (listener) { - if (contrast->getAutoInconsistent()) { - listener->panelChanged(EvPdShrAutoContrast, M("GENERAL_UNCHANGED")); - } else if (contrast->getAutoValue()) { - listener->panelChanged(EvPdShrAutoContrast, M("GENERAL_ENABLED")); - } else { - listener->panelChanged(EvPdShrAutoContrast, M("GENERAL_DISABLED")); + lastAutoRadius = dradius->getAutoValue(); + } + + if (listener) { + if (dradius->getAutoInconsistent()) { + listener->panelChanged(EvPdShrAutoRadius, M("GENERAL_UNCHANGED")); + } else if (dradius->getAutoValue()) { + listener->panelChanged(EvPdShrAutoRadius, M("GENERAL_ENABLED")); + } else { + listener->panelChanged(EvPdShrAutoRadius, M("GENERAL_DISABLED")); + } } } } diff --git a/rtgui/pdsharpening.h b/rtgui/pdsharpening.h index b2f7b6e57..e56b4b085 100644 --- a/rtgui/pdsharpening.h +++ b/rtgui/pdsharpening.h @@ -21,7 +21,7 @@ #include "adjuster.h" #include "toolpanel.h" -class PdSharpening final : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel, public rtengine::AutoContrastListener +class PdSharpening final : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel, public rtengine::AutoContrastListener, public rtengine::AutoRadiusListener { protected: @@ -31,11 +31,13 @@ protected: Adjuster* diter; bool lastAutoContrast; + bool lastAutoRadius; rtengine::ProcEvent EvPdShrContrast; rtengine::ProcEvent EvPdShrDRadius; rtengine::ProcEvent EvPdSharpenGamma; rtengine::ProcEvent EvPdShrDIterations; rtengine::ProcEvent EvPdShrAutoContrast; + rtengine::ProcEvent EvPdShrAutoRadius; IdleRegister idle_register; public: @@ -53,6 +55,7 @@ public: void enabledChanged () override; void autoContrastChanged (double autoContrast) override; + void autoRadiusChanged (double autoRadius) override; void setAdjusterBehavior (bool contrastadd, bool gammaadd, bool radiusadd, bool iteradds); void trimValues (rtengine::procparams::ProcParams* pp) override; diff --git a/rtgui/toolpanelcoord.cc b/rtgui/toolpanelcoord.cc index a664942a1..4fec4a18a 100644 --- a/rtgui/toolpanelcoord.cc +++ b/rtgui/toolpanelcoord.cc @@ -573,6 +573,7 @@ void ToolPanelCoordinator::initImage (rtengine::StagedImageProcessor* ipc_, bool ipc->setBayerAutoContrastListener (bayerprocess); ipc->setXtransAutoContrastListener (xtransprocess); ipc->setpdSharpenAutoContrastListener (pdSharpening); + ipc->setpdSharpenAutoRadiusListener (pdSharpening); ipc->setAutoWBListener (whitebalance); ipc->setAutoColorTonListener (colortoning); ipc->setAutoChromaListener (dirpyrdenoise); diff --git a/rtgui/toolpanelcoord.h b/rtgui/toolpanelcoord.h index 390967395..3a4ddc05f 100644 --- a/rtgui/toolpanelcoord.h +++ b/rtgui/toolpanelcoord.h @@ -242,7 +242,6 @@ public: void imageTypeChanged (bool isRaw, bool isBayer, bool isXtrans, bool isMono = false) override; -// void autoContrastChanged (double autoContrast); // profilechangelistener interface void profileChange( const rtengine::procparams::PartialProfile* nparams, From af10bf8c7c8f06c5fc2effecda4533937016ee9a Mon Sep 17 00:00:00 2001 From: "luz.paz" Date: Wed, 11 Sep 2019 17:38:55 -0400 Subject: [PATCH 47/50] Fix misc. source comment typo Found via `codespell -q 3 -I ../rawtherapy-whitelist.txt -S ./rtdata/languages -L bord,hist,fo,reall,bloc,alph,dof,thre,makro,chang,currentry,portugues,vektor,ue` --- rtengine/demosaic_algos.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rtengine/demosaic_algos.cc b/rtengine/demosaic_algos.cc index 49b386b0a..51db8bb3f 100644 --- a/rtengine/demosaic_algos.cc +++ b/rtengine/demosaic_algos.cc @@ -2024,7 +2024,8 @@ void RawImageSource::refinement(int PassCount) // Refinement based on EECI demozaicing algorithm by L. Chang and Y.P. Tan // from "Lassus" : Luis Sanz Rodriguez, adapted by Jacques Desmis - JDC - and Oliver Duis for RawTherapee -// increases the signal to noise ratio (PSNR) # +1 to +2 dB : tested with Dcraw : eg: Lighthouse + AMaZE : whitout refinement:39.96dB, with refinement:41.86 dB +// increases the signal to noise ratio (PSNR) # +1 to +2 dB : tested with Dcraw : +// eg: Lighthouse + AMaZE : without refinement:39.96 dB, with refinement:41.86 dB // reduce color artifacts, improves the interpolation // but it's relatively slow // From 62ec0f0fd295d6e86437953bc3254a3d32b5339e Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sat, 14 Sep 2019 14:43:32 +0200 Subject: [PATCH 48/50] Capture sharpening: tiled deconvolution --- rtengine/capturesharpening.cc | 381 ++++++++++++++++++++++++++++++---- rtengine/rt_algo.cc | 2 +- 2 files changed, 346 insertions(+), 37 deletions(-) diff --git a/rtengine/capturesharpening.cc b/rtengine/capturesharpening.cc index e741016db..ef35695f3 100644 --- a/rtengine/capturesharpening.cc +++ b/rtengine/capturesharpening.cc @@ -28,7 +28,7 @@ #include "color.h" #include "gauss.h" #include "rt_algo.h" -#define BENCHMARK +//#define BENCHMARK #include "StopWatch.h" #ifdef _OPENMP #include @@ -38,6 +38,257 @@ namespace { +void compute7x7kernel(float sigma, float kernel[7][7]) { + + const double temp = -2.f * rtengine::SQR(sigma); + float sum = 0.f; + for (int i = -3; i <= 3; ++i) { + for (int j = -3; j <= 3; ++j) { + if((rtengine::SQR(i) + rtengine::SQR(j)) <= rtengine::SQR(3.0 * 1.15)) { + kernel[i + 3][j + 3] = std::exp((rtengine::SQR(i) + rtengine::SQR(j)) / temp); + sum += kernel[i + 3][j + 3]; + } else { + kernel[i + 3][j + 3] = 0.f; + } + } + } + + for (int i = 0; i < 7; ++i) { + for (int j = 0; j < 7; ++j) { + kernel[i][j] /= sum; + } + } +} + +void compute5x5kernel(float sigma, float kernel[5][5]) { + + const double temp = -2.f * rtengine::SQR(sigma); + float sum = 0.f; + for (int i = -2; i <= 2; ++i) { + for (int j = -2; j <= 2; ++j) { + if((rtengine::SQR(i) + rtengine::SQR(j)) <= rtengine::SQR(3.0 * 0.84)) { + kernel[i + 2][j + 2] = std::exp((rtengine::SQR(i) + rtengine::SQR(j)) / temp); + sum += kernel[i + 2][j + 2]; + } else { + kernel[i + 2][j + 2] = 0.f; + } + } + } + + for (int i = 0; i < 5; ++i) { + for (int j = 0; j < 5; ++j) { + kernel[i][j] /= sum; + } + } +} + +void compute3x3kernel(float sigma, float kernel[3][3]) { + + const double temp = -2.f * rtengine::SQR(sigma); + float sum = 0.f; + for (int i = -1; i <= 1; ++i) { + for (int j = -1; j <= 1; ++j) { + if((rtengine::SQR(i) + rtengine::SQR(j)) <= rtengine::SQR(3.0 * 0.84)) { + kernel[i + 1][j + 1] = std::exp((rtengine::SQR(i) + rtengine::SQR(j)) / temp); + sum += kernel[i + 1][j + 1]; + } else { + kernel[i + 1][j + 1] = 0.f; + } + } + } + + for (int i = 0; i < 3; ++i) { + for (int j = 0; j < 3; ++j) { + kernel[i][j] /= sum; + } + } +} + +inline void gauss3x3div (float** RESTRICT src, float** RESTRICT dst, float** RESTRICT divBuffer, const int W, const int H, const float kernel[3][3]) +{ + + const float c11 = kernel[0][0]; + const float c10 = kernel[0][1]; + const float c00 = kernel[1][1]; + + for (int i = 1; i < H - 1; i++) { + dst[i][0] = 1.f; + for (int j = 1; j < W - 1; j++) { + const float val = c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) + + c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) + + c00 * src[i][j]; + dst[i][j] = divBuffer[i][j] / std::max(val, 0.00001f); + } + dst[i][W - 1] = 1.f; + } + // first and last rows + { + for (int i = 0; i < 1; ++i) { + for (int j = 0; j < W; ++j) { + dst[i][j] = 1.f; + } + } + for (int i = H - 1 ; i < H; ++i) { + for (int j = 0; j < W; ++j) { + dst[i][j] = 1.f; + } + } + } +} + +inline void gauss5x5div (float** RESTRICT src, float** RESTRICT dst, float** RESTRICT divBuffer, const int W, const int H, const float kernel[5][5]) +{ + + const float c21 = kernel[0][1]; + const float c20 = kernel[0][2]; + const float c11 = kernel[1][1]; + const float c10 = kernel[1][2]; + const float c00 = kernel[2][2]; + + for (int i = 2; i < H - 2; ++i) { + dst[i][0] = dst[i][1] = 1.f; + // I tried hand written SSE code but gcc vectorizes better + for (int j = 2; j < W - 2; ++j) { + const float val = c21 * (src[i - 2][j - 1] + src[i - 2][j + 1] + src[i - 1][j - 2] + src[i - 1][j + 2] + src[i + 1][j - 2] + src[i + 1][j + 2] + src[i + 2][j - 1] + src[i + 2][j + 1]) + + c20 * (src[i - 2][j] + src[i][j - 2] + src[i][j + 2] + src[i + 2][j]) + + c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) + + c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) + + c00 * src[i][j]; + + dst[i][j] = divBuffer[i][j] / std::max(val, 0.00001f); + } + dst[i][W - 2] = dst[i][W - 1] = 1.f; + } + + // first and last rows + { + for (int i = 0; i < 2; ++i) { + for (int j = 0; j < W; ++j) { + dst[i][j] = 1.f; + } + } + for (int i = H - 2 ; i < H; ++i) { + for (int j = 0; j < W; ++j) { + dst[i][j] = 1.f; + } + } + } +} + +inline void gauss7x7div(float** RESTRICT src, float** RESTRICT dst, float** RESTRICT divBuffer, const int W, const int H, const float kernel[7][7]) +{ + + const float c31 = kernel[0][2]; + const float c30 = kernel[0][3]; + const float c22 = kernel[1][1]; + const float c21 = kernel[1][2]; + const float c20 = kernel[1][3]; + const float c11 = kernel[2][2]; + const float c10 = kernel[2][3]; + const float c00 = kernel[3][3]; + + for (int i = 3; i < H - 3; ++i) { + dst[i][0] = dst[i][1] = dst[i][2] = 1.f; + // I tried hand written SSE code but gcc vectorizes better + for (int j = 3; j < W - 3; ++j) { + const float val = c31 * (src[i - 3][j - 1] + src[i - 3][j + 1] + src[i - 1][j - 3] + src[i - 1][j + 3] + src[i + 1][j - 3] + src[i + 1][j + 3] + src[i + 3][j - 1] + src[i + 3][j + 1]) + + c30 * (src[i - 3][j] + src[i][j - 3] + src[i][j + 3] + src[i + 3][j]) + + c22 * (src[i - 2][j - 2] + src[i - 2][j + 2] + src[i + 2][j - 2] + src[i + 2][j + 2]) + + c21 * (src[i - 2][j - 1] + src[i - 2][j + 1] * c21 + src[i - 1][j - 2] + src[i - 1][j + 2] + src[i + 1][j - 2] + src[i + 1][j + 2] + src[i + 2][j - 1] + src[i + 2][j + 1]) + + c20 * (src[i - 2][j] + src[i][j - 2] + src[i][j + 2] + src[i + 2][j]) + + c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) + + c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) + + c00 * src[i][j]; + + dst[i][j] = divBuffer[i][j] / std::max(val, 0.00001f); + } + dst[i][W - 3] = dst[i][W - 2] = dst[i][W - 1] = 1.f; + } + + // first and last rows + { + for (int i = 0; i < 3; ++i) { + for (int j = 0; j < W; ++j) { + dst[i][j] = 1.f; + } + } + for (int i = H - 3 ; i < H; ++i) { + for (int j = 0; j < W; ++j) { + dst[i][j] = 1.f; + } + } + } +} + +inline void gauss3x3mult(float** RESTRICT src, float** RESTRICT dst, const int W, const int H, const float kernel[3][3]) +{ + const float c11 = kernel[0][0]; + const float c10 = kernel[0][1]; + const float c00 = kernel[1][1]; + + for (int i = 1; i < H - 1; i++) { + for (int j = 1; j < W - 1; j++) { + const float val = c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) + + c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) + + c00 * src[i][j]; + dst[i][j] *= val; + } + } + +} + +inline void gauss5x5mult (float** RESTRICT src, float** RESTRICT dst, const int W, const int H, const float kernel[5][5]) +{ + + const float c21 = kernel[0][1]; + const float c20 = kernel[0][2]; + const float c11 = kernel[1][1]; + const float c10 = kernel[1][2]; + const float c00 = kernel[2][2]; + + for (int i = 2; i < H - 2; ++i) { + // I tried hand written SSE code but gcc vectorizes better + for (int j = 2; j < W - 2; ++j) { + const float val = c21 * (src[i - 2][j - 1] + src[i - 2][j + 1] + src[i - 1][j - 2] + src[i - 1][j + 2] + src[i + 1][j - 2] + src[i + 1][j + 2] + src[i + 2][j - 1] + src[i + 2][j + 1]) + + c20 * (src[i - 2][j] + src[i][j - 2] + src[i][j + 2] + src[i + 2][j]) + + c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) + + c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) + + c00 * src[i][j]; + + dst[i][j] *= val; + } + } +} + +inline void gauss7x7mult(float** RESTRICT src, float** RESTRICT dst, const int W, const int H, const float kernel[7][7]) +{ + + const float c31 = kernel[0][2]; + const float c30 = kernel[0][3]; + const float c22 = kernel[1][1]; + const float c21 = kernel[1][2]; + const float c20 = kernel[1][3]; + const float c11 = kernel[2][2]; + const float c10 = kernel[2][3]; + const float c00 = kernel[3][3]; + + for (int i = 3; i < H - 3; ++i) { + // I tried hand written SSE code but gcc vectorizes better + for (int j = 3; j < W - 3; ++j) { + const float val = c31 * (src[i - 3][j - 1] + src[i - 3][j + 1] + src[i - 1][j - 3] + src[i - 1][j + 3] + src[i + 1][j - 3] + src[i + 1][j + 3] + src[i + 3][j - 1] + src[i + 3][j + 1]) + + c30 * (src[i - 3][j] + src[i][j - 3] + src[i][j + 3] + src[i + 3][j]) + + c22 * (src[i - 2][j - 2] + src[i - 2][j + 2] + src[i + 2][j - 2] + src[i + 2][j + 2]) + + c21 * (src[i - 2][j - 1] + src[i - 2][j + 1] * c21 + src[i - 1][j - 2] + src[i - 1][j + 2] + src[i + 1][j - 2] + src[i + 1][j + 2] + src[i + 2][j - 1] + src[i + 2][j + 1]) + + c20 * (src[i - 2][j] + src[i][j - 2] + src[i][j + 2] + src[i + 2][j]) + + c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) + + c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) + + c00 * src[i][j]; + + dst[i][j] *= val; + } + } +} + void buildClipMaskBayer(const float * const *rawData, int W, int H, float** clipMask, const float whites[2][2]) { @@ -274,47 +525,106 @@ float calcRadiusXtrans(const float * const *rawData, int W, int H, float lowerLi } return std::sqrt((1.f / (std::log(1.f / maxRatio))) / -2.f); } -void CaptureDeconvSharpening (float** luminance, float** tmp, const float * const * blend, int W, int H, double sigma, int iterations, rtengine::ProgressListener* plistener, double start, double step) +void CaptureDeconvSharpening (float** luminance, float** oldLuminance, const float * const * blend, int W, int H, double sigma, int iterations, rtengine::ProgressListener* plistener, double startVal, double endVal) { +BENCHFUN + const bool is5x5 = (sigma <= 0.84); + const bool is3x3 = (sigma < 0.6); + float kernel7[7][7]; + float kernel5[5][5]; + float kernel3[3][3]; + if (is3x3) { + compute3x3kernel(sigma, kernel3); + } else if (is5x5) { + compute5x5kernel(sigma, kernel5); + } else { + compute7x7kernel(sigma, kernel7); + } - rtengine::JaggedArray tmpI(W, H); + constexpr int tileSize = 194; + constexpr int border = 3; + constexpr int fullTileSize = tileSize + 2 * border; + double progress = startVal; + const double progressStep = (endVal - startVal) * rtengine::SQR(tileSize) / (W * H); #ifdef _OPENMP #pragma omp parallel #endif { + int progresscounter = 0; + rtengine::JaggedArray tmpIThr(fullTileSize, fullTileSize); + rtengine::JaggedArray tmpThr(fullTileSize, fullTileSize); + rtengine::JaggedArray lumThr(fullTileSize, fullTileSize); +#pragma omp for schedule(dynamic,2) collapse(2) + for (int i = border; i < H - border; i+= tileSize) { + for(int j = border; j < W - border; j+= tileSize) { + const bool endOfCol = (i + tileSize + border) >= H; + const bool endOfRow = (j + tileSize + border) >= W; + // fill tiles + if (endOfRow || endOfCol) { + // special handling for small tiles at end of row or column + for (int k = 0, ii = endOfCol ? H - fullTileSize : i; k < fullTileSize; ++k, ++ii) { + for (int l = 0, jj = endOfRow ? W - fullTileSize : j; l < fullTileSize; ++l, ++jj) { + tmpIThr[k][l] = oldLuminance[ii - border][jj - border]; + lumThr[k][l] = oldLuminance[ii - border][jj - border]; + } + } + } else { + for (int ii = i; ii < i + fullTileSize; ++ii) { + for (int jj = j; jj < j + fullTileSize; ++jj) { + tmpIThr[ii - i][jj - j] = oldLuminance[ii - border][jj - border]; + lumThr[ii - i][jj - j] = oldLuminance[ii - border][jj - border]; + } + } + } + if (is3x3) { + for (int k = 0; k < iterations; ++k) { + // apply 3x3 gaussian blur and divide luminance by result of gaussian blur + gauss3x3div(tmpIThr, tmpThr, lumThr, fullTileSize, fullTileSize, kernel3); + gauss3x3mult(tmpThr, tmpIThr, fullTileSize, fullTileSize, kernel3); + } + } else if (is5x5) { + for (int k = 0; k < iterations; ++k) { + // apply 5x5 gaussian blur and divide luminance by result of gaussian blur + gauss5x5div(tmpIThr, tmpThr, lumThr, fullTileSize, fullTileSize, kernel5); + gauss5x5mult(tmpThr, tmpIThr, fullTileSize, fullTileSize, kernel5); + } + } else { + for (int k = 0; k < iterations; ++k) { + // apply 7x7 gaussian blur and divide luminance by result of gaussian blur + gauss7x7div(tmpIThr, tmpThr, lumThr, fullTileSize, fullTileSize, kernel7); + gauss7x7mult(tmpThr, tmpIThr, fullTileSize, fullTileSize, kernel7); + } + } + if (endOfRow || endOfCol) { + // special handling for small tiles at end of row or column + for (int k = border, ii = endOfCol ? H - fullTileSize - border : i - border; k < fullTileSize - border; ++k) { + for (int l = border, jj = endOfRow ? W - fullTileSize - border : j - border; l < fullTileSize - border; ++l) { + luminance[ii + k][jj + l] = rtengine::intp(blend[ii + k][jj + l], max(tmpIThr[k][l], 0.0f), luminance[ii + k][jj + l]); + } + } + } else { + for (int ii = border; ii < fullTileSize - border; ++ii) { + for (int jj = border; jj < fullTileSize - border; ++jj) { + luminance[i + ii - border][j + jj - border] = rtengine::intp(blend[i + ii - border][j + jj - border], max(tmpIThr[ii][jj], 0.0f), luminance[i + ii - border][j + jj - border]); + } + } + } + if (plistener) { + if (++progresscounter % 16 == 0) { #ifdef _OPENMP - #pragma omp for + #pragma omp critical(csprogress) #endif - for (int i = 0; i < H; i++) { - for(int j = 0; j < W; j++) { - tmpI[i][j] = max(luminance[i][j], 0.f); + { + progress += 16.0 * progressStep; + progress = rtengine::min(progress, endVal); + plistener->setProgress(progress); + } + } + } } } - - for (int k = 0; k < iterations; k++) { - // apply gaussian blur and divide luminance by result of gaussian blur - gaussianBlur(tmpI, tmp, W, H, sigma, nullptr, GAUSS_DIV, luminance); - gaussianBlur(tmp, tmpI, W, H, sigma, nullptr, GAUSS_MULT); - if (plistener) { -#ifdef _OPENMP - #pragma omp single -#endif - start += step; - plistener->setProgress(start); - } - } // end for - -#ifdef _OPENMP - #pragma omp for -#endif - - for (int i = 0; i < H; ++i) { - for (int j = 0; j < W; ++j) { - luminance[i][j] = rtengine::intp(blend[i][j], max(tmpI[i][j], 0.0f), luminance[i][j]); - } - } - } // end parallel + } } } @@ -328,7 +638,7 @@ void RawImageSource::captureSharpening(const procparams::CaptureSharpeningParams plistener->setProgressStr(M("TP_PDSHARPENING_LABEL")); plistener->setProgress(0.0); } - +BENCHFUN const float xyz_rgb[3][3] = { // XYZ from RGB { 0.412453, 0.357580, 0.180423 }, { 0.212671, 0.715160, 0.072169 }, @@ -442,13 +752,14 @@ void RawImageSource::captureSharpening(const procparams::CaptureSharpeningParams array2D& L = Lbuffer ? *Lbuffer : red; array2D& YOld = YOldbuffer ? * YOldbuffer : green; array2D& YNew = YNewbuffer ? * YNewbuffer : blue; + const float gamma = sharpeningParams.gamma; #ifdef _OPENMP #pragma omp parallel for schedule(dynamic, 16) #endif for (int i = 0; i < H; ++i) { Color::RGB2L(redVals[i], greenVals[i], blueVals[i], L[i], xyz_rgb, W); - Color::RGB2Y(redVals[i], greenVals[i], blueVals[i], YOld[i], YNew[i], sharpeningParams.gamma, W); + Color::RGB2Y(redVals[i], greenVals[i], blueVals[i], YOld[i], YNew[i], gamma, W); } if (plistener) { plistener->setProgress(0.1); @@ -461,12 +772,10 @@ void RawImageSource::captureSharpening(const procparams::CaptureSharpeningParams } conrastThreshold = contrast * 100.f; - array2D& tmp = L; // L is not used anymore now => we can use its buffer as the needed temporary buffer - CaptureDeconvSharpening(YNew, tmp, blend, W, H, radius, sharpeningParams.deconviter, plistener, 0.2, (0.9 - 0.2) / sharpeningParams.deconviter); + CaptureDeconvSharpening(YNew, YOld, blend, W, H, radius, sharpeningParams.deconviter, plistener, 0.2, 0.9); if (plistener) { plistener->setProgress(0.9); } - const float gamma = sharpeningParams.gamma; #ifdef _OPENMP #pragma omp parallel for schedule(dynamic, 16) #endif diff --git a/rtengine/rt_algo.cc b/rtengine/rt_algo.cc index 4afd8ac73..dd7783c1d 100644 --- a/rtengine/rt_algo.cc +++ b/rtengine/rt_algo.cc @@ -394,7 +394,7 @@ void buildBlendMask(const float* const * luminance, float **blend, int W, int H, } } - contrastThreshold = minvar <= 4.f ? calcContrastThreshold(luminance, topLeftYStart + minI, topLeftXStart + minJ, tilesize) : 0.f; + contrastThreshold = minvar <= 8.f ? calcContrastThreshold(luminance, topLeftYStart + minI, topLeftXStart + minJ, tilesize) : 0.f; } } } From aadeb539a92b1729fa8a8a2d7b4a0b2d71682dfd Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sat, 14 Sep 2019 17:51:28 +0200 Subject: [PATCH 49/50] Capture sharpening: small speedup, also reduced memory usage by width * height * 4 byte --- rtengine/capturesharpening.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/capturesharpening.cc b/rtengine/capturesharpening.cc index ef35695f3..4bfe91aba 100644 --- a/rtengine/capturesharpening.cc +++ b/rtengine/capturesharpening.cc @@ -765,7 +765,7 @@ BENCHFUN plistener->setProgress(0.1); } // calculate contrast based blend factors to reduce sharpening in regions with low contrast - JaggedArray blend(W, H); + array2D& blend = clipMask; // we can share blend and clipMask buffer here buildBlendMask(L, blend, W, H, contrast, 1.f, sharpeningParams.autoContrast, clipMask); if (plistener) { plistener->setProgress(0.2); From 51daaf5fa1e4e75a3e225dd4b3f98ab8cfa64c89 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sat, 14 Sep 2019 19:35:19 +0200 Subject: [PATCH 50/50] Capture Sharpening: some code cleanups --- rtengine/capturesharpening.cc | 58 ++++++++++++++--------------------- 1 file changed, 23 insertions(+), 35 deletions(-) diff --git a/rtengine/capturesharpening.cc b/rtengine/capturesharpening.cc index 4bfe91aba..8d9ee5b64 100644 --- a/rtengine/capturesharpening.cc +++ b/rtengine/capturesharpening.cc @@ -19,7 +19,6 @@ #include #include -#include "jaggedarray.h" #include "rtengine.h" #include "rawimagesource.h" #include "rt_math.h" @@ -121,18 +120,12 @@ inline void gauss3x3div (float** RESTRICT src, float** RESTRICT dst, float** RES } dst[i][W - 1] = 1.f; } - // first and last rows - { - for (int i = 0; i < 1; ++i) { - for (int j = 0; j < W; ++j) { - dst[i][j] = 1.f; - } - } - for (int i = H - 1 ; i < H; ++i) { - for (int j = 0; j < W; ++j) { - dst[i][j] = 1.f; - } - } + // first and last row + for (int j = 0; j < W; ++j) { + dst[0][j] = 1.f; + } + for (int j = 0; j < W; ++j) { + dst[H - 1][j] = 1.f; } } @@ -161,16 +154,14 @@ inline void gauss5x5div (float** RESTRICT src, float** RESTRICT dst, float** RES } // first and last rows - { - for (int i = 0; i < 2; ++i) { - for (int j = 0; j < W; ++j) { - dst[i][j] = 1.f; - } + for (int i = 0; i < 2; ++i) { + for (int j = 0; j < W; ++j) { + dst[i][j] = 1.f; } - for (int i = H - 2 ; i < H; ++i) { - for (int j = 0; j < W; ++j) { - dst[i][j] = 1.f; - } + } + for (int i = H - 2 ; i < H; ++i) { + for (int j = 0; j < W; ++j) { + dst[i][j] = 1.f; } } } @@ -206,16 +197,14 @@ inline void gauss7x7div(float** RESTRICT src, float** RESTRICT dst, float** REST } // first and last rows - { - for (int i = 0; i < 3; ++i) { - for (int j = 0; j < W; ++j) { - dst[i][j] = 1.f; - } + for (int i = 0; i < 3; ++i) { + for (int j = 0; j < W; ++j) { + dst[i][j] = 1.f; } - for (int i = H - 3 ; i < H; ++i) { - for (int j = 0; j < W; ++j) { - dst[i][j] = 1.f; - } + } + for (int i = H - 3 ; i < H; ++i) { + for (int j = 0; j < W; ++j) { + dst[i][j] = 1.f; } } } @@ -300,7 +289,6 @@ void buildClipMaskBayer(const float * const *rawData, int W, int H, float** clip clipMask[row][col] = 1.f; } } - #ifdef _OPENMP #pragma omp parallel for schedule(dynamic, 16) #endif @@ -552,9 +540,9 @@ BENCHFUN #endif { int progresscounter = 0; - rtengine::JaggedArray tmpIThr(fullTileSize, fullTileSize); - rtengine::JaggedArray tmpThr(fullTileSize, fullTileSize); - rtengine::JaggedArray lumThr(fullTileSize, fullTileSize); + array2D tmpIThr(fullTileSize, fullTileSize); + array2D tmpThr(fullTileSize, fullTileSize); + array2D lumThr(fullTileSize, fullTileSize); #pragma omp for schedule(dynamic,2) collapse(2) for (int i = border; i < H - border; i+= tileSize) { for(int j = border; j < W - border; j+= tileSize) {