diff --git a/rtdata/languages/default b/rtdata/languages/default index a2acbba04..236d23aa8 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -79,6 +79,9 @@ FILEBROWSER_PROCESSINGSETTINGS;Settings FILEBROWSER_PROCESSINGSETTINGSHINT;Set the file format and output directory FILEBROWSER_RENAMEDLGLABEL;Rename file FILEBROWSER_RENAMEDLGMSG;Rename file "%1" to: +FILEBROWSER_AUTODARKFRAME;Auto dark frame +FILEBROWSER_MOVETODARKFDIR;Move to dark frames directory +FILEBROWSER_SELECTDARKFRAME;Select dark frame... FILEBROWSER_SHOWDIRHINT;Show all images of the directory D FILEBROWSER_SHOWEXIFINFO;Show EXIF info i FILEBROWSER_SHOWQUEUEHINT;Show content of the processing queue @@ -400,6 +403,7 @@ PREFERENCES_CLEARDLG_LINE2;This may take a few seconds. PREFERENCES_CLEARDLG_TITLE;Please wait PREFERENCES_CLIPPINGIND;Clipping indication PREFERENCES_CMETRICINTENT;Colorimetric Intent +PREFERENCES_DARKFRAME;Dark frame PREFERENCES_DATEFORMAT;Date Format PREFERENCES_DATEFORMATHINT;You can use the following formatting strings:\n%y : year\n%m : month\n%d : day\n\nFor example, the hungarian date format is:\n%y/%m/%d PREFERENCES_DCBENHANCE;Apply DCB enhancement step @@ -407,6 +411,7 @@ PREFERENCES_DCBITERATIONS;Number of DCB iterations PREFERENCES_DEFAULTLANG;Default language PREFERENCES_DEFAULTTHEME;Default theme PREFERENCES_DEMOSAICINGALGO;Demosaicing Algorithm +PREFERENCES_DIRDARKFRAMES;Dark frames directory PREFERENCES_DIRHOME;Home directory PREFERENCES_DIRLAST;Last visited directory PREFERENCES_DIROTHER;Other @@ -632,6 +637,8 @@ TP_LUMADENOISE_RADIUS;Radius TP_PERSPECTIVE_HORIZONTAL;Horizontal TP_PERSPECTIVE_LABEL;Perspective TP_PERSPECTIVE_VERTICAL;Vertical +TP_PREPROCESS_DARKFRAME;Dark frame +TP_PREPROCESS_DFAUTOSELECT;Auto selection TP_RESIZE_BICUBIC;Bicubic TP_RESIZE_BICUBICSF;Bicubic (Softer) TP_RESIZE_BICUBICSH;Bicubic (Sharper) diff --git a/rtengine/dfmanager.cc b/rtengine/dfmanager.cc index c5bd17ac5..c6b1a3902 100644 --- a/rtengine/dfmanager.cc +++ b/rtengine/dfmanager.cc @@ -225,13 +225,15 @@ void DFManager::init( Glib::ustring pathname ) i.pathNames.push_back( i.pathname ); i.pathname.clear(); } - if( !i.pathname.empty() ) - printf( "%s: %s\n",i.key().c_str(),i.pathname.c_str()); - else{ - printf( "%s: MEAN of \n ",i.key().c_str()); - for( std::list::iterator iter = i.pathNames.begin(); iter != i.pathNames.end();iter++ ) - printf( "%s, ", iter->c_str() ); - printf("\n"); + if( settings->verbose ){ + if( !i.pathname.empty() ) + printf( "%s: %s\n",i.key().c_str(),i.pathname.c_str()); + else{ + printf( "%s: MEAN of \n ",i.key().c_str()); + for( std::list::iterator iter = i.pathNames.begin(); iter != i.pathNames.end();iter++ ) + printf( "%s, ", iter->c_str() ); + printf("\n"); + } } } currentPath = pathname; diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 670a93fe3..fc09b7fc7 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -349,7 +349,7 @@ int RawImageSource::cfaCleanFromMap( BYTE* bitmapBads ) if (bitmapBads[ (row+dy) *bmpW + (col+dx)/8] & (1<<(col+dx)%8)) continue; sum += rawData[row+dy][col+dx]; tot++; - if (bitmapBads[ (row-dy) *bmpW + (col-dx)/8] & (1<<(col+dx)%8)) continue; + if (bitmapBads[ (row-dy) *bmpW + (col-dx)/8] & (1<<(col-dx)%8)) continue; double dirwt = 1/( fabs( rawData[row+dy][col+dx]- rawData[row-dy][col-dx])+eps); wtdsum += dirwt* rawData[row+dy][col+dx]; @@ -731,8 +731,9 @@ int RawImageSource::load (Glib::ustring fname) { int res = ri->loadRaw (); if (res) return res; - - plistener=NULL; //\TODO must be reintroduced + if (plistener) { + plistener->setProgress (0.8); + } /***** Copy once constant data extracted from raw *******/ W = ri->width; H = ri->height; @@ -764,19 +765,13 @@ int RawImageSource::load (Glib::ustring fname) { int val, dark, sat; double dsum[8], dmin, dmax; float pre_mul[4]; - bool use_camera_wb=true; - bool use_auto_wb=false; - bool highlight=true; - for (int c = 0; c < 4; c++){ cblack[c] = ri->cblack[c] + ri->black_point; pre_mul[c] = ri->pre_mul[c]; } - /* - if (user_mul[0]) - memcpy(pre_mul, user_mul, sizeof pre_mul);*/ - if (use_auto_wb || (use_camera_wb && ri->cam_mul[0] == -1)) { + + if ( ri->cam_mul[0] == -1 ) { memset(dsum, 0, sizeof dsum); for (row = 0; row < H; row += 8) for (col = 0; col < W; col += 8) { @@ -806,7 +801,7 @@ skip_block: ; if (dsum[c]) pre_mul[c] = dsum[c + 4] / dsum[c]; } - if (use_camera_wb && ri->cam_mul[0] != -1) { + if ( ri->cam_mul[0] != -1) { memset(sum, 0, sizeof sum); for (row = 0; row < 8; row++) for (col = 0; col < 8; col++) { @@ -834,8 +829,7 @@ skip_block: ; if (dmax < pre_mul[c]) dmax = pre_mul[c]; } - if (!highlight) - dmax = dmin; + dmax = dmin; for (c = 0; c < 4; c++) scale_mul[c] = (pre_mul[c] /= dmax) * 65535.0 / sat; if (settings->verbose) { @@ -873,6 +867,10 @@ skip_block: ; blue = allocArray(W,H); hpmap = allocArray(W, H); + if (plistener) { + plistener->setProgress (1.0); + } + plistener=NULL; // This must be reset, because only load() is called through progressConnector return 0; // OK! } @@ -894,9 +892,10 @@ void RawImageSource::preprocess (const RAWParams &raw) size_t dimBitmap = widthBitmap*ri->height; BYTE *bitmapBads = new BYTE [ dimBitmap ]; + int totBP=0; // Hold count of bad pixels to correct std::list *bp = dfm.getBadPixels( ri->make, ri->model, std::string("") ); if( bp ){ - for(std::list::iterator iter = bp->begin(); iter != bp->end(); iter++) + for(std::list::iterator iter = bp->begin(); iter != bp->end(); iter++,totBP++) bitmapBads[ widthBitmap * (iter->y) + (iter->x)/8] |= 1<<(iter->x%8); if( settings->verbose ){ printf( "Correcting %u pixels from .badpixels\n",bp->size()); @@ -908,7 +907,7 @@ void RawImageSource::preprocess (const RAWParams &raw) }else if( raw.dark_frame.size()>0 ) bp = dfm.getHotPixels( raw.dark_frame ); if(bp){ - for(std::list::iterator iter = bp->begin(); iter != bp->end(); iter++) + for(std::list::iterator iter = bp->begin(); iter != bp->end(); iter++,totBP++) bitmapBads[ widthBitmap *iter->y + iter->x/8] |= 1<<(iter->x%8); if( settings->verbose && bp->size()>0){ printf( "Correcting %u hotpixels from darkframe\n",bp->size()); @@ -925,11 +924,13 @@ void RawImageSource::preprocess (const RAWParams &raw) plistener->setProgress (0.0); } int nFound =findHotDeadPixel( bitmapBads,0.1 ); + totBP += nFound; if( settings->verbose && nFound>0){ printf( "Correcting %d hot/dead pixels found inside image\n",nFound ); } } - cfaCleanFromMap( bitmapBads ); + if( totBP ) + cfaCleanFromMap( bitmapBads ); delete [] bitmapBads; // check if it is an olympus E camera, if yes, compute G channel pre-compensation factors diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc index 4eba917f3..9e66b2c35 100644 --- a/rtgui/editorpanel.cc +++ b/rtgui/editorpanel.cc @@ -23,6 +23,7 @@ #include #include #include +#include using namespace rtengine::procparams; @@ -333,7 +334,8 @@ void EditorPanel::open (Thumbnail* tmb, rtengine::InitialImage* isrc) { ldprof = new ProcParams (); *ldprof = openThm->getProcParams (); } - + rtengine::ImageSource* is=isrc->getImageSource(); + is->setProgressListener( this ); // initialize profile if (openThm->getType()!=FT_Raw) profilep->initProfile (options.defProfImg, ldprof, NULL); @@ -426,6 +428,48 @@ void EditorPanel::setProgressState (int state) { g_idle_add (setprocstate, p); } +struct spparams { + double val; + Glib::ustring str; + rtengine::ProgressListener* progListener; +}; + +int _setprogress( void *p ) +{ + spparams *s= (spparams*)p; + gdk_threads_enter (); + s->progListener->setProgress( s->val ); + gdk_threads_leave (); + delete s; + return 0; +} + +int _setprogressStr( void *p ) +{ + spparams *s= (spparams*)p; + gdk_threads_enter (); + s->progListener->setProgressStr( s->str ); + gdk_threads_leave (); + delete s; + return 0; +} + +void EditorPanel::setProgress (double p) +{ + spparams *s=new spparams; + s->val = p; + s->progListener = parent; + g_idle_add (_setprogress, s); +} + +void EditorPanel::setProgressStr (Glib::ustring str) +{ + spparams *s=new spparams; + s->str = str; + s->progListener = parent; + g_idle_add (_setprogressStr, s); +} + void EditorPanel::refreshProcessingState (bool state) { // Set proc params of thumbnail. It saves it into the cache and updates the file browser. diff --git a/rtgui/editorpanel.h b/rtgui/editorpanel.h index d870a7c33..58a915006 100644 --- a/rtgui/editorpanel.h +++ b/rtgui/editorpanel.h @@ -112,6 +112,8 @@ class EditorPanel : public Gtk::VBox, void setParent (RTWindow* p) { parent = p; } // progresslistener interface + void setProgress (double p); + void setProgressStr (Glib::ustring str); void setProgressState (int state); void error (Glib::ustring descr); void refreshProcessingState (bool state); // this is called by setProcessingState in the gtk thread diff --git a/rtgui/filebrowser.cc b/rtgui/filebrowser.cc index 70377281f..ecc3e0c13 100644 --- a/rtgui/filebrowser.cc +++ b/rtgui/filebrowser.cc @@ -59,9 +59,9 @@ FileBrowser::FileBrowser () pmenu->attach (*(new Gtk::SeparatorMenuItem ()), 0, 1, p, p+1); p++; pmenu->attach (*(selall = new Gtk::MenuItem (M("FILEBROWSER_POPUPSELECTALL"))), 0, 1, p, p+1); p++; pmenu->attach (*(new Gtk::SeparatorMenuItem ()), 0, 1, p, p+1); p++; - pmenu->attach (*(selectDF = new Gtk::MenuItem ("Select Dark Frame...")), 0, 1, p, p+1); p++; - pmenu->attach (*(autoDF = new Gtk::MenuItem ("Auto Dark Frame")), 0, 1, p, p+1); p++; - pmenu->attach (*(thisIsDF = new Gtk::MenuItem ("Move to Dark Frames folder")), 0, 1, p, p+1); p++; + pmenu->attach (*(selectDF = new Gtk::MenuItem (M("FILEBROWSER_SELECTDARKFRAME"))), 0, 1, p, p+1); p++; + pmenu->attach (*(autoDF = new Gtk::MenuItem (M("FILEBROWSER_AUTODARKFRAME"))), 0, 1, p, p+1); p++; + pmenu->attach (*(thisIsDF = new Gtk::MenuItem (M("FILEBROWSER_MOVETODARKFDIR"))), 0, 1, p, p+1); p++; pmenu->attach (*(new Gtk::SeparatorMenuItem ()), 0, 1, p, p+1); p++; pmenu->attach (*(copyprof = new Gtk::MenuItem (M("FILEBROWSER_COPYPROFILE"))), 0, 1, p, p+1); p++; pmenu->attach (*(pasteprof = new Gtk::MenuItem (M("FILEBROWSER_PASTEPROFILE"))), 0, 1, p, p+1); p++; diff --git a/rtgui/preferences.cc b/rtgui/preferences.cc index 3f2e60484..2cffee9ca 100644 --- a/rtgui/preferences.cc +++ b/rtgui/preferences.cc @@ -253,10 +253,10 @@ Gtk::Widget* Preferences::getProcParamsPanel () { fdp->add (*vbdp); mvbpp->pack_start (*fdp, Gtk::PACK_SHRINK, 4); - Gtk::Frame* fdf = Gtk::manage (new Gtk::Frame ("Dark Frame") ); + Gtk::Frame* fdf = Gtk::manage (new Gtk::Frame (M("PREFERENCES_DARKFRAME")) ); Gtk::HBox* hb42 = Gtk::manage (new Gtk::HBox ()); - darkFrameDir = Gtk::manage(new Gtk::FileChooserButton( "Dark frames directory", Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER)); - Gtk::Label *dfLab = Gtk::manage(new Gtk::Label("Dark Frames directory")); + darkFrameDir = Gtk::manage(new Gtk::FileChooserButton(M("PREFERENCES_DIRDARKFRAMES"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER)); + Gtk::Label *dfLab = Gtk::manage(new Gtk::Label(M("PREFERENCES_DIRDARKFRAMES"))); hb42->pack_start(*dfLab , Gtk::PACK_SHRINK, 4 ); hb42->pack_start(*darkFrameDir); dfLabel = Gtk::manage(new Gtk::Label("Found:")); diff --git a/rtgui/preprocess.cc b/rtgui/preprocess.cc index bf3326f08..3b3609370 100644 --- a/rtgui/preprocess.cc +++ b/rtgui/preprocess.cc @@ -25,14 +25,14 @@ using namespace rtengine::procparams; PreProcess::PreProcess () { hbdf = Gtk::manage(new Gtk::HBox()); - darkFrameFile = Gtk::manage(new Gtk::FileChooserButton(M("PREFERENCES_DARKFRAME"), Gtk::FILE_CHOOSER_ACTION_OPEN)); - dfLabel = Gtk::manage(new Gtk::Label("Dark Frame")); + darkFrameFile = Gtk::manage(new Gtk::FileChooserButton(M("TP_PREPROCESS_DARKFRAME"), Gtk::FILE_CHOOSER_ACTION_OPEN)); + dfLabel = Gtk::manage(new Gtk::Label(M("TP_PREPROCESS_DARKFRAME"))); btnReset = Gtk::manage(new Gtk::Button()); btnReset->set_image (*Gtk::manage(new Gtk::Image (Gtk::StockID("gtk-cancel"), Gtk::ICON_SIZE_BUTTON))); hbdf->pack_start(*dfLabel, Gtk::PACK_SHRINK, 4); hbdf->pack_start(*darkFrameFile); hbdf->pack_start(*btnReset, Gtk::PACK_SHRINK, 4); - dfAuto = Gtk::manage(new Gtk::CheckButton(("Auto selection"))); + dfAuto = Gtk::manage(new Gtk::CheckButton((M("TP_PREPROCESS_DFAUTOSELECT")))); caAutocorrect = Gtk::manage(new Gtk::CheckButton((M("PREFERENCES_CACORRECTION")))); hotDeadPixel = Gtk::manage(new Gtk::CheckButton((M("PREFERENCES_HOTDEADPIXFILT")))); @@ -163,7 +163,7 @@ void PreProcess::caCorrectionChanged() lastCA = caAutocorrect->get_active (); } if (listener) - listener->panelChanged (EvPreProcess, Glib::ustring("CA autocorrection ")+ (caAutocorrect->get_active()?"ON":"OFF") ); + listener->panelChanged (EvPreProcess, Glib::ustring(M("PREFERENCES_CACORRECTION"))+"="+(caAutocorrect->get_active()?"ON":"OFF") ); } void PreProcess::dfAutoChanged() @@ -182,7 +182,7 @@ void PreProcess::dfAutoChanged() } hbdf->set_sensitive( !dfAuto->get_active() ); if (listener) - listener->panelChanged (EvPreProcess, Glib::ustring("Dark Frame autoselection")+ (dfAuto->get_active()?"ON":"OFF") ); + listener->panelChanged (EvPreProcess, Glib::ustring(M("TP_PREPROCESS_DFAUTOSELECT"))+"="+(dfAuto->get_active()?"ON":"OFF") ); } void PreProcess::hotDeadPixelChanged () @@ -200,13 +200,13 @@ void PreProcess::hotDeadPixelChanged () lastHot = hotDeadPixel->get_active (); } if (listener) - listener->panelChanged (EvPreProcess, Glib::ustring("Hot Dead Pixel ")+(hotDeadPixel->get_active()?"ON":"OFF") ); + listener->panelChanged (EvPreProcess, Glib::ustring(M("PREFERENCES_HOTDEADPIXFILT"))+"="+(hotDeadPixel->get_active()?"ON":"OFF") ); } void PreProcess::darkFrameChanged() { dfChanged=true; if (listener) - listener->panelChanged (EvPreProcess, Glib::ustring("Dark Framet set to ")+darkFrameFile->get_filename()); + listener->panelChanged (EvPreProcess, Glib::ustring(M("TP_PREPROCESS_DARKFRAME"))+"="+darkFrameFile->get_filename()); } void PreProcess::darkFrameReset() @@ -215,6 +215,6 @@ void PreProcess::darkFrameReset() darkFrameFile->set_current_name(""); darkFrameFile->set_filename (""); if (listener) - listener->panelChanged (EvPreProcess, Glib::ustring("Dark Framet reset")); + listener->panelChanged (EvPreProcess, Glib::ustring(M("TP_PREPROCESS_DARKFRAME"))+"=0" ); }