/* * This file is part of RawTherapee. * * Copyright (c) 2004-2010 Gabor Horvath * * RawTherapee is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * RawTherapee is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ #include "multilangmgr.h" #include "batchtoolpanelcoord.h" #include "options.h" #include "filepanel.h" #include "procparamchangers.h" #include "addsetids.h" using namespace rtengine::procparams; BatchToolPanelCoordinator::BatchToolPanelCoordinator (FilePanel* parent) : ToolPanelCoordinator(), somethingChanged(false), parent(parent) { blockedUpdate = false; // remove exif panel and iptc panel std::vector::iterator epi = std::find (toolPanels.begin(), toolPanels.end(), exifpanel); if (epi!=toolPanels.end()) toolPanels.erase (epi); std::vector::iterator ipi = std::find (toolPanels.begin(), toolPanels.end(), iptcpanel); if (ipi!=toolPanels.end()) toolPanels.erase (ipi); toolPanelNotebook->remove_page (*metadataPanel); metadataPanel = 0; toiM = 0; for (size_t i=0; isetBatchMode (true); } void BatchToolPanelCoordinator::selectionChanged (const std::vector& selected) { if (selected!=this->selected) { closeSession (); this->selected = selected; selFileNames.clear (); for (size_t i=0; igetFileName ()); initSession (); } } void BatchToolPanelCoordinator::closeSession (bool save) { pparamsEdited.set (false); for (size_t i=0; iremoveThumbnailListener (this); if (somethingChanged && save) { // read new values from the gui for (size_t i=0; iwrite (&pparams, &pparamsEdited); // combine with initial parameters and set ProcParams newParams; for (size_t i=0; itrimValues (&newParams); selected[i]->setProcParams (newParams, NULL, BATCHEDITOR, true); } } for (size_t i=0; iclearParamChanges (); } void BatchToolPanelCoordinator::initSession () { somethingChanged = false; initialPP.resize (selected.size()); for (size_t i=0; igetProcParams (); selected[i]->applyAutoExp (initialPP[i]); selected[i]->addThumbnailListener (this); } // compare all the ProcParams and describe which parameters has different (i.e. inconsistent) values in pparamsEdited pparamsEdited.initFrom (initialPP); crop->setDimensions (100000, 100000); /* if (!selected.empty()) { pparams = selected[0]->getProcParams (); for (int i=0; isetDefaults (&pparams, &pparamsEdited); toolPanels[i]->read (&pparams, &pparamsEdited); } for (int i=0; iprocParamsChanged (&pparams, rtengine::EvPhotoLoaded, "batch processing", &pparamsEdited); } */ if (!selected.empty()) { // The first selected image (in the thumbnail list, not the click list) is used to populate the EditorPanel and set the default values pparams = selected[0]->getProcParams (); coarse->initBatchBehavior (); if (selected.size()==1) { for (size_t i=0; isetMultiImage(false); toneCurve->setAdjusterBehavior (false, false, false, false, false, false, false, false); lcurve->setAdjusterBehavior (false, false, false); whitebalance->setAdjusterBehavior (false, false, false); vibrance->setAdjusterBehavior (false, false); vignetting->setAdjusterBehavior (false, false, false, false); colorappearance->setAdjusterBehavior (false, false, false, false, false, false, false, false, false, false, false, false, false); rotate->setAdjusterBehavior (false); distortion->setAdjusterBehavior (false); perspective->setAdjusterBehavior (false); gradient->setAdjusterBehavior (false, false, false, false); pcvignette->setAdjusterBehavior (false, false, false); cacorrection->setAdjusterBehavior (false); sharpening->setAdjusterBehavior (false); sharpenEdge->setAdjusterBehavior (false, false); sharpenMicro->setAdjusterBehavior (false, false); icm->setAdjusterBehavior (false, false); chmixer->setAdjusterBehavior (false); blackwhite->setAdjusterBehavior (false,false); colortoning->setAdjusterBehavior (false, false, false, false, false); filmSimulation->setAdjusterBehavior(false); shadowshighlights->setAdjusterBehavior (false, false, false); dirpyrequalizer->setAdjusterBehavior (false, false, false); wavelet->setAdjusterBehavior (false, false, false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false, false, false); dirpyrdenoise->setAdjusterBehavior (false, false,false,false,false,false, false); bayerpreprocess->setAdjusterBehavior (false, false); rawcacorrection->setAdjusterBehavior (false); flatfield->setAdjusterBehavior(false); rawexposure->setAdjusterBehavior (false, false); bayerrawexposure->setAdjusterBehavior (false); xtransrawexposure->setAdjusterBehavior (false); } else { for (size_t i=0; isetMultiImage(true); toneCurve->setAdjusterBehavior (options.baBehav[ADDSET_TC_EXPCOMP], options.baBehav[ADDSET_TC_HLCOMPAMOUNT],options.baBehav[ADDSET_TC_HLCOMPTHRESH], options.baBehav[ADDSET_TC_BRIGHTNESS], options.baBehav[ADDSET_TC_BLACKLEVEL],options.baBehav[ADDSET_TC_SHCOMP], options.baBehav[ADDSET_TC_CONTRAST], options.baBehav[ADDSET_TC_SATURATION]); lcurve->setAdjusterBehavior (options.baBehav[ADDSET_LC_BRIGHTNESS], options.baBehav[ADDSET_LC_CONTRAST], options.baBehav[ADDSET_LC_CHROMATICITY]); whitebalance->setAdjusterBehavior (options.baBehav[ADDSET_WB_TEMPERATURE], options.baBehav[ADDSET_WB_GREEN], options.baBehav[ADDSET_WB_EQUAL]); vibrance->setAdjusterBehavior (options.baBehav[ADDSET_VIBRANCE_PASTELS], options.baBehav[ADDSET_VIBRANCE_SATURATED]); vignetting->setAdjusterBehavior (options.baBehav[ADDSET_VIGN_AMOUNT], options.baBehav[ADDSET_VIGN_RADIUS], options.baBehav[ADDSET_VIGN_STRENGTH], options.baBehav[ADDSET_VIGN_CENTER]); colorappearance->setAdjusterBehavior (options.baBehav[ADDSET_CAT_DEGREE], options.baBehav[ADDSET_CAT_ADAPTSCENE], options.baBehav[ADDSET_CAT_ADAPTVIEWING],options.baBehav[ADDSET_CAT_BADPIX], options.baBehav[ADDSET_CAT_LIGHT], options.baBehav[ADDSET_CAT_CHROMA],options.baBehav[ADDSET_CAT_CONTRAST],options.baBehav[ADDSET_CAT_RSTPRO],options.baBehav[ADDSET_CAT_BRIGHT],options.baBehav[ADDSET_CAT_CONTRAST_Q],options.baBehav[ADDSET_CAT_CHROMA_S],options.baBehav[ADDSET_CAT_CHROMA_M],options.baBehav[ADDSET_CAT_HUE]); rotate->setAdjusterBehavior (options.baBehav[ADDSET_ROTATE_DEGREE]); distortion->setAdjusterBehavior (options.baBehav[ADDSET_DIST_AMOUNT]); perspective->setAdjusterBehavior (options.baBehav[ADDSET_PERSPECTIVE]); gradient->setAdjusterBehavior (options.baBehav[ADDSET_GRADIENT_DEGREE], options.baBehav[ADDSET_GRADIENT_FEATHER], options.baBehav[ADDSET_GRADIENT_STRENGTH], options.baBehav[ADDSET_GRADIENT_CENTER]); pcvignette->setAdjusterBehavior (options.baBehav[ADDSET_PCVIGNETTE_STRENGTH], options.baBehav[ADDSET_PCVIGNETTE_FEATHER], options.baBehav[ADDSET_PCVIGNETTE_ROUNDNESS]); cacorrection->setAdjusterBehavior (options.baBehav[ADDSET_CA]); sharpening->setAdjusterBehavior (options.baBehav[ADDSET_SHARP_AMOUNT]); sharpenEdge->setAdjusterBehavior (options.baBehav[ADDSET_SHARPENEDGE_AMOUNT],options.baBehav[ADDSET_SHARPENEDGE_PASS]); sharpenMicro->setAdjusterBehavior (options.baBehav[ADDSET_SHARPENMICRO_AMOUNT],options.baBehav[ADDSET_SHARPENMICRO_UNIFORMITY]); icm->setAdjusterBehavior (options.baBehav[ADDSET_FREE_OUPUT_GAMMA],options.baBehav[ADDSET_FREE_OUTPUT_SLOPE]); // colortoning->setAdjusterBehavior (options.baBehav[ADDSET_COLORTONING_SPLIT], options.baBehav[ADDSET_COLORTONING_SATTHRESHOLD], options.baBehav[ADDSET_COLORTONING_SATOPACITY], options.baBehav[ADDSET_COLORTONING_STRPROTECT], options.baBehav[ADDSET_COLORTONING_BALANCE]); colortoning->setAdjusterBehavior (options.baBehav[ADDSET_COLORTONING_SPLIT], options.baBehav[ADDSET_COLORTONING_SATTHRESHOLD], options.baBehav[ADDSET_COLORTONING_SATOPACITY], options.baBehav[ADDSET_COLORTONING_STRENGTH], options.baBehav[ADDSET_COLORTONING_BALANCE]); filmSimulation->setAdjusterBehavior(options.baBehav[ADDSET_FILMSIMULATION_STRENGTH]); chmixer->setAdjusterBehavior (options.baBehav[ADDSET_CHMIXER] ); blackwhite->setAdjusterBehavior (options.baBehav[ADDSET_BLACKWHITE_HUES],options.baBehav[ADDSET_BLACKWHITE_GAMMA]); shadowshighlights->setAdjusterBehavior (options.baBehav[ADDSET_SH_HIGHLIGHTS], options.baBehav[ADDSET_SH_SHADOWS], options.baBehav[ADDSET_SH_LOCALCONTRAST]); dirpyrequalizer->setAdjusterBehavior (options.baBehav[ADDSET_DIRPYREQ], options.baBehav[ADDSET_DIRPYREQ_THRESHOLD], options.baBehav[ADDSET_DIRPYREQ_SKINPROTECT]); wavelet->setAdjusterBehavior (options.baBehav[ADDSET_WA], options.baBehav[ADDSET_WA_THRESHOLD], options.baBehav[ADDSET_WA_THRESHOLD2],options.baBehav[ADDSET_WA_THRES],options.baBehav[ADDSET_WA_CHRO],options.baBehav[ADDSET_WA_CHROMA],options.baBehav[ADDSET_WA_CONTRAST],options.baBehav[ADDSET_WA_SKINPROTECT],options.baBehav[ADDSET_WA_RESCHRO],options.baBehav[ADDSET_WA_TMRS],options.baBehav[ADDSET_WA_RESCON],options.baBehav[ADDSET_WA_RESCONH],options.baBehav[ADDSET_WA_THRR],options.baBehav[ADDSET_WA_THRRH],options.baBehav[ADDSET_WA_SKYPROTECT], options.baBehav[ADDSET_WA_EDGRAD],options.baBehav[ADDSET_WA_EDGVAL],options.baBehav[ADDSET_WA_STRENGTH],options.baBehav[ADDSET_WA_GAMMA],options.baBehav[ADDSET_WA_EDGEDETECT], options.baBehav[ADDSET_WA_EDGEDETECTTHR], options.baBehav[ADDSET_WA_EDGEDETECTTHR2]); dirpyrdenoise->setAdjusterBehavior (options.baBehav[ADDSET_DIRPYRDN_LUMA],options.baBehav[ADDSET_DIRPYRDN_LUMDET],options.baBehav[ADDSET_DIRPYRDN_CHROMA],options.baBehav[ADDSET_DIRPYRDN_CHROMARED],options.baBehav[ADDSET_DIRPYRDN_CHROMABLUE], options.baBehav[ADDSET_DIRPYRDN_GAMMA], options.baBehav[ADDSET_DIRPYRDN_PASSES]); bayerpreprocess->setAdjusterBehavior (options.baBehav[ADDSET_PREPROCESS_LINEDENOISE], options.baBehav[ADDSET_PREPROCESS_GREENEQUIL]); rawcacorrection->setAdjusterBehavior (options.baBehav[ADDSET_RAWCACORR]); flatfield->setAdjusterBehavior(options.baBehav[ADDSET_RAWFFCLIPCONTROL]); rawexposure->setAdjusterBehavior (options.baBehav[ADDSET_RAWEXPOS_LINEAR], options.baBehav[ADDSET_RAWEXPOS_PRESER]); bayerrawexposure->setAdjusterBehavior (options.baBehav[ADDSET_RAWEXPOS_BLACKS]); xtransrawexposure->setAdjusterBehavior (options.baBehav[ADDSET_RAWEXPOS_BLACKS]); if (options.baBehav[ADDSET_TC_EXPCOMP]) pparams.toneCurve.expcomp = 0; if (options.baBehav[ADDSET_TC_HLCOMPAMOUNT]) pparams.toneCurve.hlcompr = 0; if (options.baBehav[ADDSET_TC_HLCOMPTHRESH]) pparams.toneCurve.hlcomprthresh = 0; if (options.baBehav[ADDSET_TC_BRIGHTNESS]) pparams.toneCurve.brightness = 0; if (options.baBehav[ADDSET_TC_BLACKLEVEL]) pparams.toneCurve.black = 0; if (options.baBehav[ADDSET_TC_SHCOMP]) pparams.toneCurve.shcompr = 0; if (options.baBehav[ADDSET_TC_CONTRAST]) pparams.toneCurve.contrast = 0; if (options.baBehav[ADDSET_SH_HIGHLIGHTS]) pparams.sh.highlights = 0; if (options.baBehav[ADDSET_SH_SHADOWS]) pparams.sh.shadows = 0; if (options.baBehav[ADDSET_SH_LOCALCONTRAST]) pparams.sh.localcontrast = 0; if (options.baBehav[ADDSET_LC_BRIGHTNESS]) pparams.labCurve.brightness = 0; if (options.baBehav[ADDSET_LC_CONTRAST]) pparams.labCurve.contrast = 0; if (options.baBehav[ADDSET_LC_CHROMATICITY]) pparams.labCurve.chromaticity = 0; if (options.baBehav[ADDSET_SHARP_AMOUNT]) pparams.sharpening.amount = 0; if (options.baBehav[ADDSET_SHARPENEDGE_AMOUNT]) pparams.sharpenEdge.amount = 0; if (options.baBehav[ADDSET_SHARPENMICRO_AMOUNT]) pparams.sharpenMicro.amount = 0; if (options.baBehav[ADDSET_SHARPENEDGE_PASS]) pparams.sharpenEdge.passes = 0; if (options.baBehav[ADDSET_SHARPENMICRO_UNIFORMITY]) pparams.sharpenMicro.uniformity = 0; if (options.baBehav[ADDSET_CHMIXER]) for (int i=0; i<3; i++) pparams.chmixer.red[i] = pparams.chmixer.green[i] = pparams.chmixer.blue[i] = 0; if (options.baBehav[ADDSET_BLACKWHITE_HUES]) pparams.blackwhite.mixerRed=pparams.blackwhite.mixerOrange=pparams.blackwhite.mixerYellow= pparams.blackwhite.mixerGreen=pparams.blackwhite.mixerCyan=pparams.blackwhite.mixerBlue= pparams.blackwhite.mixerMagenta=pparams.blackwhite.mixerPurple=0; if (options.baBehav[ADDSET_BLACKWHITE_GAMMA]) pparams.blackwhite.gammaRed=pparams.blackwhite.gammaGreen=pparams.blackwhite.gammaBlue = 0; //if (options.baBehav[ADDSET_LD_EDGETOLERANCE]) pparams.lumaDenoise.edgetolerance = 0; if (options.baBehav[ADDSET_WB_TEMPERATURE]) pparams.wb.temperature = 0; if (options.baBehav[ADDSET_WB_GREEN]) pparams.wb.green = 0; if (options.baBehav[ADDSET_WB_EQUAL]) pparams.wb.equal = 0; if (options.baBehav[ADDSET_VIBRANCE_PASTELS]) pparams.vibrance.pastels = 0; if (options.baBehav[ADDSET_VIBRANCE_SATURATED]) pparams.vibrance.saturated = 0; if (options.baBehav[ADDSET_CAT_DEGREE]) pparams.colorappearance.degree = 0; if (options.baBehav[ADDSET_CAT_ADAPTSCENE]) pparams.colorappearance.adapscen = 0; if (options.baBehav[ADDSET_CAT_ADAPTVIEWING]) pparams.colorappearance.adaplum = 0; if (options.baBehav[ADDSET_CAT_BADPIX]) pparams.colorappearance.badpixsl = 0; if (options.baBehav[ADDSET_CAT_LIGHT]) pparams.colorappearance.jlight = 0; if (options.baBehav[ADDSET_CAT_BRIGHT]) pparams.colorappearance.qbright = 0; if (options.baBehav[ADDSET_CAT_CHROMA]) pparams.colorappearance.chroma = 0; if (options.baBehav[ADDSET_CAT_CHROMA_S]) pparams.colorappearance.schroma = 0; if (options.baBehav[ADDSET_CAT_CHROMA_M]) pparams.colorappearance.mchroma = 0; if (options.baBehav[ADDSET_CAT_RSTPRO]) pparams.colorappearance.rstprotection = 0; if (options.baBehav[ADDSET_CAT_CONTRAST]) pparams.colorappearance.contrast = 0; if (options.baBehav[ADDSET_CAT_CONTRAST_Q]) pparams.colorappearance.qcontrast = 0; if (options.baBehav[ADDSET_CAT_HUE]) pparams.colorappearance.colorh = 0; if (options.baBehav[ADDSET_FREE_OUPUT_GAMMA]) pparams.icm.gampos = 0; if (options.baBehav[ADDSET_FREE_OUTPUT_SLOPE]) pparams.icm.slpos = 0; //if (options.baBehav[ADDSET_CBOOST_AMOUNT]) pparams.colorBoost.amount = 0; //if (options.baBehav[ADDSET_CS_BLUEYELLOW]) pparams.colorShift.a = 0; //if (options.baBehav[ADDSET_CS_GREENMAGENTA]) pparams.colorShift.b = 0; if (options.baBehav[ADDSET_COLORTONING_SPLIT]) pparams.colorToning.redlow = pparams.colorToning.greenlow = pparams.colorToning.bluelow = pparams.colorToning.redmed = pparams.colorToning.greenmed = pparams.colorToning.bluemed = pparams.colorToning.redhigh = pparams.colorToning.greenhigh = pparams.colorToning.bluehigh = pparams.colorToning.satlow = pparams.colorToning.sathigh = 0; if (options.baBehav[ADDSET_COLORTONING_SATTHRESHOLD]) pparams.colorToning.satProtectionThreshold = 0; if (options.baBehav[ADDSET_COLORTONING_SATOPACITY]) pparams.colorToning.saturatedOpacity = 0; if (options.baBehav[ADDSET_COLORTONING_BALANCE]) pparams.colorToning.balance = 0; if (options.baBehav[ADDSET_COLORTONING_STRENGTH]) pparams.colorToning.strength = 0; if (options.baBehav[ADDSET_FILMSIMULATION_STRENGTH]) pparams.filmSimulation.strength = 0; if (options.baBehav[ADDSET_ROTATE_DEGREE]) pparams.rotate.degree = 0; if (options.baBehav[ADDSET_DIST_AMOUNT]) pparams.distortion.amount = 0; if (options.baBehav[ADDSET_PERSPECTIVE]) pparams.perspective.horizontal = pparams.perspective.vertical = 0; if (options.baBehav[ADDSET_GRADIENT_DEGREE]) pparams.gradient.degree = 0; if (options.baBehav[ADDSET_GRADIENT_FEATHER]) pparams.gradient.feather = 0; if (options.baBehav[ADDSET_GRADIENT_STRENGTH]) pparams.gradient.strength = 0; if (options.baBehav[ADDSET_GRADIENT_CENTER]) pparams.gradient.centerX = 0; if (options.baBehav[ADDSET_GRADIENT_CENTER]) pparams.gradient.centerY = 0; if (options.baBehav[ADDSET_PCVIGNETTE_STRENGTH]) pparams.pcvignette.strength = 0; if (options.baBehav[ADDSET_PCVIGNETTE_FEATHER]) pparams.pcvignette.feather = 0; if (options.baBehav[ADDSET_PCVIGNETTE_ROUNDNESS]) pparams.pcvignette.roundness = 0; if (options.baBehav[ADDSET_CA]) pparams.cacorrection.red = 0; if (options.baBehav[ADDSET_CA]) pparams.cacorrection.blue = 0; if (options.baBehav[ADDSET_VIGN_AMOUNT]) pparams.vignetting.amount = 0; if (options.baBehav[ADDSET_VIGN_RADIUS]) pparams.vignetting.radius = 0; if (options.baBehav[ADDSET_VIGN_STRENGTH]) pparams.vignetting.strength = 0; if (options.baBehav[ADDSET_VIGN_CENTER]) pparams.vignetting.centerX = 0; if (options.baBehav[ADDSET_VIGN_CENTER]) pparams.vignetting.centerY = 0; if (options.baBehav[ADDSET_DIRPYREQ]) for (int i=0; i<6; i++) pparams.dirpyrequalizer.mult[i] = 0; if (options.baBehav[ADDSET_DIRPYREQ_THRESHOLD]) pparams.dirpyrequalizer.threshold = 0; if (options.baBehav[ADDSET_DIRPYREQ_SKINPROTECT]) pparams.dirpyrequalizer.skinprotect = 0; if (options.baBehav[ADDSET_WA]) for (int i=0; i<8; i++) pparams.wavelet.c[i] = 0; if (options.baBehav[ADDSET_WA_THRESHOLD]) pparams.wavelet.threshold = 0; if (options.baBehav[ADDSET_WA_THRESHOLD2]) pparams.wavelet.threshold2 = 0; if (options.baBehav[ADDSET_WA_SKINPROTECT]) pparams.wavelet.skinprotect = 0; if (options.baBehav[ADDSET_WA_CHRO]) pparams.wavelet.chro = 0; if (options.baBehav[ADDSET_WA_CHROMA]) pparams.wavelet.chroma = 0; if (options.baBehav[ADDSET_WA_CONTRAST]) pparams.wavelet.contrast = 0; if (options.baBehav[ADDSET_WA_THRES]) pparams.wavelet.thres = 0; if (options.baBehav[ADDSET_WA_RESCON]) pparams.wavelet.rescon = 0; if (options.baBehav[ADDSET_WA_RESCONH]) pparams.wavelet.resconH = 0; if (options.baBehav[ADDSET_WA_RESCHRO]) pparams.wavelet.reschro = 0; if (options.baBehav[ADDSET_WA_TMRS]) pparams.wavelet.tmrs = 0; if (options.baBehav[ADDSET_WA_THRR]) pparams.wavelet.thr = 0; if (options.baBehav[ADDSET_WA_THRRH]) pparams.wavelet.thrH = 0; if (options.baBehav[ADDSET_WA_SKYPROTECT]) pparams.wavelet.sky = 0; if (options.baBehav[ADDSET_WA_EDGRAD]) pparams.wavelet.edgrad = 0; if (options.baBehav[ADDSET_WA_EDGVAL]) pparams.wavelet.edgval = 0; if (options.baBehav[ADDSET_WA_STRENGTH]) pparams.wavelet.strength = 0; if (options.baBehav[ADDSET_WA_EDGEDETECT]) pparams.wavelet.edgedetect = 0; if (options.baBehav[ADDSET_WA_GAMMA]) pparams.wavelet.gamma = 0; if (options.baBehav[ADDSET_DIRPYRDN_LUMA]) pparams.dirpyrDenoise.luma = 0; if (options.baBehav[ADDSET_DIRPYRDN_CHROMA]) pparams.dirpyrDenoise.chroma = 0; if (options.baBehav[ADDSET_DIRPYRDN_CHROMARED]) pparams.dirpyrDenoise.redchro = 0; if (options.baBehav[ADDSET_DIRPYRDN_CHROMABLUE]) pparams.dirpyrDenoise.bluechro = 0; // pparams.dirpyrDenoise.Ldetail = pparams.dirpyrDenoise.luma = pparams.dirpyrDenoise.chroma = 0; if (options.baBehav[ADDSET_DIRPYRDN_GAMMA]) pparams.dirpyrDenoise.gamma = 0; if (options.baBehav[ADDSET_RAWCACORR]) pparams.raw.cablue = pparams.raw.cared = 0; if (options.baBehav[ADDSET_RAWEXPOS_LINEAR]) pparams.raw.expos = 0; if (options.baBehav[ADDSET_RAWEXPOS_PRESER]) pparams.raw.preser = 0; if (options.baBehav[ADDSET_RAWEXPOS_BLACKS]) { pparams.raw.bayersensor.black0 = pparams.raw.bayersensor.black1 = pparams.raw.bayersensor.black2 = pparams.raw.bayersensor.black3 = 0; pparams.raw.xtranssensor.blackred = pparams.raw.xtranssensor.blackgreen = pparams.raw.xtranssensor.blackblue = 0; } if (options.baBehav[ADDSET_RAWFFCLIPCONTROL]) pparams.raw.ff_clipControl = 0; if (options.baBehav[ADDSET_PREPROCESS_GREENEQUIL]) pparams.raw.bayersensor.greenthresh = 0; if (options.baBehav[ADDSET_PREPROCESS_LINEDENOISE]) pparams.raw.bayersensor.linenoise = 0; } for (size_t i=0; isetDefaults (&pparams, &pparamsEdited); toolPanels[i]->read (&pparams, &pparamsEdited); // TODO: autoOpenCurve has been disabled because initSession is called on each parameter change from the editor panel, // if the thumbnail remains selected in the DirectoryBrowser (i.e. always, unless the user think about deselecting it) //toolPanels[i]->autoOpenCurve(); } for (size_t i=0; iprocParamsChanged (&pparams, rtengine::EvPhotoLoaded, M("BATCH_PROCESSING"), &pparamsEdited); } } void BatchToolPanelCoordinator::panelChanged (rtengine::ProcEvent event, const Glib::ustring& descr) { if (selected.empty()) return; somethingChanged = true; pparamsEdited.set (false); // read new values from the gui for (size_t i=0; iwrite (&pparams, &pparamsEdited); // If only a single item is selected, we emulate the behaviour of the editor tool panel coordinator, // otherwise we adjust the inital parameters on a per-image basis. if (selected.size()==1) { // Compensate rotation on flip if (event==rtengine::EvCTHFlip || event==rtengine::EvCTVFlip) { if (fabs(pparams.rotate.degree)>0.001) { pparams.rotate.degree *= -1; rotate->read (&pparams); } } int w, h; selected[0]->getFinalSize (selected[0]->getProcParams (), w, h); crop->setDimensions(w, h); // Some transformations change the crop and resize parameter for convenience. if (event==rtengine::EvCTHFlip) { crop->hFlipCrop (); crop->write (&pparams, &pparamsEdited); } else if (event==rtengine::EvCTVFlip) { crop->vFlipCrop (); crop->write (&pparams, &pparamsEdited); } else if (event==rtengine::EvCTRotate) { crop->rotateCrop (pparams.coarse.rotate, pparams.coarse.hflip, pparams.coarse.vflip); crop->write (&pparams, &pparamsEdited); resize->update (pparams.crop.enabled, pparams.crop.w, pparams.crop.h, w, h); resize->write (&pparams, &pparamsEdited); } else if (event==rtengine::EvCrop) { resize->update (pparams.crop.enabled, pparams.crop.w, pparams.crop.h); resize->write (&pparams, &pparamsEdited); } } else { // Compensate rotation on flip if (event==rtengine::EvCTHFlip || event==rtengine::EvCTVFlip) { for (size_t i=0; i 0.001) { initialPP[i].rotate.degree *= -1.0; pparamsEdited.rotate.degree = false; } } } // some transformations make the crop change for convenience if (event==rtengine::EvCTHFlip) { for (size_t i=0; igetFinalSize (selected[i]->getProcParams (), w, h); rtengine::procparams::CropParams& crop = initialPP[i].crop; crop.x = w - crop.x - crop.w; pparamsEdited.crop.x = false; } } else if (event==rtengine::EvCTVFlip) { for (size_t i=0; igetFinalSize (selected[i]->getProcParams (), w, h); rtengine::procparams::CropParams& crop = initialPP[i].crop; crop.y = h - crop.y - crop.h; pparamsEdited.crop.y = false; } } else if (event==rtengine::EvCTRotate) { int newDeg = pparams.coarse.rotate; for (size_t i=0; igetFinalSize (selected[i]->getProcParams (), w, h); int oldDeg = initialPP[i].coarse.rotate; rtengine::procparams::CropParams& crop = initialPP[i].crop; int rotation = (360 + newDeg - oldDeg) % 360; ProcParams pptemp = selected[i]->getProcParams(); // Get actual procparams if((pptemp.coarse.hflip != pptemp.coarse.vflip) && ((rotation%180)==90)) rotation = (rotation + 180)%360; switch (rotation) { case 90: std::swap(crop.x, crop.y); std::swap(crop.w, crop.h); crop.x = h - crop.x - crop.w; break; case 270: std::swap(crop.x, crop.y); std::swap(crop.w, crop.h); crop.y = w - crop.y - crop.h; break; case 180: crop.x = w - crop.x - crop.w; crop.y = h - crop.y - crop.h; break; } initialPP[i].coarse.rotate = newDeg; } pparamsEdited.crop.x = false; pparamsEdited.crop.y = false; pparamsEdited.crop.w = false; pparamsEdited.crop.h = false; pparamsEdited.coarse.rotate = false; } } if (event==rtengine::EvAutoExp || event==rtengine::EvClip) for (size_t i=0; iapplyAutoExp (initialPP[i]); } if (event==rtengine::EvAutoDIST) { for (size_t i=0; itrimValues (&newParams); selected[i]->setProcParams (newParams, NULL, BATCHEDITOR, false); } for (size_t i=0; iprocParamsChanged (&pparams, event, descr, &pparamsEdited); } void BatchToolPanelCoordinator::getAutoWB (double& temp, double& green, double equal) { if (!selected.empty()) selected[0]->getAutoWB (temp, green, equal); } void BatchToolPanelCoordinator::getCamWB (double& temp, double& green) { if (!selected.empty()) selected[0]->getCamWB (temp, green); } void BatchToolPanelCoordinator::optionsChanged () { closeSession (); initSession (); } void BatchToolPanelCoordinator::procParamsChanged (Thumbnail* thm, int whoChangedIt) { if (whoChangedIt!=BATCHEDITOR && !blockedUpdate) { closeSession (false); initSession (); } } void BatchToolPanelCoordinator::beginBatchPParamsChange(int numberOfEntries) { blockedUpdate = true; if (numberOfEntries > 50) // Arbitrary amount parent->set_sensitive(false); } // The end of a batch pparams change triggers a close/initsession void BatchToolPanelCoordinator::endBatchPParamsChange() { //printf("BatchToolPanelCoordinator::endBatchPParamsChange / Nouvelle session!\n"); closeSession (false); initSession (); blockedUpdate = false; parent->set_sensitive(true); } /* * WARNING: profileChange is actually called by the History only. * Using a Profile panel in the batch tool panel editor is actually * not supported by BatchToolPanelCoordinator::profileChange! */ void BatchToolPanelCoordinator::profileChange (const rtengine::procparams::PartialProfile* nparams, rtengine::ProcEvent event, const Glib::ustring& descr, const ParamsEdited* paramsEdited) { if (event==rtengine::EvProfileChanged) { // a profile has been selected in a hypothetical Profile panel // -> ACTUALLY NOT SUPPORTED return; } pparams = *(nparams->pparams); if (paramsEdited) pparamsEdited = *paramsEdited; for (size_t i=0; iread (&pparams, &pparamsEdited); // I guess we don't want to automatically unfold curve editors here... somethingChanged = true; // read new values from the gui for (size_t i=0; iwrite (&pparams, &pparamsEdited); // combine with initial parameters of each image and set ProcParams newParams; for (size_t i=0; isetProcParams (newParams, NULL, BATCHEDITOR, false); } for (size_t i=0; iprocParamsChanged (&pparams, event, descr, &pparamsEdited); } void BatchToolPanelCoordinator::cropSelectionReady () { toolBar->setTool (TMHand); } CropGUIListener* BatchToolPanelCoordinator::startCropEditing (Thumbnail* thm) { if (thm) { int w, h; thm->getFinalSize (thm->getProcParams (), w, h); crop->setDimensions (w, h); } return crop; } void BatchToolPanelCoordinator::rotateSelectionReady (double rotate_deg, Thumbnail* thm) { toolBar->setTool (TMHand); if (rotate_deg!=0.0) rotate->straighten (rotate_deg); } void BatchToolPanelCoordinator::spotWBselected (int x, int y, Thumbnail* thm) { // toolBar->setTool (TOOL_HAND); if (x>0 && y>0 && thm) { for (size_t i=0; igetSpotWB (x, y, whitebalance->getSize(), temp, green); double otemp = initialPP[i].wb.temperature; double ogreen = initialPP[i].wb.green; if (options.baBehav[12]) temp = temp - otemp; if (options.baBehav[13]) green = green - ogreen; whitebalance->setWB (temp, green); } } }