RAW black level compensation, on behalf of Jacques; see issue 717

This commit is contained in:
Oliver Duis
2011-06-08 20:21:42 +02:00
parent 45a825d6ac
commit f68e8355e0
17 changed files with 291 additions and 41 deletions

View File

@@ -217,6 +217,11 @@ HISTORY_MSG_133;Gamma
HISTORY_MSG_134;Gamma Position
HISTORY_MSG_135;Gamma Free
HISTORY_MSG_136;Gamma Slope
HISTORY_MSG_137;Black level green 1
HISTORY_MSG_138;Black level red
HISTORY_MSG_139;Black level blue
HISTORY_MSG_140;Black level green 2
HISTORY_MSG_141;Black level green together
HISTORY_MSG_14;Luminance Brightness
HISTORY_MSG_15;Luminance Contrast
HISTORY_MSG_16;Luminance Black
@@ -761,7 +766,7 @@ TP_EQUALIZER_FINEST;finest
TP_EQUALIZER_LABEL;Wavelet equalizer
TP_EQUALIZER_LARGEST;coarsest
TP_EQUALIZER_NEUTRAL;Neutral
TP_EXPOSCORR_LABEL;Raw white point
TP_EXPOSCORR_LABEL;Raw white-black point
TP_EXPOSURE_AUTOLEVELS;Auto Levels
TP_EXPOSURE_BLACKLEVEL;Black
TP_EXPOSURE_BRIGHTNESS;Brightness
@@ -848,8 +853,14 @@ TP_PREPROCESS_NO_FOUND;None found
TP_RAWCACORR_AUTO;Auto correction
TP_RAWCACORR_CABLUE;Blue
TP_RAWCACORR_CARED;Red
TP_RAWEXPOS_LINEAR;Linear corr. factor
TP_RAWEXPOS_PRESER;HL preserving corr. (EV)
TP_RAWEXPOS_LINEAR;White Point: Linear corr. factor
TP_RAWEXPOS_PRESER;White Point: HL preserving corr.(EV)
TP_RAWEXPOS_BLACKZERO;Black Level: Green 1 (leader)
TP_RAWEXPOS_BLACKONE;Black Level: Red
TP_RAWEXPOS_BLACKTWO;Black Level: Blue
TP_RAWEXPOS_BLACKTHREE;Black Level: Green 2
TP_RAWEXPOS_TWOGREEN;Two greens together
TP_EXPO_AFTER; After interpolation (before RGB conversion)
TP_RAW_DCBENHANCE;Apply DCB enhancement step
TP_RAW_DCBITERATIONS;Number of DCB iterations
TP_RAW_DMETHOD;Method

View File

@@ -182,6 +182,10 @@ LineDenoise=0
GreenEqThreshold=0
PreExposure=1
PrePreserv=0
PreBlackzero=0
PreBlackone=0
PreBlacktwo=0
PreBlackthree=0
CcSteps=1
Method=amaze
DCBIterations=2

View File

@@ -182,6 +182,10 @@ LineDenoise=0
GreenEqThreshold=0
PreExposure=1
PrePreserv=0
PreBlackzero=0
PreBlackone=0
PreBlacktwo=0
PreBlackthree=0
CcSteps=1
Method=amaze
DCBIterations=2

View File

@@ -182,6 +182,10 @@ LineDenoise=0
GreenEqThreshold=0
PreExposure=1
PrePreserv=0
PreBlackzero=0
PreBlackone=0
PreBlacktwo=0
PreBlackthree=0
CcSteps=1
Method=amaze
DCBIterations=2

View File

@@ -31,6 +31,9 @@
// preserve (log) : 0..8 : currently 0.1 1
void RawImageSource::processRawWhitepoint(float expos, float preser) {
MyTime t1e,t2e;
t1e.set();
int width=W, height=H;
// exposure correction inspired from G.Luijk
@@ -68,7 +71,7 @@ void RawImageSource::processRawWhitepoint(float expos, float preser) {
freeArray<float>(imgd, H);
// Find maximum to adjust LUTs. New float engines clips only at the very end
int maxVal=65535;
int maxVal=0;
for(int row=0;row<height;row++)
for(int col=0;col<width;col++)
if (rawData[row][col]>maxVal) maxVal = rawData[row][col];
@@ -76,9 +79,9 @@ void RawImageSource::processRawWhitepoint(float expos, float preser) {
// Exposure correction with highlight preservation
LUTf lut(maxVal+1);
if(expos>1){
float K = maxVal / expos*exp(-preser*log(2.0));
float K = (float) maxVal / expos*exp(-preser*log(2.0));
for (int j=0;j<=maxVal;j++)
lut[(int)j]=((maxVal-K*expos)/(maxVal-K)*(j-maxVal)+maxVal) / j;
lut[(int)j]=(((float)maxVal-K*expos)/((float)maxVal-K)*(j-maxVal)+(float) maxVal) / j;
#pragma omp parallel for shared(expos)
for(int row=0;row<height;row++)
@@ -111,4 +114,8 @@ void RawImageSource::processRawWhitepoint(float expos, float preser) {
delete[] luminosity;
}
t2e.set();
if( settings->verbose )
printf("Exposure before %d usec\n", t2e.etime(t1e));
}

View File

@@ -158,7 +158,12 @@ enum ProcEvent {
EvGAMPOS=133,
EvGAMFREE=134,
EvSLPOS=135,
NUMOFEVENTS=136
EvPreProcessExpBlackzero=136,
EvPreProcessExpBlackone=137,
EvPreProcessExpBlacktwo=138,
EvPreProcessExpBlackthree=139,
EvPreProcessExptwoGreen=140,
NUMOFEVENTS=141
};

View File

@@ -28,7 +28,7 @@
#include <myflatcurve.h>
#include <safekeyfile.h>
#include <rawimage.h>
#define APPVERSION VERSION
namespace rtengine {
@@ -250,8 +250,11 @@ void ProcParams::setDefaults () {
// exposure before interpolation
raw.expos=1.0;
raw.preser=0.0;
raw.blackzero=0.0;
raw.blackone=0.0;
raw.blacktwo=0.0;
raw.blackthree=0.0;
raw.twogreen=true;
exif.clear ();
iptc.clear ();
@@ -263,7 +266,6 @@ void ProcParams::setDefaults () {
}
int ProcParams::save (Glib::ustring fname) const {
SafeKeyFile keyFile;
keyFile.set_string ("Version", "AppVersion", APPVERSION);
@@ -492,6 +494,11 @@ int ProcParams::save (Glib::ustring fname) const {
keyFile.set_boolean ("RAW", "DCBEnhance", raw.dcb_enhance );
keyFile.set_double ("RAW", "PreExposure", raw.expos );
keyFile.set_double ("RAW", "PrePreserv", raw.preser );
keyFile.set_double ("RAW", "PreBlackzero", raw.blackzero );
keyFile.set_double ("RAW", "PreBlackone", raw.blackone );
keyFile.set_double ("RAW", "PreBlacktwo", raw.blacktwo );
keyFile.set_double ("RAW", "PreBlackthree", raw.blackthree );
keyFile.set_boolean ("RAW", "PreTwoGreen", raw.twogreen );
// exposition
@@ -822,6 +829,12 @@ if (keyFile.has_group ("RAW")) {
if (keyFile.has_key ("RAW", "DCBEnhance")) raw.dcb_enhance =keyFile.get_boolean("RAW", "DCBEnhance");
if (keyFile.has_key ("RAW", "PreExposure")) raw.expos =keyFile.get_double("RAW", "PreExposure");
if (keyFile.has_key ("RAW", "PrePreserv")) raw.preser =keyFile.get_double("RAW", "PrePreserv");
if (keyFile.has_key ("RAW", "PreBlackzero")) raw.blackzero =keyFile.get_double("RAW", "PreBlackzero");
if (keyFile.has_key ("RAW", "PreBlackone")) raw.blackone =keyFile.get_double("RAW", "PreBlackone");
if (keyFile.has_key ("RAW", "PreBlacktwo")) raw.blacktwo =keyFile.get_double("RAW", "PreBlacktwo");
if (keyFile.has_key ("RAW", "PreBlackthree")) raw.blackthree =keyFile.get_double("RAW", "PreBlackthree");
if (keyFile.has_key ("RAW", "PreTwoGreen")) raw.twogreen =keyFile.get_boolean("RAW", "PreTwoGreen");
}
// load exif change settings
@@ -1028,7 +1041,14 @@ bool ProcParams::operator== (const ProcParams& other) {
&& exif==other.exif
&& iptc==other.iptc
&& raw.expos==other.raw.expos
&& raw.preser==other.raw.preser;
&& raw.preser==other.raw.preser
&& raw.preser==other.raw.preser
&& raw.blackzero==other.raw.blackzero
&& raw.blackone==other.raw.blackone
&& raw.blacktwo==other.raw.blacktwo
&& raw.blackthree==other.raw.blackthree
&& raw.twogreen==other.raw.twogreen;
}
bool ProcParams::operator!= (const ProcParams& other) {

View File

@@ -419,7 +419,11 @@ class RAWParams {
// exposure before interpolation
double expos;
double preser;
double blackzero;
double blackone;
double blacktwo;
double blackthree;
bool twogreen;
bool hotdeadpix_filt;
int hotdeadpix_thresh;
int linenoise;

View File

@@ -42,7 +42,8 @@ RawImage::~RawImage()
/* Similar to dcraw scale_colors for coeff. calculation, but without actual pixels scaling.
* need pixels in data[][] available
*/
int RawImage::get_colorsCoeff( float *pre_mul_, float *scale_mul_, int *cblack_ )
int RawImage::get_colorsCoeff( float *pre_mul_, float *scale_mul_, float *cblack_)
{
unsigned row, col, ur, uc, i, x, y, c, sum[8];
unsigned W = this->get_width();
@@ -51,10 +52,9 @@ int RawImage::get_colorsCoeff( float *pre_mul_, float *scale_mul_, int *cblack_
double dsum[8], dmin, dmax;
for (int c = 0; c < 4; c++){
cblack_[c] = this->get_cblack(c) + this->get_black();
cblack_[c] = (float) this->get_cblack(c) + (float) this->get_black();// I don't modify black and cblack of Dcraw
pre_mul_[c] = this->get_pre_mul(c);
}
if ( this->get_cam_mul(0) == -1 ) {
memset(dsum, 0, sizeof dsum);
for (row = 0; row < H; row += 8)
@@ -115,7 +115,6 @@ skip_block: ;
if (dmax < pre_mul_[c])
dmax = pre_mul_[c];
}
for (c = 0; c < 4; c++)
scale_mul_[c] = (pre_mul_[c] /= dmax) * 65535.0 / sat;
if (settings->verbose) {

View File

@@ -90,7 +90,7 @@ public:
~RawImage();
int loadRaw (bool loadData=true, bool closeFile=true);
int get_colorsCoeff( float *pre_mul, float *scale_mul, int *cblack );
int get_colorsCoeff( float *pre_mul, float *scale_mul, float *cblack );
void set_prefilters(){
if (isBayer() && get_colors() == 3) {
prefilters = filters;

View File

@@ -33,7 +33,6 @@
#include <options.h>
#include <improcfun.h>
#ifdef _OPENMP
#include <omp.h>
#endif
@@ -409,6 +408,7 @@ void RawImageSource::getImage (ColorTemp ctemp, int tran, Imagefloat* image, Pre
}
}
// Flip if needed
if (tran & TR_HFLIP)
hflip (image);
@@ -536,9 +536,6 @@ int RawImageSource::findHotDeadPixel( PixelsMap &bpMap, float thresh)
return counter;
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void RawImageSource::rotateLine (float* line, float** channel, int tran, int i, int w, int h) {
if ((tran & TR_ROT) == TR_R180)
@@ -911,7 +908,7 @@ int RawImageSource::load (Glib::ustring fname, bool batch) {
inverse33 (xyz_cam, cam_xyz);
float pre_mul[4];
ri->get_colorsCoeff( pre_mul, scale_mul, cblack );
ri->get_colorsCoeff( pre_mul, scale_mu_l, c_black);//modify for black level
camwb_red = ri->get_pre_mul(0) / pre_mul[0];
camwb_green = ri->get_pre_mul(1) / pre_mul[1];
@@ -1010,7 +1007,7 @@ void RawImageSource::preprocess (const RAWParams &raw)
}
}
scaleColors( 0,0, W, H);
scaleColors( 0,0, W, H, raw);//+ + raw parameters for black level(raw.blackxx)
defGain = 0.0;//log(initialGain) / log(2.0);
@@ -1287,16 +1284,56 @@ void RawImageSource::copyOriginalPixels(const RAWParams &raw, RawImage *src, Raw
/* Scale original pixels into the range 0 65535 using black offsets and multipliers */
void RawImageSource::scaleColors(int winx,int winy,int winw,int winh)
void RawImageSource::scaleColors(int winx,int winy,int winw,int winh, const RAWParams &raw)
{
float black_lev[4];//black level
//adjust black level (eg Canon)
// cblack Bayer
//0 green
//1 red
//2 blue
// cblack no Bayer
//0 red
//1 green
//2 blue
if( ri->isBayer() ) {
black_lev[0]=raw.blackzero;//G1
black_lev[1]=raw.blackone;//R
black_lev[2]=raw.blacktwo;//B
black_lev[3]=raw.blackthree;//G2
}
else {
black_lev[0]=raw.blackone;//R
black_lev[1]=raw.blackzero;//G
black_lev[2]=raw.blacktwo;//B
black_lev[3]= raw.blackzero;
}
for(int i=0; i<4; i++) {
scale_mul[i]=scale_mu_l[i];
if( c_black[i]+black_lev[i] >0) cblack[i]=c_black[i]+black_lev[i]; else cblack[i]=0;// adjust black level
}
// scale image colors
if( ri->isBayer() ){
for (int row = winy; row < winy+winh; row ++){
for (int col = winx; col < winx+winw; col++) {
float val = rawData[row][col];
int c = FC(row, col);
val -= cblack[c];
val *= scale_mul[c];
if (ri->ISGREEN(row,col)) {
if (row&1) {
val-=cblack[1];
val *= scale_mul[1];
}
else {
val-=cblack[3];
val *= scale_mul[3];
}
}
else {
val-=cblack[c];
val*=scale_mul[c];}
rawData[row][col] = (val);
}
}
@@ -1951,18 +1988,19 @@ void RawImageSource::getAutoExpHistogram (LUTu & histogram, int& histcompr) {
void RawImageSource::getRAWHistogram (LUTu & histRedRaw, LUTu & histGreenRaw, LUTu & histBlueRaw) {
histRedRaw.clear(); histGreenRaw.clear(); histBlueRaw.clear();
float mult = 65535.0 / ri->get_white();
#pragma omp parallel for
for (int i=border; i<H-border; i++) {
int start, end, idx;
getRowStartEnd (i, start, end);
if (ri->isBayer()) {
for (int j=start; j<end; j++) {
if (ri->ISGREEN(i,j)) {
idx = CLIP((int)CurveFactory::gamma(mult*(ri->data[i][j]-cblack[0])));
if(i &1) idx = CLIP((int)CurveFactory::gamma(mult*(ri->data[i][j]-cblack[0])));// green 1
else
idx = CLIP((int)CurveFactory::gamma(mult*(ri->data[i][j]-cblack[3])));//green 2
histGreenRaw[idx>>8]++;
} else if (ri->ISRED(i,j)) {
idx = CLIP((int)CurveFactory::gamma(mult*(ri->data[i][j]-cblack[1])));
@@ -2265,6 +2303,8 @@ void RawImageSource::inverse33 (double (*rgb_cam)[3], double (*cam_rgb)[3]) {
cam_rgb[2][2] = (rgb_cam[0][1]*rgb_cam[1][0]-rgb_cam[0][0]*rgb_cam[1][1]) / nom;
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

View File

@@ -61,7 +61,10 @@ class RawImageSource : public ImageSource {
ColorTemp wb;
ProgressListener* plistener;
float scale_mul[4]; // multiplier for each color
int cblack[4]; // black offsets
float cblack[4];// black
float scale_mu_l[4];// copy of scale_mul, for saturation
float c_black[4]; // copy of cblack Dcraw for black level
double camwb_red;
double camwb_green;
double camwb_blue;
@@ -125,7 +128,8 @@ class RawImageSource : public ImageSource {
void demosaic (const RAWParams &raw);
void copyOriginalPixels(const RAWParams &raw, RawImage *ri, RawImage *riDark, RawImage *riFlatFile );
void cfaboxblur (RawImage *riFlatFile, float* cfablur, int boxH, int boxW );
void scaleColors (int winx,int winy,int winw,int winh );
void scaleColors (int winx,int winy,int winw,int winh, const RAWParams &raw);// raw for cblack
void getImage (ColorTemp ctemp, int tran, Imagefloat* image, PreviewProps pp, HRecParams hrp, ColorManagementParams cmp, RAWParams raw);
ColorTemp getWB () { return wb; }
ColorTemp getAutoWB ();

View File

@@ -156,6 +156,11 @@ ALL, // EvGAMMA
ALL, // EvGAMPOS
ALL, //EvGAMFREE
ALL, //EvSLPOS
DARKFRAME, // EvPreProcessExpBlackzero
DARKFRAME, // EvPreProcessExpBlackone
DARKFRAME, // EvPreProcessExpBlacktwo
DARKFRAME, // EvPreProcessExpBlackthree
DARKFRAME, //EvPreProcessExptwoGreen
};

View File

@@ -157,6 +157,11 @@ void ParamsEdited::set (bool v) {
raw.exPos = v;
raw.exCorrection = v;
raw.exPreser = v;
raw.exBlackzero = v;
raw.exBlackone = v;
raw.exBlacktwo = v;
raw.exBlackthree = v;
raw.exTwoGreen=v;
raw.greenEq = v;
raw.linenoise = v;
raw.ff_file = v;
@@ -318,6 +323,12 @@ void ParamsEdited::initFrom (const std::vector<rtengine::procparams::ProcParams>
raw.caBlue = raw.caBlue && p.raw.cablue == other.raw.cablue;
raw.exPos = raw.exPos && p.raw.expos == other.raw.expos;
raw.exPreser = raw.exPreser && p.raw.preser == other.raw.preser; //exposi
raw.exBlackzero = raw.exBlackzero && p.raw.blackzero == other.raw.blackzero; //black
raw.exBlackone = raw.exBlackone && p.raw.blackone == other.raw.blackone; //black
raw.exBlacktwo = raw.exBlacktwo && p.raw.blacktwo == other.raw.blacktwo; //black
raw.exBlackthree = raw.exBlackthree && p.raw.blackthree == other.raw.blackthree; //black
raw.exTwoGreen = raw.exTwoGreen && p.raw.twogreen == other.raw.twogreen; //black 2 green
raw.darkFrame = raw.darkFrame && p.raw.dark_frame == other.raw.dark_frame;
raw.dfAuto = raw.dfAuto && p.raw.df_autoselect == other.raw.df_autoselect;
raw.ff_file = raw.ff_file && p.raw.ff_file == other.raw.ff_file;
@@ -475,6 +486,12 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten
if (raw.caBlue) toEdit.raw.cablue = mods.raw.cablue;
if (raw.exPos) toEdit.raw.expos =mods.raw.expos;
if (raw.exPreser) toEdit.raw.preser =mods.raw.preser;
if (raw.exBlackzero) toEdit.raw.blackzero =mods.raw.blackzero;
if (raw.exBlackone) toEdit.raw.blackone =mods.raw.blackone;
if (raw.exBlacktwo) toEdit.raw.blacktwo =mods.raw.blacktwo;
if (raw.exBlackthree) toEdit.raw.blackthree =mods.raw.blackthree;
if (raw.exTwoGreen) toEdit.raw.twogreen =mods.raw.twogreen;
if (raw.greenEq) toEdit.raw.greenthresh = mods.raw.greenthresh;
if (raw.hotDeadPixel) toEdit.raw.hotdeadpix_filt= mods.raw.hotdeadpix_filt;
if (raw.linenoise) toEdit.raw.linenoise = mods.raw.linenoise;

View File

@@ -301,6 +301,11 @@ class RAWParamsEdited {
bool exCorrection;
bool exPos;
bool exPreser;
bool exBlackzero;
bool exBlackone;
bool exBlacktwo;
bool exBlackthree;
bool exTwoGreen;
};
class ExifPairEdited {

View File

@@ -26,7 +26,7 @@ using namespace rtengine::procparams;
RAWExposure::RAWExposure () : Gtk::VBox(), FoldableToolPanel(this)
{
PexPos = Gtk::manage(new Adjuster (M("TP_RAWEXPOS_LINEAR"),0.2,16.0,0.01,1));
PexPos = Gtk::manage(new Adjuster (M("TP_RAWEXPOS_LINEAR"),0.1,16.0,0.01,1));
PexPos->setAdjusterListener (this);
if (PexPos->delay < 1000) PexPos->delay = 1000;
PexPos->show();
@@ -34,9 +34,36 @@ RAWExposure::RAWExposure () : Gtk::VBox(), FoldableToolPanel(this)
PexPreser->setAdjusterListener (this);
if (PexPreser->delay < 1000) PexPreser->delay = 1000;
PexPreser->show();
PexBlackone = Gtk::manage(new Adjuster (M("TP_RAWEXPOS_BLACKONE"),-50,50,0.1,0));//black level
PexBlackone->setAdjusterListener (this);
if (PexBlackone->delay < 1000) PexBlackone->delay = 1000;
PexBlackone->show();
PexBlacktwo = Gtk::manage(new Adjuster (M("TP_RAWEXPOS_BLACKTWO"),-50,50,0.1,0));//black level
PexBlacktwo->setAdjusterListener (this);
if (PexBlacktwo->delay < 1000) PexBlacktwo->delay = 1000;
PexBlacktwo->show();
PexBlackthree = Gtk::manage(new Adjuster (M("TP_RAWEXPOS_BLACKTHREE"),-50,50,0.1,0));//black level
PexBlackthree->setAdjusterListener (this);
if (PexBlackthree->delay < 1000) PexBlackthree->delay = 1000;
PexBlackthree->show();
PexBlackzero = Gtk::manage(new Adjuster (M("TP_RAWEXPOS_BLACKZERO"),-50,50,0.1,0));//black level
PexBlackzero->setAdjusterListener (this);
if (PexBlackzero->delay < 1000) PexBlackzero->delay = 1000;
PexBlackzero->show();
PextwoGreen = Gtk::manage(new Gtk::CheckButton((M("TP_RAWEXPOS_TWOGREEN"))));// two green
PextwoGreen->set_active (true);
greenconn = PextwoGreen->signal_toggled().connect ( sigc::mem_fun(*this, &RAWExposure::GreenChanged));
pack_start( *PexPos, Gtk::PACK_SHRINK, 4);//exposi
pack_start( *PexPreser, Gtk::PACK_SHRINK, 4);
pack_start( *PexBlackone, Gtk::PACK_SHRINK, 4);//black
pack_start( *PexBlackzero, Gtk::PACK_SHRINK, 4);//black
pack_start( *PexBlacktwo, Gtk::PACK_SHRINK, 4);//black
pack_start( *PexBlackthree, Gtk::PACK_SHRINK, 4);//black
pack_start( *PextwoGreen, Gtk::PACK_SHRINK, 4);//black 2 green
}
void RAWExposure::read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited)
@@ -46,10 +73,25 @@ void RAWExposure::read(const rtengine::procparams::ProcParams* pp, const ParamsE
if(pedited ){
PexPos->setEditedState( pedited->raw.exPos ? Edited : UnEdited );
PexPreser->setEditedState( pedited->raw.exPreser ? Edited : UnEdited );
PexBlackzero->setEditedState( pedited->raw.exBlackzero ? Edited : UnEdited );
PexBlackone->setEditedState( pedited->raw.exBlackone ? Edited : UnEdited );
PexBlacktwo->setEditedState( pedited->raw.exBlacktwo ? Edited : UnEdited );
PexBlackthree->setEditedState( pedited->raw.exBlackthree ? Edited : UnEdited );
}
greenconn.block (true);
PextwoGreen->set_active (pp->raw.twogreen);
greenconn.block (false);
lastPextwoGreen = pp->raw.twogreen;
PexPos->setValue (pp->raw.expos);
PexPreser->setValue (pp->raw.preser);//exposi
PexBlackzero->setValue (pp->raw.blackzero);//black
PexBlackone->setValue (pp->raw.blackone);//black
PexBlacktwo->setValue (pp->raw.blacktwo);//black
if(!PextwoGreen->get_active())PexBlackthree->setValue (pp->raw.blackthree);else PexBlackthree->setValue (PexBlackzero->getValue());
enableListener ();
}
@@ -58,10 +100,23 @@ void RAWExposure::write( rtengine::procparams::ProcParams* pp, ParamsEdited* ped
{
pp->raw.expos = PexPos->getValue();
pp->raw.preser = PexPreser->getValue();//exposi
pp->raw.blackzero = PexBlackzero->getValue();// black
pp->raw.blackone = PexBlackone->getValue();// black
pp->raw.blacktwo = PexBlacktwo->getValue();// black
pp->raw.twogreen=PextwoGreen->get_active();
if(PextwoGreen->get_active()){pp->raw.blackthree=pp->raw.blackzero;} else {pp->raw.blackthree = PexBlackthree->getValue();}// active or desactive 2 green together
if (pedited) {
pedited->raw.exPos = PexPos->getEditedState ();
pedited->raw.exPreser = PexPreser->getEditedState ();//exposi
pedited->raw.exBlackzero = PexBlackzero->getEditedState ();//black
pedited->raw.exBlackone = PexBlackone->getEditedState ();//black
pedited->raw.exBlacktwo = PexBlacktwo->getEditedState ();//black
pedited->raw.exBlackthree = PexBlackthree->getEditedState ();//black
pedited->raw.exTwoGreen =!PextwoGreen->get_inconsistent();
}
}
@@ -70,30 +125,87 @@ void RAWExposure::adjusterChanged (Adjuster* a, double newval)
{
if (listener) {
Glib::ustring value = a->getTextValue();
if (a == PexPos)
{
if (a == PexPos )
listener->panelChanged (EvPreProcessExpCorrLinear, value );
else if (a == PexPreser && ABS(PexPos->getValue()-1.0)>0.0001) // update takes long, only do it if it would have an effect
listener->panelChanged (EvPreProcessExpCorrPH, value );
else if (a == PexBlackzero) {if(!PextwoGreen->get_active())
listener->panelChanged (EvPreProcessExpBlackzero, value ); else {listener->panelChanged (EvPreProcessExpBlackzero, value );PexBlackthree->setValue (PexBlackzero->getValue());}}
else if (a == PexBlackone)
listener->panelChanged (EvPreProcessExpBlackone, value );
else if (a == PexBlacktwo)
listener->panelChanged (EvPreProcessExpBlacktwo, value );
else if (a == PexBlackthree) {if(!PextwoGreen->get_active())
listener->panelChanged (EvPreProcessExpBlackthree, value ); else {listener->panelChanged (EvPreProcessExpBlackthree, value );PexBlackzero->setValue (PexBlackthree->getValue());}}
}
}
}
void RAWExposure::GreenChanged() {
if (batchMode) {
if (PextwoGreen->get_inconsistent()) {
PextwoGreen->set_inconsistent (false);
greenconn.block (true);
PextwoGreen->set_active (false);
greenconn.block (false);
}
else if (lastPextwoGreen)
PextwoGreen->set_inconsistent (true);
lastPextwoGreen = PextwoGreen->get_active ();
}
if (listener) {
if (PextwoGreen->get_active())
{ listener->panelChanged (EvPreProcessExptwoGreen, M("GENERAL_ENABLED"));
PexBlackthree->setValue (PexBlackzero->getValue());//two green together
}
else
{ listener->panelChanged (EvPreProcessExptwoGreen, M("GENERAL_DISABLED"));
}
}
}
void RAWExposure::setBatchMode(bool batchMode)
{
ToolPanel::setBatchMode (batchMode);
PexPos->showEditedCB ();
PexPreser->showEditedCB ();//exposi
PexPreser->showEditedCB ();//exposure
PexBlackzero->showEditedCB ();//black
PexBlackone->showEditedCB ();//black
PexBlacktwo->showEditedCB ();//black
PexBlackthree->showEditedCB ();//black
}
void RAWExposure::setDefaults(const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited)
{
PexPos->setDefault( defParams->raw.expos);
PexPreser->setDefault( defParams->raw.preser);
PexBlackzero->setDefault( defParams->raw.blackzero);
PexBlackone->setDefault( defParams->raw.blackone);
PexBlacktwo->setDefault( defParams->raw.blacktwo);
PexBlackthree->setDefault( defParams->raw.blackthree);
if (pedited) {
PexPos->setDefaultEditedState( pedited->raw.exPos ? Edited : UnEdited);
PexPreser->setDefaultEditedState( pedited->raw.exPreser ? Edited : UnEdited);
PexBlackzero->setDefaultEditedState( pedited->raw.exBlackzero ? Edited : UnEdited);
PexBlackone->setDefaultEditedState( pedited->raw.exBlackone ? Edited : UnEdited);
PexBlacktwo->setDefaultEditedState( pedited->raw.exBlacktwo ? Edited : UnEdited);
PexBlackthree->setDefaultEditedState( pedited->raw.exBlackthree ? Edited : UnEdited);
} else {
PexPos->setDefaultEditedState( Irrelevant );
PexPreser->setDefaultEditedState( Irrelevant );
PexBlackzero->setDefaultEditedState( Irrelevant );
PexBlackone->setDefaultEditedState( Irrelevant );
PexBlacktwo->setDefaultEditedState( Irrelevant );
PexBlackthree->setDefaultEditedState( Irrelevant );
}
}

View File

@@ -29,7 +29,16 @@ class RAWExposure : public Gtk::VBox, public AdjusterListener, public FoldableTo
protected:
Adjuster* PexPos;
Adjuster* PexPreser;
Adjuster* PexBlackzero;
Adjuster* PexBlackone;
Adjuster* PexBlacktwo;
Adjuster* PexBlackthree;
bool lastPextwoGreen;
sigc::connection greenconn;
Gtk::CheckButton* PextwoGreen;
private:
// Gtk::CheckButton* PextwoGreen;
public:
RAWExposure ();
@@ -38,7 +47,7 @@ public:
void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited=NULL);
void setBatchMode (bool batchMode);
void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited=NULL);
void GreenChanged() ;
void adjusterChanged (Adjuster* a, double newval);
};