commit
2accd75bd0
@ -401,13 +401,10 @@ bool MultiDiagonalSymmetricMatrix::CreateIncompleteCholeskyFactorization(int Max
|
||||
|
||||
//How many diagonals in the decomposition?
|
||||
MaxFillAbove++; //Conceptually, now "fill" includes an existing diagonal. Simpler in the math that follows.
|
||||
int j, mic, fp;
|
||||
mic = 1;
|
||||
fp = 1;
|
||||
int mic = 1;
|
||||
|
||||
for(int ii = 1; ii < m; ii++) {
|
||||
fp = rtengine::min(StartRows[ii] - StartRows[ii - 1], MaxFillAbove); //Guaranteed positive since StartRows must be created in increasing order.
|
||||
mic = mic + fp;
|
||||
mic += rtengine::min(StartRows[ii] - StartRows[ii - 1], MaxFillAbove); //Guaranteed positive since StartRows must be created in increasing order.
|
||||
}
|
||||
|
||||
//Initialize the decomposition - setup memory, start rows, etc.
|
||||
@ -421,7 +418,7 @@ bool MultiDiagonalSymmetricMatrix::CreateIncompleteCholeskyFactorization(int Max
|
||||
|
||||
for(int ii = 1; ii < m; ii++) {
|
||||
//Set j to the number of diagonals to be created corresponding to a diagonal on this source matrix...
|
||||
j = rtengine::min(StartRows[ii] - StartRows[ii - 1], MaxFillAbove);
|
||||
int j = rtengine::min(StartRows[ii] - StartRows[ii - 1], MaxFillAbove);
|
||||
|
||||
//...and create those diagonals. I want to take a moment to tell you about how much I love minimalistic loops: very much.
|
||||
while(j-- != 0)
|
||||
@ -491,7 +488,7 @@ bool MultiDiagonalSymmetricMatrix::CreateIncompleteCholeskyFactorization(int Max
|
||||
findmap[j] = FindIndex( icStartRows[j]);
|
||||
}
|
||||
|
||||
for(j = 0; j < n; j++) {
|
||||
for(int j = 0; j < n; j++) {
|
||||
//Calculate d for this column.
|
||||
d[j] = Diagonals[0][j];
|
||||
|
||||
@ -557,12 +554,11 @@ void MultiDiagonalSymmetricMatrix::CholeskyBackSolve(float* RESTRICT x, float* R
|
||||
float* RESTRICT *d = IncompleteCholeskyFactorization->Diagonals;
|
||||
int* RESTRICT s = IncompleteCholeskyFactorization->StartRows;
|
||||
int M = IncompleteCholeskyFactorization->m, N = IncompleteCholeskyFactorization->n;
|
||||
int i, j;
|
||||
|
||||
if(M != DIAGONALSP1) { // can happen in theory
|
||||
for(j = 0; j < N; j++) {
|
||||
for(int j = 0; j < N; j++) {
|
||||
float sub = b[j]; // using local var to reduce memory writes, gave a big speedup
|
||||
i = 1;
|
||||
int i = 1;
|
||||
int c = j - s[i];
|
||||
|
||||
while(c >= 0) {
|
||||
@ -574,9 +570,9 @@ void MultiDiagonalSymmetricMatrix::CholeskyBackSolve(float* RESTRICT x, float* R
|
||||
x[j] = sub; // only one memory-write per j
|
||||
}
|
||||
} else { // that's the case almost every time
|
||||
for(j = 0; j <= s[M - 1]; j++) {
|
||||
for(int j = 0; j <= s[M - 1]; j++) {
|
||||
float sub = b[j]; // using local var to reduce memory writes, gave a big speedup
|
||||
i = 1;
|
||||
int i = 1;
|
||||
int c = j - s[1];
|
||||
|
||||
while(c >= 0) {
|
||||
@ -588,7 +584,7 @@ void MultiDiagonalSymmetricMatrix::CholeskyBackSolve(float* RESTRICT x, float* R
|
||||
x[j] = sub; // only one memory-write per j
|
||||
}
|
||||
|
||||
for(j = s[M - 1] + 1; j < N; j++) {
|
||||
for(int j = s[M - 1] + 1; j < N; j++) {
|
||||
float sub = b[j]; // using local var to reduce memory writes, gave a big speedup
|
||||
|
||||
for(int i = DIAGONALSP1 - 1; i > 0; i--) { // using a constant upperbound allows the compiler to unroll this loop (gives a good speedup)
|
||||
@ -605,14 +601,15 @@ void MultiDiagonalSymmetricMatrix::CholeskyBackSolve(float* RESTRICT x, float* R
|
||||
#pragma omp parallel for
|
||||
#endif
|
||||
|
||||
for(j = 0; j < N; j++) {
|
||||
for(int j = 0; j < N; j++) {
|
||||
x[j] = x[j] / d[0][j];
|
||||
}
|
||||
|
||||
if(M != DIAGONALSP1) { // can happen in theory
|
||||
int j = N;
|
||||
while(j-- > 0) {
|
||||
float sub = x[j]; // using local var to reduce memory writes, gave a big speedup
|
||||
i = 1;
|
||||
int i = 1;
|
||||
int c = j + s[1];
|
||||
|
||||
while(c < N) {
|
||||
@ -624,9 +621,9 @@ void MultiDiagonalSymmetricMatrix::CholeskyBackSolve(float* RESTRICT x, float* R
|
||||
x[j] = sub; // only one memory-write per j
|
||||
}
|
||||
} else { // that's the case almost every time
|
||||
for(j = N - 1; j >= (N - 1) - s[M - 1]; j--) {
|
||||
for(int j = N - 1; j >= (N - 1) - s[M - 1]; j--) {
|
||||
float sub = x[j]; // using local var to reduce memory writes, gave a big speedup
|
||||
i = 1;
|
||||
int i = 1;
|
||||
int c = j + s[1];
|
||||
|
||||
while(c < N) {
|
||||
@ -638,7 +635,7 @@ void MultiDiagonalSymmetricMatrix::CholeskyBackSolve(float* RESTRICT x, float* R
|
||||
x[j] = sub; // only one memory-write per j
|
||||
}
|
||||
|
||||
for(j = (N - 2) - s[M - 1]; j >= 0; j--) {
|
||||
for(int j = (N - 2) - s[M - 1]; j >= 0; j--) {
|
||||
float sub = x[j]; // using local var to reduce memory writes, gave a big speedup
|
||||
|
||||
for(int i = DIAGONALSP1 - 1; i > 0; i--) { // using a constant upperbound allows the compiler to unroll this loop (gives a good speedup)
|
||||
|
@ -2016,45 +2016,6 @@ void Color::Lch2Luv(float c, float h, float &u, float &v)
|
||||
v = c * sincosval.y;
|
||||
}
|
||||
|
||||
// NOT TESTED
|
||||
void Color::XYZ2Luv (float X, float Y, float Z, float &L, float &u, float &v)
|
||||
{
|
||||
|
||||
X /= 65535.f;
|
||||
Y /= 65535.f;
|
||||
Z /= 65535.f;
|
||||
|
||||
if (Y > float(eps)) {
|
||||
L = 116.f * std::cbrt(Y) - 16.f;
|
||||
} else {
|
||||
L = float(kappa) * Y;
|
||||
}
|
||||
|
||||
u = 13.f * L * float(u0);
|
||||
v = 13.f * L * float(v0);
|
||||
}
|
||||
|
||||
// NOT TESTED
|
||||
void Color::Luv2XYZ (float L, float u, float v, float &X, float &Y, float &Z)
|
||||
{
|
||||
if (L > float(epskap)) {
|
||||
float t = (L + 16.f) / 116.f;
|
||||
Y = t * t * t;
|
||||
} else {
|
||||
Y = L / float(kappa);
|
||||
}
|
||||
|
||||
float a = ((52.f * L) / (u + 13.f * L * float(u0)) - 1.f) / 3.f;
|
||||
float d = Y * (((39 * L) / (v + 13 * float(v0))) - 5.f);
|
||||
float b = -5.f * Y;
|
||||
X = (d - b) / (a + 1.f / 3.f);
|
||||
|
||||
Z = X * a + b;
|
||||
|
||||
X *= 65535.f;
|
||||
Y *= 65535.f;
|
||||
Z *= 65535.f;
|
||||
}
|
||||
|
||||
/*
|
||||
* Gamut mapping algorithm
|
||||
|
@ -240,20 +240,20 @@ public:
|
||||
static inline void rgb2slfloat(float r, float g, float b, float &s, float &l)
|
||||
{
|
||||
|
||||
float m = min(r, g, b);
|
||||
float M = max(r, g, b);
|
||||
float C = M - m;
|
||||
float minVal = min(r, g, b);
|
||||
float maxVal = max(r, g, b);
|
||||
float C = maxVal - minVal;
|
||||
|
||||
l = (M + m) * 7.6295109e-6f; // (0.5f / 65535.f)
|
||||
l = (maxVal + minVal) * 7.6295109e-6f; // (0.5f / 65535.f)
|
||||
|
||||
if (C < 0.65535f) { // 0.00001f * 65535.f
|
||||
s = 0.f;
|
||||
} else {
|
||||
|
||||
if (l <= 0.5f) {
|
||||
s = C / (M + m);
|
||||
s = C / (maxVal + minVal);
|
||||
} else {
|
||||
s = C / (131070.f - (M + m)); // 131070.f = 2.f * 65535.f
|
||||
s = C / (131070.f - (maxVal + minVal)); // 131070.f = 2.f * 65535.f
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -261,11 +261,11 @@ public:
|
||||
static inline void rgb2hslfloat(float r, float g, float b, float &h, float &s, float &l)
|
||||
{
|
||||
|
||||
float m = min(r, g, b);
|
||||
float M = max(r, g, b);
|
||||
float C = M - m;
|
||||
float minVal = min(r, g, b);
|
||||
float maxVal = max(r, g, b);
|
||||
float C = maxVal - minVal;
|
||||
|
||||
l = (M + m) * 7.6295109e-6f; // (0.5f / 65535.f)
|
||||
l = (maxVal + minVal) * 7.6295109e-6f; // (0.5f / 65535.f)
|
||||
|
||||
if (C < 0.65535f) { // 0.00001f * 65535.f
|
||||
h = 0.f;
|
||||
@ -273,14 +273,14 @@ public:
|
||||
} else {
|
||||
|
||||
if (l <= 0.5f) {
|
||||
s = C / (M + m);
|
||||
s = C / (maxVal + minVal);
|
||||
} else {
|
||||
s = C / (131070.f - (M + m)); // 131070.f = 2.f * 65535.f
|
||||
s = C / (131070.f - (maxVal + minVal)); // 131070.f = 2.f * 65535.f
|
||||
}
|
||||
|
||||
if ( r == M ) {
|
||||
if ( r == maxVal ) {
|
||||
h = (g - b);
|
||||
} else if ( g == M ) {
|
||||
} else if ( g == maxVal ) {
|
||||
h = (2.f * C) + (b - r);
|
||||
} else {
|
||||
h = (4.f * C) + (r - g);
|
||||
@ -686,32 +686,6 @@ public:
|
||||
static void Lch2Luv(float c, float h, float &u, float &v);
|
||||
|
||||
|
||||
/**
|
||||
* @brief Convert the XYZ values to Luv values
|
||||
* Warning: this method has never been used/tested so far
|
||||
* @param x X coordinate [0 ; 65535] ; can be negative or superior to 65535
|
||||
* @param y Y coordinate [0 ; 65535] ; can be negative or superior to 65535
|
||||
* @param z Z coordinate [0 ; 65535] ; can be negative or superior to 65535
|
||||
* @param L 'L' channel [0 ; 32768] (return value)
|
||||
* @param u 'u' channel [-42000 ; 42000] ; can be more than 42000 (return value)
|
||||
* @param v 'v' channel [-42000 ; 42000] ; can be more than 42000 (return value)
|
||||
*/
|
||||
static void XYZ2Luv (float X, float Y, float Z, float &L, float &u, float &v);
|
||||
|
||||
|
||||
/**
|
||||
* @brief Convert the Luv values to XYZ values
|
||||
* Warning: this method has never been used/tested so far
|
||||
* @param L 'L' channel [0 ; 32768]
|
||||
* @param u 'u' channel [-42000 ; 42000] ; can be more than 42000
|
||||
* @param v 'v' channel [-42000 ; 42000] ; can be more than 42000
|
||||
* @param x X coordinate [0 ; 65535] ; can be negative or superior to 65535 (return value)
|
||||
* @param y Y coordinate [0 ; 65535] ; can be negative or superior to 65535 (return value)
|
||||
* @param z Z coordinate [0 ; 65535] ; can be negative or superior to 65535 (return value)
|
||||
*/
|
||||
static void Luv2XYZ (float L, float u, float v, float &X, float &Y, float &Z);
|
||||
|
||||
|
||||
/**
|
||||
* @brief Return "f" in function of CIE's kappa and epsilon constants
|
||||
* @param f f can be fx fy fz where:
|
||||
|
@ -31,7 +31,7 @@
|
||||
#include "../rtgui/mydiagonalcurve.h"
|
||||
#include "color.h"
|
||||
#include "pipettebuffer.h"
|
||||
|
||||
#include "noncopyable.h"
|
||||
#include "LUT.h"
|
||||
|
||||
#define CURVES_MIN_POLY_POINTS 1000
|
||||
@ -468,7 +468,7 @@ protected:
|
||||
void NURBS_set ();
|
||||
|
||||
public:
|
||||
DiagonalCurve (const std::vector<double>& points, int ppn = CURVES_MIN_POLY_POINTS);
|
||||
explicit DiagonalCurve (const std::vector<double>& points, int ppn = CURVES_MIN_POLY_POINTS);
|
||||
~DiagonalCurve () override;
|
||||
|
||||
double getVal (double t) const override;
|
||||
@ -479,7 +479,7 @@ public:
|
||||
};
|
||||
};
|
||||
|
||||
class FlatCurve : public Curve
|
||||
class FlatCurve : public Curve, public rtengine::NonCopyable
|
||||
{
|
||||
|
||||
private:
|
||||
@ -493,7 +493,7 @@ private:
|
||||
|
||||
public:
|
||||
|
||||
FlatCurve (const std::vector<double>& points, bool isPeriodic = true, int ppn = CURVES_MIN_POLY_POINTS);
|
||||
explicit FlatCurve (const std::vector<double>& points, bool isPeriodic = true, int ppn = CURVES_MIN_POLY_POINTS);
|
||||
~FlatCurve () override;
|
||||
|
||||
double getVal (double t) const override;
|
||||
|
@ -334,8 +334,6 @@ double xyCoordToTemperature(const std::array<double, 2>& white_xy)
|
||||
|
||||
// Search for line pair coordinate is between.
|
||||
double last_dt = 0.0;
|
||||
double last_dv = 0.0;
|
||||
double last_du = 0.0;
|
||||
|
||||
for (uint32_t index = 1; index <= 30; ++index) {
|
||||
// Convert slope to delta-u and delta-v, with length 1.
|
||||
@ -371,23 +369,11 @@ double xyCoordToTemperature(const std::array<double, 2>& white_xy)
|
||||
|
||||
// Interpolate the temperature.
|
||||
res = 1.0e6 / (temp_table[index - 1].r * f + temp_table[index].r * (1.0 - f));
|
||||
|
||||
// Find delta from black body point to test coordinate.
|
||||
uu = u - (temp_table [index - 1].u * f + temp_table [index].u * (1.0 - f));
|
||||
vv = v - (temp_table [index - 1].v * f + temp_table [index].v * (1.0 - f));
|
||||
// Interpolate vectors along slope.
|
||||
du = du * (1.0 - f) + last_du * f;
|
||||
dv = dv * (1.0 - f) + last_dv * f;
|
||||
len = sqrt (du * du + dv * dv);
|
||||
du /= len;
|
||||
dv /= len;
|
||||
break;
|
||||
}
|
||||
|
||||
// Try next line pair.
|
||||
last_dt = dt;
|
||||
last_du = du;
|
||||
last_dv = dv;
|
||||
}
|
||||
|
||||
return res;
|
||||
|
@ -204,10 +204,8 @@ void Crop::update(int todo)
|
||||
}
|
||||
|
||||
int numtiles_W, numtiles_H, tilewidth, tileheight, tileWskip, tileHskip;
|
||||
int kall = 2;
|
||||
|
||||
parent->ipf.Tile_calc(tilesize, overlap, kall, widIm, heiIm, numtiles_W, numtiles_H, tilewidth, tileheight, tileWskip, tileHskip);
|
||||
kall = 0;
|
||||
parent->ipf.Tile_calc(tilesize, overlap, 2, widIm, heiIm, numtiles_W, numtiles_H, tilewidth, tileheight, tileWskip, tileHskip);
|
||||
|
||||
float *min_b = new float [9];
|
||||
float *min_r = new float [9];
|
||||
@ -653,10 +651,9 @@ void Crop::update(int todo)
|
||||
|
||||
if (todo & M_LINDENOISE) {
|
||||
if (skip == 1 && denoiseParams.enabled) {
|
||||
int kall = 0;
|
||||
|
||||
float nresi, highresi;
|
||||
parent->ipf.RGB_denoise(kall, origCrop, origCrop, calclum, parent->denoiseInfoStore.ch_M, parent->denoiseInfoStore.max_r, parent->denoiseInfoStore.max_b, parent->imgsrc->isRAW(), /*Roffset,*/ denoiseParams, parent->imgsrc->getDirPyrDenoiseExpComp(), noiseLCurve, noiseCCurve, nresi, highresi);
|
||||
parent->ipf.RGB_denoise(0, origCrop, origCrop, calclum, parent->denoiseInfoStore.ch_M, parent->denoiseInfoStore.max_r, parent->denoiseInfoStore.max_b, parent->imgsrc->isRAW(), /*Roffset,*/ denoiseParams, parent->imgsrc->getDirPyrDenoiseExpComp(), noiseLCurve, noiseCCurve, nresi, highresi);
|
||||
|
||||
if (parent->adnListener) {
|
||||
parent->adnListener->noiseChanged(nresi, highresi);
|
||||
@ -885,9 +882,6 @@ void Crop::update(int todo)
|
||||
if (skip == 1) {
|
||||
if ((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled)) {
|
||||
parent->ipf.impulsedenoise(labnCrop);
|
||||
}
|
||||
|
||||
if ((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled)) {
|
||||
parent->ipf.defringe(labnCrop);
|
||||
}
|
||||
|
||||
@ -900,7 +894,6 @@ void Crop::update(int todo)
|
||||
}
|
||||
|
||||
// if (skip==1) {
|
||||
WaveletParams WaveParams = params.wavelet;
|
||||
|
||||
if (params.dirpyrequalizer.cbdlMethod == "aft") {
|
||||
if (((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled))) {
|
||||
@ -909,81 +902,81 @@ void Crop::update(int todo)
|
||||
}
|
||||
}
|
||||
|
||||
int kall = 0;
|
||||
int minwin = min(labnCrop->W, labnCrop->H);
|
||||
int maxlevelcrop = 10;
|
||||
|
||||
// if(cp.mul[9]!=0)maxlevelcrop=10;
|
||||
// adap maximum level wavelet to size of crop
|
||||
if (minwin * skip < 1024) {
|
||||
maxlevelcrop = 9; //sampling wavelet 512
|
||||
}
|
||||
|
||||
if (minwin * skip < 512) {
|
||||
maxlevelcrop = 8; //sampling wavelet 256
|
||||
}
|
||||
|
||||
if (minwin * skip < 256) {
|
||||
maxlevelcrop = 7; //sampling 128
|
||||
}
|
||||
|
||||
if (minwin * skip < 128) {
|
||||
maxlevelcrop = 6;
|
||||
}
|
||||
|
||||
if (minwin < 64) {
|
||||
maxlevelcrop = 5;
|
||||
}
|
||||
|
||||
int realtile;
|
||||
|
||||
if (params.wavelet.Tilesmethod == "big") {
|
||||
realtile = 22;
|
||||
} else /*if (params.wavelet.Tilesmethod == "lit")*/ {
|
||||
realtile = 12;
|
||||
}
|
||||
|
||||
int tilesize = 128 * realtile;
|
||||
int overlap = (int) tilesize * 0.125f;
|
||||
|
||||
int numtiles_W, numtiles_H, tilewidth, tileheight, tileWskip, tileHskip;
|
||||
|
||||
parent->ipf.Tile_calc(tilesize, overlap, kall, labnCrop->W, labnCrop->H, numtiles_W, numtiles_H, tilewidth, tileheight, tileWskip, tileHskip);
|
||||
//now we have tile dimensions, overlaps
|
||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
int minsizetile = min(tilewidth, tileheight);
|
||||
int maxlev2 = 10;
|
||||
|
||||
if (minsizetile < 1024 && maxlevelcrop == 10) {
|
||||
maxlev2 = 9;
|
||||
}
|
||||
|
||||
if (minsizetile < 512) {
|
||||
maxlev2 = 8;
|
||||
}
|
||||
|
||||
if (minsizetile < 256) {
|
||||
maxlev2 = 7;
|
||||
}
|
||||
|
||||
if (minsizetile < 128) {
|
||||
maxlev2 = 6;
|
||||
}
|
||||
|
||||
int maxL = min(maxlev2, maxlevelcrop);
|
||||
|
||||
if (parent->awavListener) {
|
||||
parent->awavListener->wavChanged(float (maxL));
|
||||
}
|
||||
|
||||
if ((params.wavelet.enabled)) {
|
||||
WaveletParams WaveParams = params.wavelet;
|
||||
int kall = 0;
|
||||
int minwin = min(labnCrop->W, labnCrop->H);
|
||||
int maxlevelcrop = 10;
|
||||
|
||||
// if(cp.mul[9]!=0)maxlevelcrop=10;
|
||||
// adap maximum level wavelet to size of crop
|
||||
if (minwin * skip < 1024) {
|
||||
maxlevelcrop = 9; //sampling wavelet 512
|
||||
}
|
||||
|
||||
if (minwin * skip < 512) {
|
||||
maxlevelcrop = 8; //sampling wavelet 256
|
||||
}
|
||||
|
||||
if (minwin * skip < 256) {
|
||||
maxlevelcrop = 7; //sampling 128
|
||||
}
|
||||
|
||||
if (minwin * skip < 128) {
|
||||
maxlevelcrop = 6;
|
||||
}
|
||||
|
||||
if (minwin < 64) {
|
||||
maxlevelcrop = 5;
|
||||
}
|
||||
|
||||
int realtile;
|
||||
|
||||
if (params.wavelet.Tilesmethod == "big") {
|
||||
realtile = 22;
|
||||
} else /*if (params.wavelet.Tilesmethod == "lit")*/ {
|
||||
realtile = 12;
|
||||
}
|
||||
|
||||
int tilesize = 128 * realtile;
|
||||
int overlap = (int) tilesize * 0.125f;
|
||||
|
||||
int numtiles_W, numtiles_H, tilewidth, tileheight, tileWskip, tileHskip;
|
||||
|
||||
parent->ipf.Tile_calc(tilesize, overlap, kall, labnCrop->W, labnCrop->H, numtiles_W, numtiles_H, tilewidth, tileheight, tileWskip, tileHskip);
|
||||
//now we have tile dimensions, overlaps
|
||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
int minsizetile = min(tilewidth, tileheight);
|
||||
int maxlev2 = 10;
|
||||
|
||||
if (minsizetile < 1024 && maxlevelcrop == 10) {
|
||||
maxlev2 = 9;
|
||||
}
|
||||
|
||||
if (minsizetile < 512) {
|
||||
maxlev2 = 8;
|
||||
}
|
||||
|
||||
if (minsizetile < 256) {
|
||||
maxlev2 = 7;
|
||||
}
|
||||
|
||||
if (minsizetile < 128) {
|
||||
maxlev2 = 6;
|
||||
}
|
||||
|
||||
int maxL = min(maxlev2, maxlevelcrop);
|
||||
|
||||
if (parent->awavListener) {
|
||||
parent->awavListener->wavChanged(float (maxL));
|
||||
}
|
||||
|
||||
WavCurve wavCLVCurve;
|
||||
WavOpacityCurveRG waOpacityCurveRG;
|
||||
WavOpacityCurveBY waOpacityCurveBY;
|
||||
WavOpacityCurveW waOpacityCurveW;
|
||||
WavOpacityCurveWL waOpacityCurveWL;
|
||||
LUTf wavclCurve;
|
||||
LUTu dummy;
|
||||
|
||||
params.wavelet.getCurves(wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL);
|
||||
|
||||
|
@ -328,8 +328,8 @@ void DFManager::init(const Glib::ustring& pathname)
|
||||
} else {
|
||||
printf( "%s: MEAN of \n ", i.key().c_str());
|
||||
|
||||
for( std::list<Glib::ustring>::iterator iter = i.pathNames.begin(); iter != i.pathNames.end(); ++iter ) {
|
||||
printf( "%s, ", iter->c_str() );
|
||||
for(std::list<Glib::ustring>::iterator path = i.pathNames.begin(); path != i.pathNames.end(); ++path) {
|
||||
printf("%s, ", path->c_str());
|
||||
}
|
||||
|
||||
printf("\n");
|
||||
|
@ -230,7 +230,6 @@ void DiagonalCurve::NURBS_set ()
|
||||
poly_x.clear();
|
||||
poly_y.clear();
|
||||
unsigned int sc_xsize = j - 1;
|
||||
j = 0;
|
||||
|
||||
// adding the initial horizontal segment, if any
|
||||
if (x[0] > 0.) {
|
||||
@ -314,18 +313,13 @@ inline void catmull_rom_spline(int n_points,
|
||||
|
||||
double space = (t2-t1) / n_points;
|
||||
|
||||
double t;
|
||||
int i;
|
||||
double c, d, A1_x, A1_y, A2_x, A2_y, A3_x, A3_y;
|
||||
double B1_x, B1_y, B2_x, B2_y, C_x, C_y;
|
||||
|
||||
res_x.push_back(p1_x);
|
||||
res_y.push_back(p1_y);
|
||||
|
||||
// special case, a segment at 0 or 1 is computed exactly
|
||||
if (p1_y == p2_y && (p1_y == 0 || p1_y == 1)) {
|
||||
for (i = 1; i < n_points-1; ++i) {
|
||||
t = p1_x + space * i;
|
||||
for (int i = 1; i < n_points-1; ++i) {
|
||||
double t = p1_x + space * i;
|
||||
if (t >= p2_x) {
|
||||
break;
|
||||
}
|
||||
@ -333,38 +327,38 @@ inline void catmull_rom_spline(int n_points,
|
||||
res_y.push_back(p1_y);
|
||||
}
|
||||
} else {
|
||||
for (i = 1; i < n_points-1; ++i) {
|
||||
t = t1 + space * i;
|
||||
for (int i = 1; i < n_points-1; ++i) {
|
||||
double t = t1 + space * i;
|
||||
|
||||
c = (t1 - t)/(t1 - t0);
|
||||
d = (t - t0)/(t1 - t0);
|
||||
A1_x = c * p0_x + d * p1_x;
|
||||
A1_y = c * p0_y + d * p1_y;
|
||||
double c = (t1 - t)/(t1 - t0);
|
||||
double d = (t - t0)/(t1 - t0);
|
||||
double A1_x = c * p0_x + d * p1_x;
|
||||
double A1_y = c * p0_y + d * p1_y;
|
||||
|
||||
c = (t2 - t)/(t2 - t1);
|
||||
d = (t - t1)/(t2 - t1);
|
||||
A2_x = c * p1_x + d * p2_x;
|
||||
A2_y = c * p1_y + d * p2_y;
|
||||
double A2_x = c * p1_x + d * p2_x;
|
||||
double A2_y = c * p1_y + d * p2_y;
|
||||
|
||||
c = (t3 - t)/(t3 - t2);
|
||||
d = (t - t2)/(t3 - t2);
|
||||
A3_x = c * p2_x + d * p3_x;
|
||||
A3_y = c * p2_y + d * p3_y;
|
||||
double A3_x = c * p2_x + d * p3_x;
|
||||
double A3_y = c * p2_y + d * p3_y;
|
||||
|
||||
c = (t2 - t)/(t2 - t0);
|
||||
d = (t - t0)/(t2 - t0);
|
||||
B1_x = c * A1_x + d * A2_x;
|
||||
B1_y = c * A1_y + d * A2_y;
|
||||
double B1_x = c * A1_x + d * A2_x;
|
||||
double B1_y = c * A1_y + d * A2_y;
|
||||
|
||||
c = (t3 - t)/(t3 - t1);
|
||||
d = (t - t1)/(t3 - t1);
|
||||
B2_x = c * A2_x + d * A3_x;
|
||||
B2_y = c * A2_y + d * A3_y;
|
||||
double B2_x = c * A2_x + d * A3_x;
|
||||
double B2_y = c * A2_y + d * A3_y;
|
||||
|
||||
c = (t2 - t)/(t2 - t1);
|
||||
d = (t - t1)/(t2 - t1);
|
||||
C_x = c * B1_x + d * B2_x;
|
||||
C_y = c * B1_y + d * B2_y;
|
||||
double C_x = c * B1_x + d * B2_x;
|
||||
double C_y = c * B1_y + d * B2_y;
|
||||
|
||||
res_x.push_back(C_x);
|
||||
res_y.push_back(C_y);
|
||||
@ -512,7 +506,6 @@ double DiagonalCurve::getVal (double t) const
|
||||
++d;
|
||||
}
|
||||
return LIM01(*(poly_y.begin() + d));
|
||||
break;
|
||||
}
|
||||
|
||||
case DCT_NURBS : {
|
||||
|
@ -1,94 +0,0 @@
|
||||
/*
|
||||
* 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/>.
|
||||
*/
|
||||
#include "rtengine.h"
|
||||
#include <iostream>
|
||||
//#include <giomm.h>
|
||||
#include <helpers.h>
|
||||
|
||||
class PListener :
|
||||
public rtengine::ProgressListener
|
||||
{
|
||||
public:
|
||||
void setProgressStr(const Glib::ustring& str)
|
||||
{
|
||||
std::cout << str << std::endl;
|
||||
}
|
||||
void setProgress (double p)
|
||||
{
|
||||
std::cout << p << std::endl;
|
||||
}
|
||||
void setProgressState(bool inProcessing)
|
||||
{
|
||||
}
|
||||
void error(const Glib::ustring& descr)
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
int main (int argc, char* argv[])
|
||||
{
|
||||
if (argc < 4) {
|
||||
std::cout << "Usage: rtcmd <infile> <paramfile> <outfile>" << std::endl;
|
||||
exit(1);
|
||||
}
|
||||
|
||||
Glib::thread_init ();
|
||||
|
||||
// create and fill settings
|
||||
rtengine::Settings* s = rtengine::Settings::create ();
|
||||
s->demosaicMethod = "hphd";
|
||||
s->colorCorrectionSteps = 2;
|
||||
s->iccDirectory = "";
|
||||
s->colorimetricIntent = 1;
|
||||
s->monitorProfile = "";
|
||||
// init rtengine
|
||||
rtengine::init (s);
|
||||
// the settings can be modified later through the "s" pointer without calling any api function
|
||||
|
||||
// Create a listener object. Any class is appropriate that inherits from rtengine::ProgressListener
|
||||
PListener pl;
|
||||
|
||||
// Load the image given in the first command line parameter
|
||||
rtengine::InitialImage* ii;
|
||||
int errorCode;
|
||||
ii = rtengine::InitialImage::load (argv[1], true, errorCode, &pl);
|
||||
|
||||
if (!ii) {
|
||||
ii = rtengine::InitialImage::load (argv[1], false, errorCode, &pl);
|
||||
}
|
||||
|
||||
if (!ii) {
|
||||
std::cout << "Input file not supported." << std::endl;
|
||||
exit(2);
|
||||
}
|
||||
|
||||
// create an instance of ProcParams structure that holds the image processing settings. You find the memory map in a separate file and the non-basic types like strings and vectors can be manipulated through helper functions
|
||||
rtengine::procparams::ProcParams params;
|
||||
params.load (argv[2]);
|
||||
|
||||
/* First, simplest scenario. Develop image and save it in a file */
|
||||
// create a processing job with the loaded image and the current processing parameters
|
||||
rtengine::ProcessingJob* job = ProcessingJob::create (i, params);
|
||||
// process image. The error is given back in errorcode.
|
||||
rtengine::IImage16* res = rtengine::processImage (job, errorCode, &pl);
|
||||
// save image to disk
|
||||
res->saveToFile (argv[3]);
|
||||
// through "res" you can access width/height and pixel data, too
|
||||
}
|
||||
|
@ -277,8 +277,8 @@ void FFManager::init(const Glib::ustring& pathname)
|
||||
} else {
|
||||
printf( "%s: MEAN of \n ", i.key().c_str());
|
||||
|
||||
for( std::list<Glib::ustring>::iterator iter = i.pathNames.begin(); iter != i.pathNames.end(); ++iter ) {
|
||||
printf( "%s, ", iter->c_str() );
|
||||
for(std::list<Glib::ustring>::iterator path = i.pathNames.begin(); path != i.pathNames.end(); ++path) {
|
||||
printf("%s, ", path->c_str());
|
||||
}
|
||||
|
||||
printf("\n");
|
||||
|
@ -970,8 +970,8 @@ void RawImageSource::HLRecovery_inpaint(float** red, float** green, float** blue
|
||||
for (int c = 0; c < 3; ++c) {
|
||||
lab[i2][c] = 0;
|
||||
|
||||
for (int j = 0; j < 3; ++j) {
|
||||
lab[i2][c] += trans[c][j] * cam[i2][j];
|
||||
for (int j2 = 0; j2 < 3; ++j2) {
|
||||
lab[i2][c] += trans[c][j2] * cam[i2][j2];
|
||||
}
|
||||
}
|
||||
|
||||
@ -996,8 +996,8 @@ void RawImageSource::HLRecovery_inpaint(float** red, float** green, float** blue
|
||||
for (int c = 0; c < 3; ++c) {
|
||||
cam[0][c] = 0.f;
|
||||
|
||||
for (int j = 0; j < 3; ++j) {
|
||||
cam[0][c] += itrans[c][j] * lab[0][j];
|
||||
for (int j2 = 0; j2 < 3; ++j2) {
|
||||
cam[0][c] += itrans[c][j2] * lab[0][j2];
|
||||
}
|
||||
}
|
||||
|
||||
@ -1081,12 +1081,11 @@ void RawImageSource::HLRecovery_inpaint(float** red, float** green, float** blue
|
||||
//now correct clipped channels
|
||||
if (pixel[0] > max_f[0] && pixel[1] > max_f[1] && pixel[2] > max_f[2]) {
|
||||
//all channels clipped
|
||||
const float Y = 0.299f * clipfix[0] + 0.587f * clipfix[1] + 0.114f * clipfix[2];
|
||||
|
||||
const float factor = whitept / Y;
|
||||
red[i + miny][j + minx] = clipfix[0] * factor;
|
||||
green[i + miny][j + minx] = clipfix[1] * factor;
|
||||
blue[i + miny][j + minx] = clipfix[2] * factor;
|
||||
const float mult = whitept / (0.299f * clipfix[0] + 0.587f * clipfix[1] + 0.114f * clipfix[2]);
|
||||
red[i + miny][j + minx] = clipfix[0] * mult;
|
||||
green[i + miny][j + minx] = clipfix[1] * mult;
|
||||
blue[i + miny][j + minx] = clipfix[2] * mult;
|
||||
} else {//some channels clipped
|
||||
const float notclipped[3] = {
|
||||
pixel[0] <= max_f[0] ? 1.f : 0.f,
|
||||
@ -1113,11 +1112,11 @@ void RawImageSource::HLRecovery_inpaint(float** red, float** green, float** blue
|
||||
Y = 0.299f * red[i + miny][j + minx] + 0.587f * green[i + miny][j + minx] + 0.114f * blue[i + miny][j + minx];
|
||||
|
||||
if (Y > whitept) {
|
||||
const float factor = whitept / Y;
|
||||
const float mult = whitept / Y;
|
||||
|
||||
red[i + miny][j + minx] *= factor;
|
||||
green[i + miny][j + minx] *= factor;
|
||||
blue[i + miny][j + minx] *= factor;
|
||||
red[i + miny][j + minx] *= mult;
|
||||
green[i + miny][j + minx] *= mult;
|
||||
blue[i + miny][j + minx] *= mult;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -329,8 +329,8 @@ void RawImageSource::getAutoMatchedToneCurve(const ColorManagementParams &cp, st
|
||||
int tw = target->getWidth(), th = target->getHeight();
|
||||
float thumb_ratio = float(std::max(sw, sh)) / float(std::min(sw, sh));
|
||||
float target_ratio = float(std::max(tw, th)) / float(std::min(tw, th));
|
||||
int cx = 0, cy = 0;
|
||||
if (std::abs(thumb_ratio - target_ratio) > 0.01) {
|
||||
int cx = 0, cy = 0;
|
||||
if (thumb_ratio > target_ratio) {
|
||||
// crop the height
|
||||
int ch = th - (tw * float(sh) / float(sw));
|
||||
|
@ -258,7 +258,6 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory*
|
||||
tag = exif->getTag("SubjectDistance");
|
||||
|
||||
if (tag) {
|
||||
int num, denom;
|
||||
tag->toRational(num, denom);
|
||||
} else {
|
||||
// Second try, XMP data
|
||||
@ -524,8 +523,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory*
|
||||
focal_len = flt->toDouble ();
|
||||
}
|
||||
} else if ((flt = mnote->getTagP ("FocalLength"))) {
|
||||
rtexif::Tag* flt = mnote->getTag ("FocalLength");
|
||||
focal_len = flt->toDouble ();
|
||||
focal_len = mnote->getTag("FocalLength")->toDouble ();
|
||||
}
|
||||
|
||||
if (mnote->getTag ("FocalLengthIn35mmFilm")) {
|
||||
|
@ -98,7 +98,7 @@ private:
|
||||
unsigned int dcrawFrameCount;
|
||||
|
||||
public:
|
||||
FramesData (const Glib::ustring& fname, std::unique_ptr<RawMetaDataLocation> rml = nullptr, bool firstFrameOnly = false);
|
||||
explicit FramesData (const Glib::ustring& fname, std::unique_ptr<RawMetaDataLocation> rml = nullptr, bool firstFrameOnly = false);
|
||||
~FramesData () override;
|
||||
|
||||
void setDCRawFrameCount (unsigned int frameCount);
|
||||
|
@ -200,7 +200,7 @@ public:
|
||||
|
||||
double lumimul[3];
|
||||
|
||||
ImProcFunctions(const ProcParams* iparams, bool imultiThread = true)
|
||||
explicit ImProcFunctions(const ProcParams* iparams, bool imultiThread = true)
|
||||
: monitorTransform(nullptr), params(iparams), scale(1), multiThread(imultiThread), lumimul{} {}
|
||||
~ImProcFunctions();
|
||||
bool needsLuminanceOnly()
|
||||
|
@ -186,8 +186,8 @@ void ImProcFunctions::Lanczos (const Imagefloat* src, Imagefloat* dst, float sca
|
||||
void ImProcFunctions::Lanczos (const LabImage* src, LabImage* dst, float scale)
|
||||
{
|
||||
const float delta = 1.0f / scale;
|
||||
const float a = 3.0f;
|
||||
const float sc = min (scale, 1.0f);
|
||||
constexpr float a = 3.0f;
|
||||
const float sc = min(scale, 1.0f);
|
||||
const int support = static_cast<int> (2.0f * a / sc) + 1;
|
||||
|
||||
// storage for precomputed parameters for horizontal interpolation
|
||||
@ -268,66 +268,61 @@ void ImProcFunctions::Lanczos (const LabImage* src, LabImage* dst, float scale)
|
||||
}
|
||||
|
||||
// Do vertical interpolation. Store results.
|
||||
int j = 0;
|
||||
#ifdef __SSE2__
|
||||
int j;
|
||||
__m128 Lv, av, bv, wkv;
|
||||
|
||||
for (j = 0; j < src->W - 3; j += 4) {
|
||||
Lv = _mm_setzero_ps();
|
||||
av = _mm_setzero_ps();
|
||||
bv = _mm_setzero_ps();
|
||||
Lv = ZEROV;
|
||||
av = ZEROV;
|
||||
bv = ZEROV;
|
||||
|
||||
for (int ii = ii0; ii < ii1; ii++) {
|
||||
int k = ii - ii0;
|
||||
wkv = _mm_set1_ps (w[k]);
|
||||
Lv += wkv * LVFU (src->L[ii][j]);
|
||||
av += wkv * LVFU (src->a[ii][j]);
|
||||
bv += wkv * LVFU (src->b[ii][j]);
|
||||
wkv = F2V(w[k]);
|
||||
Lv += wkv * LVFU(src->L[ii][j]);
|
||||
av += wkv * LVFU(src->a[ii][j]);
|
||||
bv += wkv * LVFU(src->b[ii][j]);
|
||||
}
|
||||
|
||||
STVF (lL[j], Lv);
|
||||
STVF (la[j], av);
|
||||
STVF (lb[j], bv);
|
||||
STVF(lL[j], Lv);
|
||||
STVF(la[j], av);
|
||||
STVF(lb[j], bv);
|
||||
}
|
||||
|
||||
#else
|
||||
int j = 0;
|
||||
#endif
|
||||
|
||||
for (; j < src->W; j++) {
|
||||
float L = 0.0f, a = 0.0f, b = 0.0f;
|
||||
for (; j < src->W; ++j) {
|
||||
float Ll = 0.0f, La = 0.0f, Lb = 0.0f;
|
||||
|
||||
for (int ii = ii0; ii < ii1; ii++) {
|
||||
for (int ii = ii0; ii < ii1; ++ii) {
|
||||
int k = ii - ii0;
|
||||
|
||||
L += w[k] * src->L[ii][j];
|
||||
a += w[k] * src->a[ii][j];
|
||||
b += w[k] * src->b[ii][j];
|
||||
Ll += w[k] * src->L[ii][j];
|
||||
La += w[k] * src->a[ii][j];
|
||||
Lb += w[k] * src->b[ii][j];
|
||||
}
|
||||
|
||||
lL[j] = L;
|
||||
la[j] = a;
|
||||
lb[j] = b;
|
||||
lL[j] = Ll;
|
||||
la[j] = La;
|
||||
lb[j] = Lb;
|
||||
}
|
||||
|
||||
// Do horizontal interpolation
|
||||
for (int j = 0; j < dst->W; j++) {
|
||||
for (int x = 0; x < dst->W; ++x) {
|
||||
float * wh = wwh + support * x;
|
||||
float Ll = 0.0f, La = 0.0f, Lb = 0.0f;
|
||||
|
||||
float * wh = wwh + support * j;
|
||||
for (int jj = jj0[x]; jj < jj1[x]; ++jj) {
|
||||
int k = jj - jj0[x];
|
||||
|
||||
float L = 0.0f, a = 0.0f, b = 0.0f;
|
||||
|
||||
for (int jj = jj0[j]; jj < jj1[j]; jj++) {
|
||||
int k = jj - jj0[j];
|
||||
|
||||
L += wh[k] * lL[jj];
|
||||
a += wh[k] * la[jj];
|
||||
b += wh[k] * lb[jj];
|
||||
Ll += wh[k] * lL[jj];
|
||||
La += wh[k] * la[jj];
|
||||
Lb += wh[k] * lb[jj];
|
||||
}
|
||||
|
||||
dst->L[i][j] = L;
|
||||
dst->a[i][j] = a;
|
||||
dst->b[i][j] = b;
|
||||
dst->L[i][x] = Ll;
|
||||
dst->a[i][x] = La;
|
||||
dst->b[i][x] = Lb;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -106,10 +106,10 @@ void ImProcFunctions::shadowsHighlights(LabImage *lab)
|
||||
#pragma omp parallel for if (multiThread)
|
||||
#endif
|
||||
for (int l = 0; l < 32768; ++l) {
|
||||
auto base = pow_F(l / 32768.f, gamma);
|
||||
auto val = pow_F(l / 32768.f, gamma);
|
||||
// get a bit more contrast in the shadows
|
||||
base = sh_contrast.getVal(base);
|
||||
f[l] = base * 32768.f;
|
||||
val = sh_contrast.getVal(val);
|
||||
f[l] = val * 32768.f;
|
||||
}
|
||||
} else {
|
||||
#ifdef _OPENMP
|
||||
@ -119,10 +119,10 @@ void ImProcFunctions::shadowsHighlights(LabImage *lab)
|
||||
float l, a, b;
|
||||
float R = c, G = c, B = c;
|
||||
rgb2lab(R, G, B, l, a, b);
|
||||
auto base = pow_F(l / 32768.f, gamma);
|
||||
auto val = pow_F(l / 32768.f, gamma);
|
||||
// get a bit more contrast in the shadows
|
||||
base = sh_contrast.getVal(base);
|
||||
l = base * 32768.f;
|
||||
val = sh_contrast.getVal(val);
|
||||
l = val * 32768.f;
|
||||
lab2rgb(l, a, b, R, G, B);
|
||||
f[c] = G;
|
||||
}
|
||||
@ -133,8 +133,8 @@ void ImProcFunctions::shadowsHighlights(LabImage *lab)
|
||||
#pragma omp parallel for if (multiThread)
|
||||
#endif
|
||||
for (int l = 0; l < 32768; ++l) {
|
||||
auto base = pow_F(l / 32768.f, gamma);
|
||||
f[l] = base * 32768.f;
|
||||
auto val = pow_F(l / 32768.f, gamma);
|
||||
f[l] = val * 32768.f;
|
||||
}
|
||||
} else {
|
||||
#ifdef _OPENMP
|
||||
@ -144,8 +144,8 @@ void ImProcFunctions::shadowsHighlights(LabImage *lab)
|
||||
float l, a, b;
|
||||
float R = c, G = c, B = c;
|
||||
rgb2lab(R, G, B, l, a, b);
|
||||
auto base = pow_F(l / 32768.f, gamma);
|
||||
l = base * 32768.f;
|
||||
auto val = pow_F(l / 32768.f, gamma);
|
||||
l = val * 32768.f;
|
||||
lab2rgb(l, a, b, R, G, B);
|
||||
f[c] = G;
|
||||
}
|
||||
|
@ -435,12 +435,7 @@ static void calcGradientParams (int oW, int oH, const GradientParams& gradient,
|
||||
|
||||
if (gp.transpose) {
|
||||
gp.bright_top = !gp.bright_top;
|
||||
}
|
||||
|
||||
if (gp.transpose) {
|
||||
int tmp = w;
|
||||
w = h;
|
||||
h = tmp;
|
||||
std::swap(w, h);
|
||||
}
|
||||
|
||||
gp.scale = 1.0 / pow (2, gradient_stops);
|
||||
|
@ -20,12 +20,14 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "rawimagesource.h"
|
||||
#include <vector>
|
||||
#include "rawimagesource.h"
|
||||
#include "noncopyable.h"
|
||||
|
||||
namespace rtengine {
|
||||
|
||||
class PDAFLinesFilter {
|
||||
class PDAFLinesFilter: public rtengine::NonCopyable
|
||||
{
|
||||
public:
|
||||
explicit PDAFLinesFilter(RawImage *ri);
|
||||
~PDAFLinesFilter();
|
||||
|
@ -65,7 +65,7 @@ Glib::ustring relativePathIfInside(const Glib::ustring &procparams_fname, bool f
|
||||
return embedded_fname;
|
||||
}
|
||||
|
||||
Glib::ustring prefix = "";
|
||||
Glib::ustring prefix;
|
||||
|
||||
if (embedded_fname.length() > 5 && embedded_fname.substr(0, 5) == "file:") {
|
||||
embedded_fname = embedded_fname.substr(5);
|
||||
|
@ -1634,8 +1634,8 @@ class PartialProfile :
|
||||
{
|
||||
public:
|
||||
PartialProfile(bool createInstance = false, bool paramsEditedValue = false);
|
||||
PartialProfile(ProcParams* pp, ParamsEdited* pe = nullptr, bool fullCopy = false);
|
||||
PartialProfile(const ProcParams* pp, const ParamsEdited* pe = nullptr);
|
||||
explicit PartialProfile(ProcParams* pp, ParamsEdited* pe = nullptr, bool fullCopy = false);
|
||||
explicit PartialProfile(const ProcParams* pp, const ParamsEdited* pe = nullptr);
|
||||
void deleteInstance();
|
||||
void clearGeneral();
|
||||
int load(const Glib::ustring& fName);
|
||||
|
@ -535,7 +535,7 @@ PartialProfile *ProfileStore::loadDynamicProfile (const FramesMetaData *im)
|
||||
return ret;
|
||||
}
|
||||
|
||||
ProfileStoreEntry::ProfileStoreEntry() : label (""), type (PSET_FOLDER), parentFolderId (0), folderId (0) {}
|
||||
ProfileStoreEntry::ProfileStoreEntry() : type (PSET_FOLDER), parentFolderId (0), folderId (0) {}
|
||||
|
||||
ProfileStoreEntry::ProfileStoreEntry (Glib::ustring label, PSEType type, unsigned short parentFolder, unsigned short folder) : label (label), type (type), parentFolderId (parentFolder), folderId (folder) {}
|
||||
|
||||
|
@ -429,6 +429,7 @@ RawImageSource::RawImageSource ()
|
||||
, plistener(nullptr)
|
||||
, scale_mul{}
|
||||
, c_black{}
|
||||
, c_white{}
|
||||
, cblacksom{}
|
||||
, ref_pre_mul{}
|
||||
, refwb_red(0.0)
|
||||
|
@ -1,82 +0,0 @@
|
||||
/*
|
||||
* 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/>.
|
||||
*/
|
||||
#include "rtengine.h"
|
||||
#include <iostream>
|
||||
//#include <giomm.h>
|
||||
#include <helpers.h>
|
||||
|
||||
class PListener :
|
||||
public rtengine::ProgressListener
|
||||
{
|
||||
public:
|
||||
void setProgressStr(const Glib::ustring& str)
|
||||
{
|
||||
std::cout << str << std::endl;
|
||||
}
|
||||
void setProgress(double p)
|
||||
{
|
||||
std::cout << p << std::endl;
|
||||
}
|
||||
void setProgressState(bool inProcessing)
|
||||
{
|
||||
}
|
||||
void error(const Glib::ustring& descr)
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
int main (int argc, char* argv[])
|
||||
{
|
||||
if (argc < 4) {
|
||||
std::cout << "Usage: rtcmd <infile> <paramfile> <outfile>" << std::endl;
|
||||
exit(1);
|
||||
}
|
||||
|
||||
rtengine::Settings s;
|
||||
s.demosaicMethod = "hphd";
|
||||
s.colorCorrectionSteps = 2;
|
||||
s.iccDirectory = "";
|
||||
s.colorimetricIntent = 1;
|
||||
s.monitorProfile = "";
|
||||
|
||||
Glib::thread_init ();
|
||||
rtengine::init (s, "");
|
||||
PListener pl;
|
||||
|
||||
rtengine::InitialImage* ii;
|
||||
int errorCode;
|
||||
ii = rtengine::InitialImage::load (argv[1], true, errorCode, &pl);
|
||||
|
||||
if (!ii) {
|
||||
ii = rtengine::InitialImage::load (argv[1], false, errorCode, &pl);
|
||||
}
|
||||
|
||||
if (!ii) {
|
||||
std::cout << "Input file not supported." << std::endl;
|
||||
exit(2);
|
||||
}
|
||||
|
||||
rtengine::procparams::ProcParams params;
|
||||
params.load (argv[2]);
|
||||
|
||||
rtengine::ProcessingJob* job = ProcessingJob::create (ii, params);
|
||||
rtengine::IImage16* res = rtengine::processImage (job, errorCode, &pl);
|
||||
res->saveToFile (argv[3]);
|
||||
}
|
||||
|
@ -132,7 +132,7 @@ Glib::ustring LFModifier::getDisplayString() const
|
||||
return "NONE";
|
||||
} else {
|
||||
Glib::ustring ret;
|
||||
Glib::ustring sep = "";
|
||||
Glib::ustring sep;
|
||||
if (flags_ & LF_MODIFY_DISTORTION) {
|
||||
ret += "distortion";
|
||||
sep = ", ";
|
||||
|
@ -476,14 +476,14 @@ void tmo_fattal02 (size_t width,
|
||||
|
||||
Array2Df* H = new Array2Df (width, height);
|
||||
float temp = 100.f / maxLum;
|
||||
float eps = 1e-4f;
|
||||
#ifdef _OPENMP
|
||||
#pragma omp parallel if(multithread)
|
||||
#endif
|
||||
{
|
||||
const float eps = 1e-4f;
|
||||
#ifdef __SSE2__
|
||||
vfloat epsv = F2V (eps);
|
||||
vfloat tempv = F2V (temp);
|
||||
const vfloat epsv = F2V(eps);
|
||||
const vfloat tempv = F2V(temp);
|
||||
#endif
|
||||
#ifdef _OPENMP
|
||||
#pragma omp for schedule(dynamic,16)
|
||||
@ -926,13 +926,13 @@ void solve_pde_fft (Array2Df *F, Array2Df *U, Array2Df *buf, bool multithread)/*
|
||||
// a solution which has no positive values: U_new(x,y)=U(x,y)-max
|
||||
// (not really needed but good for numerics as we later take exp(U))
|
||||
//DEBUG_STR << "solve_pde_fft: removing constant from solution" << std::endl;
|
||||
float max = 0.f;
|
||||
float maxVal = 0.f;
|
||||
#ifdef _OPENMP
|
||||
#pragma omp parallel for reduction(max:max) if(multithread)
|
||||
#pragma omp parallel for reduction(max:maxVal) if(multithread)
|
||||
#endif
|
||||
|
||||
for (int i = 0; i < width * height; i++) {
|
||||
max = std::max (max, (*U) (i));
|
||||
maxVal = std::max(maxVal, (*U)(i));
|
||||
}
|
||||
|
||||
#ifdef _OPENMP
|
||||
@ -940,7 +940,7 @@ void solve_pde_fft (Array2Df *F, Array2Df *U, Array2Df *buf, bool multithread)/*
|
||||
#endif
|
||||
|
||||
for (int i = 0; i < width * height; i++) {
|
||||
(*U) (i) -= max;
|
||||
(*U) (i) -= maxVal;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -380,7 +380,7 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
std::string EffectiveMaxApertureString = "";
|
||||
std::string EffectiveMaxApertureString;
|
||||
|
||||
if (!d100) {
|
||||
int EffectiveMaxApertureValue;
|
||||
|
@ -190,7 +190,7 @@ public:
|
||||
};
|
||||
|
||||
// a table of tags: id are offset from beginning and not identifiers
|
||||
class TagDirectoryTable: public TagDirectory
|
||||
class TagDirectoryTable: public TagDirectory, public rtengine::NonCopyable
|
||||
{
|
||||
protected:
|
||||
unsigned char *values; // Tags values are saved internally here
|
||||
@ -405,7 +405,6 @@ public:
|
||||
// Get the value as a double
|
||||
virtual double toDouble (const Tag* t, int ofs = 0)
|
||||
{
|
||||
double ud, dd;
|
||||
|
||||
switch (t->getType()) {
|
||||
case SBYTE:
|
||||
@ -428,10 +427,11 @@ public:
|
||||
return (double) ((int)sget4 (t->getValue() + ofs, t->getOrder()));
|
||||
|
||||
case SRATIONAL:
|
||||
case RATIONAL:
|
||||
ud = (int)sget4 (t->getValue() + ofs, t->getOrder());
|
||||
dd = (int)sget4 (t->getValue() + ofs + 4, t->getOrder());
|
||||
return dd == 0. ? 0. : (double)ud / (double)dd;
|
||||
case RATIONAL: {
|
||||
const double dividend = (int)sget4 (t->getValue() + ofs, t->getOrder());
|
||||
const double divisor = (int)sget4 (t->getValue() + ofs + 4, t->getOrder());
|
||||
return divisor == 0. ? 0. : dividend / divisor;
|
||||
}
|
||||
|
||||
case FLOAT:
|
||||
return double (sget4 (t->getValue() + ofs, t->getOrder()));
|
||||
|
@ -631,21 +631,21 @@ void Adjuster::setSliderValue(double val)
|
||||
if (val >= logPivot) {
|
||||
double range = vMax - logPivot;
|
||||
double x = (val - logPivot) / range;
|
||||
val = (vMin + mid) + std::log(x * (logBase - 1.0) + 1.0) / std::log(logBase) * mid;
|
||||
val = (vMin + mid) + std::log1p(x * (logBase - 1.0)) / std::log(logBase) * mid;
|
||||
} else {
|
||||
double range = logPivot - vMin;
|
||||
double x = (logPivot - val) / range;
|
||||
val = (vMin + mid) - std::log(x * (logBase - 1.0) + 1.0) / std::log(logBase) * mid;
|
||||
val = (vMin + mid) - std::log1p(x * (logBase - 1.0)) / std::log(logBase) * mid;
|
||||
}
|
||||
} else {
|
||||
if (val >= logPivot) {
|
||||
double range = vMax - logPivot;
|
||||
double x = (val - logPivot) / range;
|
||||
val = logPivot + std::log(x * (logBase - 1.0) + 1.0) / std::log(logBase) * range;
|
||||
val = logPivot + std::log1p(x * (logBase - 1.0)) / std::log(logBase) * range;
|
||||
} else {
|
||||
double range = logPivot - vMin;
|
||||
double x = (logPivot - val) / range;
|
||||
val = logPivot - std::log(x * (logBase - 1.0) + 1.0) / std::log(logBase) * range;
|
||||
val = logPivot - std::log1p(x * (logBase - 1.0)) / std::log(logBase) * range;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -811,7 +811,7 @@ Glib::ustring BatchQueue::calcAutoFileNameBase (const Glib::ustring& origFileNam
|
||||
break;
|
||||
}
|
||||
|
||||
Glib::ustring tok = "";
|
||||
Glib::ustring tok;
|
||||
|
||||
while ((i < origFileName.size()) && !(origFileName[i] == '\\' || origFileName[i] == '/')) {
|
||||
tok = tok + origFileName[i++];
|
||||
@ -857,7 +857,7 @@ Glib::ustring BatchQueue::calcAutoFileNameBase (const Glib::ustring& origFileNam
|
||||
// constructing full output path
|
||||
// printf ("path=|%s|\n", options.savePath.c_str());
|
||||
|
||||
Glib::ustring path = "";
|
||||
Glib::ustring path;
|
||||
|
||||
if (options.saveUsePathTemplate) {
|
||||
unsigned int ix = 0;
|
||||
|
@ -29,6 +29,7 @@
|
||||
#include "options.h"
|
||||
#include "threadutils.h"
|
||||
#include "thumbbrowserbase.h"
|
||||
#include "../rtengine/noncopyable.h"
|
||||
|
||||
class BatchQueueListener
|
||||
{
|
||||
@ -44,7 +45,8 @@ class FileCatalog;
|
||||
class BatchQueue final :
|
||||
public ThumbBrowserBase,
|
||||
public rtengine::BatchProcessingListener,
|
||||
public LWButtonListener
|
||||
public LWButtonListener,
|
||||
public rtengine::NonCopyable
|
||||
{
|
||||
public:
|
||||
explicit BatchQueue (FileCatalog* aFileCatalog);
|
||||
|
@ -40,7 +40,6 @@ BatchQueueEntry::BatchQueueEntry (rtengine::ProcessingJob* pjob, const rtengine:
|
||||
job(pjob),
|
||||
params(new rtengine::procparams::ProcParams(pparams)),
|
||||
progress(0),
|
||||
outFileName(""),
|
||||
sequence(0),
|
||||
forceFormatOpts(false),
|
||||
fast_pipeline(job->fastPipeline()),
|
||||
|
@ -26,6 +26,7 @@
|
||||
#include "thumbbrowserentrybase.h"
|
||||
#include "thumbnail.h"
|
||||
#include "bqentryupdater.h"
|
||||
#include "../rtengine/noncopyable.h"
|
||||
|
||||
class BatchQueueEntry;
|
||||
struct BatchQueueEntryIdleHelper {
|
||||
@ -34,7 +35,7 @@ struct BatchQueueEntryIdleHelper {
|
||||
int pending;
|
||||
};
|
||||
|
||||
class BatchQueueEntry : public ThumbBrowserEntryBase, public BQEntryUpdateListener
|
||||
class BatchQueueEntry : public ThumbBrowserEntryBase, public BQEntryUpdateListener, public rtengine::NonCopyable
|
||||
{
|
||||
|
||||
guint8* opreview;
|
||||
|
@ -100,13 +100,12 @@ void BatchQueueEntryUpdater::processThread ()
|
||||
break;
|
||||
}
|
||||
|
||||
rtengine::IImage8* img = nullptr;
|
||||
bool newBuffer = false;
|
||||
|
||||
if (current.thumbnail && current.pparams) {
|
||||
// the thumbnail and the pparams are provided, it means that we have to build the original preview image
|
||||
double tmpscale;
|
||||
img = current.thumbnail->processThumbImage (*current.pparams, current.oh, tmpscale);
|
||||
rtengine::IImage8* img = current.thumbnail->processThumbImage (*current.pparams, current.oh, tmpscale);
|
||||
|
||||
//current.thumbnail->decreaseRef (); // WARNING: decreasing refcount (and maybe deleting) thumbnail, with or without processed image
|
||||
if (img) {
|
||||
|
@ -23,7 +23,7 @@
|
||||
#include "curveeditorgroup.h"
|
||||
|
||||
Axis::Axis()
|
||||
: label(""), decimal(5), increment(0.001), pageIncrement(0.01), rangeLowerBound(0.), rangeUpperBound(1.)
|
||||
: decimal(5), increment(0.001), pageIncrement(0.01), rangeLowerBound(0.), rangeUpperBound(1.)
|
||||
{}
|
||||
|
||||
Axis::Axis(Glib::ustring label, unsigned int decimal, double increment, double pageIncrement, double valMin = 0.0, double valMax = 1.0)
|
||||
|
@ -1400,24 +1400,19 @@ void Crop::cropResized (int &x, int &y, int& x2, int& y2)
|
||||
y2 = maxh - 1;
|
||||
}
|
||||
|
||||
int X, Y;
|
||||
int W;
|
||||
|
||||
if (x < x2) {
|
||||
W = x2 - x + 1;
|
||||
X = x;
|
||||
} else {
|
||||
W = x - x2 + 1;
|
||||
X = x2;
|
||||
}
|
||||
|
||||
int H;
|
||||
|
||||
int Y;
|
||||
if (y < y2) {
|
||||
H = y2 - y + 1;
|
||||
Y = y;
|
||||
} else {
|
||||
H = y - y2 + 1;
|
||||
Y = y2;
|
||||
}
|
||||
|
||||
@ -1425,6 +1420,7 @@ void Crop::cropResized (int &x, int &y, int& x2, int& y2)
|
||||
W = maxw;
|
||||
}
|
||||
|
||||
int H;
|
||||
if (fixr->get_active()) {
|
||||
double r = getRatio ();
|
||||
|
||||
@ -1457,6 +1453,7 @@ void Crop::cropResized (int &x, int &y, int& x2, int& y2)
|
||||
}
|
||||
}
|
||||
|
||||
int X;
|
||||
if (x < x2) {
|
||||
W = x2 - x + 1;
|
||||
X = x;
|
||||
|
@ -2198,8 +2198,6 @@ void CropWindow::updateHoveredPicker (rtengine::Coord *imgPos)
|
||||
}
|
||||
|
||||
rtengine::Coord cropPos;
|
||||
float r=0.f, g=0.f, b=0.f;
|
||||
float rpreview=0.f, gpreview=0.f, bpreview=0.f;
|
||||
if (imgPos) {
|
||||
imageCoordToCropImage(imgPos->x, imgPos->y, cropPos.x, cropPos.y);
|
||||
hoveredPicker->setPosition (*imgPos);
|
||||
@ -2215,6 +2213,8 @@ void CropWindow::updateHoveredPicker (rtengine::Coord *imgPos)
|
||||
MyMutex::MyLock lock(cropHandler.cimg);
|
||||
|
||||
if (validity == LockableColorPicker::Validity::INSIDE) {
|
||||
float r=0.f, g=0.f, b=0.f;
|
||||
float rpreview=0.f, gpreview=0.f, bpreview=0.f;
|
||||
cropHandler.colorPick(cropPos, r, g, b, rpreview, gpreview, bpreview, hoveredPicker->getSize());
|
||||
hoveredPicker->setRGB (r, g, b, rpreview, gpreview, bpreview);
|
||||
}
|
||||
|
@ -31,6 +31,7 @@
|
||||
#include "cursormanager.h"
|
||||
#include "editbuffer.h"
|
||||
#include "editcoordsys.h"
|
||||
#include "../rtengine/noncopyable.h"
|
||||
|
||||
class CropWindow;
|
||||
|
||||
@ -45,7 +46,7 @@ public:
|
||||
};
|
||||
|
||||
class ImageArea;
|
||||
class CropWindow : public LWButtonListener, public CropDisplayHandler, public EditCoordSystem, public ObjectMOBuffer
|
||||
class CropWindow : public LWButtonListener, public CropDisplayHandler, public EditCoordSystem, public ObjectMOBuffer, public rtengine::NonCopyable
|
||||
{
|
||||
static bool initialized;
|
||||
|
||||
|
@ -25,6 +25,7 @@
|
||||
#include "editcallbacks.h"
|
||||
#include "mydiagonalcurve.h"
|
||||
#include "myflatcurve.h"
|
||||
#include "../rtengine/noncopyable.h"
|
||||
|
||||
class CurveEditorGroup;
|
||||
class CurveEditorSubGroup;
|
||||
@ -38,7 +39,7 @@ class CurveEditorSubGroup;
|
||||
/** @brief This class is an interface between RT and the curve editor group
|
||||
* It handles the methods related to a specific curve. It is created by CurveEditorGroup::addCurve
|
||||
*/
|
||||
class CurveEditor : public EditSubscriber
|
||||
class CurveEditor : public EditSubscriber, public rtengine::NonCopyable
|
||||
{
|
||||
|
||||
friend class CurveEditorGroup;
|
||||
|
@ -397,7 +397,7 @@ void CurveEditorGroup::setUnChanged (bool uc, CurveEditor* ce)
|
||||
}
|
||||
}
|
||||
|
||||
CurveEditorSubGroup::CurveEditorSubGroup(Glib::ustring& curveDir) : curveDir(curveDir), lastFilename(""), valLinear(0), valUnchanged(0), parent(nullptr)
|
||||
CurveEditorSubGroup::CurveEditorSubGroup(Glib::ustring& curveDir) : curveDir(curveDir), valLinear(0), valUnchanged(0), parent(nullptr)
|
||||
{
|
||||
leftBar = nullptr;
|
||||
bottomBar = nullptr;
|
||||
|
@ -70,7 +70,7 @@ public:
|
||||
* dialogs.
|
||||
*/
|
||||
|
||||
CurveEditorGroup(Glib::ustring& curveDir, Glib::ustring groupLabel = "");
|
||||
explicit CurveEditorGroup(Glib::ustring& curveDir, Glib::ustring groupLabel = "");
|
||||
~CurveEditorGroup() override;
|
||||
void newLine();
|
||||
void curveListComplete();
|
||||
|
@ -21,10 +21,11 @@
|
||||
|
||||
#include <gtkmm.h>
|
||||
#include "curveeditorgroup.h"
|
||||
#include "../rtengine/noncopyable.h"
|
||||
|
||||
class DiagonalCurveEditor;
|
||||
|
||||
class DiagonalCurveEditorSubGroup : public CurveEditorSubGroup, public SHCListener, public AdjusterListener
|
||||
class DiagonalCurveEditorSubGroup : public CurveEditorSubGroup, public SHCListener, public AdjusterListener, public rtengine::NonCopyable
|
||||
{
|
||||
|
||||
friend class DiagonalCurveEditor;
|
||||
|
@ -1377,7 +1377,7 @@ void EditorPanel::info_toggled ()
|
||||
infoString = M ("QINFO_NOEXIF");
|
||||
}
|
||||
|
||||
iareapanel->imageArea->setInfoText (infoString);
|
||||
iareapanel->imageArea->setInfoText (std::move(infoString));
|
||||
iareapanel->imageArea->infoEnabled (info->get_active ());
|
||||
}
|
||||
|
||||
|
@ -34,6 +34,7 @@
|
||||
#include "navigator.h"
|
||||
#include "progressconnector.h"
|
||||
#include "filepanel.h"
|
||||
#include "../rtengine/noncopyable.h"
|
||||
|
||||
class EditorPanel;
|
||||
class MyProgressBar;
|
||||
@ -52,7 +53,8 @@ class EditorPanel final :
|
||||
public rtengine::ProgressListener,
|
||||
public ThumbnailListener,
|
||||
public HistoryBeforeLineListener,
|
||||
public rtengine::HistogramListener
|
||||
public rtengine::HistogramListener,
|
||||
public rtengine::NonCopyable
|
||||
{
|
||||
public:
|
||||
explicit EditorPanel (FilePanel* filePanel = nullptr);
|
||||
|
@ -632,7 +632,7 @@ Glib::ustring ExifPanel::getSelection (bool onlyeditable)
|
||||
|
||||
Gtk::TreeModel::iterator iter = exifTreeModel->get_iter (rows[0]);
|
||||
|
||||
Glib::ustring ret = "";
|
||||
Glib::ustring ret;
|
||||
bool first = true;
|
||||
bool editable = false;
|
||||
|
||||
|
@ -20,7 +20,7 @@
|
||||
#include "multilangmgr.h"
|
||||
#include "rtimage.h"
|
||||
|
||||
FavoritBrowser::FavoritBrowser () : listener (NULL), lastSelectedDir ("")
|
||||
FavoritBrowser::FavoritBrowser () : listener (NULL)
|
||||
{
|
||||
|
||||
scrollw = Gtk::manage (new Gtk::ScrolledWindow ());
|
||||
|
@ -30,6 +30,7 @@
|
||||
#include "exportpanel.h"
|
||||
#include "extprog.h"
|
||||
#include "profilestorecombobox.h"
|
||||
#include "../rtengine/noncopyable.h"
|
||||
|
||||
class ProfileStoreLabel;
|
||||
class FileBrowser;
|
||||
@ -56,7 +57,8 @@ public:
|
||||
class FileBrowser : public ThumbBrowserBase,
|
||||
public LWButtonListener,
|
||||
public ExportPanelListener,
|
||||
public ProfileStoreListener
|
||||
public ProfileStoreListener,
|
||||
public rtengine::NonCopyable
|
||||
{
|
||||
private:
|
||||
typedef sigc::signal<void> type_trash_changed;
|
||||
|
@ -34,6 +34,7 @@
|
||||
#include "thumbimageupdater.h"
|
||||
#include "thumbnail.h"
|
||||
#include "thumbnaillistener.h"
|
||||
#include "../rtengine/noncopyable.h"
|
||||
|
||||
|
||||
class FileBrowserEntry;
|
||||
@ -46,7 +47,8 @@ struct FileBrowserEntryIdleHelper {
|
||||
class FileThumbnailButtonSet;
|
||||
class FileBrowserEntry : public ThumbBrowserEntryBase,
|
||||
public ThumbnailListener,
|
||||
public ThumbImageUpdateListener
|
||||
public ThumbImageUpdateListener,
|
||||
public rtengine::NonCopyable
|
||||
{
|
||||
|
||||
double scale;
|
||||
|
@ -457,8 +457,6 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) :
|
||||
hScrollPos[i] = 0;
|
||||
vScrollPos[i] = 0;
|
||||
}
|
||||
|
||||
selectedDirectory = "";
|
||||
}
|
||||
|
||||
FileCatalog::~FileCatalog()
|
||||
|
@ -32,6 +32,7 @@
|
||||
#include "previewloader.h"
|
||||
#include "multilangmgr.h"
|
||||
#include "threadutils.h"
|
||||
#include "../rtengine/noncopyable.h"
|
||||
|
||||
class FilePanel;
|
||||
/*
|
||||
@ -44,7 +45,8 @@ class FileCatalog : public Gtk::VBox,
|
||||
public PreviewLoaderListener,
|
||||
public FilterPanelListener,
|
||||
public FileBrowserListener,
|
||||
public ExportPanelListener
|
||||
public ExportPanelListener,
|
||||
public rtengine::NonCopyable
|
||||
{
|
||||
public:
|
||||
typedef sigc::slot<void, const Glib::ustring&> DirSelectionSlot;
|
||||
|
@ -31,12 +31,14 @@
|
||||
#include "filterpanel.h"
|
||||
#include "exportpanel.h"
|
||||
#include "progressconnector.h"
|
||||
#include "../rtengine/noncopyable.h"
|
||||
|
||||
class RTWindow;
|
||||
|
||||
class FilePanel final :
|
||||
public Gtk::HPaned,
|
||||
public FileSelectionListener
|
||||
public FileSelectionListener,
|
||||
public rtengine::NonCopyable
|
||||
{
|
||||
public:
|
||||
FilePanel ();
|
||||
|
@ -28,8 +28,6 @@
|
||||
#include "toolpanel.h"
|
||||
#include "wbprovider.h"
|
||||
|
||||
#include "../rtengine/noncopyable.h"
|
||||
|
||||
class FilmNegProvider
|
||||
{
|
||||
public:
|
||||
@ -39,7 +37,6 @@ public:
|
||||
};
|
||||
|
||||
class FilmNegative :
|
||||
public rtengine::NonCopyable,
|
||||
public ToolParamBlock,
|
||||
public AdjusterListener,
|
||||
public FoldableToolPanel,
|
||||
|
@ -21,10 +21,11 @@
|
||||
|
||||
#include <gtkmm.h>
|
||||
#include "curveeditorgroup.h"
|
||||
#include "../rtengine/noncopyable.h"
|
||||
|
||||
class FlatCurveEditor;
|
||||
|
||||
class FlatCurveEditorSubGroup: public CurveEditorSubGroup
|
||||
class FlatCurveEditorSubGroup: public CurveEditorSubGroup, public rtengine::NonCopyable
|
||||
{
|
||||
|
||||
friend class FlatCurveEditor;
|
||||
|
@ -86,7 +86,6 @@ FlatField::FlatField () : FoldableToolPanel(this, "flatfield", M("TP_FLATFIELD_L
|
||||
flatFieldFileReset->signal_clicked().connect( sigc::mem_fun(*this, &FlatField::flatFieldFile_Reset), true );
|
||||
flatFieldAutoSelectconn = flatFieldAutoSelect->signal_toggled().connect ( sigc::mem_fun(*this, &FlatField::flatFieldAutoSelectChanged), true);
|
||||
flatFieldBlurTypeconn = flatFieldBlurType->signal_changed().connect( sigc::mem_fun(*this, &FlatField::flatFieldBlurTypeChanged) );
|
||||
lastShortcutPath = "";
|
||||
|
||||
// Set filename filters
|
||||
b_filter_asCurrent = false;
|
||||
|
@ -298,17 +298,14 @@ void drawCrop (Cairo::RefPtr<Cairo::Context> cr, int imx, int imy, int imw, int
|
||||
cr->line_to (rectx1, recty1);
|
||||
cr->stroke ();
|
||||
cr->set_source_rgba (0.0, 0.0, 0.0, 0.618);
|
||||
std::valarray<double> ds (1);
|
||||
ds[0] = 4;
|
||||
cr->set_dash (ds, 0);
|
||||
cr->set_dash (std::valarray<double>({4}), 0);
|
||||
cr->move_to (rectx1, recty1);
|
||||
cr->line_to (rectx2, recty1);
|
||||
cr->line_to (rectx2, recty2);
|
||||
cr->line_to (rectx1, recty2);
|
||||
cr->line_to (rectx1, recty1);
|
||||
cr->stroke ();
|
||||
ds.resize (0);
|
||||
cr->set_dash (ds, 0);
|
||||
cr->set_dash (std::valarray<double>(), 0);
|
||||
|
||||
if (cparams.guide != "Rule of diagonals" && cparams.guide != "Golden Triangle 1" && cparams.guide != "Golden Triangle 2") {
|
||||
// draw guide lines
|
||||
@ -446,14 +443,11 @@ void drawCrop (Cairo::RefPtr<Cairo::Context> cr, int imx, int imy, int imw, int
|
||||
cr->line_to (rectx2, recty2);
|
||||
cr->stroke ();
|
||||
cr->set_source_rgba (0.0, 0.0, 0.0, 0.618);
|
||||
std::valarray<double> ds (1);
|
||||
ds[0] = 4;
|
||||
cr->set_dash (ds, 0);
|
||||
cr->set_dash (std::valarray<double>({4}), 0);
|
||||
cr->move_to (rectx1, recty1);
|
||||
cr->line_to (rectx2, recty2);
|
||||
cr->stroke ();
|
||||
ds.resize (0);
|
||||
cr->set_dash (ds, 0);
|
||||
cr->set_dash (std::valarray<double>(), 0);
|
||||
|
||||
double height = recty2 - recty1;
|
||||
double width = rectx2 - rectx1;
|
||||
@ -470,14 +464,11 @@ void drawCrop (Cairo::RefPtr<Cairo::Context> cr, int imx, int imy, int imw, int
|
||||
cr->line_to (rectx1 + x, recty1 + y);
|
||||
cr->stroke ();
|
||||
cr->set_source_rgba (0.0, 0.0, 0.0, 0.618);
|
||||
ds.resize (1);
|
||||
ds[0] = 4;
|
||||
cr->set_dash (ds, 0);
|
||||
cr->set_dash (std::valarray<double>({4}), 0);
|
||||
cr->move_to (rectx1, recty2);
|
||||
cr->line_to (rectx1 + x, recty1 + y);
|
||||
cr->stroke ();
|
||||
ds.resize (0);
|
||||
cr->set_dash (ds, 0);
|
||||
cr->set_dash (std::valarray<double>(), 0);
|
||||
|
||||
x = width - (a * b) / height;
|
||||
y = (b * (d - a)) / width;
|
||||
@ -486,14 +477,11 @@ void drawCrop (Cairo::RefPtr<Cairo::Context> cr, int imx, int imy, int imw, int
|
||||
cr->line_to (rectx1 + x, recty1 + y);
|
||||
cr->stroke ();
|
||||
cr->set_source_rgba (0.0, 0.0, 0.0, 0.618);
|
||||
ds.resize (1);
|
||||
ds[0] = 4;
|
||||
cr->set_dash (ds, 0);
|
||||
cr->set_dash (std::valarray<double>({4}), 0);
|
||||
cr->move_to (rectx2, recty1);
|
||||
cr->line_to (rectx1 + x, recty1 + y);
|
||||
cr->stroke ();
|
||||
ds.resize (0);
|
||||
cr->set_dash (ds, 0);
|
||||
cr->set_dash (std::valarray<double>(), 0);
|
||||
}
|
||||
}
|
||||
|
||||
@ -675,12 +663,6 @@ MyExpander::MyExpander(bool useEnabled, Glib::ustring titleLabel) :
|
||||
|
||||
statusImage->set_can_focus(false);
|
||||
|
||||
Glib::ustring str("-");
|
||||
|
||||
if (!titleLabel.empty()) {
|
||||
str = titleLabel;
|
||||
}
|
||||
|
||||
label = Gtk::manage(new Gtk::Label());
|
||||
setExpandAlignProperties(label, true, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER);
|
||||
label->set_markup(Glib::ustring("<b>") + escapeHtmlChars(titleLabel) + Glib::ustring("</b>"));
|
||||
@ -1604,7 +1586,7 @@ bool BackBuffer::setDrawRectangle(Glib::RefPtr<Gdk::Window> window, int newX, in
|
||||
|
||||
x = newX;
|
||||
y = newY;
|
||||
if (newH > 0) {
|
||||
if (newW > 0) {
|
||||
w = newW;
|
||||
}
|
||||
if (newH > 0) {
|
||||
@ -1637,7 +1619,7 @@ bool BackBuffer::setDrawRectangle(Cairo::Format format, int newX, int newY, int
|
||||
|
||||
x = newX;
|
||||
y = newY;
|
||||
if (newH > 0) {
|
||||
if (newW > 0) {
|
||||
w = newW;
|
||||
}
|
||||
if (newH > 0) {
|
||||
|
@ -400,7 +400,7 @@ protected:
|
||||
void set_none();
|
||||
|
||||
public:
|
||||
MyFileChooserButton(const Glib::ustring &title, Gtk::FileChooserAction action=Gtk::FILE_CHOOSER_ACTION_OPEN);
|
||||
explicit MyFileChooserButton(const Glib::ustring &title, Gtk::FileChooserAction action=Gtk::FILE_CHOOSER_ACTION_OPEN);
|
||||
|
||||
sigc::signal<void> &signal_selection_changed();
|
||||
sigc::signal<void> &signal_file_set();
|
||||
|
@ -464,7 +464,6 @@ void HistogramRGBArea::updateBackBuffer (int r, int g, int b, const Glib::ustrin
|
||||
|
||||
if (surface) {
|
||||
Cairo::RefPtr<Cairo::Context> cc = Cairo::Context::create(surface);
|
||||
Glib::RefPtr<Gtk::StyleContext> style = get_style_context();
|
||||
|
||||
cc->set_source_rgba (0., 0., 0., 0.);
|
||||
cc->set_operator (Cairo::OPERATOR_CLEAR);
|
||||
@ -616,7 +615,6 @@ void HistogramRGBArea::on_realize ()
|
||||
{
|
||||
|
||||
Gtk::DrawingArea::on_realize();
|
||||
Glib::RefPtr<Gdk::Window> window = get_window();
|
||||
add_events(Gdk::BUTTON_PRESS_MASK);
|
||||
}
|
||||
|
||||
@ -984,7 +982,6 @@ void HistogramArea::on_realize ()
|
||||
{
|
||||
|
||||
Gtk::DrawingArea::on_realize();
|
||||
Glib::RefPtr<Gdk::Window> window = get_window();
|
||||
add_events(Gdk::POINTER_MOTION_MASK | Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK);
|
||||
}
|
||||
|
||||
@ -1037,8 +1034,6 @@ void HistogramArea::drawMarks(Cairo::RefPtr<Cairo::Context> &cr,
|
||||
bool HistogramArea::on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr)
|
||||
{
|
||||
|
||||
Glib::RefPtr<Gdk::Window> window = get_window();
|
||||
|
||||
if (get_width() != oldwidth || get_height() != oldheight || isDirty ()) {
|
||||
updateBackBuffer ();
|
||||
}
|
||||
|
@ -28,6 +28,7 @@
|
||||
#include "guiutils.h"
|
||||
|
||||
#include "pointermotionlistener.h"
|
||||
#include "../rtengine/noncopyable.h"
|
||||
|
||||
class HistogramArea;
|
||||
struct HistogramAreaIdleHelper {
|
||||
@ -51,7 +52,7 @@ public:
|
||||
double log (double vsize, double val);
|
||||
};
|
||||
|
||||
class HistogramRGBArea : public Gtk::DrawingArea, public BackBuffer, private HistogramScaling
|
||||
class HistogramRGBArea : public Gtk::DrawingArea, public BackBuffer, private HistogramScaling, public rtengine::NonCopyable
|
||||
{
|
||||
private:
|
||||
typedef const double (*TMatrix)[3];
|
||||
@ -114,7 +115,7 @@ public:
|
||||
virtual void toggleButtonMode() = 0;
|
||||
};
|
||||
|
||||
class HistogramArea : public Gtk::DrawingArea, public BackBuffer, private HistogramScaling
|
||||
class HistogramArea : public Gtk::DrawingArea, public BackBuffer, private HistogramScaling, public rtengine::NonCopyable
|
||||
{
|
||||
public:
|
||||
typedef sigc::signal<void, double> type_signal_factor_changed;
|
||||
@ -172,7 +173,7 @@ private:
|
||||
void get_preferred_width_for_height_vfunc (int height, int &minimum_width, int &natural_width) const override;
|
||||
};
|
||||
|
||||
class HistogramPanel : public Gtk::Grid, public PointerMotionListener, public DrawModeListener
|
||||
class HistogramPanel : public Gtk::Grid, public PointerMotionListener, public DrawModeListener, public rtengine::NonCopyable
|
||||
{
|
||||
|
||||
protected:
|
||||
|
@ -674,8 +674,6 @@ void ICCProfileCreator::savePressed()
|
||||
//necessary for V2 profile
|
||||
|
||||
if (!v2except) {
|
||||
std::string is_RTv4 = "";
|
||||
|
||||
//used partially for v4, and in case of if we want to back to old manner for v2
|
||||
if (primariesPreset == "ACES-AP0" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.ACESp0)) {
|
||||
sNewProfile = options.rtSettings.ACESp0;
|
||||
@ -687,11 +685,9 @@ void ICCProfileCreator::savePressed()
|
||||
sNewProfile = options.rtSettings.adobe;
|
||||
sPrimariesPreset = "Medium";
|
||||
} else if (primariesPreset == "ProPhoto" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.prophoto)) {
|
||||
is_RTv4 = options.rtSettings.prophoto.substr(0, 4);
|
||||
|
||||
if (is_RTv4 == "RTv4") {
|
||||
if (options.rtSettings.prophoto.substr(0, 4) == "RTv4") {
|
||||
options.rtSettings.prophoto = "RTv2_Large";
|
||||
};
|
||||
}
|
||||
|
||||
sNewProfile = options.rtSettings.prophoto;
|
||||
|
||||
@ -703,32 +699,26 @@ void ICCProfileCreator::savePressed()
|
||||
sNewProfile = options.rtSettings.srgb;
|
||||
sPrimariesPreset = "sRGB";
|
||||
} else if (primariesPreset == "Widegamut" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.widegamut)) {
|
||||
is_RTv4 = options.rtSettings.widegamut.substr(0, 4);
|
||||
|
||||
if (is_RTv4 == "RTv4") {
|
||||
if (options.rtSettings.widegamut.substr(0, 4) == "RTv4") {
|
||||
options.rtSettings.widegamut = "RTv2_Wide";
|
||||
};
|
||||
}
|
||||
|
||||
sNewProfile = options.rtSettings.widegamut;
|
||||
|
||||
sPrimariesPreset = "Wide";
|
||||
} else if (primariesPreset == "BestRGB" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.best)) {
|
||||
is_RTv4 = options.rtSettings.best.substr(0, 4);
|
||||
|
||||
if (is_RTv4 == "RTv4") {
|
||||
if (options.rtSettings.best.substr(0, 4) == "RTv4") {
|
||||
options.rtSettings.best = "RTv2_Best";
|
||||
};
|
||||
}
|
||||
|
||||
sNewProfile = options.rtSettings.best;
|
||||
|
||||
sPrimariesPreset = "Best";
|
||||
} else if (primariesPreset == "BetaRGB" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.beta)) {
|
||||
sNewProfile = options.rtSettings.beta;
|
||||
is_RTv4 = options.rtSettings.beta.substr(0, 4);
|
||||
|
||||
if (is_RTv4 == "RTv4") {
|
||||
if (options.rtSettings.beta.substr(0, 4) == "RTv4") {
|
||||
options.rtSettings.widegamut = "RTv2_Beta";
|
||||
};
|
||||
}
|
||||
|
||||
sPrimariesPreset = "Beta";
|
||||
} else if (primariesPreset == "BruceRGB" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.bruce)) {
|
||||
|
@ -34,7 +34,7 @@ using namespace rtengine::procparams;
|
||||
|
||||
extern Options options;
|
||||
|
||||
ICMPanel::ICMPanel() : FoldableToolPanel(this, "icm", M("TP_ICM_LABEL")), iunchanged(nullptr), icmplistener(nullptr), lastRefFilename(""), camName("")
|
||||
ICMPanel::ICMPanel() : FoldableToolPanel(this, "icm", M("TP_ICM_LABEL")), iunchanged(nullptr), icmplistener(nullptr)
|
||||
{
|
||||
auto m = ProcEventMapper::getInstance();
|
||||
EvICMprimariMethod = m->newEvent(GAMMA, "HISTORY_MSG_ICM_OUTPUT_PRIMARIES");
|
||||
@ -304,8 +304,6 @@ ICMPanel::ICMPanel() : FoldableToolPanel(this, "icm", M("TP_ICM_LABEL")), iuncha
|
||||
ipDialog->set_show_hidden(true); // ProgramData is hidden on Windows
|
||||
#endif
|
||||
|
||||
oldip = "";
|
||||
|
||||
wprofnamesconn = wProfNames->signal_changed().connect(sigc::mem_fun(*this, &ICMPanel::wpChanged));
|
||||
oprofnamesconn = oProfNames->signal_changed().connect(sigc::mem_fun(*this, &ICMPanel::opChanged));
|
||||
orendintentconn = oRendIntent->signal_changed().connect(sigc::mem_fun(*this, &ICMPanel::oiChanged));
|
||||
@ -617,8 +615,6 @@ void ICMPanel::write(ProcParams* pp, ParamsEdited* pedited)
|
||||
} else {
|
||||
pp->icm.inputProfile = ""; // just a directory
|
||||
}
|
||||
|
||||
Glib::ustring p = Glib::path_get_dirname(ipDialog->get_filename());
|
||||
}
|
||||
|
||||
pp->icm.workingProfile = wProfNames->get_active_text();
|
||||
|
@ -29,7 +29,6 @@
|
||||
ImageArea::ImageArea (ImageAreaPanel* p) : parent(p), fullImageWidth(0), fullImageHeight(0)
|
||||
{
|
||||
|
||||
infotext = "";
|
||||
cropgl = nullptr;
|
||||
pmlistener = nullptr;
|
||||
pmhlistener = nullptr;
|
||||
@ -148,7 +147,7 @@ void ImageArea::on_style_updated ()
|
||||
void ImageArea::setInfoText (Glib::ustring text)
|
||||
{
|
||||
|
||||
infotext = text;
|
||||
infotext = std::move(text);
|
||||
|
||||
Glib::RefPtr<Pango::Context> context = get_pango_context () ;
|
||||
Pango::FontDescription fontd(get_style_context()->get_font());
|
||||
@ -160,7 +159,7 @@ void ImageArea::setInfoText (Glib::ustring text)
|
||||
|
||||
// create text layout
|
||||
Glib::RefPtr<Pango::Layout> ilayout = create_pango_layout("");
|
||||
ilayout->set_markup(text);
|
||||
ilayout->set_markup(infotext);
|
||||
|
||||
// get size of the text block
|
||||
int iw, ih;
|
||||
|
@ -83,7 +83,6 @@ InspectorBuffer::~InspectorBuffer() {
|
||||
|
||||
Inspector::Inspector () : currImage(nullptr), zoom(0.0), active(false)
|
||||
{
|
||||
Glib::RefPtr<Gtk::StyleContext> style = get_style_context();
|
||||
set_name("Inspector");
|
||||
}
|
||||
|
||||
@ -115,7 +114,6 @@ bool Inspector::on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr)
|
||||
// compute the displayed area
|
||||
rtengine::Coord availableSize;
|
||||
rtengine::Coord topLeft;
|
||||
rtengine::Coord displayedSize;
|
||||
rtengine::Coord dest(0, 0);
|
||||
availableSize.x = win->get_width();
|
||||
availableSize.y = win->get_height();
|
||||
@ -125,7 +123,6 @@ bool Inspector::on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr)
|
||||
if (imW < availableSize.x) {
|
||||
// center the image in the available space along X
|
||||
topLeft.x = 0;
|
||||
displayedSize.x = availableSize.x;
|
||||
dest.x = (availableSize.x - imW) / 2;
|
||||
} else {
|
||||
// partial image display
|
||||
@ -139,7 +136,6 @@ bool Inspector::on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr)
|
||||
if (imH < availableSize.y) {
|
||||
// center the image in the available space along Y
|
||||
topLeft.y = 0;
|
||||
displayedSize.y = availableSize.y;
|
||||
dest.y = (availableSize.y - imH) / 2;
|
||||
} else {
|
||||
// partial image display
|
||||
|
@ -256,7 +256,7 @@ int processLineParams ( int argc, char **argv )
|
||||
{
|
||||
rtengine::procparams::PartialProfile *rawParams = nullptr, *imgParams = nullptr;
|
||||
std::vector<Glib::ustring> inputFiles;
|
||||
Glib::ustring outputPath = "";
|
||||
Glib::ustring outputPath;
|
||||
std::vector<rtengine::procparams::PartialProfile*> processingParams;
|
||||
bool outputDirectory = false;
|
||||
bool leaveUntouched = false;
|
||||
@ -271,7 +271,7 @@ int processLineParams ( int argc, char **argv )
|
||||
int subsampling = 3;
|
||||
int bits = -1;
|
||||
bool isFloat = false;
|
||||
std::string outputType = "";
|
||||
std::string outputType;
|
||||
unsigned errors = 0;
|
||||
|
||||
for ( int iArg = 1; iArg < argc; iArg++) {
|
||||
|
@ -26,9 +26,8 @@ using namespace rtengine;
|
||||
using namespace rtengine::procparams;
|
||||
|
||||
|
||||
MetaDataPanel::MetaDataPanel()
|
||||
MetaDataPanel::MetaDataPanel() : EvMetaDataMode(ProcEventMapper::getInstance()->newEvent(M_VOID, "HISTORY_MSG_METADATA_MODE"))
|
||||
{
|
||||
EvMetaDataMode = ProcEventMapper::getInstance()->newEvent(M_VOID, "HISTORY_MSG_METADATA_MODE");
|
||||
|
||||
Gtk::HBox *box = Gtk::manage(new Gtk::HBox());
|
||||
box->pack_start(*Gtk::manage(new Gtk::Label(M("TP_METADATA_MODE") + ": ")), Gtk::PACK_SHRINK, 4);
|
||||
|
@ -28,6 +28,7 @@
|
||||
#include "../rtengine/LUT.h"
|
||||
#include "guiutils.h"
|
||||
#include "options.h"
|
||||
#include "../rtengine/noncopyable.h"
|
||||
|
||||
#define RADIUS 3.5 /** radius of the control points ; must be x.5 to target the center of a pixel */
|
||||
#define CBAR_WIDTH 10 /** inner width of the colored bar (border excluded) */
|
||||
@ -55,7 +56,7 @@ enum SnapToType {
|
||||
class MyCurveIdleHelper;
|
||||
class CurveEditor;
|
||||
|
||||
class MyCurve : public Gtk::DrawingArea, public BackBuffer, public ColorCaller, public CoordinateProvider
|
||||
class MyCurve : public Gtk::DrawingArea, public BackBuffer, public ColorCaller, public CoordinateProvider, public rtengine::NonCopyable
|
||||
{
|
||||
friend class MyCurveIdleHelper;
|
||||
|
||||
|
@ -637,13 +637,8 @@ bool MyDiagonalCurve::handleEvents (GdkEvent* event)
|
||||
setDirty(true);
|
||||
draw (lit_point);
|
||||
new_type = CSArrow;
|
||||
retval = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (buttonPressed) {
|
||||
retval = true;
|
||||
}
|
||||
} else { // if (edited_point > -1)
|
||||
if (event->button.button == 3) {
|
||||
// do we edit another point?
|
||||
@ -679,7 +674,6 @@ bool MyDiagonalCurve::handleEvents (GdkEvent* event)
|
||||
|
||||
newBoundaries.at(1).minVal = 0.;
|
||||
newBoundaries.at(1).maxVal = 1.;
|
||||
retval = true;
|
||||
editedPos.at(0) = curve.x.at(edited_point);
|
||||
editedPos.at(1) = curve.y.at(edited_point);
|
||||
coordinateAdjuster->switchAdjustedPoint(editedPos, newBoundaries);
|
||||
|
@ -556,7 +556,7 @@ bool MyFlatCurve::getHandles(int n)
|
||||
if (!n) {
|
||||
// first point, the left handle is then computed with the last point's right handle
|
||||
prevX = curve.x.at(N - 1) - 1.0;
|
||||
nextX = curve.x.at(n + 1);
|
||||
nextX = curve.x.at(1);
|
||||
} else if (n == N - 1) {
|
||||
// last point, the right handle is then computed with the first point's left handle
|
||||
prevX = curve.x.at(n - 1);
|
||||
@ -745,7 +745,6 @@ bool MyFlatCurve::handleEvents (GdkEvent* event)
|
||||
newBoundaries.at(2).maxVal = 1.;
|
||||
newBoundaries.at(3).minVal = 0.;
|
||||
newBoundaries.at(3).maxVal = 1.;
|
||||
retval = true;
|
||||
editedPos.at(0) = curve.x.at(edited_point);
|
||||
editedPos.at(1) = curve.y.at(edited_point);
|
||||
editedPos.at(2) = curve.leftTangent.at(edited_point);
|
||||
|
@ -1112,20 +1112,17 @@ void ParamsEdited::initFrom(const std::vector<rtengine::procparams::ProcParams>&
|
||||
wavelet.exptoning = wavelet.exptoning && p.wavelet.exptoning == other.wavelet.exptoning;
|
||||
wavelet.expnoise = wavelet.expnoise && p.wavelet.expnoise == other.wavelet.expnoise;
|
||||
|
||||
for (int i = 0; i < 9; i++) {
|
||||
wavelet.c[i] = wavelet.c[i] && p.wavelet.c[i] == other.wavelet.c[i];
|
||||
}
|
||||
|
||||
for (int i = 0; i < 9; i++) {
|
||||
wavelet.ch[i] = wavelet.ch[i] && p.wavelet.ch[i] == other.wavelet.ch[i];
|
||||
for (int level = 0; level < 9; ++level) {
|
||||
wavelet.c[level] = wavelet.c[level] && p.wavelet.c[level] == other.wavelet.c[level];
|
||||
wavelet.ch[level] = wavelet.ch[level] && p.wavelet.ch[level] == other.wavelet.ch[level];
|
||||
}
|
||||
|
||||
dirpyrequalizer.enabled = dirpyrequalizer.enabled && p.dirpyrequalizer.enabled == other.dirpyrequalizer.enabled;
|
||||
dirpyrequalizer.gamutlab = dirpyrequalizer.gamutlab && p.dirpyrequalizer.gamutlab == other.dirpyrequalizer.gamutlab;
|
||||
dirpyrequalizer.cbdlMethod = dirpyrequalizer.cbdlMethod && p.dirpyrequalizer.cbdlMethod == other.dirpyrequalizer.cbdlMethod;
|
||||
|
||||
for (int i = 0; i < 6; i++) {
|
||||
dirpyrequalizer.mult[i] = dirpyrequalizer.mult[i] && p.dirpyrequalizer.mult[i] == other.dirpyrequalizer.mult[i];
|
||||
for (int level = 0; level < 6; ++level) {
|
||||
dirpyrequalizer.mult[level] = dirpyrequalizer.mult[level] && p.dirpyrequalizer.mult[level] == other.dirpyrequalizer.mult[level];
|
||||
}
|
||||
|
||||
dirpyrequalizer.threshold = dirpyrequalizer.threshold && p.dirpyrequalizer.threshold == other.dirpyrequalizer.threshold;
|
||||
|
@ -47,7 +47,7 @@ public:
|
||||
type_signal_item_selected signal_item_selected();
|
||||
Gtk::Grid* buttonGroup; // this is the widget to be packed
|
||||
|
||||
PopUpCommon (Gtk::Button* button, const Glib::ustring& label = "");
|
||||
explicit PopUpCommon (Gtk::Button* button, const Glib::ustring& label = "");
|
||||
virtual ~PopUpCommon ();
|
||||
bool addEntry (const Glib::ustring& fileName, const Glib::ustring& label);
|
||||
int getEntryCount () const;
|
||||
|
@ -28,6 +28,7 @@
|
||||
#include "guiutils.h"
|
||||
|
||||
#include "../rtengine/rtengine.h"
|
||||
#include "../rtengine/noncopyable.h"
|
||||
|
||||
class PreviewListener
|
||||
{
|
||||
@ -44,7 +45,7 @@ struct PreviewHandlerIdleHelper {
|
||||
int pending;
|
||||
};
|
||||
|
||||
class PreviewHandler : public rtengine::PreviewImageListener
|
||||
class PreviewHandler : public rtengine::PreviewImageListener, public rtengine::NonCopyable
|
||||
{
|
||||
private:
|
||||
friend int setImageUI (void* data);
|
||||
|
@ -42,7 +42,7 @@ void ProfilePanel::cleanup ()
|
||||
delete partialProfileDlg;
|
||||
}
|
||||
|
||||
ProfilePanel::ProfilePanel () : storedPProfile(nullptr), lastFilename(""), imagePath(""), lastSavedPSE(nullptr), customPSE(nullptr)
|
||||
ProfilePanel::ProfilePanel () : storedPProfile(nullptr), lastSavedPSE(nullptr), customPSE(nullptr)
|
||||
{
|
||||
|
||||
tpc = nullptr;
|
||||
|
@ -28,8 +28,9 @@
|
||||
#include "guiutils.h"
|
||||
#include "profilestorecombobox.h"
|
||||
#include "rtimage.h"
|
||||
#include "../rtengine/noncopyable.h"
|
||||
|
||||
class ProfilePanel : public Gtk::Grid, public PParamsChangeListener, public ProfileStoreListener
|
||||
class ProfilePanel : public Gtk::Grid, public PParamsChangeListener, public ProfileStoreListener, public rtengine::NonCopyable
|
||||
{
|
||||
|
||||
private:
|
||||
|
@ -37,12 +37,10 @@ int RTImage::scaleBack = 0;
|
||||
|
||||
RTImage::RTImage () {}
|
||||
|
||||
RTImage::RTImage (RTImage &other)
|
||||
RTImage::RTImage (RTImage &other) : surface(other.surface), pixbuf(other.pixbuf)
|
||||
{
|
||||
dpiBack = other.dpiBack;
|
||||
scaleBack = other.scaleBack;
|
||||
pixbuf = other.pixbuf;
|
||||
surface = other.surface;
|
||||
if (pixbuf) {
|
||||
set(pixbuf);
|
||||
} else if (surface) {
|
||||
|
@ -38,11 +38,11 @@ protected:
|
||||
public:
|
||||
RTImage ();
|
||||
RTImage (RTImage &other);
|
||||
RTImage (Glib::RefPtr<Gdk::Pixbuf> &pixbuf);
|
||||
RTImage (Cairo::RefPtr<Cairo::ImageSurface> &surf);
|
||||
RTImage(Cairo::RefPtr<Cairo::ImageSurface> other);
|
||||
RTImage (Glib::RefPtr<RTImage> &other);
|
||||
RTImage (const Glib::ustring& fileName, const Glib::ustring& rtlFileName = Glib::ustring());
|
||||
explicit RTImage (Glib::RefPtr<Gdk::Pixbuf> &pixbuf);
|
||||
explicit RTImage (Cairo::RefPtr<Cairo::ImageSurface> &surf);
|
||||
explicit RTImage(Cairo::RefPtr<Cairo::ImageSurface> other);
|
||||
explicit RTImage (Glib::RefPtr<RTImage> &other);
|
||||
explicit RTImage (const Glib::ustring& fileName, const Glib::ustring& rtlFileName = Glib::ustring());
|
||||
|
||||
void setImage (const Glib::ustring& fileName, const Glib::ustring& rtlFileName = Glib::ustring());
|
||||
void changeImage (const Glib::ustring& imageName);
|
||||
|
@ -30,7 +30,7 @@ class RTSurface :
|
||||
{
|
||||
public:
|
||||
RTSurface();
|
||||
RTSurface(const Glib::ustring& fileName, const Glib::ustring& rtlFileName = {});
|
||||
explicit RTSurface(const Glib::ustring& fileName, const Glib::ustring& rtlFileName = {});
|
||||
|
||||
void setImage(const Glib::ustring& fileName, const Glib::ustring& rtlFileName = {});
|
||||
|
||||
|
@ -173,8 +173,8 @@ RTWindow::RTWindow ()
|
||||
} else {
|
||||
Glib::RefPtr<Gtk::StyleContext> style = Gtk::StyleContext::create();
|
||||
Pango::FontDescription pfd = style->get_font(Gtk::STATE_FLAG_NORMAL);
|
||||
int pt;
|
||||
if (pfd.get_set_fields() & Pango::FONT_MASK_SIZE) {
|
||||
int pt;
|
||||
int fontSize = pfd.get_size();
|
||||
bool isPix = pfd.get_size_is_absolute();
|
||||
int resolution = (int)style->get_screen()->get_resolution();
|
||||
@ -254,8 +254,6 @@ RTWindow::RTWindow ()
|
||||
#if defined(__APPLE__)
|
||||
{
|
||||
osxApp = (GtkosxApplication *)g_object_new (GTKOSX_TYPE_APPLICATION, NULL);
|
||||
gboolean falseval = FALSE;
|
||||
gboolean trueval = TRUE;
|
||||
RTWindow *rtWin = this;
|
||||
g_signal_connect (osxApp, "NSApplicationBlockTermination", G_CALLBACK (osx_should_quit_cb), rtWin);
|
||||
g_signal_connect (osxApp, "NSApplicationWillTerminate", G_CALLBACK (osx_will_quit_cb), rtWin);
|
||||
|
@ -29,8 +29,9 @@
|
||||
#if defined(__APPLE__)
|
||||
#include <gtkosxapplication.h>
|
||||
#endif
|
||||
#include "../rtengine/noncopyable.h"
|
||||
|
||||
class RTWindow : public Gtk::Window, public rtengine::ProgressListener
|
||||
class RTWindow : public Gtk::Window, public rtengine::ProgressListener, public rtengine::NonCopyable
|
||||
{
|
||||
|
||||
private:
|
||||
|
@ -23,6 +23,7 @@
|
||||
#include "adjuster.h"
|
||||
#include "guiutils.h"
|
||||
#include "options.h"
|
||||
#include "../rtengine/noncopyable.h"
|
||||
|
||||
class FormatChangeListener
|
||||
{
|
||||
@ -31,7 +32,7 @@ public:
|
||||
virtual void formatChanged(const Glib::ustring& format) = 0;
|
||||
};
|
||||
|
||||
class SaveFormatPanel : public Gtk::Grid, public AdjusterListener
|
||||
class SaveFormatPanel : public Gtk::Grid, public AdjusterListener, public rtengine::NonCopyable
|
||||
{
|
||||
|
||||
protected:
|
||||
|
@ -27,15 +27,13 @@ extern Glib::ustring creditsPath;
|
||||
extern Glib::ustring licensePath;
|
||||
extern Glib::ustring versionString;
|
||||
|
||||
SplashImage::SplashImage ()
|
||||
SplashImage::SplashImage () : surface(RTImage::createImgSurfFromFile("splash.png"))
|
||||
{
|
||||
surface = RTImage::createImgSurfFromFile ("splash.png");
|
||||
}
|
||||
|
||||
bool SplashImage::on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr)
|
||||
{
|
||||
|
||||
Glib::RefPtr<Gdk::Window> window = get_window();
|
||||
cr->set_source(surface, 0., 0.);
|
||||
cr->rectangle(0, 0, surface->get_width(), surface->get_height());
|
||||
cr->fill();
|
||||
|
@ -30,7 +30,7 @@
|
||||
ThresholdSelector::ThresholdSelector(double minValueBottom, double maxValueBottom, double defBottom, Glib::ustring labelBottom, unsigned int precisionBottom,
|
||||
double minValueTop, double maxValueTop, double defTop, Glib::ustring labelTop, unsigned int precisionTop,
|
||||
ThresholdCurveProvider* curveProvider)
|
||||
: coloredBar(RTO_Left2Right)
|
||||
: separatedLabelBottom(std::move(labelBottom)), separatedLabelTop(std::move(labelTop)), coloredBar(RTO_Left2Right)
|
||||
{
|
||||
positions[TS_BOTTOMLEFT] = defPos[TS_BOTTOMLEFT] = defBottom;
|
||||
positions[TS_TOPLEFT] = defPos[TS_TOPLEFT] = defTop;
|
||||
@ -40,8 +40,6 @@ ThresholdSelector::ThresholdSelector(double minValueBottom, double maxValueBotto
|
||||
this->precisionBottom = precisionBottom;
|
||||
doubleThresh = false;
|
||||
|
||||
separatedLabelBottom = labelBottom;
|
||||
separatedLabelTop = labelTop;
|
||||
|
||||
bgCurveProvider = curveProvider;
|
||||
separatedSliders = true;
|
||||
@ -66,9 +64,6 @@ ThresholdSelector::ThresholdSelector(double minValue, double maxValue, double de
|
||||
this->precisionBottom = precision;
|
||||
doubleThresh = false;
|
||||
|
||||
separatedLabelBottom = "";
|
||||
separatedLabelTop = "";
|
||||
|
||||
#ifndef NDEBUG
|
||||
|
||||
if (startAtOne) {
|
||||
@ -106,9 +101,6 @@ ThresholdSelector::ThresholdSelector(double minValue, double maxValue, double de
|
||||
this->precisionBottom = precision;
|
||||
doubleThresh = true;
|
||||
|
||||
separatedLabelBottom = "";
|
||||
separatedLabelTop = "";
|
||||
|
||||
#ifndef NDEBUG
|
||||
|
||||
if (startAtOne) {
|
||||
@ -329,14 +321,13 @@ void ThresholdSelector::updateBackBuffer()
|
||||
|
||||
if (pts.size() >= 4) {
|
||||
std::vector<double>::iterator i = pts.begin();
|
||||
double x = *i;
|
||||
++i;
|
||||
double y = *i;
|
||||
++i;
|
||||
cr->move_to (xStart, ih*y + yStart);
|
||||
|
||||
for (; i < pts.end(); ) {
|
||||
x = *i;
|
||||
double x = *i;
|
||||
++i;
|
||||
y = *i;
|
||||
++i;
|
||||
|
@ -232,8 +232,6 @@ const ProcParams& Thumbnail::getProcParamsU ()
|
||||
rtengine::procparams::ProcParams* Thumbnail::createProcParamsForUpdate(bool returnParams, bool force, bool flaggingMode)
|
||||
{
|
||||
|
||||
static int index = 0; // Will act as unique identifier during the session
|
||||
|
||||
// try to load the last saved parameters from the cache or from the paramfile file
|
||||
ProcParams* ldprof = nullptr;
|
||||
|
||||
@ -285,6 +283,7 @@ rtengine::procparams::ProcParams* Thumbnail::createProcParamsForUpdate(bool retu
|
||||
imageMetaData = rtengine::FramesMetaData::fromFile (fname, nullptr, true);
|
||||
}
|
||||
|
||||
static int index = 0; // Will act as unique identifier during the session
|
||||
Glib::ustring tmpFileName( Glib::build_filename(options.cacheBaseDir, Glib::ustring::compose("CPB_temp_%1.txt", index++)) );
|
||||
|
||||
const rtexif::TagDirectory* exifDir = nullptr;
|
||||
@ -1020,9 +1019,7 @@ int Thumbnail::getRank () const
|
||||
|
||||
void Thumbnail::setRank (int rank)
|
||||
{
|
||||
if (pparams->rank != rank) {
|
||||
pparams->rank = rank;
|
||||
}
|
||||
pparams->rank = rank;
|
||||
pparamsValid = true;
|
||||
}
|
||||
|
||||
|
@ -26,6 +26,7 @@
|
||||
#include "guiutils.h"
|
||||
#include "multilangmgr.h"
|
||||
#include "paramsedited.h"
|
||||
#include "../rtengine/noncopyable.h"
|
||||
|
||||
class ToolPanel;
|
||||
class FoldableToolPanel;
|
||||
@ -51,7 +52,7 @@ public:
|
||||
ToolParamBlock();
|
||||
};
|
||||
|
||||
class ToolPanel
|
||||
class ToolPanel : public rtengine::NonCopyable
|
||||
{
|
||||
|
||||
protected:
|
||||
|
@ -83,6 +83,7 @@
|
||||
#include "dehaze.h"
|
||||
#include "guiutils.h"
|
||||
#include "filmnegative.h"
|
||||
#include "../rtengine/noncopyable.h"
|
||||
|
||||
class ImageEditorCoordinator;
|
||||
|
||||
@ -99,7 +100,8 @@ class ToolPanelCoordinator :
|
||||
public ICMPanelListener,
|
||||
public ImageAreaToolListener,
|
||||
public rtengine::ImageTypeListener,
|
||||
public FilmNegProvider
|
||||
public FilmNegProvider,
|
||||
public rtengine::NonCopyable
|
||||
{
|
||||
protected:
|
||||
WhiteBalance* whitebalance;
|
||||
|
@ -382,7 +382,6 @@ void WhiteBalance::adjusterChanged(Adjuster* a, double newval)
|
||||
return;
|
||||
}
|
||||
|
||||
Glib::ustring colLabel = row[methodColumns.colLabel];
|
||||
const std::pair<bool, const WBEntry&> ppMethod = findWBEntry (row[methodColumns.colLabel], WBLT_GUI);
|
||||
const std::pair<bool, const WBEntry&> wbCustom = findWBEntry ("Custom", WBLT_PP);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user