diff --git a/rtdata/languages/default b/rtdata/languages/default
index 575cc5136..118e0ed8b 100644
--- a/rtdata/languages/default
+++ b/rtdata/languages/default
@@ -704,6 +704,7 @@ HISTORY_MSG_469;EvPixelShiftMedian3
HISTORY_MSG_470;EvPixelShiftMotionMethod
HISTORY_MSG_471;EvPixelShiftSmooth
HISTORY_MSG_472;EvPixelShiftLmmse
+HISTORY_MSG_473;EvPixelShiftEqualBright
HISTORY_NEWSNAPSHOT;Add
HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s
HISTORY_SNAPSHOT;Snapshot
@@ -1692,20 +1693,24 @@ TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal
TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical
TP_RAW_PIXELSHIFTMEDIAN;Median
TP_RAW_PIXELSHIFTMEDIAN3;Exclude selected frame from median
-TP_RAW_PIXELSHIFTHOLEFILL;3x3 new: Fill holes
-TP_RAW_PIXELSHIFTBLUR;3x3 new: Blur
-TP_RAW_PIXELSHIFTSMOOTH;3x3 new: Smooth transitions
+TP_RAW_PIXELSHIFTHOLEFILL;Fill holes in motion mask
+TP_RAW_PIXELSHIFTBLUR;Blur motion mask
+TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;Default radius of 1.0 usually fits good for base ISO. Increase value for high ISO shots,\n5.0 is a good starting point for high ISO shots.\nWatch motion mask while changing the value.
+TP_RAW_PIXELSHIFTSMOOTH;Smooth transitions
+TP_RAW_PIXELSHIFTLMMSE_TOOLTIP;Use lmmse instead of amaze for motion areas.\nUseful for High ISO images.
TP_RAW_PIXELSHIFTLMMSE;Use lmmse for motion parts
+TP_RAW_PIXELSHIFTEQUALBRIGHT;Equalize brightness of frames
+TP_RAW_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta colour cast in overexposed areas or enable motion correction.
TP_RAW_PIXELSHIFTEXP0;Experimental
-TP_RAW_PIXELSHIFTGREEN;Check dual green
-TP_RAW_PIXELSHIFTNONGREENCROSS;Check red/blue cross
+TP_RAW_PIXELSHIFTGREEN;Check green channel for motion
+TP_RAW_PIXELSHIFTNONGREENCROSS;Check red/blue channels for motion
TP_RAW_PIXELSHIFTNONGREENCROSS2;Check green amaze
TP_RAW_PIXELSHIFTNONGREENAMAZE;Check red/blue amaze
TP_RAW_PIXELSHIFTMOTION;Motion detection level (deprecated)
TP_RAW_PIXELSHIFTMOTION_TOOLTIP;0 means no motion detection\n1 - 99 means motion will be detected according to this value. Increase value to increase detection rate\n100 means the Amaze demosaiced frame will be used
TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Fill holes in motion mask
TP_RAW_PIXELSHIFTBLUR_TOOLTIP;Blur motion mask
-TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Smooth transitions (requires 3x3 new Blur)\nSet to 0 to disable smooth transitions\nSet to 1 to get Amaze or Median
+TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Smooth transitions between areas with and without motion.\nSet to 0 to disable smooth transitions\nSet to 1 to get Amaze/lmmse or Median
TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;Use median of all frames instead of selected frame for regions with motion.\nRemoves objects which are at different places in all frames.\nGives motion effect on slow moving (overlapping) objects.
TP_RAW_PIXELSHIFTMEDIAN3_TOOLTIP;Excludes selected frame from median.\nUseful if moving objects overlap in frame 2 and 3
TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a mask showing the regions with motion
@@ -1718,10 +1723,11 @@ TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;Show mask only
TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green
TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red
TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue
-TP_RAW_PIXELSHIFTEPERISO;e per ISO
+TP_RAW_PIXELSHIFTEPERISO;ISO adaption
+TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value (0.0) should work fine for base ISO.\nIncrease the value to improve motion detection for higher ISO.\nIncrease in small steps and watch the motion mask while increasing.
TP_RAW_PIXELSHIFTNREADISO;nRead
TP_RAW_PIXELSHIFTPRNU;PRNU (%)
-TP_RAW_PIXELSHIFTSIGMA;Blur sigma
+TP_RAW_PIXELSHIFTSIGMA;Blur radius
TP_RAW_PIXELSHIFTMASKTHRESHOLD;3x3 new threshold
TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight
TP_RAW_SENSOR_BAYER_LABEL;Sensor with Bayer Matrix
diff --git a/rtengine/pixelshift.cc b/rtengine/pixelshift.cc
index 7696c1874..8ba9c1cfd 100644
--- a/rtengine/pixelshift.cc
+++ b/rtengine/pixelshift.cc
@@ -45,7 +45,7 @@ float greenDiff(float a, float b, bool adaptive, float stddevFactor, float eperI
float gDiff = a - b;
gDiff *= eperIso;
gDiff *= gDiff;
- float avg = (a + b) / 2.f;
+ float avg = (a + b) * 0.5f;
avg *= eperIso;
prnu *= avg;
float stddev = stddevFactor * (avg + nreadIso + prnu * prnu);
@@ -96,17 +96,17 @@ float nonGreenDiff(float a, float b, float stddevFactor, float eperIso, float nr
float nonGreenDiffCross(float right, float left, float top, float bottom, float centre, float stddevFactor, float eperIso, float nreadIso, float prnu, bool showMotion)
{
// check non green cross
- float hDiff = (right + left) / 2.f - centre;
+ float hDiff = (right + left) * 0.5f - centre;
hDiff *= eperIso;
hDiff *= hDiff;
- float vDiff = (top + bottom) / 2.f - centre;
+ float vDiff = (top + bottom) * 0.5f - centre;
vDiff *= eperIso;
vDiff *= vDiff;
- float avg = (right + left + top + bottom) / 4.f;
+ float avg = ((right + left) + (top + bottom)) * 0.25f;
avg *= eperIso;
prnu *= avg;
float stddev = stddevFactor * (avg + nreadIso + prnu * prnu);
- float result = std::min(hDiff - stddev, vDiff - stddev);
+ float result = std::min(hDiff, vDiff) - stddev;
if(!showMotion) {
return result;
@@ -896,21 +896,31 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, bool det
#else
void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RAWParams::BayerSensor &bayerParams, unsigned int frame, const std::string &model, float rawWpCorrection)
{
-
+#ifdef PIXELSHIFTDEV
BENCHFUN
-
+#endif
const bool detectMotion = bayerParams.pixelShiftMotion > 0;
const int motion = bayerParams.pixelShiftMotion;
const bool showMotion = bayerParams.pixelshiftShowMotion;
- const bool showOnlyMask = bayerParams.pixelshiftShowMotionMaskOnly;
+ const bool showOnlyMask = bayerParams.pixelshiftShowMotionMaskOnly && showMotion;
const RAWParams::BayerSensor::ePSMotionCorrection gridSize_ = bayerParams.pixelShiftMotionCorrection;
const bool adaptive = bayerParams.pixelShiftAutomatic;
+#ifdef PIXELSHIFTDEV
float stddevFactorGreen = bayerParams.pixelShiftStddevFactorGreen;
float stddevFactorRed = bayerParams.pixelShiftStddevFactorRed;
float stddevFactorBlue = bayerParams.pixelShiftStddevFactorBlue;
- float eperIso = bayerParams.pixelShiftEperIso;
float nreadIso = bayerParams.pixelShiftNreadIso;
float prnu = bayerParams.pixelShiftPrnu;
+ const float redBlueWeight = bayerParams.pixelShiftRedBlueWeight + 1.f;
+#else
+ float stddevFactorGreen = 5.f;
+ float stddevFactorRed = 5.f;
+ float stddevFactorBlue = 5.f;
+ float nreadIso = 0.f;
+ float prnu = 1.f;
+ const float redBlueWeight = 0.7f + 1.f;
+#endif
+ float eperIso = bayerParams.pixelShiftEperIso;
const bool checkNonGreenHorizontal = bayerParams.pixelShiftNonGreenHorizontal;
const bool checkNonGreenVertical = bayerParams.pixelShiftNonGreenVertical;
const bool checkNonGreenCross = bayerParams.pixelShiftNonGreenCross;
@@ -918,13 +928,18 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA
const bool checkNonGreenCross2 = bayerParams.pixelShiftNonGreenCross2;
const bool checkGreen = bayerParams.pixelShiftGreen;
const float greenWeight = 2.f;
- const float redBlueWeight = bayerParams.pixelShiftRedBlueWeight + 1.f;
const bool blurMap = bayerParams.pixelShiftBlur;
const float sigma = bayerParams.pixelShiftSigma;
+#ifdef PIXELSHIFTDEV
const float threshold = bayerParams.pixelShiftSum + 9.f;
+#else
+ const float threshold = 3.f + 9.f;
+#endif
const bool experimental0 = bayerParams.pixelShiftExp0;
const bool holeFill = bayerParams.pixelShiftHoleFill;
- const bool smoothTransitions = blurMap && bayerParams.pixelShiftSmoothFactor > 0.;
+ const bool equalBrightness = bayerParams.pixelShiftEqualBright;
+ const bool smoothTransitions = blurMap && bayerParams.pixelShiftSmoothFactor > 0. && !showOnlyMask;
+ const bool automatic = bayerParams.pixelShiftMotionCorrectionMethod == RAWParams::BayerSensor::Automatic;
const float smoothFactor = 1.0 - bayerParams.pixelShiftSmoothFactor;
static const float nReadK3II[] = { 3.4f, // ISO 100
@@ -1040,6 +1055,7 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA
const bool skip = (gridSize_ == RAWParams::BayerSensor::ePSMotionCorrection::Grid1x2);
int gridSize = 1;
bool nOf3x3 = false;
+
switch (gridSize_) {
case RAWParams::BayerSensor::ePSMotionCorrection::Grid1x1:
case RAWParams::BayerSensor::ePSMotionCorrection::Grid1x2:
@@ -1067,6 +1083,7 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA
if(plistener) {
plistener->setProgress(1.0);
}
+
return;
}
@@ -1110,11 +1127,12 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA
eperIso = eperIsoModel * (100.f / (rawWpCorrection * idata->getISOSpeed()));
}
+#ifdef PIXELSHIFTDEV
std::cout << "WL: " << c_white[0] << " BL: " << c_black[0] << " ePerIso multiplicator: " << (65535.f / (c_white[0] - c_black[0])) << std::endl;
-
- float eperIsoRed = (eperIso / scale_mul[0]) * (65535.f / (c_white[0]- c_black[0]));
- float eperIsoGreen = (eperIso * scaleGreen) * (65535.f / (c_white[1]- c_black[1]));
- float eperIsoBlue = (eperIso / scale_mul[2]) * (65535.f / (c_white[2]- c_black[2]));
+#endif
+ float eperIsoRed = (eperIso / scale_mul[0]) * (65535.f / (c_white[0] - c_black[0]));
+ float eperIsoGreen = (eperIso * scaleGreen) * (65535.f / (c_white[1] - c_black[1]));
+ float eperIsoBlue = (eperIso / scale_mul[2]) * (65535.f / (c_white[2] - c_black[2]));
// printf("Pixelshift parameters : gridSize %d\tadaptive %d\tstdDevFactorGreen %f\telectrons %1.8f\tnread %f\tprnu %1.1f%%\n", gridSize, adaptive, stddevFactorGreen, eperIso, nRead, prnu);
@@ -1161,6 +1179,90 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA
array2D psG2(winw + 32, winh);
array2D psBlue(winw + 32, winh);
+// calculate average green brightness for each frame
+ double greenBrightness[4] = {};
+
+ if(equalBrightness) {
+ LUT *histo[4];
+
+ for(int i = 0; i < 4; ++i) {
+ histo[i] = new LUT(65536);
+ histo[i]->clear();
+ }
+
+#ifdef _OPENMP
+ #pragma omp parallel
+#endif
+ {
+ LUT *histoThr[4];
+
+ for(int i = 0; i < 4; ++i) {
+ histoThr[i] = new LUT(65536);
+ histoThr[i]->clear();
+ }
+
+#ifdef _OPENMP
+ #pragma omp for schedule(dynamic,16)
+#endif
+
+ for(int i = winy + 1; i < winh - 1; ++i) {
+ int j = winx + 1;
+ int c = FC(i, j);
+
+ // offset to keep the code short. It changes its value between 0 and 1 for each iteration of the loop
+ unsigned int offset = (c & 1);
+ offset ^= 1; // 0 => 1 or 1 => 0
+
+ for(; j < winw - 1; ++j) {
+ offset ^= 1; // 0 => 1 or 1 => 0
+
+ // store the values from the 4 frames into 4 different temporary planes
+ float green1 = (*rawDataFrames[1 - offset])[i - offset + 1][j];
+ float green2 = (*rawDataFrames[3 - offset])[i + offset][j + 1];
+ (*histoThr[1 - offset])[green1]++;
+ (*histoThr[3 - offset])[green2]++;
+ }
+ }
+
+ #pragma omp critical
+ {
+ for(int i = 0; i < 4; ++i) {
+ (*histo[i]) += (*histoThr[i]);
+ delete histoThr[i];
+ }
+ }
+ }
+
+ float medians[4];
+
+ for(int i = 0; i < 4; ++i) {
+ //find median of histogram
+ uint32_t median = 0, count = 0;
+ uint32_t datalen = (winh - 2) * (winw - 2) / 2;
+
+ while (count < datalen / 2) {
+ count += (*histo[i])[median];
+ ++median;
+ }
+
+ medians[i] = (median + median - 1) / 2.f;
+ delete histo[i];
+ }
+
+ const float medianMaster = medians[frame];
+
+ for(int i = 0; i < 4; ++i) {
+ greenBrightness[i] = medianMaster / medians[i];
+ }
+
+#ifdef PIXELSHIFTDEV
+ std::cout << "brightness factors by median : " << greenBrightness[0] << " " << greenBrightness[1] << " " << greenBrightness[2] << " " << greenBrightness[3] << std::endl;
+#endif
+
+ } else {
+ greenBrightness[0] = greenBrightness[1] = greenBrightness[2] = greenBrightness[3] = 1.f;
+ }
+
// fill channels psRed, psG1, psG2 and psBlue
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16)
@@ -1188,16 +1290,17 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA
offset ^= 1; // 0 => 1 or 1 => 0
// store the values from the 4 frames into 4 different temporary planes
- greenDest1[j] = (*rawDataFrames[1 - offset])[i - offset + 1][j];
- greenDest2[j] = (*rawDataFrames[3 - offset])[i + offset][j + 1];
- nonGreenDest0[j] = (*rawDataFrames[(offset << 1) + offset])[i][j + offset];
- nonGreenDest1[j] = (*rawDataFrames[2 - offset])[i + 1][j - offset + 1];
+ greenDest1[j] = (*rawDataFrames[1 - offset])[i - offset + 1][j] * greenBrightness[1 - offset];
+ greenDest2[j] = (*rawDataFrames[3 - offset])[i + offset][j + 1] * greenBrightness[3 - offset];
+ nonGreenDest0[j] = (*rawDataFrames[(offset << 1) + offset])[i][j + offset] * greenBrightness[(offset << 1) + offset];
+ nonGreenDest1[j] = (*rawDataFrames[2 - offset])[i + 1][j - offset + 1] * greenBrightness[2 - offset];
}
}
// now that the temporary planes are filled for easy access we do the motion detection
+#ifdef PIXELSHIFTDEV
int sum[2] = {0};
-
+#endif
float pixelcount = ((winh - (border + offsY) - (winy + border - offsY)) * (winw - (border + offsX) - (winx + border - offsX))) / 2.f;
array2D psMask(winw, winh);
@@ -1207,7 +1310,9 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA
#pragma omp parallel
#endif
{
+#ifdef PIXELSHIFTDEV
int sumThr[2] = {0};
+#endif
#ifdef _OPENMP
#pragma omp for schedule(dynamic,16) nowait
#endif
@@ -1220,7 +1325,10 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA
float greenDifMax[gridSize]; // Here we store the maximum differences per Column
+
// green channel motion detection checks the grid around the pixel for differences in green channels
+#ifdef PIXELSHIFTDEV
+
if(detectMotion || (adaptive && checkGreen)) {
if(gridSize == 3) {
// compute maximum of differences for first two columns of 3x3 grid
@@ -1312,6 +1420,7 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA
}
+#endif
// this is the index for the last column of the grid. Obviously we have to start with gridSize - 1
int lastIndex = gridSize - 1;
@@ -1336,9 +1445,14 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA
bool skipNext = false;
float gridMax;
+#ifdef PIXELSHIFTDEV
+
if(gridSize < 2) {
// compute difference for current pixel and skip next pixel, that's roughly the method from dcrawps
+#endif
gridMax = greenDiff(psG1[i][j], psG2[i][j], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i);
+#ifdef PIXELSHIFTDEV
+
skipNext = skip;
} else if(gridSize == 3) {
// compute maximum of differences for third column of 3x3 grid and save at position lastIndex
@@ -1386,12 +1500,19 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA
korr = log2Lut[((int)(psG1[i][j] * scaleGreen)) >> 1];
}
+#endif
+
if (gridMax > thresh - korr) {
+#ifdef PIXELSHIFTDEV
sumThr[offset] ++;
if(nOf3x3) {
+#endif
psMask[i][j] = greenWeight;
- } else if((offset == (frame & 1)) && checkNonGreenVertical) {
+#ifdef PIXELSHIFTDEV
+ }
+
+ else if((offset == (frame & 1)) && checkNonGreenVertical) {
if(frame > 1) {
green[i + offsY][j + offsX] = blueRow ? psG1[i][j] : psG2[i][j];
} else {
@@ -1408,6 +1529,8 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA
paintMotionMask(j + offsX, showMotion, (gridMax - thresh + korr) * blendFactor, showOnlyMask, greenDest, redDest, blueDest);
}
}
+
+#endif
// do not set the motion pixel values. They have already been set by demosaicer or showMotion
continue;
}
@@ -1424,12 +1547,17 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA
float redDiff = nonGreenDiffCross(redRight, redLeft, redTop, redBottom, redCentre, stddevFactorRed, eperIsoRed, nRead, prnu, showMotion);
if(redDiff > 0.f) {
+#ifdef PIXELSHIFTDEV
+
if(nOf3x3) {
+#endif
psMask[i][j] = redBlueWeight;
+#ifdef PIXELSHIFTDEV
} else {
paintMotionMask(j + offsX, showMotion, redDiff, showOnlyMask, redDest, blueDest, greenDest);
}
+#endif
continue;
}
@@ -1442,17 +1570,24 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA
float blueDiff = nonGreenDiffCross(blueRight, blueLeft, blueTop, blueBottom, blueCentre, stddevFactorBlue, eperIsoBlue, nRead, prnu, showMotion);
if(blueDiff > 0.f) {
+#ifdef PIXELSHIFTDEV
+
if(nOf3x3) {
+#endif
psMask[i][j] = redBlueWeight;
+#ifdef PIXELSHIFTDEV
} else {
paintMotionMask(j + offsX, showMotion, blueDiff, showOnlyMask, blueDest, redDest, greenDest);
}
+#endif
continue;
}
}
+#ifdef PIXELSHIFTDEV
+
if(checkNonGreenHorizontal) {
float redLeft = psRed[ i ][j - 1];
float redCentre = psRed[ i ][ j ];
@@ -1599,9 +1734,11 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA
if(experimental0) { // for experiments
}
+
+#endif
}
- if(showMotion && showOnlyMask) { // we want only motion mask => paint areas without motion in pure black
+ if(showOnlyMask) { // we want only motion mask => paint areas without motion in pure black
red[i + offsY][j + offsX] = green[i + offsY][j + offsX] = blue[i + offsY][j + offsX] = 0.f;
} else if(!(adaptive && nOf3x3)) {
// no motion detected, replace the a priori demosaiced values by the pixelshift combined values
@@ -1612,6 +1749,8 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA
}
}
+#ifdef PIXELSHIFTDEV
+
#ifdef _OPENMP
#pragma omp critical
#endif
@@ -1619,13 +1758,16 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA
sum[0] += sumThr[0];
sum[1] += sumThr[0];
}
+#endif
}
+#ifdef PIXELSHIFTDEV
float percent0 = 100.f * sum[0] / pixelcount;
float percent1 = 100.f * sum[1] / pixelcount;
std::cout << fileName << " : Green detections at stddev " << std::setprecision( 2 ) << bayerParams.pixelShiftStddevFactorGreen << " : Frame 1/3 : " << std::setprecision( 6 ) << sum[0] << " (" << percent0 << "%)" << " Frame 2/4 : " << sum[1] << " (" << percent1 << "%)" << std::endl;
+#endif
if(adaptive && nOf3x3) {
if(blurMap) {
@@ -1641,9 +1783,6 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA
#pragma omp parallel for schedule(dynamic,16)
for(int i = winy + border - offsY; i < winh - (border + offsY); ++i) {
- float *greenDest = green[i + offsY];
- float *redDest = red[i + offsY];
- float *blueDest = blue[i + offsY];
int j = winx + border - offsX;
float v3sum[3] = {0.f};
@@ -1680,7 +1819,7 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA
for(int i = winy + border - offsY; i < winh - (border + offsY); ++i) {
#ifdef __SSE2__
- if(!(showMotion && showOnlyMask) && smoothTransitions) {
+ if(smoothTransitions) {
vfloat onev = F2V(1.f);
vfloat smoothv = F2V(smoothFactor);
int j = winx + border - offsX;
@@ -1704,7 +1843,7 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA
for(int j = winx + border - offsX; j < winw - (border + offsX); ++j) {
if(mask[i][j] == 255) {
paintMotionMask(j + offsX, showMotion, 0.5f, showOnlyMask, greenDest, redDest, blueDest);
- } else if(showMotion && showOnlyMask) { // we want only motion mask => paint areas without motion in pure black
+ } else if(showOnlyMask) { // we want only motion mask => paint areas without motion in pure black
red[i + offsY][j + offsX] = green[i + offsY][j + offsX] = blue[i + offsY][j + offsX] = 0.f;
} else {
if(smoothTransitions) {
@@ -1714,11 +1853,11 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA
float blend = pow_F(std::max(psMask[i][j] - 1.f, 0.f), smoothFactor);
#endif
red[i + offsY][j + offsX] = intp(blend, red[i + offsY][j + offsX], psRed[i][j] );
- green[i + offsY][j + offsX] = intp(blend, green[i + offsY][j + offsX], (psG1[i][j] + psG2[i][j]) / 2.f);
+ green[i + offsY][j + offsX] = intp(blend, green[i + offsY][j + offsX], (psG1[i][j] + psG2[i][j]) * 0.5f);
blue[i + offsY][j + offsX] = intp(blend, blue[i + offsY][j + offsX], psBlue[i][j]);
} else {
red[i + offsY][j + offsX] = psRed[i][j];
- green[i + offsY][j + offsX] = (psG1[i][j] + psG2[i][j]) / 2.f;
+ green[i + offsY][j + offsX] = (psG1[i][j] + psG2[i][j]) * 0.5f;
blue[i + offsY][j + offsX] = psBlue[i][j];
}
}
diff --git a/rtengine/procevents.h b/rtengine/procevents.h
index 13294c73a..3252bcc86 100644
--- a/rtengine/procevents.h
+++ b/rtengine/procevents.h
@@ -499,6 +499,7 @@ enum ProcEvent {
EvPixelShiftMotionMethod = 469,
EvPixelShiftSmooth = 470,
EvPixelShiftLmmse = 471,
+ EvPixelShiftEqualBright = 472,
NUMOFEVENTS
};
diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc
index 50b77b8d1..ea18492e2 100644
--- a/rtengine/procparams.cc
+++ b/rtengine/procparams.cc
@@ -900,6 +900,7 @@ void RAWParams::BayerSensor::setPixelShiftDefaults()
pixelShiftSmoothFactor = 0.7;
pixelShiftExp0 = false;
pixelShiftLmmse = false;
+ pixelShiftEqualBright = false;
pixelShiftNonGreenCross = true;
pixelShiftNonGreenCross2 = false;
pixelShiftNonGreenAmaze = false;
@@ -3497,6 +3498,10 @@ int ProcParams::save (const Glib::ustring &fname, const Glib::ustring &fname2, b
keyFile.set_boolean ("RAW Bayer", "pixelShiftLmmse", raw.bayersensor.pixelShiftLmmse );
}
+ if (!pedited || pedited->raw.bayersensor.pixelShiftEqualBright) {
+ keyFile.set_boolean ("RAW Bayer", "pixelShiftEqualBright", raw.bayersensor.pixelShiftEqualBright );
+ }
+
if (!pedited || pedited->raw.bayersensor.pixelShiftNonGreenCross) {
keyFile.set_boolean ("RAW Bayer", "pixelShiftNonGreenCross", raw.bayersensor.pixelShiftNonGreenCross );
}
@@ -7765,6 +7770,14 @@ int ProcParams::load (const Glib::ustring &fname, ParamsEdited* pedited)
}
}
+ if (keyFile.has_key ("RAW Bayer", "pixelShiftEqualBright")) {
+ raw.bayersensor.pixelShiftEqualBright = keyFile.get_boolean("RAW Bayer", "pixelShiftEqualBright");
+
+ if (pedited) {
+ pedited->raw.bayersensor.pixelShiftEqualBright = true;
+ }
+ }
+
if (keyFile.has_key ("RAW Bayer", "pixelShiftNonGreenCross")) {
raw.bayersensor.pixelShiftNonGreenCross = keyFile.get_boolean("RAW Bayer", "pixelShiftNonGreenCross");
@@ -8251,6 +8264,7 @@ bool ProcParams::operator== (const ProcParams& other)
&& raw.bayersensor.pixelShiftSmoothFactor == other.raw.bayersensor.pixelShiftSmoothFactor
&& raw.bayersensor.pixelShiftExp0 == other.raw.bayersensor.pixelShiftExp0
&& raw.bayersensor.pixelShiftLmmse == other.raw.bayersensor.pixelShiftLmmse
+ && raw.bayersensor.pixelShiftEqualBright == other.raw.bayersensor.pixelShiftEqualBright
&& raw.bayersensor.pixelShiftNonGreenCross == other.raw.bayersensor.pixelShiftNonGreenCross
&& raw.bayersensor.pixelShiftNonGreenCross2 == other.raw.bayersensor.pixelShiftNonGreenCross2
&& raw.bayersensor.pixelShiftNonGreenAmaze == other.raw.bayersensor.pixelShiftNonGreenAmaze
diff --git a/rtengine/procparams.h b/rtengine/procparams.h
index 096decd90..77531a072 100644
--- a/rtengine/procparams.h
+++ b/rtengine/procparams.h
@@ -1232,6 +1232,7 @@ public:
double pixelShiftSmoothFactor;
bool pixelShiftExp0;
bool pixelShiftLmmse;
+ bool pixelShiftEqualBright;
bool pixelShiftNonGreenCross;
bool pixelShiftNonGreenCross2;
bool pixelShiftNonGreenAmaze;
diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc
index 2cb642285..1c4b771ea 100644
--- a/rtengine/rawimagesource.cc
+++ b/rtengine/rawimagesource.cc
@@ -2029,7 +2029,9 @@ void RawImageSource::demosaic(const RAWParams &raw)
} else {
RAWParams::BayerSensor bayerParams = raw.bayersensor;
if(bayerParams.pixelShiftMotionCorrectionMethod == RAWParams::BayerSensor::Automatic) {
+ bool pixelShiftEqualBright = bayerParams.pixelShiftEqualBright;
bayerParams.setPixelShiftDefaults();
+ bayerParams.pixelShiftEqualBright = pixelShiftEqualBright;
} else if(bayerParams.pixelShiftMotionCorrectionMethod == RAWParams::BayerSensor::Off) {
bayerParams.pixelShiftMotion = 0;
bayerParams.pixelShiftAutomatic = false;
@@ -2038,7 +2040,9 @@ void RawImageSource::demosaic(const RAWParams &raw)
if(!bayerParams.pixelshiftShowMotion || bayerParams.pixelShiftNonGreenAmaze || bayerParams.pixelShiftNonGreenCross2 || (bayerParams.pixelShiftBlur && bayerParams.pixelShiftSmoothFactor > 0.0)) {
if((bayerParams.pixelShiftMotion > 0 || bayerParams.pixelShiftAutomatic) && numFrames == 4) {
if(bayerParams.pixelShiftMedian) { // We need the amaze demosaiced frames for motion correction
+#ifdef PIXELSHIFTDEV
if(!bayerParams.pixelShiftMedian3) {
+#endif
if(bayerParams.pixelShiftLmmse) {
lmmse_interpolate_omp(W, H, *(rawDataFrames[0]), red, green, blue, raw.bayersensor.lmmse_iterations);
} else {
@@ -2066,6 +2070,7 @@ void RawImageSource::demosaic(const RAWParams &raw)
blue[i][j] = median(blue[i][j],blueTmp[0][i+1][j],blueTmp[1][i+1][j+1],blueTmp[2][i][j+1]);
}
}
+#ifdef PIXELSHIFTDEV
} else {
multi_array2D redTmp(W,H);
multi_array2D greenTmp(W,H);
@@ -2135,6 +2140,7 @@ void RawImageSource::demosaic(const RAWParams &raw)
}
}
}
+#endif
} else {
if(bayerParams.pixelShiftLmmse) {
lmmse_interpolate_omp(W, H, rawData, red, green, blue, raw.bayersensor.lmmse_iterations);
diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc
index d759f6866..fa673b0eb 100644
--- a/rtengine/refreshmap.cc
+++ b/rtengine/refreshmap.cc
@@ -498,7 +498,8 @@ int refreshmap[rtengine::NUMOFEVENTS] = {
DEMOSAIC, // EvPixelShiftMedian3
DEMOSAIC, // EvPixelShiftMotionMethod
DEMOSAIC, // EvPixelShiftSmooth
- DEMOSAIC // EvPixelShiftLmmse
+ DEMOSAIC, // EvPixelShiftLmmse
+ DEMOSAIC // EvPixelShiftEqualBright
};
diff --git a/rtgui/bayerprocess.cc b/rtgui/bayerprocess.cc
index dbf41781a..af079e5fa 100644
--- a/rtgui/bayerprocess.cc
+++ b/rtgui/bayerprocess.cc
@@ -73,7 +73,7 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA
}
dcbIterations->show();
- dcbEnhance = Gtk::manage (new Gtk::CheckButton(M("TP_RAW_DCBENHANCE")));
+ dcbEnhance = Gtk::manage (new MyCheckButton(M("TP_RAW_DCBENHANCE")));
dcbOptions->pack_start(*dcbIterations);
dcbOptions->pack_start(*dcbEnhance);
pack_start( *dcbOptions, Gtk::PACK_SHRINK, 4);
@@ -96,6 +96,10 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA
pixelShiftFrame = Gtk::manage (new Gtk::VBox ());
pixelShiftFrame->set_border_width(0);
+ pixelShiftEqualBright = Gtk::manage (new MyCheckButton(M("TP_RAW_PIXELSHIFTEQUALBRIGHT")));
+ pixelShiftEqualBright->set_tooltip_text (M("TP_RAW_PIXELSHIFTEQUALBRIGHT_TOOLTIP"));
+ pixelShiftFrame->pack_start(*pixelShiftEqualBright);
+
Gtk::HBox* hb3 = Gtk::manage (new Gtk::HBox ());
hb3->pack_start (*Gtk::manage (new Gtk::Label ( M("TP_RAW_PIXELSHIFTMOTIONMETHOD") + ": ")), Gtk::PACK_SHRINK, 4);
pixelShiftMotionMethod = Gtk::manage (new MyComboBoxText ());
@@ -110,24 +114,44 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA
pixelShiftOptions = Gtk::manage (new Gtk::VBox ());
pixelShiftOptions->set_border_width(0);
- pixelShiftShowMotion = Gtk::manage (new Gtk::CheckButton(M("TP_RAW_PIXELSHIFTSHOWMOTION")));
+ pixelShiftShowMotion = Gtk::manage (new MyCheckButton(M("TP_RAW_PIXELSHIFTSHOWMOTION")));
pixelShiftShowMotion->set_tooltip_text (M("TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP"));
pixelShiftFrame->pack_start(*pixelShiftShowMotion);
- pixelShiftShowMotionMaskOnly = Gtk::manage (new Gtk::CheckButton(M("TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY")));
+ pixelShiftShowMotionMaskOnly = Gtk::manage (new MyCheckButton(M("TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY")));
pixelShiftShowMotionMaskOnly->set_tooltip_text (M("TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP"));
pixelShiftFrame->pack_start(*pixelShiftShowMotionMaskOnly);
- pixelShiftAutomatic = Gtk::manage (new Gtk::CheckButton(M("TP_RAW_PIXELSHIFTADAPTIVE")));
+#ifdef PIXELSHIFTDEV
+ pixelShiftAutomatic = Gtk::manage (new MyCheckButton(M("TP_RAW_PIXELSHIFTADAPTIVE")));
pixelShiftOptions->pack_start(*pixelShiftAutomatic);
-
- pixelShiftGreen = Gtk::manage (new Gtk::CheckButton(M("TP_RAW_PIXELSHIFTGREEN")));
+#endif
+ pixelShiftGreen = Gtk::manage (new MyCheckButton(M("TP_RAW_PIXELSHIFTGREEN")));
pixelShiftOptions->pack_start(*pixelShiftGreen);
- pixelShiftBlur = Gtk::manage (new Gtk::CheckButton(M("TP_RAW_PIXELSHIFTBLUR")));
- pixelShiftBlur->set_tooltip_text (M("TP_RAW_PIXELSHIFTBLUR_TOOLTIP"));
+ pixelShiftNonGreenCross = Gtk::manage (new MyCheckButton(M("TP_RAW_PIXELSHIFTNONGREENCROSS")));
+ pixelShiftOptions->pack_start(*pixelShiftNonGreenCross);
+
+ pixelShiftHoleFill = Gtk::manage (new MyCheckButton(M("TP_RAW_PIXELSHIFTHOLEFILL")));
+ pixelShiftHoleFill->set_tooltip_text (M("TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP"));
+ pixelShiftOptions->pack_start(*pixelShiftHoleFill);
+
+ pixelShiftBlur = Gtk::manage (new MyCheckButton(M("TP_RAW_PIXELSHIFTBLUR")));
+ pixelShiftBlur->set_tooltip_text (M("TP_RAW_PIXELSHIFTSIGMA_TOOLTIP"));
pixelShiftOptions->pack_start(*pixelShiftBlur);
+ pixelShiftSigma = Gtk::manage (new Adjuster (M("TP_RAW_PIXELSHIFTSIGMA"), 0.5, 25, 0.1, 1.0));
+ pixelShiftSigma->set_tooltip_text (M("TP_RAW_PIXELSHIFTSIGMA_TOOLTIP"));
+ pixelShiftSigma->setAdjusterListener (this);
+
+ if (pixelShiftSigma->delay < options.adjusterMaxDelay) {
+ pixelShiftSigma->delay = options.adjusterMaxDelay;
+ }
+
+ pixelShiftSigma->show();
+ pixelShiftOptions->pack_start(*pixelShiftSigma);
+
+
pixelShiftSmooth = Gtk::manage (new Adjuster (M("TP_RAW_PIXELSHIFTSMOOTH"), 0, 1, 0.05, 0.7));
pixelShiftSmooth->set_tooltip_text (M("TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP"));
pixelShiftSmooth->setAdjusterListener (this);
@@ -139,39 +163,48 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA
pixelShiftSmooth->show();
pixelShiftOptions->pack_start(*pixelShiftSmooth);
- pixelShiftHoleFill = Gtk::manage (new Gtk::CheckButton(M("TP_RAW_PIXELSHIFTHOLEFILL")));
- pixelShiftHoleFill->set_tooltip_text (M("TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP"));
- pixelShiftOptions->pack_start(*pixelShiftHoleFill);
+ pixelShiftEperIso = Gtk::manage (new Adjuster (M("TP_RAW_PIXELSHIFTEPERISO"), -5.0, 5.0, 0.05, 0.0));
+ pixelShiftEperIso->set_tooltip_text(M("TP_RAW_PIXELSHIFTEPERISO_TOOLTIP"));
+ pixelShiftEperIso->setAdjusterListener (this);
- pixelShiftMedian = Gtk::manage (new Gtk::CheckButton(M("TP_RAW_PIXELSHIFTMEDIAN")));
+ if (pixelShiftEperIso->delay < options.adjusterMaxDelay) {
+ pixelShiftEperIso->delay = options.adjusterMaxDelay;
+ }
+
+ pixelShiftEperIso->show();
+ pixelShiftOptions->pack_start(*pixelShiftEperIso);
+
+
+ pixelShiftMedian = Gtk::manage (new MyCheckButton(M("TP_RAW_PIXELSHIFTMEDIAN")));
pixelShiftMedian->set_tooltip_text (M("TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP"));
pixelShiftOptions->pack_start(*pixelShiftMedian);
- pixelShiftMedian3 = Gtk::manage (new Gtk::CheckButton(M("TP_RAW_PIXELSHIFTMEDIAN3")));
+
+#ifdef PIXELSHIFTDEV
+ pixelShiftMedian3 = Gtk::manage (new MyCheckButton(M("TP_RAW_PIXELSHIFTMEDIAN3")));
pixelShiftMedian3->set_tooltip_text (M("TP_RAW_PIXELSHIFTMEDIAN3_TOOLTIP"));
pixelShiftOptions->pack_start(*pixelShiftMedian3);
- pixelShiftNonGreenCross = Gtk::manage (new Gtk::CheckButton(M("TP_RAW_PIXELSHIFTNONGREENCROSS")));
- pixelShiftOptions->pack_start(*pixelShiftNonGreenCross);
-
- pixelShiftNonGreenCross2 = Gtk::manage (new Gtk::CheckButton(M("TP_RAW_PIXELSHIFTNONGREENCROSS2")));
+ pixelShiftNonGreenCross2 = Gtk::manage (new MyCheckButton(M("TP_RAW_PIXELSHIFTNONGREENCROSS2")));
pixelShiftOptions->pack_start(*pixelShiftNonGreenCross2);
- pixelShiftNonGreenAmaze = Gtk::manage (new Gtk::CheckButton(M("TP_RAW_PIXELSHIFTNONGREENAMAZE")));
+ pixelShiftNonGreenAmaze = Gtk::manage (new MyCheckButton(M("TP_RAW_PIXELSHIFTNONGREENAMAZE")));
pixelShiftOptions->pack_start(*pixelShiftNonGreenAmaze);
- pixelShiftNonGreenHorizontal = Gtk::manage (new Gtk::CheckButton(M("TP_RAW_PIXELSHIFTNONGREENHORIZONTAL")));
+ pixelShiftNonGreenHorizontal = Gtk::manage (new MyCheckButton(M("TP_RAW_PIXELSHIFTNONGREENHORIZONTAL")));
pixelShiftOptions->pack_start(*pixelShiftNonGreenHorizontal);
- pixelShiftNonGreenVertical = Gtk::manage (new Gtk::CheckButton(M("TP_RAW_PIXELSHIFTNONGREENVERTICAL")));
+ pixelShiftNonGreenVertical = Gtk::manage (new MyCheckButton(M("TP_RAW_PIXELSHIFTNONGREENVERTICAL")));
pixelShiftOptions->pack_start(*pixelShiftNonGreenVertical);
- pixelShiftExp0 = Gtk::manage (new Gtk::CheckButton(M("TP_RAW_PIXELSHIFTEXP0")));
+ pixelShiftExp0 = Gtk::manage (new MyCheckButton(M("TP_RAW_PIXELSHIFTEXP0")));
pixelShiftOptions->pack_start(*pixelShiftExp0);
-
- pixelShiftLmmse = Gtk::manage (new Gtk::CheckButton(M("TP_RAW_PIXELSHIFTLMMSE")));
+#endif
+ pixelShiftLmmse = Gtk::manage (new MyCheckButton(M("TP_RAW_PIXELSHIFTLMMSE")));
+ pixelShiftLmmse->set_tooltip_text (M("TP_RAW_PIXELSHIFTLMMSE_TOOLTIP"));
pixelShiftOptions->pack_start(*pixelShiftLmmse);
+#ifdef PIXELSHIFTDEV
pixelShiftMotion = Gtk::manage (new Adjuster (M("TP_RAW_PIXELSHIFTMOTION"), 0, 100, 1, 70));
pixelShiftMotion->setAdjusterListener (this);
pixelShiftMotion->set_tooltip_text (M("TP_RAW_PIXELSHIFTMOTION_TOOLTIP"));
@@ -182,7 +215,6 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA
pixelShiftMotion->show();
pixelShiftOptions->pack_start(*pixelShiftMotion);
-
Gtk::HBox* hb2 = Gtk::manage (new Gtk::HBox ());
hb2->pack_start (*Gtk::manage (new Gtk::Label ( M("TP_RAW_PIXELSHIFTMOTIONCORRECTION") + ": ")), Gtk::PACK_SHRINK, 0);
pixelShiftMotionCorrection = Gtk::manage (new MyComboBoxText ());
@@ -196,7 +228,6 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA
pixelShiftMotionCorrection->show();
hb2->pack_start(*pixelShiftMotionCorrection);
pixelShiftOptions->pack_start(*hb2);
-
pixelShiftStddevFactorGreen = Gtk::manage (new Adjuster (M("TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN"), 2, 8, 0.1, 5));
pixelShiftStddevFactorGreen->setAdjusterListener (this);
@@ -226,17 +257,9 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA
pixelShiftStddevFactorBlue->show();
pixelShiftOptions->pack_start(*pixelShiftStddevFactorBlue);
+#endif
- pixelShiftEperIso = Gtk::manage (new Adjuster (M("TP_RAW_PIXELSHIFTEPERISO"), -5.0, 5.0, 0.05, 0.0));
- pixelShiftEperIso->setAdjusterListener (this);
-
- if (pixelShiftEperIso->delay < options.adjusterMaxDelay) {
- pixelShiftEperIso->delay = options.adjusterMaxDelay;
- }
-
- pixelShiftEperIso->show();
- pixelShiftOptions->pack_start(*pixelShiftEperIso);
-
+#ifdef PIXELSHIFTDEV
pixelShiftNreadIso = Gtk::manage (new Adjuster (M("TP_RAW_PIXELSHIFTNREADISO"), -2.0, 2.0, 0.05, 0.0));
pixelShiftNreadIso->setAdjusterListener (this);
@@ -258,16 +281,6 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA
pixelShiftPrnu->show();
pixelShiftOptions->pack_start(*pixelShiftPrnu);
- pixelShiftSigma = Gtk::manage (new Adjuster (M("TP_RAW_PIXELSHIFTSIGMA"), 0.5, 25, 0.1, 1.0));
- pixelShiftSigma->setAdjusterListener (this);
-
- if (pixelShiftSigma->delay < options.adjusterMaxDelay) {
- pixelShiftSigma->delay = options.adjusterMaxDelay;
- }
-
- pixelShiftSigma->show();
- pixelShiftOptions->pack_start(*pixelShiftSigma);
-
pixelShiftSum = Gtk::manage (new Adjuster (M("TP_RAW_PIXELSHIFTMASKTHRESHOLD"), 1.0, 8.0, 0.1, 3.0));
pixelShiftSum->setAdjusterListener (this);
@@ -287,6 +300,7 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA
pixelShiftRedBlueWeight->show();
pixelShiftOptions->pack_start(*pixelShiftRedBlueWeight);
+#endif
pixelShiftFrame->pack_start(*pixelShiftOptions);
pixelShiftOptions->hide();
@@ -296,40 +310,42 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA
//pack_start( *Gtk::manage( new Gtk::HSeparator()), Gtk::PACK_SHRINK, 0 );
//allOptions = Gtk::manage (new Gtk::VBox ());
//allOptions->set_border_width(2);
- //allEnhance = Gtk::manage (new Gtk::CheckButton(M("TP_RAW_ALLENHANCE")));
+ //allEnhance = Gtk::manage (new MyCheckButton(M("TP_RAW_ALLENHANCE")));
//allOptions->pack_start(*allEnhance);
//pack_start( *allOptions, Gtk::PACK_SHRINK, 4);
- methodconn = method->signal_changed().connect( sigc::mem_fun(*this, &BayerProcess::methodChanged) );
- psmcconn = pixelShiftMotionCorrection->signal_changed().connect( sigc::mem_fun(*this, &BayerProcess::psMotionCorrectionChanged) );
- imagenumberconn = imageNumber->signal_changed().connect( sigc::mem_fun(*this, &BayerProcess::imageNumberChanged) );
- dcbEnhconn = dcbEnhance->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::dcbEnhanceChanged), true);
- pixelShiftMotionMethodConn = pixelShiftMotionMethod->signal_changed().connect( sigc::mem_fun(*this, &BayerProcess::pixelShiftMotionMethodChanged) );
- pixelShiftShowMotionconn = pixelShiftShowMotion->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftShowMotionChanged), true);
- pixelShiftShowMotionMaskOnlyconn = pixelShiftShowMotionMaskOnly->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftShowMotionMaskOnlyChanged), true);
- pixelShiftAutomaticconn = pixelShiftAutomatic->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftAutomaticChanged), true);
- pixelShiftNonGreenHorizontalconn = pixelShiftNonGreenHorizontal->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftNonGreenHorizontalChanged), true);
- pixelShiftNonGreenVerticalconn = pixelShiftNonGreenVertical->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftNonGreenVerticalChanged), true);
- pixelShiftHoleFillconn = pixelShiftHoleFill->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftHoleFillChanged), true);
- pixelShiftMedianconn = pixelShiftMedian->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftMedianChanged), true);
- pixelShiftMedian3conn = pixelShiftMedian3->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftMedian3Changed), true);
- pixelShiftGreenconn = pixelShiftGreen->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftGreenChanged), true);
- pixelShiftBlurconn = pixelShiftBlur->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftBlurChanged), true);
- pixelShiftExp0conn = pixelShiftExp0->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftExp0Changed), true);
- pixelShiftLmmseconn = pixelShiftLmmse->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftLmmseChanged), true);
- pixelShiftNonGreenCrossconn = pixelShiftNonGreenCross->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftNonGreenCrossChanged), true);
- pixelShiftNonGreenCross2conn = pixelShiftNonGreenCross2->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftNonGreenCross2Changed), true);
- pixelShiftNonGreenAmazeconn = pixelShiftNonGreenAmaze->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftNonGreenAmazeChanged), true);
+ method->connect(method->signal_changed().connect( sigc::mem_fun(*this, &BayerProcess::methodChanged) ));
+ imageNumber->connect(imageNumber->signal_changed().connect( sigc::mem_fun(*this, &BayerProcess::imageNumberChanged) ));
+ dcbEnhance->connect ( dcbEnhance->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::dcbEnhanceChanged), true));
+ pixelShiftMotionMethod->connect(pixelShiftMotionMethod->signal_changed().connect( sigc::mem_fun(*this, &BayerProcess::pixelShiftMotionMethodChanged) ));
+ pixelShiftShowMotion->connect(pixelShiftShowMotion->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftShowMotionChanged), true));
+ pixelShiftShowMotionMaskOnly->connect(pixelShiftShowMotionMaskOnly->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftShowMotionMaskOnlyChanged), true));
+ pixelShiftHoleFill->connect(pixelShiftHoleFill->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftHoleFillChanged), true));
+ pixelShiftMedian->connect(pixelShiftMedian->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftMedianChanged), true));
+ pixelShiftGreen->connect(pixelShiftGreen->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftGreenChanged), true));
+ pixelShiftBlur->connect(pixelShiftBlur->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftBlurChanged), true));
+ pixelShiftLmmse->connect(pixelShiftLmmse->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftLmmseChanged), true));
+ pixelShiftEqualBright->connect(pixelShiftEqualBright->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftEqualBrightChanged), true));
+ pixelShiftNonGreenCross->connect(pixelShiftNonGreenCross->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftNonGreenCrossChanged), true));
+#ifdef PIXELSHIFTDEV
+ pixelShiftMotionCorrection->connect(pixelShiftMotionCorrection->signal_changed().connect( sigc::mem_fun(*this, &BayerProcess::psMotionCorrectionChanged) ));
+ pixelShiftAutomatic->connect(pixelShiftAutomatic->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftAutomaticChanged), true));
+ pixelShiftNonGreenHorizontal->connect(pixelShiftNonGreenHorizontal->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftNonGreenHorizontalChanged), true));
+ pixelShiftNonGreenVertical->connect(pixelShiftNonGreenVertical->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftNonGreenVerticalChanged), true));
+ pixelShiftMedian3->connect(pixelShiftMedian3->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftMedian3Changed), true));
+ pixelShiftExp0->connect(pixelShiftExp0->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftExp0Changed), true));
+ pixelShiftNonGreenCross2->connect(pixelShiftNonGreenCross2->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftNonGreenCross2Changed), true));
+ pixelShiftNonGreenAmaze->connect(pixelShiftNonGreenAmaze->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftNonGreenAmazeChanged), true));
+#endif
}
void BayerProcess::read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited)
{
disableListener ();
- methodconn.block (true);
- dcbEnhconn.block (true);
- imagenumberconn.block (true);
- psmcconn.block (true);
+ method->block (true);
+ dcbEnhance->block (true);
+ imageNumber->block (true);
//allEnhconn.block (true);
method->set_active(procparams::RAWParams::BayerSensor::numMethods);
@@ -349,31 +365,34 @@ void BayerProcess::read(const rtengine::procparams::ProcParams* pp, const Params
dcbEnhance->set_inconsistent(!pedited->raw.bayersensor.dcbEnhance);
pixelShiftShowMotion->set_inconsistent(!pedited->raw.bayersensor.pixelshiftShowMotion);
pixelShiftShowMotionMaskOnly->set_inconsistent(!pedited->raw.bayersensor.pixelshiftShowMotionMaskOnly);
- pixelShiftAutomatic->set_inconsistent(!pedited->raw.bayersensor.pixelShiftAutomatic);
- pixelShiftNonGreenHorizontal->set_inconsistent(!pedited->raw.bayersensor.pixelShiftNonGreenHorizontal);
- pixelShiftNonGreenVertical->set_inconsistent(!pedited->raw.bayersensor.pixelShiftNonGreenVertical);
pixelShiftHoleFill->set_inconsistent(!pedited->raw.bayersensor.pixelShiftHoleFill);
pixelShiftMedian->set_inconsistent(!pedited->raw.bayersensor.pixelShiftMedian);
- pixelShiftMedian3->set_inconsistent(!pedited->raw.bayersensor.pixelShiftMedian3);
pixelShiftGreen->set_inconsistent(!pedited->raw.bayersensor.pixelShiftGreen);
pixelShiftBlur->set_inconsistent(!pedited->raw.bayersensor.pixelShiftBlur);
pixelShiftSmooth->setEditedState ( pedited->raw.bayersensor.pixelShiftSmooth ? Edited : UnEdited);
- pixelShiftExp0->set_inconsistent(!pedited->raw.bayersensor.pixelShiftExp0);
pixelShiftLmmse->set_inconsistent(!pedited->raw.bayersensor.pixelShiftLmmse);
+ pixelShiftEqualBright->set_inconsistent(!pedited->raw.bayersensor.pixelShiftEqualBright);
pixelShiftNonGreenCross->set_inconsistent(!pedited->raw.bayersensor.pixelShiftNonGreenCross);
- pixelShiftNonGreenCross2->set_inconsistent(!pedited->raw.bayersensor.pixelShiftNonGreenCross2);
- pixelShiftNonGreenAmaze->set_inconsistent(!pedited->raw.bayersensor.pixelShiftNonGreenAmaze);
lmmseIterations->setEditedState ( pedited->raw.bayersensor.lmmseIterations ? Edited : UnEdited);
- pixelShiftMotion->setEditedState ( pedited->raw.bayersensor.pixelShiftMotion ? Edited : UnEdited);
+ pixelShiftEperIso->setEditedState ( pedited->raw.bayersensor.pixelShiftEperIso ? Edited : UnEdited);
+ pixelShiftSigma->setEditedState ( pedited->raw.bayersensor.pixelShiftSigma ? Edited : UnEdited);
+#ifdef PIXELSHIFTDEV
+ pixelShiftNreadIso->setEditedState ( pedited->raw.bayersensor.pixelShiftNreadIso ? Edited : UnEdited);
+ pixelShiftPrnu->setEditedState ( pedited->raw.bayersensor.pixelShiftPrnu ? Edited : UnEdited);
pixelShiftStddevFactorGreen->setEditedState ( pedited->raw.bayersensor.pixelShiftStddevFactorGreen ? Edited : UnEdited);
pixelShiftStddevFactorRed->setEditedState ( pedited->raw.bayersensor.pixelShiftStddevFactorRed ? Edited : UnEdited);
pixelShiftStddevFactorBlue->setEditedState ( pedited->raw.bayersensor.pixelShiftStddevFactorBlue ? Edited : UnEdited);
- pixelShiftEperIso->setEditedState ( pedited->raw.bayersensor.pixelShiftEperIso ? Edited : UnEdited);
- pixelShiftNreadIso->setEditedState ( pedited->raw.bayersensor.pixelShiftNreadIso ? Edited : UnEdited);
- pixelShiftPrnu->setEditedState ( pedited->raw.bayersensor.pixelShiftPrnu ? Edited : UnEdited);
- pixelShiftSigma->setEditedState ( pedited->raw.bayersensor.pixelShiftSigma ? Edited : UnEdited);
pixelShiftSum->setEditedState ( pedited->raw.bayersensor.pixelShiftSum ? Edited : UnEdited);
+ pixelShiftAutomatic->set_inconsistent(!pedited->raw.bayersensor.pixelShiftAutomatic);
+ pixelShiftNonGreenHorizontal->set_inconsistent(!pedited->raw.bayersensor.pixelShiftNonGreenHorizontal);
+ pixelShiftNonGreenVertical->set_inconsistent(!pedited->raw.bayersensor.pixelShiftNonGreenVertical);
+ pixelShiftMedian3->set_inconsistent(!pedited->raw.bayersensor.pixelShiftMedian3);
+ pixelShiftExp0->set_inconsistent(!pedited->raw.bayersensor.pixelShiftExp0);
+ pixelShiftNonGreenCross2->set_inconsistent(!pedited->raw.bayersensor.pixelShiftNonGreenCross2);
+ pixelShiftNonGreenAmaze->set_inconsistent(!pedited->raw.bayersensor.pixelShiftNonGreenAmaze);
+ pixelShiftMotion->setEditedState ( pedited->raw.bayersensor.pixelShiftMotion ? Edited : UnEdited);
pixelShiftRedBlueWeight->setEditedState ( pedited->raw.bayersensor.pixelShiftRedBlueWeight ? Edited : UnEdited);
+#endif
if(!pedited->raw.bayersensor.method) {
method->set_active(procparams::RAWParams::BayerSensor::numMethods); // No name
@@ -381,9 +400,11 @@ void BayerProcess::read(const rtengine::procparams::ProcParams* pp, const Params
if(!pedited->raw.bayersensor.imageNum) {
imageNumber->set_active_text(M("GENERAL_UNCHANGED"));
}
+#ifdef PIXELSHIFTDEV
if(!pedited->raw.bayersensor.pixelShiftMotionCorrection) {
pixelShiftMotionCorrection->set_active_text(M("GENERAL_UNCHANGED"));
}
+#endif
if(!pedited->raw.bayersensor.pixelShiftMotionCorrectionMethod) {
pixelShiftMotionMethod->set_active_text(M("GENERAL_UNCHANGED"));
}
@@ -395,39 +416,41 @@ void BayerProcess::read(const rtengine::procparams::ProcParams* pp, const Params
dcbEnhance->set_active(pp->raw.bayersensor.dcb_enhance);
pixelShiftShowMotion->set_active(pp->raw.bayersensor.pixelshiftShowMotion);
pixelShiftShowMotionMaskOnly->set_active(pp->raw.bayersensor.pixelshiftShowMotionMaskOnly);
- pixelShiftAutomatic->set_active(pp->raw.bayersensor.pixelShiftAutomatic);
- pixelShiftNonGreenHorizontal->set_active(pp->raw.bayersensor.pixelShiftNonGreenHorizontal);
- pixelShiftNonGreenVertical->set_active(pp->raw.bayersensor.pixelShiftNonGreenVertical);
pixelShiftHoleFill->set_active(pp->raw.bayersensor.pixelShiftHoleFill);
pixelShiftMedian->set_active(pp->raw.bayersensor.pixelShiftMedian);
- pixelShiftMedian3->set_active(pp->raw.bayersensor.pixelShiftMedian3);
pixelShiftGreen->set_active(pp->raw.bayersensor.pixelShiftGreen);
pixelShiftBlur->set_active(pp->raw.bayersensor.pixelShiftBlur);
pixelShiftSmooth->setValue (pp->raw.bayersensor.pixelShiftSmoothFactor);
- pixelShiftExp0->set_active(pp->raw.bayersensor.pixelShiftExp0);
pixelShiftLmmse->set_active(pp->raw.bayersensor.pixelShiftLmmse);
+ pixelShiftEqualBright->set_active(pp->raw.bayersensor.pixelShiftEqualBright);
pixelShiftNonGreenCross->set_active(pp->raw.bayersensor.pixelShiftNonGreenCross);
- pixelShiftNonGreenCross2->set_active(pp->raw.bayersensor.pixelShiftNonGreenCross2);
- pixelShiftNonGreenAmaze->set_active(pp->raw.bayersensor.pixelShiftNonGreenAmaze);
ccSteps->setValue (pp->raw.bayersensor.ccSteps);
lmmseIterations->setValue (pp->raw.bayersensor.lmmse_iterations);
- pixelShiftMotion->setValue (pp->raw.bayersensor.pixelShiftMotion);
- pixelShiftMotionCorrection->set_active ((int)pp->raw.bayersensor.pixelShiftMotionCorrection);
pixelShiftMotionMethod->set_active ((int)pp->raw.bayersensor.pixelShiftMotionCorrectionMethod);
+ pixelShiftEperIso->setValue (pp->raw.bayersensor.pixelShiftEperIso);
+ pixelShiftSigma->setValue (pp->raw.bayersensor.pixelShiftSigma);
+#ifdef PIXELSHIFTDEV
pixelShiftStddevFactorGreen->setValue (pp->raw.bayersensor.pixelShiftStddevFactorGreen);
pixelShiftStddevFactorRed->setValue (pp->raw.bayersensor.pixelShiftStddevFactorRed);
pixelShiftStddevFactorBlue->setValue (pp->raw.bayersensor.pixelShiftStddevFactorBlue);
- pixelShiftEperIso->setValue (pp->raw.bayersensor.pixelShiftEperIso);
- pixelShiftNreadIso->setValue (pp->raw.bayersensor.pixelShiftNreadIso);
- pixelShiftPrnu->setValue (pp->raw.bayersensor.pixelShiftPrnu);
- pixelShiftSigma->setValue (pp->raw.bayersensor.pixelShiftSigma);
pixelShiftSum->setValue (pp->raw.bayersensor.pixelShiftSum);
- pixelShiftRedBlueWeight->setValue (pp->raw.bayersensor.pixelShiftRedBlueWeight);
-
+ pixelShiftMedian3->set_active(pp->raw.bayersensor.pixelShiftMedian3);
+ pixelShiftMedian3->set_sensitive(pixelShiftMedian->get_active());
+ pixelShiftAutomatic->set_active(pp->raw.bayersensor.pixelShiftAutomatic);
+ pixelShiftNonGreenHorizontal->set_active(pp->raw.bayersensor.pixelShiftNonGreenHorizontal);
+ pixelShiftNonGreenVertical->set_active(pp->raw.bayersensor.pixelShiftNonGreenVertical);
+ pixelShiftExp0->set_active(pp->raw.bayersensor.pixelShiftExp0);
+ pixelShiftNonGreenCross2->set_active(pp->raw.bayersensor.pixelShiftNonGreenCross2);
+ pixelShiftNonGreenAmaze->set_active(pp->raw.bayersensor.pixelShiftNonGreenAmaze);
+ pixelShiftMotion->setValue (pp->raw.bayersensor.pixelShiftMotion);
+ pixelShiftMotionCorrection->set_active ((int)pp->raw.bayersensor.pixelShiftMotionCorrection);
pixelShiftHoleFill->set_sensitive(pixelShiftAutomatic->get_active () && pixelShiftMotionCorrection->get_active_row_number() == 5);
pixelShiftBlur->set_sensitive(pixelShiftAutomatic->get_active () && pixelShiftMotionCorrection->get_active_row_number() == 5);
pixelShiftSmooth->set_sensitive(pixelShiftAutomatic->get_active () && pixelShiftMotionCorrection->get_active_row_number() == 5 && pixelShiftBlur->get_active());
-
+ pixelShiftNreadIso->setValue (pp->raw.bayersensor.pixelShiftNreadIso);
+ pixelShiftPrnu->setValue (pp->raw.bayersensor.pixelShiftPrnu);
+ pixelShiftRedBlueWeight->setValue (pp->raw.bayersensor.pixelShiftRedBlueWeight);
+#endif
if (!batchMode) {
if (pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::methodstring[procparams::RAWParams::BayerSensor::dcb] ||
method->get_active_row_number() == procparams::RAWParams::BayerSensor::numMethods) {
@@ -462,13 +485,34 @@ void BayerProcess::read(const rtengine::procparams::ProcParams* pp, const Params
ccSteps->hide();*/
}
- lastDCBen = pp->raw.bayersensor.dcb_enhance;
+ dcbEnhance->setLastActive(pp->raw.bayersensor.dcb_enhance);
+ pixelShiftShowMotion->setLastActive(pp->raw.bayersensor.pixelshiftShowMotion);
+ pixelShiftShowMotionMaskOnly->setLastActive(pp->raw.bayersensor.pixelshiftShowMotionMaskOnly);
+ pixelShiftNonGreenCross->setLastActive(pp->raw.bayersensor.pixelShiftNonGreenCross);
+ pixelShiftGreen->setLastActive(pp->raw.bayersensor.pixelShiftGreen);
+ pixelShiftBlur->setLastActive(pp->raw.bayersensor.pixelShiftBlur);
+ pixelShiftHoleFill->setLastActive(pp->raw.bayersensor.pixelShiftHoleFill);
+ pixelShiftMedian->setLastActive(pp->raw.bayersensor.pixelShiftMedian);
+ pixelShiftLmmse->setLastActive(pp->raw.bayersensor.pixelShiftLmmse);
+ pixelShiftEqualBright->setLastActive(pp->raw.bayersensor.pixelShiftEqualBright);
+#ifdef PIXELSHIFTDEV
+ pixelShiftMedian3->setLastActive(pp->raw.bayersensor.pixelShiftMedian3);
+ pixelShiftAutomatic->setLastActive(pp->raw.bayersensor.pixelShiftAutomatic);
+ pixelShiftNonGreenHorizontal->setLastActive(pp->raw.bayersensor.pixelShiftNonGreenHorizontal);
+ pixelShiftNonGreenVertical->setLastActive(pp->raw.bayersensor.pixelShiftNonGreenVertical);
+ pixelShiftNonGreenCross2->setLastActive(pp->raw.bayersensor.pixelShiftNonGreenCross2);
+ pixelShiftNonGreenAmaze->setLastActive(pp->raw.bayersensor.pixelShiftNonGreenAmaze);
+ pixelShiftExp0->setLastActive(pp->raw.bayersensor.pixelShiftExp0);
+#endif
+
//lastALLen = pp->raw.bayersensor.all_enhance;
- methodconn.block (false);
- psmcconn.block (false);
- imagenumberconn.block (false);
- dcbEnhconn.block (false);
+ method->block (false);
+#ifdef PIXELSHIFTDEV
+ pixelShiftMotionCorrection->block (false);
+#endif
+ imageNumber->block (false);
+ dcbEnhance->block (false);
//allEnhconn.block (false);
enableListener ();
@@ -481,34 +525,37 @@ void BayerProcess::write( rtengine::procparams::ProcParams* pp, ParamsEdited* pe
pp->raw.bayersensor.dcb_enhance = dcbEnhance->get_active();
//pp->raw.bayersensor.all_enhance = allEnhance->get_active();
pp->raw.bayersensor.lmmse_iterations = lmmseIterations->getIntValue();
- pp->raw.bayersensor.pixelShiftMotion = pixelShiftMotion->getIntValue();
- pp->raw.bayersensor.pixelShiftMotionCorrection = (RAWParams::BayerSensor::ePSMotionCorrection)pixelShiftMotionCorrection->get_active_row_number();
pp->raw.bayersensor.pixelShiftMotionCorrectionMethod = (RAWParams::BayerSensor::ePSMotionCorrectionMethod)pixelShiftMotionMethod->get_active_row_number();
- pp->raw.bayersensor.pixelShiftStddevFactorGreen = pixelShiftStddevFactorGreen->getValue();
- pp->raw.bayersensor.pixelShiftStddevFactorRed = pixelShiftStddevFactorRed->getValue();
- pp->raw.bayersensor.pixelShiftStddevFactorBlue = pixelShiftStddevFactorBlue->getValue();
pp->raw.bayersensor.pixelShiftEperIso = pixelShiftEperIso->getValue();
- pp->raw.bayersensor.pixelShiftNreadIso = pixelShiftNreadIso->getValue();
- pp->raw.bayersensor.pixelShiftPrnu = pixelShiftPrnu->getValue();
pp->raw.bayersensor.pixelShiftSigma = pixelShiftSigma->getValue();
- pp->raw.bayersensor.pixelShiftSum = pixelShiftSum->getValue();
- pp->raw.bayersensor.pixelShiftRedBlueWeight = pixelShiftRedBlueWeight->getValue();
pp->raw.bayersensor.pixelshiftShowMotion = pixelShiftShowMotion->get_active();
pp->raw.bayersensor.pixelshiftShowMotionMaskOnly = pixelShiftShowMotionMaskOnly->get_active();
- pp->raw.bayersensor.pixelShiftAutomatic = pixelShiftAutomatic->get_active();
- pp->raw.bayersensor.pixelShiftNonGreenHorizontal = pixelShiftNonGreenHorizontal->get_active();
- pp->raw.bayersensor.pixelShiftNonGreenVertical = pixelShiftNonGreenVertical->get_active();
pp->raw.bayersensor.pixelShiftHoleFill = pixelShiftHoleFill->get_active();
pp->raw.bayersensor.pixelShiftMedian = pixelShiftMedian->get_active();
- pp->raw.bayersensor.pixelShiftMedian3 = pixelShiftMedian3->get_active();
pp->raw.bayersensor.pixelShiftGreen = pixelShiftGreen->get_active();
pp->raw.bayersensor.pixelShiftBlur = pixelShiftBlur->get_active();
pp->raw.bayersensor.pixelShiftSmoothFactor = pixelShiftSmooth->getValue();
- pp->raw.bayersensor.pixelShiftExp0 = pixelShiftExp0->get_active();
pp->raw.bayersensor.pixelShiftLmmse = pixelShiftLmmse->get_active();
+ pp->raw.bayersensor.pixelShiftEqualBright = pixelShiftEqualBright->get_active();
pp->raw.bayersensor.pixelShiftNonGreenCross = pixelShiftNonGreenCross->get_active();
+#ifdef PIXELSHIFTDEV
+ pp->raw.bayersensor.pixelShiftStddevFactorGreen = pixelShiftStddevFactorGreen->getValue();
+ pp->raw.bayersensor.pixelShiftStddevFactorRed = pixelShiftStddevFactorRed->getValue();
+ pp->raw.bayersensor.pixelShiftStddevFactorBlue = pixelShiftStddevFactorBlue->getValue();
+ pp->raw.bayersensor.pixelShiftSum = pixelShiftSum->getValue();
+ pp->raw.bayersensor.pixelShiftMedian3 = pixelShiftMedian3->get_active();
+ pp->raw.bayersensor.pixelShiftMotion = pixelShiftMotion->getIntValue();
+ pp->raw.bayersensor.pixelShiftMotionCorrection = (RAWParams::BayerSensor::ePSMotionCorrection)pixelShiftMotionCorrection->get_active_row_number();
+ pp->raw.bayersensor.pixelShiftAutomatic = pixelShiftAutomatic->get_active();
+ pp->raw.bayersensor.pixelShiftNonGreenHorizontal = pixelShiftNonGreenHorizontal->get_active();
+ pp->raw.bayersensor.pixelShiftNonGreenVertical = pixelShiftNonGreenVertical->get_active();
+ pp->raw.bayersensor.pixelShiftExp0 = pixelShiftExp0->get_active();
pp->raw.bayersensor.pixelShiftNonGreenCross2 = pixelShiftNonGreenCross2->get_active();
pp->raw.bayersensor.pixelShiftNonGreenAmaze = pixelShiftNonGreenAmaze->get_active();
+ pp->raw.bayersensor.pixelShiftNreadIso = pixelShiftNreadIso->getValue();
+ pp->raw.bayersensor.pixelShiftPrnu = pixelShiftPrnu->getValue();
+ pp->raw.bayersensor.pixelShiftRedBlueWeight = pixelShiftRedBlueWeight->getValue();
+#endif
int currentRow = method->get_active_row_number();
if( currentRow >= 0 && currentRow < procparams::RAWParams::BayerSensor::numMethods) {
@@ -529,34 +576,37 @@ void BayerProcess::write( rtengine::procparams::ProcParams* pp, ParamsEdited* pe
pedited->raw.bayersensor.dcbEnhance = !dcbEnhance->get_inconsistent();
//pedited->raw.bayersensor.allEnhance = !allEnhance->get_inconsistent();
pedited->raw.bayersensor.lmmseIterations = lmmseIterations->getEditedState ();
- pedited->raw.bayersensor.pixelShiftMotion = pixelShiftMotion->getEditedState ();
- pedited->raw.bayersensor.pixelShiftMotionCorrection = pixelShiftMotionCorrection->get_active_text() != M("GENERAL_UNCHANGED");
pedited->raw.bayersensor.pixelShiftMotionCorrectionMethod = pixelShiftMotionMethod->get_active_text() != M("GENERAL_UNCHANGED");
- pedited->raw.bayersensor.pixelShiftStddevFactorGreen = pixelShiftStddevFactorGreen->getEditedState ();
- pedited->raw.bayersensor.pixelShiftStddevFactorRed = pixelShiftStddevFactorRed->getEditedState ();
- pedited->raw.bayersensor.pixelShiftStddevFactorBlue = pixelShiftStddevFactorBlue->getEditedState ();
pedited->raw.bayersensor.pixelShiftEperIso = pixelShiftEperIso->getEditedState ();
- pedited->raw.bayersensor.pixelShiftNreadIso = pixelShiftNreadIso->getEditedState ();
- pedited->raw.bayersensor.pixelShiftPrnu = pixelShiftPrnu->getEditedState ();
pedited->raw.bayersensor.pixelShiftSigma = pixelShiftSigma->getEditedState ();
- pedited->raw.bayersensor.pixelShiftSum = pixelShiftSum->getEditedState ();
- pedited->raw.bayersensor.pixelShiftRedBlueWeight = pixelShiftRedBlueWeight->getEditedState ();
pedited->raw.bayersensor.pixelshiftShowMotion = !pixelShiftShowMotion->get_inconsistent();
pedited->raw.bayersensor.pixelshiftShowMotionMaskOnly = !pixelShiftShowMotionMaskOnly->get_inconsistent();
- pedited->raw.bayersensor.pixelShiftAutomatic = !pixelShiftAutomatic->get_inconsistent();
- pedited->raw.bayersensor.pixelShiftNonGreenHorizontal = !pixelShiftNonGreenHorizontal->get_inconsistent();
- pedited->raw.bayersensor.pixelShiftNonGreenVertical = !pixelShiftNonGreenVertical->get_inconsistent();
pedited->raw.bayersensor.pixelShiftHoleFill = !pixelShiftHoleFill->get_inconsistent();
pedited->raw.bayersensor.pixelShiftMedian = !pixelShiftMedian->get_inconsistent();
- pedited->raw.bayersensor.pixelShiftMedian3 = !pixelShiftMedian3->get_inconsistent();
pedited->raw.bayersensor.pixelShiftGreen = !pixelShiftGreen->get_inconsistent();
pedited->raw.bayersensor.pixelShiftBlur = !pixelShiftBlur->get_inconsistent();
pedited->raw.bayersensor.pixelShiftSmooth = pixelShiftSmooth->getEditedState();
- pedited->raw.bayersensor.pixelShiftExp0 = !pixelShiftExp0->get_inconsistent();
pedited->raw.bayersensor.pixelShiftLmmse = !pixelShiftLmmse->get_inconsistent();
+ pedited->raw.bayersensor.pixelShiftEqualBright = !pixelShiftEqualBright->get_inconsistent();
pedited->raw.bayersensor.pixelShiftNonGreenCross = !pixelShiftNonGreenCross->get_inconsistent();
+#ifdef PIXELSHIFTDEV
+ pedited->raw.bayersensor.pixelShiftStddevFactorGreen = pixelShiftStddevFactorGreen->getEditedState ();
+ pedited->raw.bayersensor.pixelShiftStddevFactorRed = pixelShiftStddevFactorRed->getEditedState ();
+ pedited->raw.bayersensor.pixelShiftStddevFactorBlue = pixelShiftStddevFactorBlue->getEditedState ();
+ pedited->raw.bayersensor.pixelShiftSum = pixelShiftSum->getEditedState ();
+ pedited->raw.bayersensor.pixelShiftMedian3 = !pixelShiftMedian3->get_inconsistent();
+ pedited->raw.bayersensor.pixelShiftMotion = pixelShiftMotion->getEditedState ();
+ pedited->raw.bayersensor.pixelShiftMotionCorrection = pixelShiftMotionCorrection->get_active_text() != M("GENERAL_UNCHANGED");
+ pedited->raw.bayersensor.pixelShiftAutomatic = !pixelShiftAutomatic->get_inconsistent();
+ pedited->raw.bayersensor.pixelShiftNonGreenHorizontal = !pixelShiftNonGreenHorizontal->get_inconsistent();
+ pedited->raw.bayersensor.pixelShiftNonGreenVertical = !pixelShiftNonGreenVertical->get_inconsistent();
+ pedited->raw.bayersensor.pixelShiftExp0 = !pixelShiftExp0->get_inconsistent();
pedited->raw.bayersensor.pixelShiftNonGreenCross2 = !pixelShiftNonGreenCross2->get_inconsistent();
pedited->raw.bayersensor.pixelShiftNonGreenAmaze = !pixelShiftNonGreenAmaze->get_inconsistent();
+ pedited->raw.bayersensor.pixelShiftNreadIso = pixelShiftNreadIso->getEditedState ();
+ pedited->raw.bayersensor.pixelShiftPrnu = pixelShiftPrnu->getEditedState ();
+ pedited->raw.bayersensor.pixelShiftRedBlueWeight = pixelShiftRedBlueWeight->getEditedState ();
+#endif
}
}
@@ -564,8 +614,10 @@ void BayerProcess::setBatchMode(bool batchMode)
{
method->append_text (M("GENERAL_UNCHANGED"));
method->set_active(procparams::RAWParams::BayerSensor::numMethods); // No name
+#ifdef PIXELSHIFTDEV
pixelShiftMotionCorrection->append_text (M("GENERAL_UNCHANGED"));
pixelShiftMotionCorrection->set_active (4);
+#endif
pixelShiftMotionMethod->append_text (M("GENERAL_UNCHANGED"));
pixelShiftMotionMethod->set_active (4);
imageNumber->append_text (M("GENERAL_UNCHANGED"));
@@ -577,61 +629,69 @@ void BayerProcess::setBatchMode(bool batchMode)
ccSteps->showEditedCB ();
dcbIterations->showEditedCB ();
lmmseIterations->showEditedCB ();
+#ifdef PIXELSHIFTDEV
pixelShiftMotion->showEditedCB ();
+ pixelShiftSum->showEditedCB ();
pixelShiftStddevFactorGreen->showEditedCB ();
pixelShiftStddevFactorRed->showEditedCB ();
pixelShiftStddevFactorBlue->showEditedCB ();
- pixelShiftEperIso->showEditedCB ();
pixelShiftNreadIso->showEditedCB ();
pixelShiftPrnu->showEditedCB ();
- pixelShiftSigma->showEditedCB ();
- pixelShiftSum->showEditedCB ();
pixelShiftRedBlueWeight->showEditedCB ();
+#endif
+ pixelShiftEperIso->showEditedCB ();
+ pixelShiftSigma->showEditedCB ();
}
void BayerProcess::setDefaults(const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited)
{
dcbIterations->setDefault( defParams->raw.bayersensor.dcb_iterations);
lmmseIterations->setDefault( defParams->raw.bayersensor.lmmse_iterations);
+#ifdef PIXELSHIFTDEV
pixelShiftMotion->setDefault( defParams->raw.bayersensor.pixelShiftMotion);
+ pixelShiftSum->setDefault( defParams->raw.bayersensor.pixelShiftSum);
pixelShiftStddevFactorGreen->setDefault( defParams->raw.bayersensor.pixelShiftStddevFactorGreen);
pixelShiftStddevFactorRed->setDefault( defParams->raw.bayersensor.pixelShiftStddevFactorRed);
pixelShiftStddevFactorBlue->setDefault( defParams->raw.bayersensor.pixelShiftStddevFactorBlue);
- pixelShiftEperIso->setDefault( defParams->raw.bayersensor.pixelShiftEperIso);
pixelShiftNreadIso->setDefault( defParams->raw.bayersensor.pixelShiftNreadIso);
pixelShiftPrnu->setDefault( defParams->raw.bayersensor.pixelShiftPrnu);
- pixelShiftSigma->setDefault( defParams->raw.bayersensor.pixelShiftSigma);
- pixelShiftSum->setDefault( defParams->raw.bayersensor.pixelShiftSum);
pixelShiftRedBlueWeight->setDefault( defParams->raw.bayersensor.pixelShiftRedBlueWeight);
+#endif
+ pixelShiftEperIso->setDefault( defParams->raw.bayersensor.pixelShiftEperIso);
+ pixelShiftSigma->setDefault( defParams->raw.bayersensor.pixelShiftSigma);
ccSteps->setDefault (defParams->raw.bayersensor.ccSteps);
if (pedited) {
dcbIterations->setDefaultEditedState( pedited->raw.bayersensor.dcbIterations ? Edited : UnEdited);
lmmseIterations->setDefaultEditedState( pedited->raw.bayersensor.lmmseIterations ? Edited : UnEdited);
+#ifdef PIXELSHIFTDEV
pixelShiftMotion->setDefaultEditedState( pedited->raw.bayersensor.pixelShiftMotion ? Edited : UnEdited);
+ pixelShiftSum->setDefaultEditedState( pedited->raw.bayersensor.pixelShiftSum ? Edited : UnEdited);
pixelShiftStddevFactorGreen->setDefaultEditedState( pedited->raw.bayersensor.pixelShiftStddevFactorGreen ? Edited : UnEdited);
pixelShiftStddevFactorRed->setDefaultEditedState( pedited->raw.bayersensor.pixelShiftStddevFactorRed ? Edited : UnEdited);
pixelShiftStddevFactorBlue->setDefaultEditedState( pedited->raw.bayersensor.pixelShiftStddevFactorBlue ? Edited : UnEdited);
- pixelShiftEperIso->setDefaultEditedState( pedited->raw.bayersensor.pixelShiftEperIso ? Edited : UnEdited);
pixelShiftNreadIso->setDefaultEditedState( pedited->raw.bayersensor.pixelShiftNreadIso ? Edited : UnEdited);
pixelShiftPrnu->setDefaultEditedState( pedited->raw.bayersensor.pixelShiftPrnu ? Edited : UnEdited);
- pixelShiftSigma->setDefaultEditedState( pedited->raw.bayersensor.pixelShiftSigma ? Edited : UnEdited);
- pixelShiftSum->setDefaultEditedState( pedited->raw.bayersensor.pixelShiftSum ? Edited : UnEdited);
pixelShiftRedBlueWeight->setDefaultEditedState( pedited->raw.bayersensor.pixelShiftRedBlueWeight ? Edited : UnEdited);
+#endif
+ pixelShiftEperIso->setDefaultEditedState( pedited->raw.bayersensor.pixelShiftEperIso ? Edited : UnEdited);
+ pixelShiftSigma->setDefaultEditedState( pedited->raw.bayersensor.pixelShiftSigma ? Edited : UnEdited);
ccSteps->setDefaultEditedState(pedited->raw.bayersensor.ccSteps ? Edited : UnEdited);
} else {
dcbIterations->setDefaultEditedState( Irrelevant );
lmmseIterations->setDefaultEditedState( Irrelevant );
+#ifdef PIXELSHIFTDEV
pixelShiftMotion->setDefaultEditedState( Irrelevant );
+ pixelShiftSum->setDefaultEditedState( Irrelevant );
pixelShiftStddevFactorGreen->setDefaultEditedState( Irrelevant );
pixelShiftStddevFactorRed->setDefaultEditedState( Irrelevant );
pixelShiftStddevFactorBlue->setDefaultEditedState( Irrelevant );
- pixelShiftEperIso->setDefaultEditedState( Irrelevant );
pixelShiftNreadIso->setDefaultEditedState( Irrelevant );
pixelShiftPrnu->setDefaultEditedState( Irrelevant );
- pixelShiftSigma->setDefaultEditedState( Irrelevant );
- pixelShiftSum->setDefaultEditedState( Irrelevant );
pixelShiftRedBlueWeight->setDefaultEditedState( Irrelevant );
+#endif
+ pixelShiftEperIso->setDefaultEditedState( Irrelevant );
+ pixelShiftSigma->setDefaultEditedState( Irrelevant );
ccSteps->setDefaultEditedState(Irrelevant );
}
}
@@ -645,32 +705,35 @@ void BayerProcess::adjusterChanged (Adjuster* a, double newval)
listener->panelChanged (EvDemosaicFalseColorIter, a->getTextValue() );
} else if (a == lmmseIterations) {
listener->panelChanged (EvDemosaicLMMSEIter, a->getTextValue() );
+#ifdef PIXELSHIFTDEV
} else if (a == pixelShiftMotion) {
listener->panelChanged (EvPixelShiftMotion, a->getTextValue() );
+ } else if (a == pixelShiftSum) {
+ listener->panelChanged (EvPixelShiftSum, a->getTextValue() );
} else if (a == pixelShiftStddevFactorGreen) {
listener->panelChanged (EvPixelShiftStddevFactorGreen, a->getTextValue() );
} else if (a == pixelShiftStddevFactorRed) {
listener->panelChanged (EvPixelShiftStddevFactorRed, a->getTextValue() );
} else if (a == pixelShiftStddevFactorBlue) {
listener->panelChanged (EvPixelShiftStddevFactorBlue, a->getTextValue() );
- } else if (a == pixelShiftEperIso) {
- listener->panelChanged (EvPixelShiftEperIso, a->getTextValue() );
} else if (a == pixelShiftNreadIso) {
listener->panelChanged (EvPixelShiftNreadIso, a->getTextValue() );
} else if (a == pixelShiftPrnu) {
listener->panelChanged (EvPixelShiftPrnu, a->getTextValue() );
- } else if (a == pixelShiftSigma) {
- listener->panelChanged (EvPixelShiftSigma, a->getTextValue() );
- } else if (a == pixelShiftSum) {
- listener->panelChanged (EvPixelShiftSum, a->getTextValue() );
} else if (a == pixelShiftRedBlueWeight) {
listener->panelChanged (EvPixelShiftRedBlueWeight, a->getTextValue() );
+#endif
+ } else if (a == pixelShiftEperIso) {
+ listener->panelChanged (EvPixelShiftEperIso, a->getTextValue() );
+ } else if (a == pixelShiftSigma) {
+ listener->panelChanged (EvPixelShiftSigma, a->getTextValue() );
} else if (a == pixelShiftSmooth) {
listener->panelChanged (EvPixelShiftSmooth, a->getTextValue() );
}
}
}
+#ifdef PIXELSHIFTDEV
void BayerProcess::psMotionCorrectionChanged ()
{
if(pixelShiftMotionCorrection->get_active_row_number() == 5) {
@@ -687,7 +750,7 @@ void BayerProcess::psMotionCorrectionChanged ()
listener->panelChanged (EvPixelShiftMotionCorrection, pixelShiftMotionCorrection->get_active_text());
}
}
-
+#endif
void BayerProcess::methodChanged ()
{
int curSelection = method->get_active_row_number();
@@ -745,14 +808,14 @@ void BayerProcess::dcbEnhanceChanged ()
if (batchMode) {
if (dcbEnhance->get_inconsistent()) {
dcbEnhance->set_inconsistent (false);
- dcbEnhconn.block (true);
+ dcbEnhance->block (true);
dcbEnhance->set_active (false);
- dcbEnhconn.block (false);
- } else if (lastDCBen) {
+ dcbEnhance->block (false);
+ } else if (dcbEnhance->getLastActive()) {
dcbEnhance->set_inconsistent (true);
}
- lastDCBen = dcbEnhance->get_active ();
+ dcbEnhance->setLastActive();
}
if (listener) {
@@ -785,14 +848,14 @@ void BayerProcess::pixelShiftShowMotionChanged ()
if (batchMode) {
if (pixelShiftShowMotion->get_inconsistent()) {
pixelShiftShowMotion->set_inconsistent (false);
- pixelShiftShowMotionconn.block (true);
+ pixelShiftShowMotion->block (true);
pixelShiftShowMotion->set_active (false);
- pixelShiftShowMotionconn.block (false);
- } else if (lastDCBen) {
+ pixelShiftShowMotion->block (false);
+ } else if (pixelShiftShowMotion->getLastActive()) {
pixelShiftShowMotion->set_inconsistent (true);
}
- lastDCBen = pixelShiftShowMotion->get_active ();
+ pixelShiftShowMotion->setLastActive();
}
pixelShiftShowMotionMaskOnly->set_sensitive(pixelShiftShowMotion->get_active ());
if (listener) {
@@ -805,14 +868,14 @@ void BayerProcess::pixelShiftShowMotionMaskOnlyChanged ()
if (batchMode) {
if (pixelShiftShowMotionMaskOnly->get_inconsistent()) {
pixelShiftShowMotionMaskOnly->set_inconsistent (false);
- pixelShiftShowMotionMaskOnlyconn.block (true);
+ pixelShiftShowMotionMaskOnly->block (true);
pixelShiftShowMotionMaskOnly->set_active (false);
- pixelShiftShowMotionMaskOnlyconn.block (false);
- } else if (lastDCBen) {
+ pixelShiftShowMotionMaskOnly->block (false);
+ } else if (pixelShiftShowMotionMaskOnly->getLastActive()) {
pixelShiftShowMotionMaskOnly->set_inconsistent (true);
}
- lastDCBen = pixelShiftShowMotionMaskOnly->get_active ();
+ pixelShiftShowMotionMaskOnly->setLastActive();
}
if (listener) {
@@ -820,19 +883,20 @@ void BayerProcess::pixelShiftShowMotionMaskOnlyChanged ()
}
}
+#ifdef PIXELSHIFTDEV
void BayerProcess::pixelShiftAutomaticChanged ()
{
if (batchMode) {
if (pixelShiftAutomatic->get_inconsistent()) {
pixelShiftAutomatic->set_inconsistent (false);
- pixelShiftAutomaticconn.block (true);
+ pixelShiftAutomatic->block (true);
pixelShiftAutomatic->set_active (false);
- pixelShiftAutomaticconn.block (false);
- } else if (lastDCBen) {
+ pixelShiftAutomatic->block (false);
+ } else if (pixelShiftAutomatic->getLastActive()) {
pixelShiftAutomatic->set_inconsistent (true);
}
- lastDCBen = pixelShiftAutomatic->get_active ();
+ pixelShiftAutomatic->setLastActive();
}
pixelShiftMotion->set_sensitive(!pixelShiftAutomatic->get_active ());
pixelShiftEperIso->set_sensitive(pixelShiftAutomatic->get_active ());
@@ -861,20 +925,19 @@ void BayerProcess::pixelShiftAutomaticChanged ()
}
}
-
void BayerProcess::pixelShiftNonGreenHorizontalChanged ()
{
if (batchMode) {
if (pixelShiftNonGreenHorizontal->get_inconsistent()) {
pixelShiftNonGreenHorizontal->set_inconsistent (false);
- pixelShiftNonGreenHorizontalconn.block (true);
+ pixelShiftNonGreenHorizontal->block (true);
pixelShiftNonGreenHorizontal->set_active (false);
- pixelShiftNonGreenHorizontalconn.block (false);
- } else if (lastDCBen) {
+ pixelShiftNonGreenHorizontal->block (false);
+ } else if (pixelShiftNonGreenHorizontal->getLastActive()) {
pixelShiftNonGreenHorizontal->set_inconsistent (true);
}
- lastDCBen = pixelShiftNonGreenHorizontal->get_active ();
+ pixelShiftNonGreenHorizontal->setLastActive();
}
if (listener) {
@@ -887,34 +950,35 @@ void BayerProcess::pixelShiftNonGreenVerticalChanged ()
if (batchMode) {
if (pixelShiftNonGreenVertical->get_inconsistent()) {
pixelShiftNonGreenVertical->set_inconsistent (false);
- pixelShiftNonGreenVerticalconn.block (true);
+ pixelShiftNonGreenVertical->block (true);
pixelShiftNonGreenVertical->set_active (false);
- pixelShiftNonGreenVerticalconn.block (false);
- } else if (lastDCBen) {
+ pixelShiftNonGreenVertical->block (false);
+ } else if (pixelShiftNonGreenVertical->getLastActive()) {
pixelShiftNonGreenVertical->set_inconsistent (true);
}
- lastDCBen = pixelShiftNonGreenVertical->get_active ();
+ pixelShiftNonGreenVertical->setLastActive();
}
if (listener) {
listener->panelChanged (EvPixelShiftNonGreenVertical, pixelShiftNonGreenVertical->get_active() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED"));
}
}
+#endif
void BayerProcess::pixelShiftHoleFillChanged ()
{
if (batchMode) {
if (pixelShiftHoleFill->get_inconsistent()) {
pixelShiftHoleFill->set_inconsistent (false);
- pixelShiftHoleFillconn.block (true);
+ pixelShiftHoleFill->block (true);
pixelShiftHoleFill->set_active (false);
- pixelShiftHoleFillconn.block (false);
- } else if (lastDCBen) {
+ pixelShiftHoleFill->block (false);
+ } else if (pixelShiftHoleFill->getLastActive()) {
pixelShiftHoleFill->set_inconsistent (true);
}
- lastDCBen = pixelShiftHoleFill->get_active ();
+ pixelShiftHoleFill->setLastActive();
}
if (listener) {
@@ -927,56 +991,56 @@ void BayerProcess::pixelShiftMedianChanged ()
if (batchMode) {
if (pixelShiftMedian->get_inconsistent()) {
pixelShiftMedian->set_inconsistent (false);
- pixelShiftMedianconn.block (true);
+ pixelShiftMedian->block (true);
pixelShiftMedian->set_active (false);
- pixelShiftMedianconn.block (false);
- } else if (lastDCBen) {
+ pixelShiftMedian->block (false);
+ } else if (pixelShiftMedian->getLastActive()) {
pixelShiftMedian->set_inconsistent (true);
}
- lastDCBen = pixelShiftMedian->get_active ();
+ pixelShiftMedian->setLastActive();
}
-
+#ifdef PIXELSHIFTDEV
pixelShiftMedian3->set_sensitive(pixelShiftMedian->get_active ());
-
+#endif
if (listener) {
listener->panelChanged (EvPixelShiftMedian, pixelShiftMedian->get_active() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED"));
}
}
-
+#ifdef PIXELSHIFTDEV
void BayerProcess::pixelShiftMedian3Changed ()
{
if (batchMode) {
if (pixelShiftMedian3->get_inconsistent()) {
pixelShiftMedian3->set_inconsistent (false);
- pixelShiftMedian3conn.block (true);
+ pixelShiftMedian3->block (true);
pixelShiftMedian3->set_active (false);
- pixelShiftMedian3conn.block (false);
- } else if (lastDCBen) {
+ pixelShiftMedian3->block (false);
+ } else if (pixelShiftMedian3->getLastActive()) {
pixelShiftMedian3->set_inconsistent (true);
}
- lastDCBen = pixelShiftMedian3->get_active ();
+ pixelShiftMedian3->setLastActive();
}
if (listener) {
listener->panelChanged (EvPixelShiftMedian3, pixelShiftMedian3->get_active() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED"));
}
}
-
+#endif
void BayerProcess::pixelShiftGreenChanged ()
{
if (batchMode) {
if (pixelShiftGreen->get_inconsistent()) {
pixelShiftGreen->set_inconsistent (false);
- pixelShiftGreenconn.block (true);
+ pixelShiftGreen->block (true);
pixelShiftGreen->set_active (false);
- pixelShiftGreenconn.block (false);
- } else if (lastDCBen) {
+ pixelShiftGreen->block (false);
+ } else if (pixelShiftGreen->getLastActive()) {
pixelShiftGreen->set_inconsistent (true);
}
- lastDCBen = pixelShiftGreen->get_active ();
+ pixelShiftGreen->setLastActive();
}
if (listener) {
@@ -989,56 +1053,56 @@ void BayerProcess::pixelShiftBlurChanged ()
if (batchMode) {
if (pixelShiftBlur->get_inconsistent()) {
pixelShiftBlur->set_inconsistent (false);
- pixelShiftBlurconn.block (true);
+ pixelShiftBlur->block (true);
pixelShiftBlur->set_active (false);
- pixelShiftBlurconn.block (false);
- } else if (lastDCBen) {
+ pixelShiftBlur->block (false);
+ } else if (pixelShiftBlur->getLastActive()) {
pixelShiftBlur->set_inconsistent (true);
}
- lastDCBen = pixelShiftBlur->get_active ();
+ pixelShiftBlur->setLastActive();
}
pixelShiftSmooth->set_sensitive(pixelShiftBlur->get_active ());
-
+ pixelShiftSigma->set_sensitive(pixelShiftBlur->get_active ());
if (listener) {
listener->panelChanged (EvPixelShiftBlur, pixelShiftBlur->get_active() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED"));
}
}
-
+#ifdef PIXELSHIFTDEV
void BayerProcess::pixelShiftExp0Changed ()
{
if (batchMode) {
if (pixelShiftExp0->get_inconsistent()) {
pixelShiftExp0->set_inconsistent (false);
- pixelShiftExp0conn.block (true);
+ pixelShiftExp0->block (true);
pixelShiftExp0->set_active (false);
- pixelShiftExp0conn.block (false);
- } else if (lastDCBen) {
+ pixelShiftExp0->block (false);
+ } else if (pixelShiftExp0->getLastActive()) {
pixelShiftExp0->set_inconsistent (true);
}
- lastDCBen = pixelShiftExp0->get_active ();
+ pixelShiftExp0->setLastActive();
}
if (listener) {
listener->panelChanged (EvPixelShiftExp0, pixelShiftExp0->get_active() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED"));
}
}
-
+#endif
void BayerProcess::pixelShiftLmmseChanged ()
{
if (batchMode) {
if (pixelShiftLmmse->get_inconsistent()) {
pixelShiftLmmse->set_inconsistent (false);
- pixelShiftLmmseconn.block (true);
+ pixelShiftLmmse->block (true);
pixelShiftLmmse->set_active (false);
- pixelShiftLmmseconn.block (false);
- } else if (lastDCBen) {
+ pixelShiftLmmse->block (false);
+ } else if (pixelShiftLmmse->getLastActive()) {
pixelShiftLmmse->set_inconsistent (true);
}
- lastDCBen = pixelShiftLmmse->get_active ();
+ pixelShiftLmmse->setLastActive();
}
if (listener) {
@@ -1046,39 +1110,59 @@ void BayerProcess::pixelShiftLmmseChanged ()
}
}
+void BayerProcess::pixelShiftEqualBrightChanged ()
+{
+ if (batchMode) {
+ if (pixelShiftEqualBright->get_inconsistent()) {
+ pixelShiftEqualBright->set_inconsistent (false);
+ pixelShiftEqualBright->block (true);
+ pixelShiftEqualBright->set_active (false);
+ pixelShiftEqualBright->block (false);
+ } else if (pixelShiftEqualBright->getLastActive()) {
+ pixelShiftEqualBright->set_inconsistent (true);
+ }
+
+ pixelShiftEqualBright->setLastActive();
+ }
+
+ if (listener) {
+ listener->panelChanged (EvPixelShiftEqualBright, pixelShiftEqualBright->get_active() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED"));
+ }
+}
+
void BayerProcess::pixelShiftNonGreenCrossChanged ()
{
if (batchMode) {
if (pixelShiftNonGreenCross->get_inconsistent()) {
pixelShiftNonGreenCross->set_inconsistent (false);
- pixelShiftNonGreenCrossconn.block (true);
+ pixelShiftNonGreenCross->block (true);
pixelShiftNonGreenCross->set_active (false);
- pixelShiftNonGreenCrossconn.block (false);
- } else if (lastDCBen) {
+ pixelShiftNonGreenCross->block (false);
+ } else if (pixelShiftNonGreenCross->getLastActive()) {
pixelShiftNonGreenCross->set_inconsistent (true);
}
- lastDCBen = pixelShiftNonGreenCross->get_active ();
+ pixelShiftNonGreenCross->setLastActive();
}
if (listener) {
listener->panelChanged (EvPixelShiftNonGreenCross, pixelShiftNonGreenCross->get_active() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED"));
}
}
-
+#ifdef PIXELSHIFTDEV
void BayerProcess::pixelShiftNonGreenCross2Changed ()
{
if (batchMode) {
if (pixelShiftNonGreenCross2->get_inconsistent()) {
pixelShiftNonGreenCross2->set_inconsistent (false);
- pixelShiftNonGreenCross2conn.block (true);
+ pixelShiftNonGreenCross2->block (true);
pixelShiftNonGreenCross2->set_active (false);
- pixelShiftNonGreenCross2conn.block (false);
- } else if (lastDCBen) {
+ pixelShiftNonGreenCross2->block (false);
+ } else if (pixelShiftNonGreenCross2->getLastActive()) {
pixelShiftNonGreenCross2->set_inconsistent (true);
}
- lastDCBen = pixelShiftNonGreenCross2->get_active ();
+ pixelShiftNonGreenCross2->setLastActive();
}
if (listener) {
@@ -1091,17 +1175,18 @@ void BayerProcess::pixelShiftNonGreenAmazeChanged ()
if (batchMode) {
if (pixelShiftNonGreenAmaze->get_inconsistent()) {
pixelShiftNonGreenAmaze->set_inconsistent (false);
- pixelShiftNonGreenAmazeconn.block (true);
+ pixelShiftNonGreenAmaze->block (true);
pixelShiftNonGreenAmaze->set_active (false);
- pixelShiftNonGreenAmazeconn.block (false);
- } else if (lastDCBen) {
+ pixelShiftNonGreenAmaze->block (false);
+ } else if (pixelShiftNonGreenAmaze->getLastActive()) {
pixelShiftNonGreenAmaze->set_inconsistent (true);
}
- lastDCBen = pixelShiftNonGreenAmaze->get_active ();
+ pixelShiftNonGreenAmaze->setLastActive();
}
if (listener) {
listener->panelChanged (EvPixelShiftNonGreenAmaze, pixelShiftNonGreenAmaze->get_active() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED"));
}
}
+#endif
\ No newline at end of file
diff --git a/rtgui/bayerprocess.h b/rtgui/bayerprocess.h
index c8658f5bf..463e8fb58 100644
--- a/rtgui/bayerprocess.h
+++ b/rtgui/bayerprocess.h
@@ -36,48 +36,43 @@ protected:
Adjuster* ccSteps;
Gtk::VBox *dcbOptions;
Adjuster* dcbIterations;
- Gtk::CheckButton* dcbEnhance;
- //Gtk::VBox *allOptions;
- //Gtk::CheckButton* allEnhance;
+ MyCheckButton* dcbEnhance;
Gtk::VBox *lmmseOptions;
Adjuster* lmmseIterations;
Gtk::VBox *pixelShiftFrame;
Gtk::VBox *pixelShiftOptions;
+ MyComboBoxText* pixelShiftMotionMethod;
+ MyCheckButton* pixelShiftShowMotion;
+ MyCheckButton* pixelShiftShowMotionMaskOnly;
+ MyCheckButton* pixelShiftNonGreenCross;
+ MyCheckButton* pixelShiftGreen;
+ MyCheckButton* pixelShiftBlur;
+ MyCheckButton* pixelShiftHoleFill;
+ MyCheckButton* pixelShiftMedian;
+ MyCheckButton* pixelShiftLmmse;
+ MyCheckButton* pixelShiftEqualBright;
+ Adjuster* pixelShiftSmooth;
+ Adjuster* pixelShiftEperIso;
+ Adjuster* pixelShiftSigma;
+#ifdef PIXELSHIFTDEV
+ Adjuster* pixelShiftSum;
Adjuster* pixelShiftMotion;
MyComboBoxText* pixelShiftMotionCorrection;
- MyComboBoxText* pixelShiftMotionMethod;
- Gtk::CheckButton* pixelShiftShowMotion;
- Gtk::CheckButton* pixelShiftShowMotionMaskOnly;
- Gtk::CheckButton* pixelShiftAutomatic;
- Gtk::CheckButton* pixelShiftNonGreenHorizontal;
- Gtk::CheckButton* pixelShiftNonGreenVertical;
- Gtk::CheckButton* pixelShiftNonGreenCross;
- Gtk::CheckButton* pixelShiftNonGreenCross2;
- Gtk::CheckButton* pixelShiftNonGreenAmaze;
- Gtk::CheckButton* pixelShiftGreen;
- Gtk::CheckButton* pixelShiftBlur;
- Gtk::CheckButton* pixelShiftExp0;
- Gtk::CheckButton* pixelShiftHoleFill;
- Gtk::CheckButton* pixelShiftMedian;
- Gtk::CheckButton* pixelShiftMedian3;
- Gtk::CheckButton* pixelShiftLmmse;
- Adjuster* pixelShiftSmooth;
+ MyCheckButton* pixelShiftAutomatic;
+ MyCheckButton* pixelShiftNonGreenHorizontal;
+ MyCheckButton* pixelShiftNonGreenVertical;
+ MyCheckButton* pixelShiftNonGreenCross2;
+ MyCheckButton* pixelShiftNonGreenAmaze;
+ MyCheckButton* pixelShiftExp0;
+ MyCheckButton* pixelShiftMedian3;
Adjuster* pixelShiftStddevFactorGreen;
Adjuster* pixelShiftStddevFactorRed;
Adjuster* pixelShiftStddevFactorBlue;
- Adjuster* pixelShiftEperIso;
Adjuster* pixelShiftNreadIso;
Adjuster* pixelShiftPrnu;
- Adjuster* pixelShiftSigma;
- Adjuster* pixelShiftSum;
Adjuster* pixelShiftRedBlueWeight;
- bool lastDCBen;
+#endif
int oldMethod;
- //bool lastALLen;
- sigc::connection methodconn, imagenumberconn, psmcconn, dcbEnhconn,
- pixelShiftShowMotionconn, pixelShiftShowMotionMaskOnlyconn, pixelShiftAutomaticconn,
- pixelShiftNonGreenHorizontalconn, pixelShiftNonGreenVerticalconn, pixelShiftHoleFillconn, pixelShiftMedianconn, pixelShiftMedian3conn, pixelShiftNonGreenCrossconn,
- pixelShiftNonGreenCross2conn, pixelShiftNonGreenAmazeconn, pixelShiftGreenconn, pixelShiftBlurconn, pixelShiftSmoothconn, pixelShiftExp0conn, pixelShiftLmmseconn, pixelShiftMotionMethodConn;
public:
BayerProcess ();
@@ -88,26 +83,29 @@ public:
void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr);
void methodChanged ();
- void psMotionCorrectionChanged ();
void imageNumberChanged ();
void adjusterChanged (Adjuster* a, double newval);
void dcbEnhanceChanged();
void pixelShiftShowMotionChanged();
void pixelShiftShowMotionMaskOnlyChanged();
- void pixelShiftAutomaticChanged();
- void pixelShiftNonGreenHorizontalChanged();
- void pixelShiftNonGreenVerticalChanged();
void pixelShiftHoleFillChanged();
void pixelShiftMedianChanged();
void pixelShiftMedian3Changed();
void pixelShiftGreenChanged();
void pixelShiftBlurChanged();
- void pixelShiftExp0Changed();
void pixelShiftLmmseChanged();
+ void pixelShiftEqualBrightChanged();
void pixelShiftNonGreenCrossChanged();
+ void pixelShiftMotionMethodChanged();
+#ifdef PIXELSHIFTDEV
+ void psMotionCorrectionChanged ();
+ void pixelShiftAutomaticChanged();
+ void pixelShiftNonGreenHorizontalChanged();
+ void pixelShiftNonGreenVerticalChanged();
+ void pixelShiftExp0Changed();
void pixelShiftNonGreenCross2Changed();
void pixelShiftNonGreenAmazeChanged();
- void pixelShiftMotionMethodChanged();
+#endif
};
#endif
diff --git a/rtgui/guiutils.h b/rtgui/guiutils.h
index 597173086..0803a2573 100644
--- a/rtgui/guiutils.h
+++ b/rtgui/guiutils.h
@@ -24,6 +24,7 @@
#include "../rtengine/coord.h"
#include
#include
+#include
Glib::ustring escapeHtmlChars(const Glib::ustring &src);
bool removeIfThere (Gtk::Container* cont, Gtk::Widget* w, bool increference = true);
@@ -259,6 +260,24 @@ public:
MyScrolledWindow();
};
+/**
+ * @brief subclass of Gtk::CheckButton in order to handle the last active state
+ */
+class MyCheckButton : public Gtk::CheckButton
+{
+
+ bool lastActive = false;
+ sigc::connection myConnection;
+public:
+ using CheckButton::CheckButton;
+ void setLastActive() {lastActive = get_active();};
+ void setLastActive(bool active) {lastActive = active;};
+ bool getLastActive() {return lastActive;};
+ void connect(const sigc::connection &connection) {myConnection = connection;};
+ void block(bool blocked) {myConnection.block(blocked);};
+};
+
+
/**
* @brief subclass of Gtk::ComboBox in order to handle the scrollwheel
*/
@@ -278,9 +297,12 @@ class MyComboBoxText : public Gtk::ComboBoxText
{
bool on_scroll_event (GdkEventScroll* event);
+ sigc::connection myConnection;
public:
MyComboBoxText ();
+ void connect(const sigc::connection &connection) {myConnection = connection;};
+ void block(bool blocked) {myConnection.block(blocked);};
};
/**
diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc
index 939413f18..a84d1e8be 100644
--- a/rtgui/paramsedited.cc
+++ b/rtgui/paramsedited.cc
@@ -395,6 +395,7 @@ void ParamsEdited::set (bool v)
raw.bayersensor.pixelShiftSmooth = v;
raw.bayersensor.pixelShiftExp0 = v;
raw.bayersensor.pixelShiftLmmse = v;
+ raw.bayersensor.pixelShiftEqualBright = v;
raw.bayersensor.pixelShiftNonGreenCross = v;
raw.bayersensor.pixelShiftNonGreenCross2 = v;
raw.bayersensor.pixelShiftNonGreenAmaze = v;
@@ -919,6 +920,7 @@ void ParamsEdited::initFrom (const std::vector
raw.bayersensor.pixelShiftSmooth = raw.bayersensor.pixelShiftSmooth && p.raw.bayersensor.pixelShiftSmoothFactor == other.raw.bayersensor.pixelShiftSmoothFactor;
raw.bayersensor.pixelShiftExp0 = raw.bayersensor.pixelShiftExp0 && p.raw.bayersensor.pixelShiftExp0 == other.raw.bayersensor.pixelShiftExp0;
raw.bayersensor.pixelShiftLmmse = raw.bayersensor.pixelShiftLmmse && p.raw.bayersensor.pixelShiftLmmse == other.raw.bayersensor.pixelShiftLmmse;
+ raw.bayersensor.pixelShiftEqualBright = raw.bayersensor.pixelShiftEqualBright && p.raw.bayersensor.pixelShiftEqualBright == other.raw.bayersensor.pixelShiftEqualBright;
raw.bayersensor.pixelShiftNonGreenCross = raw.bayersensor.pixelShiftNonGreenCross && p.raw.bayersensor.pixelShiftNonGreenCross == other.raw.bayersensor.pixelShiftNonGreenCross;
raw.bayersensor.pixelShiftNonGreenCross2 = raw.bayersensor.pixelShiftNonGreenCross2 && p.raw.bayersensor.pixelShiftNonGreenCross2 == other.raw.bayersensor.pixelShiftNonGreenCross2;
raw.bayersensor.pixelShiftNonGreenAmaze = raw.bayersensor.pixelShiftNonGreenAmaze && p.raw.bayersensor.pixelShiftNonGreenAmaze == other.raw.bayersensor.pixelShiftNonGreenAmaze;
@@ -2434,6 +2436,10 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten
toEdit.raw.bayersensor.pixelShiftLmmse = mods.raw.bayersensor.pixelShiftLmmse;
}
+ if (raw.bayersensor.pixelShiftEqualBright) {
+ toEdit.raw.bayersensor.pixelShiftEqualBright = mods.raw.bayersensor.pixelShiftEqualBright;
+ }
+
if (raw.bayersensor.pixelShiftNonGreenCross) {
toEdit.raw.bayersensor.pixelShiftNonGreenCross = mods.raw.bayersensor.pixelShiftNonGreenCross;
}
@@ -2958,7 +2964,7 @@ bool RAWParamsEdited::BayerSensor::isUnchanged() const
return method && imageNum && dcbIterations && dcbEnhance && lmmseIterations/*&& allEnhance*/ && greenEq
&& pixelShiftMotion && pixelShiftMotionCorrection && pixelShiftMotionCorrectionMethod && pixelShiftStddevFactorGreen && pixelShiftStddevFactorRed && pixelShiftStddevFactorBlue && pixelShiftEperIso
&& pixelShiftNreadIso && pixelShiftPrnu && pixelShiftSigma && pixelShiftSum && pixelShiftRedBlueWeight && pixelshiftShowMotion && pixelshiftShowMotionMaskOnly
- && pixelShiftAutomatic && pixelShiftNonGreenHorizontal && pixelShiftNonGreenVertical && pixelShiftHoleFill && pixelShiftMedian && pixelShiftMedian3 && pixelShiftNonGreenCross && pixelShiftNonGreenCross2 && pixelShiftNonGreenAmaze && pixelShiftGreen && pixelShiftBlur && pixelShiftSmooth && pixelShiftExp0 && pixelShiftLmmse
+ && pixelShiftAutomatic && pixelShiftNonGreenHorizontal && pixelShiftNonGreenVertical && pixelShiftHoleFill && pixelShiftMedian && pixelShiftMedian3 && pixelShiftNonGreenCross && pixelShiftNonGreenCross2 && pixelShiftNonGreenAmaze && pixelShiftGreen && pixelShiftBlur && pixelShiftSmooth && pixelShiftExp0 && pixelShiftLmmse && pixelShiftEqualBright
&& linenoise && exBlack0 && exBlack1 && exBlack2 && exBlack3 && exTwoGreen;
}
diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h
index 5f66c3d18..89a490b7f 100644
--- a/rtgui/paramsedited.h
+++ b/rtgui/paramsedited.h
@@ -717,6 +717,7 @@ public:
bool pixelShiftSmooth;
bool pixelShiftExp0;
bool pixelShiftLmmse;
+ bool pixelShiftEqualBright;
bool pixelShiftNonGreenCross;
bool pixelShiftNonGreenCross2;
bool pixelShiftNonGreenAmaze;