1232 lines
36 KiB
C++
1232 lines
36 KiB
C++
/*
|
|
* This file is part of RawTherapee.
|
|
*
|
|
* Copyright (c) 2004-2010 Gabor Horvath <hgabor@rawtherapee.com>
|
|
*
|
|
* RawTherapee is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* RawTherapee is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
#ifndef _PROCPARAMS_H_
|
|
#define _PROCPARAMS_H_
|
|
|
|
#include <glibmm.h>
|
|
#include <vector>
|
|
#include <cstdio>
|
|
#include <cmath>
|
|
#include "LUT.h"
|
|
|
|
class ParamsEdited;
|
|
|
|
namespace rtengine {
|
|
|
|
class ColorGradientCurve;
|
|
class OpacityCurve;
|
|
class NoiseCurve;
|
|
class WavCurve;
|
|
class WavOpacityCurveRG;
|
|
class WavOpacityCurveBY;
|
|
class WavOpacityCurveW;
|
|
class WavOpacityCurveWL;
|
|
|
|
namespace procparams {
|
|
|
|
template <typename T>
|
|
class Threshold {
|
|
public:
|
|
T value[4];
|
|
|
|
protected:
|
|
bool initEq1;
|
|
bool _isDouble;
|
|
#ifndef NDEBUG
|
|
unsigned int part[5];
|
|
#endif
|
|
public:
|
|
Threshold (T bottom, T top, bool startAtOne) {
|
|
initEq1 = startAtOne;
|
|
value[0] = bottom;
|
|
value[1] = top;
|
|
value[2] = T(0);
|
|
value[3] = T(0);
|
|
_isDouble = false;
|
|
}
|
|
|
|
Threshold (T bottomLeft, T topLeft, T bottomRight, T topRight, bool startAtOne) {
|
|
initEq1 = startAtOne;
|
|
value[0] = bottomLeft;
|
|
value[1] = topLeft;
|
|
value[2] = bottomRight;
|
|
value[3] = topRight;
|
|
_isDouble = true;
|
|
}
|
|
|
|
// for convenience, since 'values' is public
|
|
void setValues(T bottom, T top) {
|
|
value[0] = bottom;
|
|
value[1] = top;
|
|
}
|
|
|
|
// for convenience, since 'values' is public
|
|
void setValues(T bottomLeft, T topLeft, T bottomRight, T topRight) {
|
|
value[0] = bottomLeft;
|
|
value[1] = topLeft;
|
|
value[2] = bottomRight;
|
|
value[3] = topRight;
|
|
}
|
|
|
|
bool isDouble() const { return _isDouble; }
|
|
|
|
// RT: Type of the returned value
|
|
// RV: Type of the value on the X axis
|
|
// RV2: Type of the maximum value on the Y axis
|
|
template <typename RT, typename RV, typename RV2>
|
|
RT multiply(RV x, RV2 yMax) const {
|
|
double val = double(x);
|
|
if (initEq1) {
|
|
if (_isDouble) {
|
|
if (val == double(value[2]) && double(value[2]) == double(value[3]))
|
|
// this handle the special case where the 2 right values are the same, then bottom one is sent back,
|
|
// useful if one wants to keep the bottom value even beyond the x max bound
|
|
return RT(0.);
|
|
if (val >= double(value[3]))
|
|
return RT(yMax);
|
|
if (val > double(value[2]))
|
|
return RT(double(yMax)*(val-double(value[2]))/(double(value[3])-double(value[2])));
|
|
}
|
|
if (val >= double(value[0]))
|
|
return RT(0);
|
|
if (val > double(value[1]))
|
|
return RT(double(yMax)*(1.-(val-double(value[0]))/(double(value[1])-double(value[0]))));
|
|
return RT(yMax);
|
|
}
|
|
else {
|
|
if (_isDouble) {
|
|
if (val == double(value[2]) && double(value[2]) == double(value[3]))
|
|
// this handle the special case where the 2 right values are the same, then top one is sent back,
|
|
// useful if one wants to keep the top value even beyond the x max bound
|
|
return RT(yMax);
|
|
if (val >= double(value[2]))
|
|
return RT(0);
|
|
if (val > double(value[3]))
|
|
return RT(double(yMax)*(1.-(val-double(value[3]))/(double(value[2])-double(value[3]))));
|
|
}
|
|
if (val >= double(value[1]))
|
|
return RT(yMax);
|
|
if (val > double(value[0]))
|
|
return RT(double(yMax)*(val-double(value[0]))/(double(value[1])-double(value[0])));
|
|
return RT(0);
|
|
}
|
|
}
|
|
|
|
// RT: Type of the returned value
|
|
// RV: Type of the value on the X axis
|
|
/*template <typename RT, typename RV>
|
|
RT getRatio(RV val) const {
|
|
double val = double(val);
|
|
if (initEq1) {
|
|
if (_isDouble) { // assuming that simple thresholds will be more frequent
|
|
if (val >= double(value[3]))
|
|
return RT(1);
|
|
if (val > double(value[2]))
|
|
return (val-double(value[2]))/(double(value[3])-double(value[2]));
|
|
}
|
|
if (val >= double(value[1]))
|
|
return RT(0);
|
|
if (val > double(value[0]))
|
|
return 1.-(val-double(value[0]))/(double(value[1])-double(value[0]));
|
|
return RT(1);
|
|
}
|
|
else {
|
|
if (_isDouble) { // assuming that simple thresholds will be more frequent
|
|
if (val >= double(value[3]))
|
|
return RT(0);
|
|
if (val > double(value[2]))
|
|
return 1.-(val-double(value[2]))/(double(value[3])-double(value[2]));
|
|
}
|
|
if (val >= double(value[1]))
|
|
return RT(1);
|
|
if (val > double(value[0]))
|
|
return (val-double(value[0]))/(double(value[1])-double(value[0]));
|
|
return RT(0);
|
|
}
|
|
}*/
|
|
|
|
Threshold<T> & operator= (const Threshold<T> &rhs) {
|
|
value[0] = rhs.value[0];
|
|
value[1] = rhs.value[1];
|
|
value[2] = rhs.value[2];
|
|
value[3] = rhs.value[3];
|
|
initEq1 = rhs.initEq1;
|
|
_isDouble = rhs._isDouble;
|
|
return *this;
|
|
}
|
|
|
|
bool operator== (const Threshold<T> &rhs) const {
|
|
if (_isDouble)
|
|
return fabs(value[0]-rhs.value[0])<1e-10
|
|
&& fabs(value[1]-rhs.value[1])<1e-10
|
|
&& fabs(value[2]-rhs.value[2])<1e-10
|
|
&& fabs(value[3]-rhs.value[3])<1e-10;
|
|
else
|
|
return fabs(value[0]-rhs.value[0])<1e-10
|
|
&& fabs(value[1]-rhs.value[1])<1e-10;
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Parameters of the tone curve
|
|
*/
|
|
class ToneCurveParams {
|
|
|
|
public:
|
|
|
|
enum eTCModeId {
|
|
TC_MODE_STD, // Standard modes, the curve is applied on all component individually
|
|
TC_MODE_WEIGHTEDSTD, // Weighted standard mode
|
|
TC_MODE_FILMLIKE, // Film-like mode, as defined in Adobe's reference code
|
|
TC_MODE_SATANDVALBLENDING, // Modify the Saturation and Value channel
|
|
TC_MODE_LUMINANCE // Modify the Luminance channel with coefficients from Rec 709's
|
|
};
|
|
|
|
bool autoexp;
|
|
double clip;
|
|
bool hrenabled; // Highlight Reconstruction enabled
|
|
Glib::ustring method; // Highlight Reconstruction's method
|
|
double expcomp;
|
|
std::vector<double> curve;
|
|
std::vector<double> curve2;
|
|
eTCModeId curveMode;
|
|
eTCModeId curveMode2;
|
|
int brightness;
|
|
int black;
|
|
int contrast;
|
|
int saturation;
|
|
int shcompr;
|
|
int hlcompr; // Highlight Recovery's compression
|
|
int hlcomprthresh; // Highlight Recovery's threshold
|
|
|
|
ToneCurveParams () {
|
|
setDefaults();
|
|
}
|
|
void setDefaults();
|
|
static bool HLReconstructionNecessary(LUTu &histRedRaw, LUTu &histGreenRaw, LUTu &histBlueRaw);
|
|
};
|
|
|
|
|
|
/**
|
|
* Parameters of the luminance curve
|
|
*/
|
|
class LCurveParams {
|
|
|
|
public:
|
|
std::vector<double> lcurve;
|
|
std::vector<double> acurve;
|
|
std::vector<double> bcurve;
|
|
std::vector<double> cccurve;
|
|
std::vector<double> chcurve;
|
|
std::vector<double> lhcurve;
|
|
std::vector<double> hhcurve;
|
|
std::vector<double> lccurve;
|
|
std::vector<double> clcurve;
|
|
int brightness;
|
|
int contrast;
|
|
int chromaticity;
|
|
bool avoidcolorshift;
|
|
double rstprotection;
|
|
bool lcredsk;
|
|
};
|
|
|
|
/**
|
|
* Parameters of the RGB curves
|
|
*/
|
|
class RGBCurvesParams {
|
|
|
|
public:
|
|
bool lumamode;
|
|
std::vector<double> rcurve;
|
|
std::vector<double> gcurve;
|
|
std::vector<double> bcurve;
|
|
};
|
|
|
|
/**
|
|
* Parameters of the Color Toning
|
|
*/
|
|
|
|
class ColorToningParams {
|
|
|
|
public:
|
|
bool enabled;
|
|
bool autosat;
|
|
std::vector<double> opacityCurve;
|
|
std::vector<double> colorCurve;
|
|
int satProtectionThreshold;
|
|
int saturatedOpacity;
|
|
int strength;
|
|
int balance;
|
|
Threshold<int> hlColSat;
|
|
Threshold<int> shadowsColSat;
|
|
std::vector<double> clcurve;
|
|
std::vector<double> cl2curve;
|
|
|
|
/* Can be either:
|
|
* Splitlr :
|
|
* Splitco :
|
|
* Splitbal :
|
|
* Lab :
|
|
* Lch :
|
|
* RGBSliders :
|
|
* RGBCurves :
|
|
*/
|
|
Glib::ustring method;
|
|
|
|
/* Can be either:
|
|
* Std :
|
|
* All :
|
|
* Separ :
|
|
* Two :
|
|
*/
|
|
Glib::ustring twocolor;
|
|
double redlow;
|
|
double greenlow;
|
|
double bluelow;
|
|
double redmed;
|
|
double greenmed;
|
|
double bluemed;
|
|
double redhigh;
|
|
double greenhigh;
|
|
double bluehigh;
|
|
double satlow;
|
|
double sathigh;
|
|
bool lumamode;
|
|
|
|
ColorToningParams ();
|
|
void setDefaults(); // SHOULD BE GENERALIZED TO ALL CLASSES!
|
|
/// @brief Transform the mixer values to their curve equivalences
|
|
void mixerToCurve(std::vector<double> &colorCurve, std::vector<double> &opacityCurve) const;
|
|
/// @brief Specifically transform the sliders values to their curve equivalences
|
|
void slidersToCurve(std::vector<double> &colorCurve, std::vector<double> &opacityCurve) const;
|
|
/// @brief Fill the ColorGradientCurve and OpacityCurve LUTf from the control points curve or sliders value
|
|
void getCurves(ColorGradientCurve &colorCurveLUT, OpacityCurve &opacityCurveLUT, const double xyz_rgb[3][3], const double rgb_xyz[3][3], bool &opautili) const;
|
|
|
|
static void getDefaultColorCurve(std::vector<double> &curve);
|
|
static void getDefaultOpacityCurve(std::vector<double> &curve);
|
|
static void getDefaultCLCurve(std::vector<double> &curve);
|
|
static void getDefaultCL2Curve(std::vector<double> &curve);
|
|
};
|
|
|
|
/**
|
|
* Parameters of the sharpening
|
|
*/
|
|
class SharpeningParams {
|
|
|
|
public:
|
|
bool enabled;
|
|
double radius;
|
|
int amount;
|
|
Threshold<int> threshold;
|
|
bool edgesonly;
|
|
double edges_radius;
|
|
int edges_tolerance;
|
|
bool halocontrol;
|
|
int halocontrol_amount;
|
|
Glib::ustring method;
|
|
int deconvamount;
|
|
double deconvradius;
|
|
int deconviter;
|
|
int deconvdamping;
|
|
|
|
SharpeningParams() : threshold(20, 80, 2000, 1200, false) {};
|
|
};
|
|
class SharpenEdgeParams {
|
|
public:
|
|
bool enabled;
|
|
int passes;
|
|
double amount;
|
|
bool threechannels;
|
|
};
|
|
class SharpenMicroParams {
|
|
public:
|
|
bool enabled;
|
|
bool matrix;
|
|
double amount;
|
|
double uniformity;
|
|
};
|
|
|
|
/**
|
|
* Parameters of the vibrance
|
|
*/
|
|
class VibranceParams {
|
|
|
|
public:
|
|
bool enabled;
|
|
int pastels;
|
|
int saturated;
|
|
Threshold<int> psthreshold;
|
|
bool protectskins;
|
|
bool avoidcolorshift;
|
|
bool pastsattog;
|
|
std::vector<double> skintonescurve;
|
|
|
|
VibranceParams() : psthreshold(0, 75, false) {};
|
|
};
|
|
|
|
/**
|
|
* Parameters of the color boost
|
|
*/
|
|
/*class ColorBoostParams {
|
|
|
|
public:
|
|
int amount;
|
|
bool avoidclip;
|
|
bool enable_saturationlimiter;
|
|
double saturationlimit;
|
|
};*/
|
|
|
|
/**
|
|
* Parameters of the white balance adjustments
|
|
*/
|
|
|
|
enum WBTypes {
|
|
WBT_CAMERA,
|
|
WBT_AUTO,
|
|
WBT_DAYLIGHT,
|
|
WBT_CLOUDY,
|
|
WBT_SHADE,
|
|
WBT_WATER,
|
|
WBT_TUNGSTEN,
|
|
WBT_FLUORESCENT,
|
|
WBT_LAMP,
|
|
WBT_FLASH,
|
|
WBT_LED,
|
|
// WBT_CUSTOM one must remain the last one!
|
|
WBT_CUSTOM
|
|
};
|
|
|
|
class WBEntry {
|
|
public:
|
|
Glib::ustring ppLabel;
|
|
enum WBTypes type;
|
|
Glib::ustring GUILabel;
|
|
int temperature;
|
|
double green;
|
|
double equal;
|
|
|
|
WBEntry(Glib::ustring p, enum WBTypes t, Glib::ustring l, int temp, double green, double equal) : ppLabel(p), type(t), GUILabel(l), temperature(temp), green(green), equal(equal) {};
|
|
};
|
|
|
|
class WBParams {
|
|
|
|
public:
|
|
static std::vector<WBEntry*> wbEntries;
|
|
Glib::ustring method;
|
|
int temperature;
|
|
double green;
|
|
double equal;
|
|
|
|
static void init();
|
|
static void cleanup();
|
|
};
|
|
|
|
/**
|
|
* Parameters of colorappearance
|
|
*/
|
|
class ColorAppearanceParams {
|
|
|
|
public:
|
|
enum eTCModeId {
|
|
TC_MODE_LIGHT, // Lightness mode
|
|
TC_MODE_BRIGHT, // Brightness mode
|
|
};
|
|
|
|
enum eCTCModeId {
|
|
TC_MODE_CHROMA, // chroma mode
|
|
TC_MODE_SATUR, // saturation mode
|
|
TC_MODE_COLORF, // colorfullness mode
|
|
};
|
|
|
|
bool enabled;
|
|
int degree;
|
|
bool autodegree;
|
|
std::vector<double> curve;
|
|
std::vector<double> curve2;
|
|
std::vector<double> curve3;
|
|
eTCModeId curveMode;
|
|
eTCModeId curveMode2;
|
|
eCTCModeId curveMode3;
|
|
|
|
Glib::ustring surround;
|
|
double adapscen;
|
|
bool autoadapscen;
|
|
|
|
double adaplum;
|
|
int badpixsl;
|
|
Glib::ustring wbmodel;
|
|
Glib::ustring algo;
|
|
double contrast;
|
|
double qcontrast;
|
|
double jlight;
|
|
double qbright;
|
|
double chroma;
|
|
double schroma;
|
|
double mchroma;
|
|
double colorh;
|
|
double rstprotection;
|
|
bool surrsource;
|
|
bool gamut;
|
|
// bool badpix;
|
|
bool datacie;
|
|
bool tonecie;
|
|
// bool sharpcie;
|
|
};
|
|
|
|
/**
|
|
* Parameters of the color shift
|
|
*/
|
|
/*class ColorShiftParams {
|
|
|
|
public:
|
|
double a;
|
|
double b;
|
|
};*/
|
|
|
|
/**
|
|
* Parameters of the luminance denoising
|
|
*/
|
|
/*class LumaDenoiseParams {
|
|
|
|
public:
|
|
bool enabled;
|
|
double radius;
|
|
int edgetolerance;
|
|
};*/
|
|
|
|
/**
|
|
* Parameters of the color denoising
|
|
*/
|
|
/*class ColorDenoiseParams {
|
|
|
|
public:
|
|
bool enabled;
|
|
int edgetolerance;
|
|
bool edgesensitive;
|
|
int amount;
|
|
};*/
|
|
|
|
/**
|
|
* Parameters of defringing
|
|
*/
|
|
class DefringeParams {
|
|
|
|
public:
|
|
bool enabled;
|
|
double radius;
|
|
float threshold;
|
|
std::vector<double> huecurve;
|
|
};
|
|
|
|
/**
|
|
* Parameters of impulse denoising
|
|
*/
|
|
class ImpulseDenoiseParams {
|
|
|
|
public:
|
|
bool enabled;
|
|
int thresh;
|
|
|
|
};
|
|
|
|
/**
|
|
* Parameters of the directional pyramid denoising
|
|
*/
|
|
class DirPyrDenoiseParams {
|
|
|
|
public:
|
|
std::vector<double> lcurve;
|
|
std::vector<double> cccurve;
|
|
|
|
bool enabled;
|
|
bool enhance;
|
|
bool median;
|
|
bool autochroma;
|
|
|
|
bool perform;
|
|
double luma;
|
|
double Ldetail;
|
|
double chroma;
|
|
double redchro;
|
|
double bluechro;
|
|
double gamma;
|
|
Glib::ustring dmethod;
|
|
Glib::ustring Lmethod;
|
|
Glib::ustring Cmethod;
|
|
Glib::ustring C2method;
|
|
Glib::ustring smethod;
|
|
Glib::ustring medmethod;
|
|
Glib::ustring methodmed;
|
|
Glib::ustring rgbmethod;
|
|
int passes;
|
|
|
|
DirPyrDenoiseParams ();
|
|
void setDefaults(); // SHOULD BE GENERALIZED TO ALL CLASSES!
|
|
void getCurves(NoiseCurve &lCurve, NoiseCurve &cCurve) const;
|
|
|
|
static void getDefaultNoisCurve(std::vector<double> &curve);
|
|
static void getDefaultCCCurve(std::vector<double> &curve);
|
|
|
|
};
|
|
|
|
//EPD related parameters.
|
|
class EPDParams{
|
|
public:
|
|
bool enabled;
|
|
double strength;
|
|
double gamma;
|
|
double edgeStopping;
|
|
double scale;
|
|
int reweightingIterates;
|
|
};
|
|
|
|
/**
|
|
* Parameters of the shadow/highlight enhancement
|
|
*/
|
|
class SHParams {
|
|
|
|
public:
|
|
bool enabled;
|
|
bool hq;
|
|
int highlights;
|
|
int htonalwidth;
|
|
int shadows;
|
|
int stonalwidth;
|
|
int localcontrast;
|
|
int radius;
|
|
};
|
|
|
|
/**
|
|
* Parameters of the cropping
|
|
*/
|
|
class CropParams {
|
|
|
|
public:
|
|
bool enabled;
|
|
int x;
|
|
int y;
|
|
int w;
|
|
int h;
|
|
bool fixratio;
|
|
Glib::ustring ratio;
|
|
Glib::ustring orientation;
|
|
Glib::ustring guide;
|
|
|
|
CropParams() :enabled(false), x(0),y(0),w(0),h(0),fixratio(false) {};
|
|
void mapToResized(int resizedWidth, int resizedHeight, int scale, int &x1, int &x2, int &y1, int &y2) const;
|
|
};
|
|
|
|
/**
|
|
* Parameters of the coarse transformations like 90 deg rotations and h/v flipping
|
|
*/
|
|
class CoarseTransformParams {
|
|
|
|
public:
|
|
int rotate;
|
|
bool hflip;
|
|
bool vflip;
|
|
|
|
CoarseTransformParams() {
|
|
setDefaults();
|
|
}
|
|
void setDefaults();
|
|
};
|
|
|
|
/**
|
|
* Common transformation parameters
|
|
*/
|
|
class CommonTransformParams {
|
|
|
|
public:
|
|
bool autofill;
|
|
};
|
|
|
|
/**
|
|
* Parameters of the rotation
|
|
*/
|
|
class RotateParams {
|
|
|
|
public:
|
|
double degree;
|
|
};
|
|
|
|
/**
|
|
* Parameters of the distortion correction
|
|
*/
|
|
class DistortionParams {
|
|
|
|
public:
|
|
double amount;
|
|
};
|
|
|
|
// Lens profile correction parameters
|
|
class LensProfParams {
|
|
|
|
public:
|
|
Glib::ustring lcpFile;
|
|
bool useDist, useVign, useCA;
|
|
|
|
LensProfParams() {
|
|
setDefaults();
|
|
}
|
|
void setDefaults();
|
|
};
|
|
|
|
/**
|
|
* Parameters of the perspective correction
|
|
*/
|
|
class PerspectiveParams {
|
|
|
|
public:
|
|
double horizontal;
|
|
double vertical;
|
|
};
|
|
|
|
/**
|
|
* Parameters of the gradient filter
|
|
*/
|
|
class GradientParams {
|
|
|
|
public:
|
|
bool enabled;
|
|
double degree;
|
|
int feather;
|
|
double strength;
|
|
int centerX;
|
|
int centerY;
|
|
};
|
|
|
|
/**
|
|
* Parameters of the post-crop vignette filter
|
|
*/
|
|
class PCVignetteParams {
|
|
|
|
public:
|
|
bool enabled;
|
|
double strength;
|
|
int feather;
|
|
int roundness;
|
|
};
|
|
|
|
/**
|
|
* Parameters of the vignetting correction
|
|
*/
|
|
class VignettingParams {
|
|
|
|
public:
|
|
int amount;
|
|
int radius;
|
|
int strength;
|
|
int centerX;
|
|
int centerY;
|
|
};
|
|
|
|
/**
|
|
* Parameters of the color mixer
|
|
*/
|
|
class ChannelMixerParams {
|
|
|
|
public:
|
|
int red[3];
|
|
int green[3];
|
|
int blue[3];
|
|
};
|
|
|
|
class BlackWhiteParams {
|
|
|
|
public:
|
|
enum eTCModeId {
|
|
TC_MODE_STD_BW, // Standard modes, the curve is applied on all component individually
|
|
TC_MODE_WEIGHTEDSTD_BW, // Weighted standard mode
|
|
TC_MODE_FILMLIKE_BW, // Film-like mode, as defined in Adobe's reference code
|
|
TC_MODE_SATANDVALBLENDING_BW // Modify the Saturation and Value channel
|
|
};
|
|
|
|
std::vector<double> beforeCurve;
|
|
eTCModeId beforeCurveMode;
|
|
std::vector<double> afterCurve;
|
|
eTCModeId afterCurveMode;
|
|
Glib::ustring algo;
|
|
|
|
std::vector<double> luminanceCurve;
|
|
bool autoc;
|
|
bool enabledcc;
|
|
bool enabled;
|
|
Glib::ustring filter;
|
|
Glib::ustring setting;
|
|
Glib::ustring method;
|
|
int mixerRed;
|
|
int mixerOrange;
|
|
int mixerYellow;
|
|
int mixerGreen;
|
|
int mixerCyan;
|
|
int mixerBlue;
|
|
int mixerMagenta;
|
|
int mixerPurple;
|
|
int gammaRed;
|
|
int gammaGreen;
|
|
int gammaBlue;
|
|
};
|
|
|
|
/**
|
|
* Parameters of the c/a correction
|
|
*/
|
|
class CACorrParams {
|
|
|
|
public:
|
|
double red;
|
|
double blue;
|
|
};
|
|
|
|
/**
|
|
* Parameters of the highlight recovery
|
|
*/
|
|
/*
|
|
class HRecParams {
|
|
|
|
public:
|
|
bool enabled;
|
|
Glib::ustring method;
|
|
};
|
|
*/
|
|
/**
|
|
* Parameters of the resizing
|
|
*/
|
|
class ResizeParams {
|
|
|
|
public:
|
|
bool enabled;
|
|
double scale;
|
|
Glib::ustring appliesTo;
|
|
Glib::ustring method;
|
|
int dataspec;
|
|
int width;
|
|
int height;
|
|
};
|
|
|
|
/**
|
|
* Parameters of the color spaces used during the processing
|
|
*/
|
|
class ColorManagementParams {
|
|
|
|
public:
|
|
Glib::ustring input;
|
|
bool toneCurve;
|
|
bool applyLookTable;
|
|
bool applyBaselineExposureOffset;
|
|
bool applyHueSatMap;
|
|
bool blendCMSMatrix; // setting no longer used
|
|
int dcpIlluminant;
|
|
Glib::ustring working;
|
|
Glib::ustring output;
|
|
static const Glib::ustring NoICMString;
|
|
|
|
Glib::ustring gamma;
|
|
double gampos;
|
|
double slpos;
|
|
bool freegamma;
|
|
|
|
ColorManagementParams() {
|
|
setDefaults();
|
|
}
|
|
void setDefaults();
|
|
};
|
|
|
|
/**
|
|
* Typedef for representing a key/value for the exif metadata information
|
|
*/
|
|
typedef std::map<Glib::ustring, Glib::ustring> ExifPairs;
|
|
|
|
/**
|
|
* The IPTC key/value pairs
|
|
*/
|
|
typedef std::map<Glib::ustring, std::vector<Glib::ustring> > IPTCPairs;
|
|
|
|
|
|
class WaveletParams {
|
|
|
|
public:
|
|
std::vector<double> ccwcurve;
|
|
std::vector<double> opacityCurveRG;
|
|
std::vector<double> opacityCurveBY;
|
|
std::vector<double> opacityCurveW;
|
|
std::vector<double> opacityCurveWL;
|
|
std::vector<double> hhcurve;
|
|
std::vector<double> Chcurve;
|
|
std::vector<double> wavclCurve;
|
|
bool enabled;
|
|
bool median;
|
|
bool medianlev;
|
|
bool linkedg;
|
|
bool cbenab;
|
|
double greenlow;
|
|
double bluelow;
|
|
double greenmed;
|
|
double bluemed;
|
|
double greenhigh;
|
|
double bluehigh;
|
|
|
|
bool lipst;
|
|
// bool edgreinf;
|
|
bool avoid;
|
|
bool tmr;
|
|
int strength;
|
|
int balance;
|
|
int iter;
|
|
int c[9];
|
|
int ch[9];
|
|
|
|
Glib::ustring Lmethod;
|
|
Glib::ustring CLmethod;
|
|
Glib::ustring Backmethod;
|
|
Glib::ustring Tilesmethod;
|
|
Glib::ustring daubcoeffmethod;
|
|
Glib::ustring CHmethod;
|
|
Glib::ustring Medgreinf;
|
|
Glib::ustring CHSLmethod;
|
|
Glib::ustring EDmethod;
|
|
Glib::ustring BAmethod;
|
|
Glib::ustring TMmethod;
|
|
Glib::ustring Dirmethod;
|
|
Glib::ustring HSmethod;
|
|
int rescon;
|
|
int resconH;
|
|
int reschro;
|
|
double tmrs;
|
|
double gamma;
|
|
int sup;
|
|
double sky;
|
|
int thres;
|
|
int chroma;
|
|
int chro;
|
|
int threshold;
|
|
int threshold2;
|
|
int edgedetect;
|
|
int edgedetectthr;
|
|
int edgedetectthr2;
|
|
int contrast;
|
|
int edgrad;
|
|
int edgval;
|
|
int edgthresh;
|
|
int thr;
|
|
int thrH;
|
|
double skinprotect;
|
|
Threshold<int> hueskin;
|
|
Threshold<int> hueskin2;
|
|
Threshold<int> hllev;
|
|
Threshold<int> bllev;
|
|
Threshold<int> pastlev;
|
|
Threshold<int> satlev;
|
|
Threshold<int> edgcont;
|
|
Threshold<double> level0noise;
|
|
Threshold<double> level1noise;
|
|
Threshold<double> level2noise;
|
|
|
|
|
|
WaveletParams ();
|
|
void setDefaults();
|
|
void getCurves(WavCurve &cCurve,WavOpacityCurveRG &opacityCurveLUTRG , WavOpacityCurveBY &opacityCurveLUTBY, WavOpacityCurveW &opacityCurveLUTW, WavOpacityCurveWL &opacityCurveLUTWL) const;
|
|
static void getDefaultCCWCurve(std::vector<double> &curve);
|
|
static void getDefaultOpacityCurveRG(std::vector<double> &curve);
|
|
static void getDefaultOpacityCurveBY(std::vector<double> &curve);
|
|
static void getDefaultOpacityCurveW(std::vector<double> &curve);
|
|
static void getDefaultOpacityCurveWL(std::vector<double> &curve);
|
|
|
|
};
|
|
|
|
|
|
/**
|
|
* Directional pyramid equalizer params
|
|
*/
|
|
class DirPyrEqualizerParams {
|
|
|
|
public:
|
|
bool enabled;
|
|
bool gamutlab;
|
|
double mult[6];
|
|
double threshold;
|
|
double skinprotect;
|
|
Threshold<int> hueskin;
|
|
//Glib::ustring algo;
|
|
|
|
DirPyrEqualizerParams() : hueskin(20, 80, 2000, 1200, false) {};
|
|
};
|
|
|
|
/**
|
|
* HSV equalizer params
|
|
*/
|
|
class HSVEqualizerParams {
|
|
|
|
public:
|
|
std::vector<double> hcurve;
|
|
std::vector<double> scurve;
|
|
std::vector<double> vcurve;
|
|
};
|
|
|
|
|
|
/**
|
|
* Film simualtion params
|
|
*/
|
|
struct FilmSimulationParams {
|
|
bool enabled;
|
|
Glib::ustring clutFilename;
|
|
int strength;
|
|
|
|
FilmSimulationParams() {
|
|
setDefaults();
|
|
}
|
|
|
|
void setDefaults() {
|
|
enabled = false;
|
|
clutFilename = Glib::ustring();
|
|
strength = 100;
|
|
}
|
|
};
|
|
|
|
|
|
/**
|
|
* Parameters for RAW demosaicing, common to all sensor type
|
|
*/
|
|
class RAWParams {
|
|
|
|
public:
|
|
/**
|
|
* Parameters for RAW demosaicing specific to Bayer sensors
|
|
*/
|
|
class BayerSensor {
|
|
public:
|
|
//enum eMethod{ eahd,hphd,vng4,dcb,amaze,ahd,IGV_noise,fast,
|
|
//numMethods }; // This MUST be the last enum
|
|
enum eMethod{ amaze, igv, lmmse, eahd, hphd, vng4, dcb, ahd, fast, mono, none,
|
|
numMethods }; // This MUST be the last enum
|
|
static const char *methodstring[numMethods];
|
|
|
|
Glib::ustring method;
|
|
int ccSteps;
|
|
double black0;
|
|
double black1;
|
|
double black2;
|
|
double black3;
|
|
bool twogreen;
|
|
int linenoise;
|
|
int greenthresh;
|
|
int dcb_iterations;
|
|
int lmmse_iterations;
|
|
bool dcb_enhance;
|
|
//bool all_enhance;
|
|
};
|
|
|
|
/**
|
|
* Parameters for RAW demosaicing specific to X-Trans sensors
|
|
*/
|
|
class XTransSensor {
|
|
public:
|
|
enum eMethod{ threePass, onePass, fast, mono, none,
|
|
numMethods }; // This MUST be the last enum
|
|
static const char *methodstring[numMethods];
|
|
|
|
Glib::ustring method;
|
|
int ccSteps;
|
|
double blackred;
|
|
double blackgreen;
|
|
double blackblue;
|
|
};
|
|
|
|
BayerSensor bayersensor; ///< RAW parameters for Bayer sensors
|
|
XTransSensor xtranssensor; ///< RAW parameters for X-Trans sensors
|
|
|
|
enum eFlatFileBlurType{ /*parametric,*/area_ff,v_ff,h_ff,vh_ff,
|
|
numFlatFileBlurTypes }; // This MUST be the last enum
|
|
|
|
static const char *ff_BlurTypestring[numFlatFileBlurTypes];
|
|
|
|
Glib::ustring dark_frame;
|
|
bool df_autoselect;
|
|
|
|
Glib::ustring ff_file;
|
|
bool ff_AutoSelect;
|
|
int ff_BlurRadius;
|
|
Glib::ustring ff_BlurType;
|
|
bool ff_AutoClipControl;
|
|
int ff_clipControl;
|
|
|
|
bool ca_autocorrect;
|
|
double cared;
|
|
double cablue;
|
|
|
|
// exposure before interpolation
|
|
double expos;
|
|
double preser;
|
|
|
|
bool hotPixelFilter;
|
|
bool deadPixelFilter;
|
|
int hotdeadpix_thresh;
|
|
|
|
RAWParams() {
|
|
setDefaults();
|
|
}
|
|
void setDefaults();
|
|
};
|
|
|
|
/**
|
|
* This class holds all the processing parameters applied on the images
|
|
*/
|
|
class ProcParams {
|
|
|
|
public:
|
|
ToneCurveParams toneCurve; ///< Tone curve parameters
|
|
LCurveParams labCurve; ///< CIELAB luminance curve parameters
|
|
RGBCurvesParams rgbCurves; ///< RGB curves parameters
|
|
ColorToningParams colorToning; ///< Color Toning parameters
|
|
SharpeningParams sharpening; ///< Sharpening parameters
|
|
SharpeningParams prsharpening; ///< Sharpening parameters for post resize sharpening
|
|
SharpenEdgeParams sharpenEdge; ///< Sharpen edge parameters
|
|
SharpenMicroParams sharpenMicro; ///< Sharpen microcontrast parameters
|
|
VibranceParams vibrance; ///< Vibrance parameters
|
|
//ColorBoostParams colorBoost; ///< Color boost parameters
|
|
WBParams wb; ///< White balance parameters
|
|
ColorAppearanceParams colorappearance;
|
|
//ColorShiftParams colorShift; ///< Color shift parameters
|
|
//LumaDenoiseParams lumaDenoise; ///< Luminance denoising parameters
|
|
//ColorDenoiseParams colorDenoise; ///< Color denoising parameters
|
|
DefringeParams defringe; ///< Defringing parameters
|
|
ImpulseDenoiseParams impulseDenoise; ///< Impulse denoising parameters
|
|
DirPyrDenoiseParams dirpyrDenoise; ///< Directional Pyramid denoising parameters
|
|
EPDParams epd; ///< Edge Preserving Decomposition parameters
|
|
SHParams sh; ///< Shadow/highlight enhancement parameters
|
|
CropParams crop; ///< Crop parameters
|
|
CoarseTransformParams coarse; ///< Coarse transformation (90, 180, 270 deg rotation, h/v flipping) parameters
|
|
CommonTransformParams commonTrans; ///< Common transformation parameters (autofill)
|
|
RotateParams rotate; ///< Rotation parameters
|
|
DistortionParams distortion; ///< Lens distortion correction parameters
|
|
LensProfParams lensProf; ///< Lens correction profile parameters
|
|
PerspectiveParams perspective; ///< Perspective correction parameters
|
|
GradientParams gradient; ///< Gradient filter parameters
|
|
PCVignetteParams pcvignette; ///< Post-crop vignette filter parameters
|
|
CACorrParams cacorrection; ///< Lens c/a correction parameters
|
|
VignettingParams vignetting; ///< Lens vignetting correction parameters
|
|
ChannelMixerParams chmixer; ///< Channel mixer parameters
|
|
BlackWhiteParams blackwhite; ///< Black & White parameters
|
|
ResizeParams resize; ///< Resize parameters
|
|
ColorManagementParams icm; ///< profiles/color spaces used during the image processing
|
|
RAWParams raw; ///< RAW parameters before demosaicing
|
|
WaveletParams wavelet; ///< wavelet wavelet parameters
|
|
DirPyrEqualizerParams dirpyrequalizer; ///< directional pyramid wavelet parameters
|
|
HSVEqualizerParams hsvequalizer; ///< hsv wavelet parameters
|
|
FilmSimulationParams filmSimulation; ///< film simulation parameters
|
|
char rank; ///< Custom image quality ranking
|
|
char colorlabel; ///< Custom color label
|
|
bool inTrash; ///< Marks deleted image
|
|
Glib::ustring appVersion; ///< Version of the application that generated the parameters
|
|
int ppVersion; ///< Version of the PP file from which the parameters have been read
|
|
|
|
ExifPairs exif; ///< List of modifications appplied on the exif tags of the input image
|
|
IPTCPairs iptc; ///< The IPTC tags and values to be saved to the output image
|
|
|
|
/**
|
|
* The constructor only sets the hand-wired defaults.
|
|
*/
|
|
ProcParams ();
|
|
/**
|
|
* Sets the hand-wired defaults parameters.
|
|
*/
|
|
void setDefaults ();
|
|
/**
|
|
* Saves the parameters to possibly two files. This is a performance improvement if a function has to
|
|
* save the same file in two different location, i.e. the cache and the image's directory
|
|
* @param fname the name of the first file (can be an empty string)
|
|
* @param fname2 the name of the second file (can be an empty string) (optional)
|
|
* @param fnameAbsolute set to false if embedded filenames (if any, darkframe/flatfield) should be stored as relative
|
|
* filenames if they are inside the same directory or in a sub-directory to fname's directory.
|
|
* @param pedited pointer to a ParamsEdited object (optional) to store which values has to be saved
|
|
* @return Error code (=0 if all supplied filenames where created correctly)
|
|
*/
|
|
int save (Glib::ustring fname, Glib::ustring fname2 = "", bool fnameAbsolute = true, ParamsEdited* pedited=NULL);
|
|
/**
|
|
* Loads the parameters from a file.
|
|
* @param fname the name of the file
|
|
* @params pedited pointer to a ParamsEdited object (optional) to store which values has been loaded
|
|
* @return Error code (=0 if no error)
|
|
*/
|
|
int load (Glib::ustring fname, ParamsEdited* pedited=NULL);
|
|
|
|
/** Creates a new instance of ProcParams.
|
|
* @return a pointer to the new ProcParams instance. */
|
|
static ProcParams* create ();
|
|
|
|
/** Destroys an instance of ProcParams.
|
|
* @param pp a pointer to the ProcParams instance to destroy. */
|
|
static void destroy (ProcParams* pp);
|
|
|
|
static void init ();
|
|
static void cleanup ();
|
|
|
|
bool operator== (const ProcParams& other);
|
|
bool operator!= (const ProcParams& other);
|
|
|
|
private:
|
|
/** Write the ProcParams's text in the file of the given name.
|
|
* @param fname the name of the file
|
|
* @param content the text to write
|
|
* @return Error code (=0 if no error)
|
|
* */
|
|
int write (Glib::ustring &fname, Glib::ustring &content) const;
|
|
|
|
};
|
|
|
|
/**
|
|
* This class associate a ProcParams object and a ParamEdited object through a pointer
|
|
* to instance of each type in order to handle partial pp3 file loading (and later maybe
|
|
* saving too)
|
|
*
|
|
* PartialProfile is not responsible of ProcParams and ParamsEdited object creation
|
|
* and hence is not responsible of their destructions. The function that instanciate
|
|
* PartialProfile object has to handle all this itself.
|
|
*/
|
|
class PartialProfile {
|
|
public:
|
|
rtengine::procparams::ProcParams* pparams;
|
|
ParamsEdited* pedited;
|
|
PartialProfile& operator=(PartialProfile& rhs) { pparams=rhs.pparams; pedited=rhs.pedited; return *this; };
|
|
|
|
PartialProfile (bool createInstance=false, bool paramsEditedValue=false);
|
|
PartialProfile (ProcParams* pp, ParamsEdited* pe=NULL, bool fullCopy=false);
|
|
PartialProfile (const ProcParams* pp, const ParamsEdited* pe=NULL);
|
|
void deleteInstance ();
|
|
void clearGeneral ();
|
|
int load (Glib::ustring fName);
|
|
void set (bool v);
|
|
const void applyTo (ProcParams *destParams) const ;
|
|
};
|
|
|
|
/**
|
|
* This class automatically create the pparams and pedited instance in the constructor,
|
|
* and automatically delete them in the destructor. This class has been mostly created
|
|
* to be used with vectors, which use the default constructor/destructor
|
|
*/
|
|
class AutoPartialProfile : public PartialProfile {
|
|
public:
|
|
AutoPartialProfile() : PartialProfile(true) {}
|
|
~AutoPartialProfile() { deleteInstance(); }
|
|
};
|
|
|
|
}
|
|
}
|
|
#endif
|