Merge pull request #4176 from Beep6581/extraclean
get rt cleaner when built using -Wextra #4155
This commit is contained in:
commit
5946a00511
@ -72,6 +72,7 @@ set(RTENGINESOURCEFILES
|
|||||||
imageio.cc
|
imageio.cc
|
||||||
improccoordinator.cc
|
improccoordinator.cc
|
||||||
improcfun.cc
|
improcfun.cc
|
||||||
|
impulse_denoise.cc
|
||||||
init.cc
|
init.cc
|
||||||
iplab2rgb.cc
|
iplab2rgb.cc
|
||||||
ipresize.cc
|
ipresize.cc
|
||||||
|
@ -6,7 +6,6 @@
|
|||||||
#endif
|
#endif
|
||||||
#include "sleef.c"
|
#include "sleef.c"
|
||||||
#include "opthelper.h"
|
#include "opthelper.h"
|
||||||
#define pow_F(a,b) (xexpf(b*xlogf(a)))
|
|
||||||
|
|
||||||
#define DIAGONALS 5
|
#define DIAGONALS 5
|
||||||
#define DIAGONALSP1 6
|
#define DIAGONALSP1 6
|
||||||
|
@ -424,7 +424,7 @@ void ImProcFunctions::Tile_calc(int tilesize, int overlap, int kall, int imwidth
|
|||||||
int denoiseNestedLevels = 1;
|
int denoiseNestedLevels = 1;
|
||||||
enum nrquality {QUALITY_STANDARD, QUALITY_HIGH};
|
enum nrquality {QUALITY_STANDARD, QUALITY_HIGH};
|
||||||
|
|
||||||
SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagefloat * dst, Imagefloat * calclum, float * ch_M, float *max_r, float *max_b, bool isRAW, const procparams::DirPyrDenoiseParams & dnparams, const double expcomp, const NoiseCurve & noiseLCurve, const NoiseCurve & noiseCCurve, float &chaut, float &redaut, float &blueaut, float &maxredaut, float &maxblueaut, float &nresi, float &highresi)
|
SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagefloat * dst, Imagefloat * calclum, float * ch_M, float *max_r, float *max_b, bool isRAW, const procparams::DirPyrDenoiseParams & dnparams, const double expcomp, const NoiseCurve & noiseLCurve, const NoiseCurve & noiseCCurve, float &nresi, float &highresi)
|
||||||
{
|
{
|
||||||
//#ifdef _DEBUG
|
//#ifdef _DEBUG
|
||||||
MyTime t1e, t2e;
|
MyTime t1e, t2e;
|
||||||
@ -2797,10 +2797,10 @@ SSEFUNCTION void ImProcFunctions::ShrinkAllAB(wavelet_decomposition &WaveletCoef
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SSEFUNCTION void ImProcFunctions::ShrinkAll_info(float ** WavCoeffs_a, float ** WavCoeffs_b, int level,
|
SSEFUNCTION void ImProcFunctions::ShrinkAll_info(float ** WavCoeffs_a, float ** WavCoeffs_b,
|
||||||
int W_ab, int H_ab, int skip_ab, float **noisevarlum, float **noisevarchrom, float **noisevarhue, int width, int height, float noisevar_abr, float noisevar_abb, LabImage * noi, float &chaut, int &Nb, float &redaut, float &blueaut,
|
int W_ab, int H_ab, float **noisevarlum, float **noisevarchrom, float **noisevarhue, float &chaut, int &Nb, float &redaut, float &blueaut,
|
||||||
float &maxredaut, float &maxblueaut, float &minredaut, float &minblueaut, bool autoch, int schoice, int lvl, float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc,
|
float &maxredaut, float &maxblueaut, float &minredaut, float &minblueaut, int schoice, int lvl, float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc,
|
||||||
float &maxchred, float &maxchblue, float &minchred, float &minchblue, int &nb, float &chau, float &chred, float &chblue, bool denoiseMethodRgb, bool multiThread)
|
float &maxchred, float &maxchblue, float &minchred, float &minchblue, int &nb, float &chau, float &chred, float &chblue, bool denoiseMethodRgb)
|
||||||
{
|
{
|
||||||
|
|
||||||
//simple wavelet shrinkage
|
//simple wavelet shrinkage
|
||||||
@ -2916,8 +2916,8 @@ SSEFUNCTION void ImProcFunctions::ShrinkAll_info(float ** WavCoeffs_a, float **
|
|||||||
|
|
||||||
|
|
||||||
void ImProcFunctions::WaveletDenoiseAll_info(int levwav, wavelet_decomposition &WaveletCoeffs_a,
|
void ImProcFunctions::WaveletDenoiseAll_info(int levwav, wavelet_decomposition &WaveletCoeffs_a,
|
||||||
wavelet_decomposition &WaveletCoeffs_b, float **noisevarlum, float **noisevarchrom, float **noisevarhue, int width, int height, float noisevar_abr, float noisevar_abb, LabImage * noi, float &chaut, int &Nb, float &redaut, float &blueaut, float &maxredaut, float &maxblueaut, float &minredaut, float &minblueaut, int schoice, bool autoch,
|
wavelet_decomposition &WaveletCoeffs_b, float **noisevarlum, float **noisevarchrom, float **noisevarhue, float &chaut, int &Nb, float &redaut, float &blueaut, float &maxredaut, float &maxblueaut, float &minredaut, float &minblueaut, int schoice,
|
||||||
float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc, float &maxchred, float &maxchblue, float &minchred, float &minchblue, int &nb, float &chau, float &chred, float &chblue, bool denoiseMethodRgb, bool multiThread)
|
float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc, float &maxchred, float &maxchblue, float &minchred, float &minchblue, int &nb, float &chau, float &chred, float &chblue, bool denoiseMethodRgb)
|
||||||
{
|
{
|
||||||
|
|
||||||
int maxlvl = levwav;
|
int maxlvl = levwav;
|
||||||
@ -2927,14 +2927,12 @@ void ImProcFunctions::WaveletDenoiseAll_info(int levwav, wavelet_decomposition &
|
|||||||
int Wlvl_ab = WaveletCoeffs_a.level_W(lvl);
|
int Wlvl_ab = WaveletCoeffs_a.level_W(lvl);
|
||||||
int Hlvl_ab = WaveletCoeffs_a.level_H(lvl);
|
int Hlvl_ab = WaveletCoeffs_a.level_H(lvl);
|
||||||
|
|
||||||
int skip_ab = WaveletCoeffs_a.level_stride(lvl);
|
|
||||||
|
|
||||||
float ** WavCoeffs_a = WaveletCoeffs_a.level_coeffs(lvl);
|
float ** WavCoeffs_a = WaveletCoeffs_a.level_coeffs(lvl);
|
||||||
float ** WavCoeffs_b = WaveletCoeffs_b.level_coeffs(lvl);
|
float ** WavCoeffs_b = WaveletCoeffs_b.level_coeffs(lvl);
|
||||||
|
|
||||||
ShrinkAll_info(WavCoeffs_a, WavCoeffs_b, lvl, Wlvl_ab, Hlvl_ab,
|
ShrinkAll_info(WavCoeffs_a, WavCoeffs_b, Wlvl_ab, Hlvl_ab,
|
||||||
skip_ab, noisevarlum, noisevarchrom, noisevarhue, width, height, noisevar_abr, noisevar_abb, noi, chaut, Nb, redaut, blueaut, maxredaut, maxblueaut, minredaut, minblueaut,
|
noisevarlum, noisevarchrom, noisevarhue, chaut, Nb, redaut, blueaut, maxredaut, maxblueaut, minredaut, minblueaut,
|
||||||
autoch, schoice, lvl, chromina, sigma, lumema, sigma_L, redyel, skinc, nsknc, maxchred, maxchblue, minchred, minchblue, nb, chau, chred, chblue, denoiseMethodRgb, multiThread);
|
schoice, lvl, chromina, sigma, lumema, sigma_L, redyel, skinc, nsknc, maxchred, maxchblue, minchred, minchblue, nb, chau, chred, chblue, denoiseMethodRgb);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3235,9 +3233,6 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat
|
|||||||
noisevarhue[i] = new float[(width + 1) / 2];
|
noisevarhue[i] = new float[(width + 1) / 2];
|
||||||
}
|
}
|
||||||
|
|
||||||
// init luma noisevarL
|
|
||||||
float noisevarab_b, noisevarab_r;
|
|
||||||
|
|
||||||
float realred, realblue;
|
float realred, realblue;
|
||||||
float interm_med = static_cast<float>( dnparams.chroma) / 10.0;
|
float interm_med = static_cast<float>( dnparams.chroma) / 10.0;
|
||||||
float intermred, intermblue;
|
float intermred, intermblue;
|
||||||
@ -3266,7 +3261,6 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat
|
|||||||
realblue = 0.001f;
|
realblue = 0.001f;
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO: implement using AlignedBufferMP
|
|
||||||
//fill tile from image; convert RGB to "luma/chroma"
|
//fill tile from image; convert RGB to "luma/chroma"
|
||||||
|
|
||||||
if (isRAW) {//image is raw; use channel differences for chroma channels
|
if (isRAW) {//image is raw; use channel differences for chroma channels
|
||||||
@ -3467,8 +3461,6 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat
|
|||||||
//and whether to subsample the image after wavelet filtering. Subsampling is coded as
|
//and whether to subsample the image after wavelet filtering. Subsampling is coded as
|
||||||
//binary 1 or 0 for each level, eg subsampling = 0 means no subsampling, 1 means subsample
|
//binary 1 or 0 for each level, eg subsampling = 0 means no subsampling, 1 means subsample
|
||||||
//the first level only, 7 means subsample the first three levels, etc.
|
//the first level only, 7 means subsample the first three levels, etc.
|
||||||
noisevarab_r = SQR(realred) + 0.01f;
|
|
||||||
noisevarab_b = SQR(realblue) + 0.01f;
|
|
||||||
|
|
||||||
wavelet_decomposition* adecomp;
|
wavelet_decomposition* adecomp;
|
||||||
wavelet_decomposition* bdecomp;
|
wavelet_decomposition* bdecomp;
|
||||||
@ -3497,8 +3489,6 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat
|
|||||||
bdecomp = new wavelet_decomposition (labdn->data + 2 * datalen, labdn->W, labdn->H, levwav, 1);
|
bdecomp = new wavelet_decomposition (labdn->data + 2 * datalen, labdn->W, labdn->H, levwav, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const bool autoch = (settings->leveldnautsimpl == 1 && (dnparams.Cmethod == "AUT" || dnparams.Cmethod == "PRE")) || (settings->leveldnautsimpl == 0 && (dnparams.C2method == "AUTO" || dnparams.C2method == "PREV"));
|
|
||||||
|
|
||||||
|
|
||||||
if (comptlevel == 0) {
|
if (comptlevel == 0) {
|
||||||
WaveletDenoiseAll_info(
|
WaveletDenoiseAll_info(
|
||||||
@ -3508,11 +3498,6 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat
|
|||||||
noisevarlum,
|
noisevarlum,
|
||||||
noisevarchrom,
|
noisevarchrom,
|
||||||
noisevarhue,
|
noisevarhue,
|
||||||
width,
|
|
||||||
height,
|
|
||||||
noisevarab_r,
|
|
||||||
noisevarab_b,
|
|
||||||
labdn,
|
|
||||||
chaut,
|
chaut,
|
||||||
Nb,
|
Nb,
|
||||||
redaut,
|
redaut,
|
||||||
@ -3522,7 +3507,6 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat
|
|||||||
minredaut,
|
minredaut,
|
||||||
minblueaut,
|
minblueaut,
|
||||||
schoice,
|
schoice,
|
||||||
autoch,
|
|
||||||
chromina,
|
chromina,
|
||||||
sigma,
|
sigma,
|
||||||
lumema,
|
lumema,
|
||||||
@ -3538,8 +3522,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat
|
|||||||
chau,
|
chau,
|
||||||
chred,
|
chred,
|
||||||
chblue,
|
chblue,
|
||||||
denoiseMethodRgb,
|
denoiseMethodRgb
|
||||||
multiThread
|
|
||||||
); // Enhance mode
|
); // Enhance mode
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -655,7 +655,7 @@ SSEFUNCTION void ImProcFunctions::PF_correct_RTcam(CieImage * src, CieImage * ds
|
|||||||
free(fringe);
|
free(fringe);
|
||||||
}
|
}
|
||||||
|
|
||||||
SSEFUNCTION void ImProcFunctions::Badpixelscam(CieImage * src, CieImage * dst, double radius, int thresh, int mode, float b_l, float t_l, float t_r, float b_r, float skinprot, float chrom, int hotbad)
|
SSEFUNCTION void ImProcFunctions::Badpixelscam(CieImage * src, CieImage * dst, double radius, int thresh, int mode, float skinprot, float chrom, int hotbad)
|
||||||
{
|
{
|
||||||
const int halfwin = ceil(2 * radius) + 1;
|
const int halfwin = ceil(2 * radius) + 1;
|
||||||
MyTime t1, t2;
|
MyTime t1, t2;
|
||||||
@ -1263,7 +1263,7 @@ SSEFUNCTION void ImProcFunctions::Badpixelscam(CieImage * src, CieImage * dst, d
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SSEFUNCTION void ImProcFunctions::BadpixelsLab(LabImage * src, LabImage * dst, double radius, int thresh, int mode, float b_l, float t_l, float t_r, float b_r, float skinprot, float chrom)
|
SSEFUNCTION void ImProcFunctions::BadpixelsLab(LabImage * src, LabImage * dst, double radius, int thresh, int mode, float skinprot, float chrom)
|
||||||
{
|
{
|
||||||
const int halfwin = ceil(2 * radius) + 1;
|
const int halfwin = ceil(2 * radius) + 1;
|
||||||
MyTime t1, t2;
|
MyTime t1, t2;
|
||||||
|
@ -18,12 +18,8 @@
|
|||||||
*/
|
*/
|
||||||
#ifndef _ALIGNEDBUFFER_
|
#ifndef _ALIGNEDBUFFER_
|
||||||
#define _ALIGNEDBUFFER_
|
#define _ALIGNEDBUFFER_
|
||||||
#include <cstdint>
|
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <vector>
|
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <glibmm.h>
|
|
||||||
#include "../rtgui/threadutils.h"
|
|
||||||
|
|
||||||
// Aligned buffer that should be faster
|
// Aligned buffer that should be faster
|
||||||
template <class T> class AlignedBuffer
|
template <class T> class AlignedBuffer
|
||||||
@ -111,7 +107,6 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (real) {
|
if (real) {
|
||||||
//data = (T*)( (uintptr_t)real + (alignment-((uintptr_t)real)%alignment) );
|
|
||||||
data = (T*)( ( uintptr_t(real) + uintptr_t(alignment - 1)) / alignment * alignment);
|
data = (T*)( ( uintptr_t(real) + uintptr_t(alignment - 1)) / alignment * alignment);
|
||||||
inUse = true;
|
inUse = true;
|
||||||
} else {
|
} else {
|
||||||
@ -142,51 +137,4 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Multi processor version, use with OpenMP
|
|
||||||
template <class T> class AlignedBufferMP
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
MyMutex mtx;
|
|
||||||
std::vector<AlignedBuffer<T>*> buffers;
|
|
||||||
size_t size;
|
|
||||||
|
|
||||||
public:
|
|
||||||
explicit AlignedBufferMP(size_t sizeP)
|
|
||||||
{
|
|
||||||
size = sizeP;
|
|
||||||
}
|
|
||||||
|
|
||||||
~AlignedBufferMP()
|
|
||||||
{
|
|
||||||
for (size_t i = 0; i < buffers.size(); i++) {
|
|
||||||
delete buffers[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
AlignedBuffer<T>* acquire()
|
|
||||||
{
|
|
||||||
MyMutex::MyLock lock(mtx);
|
|
||||||
|
|
||||||
// Find available buffer
|
|
||||||
for (size_t i = 0; i < buffers.size(); i++) {
|
|
||||||
if (!buffers[i]->inUse) {
|
|
||||||
buffers[i]->inUse = true;
|
|
||||||
return buffers[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add new buffer if nothing is free
|
|
||||||
AlignedBuffer<T>* buffer = new AlignedBuffer<T>(size);
|
|
||||||
buffers.push_back(buffer);
|
|
||||||
|
|
||||||
return buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
void release(AlignedBuffer<T>* buffer)
|
|
||||||
{
|
|
||||||
MyMutex::MyLock lock(mtx);
|
|
||||||
|
|
||||||
buffer->inUse = false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -34,8 +34,6 @@ namespace rtengine
|
|||||||
|
|
||||||
template<class T, class A> void boxblur (T** src, A** dst, int radx, int rady, int W, int H)
|
template<class T, class A> void boxblur (T** src, A** dst, int radx, int rady, int W, int H)
|
||||||
{
|
{
|
||||||
|
|
||||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
||||||
//box blur image; box range = (radx,rady)
|
//box blur image; box range = (radx,rady)
|
||||||
|
|
||||||
AlignedBuffer<float>* buffer = new AlignedBuffer<float> (W * H);
|
AlignedBuffer<float>* buffer = new AlignedBuffer<float> (W * H);
|
||||||
@ -125,8 +123,6 @@ template<class T, class A> void boxblur (T** src, A** dst, int radx, int rady, i
|
|||||||
|
|
||||||
template<class T, class A> SSEFUNCTION void boxblur (T** src, A** dst, T* buffer, int radx, int rady, int W, int H)
|
template<class T, class A> SSEFUNCTION void boxblur (T** src, A** dst, T* buffer, int radx, int rady, int W, int H)
|
||||||
{
|
{
|
||||||
|
|
||||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
||||||
//box blur image; box range = (radx,rady)
|
//box blur image; box range = (radx,rady)
|
||||||
|
|
||||||
float* temp = buffer;
|
float* temp = buffer;
|
||||||
@ -313,13 +309,8 @@ template<class T, class A> SSEFUNCTION void boxblur (T** src, A** dst, T* buffer
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
||||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
||||||
|
|
||||||
template<class T, class A> SSEFUNCTION void boxblur (T* src, A* dst, A* buffer, int radx, int rady, int W, int H)
|
template<class T, class A> SSEFUNCTION void boxblur (T* src, A* dst, A* buffer, int radx, int rady, int W, int H)
|
||||||
{
|
{
|
||||||
|
|
||||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
||||||
//box blur image; box range = (radx,rady) i.e. box size is (2*radx+1)x(2*rady+1)
|
//box blur image; box range = (radx,rady) i.e. box size is (2*radx+1)x(2*rady+1)
|
||||||
|
|
||||||
float* temp = buffer;
|
float* temp = buffer;
|
||||||
@ -505,489 +496,6 @@ template<class T, class A> SSEFUNCTION void boxblur (T* src, A* dst, A* buffer,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
||||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
||||||
|
|
||||||
|
|
||||||
template<typename T> void boxvar (T* src, T* dst, int radx, int rady, int W, int H)
|
|
||||||
{
|
|
||||||
|
|
||||||
AlignedBuffer<float> buffer1(W * H);
|
|
||||||
AlignedBuffer<float> buffer2(W * H);
|
|
||||||
float* tempave = buffer1.data;
|
|
||||||
float* tempsqave = buffer2.data;
|
|
||||||
|
|
||||||
AlignedBufferMP<float> buffer3(H);
|
|
||||||
|
|
||||||
//float image_ave = 0;
|
|
||||||
|
|
||||||
//box blur image channel; box size = 2*box+1
|
|
||||||
//horizontal blur
|
|
||||||
#ifdef _OPENMP
|
|
||||||
#pragma omp parallel for
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (int row = 0; row < H; row++) {
|
|
||||||
int len = radx + 1;
|
|
||||||
tempave[row * W + 0] = src[row * W + 0] / len;
|
|
||||||
tempsqave[row * W + 0] = SQR(src[row * W + 0]) / len;
|
|
||||||
|
|
||||||
for (int j = 1; j <= radx; j++) {
|
|
||||||
tempave[row * W + 0] += src[row * W + j] / len;
|
|
||||||
tempsqave[row * W + 0] += SQR(src[row * W + j]) / len;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int col = 1; col <= radx; col++) {
|
|
||||||
tempave[row * W + col] = (tempave[row * W + col - 1] * len + src[row * W + col + radx]) / (len + 1);
|
|
||||||
tempsqave[row * W + col] = (tempsqave[row * W + col - 1] * len + SQR(src[row * W + col + radx])) / (len + 1);
|
|
||||||
len ++;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int col = radx + 1; col < W - radx; col++) {
|
|
||||||
tempave[row * W + col] = tempave[row * W + col - 1] + (src[row * W + col + radx] - src[row * W + col - radx - 1]) / len;
|
|
||||||
tempsqave[row * W + col] = tempsqave[row * W + col - 1] + (SQR(src[row * W + col + radx]) - SQR(src[row * W + col - radx - 1])) / len;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int col = W - radx; col < W; col++) {
|
|
||||||
tempave[row * W + col] = (tempave[row * W + col - 1] * len - src[row * W + col - radx - 1]) / (len - 1);
|
|
||||||
tempsqave[row * W + col] = (tempsqave[row * W + col - 1] * len - SQR(src[row * W + col - radx - 1])) / (len - 1);
|
|
||||||
len --;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//vertical blur
|
|
||||||
#ifdef _OPENMP
|
|
||||||
#pragma omp parallel for
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (int col = 0; col < W; col++) {
|
|
||||||
AlignedBuffer<float>* pBuf3 = buffer3.acquire();
|
|
||||||
T* tempave2 = (T*)pBuf3->data;
|
|
||||||
|
|
||||||
int len = rady + 1;
|
|
||||||
tempave2[0] = tempave[0 * W + col] / len;
|
|
||||||
dst[0 * W + col] = tempsqave[0 * W + col] / len;
|
|
||||||
|
|
||||||
for (int i = 1; i <= rady; i++) {
|
|
||||||
tempave2[0] += tempave[i * W + col] / len;
|
|
||||||
dst[0 * W + col] += tempsqave[i * W + col] / len;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int row = 1; row <= rady; row++) {
|
|
||||||
tempave2[row] = (tempave2[(row - 1)] * len + tempave[(row + rady) * W + col]) / (len + 1);
|
|
||||||
dst[row * W + col] = (dst[(row - 1) * W + col] * len + tempsqave[(row + rady) * W + col]) / (len + 1);
|
|
||||||
len ++;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int row = rady + 1; row < H - rady; row++) {
|
|
||||||
tempave2[row] = tempave2[(row - 1)] + (tempave[(row + rady) * W + col] - tempave[(row - rady - 1) * W + col]) / len;
|
|
||||||
dst[row * W + col] = dst[(row - 1) * W + col] + (tempsqave[(row + rady) * W + col] - tempsqave[(row - rady - 1) * W + col]) / len;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int row = H - rady; row < H; row++) {
|
|
||||||
tempave2[row] = (tempave2[(row - 1)] * len - tempave[(row - rady - 1) * W + col]) / (len - 1);
|
|
||||||
dst[row * W + col] = (dst[(row - 1) * W + col] * len - tempsqave[(row - rady - 1) * W + col]) / (len - 1);
|
|
||||||
len --;
|
|
||||||
}
|
|
||||||
|
|
||||||
//now finish off
|
|
||||||
for (int row = 0; row < H; row++) {
|
|
||||||
dst[row * W + col] = fabs(dst[row * W + col] - SQR(tempave2[row]));
|
|
||||||
//image_ave += src[row*W+col];
|
|
||||||
}
|
|
||||||
|
|
||||||
buffer3.release(pBuf3);
|
|
||||||
}
|
|
||||||
|
|
||||||
//image_ave /= (W*H);
|
|
||||||
}
|
|
||||||
|
|
||||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
||||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
||||||
|
|
||||||
|
|
||||||
template<typename T> void boxdev (T* src, T* dst, int radx, int rady, int W, int H)
|
|
||||||
{
|
|
||||||
|
|
||||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
||||||
//box blur image; box range = (radx,rady) i.e. box size is (2*radx+1)x(2*rady+1)
|
|
||||||
|
|
||||||
AlignedBuffer<float>* buffer1 = new AlignedBuffer<float> (W * H);
|
|
||||||
float* temp = buffer1->data;
|
|
||||||
|
|
||||||
AlignedBuffer<float>* buffer2 = new AlignedBuffer<float> (W * H);
|
|
||||||
float* tempave = buffer2->data;
|
|
||||||
|
|
||||||
if (radx == 0) {
|
|
||||||
#ifdef _OPENMP
|
|
||||||
#pragma omp parallel for
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (int row = 0; row < H; row++)
|
|
||||||
for (int col = 0; col < W; col++) {
|
|
||||||
temp[row * W + col] = src[row * W + col];
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
//horizontal blur
|
|
||||||
#ifdef _OPENMP
|
|
||||||
#pragma omp parallel for
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (int row = 0; row < H; row++) {
|
|
||||||
int len = radx + 1;
|
|
||||||
temp[row * W + 0] = (float)src[row * W + 0] / len;
|
|
||||||
|
|
||||||
for (int j = 1; j <= radx; j++) {
|
|
||||||
temp[row * W + 0] += (float)src[row * W + j] / len;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int col = 1; col <= radx; col++) {
|
|
||||||
temp[row * W + col] = (temp[row * W + col - 1] * len + src[row * W + col + radx]) / (len + 1);
|
|
||||||
len ++;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int col = radx + 1; col < W - radx; col++) {
|
|
||||||
temp[row * W + col] = temp[row * W + col - 1] + ((float)(src[row * W + col + radx] - src[row * W + col - radx - 1])) / len;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int col = W - radx; col < W; col++) {
|
|
||||||
temp[row * W + col] = (temp[row * W + col - 1] * len - src[row * W + col - radx - 1]) / (len - 1);
|
|
||||||
len --;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rady == 0) {
|
|
||||||
#ifdef _OPENMP
|
|
||||||
#pragma omp parallel for
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (int row = 0; row < H; row++) {
|
|
||||||
for (int col = 0; col < W; col++) {
|
|
||||||
tempave[row * W + col] = temp[row * W + col];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
//vertical blur
|
|
||||||
#ifdef _OPENMP
|
|
||||||
#pragma omp parallel for
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (int col = 0; col < W; col++) {
|
|
||||||
int len = rady + 1;
|
|
||||||
tempave[0 * W + col] = temp[0 * W + col] / len;
|
|
||||||
|
|
||||||
for (int i = 1; i <= rady; i++) {
|
|
||||||
tempave[0 * W + col] += temp[i * W + col] / len;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int row = 1; row <= rady; row++) {
|
|
||||||
tempave[row * W + col] = (tempave[(row - 1) * W + col] * len + temp[(row + rady) * W + col]) / (len + 1);
|
|
||||||
len ++;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int row = rady + 1; row < H - rady; row++) {
|
|
||||||
tempave[row * W + col] = tempave[(row - 1) * W + col] + (temp[(row + rady) * W + col] - temp[(row - rady - 1) * W + col]) / len;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int row = H - rady; row < H; row++) {
|
|
||||||
tempave[row * W + col] = (tempave[(row - 1) * W + col] * len - temp[(row - rady - 1) * W + col]) / (len - 1);
|
|
||||||
len --;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
||||||
//box blur absolute deviation
|
|
||||||
|
|
||||||
|
|
||||||
if (radx == 0) {
|
|
||||||
#ifdef _OPENMP
|
|
||||||
#pragma omp parallel for
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (int row = 0; row < H; row++)
|
|
||||||
for (int col = 0; col < W; col++) {
|
|
||||||
temp[row * W + col] = fabs(src[row * W + col] - tempave[row * W + col]);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
//horizontal blur
|
|
||||||
//OpenMP here
|
|
||||||
#ifdef _OPENMP
|
|
||||||
#pragma omp parallel for
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (int row = 0; row < H; row++) {
|
|
||||||
int len = radx + 1;
|
|
||||||
temp[row * W + 0] = fabs(src[row * W + 0] - tempave[row * W + 0]) / len;
|
|
||||||
|
|
||||||
for (int j = 1; j <= radx; j++) {
|
|
||||||
temp[row * W + 0] += fabs(src[row * W + j] - tempave[row * W + j]) / len;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int col = 1; col <= radx; col++) {
|
|
||||||
temp[row * W + col] = (temp[row * W + col - 1] * len + fabs(src[row * W + col + radx] - tempave[row * W + col + radx])) / (len + 1);
|
|
||||||
len ++;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int col = radx + 1; col < W - radx; col++) {
|
|
||||||
temp[row * W + col] = temp[row * W + col - 1] + (fabs(src[row * W + col + radx] - tempave[row * W + col + radx]) - \
|
|
||||||
fabs(src[row * W + col - radx - 1] - tempave[row * W + col - radx - 1])) / len;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int col = W - radx; col < W; col++) {
|
|
||||||
temp[row * W + col] = (temp[row * W + col - 1] * len - fabs(src[row * W + col - radx - 1] - tempave[row * W + col - radx - 1])) / (len - 1);
|
|
||||||
len --;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rady == 0) {
|
|
||||||
#ifdef _OPENMP
|
|
||||||
#pragma omp parallel for
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (int row = 0; row < H; row++)
|
|
||||||
for (int col = 0; col < W; col++) {
|
|
||||||
dst[row * W + col] = temp[row * W + col];
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
//vertical blur
|
|
||||||
//OpenMP here
|
|
||||||
#ifdef _OPENMP
|
|
||||||
#pragma omp parallel for
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (int col = 0; col < W; col++) {
|
|
||||||
int len = rady + 1;
|
|
||||||
dst[0 * W + col] = temp[0 * W + col] / len;
|
|
||||||
|
|
||||||
for (int i = 1; i <= rady; i++) {
|
|
||||||
dst[0 * W + col] += temp[i * W + col] / len;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int row = 1; row <= rady; row++) {
|
|
||||||
dst[row * W + col] = (dst[(row - 1) * W + col] * len + temp[(row + rady) * W + col]) / (len + 1);
|
|
||||||
len ++;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int row = rady + 1; row < H - rady; row++) {
|
|
||||||
dst[row * W + col] = dst[(row - 1) * W + col] + (temp[(row + rady) * W + col] - temp[(row - rady - 1) * W + col]) / len;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int row = H - rady; row < H; row++) {
|
|
||||||
dst[row * W + col] = (dst[(row - 1) * W + col] * len - temp[(row - rady - 1) * W + col]) / (len - 1);
|
|
||||||
len --;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
delete buffer1;
|
|
||||||
delete buffer2;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
||||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
||||||
|
|
||||||
|
|
||||||
template<class T, class A> void boxsqblur (T* src, A* dst, int radx, int rady, int W, int H)
|
|
||||||
{
|
|
||||||
|
|
||||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
||||||
//box blur image; box range = (radx,rady) i.e. box size is (2*radx+1)x(2*rady+1)
|
|
||||||
|
|
||||||
AlignedBuffer<float>* buffer = new AlignedBuffer<float> (W * H);
|
|
||||||
float* temp = buffer->data;
|
|
||||||
|
|
||||||
if (radx == 0) {
|
|
||||||
#ifdef _OPENMP
|
|
||||||
#pragma omp parallel for
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (int row = 0; row < H; row++)
|
|
||||||
for (int col = 0; col < W; col++) {
|
|
||||||
temp[row * W + col] = SQR(src[row * W + col]);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
//horizontal blur
|
|
||||||
//OpenMP here
|
|
||||||
#ifdef _OPENMP
|
|
||||||
#pragma omp parallel for
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (int row = 0; row < H; row++) {
|
|
||||||
int len = radx + 1;
|
|
||||||
temp[row * W + 0] = SQR((float)src[row * W + 0]) / len;
|
|
||||||
|
|
||||||
for (int j = 1; j <= radx; j++) {
|
|
||||||
temp[row * W + 0] += SQR((float)src[row * W + j]) / len;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int col = 1; col <= radx; col++) {
|
|
||||||
temp[row * W + col] = (temp[row * W + col - 1] * len + SQR(src[row * W + col + radx])) / (len + 1);
|
|
||||||
len ++;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int col = radx + 1; col < W - radx; col++) {
|
|
||||||
temp[row * W + col] = temp[row * W + col - 1] + ((float)(SQR(src[row * W + col + radx]) - SQR(src[row * W + col - radx - 1]))) / len;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int col = W - radx; col < W; col++) {
|
|
||||||
temp[row * W + col] = (temp[row * W + col - 1] * len - SQR(src[row * W + col - radx - 1])) / (len - 1);
|
|
||||||
len --;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rady == 0) {
|
|
||||||
#ifdef _OPENMP
|
|
||||||
#pragma omp parallel for
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (int row = 0; row < H; row++)
|
|
||||||
for (int col = 0; col < W; col++) {
|
|
||||||
dst[row * W + col] = temp[row * W + col];
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
//vertical blur
|
|
||||||
//OpenMP here
|
|
||||||
#ifdef _OPENMP
|
|
||||||
#pragma omp parallel for
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (int col = 0; col < W; col++) {
|
|
||||||
int len = rady + 1;
|
|
||||||
dst[0 * W + col] = temp[0 * W + col] / len;
|
|
||||||
|
|
||||||
for (int i = 1; i <= rady; i++) {
|
|
||||||
dst[0 * W + col] += temp[i * W + col] / len;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int row = 1; row <= rady; row++) {
|
|
||||||
dst[row * W + col] = (dst[(row - 1) * W + col] * len + temp[(row + rady) * W + col]) / (len + 1);
|
|
||||||
len ++;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int row = rady + 1; row < H - rady; row++) {
|
|
||||||
dst[row * W + col] = dst[(row - 1) * W + col] + (temp[(row + rady) * W + col] - temp[(row - rady - 1) * W + col]) / len;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int row = H - rady; row < H; row++) {
|
|
||||||
dst[row * W + col] = (dst[(row - 1) * W + col] * len - temp[(row - rady - 1) * W + col]) / (len - 1);
|
|
||||||
len --;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
delete buffer;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
||||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
||||||
|
|
||||||
|
|
||||||
template<class T, class A> void boxcorrelate (T* src, A* dst, int dx, int dy, int radx, int rady, int W, int H)
|
|
||||||
{
|
|
||||||
|
|
||||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
||||||
//box blur image; box range = (radx,rady) i.e. box size is (2*radx+1)x(2*rady+1)
|
|
||||||
|
|
||||||
AlignedBuffer<float>* buffer = new AlignedBuffer<float> (W * H);
|
|
||||||
float* temp = buffer->data;
|
|
||||||
|
|
||||||
if (radx == 0) {
|
|
||||||
for (int row = 0; row < H; row++) {
|
|
||||||
int rr = min(H - 1, max(0, row + dy));
|
|
||||||
|
|
||||||
for (int col = 0; col < W; col++) {
|
|
||||||
int cc = min(W - 1, max(0, col + dx));
|
|
||||||
temp[row * W + col] = dy > 0 ? (src[row * W + col]) * (src[rr * W + cc]) : 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
//horizontal blur
|
|
||||||
for (int row = 0; row < H; row++) {
|
|
||||||
int len = radx + 1;
|
|
||||||
int rr = min(H - 1, max(0, row + dy));
|
|
||||||
int cc = min(W - 1, max(0, 0 + dx));
|
|
||||||
temp[row * W + 0] = ((float)src[row * W + 0]) * (src[rr * W + cc]) / len;
|
|
||||||
|
|
||||||
for (int j = 1; j <= radx; j++) {
|
|
||||||
int cc = min(W - 1, max(0, j + dx));
|
|
||||||
temp[row * W + 0] += ((float)src[row * W + j]) * (src[rr * W + cc]) / len;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int col = 1; col <= radx; col++) {
|
|
||||||
int cc = min(W - 1, max(0, col + dx + radx));
|
|
||||||
temp[row * W + col] = (temp[row * W + col - 1] * len + (src[row * W + col + radx]) * (src[rr * W + cc])) / (len + 1);
|
|
||||||
len ++;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int col = radx + 1; col < W - radx; col++) {
|
|
||||||
int cc = min(W - 1, max(0, col + dx + radx));
|
|
||||||
int cc1 = min(W - 1, max(0, col + dx - radx - 1));
|
|
||||||
temp[row * W + col] = temp[row * W + col - 1] + ((float)((src[row * W + col + radx]) * (src[rr * W + cc]) -
|
|
||||||
(src[row * W + col - radx - 1]) * (src[rr * W + cc1]))) / len;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int col = W - radx; col < W; col++) {
|
|
||||||
int cc1 = min(W - 1, max(0, col + dx - radx - 1));
|
|
||||||
temp[row * W + col] = (temp[row * W + col - 1] * len - (src[row * W + col - radx - 1]) * (src[rr * W + cc1])) / (len - 1);
|
|
||||||
len --;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rady == 0) {
|
|
||||||
#ifdef _OPENMP
|
|
||||||
#pragma omp parallel for
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (int row = 0; row < H; row++)
|
|
||||||
for (int col = 0; col < W; col++) {
|
|
||||||
dst[row * W + col] = temp[row * W + col];
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
//vertical blur
|
|
||||||
//OpenMP here
|
|
||||||
#ifdef _OPENMP
|
|
||||||
#pragma omp parallel for
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (int col = 0; col < W; col++) {
|
|
||||||
int len = rady + 1;
|
|
||||||
dst[0 * W + col] = temp[0 * W + col] / len;
|
|
||||||
|
|
||||||
for (int i = 1; i <= rady; i++) {
|
|
||||||
dst[0 * W + col] += temp[i * W + col] / len;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int row = 1; row <= rady; row++) {
|
|
||||||
dst[row * W + col] = (dst[(row - 1) * W + col] * len + temp[(row + rady) * W + col]) / (len + 1);
|
|
||||||
len ++;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int row = rady + 1; row < H - rady; row++) {
|
|
||||||
dst[row * W + col] = dst[(row - 1) * W + col] + (temp[(row + rady) * W + col] - temp[(row - rady - 1) * W + col]) / len;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int row = H - rady; row < H; row++) {
|
|
||||||
dst[row * W + col] = (dst[(row - 1) * W + col] * len - temp[(row - rady - 1) * W + col]) / (len - 1);
|
|
||||||
len --;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
delete buffer;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
||||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
||||||
|
|
||||||
template<class T, class A> SSEFUNCTION void boxabsblur (T* src, A* dst, int radx, int rady, int W, int H, float * temp)
|
template<class T, class A> SSEFUNCTION void boxabsblur (T* src, A* dst, int radx, int rady, int W, int H, float * temp)
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -1131,7 +639,5 @@ template<class T, class A> SSEFUNCTION void boxabsblur (T* src, A* dst, int radx
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
||||||
|
|
||||||
}
|
}
|
||||||
#endif /* _BOXBLUR_H_ */
|
#endif /* _BOXBLUR_H_ */
|
||||||
|
@ -191,12 +191,21 @@ static const char *parse_string(cJSON *item,const char *str)
|
|||||||
|
|
||||||
len=4;if (uc<0x80) len=1;else if (uc<0x800) len=2;else if (uc<0x10000) len=3; ptr2+=len;
|
len=4;if (uc<0x80) len=1;else if (uc<0x800) len=2;else if (uc<0x10000) len=3; ptr2+=len;
|
||||||
|
|
||||||
|
#ifdef __GNUC__ // silence warning
|
||||||
|
#pragma GCC diagnostic push
|
||||||
|
#pragma GCC diagnostic ignored "-Wimplicit-fallthrough"
|
||||||
|
#endif
|
||||||
|
|
||||||
switch (len) {
|
switch (len) {
|
||||||
case 4: *--ptr2 =((uc | 0x80) & 0xBF); uc >>= 6;
|
case 4: *--ptr2 =((uc | 0x80) & 0xBF); uc >>= 6;
|
||||||
case 3: *--ptr2 =((uc | 0x80) & 0xBF); uc >>= 6;
|
case 3: *--ptr2 =((uc | 0x80) & 0xBF); uc >>= 6;
|
||||||
case 2: *--ptr2 =((uc | 0x80) & 0xBF); uc >>= 6;
|
case 2: *--ptr2 =((uc | 0x80) & 0xBF); uc >>= 6;
|
||||||
case 1: *--ptr2 =(uc | firstByteMark[len]);
|
case 1: *--ptr2 =(uc | firstByteMark[len]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
#endif
|
||||||
ptr2+=len;
|
ptr2+=len;
|
||||||
break;
|
break;
|
||||||
default: *ptr2++=*ptr; break;
|
default: *ptr2++=*ptr; break;
|
||||||
|
@ -30,7 +30,6 @@
|
|||||||
#undef CLIPD
|
#undef CLIPD
|
||||||
#define CLIPD(a) ((a)>0.0?((a)<1.0?(a):1.0):0.0)
|
#define CLIPD(a) ((a)>0.0?((a)<1.0?(a):1.0):0.0)
|
||||||
#define MAXR(a,b) ((a) > (b) ? (a) : (b))
|
#define MAXR(a,b) ((a) > (b) ? (a) : (b))
|
||||||
#define pow_F(a,b) (xexpf(b*xlogf(a)))
|
|
||||||
|
|
||||||
namespace rtengine
|
namespace rtengine
|
||||||
{
|
{
|
||||||
@ -780,7 +779,7 @@ void Ciecam02::initcam2float (float gamu, float yb, float pilotd, float f, float
|
|||||||
|
|
||||||
void Ciecam02::xyz2jchqms_ciecam02 ( double &J, double &C, double &h, double &Q, double &M, double &s, double &aw, double &fl, double &wh,
|
void Ciecam02::xyz2jchqms_ciecam02 ( double &J, double &C, double &h, double &Q, double &M, double &s, double &aw, double &fl, double &wh,
|
||||||
double x, double y, double z, double xw, double yw, double zw,
|
double x, double y, double z, double xw, double yw, double zw,
|
||||||
double yb, double la, double f, double c, double nc, double pilotd, int gamu, double n, double nbb, double ncb, double pfl, double cz, double d)
|
double c, double nc, int gamu, double n, double nbb, double ncb, double pfl, double cz, double d)
|
||||||
{
|
{
|
||||||
double r, g, b;
|
double r, g, b;
|
||||||
double rw, gw, bw;
|
double rw, gw, bw;
|
||||||
@ -1040,8 +1039,8 @@ void Ciecam02::xyz2jch_ciecam02float ( float &J, float &C, float &h, float aw, f
|
|||||||
|
|
||||||
|
|
||||||
void Ciecam02::jch2xyz_ciecam02 ( double &x, double &y, double &z, double J, double C, double h,
|
void Ciecam02::jch2xyz_ciecam02 ( double &x, double &y, double &z, double J, double C, double h,
|
||||||
double xw, double yw, double zw, double yb, double la,
|
double xw, double yw, double zw,
|
||||||
double f, double c, double nc, int gamu, double n, double nbb, double ncb, double fl, double cz, double d, double aw )
|
double c, double nc, int gamu, double n, double nbb, double ncb, double fl, double cz, double d, double aw )
|
||||||
{
|
{
|
||||||
double r, g, b;
|
double r, g, b;
|
||||||
double rc, gc, bc;
|
double rc, gc, bc;
|
||||||
@ -1075,7 +1074,7 @@ void Ciecam02::jch2xyz_ciecam02 ( double &x, double &y, double &z, double J, dou
|
|||||||
|
|
||||||
void Ciecam02::jch2xyz_ciecam02float ( float &x, float &y, float &z, float J, float C, float h,
|
void Ciecam02::jch2xyz_ciecam02float ( float &x, float &y, float &z, float J, float C, float h,
|
||||||
float xw, float yw, float zw,
|
float xw, float yw, float zw,
|
||||||
float f, float c, float nc, int gamu, float pow1, float nbb, float ncb, float fl, float cz, float d, float aw)
|
float c, float nc, int gamu, float pow1, float nbb, float ncb, float fl, float cz, float d, float aw)
|
||||||
{
|
{
|
||||||
float r, g, b;
|
float r, g, b;
|
||||||
float rc, gc, bc;
|
float rc, gc, bc;
|
||||||
@ -1110,7 +1109,7 @@ void Ciecam02::jch2xyz_ciecam02float ( float &x, float &y, float &z, float J, fl
|
|||||||
#ifdef __SSE2__
|
#ifdef __SSE2__
|
||||||
void Ciecam02::jch2xyz_ciecam02float ( vfloat &x, vfloat &y, vfloat &z, vfloat J, vfloat C, vfloat h,
|
void Ciecam02::jch2xyz_ciecam02float ( vfloat &x, vfloat &y, vfloat &z, vfloat J, vfloat C, vfloat h,
|
||||||
vfloat xw, vfloat yw, vfloat zw,
|
vfloat xw, vfloat yw, vfloat zw,
|
||||||
vfloat f, vfloat nc, vfloat pow1, vfloat nbb, vfloat ncb, vfloat fl, vfloat d, vfloat aw, vfloat reccmcz)
|
vfloat nc, vfloat pow1, vfloat nbb, vfloat ncb, vfloat fl, vfloat d, vfloat aw, vfloat reccmcz)
|
||||||
{
|
{
|
||||||
vfloat r, g, b;
|
vfloat r, g, b;
|
||||||
vfloat rc, gc, bc;
|
vfloat rc, gc, bc;
|
||||||
|
@ -82,19 +82,18 @@ public:
|
|||||||
static void jch2xyz_ciecam02 ( double &x, double &y, double &z,
|
static void jch2xyz_ciecam02 ( double &x, double &y, double &z,
|
||||||
double J, double C, double h,
|
double J, double C, double h,
|
||||||
double xw, double yw, double zw,
|
double xw, double yw, double zw,
|
||||||
double yb, double la,
|
double c, double nc, int gamu, double n, double nbb, double ncb, double fl, double cz, double d, double aw);
|
||||||
double f, double c, double nc, int gamu, double n, double nbb, double ncb, double fl, double cz, double d, double aw);
|
|
||||||
|
|
||||||
|
|
||||||
static void jch2xyz_ciecam02float ( float &x, float &y, float &z,
|
static void jch2xyz_ciecam02float ( float &x, float &y, float &z,
|
||||||
float J, float C, float h,
|
float J, float C, float h,
|
||||||
float xw, float yw, float zw,
|
float xw, float yw, float zw,
|
||||||
float f, float c, float nc, int gamu, float n, float nbb, float ncb, float fl, float cz, float d, float aw );
|
float c, float nc, int gamu, float n, float nbb, float ncb, float fl, float cz, float d, float aw );
|
||||||
#ifdef __SSE2__
|
#ifdef __SSE2__
|
||||||
static void jch2xyz_ciecam02float ( vfloat &x, vfloat &y, vfloat &z,
|
static void jch2xyz_ciecam02float ( vfloat &x, vfloat &y, vfloat &z,
|
||||||
vfloat J, vfloat C, vfloat h,
|
vfloat J, vfloat C, vfloat h,
|
||||||
vfloat xw, vfloat yw, vfloat zw,
|
vfloat xw, vfloat yw, vfloat zw,
|
||||||
vfloat f, vfloat nc, vfloat n, vfloat nbb, vfloat ncb, vfloat fl, vfloat d, vfloat aw, vfloat reccmcz );
|
vfloat nc, vfloat n, vfloat nbb, vfloat ncb, vfloat fl, vfloat d, vfloat aw, vfloat reccmcz );
|
||||||
#endif
|
#endif
|
||||||
/**
|
/**
|
||||||
* Forward transform from XYZ to CIECAM02 JCh.
|
* Forward transform from XYZ to CIECAM02 JCh.
|
||||||
@ -115,8 +114,7 @@ public:
|
|||||||
double &Q, double &M, double &s, double &aw, double &fl, double &wh,
|
double &Q, double &M, double &s, double &aw, double &fl, double &wh,
|
||||||
double x, double y, double z,
|
double x, double y, double z,
|
||||||
double xw, double yw, double zw,
|
double xw, double yw, double zw,
|
||||||
double yb, double la,
|
double c, double nc, int gamu, double n, double nbb, double ncb, double pfl, double cz, double d );
|
||||||
double f, double c, double nc, double pilotd, int gamu, double n, double nbb, double ncb, double pfl, double cz, double d );
|
|
||||||
|
|
||||||
static void xyz2jch_ciecam02float ( float &J, float &C, float &h,
|
static void xyz2jch_ciecam02float ( float &J, float &C, float &h,
|
||||||
float aw, float fl,
|
float aw, float fl,
|
||||||
|
@ -52,7 +52,7 @@ bool loadFile(
|
|||||||
rtengine::procparams::ColorManagementParams icm;
|
rtengine::procparams::ColorManagementParams icm;
|
||||||
icm.working = working_color_space;
|
icm.working = working_color_space;
|
||||||
|
|
||||||
img_src.getImage(curr_wb, TR_NONE, img_float.get(), pp, rtengine::procparams::ToneCurveParams(), icm, rtengine::procparams::RAWParams());
|
img_src.getImage(curr_wb, TR_NONE, img_float.get(), pp, rtengine::procparams::ToneCurveParams(), rtengine::procparams::RAWParams());
|
||||||
|
|
||||||
if (!working_color_space.empty()) {
|
if (!working_color_space.empty()) {
|
||||||
img_src.convertColorSpace(img_float.get(), icm, curr_wb);
|
img_src.convertColorSpace(img_float.get(), icm, curr_wb);
|
||||||
|
@ -25,8 +25,6 @@
|
|||||||
#include "opthelper.h"
|
#include "opthelper.h"
|
||||||
#include "iccstore.h"
|
#include "iccstore.h"
|
||||||
|
|
||||||
#define pow_F(a,b) (xexpf(b*xlogf(a)))
|
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
namespace rtengine
|
namespace rtengine
|
||||||
@ -1526,9 +1524,9 @@ void Color::interpolateRGBColor (const float balance, const float r1, const floa
|
|||||||
|
|
||||||
|
|
||||||
void Color::interpolateRGBColor (float realL, float iplow, float iphigh, int algm, const float balance, int twoc, int metchrom,
|
void Color::interpolateRGBColor (float realL, float iplow, float iphigh, int algm, const float balance, int twoc, int metchrom,
|
||||||
bool chr, bool lum, float chromat, float luma, const float r1, const float g1, const float b1,
|
float chromat, float luma, const float r1, const float g1, const float b1,
|
||||||
const float xl, const float yl, const float zl, const float x2, const float y2, const float z2,
|
const float xl, const float yl, const float zl, const float x2, const float y2, const float z2,
|
||||||
int toDo, const double xyz_rgb[3][3], const double rgb_xyz[3][3], float &ro, float &go, float &bo)
|
const double xyz_rgb[3][3], const double rgb_xyz[3][3], float &ro, float &go, float &bo)
|
||||||
{
|
{
|
||||||
float X1, Y1, Z1, X2, Y2, Z2, X, Y, Z, XL, YL, ZL;
|
float X1, Y1, Z1, X2, Y2, Z2, X, Y, Z, XL, YL, ZL;
|
||||||
float L1 = 0.f, L2, LL, a_1 = 0.f, b_1 = 0.f, a_2 = 0.f, b_2 = 0.f, a_L, b_L;
|
float L1 = 0.f, L2, LL, a_1 = 0.f, b_1 = 0.f, a_2 = 0.f, b_2 = 0.f, a_L, b_L;
|
||||||
@ -1620,7 +1618,7 @@ void Color::interpolateRGBColor (float realL, float iplow, float iphigh, int alg
|
|||||||
Color::xyz2rgb(X, Y, Z, ro, go, bo, rgb_xyz);// ro go bo in gamut
|
Color::xyz2rgb(X, Y, Z, ro, go, bo, rgb_xyz);// ro go bo in gamut
|
||||||
}
|
}
|
||||||
|
|
||||||
void Color::calcGamma (double pwr, double ts, int mode, int imax, GammaValues &gamma)
|
void Color::calcGamma (double pwr, double ts, int mode, GammaValues &gamma)
|
||||||
{
|
{
|
||||||
//from Dcraw (D.Coffin)
|
//from Dcraw (D.Coffin)
|
||||||
int i;
|
int i;
|
||||||
@ -2604,7 +2602,7 @@ void Color::gamutLchonly (float2 sincosval, float &Lprov1, float &Chprov1, const
|
|||||||
* const double wip[3][3]: matrix for working profile
|
* const double wip[3][3]: matrix for working profile
|
||||||
* bool multiThread : parallelize the loop
|
* bool multiThread : parallelize the loop
|
||||||
*/
|
*/
|
||||||
SSEFUNCTION void Color::LabGamutMunsell(float *labL, float *laba, float *labb, const int N, bool corMunsell, bool lumaMuns, bool isHLEnabled, bool gamut, const double wip[3][3], bool multiThread )
|
SSEFUNCTION void Color::LabGamutMunsell(float *labL, float *laba, float *labb, const int N, bool corMunsell, bool lumaMuns, bool isHLEnabled, bool gamut, const double wip[3][3])
|
||||||
{
|
{
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
MyTime t1e, t2e;
|
MyTime t1e, t2e;
|
||||||
|
@ -733,7 +733,7 @@ public:
|
|||||||
* @param go green channel of output color [0 ; 65535] (return value)
|
* @param go green channel of output color [0 ; 65535] (return value)
|
||||||
* @param bo blue channel of output color [0 ; 65535] (return value)
|
* @param bo blue channel of output color [0 ; 65535] (return value)
|
||||||
*/
|
*/
|
||||||
static void interpolateRGBColor (float realL, float iplow, float iphigh, int algm, const float balance, int twoc, int metchrom, bool chr, bool lum, float chromat, float luma, const float r1, const float g1, const float b1, const float xl, const float yl, const float zl, const float x2, const float y2, const float z2, int channels, const double xyz_rgb[3][3], const double rgb_xyz[3][3], float &ro, float &go, float &bo);
|
static void interpolateRGBColor (float realL, float iplow, float iphigh, int algm, const float balance, int twoc, int metchrom, float chromat, float luma, const float r1, const float g1, const float b1, const float xl, const float yl, const float zl, const float x2, const float y2, const float z2, const double xyz_rgb[3][3], const double rgb_xyz[3][3], float &ro, float &go, float &bo);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -898,7 +898,7 @@ public:
|
|||||||
* gamma4 used in ip2Lab2rgb [0 ; 1], usually near 0.03(return value)
|
* gamma4 used in ip2Lab2rgb [0 ; 1], usually near 0.03(return value)
|
||||||
* gamma5 used in ip2Lab2rgb [0 ; 1], usually near 0.5 (return value)
|
* gamma5 used in ip2Lab2rgb [0 ; 1], usually near 0.5 (return value)
|
||||||
*/
|
*/
|
||||||
static void calcGamma (double pwr, double ts, int mode, int imax, GammaValues &gamma);
|
static void calcGamma (double pwr, double ts, int mode, GammaValues &gamma);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1310,7 +1310,7 @@ public:
|
|||||||
* @param wip matrix for working profile
|
* @param wip matrix for working profile
|
||||||
* @param multiThread whether to parallelize the loop or not
|
* @param multiThread whether to parallelize the loop or not
|
||||||
*/
|
*/
|
||||||
static void LabGamutMunsell (float *labL, float *laba, float *labb, const int N, bool corMunsell, bool lumaMuns, bool isHLEnabled, bool gamut, const double wip[3][3], bool multiThread );
|
static void LabGamutMunsell (float *labL, float *laba, float *labb, const int N, bool corMunsell, bool lumaMuns, bool isHLEnabled, bool gamut, const double wip[3][3]);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -24,11 +24,6 @@
|
|||||||
#include "sleef.c"
|
#include "sleef.c"
|
||||||
#include "settings.h"
|
#include "settings.h"
|
||||||
|
|
||||||
#undef CLIPD
|
|
||||||
#define CLIPD(a) ((a)>0.0?((a)<1.0?(a):1.0):0.0)
|
|
||||||
#define CLIPQQ(a) ((a)>0?((a)<250?(a):250):0)
|
|
||||||
#define MAXR(a,b) ((a) > (b) ? (a) : (b))
|
|
||||||
|
|
||||||
namespace rtengine
|
namespace rtengine
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -70,48 +65,22 @@ static const double cie_colour_match_jd[97][3] = {//350nm to 830nm 5 nm J.Desm
|
|||||||
{0.000001251141, 0.00000045181, 0.000000}
|
{0.000001251141, 0.00000045181, 0.000000}
|
||||||
};
|
};
|
||||||
|
|
||||||
ColorTemp::ColorTemp (double t, double g, double e, const Glib::ustring &m) : temp(t), green(g), equal(e), method(m)
|
ColorTemp::ColorTemp (double t, double g, double e, const std::string &m) : temp(t), green(g), equal(e), method(m)
|
||||||
{
|
{
|
||||||
|
|
||||||
clip (temp, green, equal);
|
clip (temp, green, equal);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ColorTemp::clip (double &temp, double &green)
|
void ColorTemp::clip (double &temp, double &green)
|
||||||
{
|
{
|
||||||
|
temp = rtengine::LIM(temp, MINTEMP, MAXTEMP);
|
||||||
if (temp < MINTEMP) {
|
green = rtengine::LIM(green, MINGREEN, MAXGREEN);
|
||||||
temp = MINTEMP;
|
|
||||||
} else if (temp > MAXTEMP) {
|
|
||||||
temp = MAXTEMP;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (green < MINGREEN) {
|
|
||||||
green = MINGREEN;
|
|
||||||
} else if (green > MAXGREEN) {
|
|
||||||
green = MAXGREEN;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ColorTemp::clip (double &temp, double &green, double &equal)
|
void ColorTemp::clip (double &temp, double &green, double &equal)
|
||||||
{
|
{
|
||||||
|
temp = rtengine::LIM(temp, MINTEMP, MAXTEMP);
|
||||||
if (temp < MINTEMP) {
|
green = rtengine::LIM(green, MINGREEN, MAXGREEN);
|
||||||
temp = MINTEMP;
|
equal = rtengine::LIM(equal, MINEQUAL, MAXEQUAL);
|
||||||
} else if (temp > MAXTEMP) {
|
|
||||||
temp = MAXTEMP;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (green < MINGREEN) {
|
|
||||||
green = MINGREEN;
|
|
||||||
} else if (green > MAXGREEN) {
|
|
||||||
green = MAXGREEN;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(equal < MINEQUAL) {
|
|
||||||
equal = MINEQUAL;
|
|
||||||
} else if(equal > MAXEQUAL) {
|
|
||||||
equal = MAXEQUAL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ColorTemp::ColorTemp (double mulr, double mulg, double mulb, double e) : equal(e), method("Custom")
|
ColorTemp::ColorTemp (double mulr, double mulg, double mulb, double e) : equal(e), method("Custom")
|
||||||
@ -122,7 +91,7 @@ ColorTemp::ColorTemp (double mulr, double mulg, double mulb, double e) : equal(e
|
|||||||
void ColorTemp::mul2temp (const double rmul, const double gmul, const double bmul, const double equal, double& temp, double& green) const
|
void ColorTemp::mul2temp (const double rmul, const double gmul, const double bmul, const double equal, double& temp, double& green) const
|
||||||
{
|
{
|
||||||
|
|
||||||
double maxtemp = double(MAXTEMP), mintemp = double(MINTEMP);
|
double maxtemp = MAXTEMP, mintemp = MINTEMP;
|
||||||
double tmpr, tmpg, tmpb;
|
double tmpr, tmpg, tmpb;
|
||||||
temp = (maxtemp + mintemp) / 2;
|
temp = (maxtemp + mintemp) / 2;
|
||||||
|
|
||||||
@ -354,6 +323,37 @@ const double ColorTemp::Flash6500_spect[97] = {
|
|||||||
55.72, 51.97, 54.72, 57.46, 58.89, 60.33
|
55.72, 51.97, 54.72, 57.46, 58.89, 60.33
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const std::map<std::string,const double *> ColorTemp::spectMap = {
|
||||||
|
{"Daylight", Daylight5300_spect},
|
||||||
|
{"Cloudy", Cloudy6200_spect},
|
||||||
|
{"Shade", Shade7600_spect},
|
||||||
|
{"Tungsten", A2856_spect},
|
||||||
|
{"Fluo F1", FluoF1_spect},
|
||||||
|
{"Fluo F2", FluoF2_spect},
|
||||||
|
{"Fluo F3", FluoF3_spect},
|
||||||
|
{"Fluo F4", FluoF4_spect},
|
||||||
|
{"Fluo F5", FluoF5_spect},
|
||||||
|
{"Fluo F6", FluoF6_spect},
|
||||||
|
{"Fluo F7", FluoF7_spect},
|
||||||
|
{"Fluo F8", FluoF8_spect},
|
||||||
|
{"Fluo F9", FluoF9_spect},
|
||||||
|
{"Fluo F10", FluoF10_spect},
|
||||||
|
{"Fluo F11", FluoF11_spect},
|
||||||
|
{"Fluo F12", FluoF12_spect},
|
||||||
|
{"HMI Lamp", HMI_spect},
|
||||||
|
{"GTI Lamp", GTI_spect},
|
||||||
|
{"JudgeIII Lamp", JudgeIII_spect},
|
||||||
|
{"Solux Lamp 3500K", Solux3500_spect},
|
||||||
|
{"Solux Lamp 4100K", Solux4100_spect},
|
||||||
|
{"Solux Lamp 4700K", Solux4700_spect},
|
||||||
|
{"NG Solux Lamp 4700K", NG_Solux4700_spect},
|
||||||
|
{"LED LSI Lumelex 2040", NG_LEDLSI2040_spect},
|
||||||
|
{"LED CRS SP12 WWMR16", NG_CRSSP12WWMR16_spect},
|
||||||
|
{"Flash 5500K", Flash5500_spect},
|
||||||
|
{"Flash 6000K", Flash6000_spect},
|
||||||
|
{"Flash 6500K", Flash6500_spect}
|
||||||
|
};
|
||||||
|
|
||||||
// Data for Color ==> CRI (Color Rendering Index and Palette
|
// Data for Color ==> CRI (Color Rendering Index and Palette
|
||||||
// actually 20 color that must be good enough for CRI
|
// actually 20 color that must be good enough for CRI
|
||||||
|
|
||||||
@ -844,10 +844,7 @@ const double ColorTemp::ColabSky42_0_m24_spect[97] = {
|
|||||||
* Gunter Wyszecki and W. S. Stiles, John Wiley & Sons, 1982, pp. 227, 228.
|
* Gunter Wyszecki and W. S. Stiles, John Wiley & Sons, 1982, pp. 227, 228.
|
||||||
*/
|
*/
|
||||||
//adaptation to RT by J.Desmis
|
//adaptation to RT by J.Desmis
|
||||||
#include <float.h>
|
|
||||||
|
|
||||||
/* LERP(a,b,c) = linear interpolation macro, is 'a' when c == 0.0 and 'b' when c == 1.0 */
|
|
||||||
#define LERP(a,b,c) (((b) - (a)) * (c) + (a))
|
|
||||||
int ColorTemp::XYZtoCorColorTemp(double x0, double y0, double z0, double &temp) const
|
int ColorTemp::XYZtoCorColorTemp(double x0, double y0, double z0, double &temp) const
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -922,13 +919,13 @@ int ColorTemp::XYZtoCorColorTemp(double x0, double y0, double z0, double &temp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (i == 31) {
|
if (i == 31) {
|
||||||
return(-1); /* bad XYZ input, color temp would be less than minimum of 1666.7 degrees, or too far towards blue */
|
return -1; /* bad XYZ input, color temp would be less than minimum of 1666.7 degrees, or too far towards blue */
|
||||||
}
|
}
|
||||||
|
|
||||||
di = di / sqrt(1.0 + uvt[i ].t * uvt[i ].t);
|
di = di / sqrt(1.0 + uvt[i ].t * uvt[i ].t);
|
||||||
dm = dm / sqrt(1.0 + uvt[i - 1].t * uvt[i - 1].t);
|
dm = dm / sqrt(1.0 + uvt[i - 1].t * uvt[i - 1].t);
|
||||||
p = dm / (dm - di); /* p = interpolation parameter, 0.0 : i-1, 1.0 : i */
|
p = dm / (dm - di); /* p = interpolation parameter, 0.0 : i-1, 1.0 : i */
|
||||||
p = 1.0 / (LERP(rt[i - 1], rt[i], p));
|
p = 1.0 / rtengine::intp(p, rt[i], rt[i - 1]);
|
||||||
temp = p;
|
temp = p;
|
||||||
return 0; /* success */
|
return 0; /* success */
|
||||||
}
|
}
|
||||||
@ -1025,192 +1022,15 @@ void ColorTemp::cieCAT02(double Xw, double Yw, double Zw, double &CAM02BB00, dou
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ColorTemp::temp2mulxyz (double tem, double gree, const std::string &method, double &Xxyz, double &Zxyz)
|
void ColorTemp::temp2mulxyz (double temp, const std::string &method, double &Xxyz, double &Zxyz)
|
||||||
{
|
{
|
||||||
double xD, yD, x_D, y_D, interm;
|
|
||||||
double x, y, z;
|
double x, y, z;
|
||||||
|
|
||||||
if (method == "Daylight" ) {
|
|
||||||
spectrum_to_xyz_preset(Daylight5300_spect, x, y, z);
|
|
||||||
} else if(method == "Cloudy" ) {
|
|
||||||
spectrum_to_xyz_preset(Cloudy6200_spect, x, y, z);
|
|
||||||
} else if(method == "Shade" ) {
|
|
||||||
spectrum_to_xyz_preset(Shade7600_spect, x, y, z);
|
|
||||||
} else if(method == "Tungsten" ) {
|
|
||||||
spectrum_to_xyz_preset(A2856_spect, x, y, z);
|
|
||||||
} else if(method == "Fluo F1" ) {
|
|
||||||
spectrum_to_xyz_preset(FluoF1_spect, x, y, z);
|
|
||||||
} else if(method == "Fluo F2" ) {
|
|
||||||
spectrum_to_xyz_preset(FluoF2_spect, x, y, z);
|
|
||||||
} else if(method == "Fluo F3" ) {
|
|
||||||
spectrum_to_xyz_preset(FluoF3_spect, x, y, z);
|
|
||||||
} else if(method == "Fluo F4" ) {
|
|
||||||
spectrum_to_xyz_preset(FluoF4_spect, x, y, z);
|
|
||||||
} else if(method == "Fluo F5" ) {
|
|
||||||
spectrum_to_xyz_preset(FluoF5_spect, x, y, z);
|
|
||||||
} else if(method == "Fluo F6" ) {
|
|
||||||
spectrum_to_xyz_preset(FluoF6_spect, x, y, z);
|
|
||||||
} else if(method == "Fluo F7" ) {
|
|
||||||
spectrum_to_xyz_preset(FluoF7_spect, x, y, z);
|
|
||||||
} else if(method == "Fluo F8" ) {
|
|
||||||
spectrum_to_xyz_preset(FluoF8_spect, x, y, z);
|
|
||||||
} else if(method == "Fluo F9" ) {
|
|
||||||
spectrum_to_xyz_preset(FluoF9_spect, x, y, z);
|
|
||||||
} else if(method == "Fluo F10" ) {
|
|
||||||
spectrum_to_xyz_preset(FluoF10_spect, x, y, z);
|
|
||||||
} else if(method == "Fluo F11" ) {
|
|
||||||
spectrum_to_xyz_preset(FluoF11_spect, x, y, z);
|
|
||||||
} else if(method == "Fluo F12" ) {
|
|
||||||
spectrum_to_xyz_preset(FluoF12_spect, x, y, z);
|
|
||||||
} else if(method == "HMI Lamp" ) {
|
|
||||||
spectrum_to_xyz_preset(HMI_spect, x, y, z);
|
|
||||||
} else if(method == "GTI Lamp" ) {
|
|
||||||
spectrum_to_xyz_preset(GTI_spect, x, y, z);
|
|
||||||
} else if(method == "JudgeIII Lamp" ) {
|
|
||||||
spectrum_to_xyz_preset(JudgeIII_spect, x, y, z);
|
|
||||||
} else if(method == "Solux Lamp 3500K" ) {
|
|
||||||
spectrum_to_xyz_preset(Solux3500_spect, x, y, z);
|
|
||||||
} else if(method == "Solux Lamp 4100K" ) {
|
|
||||||
spectrum_to_xyz_preset(Solux4100_spect, x, y, z);
|
|
||||||
} else if(method == "Solux Lamp 4700K" ) {
|
|
||||||
spectrum_to_xyz_preset(Solux4700_spect, x, y, z);
|
|
||||||
} else if(method == "NG Solux Lamp 4700K" ) {
|
|
||||||
spectrum_to_xyz_preset(NG_Solux4700_spect, x, y, z);
|
|
||||||
} else if(method == "LED LSI Lumelex 2040") {
|
|
||||||
spectrum_to_xyz_preset(NG_LEDLSI2040_spect, x, y, z);
|
|
||||||
} else if(method == "LED CRS SP12 WWMR16" ) {
|
|
||||||
spectrum_to_xyz_preset(NG_CRSSP12WWMR16_spect, x, y, z);
|
|
||||||
} else if(method == "Flash 5500K" ) {
|
|
||||||
spectrum_to_xyz_preset(Flash5500_spect, x, y, z);
|
|
||||||
} else if(method == "Flash 6000K" ) {
|
|
||||||
spectrum_to_xyz_preset(Flash6000_spect, x, y, z);
|
|
||||||
} else if(method == "Flash 6500K" ) {
|
|
||||||
spectrum_to_xyz_preset(Flash6500_spect, x, y, z);
|
|
||||||
} else {
|
|
||||||
// otherwise we use the Temp+Green generic solution
|
|
||||||
if (tem <= INITIALBLACKBODY) {
|
|
||||||
// if temperature is between 2000K and 4000K we use blackbody, because there will be no Daylight reference below 4000K...
|
|
||||||
// of course, the previous version of RT used the "magical" but wrong formula of U.Fuchs (Ufraw).
|
|
||||||
spectrum_to_xyz_blackbody(tem, x, y, z);
|
|
||||||
} else {
|
|
||||||
// from 4000K up to 25000K: using the D illuminant (daylight) which is standard
|
|
||||||
double m1, m2;
|
|
||||||
|
|
||||||
if (tem <= 7000) {
|
|
||||||
x_D = -4.6070e9 / (tem * tem * tem) + 2.9678e6 / (tem * tem) + 0.09911e3 / tem + 0.244063;
|
|
||||||
} else if (tem <= 25000) {
|
|
||||||
x_D = -2.0064e9 / (tem * tem * tem) + 1.9018e6 / (tem * tem) + 0.24748e3 / tem + 0.237040;
|
|
||||||
} else /*if (tem > 25000)*/ {
|
|
||||||
x_D = -2.0064e9 / (tem * tem * tem) + 1.9018e6 / (tem * tem) + 0.24748e3 / tem + 0.237040 - ((tem - 25000) / 25000) * 0.025; //Jacques empirical adjustemnt for very high temp (underwater !)
|
|
||||||
}
|
|
||||||
|
|
||||||
y_D = -3.0 * x_D * x_D + 2.87 * x_D - 0.275;
|
|
||||||
//calculate D -daylight in function of s0, s1, s2 and temp ==> x_D y_D
|
|
||||||
//S(lamda)=So(lambda)+m1*s1(lambda)+m2*s2(lambda)
|
|
||||||
interm = (0.0241 + 0.2562 * x_D - 0.734 * y_D);
|
|
||||||
m1 = (-1.3515 - 1.7703 * x_D + 5.9114 * y_D) / interm;
|
|
||||||
m2 = (0.03 - 31.4424 * x_D + 30.0717 * y_D) / interm;
|
|
||||||
spectrum_to_xyz_daylight(m1, m2, x, y, z);
|
|
||||||
xD = x;
|
|
||||||
yD = y;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
xD = x;
|
|
||||||
yD = y;
|
|
||||||
|
|
||||||
double X = xD / yD;
|
|
||||||
double Z = (1.0 - xD - yD) / yD;
|
|
||||||
Xxyz = X;
|
|
||||||
Zxyz = Z;
|
|
||||||
//printf("Xxyz=%f Zxyz=%f\n",Xxyz,Zxyz);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ColorTemp::temp2mul (double temp, double green, double equal, double& rmul, double& gmul, double& bmul) const
|
|
||||||
{
|
|
||||||
|
|
||||||
clip (temp, green, equal);
|
|
||||||
|
|
||||||
//printf("temp=%d green=%.3f equal=%.3f\n", (int)temp, (float) green, (float) equal);
|
|
||||||
|
|
||||||
//variables for CRI and display Lab, and palette
|
|
||||||
double xD, yD, x_D, y_D, interm;
|
|
||||||
double m1, m2;
|
|
||||||
|
|
||||||
double x, y, z;
|
|
||||||
double Xchk[50], Ychk[50], Zchk[50]; //50 : I think it's a good limit for number of color : for CRI and Palette
|
|
||||||
double Xcam02[50], Ycam02[50], Zcam02[50];
|
|
||||||
|
|
||||||
double XchkLamp[50], YchkLamp[50], ZchkLamp[50];
|
|
||||||
double Xcam02Lamp[50], Ycam02Lamp[50], Zcam02Lamp[50];
|
|
||||||
const double epsilon = 0.008856; //Lab
|
|
||||||
const double whiteD50[3] = {0.9646019585, 1.0, 0.8244507152}; //calculate with this tool : spect 5nm
|
|
||||||
double CAM02BB00, CAM02BB01, CAM02BB02, CAM02BB10, CAM02BB11, CAM02BB12, CAM02BB20, CAM02BB21, CAM02BB22; //for CIECAT02
|
|
||||||
|
|
||||||
double xr[50], yr[50], zr[50];
|
|
||||||
double fx[50], fy[50], fz[50];
|
|
||||||
|
|
||||||
// bool palette = false;
|
|
||||||
// double tempalet; // correlated temperature
|
|
||||||
|
|
||||||
// We first test for specially handled methods
|
// We first test for specially handled methods
|
||||||
if (method == "Daylight" ) {
|
const auto iterator = spectMap.find(method);
|
||||||
spectrum_to_xyz_preset(Daylight5300_spect, x, y, z);
|
|
||||||
} else if(method == "Cloudy" ) {
|
if (iterator != spectMap.end()) {
|
||||||
spectrum_to_xyz_preset(Cloudy6200_spect, x, y, z);
|
spectrum_to_xyz_preset(iterator->second, x, y, z);
|
||||||
} else if(method == "Shade" ) {
|
|
||||||
spectrum_to_xyz_preset(Shade7600_spect, x, y, z);
|
|
||||||
} else if(method == "Tungsten" ) {
|
|
||||||
spectrum_to_xyz_preset(A2856_spect, x, y, z);
|
|
||||||
} else if(method == "Fluo F1" ) {
|
|
||||||
spectrum_to_xyz_preset(FluoF1_spect, x, y, z);
|
|
||||||
} else if(method == "Fluo F2" ) {
|
|
||||||
spectrum_to_xyz_preset(FluoF2_spect, x, y, z);
|
|
||||||
} else if(method == "Fluo F3" ) {
|
|
||||||
spectrum_to_xyz_preset(FluoF3_spect, x, y, z);
|
|
||||||
} else if(method == "Fluo F4" ) {
|
|
||||||
spectrum_to_xyz_preset(FluoF4_spect, x, y, z);
|
|
||||||
} else if(method == "Fluo F5" ) {
|
|
||||||
spectrum_to_xyz_preset(FluoF5_spect, x, y, z);
|
|
||||||
} else if(method == "Fluo F6" ) {
|
|
||||||
spectrum_to_xyz_preset(FluoF6_spect, x, y, z);
|
|
||||||
} else if(method == "Fluo F7" ) {
|
|
||||||
spectrum_to_xyz_preset(FluoF7_spect, x, y, z);
|
|
||||||
} else if(method == "Fluo F8" ) {
|
|
||||||
spectrum_to_xyz_preset(FluoF8_spect, x, y, z);
|
|
||||||
} else if(method == "Fluo F9" ) {
|
|
||||||
spectrum_to_xyz_preset(FluoF9_spect, x, y, z);
|
|
||||||
} else if(method == "Fluo F10" ) {
|
|
||||||
spectrum_to_xyz_preset(FluoF10_spect, x, y, z);
|
|
||||||
} else if(method == "Fluo F11" ) {
|
|
||||||
spectrum_to_xyz_preset(FluoF11_spect, x, y, z);
|
|
||||||
} else if(method == "Fluo F12" ) {
|
|
||||||
spectrum_to_xyz_preset(FluoF12_spect, x, y, z);
|
|
||||||
} else if(method == "HMI Lamp" ) {
|
|
||||||
spectrum_to_xyz_preset(HMI_spect, x, y, z);
|
|
||||||
} else if(method == "GTI Lamp" ) {
|
|
||||||
spectrum_to_xyz_preset(GTI_spect, x, y, z);
|
|
||||||
} else if(method == "JudgeIII Lamp" ) {
|
|
||||||
spectrum_to_xyz_preset(JudgeIII_spect, x, y, z);
|
|
||||||
} else if(method == "Solux Lamp 3500K" ) {
|
|
||||||
spectrum_to_xyz_preset(Solux3500_spect, x, y, z);
|
|
||||||
} else if(method == "Solux Lamp 4100K" ) {
|
|
||||||
spectrum_to_xyz_preset(Solux4100_spect, x, y, z);
|
|
||||||
} else if(method == "Solux Lamp 4700K" ) {
|
|
||||||
spectrum_to_xyz_preset(Solux4700_spect, x, y, z);
|
|
||||||
} else if(method == "NG Solux Lamp 4700K" ) {
|
|
||||||
spectrum_to_xyz_preset(NG_Solux4700_spect, x, y, z);
|
|
||||||
} else if(method == "LED LSI Lumelex 2040") {
|
|
||||||
spectrum_to_xyz_preset(NG_LEDLSI2040_spect, x, y, z);
|
|
||||||
} else if(method == "LED CRS SP12 WWMR16" ) {
|
|
||||||
spectrum_to_xyz_preset(NG_CRSSP12WWMR16_spect, x, y, z);
|
|
||||||
} else if(method == "Flash 5500K" ) {
|
|
||||||
spectrum_to_xyz_preset(Flash5500_spect, x, y, z);
|
|
||||||
} else if(method == "Flash 6000K" ) {
|
|
||||||
spectrum_to_xyz_preset(Flash6000_spect, x, y, z);
|
|
||||||
} else if(method == "Flash 6500K" ) {
|
|
||||||
spectrum_to_xyz_preset(Flash6500_spect, x, y, z);
|
|
||||||
} else {
|
} else {
|
||||||
// otherwise we use the Temp+Green generic solution
|
// otherwise we use the Temp+Green generic solution
|
||||||
if (temp <= INITIALBLACKBODY) {
|
if (temp <= INITIALBLACKBODY) {
|
||||||
@ -1219,48 +1039,42 @@ void ColorTemp::temp2mul (double temp, double green, double equal, double& rmul,
|
|||||||
spectrum_to_xyz_blackbody(temp, x, y, z);
|
spectrum_to_xyz_blackbody(temp, x, y, z);
|
||||||
} else {
|
} else {
|
||||||
// from 4000K up to 25000K: using the D illuminant (daylight) which is standard
|
// from 4000K up to 25000K: using the D illuminant (daylight) which is standard
|
||||||
|
double x_D, y_D;
|
||||||
|
|
||||||
if (temp <= 7000) {
|
if (temp <= 7000) {
|
||||||
x_D = -4.6070e9 / (temp * temp * temp) + 2.9678e6 / (temp * temp) + 0.09911e3 / temp + 0.244063;
|
x_D = -4.6070e9 / (temp * temp * temp) + 2.9678e6 / (temp * temp) + 0.09911e3 / temp + 0.244063;
|
||||||
} else if (temp <= 25000) {
|
} else if (temp <= 25000) {
|
||||||
x_D = -2.0064e9 / (temp * temp * temp) + 1.9018e6 / (temp * temp) + 0.24748e3 / temp + 0.237040;
|
x_D = -2.0064e9 / (temp * temp * temp) + 1.9018e6 / (temp * temp) + 0.24748e3 / temp + 0.237040;
|
||||||
} else /*if (temp > 25000)*/ { // above 25000 it's unknown..then I have modified to adjust for underwater
|
} else /*if (temp > 25000)*/ {
|
||||||
x_D = -2.0064e9 / (temp * temp * temp) + 1.9018e6 / (temp * temp) + 0.24748e3 / temp + 0.237040 - ((temp - 25000) / 25000) * 0.025; //Jacques empirical adjustemnt for very high temp (underwater !)
|
x_D = -2.0064e9 / (temp * temp * temp) + 1.9018e6 / (temp * temp) + 0.24748e3 / temp + 0.237040 - ((temp - 25000) / 25000) * 0.025; //Jacques empirical adjustment for very high temp (underwater !)
|
||||||
}
|
}
|
||||||
|
|
||||||
y_D = (-3.0 * x_D * x_D + 2.87 * x_D - 0.275); //modify blue / red action
|
y_D = -3.0 * x_D * x_D + 2.87 * x_D - 0.275; //modify blue / red action
|
||||||
//calculate D -daylight in function of s0, s1, s2 and temp ==> x_D y_D
|
//calculate D -daylight in function of s0, s1, s2 and temp ==> x_D y_D
|
||||||
//S(lamda)=So(lambda)+m1*s1(lambda)+m2*s2(lambda)
|
//S(lamda)=So(lambda)+m1*s1(lambda)+m2*s2(lambda)
|
||||||
interm = (0.0241 + 0.2562 * x_D - 0.734 * y_D);
|
double interm = 0.0241 + 0.2562 * x_D - 0.734 * y_D;
|
||||||
m1 = (-1.3515 - 1.7703 * x_D + 5.9114 * y_D) / interm;
|
double m1 = (-1.3515 - 1.7703 * x_D + 5.9114 * y_D) / interm;
|
||||||
m2 = (0.03 - 31.4424 * x_D + 30.0717 * y_D) / interm;
|
double m2 = (0.03 - 31.4424 * x_D + 30.0717 * y_D) / interm;
|
||||||
spectrum_to_xyz_daylight(m1, m2, x, y, z);
|
spectrum_to_xyz_daylight(m1, m2, x, y, z);
|
||||||
xD = x;
|
|
||||||
yD = y;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
xD = x;
|
Xxyz = x / y;
|
||||||
yD = y;
|
Zxyz = (1.0 - x - y) / y;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ColorTemp::temp2mul (double temp, double green, double equal, double& rmul, double& gmul, double& bmul) const
|
||||||
|
{
|
||||||
|
clip(temp, green, equal);
|
||||||
|
double Xwb, Zwb;
|
||||||
|
temp2mulxyz(temp, method, Xwb, Zwb);
|
||||||
|
|
||||||
float adj = 1.f;
|
float adj = 1.f;
|
||||||
|
|
||||||
if(equal < 0.9999 || equal > 1.0001 ) {
|
if(equal < 0.9999 || equal > 1.0001 ) {
|
||||||
adj = (100.f + ( 1000.f - (1000.f * (float)equal) ) / 20.f) / 100.f;
|
adj = (100.f + ( 1000.f - (1000.f * (float)equal) ) / 20.f) / 100.f;
|
||||||
}
|
}
|
||||||
|
|
||||||
//printf("adj=%f\n",adj);
|
|
||||||
double Xwb = xD / yD;
|
|
||||||
double Ywb = 1.0;
|
|
||||||
double Zwb = (1.0 - xD - yD) / yD;
|
|
||||||
|
|
||||||
if (settings->verbose) {
|
|
||||||
// double u=4*xD/(-2*xD+12*yD+3);
|
|
||||||
// double v=6*yD/(-2*xD+12*yD+3);
|
|
||||||
// printf("xD=%f yD=%f u=%f v=%f\n",xD,yD,u,v);
|
|
||||||
if(settings->CRI_color != 0) {
|
|
||||||
printf("xD=%f yD=%f === Xwb=%f Ywb=%f Zwb=%f\n", xD, yD, Xwb, Ywb, Zwb);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*if (isRaw) {
|
/*if (isRaw) {
|
||||||
rmul = sRGB_xyz[0][0]*X + sRGB_xyz[0][1]*Y + sRGB_xyz[0][2]*Z;
|
rmul = sRGB_xyz[0][0]*X + sRGB_xyz[0][1]*Y + sRGB_xyz[0][2]*Z;
|
||||||
@ -1268,36 +1082,41 @@ void ColorTemp::temp2mul (double temp, double green, double equal, double& rmul,
|
|||||||
bmul = sRGB_xyz[2][0]*X + sRGB_xyz[2][1]*Y + sRGB_xyz[2][2]*Z;
|
bmul = sRGB_xyz[2][0]*X + sRGB_xyz[2][1]*Y + sRGB_xyz[2][2]*Z;
|
||||||
} else {*/
|
} else {*/
|
||||||
//recalculate channels multipliers with new values of XYZ tue to whitebalance
|
//recalculate channels multipliers with new values of XYZ tue to whitebalance
|
||||||
rmul = sRGBd65_xyz[0][0] * Xwb * adj + sRGBd65_xyz[0][1] * Ywb + sRGBd65_xyz[0][2] * Zwb / adj; // Jacques' empirical modification 5/2013
|
rmul = sRGBd65_xyz[0][0] * Xwb * adj + sRGBd65_xyz[0][1] + sRGBd65_xyz[0][2] * Zwb / adj; // Jacques' empirical modification 5/2013
|
||||||
gmul = sRGBd65_xyz[1][0] * Xwb + sRGBd65_xyz[1][1] * Ywb + sRGBd65_xyz[1][2] * Zwb;
|
gmul = sRGBd65_xyz[1][0] * Xwb + sRGBd65_xyz[1][1] + sRGBd65_xyz[1][2] * Zwb;
|
||||||
bmul = sRGBd65_xyz[2][0] * Xwb * adj + sRGBd65_xyz[2][1] * Ywb + sRGBd65_xyz[2][2] * Zwb / adj;
|
bmul = sRGBd65_xyz[2][0] * Xwb * adj + sRGBd65_xyz[2][1] + sRGBd65_xyz[2][2] * Zwb / adj;
|
||||||
//};
|
//};
|
||||||
gmul /= green;
|
gmul /= green;
|
||||||
//printf("rmul=%f gmul=%f bmul=%f\n",rmul, gmul, bmul);
|
//printf("rmul=%f gmul=%f bmul=%f\n",rmul, gmul, bmul);
|
||||||
double max = rmul;
|
double max = rtengine::max(rmul, gmul, bmul);
|
||||||
|
|
||||||
if (gmul > max) {
|
|
||||||
max = gmul;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (bmul > max) {
|
|
||||||
max = bmul;
|
|
||||||
}
|
|
||||||
|
|
||||||
rmul /= max;
|
rmul /= max;
|
||||||
gmul /= max;
|
gmul /= max;
|
||||||
bmul /= max;
|
bmul /= max;
|
||||||
|
|
||||||
// begin CRI_RT : color rendering index RT - adaptation of CRI by J.Desmis
|
|
||||||
// CRI = 100 for Blackbody and Daylight
|
|
||||||
// calculate from spectral data values X, Y, Z , for color of colorchecker24 , SG, DC, JDC_468
|
|
||||||
//only for lamp different of tungstene
|
|
||||||
//first calcul with illuminant (choice)
|
|
||||||
// and calcul with : blackbody at equivalent temp of lamp
|
|
||||||
|
|
||||||
if(settings->CRI_color != 0) //activate if CRi_color !=0
|
if(settings->CRI_color != 0) { //activate if CRi_color !=0
|
||||||
|
// begin CRI_RT : color rendering index RT - adaptation of CRI by J.Desmis
|
||||||
|
// CRI = 100 for Blackbody and Daylight
|
||||||
|
// calculate from spectral data values X, Y, Z , for color of colorchecker24 , SG, DC, JDC_468
|
||||||
|
// only for lamp different of tungstene
|
||||||
|
// first calcul with illuminant (choice)
|
||||||
|
// and calcul with : blackbody at equivalent temp of lamp
|
||||||
// CRI_color-1 = dispaly Lab values of color CRI_color -1
|
// CRI_color-1 = dispaly Lab values of color CRI_color -1
|
||||||
{
|
const double whiteD50[3] = {0.9646019585, 1.0, 0.8244507152}; //calculate with this tool : spect 5nm
|
||||||
|
double CAM02BB00, CAM02BB01, CAM02BB02, CAM02BB10, CAM02BB11, CAM02BB12, CAM02BB20, CAM02BB21, CAM02BB22; //for CIECAT02
|
||||||
|
double Xchk[50], Ychk[50], Zchk[50]; //50 : I think it's a good limit for number of color : for CRI and Palette
|
||||||
|
double Xcam02[50], Ycam02[50], Zcam02[50];
|
||||||
|
|
||||||
|
double XchkLamp[50], YchkLamp[50], ZchkLamp[50];
|
||||||
|
double Xcam02Lamp[50], Ycam02Lamp[50], Zcam02Lamp[50];
|
||||||
|
const double epsilon = 0.008856; //Lab
|
||||||
|
|
||||||
|
double xr[50], yr[50], zr[50];
|
||||||
|
double fx[50], fy[50], fz[50];
|
||||||
|
double x, y, z;
|
||||||
|
double Ywb = 1.0;
|
||||||
|
|
||||||
int illum;
|
int illum;
|
||||||
int numero_color = settings->CRI_color - 1;
|
int numero_color = settings->CRI_color - 1;
|
||||||
|
|
||||||
|
@ -19,22 +19,19 @@
|
|||||||
#ifndef _COLORTEMP_
|
#ifndef _COLORTEMP_
|
||||||
#define _COLORTEMP_
|
#define _COLORTEMP_
|
||||||
|
|
||||||
#include <glibmm.h>
|
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
#include <map>
|
||||||
#define pow_F(a,b) (xexpf(b*xlogf(a)))
|
|
||||||
|
|
||||||
namespace rtengine
|
namespace rtengine
|
||||||
{
|
{
|
||||||
|
|
||||||
#define MINTEMP 1500
|
constexpr double MINTEMP = 1500.0;
|
||||||
#define MAXTEMP 60000
|
constexpr double MAXTEMP = 60000.0;
|
||||||
#define MINGREEN 0.02
|
constexpr double MINGREEN = 0.02;
|
||||||
#define MAXGREEN 10.0
|
constexpr double MAXGREEN = 10.0;
|
||||||
#define MINEQUAL 0.8
|
constexpr double MINEQUAL = 0.8;
|
||||||
#define MAXEQUAL 1.5
|
constexpr double MAXEQUAL = 1.5;
|
||||||
|
constexpr double INITIALBLACKBODY = 4000.0;
|
||||||
#define INITIALBLACKBODY 4000
|
|
||||||
|
|
||||||
|
|
||||||
class ColorTemp
|
class ColorTemp
|
||||||
@ -49,12 +46,12 @@ private:
|
|||||||
static void clip (double &temp, double &green, double &equal);
|
static void clip (double &temp, double &green, double &equal);
|
||||||
int XYZtoCorColorTemp(double x0, double y0 , double z0, double &temp) const;
|
int XYZtoCorColorTemp(double x0, double y0 , double z0, double &temp) const;
|
||||||
void temp2mul (double temp, double green, double equal, double& rmul, double& gmul, double& bmul) const;
|
void temp2mul (double temp, double green, double equal, double& rmul, double& gmul, double& bmul) const;
|
||||||
|
const static std::map<std::string,const double *> spectMap;
|
||||||
public:
|
public:
|
||||||
|
|
||||||
ColorTemp () : temp(-1.), green(-1.), equal (1.), method("Custom") {}
|
ColorTemp () : temp(-1.), green(-1.), equal (1.), method("Custom") {}
|
||||||
explicit ColorTemp (double e) : temp(-1.), green(-1.), equal (e), method("Custom") {}
|
explicit ColorTemp (double e) : temp(-1.), green(-1.), equal (e), method("Custom") {}
|
||||||
ColorTemp (double t, double g, double e, const Glib::ustring &m);
|
ColorTemp (double t, double g, double e, const std::string &m);
|
||||||
ColorTemp (double mulr, double mulg, double mulb, double e);
|
ColorTemp (double mulr, double mulg, double mulb, double e);
|
||||||
|
|
||||||
void update (const double rmul, const double gmul, const double bmul, const double equal, const double tempBias=0.0)
|
void update (const double rmul, const double gmul, const double bmul, const double equal, const double tempBias=0.0)
|
||||||
@ -95,7 +92,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void mul2temp (const double rmul, const double gmul, const double bmul, const double equal, double& temp, double& green) const;
|
void mul2temp (const double rmul, const double gmul, const double bmul, const double equal, double& temp, double& green) const;
|
||||||
static void temp2mulxyz (double tem, double gree, const std::string &method, double &Xxyz, double &Zxyz);
|
static void temp2mulxyz (double tem, const std::string &method, double &Xxyz, double &Zxyz);
|
||||||
|
|
||||||
static void cieCAT02(double Xw, double Yw, double Zw, double &CAM02BB00, double &CAM02BB01, double &CAM02BB02, double &CAM02BB10, double &CAM02BB11, double &CAM02BB12, double &CAM02BB20, double &CAM02BB21, double &CAM02BB22, double adap );
|
static void cieCAT02(double Xw, double Yw, double Zw, double &CAM02BB00, double &CAM02BB01, double &CAM02BB02, double &CAM02BB10, double &CAM02BB11, double &CAM02BB12, double &CAM02BB20, double &CAM02BB21, double &CAM02BB22, double adap );
|
||||||
//static void CAT02 (Imagefloat* baseImg, const ProcParams* params);
|
//static void CAT02 (Imagefloat* baseImg, const ProcParams* params);
|
||||||
|
@ -476,14 +476,10 @@ void CurveFactory::complexsgnCurve (bool & autili, bool & butili, bool & ccutil
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
||||||
|
|
||||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
||||||
|
|
||||||
SSEFUNCTION void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, double hlcomprthresh,
|
SSEFUNCTION void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, double hlcomprthresh,
|
||||||
double shcompr, double br, double contr,
|
double shcompr, double br, double contr,
|
||||||
procparams::ToneCurveParams::eTCModeId curveMode, const std::vector<double>& curvePoints,
|
const std::vector<double>& curvePoints,
|
||||||
procparams::ToneCurveParams::eTCModeId curveMode2, const std::vector<double>& curvePoints2,
|
const std::vector<double>& curvePoints2,
|
||||||
LUTu & histogram,
|
LUTu & histogram,
|
||||||
LUTf & hlCurve, LUTf & shCurve, LUTf & outCurve,
|
LUTf & hlCurve, LUTf & shCurve, LUTf & outCurve,
|
||||||
LUTu & outBeforeCCurveHistogram,
|
LUTu & outBeforeCCurveHistogram,
|
||||||
@ -1360,7 +1356,7 @@ void ColorGradientCurve::Reset()
|
|||||||
lut3.reset();
|
lut3.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ColorGradientCurve::SetXYZ(const Curve *pCurve, const double xyz_rgb[3][3], const double rgb_xyz[3][3], float satur, float lumin)
|
void ColorGradientCurve::SetXYZ(const Curve *pCurve, const double xyz_rgb[3][3], float satur, float lumin)
|
||||||
{
|
{
|
||||||
if (pCurve->isIdentity()) {
|
if (pCurve->isIdentity()) {
|
||||||
lut1.reset();
|
lut1.reset();
|
||||||
@ -1500,7 +1496,7 @@ void ColorGradientCurve::SetXYZ(const Curve *pCurve, const double xyz_rgb[3][3],
|
|||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
void ColorGradientCurve::SetXYZ(const std::vector<double> &curvePoints, const double xyz_rgb[3][3], const double rgb_xyz[3][3], float satur, float lumin)
|
void ColorGradientCurve::SetXYZ(const std::vector<double> &curvePoints, const double xyz_rgb[3][3], float satur, float lumin)
|
||||||
{
|
{
|
||||||
std::unique_ptr<FlatCurve> tcurve;
|
std::unique_ptr<FlatCurve> tcurve;
|
||||||
|
|
||||||
@ -1509,11 +1505,11 @@ void ColorGradientCurve::SetXYZ(const std::vector<double> &curvePoints, const do
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (tcurve) {
|
if (tcurve) {
|
||||||
SetXYZ(tcurve.get(), xyz_rgb, rgb_xyz, satur, lumin);
|
SetXYZ(tcurve.get(), xyz_rgb, satur, lumin);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ColorGradientCurve::SetRGB(const Curve *pCurve, const double xyz_rgb[3][3], const double rgb_xyz[3][3])
|
void ColorGradientCurve::SetRGB(const Curve *pCurve)
|
||||||
{
|
{
|
||||||
if (pCurve->isIdentity()) {
|
if (pCurve->isIdentity()) {
|
||||||
lut1.reset();
|
lut1.reset();
|
||||||
@ -1599,7 +1595,7 @@ void ColorGradientCurve::SetRGB(const Curve *pCurve, const double xyz_rgb[3][3],
|
|||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
void ColorGradientCurve::SetRGB(const std::vector<double> &curvePoints, const double xyz_rgb[3][3], const double rgb_xyz[3][3])
|
void ColorGradientCurve::SetRGB(const std::vector<double> &curvePoints)
|
||||||
{
|
{
|
||||||
std::unique_ptr<FlatCurve> tcurve;
|
std::unique_ptr<FlatCurve> tcurve;
|
||||||
|
|
||||||
@ -1608,7 +1604,7 @@ void ColorGradientCurve::SetRGB(const std::vector<double> &curvePoints, const do
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (tcurve) {
|
if (tcurve) {
|
||||||
SetRGB(tcurve.get(), xyz_rgb, rgb_xyz);
|
SetRGB(tcurve.get());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1986,7 +1982,7 @@ void PerceptualToneCurve::Apply(float &r, float &g, float &b, PerceptualToneCurv
|
|||||||
Ciecam02::jch2xyz_ciecam02float( x, y, z,
|
Ciecam02::jch2xyz_ciecam02float( x, y, z,
|
||||||
J, C, h,
|
J, C, h,
|
||||||
xw, yw, zw,
|
xw, yw, zw,
|
||||||
f, c, nc, 1, pow1, nbb, ncb, fl, cz, d, aw );
|
c, nc, 1, pow1, nbb, ncb, fl, cz, d, aw );
|
||||||
|
|
||||||
if (!isfinite(x) || !isfinite(y) || !isfinite(z)) {
|
if (!isfinite(x) || !isfinite(y) || !isfinite(z)) {
|
||||||
// can happen for colors on the rim of being outside gamut, that worked without chroma scaling but not with. Then we return only the curve's result.
|
// can happen for colors on the rim of being outside gamut, that worked without chroma scaling but not with. Then we return only the curve's result.
|
||||||
|
@ -281,7 +281,7 @@ public:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
static void complexCurve (double ecomp, double black, double hlcompr, double hlcomprthresh, double shcompr, double br, double contr,
|
static void complexCurve (double ecomp, double black, double hlcompr, double hlcomprthresh, double shcompr, double br, double contr,
|
||||||
procparams::ToneCurveParams::eTCModeId curveMode, const std::vector<double>& curvePoints, procparams::ToneCurveParams::eTCModeId curveMode2, const std::vector<double>& curvePoints2,
|
const std::vector<double>& curvePoints, const std::vector<double>& curvePoints2,
|
||||||
LUTu & histogram, LUTf & hlCurve, LUTf & shCurve, LUTf & outCurve, LUTu & outBeforeCCurveHistogram, ToneCurve & outToneCurve, ToneCurve & outToneCurve2,
|
LUTu & histogram, LUTf & hlCurve, LUTf & shCurve, LUTf & outCurve, LUTu & outBeforeCCurveHistogram, ToneCurve & outToneCurve, ToneCurve & outToneCurve2,
|
||||||
|
|
||||||
int skip = 1);
|
int skip = 1);
|
||||||
@ -687,10 +687,10 @@ public:
|
|||||||
virtual ~ColorGradientCurve() {};
|
virtual ~ColorGradientCurve() {};
|
||||||
|
|
||||||
void Reset();
|
void Reset();
|
||||||
void SetXYZ(const Curve *pCurve, const double xyz_rgb[3][3], const double rgb_xyz[3][3], float satur, float lumin);
|
void SetXYZ(const Curve *pCurve, const double xyz_rgb[3][3], float satur, float lumin);
|
||||||
void SetXYZ(const std::vector<double> &curvePoints, const double xyz_rgb[3][3], const double rgb_xyz[3][3], float satur, float lumin);
|
void SetXYZ(const std::vector<double> &curvePoints, const double xyz_rgb[3][3], float satur, float lumin);
|
||||||
void SetRGB(const Curve *pCurve, const double xyz_rgb[3][3], const double rgb_xyz[3][3]);
|
void SetRGB(const Curve *pCurve);
|
||||||
void SetRGB(const std::vector<double> &curvePoints, const double xyz_rgb[3][3], const double rgb_xyz[3][3]);
|
void SetRGB(const std::vector<double> &curvePoints);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Get the value of Red, Green and Blue corresponding to the requested index
|
* @brief Get the value of Red, Green and Blue corresponding to the requested index
|
||||||
@ -801,11 +801,6 @@ class StandardToneCurve : public ToneCurve
|
|||||||
public:
|
public:
|
||||||
void Apply(float& r, float& g, float& b) const;
|
void Apply(float& r, float& g, float& b) const;
|
||||||
};
|
};
|
||||||
class StandardToneCurvebw : public ToneCurve
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
void Apply(float& r, float& g, float& b) const;
|
|
||||||
};
|
|
||||||
|
|
||||||
class AdobeToneCurve : public ToneCurve
|
class AdobeToneCurve : public ToneCurve
|
||||||
{
|
{
|
||||||
@ -816,27 +811,12 @@ public:
|
|||||||
void Apply(float& r, float& g, float& b) const;
|
void Apply(float& r, float& g, float& b) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
class AdobeToneCurvebw : public ToneCurve
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
void RGBTone(float& r, float& g, float& b) const; // helper for tone curve
|
|
||||||
|
|
||||||
public:
|
|
||||||
void Apply(float& r, float& g, float& b) const;
|
|
||||||
};
|
|
||||||
|
|
||||||
class SatAndValueBlendingToneCurve : public ToneCurve
|
class SatAndValueBlendingToneCurve : public ToneCurve
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
void Apply(float& r, float& g, float& b) const;
|
void Apply(float& r, float& g, float& b) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
class SatAndValueBlendingToneCurvebw : public ToneCurve
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
void Apply(float& r, float& g, float& b) const;
|
|
||||||
};
|
|
||||||
|
|
||||||
class WeightedStdToneCurve : public ToneCurve
|
class WeightedStdToneCurve : public ToneCurve
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
@ -884,14 +864,6 @@ public:
|
|||||||
void Apply(float& r, float& g, float& b, PerceptualToneCurveState & state) const;
|
void Apply(float& r, float& g, float& b, PerceptualToneCurveState & state) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
class WeightedStdToneCurvebw : public ToneCurve
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
float Triangle(float refX, float refY, float X2) const;
|
|
||||||
public:
|
|
||||||
void Apply(float& r, float& g, float& b) const;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Standard tone curve
|
// Standard tone curve
|
||||||
inline void StandardToneCurve::Apply (float& r, float& g, float& b) const
|
inline void StandardToneCurve::Apply (float& r, float& g, float& b) const
|
||||||
{
|
{
|
||||||
@ -902,16 +874,6 @@ inline void StandardToneCurve::Apply (float& r, float& g, float& b) const
|
|||||||
g = lutToneCurve[g];
|
g = lutToneCurve[g];
|
||||||
b = lutToneCurve[b];
|
b = lutToneCurve[b];
|
||||||
}
|
}
|
||||||
// Standard tone curve
|
|
||||||
inline void StandardToneCurvebw::Apply (float& r, float& g, float& b) const
|
|
||||||
{
|
|
||||||
|
|
||||||
assert (lutToneCurve);
|
|
||||||
|
|
||||||
r = lutToneCurve[r];
|
|
||||||
g = lutToneCurve[g];
|
|
||||||
b = lutToneCurve[b];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tone curve according to Adobe's reference implementation
|
// Tone curve according to Adobe's reference implementation
|
||||||
// values in 0xffff space
|
// values in 0xffff space
|
||||||
@ -943,33 +905,6 @@ inline void AdobeToneCurve::Apply (float& r, float& g, float& b) const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
inline void AdobeToneCurvebw::Apply (float& r, float& g, float& b) const
|
|
||||||
{
|
|
||||||
|
|
||||||
assert (lutToneCurve);
|
|
||||||
|
|
||||||
if (r >= g) {
|
|
||||||
if (g > b) {
|
|
||||||
RGBTone (r, g, b); // Case 1: r >= g > b
|
|
||||||
} else if (b > r) {
|
|
||||||
RGBTone (b, r, g); // Case 2: b > r >= g
|
|
||||||
} else if (b > g) {
|
|
||||||
RGBTone (r, b, g); // Case 3: r >= b > g
|
|
||||||
} else { // Case 4: r >= g == b
|
|
||||||
r = lutToneCurve[r];
|
|
||||||
g = lutToneCurve[g];
|
|
||||||
b = g;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (r >= b) {
|
|
||||||
RGBTone (g, r, b); // Case 5: g > r >= b
|
|
||||||
} else if (b > g) {
|
|
||||||
RGBTone (b, g, r); // Case 6: b > g > r
|
|
||||||
} else {
|
|
||||||
RGBTone (g, b, r); // Case 7: g >= b > r
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void AdobeToneCurve::RGBTone (float& r, float& g, float& b) const
|
inline void AdobeToneCurve::RGBTone (float& r, float& g, float& b) const
|
||||||
{
|
{
|
||||||
@ -979,14 +914,6 @@ inline void AdobeToneCurve::RGBTone (float& r, float& g, float& b) const
|
|||||||
b = lutToneCurve[bold];
|
b = lutToneCurve[bold];
|
||||||
g = b + ((r - b) * (gold - bold) / (rold - bold));
|
g = b + ((r - b) * (gold - bold) / (rold - bold));
|
||||||
}
|
}
|
||||||
inline void AdobeToneCurvebw::RGBTone (float& r, float& g, float& b) const
|
|
||||||
{
|
|
||||||
float rold = r, gold = g, bold = b;
|
|
||||||
|
|
||||||
r = lutToneCurve[rold];
|
|
||||||
b = lutToneCurve[bold];
|
|
||||||
g = b + ((r - b) * (gold - bold) / (rold - bold));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Modifying the Luminance channel only
|
// Modifying the Luminance channel only
|
||||||
inline void LuminanceToneCurve::Apply(float &r, float &g, float &b) const
|
inline void LuminanceToneCurve::Apply(float &r, float &g, float &b) const
|
||||||
@ -1019,23 +946,6 @@ inline float WeightedStdToneCurve::Triangle(float a, float a1, float b) const
|
|||||||
|
|
||||||
return a1;
|
return a1;
|
||||||
}
|
}
|
||||||
inline float WeightedStdToneCurvebw::Triangle(float a, float a1, float b) const
|
|
||||||
{
|
|
||||||
if (a != b) {
|
|
||||||
float b1;
|
|
||||||
float a2 = a1 - a;
|
|
||||||
|
|
||||||
if (b < a) {
|
|
||||||
b1 = b + a2 * b / a ;
|
|
||||||
} else {
|
|
||||||
b1 = b + a2 * (65535.f - b) / (65535.f - a);
|
|
||||||
}
|
|
||||||
|
|
||||||
return b1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return a1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tone curve modifying the value channel only, preserving hue and saturation
|
// Tone curve modifying the value channel only, preserving hue and saturation
|
||||||
// values in 0xffff space
|
// values in 0xffff space
|
||||||
@ -1061,28 +971,6 @@ inline void WeightedStdToneCurve::Apply (float& r, float& g, float& b) const
|
|||||||
b = CLIP<float>(b1 * 0.25f + b2 * 0.25f + b3 * 0.50f);
|
b = CLIP<float>(b1 * 0.25f + b2 * 0.25f + b3 * 0.50f);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void WeightedStdToneCurvebw::Apply (float& r, float& g, float& b) const
|
|
||||||
{
|
|
||||||
|
|
||||||
assert (lutToneCurve);
|
|
||||||
|
|
||||||
float r1 = lutToneCurve[r];
|
|
||||||
float g1 = Triangle(r, r1, g);
|
|
||||||
float b1 = Triangle(r, r1, b);
|
|
||||||
|
|
||||||
float g2 = lutToneCurve[g];
|
|
||||||
float r2 = Triangle(g, g2, r);
|
|
||||||
float b2 = Triangle(g, g2, b);
|
|
||||||
|
|
||||||
float b3 = lutToneCurve[b];
|
|
||||||
float r3 = Triangle(b, b3, r);
|
|
||||||
float g3 = Triangle(b, b3, g);
|
|
||||||
|
|
||||||
r = CLIP<float>( r1 * 0.50f + r2 * 0.25f + r3 * 0.25f);
|
|
||||||
g = CLIP<float>(g1 * 0.25f + g2 * 0.50f + g3 * 0.25f);
|
|
||||||
b = CLIP<float>(b1 * 0.25f + b2 * 0.25f + b3 * 0.50f);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tone curve modifying the value channel only, preserving hue and saturation
|
// Tone curve modifying the value channel only, preserving hue and saturation
|
||||||
// values in 0xffff space
|
// values in 0xffff space
|
||||||
inline void SatAndValueBlendingToneCurve::Apply (float& r, float& g, float& b) const
|
inline void SatAndValueBlendingToneCurve::Apply (float& r, float& g, float& b) const
|
||||||
@ -1099,54 +987,20 @@ inline void SatAndValueBlendingToneCurve::Apply (float& r, float& g, float& b) c
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool increase = newLum > lum;
|
|
||||||
|
|
||||||
Color::rgb2hsv(r, g, b, h, s, v);
|
Color::rgb2hsv(r, g, b, h, s, v);
|
||||||
|
|
||||||
if (increase) {
|
float dV;
|
||||||
|
if (newLum > lum) {
|
||||||
// Linearly targeting Value = 1 and Saturation = 0
|
// Linearly targeting Value = 1 and Saturation = 0
|
||||||
float coef = (newLum - lum) / (65535.f - lum);
|
float coef = (newLum - lum) / (65535.f - lum);
|
||||||
float dV = (1.f - v) * coef;
|
dV = (1.f - v) * coef;
|
||||||
s *= 1.f - coef;
|
s *= 1.f - coef;
|
||||||
Color::hsv2rgb(h, s, v + dV, r, g, b);
|
|
||||||
} else {
|
} else {
|
||||||
// Linearly targeting Value = 0
|
// Linearly targeting Value = 0
|
||||||
float coef = (lum - newLum) / lum ;
|
float coef = (newLum - lum) / lum ;
|
||||||
float dV = v * coef;
|
dV = v * coef;
|
||||||
Color::hsv2rgb(h, s, v - dV, r, g, b);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void SatAndValueBlendingToneCurvebw::Apply (float& r, float& g, float& b) const
|
|
||||||
{
|
|
||||||
|
|
||||||
assert (lutToneCurve);
|
|
||||||
|
|
||||||
float h, s, v;
|
|
||||||
float lum = (r + g + b) / 3.f;
|
|
||||||
//float lum = Color::rgbLuminance(r, g, b);
|
|
||||||
float newLum = lutToneCurve[lum];
|
|
||||||
|
|
||||||
if (newLum == lum) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool increase = newLum > lum;
|
|
||||||
|
|
||||||
Color::rgb2hsv(r, g, b, h, s, v);
|
|
||||||
|
|
||||||
if (increase) {
|
|
||||||
// Linearly targeting Value = 1 and Saturation = 0
|
|
||||||
float coef = (newLum - lum) / (65535.f - lum);
|
|
||||||
float dV = (1.f - v) * coef;
|
|
||||||
s *= 1.f - coef;
|
|
||||||
Color::hsv2rgb(h, s, v + dV, r, g, b);
|
|
||||||
} else {
|
|
||||||
// Linearly targeting Value = 0
|
|
||||||
float coef = (lum - newLum) / lum ;
|
|
||||||
float dV = v * coef;
|
|
||||||
Color::hsv2rgb(h, s, v - dV, r, g, b);
|
|
||||||
}
|
}
|
||||||
|
Color::hsv2rgb(h, s, v + dV, r, g, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -285,8 +285,8 @@ void fuji_extend_generic(ushort *linebuf[_ltotal], int line_width, int start, in
|
|||||||
void fuji_extend_red(ushort *linebuf[_ltotal], int line_width);
|
void fuji_extend_red(ushort *linebuf[_ltotal], int line_width);
|
||||||
void fuji_extend_green(ushort *linebuf[_ltotal], int line_width);
|
void fuji_extend_green(ushort *linebuf[_ltotal], int line_width);
|
||||||
void fuji_extend_blue(ushort *linebuf[_ltotal], int line_width);
|
void fuji_extend_blue(ushort *linebuf[_ltotal], int line_width);
|
||||||
void xtrans_decode_block(struct fuji_compressed_block* info, const struct fuji_compressed_params *params, int cur_line);
|
void xtrans_decode_block(struct fuji_compressed_block* info, const struct fuji_compressed_params *params);
|
||||||
void fuji_bayer_decode_block(struct fuji_compressed_block* info, const struct fuji_compressed_params *params, int cur_line);
|
void fuji_bayer_decode_block(struct fuji_compressed_block* info, const struct fuji_compressed_params *params);
|
||||||
void fuji_decode_strip(const struct fuji_compressed_params* info_common, int cur_block, INT64 raw_offset, unsigned dsize);
|
void fuji_decode_strip(const struct fuji_compressed_params* info_common, int cur_block, INT64 raw_offset, unsigned dsize);
|
||||||
void fuji_compressed_load_raw();
|
void fuji_compressed_load_raw();
|
||||||
void fuji_decode_loop(const struct fuji_compressed_params* common_info, int count, INT64* raw_block_offsets, unsigned *block_sizes);
|
void fuji_decode_loop(const struct fuji_compressed_params* common_info, int count, INT64* raw_block_offsets, unsigned *block_sizes);
|
||||||
|
@ -228,18 +228,18 @@ void Crop::update (int todo)
|
|||||||
if (settings->leveldnautsimpl == 1) {
|
if (settings->leveldnautsimpl == 1) {
|
||||||
if (params.dirpyrDenoise.Cmethod == "MAN" || params.dirpyrDenoise.Cmethod == "PON" ) {
|
if (params.dirpyrDenoise.Cmethod == "MAN" || params.dirpyrDenoise.Cmethod == "PON" ) {
|
||||||
PreviewProps pp (trafx, trafy, trafw * skip, trafh * skip, skip);
|
PreviewProps pp (trafx, trafy, trafw * skip, trafh * skip, skip);
|
||||||
parent->imgsrc->getImage (parent->currWB, tr, origCrop, pp, params.toneCurve, params.icm, params.raw );
|
parent->imgsrc->getImage (parent->currWB, tr, origCrop, pp, params.toneCurve, params.raw );
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (params.dirpyrDenoise.C2method == "MANU") {
|
if (params.dirpyrDenoise.C2method == "MANU") {
|
||||||
PreviewProps pp (trafx, trafy, trafw * skip, trafh * skip, skip);
|
PreviewProps pp (trafx, trafy, trafw * skip, trafh * skip, skip);
|
||||||
parent->imgsrc->getImage (parent->currWB, tr, origCrop, pp, params.toneCurve, params.icm, params.raw );
|
parent->imgsrc->getImage (parent->currWB, tr, origCrop, pp, params.toneCurve, params.raw );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((settings->leveldnautsimpl == 1 && params.dirpyrDenoise.Cmethod == "PRE") || (settings->leveldnautsimpl == 0 && params.dirpyrDenoise.C2method == "PREV")) {
|
if ((settings->leveldnautsimpl == 1 && params.dirpyrDenoise.Cmethod == "PRE") || (settings->leveldnautsimpl == 0 && params.dirpyrDenoise.C2method == "PREV")) {
|
||||||
PreviewProps pp (trafx, trafy, trafw * skip, trafh * skip, skip);
|
PreviewProps pp (trafx, trafy, trafw * skip, trafh * skip, skip);
|
||||||
parent->imgsrc->getImage (parent->currWB, tr, origCrop, pp, params.toneCurve, params.icm, params.raw );
|
parent->imgsrc->getImage (parent->currWB, tr, origCrop, pp, params.toneCurve, params.raw );
|
||||||
|
|
||||||
if ((!isDetailWindow) && parent->adnListener && skip == 1 && params.dirpyrDenoise.enabled) {
|
if ((!isDetailWindow) && parent->adnListener && skip == 1 && params.dirpyrDenoise.enabled) {
|
||||||
float lowdenoise = 1.f;
|
float lowdenoise = 1.f;
|
||||||
@ -451,7 +451,7 @@ void Crop::update (int todo)
|
|||||||
for (int wcr = 0; wcr <= 2; wcr++) {
|
for (int wcr = 0; wcr <= 2; wcr++) {
|
||||||
for (int hcr = 0; hcr <= 2; hcr++) {
|
for (int hcr = 0; hcr <= 2; hcr++) {
|
||||||
PreviewProps ppP (coordW[wcr], coordH[hcr], crW, crH, 1);
|
PreviewProps ppP (coordW[wcr], coordH[hcr], crW, crH, 1);
|
||||||
parent->imgsrc->getImage (parent->currWB, tr, origCropPart, ppP, params.toneCurve, params.icm, params.raw );
|
parent->imgsrc->getImage (parent->currWB, tr, origCropPart, ppP, params.toneCurve, params.raw );
|
||||||
|
|
||||||
// we only need image reduced to 1/4 here
|
// we only need image reduced to 1/4 here
|
||||||
for (int ii = 0; ii < crH; ii += 2) {
|
for (int ii = 0; ii < crH; ii += 2) {
|
||||||
@ -613,7 +613,7 @@ void Crop::update (int todo)
|
|||||||
// if(params.dirpyrDenoise.Cmethod=="AUT" || params.dirpyrDenoise.Cmethod=="PON") {//reinit origCrop after Auto
|
// if(params.dirpyrDenoise.Cmethod=="AUT" || params.dirpyrDenoise.Cmethod=="PON") {//reinit origCrop after Auto
|
||||||
if ((settings->leveldnautsimpl == 1 && params.dirpyrDenoise.Cmethod == "AUT") || (settings->leveldnautsimpl == 0 && params.dirpyrDenoise.C2method == "AUTO")) { //reinit origCrop after Auto
|
if ((settings->leveldnautsimpl == 1 && params.dirpyrDenoise.Cmethod == "AUT") || (settings->leveldnautsimpl == 0 && params.dirpyrDenoise.C2method == "AUTO")) { //reinit origCrop after Auto
|
||||||
PreviewProps pp (trafx, trafy, trafw * skip, trafh * skip, skip);
|
PreviewProps pp (trafx, trafy, trafw * skip, trafh * skip, skip);
|
||||||
parent->imgsrc->getImage (parent->currWB, tr, origCrop, pp, params.toneCurve, params.icm, params.raw );
|
parent->imgsrc->getImage (parent->currWB, tr, origCrop, pp, params.toneCurve, params.raw );
|
||||||
}
|
}
|
||||||
|
|
||||||
DirPyrDenoiseParams denoiseParams = params.dirpyrDenoise;
|
DirPyrDenoiseParams denoiseParams = params.dirpyrDenoise;
|
||||||
@ -653,8 +653,8 @@ void Crop::update (int todo)
|
|||||||
if (skip == 1 && denoiseParams.enabled) {
|
if (skip == 1 && denoiseParams.enabled) {
|
||||||
int kall = 0;
|
int kall = 0;
|
||||||
|
|
||||||
float chaut, redaut, blueaut, maxredaut, maxblueaut, nresi, highresi;
|
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, chaut, redaut, blueaut, maxredaut, maxblueaut, 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);
|
||||||
|
|
||||||
if (parent->adnListener) {
|
if (parent->adnListener) {
|
||||||
parent->adnListener->noiseChanged (nresi, highresi);
|
parent->adnListener->noiseChanged (nresi, highresi);
|
||||||
@ -763,7 +763,7 @@ void Crop::update (int todo)
|
|||||||
if (todo & M_RGBCURVE) {
|
if (todo & M_RGBCURVE) {
|
||||||
double rrm, ggm, bbm;
|
double rrm, ggm, bbm;
|
||||||
DCPProfile::ApplyState as;
|
DCPProfile::ApplyState as;
|
||||||
DCPProfile *dcpProf = parent->imgsrc->getDCP (params.icm, parent->currWB, as);
|
DCPProfile *dcpProf = parent->imgsrc->getDCP (params.icm, as);
|
||||||
|
|
||||||
LUTu histToneCurve;
|
LUTu histToneCurve;
|
||||||
parent->ipf.rgbProc (baseCrop, laboCrop, this, parent->hltonecurve, parent->shtonecurve, parent->tonecurve, cshmap,
|
parent->ipf.rgbProc (baseCrop, laboCrop, this, parent->hltonecurve, parent->shtonecurve, parent->tonecurve, cshmap,
|
||||||
@ -801,7 +801,6 @@ void Crop::update (int todo)
|
|||||||
bool ccutili = parent->ccutili;
|
bool ccutili = parent->ccutili;
|
||||||
bool clcutili = parent->clcutili;
|
bool clcutili = parent->clcutili;
|
||||||
bool cclutili = parent->cclutili;
|
bool cclutili = parent->cclutili;
|
||||||
bool wavcontlutili = parent->wavcontlutili;
|
|
||||||
|
|
||||||
LUTu dummy;
|
LUTu dummy;
|
||||||
// parent->ipf.MSR(labnCrop, labnCrop->W, labnCrop->H, 1);
|
// parent->ipf.MSR(labnCrop, labnCrop->W, labnCrop->H, 1);
|
||||||
@ -921,7 +920,7 @@ void Crop::update (int todo)
|
|||||||
|
|
||||||
params.wavelet.getCurves (wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL);
|
params.wavelet.getCurves (wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL);
|
||||||
|
|
||||||
parent->ipf.ip_wavelet (labnCrop, labnCrop, kall, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, parent->wavclCurve, wavcontlutili, skip);
|
parent->ipf.ip_wavelet (labnCrop, labnCrop, kall, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, parent->wavclCurve, skip);
|
||||||
}
|
}
|
||||||
|
|
||||||
// }
|
// }
|
||||||
@ -944,7 +943,6 @@ void Crop::update (int todo)
|
|||||||
// end calculation adaptation scene luminosity
|
// end calculation adaptation scene luminosity
|
||||||
}
|
}
|
||||||
|
|
||||||
int begh = 0, endh = labnCrop->H;
|
|
||||||
bool execsharp = false;
|
bool execsharp = false;
|
||||||
|
|
||||||
if (skip == 1) {
|
if (skip == 1) {
|
||||||
@ -957,13 +955,13 @@ void Crop::update (int todo)
|
|||||||
|
|
||||||
if (settings->ciecamfloat) {
|
if (settings->ciecamfloat) {
|
||||||
float d, dj, yb; // not used after this block
|
float d, dj, yb; // not used after this block
|
||||||
parent->ipf.ciecam_02float (cieCrop, float (adap), begh, endh, 1, 2, labnCrop, ¶ms, parent->customColCurve1, parent->customColCurve2, parent->customColCurve3,
|
parent->ipf.ciecam_02float (cieCrop, float (adap), 1, 2, labnCrop, ¶ms, parent->customColCurve1, parent->customColCurve2, parent->customColCurve3,
|
||||||
dummy, dummy, parent->CAMBrightCurveJ, parent->CAMBrightCurveQ, parent->CAMMean, 5, skip, execsharp, d, dj, yb, 1);
|
dummy, dummy, parent->CAMBrightCurveJ, parent->CAMBrightCurveQ, parent->CAMMean, 5, skip, execsharp, d, dj, yb, 1);
|
||||||
} else {
|
} else {
|
||||||
double dd, dj, yb; // not used after this block
|
double dd, dj; // not used after this block
|
||||||
|
|
||||||
parent->ipf.ciecam_02 (cieCrop, adap, begh, endh, 1, 2, labnCrop, ¶ms, parent->customColCurve1, parent->customColCurve2, parent->customColCurve3,
|
parent->ipf.ciecam_02 (cieCrop, adap, 1, 2, labnCrop, ¶ms, parent->customColCurve1, parent->customColCurve2, parent->customColCurve3,
|
||||||
dummy, dummy, parent->CAMBrightCurveJ, parent->CAMBrightCurveQ, parent->CAMMean, 5, skip, execsharp, dd, dj, yb, 1);
|
dummy, dummy, parent->CAMBrightCurveJ, parent->CAMBrightCurveQ, parent->CAMMean, 5, skip, execsharp, dd, dj, 1);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// CIECAM is disbaled, we free up its image buffer to save some space
|
// CIECAM is disbaled, we free up its image buffer to save some space
|
||||||
|
@ -2612,7 +2612,7 @@ void RawImageSource::igv_interpolate(int winw, int winh)
|
|||||||
#define FORC(cnt) for (c=0; c < cnt; c++)
|
#define FORC(cnt) for (c=0; c < cnt; c++)
|
||||||
#define FORC3 FORC(3)
|
#define FORC3 FORC(3)
|
||||||
|
|
||||||
void RawImageSource::ahd_demosaic(int winx, int winy, int winw, int winh)
|
void RawImageSource::ahd_demosaic()
|
||||||
{
|
{
|
||||||
int i, j, k, top, left, row, col, tr, tc, c, d, val, hm[2];
|
int i, j, k, top, left, row, col, tr, tc, c, d, val, hm[2];
|
||||||
float (*pix)[4], (*rix)[3];
|
float (*pix)[4], (*rix)[3];
|
||||||
|
@ -20,38 +20,27 @@
|
|||||||
|
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include "curves.h"
|
|
||||||
#include "labimage.h"
|
|
||||||
#include "color.h"
|
|
||||||
#include "mytime.h"
|
|
||||||
#include "improcfun.h"
|
#include "improcfun.h"
|
||||||
#include "rawimagesource.h"
|
|
||||||
#include "array2D.h"
|
#include "array2D.h"
|
||||||
#include "rt_math.h"
|
#include "rt_math.h"
|
||||||
#include "opthelper.h"
|
#include "opthelper.h"
|
||||||
#ifdef _OPENMP
|
|
||||||
#include <omp.h>
|
|
||||||
#endif
|
|
||||||
#define CLIPI(a) ((a)>0 ?((a)<32768 ?(a):32768):0)
|
|
||||||
|
|
||||||
#define RANGEFN(i) ((1000.0f / (i + 1000.0f)))
|
#define RANGEFN(i) ((1000.0f / (i + 1000.0f)))
|
||||||
#define CLIPC(a) ((a)>-32000?((a)<32000?(a):32000):-32000)
|
|
||||||
#define DIRWT(i1,j1,i,j) ( domker[(i1-i)/scale+halfwin][(j1-j)/scale+halfwin] * RANGEFN(fabsf((data_fine[i1][j1]-data_fine[i][j]))) )
|
#define DIRWT(i1,j1,i,j) ( domker[(i1-i)/scale+halfwin][(j1-j)/scale+halfwin] * RANGEFN(fabsf((data_fine[i1][j1]-data_fine[i][j]))) )
|
||||||
|
|
||||||
namespace rtengine
|
namespace rtengine
|
||||||
{
|
{
|
||||||
|
|
||||||
static const int maxlevel = 6;
|
constexpr int maxlevel = 6;
|
||||||
static const float noise = 2000;
|
constexpr float noise = 2000;
|
||||||
|
|
||||||
//sequence of scales
|
//sequence of scales
|
||||||
static const int scales[6] = {1, 2, 4, 8, 16, 32};
|
constexpr int scales[maxlevel] = {1, 2, 4, 8, 16, 32};
|
||||||
extern const Settings* settings;
|
extern const Settings* settings;
|
||||||
|
|
||||||
//sequence of scales
|
//sequence of scales
|
||||||
|
|
||||||
|
SSEFUNCTION void ImProcFunctions :: dirpyr_equalizer(float ** src, float ** dst, int srcwidth, int srcheight, float ** l_a, float ** l_b, const double * mult, const double dirpyrThreshold, const double skinprot, float b_l, float t_l, float t_r, int scaleprev)
|
||||||
SSEFUNCTION void ImProcFunctions :: dirpyr_equalizer(float ** src, float ** dst, int srcwidth, int srcheight, float ** l_a, float ** l_b, float ** dest_a, float ** dest_b, const double * mult, const double dirpyrThreshold, const double skinprot, const bool gamutlab, float b_l, float t_l, float t_r, float b_r, int choice, int scaleprev)
|
|
||||||
{
|
{
|
||||||
int lastlevel = maxlevel;
|
int lastlevel = maxlevel;
|
||||||
|
|
||||||
@ -94,10 +83,10 @@ SSEFUNCTION void ImProcFunctions :: dirpyr_equalizer(float ** src, float ** dst,
|
|||||||
}
|
}
|
||||||
|
|
||||||
int level;
|
int level;
|
||||||
float multi[6] = {1.f, 1.f, 1.f, 1.f, 1.f, 1.f};
|
float multi[maxlevel] = {1.f, 1.f, 1.f, 1.f, 1.f, 1.f};
|
||||||
float scalefl[6];
|
float scalefl[maxlevel];
|
||||||
|
|
||||||
for(int lv = 0; lv < 6; lv++) {
|
for(int lv = 0; lv < maxlevel; lv++) {
|
||||||
scalefl[lv] = ((float) scales[lv]) / (float) scaleprev;
|
scalefl[lv] = ((float) scales[lv]) / (float) scaleprev;
|
||||||
|
|
||||||
if(lv >= 1) {
|
if(lv >= 1) {
|
||||||
@ -226,12 +215,12 @@ SSEFUNCTION void ImProcFunctions :: dirpyr_equalizer(float ** src, float ** dst,
|
|||||||
float ** buffer = dirpyrlo[lastlevel - 1];
|
float ** buffer = dirpyrlo[lastlevel - 1];
|
||||||
|
|
||||||
for(int level = lastlevel - 1; level > 0; level--) {
|
for(int level = lastlevel - 1; level > 0; level--) {
|
||||||
idirpyr_eq_channel(dirpyrlo[level], dirpyrlo[level - 1], buffer, srcwidth, srcheight, level, multi, dirpyrThreshold, tmpHue, tmpChr, skinprot, gamutlab, b_l, t_l, t_r, b_r, choice );
|
idirpyr_eq_channel(dirpyrlo[level], dirpyrlo[level - 1], buffer, srcwidth, srcheight, level, multi, dirpyrThreshold, tmpHue, tmpChr, skinprot, b_l, t_l, t_r);
|
||||||
}
|
}
|
||||||
|
|
||||||
scale = scales[0];
|
scale = scales[0];
|
||||||
|
|
||||||
idirpyr_eq_channel(dirpyrlo[0], dst, buffer, srcwidth, srcheight, 0, multi, dirpyrThreshold, tmpHue, tmpChr, skinprot, gamutlab, b_l, t_l, t_r, b_r, choice );
|
idirpyr_eq_channel(dirpyrlo[0], dst, buffer, srcwidth, srcheight, 0, multi, dirpyrThreshold, tmpHue, tmpChr, skinprot, b_l, t_l, t_r);
|
||||||
|
|
||||||
if(skinprot != 0.f) {
|
if(skinprot != 0.f) {
|
||||||
for (int i = 0; i < srcheight; i++) {
|
for (int i = 0; i < srcheight; i++) {
|
||||||
@ -247,7 +236,6 @@ SSEFUNCTION void ImProcFunctions :: dirpyr_equalizer(float ** src, float ** dst,
|
|||||||
delete [] tmpHue;
|
delete [] tmpHue;
|
||||||
}
|
}
|
||||||
|
|
||||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
||||||
#pragma omp parallel for
|
#pragma omp parallel for
|
||||||
|
|
||||||
for (int i = 0; i < srcheight; i++)
|
for (int i = 0; i < srcheight; i++)
|
||||||
@ -259,7 +247,7 @@ SSEFUNCTION void ImProcFunctions :: dirpyr_equalizer(float ** src, float ** dst,
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void ImProcFunctions :: dirpyr_equalizercam (CieImage *ncie, float ** src, float ** dst, int srcwidth, int srcheight, float ** h_p, float ** C_p, const double * mult, const double dirpyrThreshold, const double skinprot, bool execdir, const bool gamutlab, float b_l, float t_l, float t_r, float b_r, int choice, int scaleprev)
|
void ImProcFunctions :: dirpyr_equalizercam (CieImage *ncie, float ** src, float ** dst, int srcwidth, int srcheight, float ** h_p, float ** C_p, const double * mult, const double dirpyrThreshold, const double skinprot, bool execdir, float b_l, float t_l, float t_r, int scaleprev)
|
||||||
{
|
{
|
||||||
int lastlevel = maxlevel;
|
int lastlevel = maxlevel;
|
||||||
|
|
||||||
@ -303,10 +291,10 @@ void ImProcFunctions :: dirpyr_equalizercam (CieImage *ncie, float ** src, float
|
|||||||
|
|
||||||
int level;
|
int level;
|
||||||
|
|
||||||
float multi[6] = {1.f, 1.f, 1.f, 1.f, 1.f, 1.f};
|
float multi[maxlevel] = {1.f, 1.f, 1.f, 1.f, 1.f, 1.f};
|
||||||
float scalefl[6];
|
float scalefl[maxlevel];
|
||||||
|
|
||||||
for(int lv = 0; lv < 6; lv++) {
|
for(int lv = 0; lv < maxlevel; lv++) {
|
||||||
scalefl[lv] = ((float) scales[lv]) / (float) scaleprev;
|
scalefl[lv] = ((float) scales[lv]) / (float) scaleprev;
|
||||||
|
|
||||||
// if(scalefl[lv] < 1.f) multi[lv] = 1.f; else multi[lv]=(float) mult[lv];
|
// if(scalefl[lv] < 1.f) multi[lv] = 1.f; else multi[lv]=(float) mult[lv];
|
||||||
@ -371,7 +359,6 @@ void ImProcFunctions :: dirpyr_equalizercam (CieImage *ncie, float ** src, float
|
|||||||
idirpyr_eq_channelcam(dirpyrlo[0], dst, buffer, srcwidth, srcheight, 0, multi, dirpyrThreshold, h_p, C_p, skinprot, b_l, t_l, t_r);
|
idirpyr_eq_channelcam(dirpyrlo[0], dst, buffer, srcwidth, srcheight, 0, multi, dirpyrThreshold, h_p, C_p, skinprot, b_l, t_l, t_r);
|
||||||
|
|
||||||
|
|
||||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
||||||
if(execdir) {
|
if(execdir) {
|
||||||
#ifdef _OPENMP
|
#ifdef _OPENMP
|
||||||
#pragma omp parallel for schedule(dynamic,16)
|
#pragma omp parallel for schedule(dynamic,16)
|
||||||
@ -385,20 +372,17 @@ void ImProcFunctions :: dirpyr_equalizercam (CieImage *ncie, float ** src, float
|
|||||||
dst[i][j] = src[i][j];
|
dst[i][j] = src[i][j];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else
|
} else {
|
||||||
for (int i = 0; i < srcheight; i++)
|
for (int i = 0; i < srcheight; i++)
|
||||||
for (int j = 0; j < srcwidth; j++) {
|
for (int j = 0; j < srcwidth; j++) {
|
||||||
dst[i][j] = CLIP( buffer[i][j] ); // TODO: Really a clip necessary?
|
dst[i][j] = CLIP( buffer[i][j] ); // TODO: Really a clip necessary?
|
||||||
}
|
}
|
||||||
|
}
|
||||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
SSEFUNCTION void ImProcFunctions::dirpyr_channel(float ** data_fine, float ** data_coarse, int width, int height, int level, int scale)
|
SSEFUNCTION void ImProcFunctions::dirpyr_channel(float ** data_fine, float ** data_coarse, int width, int height, int level, int scale)
|
||||||
{
|
{
|
||||||
//scale is spacing of directional averaging weights
|
// scale is spacing of directional averaging weights
|
||||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
||||||
// calculate weights, compute directionally weighted average
|
// calculate weights, compute directionally weighted average
|
||||||
|
|
||||||
if(level > 1) {
|
if(level > 1) {
|
||||||
@ -620,9 +604,7 @@ SSEFUNCTION void ImProcFunctions::dirpyr_channel(float ** data_fine, float ** da
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
void ImProcFunctions::idirpyr_eq_channel(float ** data_coarse, float ** data_fine, float ** buffer, int width, int height, int level, float mult[maxlevel], const double dirpyrThreshold, float ** hue, float ** chrom, const double skinprot, float b_l, float t_l, float t_r)
|
||||||
|
|
||||||
void ImProcFunctions::idirpyr_eq_channel(float ** data_coarse, float ** data_fine, float ** buffer, int width, int height, int level, float mult[6], const double dirpyrThreshold, float ** hue, float ** chrom, const double skinprot, const bool gamutlab, float b_l, float t_l, float t_r, float b_r , int choice)
|
|
||||||
{
|
{
|
||||||
const float skinprotneg = -skinprot;
|
const float skinprotneg = -skinprot;
|
||||||
const float factorHard = (1.f - skinprotneg / 100.f);
|
const float factorHard = (1.f - skinprotneg / 100.f);
|
||||||
@ -635,7 +617,7 @@ void ImProcFunctions::idirpyr_eq_channel(float ** data_coarse, float ** data_fin
|
|||||||
offs = -1.f;
|
offs = -1.f;
|
||||||
}
|
}
|
||||||
|
|
||||||
float multbis[6];
|
float multbis[maxlevel];
|
||||||
|
|
||||||
multbis[level] = mult[level]; //multbis to reduce artifacts for high values mult
|
multbis[level] = mult[level]; //multbis to reduce artifacts for high values mult
|
||||||
|
|
||||||
@ -714,7 +696,7 @@ void ImProcFunctions::idirpyr_eq_channel(float ** data_coarse, float ** data_fin
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ImProcFunctions::idirpyr_eq_channelcam(float ** data_coarse, float ** data_fine, float ** buffer, int width, int height, int level, float mult[6], const double dirpyrThreshold, float ** l_a_h, float ** l_b_c, const double skinprot, float b_l, float t_l, float t_r)
|
void ImProcFunctions::idirpyr_eq_channelcam(float ** data_coarse, float ** data_fine, float ** buffer, int width, int height, int level, float mult[maxlevel], const double dirpyrThreshold, float ** l_a_h, float ** l_b_c, const double skinprot, float b_l, float t_l, float t_r)
|
||||||
{
|
{
|
||||||
|
|
||||||
const float skinprotneg = -skinprot;
|
const float skinprotneg = -skinprot;
|
||||||
@ -728,7 +710,7 @@ void ImProcFunctions::idirpyr_eq_channelcam(float ** data_coarse, float ** data_
|
|||||||
offs = -1.f;
|
offs = -1.f;
|
||||||
}
|
}
|
||||||
|
|
||||||
float multbis[6];
|
float multbis[maxlevel];
|
||||||
|
|
||||||
multbis[level] = mult[level]; //multbis to reduce artifacts for high values mult
|
multbis[level] = mult[level]; //multbis to reduce artifacts for high values mult
|
||||||
|
|
||||||
|
@ -80,7 +80,7 @@ void RawImageSource::processRawWhitepoint(float expos, float preser, array2D<flo
|
|||||||
if (ri->getSensorType() == ST_BAYER || ri->getSensorType() == ST_FUJI_XTRANS) {
|
if (ri->getSensorType() == ST_BAYER || ri->getSensorType() == ST_FUJI_XTRANS) {
|
||||||
// Demosaic to allow calculation of luminosity.
|
// Demosaic to allow calculation of luminosity.
|
||||||
if(ri->getSensorType() == ST_BAYER) {
|
if(ri->getSensorType() == ST_BAYER) {
|
||||||
fast_demosaic (0, 0, W, H);
|
fast_demosaic();
|
||||||
} else {
|
} else {
|
||||||
fast_xtrans_interpolate();
|
fast_xtrans_interpolate();
|
||||||
}
|
}
|
||||||
|
@ -52,7 +52,7 @@ LUTf RawImageSource::initInvGrad()
|
|||||||
#endif
|
#endif
|
||||||
//LUTf RawImageSource::invGrad = RawImageSource::initInvGrad();
|
//LUTf RawImageSource::invGrad = RawImageSource::initInvGrad();
|
||||||
|
|
||||||
SSEFUNCTION void RawImageSource::fast_demosaic(int winx, int winy, int winw, int winh)
|
SSEFUNCTION void RawImageSource::fast_demosaic()
|
||||||
{
|
{
|
||||||
|
|
||||||
double progress = 0.0;
|
double progress = 0.0;
|
||||||
|
@ -534,7 +534,7 @@ void CLASS fuji_extend_blue (ushort *linebuf[_ltotal], int line_width)
|
|||||||
fuji_extend_generic (linebuf, line_width, _B2, _B4);
|
fuji_extend_generic (linebuf, line_width, _B2, _B4);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CLASS xtrans_decode_block (struct fuji_compressed_block* info, const struct fuji_compressed_params *params, int cur_line)
|
void CLASS xtrans_decode_block (struct fuji_compressed_block* info, const struct fuji_compressed_params *params)
|
||||||
{
|
{
|
||||||
int r_even_pos = 0, r_odd_pos = 1;
|
int r_even_pos = 0, r_odd_pos = 1;
|
||||||
int g_even_pos = 0, g_odd_pos = 1;
|
int g_even_pos = 0, g_odd_pos = 1;
|
||||||
@ -699,8 +699,7 @@ void CLASS xtrans_decode_block (struct fuji_compressed_block* info, const struct
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CLASS fuji_bayer_decode_block (struct fuji_compressed_block *info, const struct fuji_compressed_params *params,
|
void CLASS fuji_bayer_decode_block (struct fuji_compressed_block *info, const struct fuji_compressed_params *params)
|
||||||
int cur_line)
|
|
||||||
{
|
{
|
||||||
int r_even_pos = 0, r_odd_pos = 1;
|
int r_even_pos = 0, r_odd_pos = 1;
|
||||||
int g_even_pos = 0, g_odd_pos = 1;
|
int g_even_pos = 0, g_odd_pos = 1;
|
||||||
@ -867,9 +866,9 @@ void CLASS fuji_decode_strip (const struct fuji_compressed_params* info_common,
|
|||||||
|
|
||||||
for (cur_line = 0; cur_line < fuji_total_lines; cur_line++) {
|
for (cur_line = 0; cur_line < fuji_total_lines; cur_line++) {
|
||||||
if (fuji_raw_type == 16) {
|
if (fuji_raw_type == 16) {
|
||||||
xtrans_decode_block (&info, info_common, cur_line);
|
xtrans_decode_block (&info, info_common);
|
||||||
} else {
|
} else {
|
||||||
fuji_bayer_decode_block (&info, info_common, cur_line);
|
fuji_bayer_decode_block (&info, info_common);
|
||||||
}
|
}
|
||||||
|
|
||||||
// copy data from line buffers and advance
|
// copy data from line buffers and advance
|
||||||
|
@ -809,8 +809,8 @@ void rtengine::ICCStore::getGammaArray(const procparams::ColorManagementParams &
|
|||||||
double ts = icm.slpos;
|
double ts = icm.slpos;
|
||||||
double slope = icm.slpos == 0 ? eps : icm.slpos;
|
double slope = icm.slpos == 0 ? eps : icm.slpos;
|
||||||
|
|
||||||
int mode = 0, imax = 0;
|
int mode = 0;
|
||||||
Color::calcGamma(pwr, ts, mode, imax, g_a); // call to calcGamma with selected gamma and slope : return parameters for LCMS2
|
Color::calcGamma(pwr, ts, mode, g_a); // call to calcGamma with selected gamma and slope : return parameters for LCMS2
|
||||||
ga[4] = g_a[3] * ts;
|
ga[4] = g_a[3] * ts;
|
||||||
//printf("g_a.gamma0=%f g_a.gamma1=%f g_a.gamma2=%f g_a.gamma3=%f g_a.gamma4=%f\n", g_a.gamma0,g_a.gamma1,g_a.gamma2,g_a.gamma3,g_a.gamma4);
|
//printf("g_a.gamma0=%f g_a.gamma1=%f g_a.gamma2=%f g_a.gamma3=%f g_a.gamma4=%f\n", g_a.gamma0,g_a.gamma1,g_a.gamma2,g_a.gamma3,g_a.gamma4);
|
||||||
ga[0] = icm.gampos;
|
ga[0] = icm.gampos;
|
||||||
|
@ -86,7 +86,7 @@ Glib::ustring findIconAbsolutePath (const Glib::ustring& iconName)
|
|||||||
return Glib::ustring();
|
return Glib::ustring();
|
||||||
}
|
}
|
||||||
|
|
||||||
void setPaths (const Options& options)
|
void setPaths ()
|
||||||
{
|
{
|
||||||
// TODO: Forcing the Dark theme, so reading the icon set files is useless for now...
|
// TODO: Forcing the Dark theme, so reading the icon set files is useless for now...
|
||||||
|
|
||||||
|
@ -26,7 +26,7 @@ namespace rtengine
|
|||||||
{
|
{
|
||||||
|
|
||||||
Glib::ustring findIconAbsolutePath (const Glib::ustring& iconName);
|
Glib::ustring findIconAbsolutePath (const Glib::ustring& iconName);
|
||||||
void setPaths (const Options& options);
|
void setPaths ();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
#include "coord2d.h"
|
#include "coord2d.h"
|
||||||
#include "procparams.h"
|
#include "procparams.h"
|
||||||
#include "color.h"
|
#include "color.h"
|
||||||
|
#include "../rtgui/threadutils.h"
|
||||||
|
|
||||||
#define TR_NONE 0
|
#define TR_NONE 0
|
||||||
#define TR_R90 1
|
#define TR_R90 1
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
#include "iptcpairs.h"
|
#include "iptcpairs.h"
|
||||||
#include "imagesource.h"
|
#include "imagesource.h"
|
||||||
#include "rt_math.h"
|
#include "rt_math.h"
|
||||||
|
#pragma GCC diagnostic warning "-Wextra"
|
||||||
#define PRINT_HDR_PS_DETECTION 0
|
#define PRINT_HDR_PS_DETECTION 0
|
||||||
|
|
||||||
using namespace rtengine;
|
using namespace rtengine;
|
||||||
@ -857,8 +857,7 @@ bool FramesData::hasIPTC (unsigned int frame) const
|
|||||||
tm FramesData::getDateTime (unsigned int frame) const
|
tm FramesData::getDateTime (unsigned int frame) const
|
||||||
{
|
{
|
||||||
if (frames.empty() || frame >= frames.size() ) {
|
if (frames.empty() || frame >= frames.size() ) {
|
||||||
tm emptytm = {0, 0, 0, 0, 0, 0, 0, 0, 0};
|
return {};
|
||||||
return emptytm;
|
|
||||||
} else {
|
} else {
|
||||||
return frames.at(frame)->getDateTime ();
|
return frames.at(frame)->getDateTime ();
|
||||||
}
|
}
|
||||||
@ -1041,7 +1040,7 @@ failure:
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FramesData::FramesData (const Glib::ustring& fname, std::unique_ptr<RawMetaDataLocation> rml, bool firstFrameOnly, bool loadAll) :
|
FramesData::FramesData (const Glib::ustring& fname, std::unique_ptr<RawMetaDataLocation> rml, bool firstFrameOnly) :
|
||||||
iptc(nullptr), dcrawFrameCount (0)
|
iptc(nullptr), dcrawFrameCount (0)
|
||||||
{
|
{
|
||||||
if (rml && (rml->exifBase >= 0 || rml->ciffBase >= 0)) {
|
if (rml && (rml->exifBase >= 0 || rml->ciffBase >= 0)) {
|
||||||
|
@ -95,7 +95,7 @@ private:
|
|||||||
unsigned int dcrawFrameCount;
|
unsigned int dcrawFrameCount;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
FramesData (const Glib::ustring& fname, std::unique_ptr<RawMetaDataLocation> rml = nullptr, bool firstFrameOnly = false, bool loadAll = false);
|
FramesData (const Glib::ustring& fname, std::unique_ptr<RawMetaDataLocation> rml = nullptr, bool firstFrameOnly = false);
|
||||||
~FramesData ();
|
~FramesData ();
|
||||||
|
|
||||||
void setDCRawFrameCount (unsigned int frameCount);
|
void setDCRawFrameCount (unsigned int frameCount);
|
||||||
|
@ -66,7 +66,7 @@ public:
|
|||||||
embProfile(nullptr), idata(nullptr), dirpyrdenoiseExpComp(INFINITY) {}
|
embProfile(nullptr), idata(nullptr), dirpyrdenoiseExpComp(INFINITY) {}
|
||||||
|
|
||||||
virtual ~ImageSource () {}
|
virtual ~ImageSource () {}
|
||||||
virtual int load (const Glib::ustring &fname, int imageNum = 0, bool batch = false) = 0;
|
virtual int load (const Glib::ustring &fname) = 0;
|
||||||
virtual void preprocess (const RAWParams &raw, const LensProfParams &lensProf, const CoarseTransformParams& coarse, bool prepareDenoise = true) {};
|
virtual void preprocess (const RAWParams &raw, const LensProfParams &lensProf, const CoarseTransformParams& coarse, bool prepareDenoise = true) {};
|
||||||
virtual void demosaic (const RAWParams &raw) {};
|
virtual void demosaic (const RAWParams &raw) {};
|
||||||
virtual void retinex (ColorManagementParams cmp, const RetinexParams &deh, ToneCurveParams Tc, LUTf & cdcurve, LUTf & mapcurve, const RetinextransmissionCurve & dehatransmissionCurve, const RetinexgaintransmissionCurve & dehagaintransmissionCurve, multi_array2D<float, 4> &conversionBuffer, bool dehacontlutili, bool mapcontlutili, bool useHsl, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax, LUTu &histLRETI) {};
|
virtual void retinex (ColorManagementParams cmp, const RetinexParams &deh, ToneCurveParams Tc, LUTf & cdcurve, LUTf & mapcurve, const RetinextransmissionCurve & dehatransmissionCurve, const RetinexgaintransmissionCurve & dehagaintransmissionCurve, multi_array2D<float, 4> &conversionBuffer, bool dehacontlutili, bool mapcontlutili, bool useHsl, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax, LUTu &histLRETI) {};
|
||||||
@ -85,7 +85,7 @@ public:
|
|||||||
|
|
||||||
|
|
||||||
// use right after demosaicing image, add coarse transformation and put the result in the provided Imagefloat*
|
// use right after demosaicing image, add coarse transformation and put the result in the provided Imagefloat*
|
||||||
virtual void getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const ToneCurveParams &hlp, const ColorManagementParams &cmp, const RAWParams &raw) = 0;
|
virtual void getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const ToneCurveParams &hlp, const RAWParams &raw) = 0;
|
||||||
virtual eSensorType getSensorType () const = 0;
|
virtual eSensorType getSensorType () const = 0;
|
||||||
// true is ready to provide the AutoWB, i.e. when the image has been demosaiced for RawImageSource
|
// true is ready to provide the AutoWB, i.e. when the image has been demosaiced for RawImageSource
|
||||||
virtual bool isWBProviderReady () = 0;
|
virtual bool isWBProviderReady () = 0;
|
||||||
@ -110,7 +110,7 @@ public:
|
|||||||
virtual FrameData* getImageData (unsigned int frameNum) = 0;
|
virtual FrameData* getImageData (unsigned int frameNum) = 0;
|
||||||
virtual ImageMatrices* getImageMatrices () = 0;
|
virtual ImageMatrices* getImageMatrices () = 0;
|
||||||
virtual bool isRAW () const = 0;
|
virtual bool isRAW () const = 0;
|
||||||
virtual DCPProfile* getDCP (const ColorManagementParams &cmp, ColorTemp &wb, DCPProfile::ApplyState &as)
|
virtual DCPProfile* getDCP (const ColorManagementParams &cmp, DCPProfile::ApplyState &as)
|
||||||
{
|
{
|
||||||
return nullptr;
|
return nullptr;
|
||||||
};
|
};
|
||||||
|
@ -333,7 +333,7 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall)
|
|||||||
// Tells to the ImProcFunctions' tools what is the preview scale, which may lead to some simplifications
|
// Tells to the ImProcFunctions' tools what is the preview scale, which may lead to some simplifications
|
||||||
ipf.setScale (scale);
|
ipf.setScale (scale);
|
||||||
|
|
||||||
imgsrc->getImage (currWB, tr, orig_prev, pp, params.toneCurve, params.icm, params.raw);
|
imgsrc->getImage (currWB, tr, orig_prev, pp, params.toneCurve, params.raw);
|
||||||
denoiseInfoStore.valid = false;
|
denoiseInfoStore.valid = false;
|
||||||
//ColorTemp::CAT02 (orig_prev, ¶ms) ;
|
//ColorTemp::CAT02 (orig_prev, ¶ms) ;
|
||||||
// printf("orig_prevW=%d\n scale=%d",orig_prev->width, scale);
|
// printf("orig_prevW=%d\n scale=%d",orig_prev->width, scale);
|
||||||
@ -443,7 +443,7 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall)
|
|||||||
LUTu aehist;
|
LUTu aehist;
|
||||||
int aehistcompr;
|
int aehistcompr;
|
||||||
imgsrc->getAutoExpHistogram (aehist, aehistcompr);
|
imgsrc->getAutoExpHistogram (aehist, aehistcompr);
|
||||||
ipf.getAutoExp (aehist, aehistcompr, imgsrc->getDefGain(), params.toneCurve.clip, params.toneCurve.expcomp,
|
ipf.getAutoExp (aehist, aehistcompr, params.toneCurve.clip, params.toneCurve.expcomp,
|
||||||
params.toneCurve.brightness, params.toneCurve.contrast, params.toneCurve.black, params.toneCurve.hlcompr, params.toneCurve.hlcomprthresh);
|
params.toneCurve.brightness, params.toneCurve.contrast, params.toneCurve.black, params.toneCurve.hlcompr, params.toneCurve.hlcomprthresh);
|
||||||
|
|
||||||
if (aeListener)
|
if (aeListener)
|
||||||
@ -461,7 +461,7 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall)
|
|||||||
CurveFactory::complexCurve (params.toneCurve.expcomp, params.toneCurve.black / 65535.0,
|
CurveFactory::complexCurve (params.toneCurve.expcomp, params.toneCurve.black / 65535.0,
|
||||||
params.toneCurve.hlcompr, params.toneCurve.hlcomprthresh,
|
params.toneCurve.hlcompr, params.toneCurve.hlcomprthresh,
|
||||||
params.toneCurve.shcompr, params.toneCurve.brightness, params.toneCurve.contrast,
|
params.toneCurve.shcompr, params.toneCurve.brightness, params.toneCurve.contrast,
|
||||||
params.toneCurve.curveMode, params.toneCurve.curve, params.toneCurve.curveMode2, params.toneCurve.curve2,
|
params.toneCurve.curve, params.toneCurve.curve2,
|
||||||
vhist16, hltonecurve, shtonecurve, tonecurve, histToneCurve, customToneCurve1, customToneCurve2, 1);
|
vhist16, hltonecurve, shtonecurve, tonecurve, histToneCurve, customToneCurve1, customToneCurve2, 1);
|
||||||
|
|
||||||
CurveFactory::RGBCurve (params.rgbCurves.rcurve, rCurve, 1);
|
CurveFactory::RGBCurve (params.rgbCurves.rcurve, rCurve, 1);
|
||||||
@ -478,13 +478,7 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall)
|
|||||||
{wprof[1][0], wprof[1][1], wprof[1][2]},
|
{wprof[1][0], wprof[1][1], wprof[1][2]},
|
||||||
{wprof[2][0], wprof[2][1], wprof[2][2]}
|
{wprof[2][0], wprof[2][1], wprof[2][2]}
|
||||||
};
|
};
|
||||||
TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix (params.icm.working);
|
params.colorToning.getCurves (ctColorCurve, ctOpacityCurve, wp, opautili);
|
||||||
double wip[3][3] = {
|
|
||||||
{wiprof[0][0], wiprof[0][1], wiprof[0][2]},
|
|
||||||
{wiprof[1][0], wiprof[1][1], wiprof[1][2]},
|
|
||||||
{wiprof[2][0], wiprof[2][1], wiprof[2][2]}
|
|
||||||
};
|
|
||||||
params.colorToning.getCurves (ctColorCurve, ctOpacityCurve, wp, wip, opautili);
|
|
||||||
CurveFactory::curveToning (params.colorToning.clcurve, clToningcurve, scale == 1 ? 1 : 16);
|
CurveFactory::curveToning (params.colorToning.clcurve, clToningcurve, scale == 1 ? 1 : 16);
|
||||||
CurveFactory::curveToning (params.colorToning.cl2curve, cl2Toningcurve, scale == 1 ? 1 : 16);
|
CurveFactory::curveToning (params.colorToning.cl2curve, cl2Toningcurve, scale == 1 ? 1 : 16);
|
||||||
}
|
}
|
||||||
@ -556,7 +550,7 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall)
|
|||||||
double bbm = 33.;
|
double bbm = 33.;
|
||||||
|
|
||||||
DCPProfile::ApplyState as;
|
DCPProfile::ApplyState as;
|
||||||
DCPProfile *dcpProf = imgsrc->getDCP (params.icm, currWB, as);
|
DCPProfile *dcpProf = imgsrc->getDCP (params.icm, as);
|
||||||
|
|
||||||
ipf.rgbProc (oprevi, oprevl, nullptr, hltonecurve, shtonecurve, tonecurve, shmap, params.toneCurve.saturation,
|
ipf.rgbProc (oprevi, oprevl, nullptr, hltonecurve, shtonecurve, tonecurve, shmap, params.toneCurve.saturation,
|
||||||
rCurve, gCurve, bCurve, colourToningSatLimit, colourToningSatLimitOpacity, ctColorCurve, ctOpacityCurve, opautili, clToningcurve, cl2Toningcurve, customToneCurve1, customToneCurve2, beforeToneCurveBW, afterToneCurveBW, rrm, ggm, bbm, bwAutoR, bwAutoG, bwAutoB, params.toneCurve.expcomp, params.toneCurve.hlcompr, params.toneCurve.hlcomprthresh, dcpProf, as, histToneCurve);
|
rCurve, gCurve, bCurve, colourToningSatLimit, colourToningSatLimitOpacity, ctColorCurve, ctOpacityCurve, opautili, clToningcurve, cl2Toningcurve, customToneCurve1, customToneCurve2, beforeToneCurveBW, afterToneCurveBW, rrm, ggm, bbm, bwAutoR, bwAutoG, bwAutoB, params.toneCurve.expcomp, params.toneCurve.hlcompr, params.toneCurve.hlcomprthresh, dcpProf, as, histToneCurve);
|
||||||
@ -706,7 +700,7 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall)
|
|||||||
int kall = 0;
|
int kall = 0;
|
||||||
progress ("Wavelet...", 100 * readyphase / numofphases);
|
progress ("Wavelet...", 100 * readyphase / numofphases);
|
||||||
// ipf.ip_wavelet(nprevl, nprevl, kall, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, scale);
|
// ipf.ip_wavelet(nprevl, nprevl, kall, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, scale);
|
||||||
ipf.ip_wavelet (nprevl, nprevl, kall, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, wavcontlutili, scale);
|
ipf.ip_wavelet (nprevl, nprevl, kall, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, scale);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -759,8 +753,6 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall)
|
|||||||
// end calculation adaptation scene luminosity
|
// end calculation adaptation scene luminosity
|
||||||
}
|
}
|
||||||
|
|
||||||
int begh = 0;
|
|
||||||
int endh = pH;
|
|
||||||
float d, dj, yb;
|
float d, dj, yb;
|
||||||
bool execsharp = false;
|
bool execsharp = false;
|
||||||
|
|
||||||
@ -781,7 +773,7 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall)
|
|||||||
CAMBrightCurveJ.dirty = true;
|
CAMBrightCurveJ.dirty = true;
|
||||||
CAMBrightCurveQ.dirty = true;
|
CAMBrightCurveQ.dirty = true;
|
||||||
|
|
||||||
ipf.ciecam_02float (ncie, float (adap), begh, endh, pW, 2, nprevl, ¶ms, customColCurve1, customColCurve2, customColCurve3, histLCAM, histCCAM, CAMBrightCurveJ, CAMBrightCurveQ, CAMMean, 5, scale, execsharp, d, dj, yb, 1);
|
ipf.ciecam_02float (ncie, float (adap), pW, 2, nprevl, ¶ms, customColCurve1, customColCurve2, customColCurve3, histLCAM, histCCAM, CAMBrightCurveJ, CAMBrightCurveQ, CAMMean, 5, scale, execsharp, d, dj, yb, 1);
|
||||||
|
|
||||||
if ((params.colorappearance.autodegree || params.colorappearance.autodegreeout) && acListener && params.colorappearance.enabled) {
|
if ((params.colorappearance.autodegree || params.colorappearance.autodegreeout) && acListener && params.colorappearance.enabled) {
|
||||||
acListener->autoCamChanged (100.* (double)d, 100.* (double)dj);
|
acListener->autoCamChanged (100.* (double)d, 100.* (double)dj);
|
||||||
@ -1225,7 +1217,7 @@ void ImProcCoordinator::saveInputICCReference (const Glib::ustring& fname, bool
|
|||||||
currWB = ColorTemp(); // = no white balance
|
currWB = ColorTemp(); // = no white balance
|
||||||
}
|
}
|
||||||
|
|
||||||
imgsrc->getImage (currWB, tr, im, pp, ppar.toneCurve, ppar.icm, ppar.raw);
|
imgsrc->getImage (currWB, tr, im, pp, ppar.toneCurve, ppar.raw);
|
||||||
ImProcFunctions ipf (&ppar, true);
|
ImProcFunctions ipf (&ppar, true);
|
||||||
|
|
||||||
if (ipf.needsTransform()) {
|
if (ipf.needsTransform()) {
|
||||||
|
@ -28,7 +28,6 @@
|
|||||||
#include "curves.h"
|
#include "curves.h"
|
||||||
#include "mytime.h"
|
#include "mytime.h"
|
||||||
#include "iccstore.h"
|
#include "iccstore.h"
|
||||||
#include "impulse_denoise.h"
|
|
||||||
#include "imagesource.h"
|
#include "imagesource.h"
|
||||||
#include "rtthumbnail.h"
|
#include "rtthumbnail.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
@ -208,9 +207,9 @@ void ImProcFunctions::firstAnalysis (const Imagefloat* const original, const Pro
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Copyright (c) 2012 Jacques Desmis <jdesmis@gmail.com>
|
// Copyright (c) 2012 Jacques Desmis <jdesmis@gmail.com>
|
||||||
void ImProcFunctions::ciecam_02 (CieImage* ncie, double adap, int begh, int endh, int pW, int pwb, LabImage* lab, const ProcParams* params,
|
void ImProcFunctions::ciecam_02 (CieImage* ncie, double adap, int pW, int pwb, LabImage* lab, const ProcParams* params,
|
||||||
const ColorAppearance & customColCurve1, const ColorAppearance & customColCurve2, const ColorAppearance & customColCurve3,
|
const ColorAppearance & customColCurve1, const ColorAppearance & customColCurve2, const ColorAppearance & customColCurve3,
|
||||||
LUTu & histLCAM, LUTu & histCCAM, LUTf & CAMBrightCurveJ, LUTf & CAMBrightCurveQ, float &mean, int Iterates, int scale, bool execsharp, double &d, double &dj, double &yb, int rtt)
|
LUTu & histLCAM, LUTu & histCCAM, LUTf & CAMBrightCurveJ, LUTf & CAMBrightCurveQ, float &mean, int Iterates, int scale, bool execsharp, double &d, double &dj, int rtt)
|
||||||
{
|
{
|
||||||
if (params->colorappearance.enabled) {
|
if (params->colorappearance.enabled) {
|
||||||
//int lastskip;
|
//int lastskip;
|
||||||
@ -256,7 +255,6 @@ void ImProcFunctions::ciecam_02 (CieImage* ncie, double adap, int begh, int endh
|
|||||||
int width = lab->W, height = lab->H;
|
int width = lab->W, height = lab->H;
|
||||||
float minQ = 10000.f;
|
float minQ = 10000.f;
|
||||||
float maxQ = -1000.f;
|
float maxQ = -1000.f;
|
||||||
float w_h;
|
|
||||||
float a_w;
|
float a_w;
|
||||||
float c_;
|
float c_;
|
||||||
float f_l;
|
float f_l;
|
||||||
@ -276,9 +274,9 @@ void ImProcFunctions::ciecam_02 (CieImage* ncie, double adap, int begh, int endh
|
|||||||
|
|
||||||
bool ciedata = params->colorappearance.datacie;
|
bool ciedata = params->colorappearance.datacie;
|
||||||
|
|
||||||
ColorTemp::temp2mulxyz (params->wb.temperature, params->wb.green, params->wb.method, Xw, Zw); //compute white Xw Yw Zw : white current WB
|
ColorTemp::temp2mulxyz (params->wb.temperature, params->wb.method, Xw, Zw); //compute white Xw Yw Zw : white current WB
|
||||||
ColorTemp::temp2mulxyz (params->colorappearance.tempout, params->colorappearance.greenout, "Custom", Xwout, Zwout);
|
ColorTemp::temp2mulxyz (params->colorappearance.tempout, "Custom", Xwout, Zwout);
|
||||||
ColorTemp::temp2mulxyz (params->colorappearance.tempsc, params->colorappearance.greensc, "Custom", Xwsc, Zwsc);
|
ColorTemp::temp2mulxyz (params->colorappearance.tempsc, "Custom", Xwsc, Zwsc);
|
||||||
|
|
||||||
//viewing condition for surrsrc
|
//viewing condition for surrsrc
|
||||||
if (params->colorappearance.surrsrc == "Average") {
|
if (params->colorappearance.surrsrc == "Average") {
|
||||||
@ -607,7 +605,7 @@ void ImProcFunctions::ciecam_02 (CieImage* ncie, double adap, int begh, int endh
|
|||||||
|
|
||||||
|
|
||||||
#ifndef _DEBUG
|
#ifndef _DEBUG
|
||||||
#pragma omp parallel default(shared) firstprivate(lab,xw1,xw2,yw1,yw2,zw1,zw2,pilot,jli,chr,yb,la,yb2,la2,fl,nc,f,c, height,width,begh, endh,nc2,f2,c2, alg,algepd, gamu, highlight, rstprotection, pW, scale)
|
#pragma omp parallel default(shared) firstprivate(lab,xw1,xw2,yw1,yw2,zw1,zw2,pilot,jli,chr,yb,la,yb2,la2,fl,nc,f,c, height,width,nc2,f2,c2, alg,algepd, gamu, highlight, rstprotection, pW, scale)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
//matrix for current working space
|
//matrix for current working space
|
||||||
@ -653,15 +651,13 @@ void ImProcFunctions::ciecam_02 (CieImage* ncie, double adap, int begh, int endh
|
|||||||
Q, M, s, aw, fl, wh,
|
Q, M, s, aw, fl, wh,
|
||||||
x, y, z,
|
x, y, z,
|
||||||
xw1, yw1, zw1,
|
xw1, yw1, zw1,
|
||||||
yb, la,
|
c, nc, gamu, n, nbb, ncb, pfl, cz, d );
|
||||||
f, c, nc, pilot, gamu, n, nbb, ncb, pfl, cz, d );
|
|
||||||
Jpro = J;
|
Jpro = J;
|
||||||
Cpro = C;
|
Cpro = C;
|
||||||
hpro = h;
|
hpro = h;
|
||||||
Qpro = Q;
|
Qpro = Q;
|
||||||
Mpro = M;
|
Mpro = M;
|
||||||
spro = s;
|
spro = s;
|
||||||
w_h = wh + epsil;
|
|
||||||
a_w = aw;
|
a_w = aw;
|
||||||
c_ = c;
|
c_ = c;
|
||||||
f_l = fl;
|
f_l = fl;
|
||||||
@ -1180,8 +1176,7 @@ void ImProcFunctions::ciecam_02 (CieImage* ncie, double adap, int begh, int endh
|
|||||||
Ciecam02::jch2xyz_ciecam02 ( xx, yy, zz,
|
Ciecam02::jch2xyz_ciecam02 ( xx, yy, zz,
|
||||||
J, C, h,
|
J, C, h,
|
||||||
xw2, yw2, zw2,
|
xw2, yw2, zw2,
|
||||||
yb2, la2,
|
c2, nc2, gamu, nj, nbbj, ncbj, flj, czj, dj, awj);
|
||||||
f2, c2, nc2, gamu, nj, nbbj, ncbj, flj, czj, dj, awj);
|
|
||||||
x = (float)xx * 655.35;
|
x = (float)xx * 655.35;
|
||||||
y = (float)yy * 655.35;
|
y = (float)yy * 655.35;
|
||||||
z = (float)zz * 655.35;
|
z = (float)zz * 655.35;
|
||||||
@ -1268,11 +1263,6 @@ void ImProcFunctions::ciecam_02 (CieImage* ncie, double adap, int begh, int endh
|
|||||||
//if(params->dirpyrequalizer.enabled) if(execsharp) {
|
//if(params->dirpyrequalizer.enabled) if(execsharp) {
|
||||||
if (params->dirpyrequalizer.enabled) {
|
if (params->dirpyrequalizer.enabled) {
|
||||||
if (params->dirpyrequalizer.gamutlab /*&& execsharp*/) {
|
if (params->dirpyrequalizer.gamutlab /*&& execsharp*/) {
|
||||||
float b_l = static_cast<float> (params->dirpyrequalizer.hueskin.value[0]) / 100.0f;
|
|
||||||
float t_l = static_cast<float> (params->dirpyrequalizer.hueskin.value[1]) / 100.0f;
|
|
||||||
float b_r = static_cast<float> (params->dirpyrequalizer.hueskin.value[2]) / 100.0f;
|
|
||||||
float t_r = static_cast<float> (params->dirpyrequalizer.hueskin.value[3]) / 100.0f;
|
|
||||||
|
|
||||||
float artifact = (float) settings->artifact_cbdl;
|
float artifact = (float) settings->artifact_cbdl;
|
||||||
|
|
||||||
if (artifact > 6.f) {
|
if (artifact > 6.f) {
|
||||||
@ -1286,14 +1276,14 @@ void ImProcFunctions::ciecam_02 (CieImage* ncie, double adap, int begh, int endh
|
|||||||
float chrom = 50.f;
|
float chrom = 50.f;
|
||||||
{
|
{
|
||||||
int hotbad = 0;
|
int hotbad = 0;
|
||||||
ImProcFunctions::badpixcam (ncie, artifact, 5, 2, b_l, t_l, t_r, b_r, params->dirpyrequalizer.skinprotect, chrom, hotbad); //enabled remove artifacts for cbDL
|
ImProcFunctions::badpixcam (ncie, artifact, 5, 2, params->dirpyrequalizer.skinprotect, chrom, hotbad); //enabled remove artifacts for cbDL
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (params->colorappearance.badpixsl > 0) if (execsharp) {
|
if (params->colorappearance.badpixsl > 0) if (execsharp) {
|
||||||
int mode = params->colorappearance.badpixsl;
|
int mode = params->colorappearance.badpixsl;
|
||||||
ImProcFunctions::badpixcam (ncie, 3.4, 5, mode, 0, 0, 0, 0, 0, 0, 1);//for bad pixels CIECAM
|
ImProcFunctions::badpixcam (ncie, 3.4, 5, mode, 0, 0, 1);//for bad pixels CIECAM
|
||||||
}
|
}
|
||||||
|
|
||||||
if (params->sharpenMicro.enabled)if (execsharp) {
|
if (params->sharpenMicro.enabled)if (execsharp) {
|
||||||
@ -1314,10 +1304,8 @@ void ImProcFunctions::ciecam_02 (CieImage* ncie, double adap, int begh, int endh
|
|||||||
if (rtt == 1) {
|
if (rtt == 1) {
|
||||||
float b_l = static_cast<float> (params->dirpyrequalizer.hueskin.value[0]) / 100.0f;
|
float b_l = static_cast<float> (params->dirpyrequalizer.hueskin.value[0]) / 100.0f;
|
||||||
float t_l = static_cast<float> (params->dirpyrequalizer.hueskin.value[1]) / 100.0f;
|
float t_l = static_cast<float> (params->dirpyrequalizer.hueskin.value[1]) / 100.0f;
|
||||||
float b_r = static_cast<float> (params->dirpyrequalizer.hueskin.value[2]) / 100.0f;
|
|
||||||
float t_r = static_cast<float> (params->dirpyrequalizer.hueskin.value[3]) / 100.0f;
|
float t_r = static_cast<float> (params->dirpyrequalizer.hueskin.value[3]) / 100.0f;
|
||||||
int choice = 0; //not disabled in case of ! always 0
|
dirpyr_equalizercam (ncie, ncie->sh_p, ncie->sh_p, ncie->W, ncie->H, ncie->h_p, ncie->C_p, params->dirpyrequalizer.mult, params->dirpyrequalizer.threshold, params->dirpyrequalizer.skinprotect, true, b_l, t_l, t_r, scale); //contrast by detail adapted to CIECAM
|
||||||
dirpyr_equalizercam (ncie, ncie->sh_p, ncie->sh_p, ncie->W, ncie->H, ncie->h_p, ncie->C_p, params->dirpyrequalizer.mult, params->dirpyrequalizer.threshold, params->dirpyrequalizer.skinprotect, true, params->dirpyrequalizer.gamutlab, b_l, t_l, t_r, b_r, choice, scale); //contrast by detail adapted to CIECAM
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1347,14 +1335,14 @@ void ImProcFunctions::ciecam_02 (CieImage* ncie, double adap, int begh, int endh
|
|||||||
|| (params->colorappearance.badpixsl > 0 && settings->autocielab)) {
|
|| (params->colorappearance.badpixsl > 0 && settings->autocielab)) {
|
||||||
|
|
||||||
if (params->epd.enabled && params->colorappearance.tonecie && algepd) {
|
if (params->epd.enabled && params->colorappearance.tonecie && algepd) {
|
||||||
ImProcFunctions::EPDToneMapCIE (ncie, a_w, c_, w_h, width, height, begh, endh, minQ, maxQ, Iterates, scale );
|
ImProcFunctions::EPDToneMapCIE (ncie, a_w, c_, width, height, minQ, maxQ, Iterates, scale );
|
||||||
}
|
}
|
||||||
|
|
||||||
//EPDToneMapCIE adapted to CIECAM
|
//EPDToneMapCIE adapted to CIECAM
|
||||||
|
|
||||||
|
|
||||||
#ifndef _DEBUG
|
#ifndef _DEBUG
|
||||||
#pragma omp parallel default(shared) firstprivate(lab,xw2,yw2,zw2,chr,yb,la2,yb2, height,width,begh, endh, nc2,f2,c2, gamu, highlight,pW)
|
#pragma omp parallel default(shared) firstprivate(lab,xw2,yw2,zw2,chr,yb,la2,yb2, height,width, nc2,f2,c2, gamu, highlight,pW)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
TMatrix wiprofa = ICCStore::getInstance()->workingSpaceInverseMatrix (params->icm.working);
|
TMatrix wiprofa = ICCStore::getInstance()->workingSpaceInverseMatrix (params->icm.working);
|
||||||
@ -1449,8 +1437,7 @@ void ImProcFunctions::ciecam_02 (CieImage* ncie, double adap, int begh, int endh
|
|||||||
Ciecam02::jch2xyz_ciecam02 ( xx, yy, zz,
|
Ciecam02::jch2xyz_ciecam02 ( xx, yy, zz,
|
||||||
ncie->J_p[i][j], ncie->C_p[i][j], ncie->h_p[i][j],
|
ncie->J_p[i][j], ncie->C_p[i][j], ncie->h_p[i][j],
|
||||||
xw2, yw2, zw2,
|
xw2, yw2, zw2,
|
||||||
yb2, la2,
|
c2, nc2, gamu, nj, nbbj, ncbj, flj, czj, dj, awj);
|
||||||
f2, c2, nc2, gamu, nj, nbbj, ncbj, flj, czj, dj, awj);
|
|
||||||
x = (float)xx * 655.35;
|
x = (float)xx * 655.35;
|
||||||
y = (float)yy * 655.35;
|
y = (float)yy * 655.35;
|
||||||
z = (float)zz * 655.35;
|
z = (float)zz * 655.35;
|
||||||
@ -1521,7 +1508,7 @@ void ImProcFunctions::ciecam_02 (CieImage* ncie, double adap, int begh, int endh
|
|||||||
|
|
||||||
|
|
||||||
// Copyright (c) 2012 Jacques Desmis <jdesmis@gmail.com>
|
// Copyright (c) 2012 Jacques Desmis <jdesmis@gmail.com>
|
||||||
void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int endh, int pW, int pwb, LabImage* lab, const ProcParams* params,
|
void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pwb, LabImage* lab, const ProcParams* params,
|
||||||
const ColorAppearance & customColCurve1, const ColorAppearance & customColCurve2, const ColorAppearance & customColCurve3,
|
const ColorAppearance & customColCurve1, const ColorAppearance & customColCurve2, const ColorAppearance & customColCurve3,
|
||||||
LUTu & histLCAM, LUTu & histCCAM, LUTf & CAMBrightCurveJ, LUTf & CAMBrightCurveQ, float &mean, int Iterates, int scale, bool execsharp, float &d, float &dj, float &yb, int rtt)
|
LUTu & histLCAM, LUTu & histCCAM, LUTf & CAMBrightCurveJ, LUTf & CAMBrightCurveQ, float &mean, int Iterates, int scale, bool execsharp, float &d, float &dj, float &yb, int rtt)
|
||||||
{
|
{
|
||||||
@ -1563,9 +1550,9 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int
|
|||||||
|| (params->dirpyrequalizer.enabled && settings->autocielab) || (params->defringe.enabled && settings->autocielab) || (params->sharpenMicro.enabled && settings->autocielab)
|
|| (params->dirpyrequalizer.enabled && settings->autocielab) || (params->defringe.enabled && settings->autocielab) || (params->sharpenMicro.enabled && settings->autocielab)
|
||||||
|| (params->impulseDenoise.enabled && settings->autocielab) || (params->colorappearance.badpixsl > 0 && settings->autocielab));
|
|| (params->impulseDenoise.enabled && settings->autocielab) || (params->colorappearance.badpixsl > 0 && settings->autocielab));
|
||||||
|
|
||||||
ColorTemp::temp2mulxyz (params->wb.temperature, params->wb.green, params->wb.method, Xw, Zw); //compute white Xw Yw Zw : white current WB
|
ColorTemp::temp2mulxyz (params->wb.temperature, params->wb.method, Xw, Zw); //compute white Xw Yw Zw : white current WB
|
||||||
ColorTemp::temp2mulxyz (params->colorappearance.tempout, params->colorappearance.greenout, "Custom", Xwout, Zwout);
|
ColorTemp::temp2mulxyz (params->colorappearance.tempout, "Custom", Xwout, Zwout);
|
||||||
ColorTemp::temp2mulxyz (params->colorappearance.tempsc, params->colorappearance.greensc, "Custom", Xwsc, Zwsc);
|
ColorTemp::temp2mulxyz (params->colorappearance.tempsc, "Custom", Xwsc, Zwsc);
|
||||||
|
|
||||||
//viewing condition for surrsrc
|
//viewing condition for surrsrc
|
||||||
if (params->colorappearance.surrsrc == "Average") {
|
if (params->colorappearance.surrsrc == "Average") {
|
||||||
@ -1982,7 +1969,6 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int
|
|||||||
const float pow1n = pow_F ( 1.64f - pow_F ( 0.29f, nj ), 0.73f );
|
const float pow1n = pow_F ( 1.64f - pow_F ( 0.29f, nj ), 0.73f );
|
||||||
|
|
||||||
const float epsil = 0.0001f;
|
const float epsil = 0.0001f;
|
||||||
const float w_h = wh + epsil;
|
|
||||||
const float coefQ = 32767.f / wh;
|
const float coefQ = 32767.f / wh;
|
||||||
const float a_w = aw;
|
const float a_w = aw;
|
||||||
const float c_ = c;
|
const float c_ = c;
|
||||||
@ -2605,7 +2591,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int
|
|||||||
Ciecam02::jch2xyz_ciecam02float ( x, y, z,
|
Ciecam02::jch2xyz_ciecam02float ( x, y, z,
|
||||||
LVF (Jbuffer[k]), LVF (Cbuffer[k]), LVF (hbuffer[k]),
|
LVF (Jbuffer[k]), LVF (Cbuffer[k]), LVF (hbuffer[k]),
|
||||||
F2V (xw2), F2V (yw2), F2V (zw2),
|
F2V (xw2), F2V (yw2), F2V (zw2),
|
||||||
F2V (f2), F2V (nc2), F2V (pow1n), F2V (nbbj), F2V (ncbj), F2V (flj), F2V (dj), F2V (awj), F2V (reccmcz));
|
F2V (nc2), F2V (pow1n), F2V (nbbj), F2V (ncbj), F2V (flj), F2V (dj), F2V (awj), F2V (reccmcz));
|
||||||
STVF (xbuffer[k], x * c655d35);
|
STVF (xbuffer[k], x * c655d35);
|
||||||
STVF (ybuffer[k], y * c655d35);
|
STVF (ybuffer[k], y * c655d35);
|
||||||
STVF (zbuffer[k], z * c655d35);
|
STVF (zbuffer[k], z * c655d35);
|
||||||
@ -2707,10 +2693,6 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int
|
|||||||
//if(params->dirpyrequalizer.enabled) if(execsharp) {
|
//if(params->dirpyrequalizer.enabled) if(execsharp) {
|
||||||
if (params->dirpyrequalizer.enabled) {
|
if (params->dirpyrequalizer.enabled) {
|
||||||
if (params->dirpyrequalizer.gamutlab /*&& execsharp*/) { //remove artifacts by gaussian blur - skin control
|
if (params->dirpyrequalizer.gamutlab /*&& execsharp*/) { //remove artifacts by gaussian blur - skin control
|
||||||
float b_l = static_cast<float> (params->dirpyrequalizer.hueskin.value[0]) / 100.0f;
|
|
||||||
float t_l = static_cast<float> (params->dirpyrequalizer.hueskin.value[1]) / 100.0f;
|
|
||||||
float b_r = static_cast<float> (params->dirpyrequalizer.hueskin.value[2]) / 100.0f;
|
|
||||||
float t_r = static_cast<float> (params->dirpyrequalizer.hueskin.value[3]) / 100.0f;
|
|
||||||
float artifact = (float) settings->artifact_cbdl;
|
float artifact = (float) settings->artifact_cbdl;
|
||||||
|
|
||||||
if (artifact > 6.f) {
|
if (artifact > 6.f) {
|
||||||
@ -2724,7 +2706,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int
|
|||||||
int hotbad = 0;
|
int hotbad = 0;
|
||||||
float chrom = 50.f;
|
float chrom = 50.f;
|
||||||
lab->deleteLab();
|
lab->deleteLab();
|
||||||
ImProcFunctions::badpixcam (ncie, artifact, 5, 2, b_l, t_l, t_r, b_r, params->dirpyrequalizer.skinprotect, chrom, hotbad); //enabled remove artifacts for cbDL
|
ImProcFunctions::badpixcam (ncie, artifact, 5, 2, params->dirpyrequalizer.skinprotect, chrom, hotbad); //enabled remove artifacts for cbDL
|
||||||
lab->reallocLab();
|
lab->reallocLab();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2733,7 +2715,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int
|
|||||||
if (params->colorappearance.badpixsl > 0) if (execsharp) {
|
if (params->colorappearance.badpixsl > 0) if (execsharp) {
|
||||||
int mode = params->colorappearance.badpixsl;
|
int mode = params->colorappearance.badpixsl;
|
||||||
lab->deleteLab();
|
lab->deleteLab();
|
||||||
ImProcFunctions::badpixcam (ncie, 3.0, 10, mode, 0, 0, 0, 0, 0, 0, 1);//for bad pixels CIECAM
|
ImProcFunctions::badpixcam (ncie, 3.0, 10, mode, 0, 0, 1);//for bad pixels CIECAM
|
||||||
lab->reallocLab();
|
lab->reallocLab();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2763,11 +2745,9 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int
|
|||||||
if (rtt == 1) {
|
if (rtt == 1) {
|
||||||
float b_l = static_cast<float> (params->dirpyrequalizer.hueskin.value[0]) / 100.0f;
|
float b_l = static_cast<float> (params->dirpyrequalizer.hueskin.value[0]) / 100.0f;
|
||||||
float t_l = static_cast<float> (params->dirpyrequalizer.hueskin.value[1]) / 100.0f;
|
float t_l = static_cast<float> (params->dirpyrequalizer.hueskin.value[1]) / 100.0f;
|
||||||
float b_r = static_cast<float> (params->dirpyrequalizer.hueskin.value[2]) / 100.0f;
|
|
||||||
float t_r = static_cast<float> (params->dirpyrequalizer.hueskin.value[3]) / 100.0f;
|
float t_r = static_cast<float> (params->dirpyrequalizer.hueskin.value[3]) / 100.0f;
|
||||||
int choice = 0; // I have not suppress this statement in case of !! always to 0
|
|
||||||
lab->deleteLab();
|
lab->deleteLab();
|
||||||
dirpyr_equalizercam (ncie, ncie->sh_p, ncie->sh_p, ncie->W, ncie->H, ncie->h_p, ncie->C_p, params->dirpyrequalizer.mult, params->dirpyrequalizer.threshold, params->dirpyrequalizer.skinprotect, true, params->dirpyrequalizer.gamutlab, b_l, t_l, t_r, b_r, choice, scale); //contrast by detail adapted to CIECAM
|
dirpyr_equalizercam (ncie, ncie->sh_p, ncie->sh_p, ncie->W, ncie->H, ncie->h_p, ncie->C_p, params->dirpyrequalizer.mult, params->dirpyrequalizer.threshold, params->dirpyrequalizer.skinprotect, true, b_l, t_l, t_r, scale); //contrast by detail adapted to CIECAM
|
||||||
lab->reallocLab();
|
lab->reallocLab();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2810,7 +2790,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int
|
|||||||
|
|
||||||
if (epdEnabled && params->colorappearance.tonecie && algepd) {
|
if (epdEnabled && params->colorappearance.tonecie && algepd) {
|
||||||
lab->deleteLab();
|
lab->deleteLab();
|
||||||
ImProcFunctions::EPDToneMapCIE (ncie, a_w, c_, w_h, width, height, begh, endh, minQ, maxQ, Iterates, scale );
|
ImProcFunctions::EPDToneMapCIE (ncie, a_w, c_, width, height, minQ, maxQ, Iterates, scale );
|
||||||
lab->reallocLab();
|
lab->reallocLab();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2949,7 +2929,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int
|
|||||||
Ciecam02::jch2xyz_ciecam02float ( x, y, z,
|
Ciecam02::jch2xyz_ciecam02float ( x, y, z,
|
||||||
LVF (Jbuffer[k]), LVF (Cbuffer[k]), LVF (hbuffer[k]),
|
LVF (Jbuffer[k]), LVF (Cbuffer[k]), LVF (hbuffer[k]),
|
||||||
F2V (xw2), F2V (yw2), F2V (zw2),
|
F2V (xw2), F2V (yw2), F2V (zw2),
|
||||||
F2V (f2), F2V (nc2), F2V (pow1n), F2V (nbbj), F2V (ncbj), F2V (flj), F2V (dj), F2V (awj), F2V (reccmcz));
|
F2V (nc2), F2V (pow1n), F2V (nbbj), F2V (ncbj), F2V (flj), F2V (dj), F2V (awj), F2V (reccmcz));
|
||||||
x *= c655d35;
|
x *= c655d35;
|
||||||
y *= c655d35;
|
y *= c655d35;
|
||||||
z *= c655d35;
|
z *= c655d35;
|
||||||
@ -4064,7 +4044,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer
|
|||||||
float lumbefore = 0.299f * r + 0.587f * g + 0.114f * b;
|
float lumbefore = 0.299f * r + 0.587f * g + 0.114f * b;
|
||||||
float ro, go, bo;
|
float ro, go, bo;
|
||||||
int mode = 0;
|
int mode = 0;
|
||||||
toningsmh (r, g, b, ro, go, bo, RedLow, GreenLow, BlueLow, RedMed, GreenMed, BlueMed, RedHigh, GreenHigh, BlueHigh, reducac, mode, preser, strProtect);
|
toningsmh (r, g, b, ro, go, bo, RedLow, GreenLow, BlueLow, RedMed, GreenMed, BlueMed, RedHigh, GreenHigh, BlueHigh, reducac, mode, strProtect);
|
||||||
float lumafter = 0.299f * ro + 0.587f * go + 0.114f * bo;
|
float lumafter = 0.299f * ro + 0.587f * go + 0.114f * bo;
|
||||||
float preserv = 1.f;
|
float preserv = 1.f;
|
||||||
|
|
||||||
@ -4215,21 +4195,21 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer
|
|||||||
if (beforeCurveMode == BlackWhiteParams::TC_MODE_STD_BW) { // Standard
|
if (beforeCurveMode == BlackWhiteParams::TC_MODE_STD_BW) { // Standard
|
||||||
for (int i = istart, ti = 0; i < tH; i++, ti++) {
|
for (int i = istart, ti = 0; i < tH; i++, ti++) {
|
||||||
for (int j = jstart, tj = 0; j < tW; j++, tj++) {
|
for (int j = jstart, tj = 0; j < tW; j++, tj++) {
|
||||||
const StandardToneCurvebw& userToneCurvebw = static_cast<const StandardToneCurvebw&> (customToneCurvebw1);
|
const StandardToneCurve& userToneCurvebw = static_cast<const StandardToneCurve&> (customToneCurvebw1);
|
||||||
userToneCurvebw.Apply (rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj]);
|
userToneCurvebw.Apply (rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (beforeCurveMode == BlackWhiteParams::TC_MODE_FILMLIKE_BW) { // Adobe like
|
} else if (beforeCurveMode == BlackWhiteParams::TC_MODE_FILMLIKE_BW) { // Adobe like
|
||||||
for (int i = istart, ti = 0; i < tH; i++, ti++) {
|
for (int i = istart, ti = 0; i < tH; i++, ti++) {
|
||||||
for (int j = jstart, tj = 0; j < tW; j++, tj++) {
|
for (int j = jstart, tj = 0; j < tW; j++, tj++) {
|
||||||
const AdobeToneCurvebw& userToneCurvebw = static_cast<const AdobeToneCurvebw&> (customToneCurvebw1);
|
const AdobeToneCurve& userToneCurvebw = static_cast<const AdobeToneCurve&> (customToneCurvebw1);
|
||||||
userToneCurvebw.Apply (rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj]);
|
userToneCurvebw.Apply (rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (beforeCurveMode == BlackWhiteParams::TC_MODE_SATANDVALBLENDING_BW) { // apply the curve on the saturation and value channels
|
} else if (beforeCurveMode == BlackWhiteParams::TC_MODE_SATANDVALBLENDING_BW) { // apply the curve on the saturation and value channels
|
||||||
for (int i = istart, ti = 0; i < tH; i++, ti++) {
|
for (int i = istart, ti = 0; i < tH; i++, ti++) {
|
||||||
for (int j = jstart, tj = 0; j < tW; j++, tj++) {
|
for (int j = jstart, tj = 0; j < tW; j++, tj++) {
|
||||||
const SatAndValueBlendingToneCurvebw& userToneCurvebw = static_cast<const SatAndValueBlendingToneCurvebw&> (customToneCurvebw1);
|
const SatAndValueBlendingToneCurve& userToneCurvebw = static_cast<const SatAndValueBlendingToneCurve&> (customToneCurvebw1);
|
||||||
rtemp[ti * TS + tj] = CLIP<float> (rtemp[ti * TS + tj]);
|
rtemp[ti * TS + tj] = CLIP<float> (rtemp[ti * TS + tj]);
|
||||||
gtemp[ti * TS + tj] = CLIP<float> (gtemp[ti * TS + tj]);
|
gtemp[ti * TS + tj] = CLIP<float> (gtemp[ti * TS + tj]);
|
||||||
btemp[ti * TS + tj] = CLIP<float> (btemp[ti * TS + tj]);
|
btemp[ti * TS + tj] = CLIP<float> (btemp[ti * TS + tj]);
|
||||||
@ -4239,7 +4219,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer
|
|||||||
} else if (beforeCurveMode == BlackWhiteParams::TC_MODE_WEIGHTEDSTD_BW) { // apply the curve to the rgb channels, weighted
|
} else if (beforeCurveMode == BlackWhiteParams::TC_MODE_WEIGHTEDSTD_BW) { // apply the curve to the rgb channels, weighted
|
||||||
for (int i = istart, ti = 0; i < tH; i++, ti++) {
|
for (int i = istart, ti = 0; i < tH; i++, ti++) {
|
||||||
for (int j = jstart, tj = 0; j < tW; j++, tj++) {
|
for (int j = jstart, tj = 0; j < tW; j++, tj++) {
|
||||||
const WeightedStdToneCurvebw& userToneCurvebw = static_cast<const WeightedStdToneCurvebw&> (customToneCurvebw1);
|
const WeightedStdToneCurve& userToneCurvebw = static_cast<const WeightedStdToneCurve&> (customToneCurvebw1);
|
||||||
rtemp[ti * TS + tj] = CLIP<float> (rtemp[ti * TS + tj]);
|
rtemp[ti * TS + tj] = CLIP<float> (rtemp[ti * TS + tj]);
|
||||||
gtemp[ti * TS + tj] = CLIP<float> (gtemp[ti * TS + tj]);
|
gtemp[ti * TS + tj] = CLIP<float> (gtemp[ti * TS + tj]);
|
||||||
btemp[ti * TS + tj] = CLIP<float> (btemp[ti * TS + tj]);
|
btemp[ti * TS + tj] = CLIP<float> (btemp[ti * TS + tj]);
|
||||||
@ -4679,7 +4659,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer
|
|||||||
|
|
||||||
for (int i = 0; i < tH; i++) {
|
for (int i = 0; i < tH; i++) {
|
||||||
for (int j = 0; j < tW; j++) {
|
for (int j = 0; j < tW; j++) {
|
||||||
const StandardToneCurvebw& userToneCurve = static_cast<const StandardToneCurvebw&> (customToneCurvebw2);
|
const StandardToneCurve& userToneCurve = static_cast<const StandardToneCurve&> (customToneCurvebw2);
|
||||||
userToneCurve.Apply (tmpImage->r (i, j), tmpImage->g (i, j), tmpImage->b (i, j));
|
userToneCurve.Apply (tmpImage->r (i, j), tmpImage->g (i, j), tmpImage->b (i, j));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -4690,7 +4670,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer
|
|||||||
|
|
||||||
for (int i = 0; i < tH; i++) { //for ulterior usage if bw data modified
|
for (int i = 0; i < tH; i++) { //for ulterior usage if bw data modified
|
||||||
for (int j = 0; j < tW; j++) {
|
for (int j = 0; j < tW; j++) {
|
||||||
const WeightedStdToneCurvebw& userToneCurve = static_cast<const WeightedStdToneCurvebw&> (customToneCurvebw2);
|
const WeightedStdToneCurve& userToneCurve = static_cast<const WeightedStdToneCurve&> (customToneCurvebw2);
|
||||||
|
|
||||||
tmpImage->r (i, j) = CLIP<float> (tmpImage->r (i, j));
|
tmpImage->r (i, j) = CLIP<float> (tmpImage->r (i, j));
|
||||||
tmpImage->g (i, j) = CLIP<float> (tmpImage->g (i, j));
|
tmpImage->g (i, j) = CLIP<float> (tmpImage->g (i, j));
|
||||||
@ -4743,7 +4723,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer
|
|||||||
if (lumbefore < 65000.f && lumbefore > 500.f) { //reduct artifacts for highlights an extrem shadows
|
if (lumbefore < 65000.f && lumbefore > 500.f) { //reduct artifacts for highlights an extrem shadows
|
||||||
float ro, go, bo;
|
float ro, go, bo;
|
||||||
int mode = 1;
|
int mode = 1;
|
||||||
toningsmh (r, g, b, ro, go, bo, RedLow, GreenLow, BlueLow, RedMed, GreenMed, BlueMed, RedHigh, GreenHigh, BlueHigh, reducac, mode, preser, strProtect);
|
toningsmh (r, g, b, ro, go, bo, RedLow, GreenLow, BlueLow, RedMed, GreenMed, BlueMed, RedHigh, GreenHigh, BlueHigh, reducac, mode, strProtect);
|
||||||
float lumafter = 0.299f * ro + 0.587f * go + 0.114f * bo;
|
float lumafter = 0.299f * ro + 0.587f * go + 0.114f * bo;
|
||||||
float preserv = 1.f;
|
float preserv = 1.f;
|
||||||
|
|
||||||
@ -5085,7 +5065,7 @@ void ImProcFunctions::secondeg_begin (float reducac, float vend, float &aam, flo
|
|||||||
* @param mode ?
|
* @param mode ?
|
||||||
* @param preser whether to preserve luminance (if 1) or not
|
* @param preser whether to preserve luminance (if 1) or not
|
||||||
**/
|
**/
|
||||||
void ImProcFunctions::toningsmh (float r, float g, float b, float &ro, float &go, float &bo, float RedLow, float GreenLow, float BlueLow, float RedMed, float GreenMed, float BlueMed, float RedHigh, float GreenHigh, float BlueHigh, float reducac, int mode, int preser, float strProtect)
|
void ImProcFunctions::toningsmh (float r, float g, float b, float &ro, float &go, float &bo, float RedLow, float GreenLow, float BlueLow, float RedMed, float GreenMed, float BlueMed, float RedHigh, float GreenHigh, float BlueHigh, float reducac, int mode, float strProtect)
|
||||||
{
|
{
|
||||||
float bmu = mode == 1 ? 0.5f : 0.4f;
|
float bmu = mode == 1 ? 0.5f : 0.4f;
|
||||||
float RedL = 1.f + (RedLow - 1.f) * 0.4f;
|
float RedL = 1.f + (RedLow - 1.f) * 0.4f;
|
||||||
@ -5562,8 +5542,6 @@ void ImProcFunctions::labtoning (float r, float g, float b, float &ro, float &go
|
|||||||
float opacity2 = (1.f - min<float> (s / satLimit, 1.f) * (1.f - satLimitOpacity));
|
float opacity2 = (1.f - min<float> (s / satLimit, 1.f) * (1.f - satLimitOpacity));
|
||||||
|
|
||||||
//float ro, go, bo;
|
//float ro, go, bo;
|
||||||
bool chr = true;
|
|
||||||
bool lum = false;
|
|
||||||
float lm = l;
|
float lm = l;
|
||||||
float chromat, luma;
|
float chromat, luma;
|
||||||
|
|
||||||
@ -5579,12 +5557,10 @@ void ImProcFunctions::labtoning (float r, float g, float b, float &ro, float &go
|
|||||||
luma = 1.f - SQR (SQR ((lm * 65535.f) / (cl2Toningcurve[ (lm) * 65535.f]))); //apply C2=f(L) acts only on 'b'
|
luma = 1.f - SQR (SQR ((lm * 65535.f) / (cl2Toningcurve[ (lm) * 65535.f]))); //apply C2=f(L) acts only on 'b'
|
||||||
}
|
}
|
||||||
|
|
||||||
int todo = 1;
|
|
||||||
|
|
||||||
if (algm == 1) {
|
if (algm == 1) {
|
||||||
Color::interpolateRGBColor (realL, iplow, iphigh, algm, opacity, twoc, metchrom, chr, lum, chromat, luma, r, g, b, xl, yl, zl, x2, y2, z2, todo, wp, wip, ro, go, bo);
|
Color::interpolateRGBColor (realL, iplow, iphigh, algm, opacity, twoc, metchrom, chromat, luma, r, g, b, xl, yl, zl, x2, y2, z2, wp, wip, ro, go, bo);
|
||||||
} else {
|
} else {
|
||||||
Color::interpolateRGBColor (realL, iplow, iphigh, algm, opacity2, twoc, metchrom, chr, lum, chromat, luma, r, g, b, xl, yl, zl, x2, y2, z2, todo, wp, wip, ro, go, bo);
|
Color::interpolateRGBColor (realL, iplow, iphigh, algm, opacity2, twoc, metchrom, chromat, luma, r, g, b, xl, yl, zl, x2, y2, z2, wp, wip, ro, go, bo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5824,7 +5800,7 @@ SSEFUNCTION void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBu
|
|||||||
|
|
||||||
// only if user activate Lab adjustments
|
// only if user activate Lab adjustments
|
||||||
if (autili || butili || ccutili || cclutili || chutili || lhutili || hhutili || clcutili || utili || chromaticity) {
|
if (autili || butili || ccutili || cclutili || chutili || lhutili || hhutili || clcutili || utili || chromaticity) {
|
||||||
Color::LabGamutMunsell (lold->L[i], lold->a[i], lold->b[i], W, /*corMunsell*/true, /*lumaMuns*/false, params->toneCurve.hrenabled, /*gamut*/true, wip, multiThread);
|
Color::LabGamutMunsell (lold->L[i], lold->a[i], lold->b[i], W, /*corMunsell*/true, /*lumaMuns*/false, params->toneCurve.hrenabled, /*gamut*/true, wip);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __SSE2__
|
#ifdef __SSE2__
|
||||||
@ -6378,8 +6354,8 @@ SSEFUNCTION void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBu
|
|||||||
|
|
||||||
//#include "cubic.cc"
|
//#include "cubic.cc"
|
||||||
|
|
||||||
void ImProcFunctions::colorCurve (LabImage* lold, LabImage* lnew)
|
//void ImProcFunctions::colorCurve (LabImage* lold, LabImage* lnew)
|
||||||
{
|
//{
|
||||||
|
|
||||||
/* LUT<double> cmultiplier(181021);
|
/* LUT<double> cmultiplier(181021);
|
||||||
|
|
||||||
@ -6456,7 +6432,7 @@ void ImProcFunctions::colorCurve (LabImage* lold, LabImage* lnew)
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
//delete [] cmultiplier;
|
//delete [] cmultiplier;
|
||||||
}
|
//}
|
||||||
|
|
||||||
void ImProcFunctions::impulsedenoise (LabImage* lab)
|
void ImProcFunctions::impulsedenoise (LabImage* lab)
|
||||||
{
|
{
|
||||||
@ -6495,17 +6471,17 @@ void ImProcFunctions::defringecam (CieImage* ncie)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImProcFunctions::badpixcam (CieImage* ncie, double rad, int thr, int mode, float b_l, float t_l, float t_r, float b_r, float skinprot, float chrom, int hotbad)
|
void ImProcFunctions::badpixcam (CieImage* ncie, double rad, int thr, int mode, float skinprot, float chrom, int hotbad)
|
||||||
{
|
{
|
||||||
if (ncie->W >= 8 && ncie->H >= 8) {
|
if (ncie->W >= 8 && ncie->H >= 8) {
|
||||||
Badpixelscam (ncie, ncie, rad, thr, mode, b_l, t_l, t_r, b_r, skinprot, chrom, hotbad);
|
Badpixelscam (ncie, ncie, rad, thr, mode, skinprot, chrom, hotbad);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImProcFunctions::badpixlab (LabImage* lab, double rad, int thr, int mode, float b_l, float t_l, float t_r, float b_r, float skinprot, float chrom)
|
void ImProcFunctions::badpixlab (LabImage* lab, double rad, int thr, int mode, float skinprot, float chrom)
|
||||||
{
|
{
|
||||||
if (lab->W >= 8 && lab->H >= 8) {
|
if (lab->W >= 8 && lab->H >= 8) {
|
||||||
BadpixelsLab (lab, lab, rad, thr, mode, b_l, t_l, t_r, b_r, skinprot, chrom);
|
BadpixelsLab (lab, lab, rad, thr, mode, skinprot, chrom);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6514,9 +6490,7 @@ void ImProcFunctions::dirpyrequalizer (LabImage* lab, int scale)
|
|||||||
if (params->dirpyrequalizer.enabled && lab->W >= 8 && lab->H >= 8) {
|
if (params->dirpyrequalizer.enabled && lab->W >= 8 && lab->H >= 8) {
|
||||||
float b_l = static_cast<float> (params->dirpyrequalizer.hueskin.value[0]) / 100.0f;
|
float b_l = static_cast<float> (params->dirpyrequalizer.hueskin.value[0]) / 100.0f;
|
||||||
float t_l = static_cast<float> (params->dirpyrequalizer.hueskin.value[1]) / 100.0f;
|
float t_l = static_cast<float> (params->dirpyrequalizer.hueskin.value[1]) / 100.0f;
|
||||||
float b_r = static_cast<float> (params->dirpyrequalizer.hueskin.value[2]) / 100.0f;
|
|
||||||
float t_r = static_cast<float> (params->dirpyrequalizer.hueskin.value[3]) / 100.0f;
|
float t_r = static_cast<float> (params->dirpyrequalizer.hueskin.value[3]) / 100.0f;
|
||||||
int choice = 0; //I have not disabled this statement in case of ! always 0
|
|
||||||
// if (params->dirpyrequalizer.algo=="FI") choice=0;
|
// if (params->dirpyrequalizer.algo=="FI") choice=0;
|
||||||
// else if(params->dirpyrequalizer.algo=="LA") choice=1;
|
// else if(params->dirpyrequalizer.algo=="LA") choice=1;
|
||||||
float artifact = (float) settings->artifact_cbdl;
|
float artifact = (float) settings->artifact_cbdl;
|
||||||
@ -6532,14 +6506,14 @@ void ImProcFunctions::dirpyrequalizer (LabImage* lab, int scale)
|
|||||||
float chrom = 50.f;
|
float chrom = 50.f;
|
||||||
|
|
||||||
if (params->dirpyrequalizer.gamutlab) {
|
if (params->dirpyrequalizer.gamutlab) {
|
||||||
ImProcFunctions::badpixlab (lab, artifact, 5, 3, b_l, t_l, t_r, b_r, params->dirpyrequalizer.skinprotect, chrom); //for artifacts
|
ImProcFunctions::badpixlab (lab, artifact, 5, 3, params->dirpyrequalizer.skinprotect, chrom); //for artifacts
|
||||||
}
|
}
|
||||||
|
|
||||||
//dirpyrLab_equalizer(lab, lab, params->dirpyrequalizer.mult);
|
//dirpyrLab_equalizer(lab, lab, params->dirpyrequalizer.mult);
|
||||||
dirpyr_equalizer (lab->L, lab->L, lab->W, lab->H, lab->a, lab->b, lab->a, lab->b, params->dirpyrequalizer.mult, params->dirpyrequalizer.threshold, params->dirpyrequalizer.skinprotect, params->dirpyrequalizer.gamutlab, b_l, t_l, t_r, b_r, choice, scale);
|
dirpyr_equalizer (lab->L, lab->L, lab->W, lab->H, lab->a, lab->b, params->dirpyrequalizer.mult, params->dirpyrequalizer.threshold, params->dirpyrequalizer.skinprotect, b_l, t_l, t_r, scale);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void ImProcFunctions::EPDToneMapCIE (CieImage *ncie, float a_w, float c_, float w_h, int Wid, int Hei, int begh, int endh, float minQ, float maxQ, unsigned int Iterates, int skip)
|
void ImProcFunctions::EPDToneMapCIE (CieImage *ncie, float a_w, float c_, int Wid, int Hei, float minQ, float maxQ, unsigned int Iterates, int skip)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (!params->epd.enabled) {
|
if (!params->epd.enabled) {
|
||||||
@ -6752,7 +6726,7 @@ void ImProcFunctions::EPDToneMap (LabImage *lab, unsigned int Iterates, int skip
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ImProcFunctions::getAutoExp (const LUTu &histogram, int histcompr, double defgain, double clip,
|
void ImProcFunctions::getAutoExp (const LUTu &histogram, int histcompr, double clip,
|
||||||
double& expcomp, int& bright, int& contr, int& black, int& hlcompr, int& hlcomprthresh)
|
double& expcomp, int& bright, int& contr, int& black, int& hlcompr, int& hlcomprthresh)
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -7070,7 +7044,7 @@ double ImProcFunctions::getAutoDistor (const Glib::ustring &fname, int thumb_si
|
|||||||
return 0.0;
|
return 0.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
Thumbnail* raw = rtengine::Thumbnail::loadFromRaw (fname, ri, sensorType, w_raw, h_raw, 1, 1.0, FALSE, 0);
|
Thumbnail* raw = rtengine::Thumbnail::loadFromRaw (fname, ri, sensorType, w_raw, h_raw, 1, 1.0, FALSE);
|
||||||
|
|
||||||
if (!raw) {
|
if (!raw) {
|
||||||
delete thumb;
|
delete thumb;
|
||||||
|
@ -220,7 +220,7 @@ public:
|
|||||||
double expcomp, int hlcompr, int hlcomprthresh, DCPProfile *dcpProf, const DCPProfile::ApplyState &asIn, LUTu &histToneCurve);
|
double expcomp, int hlcompr, int hlcomprthresh, DCPProfile *dcpProf, const DCPProfile::ApplyState &asIn, LUTu &histToneCurve);
|
||||||
void labtoning (float r, float g, float b, float &ro, float &go, float &bo, int algm, int metchrom, int twoc, float satLimit, float satLimitOpacity, const ColorGradientCurve & ctColorCurve, const OpacityCurve & ctOpacityCurve, LUTf & clToningcurve, LUTf & cl2Toningcurve, float iplow, float iphigh, double wp[3][3], double wip[3][3] );
|
void labtoning (float r, float g, float b, float &ro, float &go, float &bo, int algm, int metchrom, int twoc, float satLimit, float satLimitOpacity, const ColorGradientCurve & ctColorCurve, const OpacityCurve & ctOpacityCurve, LUTf & clToningcurve, LUTf & cl2Toningcurve, float iplow, float iphigh, double wp[3][3], double wip[3][3] );
|
||||||
void toning2col (float r, float g, float b, float &ro, float &go, float &bo, float iplow, float iphigh, float rl, float gl, float bl, float rh, float gh, float bh, float SatLow, float SatHigh, float balanS, float balanH, float reducac, int mode, int preser, float strProtect);
|
void toning2col (float r, float g, float b, float &ro, float &go, float &bo, float iplow, float iphigh, float rl, float gl, float bl, float rh, float gh, float bh, float SatLow, float SatHigh, float balanS, float balanH, float reducac, int mode, int preser, float strProtect);
|
||||||
void toningsmh (float r, float g, float b, float &ro, float &go, float &bo, float RedLow, float GreenLow, float BlueLow, float RedMed, float GreenMed, float BlueMed, float RedHigh, float GreenHigh, float BlueHigh, float reducac, int mode, int preser, float strProtect);
|
void toningsmh (float r, float g, float b, float &ro, float &go, float &bo, float RedLow, float GreenLow, float BlueLow, float RedMed, float GreenMed, float BlueMed, float RedHigh, float GreenHigh, float BlueHigh, float reducac, int mode, float strProtect);
|
||||||
void toningsmh2 (float r, float g, float b, float &ro, float &go, float &bo, float low[3], float satLow, float med[3], float satMed, float high[3], float satHigh, float reducac, int mode, int preser);
|
void toningsmh2 (float r, float g, float b, float &ro, float &go, float &bo, float low[3], float satLow, float med[3], float satMed, float high[3], float satHigh, float reducac, int mode, int preser);
|
||||||
void secondeg_begin (float reducac, float vend, float &aam, float &bbm);
|
void secondeg_begin (float reducac, float vend, float &aam, float &bbm);
|
||||||
void secondeg_end (float reducac, float vinf, float &aa, float &bb, float &cc);
|
void secondeg_end (float reducac, float vinf, float &aa, float &bb, float &cc);
|
||||||
@ -229,15 +229,15 @@ public:
|
|||||||
void moyeqt (Imagefloat* working, float &moyS, float &eqty);
|
void moyeqt (Imagefloat* working, float &moyS, float &eqty);
|
||||||
|
|
||||||
void luminanceCurve (LabImage* lold, LabImage* lnew, LUTf &curve);
|
void luminanceCurve (LabImage* lold, LabImage* lnew, LUTf &curve);
|
||||||
void ciecam_02float (CieImage* ncie, float adap, int begh, int endh, int pW, int pwb, LabImage* lab, const ProcParams* params,
|
void ciecam_02float (CieImage* ncie, float adap, int pW, int pwb, LabImage* lab, const ProcParams* params,
|
||||||
const ColorAppearance & customColCurve1, const ColorAppearance & customColCurve, const ColorAppearance & customColCurve3,
|
const ColorAppearance & customColCurve1, const ColorAppearance & customColCurve, const ColorAppearance & customColCurve3,
|
||||||
LUTu &histLCAM, LUTu &histCCAM, LUTf & CAMBrightCurveJ, LUTf & CAMBrightCurveQ, float &mean, int Iterates, int scale, bool execsharp, float &d, float &dj, float &yb, int rtt);
|
LUTu &histLCAM, LUTu &histCCAM, LUTf & CAMBrightCurveJ, LUTf & CAMBrightCurveQ, float &mean, int Iterates, int scale, bool execsharp, float &d, float &dj, float &yb, int rtt);
|
||||||
void ciecam_02 (CieImage* ncie, double adap, int begh, int endh, int pW, int pwb, LabImage* lab, const ProcParams* params,
|
void ciecam_02 (CieImage* ncie, double adap, int pW, int pwb, LabImage* lab, const ProcParams* params,
|
||||||
const ColorAppearance & customColCurve1, const ColorAppearance & customColCurve, const ColorAppearance & customColCurve3,
|
const ColorAppearance & customColCurve1, const ColorAppearance & customColCurve, const ColorAppearance & customColCurve3,
|
||||||
LUTu &histLCAM, LUTu &histCCAM, LUTf & CAMBrightCurveJ, LUTf & CAMBrightCurveQ, float &mean, int Iterates, int scale, bool execsharp, double &d, double &dj, double &yb, int rtt);
|
LUTu &histLCAM, LUTu &histCCAM, LUTf & CAMBrightCurveJ, LUTf & CAMBrightCurveQ, float &mean, int Iterates, int scale, bool execsharp, double &d, double &dj, int rtt);
|
||||||
void chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW, LabImage* lold, LabImage* lnew, LUTf &acurve, LUTf &bcurve, LUTf & satcurve, LUTf & satclcurve, LUTf &clcurve, LUTf &curve, bool utili, bool autili, bool butili, bool ccutili, bool cclutili, bool clcutili, LUTu &histCCurve, LUTu &histLurve);
|
void chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW, LabImage* lold, LabImage* lnew, LUTf &acurve, LUTf &bcurve, LUTf & satcurve, LUTf & satclcurve, LUTf &clcurve, LUTf &curve, bool utili, bool autili, bool butili, bool ccutili, bool cclutili, bool clcutili, LUTu &histCCurve, LUTu &histLurve);
|
||||||
void vibrance (LabImage* lab);//Jacques' vibrance
|
void vibrance (LabImage* lab);//Jacques' vibrance
|
||||||
void colorCurve (LabImage* lold, LabImage* lnew);
|
// void colorCurve (LabImage* lold, LabImage* lnew);
|
||||||
void sharpening (LabImage* lab, float** buffer, SharpeningParams &sharpenParam);
|
void sharpening (LabImage* lab, float** buffer, SharpeningParams &sharpenParam);
|
||||||
void sharpeningcam (CieImage* ncie, float** buffer);
|
void sharpeningcam (CieImage* ncie, float** buffer);
|
||||||
void transform (Imagefloat* original, Imagefloat* transformed, int cx, int cy, int sx, int sy, int oW, int oH, int fW, int fH, const FramesMetaData *metadata, int rawRotationDeg, bool fullImage);
|
void transform (Imagefloat* original, Imagefloat* transformed, int cx, int cy, int sx, int sy, int oW, int oH, int fW, int fH, const FramesMetaData *metadata, int rawRotationDeg, bool fullImage);
|
||||||
@ -263,12 +263,12 @@ public:
|
|||||||
|
|
||||||
|
|
||||||
void EPDToneMapResid (float * WavCoeffs_L0, unsigned int Iterates, int skip, struct cont_params& cp, int W_L, int H_L, float max0, float min0);
|
void EPDToneMapResid (float * WavCoeffs_L0, unsigned int Iterates, int skip, struct cont_params& cp, int W_L, int H_L, float max0, float min0);
|
||||||
float *CompressDR (float *Source, int skip, struct cont_params &cp, int W_L, int H_L, float Compression, float DetailBoost, float max0, float min0, float ave, float ah, float bh, float al, float bl, float factorx, float *Compressed);
|
float *CompressDR (float *Source, int W_L, int H_L, float Compression, float DetailBoost, float *Compressed);
|
||||||
void ContrastResid (float * WavCoeffs_L0, unsigned int Iterates, int skip, struct cont_params &cp, int W_L, int H_L, float max0, float min0, float ave, float ah, float bh, float al, float bl, float factorx);
|
void ContrastResid (float * WavCoeffs_L0, struct cont_params &cp, int W_L, int H_L, float max0, float min0);
|
||||||
float *ContrastDR (float *Source, int skip, struct cont_params &cp, int W_L, int H_L, float Compression, float DetailBoost, float max0, float min0, float ave, float ah, float bh, float al, float bl, float factorx, float *Contrast = nullptr);
|
float *ContrastDR (float *Source, int W_L, int H_L, float *Contrast = nullptr);
|
||||||
|
|
||||||
void EPDToneMap (LabImage *lab, unsigned int Iterates = 0, int skip = 1);
|
void EPDToneMap (LabImage *lab, unsigned int Iterates = 0, int skip = 1);
|
||||||
void EPDToneMapCIE (CieImage *ncie, float a_w, float c_, float w_h, int Wid, int Hei, int begh, int endh, float minQ, float maxQ, unsigned int Iterates = 0, int skip = 1);
|
void EPDToneMapCIE (CieImage *ncie, float a_w, float c_, int Wid, int Hei, float minQ, float maxQ, unsigned int Iterates = 0, int skip = 1);
|
||||||
|
|
||||||
// pyramid denoise
|
// pyramid denoise
|
||||||
procparams::DirPyrDenoiseParams dnparams;
|
procparams::DirPyrDenoiseParams dnparams;
|
||||||
@ -278,25 +278,25 @@ public:
|
|||||||
int pitch, int scale, const int luma, const int chroma/*, LUTf & Lcurve, LUTf & abcurve*/ );
|
int pitch, int scale, const int luma, const int chroma/*, LUTf & Lcurve, LUTf & abcurve*/ );
|
||||||
|
|
||||||
void Tile_calc (int tilesize, int overlap, int kall, int imwidth, int imheight, int &numtiles_W, int &numtiles_H, int &tilewidth, int &tileheight, int &tileWskip, int &tileHskip);
|
void Tile_calc (int tilesize, int overlap, int kall, int imwidth, int imheight, int &numtiles_W, int &numtiles_H, int &tilewidth, int &tileheight, int &tileWskip, int &tileHskip);
|
||||||
void ip_wavelet (LabImage * lab, LabImage * dst, int kall, const procparams::WaveletParams & waparams, const WavCurve & wavCLVCcurve, const WavOpacityCurveRG & waOpacityCurveRG, const WavOpacityCurveBY & waOpacityCurveBY, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, LUTf &wavclCurve, bool wavcontlutili, int skip);
|
void ip_wavelet (LabImage * lab, LabImage * dst, int kall, const procparams::WaveletParams & waparams, const WavCurve & wavCLVCcurve, const WavOpacityCurveRG & waOpacityCurveRG, const WavOpacityCurveBY & waOpacityCurveBY, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, LUTf &wavclCurve, int skip);
|
||||||
|
|
||||||
void WaveletcontAllL (LabImage * lab, float **varhue, float **varchrom, wavelet_decomposition &WaveletCoeffs_L,
|
void WaveletcontAllL (LabImage * lab, float **varhue, float **varchrom, wavelet_decomposition &WaveletCoeffs_L,
|
||||||
struct cont_params &cp, int skip, float *mean, float *meanN, float *sigma, float *sigmaN, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, FlatCurve* ChCurve, bool Chutili);
|
struct cont_params &cp, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, FlatCurve* ChCurve, bool Chutili);
|
||||||
void WaveletcontAllLfinal (wavelet_decomposition &WaveletCoeffs_L, struct cont_params &cp, float *mean, float *sigma, float *MaxP, const WavOpacityCurveWL & waOpacityCurveWL);
|
void WaveletcontAllLfinal (wavelet_decomposition &WaveletCoeffs_L, struct cont_params &cp, float *mean, float *sigma, float *MaxP, const WavOpacityCurveWL & waOpacityCurveWL);
|
||||||
void WaveletcontAllAB (LabImage * lab, float **varhue, float **varchrom, wavelet_decomposition &WaveletCoeffs_a, const WavOpacityCurveW & waOpacityCurveW,
|
void WaveletcontAllAB (LabImage * lab, float **varhue, float **varchrom, wavelet_decomposition &WaveletCoeffs_a, const WavOpacityCurveW & waOpacityCurveW,
|
||||||
struct cont_params &cp, const bool useChannelA);
|
struct cont_params &cp, const bool useChannelA);
|
||||||
void WaveletAandBAllAB (LabImage * lab, float **varhue, float **varchrom, wavelet_decomposition &WaveletCoeffs_a, wavelet_decomposition &WaveletCoeffs_b,
|
void WaveletAandBAllAB (wavelet_decomposition &WaveletCoeffs_a, wavelet_decomposition &WaveletCoeffs_b,
|
||||||
struct cont_params &cp, const WavOpacityCurveW & waOpacityCurveW, FlatCurve* hhcurve, bool hhutili);
|
struct cont_params &cp, FlatCurve* hhcurve, bool hhutili);
|
||||||
void ContAllL (float **koeLi, float *maxkoeLi, bool lipschitz, int maxlvl, LabImage * lab, float **varhue, float **varchrom, float ** WavCoeffs_L, float * WavCoeffs_L0, int level, int dir, struct cont_params &cp,
|
void ContAllL (float **koeLi, float *maxkoeLi, bool lipschitz, int maxlvl, LabImage * lab, float **varhue, float **varchrom, float ** WavCoeffs_L, float * WavCoeffs_L0, int level, int dir, struct cont_params &cp,
|
||||||
int W_L, int H_L, int skip, float *mean, float *meanN, float *sigma, float *sigmaN, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, FlatCurve* ChCurve, bool Chutili);
|
int W_L, int H_L, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, FlatCurve* ChCurve, bool Chutili);
|
||||||
void finalContAllL (float ** WavCoeffs_L, float * WavCoeffs_L0, int level, int dir, struct cont_params &cp,
|
void finalContAllL (float ** WavCoeffs_L, float * WavCoeffs_L0, int level, int dir, struct cont_params &cp,
|
||||||
int W_L, int H_L, float *mean, float *sigma, float *MaxP, const WavOpacityCurveWL & waOpacityCurveWL);
|
int W_L, int H_L, float *mean, float *sigma, float *MaxP, const WavOpacityCurveWL & waOpacityCurveWL);
|
||||||
void ContAllAB (LabImage * lab, int maxlvl, float **varhue, float **varchrom, float ** WavCoeffs_a, float * WavCoeffs_a0, int level, int dir, const WavOpacityCurveW & waOpacityCurveW, struct cont_params &cp,
|
void ContAllAB (LabImage * lab, int maxlvl, float **varhue, float **varchrom, float ** WavCoeffs_a, float * WavCoeffs_a0, int level, int dir, const WavOpacityCurveW & waOpacityCurveW, struct cont_params &cp,
|
||||||
int W_ab, int H_ab, const bool useChannelA);
|
int W_ab, int H_ab, const bool useChannelA);
|
||||||
void Evaluate2 (wavelet_decomposition &WaveletCoeffs_L,
|
void Evaluate2 (wavelet_decomposition &WaveletCoeffs_L,
|
||||||
const struct cont_params& cp, int ind, float *mean, float *meanN, float *sigma, float *sigmaN, float *MaxP, float *MaxN, float madL[8][3]);
|
float *mean, float *meanN, float *sigma, float *sigmaN, float *MaxP, float *MaxN);
|
||||||
void Eval2 (float ** WavCoeffs_L, int level, const struct cont_params& cp,
|
void Eval2 (float ** WavCoeffs_L, int level,
|
||||||
int W_L, int H_L, int skip_L, int ind, float *mean, float *meanN, float *sigma, float *sigmaN, float *MaxP, float *MaxN, float *madL);
|
int W_L, int H_L, float *mean, float *meanN, float *sigma, float *sigmaN, float *MaxP, float *MaxN);
|
||||||
|
|
||||||
void Aver (float * HH_Coeffs, int datalen, float &averagePlus, float &averageNeg, float &max, float &min);
|
void Aver (float * HH_Coeffs, int datalen, float &averagePlus, float &averageNeg, float &max, float &min);
|
||||||
void Sigma (float * HH_Coeffs, int datalen, float averagePlus, float averageNeg, float &sigmaPlus, float &sigmaNeg);
|
void Sigma (float * HH_Coeffs, int datalen, float averagePlus, float averageNeg, float &sigmaPlus, float &sigmaNeg);
|
||||||
@ -305,7 +305,7 @@ public:
|
|||||||
|
|
||||||
|
|
||||||
void Median_Denoise ( float **src, float **dst, int width, int height, Median medianType, int iterations, int numThreads, float **buffer = nullptr);
|
void Median_Denoise ( float **src, float **dst, int width, int height, Median medianType, int iterations, int numThreads, float **buffer = nullptr);
|
||||||
void RGB_denoise (int kall, Imagefloat * src, Imagefloat * dst, Imagefloat * calclum, float * ch_M, float *max_r, float *max_b, bool isRAW, const procparams::DirPyrDenoiseParams & dnparams, const double expcomp, const NoiseCurve & noiseLCurve, const NoiseCurve & noiseCCurve, float &chaut, float &redaut, float &blueaut, float &maxredaut, float & maxblueaut, float &nresi, float &highresi);
|
void RGB_denoise (int kall, Imagefloat * src, Imagefloat * dst, Imagefloat * calclum, float * ch_M, float *max_r, float *max_b, bool isRAW, const procparams::DirPyrDenoiseParams & dnparams, const double expcomp, const NoiseCurve & noiseLCurve, const NoiseCurve & noiseCCurve, float &nresi, float &highresi);
|
||||||
void RGB_denoise_infoGamCurve (const procparams::DirPyrDenoiseParams & dnparams, const bool isRAW, LUTf &gamcurve, float &gam, float &gamthresh, float &gamslope);
|
void RGB_denoise_infoGamCurve (const procparams::DirPyrDenoiseParams & dnparams, const bool isRAW, LUTf &gamcurve, float &gam, float &gamthresh, float &gamslope);
|
||||||
void RGB_denoise_info (Imagefloat * src, Imagefloat * provicalc, bool isRAW, LUTf &gamcurve, float gam, float gamthresh, float gamslope, const procparams::DirPyrDenoiseParams & dnparams, const double expcomp, float &chaut, int &Nb, float &redaut, float &blueaut, float &maxredaut, float & maxblueaut, float &minredaut, float & minblueaut, float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc, bool multiThread = false);
|
void RGB_denoise_info (Imagefloat * src, Imagefloat * provicalc, bool isRAW, LUTf &gamcurve, float gam, float gamthresh, float gamslope, const procparams::DirPyrDenoiseParams & dnparams, const double expcomp, float &chaut, int &Nb, float &redaut, float &blueaut, float &maxredaut, float & maxblueaut, float &minredaut, float & minblueaut, float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc, bool multiThread = false);
|
||||||
void RGBtile_denoise (float * fLblox, int hblproc, float noisevar_Ldetail, float * nbrwt, float * blurbuffer ); //for DCT
|
void RGBtile_denoise (float * fLblox, int hblproc, float noisevar_Ldetail, float * nbrwt, float * blurbuffer ); //for DCT
|
||||||
@ -313,8 +313,8 @@ public:
|
|||||||
bool WaveletDenoiseAllL (wavelet_decomposition &WaveletCoeffs_L, float *noisevarlum, float madL[8][3], float * vari, int edge);
|
bool WaveletDenoiseAllL (wavelet_decomposition &WaveletCoeffs_L, float *noisevarlum, float madL[8][3], float * vari, int edge);
|
||||||
bool WaveletDenoiseAllAB (wavelet_decomposition &WaveletCoeffs_L, wavelet_decomposition &WaveletCoeffs_ab, float *noisevarchrom, float madL[8][3], float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb);
|
bool WaveletDenoiseAllAB (wavelet_decomposition &WaveletCoeffs_L, wavelet_decomposition &WaveletCoeffs_ab, float *noisevarchrom, float madL[8][3], float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb);
|
||||||
void WaveletDenoiseAll_info (int levwav, wavelet_decomposition &WaveletCoeffs_a,
|
void WaveletDenoiseAll_info (int levwav, wavelet_decomposition &WaveletCoeffs_a,
|
||||||
wavelet_decomposition &WaveletCoeffs_b, float **noisevarlum, float **noisevarchrom, float **noisevarhue, int width, int height, float noisevar_abr, float noisevar_abb, LabImage * noi, float &chaut, int &Nb, float &redaut, float &blueaut, float &maxredaut, float &maxblueaut, float &minredaut, float & minblueaut, int schoice, bool autoch, float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc,
|
wavelet_decomposition &WaveletCoeffs_b, float **noisevarlum, float **noisevarchrom, float **noisevarhue, float &chaut, int &Nb, float &redaut, float &blueaut, float &maxredaut, float &maxblueaut, float &minredaut, float & minblueaut, int schoice, float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc,
|
||||||
float &maxchred, float &maxchblue, float &minchred, float &minchblue, int &nb, float &chau, float &chred, float &chblue, bool denoiseMethodRgb, bool multiThread);
|
float &maxchred, float &maxchblue, float &minchred, float &minchblue, int &nb, float &chau, float &chred, float &chblue, bool denoiseMethodRgb);
|
||||||
|
|
||||||
bool WaveletDenoiseAll_BiShrinkL (wavelet_decomposition &WaveletCoeffs_L, float *noisevarlum, float madL[8][3]);
|
bool WaveletDenoiseAll_BiShrinkL (wavelet_decomposition &WaveletCoeffs_L, float *noisevarlum, float madL[8][3]);
|
||||||
bool WaveletDenoiseAll_BiShrinkAB (wavelet_decomposition &WaveletCoeffs_L, wavelet_decomposition &WaveletCoeffs_ab, float *noisevarchrom, float madL[8][3], float noisevar_ab,
|
bool WaveletDenoiseAll_BiShrinkAB (wavelet_decomposition &WaveletCoeffs_L, wavelet_decomposition &WaveletCoeffs_ab, float *noisevarchrom, float madL[8][3], float noisevar_ab,
|
||||||
@ -322,9 +322,9 @@ public:
|
|||||||
void ShrinkAllL (wavelet_decomposition &WaveletCoeffs_L, float **buffer, int level, int dir, float *noisevarlum, float * madL, float * vari, int edge);
|
void ShrinkAllL (wavelet_decomposition &WaveletCoeffs_L, float **buffer, int level, int dir, float *noisevarlum, float * madL, float * vari, int edge);
|
||||||
void ShrinkAllAB (wavelet_decomposition &WaveletCoeffs_L, wavelet_decomposition &WaveletCoeffs_ab, float **buffer, int level, int dir,
|
void ShrinkAllAB (wavelet_decomposition &WaveletCoeffs_L, wavelet_decomposition &WaveletCoeffs_ab, float **buffer, int level, int dir,
|
||||||
float *noisevarchrom, float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb, float * madL, float * madaab = nullptr, bool madCalculated = false);
|
float *noisevarchrom, float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb, float * madL, float * madaab = nullptr, bool madCalculated = false);
|
||||||
void ShrinkAll_info (float ** WavCoeffs_a, float ** WavCoeffs_b, int level,
|
void ShrinkAll_info (float ** WavCoeffs_a, float ** WavCoeffs_b,
|
||||||
int W_ab, int H_ab, int skip_ab, float **noisevarlum, float **noisevarchrom, float **noisevarhue, int width, int height, float noisevar_abr, float noisevar_abb, LabImage * noi, float &chaut, int &Nb, float &redaut, float &blueaut, float &maxredaut, float &maxblueaut, float &minredaut, float &minblueaut, bool autoch, int schoice, int lvl, float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc,
|
int W_ab, int H_ab, float **noisevarlum, float **noisevarchrom, float **noisevarhue, float &chaut, int &Nb, float &redaut, float &blueaut, float &maxredaut, float &maxblueaut, float &minredaut, float &minblueaut, int schoice, int lvl, float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc,
|
||||||
float &maxchred, float &maxchblue, float &minchred, float &minchblue, int &nb, float &chau, float &chred, float &chblue, bool denoiseMethodRgb, bool multiThread);
|
float &maxchred, float &maxchblue, float &minchred, float &minchblue, int &nb, float &chau, float &chred, float &chblue, bool denoiseMethodRgb);
|
||||||
void Noise_residualAB (wavelet_decomposition &WaveletCoeffs_ab, float &chresid, float &chmaxresid, bool denoiseMethodRgb);
|
void Noise_residualAB (wavelet_decomposition &WaveletCoeffs_ab, float &chresid, float &chmaxresid, bool denoiseMethodRgb);
|
||||||
void calcautodn_info (float &chaut, float &delta, int Nb, int levaut, float maxmax, float lumema, float chromina, int mode, int lissage, float redyel, float skinc, float nsknc);
|
void calcautodn_info (float &chaut, float &delta, int Nb, int levaut, float maxmax, float lumema, float chromina, int mode, int lissage, float redyel, float skinc, float nsknc);
|
||||||
float MadMax (float * DataList, int &max, int datalen);
|
float MadMax (float * DataList, int &max, int datalen);
|
||||||
@ -332,28 +332,28 @@ public:
|
|||||||
float MadRgb (float * DataList, const int datalen);
|
float MadRgb (float * DataList, const int datalen);
|
||||||
|
|
||||||
// pyramid wavelet
|
// pyramid wavelet
|
||||||
void dirpyr_equalizer (float ** src, float ** dst, int srcwidth, int srcheight, float ** l_a, float ** l_b, float ** dest_a, float ** dest_b, const double * mult, const double dirpyrThreshold, const double skinprot, const bool gamutlab, float b_l, float t_l, float t_r, float b_r, int choice, int scale);//Emil's directional pyramid wavelet
|
void dirpyr_equalizer (float ** src, float ** dst, int srcwidth, int srcheight, float ** l_a, float ** l_b, const double * mult, const double dirpyrThreshold, const double skinprot, float b_l, float t_l, float t_r, int scale);//Emil's directional pyramid wavelet
|
||||||
void dirpyr_equalizercam (CieImage* ncie, float ** src, float ** dst, int srcwidth, int srcheight, float ** h_p, float ** C_p, const double * mult, const double dirpyrThreshold, const double skinprot, bool execdir, const bool gamutlab, float b_l, float t_l, float t_r, float b_r, int choice, int scale);//Emil's directional pyramid wavelet
|
void dirpyr_equalizercam (CieImage* ncie, float ** src, float ** dst, int srcwidth, int srcheight, float ** h_p, float ** C_p, const double * mult, const double dirpyrThreshold, const double skinprot, bool execdir, float b_l, float t_l, float t_r, int scale);//Emil's directional pyramid wavelet
|
||||||
void dirpyr_channel (float ** data_fine, float ** data_coarse, int width, int height, int level, int scale);
|
void dirpyr_channel (float ** data_fine, float ** data_coarse, int width, int height, int level, int scale);
|
||||||
void idirpyr_eq_channel (float ** data_coarse, float ** data_fine, float ** buffer, int width, int height, int level, float multi[6], const double dirpyrThreshold, float ** l_a_h, float ** l_b_c, const double skinprot, const bool gamutlab, float b_l, float t_l, float t_r, float b_r, int choice);
|
void idirpyr_eq_channel (float ** data_coarse, float ** data_fine, float ** buffer, int width, int height, int level, float multi[6], const double dirpyrThreshold, float ** l_a_h, float ** l_b_c, const double skinprot, float b_l, float t_l, float t_r);
|
||||||
void idirpyr_eq_channelcam (float ** data_coarse, float ** data_fine, float ** buffer, int width, int height, int level, float multi[6], const double dirpyrThreshold, float ** l_a_h, float ** l_b_c, const double skinprot, float b_l, float t_l, float t_r);
|
void idirpyr_eq_channelcam (float ** data_coarse, float ** data_fine, float ** buffer, int width, int height, int level, float multi[6], const double dirpyrThreshold, float ** l_a_h, float ** l_b_c, const double skinprot, float b_l, float t_l, float t_r);
|
||||||
void defringe (LabImage* lab);
|
void defringe (LabImage* lab);
|
||||||
void defringecam (CieImage* ncie);
|
void defringecam (CieImage* ncie);
|
||||||
void badpixcam (CieImage* ncie, double rad, int thr, int mode, float b_l, float t_l, float t_r, float b_r, float skinprot, float chrom, int hotbad);
|
void badpixcam (CieImage* ncie, double rad, int thr, int mode, float skinprot, float chrom, int hotbad);
|
||||||
void badpixlab (LabImage* lab, double rad, int thr, int mode, float b_l, float t_l, float t_r, float b_r, float skinprot, float chrom);
|
void badpixlab (LabImage* lab, double rad, int thr, int mode, float skinprot, float chrom);
|
||||||
|
|
||||||
void PF_correct_RT (LabImage * src, LabImage * dst, double radius, int thresh);
|
void PF_correct_RT (LabImage * src, LabImage * dst, double radius, int thresh);
|
||||||
void PF_correct_RTcam (CieImage * src, CieImage * dst, double radius, int thresh);
|
void PF_correct_RTcam (CieImage * src, CieImage * dst, double radius, int thresh);
|
||||||
void Badpixelscam (CieImage * src, CieImage * dst, double radius, int thresh, int mode, float b_l, float t_l, float t_r, float b_r, float skinprot, float chrom, int hotbad);
|
void Badpixelscam (CieImage * src, CieImage * dst, double radius, int thresh, int mode, float skinprot, float chrom, int hotbad);
|
||||||
void BadpixelsLab (LabImage * src, LabImage * dst, double radius, int thresh, int mode, float b_l, float t_l, float t_r, float b_r, float skinprot, float chrom);
|
void BadpixelsLab (LabImage * src, LabImage * dst, double radius, int thresh, int mode, float skinprot, float chrom);
|
||||||
|
|
||||||
Image8* lab2rgb (LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm);
|
Image8* lab2rgb (LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm);
|
||||||
Image16* lab2rgb16 (LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm, bool bw, GammaValues *ga = nullptr);
|
Image16* lab2rgb16 (LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm, GammaValues *ga = nullptr);
|
||||||
// CieImage *ciec;
|
// CieImage *ciec;
|
||||||
|
|
||||||
bool transCoord (int W, int H, int x, int y, int w, int h, int& xv, int& yv, int& wv, int& hv, double ascaleDef = -1, const LensCorrection *pLCPMap = nullptr);
|
bool transCoord (int W, int H, int x, int y, int w, int h, int& xv, int& yv, int& wv, int& hv, double ascaleDef = -1, const LensCorrection *pLCPMap = nullptr);
|
||||||
bool transCoord (int W, int H, const std::vector<Coord2D> &src, std::vector<Coord2D> &red, std::vector<Coord2D> &green, std::vector<Coord2D> &blue, double ascaleDef = -1, const LensCorrection *pLCPMap = nullptr);
|
bool transCoord (int W, int H, const std::vector<Coord2D> &src, std::vector<Coord2D> &red, std::vector<Coord2D> &green, std::vector<Coord2D> &blue, double ascaleDef = -1, const LensCorrection *pLCPMap = nullptr);
|
||||||
static void getAutoExp (const LUTu & histogram, int histcompr, double defgain, double clip, double& expcomp, int& bright, int& contr, int& black, int& hlcompr, int& hlcomprthresh);
|
static void getAutoExp (const LUTu & histogram, int histcompr, double clip, double& expcomp, int& bright, int& contr, int& black, int& hlcompr, int& hlcomprthresh);
|
||||||
static double getAutoDistor (const Glib::ustring& fname, int thumb_size);
|
static double getAutoDistor (const Glib::ustring& fname, int thumb_size);
|
||||||
double getTransformAutoFill (int oW, int oH, const LensCorrection *pLCPMap = nullptr);
|
double getTransformAutoFill (int oW, int oH, const LensCorrection *pLCPMap = nullptr);
|
||||||
void rgb2lab (const Imagefloat &src, LabImage &dst, const Glib::ustring &workingSpace);
|
void rgb2lab (const Imagefloat &src, LabImage &dst, const Glib::ustring &workingSpace);
|
||||||
|
@ -262,7 +262,7 @@ Image8* ImProcFunctions::lab2rgb (LabImage* lab, int cx, int cy, int cw, int ch,
|
|||||||
* If a custom gamma profile can be created, divide by 327.68, convert to xyz and apply the custom gamma transform
|
* If a custom gamma profile can be created, divide by 327.68, convert to xyz and apply the custom gamma transform
|
||||||
* otherwise divide by 327.68, convert to xyz and apply the sRGB transform, before converting with gamma2curve
|
* otherwise divide by 327.68, convert to xyz and apply the sRGB transform, before converting with gamma2curve
|
||||||
*/
|
*/
|
||||||
Image16* ImProcFunctions::lab2rgb16 (LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm, bool bw, GammaValues *ga)
|
Image16* ImProcFunctions::lab2rgb16 (LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm, GammaValues *ga)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (cx < 0) {
|
if (cx < 0) {
|
||||||
|
@ -788,6 +788,10 @@ void ImProcFunctions::transformGeneral(ImProcFunctions::TransformMode mode, Imag
|
|||||||
bool enableLCPDist = false;
|
bool enableLCPDist = false;
|
||||||
bool enableCA = false;
|
bool enableCA = false;
|
||||||
|
|
||||||
|
#ifdef __GNUC__ // silence warning
|
||||||
|
#pragma GCC diagnostic push
|
||||||
|
#pragma GCC diagnostic ignored "-Wimplicit-fallthrough"
|
||||||
|
#endif
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
case ImProcFunctions::TRANSFORM_HIGH_QUALITY_FULLIMAGE: {
|
case ImProcFunctions::TRANSFORM_HIGH_QUALITY_FULLIMAGE: {
|
||||||
enableLCPCA = pLCPMap && params->lensProf.useCA && pLCPMap->isCACorrectionAvailable();
|
enableLCPCA = pLCPMap && params->lensProf.useCA && pLCPMap->isCACorrectionAvailable();
|
||||||
@ -806,6 +810,9 @@ void ImProcFunctions::transformGeneral(ImProcFunctions::TransformMode mode, Imag
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#ifdef __GNUC__
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
#endif
|
||||||
|
|
||||||
if (enableLCPCA) {
|
if (enableLCPCA) {
|
||||||
enableLCPDist = false;
|
enableLCPDist = false;
|
||||||
|
@ -140,7 +140,7 @@ struct cont_params {
|
|||||||
int wavNestedLevels = 1;
|
int wavNestedLevels = 1;
|
||||||
|
|
||||||
|
|
||||||
SSEFUNCTION void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const procparams::WaveletParams & waparams, const WavCurve & wavCLVCcurve, const WavOpacityCurveRG & waOpacityCurveRG, const WavOpacityCurveBY & waOpacityCurveBY, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, LUTf &wavclCurve, bool wavcontlutili, int skip)
|
SSEFUNCTION void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const procparams::WaveletParams & waparams, const WavCurve & wavCLVCcurve, const WavOpacityCurveRG & waOpacityCurveRG, const WavOpacityCurveBY & waOpacityCurveBY, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, LUTf &wavclCurve, int skip)
|
||||||
|
|
||||||
|
|
||||||
{
|
{
|
||||||
@ -883,7 +883,6 @@ SSEFUNCTION void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int ind = 0;
|
|
||||||
bool ref = false;
|
bool ref = false;
|
||||||
|
|
||||||
if((cp.lev0s > 0.f || cp.lev1s > 0.f || cp.lev2s > 0.f || cp.lev3s > 0.f) && cp.noiseena) {
|
if((cp.lev0s > 0.f || cp.lev1s > 0.f || cp.lev2s > 0.f || cp.lev3s > 0.f) && cp.noiseena) {
|
||||||
@ -899,7 +898,7 @@ SSEFUNCTION void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(cp.val > 0 || ref || contr) {//edge
|
if(cp.val > 0 || ref || contr) {//edge
|
||||||
Evaluate2(*Ldecomp, cp, ind, mean, meanN, sigma, sigmaN, MaxP, MaxN, madL);
|
Evaluate2(*Ldecomp, mean, meanN, sigma, sigmaN, MaxP, MaxN);
|
||||||
}
|
}
|
||||||
|
|
||||||
//init for edge and denoise
|
//init for edge and denoise
|
||||||
@ -921,7 +920,6 @@ SSEFUNCTION void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int
|
|||||||
WaveletDenoiseAllL(*Ldecomp, noisevarlum, madL, vari, edge);
|
WaveletDenoiseAllL(*Ldecomp, noisevarlum, madL, vari, edge);
|
||||||
}
|
}
|
||||||
|
|
||||||
ind = 1;
|
|
||||||
//Flat curve for Contrast=f(H) in levels
|
//Flat curve for Contrast=f(H) in levels
|
||||||
FlatCurve* ChCurve = new FlatCurve(params->wavelet.Chcurve); //curve C=f(H)
|
FlatCurve* ChCurve = new FlatCurve(params->wavelet.Chcurve); //curve C=f(H)
|
||||||
bool Chutili = false;
|
bool Chutili = false;
|
||||||
@ -936,10 +934,10 @@ SSEFUNCTION void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
WaveletcontAllL(labco, varhue, varchro, *Ldecomp, cp, skip, mean, meanN, sigma, sigmaN, MaxP, MaxN, wavCLVCcurve, waOpacityCurveW, waOpacityCurveWL, ChCurve, Chutili);
|
WaveletcontAllL(labco, varhue, varchro, *Ldecomp, cp, skip, mean, sigma, MaxP, MaxN, wavCLVCcurve, waOpacityCurveW, ChCurve, Chutili);
|
||||||
|
|
||||||
if(cp.val > 0 || ref || contr || cp.diagcurv) {//edge
|
if(cp.val > 0 || ref || contr || cp.diagcurv) {//edge
|
||||||
Evaluate2(*Ldecomp, cp, ind, mean, meanN, sigma, sigmaN, MaxP, MaxN, madL);
|
Evaluate2(*Ldecomp, mean, meanN, sigma, sigmaN, MaxP, MaxN);
|
||||||
}
|
}
|
||||||
|
|
||||||
WaveletcontAllLfinal(*Ldecomp, cp, mean, sigma, MaxP, waOpacityCurveWL);
|
WaveletcontAllLfinal(*Ldecomp, cp, mean, sigma, MaxP, waOpacityCurveWL);
|
||||||
@ -1025,7 +1023,7 @@ SSEFUNCTION void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int
|
|||||||
if(!adecomp->memoryAllocationFailed && !bdecomp->memoryAllocationFailed) {
|
if(!adecomp->memoryAllocationFailed && !bdecomp->memoryAllocationFailed) {
|
||||||
WaveletcontAllAB(labco, varhue, varchro, *adecomp, waOpacityCurveW, cp, true);
|
WaveletcontAllAB(labco, varhue, varchro, *adecomp, waOpacityCurveW, cp, true);
|
||||||
WaveletcontAllAB(labco, varhue, varchro, *bdecomp, waOpacityCurveW, cp, false);
|
WaveletcontAllAB(labco, varhue, varchro, *bdecomp, waOpacityCurveW, cp, false);
|
||||||
WaveletAandBAllAB(labco, varhue, varchro, *adecomp, *bdecomp, cp, waOpacityCurveW, hhCurve, hhutili );
|
WaveletAandBAllAB(*adecomp, *bdecomp, cp, hhCurve, hhutili );
|
||||||
|
|
||||||
adecomp->reconstruct(labco->data + datalen, cp.strength);
|
adecomp->reconstruct(labco->data + datalen, cp.strength);
|
||||||
bdecomp->reconstruct(labco->data + 2 * datalen, cp.strength);
|
bdecomp->reconstruct(labco->data + 2 * datalen, cp.strength);
|
||||||
@ -1366,7 +1364,7 @@ void ImProcFunctions::Sigma( float * RESTRICT DataList, int datalen, float aver
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ImProcFunctions::Evaluate2(wavelet_decomposition &WaveletCoeffs_L,
|
void ImProcFunctions::Evaluate2(wavelet_decomposition &WaveletCoeffs_L,
|
||||||
const struct cont_params& cp, int ind, float *mean, float *meanN, float *sigma, float *sigmaN, float *MaxP, float *MaxN, float madL[8][3])
|
float *mean, float *meanN, float *sigma, float *sigmaN, float *MaxP, float *MaxN)
|
||||||
{
|
{
|
||||||
//StopWatch Stop1("Evaluate2");
|
//StopWatch Stop1("Evaluate2");
|
||||||
int maxlvl = WaveletCoeffs_L.maxlevel();
|
int maxlvl = WaveletCoeffs_L.maxlevel();
|
||||||
@ -1376,16 +1374,14 @@ void ImProcFunctions::Evaluate2(wavelet_decomposition &WaveletCoeffs_L,
|
|||||||
int Wlvl_L = WaveletCoeffs_L.level_W(lvl);
|
int Wlvl_L = WaveletCoeffs_L.level_W(lvl);
|
||||||
int Hlvl_L = WaveletCoeffs_L.level_H(lvl);
|
int Hlvl_L = WaveletCoeffs_L.level_H(lvl);
|
||||||
|
|
||||||
int skip_L = WaveletCoeffs_L.level_stride(lvl);
|
|
||||||
|
|
||||||
float ** WavCoeffs_L = WaveletCoeffs_L.level_coeffs(lvl);
|
float ** WavCoeffs_L = WaveletCoeffs_L.level_coeffs(lvl);
|
||||||
|
|
||||||
Eval2 (WavCoeffs_L, lvl, cp, Wlvl_L, Hlvl_L, skip_L, ind, mean, meanN, sigma, sigmaN, MaxP, MaxN, madL[lvl]);
|
Eval2 (WavCoeffs_L, lvl, Wlvl_L, Hlvl_L, mean, meanN, sigma, sigmaN, MaxP, MaxN);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
void ImProcFunctions::Eval2 (float ** WavCoeffs_L, int level, const struct cont_params& cp,
|
void ImProcFunctions::Eval2 (float ** WavCoeffs_L, int level,
|
||||||
int W_L, int H_L, int skip_L, int ind, float *mean, float *meanN, float *sigma, float *sigmaN, float *MaxP, float *MaxN, float *madL)
|
int W_L, int H_L, float *mean, float *meanN, float *sigma, float *sigmaN, float *MaxP, float *MaxN)
|
||||||
{
|
{
|
||||||
|
|
||||||
float avLP[4], avLN[4];
|
float avLP[4], avLN[4];
|
||||||
@ -1429,7 +1425,7 @@ void ImProcFunctions::Eval2 (float ** WavCoeffs_L, int level, const struct cont
|
|||||||
MaxN[level] = maxLN;
|
MaxN[level] = maxLN;
|
||||||
}
|
}
|
||||||
|
|
||||||
float *ImProcFunctions::ContrastDR(float *Source, int skip, struct cont_params &cp, int W_L, int H_L, float Compression, float DetailBoost, float max0, float min0, float ave, float ah, float bh, float al, float bl, float factorx, float *Contrast)
|
float *ImProcFunctions::ContrastDR(float *Source, int W_L, int H_L, float *Contrast)
|
||||||
{
|
{
|
||||||
int n = W_L * H_L;
|
int n = W_L * H_L;
|
||||||
|
|
||||||
@ -1449,7 +1445,7 @@ float *ImProcFunctions::ContrastDR(float *Source, int skip, struct cont_params &
|
|||||||
return Contrast;
|
return Contrast;
|
||||||
}
|
}
|
||||||
|
|
||||||
SSEFUNCTION float *ImProcFunctions::CompressDR(float *Source, int skip, struct cont_params &cp, int W_L, int H_L, float Compression, float DetailBoost, float max0, float min0, float ave, float ah, float bh, float al, float bl, float factorx, float *Compressed)
|
SSEFUNCTION float *ImProcFunctions::CompressDR(float *Source, int W_L, int H_L, float Compression, float DetailBoost, float *Compressed)
|
||||||
{
|
{
|
||||||
|
|
||||||
const float eps = 0.000001f;
|
const float eps = 0.000001f;
|
||||||
@ -1485,7 +1481,7 @@ SSEFUNCTION float *ImProcFunctions::CompressDR(float *Source, int skip, struct c
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
float *ucr = ContrastDR(Source, skip, cp, W_L, H_L, Compression, DetailBoost, max0, min0, ave, ah, bh, al, bl, factorx);
|
float *ucr = ContrastDR(Source, W_L, H_L);
|
||||||
|
|
||||||
if(Compressed == nullptr) {
|
if(Compressed == nullptr) {
|
||||||
Compressed = ucr;
|
Compressed = ucr;
|
||||||
@ -1563,7 +1559,7 @@ SSEFUNCTION float *ImProcFunctions::CompressDR(float *Source, int skip, struct c
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImProcFunctions::ContrastResid(float * WavCoeffs_L0, unsigned int Iterates, int skip, struct cont_params &cp, int W_L, int H_L, float max0, float min0, float ave, float ah, float bh, float al, float bl, float factorx)
|
void ImProcFunctions::ContrastResid(float * WavCoeffs_L0, struct cont_params &cp, int W_L, int H_L, float max0, float min0)
|
||||||
{
|
{
|
||||||
float stren = cp.tmstrength;
|
float stren = cp.tmstrength;
|
||||||
float gamm = params->wavelet.gamma;
|
float gamm = params->wavelet.gamma;
|
||||||
@ -1593,7 +1589,7 @@ void ImProcFunctions::ContrastResid(float * WavCoeffs_L0, unsigned int Iterates
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
CompressDR(WavCoeffs_L0, skip, cp, W_L, H_L, Compression, DetailBoost, max0, min0, ave, ah, bh, al, bl, factorx, WavCoeffs_L0);
|
CompressDR(WavCoeffs_L0, W_L, H_L, Compression, DetailBoost, WavCoeffs_L0);
|
||||||
|
|
||||||
|
|
||||||
#ifdef _RT_NESTED_OPENMP
|
#ifdef _RT_NESTED_OPENMP
|
||||||
@ -1679,7 +1675,7 @@ void ImProcFunctions::WaveletcontAllLfinal(wavelet_decomposition &WaveletCoeffs_
|
|||||||
|
|
||||||
|
|
||||||
void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float **varchrom, wavelet_decomposition &WaveletCoeffs_L,
|
void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float **varchrom, wavelet_decomposition &WaveletCoeffs_L,
|
||||||
struct cont_params &cp, int skip, float *mean, float *meanN, float *sigma, float *sigmaN, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, FlatCurve* ChCurve, bool Chutili)
|
struct cont_params &cp, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, FlatCurve* ChCurve, bool Chutili)
|
||||||
{
|
{
|
||||||
int maxlvl = WaveletCoeffs_L.maxlevel();
|
int maxlvl = WaveletCoeffs_L.maxlevel();
|
||||||
int W_L = WaveletCoeffs_L.level_W(0);
|
int W_L = WaveletCoeffs_L.level_W(0);
|
||||||
@ -1824,7 +1820,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float *
|
|||||||
#ifdef _RT_NESTED_OPENMP
|
#ifdef _RT_NESTED_OPENMP
|
||||||
#pragma omp single
|
#pragma omp single
|
||||||
#endif
|
#endif
|
||||||
ContrastResid(WavCoeffs_L0, 5, skip, cp, W_L, H_L, maxp, minp, ave, ah, bh, al, bl, factorx );
|
ContrastResid(WavCoeffs_L0, cp, W_L, H_L, maxp, minp);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _RT_NESTED_OPENMP
|
#ifdef _RT_NESTED_OPENMP
|
||||||
@ -2032,7 +2028,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float *
|
|||||||
|
|
||||||
float ** WavCoeffs_L = WaveletCoeffs_L.level_coeffs(lvl);
|
float ** WavCoeffs_L = WaveletCoeffs_L.level_coeffs(lvl);
|
||||||
|
|
||||||
ContAllL (koeLi, maxkoeLi, true, maxlvl, labco, varhue, varchrom, WavCoeffs_L, WavCoeffs_L0, lvl, dir, cp, Wlvl_L, Hlvl_L, skip, mean, meanN, sigma, sigmaN, MaxP, MaxN, wavCLVCcurve, waOpacityCurveW, ChCurve, Chutili);
|
ContAllL (koeLi, maxkoeLi, true, maxlvl, labco, varhue, varchrom, WavCoeffs_L, WavCoeffs_L0, lvl, dir, cp, Wlvl_L, Hlvl_L, skip, mean, sigma, MaxP, MaxN, wavCLVCcurve, waOpacityCurveW, ChCurve, Chutili);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -2045,8 +2041,8 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float *
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImProcFunctions::WaveletAandBAllAB(LabImage * labco, float ** varhue, float **varchrom, wavelet_decomposition &WaveletCoeffs_a, wavelet_decomposition &WaveletCoeffs_b,
|
void ImProcFunctions::WaveletAandBAllAB(wavelet_decomposition &WaveletCoeffs_a, wavelet_decomposition &WaveletCoeffs_b,
|
||||||
struct cont_params &cp, const WavOpacityCurveW & waOpacityCurveW, FlatCurve* hhCurve, bool hhutili)
|
struct cont_params &cp, FlatCurve* hhCurve, bool hhutili)
|
||||||
{
|
{
|
||||||
// StopWatch Stop1("WaveletAandBAllAB");
|
// StopWatch Stop1("WaveletAandBAllAB");
|
||||||
if (hhutili && cp.resena) { // H=f(H)
|
if (hhutili && cp.resena) { // H=f(H)
|
||||||
@ -2573,7 +2569,7 @@ void ImProcFunctions::finalContAllL (float ** WavCoeffs_L, float * WavCoeffs_L0,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschitz, int maxlvl, LabImage * labco, float ** varhue, float **varchrom, float ** WavCoeffs_L, float * WavCoeffs_L0, int level, int dir, struct cont_params &cp,
|
void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschitz, int maxlvl, LabImage * labco, float ** varhue, float **varchrom, float ** WavCoeffs_L, float * WavCoeffs_L0, int level, int dir, struct cont_params &cp,
|
||||||
int W_L, int H_L, int skip, float *mean, float *meanN, float *sigma, float *sigmaN, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, FlatCurve* ChCurve, bool Chutili)
|
int W_L, int H_L, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, FlatCurve* ChCurve, bool Chutili)
|
||||||
{
|
{
|
||||||
assert (level >= 0);
|
assert (level >= 0);
|
||||||
assert (maxlvl > level);
|
assert (maxlvl > level);
|
||||||
|
@ -1,9 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of RawTherapee.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2004-2017 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 <cstring>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
#include "labimage.h"
|
#include "labimage.h"
|
||||||
#include <memory.h>
|
|
||||||
namespace rtengine
|
namespace rtengine
|
||||||
{
|
{
|
||||||
|
|
||||||
LabImage::LabImage (int w, int h) : fromImage(false), W(w), H(h)
|
LabImage::LabImage (int w, int h) : W(w), H(h)
|
||||||
{
|
{
|
||||||
allocLab(w, h);
|
allocLab(w, h);
|
||||||
}
|
}
|
||||||
@ -42,4 +64,43 @@ void LabImage::getPipetteData (float &v1, float &v2, float &v3, int posX, int po
|
|||||||
v3 = n ? accumulator_b / float(n) : 0.f;
|
v3 = n ? accumulator_b / float(n) : 0.f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LabImage::allocLab(int w, int h)
|
||||||
|
{
|
||||||
|
L = new float*[h];
|
||||||
|
a = new float*[h];
|
||||||
|
b = new float*[h];
|
||||||
|
|
||||||
|
data = new float [w * h * 3];
|
||||||
|
float * index = data;
|
||||||
|
|
||||||
|
for (int i = 0; i < h; i++) {
|
||||||
|
L[i] = index + i * w;
|
||||||
|
}
|
||||||
|
|
||||||
|
index += w * h;
|
||||||
|
|
||||||
|
for (int i = 0; i < h; i++) {
|
||||||
|
a[i] = index + i * w;
|
||||||
|
}
|
||||||
|
|
||||||
|
index += w * h;
|
||||||
|
|
||||||
|
for (int i = 0; i < h; i++) {
|
||||||
|
b[i] = index + i * w;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void LabImage::deleteLab()
|
||||||
|
{
|
||||||
|
delete [] L;
|
||||||
|
delete [] a;
|
||||||
|
delete [] b;
|
||||||
|
delete [] data;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LabImage::reallocLab()
|
||||||
|
{
|
||||||
|
allocLab(W, H);
|
||||||
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -25,32 +25,8 @@ namespace rtengine
|
|||||||
class LabImage
|
class LabImage
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
bool fromImage;
|
void allocLab(int w, int h);
|
||||||
void allocLab(int w, int h)
|
|
||||||
{
|
|
||||||
L = new float*[H];
|
|
||||||
a = new float*[H];
|
|
||||||
b = new float*[H];
|
|
||||||
|
|
||||||
data = new float [W * H * 3];
|
|
||||||
float * index = data;
|
|
||||||
|
|
||||||
for (int i = 0; i < H; i++) {
|
|
||||||
L[i] = index + i * W;
|
|
||||||
}
|
|
||||||
|
|
||||||
index += W * H;
|
|
||||||
|
|
||||||
for (int i = 0; i < H; i++) {
|
|
||||||
a[i] = index + i * W;
|
|
||||||
}
|
|
||||||
|
|
||||||
index += W * H;
|
|
||||||
|
|
||||||
for (int i = 0; i < H; i++) {
|
|
||||||
b[i] = index + i * W;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
public:
|
public:
|
||||||
int W, H;
|
int W, H;
|
||||||
float * data;
|
float * data;
|
||||||
@ -64,20 +40,8 @@ public:
|
|||||||
//Copies image data in Img into this instance.
|
//Copies image data in Img into this instance.
|
||||||
void CopyFrom(LabImage *Img);
|
void CopyFrom(LabImage *Img);
|
||||||
void getPipetteData (float &L, float &a, float &b, int posX, int posY, int squareSize);
|
void getPipetteData (float &L, float &a, float &b, int posX, int posY, int squareSize);
|
||||||
void deleteLab( )
|
void deleteLab();
|
||||||
{
|
void reallocLab();
|
||||||
if (!fromImage) {
|
|
||||||
delete [] L;
|
|
||||||
delete [] a;
|
|
||||||
delete [] b;
|
|
||||||
delete [] data;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
void reallocLab( )
|
|
||||||
{
|
|
||||||
allocLab(W, H);
|
|
||||||
};
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -36,11 +36,7 @@ InitialImage* InitialImage::load (const Glib::ustring& fname, bool isRaw, int* e
|
|||||||
|
|
||||||
isrc->setProgressListener (pl);
|
isrc->setProgressListener (pl);
|
||||||
|
|
||||||
if(isRaw && pl == nullptr) {
|
*errorCode = isrc->load (fname);
|
||||||
*errorCode = isrc->load (fname, true);
|
|
||||||
} else {
|
|
||||||
*errorCode = isrc->load (fname);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (*errorCode) {
|
if (*errorCode) {
|
||||||
delete isrc;
|
delete isrc;
|
||||||
|
@ -33,6 +33,11 @@
|
|||||||
#define PROT_READ 1
|
#define PROT_READ 1
|
||||||
#define MAP_FAILED (void *)-1
|
#define MAP_FAILED (void *)-1
|
||||||
|
|
||||||
|
#ifdef __GNUC__ // silence warning
|
||||||
|
#pragma GCC diagnostic push
|
||||||
|
#pragma GCC diagnostic ignored "-Wunused-parameter"
|
||||||
|
#endif
|
||||||
|
|
||||||
void* mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset)
|
void* mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset)
|
||||||
{
|
{
|
||||||
HANDLE handle = CreateFileMapping((HANDLE)_get_osfhandle(fd), NULL, PAGE_WRITECOPY, 0, 0, NULL);
|
HANDLE handle = CreateFileMapping((HANDLE)_get_osfhandle(fd), NULL, PAGE_WRITECOPY, 0, 0, NULL);
|
||||||
@ -51,6 +56,9 @@ int munmap(void *start, size_t length)
|
|||||||
UnmapViewOfFile(start);
|
UnmapViewOfFile(start);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
#ifdef __GNUC__
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
#endif
|
||||||
|
|
||||||
#else // WIN32
|
#else // WIN32
|
||||||
|
|
||||||
|
@ -22,6 +22,8 @@
|
|||||||
#ifndef OPTHELPER_H
|
#ifndef OPTHELPER_H
|
||||||
#define OPTHELPER_H
|
#define OPTHELPER_H
|
||||||
|
|
||||||
|
#define pow_F(a,b) (xexpf(b*xlogf(a)))
|
||||||
|
|
||||||
#ifdef __SSE2__
|
#ifdef __SSE2__
|
||||||
#include "sleefsseavx.c"
|
#include "sleefsseavx.c"
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
|
@ -97,7 +97,7 @@ PreviewImage::PreviewImage (const Glib::ustring &fname, const Glib::ustring &ext
|
|||||||
|
|
||||||
if ((mode == PIM_EmbeddedOrRaw && !tpp) || mode == PIM_ForceRaw) {
|
if ((mode == PIM_EmbeddedOrRaw && !tpp) || mode == PIM_ForceRaw) {
|
||||||
RawImageSource rawImage;
|
RawImageSource rawImage;
|
||||||
int error = rawImage.load(fname, true);
|
int error = rawImage.load(fname);
|
||||||
|
|
||||||
if (!error) {
|
if (!error) {
|
||||||
const unsigned char *data = nullptr;
|
const unsigned char *data = nullptr;
|
||||||
@ -115,7 +115,7 @@ PreviewImage::PreviewImage (const Glib::ustring &fname, const Glib::ustring &ext
|
|||||||
rawImage.preprocess(params.raw, params.lensProf, params.coarse);
|
rawImage.preprocess(params.raw, params.lensProf, params.coarse);
|
||||||
rawImage.demosaic(params.raw);
|
rawImage.demosaic(params.raw);
|
||||||
Imagefloat image(fw, fh);
|
Imagefloat image(fw, fh);
|
||||||
rawImage.getImage (wb, TR_NONE, &image, pp, params.toneCurve, params.icm, params.raw);
|
rawImage.getImage (wb, TR_NONE, &image, pp, params.toneCurve, params.raw);
|
||||||
rtengine::Image8 output(fw, fh);
|
rtengine::Image8 output(fw, fh);
|
||||||
rawImage.convertColorSpace(&image, params.icm, wb);
|
rawImage.convertColorSpace(&image, params.icm, wb);
|
||||||
#pragma omp parallel for schedule(dynamic, 10)
|
#pragma omp parallel for schedule(dynamic, 10)
|
||||||
|
@ -18,7 +18,6 @@
|
|||||||
*/
|
*/
|
||||||
#include <glib/gstdio.h>
|
#include <glib/gstdio.h>
|
||||||
#include "procparams.h"
|
#include "procparams.h"
|
||||||
#include "rt_math.h"
|
|
||||||
#include "curves.h"
|
#include "curves.h"
|
||||||
#include "../rtgui/multilangmgr.h"
|
#include "../rtgui/multilangmgr.h"
|
||||||
#include "../rtgui/version.h"
|
#include "../rtgui/version.h"
|
||||||
@ -26,6 +25,7 @@
|
|||||||
#include "../rtgui/paramsedited.h"
|
#include "../rtgui/paramsedited.h"
|
||||||
#include "../rtgui/options.h"
|
#include "../rtgui/options.h"
|
||||||
#include <locale.h>
|
#include <locale.h>
|
||||||
|
|
||||||
#define APPVERSION RTVERSION
|
#define APPVERSION RTVERSION
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
@ -558,7 +558,7 @@ void ColorToningParams::slidersToCurve (std::vector<double> &colorCurve, std::ve
|
|||||||
opacityCurve.at (8) = 0.35;
|
opacityCurve.at (8) = 0.35;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ColorToningParams::getCurves (ColorGradientCurve &colorCurveLUT, OpacityCurve &opacityCurveLUT, const double xyz_rgb[3][3], const double rgb_xyz[3][3], bool &opautili) const
|
void ColorToningParams::getCurves (ColorGradientCurve &colorCurveLUT, OpacityCurve &opacityCurveLUT, const double xyz_rgb[3][3], bool &opautili) const
|
||||||
{
|
{
|
||||||
float satur = 0.8f;
|
float satur = 0.8f;
|
||||||
float lumin = 0.5f; //middle of luminance for optimization of gamut - no real importance...as we work in XYZ and gamut control
|
float lumin = 0.5f; //middle of luminance for optimization of gamut - no real importance...as we work in XYZ and gamut control
|
||||||
@ -584,13 +584,13 @@ void ColorToningParams::getCurves (ColorGradientCurve &colorCurveLUT, OpacityCur
|
|||||||
satur = 0.9f;
|
satur = 0.9f;
|
||||||
}
|
}
|
||||||
|
|
||||||
colorCurveLUT.SetXYZ (cCurve, xyz_rgb, rgb_xyz, satur, lumin);
|
colorCurveLUT.SetXYZ (cCurve, xyz_rgb, satur, lumin);
|
||||||
opacityCurveLUT.Set (oCurve, opautili);
|
opacityCurveLUT.Set (oCurve, opautili);
|
||||||
} else if (method == "Splitlr" || method == "Splitco") {
|
} else if (method == "Splitlr" || method == "Splitco") {
|
||||||
colorCurveLUT.SetXYZ (cCurve, xyz_rgb, rgb_xyz, satur, lumin);
|
colorCurveLUT.SetXYZ (cCurve, xyz_rgb, satur, lumin);
|
||||||
opacityCurveLUT.Set (oCurve, opautili);
|
opacityCurveLUT.Set (oCurve, opautili);
|
||||||
} else if (method.substr (0, 3) == "RGB") {
|
} else if (method.substr (0, 3) == "RGB") {
|
||||||
colorCurveLUT.SetRGB (cCurve, xyz_rgb, rgb_xyz);
|
colorCurveLUT.SetRGB (cCurve);
|
||||||
opacityCurveLUT.Set (oCurve, opautili);
|
opacityCurveLUT.Set (oCurve, opautili);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -8829,7 +8829,7 @@ void PartialProfile::clearGeneral ()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const void PartialProfile::applyTo (ProcParams *destParams) const
|
void PartialProfile::applyTo (ProcParams *destParams) const
|
||||||
{
|
{
|
||||||
if (destParams && pparams && pedited) {
|
if (destParams && pparams && pedited) {
|
||||||
pedited->combine (*destParams, *pparams, true);
|
pedited->combine (*destParams, *pparams, true);
|
||||||
|
@ -435,7 +435,7 @@ public:
|
|||||||
/// @brief Specifically transform the sliders values to their curve equivalences
|
/// @brief Specifically transform the sliders values to their curve equivalences
|
||||||
void slidersToCurve (std::vector<double> &colorCurve, std::vector<double> &opacityCurve) const;
|
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
|
/// @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;
|
void getCurves (ColorGradientCurve &colorCurveLUT, OpacityCurve &opacityCurveLUT, const double xyz_rgb[3][3], bool &opautili) const;
|
||||||
|
|
||||||
static void getDefaultColorCurve (std::vector<double> &curve);
|
static void getDefaultColorCurve (std::vector<double> &curve);
|
||||||
static void getDefaultOpacityCurve (std::vector<double> &curve);
|
static void getDefaultOpacityCurve (std::vector<double> &curve);
|
||||||
@ -1493,7 +1493,7 @@ public:
|
|||||||
void clearGeneral ();
|
void clearGeneral ();
|
||||||
int load (const Glib::ustring &fName);
|
int load (const Glib::ustring &fName);
|
||||||
void set (bool v);
|
void set (bool v);
|
||||||
const void applyTo (ProcParams *destParams) const ;
|
void applyTo (ProcParams *destParams) const ;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -87,7 +87,7 @@ void transLineStandard (const float* const red, const float* const green, const
|
|||||||
rotateLine (blue, image->b, tran, i, imwidth, imheight);
|
rotateLine (blue, image->b, tran, i, imwidth, imheight);
|
||||||
}
|
}
|
||||||
|
|
||||||
void transLineFuji (const float* const red, const float* const green, const float* const blue, const int i, rtengine::Imagefloat* const image, const int tran, const int imwidth, const int imheight, const int fw)
|
void transLineFuji (const float* const red, const float* const green, const float* const blue, const int i, rtengine::Imagefloat* const image, const int tran, const int imheight, const int fw)
|
||||||
{
|
{
|
||||||
|
|
||||||
// Fuji SuperCCD rotation + coarse rotation
|
// Fuji SuperCCD rotation + coarse rotation
|
||||||
@ -623,7 +623,7 @@ float calculate_scale_mul(float scale_mul[4], const float pre_mul_[4], const flo
|
|||||||
return gain;
|
return gain;
|
||||||
}
|
}
|
||||||
|
|
||||||
void RawImageSource::getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const ToneCurveParams &hrp, const ColorManagementParams &cmp, const RAWParams &raw )
|
void RawImageSource::getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const ToneCurveParams &hrp, const RAWParams &raw )
|
||||||
{
|
{
|
||||||
MyMutex::MyLock lock(getImageMutex);
|
MyMutex::MyLock lock(getImageMutex);
|
||||||
|
|
||||||
@ -824,7 +824,7 @@ void RawImageSource::getImage (const ColorTemp &ctemp, int tran, Imagefloat* ima
|
|||||||
if(d1x) {
|
if(d1x) {
|
||||||
transLineD1x (line_red, line_grn, line_blue, ix, image, tran, imwidth, imheight, d1xHeightOdd, doClip);
|
transLineD1x (line_red, line_grn, line_blue, ix, image, tran, imwidth, imheight, d1xHeightOdd, doClip);
|
||||||
} else if(fuji) {
|
} else if(fuji) {
|
||||||
transLineFuji (line_red, line_grn, line_blue, ix, image, tran, imwidth, imheight, fw);
|
transLineFuji (line_red, line_grn, line_blue, ix, image, tran, imheight, fw);
|
||||||
} else {
|
} else {
|
||||||
transLineStandard (line_red, line_grn, line_blue, ix, image, tran, imwidth, imheight);
|
transLineStandard (line_red, line_grn, line_blue, ix, image, tran, imwidth, imheight);
|
||||||
}
|
}
|
||||||
@ -910,7 +910,7 @@ void RawImageSource::getImage (const ColorTemp &ctemp, int tran, Imagefloat* ima
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DCPProfile *RawImageSource::getDCP(const ColorManagementParams &cmp, ColorTemp &wb, DCPProfile::ApplyState &as)
|
DCPProfile *RawImageSource::getDCP(const ColorManagementParams &cmp, DCPProfile::ApplyState &as)
|
||||||
{
|
{
|
||||||
DCPProfile *dcpProf = nullptr;
|
DCPProfile *dcpProf = nullptr;
|
||||||
cmsHPROFILE dummy;
|
cmsHPROFILE dummy;
|
||||||
@ -1518,7 +1518,7 @@ void RawImageSource::vflip (Imagefloat* image)
|
|||||||
|
|
||||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
|
||||||
int RawImageSource::load (const Glib::ustring &fname, int imageNum, bool batch)
|
int RawImageSource::load (const Glib::ustring &fname)
|
||||||
{
|
{
|
||||||
|
|
||||||
MyTime t1, t2;
|
MyTime t1, t2;
|
||||||
@ -2003,7 +2003,7 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le
|
|||||||
double clip = 0;
|
double clip = 0;
|
||||||
int brightness, contrast, black, hlcompr, hlcomprthresh;
|
int brightness, contrast, black, hlcompr, hlcomprthresh;
|
||||||
getAutoExpHistogram (aehist, aehistcompr);
|
getAutoExpHistogram (aehist, aehistcompr);
|
||||||
ImProcFunctions::getAutoExp (aehist, aehistcompr, getDefGain(), clip, dirpyrdenoiseExpComp, brightness, contrast, black, hlcompr, hlcomprthresh);
|
ImProcFunctions::getAutoExp (aehist, aehistcompr, clip, dirpyrdenoiseExpComp, brightness, contrast, black, hlcompr, hlcomprthresh);
|
||||||
}
|
}
|
||||||
|
|
||||||
t2.set();
|
t2.set();
|
||||||
@ -2032,7 +2032,7 @@ void RawImageSource::demosaic(const RAWParams &raw)
|
|||||||
} else if (raw.bayersensor.method == RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::vng4] ) {
|
} else if (raw.bayersensor.method == RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::vng4] ) {
|
||||||
vng4_demosaic ();
|
vng4_demosaic ();
|
||||||
} else if (raw.bayersensor.method == RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::ahd] ) {
|
} else if (raw.bayersensor.method == RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::ahd] ) {
|
||||||
ahd_demosaic (0, 0, W, H);
|
ahd_demosaic ();
|
||||||
} else if (raw.bayersensor.method == RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::amaze] ) {
|
} else if (raw.bayersensor.method == RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::amaze] ) {
|
||||||
amaze_demosaic_RT (0, 0, W, H, rawData, red, green, blue);
|
amaze_demosaic_RT (0, 0, W, H, rawData, red, green, blue);
|
||||||
} else if (raw.bayersensor.method == RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::pixelshift] ) {
|
} else if (raw.bayersensor.method == RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::pixelshift] ) {
|
||||||
@ -2046,7 +2046,7 @@ void RawImageSource::demosaic(const RAWParams &raw)
|
|||||||
} else if (raw.bayersensor.method == RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::lmmse]) {
|
} else if (raw.bayersensor.method == RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::lmmse]) {
|
||||||
lmmse_interpolate_omp(W, H, rawData, red, green, blue, raw.bayersensor.lmmse_iterations);
|
lmmse_interpolate_omp(W, H, rawData, red, green, blue, raw.bayersensor.lmmse_iterations);
|
||||||
} else if (raw.bayersensor.method == RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::fast] ) {
|
} else if (raw.bayersensor.method == RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::fast] ) {
|
||||||
fast_demosaic (0, 0, W, H);
|
fast_demosaic();
|
||||||
} else if (raw.bayersensor.method == RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::mono] ) {
|
} else if (raw.bayersensor.method == RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::mono] ) {
|
||||||
nodemosaic(true);
|
nodemosaic(true);
|
||||||
} else {
|
} else {
|
||||||
@ -2117,8 +2117,8 @@ void RawImageSource::retinexPrepareBuffers(ColorManagementParams cmp, const Reti
|
|||||||
std::swap(pwr, gamm);
|
std::swap(pwr, gamm);
|
||||||
}
|
}
|
||||||
|
|
||||||
int mode = 0, imax = 0;
|
int mode = 0;
|
||||||
Color::calcGamma(pwr, ts, mode, imax, g_a); // call to calcGamma with selected gamma and slope
|
Color::calcGamma(pwr, ts, mode, g_a); // call to calcGamma with selected gamma and slope
|
||||||
|
|
||||||
// printf("g_a0=%f g_a1=%f g_a2=%f g_a3=%f g_a4=%f\n", g_a0,g_a1,g_a2,g_a3,g_a4);
|
// printf("g_a0=%f g_a1=%f g_a2=%f g_a3=%f g_a4=%f\n", g_a0,g_a1,g_a2,g_a3,g_a4);
|
||||||
double start;
|
double start;
|
||||||
@ -2384,13 +2384,13 @@ void RawImageSource::retinex(ColorManagementParams cmp, const RetinexParams &deh
|
|||||||
double gamm = deh.gam;
|
double gamm = deh.gam;
|
||||||
double gamm2 = gamm;
|
double gamm2 = gamm;
|
||||||
double ts = deh.slope;
|
double ts = deh.slope;
|
||||||
int mode = 0, imax = 0;
|
int mode = 0;
|
||||||
|
|
||||||
if(gamm2 < 1.) {
|
if(gamm2 < 1.) {
|
||||||
std::swap(pwr, gamm);
|
std::swap(pwr, gamm);
|
||||||
}
|
}
|
||||||
|
|
||||||
Color::calcGamma(pwr, ts, mode, imax, g_a); // call to calcGamma with selected gamma and slope
|
Color::calcGamma(pwr, ts, mode, g_a); // call to calcGamma with selected gamma and slope
|
||||||
|
|
||||||
double mul = 1. + g_a[4];
|
double mul = 1. + g_a[4];
|
||||||
double add;
|
double add;
|
||||||
|
@ -116,7 +116,7 @@ public:
|
|||||||
RawImageSource ();
|
RawImageSource ();
|
||||||
~RawImageSource ();
|
~RawImageSource ();
|
||||||
|
|
||||||
int load (const Glib::ustring &fname, int imageNum = 0, bool batch = false);
|
int load (const Glib::ustring &fname);
|
||||||
void preprocess (const RAWParams &raw, const LensProfParams &lensProf, const CoarseTransformParams& coarse, bool prepareDenoise = true);
|
void preprocess (const RAWParams &raw, const LensProfParams &lensProf, const CoarseTransformParams& coarse, bool prepareDenoise = true);
|
||||||
void demosaic (const RAWParams &raw);
|
void demosaic (const RAWParams &raw);
|
||||||
void retinex (ColorManagementParams cmp, const RetinexParams &deh, ToneCurveParams Tc, LUTf & cdcurve, LUTf & mapcurve, const RetinextransmissionCurve & dehatransmissionCurve, const RetinexgaintransmissionCurve & dehagaintransmissionCurve, multi_array2D<float, 4> &conversionBuffer, bool dehacontlutili, bool mapcontlutili, bool useHsl, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax, LUTu &histLRETI);
|
void retinex (ColorManagementParams cmp, const RetinexParams &deh, ToneCurveParams Tc, LUTf & cdcurve, LUTf & mapcurve, const RetinextransmissionCurve & dehatransmissionCurve, const RetinexgaintransmissionCurve & dehagaintransmissionCurve, multi_array2D<float, 4> &conversionBuffer, bool dehacontlutili, bool mapcontlutili, bool useHsl, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax, LUTu &histLRETI);
|
||||||
@ -138,7 +138,7 @@ public:
|
|||||||
void cfaboxblur (RawImage *riFlatFile, float* cfablur, int boxH, int boxW);
|
void cfaboxblur (RawImage *riFlatFile, float* cfablur, int boxH, int boxW);
|
||||||
void scaleColors (int winx, int winy, int winw, int winh, const RAWParams &raw, array2D<float> &rawData); // raw for cblack
|
void scaleColors (int winx, int winy, int winw, int winh, const RAWParams &raw, array2D<float> &rawData); // raw for cblack
|
||||||
|
|
||||||
void getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const ToneCurveParams &hrp, const ColorManagementParams &cmp, const RAWParams &raw);
|
void getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const ToneCurveParams &hrp, const RAWParams &raw);
|
||||||
eSensorType getSensorType () const
|
eSensorType getSensorType () const
|
||||||
{
|
{
|
||||||
return ri != nullptr ? ri->getSensorType() : ST_NONE;
|
return ri != nullptr ? ri->getSensorType() : ST_NONE;
|
||||||
@ -185,7 +185,7 @@ public:
|
|||||||
}
|
}
|
||||||
void getAutoExpHistogram (LUTu & histogram, int& histcompr);
|
void getAutoExpHistogram (LUTu & histogram, int& histcompr);
|
||||||
void getRAWHistogram (LUTu & histRedRaw, LUTu & histGreenRaw, LUTu & histBlueRaw);
|
void getRAWHistogram (LUTu & histRedRaw, LUTu & histGreenRaw, LUTu & histBlueRaw);
|
||||||
DCPProfile *getDCP(const ColorManagementParams &cmp, ColorTemp &wb, DCPProfile::ApplyState &as);
|
DCPProfile *getDCP(const ColorManagementParams &cmp, DCPProfile::ApplyState &as);
|
||||||
|
|
||||||
void convertColorSpace(Imagefloat* image, const ColorManagementParams &cmp, const ColorTemp &wb);
|
void convertColorSpace(Imagefloat* image, const ColorManagementParams &cmp, const ColorTemp &wb);
|
||||||
static bool findInputProfile(Glib::ustring inProfile, cmsHPROFILE embedded, std::string camName, DCPProfile **dcpProf, cmsHPROFILE& in);
|
static bool findInputProfile(Glib::ustring inProfile, cmsHPROFILE embedded, std::string camName, DCPProfile **dcpProf, cmsHPROFILE& in);
|
||||||
@ -245,9 +245,9 @@ protected:
|
|||||||
void igv_interpolate(int winw, int winh);
|
void igv_interpolate(int winw, int winh);
|
||||||
void lmmse_interpolate_omp(int winw, int winh, array2D<float> &rawData, array2D<float> &red, array2D<float> &green, array2D<float> &blue, int iterations);
|
void lmmse_interpolate_omp(int winw, int winh, array2D<float> &rawData, array2D<float> &red, array2D<float> &green, array2D<float> &blue, int iterations);
|
||||||
void amaze_demosaic_RT(int winx, int winy, int winw, int winh, array2D<float> &rawData, array2D<float> &red, array2D<float> &green, array2D<float> &blue);//Emil's code for AMaZE
|
void amaze_demosaic_RT(int winx, int winy, int winw, int winh, array2D<float> &rawData, array2D<float> &red, array2D<float> &green, array2D<float> &blue);//Emil's code for AMaZE
|
||||||
void fast_demosaic(int winx, int winy, int winw, int winh );//Emil's code for fast demosaicing
|
void fast_demosaic();//Emil's code for fast demosaicing
|
||||||
void dcb_demosaic(int iterations, bool dcb_enhance);
|
void dcb_demosaic(int iterations, bool dcb_enhance);
|
||||||
void ahd_demosaic(int winx, int winy, int winw, int winh);
|
void ahd_demosaic();
|
||||||
void border_interpolate(unsigned int border, float (*image)[4], unsigned int start = 0, unsigned int end = 0);
|
void border_interpolate(unsigned int border, float (*image)[4], unsigned int start = 0, unsigned int end = 0);
|
||||||
void border_interpolate2(int winw, int winh, int lborders);
|
void border_interpolate2(int winw, int winh, int lborders);
|
||||||
void dcb_initTileLimits(int &colMin, int &rowMin, int &colMax, int &rowMax, int x0, int y0, int border);
|
void dcb_initTileLimits(int &colMin, int &rowMin, int &colMax, int &rowMax, int x0, int y0, int border);
|
||||||
|
@ -75,11 +75,19 @@ bool LFModifier::isCACorrectionAvailable() const
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __GNUC__ // silence warning, can be removed when function is implemented
|
||||||
|
#pragma GCC diagnostic push
|
||||||
|
#pragma GCC diagnostic ignored "-Wunused-parameter"
|
||||||
|
#endif
|
||||||
|
|
||||||
void LFModifier::correctCA(double &x, double &y, int channel) const
|
void LFModifier::correctCA(double &x, double &y, int channel) const
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
void LFModifier::processVignetteLine(int width, int y, float *line) const
|
void LFModifier::processVignetteLine(int width, int y, float *line) const
|
||||||
{
|
{
|
||||||
|
@ -381,7 +381,7 @@ RawMetaDataLocation Thumbnail::loadMetaDataFromRaw (const Glib::ustring& fname)
|
|||||||
return rml;
|
return rml;
|
||||||
}
|
}
|
||||||
|
|
||||||
Thumbnail* Thumbnail::loadFromRaw (const Glib::ustring& fname, RawMetaDataLocation& rml, eSensorType &sensorType, int &w, int &h, int fixwh, double wbEq, bool rotate, int imageNum)
|
Thumbnail* Thumbnail::loadFromRaw (const Glib::ustring& fname, RawMetaDataLocation& rml, eSensorType &sensorType, int &w, int &h, int fixwh, double wbEq, bool rotate)
|
||||||
{
|
{
|
||||||
RawImage *ri = new RawImage (fname);
|
RawImage *ri = new RawImage (fname);
|
||||||
unsigned int tempImageNum = 0;
|
unsigned int tempImageNum = 0;
|
||||||
@ -929,7 +929,7 @@ Thumbnail::~Thumbnail ()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Simple processing of RAW internal JPGs
|
// Simple processing of RAW internal JPGs
|
||||||
IImage8* Thumbnail::quickProcessImage (const procparams::ProcParams& params, int rheight, rtengine::TypeInterpolation interp, double& myscale)
|
IImage8* Thumbnail::quickProcessImage (const procparams::ProcParams& params, int rheight, rtengine::TypeInterpolation interp)
|
||||||
{
|
{
|
||||||
|
|
||||||
int rwidth;
|
int rwidth;
|
||||||
@ -1126,8 +1126,7 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT
|
|||||||
int hlcomprthresh = params.toneCurve.hlcomprthresh;
|
int hlcomprthresh = params.toneCurve.hlcomprthresh;
|
||||||
|
|
||||||
if (params.toneCurve.autoexp && aeHistogram) {
|
if (params.toneCurve.autoexp && aeHistogram) {
|
||||||
double logDefGain = 0.0;
|
ipf.getAutoExp (aeHistogram, aeHistCompression, params.toneCurve.clip, expcomp, bright, contr, black, hlcompr, hlcomprthresh);
|
||||||
ipf.getAutoExp (aeHistogram, aeHistCompression, logDefGain, params.toneCurve.clip, expcomp, bright, contr, black, hlcompr, hlcomprthresh);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
LUTf curve1 (65536);
|
LUTf curve1 (65536);
|
||||||
@ -1153,8 +1152,8 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT
|
|||||||
ToneCurve customToneCurvebw2;
|
ToneCurve customToneCurvebw2;
|
||||||
CurveFactory::complexCurve (expcomp, black / 65535.0, hlcompr, hlcomprthresh,
|
CurveFactory::complexCurve (expcomp, black / 65535.0, hlcompr, hlcomprthresh,
|
||||||
params.toneCurve.shcompr, bright, contr,
|
params.toneCurve.shcompr, bright, contr,
|
||||||
params.toneCurve.curveMode, params.toneCurve.curve,
|
params.toneCurve.curve,
|
||||||
params.toneCurve.curveMode2, params.toneCurve.curve2,
|
params.toneCurve.curve2,
|
||||||
hist16, curve1, curve2, curve, dummy, customToneCurve1, customToneCurve2, 16);
|
hist16, curve1, curve2, curve, dummy, customToneCurve1, customToneCurve2, 16);
|
||||||
|
|
||||||
LUTf rCurve;
|
LUTf rCurve;
|
||||||
@ -1173,13 +1172,7 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT
|
|||||||
{wprof[1][0], wprof[1][1], wprof[1][2]},
|
{wprof[1][0], wprof[1][1], wprof[1][2]},
|
||||||
{wprof[2][0], wprof[2][1], wprof[2][2]}
|
{wprof[2][0], wprof[2][1], wprof[2][2]}
|
||||||
};
|
};
|
||||||
TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix (params.icm.working);
|
params.colorToning.getCurves (ctColorCurve, ctOpacityCurve, wp, opautili);
|
||||||
double wip[3][3] = {
|
|
||||||
{wiprof[0][0], wiprof[0][1], wiprof[0][2]},
|
|
||||||
{wiprof[1][0], wiprof[1][1], wiprof[1][2]},
|
|
||||||
{wiprof[2][0], wiprof[2][1], wiprof[2][2]}
|
|
||||||
};
|
|
||||||
params.colorToning.getCurves (ctColorCurve, ctOpacityCurve, wp, wip, opautili);
|
|
||||||
|
|
||||||
clToningcurve (65536);
|
clToningcurve (65536);
|
||||||
CurveFactory::curveToning (params.colorToning.clcurve, clToningcurve, scale == 1 ? 1 : 16);
|
CurveFactory::curveToning (params.colorToning.clcurve, clToningcurve, scale == 1 ? 1 : 16);
|
||||||
@ -1290,7 +1283,7 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT
|
|||||||
customColCurve2,
|
customColCurve2,
|
||||||
customColCurve3,
|
customColCurve3,
|
||||||
16);
|
16);
|
||||||
int begh = 0, endh = labView->H;
|
|
||||||
bool execsharp = false;
|
bool execsharp = false;
|
||||||
float d, dj, yb;
|
float d, dj, yb;
|
||||||
float fnum = fnumber;// F number
|
float fnum = fnumber;// F number
|
||||||
@ -1323,7 +1316,7 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT
|
|||||||
CAMMean = NAN;
|
CAMMean = NAN;
|
||||||
CAMBrightCurveJ.dirty = true;
|
CAMBrightCurveJ.dirty = true;
|
||||||
CAMBrightCurveQ.dirty = true;
|
CAMBrightCurveQ.dirty = true;
|
||||||
ipf.ciecam_02float (cieView, adap, begh, endh, 1, 2, labView, ¶ms, customColCurve1, customColCurve2, customColCurve3, dummy, dummy, CAMBrightCurveJ, CAMBrightCurveQ, CAMMean, 5, sk, execsharp, d, dj, yb, rtt);
|
ipf.ciecam_02float (cieView, adap, 1, 2, labView, ¶ms, customColCurve1, customColCurve2, customColCurve3, dummy, dummy, CAMBrightCurveJ, CAMBrightCurveQ, CAMMean, 5, sk, execsharp, d, dj, yb, rtt);
|
||||||
delete cieView;
|
delete cieView;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1433,7 +1426,7 @@ void Thumbnail::applyAutoExp (procparams::ProcParams& params)
|
|||||||
|
|
||||||
if (params.toneCurve.autoexp && aeHistogram) {
|
if (params.toneCurve.autoexp && aeHistogram) {
|
||||||
ImProcFunctions ipf (¶ms, false);
|
ImProcFunctions ipf (¶ms, false);
|
||||||
ipf.getAutoExp (aeHistogram, aeHistCompression, log (defGain) / log (2.0), params.toneCurve.clip, params.toneCurve.expcomp,
|
ipf.getAutoExp (aeHistogram, aeHistCompression, params.toneCurve.clip, params.toneCurve.expcomp,
|
||||||
params.toneCurve.brightness, params.toneCurve.contrast, params.toneCurve.black, params.toneCurve.hlcompr, params.toneCurve.hlcomprthresh);
|
params.toneCurve.brightness, params.toneCurve.contrast, params.toneCurve.black, params.toneCurve.hlcompr, params.toneCurve.hlcomprthresh);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1762,7 +1755,7 @@ unsigned char* Thumbnail::getGrayscaleHistEQ (int trim_width)
|
|||||||
return tmpdata;
|
return tmpdata;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Thumbnail::writeImage (const Glib::ustring& fname, int format)
|
bool Thumbnail::writeImage (const Glib::ustring& fname)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (!thumbImg) {
|
if (!thumbImg) {
|
||||||
|
@ -72,12 +72,12 @@ public:
|
|||||||
void init ();
|
void init ();
|
||||||
|
|
||||||
IImage8* processImage (const procparams::ProcParams& pparams, eSensorType sensorType, int rheight, TypeInterpolation interp, const FramesMetaData *metadata, double& scale);
|
IImage8* processImage (const procparams::ProcParams& pparams, eSensorType sensorType, int rheight, TypeInterpolation interp, const FramesMetaData *metadata, double& scale);
|
||||||
IImage8* quickProcessImage (const procparams::ProcParams& pparams, int rheight, TypeInterpolation interp, double& scale);
|
IImage8* quickProcessImage (const procparams::ProcParams& pparams, int rheight, TypeInterpolation interp);
|
||||||
int getImageWidth (const procparams::ProcParams& pparams, int rheight, float &ratio);
|
int getImageWidth (const procparams::ProcParams& pparams, int rheight, float &ratio);
|
||||||
void getDimensions (int& w, int& h, double& scaleFac);
|
void getDimensions (int& w, int& h, double& scaleFac);
|
||||||
|
|
||||||
static Thumbnail* loadQuickFromRaw (const Glib::ustring& fname, rtengine::RawMetaDataLocation& rml, eSensorType &sensorType, int &w, int &h, int fixwh, bool rotate, bool inspectorMode = false);
|
static Thumbnail* loadQuickFromRaw (const Glib::ustring& fname, rtengine::RawMetaDataLocation& rml, eSensorType &sensorType, int &w, int &h, int fixwh, bool rotate, bool inspectorMode = false);
|
||||||
static Thumbnail* loadFromRaw (const Glib::ustring& fname, RawMetaDataLocation& rml, eSensorType &sensorType, int &w, int &h, int fixwh, double wbEq, bool rotate, int imageNum);
|
static Thumbnail* loadFromRaw (const Glib::ustring& fname, RawMetaDataLocation& rml, eSensorType &sensorType, int &w, int &h, int fixwh, double wbEq, bool rotate);
|
||||||
static Thumbnail* loadFromImage (const Glib::ustring& fname, int &w, int &h, int fixwh, double wbEq, bool inspectorMode = false);
|
static Thumbnail* loadFromImage (const Glib::ustring& fname, int &w, int &h, int fixwh, double wbEq, bool inspectorMode = false);
|
||||||
static RawMetaDataLocation loadMetaDataFromRaw (const Glib::ustring& fname);
|
static RawMetaDataLocation loadMetaDataFromRaw (const Glib::ustring& fname);
|
||||||
|
|
||||||
@ -88,7 +88,7 @@ public:
|
|||||||
void applyAutoExp (procparams::ProcParams& pparams);
|
void applyAutoExp (procparams::ProcParams& pparams);
|
||||||
|
|
||||||
unsigned char* getGrayscaleHistEQ (int trim_width);
|
unsigned char* getGrayscaleHistEQ (int trim_width);
|
||||||
bool writeImage (const Glib::ustring& fname, int format);
|
bool writeImage (const Glib::ustring& fname);
|
||||||
bool readImage (const Glib::ustring& fname);
|
bool readImage (const Glib::ustring& fname);
|
||||||
|
|
||||||
bool readData (const Glib::ustring& fname);
|
bool readData (const Glib::ustring& fname);
|
||||||
|
@ -318,7 +318,7 @@ private:
|
|||||||
int beg_tileW = wcr * tileWskip + tileWskip / 2.f - crW / 2.f;
|
int beg_tileW = wcr * tileWskip + tileWskip / 2.f - crW / 2.f;
|
||||||
int beg_tileH = hcr * tileHskip + tileHskip / 2.f - crH / 2.f;
|
int beg_tileH = hcr * tileHskip + tileHskip / 2.f - crH / 2.f;
|
||||||
PreviewProps ppP (beg_tileW, beg_tileH, crW, crH, skipP);
|
PreviewProps ppP (beg_tileW, beg_tileH, crW, crH, skipP);
|
||||||
imgsrc->getImage (currWB, tr, origCropPart, ppP, params.toneCurve, params.icm, params.raw );
|
imgsrc->getImage (currWB, tr, origCropPart, ppP, params.toneCurve, params.raw );
|
||||||
//baseImg->getStdImage(currWB, tr, origCropPart, ppP, true, params.toneCurve);
|
//baseImg->getStdImage(currWB, tr, origCropPart, ppP, true, params.toneCurve);
|
||||||
|
|
||||||
// we only need image reduced to 1/4 here
|
// we only need image reduced to 1/4 here
|
||||||
@ -538,7 +538,7 @@ private:
|
|||||||
for (int wcr = 0; wcr <= 2; wcr++) {
|
for (int wcr = 0; wcr <= 2; wcr++) {
|
||||||
for (int hcr = 0; hcr <= 2; hcr++) {
|
for (int hcr = 0; hcr <= 2; hcr++) {
|
||||||
PreviewProps ppP (coordW[wcr], coordH[hcr], crW, crH, 1);
|
PreviewProps ppP (coordW[wcr], coordH[hcr], crW, crH, 1);
|
||||||
imgsrc->getImage (currWB, tr, origCropPart, ppP, params.toneCurve, params.icm, params.raw);
|
imgsrc->getImage (currWB, tr, origCropPart, ppP, params.toneCurve, params.raw);
|
||||||
//baseImg->getStdImage(currWB, tr, origCropPart, ppP, true, params.toneCurve);
|
//baseImg->getStdImage(currWB, tr, origCropPart, ppP, true, params.toneCurve);
|
||||||
|
|
||||||
|
|
||||||
@ -698,7 +698,7 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
baseImg = new Imagefloat (fw, fh);
|
baseImg = new Imagefloat (fw, fh);
|
||||||
imgsrc->getImage (currWB, tr, baseImg, pp, params.toneCurve, params.icm, params.raw);
|
imgsrc->getImage (currWB, tr, baseImg, pp, params.toneCurve, params.raw);
|
||||||
|
|
||||||
if (pl) {
|
if (pl) {
|
||||||
pl->setProgress (0.50);
|
pl->setProgress (0.50);
|
||||||
@ -718,7 +718,7 @@ private:
|
|||||||
LUTu aehist;
|
LUTu aehist;
|
||||||
int aehistcompr;
|
int aehistcompr;
|
||||||
imgsrc->getAutoExpHistogram (aehist, aehistcompr);
|
imgsrc->getAutoExpHistogram (aehist, aehistcompr);
|
||||||
ipf.getAutoExp (aehist, aehistcompr, imgsrc->getDefGain(), params.toneCurve.clip, expcomp, bright, contr, black, hlcompr, hlcomprthresh);
|
ipf.getAutoExp (aehist, aehistcompr, params.toneCurve.clip, expcomp, bright, contr, black, hlcompr, hlcomprthresh);
|
||||||
}
|
}
|
||||||
|
|
||||||
// at this stage, we can flush the raw data to free up quite an important amount of memory
|
// at this stage, we can flush the raw data to free up quite an important amount of memory
|
||||||
@ -778,9 +778,9 @@ private:
|
|||||||
// CurveFactory::denoiseLL(lldenoiseutili, denoiseParams.lcurve, Noisecurve,1);
|
// CurveFactory::denoiseLL(lldenoiseutili, denoiseParams.lcurve, Noisecurve,1);
|
||||||
//denoiseParams.getCurves(noiseLCurve);
|
//denoiseParams.getCurves(noiseLCurve);
|
||||||
// ipf.RGB_denoise(baseImg, baseImg, calclum, imgsrc->isRAW(), denoiseParams, params.defringe, imgsrc->getDirPyrDenoiseExpComp(), noiseLCurve, lldenoiseutili);
|
// ipf.RGB_denoise(baseImg, baseImg, calclum, imgsrc->isRAW(), denoiseParams, params.defringe, imgsrc->getDirPyrDenoiseExpComp(), noiseLCurve, lldenoiseutili);
|
||||||
float chaut, redaut, blueaut, maxredaut, maxblueaut, nresi, highresi;
|
float nresi, highresi;
|
||||||
int kall = 2;
|
int kall = 2;
|
||||||
ipf.RGB_denoise (kall, baseImg, baseImg, calclum, ch_M, max_r, max_b, imgsrc->isRAW(), denoiseParams, imgsrc->getDirPyrDenoiseExpComp(), noiseLCurve, noiseCCurve, chaut, redaut, blueaut, maxredaut, maxblueaut, nresi, highresi);
|
ipf.RGB_denoise (kall, baseImg, baseImg, calclum, ch_M, max_r, max_b, imgsrc->isRAW(), denoiseParams, imgsrc->getDirPyrDenoiseExpComp(), noiseLCurve, noiseCCurve, nresi, highresi);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -871,7 +871,7 @@ private:
|
|||||||
//if(params.blackwhite.enabled) params.toneCurve.hrenabled=false;
|
//if(params.blackwhite.enabled) params.toneCurve.hrenabled=false;
|
||||||
|
|
||||||
CurveFactory::complexCurve (expcomp, black / 65535.0, hlcompr, hlcomprthresh, params.toneCurve.shcompr, bright, contr,
|
CurveFactory::complexCurve (expcomp, black / 65535.0, hlcompr, hlcomprthresh, params.toneCurve.shcompr, bright, contr,
|
||||||
params.toneCurve.curveMode, params.toneCurve.curve, params.toneCurve.curveMode2, params.toneCurve.curve2,
|
params.toneCurve.curve, params.toneCurve.curve2,
|
||||||
hist16, curve1, curve2, curve, dummy, customToneCurve1, customToneCurve2 );
|
hist16, curve1, curve2, curve, dummy, customToneCurve1, customToneCurve2 );
|
||||||
|
|
||||||
CurveFactory::RGBCurve (params.rgbCurves.rcurve, rCurve, 1);
|
CurveFactory::RGBCurve (params.rgbCurves.rcurve, rCurve, 1);
|
||||||
@ -887,13 +887,7 @@ private:
|
|||||||
{wprof[1][0], wprof[1][1], wprof[1][2]},
|
{wprof[1][0], wprof[1][1], wprof[1][2]},
|
||||||
{wprof[2][0], wprof[2][1], wprof[2][2]}
|
{wprof[2][0], wprof[2][1], wprof[2][2]}
|
||||||
};
|
};
|
||||||
TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix (params.icm.working);
|
params.colorToning.getCurves (ctColorCurve, ctOpacityCurve, wp, opautili);
|
||||||
double wip[3][3] = {
|
|
||||||
{wiprof[0][0], wiprof[0][1], wiprof[0][2]},
|
|
||||||
{wiprof[1][0], wiprof[1][1], wiprof[1][2]},
|
|
||||||
{wiprof[2][0], wiprof[2][1], wiprof[2][2]}
|
|
||||||
};
|
|
||||||
params.colorToning.getCurves (ctColorCurve, ctOpacityCurve, wp, wip, opautili);
|
|
||||||
clToningcurve (65536, 0);
|
clToningcurve (65536, 0);
|
||||||
CurveFactory::curveToning (params.colorToning.clcurve, clToningcurve, 1);
|
CurveFactory::curveToning (params.colorToning.clcurve, clToningcurve, 1);
|
||||||
cl2Toningcurve (65536, 0);
|
cl2Toningcurve (65536, 0);
|
||||||
@ -932,7 +926,7 @@ private:
|
|||||||
|
|
||||||
autor = -9000.f; // This will ask to compute the "auto" values for the B&W tool (have to be inferior to -5000)
|
autor = -9000.f; // This will ask to compute the "auto" values for the B&W tool (have to be inferior to -5000)
|
||||||
DCPProfile::ApplyState as;
|
DCPProfile::ApplyState as;
|
||||||
DCPProfile *dcpProf = imgsrc->getDCP (params.icm, currWB, as);
|
DCPProfile *dcpProf = imgsrc->getDCP (params.icm, as);
|
||||||
|
|
||||||
LUTu histToneCurve;
|
LUTu histToneCurve;
|
||||||
|
|
||||||
@ -1079,7 +1073,7 @@ private:
|
|||||||
CurveFactory::curveWavContL (wavcontlutili, params.wavelet.wavclCurve, wavclCurve,/* hist16C, dummy,*/ 1);
|
CurveFactory::curveWavContL (wavcontlutili, params.wavelet.wavclCurve, wavclCurve,/* hist16C, dummy,*/ 1);
|
||||||
|
|
||||||
if (params.wavelet.enabled) {
|
if (params.wavelet.enabled) {
|
||||||
ipf.ip_wavelet (labView, labView, 2, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, wavcontlutili, 1);
|
ipf.ip_wavelet (labView, labView, 2, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
wavCLVCurve.Reset();
|
wavCLVCurve.Reset();
|
||||||
@ -1087,7 +1081,6 @@ private:
|
|||||||
//Colorappearance and tone-mapping associated
|
//Colorappearance and tone-mapping associated
|
||||||
|
|
||||||
int f_w = 1, f_h = 1;
|
int f_w = 1, f_h = 1;
|
||||||
int begh = 0, endh = fh;
|
|
||||||
|
|
||||||
if (params.colorappearance.tonecie || params.colorappearance.enabled) {
|
if (params.colorappearance.tonecie || params.colorappearance.enabled) {
|
||||||
f_w = fw;
|
f_w = fw;
|
||||||
@ -1095,8 +1088,7 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
CieImage *cieView = new CieImage (f_w, (f_h));
|
CieImage *cieView = new CieImage (f_w, (f_h));
|
||||||
begh = 0;
|
|
||||||
endh = fh;
|
|
||||||
CurveFactory::curveLightBrightColor (
|
CurveFactory::curveLightBrightColor (
|
||||||
params.colorappearance.curve,
|
params.colorappearance.curve,
|
||||||
params.colorappearance.curve2,
|
params.colorappearance.curve2,
|
||||||
@ -1138,18 +1130,18 @@ private:
|
|||||||
if (params.sharpening.enabled) {
|
if (params.sharpening.enabled) {
|
||||||
if (settings->ciecamfloat) {
|
if (settings->ciecamfloat) {
|
||||||
float d, dj, yb;
|
float d, dj, yb;
|
||||||
ipf.ciecam_02float (cieView, float (adap), begh, endh, 1, 2, labView, ¶ms, customColCurve1, customColCurve2, customColCurve3, dummy, dummy, CAMBrightCurveJ, CAMBrightCurveQ, CAMMean, 5, 1, true, d, dj, yb, 1);
|
ipf.ciecam_02float (cieView, float (adap), 1, 2, labView, ¶ms, customColCurve1, customColCurve2, customColCurve3, dummy, dummy, CAMBrightCurveJ, CAMBrightCurveQ, CAMMean, 5, 1, true, d, dj, yb, 1);
|
||||||
} else {
|
} else {
|
||||||
double dd, dj, yb;
|
double dd, dj;
|
||||||
ipf.ciecam_02 (cieView, adap, begh, endh, 1, 2, labView, ¶ms, customColCurve1, customColCurve2, customColCurve3, dummy, dummy, CAMBrightCurveJ, CAMBrightCurveQ, CAMMean, 5, 1, true, dd, dj, yb, 1);
|
ipf.ciecam_02 (cieView, adap, 1, 2, labView, ¶ms, customColCurve1, customColCurve2, customColCurve3, dummy, dummy, CAMBrightCurveJ, CAMBrightCurveQ, CAMMean, 5, 1, true, dd, dj, 1);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (settings->ciecamfloat) {
|
if (settings->ciecamfloat) {
|
||||||
float d, dj, yb;
|
float d, dj, yb;
|
||||||
ipf.ciecam_02float (cieView, float (adap), begh, endh, 1, 2, labView, ¶ms, customColCurve1, customColCurve2, customColCurve3, dummy, dummy, CAMBrightCurveJ, CAMBrightCurveQ, CAMMean, 5, 1, true, d, dj, yb, 1);
|
ipf.ciecam_02float (cieView, float (adap), 1, 2, labView, ¶ms, customColCurve1, customColCurve2, customColCurve3, dummy, dummy, CAMBrightCurveJ, CAMBrightCurveQ, CAMMean, 5, 1, true, d, dj, yb, 1);
|
||||||
} else {
|
} else {
|
||||||
double dd, dj, yb;
|
double dd, dj;
|
||||||
ipf.ciecam_02 (cieView, adap, begh, endh, 1, 2, labView, ¶ms, customColCurve1, customColCurve2, customColCurve3, dummy, dummy, CAMBrightCurveJ, CAMBrightCurveQ, CAMMean, 5, 1, true, dd, dj, yb, 1);
|
ipf.ciecam_02 (cieView, adap, 1, 2, labView, ¶ms, customColCurve1, customColCurve2, customColCurve3, dummy, dummy, CAMBrightCurveJ, CAMBrightCurveQ, CAMMean, 5, 1, true, dd, dj, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1241,7 +1233,7 @@ private:
|
|||||||
|
|
||||||
GammaValues ga;
|
GammaValues ga;
|
||||||
// if(params.blackwhite.enabled) params.toneCurve.hrenabled=false;
|
// if(params.blackwhite.enabled) params.toneCurve.hrenabled=false;
|
||||||
readyImg = ipf.lab2rgb16 (labView, cx, cy, cw, ch, params.icm, bwonly, &ga);
|
readyImg = ipf.lab2rgb16 (labView, cx, cy, cw, ch, params.icm, &ga);
|
||||||
customGamma = true;
|
customGamma = true;
|
||||||
|
|
||||||
//or selected Free gamma
|
//or selected Free gamma
|
||||||
@ -1255,7 +1247,7 @@ private:
|
|||||||
// if Default gamma mode: we use the profile selected in the "Output profile" combobox;
|
// if Default gamma mode: we use the profile selected in the "Output profile" combobox;
|
||||||
// gamma come from the selected profile, otherwise it comes from "Free gamma" tool
|
// gamma come from the selected profile, otherwise it comes from "Free gamma" tool
|
||||||
|
|
||||||
readyImg = ipf.lab2rgb16 (labView, cx, cy, cw, ch, params.icm, bwonly);
|
readyImg = ipf.lab2rgb16 (labView, cx, cy, cw, ch, params.icm);
|
||||||
|
|
||||||
if (settings->verbose) {
|
if (settings->verbose) {
|
||||||
printf ("Output profile_: \"%s\"\n", params.icm.output.c_str());
|
printf ("Output profile_: \"%s\"\n", params.icm.output.c_str());
|
||||||
|
@ -102,7 +102,7 @@ void StdImageSource::getSampleFormat (const Glib::ustring &fname, IIOSampleForma
|
|||||||
* and RT's image data type (Image8, Image16 and Imagefloat), then it will
|
* and RT's image data type (Image8, Image16 and Imagefloat), then it will
|
||||||
* load the image into it
|
* load the image into it
|
||||||
*/
|
*/
|
||||||
int StdImageSource::load (const Glib::ustring &fname, int imageNum, bool batch)
|
int StdImageSource::load (const Glib::ustring &fname)
|
||||||
{
|
{
|
||||||
|
|
||||||
fileName = fname;
|
fileName = fname;
|
||||||
@ -187,7 +187,7 @@ int StdImageSource::load (const Glib::ustring &fname, int imageNum, bool batch)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void StdImageSource::getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const ToneCurveParams &hrp, const ColorManagementParams &cmp, const RAWParams &raw)
|
void StdImageSource::getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const ToneCurveParams &hrp, const RAWParams &raw)
|
||||||
{
|
{
|
||||||
|
|
||||||
// the code will use OpenMP as of now.
|
// the code will use OpenMP as of now.
|
||||||
|
@ -42,8 +42,8 @@ public:
|
|||||||
StdImageSource ();
|
StdImageSource ();
|
||||||
~StdImageSource ();
|
~StdImageSource ();
|
||||||
|
|
||||||
int load (const Glib::ustring &fname, int imageNum = 0, bool batch = false);
|
int load (const Glib::ustring &fname);
|
||||||
void getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const ToneCurveParams &hrp, const ColorManagementParams &cmp, const RAWParams &raw);
|
void getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const ToneCurveParams &hrp, const RAWParams &raw);
|
||||||
ColorTemp getWB () const
|
ColorTemp getWB () const
|
||||||
{
|
{
|
||||||
return wb;
|
return wb;
|
||||||
|
@ -163,7 +163,7 @@ int main (int argc, char **argv)
|
|||||||
return -2;
|
return -2;
|
||||||
}
|
}
|
||||||
|
|
||||||
rtengine::setPaths (options);
|
rtengine::setPaths();
|
||||||
|
|
||||||
TIFFSetWarningHandler (nullptr); // avoid annoying message boxes
|
TIFFSetWarningHandler (nullptr); // avoid annoying message boxes
|
||||||
|
|
||||||
|
@ -257,7 +257,7 @@ RTWindow *create_rt_window()
|
|||||||
Glib::RefPtr<Gtk::IconTheme> defaultIconTheme = Gtk::IconTheme::get_default();
|
Glib::RefPtr<Gtk::IconTheme> defaultIconTheme = Gtk::IconTheme::get_default();
|
||||||
defaultIconTheme->append_search_path (icon_path);
|
defaultIconTheme->append_search_path (icon_path);
|
||||||
|
|
||||||
rtengine::setPaths (options);
|
rtengine::setPaths();
|
||||||
MyExpander::init(); // has to stay AFTER rtengine::setPaths
|
MyExpander::init(); // has to stay AFTER rtengine::setPaths
|
||||||
|
|
||||||
// ------- loading theme files
|
// ------- loading theme files
|
||||||
|
@ -2147,7 +2147,7 @@ void Preferences::cancelPressed ()
|
|||||||
{
|
{
|
||||||
// set the initial theme back
|
// set the initial theme back
|
||||||
if (themeFNames.at (theme->get_active_row_number ()).longFName != options.theme) {
|
if (themeFNames.at (theme->get_active_row_number ()).longFName != options.theme) {
|
||||||
rtengine::setPaths (options);
|
rtengine::setPaths();
|
||||||
RTImage::updateImages();
|
RTImage::updateImages();
|
||||||
switchThemeTo (options.theme);
|
switchThemeTo (options.theme);
|
||||||
}
|
}
|
||||||
@ -2205,7 +2205,7 @@ void Preferences::themeChanged ()
|
|||||||
{
|
{
|
||||||
|
|
||||||
moptions.theme = themeFNames.at (theme->get_active_row_number ()).longFName;
|
moptions.theme = themeFNames.at (theme->get_active_row_number ()).longFName;
|
||||||
rtengine::setPaths (moptions);
|
rtengine::setPaths();
|
||||||
RTImage::updateImages();
|
RTImage::updateImages();
|
||||||
switchThemeTo (moptions.theme);
|
switchThemeTo (moptions.theme);
|
||||||
}
|
}
|
||||||
|
@ -140,7 +140,7 @@ void Thumbnail::_generateThumbnailImage ()
|
|||||||
|
|
||||||
if ( tpp == nullptr ) {
|
if ( tpp == nullptr ) {
|
||||||
quick = false;
|
quick = false;
|
||||||
tpp = rtengine::Thumbnail::loadFromRaw (fname, ri, sensorType, tw, th, 1, pparams.wb.equal, TRUE, pparams.raw.bayersensor.imageNum);
|
tpp = rtengine::Thumbnail::loadFromRaw (fname, ri, sensorType, tw, th, 1, pparams.wb.equal, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
cfs.sensortype = sensorType;
|
cfs.sensortype = sensorType;
|
||||||
@ -612,7 +612,7 @@ rtengine::IImage8* Thumbnail::processThumbImage (const rtengine::procparams::Pro
|
|||||||
|
|
||||||
if ( cfs.thumbImgType == CacheImageData::QUICK_THUMBNAIL ) {
|
if ( cfs.thumbImgType == CacheImageData::QUICK_THUMBNAIL ) {
|
||||||
// RAW internal thumbnail, no profile yet: just do some rotation etc.
|
// RAW internal thumbnail, no profile yet: just do some rotation etc.
|
||||||
image = tpp->quickProcessImage (pparams, h, rtengine::TI_Nearest, scale);
|
image = tpp->quickProcessImage (pparams, h, rtengine::TI_Nearest);
|
||||||
} else {
|
} else {
|
||||||
// Full thumbnail: apply profile
|
// Full thumbnail: apply profile
|
||||||
// image = tpp->processImage (pparams, h, rtengine::TI_Bilinear, cfs.getCamera(), cfs.focalLen, cfs.focalLen35mm, cfs.focusDist, cfs.shutter, cfs.fnumber, cfs.iso, cfs.expcomp, scale );
|
// image = tpp->processImage (pparams, h, rtengine::TI_Bilinear, cfs.getCamera(), cfs.focalLen, cfs.focalLen35mm, cfs.focusDist, cfs.shutter, cfs.fnumber, cfs.iso, cfs.expcomp, scale );
|
||||||
@ -883,7 +883,7 @@ void Thumbnail::_saveThumbnail ()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// save thumbnail image
|
// save thumbnail image
|
||||||
tpp->writeImage (getCacheFileName ("images", ""), 1);
|
tpp->writeImage (getCacheFileName ("images", ""));
|
||||||
|
|
||||||
// save aehistogram
|
// save aehistogram
|
||||||
tpp->writeAEHistogram (getCacheFileName ("aehistograms", ""));
|
tpp->writeAEHistogram (getCacheFileName ("aehistograms", ""));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user