From 647dfb8366ccd3f48cf42ac8b47d96162a580fba Mon Sep 17 00:00:00 2001 From: ffsup2 Date: Sat, 30 Oct 2010 22:14:47 +0200 Subject: [PATCH] Merge Demosaicing and pre-processing parameters selectable for each image. Dark frames subtraction and badpixels file support Fast loading in editor. --- COMPILE.txt | 90 +- rtdata/languages/Catala | 31 +- rtdata/languages/Chinese (Simplified) | 31 +- rtdata/languages/Chinese (Traditional) | 31 +- rtdata/languages/Czech | 31 +- rtdata/languages/Dansk | 31 +- rtdata/languages/Deutsch | 207 +- rtdata/languages/English | 56 +- rtdata/languages/English (UK) | 67 +- rtdata/languages/English (US) | 57 +- rtdata/languages/Espanol | 31 +- rtdata/languages/Euskara | 31 +- rtdata/languages/Francais | 42 +- rtdata/languages/Greek | 31 +- rtdata/languages/Hebrew | 31 +- rtdata/languages/Italian | 31 +- rtdata/languages/Japanese | 104 +- rtdata/languages/Latvian | 31 +- rtdata/languages/Magyar | 31 +- rtdata/languages/Nederlands | 29 +- rtdata/languages/Norsk BM | 31 +- rtdata/languages/Polish | 31 +- rtdata/languages/Polish (Latin Characters) | 31 +- rtdata/languages/Portugues (Brasil) | 31 +- rtdata/languages/Russian | 31 +- rtdata/languages/Serbian (Cyrilic Characters) | 28 + rtdata/languages/Serbian (Latin Characters) | 28 + rtdata/languages/Slovak | 293 +-- rtdata/languages/Suomi | 31 +- rtdata/languages/Swedish | 848 +++---- rtdata/languages/Turkish | 31 +- rtdata/languages/default | 53 +- rtdata/options/options.lin | 9 + rtdata/options/options.osx | 9 + rtdata/options/options.win | 9 + rtdata/profiles/crisp.pp3 | 8 +- rtdata/profiles/default.pp3 | 8 +- rtdata/profiles/neutral.pp3 | 8 +- rtdata/themes/ClearLooks (Dark Orange) | 5 +- rtdata/themes/Dark | 4 +- rtdata/themes/Default | 4 +- rtdata/themes/Gray | 112 +- rtdata/themes/Gray Textured | 13 +- rtdata/themes/Light | 5 +- rtdata/themes/Unity_Gray | 453 ++++ rtengine/CA_correct_RT.cc | 12 +- rtengine/CMakeLists.txt | 3 +- rtengine/bilateral2.h | 8 +- rtengine/cfa_linedn_RT.cc | 7 +- rtengine/curves.cc | 443 +++- rtengine/curves.h | 6 +- rtengine/dcraw.cc | 190 +- rtengine/dcraw.patch | 246 +- rtengine/dcrop.cc | 13 +- rtengine/dirpyr_equalizer.cc | 15 +- rtengine/gauss.h | 35 +- rtengine/iccstore.cc | 39 +- rtengine/iccstore.h | 9 +- rtengine/image16.cc | 17 + rtengine/image16.h | 4 + rtengine/imagedata.cc | 4 +- rtengine/imageio.cc | 1673 ++++++------- rtengine/imageio.h | 2 + rtengine/imagesource.h | 2 +- rtengine/improccoordinator.cc | 40 +- rtengine/improccoordinator.h | 11 +- rtengine/improcfun.cc | 81 +- rtengine/improcfun.h | 3 +- rtengine/impulse_denoise.h | 12 +- rtengine/init.cc | 2 +- rtengine/iplab2rgb.cc | 11 +- rtengine/ipsharpen.cc | 40 +- rtengine/iptransform.cc | 115 +- rtengine/jpeg_memsrc.c | 167 ++ rtengine/loadinitial.cc | 6 +- rtengine/procevents.h | 251 +- rtengine/procparams.cc | 66 +- rtengine/procparams.h | 10 +- rtengine/rawimagesource.cc | 49 +- rtengine/rawimagesource.h | 10 +- rtengine/refreshmap.cc | 9 +- rtengine/rtthumbnail.cc | 110 +- rtengine/rtthumbnail.h | 3 + rtengine/settings.h | 89 +- rtengine/shmap.cc | 18 +- rtengine/simpleprocess.cc | 24 +- rtengine/simpleprocess.h | 26 + rtengine/stdimagesource.cc | 10 +- rtengine/stdimagesource.h | 2 +- rtengine/updater.cc | 4 +- rtexif/pentaxattribs.cc | 2 + rtgui/CMakeLists.txt | 3 +- rtgui/addsetids.h | 5 +- rtgui/batchqueue.cc | 18 +- rtgui/batchqueuepanel.cc | 538 ++--- rtgui/batchtoolpanelcoord.cc | 9 +- rtgui/bqentryupdater.cc | 9 +- rtgui/cachemanager.cc | 114 +- rtgui/cachemanager.h | 17 +- rtgui/crophandler.cc | 2 +- rtgui/cropwindow.h | 3 +- rtgui/curveeditor.cc | 24 +- rtgui/curvelistener.h | 8 + rtgui/dirbrowser.cc | 2 +- rtgui/editorpanel.cc | 2095 +++++++++-------- rtgui/editorpanel.h | 8 +- rtgui/filebrowser.cc | 2 +- rtgui/filebrowserentry.cc | 50 +- rtgui/filebrowserentry.h | 1 + rtgui/filecatalog.cc | 1912 ++++++++------- rtgui/filecatalog.h | 40 +- rtgui/filepanel.cc | 49 +- rtgui/filepanel.h | 165 +- rtgui/filethumbnailbuttonset.cc | 16 +- rtgui/guiutils.h | 47 +- rtgui/imagearea.cc | 1 + rtgui/imagearea.h | 4 +- rtgui/imageareapanel.cc | 17 +- rtgui/labcurve.cc | 243 ++ rtgui/labcurve.h | 57 + rtgui/main.cc | 21 +- rtgui/mycurve.cc | 2 +- rtgui/navigator.cc | 63 +- rtgui/navigator.h | 2 + rtgui/options.cc | 47 +- rtgui/options.h | 7 +- rtgui/paramsedited.cc | 38 +- rtgui/paramsedited.h | 10 +- rtgui/partialpastedlg.cc | 14 +- rtgui/partialpastedlg.h | 4 +- rtgui/preferences.cc | 1980 ++++++++-------- rtgui/preferences.h | 294 +-- rtgui/previewloader.cc | 170 ++ rtgui/previewloader.h | 93 + rtgui/previewwindow.cc | 429 ++-- rtgui/procthread.h | 3 +- rtgui/rtwindow.cc | 80 +- rtgui/rtwindow.h | 12 +- rtgui/shcselector.cc | 4 + rtgui/thumbbrowserbase.cc | 40 +- rtgui/thumbbrowserbase.h | 3 +- rtgui/thumbbrowserentrybase.cc | 4 +- rtgui/thumbbrowserentrybase.h | 1 + rtgui/thumbimageupdater.cc | 460 ++-- rtgui/thumbimageupdater.h | 169 +- rtgui/thumbnail.cc | 208 +- rtgui/thumbnail.h | 19 +- rtgui/tonecurve.cc | 6 +- rtgui/toolpanelcoord.cc | 4 +- rtgui/toolpanelcoord.h | 2 +- rtgui/vignetting.cc | 23 +- rtgui/vignetting.h | 3 + tools/generateTranslationDiffs.sh | 0 153 files changed, 10304 insertions(+), 6407 deletions(-) create mode 100644 rtdata/themes/Unity_Gray create mode 100644 rtengine/jpeg_memsrc.c create mode 100644 rtengine/simpleprocess.h create mode 100644 rtgui/labcurve.cc create mode 100644 rtgui/labcurve.h create mode 100644 rtgui/previewloader.cc create mode 100644 rtgui/previewloader.h mode change 100644 => 100755 tools/generateTranslationDiffs.sh diff --git a/COMPILE.txt b/COMPILE.txt index 013fda0ca..08ba4ae59 100644 --- a/COMPILE.txt +++ b/COMPILE.txt @@ -1,44 +1,80 @@ +If you have problems with the compilation, identified the reason and fixed +the bug, please send me the updated build scripts (CMakeLists.txt files) to: +hgabor@rawtherapee.com Windows ------- -Requirements: -- MinGW + MSYS -- CMake -- GTK and GTKMM development environments + METHOD 1: + Requirements: + - MinGW + MSYS + - CMake + - GTK and GTKMM development environments + + Compile: + - Start MSYS + - Enter the root directory of the RawTherapee source tree + - Type: cmake -G "MSYS Makefiles" . + - Type: make install + - You find the compiled program in the release directory -Compile: -- Start MSYS -- Enter the root directory of the RawTherapee source tree -- Type: cmake -G "MSYS Makefiles" . -- Type: make install -- You find the compiled program in the release directory + METHOD 2: + Requirements: + - tdm-gcc (http://sourceforge.net/projects/tdm-gcc/files/TDM-GCC%20Installer/tdm-gcc-4.5.1.exe/download) + - cmake (http://www.cmake.org/cmake/resources/software.html) + - mercurial (http://mercurial.selenic.com/wiki/WindowsInstall) + - gtkmm (http://ftp.se.debian.org/pub/gnome/binaries/win32/gtkmm/2.22/) + + Compile: + - Enter the root directory of the RawTherapee source tree + - Type: cmake -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=./release -DBINDIR=. -DDATADIR=. -DLIBDIR=. + - Type: mingw32-make.exe install + - You find the compiled program in the "release" directory Linux ----- -Requirements: -- CMake -- GTK and GTKMM development packages -- libtiff, libpng, libjpeg, lcms, libiptcdata development packages -- ...did I forget something? + Requirements: + - CMake + - GTK and GTKMM development packages + - libtiff, libpng, libjpeg, lcms, libiptcdata development packages + - ...did I forget something? -On Ubuntu/Debian the requirements can be installed by running: -sudo apt-get install build-essential cmake libgtk2.0-dev libgtkmm-2.4-dev libtiff-dev libpng-dev libjpeg-dev liblcms-dev libiptcdata-dev merciurial + On Ubuntu/Debian the requirements can be installed by running: + sudo apt-get install build-essential cmake libgtk2.0-dev libgtkmm-2.4-dev libtiff-dev libpng-dev libjpeg-dev liblcms-dev libiptcdata-dev merciurial -Compile: -- Enter the root directory of the RawTherapee source tree -- Type: cmake -DCMAKE_INSTALL_PREFIX=./release -DBINDIR=. -DDATADIR=. -DLIBDIR=. -- Type: make install -- You find the compiled program in the release directory (you can copy it -anywhere you want) + Compile: + - Enter the root directory of the RawTherapee source tree + - Type: cmake -DCMAKE_INSTALL_PREFIX=./release -DBINDIR=. -DDATADIR=. -DLIBDIR=. + - Type: make install + - You find the compiled program in the release directory (you can copy it + anywhere you want) -(By changing the cmake flags, you can change where the release is. By removing all flags it should go to the standard system install location). + (By changing the cmake flags, you can change where the release is. By removing all flags it should go to the standard system install location). -...If you have problems with the compilation, identified the reason and fixed -the bug, please send me the updated build scripts (CMakeLists.txt files) to: -hgabor@rawtherapee.com + Using Eclipse under Linux: + + Eclipse mercurial plugin: + click Help -> Install new Software. + The Eclipse Update Site for MercurialEclipse is available at this URL: + http://cbes.javaforge.com/update + + Import the rawtherapee mercurial repository: + File->new->'other'->mercurial->Clone existing repository + fill in URL: https://rawtherapee.googlecode.com/hg + + Enter root directory of RawTherapee source tree from a terminal window. + configure the source for Eclipse with: + cmake -G "Eclipse CDT4 - Unix Makefiles" -DCMAKE_INSTALL_PREFIX=./release -DBINDIR=. -DDATADIR=. -DLIBDIR=. -DCMAKE_BUILD_TYPE=Release + + Eclipse does not do 'make install' but only 'make all' so to get the release there are 2 ways. + 1. type 'make install' in the console or, + 2. in 'Project'->'properties'->'C/C++ Make Project'->'Build (incremental build)' change 'all' to 'install' + + +... + OSX --- diff --git a/rtdata/languages/Catala b/rtdata/languages/Catala index 972811e43..1493e59c6 100644 --- a/rtdata/languages/Catala +++ b/rtdata/languages/Catala @@ -598,7 +598,7 @@ ZOOMBAR_SMALL;Petit !BATCHQUEUE_AUTOSTART;Auto start -!BATCH_PROCESSING;batch processing +!BATCH_PROCESSING;Batch processing !CURVEEDITOR_CUSTOM;Custom !CURVEEDITOR_DARKS;Darks !CURVEEDITOR_HIGHLIGHTS;Highlights @@ -649,6 +649,12 @@ ZOOMBAR_SMALL;Petit !NAVIGATOR_G_VALUE;G = %1 !NAVIGATOR_H_NA;H = n/a !NAVIGATOR_H_VALUE;H = %1 +!NAVIGATOR_LAB_A_NA;A = n/a +!NAVIGATOR_LAB_A_VALUE;A = %1 +!NAVIGATOR_LAB_B_NA;B = n/a +!NAVIGATOR_LAB_B_VALUE;B = %1 +!NAVIGATOR_LAB_L_NA;L = n/a +!NAVIGATOR_LAB_L_VALUE;L = %1 !NAVIGATOR_R_NA;R = n/a !NAVIGATOR_R_VALUE;R = %1 !NAVIGATOR_S_NA;S = n/a @@ -656,26 +662,42 @@ ZOOMBAR_SMALL;Petit !NAVIGATOR_V_NA;V = n/a !NAVIGATOR_V_VALUE;V = %1 !NAVIGATOR_XY_NA;x = n/a, y = n/a +!PARTIALPASTE_LABCURVE;Lab curve +!PARTIALPASTE_LABCURVE;Luminance curve !PREFERENCES_ADD;ADD !PREFERENCES_BATCH_PROCESSING;batch processing !PREFERENCES_BEHAVIOR;Behavior !PREFERENCES_CACORRECTION;Apply CA auto correction !PREFERENCES_DCBENHANCE;Apply DCB enhancement step !PREFERENCES_DCBITERATIONS;Number of DCB iterations +!PREFERENCES_DMETHODBATCH;Batch +!PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_GREENEQUIL;Green equilibration !PREFERENCES_HOTDEADPIXFILT;Apply hot/dead pixel filter !PREFERENCES_LINEDENOISE;Line noise filter +!PREFERENCES_MULTITAB;Multiple tabs mode !PREFERENCES_OVERLAY_FILENAMES;Overlay filenames on thumbnails !PREFERENCES_PROPERTY;Property +!PREFERENCES_SELECTFONT;Select font !PREFERENCES_SET;SET +!PREFERENCES_SINGLETAB;Single tab mode +!PREFERENCES_USESYSTEMTHEME; Use System Theme +!PREFERENCES_WORKFLOW;Workflow !PROGRESSDLG_PROFILECHANGEDINBROWSER;Profile changed in browser !SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists !SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF !TP_DETAIL_AMOUNT;Amount !TP_DIRPYRDENOISE_CHROMA;Chrominance !TP_DIRPYRDENOISE_GAMMA;Gamma -!TP_DIRPYRDENOISE_LABEL;Directional Pyramid Noise Reduction +!TP_DIRPYRDENOISE_LABEL;Directional pyramid noise reduction !TP_DIRPYRDENOISE_LUMA;Luminance +!TP_DIRPYREQUALIZER_LABEL;Directional pyramid equalizer +!TP_DIRPYREQUALIZER_LUMACOARSEST;Coarsest +!TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Contrast- +!TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;Contrast+ +!TP_DIRPYREQUALIZER_LUMAFINEST;Finest +!TP_DIRPYREQUALIZER_LUMANEUTRAL;Neutral +!TP_DIRPYREQUALIZER_THRESHOLD;Threshold !TP_EQUALIZER_CONTRAST_MINUS;Contrast- !TP_EQUALIZER_CONTRAST_PLUS;Contrast+ !TP_EQUALIZER_FINEST;finest @@ -684,6 +706,11 @@ ZOOMBAR_SMALL;Petit !TP_EQUALIZER_NEUTRAL;Neutral !TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction !TP_IMPULSEDENOISE_THRESH;Threshold +!TP_LABCURVE_BRIGHTNESS;Brightness +!TP_LABCURVE_CONTRAST;Contrast +!TP_LABCURVE_CURVEEDITOR;Luminance Curve +!TP_LABCURVE_LABEL;Lab Curves +!TP_LABCURVE_SATURATION;Saturation !TP_LENSGEOM_AUTOCROP;Auto Crop !TP_LENSGEOM_FILL;Auto Fill !TP_LENSGEOM_LABEL;Lens / Geometry diff --git a/rtdata/languages/Chinese (Simplified) b/rtdata/languages/Chinese (Simplified) index af3bec853..9b21d8c71 100644 --- a/rtdata/languages/Chinese (Simplified) +++ b/rtdata/languages/Chinese (Simplified) @@ -602,7 +602,7 @@ ZOOMBAR_SMALL;小 !BATCHQUEUE_AUTOSTART;Auto start -!BATCH_PROCESSING;batch processing +!BATCH_PROCESSING;Batch processing !CURVEEDITOR_CUSTOM;Custom !CURVEEDITOR_DARKS;Darks !CURVEEDITOR_HIGHLIGHTS;Highlights @@ -653,6 +653,12 @@ ZOOMBAR_SMALL;小 !NAVIGATOR_G_VALUE;G = %1 !NAVIGATOR_H_NA;H = n/a !NAVIGATOR_H_VALUE;H = %1 +!NAVIGATOR_LAB_A_NA;A = n/a +!NAVIGATOR_LAB_A_VALUE;A = %1 +!NAVIGATOR_LAB_B_NA;B = n/a +!NAVIGATOR_LAB_B_VALUE;B = %1 +!NAVIGATOR_LAB_L_NA;L = n/a +!NAVIGATOR_LAB_L_VALUE;L = %1 !NAVIGATOR_R_NA;R = n/a !NAVIGATOR_R_VALUE;R = %1 !NAVIGATOR_S_NA;S = n/a @@ -660,26 +666,42 @@ ZOOMBAR_SMALL;小 !NAVIGATOR_V_NA;V = n/a !NAVIGATOR_V_VALUE;V = %1 !NAVIGATOR_XY_NA;x = n/a, y = n/a +!PARTIALPASTE_LABCURVE;Lab curve +!PARTIALPASTE_LABCURVE;Luminance curve !PREFERENCES_ADD;ADD !PREFERENCES_BATCH_PROCESSING;batch processing !PREFERENCES_BEHAVIOR;Behavior !PREFERENCES_CACORRECTION;Apply CA auto correction !PREFERENCES_DCBENHANCE;Apply DCB enhancement step !PREFERENCES_DCBITERATIONS;Number of DCB iterations +!PREFERENCES_DMETHODBATCH;Batch +!PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_GREENEQUIL;Green equilibration !PREFERENCES_HOTDEADPIXFILT;Apply hot/dead pixel filter !PREFERENCES_LINEDENOISE;Line noise filter +!PREFERENCES_MULTITAB;Multiple tabs mode !PREFERENCES_OVERLAY_FILENAMES;Overlay filenames on thumbnails !PREFERENCES_PROPERTY;Property +!PREFERENCES_SELECTFONT;Select font !PREFERENCES_SET;SET +!PREFERENCES_SINGLETAB;Single tab mode +!PREFERENCES_USESYSTEMTHEME; Use System Theme +!PREFERENCES_WORKFLOW;Workflow !PROGRESSDLG_PROFILECHANGEDINBROWSER;Profile changed in browser !SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists !SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF !TP_DETAIL_AMOUNT;Amount !TP_DIRPYRDENOISE_CHROMA;Chrominance !TP_DIRPYRDENOISE_GAMMA;Gamma -!TP_DIRPYRDENOISE_LABEL;Directional Pyramid Noise Reduction +!TP_DIRPYRDENOISE_LABEL;Directional pyramid noise reduction !TP_DIRPYRDENOISE_LUMA;Luminance +!TP_DIRPYREQUALIZER_LABEL;Directional pyramid equalizer +!TP_DIRPYREQUALIZER_LUMACOARSEST;Coarsest +!TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Contrast- +!TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;Contrast+ +!TP_DIRPYREQUALIZER_LUMAFINEST;Finest +!TP_DIRPYREQUALIZER_LUMANEUTRAL;Neutral +!TP_DIRPYREQUALIZER_THRESHOLD;Threshold !TP_EQUALIZER_CONTRAST_MINUS;Contrast- !TP_EQUALIZER_CONTRAST_PLUS;Contrast+ !TP_EQUALIZER_FINEST;finest @@ -688,6 +710,11 @@ ZOOMBAR_SMALL;小 !TP_EQUALIZER_NEUTRAL;Neutral !TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction !TP_IMPULSEDENOISE_THRESH;Threshold +!TP_LABCURVE_BRIGHTNESS;Brightness +!TP_LABCURVE_CONTRAST;Contrast +!TP_LABCURVE_CURVEEDITOR;Luminance Curve +!TP_LABCURVE_LABEL;Lab Curves +!TP_LABCURVE_SATURATION;Saturation !TP_LENSGEOM_AUTOCROP;Auto Crop !TP_LENSGEOM_FILL;Auto Fill !TP_LENSGEOM_LABEL;Lens / Geometry diff --git a/rtdata/languages/Chinese (Traditional) b/rtdata/languages/Chinese (Traditional) index 9645fe547..bc80b9a9d 100644 --- a/rtdata/languages/Chinese (Traditional) +++ b/rtdata/languages/Chinese (Traditional) @@ -615,7 +615,7 @@ ZOOMBAR_SMALL;小 !!!!!!!!!!!!!!!!!!!!!!!!! -!BATCH_PROCESSING;batch processing +!BATCH_PROCESSING;Batch processing !CURVEEDITOR_CUSTOM;Custom !CURVEEDITOR_DARKS;Darks !CURVEEDITOR_HIGHLIGHTS;Highlights @@ -656,6 +656,12 @@ ZOOMBAR_SMALL;小 !NAVIGATOR_G_VALUE;G = %1 !NAVIGATOR_H_NA;H = n/a !NAVIGATOR_H_VALUE;H = %1 +!NAVIGATOR_LAB_A_NA;A = n/a +!NAVIGATOR_LAB_A_VALUE;A = %1 +!NAVIGATOR_LAB_B_NA;B = n/a +!NAVIGATOR_LAB_B_VALUE;B = %1 +!NAVIGATOR_LAB_L_NA;L = n/a +!NAVIGATOR_LAB_L_VALUE;L = %1 !NAVIGATOR_R_NA;R = n/a !NAVIGATOR_R_VALUE;R = %1 !NAVIGATOR_S_NA;S = n/a @@ -663,25 +669,41 @@ ZOOMBAR_SMALL;小 !NAVIGATOR_V_NA;V = n/a !NAVIGATOR_V_VALUE;V = %1 !NAVIGATOR_XY_NA;x = n/a, y = n/a +!PARTIALPASTE_LABCURVE;Lab curve +!PARTIALPASTE_LABCURVE;Luminance curve !PREFERENCES_ADD;ADD !PREFERENCES_BATCH_PROCESSING;batch processing !PREFERENCES_BEHAVIOR;Behavior !PREFERENCES_CACORRECTION;Apply CA auto correction !PREFERENCES_DCBENHANCE;Apply DCB enhancement step !PREFERENCES_DCBITERATIONS;Number of DCB iterations +!PREFERENCES_DMETHODBATCH;Batch +!PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_GREENEQUIL;Green equilibration !PREFERENCES_HOTDEADPIXFILT;Apply hot/dead pixel filter !PREFERENCES_LINEDENOISE;Line noise filter +!PREFERENCES_MULTITAB;Multiple tabs mode !PREFERENCES_OVERLAY_FILENAMES;Overlay filenames on thumbnails !PREFERENCES_PROPERTY;Property +!PREFERENCES_SELECTFONT;Select font !PREFERENCES_SET;SET +!PREFERENCES_SINGLETAB;Single tab mode +!PREFERENCES_USESYSTEMTHEME; Use System Theme +!PREFERENCES_WORKFLOW;Workflow !PROGRESSDLG_PROFILECHANGEDINBROWSER;Profile changed in browser !SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists !SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF !TP_DIRPYRDENOISE_CHROMA;Chrominance !TP_DIRPYRDENOISE_GAMMA;Gamma -!TP_DIRPYRDENOISE_LABEL;Directional Pyramid Noise Reduction +!TP_DIRPYRDENOISE_LABEL;Directional pyramid noise reduction !TP_DIRPYRDENOISE_LUMA;Luminance +!TP_DIRPYREQUALIZER_LABEL;Directional pyramid equalizer +!TP_DIRPYREQUALIZER_LUMACOARSEST;Coarsest +!TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Contrast- +!TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;Contrast+ +!TP_DIRPYREQUALIZER_LUMAFINEST;Finest +!TP_DIRPYREQUALIZER_LUMANEUTRAL;Neutral +!TP_DIRPYREQUALIZER_THRESHOLD;Threshold !TP_EQUALIZER_CONTRAST_MINUS;Contrast- !TP_EQUALIZER_CONTRAST_PLUS;Contrast+ !TP_EQUALIZER_FINEST;finest @@ -690,6 +712,11 @@ ZOOMBAR_SMALL;小 !TP_EQUALIZER_NEUTRAL;Neutral !TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction !TP_IMPULSEDENOISE_THRESH;Threshold +!TP_LABCURVE_BRIGHTNESS;Brightness +!TP_LABCURVE_CONTRAST;Contrast +!TP_LABCURVE_CURVEEDITOR;Luminance Curve +!TP_LABCURVE_LABEL;Lab Curves +!TP_LABCURVE_SATURATION;Saturation !TP_LENSGEOM_AUTOCROP;Auto Crop !TP_LENSGEOM_FILL;Auto Fill !TP_LENSGEOM_LABEL;Lens / Geometry diff --git a/rtdata/languages/Czech b/rtdata/languages/Czech index d9fdd1691..f63fdee13 100644 --- a/rtdata/languages/Czech +++ b/rtdata/languages/Czech @@ -602,7 +602,7 @@ ZOOMBAR_SMALL;Malý !BATCHQUEUE_AUTOSTART;Auto start -!BATCH_PROCESSING;batch processing +!BATCH_PROCESSING;Batch processing !CURVEEDITOR_CUSTOM;Custom !CURVEEDITOR_DARKS;Darks !CURVEEDITOR_HIGHLIGHTS;Highlights @@ -653,6 +653,12 @@ ZOOMBAR_SMALL;Malý !NAVIGATOR_G_VALUE;G = %1 !NAVIGATOR_H_NA;H = n/a !NAVIGATOR_H_VALUE;H = %1 +!NAVIGATOR_LAB_A_NA;A = n/a +!NAVIGATOR_LAB_A_VALUE;A = %1 +!NAVIGATOR_LAB_B_NA;B = n/a +!NAVIGATOR_LAB_B_VALUE;B = %1 +!NAVIGATOR_LAB_L_NA;L = n/a +!NAVIGATOR_LAB_L_VALUE;L = %1 !NAVIGATOR_R_NA;R = n/a !NAVIGATOR_R_VALUE;R = %1 !NAVIGATOR_S_NA;S = n/a @@ -660,25 +666,41 @@ ZOOMBAR_SMALL;Malý !NAVIGATOR_V_NA;V = n/a !NAVIGATOR_V_VALUE;V = %1 !NAVIGATOR_XY_NA;x = n/a, y = n/a +!PARTIALPASTE_LABCURVE;Lab curve +!PARTIALPASTE_LABCURVE;Luminance curve !PREFERENCES_ADD;ADD !PREFERENCES_BATCH_PROCESSING;batch processing !PREFERENCES_BEHAVIOR;Behavior !PREFERENCES_CACORRECTION;Apply CA auto correction !PREFERENCES_DCBENHANCE;Apply DCB enhancement step !PREFERENCES_DCBITERATIONS;Number of DCB iterations +!PREFERENCES_DMETHODBATCH;Batch +!PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_GREENEQUIL;Green equilibration !PREFERENCES_HOTDEADPIXFILT;Apply hot/dead pixel filter !PREFERENCES_LINEDENOISE;Line noise filter +!PREFERENCES_MULTITAB;Multiple tabs mode !PREFERENCES_OVERLAY_FILENAMES;Overlay filenames on thumbnails !PREFERENCES_PROPERTY;Property +!PREFERENCES_SELECTFONT;Select font !PREFERENCES_SET;SET +!PREFERENCES_SINGLETAB;Single tab mode +!PREFERENCES_USESYSTEMTHEME; Use System Theme +!PREFERENCES_WORKFLOW;Workflow !PROGRESSDLG_PROFILECHANGEDINBROWSER;Profile changed in browser !SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists !TP_DETAIL_AMOUNT;Amount !TP_DIRPYRDENOISE_CHROMA;Chrominance !TP_DIRPYRDENOISE_GAMMA;Gamma -!TP_DIRPYRDENOISE_LABEL;Directional Pyramid Noise Reduction +!TP_DIRPYRDENOISE_LABEL;Directional pyramid noise reduction !TP_DIRPYRDENOISE_LUMA;Luminance +!TP_DIRPYREQUALIZER_LABEL;Directional pyramid equalizer +!TP_DIRPYREQUALIZER_LUMACOARSEST;Coarsest +!TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Contrast- +!TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;Contrast+ +!TP_DIRPYREQUALIZER_LUMAFINEST;Finest +!TP_DIRPYREQUALIZER_LUMANEUTRAL;Neutral +!TP_DIRPYREQUALIZER_THRESHOLD;Threshold !TP_EQUALIZER_CONTRAST_MINUS;Contrast- !TP_EQUALIZER_CONTRAST_PLUS;Contrast+ !TP_EQUALIZER_FINEST;finest @@ -687,6 +709,11 @@ ZOOMBAR_SMALL;Malý !TP_EQUALIZER_NEUTRAL;Neutral !TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction !TP_IMPULSEDENOISE_THRESH;Threshold +!TP_LABCURVE_BRIGHTNESS;Brightness +!TP_LABCURVE_CONTRAST;Contrast +!TP_LABCURVE_CURVEEDITOR;Luminance Curve +!TP_LABCURVE_LABEL;Lab Curves +!TP_LABCURVE_SATURATION;Saturation !TP_LENSGEOM_AUTOCROP;Auto Crop !TP_LENSGEOM_FILL;Auto Fill !TP_LENSGEOM_LABEL;Lens / Geometry diff --git a/rtdata/languages/Dansk b/rtdata/languages/Dansk index 085fb18d6..6425c8827 100644 --- a/rtdata/languages/Dansk +++ b/rtdata/languages/Dansk @@ -600,7 +600,7 @@ ZOOMBAR_SMALL;Lille !BATCHQUEUE_AUTOSTART;Auto start -!BATCH_PROCESSING;batch processing +!BATCH_PROCESSING;Batch processing !CURVEEDITOR_CUSTOM;Custom !CURVEEDITOR_DARKS;Darks !CURVEEDITOR_HIGHLIGHTS;Highlights @@ -651,6 +651,12 @@ ZOOMBAR_SMALL;Lille !NAVIGATOR_G_VALUE;G = %1 !NAVIGATOR_H_NA;H = n/a !NAVIGATOR_H_VALUE;H = %1 +!NAVIGATOR_LAB_A_NA;A = n/a +!NAVIGATOR_LAB_A_VALUE;A = %1 +!NAVIGATOR_LAB_B_NA;B = n/a +!NAVIGATOR_LAB_B_VALUE;B = %1 +!NAVIGATOR_LAB_L_NA;L = n/a +!NAVIGATOR_LAB_L_VALUE;L = %1 !NAVIGATOR_R_NA;R = n/a !NAVIGATOR_R_VALUE;R = %1 !NAVIGATOR_S_NA;S = n/a @@ -658,26 +664,42 @@ ZOOMBAR_SMALL;Lille !NAVIGATOR_V_NA;V = n/a !NAVIGATOR_V_VALUE;V = %1 !NAVIGATOR_XY_NA;x = n/a, y = n/a +!PARTIALPASTE_LABCURVE;Lab curve +!PARTIALPASTE_LABCURVE;Luminance curve !PREFERENCES_ADD;ADD !PREFERENCES_BATCH_PROCESSING;batch processing !PREFERENCES_BEHAVIOR;Behavior !PREFERENCES_CACORRECTION;Apply CA auto correction !PREFERENCES_DCBENHANCE;Apply DCB enhancement step !PREFERENCES_DCBITERATIONS;Number of DCB iterations +!PREFERENCES_DMETHODBATCH;Batch +!PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_GREENEQUIL;Green equilibration !PREFERENCES_HOTDEADPIXFILT;Apply hot/dead pixel filter !PREFERENCES_LINEDENOISE;Line noise filter +!PREFERENCES_MULTITAB;Multiple tabs mode !PREFERENCES_OVERLAY_FILENAMES;Overlay filenames on thumbnails !PREFERENCES_PROPERTY;Property +!PREFERENCES_SELECTFONT;Select font !PREFERENCES_SET;SET +!PREFERENCES_SINGLETAB;Single tab mode +!PREFERENCES_USESYSTEMTHEME; Use System Theme +!PREFERENCES_WORKFLOW;Workflow !PROGRESSDLG_PROFILECHANGEDINBROWSER;Profile changed in browser !SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists !SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF !TP_DETAIL_AMOUNT;Amount !TP_DIRPYRDENOISE_CHROMA;Chrominance !TP_DIRPYRDENOISE_GAMMA;Gamma -!TP_DIRPYRDENOISE_LABEL;Directional Pyramid Noise Reduction +!TP_DIRPYRDENOISE_LABEL;Directional pyramid noise reduction !TP_DIRPYRDENOISE_LUMA;Luminance +!TP_DIRPYREQUALIZER_LABEL;Directional pyramid equalizer +!TP_DIRPYREQUALIZER_LUMACOARSEST;Coarsest +!TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Contrast- +!TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;Contrast+ +!TP_DIRPYREQUALIZER_LUMAFINEST;Finest +!TP_DIRPYREQUALIZER_LUMANEUTRAL;Neutral +!TP_DIRPYREQUALIZER_THRESHOLD;Threshold !TP_EQUALIZER_CONTRAST_MINUS;Contrast- !TP_EQUALIZER_CONTRAST_PLUS;Contrast+ !TP_EQUALIZER_FINEST;finest @@ -686,6 +708,11 @@ ZOOMBAR_SMALL;Lille !TP_EQUALIZER_NEUTRAL;Neutral !TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction !TP_IMPULSEDENOISE_THRESH;Threshold +!TP_LABCURVE_BRIGHTNESS;Brightness +!TP_LABCURVE_CONTRAST;Contrast +!TP_LABCURVE_CURVEEDITOR;Luminance Curve +!TP_LABCURVE_LABEL;Lab Curves +!TP_LABCURVE_SATURATION;Saturation !TP_LENSGEOM_AUTOCROP;Auto Crop !TP_LENSGEOM_FILL;Auto Fill !TP_LENSGEOM_LABEL;Lens / Geometry diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index 683df28a9..da2c41ac9 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -9,6 +9,8 @@ #07 22.12.2007 #08 4.4.2008: Anpassungen für 2.4 #09 Leichte Anpassungen (keenonkites/klonk) +#10 Erweiterung (oduis) +ADJUSTER_RESET_TO_DEFAULT;Standard wiederherstellen BATCHQUEUE_AUTOSTART;Automatisch starten BATCH_PROCESSING;Batch-Verarbeitung CURVEEDITOR_CUSTOM;Angepasst @@ -19,6 +21,7 @@ CURVEEDITOR_HIGHLIGHTS;Spitzlichter CURVEEDITOR_LIGHTS;Lichter CURVEEDITOR_LINEAR;Linear CURVEEDITOR_LOADDLGLABEL;Kurve Laden... +CURVEEDITOR_NURBS;NURBS-Kurve CURVEEDITOR_PARAMETRIC;Parametrisch CURVEEDITOR_SAVEDLGLABEL;Kurve Speichern... CURVEEDITOR_SHADOWS;Schatten @@ -32,7 +35,7 @@ EXIFFILTER_DIALOGLABEL;Exif Filter EXIFFILTER_FOCALLEN;Brennweite EXIFFILTER_ISO;ISO EXIFFILTER_LENS;Objektiv -EXIFFILTER_METADATAFILTER;Metadaten Filter einschalten +EXIFFILTER_METADATAFILTER;Metadaten-Filter einschalten EXIFFILTER_SHUTTER;Verschlusszeit EXIFPANEL_ADDEDIT;Neu/Ändern EXIFPANEL_ADDEDITHINT;Hinzufügen eines neuen oder Ändern eines bestehenden Attributs @@ -48,14 +51,14 @@ EXIFPANEL_RESETALL;Alle zurücksetzen EXIFPANEL_RESETALLHINT;Alle Attribute zu den ursrpünglichen Werten zurücksetzen EXIFPANEL_RESETHINT;Gewählte Attribute zu den ursprünglich Werten zurücksetzen EXIFPANEL_SUBDIRECTORY;Unterverzeichnis -FILEBROWSER_ADDDELTEMPLATE;Vorlagen hinzu/löschen... +FILEBROWSER_ADDDELTEMPLATE;Vorlagen hinzu/entfernen... FILEBROWSER_APPLYPROFILE;Profil anwenden FILEBROWSER_ARRANGEMENTHINT;Wechseln zwischen vertikaler und horizontaler Ausrichtung der Voransichten FILEBROWSER_CLEARPROFILE;Profil löschen FILEBROWSER_COPYPROFILE;Profil kopieren FILEBROWSER_CURRENT_NAME;Aktueller Name: FILEBROWSER_DELETEDLGLABEL;Bestätige Löschen von Dateien -FILEBROWSER_DELETEDLGMSG;Wollen sie wirklich %1 Dateien löschen? +FILEBROWSER_DELETEDLGMSG;Wollen sie wirklich %1 Datei(en) löschen? FILEBROWSER_EMPTYTRASH;Papierkorb leeren FILEBROWSER_EMPTYTRASHHINT;Endgültiges Löschen der Dateien im Papierkorb FILEBROWSER_EXIFFILTERAPPLY;Anwenden @@ -109,10 +112,10 @@ GENERAL_ABOUT;Über GENERAL_AFTER;Nachher GENERAL_BEFORE;Vorher GENERAL_CANCEL;Abbruch -GENERAL_DISABLE;ausschalten -GENERAL_DISABLED;ausgeschaltet -GENERAL_ENABLE;einschalten -GENERAL_ENABLED;eingeschaltet +GENERAL_DISABLE;deaktivieren +GENERAL_DISABLED;deaktiviert +GENERAL_ENABLE;Aktivieren +GENERAL_ENABLED;Aktiv GENERAL_HIGH_QUALITY;Hohe Qualität GENERAL_LANDSCAPE;Quer GENERAL_LOAD;Laden @@ -150,17 +153,17 @@ HISTORY_MSG_19;Luminanz Kurve HISTORY_MSG_1;Bild geladen HISTORY_MSG_20;Schärfen HISTORY_MSG_21;Schärfen Radius -HISTORY_MSG_22;Schärfen Menge +HISTORY_MSG_22;Schärfen Stärke HISTORY_MSG_23;Schärfen Schwellwert HISTORY_MSG_24;Schärfen nur Kanten HISTORY_MSG_25;Schärfen Kantensuche Radius HISTORY_MSG_26;Schärfen Kanten-Toleranz HISTORY_MSG_27;Schärfen Halo-Kontrolle -HISTORY_MSG_28;Schärfen Halo-Kontrolle Menge +HISTORY_MSG_28;Schärfen Halo-Kontrolle Stärke HISTORY_MSG_29;Schärfen Methode HISTORY_MSG_2;Profil geladen HISTORY_MSG_30;Dekonvolution Radius -HISTORY_MSG_31;Dekonvolution Menge +HISTORY_MSG_31;Dekonvolution Stärke HISTORY_MSG_32;Dekonvolution Dämpfung HISTORY_MSG_33;Dekonvolution Iterationen HISTORY_MSG_34;Verhindere Farbbeschneidungen @@ -199,13 +202,13 @@ HISTORY_MSG_63;Variante gewählt HISTORY_MSG_64;Bild beschneiden HISTORY_MSG_65;Farbsaum-Entfernung HISTORY_MSG_66;Lichter wiederherstellen -HISTORY_MSG_67;Lichter wiederherstellen Menge +HISTORY_MSG_67;Lichter wiederherstellen Stärke HISTORY_MSG_68;Lichter wiederherstellen Methode HISTORY_MSG_69;Aktueller Farbraum HISTORY_MSG_6;Kontrast HISTORY_MSG_70;Farbraum für Ausgabe HISTORY_MSG_71;Farbraum für Eingabe -HISTORY_MSG_72;Korrektur Randlichtabfall +HISTORY_MSG_72;Vignettierungs-Korrektur HISTORY_MSG_73;Kanal-Mixer HISTORY_MSG_74;Änderung Größe - Maßstab HISTORY_MSG_75;Änderung Größe - Methode @@ -216,7 +219,17 @@ HISTORY_MSG_79;Änderung Größe - Breite HISTORY_MSG_7;Schwarz HISTORY_MSG_80;Änderung Größe - Höhe HISTORY_MSG_81;Änderung Größe - eingeschaltet +HISTORY_MSG_82;Profil geändert +HISTORY_MSG_83;Schatten/Lichter hohe Qualität +HISTORY_MSG_84;Perspektivische Korrektur +HISTORY_MSG_85;Wavelet Koeffizienten +HISTORY_MSG_86;Wavelet Equalizer +HISTORY_MSG_87;Impulsrauschfilter +HISTORY_MSG_89;Gerichtete Pyramide HISTORY_MSG_8;Belichtungskorrektur +HISTORY_MSG_90;Gerichtete Pyramide Luminanz +HISTORY_MSG_91;Gerichtete Pyramide Chrominanz +HISTORY_MSG_92;Gerichtete Pyramide Gamma HISTORY_MSG_9;Lichter-Kompression HISTORY_NEWSNAPSHOT;Neue Variante HISTORY_NEWSNAPSHOTAS;als... @@ -231,7 +244,7 @@ ICMPANEL_GAMMABEFOREINPUT;Profil enthält Gammaanpassung ICMPANEL_INPUTCAMERA;Kamera-Standard ICMPANEL_INPUTCUSTOM;Benutzerdefiniert ICMPANEL_INPUTDLGLABEL;Wähle Eingabe-ICC-Profil... -ICMPANEL_INPUTEMBEDDED;Verwende eingebettetes, wenn möglich +ICMPANEL_INPUTEMBEDDED;Eingebettetes verwenden, wenn möglich ICMPANEL_INPUTPROFILE;Eingabeprofil ICMPANEL_NOICM;Kein ICM: sRGB-Ausgabe ICMPANEL_OUTPUTDLGLABEL;Wähle Ausgabe-ICC-Profil... @@ -284,18 +297,21 @@ IPTCPANEL_TRANSREFERENCEHINT;Ein Code, der den ursprünglichen Ort der Übertrag MAIN_BUTTON_EXIT;Verlassen MAIN_BUTTON_FULLSCREEN;Vollbild MAIN_BUTTON_PREFERENCES;Einstellungen -MAIN_BUTTON_PUTTOQUEUE;Auf die Warteschlange -MAIN_BUTTON_QUEUE;Auf die Warteschlange +MAIN_BUTTON_PUTTOQUEUE;In Warteschlange +MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Reiht aktuelles Bild in die Warteschlange ein Strg+Q +MAIN_BUTTON_QUEUE;In die Warteschlange MAIN_BUTTON_SAVE;Bild speichern -MAIN_BUTTON_SAVEAS;unter... -MAIN_BUTTON_SENDTOEDITOR;Im Editor laden +MAIN_BUTTON_SAVEAS;Speichern unter... +MAIN_BUTTON_SAVE_TOOLTIP;Aktuelles Bild speichern Ctrl+S +MAIN_BUTTON_SENDTOEDITOR;Im Editor öffnen +MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Öffnes das aktuelle Bild im externen Editor Strg+E MAIN_BUTTON_UNFULLSCREEN;Vollbild beenden MAIN_FRAME_BATCHQUEUE;Warteschlange MAIN_FRAME_FILEBROWSER;Dateiverwaltung -MAIN_FRAME_PLACES;Orte -MAIN_FRAME_PLACES_ADD;Hinzu -MAIN_FRAME_PLACES_DEL;Löschen -MAIN_FRAME_RECENT;Verwendete Ordner +MAIN_FRAME_PLACES;Favoriten +MAIN_FRAME_PLACES_ADD;Hinzuf. +MAIN_FRAME_PLACES_DEL;Entf. +MAIN_FRAME_RECENT;Zuletzt besucht MAIN_MSG_ALREADYEXISTS;Diese Datei existiert schon. MAIN_MSG_CANNOTLOAD;Bild kann nicht geladen werden MAIN_MSG_CANNOTSAVE;Fehler beim Speichern @@ -303,11 +319,11 @@ MAIN_MSG_CANNOTSTARTEDITOR;Der Editor kann nicht gestartet werden. MAIN_MSG_CANNOTSTARTEDITOR_SECONDARY;Setzen Sie bitte den richtigen Pfad in den Einstellungen. MAIN_MSG_ERRORDURINGIMAGESAVING;Fehler beim Speichern des Bildes MAIN_MSG_EXITJOBSINQUEUEINFO;Unverarbeitete Bilder in der Warteschlange gehen beim Verlassen der Anwendung verloren. -MAIN_MSG_EXITJOBSINQUEUEQUEST;Wollen Sie die Anwendung wirklich schliessen ? Es hat noch unverarbeitete Bilder in der Warteschlange. +MAIN_MSG_EXITJOBSINQUEUEQUEST;Wollen Sie die Anwendung wirklich schliessen? Es hat noch unverarbeitete Bilder in der Warteschlange. MAIN_MSG_JOBSINQUEUE;Job in Bearbeitung MAIN_MSG_NAVIGATOR;Navigator MAIN_MSG_PLACES;Orte -MAIN_MSG_QOVERWRITE;Wollen sie die Datei überschreiben ? +MAIN_MSG_QOVERWRITE;Wollen sie die Datei überschreiben? MAIN_TAB_BASIC;Basis MAIN_TAB_COLOR;Farbe MAIN_TAB_DETAIL;Detail @@ -317,7 +333,7 @@ MAIN_TAB_EXPOSURE;Belichtung MAIN_TAB_FILTER;Metadaten-Filter MAIN_TAB_ICM;ICM MAIN_TAB_IPTC;IPTC -MAIN_TAB_METADATA;Metadata +MAIN_TAB_METADATA;Meta-Daten MAIN_TAB_TAGGING;Tagging MAIN_TAB_TRANSFORM;Verändern MAIN_TOGGLE_BEFORE_AFTER;V|N @@ -360,6 +376,7 @@ PARTIALPASTE_EXPOSURE;Belichtung PARTIALPASTE_HLRECOVERY;Lichter wiederherstellen PARTIALPASTE_ICMSETTINGS;Einstellungen ICM PARTIALPASTE_IPTCINFO;IPTC Informationen +PARTIALPASTE_LABCURVE;LAB-Kurve PARTIALPASTE_LENSGROUP;Gruppe Farbeinstellungen PARTIALPASTE_LUMACURVE;Luminanzkurve PARTIALPASTE_LUMADENOISE;Luminanz-Rauschfilter @@ -369,7 +386,7 @@ PARTIALPASTE_RESIZE;Grösse ändern PARTIALPASTE_ROTATION;Drehen PARTIALPASTE_SHADOWSHIGHLIGHTS;Schatten/Lichter PARTIALPASTE_SHARPENING;Schärfen -PARTIALPASTE_VIGNETTING;Korrektur Randlichtabfall +PARTIALPASTE_VIGNETTING;Korrektur Vignettierung PARTIALPASTE_WHITEBALANCE;Weissabgleich PREFERENCES_ADD;HINZU PREFERENCES_APPLNEXTSTARTUP;beim nächsten Programmstart aktiv @@ -388,6 +405,7 @@ PREFERENCES_CACHESTRAT2;Priorität auf minimierten Speicherverbrauch (geringere PREFERENCES_CACHESTRAT;Strategie des Zwischenspeichers PREFERENCES_CACHETHUMBFORM;Format des Zwischenspeichers PREFERENCES_CACHETHUMBHEIGHT;Maximale Höhe der Voransichten +PREFERENCES_CACORRECTION;Autom. Korrektur Chrom. Abberation PREFERENCES_CLEARDLG_LINE1;Löschen des Zwischenspeichers PREFERENCES_CLEARDLG_LINE2;Das kann einige Sekunden dauern. PREFERENCES_CLEARDLG_TITLE;Bitte warten @@ -406,25 +424,31 @@ PREFERENCES_DIROTHER;Anderes PREFERENCES_DIRSELECTDLG;Wähle das Bild-Verzeichnis beim Programmstart... PREFERENCES_DIRSOFTWARE;Installationsverzeichnis PREFERENCES_DMETHOD;Methode +PREFERENCES_DMETHODBATCH;Warteschlange PREFERENCES_EDITORCMDLINE;Andere Befehlszeile +PREFERENCES_EDITORLAYOUT;Editor-Layout PREFERENCES_EXTERNALEDITOR;Externer Editor -PREFERENCES_FALSECOLOR;Stufen zur Unterdrückung von Falschfarben +PREFERENCES_FALSECOLOR;Stufen Falschfarben-Unterdrückung PREFERENCES_FBROWSEROPTS;Datei-Browser-Einstellungen PREFERENCES_FILEFORMAT;Datei-Format PREFERENCES_FORIMAGE;Für Bild-Dateien PREFERENCES_FORRAW;Für RAW-Dateien -PREFERENCES_GIMPPATH;GIMP Installations Verzeichnis +PREFERENCES_GIMPPATH;GIMP Installations-Verzeichnis +PREFERENCES_GREENEQUIL;Grün-Ausgleich PREFERENCES_GTKTHEME;Standard GTK PREFERENCES_HINT;Erklärungen PREFERENCES_HLTHRESHOLD;Schwellwert - zu hell +PREFERENCES_HOTDEADPIXFILT;Hot/Dead Pixel Filter anwenden PREFERENCES_ICCDIR;ICC-Profile-Verzeichnis PREFERENCES_IMPROCPARAMS;Standard-Bildbearbeitungsparameter PREFERENCES_INTENT_ABSOLUTE;Absolut farbmetrisch PREFERENCES_INTENT_PERCEPTUAL;Wahrnehmungsabhängig -PREFERENCES_INTENT_RELATIVE;Relative farbmetrisch +PREFERENCES_INTENT_RELATIVE;Relativ farbmetrisch PREFERENCES_INTENT_SATURATION;Sättigung +PREFERENCES_LINEDENOISE;Zeilenrausch-Filter PREFERENCES_LIVETHUMBNAILS;Live Voransichten (langsamer) PREFERENCES_MONITORICC;Monitor-Profil +PREFERENCES_MULTITAB;Multi-Reiter Modus PREFERENCES_OUTDIR;Ausgabe-Verzeichnis PREFERENCES_OUTDIRFOLDER;Speichern in Verzeichnis PREFERENCES_OUTDIRFOLDERHINT;Ablegen der gespeicherten Bilder in ein ausgewähltes Verzeichnis @@ -439,20 +463,22 @@ PREFERENCES_PARSEDEXTDELHINT;Lösche den ausgewählten Datei-Typ von der Liste PREFERENCES_PROFILEHANDLING;Behandlung der Bearbeitungsprofile PREFERENCES_PROFILELOADPR;Priorität der Profile beim Laden PREFERENCES_PROFILEPRCACHE;Bearbeitungsprofil im Zwischenspeicher (Cache) -PREFERENCES_PROFILEPRFILE;Bearbeitungsprofile bei der urpsrünglich geladenen Datei +PREFERENCES_PROFILEPRFILE;Bearbeitungsprofile bei der ursprünglich geladenen Datei PREFERENCES_PROFILESAVECACHE;Speichern der Verarbeitungsparameter im Zwischenspeicher (Cache) PREFERENCES_PROFILESAVEINPUT;Speichern der Verarbeitungsparameter zusammen mit der ursprünglich geladenen Datei PREFERENCES_PROPERTY;Eigenschaft -PREFERENCES_PSPATH;Adobe Photoshop Installations Verzeichnis +PREFERENCES_PSPATH;Adobe Photoshop Installations-Verzeichnis +PREFERENCES_SELECTFONT;Schriftart PREFERENCES_SELECTICCDIRDLG;Wähle ICC-Profile-Verzeichnis... PREFERENCES_SELECTLANG;Sprache PREFERENCES_SELECTMONITORPROFDLG;Wähle ICC-Profil für den Monitor... -PREFERENCES_SELECTTHEME;Wähle Oberflächendesign +PREFERENCES_SELECTTHEME;Oberflächendesign PREFERENCES_SET;SETZEN PREFERENCES_SHOWBASICEXIF;Zeige grundlegende Exif-Informationen PREFERENCES_SHOWDATETIME;Zeige Datum und Zeit PREFERENCES_SHOWONLYRAW;Zeige nur Rohdateien (RAW) PREFERENCES_SHTHRESHOLD;Schwellwert - zu dunkel +PREFERENCES_SINGLETAB;Ein-Reiter Modus PREFERENCES_STARTUPIMDIR;Bild-Verzeichnis beim Programmstart PREFERENCES_TAB_BROWSER;Datei-Browser PREFERENCES_TAB_COLORMGR;Farbmanagement @@ -460,6 +486,8 @@ PREFERENCES_TAB_GENERAL;Allgemein PREFERENCES_TAB_IMPROC;Bildbearbeitung PREFERENCES_TAB_OUTPUT;Ausgabe PREFERENCES_THUMBSIZE;Größe der Vorschau +PREFERENCES_USESYSTEMTHEME; System-Overfläche verwenden +PREFERENCES_WORKFLOW;Workflow PROFILEPANEL_FILEDLGFILTERANY;Alle Dateien PROFILEPANEL_FILEDLGFILTERPP;Bearbeitungsprofile PROFILEPANEL_LABEL;Bearbeitungsprofile @@ -493,6 +521,7 @@ QINFO_FOCALLENGTH;Brennweite QINFO_ISO;ISO QINFO_LENS;Objektiv QINFO_NOEXIF;Keine Exif-Daten vorhanden. +SAVEDLG_AUTOSUFFIX;Suffix an Dateinamen hängen falls schon vorhanden SAVEDLG_FILEFORMAT;Dateiformat SAVEDLG_JPEGQUAL;JPEG-Qualität SAVEDLG_JPGFILTER;JPEG-Datei @@ -501,8 +530,8 @@ SAVEDLG_PNGFILTER;PNG-Datei SAVEDLG_PUTTOQUEUE;In Warteschlange für Verarbeitung legen SAVEDLG_PUTTOQUEUEHEAD;An Anfang der Warteschlange für Verarbeitung legen SAVEDLG_PUTTOQUEUETAIL;Ans Ende der Warteschlange für Verarbeitung legen -SAVEDLG_SAVEIMMEDIATELY;Sofort Speichern -SAVEDLG_SAVESPP;Speichere die Prozessparameter mit dem Bild +SAVEDLG_SAVEIMMEDIATELY;Sofort speichern +SAVEDLG_SAVESPP;Speichere Prozessparameter mit dem Bild SAVEDLG_TIFFFILTER;TIFF-Datei SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF TOOLBAR_TOOLTIP_CROP;Auswahl des Ausschnitts (Taste C) @@ -522,7 +551,7 @@ TP_COARSETRAF_TOOLTIP_ROTLEFT;nach links drehen TP_COARSETRAF_TOOLTIP_ROTRIGHT;nach rechts drehen TP_COARSETRAF_TOOLTIP_VFLIP;vertikal spiegeln TP_COLORBOOST_ACHANNEL;Kanal "a" -TP_COLORBOOST_AMOUNT;Menge +TP_COLORBOOST_AMOUNT;Stärke TP_COLORBOOST_AVOIDCOLORCLIP;Verhindere Übersättigung TP_COLORBOOST_BCHANNEL;Kanal "b" TP_COLORBOOST_CHAB;a & b @@ -550,27 +579,44 @@ TP_CROP_GTRULETHIRDS;Goldener Schnitt TP_CROP_GUIDETYPE;Hilfslinien: TP_CROP_H;H TP_CROP_LABEL;Ausschnitt -TP_CROP_SELECTCROP; Wähle Ausschnitt +TP_CROP_SELECTCROP;Ausschnitt wählen TP_CROP_W;W TP_CROP_X;x TP_CROP_Y;y -TP_DETAIL_AMOUNT;Menge +TP_DETAIL_AMOUNT;Stärke +TP_DIRPYRDENOISE_CHROMA;Chrominanz +TP_DIRPYRDENOISE_GAMMA;Gamma +TP_DIRPYRDENOISE_LABEL;Direktionale Pyramiden-Rauschminderung +TP_DIRPYRDENOISE_LUMA;Luminanz +TP_DIRPYREQUALIZER_LABEL;Direktionaler Pyramiden-Equalizer +TP_DIRPYREQUALIZER_LUMACOARSEST;Gröbstes +TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Kontrast- +TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;Kontrast+ +TP_DIRPYREQUALIZER_LUMAFINEST;Feinstes +TP_DIRPYREQUALIZER_LUMANEUTRAL;Neutral +TP_DIRPYREQUALIZER_THRESHOLD;Schwellwert TP_DISTORTION_AMOUNT;Menge TP_DISTORTION_LABEL;Entzerrung -TP_EXPOSURE_AUTOLEVELS;autom. -TP_EXPOSURE_BLACKLEVEL;schwarz +TP_EQUALIZER_CONTRAST_MINUS;Kontrast- +TP_EQUALIZER_CONTRAST_PLUS;Kontrast+ +TP_EQUALIZER_FINEST;Feinstes +TP_EQUALIZER_LABEL;Wavelet-Equalizer +TP_EQUALIZER_LARGEST;Gröbstes +TP_EQUALIZER_NEUTRAL;Neutral +TP_EXPOSURE_AUTOLEVELS;Auto +TP_EXPOSURE_BLACKLEVEL;Schwarzpegel TP_EXPOSURE_BRIGHTNESS;Helligkeit -TP_EXPOSURE_CLIP;beschneiden +TP_EXPOSURE_CLIP;Grenzwert TP_EXPOSURE_COMPRHIGHLIGHTS;Lichter-Kompression TP_EXPOSURE_COMPRSHADOWS;Schatten-Kompression TP_EXPOSURE_CONTRAST;Kontrast TP_EXPOSURE_CURVEEDITOR;Tonwertkurve -TP_EXPOSURE_EXPCOMP;Bel.Korrektur +TP_EXPOSURE_EXPCOMP;Belichtungskorrektur TP_EXPOSURE_LABEL;Belichtung TP_HLREC_CIELAB;CIELab Überlagerung TP_HLREC_COLOR;Farbübertragung TP_HLREC_LABEL;Lichter wiederherstellen -TP_HLREC_LUMINANCE;Luminanz herstellen +TP_HLREC_LUMINANCE;Luminanz wiederherstellen TP_HLREC_METHOD;Methode: TP_ICM_FILEDLGFILTERANY;Alle Dateien TP_ICM_FILEDLGFILTERICM;ICC-Profildateien @@ -586,6 +632,16 @@ TP_ICM_OUTPUTDLGLABEL;Wähle Ausgabe-ICC-Profil... TP_ICM_OUTPUTPROFILE;Ausgabeprofil TP_ICM_SAVEREFERENCE;Speichere Referenzbild für die Profilierung TP_ICM_WORKINGPROFILE;Arbeitsfarbraum +TP_IMPULSEDENOISE_LABEL;Impulsrauschminderung +TP_IMPULSEDENOISE_THRESH;Schwellwert +TP_LABCURVE_BRIGHTNESS;Helligkeit +TP_LABCURVE_CONTRAST;Kontrast +TP_LABCURVE_CURVEEDITOR;Luminanzkurve +TP_LABCURVE_LABEL;Luminanzkurve +TP_LABCURVE_SATURATION;Sättigung +TP_LENSGEOM_AUTOCROP;Auto-Schneiden +TP_LENSGEOM_FILL;Auto-Füllen +TP_LENSGEOM_LABEL;Objektivkorrekturen TP_LUMACURVE_BLACKLEVEL;schwarz TP_LUMACURVE_BRIGHTNESS;Helligkeit TP_LUMACURVE_COMPRHIGHLIGHTS;Lichter-Kompression @@ -596,6 +652,9 @@ TP_LUMACURVE_LABEL;Luminanzkurve TP_LUMADENOISE_EDGETOLERANCE;Kanten-Toleranz TP_LUMADENOISE_LABEL;Luminanz-Rauschfilter TP_LUMADENOISE_RADIUS;Radius +TP_PERSPECTIVE_HORIZONTAL;Horizontal +TP_PERSPECTIVE_LABEL;Perspektive +TP_PERSPECTIVE_VERTICAL;Vertikal TP_RESIZE_BICUBIC;Bikubisch TP_RESIZE_BICUBICSF;Bikubisch (Weicher) TP_RESIZE_BICUBICSH;Bikubisch (Schärfer) @@ -624,23 +683,23 @@ TP_SHADOWSHLIGHTS_LOCALCONTR;Lokaler Kontrast TP_SHADOWSHLIGHTS_RADIUS;Radius TP_SHADOWSHLIGHTS_SHADOWS;Schatten TP_SHADOWSHLIGHTS_SHTONALW;Farbtonbereich -TP_SHARPENING_AMOUNT;Menge +TP_SHARPENING_AMOUNT;Stärke TP_SHARPENING_EDRADIUS;Radius TP_SHARPENING_EDTOLERANCE;Kanten-Toleranz TP_SHARPENING_HALOCONTROL;Halo-Kontrolle -TP_SHARPENING_HCAMOUNT;Menge +TP_SHARPENING_HCAMOUNT;Stärke TP_SHARPENING_LABEL;Schärfen TP_SHARPENING_METHOD;Methode TP_SHARPENING_ONLYEDGES;nur Kanten schärfen TP_SHARPENING_RADIUS;Radius -TP_SHARPENING_RLD;R-L Bildrestaurierung -TP_SHARPENING_RLD_AMOUNT;Menge +TP_SHARPENING_RLD;R-L Deconvolution +TP_SHARPENING_RLD_AMOUNT;Stärke TP_SHARPENING_RLD_DAMPING;Dämpfung TP_SHARPENING_RLD_ITERATIONS;Iterationen TP_SHARPENING_THRESHOLD;Schwellwert -TP_SHARPENING_USM;Unscharf maskieren -TP_VIGNETTING_AMOUNT;Menge -TP_VIGNETTING_LABEL;Korrektur Randlichtabfall +TP_SHARPENING_USM;Unschärfemaske +TP_VIGNETTING_AMOUNT;Stärke +TP_VIGNETTING_LABEL;Vignettierungs-Korrektur TP_VIGNETTING_RADIUS;Radius TP_WBALANCE_AUTO;Automatisch TP_WBALANCE_CAMERA;Kamera @@ -649,7 +708,7 @@ TP_WBALANCE_GREEN;Farbton TP_WBALANCE_LABEL;Weißabgleich TP_WBALANCE_METHOD;Methode TP_WBALANCE_SIZE;Größe: -TP_WBALANCE_SPOTWB;manuel setzen +TP_WBALANCE_SPOTWB;Manuell setzen TP_WBALANCE_TEMPERATURE;Farbtemperatur ZOOMBAR_DETAIL;Detail ZOOMBAR_HUGE;riesig @@ -662,9 +721,9 @@ ZOOMPANEL_100;(100%) ZOOMPANEL_NEWCROPWINDOW;(Neues) Detailfenster öffnen ZOOMPANEL_ZOOM100;Zoom 100% ZOOMPANEL_ZOOMFITSCREEN;An Bildschirm anpassen -ZOOMPANEL_ZOOMIN;Hinein zoomen -ZOOMPANEL_ZOOMOUT;Heraus zoomen -ADJUSTER_RESET_TO_DEFAULT;Zurück zum Standard +ZOOMPANEL_ZOOMIN;Hineinzoomen +ZOOMPANEL_ZOOMOUT;Herauszoomen + !!!!!!!!!!!!!!!!!!!!!!!!! @@ -672,41 +731,9 @@ ZOOMPANEL_ZOOMOUT;Heraus zoomen !!!!!!!!!!!!!!!!!!!!!!!!! -!ADJUSTER_RESET_TO_DEFAULT;Reset to default -!CURVEEDITOR_NURBS;Control cage -!HISTORY_MSG_82;Profile Changed -!HISTORY_MSG_83;High quality shadows/highlights -!HISTORY_MSG_84;Perspective correction -!HISTORY_MSG_85;Wavelet coefficients -!HISTORY_MSG_86;Wavelet equalizer -!HISTORY_MSG_87;Impulse noise reduction -!HISTORY_MSG_89;Directional pyramid -!HISTORY_MSG_90;Directional pyramid luminance -!HISTORY_MSG_91;Directional pyramid chominance -!HISTORY_MSG_92;Directional pyramid gamma -!MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Add current image to processing queue Ctrl+Q -!MAIN_BUTTON_SAVE_TOOLTIP;Save current image Ctrl+S -!MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Edit current image in external editor Ctrl+E -!PREFERENCES_CACORRECTION;Apply CA auto correction -!PREFERENCES_GREENEQUIL;Green equilibration -!PREFERENCES_HOTDEADPIXFILT;Apply hot/dead pixel filter -!PREFERENCES_LINEDENOISE;Line noise filter -!SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists -!TP_DIRPYRDENOISE_CHROMA;Chrominance -!TP_DIRPYRDENOISE_GAMMA;Gamma -!TP_DIRPYRDENOISE_LABEL;Directional Pyramid Noise Reduction -!TP_DIRPYRDENOISE_LUMA;Luminance -!TP_EQUALIZER_CONTRAST_MINUS;Contrast- -!TP_EQUALIZER_CONTRAST_PLUS;Contrast+ -!TP_EQUALIZER_FINEST;finest -!TP_EQUALIZER_LABEL;Wavelet equalizer -!TP_EQUALIZER_LARGEST;coarsest -!TP_EQUALIZER_NEUTRAL;Neutral -!TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction -!TP_IMPULSEDENOISE_THRESH;Threshold -!TP_LENSGEOM_AUTOCROP;Auto Crop -!TP_LENSGEOM_FILL;Auto Fill -!TP_LENSGEOM_LABEL;Lens / Geometry -!TP_PERSPECTIVE_HORIZONTAL;Horizontal -!TP_PERSPECTIVE_LABEL;Perspective -!TP_PERSPECTIVE_VERTICAL;Vertical +!NAVIGATOR_LAB_A_NA;A = n/a +!NAVIGATOR_LAB_A_VALUE;A = %1 +!NAVIGATOR_LAB_B_NA;B = n/a +!NAVIGATOR_LAB_B_VALUE;B = %1 +!NAVIGATOR_LAB_L_NA;L = n/a +!NAVIGATOR_LAB_L_VALUE;L = %1 diff --git a/rtdata/languages/English b/rtdata/languages/English index e82253e1e..1776f0002 100644 --- a/rtdata/languages/English +++ b/rtdata/languages/English @@ -9,7 +9,7 @@ !ADJUSTER_RESET_TO_DEFAULT;Reset to default !BATCHQUEUE_AUTOSTART;Auto start -!BATCH_PROCESSING;batch processing +!BATCH_PROCESSING;Batch processing !CURVEEDITOR_CUSTOM;Custom !CURVEEDITOR_DARKS;Darks !CURVEEDITOR_FILEDLGFILTERANY;Any files @@ -349,6 +349,12 @@ !NAVIGATOR_G_VALUE;G = %1 !NAVIGATOR_H_NA;H = n/a !NAVIGATOR_H_VALUE;H = %1 +!NAVIGATOR_LAB_A_NA;A = n/a +!NAVIGATOR_LAB_A_VALUE;A = %1 +!NAVIGATOR_LAB_B_NA;B = n/a +!NAVIGATOR_LAB_B_VALUE;B = %1 +!NAVIGATOR_LAB_L_NA;L = n/a +!NAVIGATOR_LAB_L_VALUE;L = %1 !NAVIGATOR_R_NA;R = n/a !NAVIGATOR_R_VALUE;R = %1 !NAVIGATOR_S_NA;S = n/a @@ -373,8 +379,9 @@ !PARTIALPASTE_HLRECOVERY;Highlight recovery !PARTIALPASTE_ICMSETTINGS;ICM settings !PARTIALPASTE_IPTCINFO;IPTC info +!PARTIALPASTE_LABCURVE;Lab curve +!PARTIALPASTE_LABCURVE;Luminance curve !PARTIALPASTE_LENSGROUP;Lens related settings -!PARTIALPASTE_LUMACURVE;Luminance curve !PARTIALPASTE_LUMADENOISE;Luminance noise reduction !PARTIALPASTE_LUMINANCEGROUP;Luminance related settings !PARTIALPASTE_METAICMGROUP;Metadata/ICM settings @@ -385,7 +392,7 @@ !PARTIALPASTE_VIGNETTING;Vignetting correction !PARTIALPASTE_WHITEBALANCE;White balance !PREFERENCES_ADD;ADD -!PREFERENCES_APPLNEXTSTARTUP;applied at next startup +!PREFERENCES_APPLNEXTSTARTUP;restart required !PREFERENCES_BATCH_PROCESSING;batch processing !PREFERENCES_BEHAVIOR;Behavior !PREFERENCES_BLINKCLIPPED;Blink clipped areas @@ -402,9 +409,6 @@ !PREFERENCES_CACHETHUMBFORM;Cache Thumbnail Format !PREFERENCES_CACHETHUMBHEIGHT;Maximal Thumbnail Height !PREFERENCES_CACORRECTION;Apply CA auto correction -!PREFERENCES_CLEARDLG_LINE1;Clearing cache -!PREFERENCES_CLEARDLG_LINE2;This may take a few seconds. -!PREFERENCES_CLEARDLG_TITLE;Please wait !PREFERENCES_CLIPPINGIND;Clipping indication !PREFERENCES_CMETRICINTENT;Colorimetric Intent !PREFERENCES_DATEFORMAT;Date Format @@ -419,8 +423,10 @@ !PREFERENCES_DIROTHER;Other !PREFERENCES_DIRSELECTDLG;Select Image Directory at Startup... !PREFERENCES_DIRSOFTWARE;Installation directory -!PREFERENCES_DMETHOD;Method +!PREFERENCES_DMETHOD;Preview +!PREFERENCES_DMETHODBATCH;Batch !PREFERENCES_EDITORCMDLINE;Other command line +!PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_EXTERNALEDITOR;External editor !PREFERENCES_FALSECOLOR;False color suppression steps !PREFERENCES_FBROWSEROPTS;File Browser Options @@ -442,12 +448,13 @@ !PREFERENCES_LINEDENOISE;Line noise filter !PREFERENCES_LIVETHUMBNAILS;Live Thumbnails (slower) !PREFERENCES_MONITORICC;Monitor Profile +!PREFERENCES_MULTITAB;Multiple tabs mode !PREFERENCES_OUTDIR;Output Directory !PREFERENCES_OUTDIRFOLDER;Save to folder !PREFERENCES_OUTDIRFOLDERHINT;Put the saved images to the selected folder -!PREFERENCES_OUTDIRHINT;You can use the following formatting strings:n%f, %d1, %d2, ..., %p1, %p2, ...nnThese formatting strings refer to the directories and sub-paths of the path of the raw file.nnFor example, if /home/tom/image/02-09-2006/dsc0012.nefhas been opened, the meaning of the formatting strings are:n%f=dsc0012, %d1=02-09-2006, %d2=image, ...n%p1=/home/tom/image/02-09-2006, %p2=/home/tom/image, %p3=/home/tom, ...nnIf you want to save the output image where the original is, write:n%p1/%fnnIf you want to save the output image in a directory 'converted' located the directory of the original, write:n%p1/converted/%fnnIf you want to save the output image in directory '/home/tom/converted' with keeping the same subdirectory of dates, write:n%p2/converted/%d1/%f +!PREFERENCES_OUTDIRHINT;You can use the following formatting strings:n%f, %d1, %d2, ..., %p1, %p2, ...nnThese formatting strings refer to the different parts of the photo's pathname.nnFor example, if the photo being processed has the following pathname:n/home/tom/photos/2010-10-31/dsc0042.nefnthe meaning of the formatting strings are:n%d4 = homen%d3 = tomn%d2 = photosn%d1 = 2010-10-31n%f = dsc0042n%p1 = /home/tom/photos/2010-10-31/n%p2 = /home/tom/photos/n%p3 = /home/tom/n%p4 = /home/nnIf you want to save the output image where the original is, write:n%p1/%fnnIf you want to save the output image in a directory named "converted" located in the directory of the opened image, write:n%p1/converted/%fnnIf you want to save the output image in a directory named "/home/tom/photos/converted/2010-10-31", write:n%p2/converted/%d1/%f !PREFERENCES_OUTDIRTEMPLATE;Use Template -!PREFERENCES_OUTDIRTEMPLATEHINT;You can use the following formatting strings:n%f, %d1, %d2, ..., %p1, %p2, ...nnThese formatting strings refer to the directories and sub-paths of the path of the raw file.nnFor example, if /home/tom/image/02-09-2006/dsc0012.nefhas been opened, the meaning of the formatting strings are:n%f=dsc0012, %d1=02-09-2006, %d2=image, ...n%p1=/home/tom/image/02-09-2006, %p2=/home/tom/image, %p3=/home/tom, ...nnIf you want to save the output image where the original is, write:n%p1/%fnnIf you want to save the output image in a directory 'converted' located the directory of the original, write:n%p1/converted/%fnnIf you want to save the output image in directory '/home/tom/converted' with keeping the same subdirectory of dates, write:n%p2/converted/%d1/%f +!PREFERENCES_OUTDIRTEMPLATEHINT;You can use the following formatting strings:n%f, %d1, %d2, ..., %p1, %p2, ...nnThese formatting strings refer to the different parts of the photo's pathname.nnFor example, if the photo being processed has the following pathname:n/home/tom/photos/2010-10-31/dsc0042.nefnthe meaning of the formatting strings are:n%d4 = homen%d3 = tomn%d2 = photosn%d1 = 2010-10-31n%f = dsc0042n%p1 = /home/tom/photos/2010-10-31/n%p2 = /home/tom/photos/n%p3 = /home/tom/n%p4 = /home/nnIf you want to save the output image where the original is, write:n%p1/%fnnIf you want to save the output image in a directory named "converted" located in the directory of the opened image, write:n%p1/converted/%fnnIf you want to save the output image in a directory named "/home/tom/photos/converted/2010-10-31", write:n%p2/converted/%d1/%f !PREFERENCES_OVERLAY_FILENAMES;Overlay filenames on thumbnails !PREFERENCES_PARSEDEXT;Parsed Extensions !PREFERENCES_PARSEDEXTADD;Add Extension @@ -461,6 +468,7 @@ !PREFERENCES_PROFILESAVEINPUT;Save Processing Parameters Next to the Input File !PREFERENCES_PROPERTY;Property !PREFERENCES_PSPATH;Adobe Photoshop installation directory +!PREFERENCES_SELECTFONT;Select font !PREFERENCES_SELECTICCDIRDLG;Select ICC Profile Directory... !PREFERENCES_SELECTLANG;Select language !PREFERENCES_SELECTMONITORPROFDLG;Select ICC Profile of the Display... @@ -470,6 +478,7 @@ !PREFERENCES_SHOWDATETIME;Show date and time !PREFERENCES_SHOWONLYRAW;Show only RAW files !PREFERENCES_SHTHRESHOLD;Threshold for clipped shadows +!PREFERENCES_SINGLETAB;Single tab mode !PREFERENCES_STARTUPIMDIR;Image directory at startup !PREFERENCES_TAB_BROWSER;File Browser !PREFERENCES_TAB_COLORMGR;Color Management @@ -477,6 +486,8 @@ !PREFERENCES_TAB_IMPROC;Image Processing !PREFERENCES_TAB_OUTPUT;Output Options !PREFERENCES_THUMBSIZE;Thumbnail Size +!PREFERENCES_USESYSTEMTHEME; Use System Theme +!PREFERENCES_WORKFLOW;Workflow !PROFILEPANEL_FILEDLGFILTERANY;Any files !PROFILEPANEL_FILEDLGFILTERPP;Postprocessing profiles !PROFILEPANEL_LABEL;Postprocessing Profiles @@ -575,8 +586,15 @@ !TP_DETAIL_AMOUNT;Amount !TP_DIRPYRDENOISE_CHROMA;Chrominance !TP_DIRPYRDENOISE_GAMMA;Gamma -!TP_DIRPYRDENOISE_LABEL;Directional Pyramid Noise Reduction +!TP_DIRPYRDENOISE_LABEL;Directional pyramid noise reduction !TP_DIRPYRDENOISE_LUMA;Luminance +!TP_DIRPYREQUALIZER_LABEL;Directional pyramid equalizer +!TP_DIRPYREQUALIZER_LUMACOARSEST;Coarsest +!TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Contrast- +!TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;Contrast+ +!TP_DIRPYREQUALIZER_LUMAFINEST;Finest +!TP_DIRPYREQUALIZER_LUMANEUTRAL;Neutral +!TP_DIRPYREQUALIZER_THRESHOLD;Threshold !TP_DISTORTION_AMOUNT;Amount !TP_DISTORTION_LABEL;Distortion !TP_EQUALIZER_CONTRAST_MINUS;Contrast- @@ -589,15 +607,15 @@ !TP_EXPOSURE_BLACKLEVEL;Black !TP_EXPOSURE_BRIGHTNESS;Brightness !TP_EXPOSURE_CLIP;Clip -!TP_EXPOSURE_COMPRHIGHLIGHTS;Highlight compression -!TP_EXPOSURE_COMPRSHADOWS;Shadow compression +!TP_EXPOSURE_COMPRHIGHLIGHTS;Highlight recovery +!TP_EXPOSURE_COMPRSHADOWS;Shadow recovery !TP_EXPOSURE_CONTRAST;Contrast !TP_EXPOSURE_CURVEEDITOR;Tone Curve !TP_EXPOSURE_EXPCOMP;Exp. Comp. !TP_EXPOSURE_LABEL;Exposure !TP_HLREC_CIELAB;CIELab Blending !TP_HLREC_COLOR;Color Propagation -!TP_HLREC_LABEL;Highlight Recovery +!TP_HLREC_LABEL;Highlight Reconstruction !TP_HLREC_LUMINANCE;Luminance Recovery !TP_HLREC_METHOD;Method: !TP_ICM_FILEDLGFILTERANY;Any files @@ -616,16 +634,14 @@ !TP_ICM_WORKINGPROFILE;Working Profile !TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction !TP_IMPULSEDENOISE_THRESH;Threshold +!TP_LABCURVE_BRIGHTNESS;Brightness +!TP_LABCURVE_CONTRAST;Contrast +!TP_LABCURVE_CURVEEDITOR;Luminance Curve +!TP_LABCURVE_LABEL;Lab Curves +!TP_LABCURVE_SATURATION;Saturation !TP_LENSGEOM_AUTOCROP;Auto Crop !TP_LENSGEOM_FILL;Auto Fill !TP_LENSGEOM_LABEL;Lens / Geometry -!TP_LUMACURVE_BLACKLEVEL;Black -!TP_LUMACURVE_BRIGHTNESS;Brightness -!TP_LUMACURVE_COMPRHIGHLIGHTS;Highlight compression -!TP_LUMACURVE_COMPRSHADOWS;Shadow compression -!TP_LUMACURVE_CONTRAST;Contrast -!TP_LUMACURVE_CURVEEDITOR;Luminance Curve -!TP_LUMACURVE_LABEL;Luminance Curve !TP_LUMADENOISE_EDGETOLERANCE;Edge Tolerance !TP_LUMADENOISE_LABEL;Luminance Noise Reduction !TP_LUMADENOISE_RADIUS;Radius diff --git a/rtdata/languages/English (UK) b/rtdata/languages/English (UK) index f3c31a19a..8d0099ac2 100644 --- a/rtdata/languages/English (UK) +++ b/rtdata/languages/English (UK) @@ -1,9 +1,8 @@ #00 English (UK) -#01 16.01.2009: Richard Regal +#01 17.10.2010: Richard Regal HISTORY_MSG_34;Avoid Colour Clipping HISTORY_MSG_37;Colour Boost -HISTORY_MSG_38;White Balance Method HISTORY_MSG_39;Colour Temperature HISTORY_MSG_41;Colour Shift "A" HISTORY_MSG_42;Colour Shift "B" @@ -14,6 +13,9 @@ HISTORY_MSG_49;Edge Sensitive Colour Denoising HISTORY_MSG_69;Working Colour Space HISTORY_MSG_70;Output Colour Space HISTORY_MSG_71;Input Colour Space +IPTCPANEL_DATECREATEDHINT;The date the intellectual content of the image was created; Format: YYYYMMMDD (Date Created). +IPTCPANEL_PROVINCE;County +IPTCPANEL_PROVINCEHINT;The County where the image originates (County). MAIN_TAB_COLOR;Colour PARTIALPASTE_COLORBOOST;Colour boost PARTIALPASTE_COLORDENOISE;Colour denoise @@ -36,7 +38,7 @@ TP_HLREC_COLOR;Colour Propagation !ADJUSTER_RESET_TO_DEFAULT;Reset to default !BATCHQUEUE_AUTOSTART;Auto start -!BATCH_PROCESSING;batch processing +!BATCH_PROCESSING;Batch processing !CURVEEDITOR_CUSTOM;Custom !CURVEEDITOR_DARKS;Darks !CURVEEDITOR_FILEDLGFILTERANY;Any files @@ -192,6 +194,7 @@ TP_HLREC_COLOR;Colour Propagation !HISTORY_MSG_33;Deconvolution Iterations !HISTORY_MSG_35;Saturation Limiter !HISTORY_MSG_36;Saturation Limit +!HISTORY_MSG_38;White Balance Method !HISTORY_MSG_40;White Balance Tint !HISTORY_MSG_43;Luminance Denoising !HISTORY_MSG_44;Lum. Denoising Radius @@ -278,8 +281,6 @@ TP_HLREC_COLOR;Colour Propagation !IPTCPANEL_COUNTRYHINT;The name of the country/primary location where the image was created (Country - Primary Location Name). !IPTCPANEL_CREDIT;Credit !IPTCPANEL_CREDITHINT;Identifies the provider of the image, not necessarily the owner/creator (Credit). -!IPTCPANEL_DATECREATED;Date Created -!IPTCPANEL_DATECREATEDHINT;The date the intellectual content of the image was created; Format: JJJJMMTT (Date Created). !IPTCPANEL_EMBEDDED;Embedded !IPTCPANEL_EMBEDDEDHINT;Reset to IPTC data embedded in the image file !IPTCPANEL_HEADLINE;Headline @@ -289,8 +290,6 @@ TP_HLREC_COLOR;Colour Propagation !IPTCPANEL_KEYWORDS;Keywords !IPTCPANEL_KEYWORDSHINT;Used to indicate specific information retrieval words (Keywords). !IPTCPANEL_PASTEHINT;Paste IPTC settings from clipboard -!IPTCPANEL_PROVINCE;Province -!IPTCPANEL_PROVINCEHINT;The Province/State where the image originates (Province-State). !IPTCPANEL_RESET;Reset !IPTCPANEL_RESETHINT;Reset to profile default !IPTCPANEL_SOURCE;Source @@ -358,6 +357,12 @@ TP_HLREC_COLOR;Colour Propagation !NAVIGATOR_G_VALUE;G = %1 !NAVIGATOR_H_NA;H = n/a !NAVIGATOR_H_VALUE;H = %1 +!NAVIGATOR_LAB_A_NA;A = n/a +!NAVIGATOR_LAB_A_VALUE;A = %1 +!NAVIGATOR_LAB_B_NA;B = n/a +!NAVIGATOR_LAB_B_VALUE;B = %1 +!NAVIGATOR_LAB_L_NA;L = n/a +!NAVIGATOR_LAB_L_VALUE;L = %1 !NAVIGATOR_R_NA;R = n/a !NAVIGATOR_R_VALUE;R = %1 !NAVIGATOR_S_NA;S = n/a @@ -377,8 +382,9 @@ TP_HLREC_COLOR;Colour Propagation !PARTIALPASTE_HLRECOVERY;Highlight recovery !PARTIALPASTE_ICMSETTINGS;ICM settings !PARTIALPASTE_IPTCINFO;IPTC info +!PARTIALPASTE_LABCURVE;Lab curve +!PARTIALPASTE_LABCURVE;Luminance curve !PARTIALPASTE_LENSGROUP;Lens related settings -!PARTIALPASTE_LUMACURVE;Luminance curve !PARTIALPASTE_LUMADENOISE;Luminance noise reduction !PARTIALPASTE_LUMINANCEGROUP;Luminance related settings !PARTIALPASTE_METAICMGROUP;Metadata/ICM settings @@ -389,7 +395,7 @@ TP_HLREC_COLOR;Colour Propagation !PARTIALPASTE_VIGNETTING;Vignetting correction !PARTIALPASTE_WHITEBALANCE;White balance !PREFERENCES_ADD;ADD -!PREFERENCES_APPLNEXTSTARTUP;applied at next startup +!PREFERENCES_APPLNEXTSTARTUP;restart required !PREFERENCES_BATCH_PROCESSING;batch processing !PREFERENCES_BEHAVIOR;Behavior !PREFERENCES_BLINKCLIPPED;Blink clipped areas @@ -406,9 +412,6 @@ TP_HLREC_COLOR;Colour Propagation !PREFERENCES_CACHETHUMBFORM;Cache Thumbnail Format !PREFERENCES_CACHETHUMBHEIGHT;Maximal Thumbnail Height !PREFERENCES_CACORRECTION;Apply CA auto correction -!PREFERENCES_CLEARDLG_LINE1;Clearing cache -!PREFERENCES_CLEARDLG_LINE2;This may take a few seconds. -!PREFERENCES_CLEARDLG_TITLE;Please wait !PREFERENCES_CLIPPINGIND;Clipping indication !PREFERENCES_CMETRICINTENT;Colorimetric Intent !PREFERENCES_DATEFORMAT;Date Format @@ -423,8 +426,10 @@ TP_HLREC_COLOR;Colour Propagation !PREFERENCES_DIROTHER;Other !PREFERENCES_DIRSELECTDLG;Select Image Directory at Startup... !PREFERENCES_DIRSOFTWARE;Installation directory -!PREFERENCES_DMETHOD;Method +!PREFERENCES_DMETHOD;Preview +!PREFERENCES_DMETHODBATCH;Batch !PREFERENCES_EDITORCMDLINE;Other command line +!PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_EXTERNALEDITOR;External editor !PREFERENCES_FBROWSEROPTS;File Browser Options !PREFERENCES_FILEFORMAT;File format @@ -445,12 +450,13 @@ TP_HLREC_COLOR;Colour Propagation !PREFERENCES_LINEDENOISE;Line noise filter !PREFERENCES_LIVETHUMBNAILS;Live Thumbnails (slower) !PREFERENCES_MONITORICC;Monitor Profile +!PREFERENCES_MULTITAB;Multiple tabs mode !PREFERENCES_OUTDIR;Output Directory !PREFERENCES_OUTDIRFOLDER;Save to folder !PREFERENCES_OUTDIRFOLDERHINT;Put the saved images to the selected folder -!PREFERENCES_OUTDIRHINT;You can use the following formatting strings:n%f, %d1, %d2, ..., %p1, %p2, ...nnThese formatting strings refer to the directories and sub-paths of the path of the raw file.nnFor example, if /home/tom/image/02-09-2006/dsc0012.nefhas been opened, the meaning of the formatting strings are:n%f=dsc0012, %d1=02-09-2006, %d2=image, ...n%p1=/home/tom/image/02-09-2006, %p2=/home/tom/image, %p3=/home/tom, ...nnIf you want to save the output image where the original is, write:n%p1/%fnnIf you want to save the output image in a directory 'converted' located the directory of the original, write:n%p1/converted/%fnnIf you want to save the output image in directory '/home/tom/converted' with keeping the same subdirectory of dates, write:n%p2/converted/%d1/%f +!PREFERENCES_OUTDIRHINT;You can use the following formatting strings:n%f, %d1, %d2, ..., %p1, %p2, ...nnThese formatting strings refer to the different parts of the photo's pathname.nnFor example, if the photo being processed has the following pathname:n/home/tom/photos/2010-10-31/dsc0042.nefnthe meaning of the formatting strings are:n%d4 = homen%d3 = tomn%d2 = photosn%d1 = 2010-10-31n%f = dsc0042n%p1 = /home/tom/photos/2010-10-31/n%p2 = /home/tom/photos/n%p3 = /home/tom/n%p4 = /home/nnIf you want to save the output image where the original is, write:n%p1/%fnnIf you want to save the output image in a directory named "converted" located in the directory of the opened image, write:n%p1/converted/%fnnIf you want to save the output image in a directory named "/home/tom/photos/converted/2010-10-31", write:n%p2/converted/%d1/%f !PREFERENCES_OUTDIRTEMPLATE;Use Template -!PREFERENCES_OUTDIRTEMPLATEHINT;You can use the following formatting strings:n%f, %d1, %d2, ..., %p1, %p2, ...nnThese formatting strings refer to the directories and sub-paths of the path of the raw file.nnFor example, if /home/tom/image/02-09-2006/dsc0012.nefhas been opened, the meaning of the formatting strings are:n%f=dsc0012, %d1=02-09-2006, %d2=image, ...n%p1=/home/tom/image/02-09-2006, %p2=/home/tom/image, %p3=/home/tom, ...nnIf you want to save the output image where the original is, write:n%p1/%fnnIf you want to save the output image in a directory 'converted' located the directory of the original, write:n%p1/converted/%fnnIf you want to save the output image in directory '/home/tom/converted' with keeping the same subdirectory of dates, write:n%p2/converted/%d1/%f +!PREFERENCES_OUTDIRTEMPLATEHINT;You can use the following formatting strings:n%f, %d1, %d2, ..., %p1, %p2, ...nnThese formatting strings refer to the different parts of the photo's pathname.nnFor example, if the photo being processed has the following pathname:n/home/tom/photos/2010-10-31/dsc0042.nefnthe meaning of the formatting strings are:n%d4 = homen%d3 = tomn%d2 = photosn%d1 = 2010-10-31n%f = dsc0042n%p1 = /home/tom/photos/2010-10-31/n%p2 = /home/tom/photos/n%p3 = /home/tom/n%p4 = /home/nnIf you want to save the output image where the original is, write:n%p1/%fnnIf you want to save the output image in a directory named "converted" located in the directory of the opened image, write:n%p1/converted/%fnnIf you want to save the output image in a directory named "/home/tom/photos/converted/2010-10-31", write:n%p2/converted/%d1/%f !PREFERENCES_OVERLAY_FILENAMES;Overlay filenames on thumbnails !PREFERENCES_PARSEDEXT;Parsed Extensions !PREFERENCES_PARSEDEXTADD;Add Extension @@ -464,6 +470,7 @@ TP_HLREC_COLOR;Colour Propagation !PREFERENCES_PROFILESAVEINPUT;Save Processing Parameters Next to the Input File !PREFERENCES_PROPERTY;Property !PREFERENCES_PSPATH;Adobe Photoshop installation directory +!PREFERENCES_SELECTFONT;Select font !PREFERENCES_SELECTICCDIRDLG;Select ICC Profile Directory... !PREFERENCES_SELECTLANG;Select language !PREFERENCES_SELECTMONITORPROFDLG;Select ICC Profile of the Display... @@ -473,12 +480,15 @@ TP_HLREC_COLOR;Colour Propagation !PREFERENCES_SHOWDATETIME;Show date and time !PREFERENCES_SHOWONLYRAW;Show only RAW files !PREFERENCES_SHTHRESHOLD;Threshold for clipped shadows +!PREFERENCES_SINGLETAB;Single tab mode !PREFERENCES_STARTUPIMDIR;Image directory at startup !PREFERENCES_TAB_BROWSER;File Browser !PREFERENCES_TAB_GENERAL;General !PREFERENCES_TAB_IMPROC;Image Processing !PREFERENCES_TAB_OUTPUT;Output Options !PREFERENCES_THUMBSIZE;Thumbnail Size +!PREFERENCES_USESYSTEMTHEME; Use System Theme +!PREFERENCES_WORKFLOW;Workflow !PROFILEPANEL_FILEDLGFILTERANY;Any files !PROFILEPANEL_FILEDLGFILTERPP;Postprocessing profiles !PROFILEPANEL_LABEL;Postprocessing Profiles @@ -573,8 +583,15 @@ TP_HLREC_COLOR;Colour Propagation !TP_DETAIL_AMOUNT;Amount !TP_DIRPYRDENOISE_CHROMA;Chrominance !TP_DIRPYRDENOISE_GAMMA;Gamma -!TP_DIRPYRDENOISE_LABEL;Directional Pyramid Noise Reduction +!TP_DIRPYRDENOISE_LABEL;Directional pyramid noise reduction !TP_DIRPYRDENOISE_LUMA;Luminance +!TP_DIRPYREQUALIZER_LABEL;Directional pyramid equalizer +!TP_DIRPYREQUALIZER_LUMACOARSEST;Coarsest +!TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Contrast- +!TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;Contrast+ +!TP_DIRPYREQUALIZER_LUMAFINEST;Finest +!TP_DIRPYREQUALIZER_LUMANEUTRAL;Neutral +!TP_DIRPYREQUALIZER_THRESHOLD;Threshold !TP_DISTORTION_AMOUNT;Amount !TP_DISTORTION_LABEL;Distortion !TP_EQUALIZER_CONTRAST_MINUS;Contrast- @@ -587,14 +604,14 @@ TP_HLREC_COLOR;Colour Propagation !TP_EXPOSURE_BLACKLEVEL;Black !TP_EXPOSURE_BRIGHTNESS;Brightness !TP_EXPOSURE_CLIP;Clip -!TP_EXPOSURE_COMPRHIGHLIGHTS;Highlight compression -!TP_EXPOSURE_COMPRSHADOWS;Shadow compression +!TP_EXPOSURE_COMPRHIGHLIGHTS;Highlight recovery +!TP_EXPOSURE_COMPRSHADOWS;Shadow recovery !TP_EXPOSURE_CONTRAST;Contrast !TP_EXPOSURE_CURVEEDITOR;Tone Curve !TP_EXPOSURE_EXPCOMP;Exp. Comp. !TP_EXPOSURE_LABEL;Exposure !TP_HLREC_CIELAB;CIELab Blending -!TP_HLREC_LABEL;Highlight Recovery +!TP_HLREC_LABEL;Highlight Reconstruction !TP_HLREC_LUMINANCE;Luminance Recovery !TP_HLREC_METHOD;Method: !TP_ICM_FILEDLGFILTERANY;Any files @@ -613,16 +630,14 @@ TP_HLREC_COLOR;Colour Propagation !TP_ICM_WORKINGPROFILE;Working Profile !TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction !TP_IMPULSEDENOISE_THRESH;Threshold +!TP_LABCURVE_BRIGHTNESS;Brightness +!TP_LABCURVE_CONTRAST;Contrast +!TP_LABCURVE_CURVEEDITOR;Luminance Curve +!TP_LABCURVE_LABEL;Lab Curves +!TP_LABCURVE_SATURATION;Saturation !TP_LENSGEOM_AUTOCROP;Auto Crop !TP_LENSGEOM_FILL;Auto Fill !TP_LENSGEOM_LABEL;Lens / Geometry -!TP_LUMACURVE_BLACKLEVEL;Black -!TP_LUMACURVE_BRIGHTNESS;Brightness -!TP_LUMACURVE_COMPRHIGHLIGHTS;Highlight compression -!TP_LUMACURVE_COMPRSHADOWS;Shadow compression -!TP_LUMACURVE_CONTRAST;Contrast -!TP_LUMACURVE_CURVEEDITOR;Luminance Curve -!TP_LUMACURVE_LABEL;Luminance Curve !TP_LUMADENOISE_EDGETOLERANCE;Edge Tolerance !TP_LUMADENOISE_LABEL;Luminance Noise Reduction !TP_LUMADENOISE_RADIUS;Radius diff --git a/rtdata/languages/English (US) b/rtdata/languages/English (US) index 688d9536f..b1307a18e 100644 --- a/rtdata/languages/English (US) +++ b/rtdata/languages/English (US) @@ -1,4 +1,5 @@ +#00 English (US) !!!!!!!!!!!!!!!!!!!!!!!!! @@ -8,7 +9,7 @@ !ADJUSTER_RESET_TO_DEFAULT;Reset to default !BATCHQUEUE_AUTOSTART;Auto start -!BATCH_PROCESSING;batch processing +!BATCH_PROCESSING;Batch processing !CURVEEDITOR_CUSTOM;Custom !CURVEEDITOR_DARKS;Darks !CURVEEDITOR_FILEDLGFILTERANY;Any files @@ -348,6 +349,12 @@ !NAVIGATOR_G_VALUE;G = %1 !NAVIGATOR_H_NA;H = n/a !NAVIGATOR_H_VALUE;H = %1 +!NAVIGATOR_LAB_A_NA;A = n/a +!NAVIGATOR_LAB_A_VALUE;A = %1 +!NAVIGATOR_LAB_B_NA;B = n/a +!NAVIGATOR_LAB_B_VALUE;B = %1 +!NAVIGATOR_LAB_L_NA;L = n/a +!NAVIGATOR_LAB_L_VALUE;L = %1 !NAVIGATOR_R_NA;R = n/a !NAVIGATOR_R_VALUE;R = %1 !NAVIGATOR_S_NA;S = n/a @@ -372,8 +379,9 @@ !PARTIALPASTE_HLRECOVERY;Highlight recovery !PARTIALPASTE_ICMSETTINGS;ICM settings !PARTIALPASTE_IPTCINFO;IPTC info +!PARTIALPASTE_LABCURVE;Lab curve +!PARTIALPASTE_LABCURVE;Luminance curve !PARTIALPASTE_LENSGROUP;Lens related settings -!PARTIALPASTE_LUMACURVE;Luminance curve !PARTIALPASTE_LUMADENOISE;Luminance noise reduction !PARTIALPASTE_LUMINANCEGROUP;Luminance related settings !PARTIALPASTE_METAICMGROUP;Metadata/ICM settings @@ -384,7 +392,7 @@ !PARTIALPASTE_VIGNETTING;Vignetting correction !PARTIALPASTE_WHITEBALANCE;White balance !PREFERENCES_ADD;ADD -!PREFERENCES_APPLNEXTSTARTUP;applied at next startup +!PREFERENCES_APPLNEXTSTARTUP;restart required !PREFERENCES_BATCH_PROCESSING;batch processing !PREFERENCES_BEHAVIOR;Behavior !PREFERENCES_BLINKCLIPPED;Blink clipped areas @@ -401,9 +409,6 @@ !PREFERENCES_CACHETHUMBFORM;Cache Thumbnail Format !PREFERENCES_CACHETHUMBHEIGHT;Maximal Thumbnail Height !PREFERENCES_CACORRECTION;Apply CA auto correction -!PREFERENCES_CLEARDLG_LINE1;Clearing cache -!PREFERENCES_CLEARDLG_LINE2;This may take a few seconds. -!PREFERENCES_CLEARDLG_TITLE;Please wait !PREFERENCES_CLIPPINGIND;Clipping indication !PREFERENCES_CMETRICINTENT;Colorimetric Intent !PREFERENCES_DATEFORMAT;Date Format @@ -418,8 +423,10 @@ !PREFERENCES_DIROTHER;Other !PREFERENCES_DIRSELECTDLG;Select Image Directory at Startup... !PREFERENCES_DIRSOFTWARE;Installation directory -!PREFERENCES_DMETHOD;Method +!PREFERENCES_DMETHOD;Preview +!PREFERENCES_DMETHODBATCH;Batch !PREFERENCES_EDITORCMDLINE;Other command line +!PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_EXTERNALEDITOR;External editor !PREFERENCES_FALSECOLOR;False color suppression steps !PREFERENCES_FBROWSEROPTS;File Browser Options @@ -441,12 +448,13 @@ !PREFERENCES_LINEDENOISE;Line noise filter !PREFERENCES_LIVETHUMBNAILS;Live Thumbnails (slower) !PREFERENCES_MONITORICC;Monitor Profile +!PREFERENCES_MULTITAB;Multiple tabs mode !PREFERENCES_OUTDIR;Output Directory !PREFERENCES_OUTDIRFOLDER;Save to folder !PREFERENCES_OUTDIRFOLDERHINT;Put the saved images to the selected folder -!PREFERENCES_OUTDIRHINT;You can use the following formatting strings:n%f, %d1, %d2, ..., %p1, %p2, ...nnThese formatting strings refer to the directories and sub-paths of the path of the raw file.nnFor example, if /home/tom/image/02-09-2006/dsc0012.nefhas been opened, the meaning of the formatting strings are:n%f=dsc0012, %d1=02-09-2006, %d2=image, ...n%p1=/home/tom/image/02-09-2006, %p2=/home/tom/image, %p3=/home/tom, ...nnIf you want to save the output image where the original is, write:n%p1/%fnnIf you want to save the output image in a directory 'converted' located the directory of the original, write:n%p1/converted/%fnnIf you want to save the output image in directory '/home/tom/converted' with keeping the same subdirectory of dates, write:n%p2/converted/%d1/%f +!PREFERENCES_OUTDIRHINT;You can use the following formatting strings:n%f, %d1, %d2, ..., %p1, %p2, ...nnThese formatting strings refer to the different parts of the photo's pathname.nnFor example, if the photo being processed has the following pathname:n/home/tom/photos/2010-10-31/dsc0042.nefnthe meaning of the formatting strings are:n%d4 = homen%d3 = tomn%d2 = photosn%d1 = 2010-10-31n%f = dsc0042n%p1 = /home/tom/photos/2010-10-31/n%p2 = /home/tom/photos/n%p3 = /home/tom/n%p4 = /home/nnIf you want to save the output image where the original is, write:n%p1/%fnnIf you want to save the output image in a directory named "converted" located in the directory of the opened image, write:n%p1/converted/%fnnIf you want to save the output image in a directory named "/home/tom/photos/converted/2010-10-31", write:n%p2/converted/%d1/%f !PREFERENCES_OUTDIRTEMPLATE;Use Template -!PREFERENCES_OUTDIRTEMPLATEHINT;You can use the following formatting strings:n%f, %d1, %d2, ..., %p1, %p2, ...nnThese formatting strings refer to the directories and sub-paths of the path of the raw file.nnFor example, if /home/tom/image/02-09-2006/dsc0012.nefhas been opened, the meaning of the formatting strings are:n%f=dsc0012, %d1=02-09-2006, %d2=image, ...n%p1=/home/tom/image/02-09-2006, %p2=/home/tom/image, %p3=/home/tom, ...nnIf you want to save the output image where the original is, write:n%p1/%fnnIf you want to save the output image in a directory 'converted' located the directory of the original, write:n%p1/converted/%fnnIf you want to save the output image in directory '/home/tom/converted' with keeping the same subdirectory of dates, write:n%p2/converted/%d1/%f +!PREFERENCES_OUTDIRTEMPLATEHINT;You can use the following formatting strings:n%f, %d1, %d2, ..., %p1, %p2, ...nnThese formatting strings refer to the different parts of the photo's pathname.nnFor example, if the photo being processed has the following pathname:n/home/tom/photos/2010-10-31/dsc0042.nefnthe meaning of the formatting strings are:n%d4 = homen%d3 = tomn%d2 = photosn%d1 = 2010-10-31n%f = dsc0042n%p1 = /home/tom/photos/2010-10-31/n%p2 = /home/tom/photos/n%p3 = /home/tom/n%p4 = /home/nnIf you want to save the output image where the original is, write:n%p1/%fnnIf you want to save the output image in a directory named "converted" located in the directory of the opened image, write:n%p1/converted/%fnnIf you want to save the output image in a directory named "/home/tom/photos/converted/2010-10-31", write:n%p2/converted/%d1/%f !PREFERENCES_OVERLAY_FILENAMES;Overlay filenames on thumbnails !PREFERENCES_PARSEDEXT;Parsed Extensions !PREFERENCES_PARSEDEXTADD;Add Extension @@ -460,6 +468,7 @@ !PREFERENCES_PROFILESAVEINPUT;Save Processing Parameters Next to the Input File !PREFERENCES_PROPERTY;Property !PREFERENCES_PSPATH;Adobe Photoshop installation directory +!PREFERENCES_SELECTFONT;Select font !PREFERENCES_SELECTICCDIRDLG;Select ICC Profile Directory... !PREFERENCES_SELECTLANG;Select language !PREFERENCES_SELECTMONITORPROFDLG;Select ICC Profile of the Display... @@ -469,6 +478,7 @@ !PREFERENCES_SHOWDATETIME;Show date and time !PREFERENCES_SHOWONLYRAW;Show only RAW files !PREFERENCES_SHTHRESHOLD;Threshold for clipped shadows +!PREFERENCES_SINGLETAB;Single tab mode !PREFERENCES_STARTUPIMDIR;Image directory at startup !PREFERENCES_TAB_BROWSER;File Browser !PREFERENCES_TAB_COLORMGR;Color Management @@ -476,6 +486,8 @@ !PREFERENCES_TAB_IMPROC;Image Processing !PREFERENCES_TAB_OUTPUT;Output Options !PREFERENCES_THUMBSIZE;Thumbnail Size +!PREFERENCES_USESYSTEMTHEME; Use System Theme +!PREFERENCES_WORKFLOW;Workflow !PROFILEPANEL_FILEDLGFILTERANY;Any files !PROFILEPANEL_FILEDLGFILTERPP;Postprocessing profiles !PROFILEPANEL_LABEL;Postprocessing Profiles @@ -574,8 +586,15 @@ !TP_DETAIL_AMOUNT;Amount !TP_DIRPYRDENOISE_CHROMA;Chrominance !TP_DIRPYRDENOISE_GAMMA;Gamma -!TP_DIRPYRDENOISE_LABEL;Directional Pyramid Noise Reduction +!TP_DIRPYRDENOISE_LABEL;Directional pyramid noise reduction !TP_DIRPYRDENOISE_LUMA;Luminance +!TP_DIRPYREQUALIZER_LABEL;Directional pyramid equalizer +!TP_DIRPYREQUALIZER_LUMACOARSEST;Coarsest +!TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Contrast- +!TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;Contrast+ +!TP_DIRPYREQUALIZER_LUMAFINEST;Finest +!TP_DIRPYREQUALIZER_LUMANEUTRAL;Neutral +!TP_DIRPYREQUALIZER_THRESHOLD;Threshold !TP_DISTORTION_AMOUNT;Amount !TP_DISTORTION_LABEL;Distortion !TP_EQUALIZER_CONTRAST_MINUS;Contrast- @@ -588,15 +607,15 @@ !TP_EXPOSURE_BLACKLEVEL;Black !TP_EXPOSURE_BRIGHTNESS;Brightness !TP_EXPOSURE_CLIP;Clip -!TP_EXPOSURE_COMPRHIGHLIGHTS;Highlight compression -!TP_EXPOSURE_COMPRSHADOWS;Shadow compression +!TP_EXPOSURE_COMPRHIGHLIGHTS;Highlight recovery +!TP_EXPOSURE_COMPRSHADOWS;Shadow recovery !TP_EXPOSURE_CONTRAST;Contrast !TP_EXPOSURE_CURVEEDITOR;Tone Curve !TP_EXPOSURE_EXPCOMP;Exp. Comp. !TP_EXPOSURE_LABEL;Exposure !TP_HLREC_CIELAB;CIELab Blending !TP_HLREC_COLOR;Color Propagation -!TP_HLREC_LABEL;Highlight Recovery +!TP_HLREC_LABEL;Highlight Reconstruction !TP_HLREC_LUMINANCE;Luminance Recovery !TP_HLREC_METHOD;Method: !TP_ICM_FILEDLGFILTERANY;Any files @@ -615,16 +634,14 @@ !TP_ICM_WORKINGPROFILE;Working Profile !TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction !TP_IMPULSEDENOISE_THRESH;Threshold +!TP_LABCURVE_BRIGHTNESS;Brightness +!TP_LABCURVE_CONTRAST;Contrast +!TP_LABCURVE_CURVEEDITOR;Luminance Curve +!TP_LABCURVE_LABEL;Lab Curves +!TP_LABCURVE_SATURATION;Saturation !TP_LENSGEOM_AUTOCROP;Auto Crop !TP_LENSGEOM_FILL;Auto Fill !TP_LENSGEOM_LABEL;Lens / Geometry -!TP_LUMACURVE_BLACKLEVEL;Black -!TP_LUMACURVE_BRIGHTNESS;Brightness -!TP_LUMACURVE_COMPRHIGHLIGHTS;Highlight compression -!TP_LUMACURVE_COMPRSHADOWS;Shadow compression -!TP_LUMACURVE_CONTRAST;Contrast -!TP_LUMACURVE_CURVEEDITOR;Luminance Curve -!TP_LUMACURVE_LABEL;Luminance Curve !TP_LUMADENOISE_EDGETOLERANCE;Edge Tolerance !TP_LUMADENOISE_LABEL;Luminance Noise Reduction !TP_LUMADENOISE_RADIUS;Radius diff --git a/rtdata/languages/Espanol b/rtdata/languages/Espanol index 07a63ba18..e63654138 100644 --- a/rtdata/languages/Espanol +++ b/rtdata/languages/Espanol @@ -606,7 +606,7 @@ ZOOMBAR_SMALL;Pequeño !BATCHQUEUE_AUTOSTART;Auto start -!BATCH_PROCESSING;batch processing +!BATCH_PROCESSING;Batch processing !CURVEEDITOR_CUSTOM;Custom !CURVEEDITOR_DARKS;Darks !CURVEEDITOR_HIGHLIGHTS;Highlights @@ -657,6 +657,12 @@ ZOOMBAR_SMALL;Pequeño !NAVIGATOR_G_VALUE;G = %1 !NAVIGATOR_H_NA;H = n/a !NAVIGATOR_H_VALUE;H = %1 +!NAVIGATOR_LAB_A_NA;A = n/a +!NAVIGATOR_LAB_A_VALUE;A = %1 +!NAVIGATOR_LAB_B_NA;B = n/a +!NAVIGATOR_LAB_B_VALUE;B = %1 +!NAVIGATOR_LAB_L_NA;L = n/a +!NAVIGATOR_LAB_L_VALUE;L = %1 !NAVIGATOR_R_NA;R = n/a !NAVIGATOR_R_VALUE;R = %1 !NAVIGATOR_S_NA;S = n/a @@ -664,26 +670,42 @@ ZOOMBAR_SMALL;Pequeño !NAVIGATOR_V_NA;V = n/a !NAVIGATOR_V_VALUE;V = %1 !NAVIGATOR_XY_NA;x = n/a, y = n/a +!PARTIALPASTE_LABCURVE;Lab curve +!PARTIALPASTE_LABCURVE;Luminance curve !PREFERENCES_ADD;ADD !PREFERENCES_BATCH_PROCESSING;batch processing !PREFERENCES_BEHAVIOR;Behavior !PREFERENCES_CACORRECTION;Apply CA auto correction !PREFERENCES_DCBENHANCE;Apply DCB enhancement step !PREFERENCES_DCBITERATIONS;Number of DCB iterations +!PREFERENCES_DMETHODBATCH;Batch +!PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_GREENEQUIL;Green equilibration !PREFERENCES_HOTDEADPIXFILT;Apply hot/dead pixel filter !PREFERENCES_LINEDENOISE;Line noise filter +!PREFERENCES_MULTITAB;Multiple tabs mode !PREFERENCES_OVERLAY_FILENAMES;Overlay filenames on thumbnails !PREFERENCES_PROPERTY;Property +!PREFERENCES_SELECTFONT;Select font !PREFERENCES_SET;SET +!PREFERENCES_SINGLETAB;Single tab mode +!PREFERENCES_USESYSTEMTHEME; Use System Theme +!PREFERENCES_WORKFLOW;Workflow !PROGRESSDLG_PROFILECHANGEDINBROWSER;Profile changed in browser !SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists !SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF !TP_DETAIL_AMOUNT;Amount !TP_DIRPYRDENOISE_CHROMA;Chrominance !TP_DIRPYRDENOISE_GAMMA;Gamma -!TP_DIRPYRDENOISE_LABEL;Directional Pyramid Noise Reduction +!TP_DIRPYRDENOISE_LABEL;Directional pyramid noise reduction !TP_DIRPYRDENOISE_LUMA;Luminance +!TP_DIRPYREQUALIZER_LABEL;Directional pyramid equalizer +!TP_DIRPYREQUALIZER_LUMACOARSEST;Coarsest +!TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Contrast- +!TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;Contrast+ +!TP_DIRPYREQUALIZER_LUMAFINEST;Finest +!TP_DIRPYREQUALIZER_LUMANEUTRAL;Neutral +!TP_DIRPYREQUALIZER_THRESHOLD;Threshold !TP_EQUALIZER_CONTRAST_MINUS;Contrast- !TP_EQUALIZER_CONTRAST_PLUS;Contrast+ !TP_EQUALIZER_FINEST;finest @@ -692,6 +714,11 @@ ZOOMBAR_SMALL;Pequeño !TP_EQUALIZER_NEUTRAL;Neutral !TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction !TP_IMPULSEDENOISE_THRESH;Threshold +!TP_LABCURVE_BRIGHTNESS;Brightness +!TP_LABCURVE_CONTRAST;Contrast +!TP_LABCURVE_CURVEEDITOR;Luminance Curve +!TP_LABCURVE_LABEL;Lab Curves +!TP_LABCURVE_SATURATION;Saturation !TP_LENSGEOM_AUTOCROP;Auto Crop !TP_LENSGEOM_FILL;Auto Fill !TP_LENSGEOM_LABEL;Lens / Geometry diff --git a/rtdata/languages/Euskara b/rtdata/languages/Euskara index 2eb9b2aef..a344ac0f1 100644 --- a/rtdata/languages/Euskara +++ b/rtdata/languages/Euskara @@ -600,7 +600,7 @@ ZOOMBAR_SMALL;Txikia !BATCHQUEUE_AUTOSTART;Auto start -!BATCH_PROCESSING;batch processing +!BATCH_PROCESSING;Batch processing !CURVEEDITOR_CUSTOM;Custom !CURVEEDITOR_DARKS;Darks !CURVEEDITOR_HIGHLIGHTS;Highlights @@ -651,6 +651,12 @@ ZOOMBAR_SMALL;Txikia !NAVIGATOR_G_VALUE;G = %1 !NAVIGATOR_H_NA;H = n/a !NAVIGATOR_H_VALUE;H = %1 +!NAVIGATOR_LAB_A_NA;A = n/a +!NAVIGATOR_LAB_A_VALUE;A = %1 +!NAVIGATOR_LAB_B_NA;B = n/a +!NAVIGATOR_LAB_B_VALUE;B = %1 +!NAVIGATOR_LAB_L_NA;L = n/a +!NAVIGATOR_LAB_L_VALUE;L = %1 !NAVIGATOR_R_NA;R = n/a !NAVIGATOR_R_VALUE;R = %1 !NAVIGATOR_S_NA;S = n/a @@ -658,26 +664,42 @@ ZOOMBAR_SMALL;Txikia !NAVIGATOR_V_NA;V = n/a !NAVIGATOR_V_VALUE;V = %1 !NAVIGATOR_XY_NA;x = n/a, y = n/a +!PARTIALPASTE_LABCURVE;Lab curve +!PARTIALPASTE_LABCURVE;Luminance curve !PREFERENCES_ADD;ADD !PREFERENCES_BATCH_PROCESSING;batch processing !PREFERENCES_BEHAVIOR;Behavior !PREFERENCES_CACORRECTION;Apply CA auto correction !PREFERENCES_DCBENHANCE;Apply DCB enhancement step !PREFERENCES_DCBITERATIONS;Number of DCB iterations +!PREFERENCES_DMETHODBATCH;Batch +!PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_GREENEQUIL;Green equilibration !PREFERENCES_HOTDEADPIXFILT;Apply hot/dead pixel filter !PREFERENCES_LINEDENOISE;Line noise filter +!PREFERENCES_MULTITAB;Multiple tabs mode !PREFERENCES_OVERLAY_FILENAMES;Overlay filenames on thumbnails !PREFERENCES_PROPERTY;Property +!PREFERENCES_SELECTFONT;Select font !PREFERENCES_SET;SET +!PREFERENCES_SINGLETAB;Single tab mode +!PREFERENCES_USESYSTEMTHEME; Use System Theme +!PREFERENCES_WORKFLOW;Workflow !PROGRESSDLG_PROFILECHANGEDINBROWSER;Profile changed in browser !SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists !SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF !TP_DETAIL_AMOUNT;Amount !TP_DIRPYRDENOISE_CHROMA;Chrominance !TP_DIRPYRDENOISE_GAMMA;Gamma -!TP_DIRPYRDENOISE_LABEL;Directional Pyramid Noise Reduction +!TP_DIRPYRDENOISE_LABEL;Directional pyramid noise reduction !TP_DIRPYRDENOISE_LUMA;Luminance +!TP_DIRPYREQUALIZER_LABEL;Directional pyramid equalizer +!TP_DIRPYREQUALIZER_LUMACOARSEST;Coarsest +!TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Contrast- +!TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;Contrast+ +!TP_DIRPYREQUALIZER_LUMAFINEST;Finest +!TP_DIRPYREQUALIZER_LUMANEUTRAL;Neutral +!TP_DIRPYREQUALIZER_THRESHOLD;Threshold !TP_EQUALIZER_CONTRAST_MINUS;Contrast- !TP_EQUALIZER_CONTRAST_PLUS;Contrast+ !TP_EQUALIZER_FINEST;finest @@ -686,6 +708,11 @@ ZOOMBAR_SMALL;Txikia !TP_EQUALIZER_NEUTRAL;Neutral !TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction !TP_IMPULSEDENOISE_THRESH;Threshold +!TP_LABCURVE_BRIGHTNESS;Brightness +!TP_LABCURVE_CONTRAST;Contrast +!TP_LABCURVE_CURVEEDITOR;Luminance Curve +!TP_LABCURVE_LABEL;Lab Curves +!TP_LABCURVE_SATURATION;Saturation !TP_LENSGEOM_AUTOCROP;Auto Crop !TP_LENSGEOM_FILL;Auto Fill !TP_LENSGEOM_LABEL;Lens / Geometry diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais index 6e0b3a4e9..2fcbf6483 100644 --- a/rtdata/languages/Francais +++ b/rtdata/languages/Francais @@ -216,7 +216,14 @@ HISTORY_MSG_81;Redimensionnement activé HISTORY_MSG_82;Changement de profil HISTORY_MSG_83;Ombres/Hautes lumières haute qualité HISTORY_MSG_84;Correction de la perspective +HISTORY_MSG_85;Coefficients d'ondelette +HISTORY_MSG_86;Égaliseur d'ondelette +HISTORY_MSG_87;Réduction du bruit d'impulsion +HISTORY_MSG_89;Réd. du bruit présevant les bords HISTORY_MSG_8;Compensation d'exposition +HISTORY_MSG_90;Réd. de bruit Luminance +HISTORY_MSG_91;Réd. de bruit Chominance +HISTORY_MSG_92;Réd. de bruit Gamma HISTORY_MSG_9;Compression des hautes lumières HISTORY_NEWSNAPSHOT;Ajouter HISTORY_NEWSNAPSHOTAS;Sous... @@ -293,7 +300,6 @@ MAIN_BUTTON_SAVE_TOOLTIP;Enregistrer l'image courante Ctrl+S MAIN_BUTTON_SENDTOEDITOR;Envoyer vers l'éditeur MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Éditer l'image courante dans l'éditeur externe Ctrl+E MAIN_BUTTON_UNFULLSCREEN;Quitter le plein écran -MAIN_BUTTON_UNFULLSCREEN;Quitter plein écran MAIN_FRAME_BATCHQUEUE;File d'attente MAIN_FRAME_FILEBROWSER;Explorateur de fichiers MAIN_FRAME_PLACES;Emplacements @@ -411,7 +417,9 @@ PREFERENCES_DIROTHER;Autre PREFERENCES_DIRSELECTDLG;Choix du dossier Image au lancement... PREFERENCES_DIRSOFTWARE;Dossier d'installation PREFERENCES_DMETHOD;Méthode +PREFERENCES_DMETHODBATCH;Batch PREFERENCES_EDITORCMDLINE;Autre ligne de commande +PREFERENCES_EDITORLAYOUT;Disposition de l'éditeur PREFERENCES_EXTERNALEDITOR;Éditeur externe PREFERENCES_FALSECOLOR;Itérations pour la suppression des fausses couleurs PREFERENCES_FBROWSEROPTS;Options du navigateur de fichiers @@ -433,6 +441,7 @@ PREFERENCES_INTENT_SATURATION;Saturation PREFERENCES_LINEDENOISE;Filtre de bruit de Ligne PREFERENCES_LIVETHUMBNAILS;Vignettes "Live" (plus lent) PREFERENCES_MONITORICC;Profil du moniteur +PREFERENCES_MULTITAB;Mode éditeurs multiple PREFERENCES_OUTDIR;Dossier de sortie PREFERENCES_OUTDIRFOLDER;Dossier de sauvegarde PREFERENCES_OUTDIRFOLDERHINT;Place les images traitées dans le dossier selectionné @@ -452,6 +461,7 @@ PREFERENCES_PROFILESAVECACHE;Enregistrer la paramètres de traitement dans le Ca PREFERENCES_PROFILESAVEINPUT;Enregistrer la paramètres de traitement accolé au fichier d'entrée PREFERENCES_PROPERTY;Propriété PREFERENCES_PSPATH;Dossier d'installation d'Adobe Photoshop +PREFERENCES_SELECTFONT;Police de caractère PREFERENCES_SELECTICCDIRDLG;Choix du dossier des profils ICC... PREFERENCES_SELECTLANG;Choix de la langue PREFERENCES_SELECTMONITORPROFDLG;Choix du profil ICC de l'affichage... @@ -461,6 +471,7 @@ PREFERENCES_SHOWBASICEXIF;Voir les infos EXIF basiques PREFERENCES_SHOWDATETIME;Voir la date et l'heure PREFERENCES_SHOWONLYRAW;Voir seulement les fichiers RAW PREFERENCES_SHTHRESHOLD;Seuil pour le dépassement de domaine inférieur +PREFERENCES_SINGLETAB;Mode éditeur unique PREFERENCES_STARTUPIMDIR;Répertoire Image au démarrage PREFERENCES_TAB_BROWSER;Navigateur de fichiers PREFERENCES_TAB_COLORMGR;Gestion des couleurs @@ -468,6 +479,8 @@ PREFERENCES_TAB_GENERAL;Général PREFERENCES_TAB_IMPROC;Traitement de l'Image PREFERENCES_TAB_OUTPUT;Options de sortie PREFERENCES_THUMBSIZE;Tailles des vignettes +PREFERENCES_USESYSTEMTHEME; Utiliser le thème système +PREFERENCES_WORKFLOW;Habitudes de travail PROFILEPANEL_FILEDLGFILTERANY;Tous les fichiers PROFILEPANEL_FILEDLGFILTERPP;Profils de post-traitement PROFILEPANEL_LABEL;Profils de post-traitement @@ -568,6 +581,13 @@ TP_DIRPYRDENOISE_CHROMA;Chrominance TP_DIRPYRDENOISE_GAMMA;Gamma TP_DIRPYRDENOISE_LABEL;Réduction du bruit présevant les bords TP_DIRPYRDENOISE_LUMA;Luminance +TP_DIRPYREQUALIZER_LABEL;Égaliseur d'amas +TP_DIRPYREQUALIZER_LUMACOARSEST;les plus gros +TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Contraste- +TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;Contraste+ +TP_DIRPYREQUALIZER_LUMAFINEST;les plus petits +TP_DIRPYREQUALIZER_LUMANEUTRAL;Neutre +TP_DIRPYREQUALIZER_THRESHOLD;Seuil TP_DISTORTION_AMOUNT;Quantité TP_DISTORTION_LABEL;Distorsion TP_EQUALIZER_CONTRAST_MINUS;Contraste- @@ -696,10 +716,16 @@ ZOOMPANEL_ZOOMOUT;Zoom - !!!!!!!!!!!!!!!!!!!!!!!!! -!HISTORY_MSG_85;Wavelet coefficients -!HISTORY_MSG_86;Wavelet equalizer -!HISTORY_MSG_87;Impulse noise reduction -!HISTORY_MSG_89;Directional pyramid -!HISTORY_MSG_90;Directional pyramid luminance -!HISTORY_MSG_91;Directional pyramid chominance -!HISTORY_MSG_92;Directional pyramid gamma +!NAVIGATOR_LAB_A_NA;A = n/a +!NAVIGATOR_LAB_A_VALUE;A = %1 +!NAVIGATOR_LAB_B_NA;B = n/a +!NAVIGATOR_LAB_B_VALUE;B = %1 +!NAVIGATOR_LAB_L_NA;L = n/a +!NAVIGATOR_LAB_L_VALUE;L = %1 +!PARTIALPASTE_LABCURVE;Lab curve +!PARTIALPASTE_LABCURVE;Luminance curve +!TP_LABCURVE_BRIGHTNESS;Brightness +!TP_LABCURVE_CONTRAST;Contrast +!TP_LABCURVE_CURVEEDITOR;Luminance Curve +!TP_LABCURVE_LABEL;Lab Curves +!TP_LABCURVE_SATURATION;Saturation diff --git a/rtdata/languages/Greek b/rtdata/languages/Greek index 5968baa69..84688af57 100644 --- a/rtdata/languages/Greek +++ b/rtdata/languages/Greek @@ -598,7 +598,7 @@ ZOOMBAR_SMALL;Μικρό !BATCHQUEUE_AUTOSTART;Auto start -!BATCH_PROCESSING;batch processing +!BATCH_PROCESSING;Batch processing !CURVEEDITOR_CUSTOM;Custom !CURVEEDITOR_DARKS;Darks !CURVEEDITOR_HIGHLIGHTS;Highlights @@ -649,6 +649,12 @@ ZOOMBAR_SMALL;Μικρό !NAVIGATOR_G_VALUE;G = %1 !NAVIGATOR_H_NA;H = n/a !NAVIGATOR_H_VALUE;H = %1 +!NAVIGATOR_LAB_A_NA;A = n/a +!NAVIGATOR_LAB_A_VALUE;A = %1 +!NAVIGATOR_LAB_B_NA;B = n/a +!NAVIGATOR_LAB_B_VALUE;B = %1 +!NAVIGATOR_LAB_L_NA;L = n/a +!NAVIGATOR_LAB_L_VALUE;L = %1 !NAVIGATOR_R_NA;R = n/a !NAVIGATOR_R_VALUE;R = %1 !NAVIGATOR_S_NA;S = n/a @@ -656,26 +662,42 @@ ZOOMBAR_SMALL;Μικρό !NAVIGATOR_V_NA;V = n/a !NAVIGATOR_V_VALUE;V = %1 !NAVIGATOR_XY_NA;x = n/a, y = n/a +!PARTIALPASTE_LABCURVE;Lab curve +!PARTIALPASTE_LABCURVE;Luminance curve !PREFERENCES_ADD;ADD !PREFERENCES_BATCH_PROCESSING;batch processing !PREFERENCES_BEHAVIOR;Behavior !PREFERENCES_CACORRECTION;Apply CA auto correction !PREFERENCES_DCBENHANCE;Apply DCB enhancement step !PREFERENCES_DCBITERATIONS;Number of DCB iterations +!PREFERENCES_DMETHODBATCH;Batch +!PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_GREENEQUIL;Green equilibration !PREFERENCES_HOTDEADPIXFILT;Apply hot/dead pixel filter !PREFERENCES_LINEDENOISE;Line noise filter +!PREFERENCES_MULTITAB;Multiple tabs mode !PREFERENCES_OVERLAY_FILENAMES;Overlay filenames on thumbnails !PREFERENCES_PROPERTY;Property +!PREFERENCES_SELECTFONT;Select font !PREFERENCES_SET;SET +!PREFERENCES_SINGLETAB;Single tab mode +!PREFERENCES_USESYSTEMTHEME; Use System Theme +!PREFERENCES_WORKFLOW;Workflow !PROGRESSDLG_PROFILECHANGEDINBROWSER;Profile changed in browser !SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists !SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF !TP_DETAIL_AMOUNT;Amount !TP_DIRPYRDENOISE_CHROMA;Chrominance !TP_DIRPYRDENOISE_GAMMA;Gamma -!TP_DIRPYRDENOISE_LABEL;Directional Pyramid Noise Reduction +!TP_DIRPYRDENOISE_LABEL;Directional pyramid noise reduction !TP_DIRPYRDENOISE_LUMA;Luminance +!TP_DIRPYREQUALIZER_LABEL;Directional pyramid equalizer +!TP_DIRPYREQUALIZER_LUMACOARSEST;Coarsest +!TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Contrast- +!TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;Contrast+ +!TP_DIRPYREQUALIZER_LUMAFINEST;Finest +!TP_DIRPYREQUALIZER_LUMANEUTRAL;Neutral +!TP_DIRPYREQUALIZER_THRESHOLD;Threshold !TP_EQUALIZER_CONTRAST_MINUS;Contrast- !TP_EQUALIZER_CONTRAST_PLUS;Contrast+ !TP_EQUALIZER_FINEST;finest @@ -684,6 +706,11 @@ ZOOMBAR_SMALL;Μικρό !TP_EQUALIZER_NEUTRAL;Neutral !TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction !TP_IMPULSEDENOISE_THRESH;Threshold +!TP_LABCURVE_BRIGHTNESS;Brightness +!TP_LABCURVE_CONTRAST;Contrast +!TP_LABCURVE_CURVEEDITOR;Luminance Curve +!TP_LABCURVE_LABEL;Lab Curves +!TP_LABCURVE_SATURATION;Saturation !TP_LENSGEOM_AUTOCROP;Auto Crop !TP_LENSGEOM_FILL;Auto Fill !TP_LENSGEOM_LABEL;Lens / Geometry diff --git a/rtdata/languages/Hebrew b/rtdata/languages/Hebrew index 845bb6a9b..a133876f1 100644 --- a/rtdata/languages/Hebrew +++ b/rtdata/languages/Hebrew @@ -599,7 +599,7 @@ ZOOMBAR_SMALL;קטן !BATCHQUEUE_AUTOSTART;Auto start -!BATCH_PROCESSING;batch processing +!BATCH_PROCESSING;Batch processing !CURVEEDITOR_CUSTOM;Custom !CURVEEDITOR_DARKS;Darks !CURVEEDITOR_HIGHLIGHTS;Highlights @@ -650,6 +650,12 @@ ZOOMBAR_SMALL;קטן !NAVIGATOR_G_VALUE;G = %1 !NAVIGATOR_H_NA;H = n/a !NAVIGATOR_H_VALUE;H = %1 +!NAVIGATOR_LAB_A_NA;A = n/a +!NAVIGATOR_LAB_A_VALUE;A = %1 +!NAVIGATOR_LAB_B_NA;B = n/a +!NAVIGATOR_LAB_B_VALUE;B = %1 +!NAVIGATOR_LAB_L_NA;L = n/a +!NAVIGATOR_LAB_L_VALUE;L = %1 !NAVIGATOR_R_NA;R = n/a !NAVIGATOR_R_VALUE;R = %1 !NAVIGATOR_S_NA;S = n/a @@ -657,26 +663,42 @@ ZOOMBAR_SMALL;קטן !NAVIGATOR_V_NA;V = n/a !NAVIGATOR_V_VALUE;V = %1 !NAVIGATOR_XY_NA;x = n/a, y = n/a +!PARTIALPASTE_LABCURVE;Lab curve +!PARTIALPASTE_LABCURVE;Luminance curve !PREFERENCES_ADD;ADD !PREFERENCES_BATCH_PROCESSING;batch processing !PREFERENCES_BEHAVIOR;Behavior !PREFERENCES_CACORRECTION;Apply CA auto correction !PREFERENCES_DCBENHANCE;Apply DCB enhancement step !PREFERENCES_DCBITERATIONS;Number of DCB iterations +!PREFERENCES_DMETHODBATCH;Batch +!PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_GREENEQUIL;Green equilibration !PREFERENCES_HOTDEADPIXFILT;Apply hot/dead pixel filter !PREFERENCES_LINEDENOISE;Line noise filter +!PREFERENCES_MULTITAB;Multiple tabs mode !PREFERENCES_OVERLAY_FILENAMES;Overlay filenames on thumbnails !PREFERENCES_PROPERTY;Property +!PREFERENCES_SELECTFONT;Select font !PREFERENCES_SET;SET +!PREFERENCES_SINGLETAB;Single tab mode +!PREFERENCES_USESYSTEMTHEME; Use System Theme +!PREFERENCES_WORKFLOW;Workflow !PROGRESSDLG_PROFILECHANGEDINBROWSER;Profile changed in browser !SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists !SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF !TP_DETAIL_AMOUNT;Amount !TP_DIRPYRDENOISE_CHROMA;Chrominance !TP_DIRPYRDENOISE_GAMMA;Gamma -!TP_DIRPYRDENOISE_LABEL;Directional Pyramid Noise Reduction +!TP_DIRPYRDENOISE_LABEL;Directional pyramid noise reduction !TP_DIRPYRDENOISE_LUMA;Luminance +!TP_DIRPYREQUALIZER_LABEL;Directional pyramid equalizer +!TP_DIRPYREQUALIZER_LUMACOARSEST;Coarsest +!TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Contrast- +!TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;Contrast+ +!TP_DIRPYREQUALIZER_LUMAFINEST;Finest +!TP_DIRPYREQUALIZER_LUMANEUTRAL;Neutral +!TP_DIRPYREQUALIZER_THRESHOLD;Threshold !TP_EQUALIZER_CONTRAST_MINUS;Contrast- !TP_EQUALIZER_CONTRAST_PLUS;Contrast+ !TP_EQUALIZER_FINEST;finest @@ -685,6 +707,11 @@ ZOOMBAR_SMALL;קטן !TP_EQUALIZER_NEUTRAL;Neutral !TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction !TP_IMPULSEDENOISE_THRESH;Threshold +!TP_LABCURVE_BRIGHTNESS;Brightness +!TP_LABCURVE_CONTRAST;Contrast +!TP_LABCURVE_CURVEEDITOR;Luminance Curve +!TP_LABCURVE_LABEL;Lab Curves +!TP_LABCURVE_SATURATION;Saturation !TP_LENSGEOM_AUTOCROP;Auto Crop !TP_LENSGEOM_FILL;Auto Fill !TP_LENSGEOM_LABEL;Lens / Geometry diff --git a/rtdata/languages/Italian b/rtdata/languages/Italian index a9068a8b9..2748ac8b7 100644 --- a/rtdata/languages/Italian +++ b/rtdata/languages/Italian @@ -602,7 +602,7 @@ ZOOMBAR_SMALL;Piccola !BATCHQUEUE_AUTOSTART;Auto start -!BATCH_PROCESSING;batch processing +!BATCH_PROCESSING;Batch processing !CURVEEDITOR_CUSTOM;Custom !CURVEEDITOR_DARKS;Darks !CURVEEDITOR_HIGHLIGHTS;Highlights @@ -653,6 +653,12 @@ ZOOMBAR_SMALL;Piccola !NAVIGATOR_G_VALUE;G = %1 !NAVIGATOR_H_NA;H = n/a !NAVIGATOR_H_VALUE;H = %1 +!NAVIGATOR_LAB_A_NA;A = n/a +!NAVIGATOR_LAB_A_VALUE;A = %1 +!NAVIGATOR_LAB_B_NA;B = n/a +!NAVIGATOR_LAB_B_VALUE;B = %1 +!NAVIGATOR_LAB_L_NA;L = n/a +!NAVIGATOR_LAB_L_VALUE;L = %1 !NAVIGATOR_R_NA;R = n/a !NAVIGATOR_R_VALUE;R = %1 !NAVIGATOR_S_NA;S = n/a @@ -660,26 +666,42 @@ ZOOMBAR_SMALL;Piccola !NAVIGATOR_V_NA;V = n/a !NAVIGATOR_V_VALUE;V = %1 !NAVIGATOR_XY_NA;x = n/a, y = n/a +!PARTIALPASTE_LABCURVE;Lab curve +!PARTIALPASTE_LABCURVE;Luminance curve !PREFERENCES_ADD;ADD !PREFERENCES_BATCH_PROCESSING;batch processing !PREFERENCES_BEHAVIOR;Behavior !PREFERENCES_CACORRECTION;Apply CA auto correction !PREFERENCES_DCBENHANCE;Apply DCB enhancement step !PREFERENCES_DCBITERATIONS;Number of DCB iterations +!PREFERENCES_DMETHODBATCH;Batch +!PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_GREENEQUIL;Green equilibration !PREFERENCES_HOTDEADPIXFILT;Apply hot/dead pixel filter !PREFERENCES_LINEDENOISE;Line noise filter +!PREFERENCES_MULTITAB;Multiple tabs mode !PREFERENCES_OVERLAY_FILENAMES;Overlay filenames on thumbnails !PREFERENCES_PROPERTY;Property +!PREFERENCES_SELECTFONT;Select font !PREFERENCES_SET;SET +!PREFERENCES_SINGLETAB;Single tab mode +!PREFERENCES_USESYSTEMTHEME; Use System Theme +!PREFERENCES_WORKFLOW;Workflow !PROGRESSDLG_PROFILECHANGEDINBROWSER;Profile changed in browser !SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists !SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF !TP_DETAIL_AMOUNT;Amount !TP_DIRPYRDENOISE_CHROMA;Chrominance !TP_DIRPYRDENOISE_GAMMA;Gamma -!TP_DIRPYRDENOISE_LABEL;Directional Pyramid Noise Reduction +!TP_DIRPYRDENOISE_LABEL;Directional pyramid noise reduction !TP_DIRPYRDENOISE_LUMA;Luminance +!TP_DIRPYREQUALIZER_LABEL;Directional pyramid equalizer +!TP_DIRPYREQUALIZER_LUMACOARSEST;Coarsest +!TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Contrast- +!TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;Contrast+ +!TP_DIRPYREQUALIZER_LUMAFINEST;Finest +!TP_DIRPYREQUALIZER_LUMANEUTRAL;Neutral +!TP_DIRPYREQUALIZER_THRESHOLD;Threshold !TP_EQUALIZER_CONTRAST_MINUS;Contrast- !TP_EQUALIZER_CONTRAST_PLUS;Contrast+ !TP_EQUALIZER_FINEST;finest @@ -688,6 +710,11 @@ ZOOMBAR_SMALL;Piccola !TP_EQUALIZER_NEUTRAL;Neutral !TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction !TP_IMPULSEDENOISE_THRESH;Threshold +!TP_LABCURVE_BRIGHTNESS;Brightness +!TP_LABCURVE_CONTRAST;Contrast +!TP_LABCURVE_CURVEEDITOR;Luminance Curve +!TP_LABCURVE_LABEL;Lab Curves +!TP_LABCURVE_SATURATION;Saturation !TP_LENSGEOM_AUTOCROP;Auto Crop !TP_LENSGEOM_FILL;Auto Fill !TP_LENSGEOM_LABEL;Lens / Geometry diff --git a/rtdata/languages/Japanese b/rtdata/languages/Japanese index 4c5ba9b65..f9789c28d 100644 --- a/rtdata/languages/Japanese +++ b/rtdata/languages/Japanese @@ -2,7 +2,7 @@ #00 Japanese #01 2009-02-18 by A3novy #02 updated to RT2.4-RC by paul.matthijsse -#03 2010-06-20 updated to RT3.0 alpha 1 by A3novy +#03 2010-10-24 updated to RT3.0 alpha 1 by A3novy ADJUSTER_RESET_TO_DEFAULT;リセット初期化 BATCHQUEUE_AUTOSTART;オートスタート BATCH_PROCESSING;バッチ処理 @@ -14,6 +14,7 @@ CURVEEDITOR_HIGHLIGHTS;ハイライト CURVEEDITOR_LIGHTS;ライト CURVEEDITOR_LINEAR;リニア CURVEEDITOR_LOADDLGLABEL;カーブ読み込み... +CURVEEDITOR_NURBS;ナーブス カーブ CURVEEDITOR_PARAMETRIC;パラメトリック CURVEEDITOR_SAVEDLGLABEL;カーブ保存... CURVEEDITOR_SHADOWS;シャドウ @@ -136,12 +137,12 @@ HISTORY_MSG_10;シャドウ補正 HISTORY_MSG_11;トーンカーブ HISTORY_MSG_12;露出 オート HISTORY_MSG_13;露出 クリッピング -HISTORY_MSG_14;輝度 明るさ -HISTORY_MSG_15;輝度 コントラスト +HISTORY_MSG_14;Lab 明るさ +HISTORY_MSG_15;Lab コントラスト HISTORY_MSG_16;輝度 黒レベル HISTORY_MSG_17;輝度 ハイライト圧縮 HISTORY_MSG_18;輝度 シャドウ圧縮 -HISTORY_MSG_19;輝度 カーブ +HISTORY_MSG_19;Lab 輝度カーブ HISTORY_MSG_1;写真を読み込みました HISTORY_MSG_20;シャープ HISTORY_MSG_21;シャープ 半径 @@ -214,7 +215,19 @@ HISTORY_MSG_81;リサイズ 有効 HISTORY_MSG_82;プロファイル変更 HISTORY_MSG_83;高画質 シャドウ/ハイライト HISTORY_MSG_84;パースペクティブ コレクション +HISTORY_MSG_85;ウェーブレット係数 +HISTORY_MSG_86;ウェーブレット イコライザ +HISTORY_MSG_87;インパルス ノイズ除去 +HISTORY_MSG_89;指向性ピラミッド HISTORY_MSG_8;露出補正 +HISTORY_MSG_90;指向性ピラミッド 輝度 +HISTORY_MSG_91;指向性ピラミッド 色度 +HISTORY_MSG_92;指向性ピラミッド ガンマ +HISTORY_MSG_93;指向性ピラミッド係数 +HISTORY_MSG_94;指向性ピラミッド イコライザ +HISTORY_MSG_95;Lab 彩度 +HISTORY_MSG_96;Lab aカーブ +HISTORY_MSG_97;Lab bカーブ HISTORY_MSG_9;ハイライト補正 HISTORY_NEWSNAPSHOT;追加 HISTORY_NEWSNAPSHOTAS;ラベル @@ -283,10 +296,13 @@ MAIN_BUTTON_EXIT;終了 MAIN_BUTTON_FULLSCREEN;フルスクリーン MAIN_BUTTON_PREFERENCES;環境設定 MAIN_BUTTON_PUTTOQUEUE;キューに追加 +MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;現在の画像をキュー処理に加える Ctrl+Q MAIN_BUTTON_QUEUE;キューに追加 MAIN_BUTTON_SAVE;画像の保存 MAIN_BUTTON_SAVEAS;別途保存 +MAIN_BUTTON_SAVE_TOOLTIP;現在の画像を保存 Ctrl+S MAIN_BUTTON_SENDTOEDITOR;エディタに送る +MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;現在の画像を外部エディターで編集 Ctrl+E MAIN_BUTTON_UNFULLSCREEN;フルスクリーン解除 MAIN_FRAME_BATCHQUEUE;バッチ キュー MAIN_FRAME_FILEBROWSER;ファイルブラウザ @@ -334,6 +350,12 @@ NAVIGATOR_G_NA;G = n/a NAVIGATOR_G_VALUE;G = %1 NAVIGATOR_H_NA;H = n/a NAVIGATOR_H_VALUE;H = %1 +NAVIGATOR_LAB_A_NA;A = n/a +NAVIGATOR_LAB_A_VALUE;A = %1 +NAVIGATOR_LAB_B_NA;B = n/a +NAVIGATOR_LAB_B_VALUE;B = %1 +NAVIGATOR_LAB_L_NA;L = n/a +NAVIGATOR_LAB_L_VALUE;L = %1 NAVIGATOR_R_NA;R = n/a NAVIGATOR_R_VALUE;R = %1 NAVIGATOR_S_NA;S = n/a @@ -358,8 +380,8 @@ PARTIALPASTE_EXPOSURE;露出 PARTIALPASTE_HLRECOVERY;ハイライト修復 PARTIALPASTE_ICMSETTINGS;ICM 設定 PARTIALPASTE_IPTCINFO;IPTC 情報 +PARTIALPASTE_LABCURVE;Lab カーブ PARTIALPASTE_LENSGROUP;レンズ設定 -PARTIALPASTE_LUMACURVE;輝度カーブ PARTIALPASTE_LUMADENOISE;輝度 ノイズ除去 PARTIALPASTE_LUMINANCEGROUP;輝度設定 PARTIALPASTE_METAICMGROUP;メタデータ/ICM 設定 @@ -386,6 +408,7 @@ PREFERENCES_CACHESTRAT2;メモリ消費重視 PREFERENCES_CACHESTRAT;キャッシュ運用の方針 PREFERENCES_CACHETHUMBFORM;キャッシュのサムネイル形式 PREFERENCES_CACHETHUMBHEIGHT;サムネイル縦の最大値 +PREFERENCES_CACORRECTION;色収差補正を適応 PREFERENCES_CLEARDLG_LINE1;キャッシュの削除 PREFERENCES_CLEARDLG_LINE2;数秒掛かるかも・・ PREFERENCES_CLEARDLG_TITLE;ちょっと待って・・ @@ -404,7 +427,9 @@ PREFERENCES_DIROTHER;他 PREFERENCES_DIRSELECTDLG;起動時の画像・ディレクトリ選択... PREFERENCES_DIRSOFTWARE;インストール・ディレクトリ PREFERENCES_DMETHOD;方法 +PREFERENCES_DMETHODBATCH;バッチ PREFERENCES_EDITORCMDLINE;その他・コマンド入力 +PREFERENCES_EDITORLAYOUT;エディタ レイアウト PREFERENCES_EXTERNALEDITOR;外部エディタ PREFERENCES_FALSECOLOR;偽色 補間ステップ PREFERENCES_FBROWSEROPTS;ファイルブラウザのオプション @@ -412,17 +437,21 @@ PREFERENCES_FILEFORMAT;ファイル形式 PREFERENCES_FORIMAGE;画像ファイル PREFERENCES_FORRAW;RAW ファイル PREFERENCES_GIMPPATH;GIMP インストール ディレクトリ +PREFERENCES_GREENEQUIL;グリーン 平衡化 PREFERENCES_GTKTHEME;GTK デフォルト PREFERENCES_HINT;ヒント PREFERENCES_HLTHRESHOLD;ハイライト・クリッピング領域のしきい値 +PREFERENCES_HOTDEADPIXFILT;ホット/デッド ピクセル・フィルターを適応 PREFERENCES_ICCDIR;ICCプロファイルのディレクトリ PREFERENCES_IMPROCPARAMS;画像処理の規定値 PREFERENCES_INTENT_ABSOLUTE;絶対的な色域を維持 PREFERENCES_INTENT_PERCEPTUAL;知覚的 PREFERENCES_INTENT_RELATIVE;相対的な色域を維持 PREFERENCES_INTENT_SATURATION;彩度 +PREFERENCES_LINEDENOISE;ライン ノイズフィルタ PREFERENCES_LIVETHUMBNAILS;ライブ・サムネイル (遅い) PREFERENCES_MONITORICC;モニタープロファイル +PREFERENCES_MULTITAB;マルチ タブモード PREFERENCES_OUTDIR;出力ディレクトリ PREFERENCES_OUTDIRFOLDER;フォルダに保存 PREFERENCES_OUTDIRFOLDERHINT;選択したフォルダに画像を保存します @@ -442,6 +471,7 @@ PREFERENCES_PROFILESAVECACHE;処理済みのプロファイル・パラメータ PREFERENCES_PROFILESAVEINPUT;処理済みプロファイル・パラメータを入力ファイルと同じディレクトリに保存 PREFERENCES_PROPERTY;プロパティ PREFERENCES_PSPATH;Adobe Photoshop のインストール・ディレクトリ +PREFERENCES_SELECTFONT;フォント選択 PREFERENCES_SELECTICCDIRDLG;ICCプロファイル・ディレクトリ選択... PREFERENCES_SELECTLANG;言語選択 PREFERENCES_SELECTMONITORPROFDLG;ディスプレイのICCプロファイルを選択... @@ -451,6 +481,7 @@ PREFERENCES_SHOWBASICEXIF;基本Exif情報 表示 PREFERENCES_SHOWDATETIME;日付表示 PREFERENCES_SHOWONLYRAW;RAWファイルのみ表示 PREFERENCES_SHTHRESHOLD;シャドウ・クリッピング領域のしきい値 +PREFERENCES_SINGLETAB;シングル タブモード PREFERENCES_STARTUPIMDIR;起動時の画像・ディレクトリ PREFERENCES_TAB_BROWSER;ファイルブラウザ PREFERENCES_TAB_COLORMGR;カラーマネジメント @@ -458,6 +489,8 @@ PREFERENCES_TAB_GENERAL;一般 PREFERENCES_TAB_IMPROC;画像処理 PREFERENCES_TAB_OUTPUT;出力オプション PREFERENCES_THUMBSIZE;サムネイル・サイズ +PREFERENCES_USESYSTEMTHEME;システムのテーマを使う +PREFERENCES_WORKFLOW;ワークフロー PROFILEPANEL_FILEDLGFILTERANY;すべてのファイル PROFILEPANEL_FILEDLGFILTERPP;処理済みプロファイル PROFILEPANEL_LABEL;処理済みプロファイル @@ -491,6 +524,7 @@ QINFO_FOCALLENGTH;焦点距離 QINFO_ISO;ISO QINFO_LENS;レンズ QINFO_NOEXIF;Exifデータがありません +SAVEDLG_AUTOSUFFIX;ファイルが存在する場合、自動的に末尾に文字を加える SAVEDLG_FILEFORMAT;ファイル形式 SAVEDLG_JPEGQUAL;JPEG 品質 SAVEDLG_JPGFILTER;JPEG ファイル @@ -553,8 +587,25 @@ TP_CROP_W;W TP_CROP_X;x TP_CROP_Y;y TP_DETAIL_AMOUNT;量 +TP_DIRPYRDENOISE_CHROMA;色度 +TP_DIRPYRDENOISE_GAMMA;ガンマ +TP_DIRPYRDENOISE_LABEL;指向性ピラミッド ノイズ除去 +TP_DIRPYRDENOISE_LUMA;輝度 +TP_DIRPYREQUALIZER_LABEL;指向性ピラミッド イコライザ +TP_DIRPYREQUALIZER_LUMACOARSEST;粗い +TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;コントラスト- +TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;コントラスト+ +TP_DIRPYREQUALIZER_LUMAFINEST;細い +TP_DIRPYREQUALIZER_LUMANEUTRAL;ニュートラル +TP_DIRPYREQUALIZER_THRESHOLD;しきい値 TP_DISTORTION_AMOUNT;量 TP_DISTORTION_LABEL;歪曲収差補正 +TP_EQUALIZER_CONTRAST_MINUS;コントラスト- +TP_EQUALIZER_CONTRAST_PLUS;コントラスト+ +TP_EQUALIZER_FINEST;細い +TP_EQUALIZER_LABEL;ウェーブレット イコライザ +TP_EQUALIZER_LARGEST;粗い +TP_EQUALIZER_NEUTRAL;ニュートラル TP_EXPOSURE_AUTOLEVELS;オートレベル TP_EXPOSURE_BLACKLEVEL;黒レベル TP_EXPOSURE_BRIGHTNESS;明るさ @@ -584,16 +635,17 @@ TP_ICM_OUTPUTDLGLABEL;出力 ICC プロファイルを選択... TP_ICM_OUTPUTPROFILE;出力プロファイル TP_ICM_SAVEREFERENCE;プロファイリングの参照する画像を保存 TP_ICM_WORKINGPROFILE;作業プロファイル +TP_IMPULSEDENOISE_LABEL;インパルス ノイズ除去 +TP_IMPULSEDENOISE_THRESH;しきい値 +TP_LABCURVE_BRIGHTNESS;明るさ +TP_LABCURVE_CONTRAST;コントラスト +TP_LABCURVE_CURVEEDITOR +TP_LABCURVE_CURVEEDITOR;Lab 輝度カーブ +TP_LABCURVE_LABEL;Lab カーブ +TP_LABCURVE_SATURATION;彩度 TP_LENSGEOM_AUTOCROP;自動的に切り抜き選択 TP_LENSGEOM_FILL;オートフィル TP_LENSGEOM_LABEL;レンズ / 形状 -TP_LUMACURVE_BLACKLEVEL;黒レベル -TP_LUMACURVE_BRIGHTNESS;明るさ -TP_LUMACURVE_COMPRHIGHLIGHTS;ハイライト圧縮 -TP_LUMACURVE_COMPRSHADOWS;シャドウ圧縮 -TP_LUMACURVE_CONTRAST;コントラスト -TP_LUMACURVE_CURVEEDITOR;輝度カーブエディタ -TP_LUMACURVE_LABEL;輝度カーブ TP_LUMADENOISE_EDGETOLERANCE;エッジの許容度 TP_LUMADENOISE_LABEL;輝度 ノイズ除去 TP_LUMADENOISE_RADIUS;半径 @@ -676,31 +728,3 @@ ZOOMPANEL_ZOOMOUT;ズームアウト !!!!!!!!!!!!!!!!!!!!!!!!! -!CURVEEDITOR_NURBS;Control cage -!HISTORY_MSG_85;Wavelet coefficients -!HISTORY_MSG_86;Wavelet equalizer -!HISTORY_MSG_87;Impulse noise reduction -!HISTORY_MSG_89;Directional pyramid -!HISTORY_MSG_90;Directional pyramid luminance -!HISTORY_MSG_91;Directional pyramid chominance -!HISTORY_MSG_92;Directional pyramid gamma -!MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Add current image to processing queue Ctrl+Q -!MAIN_BUTTON_SAVE_TOOLTIP;Save current image Ctrl+S -!MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Edit current image in external editor Ctrl+E -!PREFERENCES_CACORRECTION;Apply CA auto correction -!PREFERENCES_GREENEQUIL;Green equilibration -!PREFERENCES_HOTDEADPIXFILT;Apply hot/dead pixel filter -!PREFERENCES_LINEDENOISE;Line noise filter -!SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists -!TP_DIRPYRDENOISE_CHROMA;Chrominance -!TP_DIRPYRDENOISE_GAMMA;Gamma -!TP_DIRPYRDENOISE_LABEL;Directional Pyramid Noise Reduction -!TP_DIRPYRDENOISE_LUMA;Luminance -!TP_EQUALIZER_CONTRAST_MINUS;Contrast- -!TP_EQUALIZER_CONTRAST_PLUS;Contrast+ -!TP_EQUALIZER_FINEST;finest -!TP_EQUALIZER_LABEL;Wavelet equalizer -!TP_EQUALIZER_LARGEST;coarsest -!TP_EQUALIZER_NEUTRAL;Neutral -!TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction -!TP_IMPULSEDENOISE_THRESH;Threshold diff --git a/rtdata/languages/Latvian b/rtdata/languages/Latvian index 8bfacd794..990976527 100644 --- a/rtdata/languages/Latvian +++ b/rtdata/languages/Latvian @@ -598,7 +598,7 @@ ZOOMBAR_SMALL;Mazs !BATCHQUEUE_AUTOSTART;Auto start -!BATCH_PROCESSING;batch processing +!BATCH_PROCESSING;Batch processing !CURVEEDITOR_CUSTOM;Custom !CURVEEDITOR_DARKS;Darks !CURVEEDITOR_HIGHLIGHTS;Highlights @@ -649,6 +649,12 @@ ZOOMBAR_SMALL;Mazs !NAVIGATOR_G_VALUE;G = %1 !NAVIGATOR_H_NA;H = n/a !NAVIGATOR_H_VALUE;H = %1 +!NAVIGATOR_LAB_A_NA;A = n/a +!NAVIGATOR_LAB_A_VALUE;A = %1 +!NAVIGATOR_LAB_B_NA;B = n/a +!NAVIGATOR_LAB_B_VALUE;B = %1 +!NAVIGATOR_LAB_L_NA;L = n/a +!NAVIGATOR_LAB_L_VALUE;L = %1 !NAVIGATOR_R_NA;R = n/a !NAVIGATOR_R_VALUE;R = %1 !NAVIGATOR_S_NA;S = n/a @@ -656,26 +662,42 @@ ZOOMBAR_SMALL;Mazs !NAVIGATOR_V_NA;V = n/a !NAVIGATOR_V_VALUE;V = %1 !NAVIGATOR_XY_NA;x = n/a, y = n/a +!PARTIALPASTE_LABCURVE;Lab curve +!PARTIALPASTE_LABCURVE;Luminance curve !PREFERENCES_ADD;ADD !PREFERENCES_BATCH_PROCESSING;batch processing !PREFERENCES_BEHAVIOR;Behavior !PREFERENCES_CACORRECTION;Apply CA auto correction !PREFERENCES_DCBENHANCE;Apply DCB enhancement step !PREFERENCES_DCBITERATIONS;Number of DCB iterations +!PREFERENCES_DMETHODBATCH;Batch +!PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_GREENEQUIL;Green equilibration !PREFERENCES_HOTDEADPIXFILT;Apply hot/dead pixel filter !PREFERENCES_LINEDENOISE;Line noise filter +!PREFERENCES_MULTITAB;Multiple tabs mode !PREFERENCES_OVERLAY_FILENAMES;Overlay filenames on thumbnails !PREFERENCES_PROPERTY;Property +!PREFERENCES_SELECTFONT;Select font !PREFERENCES_SET;SET +!PREFERENCES_SINGLETAB;Single tab mode +!PREFERENCES_USESYSTEMTHEME; Use System Theme +!PREFERENCES_WORKFLOW;Workflow !PROGRESSDLG_PROFILECHANGEDINBROWSER;Profile changed in browser !SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists !SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF !TP_DETAIL_AMOUNT;Amount !TP_DIRPYRDENOISE_CHROMA;Chrominance !TP_DIRPYRDENOISE_GAMMA;Gamma -!TP_DIRPYRDENOISE_LABEL;Directional Pyramid Noise Reduction +!TP_DIRPYRDENOISE_LABEL;Directional pyramid noise reduction !TP_DIRPYRDENOISE_LUMA;Luminance +!TP_DIRPYREQUALIZER_LABEL;Directional pyramid equalizer +!TP_DIRPYREQUALIZER_LUMACOARSEST;Coarsest +!TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Contrast- +!TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;Contrast+ +!TP_DIRPYREQUALIZER_LUMAFINEST;Finest +!TP_DIRPYREQUALIZER_LUMANEUTRAL;Neutral +!TP_DIRPYREQUALIZER_THRESHOLD;Threshold !TP_EQUALIZER_CONTRAST_MINUS;Contrast- !TP_EQUALIZER_CONTRAST_PLUS;Contrast+ !TP_EQUALIZER_FINEST;finest @@ -684,6 +706,11 @@ ZOOMBAR_SMALL;Mazs !TP_EQUALIZER_NEUTRAL;Neutral !TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction !TP_IMPULSEDENOISE_THRESH;Threshold +!TP_LABCURVE_BRIGHTNESS;Brightness +!TP_LABCURVE_CONTRAST;Contrast +!TP_LABCURVE_CURVEEDITOR;Luminance Curve +!TP_LABCURVE_LABEL;Lab Curves +!TP_LABCURVE_SATURATION;Saturation !TP_LENSGEOM_AUTOCROP;Auto Crop !TP_LENSGEOM_FILL;Auto Fill !TP_LENSGEOM_LABEL;Lens / Geometry diff --git a/rtdata/languages/Magyar b/rtdata/languages/Magyar index 4eea760cb..2551397ec 100644 --- a/rtdata/languages/Magyar +++ b/rtdata/languages/Magyar @@ -597,7 +597,7 @@ ZOOMBAR_SMALL;Kicsi !BATCHQUEUE_AUTOSTART;Auto start -!BATCH_PROCESSING;batch processing +!BATCH_PROCESSING;Batch processing !CURVEEDITOR_CUSTOM;Custom !CURVEEDITOR_DARKS;Darks !CURVEEDITOR_HIGHLIGHTS;Highlights @@ -648,6 +648,12 @@ ZOOMBAR_SMALL;Kicsi !NAVIGATOR_G_VALUE;G = %1 !NAVIGATOR_H_NA;H = n/a !NAVIGATOR_H_VALUE;H = %1 +!NAVIGATOR_LAB_A_NA;A = n/a +!NAVIGATOR_LAB_A_VALUE;A = %1 +!NAVIGATOR_LAB_B_NA;B = n/a +!NAVIGATOR_LAB_B_VALUE;B = %1 +!NAVIGATOR_LAB_L_NA;L = n/a +!NAVIGATOR_LAB_L_VALUE;L = %1 !NAVIGATOR_R_NA;R = n/a !NAVIGATOR_R_VALUE;R = %1 !NAVIGATOR_S_NA;S = n/a @@ -655,26 +661,42 @@ ZOOMBAR_SMALL;Kicsi !NAVIGATOR_V_NA;V = n/a !NAVIGATOR_V_VALUE;V = %1 !NAVIGATOR_XY_NA;x = n/a, y = n/a +!PARTIALPASTE_LABCURVE;Lab curve +!PARTIALPASTE_LABCURVE;Luminance curve !PREFERENCES_ADD;ADD !PREFERENCES_BATCH_PROCESSING;batch processing !PREFERENCES_BEHAVIOR;Behavior !PREFERENCES_CACORRECTION;Apply CA auto correction !PREFERENCES_DCBENHANCE;Apply DCB enhancement step !PREFERENCES_DCBITERATIONS;Number of DCB iterations +!PREFERENCES_DMETHODBATCH;Batch +!PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_GREENEQUIL;Green equilibration !PREFERENCES_HOTDEADPIXFILT;Apply hot/dead pixel filter !PREFERENCES_LINEDENOISE;Line noise filter +!PREFERENCES_MULTITAB;Multiple tabs mode !PREFERENCES_OVERLAY_FILENAMES;Overlay filenames on thumbnails !PREFERENCES_PROPERTY;Property +!PREFERENCES_SELECTFONT;Select font !PREFERENCES_SET;SET +!PREFERENCES_SINGLETAB;Single tab mode +!PREFERENCES_USESYSTEMTHEME; Use System Theme +!PREFERENCES_WORKFLOW;Workflow !PROGRESSDLG_PROFILECHANGEDINBROWSER;Profile changed in browser !SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists !SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF !TP_DETAIL_AMOUNT;Amount !TP_DIRPYRDENOISE_CHROMA;Chrominance !TP_DIRPYRDENOISE_GAMMA;Gamma -!TP_DIRPYRDENOISE_LABEL;Directional Pyramid Noise Reduction +!TP_DIRPYRDENOISE_LABEL;Directional pyramid noise reduction !TP_DIRPYRDENOISE_LUMA;Luminance +!TP_DIRPYREQUALIZER_LABEL;Directional pyramid equalizer +!TP_DIRPYREQUALIZER_LUMACOARSEST;Coarsest +!TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Contrast- +!TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;Contrast+ +!TP_DIRPYREQUALIZER_LUMAFINEST;Finest +!TP_DIRPYREQUALIZER_LUMANEUTRAL;Neutral +!TP_DIRPYREQUALIZER_THRESHOLD;Threshold !TP_EQUALIZER_CONTRAST_MINUS;Contrast- !TP_EQUALIZER_CONTRAST_PLUS;Contrast+ !TP_EQUALIZER_FINEST;finest @@ -683,6 +705,11 @@ ZOOMBAR_SMALL;Kicsi !TP_EQUALIZER_NEUTRAL;Neutral !TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction !TP_IMPULSEDENOISE_THRESH;Threshold +!TP_LABCURVE_BRIGHTNESS;Brightness +!TP_LABCURVE_CONTRAST;Contrast +!TP_LABCURVE_CURVEEDITOR;Luminance Curve +!TP_LABCURVE_LABEL;Lab Curves +!TP_LABCURVE_SATURATION;Saturation !TP_LENSGEOM_AUTOCROP;Auto Crop !TP_LENSGEOM_FILL;Auto Fill !TP_LENSGEOM_LABEL;Lens / Geometry diff --git a/rtdata/languages/Nederlands b/rtdata/languages/Nederlands index e4f801712..64d09b2bb 100644 --- a/rtdata/languages/Nederlands +++ b/rtdata/languages/Nederlands @@ -683,15 +683,37 @@ ZOOMPANEL_ZOOMOUT;Zoom uit !MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Add current image to processing queue Ctrl+Q !MAIN_BUTTON_SAVE_TOOLTIP;Save current image Ctrl+S !MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Edit current image in external editor Ctrl+E +!NAVIGATOR_LAB_A_NA;A = n/a +!NAVIGATOR_LAB_A_VALUE;A = %1 +!NAVIGATOR_LAB_B_NA;B = n/a +!NAVIGATOR_LAB_B_VALUE;B = %1 +!NAVIGATOR_LAB_L_NA;L = n/a +!NAVIGATOR_LAB_L_VALUE;L = %1 +!PARTIALPASTE_LABCURVE;Lab curve +!PARTIALPASTE_LABCURVE;Luminance curve !PREFERENCES_CACORRECTION;Apply CA auto correction +!PREFERENCES_DMETHODBATCH;Batch +!PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_GREENEQUIL;Green equilibration !PREFERENCES_HOTDEADPIXFILT;Apply hot/dead pixel filter !PREFERENCES_LINEDENOISE;Line noise filter +!PREFERENCES_MULTITAB;Multiple tabs mode +!PREFERENCES_SELECTFONT;Select font +!PREFERENCES_SINGLETAB;Single tab mode +!PREFERENCES_USESYSTEMTHEME; Use System Theme +!PREFERENCES_WORKFLOW;Workflow !SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists !TP_DIRPYRDENOISE_CHROMA;Chrominance !TP_DIRPYRDENOISE_GAMMA;Gamma -!TP_DIRPYRDENOISE_LABEL;Directional Pyramid Noise Reduction +!TP_DIRPYRDENOISE_LABEL;Directional pyramid noise reduction !TP_DIRPYRDENOISE_LUMA;Luminance +!TP_DIRPYREQUALIZER_LABEL;Directional pyramid equalizer +!TP_DIRPYREQUALIZER_LUMACOARSEST;Coarsest +!TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Contrast- +!TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;Contrast+ +!TP_DIRPYREQUALIZER_LUMAFINEST;Finest +!TP_DIRPYREQUALIZER_LUMANEUTRAL;Neutral +!TP_DIRPYREQUALIZER_THRESHOLD;Threshold !TP_EQUALIZER_CONTRAST_MINUS;Contrast- !TP_EQUALIZER_CONTRAST_PLUS;Contrast+ !TP_EQUALIZER_FINEST;finest @@ -700,6 +722,11 @@ ZOOMPANEL_ZOOMOUT;Zoom uit !TP_EQUALIZER_NEUTRAL;Neutral !TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction !TP_IMPULSEDENOISE_THRESH;Threshold +!TP_LABCURVE_BRIGHTNESS;Brightness +!TP_LABCURVE_CONTRAST;Contrast +!TP_LABCURVE_CURVEEDITOR;Luminance Curve +!TP_LABCURVE_LABEL;Lab Curves +!TP_LABCURVE_SATURATION;Saturation !TP_LENSGEOM_AUTOCROP;Auto Crop !TP_LENSGEOM_FILL;Auto Fill !TP_LENSGEOM_LABEL;Lens / Geometry diff --git a/rtdata/languages/Norsk BM b/rtdata/languages/Norsk BM index f9f357dc7..d6ea811f4 100644 --- a/rtdata/languages/Norsk BM +++ b/rtdata/languages/Norsk BM @@ -599,7 +599,7 @@ ZOOMBAR_SMALL;Liten !BATCHQUEUE_AUTOSTART;Auto start -!BATCH_PROCESSING;batch processing +!BATCH_PROCESSING;Batch processing !CURVEEDITOR_CUSTOM;Custom !CURVEEDITOR_DARKS;Darks !CURVEEDITOR_HIGHLIGHTS;Highlights @@ -650,6 +650,12 @@ ZOOMBAR_SMALL;Liten !NAVIGATOR_G_VALUE;G = %1 !NAVIGATOR_H_NA;H = n/a !NAVIGATOR_H_VALUE;H = %1 +!NAVIGATOR_LAB_A_NA;A = n/a +!NAVIGATOR_LAB_A_VALUE;A = %1 +!NAVIGATOR_LAB_B_NA;B = n/a +!NAVIGATOR_LAB_B_VALUE;B = %1 +!NAVIGATOR_LAB_L_NA;L = n/a +!NAVIGATOR_LAB_L_VALUE;L = %1 !NAVIGATOR_R_NA;R = n/a !NAVIGATOR_R_VALUE;R = %1 !NAVIGATOR_S_NA;S = n/a @@ -657,26 +663,42 @@ ZOOMBAR_SMALL;Liten !NAVIGATOR_V_NA;V = n/a !NAVIGATOR_V_VALUE;V = %1 !NAVIGATOR_XY_NA;x = n/a, y = n/a +!PARTIALPASTE_LABCURVE;Lab curve +!PARTIALPASTE_LABCURVE;Luminance curve !PREFERENCES_ADD;ADD !PREFERENCES_BATCH_PROCESSING;batch processing !PREFERENCES_BEHAVIOR;Behavior !PREFERENCES_CACORRECTION;Apply CA auto correction !PREFERENCES_DCBENHANCE;Apply DCB enhancement step !PREFERENCES_DCBITERATIONS;Number of DCB iterations +!PREFERENCES_DMETHODBATCH;Batch +!PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_GREENEQUIL;Green equilibration !PREFERENCES_HOTDEADPIXFILT;Apply hot/dead pixel filter !PREFERENCES_LINEDENOISE;Line noise filter +!PREFERENCES_MULTITAB;Multiple tabs mode !PREFERENCES_OVERLAY_FILENAMES;Overlay filenames on thumbnails !PREFERENCES_PROPERTY;Property +!PREFERENCES_SELECTFONT;Select font !PREFERENCES_SET;SET +!PREFERENCES_SINGLETAB;Single tab mode +!PREFERENCES_USESYSTEMTHEME; Use System Theme +!PREFERENCES_WORKFLOW;Workflow !PROGRESSDLG_PROFILECHANGEDINBROWSER;Profile changed in browser !SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists !SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF !TP_DETAIL_AMOUNT;Amount !TP_DIRPYRDENOISE_CHROMA;Chrominance !TP_DIRPYRDENOISE_GAMMA;Gamma -!TP_DIRPYRDENOISE_LABEL;Directional Pyramid Noise Reduction +!TP_DIRPYRDENOISE_LABEL;Directional pyramid noise reduction !TP_DIRPYRDENOISE_LUMA;Luminance +!TP_DIRPYREQUALIZER_LABEL;Directional pyramid equalizer +!TP_DIRPYREQUALIZER_LUMACOARSEST;Coarsest +!TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Contrast- +!TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;Contrast+ +!TP_DIRPYREQUALIZER_LUMAFINEST;Finest +!TP_DIRPYREQUALIZER_LUMANEUTRAL;Neutral +!TP_DIRPYREQUALIZER_THRESHOLD;Threshold !TP_EQUALIZER_CONTRAST_MINUS;Contrast- !TP_EQUALIZER_CONTRAST_PLUS;Contrast+ !TP_EQUALIZER_FINEST;finest @@ -685,6 +707,11 @@ ZOOMBAR_SMALL;Liten !TP_EQUALIZER_NEUTRAL;Neutral !TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction !TP_IMPULSEDENOISE_THRESH;Threshold +!TP_LABCURVE_BRIGHTNESS;Brightness +!TP_LABCURVE_CONTRAST;Contrast +!TP_LABCURVE_CURVEEDITOR;Luminance Curve +!TP_LABCURVE_LABEL;Lab Curves +!TP_LABCURVE_SATURATION;Saturation !TP_LENSGEOM_AUTOCROP;Auto Crop !TP_LENSGEOM_FILL;Auto Fill !TP_LENSGEOM_LABEL;Lens / Geometry diff --git a/rtdata/languages/Polish b/rtdata/languages/Polish index 6dfde0550..de1813711 100644 --- a/rtdata/languages/Polish +++ b/rtdata/languages/Polish @@ -604,7 +604,7 @@ ZOOMBAR_SMALL;Mała !BATCHQUEUE_AUTOSTART;Auto start -!BATCH_PROCESSING;batch processing +!BATCH_PROCESSING;Batch processing !CURVEEDITOR_CUSTOM;Custom !CURVEEDITOR_DARKS;Darks !CURVEEDITOR_HIGHLIGHTS;Highlights @@ -655,6 +655,12 @@ ZOOMBAR_SMALL;Mała !NAVIGATOR_G_VALUE;G = %1 !NAVIGATOR_H_NA;H = n/a !NAVIGATOR_H_VALUE;H = %1 +!NAVIGATOR_LAB_A_NA;A = n/a +!NAVIGATOR_LAB_A_VALUE;A = %1 +!NAVIGATOR_LAB_B_NA;B = n/a +!NAVIGATOR_LAB_B_VALUE;B = %1 +!NAVIGATOR_LAB_L_NA;L = n/a +!NAVIGATOR_LAB_L_VALUE;L = %1 !NAVIGATOR_R_NA;R = n/a !NAVIGATOR_R_VALUE;R = %1 !NAVIGATOR_S_NA;S = n/a @@ -662,25 +668,41 @@ ZOOMBAR_SMALL;Mała !NAVIGATOR_V_NA;V = n/a !NAVIGATOR_V_VALUE;V = %1 !NAVIGATOR_XY_NA;x = n/a, y = n/a +!PARTIALPASTE_LABCURVE;Lab curve +!PARTIALPASTE_LABCURVE;Luminance curve !PREFERENCES_ADD;ADD !PREFERENCES_BATCH_PROCESSING;batch processing !PREFERENCES_BEHAVIOR;Behavior !PREFERENCES_CACORRECTION;Apply CA auto correction !PREFERENCES_DCBENHANCE;Apply DCB enhancement step !PREFERENCES_DCBITERATIONS;Number of DCB iterations +!PREFERENCES_DMETHODBATCH;Batch +!PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_GREENEQUIL;Green equilibration !PREFERENCES_HOTDEADPIXFILT;Apply hot/dead pixel filter !PREFERENCES_LINEDENOISE;Line noise filter +!PREFERENCES_MULTITAB;Multiple tabs mode !PREFERENCES_OVERLAY_FILENAMES;Overlay filenames on thumbnails !PREFERENCES_PROPERTY;Property +!PREFERENCES_SELECTFONT;Select font !PREFERENCES_SET;SET +!PREFERENCES_SINGLETAB;Single tab mode +!PREFERENCES_USESYSTEMTHEME; Use System Theme +!PREFERENCES_WORKFLOW;Workflow !PROGRESSDLG_PROFILECHANGEDINBROWSER;Profile changed in browser !SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists !TP_DETAIL_AMOUNT;Amount !TP_DIRPYRDENOISE_CHROMA;Chrominance !TP_DIRPYRDENOISE_GAMMA;Gamma -!TP_DIRPYRDENOISE_LABEL;Directional Pyramid Noise Reduction +!TP_DIRPYRDENOISE_LABEL;Directional pyramid noise reduction !TP_DIRPYRDENOISE_LUMA;Luminance +!TP_DIRPYREQUALIZER_LABEL;Directional pyramid equalizer +!TP_DIRPYREQUALIZER_LUMACOARSEST;Coarsest +!TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Contrast- +!TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;Contrast+ +!TP_DIRPYREQUALIZER_LUMAFINEST;Finest +!TP_DIRPYREQUALIZER_LUMANEUTRAL;Neutral +!TP_DIRPYREQUALIZER_THRESHOLD;Threshold !TP_EQUALIZER_CONTRAST_MINUS;Contrast- !TP_EQUALIZER_CONTRAST_PLUS;Contrast+ !TP_EQUALIZER_FINEST;finest @@ -689,6 +711,11 @@ ZOOMBAR_SMALL;Mała !TP_EQUALIZER_NEUTRAL;Neutral !TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction !TP_IMPULSEDENOISE_THRESH;Threshold +!TP_LABCURVE_BRIGHTNESS;Brightness +!TP_LABCURVE_CONTRAST;Contrast +!TP_LABCURVE_CURVEEDITOR;Luminance Curve +!TP_LABCURVE_LABEL;Lab Curves +!TP_LABCURVE_SATURATION;Saturation !TP_LENSGEOM_AUTOCROP;Auto Crop !TP_LENSGEOM_FILL;Auto Fill !TP_LENSGEOM_LABEL;Lens / Geometry diff --git a/rtdata/languages/Polish (Latin Characters) b/rtdata/languages/Polish (Latin Characters) index fb72ef43a..5a05b67bd 100644 --- a/rtdata/languages/Polish (Latin Characters) +++ b/rtdata/languages/Polish (Latin Characters) @@ -602,7 +602,7 @@ ZOOMBAR_SMALL;Mala !BATCHQUEUE_AUTOSTART;Auto start -!BATCH_PROCESSING;batch processing +!BATCH_PROCESSING;Batch processing !CURVEEDITOR_CUSTOM;Custom !CURVEEDITOR_DARKS;Darks !CURVEEDITOR_HIGHLIGHTS;Highlights @@ -653,6 +653,12 @@ ZOOMBAR_SMALL;Mala !NAVIGATOR_G_VALUE;G = %1 !NAVIGATOR_H_NA;H = n/a !NAVIGATOR_H_VALUE;H = %1 +!NAVIGATOR_LAB_A_NA;A = n/a +!NAVIGATOR_LAB_A_VALUE;A = %1 +!NAVIGATOR_LAB_B_NA;B = n/a +!NAVIGATOR_LAB_B_VALUE;B = %1 +!NAVIGATOR_LAB_L_NA;L = n/a +!NAVIGATOR_LAB_L_VALUE;L = %1 !NAVIGATOR_R_NA;R = n/a !NAVIGATOR_R_VALUE;R = %1 !NAVIGATOR_S_NA;S = n/a @@ -660,26 +666,42 @@ ZOOMBAR_SMALL;Mala !NAVIGATOR_V_NA;V = n/a !NAVIGATOR_V_VALUE;V = %1 !NAVIGATOR_XY_NA;x = n/a, y = n/a +!PARTIALPASTE_LABCURVE;Lab curve +!PARTIALPASTE_LABCURVE;Luminance curve !PREFERENCES_ADD;ADD !PREFERENCES_BATCH_PROCESSING;batch processing !PREFERENCES_BEHAVIOR;Behavior !PREFERENCES_CACORRECTION;Apply CA auto correction !PREFERENCES_DCBENHANCE;Apply DCB enhancement step !PREFERENCES_DCBITERATIONS;Number of DCB iterations +!PREFERENCES_DMETHODBATCH;Batch +!PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_GREENEQUIL;Green equilibration !PREFERENCES_HOTDEADPIXFILT;Apply hot/dead pixel filter !PREFERENCES_LINEDENOISE;Line noise filter +!PREFERENCES_MULTITAB;Multiple tabs mode !PREFERENCES_OVERLAY_FILENAMES;Overlay filenames on thumbnails !PREFERENCES_PROPERTY;Property +!PREFERENCES_SELECTFONT;Select font !PREFERENCES_SET;SET +!PREFERENCES_SINGLETAB;Single tab mode +!PREFERENCES_USESYSTEMTHEME; Use System Theme +!PREFERENCES_WORKFLOW;Workflow !PROGRESSDLG_PROFILECHANGEDINBROWSER;Profile changed in browser !SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists !SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF !TP_DETAIL_AMOUNT;Amount !TP_DIRPYRDENOISE_CHROMA;Chrominance !TP_DIRPYRDENOISE_GAMMA;Gamma -!TP_DIRPYRDENOISE_LABEL;Directional Pyramid Noise Reduction +!TP_DIRPYRDENOISE_LABEL;Directional pyramid noise reduction !TP_DIRPYRDENOISE_LUMA;Luminance +!TP_DIRPYREQUALIZER_LABEL;Directional pyramid equalizer +!TP_DIRPYREQUALIZER_LUMACOARSEST;Coarsest +!TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Contrast- +!TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;Contrast+ +!TP_DIRPYREQUALIZER_LUMAFINEST;Finest +!TP_DIRPYREQUALIZER_LUMANEUTRAL;Neutral +!TP_DIRPYREQUALIZER_THRESHOLD;Threshold !TP_EQUALIZER_CONTRAST_MINUS;Contrast- !TP_EQUALIZER_CONTRAST_PLUS;Contrast+ !TP_EQUALIZER_FINEST;finest @@ -688,6 +710,11 @@ ZOOMBAR_SMALL;Mala !TP_EQUALIZER_NEUTRAL;Neutral !TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction !TP_IMPULSEDENOISE_THRESH;Threshold +!TP_LABCURVE_BRIGHTNESS;Brightness +!TP_LABCURVE_CONTRAST;Contrast +!TP_LABCURVE_CURVEEDITOR;Luminance Curve +!TP_LABCURVE_LABEL;Lab Curves +!TP_LABCURVE_SATURATION;Saturation !TP_LENSGEOM_AUTOCROP;Auto Crop !TP_LENSGEOM_FILL;Auto Fill !TP_LENSGEOM_LABEL;Lens / Geometry diff --git a/rtdata/languages/Portugues (Brasil) b/rtdata/languages/Portugues (Brasil) index a14bd297a..e173b6664 100644 --- a/rtdata/languages/Portugues (Brasil) +++ b/rtdata/languages/Portugues (Brasil) @@ -599,7 +599,7 @@ ZOOMBAR_SMALL;Pequeno !BATCHQUEUE_AUTOSTART;Auto start -!BATCH_PROCESSING;batch processing +!BATCH_PROCESSING;Batch processing !CURVEEDITOR_CUSTOM;Custom !CURVEEDITOR_DARKS;Darks !CURVEEDITOR_HIGHLIGHTS;Highlights @@ -650,6 +650,12 @@ ZOOMBAR_SMALL;Pequeno !NAVIGATOR_G_VALUE;G = %1 !NAVIGATOR_H_NA;H = n/a !NAVIGATOR_H_VALUE;H = %1 +!NAVIGATOR_LAB_A_NA;A = n/a +!NAVIGATOR_LAB_A_VALUE;A = %1 +!NAVIGATOR_LAB_B_NA;B = n/a +!NAVIGATOR_LAB_B_VALUE;B = %1 +!NAVIGATOR_LAB_L_NA;L = n/a +!NAVIGATOR_LAB_L_VALUE;L = %1 !NAVIGATOR_R_NA;R = n/a !NAVIGATOR_R_VALUE;R = %1 !NAVIGATOR_S_NA;S = n/a @@ -657,26 +663,42 @@ ZOOMBAR_SMALL;Pequeno !NAVIGATOR_V_NA;V = n/a !NAVIGATOR_V_VALUE;V = %1 !NAVIGATOR_XY_NA;x = n/a, y = n/a +!PARTIALPASTE_LABCURVE;Lab curve +!PARTIALPASTE_LABCURVE;Luminance curve !PREFERENCES_ADD;ADD !PREFERENCES_BATCH_PROCESSING;batch processing !PREFERENCES_BEHAVIOR;Behavior !PREFERENCES_CACORRECTION;Apply CA auto correction !PREFERENCES_DCBENHANCE;Apply DCB enhancement step !PREFERENCES_DCBITERATIONS;Number of DCB iterations +!PREFERENCES_DMETHODBATCH;Batch +!PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_GREENEQUIL;Green equilibration !PREFERENCES_HOTDEADPIXFILT;Apply hot/dead pixel filter !PREFERENCES_LINEDENOISE;Line noise filter +!PREFERENCES_MULTITAB;Multiple tabs mode !PREFERENCES_OVERLAY_FILENAMES;Overlay filenames on thumbnails !PREFERENCES_PROPERTY;Property +!PREFERENCES_SELECTFONT;Select font !PREFERENCES_SET;SET +!PREFERENCES_SINGLETAB;Single tab mode +!PREFERENCES_USESYSTEMTHEME; Use System Theme +!PREFERENCES_WORKFLOW;Workflow !PROGRESSDLG_PROFILECHANGEDINBROWSER;Profile changed in browser !SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists !SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF !TP_DETAIL_AMOUNT;Amount !TP_DIRPYRDENOISE_CHROMA;Chrominance !TP_DIRPYRDENOISE_GAMMA;Gamma -!TP_DIRPYRDENOISE_LABEL;Directional Pyramid Noise Reduction +!TP_DIRPYRDENOISE_LABEL;Directional pyramid noise reduction !TP_DIRPYRDENOISE_LUMA;Luminance +!TP_DIRPYREQUALIZER_LABEL;Directional pyramid equalizer +!TP_DIRPYREQUALIZER_LUMACOARSEST;Coarsest +!TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Contrast- +!TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;Contrast+ +!TP_DIRPYREQUALIZER_LUMAFINEST;Finest +!TP_DIRPYREQUALIZER_LUMANEUTRAL;Neutral +!TP_DIRPYREQUALIZER_THRESHOLD;Threshold !TP_EQUALIZER_CONTRAST_MINUS;Contrast- !TP_EQUALIZER_CONTRAST_PLUS;Contrast+ !TP_EQUALIZER_FINEST;finest @@ -685,6 +707,11 @@ ZOOMBAR_SMALL;Pequeno !TP_EQUALIZER_NEUTRAL;Neutral !TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction !TP_IMPULSEDENOISE_THRESH;Threshold +!TP_LABCURVE_BRIGHTNESS;Brightness +!TP_LABCURVE_CONTRAST;Contrast +!TP_LABCURVE_CURVEEDITOR;Luminance Curve +!TP_LABCURVE_LABEL;Lab Curves +!TP_LABCURVE_SATURATION;Saturation !TP_LENSGEOM_AUTOCROP;Auto Crop !TP_LENSGEOM_FILL;Auto Fill !TP_LENSGEOM_LABEL;Lens / Geometry diff --git a/rtdata/languages/Russian b/rtdata/languages/Russian index e22b04b14..fabd39572 100644 --- a/rtdata/languages/Russian +++ b/rtdata/languages/Russian @@ -603,7 +603,7 @@ ZOOMBAR_SMALL;Минимальное !BATCHQUEUE_AUTOSTART;Auto start -!BATCH_PROCESSING;batch processing +!BATCH_PROCESSING;Batch processing !CURVEEDITOR_CUSTOM;Custom !CURVEEDITOR_DARKS;Darks !CURVEEDITOR_HIGHLIGHTS;Highlights @@ -654,6 +654,12 @@ ZOOMBAR_SMALL;Минимальное !NAVIGATOR_G_VALUE;G = %1 !NAVIGATOR_H_NA;H = n/a !NAVIGATOR_H_VALUE;H = %1 +!NAVIGATOR_LAB_A_NA;A = n/a +!NAVIGATOR_LAB_A_VALUE;A = %1 +!NAVIGATOR_LAB_B_NA;B = n/a +!NAVIGATOR_LAB_B_VALUE;B = %1 +!NAVIGATOR_LAB_L_NA;L = n/a +!NAVIGATOR_LAB_L_VALUE;L = %1 !NAVIGATOR_R_NA;R = n/a !NAVIGATOR_R_VALUE;R = %1 !NAVIGATOR_S_NA;S = n/a @@ -661,26 +667,42 @@ ZOOMBAR_SMALL;Минимальное !NAVIGATOR_V_NA;V = n/a !NAVIGATOR_V_VALUE;V = %1 !NAVIGATOR_XY_NA;x = n/a, y = n/a +!PARTIALPASTE_LABCURVE;Lab curve +!PARTIALPASTE_LABCURVE;Luminance curve !PREFERENCES_ADD;ADD !PREFERENCES_BATCH_PROCESSING;batch processing !PREFERENCES_BEHAVIOR;Behavior !PREFERENCES_CACORRECTION;Apply CA auto correction !PREFERENCES_DCBENHANCE;Apply DCB enhancement step !PREFERENCES_DCBITERATIONS;Number of DCB iterations +!PREFERENCES_DMETHODBATCH;Batch +!PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_GREENEQUIL;Green equilibration !PREFERENCES_HOTDEADPIXFILT;Apply hot/dead pixel filter !PREFERENCES_LINEDENOISE;Line noise filter +!PREFERENCES_MULTITAB;Multiple tabs mode !PREFERENCES_OVERLAY_FILENAMES;Overlay filenames on thumbnails !PREFERENCES_PROPERTY;Property +!PREFERENCES_SELECTFONT;Select font !PREFERENCES_SET;SET +!PREFERENCES_SINGLETAB;Single tab mode +!PREFERENCES_USESYSTEMTHEME; Use System Theme +!PREFERENCES_WORKFLOW;Workflow !PROGRESSDLG_PROFILECHANGEDINBROWSER;Profile changed in browser !SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists !SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF !TP_DETAIL_AMOUNT;Amount !TP_DIRPYRDENOISE_CHROMA;Chrominance !TP_DIRPYRDENOISE_GAMMA;Gamma -!TP_DIRPYRDENOISE_LABEL;Directional Pyramid Noise Reduction +!TP_DIRPYRDENOISE_LABEL;Directional pyramid noise reduction !TP_DIRPYRDENOISE_LUMA;Luminance +!TP_DIRPYREQUALIZER_LABEL;Directional pyramid equalizer +!TP_DIRPYREQUALIZER_LUMACOARSEST;Coarsest +!TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Contrast- +!TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;Contrast+ +!TP_DIRPYREQUALIZER_LUMAFINEST;Finest +!TP_DIRPYREQUALIZER_LUMANEUTRAL;Neutral +!TP_DIRPYREQUALIZER_THRESHOLD;Threshold !TP_EQUALIZER_CONTRAST_MINUS;Contrast- !TP_EQUALIZER_CONTRAST_PLUS;Contrast+ !TP_EQUALIZER_FINEST;finest @@ -689,6 +711,11 @@ ZOOMBAR_SMALL;Минимальное !TP_EQUALIZER_NEUTRAL;Neutral !TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction !TP_IMPULSEDENOISE_THRESH;Threshold +!TP_LABCURVE_BRIGHTNESS;Brightness +!TP_LABCURVE_CONTRAST;Contrast +!TP_LABCURVE_CURVEEDITOR;Luminance Curve +!TP_LABCURVE_LABEL;Lab Curves +!TP_LABCURVE_SATURATION;Saturation !TP_LENSGEOM_AUTOCROP;Auto Crop !TP_LENSGEOM_FILL;Auto Fill !TP_LENSGEOM_LABEL;Lens / Geometry diff --git a/rtdata/languages/Serbian (Cyrilic Characters) b/rtdata/languages/Serbian (Cyrilic Characters) index 375520165..302b1c869 100644 --- a/rtdata/languages/Serbian (Cyrilic Characters) +++ b/rtdata/languages/Serbian (Cyrilic Characters) @@ -1,3 +1,4 @@ + # Serbian translation #00 Serbian (Cyrilic) #01 by gpopac 2010-09-21 @@ -702,3 +703,30 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !HISTORY_MSG_90;Directional pyramid luminance !HISTORY_MSG_91;Directional pyramid chominance !HISTORY_MSG_92;Directional pyramid gamma +!NAVIGATOR_LAB_A_NA;A = n/a +!NAVIGATOR_LAB_A_VALUE;A = %1 +!NAVIGATOR_LAB_B_NA;B = n/a +!NAVIGATOR_LAB_B_VALUE;B = %1 +!NAVIGATOR_LAB_L_NA;L = n/a +!NAVIGATOR_LAB_L_VALUE;L = %1 +!PARTIALPASTE_LABCURVE;Lab curve +!PARTIALPASTE_LABCURVE;Luminance curve +!PREFERENCES_DMETHODBATCH;Batch +!PREFERENCES_EDITORLAYOUT;Editor Layout +!PREFERENCES_MULTITAB;Multiple tabs mode +!PREFERENCES_SELECTFONT;Select font +!PREFERENCES_SINGLETAB;Single tab mode +!PREFERENCES_USESYSTEMTHEME; Use System Theme +!PREFERENCES_WORKFLOW;Workflow +!TP_DIRPYREQUALIZER_LABEL;Directional pyramid equalizer +!TP_DIRPYREQUALIZER_LUMACOARSEST;Coarsest +!TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Contrast- +!TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;Contrast+ +!TP_DIRPYREQUALIZER_LUMAFINEST;Finest +!TP_DIRPYREQUALIZER_LUMANEUTRAL;Neutral +!TP_DIRPYREQUALIZER_THRESHOLD;Threshold +!TP_LABCURVE_BRIGHTNESS;Brightness +!TP_LABCURVE_CONTRAST;Contrast +!TP_LABCURVE_CURVEEDITOR;Luminance Curve +!TP_LABCURVE_LABEL;Lab Curves +!TP_LABCURVE_SATURATION;Saturation diff --git a/rtdata/languages/Serbian (Latin Characters) b/rtdata/languages/Serbian (Latin Characters) index 0ac8b9510..e51bec1e5 100644 --- a/rtdata/languages/Serbian (Latin Characters) +++ b/rtdata/languages/Serbian (Latin Characters) @@ -1,3 +1,4 @@ + # Serbian translation #00 Serbian (Cyrilic) #01 by gpopac 2010-09-21 @@ -702,3 +703,30 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !HISTORY_MSG_90;Directional pyramid luminance !HISTORY_MSG_91;Directional pyramid chominance !HISTORY_MSG_92;Directional pyramid gamma +!NAVIGATOR_LAB_A_NA;A = n/a +!NAVIGATOR_LAB_A_VALUE;A = %1 +!NAVIGATOR_LAB_B_NA;B = n/a +!NAVIGATOR_LAB_B_VALUE;B = %1 +!NAVIGATOR_LAB_L_NA;L = n/a +!NAVIGATOR_LAB_L_VALUE;L = %1 +!PARTIALPASTE_LABCURVE;Lab curve +!PARTIALPASTE_LABCURVE;Luminance curve +!PREFERENCES_DMETHODBATCH;Batch +!PREFERENCES_EDITORLAYOUT;Editor Layout +!PREFERENCES_MULTITAB;Multiple tabs mode +!PREFERENCES_SELECTFONT;Select font +!PREFERENCES_SINGLETAB;Single tab mode +!PREFERENCES_USESYSTEMTHEME; Use System Theme +!PREFERENCES_WORKFLOW;Workflow +!TP_DIRPYREQUALIZER_LABEL;Directional pyramid equalizer +!TP_DIRPYREQUALIZER_LUMACOARSEST;Coarsest +!TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Contrast- +!TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;Contrast+ +!TP_DIRPYREQUALIZER_LUMAFINEST;Finest +!TP_DIRPYREQUALIZER_LUMANEUTRAL;Neutral +!TP_DIRPYREQUALIZER_THRESHOLD;Threshold +!TP_LABCURVE_BRIGHTNESS;Brightness +!TP_LABCURVE_CONTRAST;Contrast +!TP_LABCURVE_CURVEEDITOR;Luminance Curve +!TP_LABCURVE_LABEL;Lab Curves +!TP_LABCURVE_SATURATION;Saturation diff --git a/rtdata/languages/Slovak b/rtdata/languages/Slovak index 32e63978f..519973d6d 100644 --- a/rtdata/languages/Slovak +++ b/rtdata/languages/Slovak @@ -1,23 +1,38 @@ -#00 Sloven?~Mina +#00 Slovenčina #01 08.05.2008 #02 01.02.2009 -#03 (Slapo) +#03 23.10.2010 +#04 (Slapo) + + + ADJUSTER_RESET_TO_DEFAULT;Resetovať na predvolené nastavenia +BATCHQUEUE_AUTOSTART;Auto štart +BATCH_PROCESSING;Dávkové spracovanie +CURVEEDITOR_CUSTOM;Vlastné +CURVEEDITOR_DARKS;Tiene CURVEEDITOR_FILEDLGFILTERANY;Všetky súbory CURVEEDITOR_FILEDLGFILTERCURVE;Súbory kriviek +CURVEEDITOR_HIGHLIGHTS;Najvyššie svetlá +CURVEEDITOR_LIGHTS;Svetlá CURVEEDITOR_LINEAR;Lineárna CURVEEDITOR_LOADDLGLABEL;Načítať krivku... +CURVEEDITOR_NURBS;Kontrolná klietka +CURVEEDITOR_PARAMETRIC;Parametricky CURVEEDITOR_SAVEDLGLABEL;Uložiť krivku... +CURVEEDITOR_SHADOWS;Hlboké tiene CURVEEDITOR_TOOLTIPLINEAR;Resetovať krivku na lineárnu CURVEEDITOR_TOOLTIPLOAD;Načítať krivku zo súboru CURVEEDITOR_TOOLTIPSAVE;Uložiť súčasnú krivku +CURVEEDITOR_TYPE;Typ: EXIFFILTER_APERTURE;Clona EXIFFILTER_CAMERA;Fotoaparát EXIFFILTER_DIALOGLABEL;Exif filter EXIFFILTER_FOCALLEN;Ohnisková vzdialenosť EXIFFILTER_ISO;ISO EXIFFILTER_LENS;Objektív +EXIFFILTER_METADATAFILTER;Povoliť filtre meta údajov EXIFFILTER_SHUTTER;Uzávierka EXIFPANEL_ADDEDIT;Pridať/Upraviť EXIFPANEL_ADDEDITHINT;Pridať novú značku alebo upraviť značku @@ -33,10 +48,12 @@ EXIFPANEL_RESETALL;Resetovať všetky EXIFPANEL_RESETALLHINT;Resetovať všetky značky na ich pôvodné hodnoty EXIFPANEL_RESETHINT;Resetovať vybrané značky na ich pôvodné hodnoty EXIFPANEL_SUBDIRECTORY;Podadresár +FILEBROWSER_ADDDELTEMPLATE;Pridať/Odstrániť šablóny... FILEBROWSER_APPLYPROFILE;Použiť profil FILEBROWSER_ARRANGEMENTHINT;Zmeniť medzi vertikálnym/horizontálnym zarovnaním zmenšenín FILEBROWSER_CLEARPROFILE;Vyčistiť profil FILEBROWSER_COPYPROFILE;Kopírovať profil +FILEBROWSER_CURRENT_NAME;Súčasný názov: FILEBROWSER_DELETEDLGLABEL;Potvrdenie odstránenia súboru FILEBROWSER_DELETEDLGMSG;Ste si istí, že chcete odstrániť vybrané %1 súbory? FILEBROWSER_EMPTYTRASH;Vyprázdniť kôš @@ -46,6 +63,7 @@ FILEBROWSER_EXIFFILTERAPPLYHINT;Zapnúť/vypnúť EXIF filter prehliadača súbo FILEBROWSER_EXIFFILTERLABEL;Exif Filter FILEBROWSER_EXIFFILTERSETTINGS;Nastavenia FILEBROWSER_EXIFFILTERSETTINGSHINT;Zmeňte nastavenia EXIF filtra +FILEBROWSER_NEW_NAME;Nový názov: FILEBROWSER_PARTIALPASTEPROFILE;Čiastočné vloženie FILEBROWSER_PASTEPROFILE;Vložiť profil FILEBROWSER_POPUPCANCELJOB;Zrušiť úlohu @@ -69,6 +87,7 @@ FILEBROWSER_PROCESSINGSETTINGSHINT;Nastaviť formát súborov a výstupný adres FILEBROWSER_RENAMEDLGLABEL;Premenovať súbor FILEBROWSER_RENAMEDLGMSG;Premenovať súbor "%1" na: FILEBROWSER_SHOWDIRHINT;Ukázať všetky obrázky v adresári +FILEBROWSER_SHOWEXIFINFO;Ukázať EXIF info i FILEBROWSER_SHOWQUEUEHINT;Zobraziť obsah radu na spracovanie FILEBROWSER_SHOWRANK1HINT;Ukázať obrázky triedy 1 hviezda FILEBROWSER_SHOWRANK2HINT;Ukázať obrázky triedy 2 hviezda @@ -82,14 +101,19 @@ FILEBROWSER_STARTPROCESSINGHINT;Začať spracovanie/ukladanie obrázkov v rade FILEBROWSER_STOPPROCESSING;Zastaviť spracovanie FILEBROWSER_STOPPROCESSINGHINT;Zastaviť spracovanie obrázkov FILEBROWSER_THUMBSIZE;Veľkosť zmenšenín +FILEBROWSER_TOOLTIP_STOPPROCESSING;Začať spracovanie automaticky, keď príde nová úloha +FILEBROWSER_USETEMPLATE;Použiť šablónu: FILEBROWSER_ZOOMINHINT;Zväčšiť veľkosť zmenšenín FILEBROWSER_ZOOMOUTHINT;Zmenšiť veľkosť zmenšenín GENERAL_ABOUT;O programe +GENERAL_AFTER;Potom +GENERAL_BEFORE;Predtým GENERAL_CANCEL;Zrušiť GENERAL_DISABLE;Zakázať GENERAL_DISABLED;Zakázané GENERAL_ENABLE;Povoliť GENERAL_ENABLED;Povolené +GENERAL_HIGH_QUALITY;Vysoká kvalita GENERAL_LANDSCAPE;Krajina GENERAL_LOAD;Načítať GENERAL_NA;n/a @@ -97,17 +121,23 @@ GENERAL_NO;Nie GENERAL_OK;OK GENERAL_PORTRAIT;Portrét GENERAL_SAVE;Uložiť +GENERAL_UNCHANGED;(Nezmenené) GENERAL_YES;Áno +HISTOGRAM_BUTTON_B;B +HISTOGRAM_BUTTON_G;G +HISTOGRAM_BUTTON_L;L +HISTOGRAM_BUTTON_R;R HISTOGRAM_LABEL;Histogram HISTOGRAM_TOOLTIP_B;Zobraziť/Schovať MODRÝ histogram HISTOGRAM_TOOLTIP_G;Zobraziť/Schovať ZELENÝ histogram HISTOGRAM_TOOLTIP_L;Zobraziť/Schovať histogram CIELAB svietivosti HISTOGRAM_TOOLTIP_R;Zobraziť/Schovať ČERVENÝ histogram -HISTORY_CHANGED;Zmenené HISTORY_CUSTOMCURVE;Vlastná krivka HISTORY_DELSNAPSHOT;Odstrániť Snímok HISTORY_FROMCLIPBOARD;Zo schránky +HISTORY_CHANGED;Zmenené HISTORY_LABEL;História +HISTORY_MSG_1;Fotka načítaná HISTORY_MSG_10;Kompresia tieňov HISTORY_MSG_11;Krivka tónov HISTORY_MSG_12;Auto expozícia @@ -118,7 +148,7 @@ HISTORY_MSG_16;Čierna svietivosti HISTORY_MSG_17;Kompresia najvyšších svetiel v oblasti svietivosti HISTORY_MSG_18;Kompresia tieňov v oblasti svietivosti HISTORY_MSG_19;Krivka svietivosti -HISTORY_MSG_1;Fotka načítaná +HISTORY_MSG_2;Profil načítaný HISTORY_MSG_20;Doostrenie HISTORY_MSG_21;Polomer doostrenia HISTORY_MSG_22;Množstvo doostrenia @@ -129,7 +159,7 @@ HISTORY_MSG_26;Tolerancia okrajov pri doostrení HISTORY_MSG_27;Kontrola svätožiary pri doostrení HISTORY_MSG_28;Množstvo kontroly svätožiary HISTORY_MSG_29;Doostrovacia metóda -HISTORY_MSG_2;Profil načítaný +HISTORY_MSG_3;Profil zmenený HISTORY_MSG_30;Polomer dekonvolúcie HISTORY_MSG_31;Množstvo dekonvolúcie HISTORY_MSG_32;Tlmenie dekonvolúcie @@ -140,7 +170,7 @@ HISTORY_MSG_36;Hranica sýtosti HISTORY_MSG_37;Zosilnenie farieb HISTORY_MSG_38;Metóda vyváženia bielej HISTORY_MSG_39;Farebná teplota -HISTORY_MSG_3;Profil zmenený +HISTORY_MSG_4;História prehliadania HISTORY_MSG_40;Nádych vyváženia bielej HISTORY_MSG_41;Farebný posun "A" HISTORY_MSG_42;Farebný posun "B" @@ -151,7 +181,7 @@ HISTORY_MSG_46;Farebné odšumenie HISTORY_MSG_47;Polomer farebného odšumenia HISTORY_MSG_48;Tolerancia okrajov farebného odšumenia HISTORY_MSG_49;Citlivosť na okraje pri farebnom odšumení -HISTORY_MSG_4;História prehliadania +HISTORY_MSG_5;Jas HISTORY_MSG_50;Nástroj Tiene/Najvyššie svetlá HISTORY_MSG_51;Zosilnenie najvyšších svetiel HISTORY_MSG_52;Zosilnenie tieňov @@ -162,7 +192,7 @@ HISTORY_MSG_56;Polomer Tiene/Najvyššie svetlá HISTORY_MSG_57;Hrubé otočenie HISTORY_MSG_58;Horizontálne preklápanie HISTORY_MSG_59;Vertikálne preklápanie -HISTORY_MSG_5;Jas +HISTORY_MSG_6;Kontrast HISTORY_MSG_60;Otočenie HISTORY_MSG_61;Otočenie HISTORY_MSG_62;Korekcia zakrivenia objektívu @@ -173,7 +203,7 @@ HISTORY_MSG_66;Obnova najvyšších svetiel HISTORY_MSG_67;Množstvo obnovy najvyšších svetiel HISTORY_MSG_68;Metóda obnovy najvyšších svetiel HISTORY_MSG_69;Pracovný farebný priestor -HISTORY_MSG_6;Kontrast +HISTORY_MSG_7;Čierna HISTORY_MSG_70;Výstupný farebný priestor HISTORY_MSG_71;Vstupný farebný priestor HISTORY_MSG_72;Korekcia vignetácie @@ -182,13 +212,22 @@ HISTORY_MSG_74;Zmeniť veľkosť - Rozmer HISTORY_MSG_75;Zmeniť veľkosť - Metóda HISTORY_MSG_76;Exif Metadáta HISTORY_MSG_77;IPTC Metadáta -HISTORY_MSG_78;Data specified for resize -HISTORY_MSG_79;Resize width -HISTORY_MSG_7;Čierna -HISTORY_MSG_80;Resize height -HISTORY_MSG_81;Resize enabled +HISTORY_MSG_78;Zadané údaje pre zmenu veľkosti +HISTORY_MSG_79;Zmena veľkosti podľa šírky HISTORY_MSG_8;Kompenzácia expozície +HISTORY_MSG_80;Zmena veľkosti podľa výšky +HISTORY_MSG_81;Zmena veľkosti povolená +HISTORY_MSG_82;Profil zmenený +HISTORY_MSG_83;Tiene/najvyšie svetlá vyskokej kvality +HISTORY_MSG_84;Náprava perspektívy +HISTORY_MSG_85;Koeficienty vlnky +HISTORY_MSG_86;Vyrovnávač vlnky +HISTORY_MSG_87;Impulzná redukcia šumu +HISTORY_MSG_89;Smerová pyramída HISTORY_MSG_9;Kompresia najvyšších svetiel +HISTORY_MSG_90;Svietivosť smerovej pyramídy +HISTORY_MSG_91;Farebnosť smerovej pyramídy +HISTORY_MSG_92;Gamma smerovej pyramídy HISTORY_NEWSNAPSHOT;Nový Snímok HISTORY_NEWSNAPSHOTAS;Ako... HISTORY_NEWSSDIALOGLABEL;Menovka snímku: @@ -252,31 +291,40 @@ IPTCPANEL_TITLE;Názov IPTCPANEL_TITLEHINT;Krátka referencia pre obrázok (Meno objektu). IPTCPANEL_TRANSREFERENCE;Referencia prenosu IPTCPANEL_TRANSREFERENCEHINT;Kód reprezentujúci miesto pôvodného prenosu (Pôvodná referencia prenosu). -MAIN_BUTTON_EXIT;Exit +MAIN_BUTTON_EXIT;Ukončiť +MAIN_BUTTON_FULLSCREEN;Celá obrazovka MAIN_BUTTON_PREFERENCES;Predvoľby -MAIN_BUTTON_QUEUE;Put to queue +MAIN_BUTTON_PUTTOQUEUE;Vložiť do radu +MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Pridať súčasný obrázok do radu na spracovanie Ctrl+Q +MAIN_BUTTON_QUEUE;Vložiť do radu MAIN_BUTTON_SAVE;Uložiť obrázok +MAIN_BUTTON_SAVE_TOOLTIP;Uložiť súčasný obrázok Ctrl+S MAIN_BUTTON_SAVEAS;Ako... MAIN_BUTTON_SENDTOEDITOR;Odoslať do editora -MAIN_FRAME_BATCHQUEUE;Batch Queue -MAIN_FRAME_FILEBROWSER;File Browser -MAIN_FRAME_PLACES;Places -MAIN_FRAME_PLACES_ADD;Add -MAIN_FRAME_PLACES_DEL;Del -MAIN_FRAME_RECENT;Recent Folders +MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Upraviť súčasný obrázok v externom editore Ctrl+E +MAIN_BUTTON_UNFULLSCREEN;Ukončiť zobrazenie na celú obrazovku +MAIN_FRAME_BATCHQUEUE;Dávkový rad +MAIN_FRAME_FILEBROWSER;Prehliadač súborov +MAIN_FRAME_PLACES;Miesta +MAIN_FRAME_PLACES_ADD;Pridať +MAIN_FRAME_PLACES_DEL;Odstrániť +MAIN_FRAME_RECENT;Nedávne priečinky MAIN_MSG_ALREADYEXISTS;Súbor už existuje. MAIN_MSG_CANNOTLOAD;Nemôžem načítať obrázok MAIN_MSG_CANNOTSAVE;Chyba pri ukladaní súboru MAIN_MSG_CANNOTSTARTEDITOR;Nebolo možné spustiť editor. MAIN_MSG_CANNOTSTARTEDITOR_SECONDARY;Prosím, nastavte správnu cestu v dialógu "Predvoľby". +MAIN_MSG_ERRORDURINGIMAGESAVING;Chyba pri ukladaní obrázka MAIN_MSG_EXITJOBSINQUEUEINFO;Nespracované obrázky v rade budú pri ukončení programu stratené. MAIN_MSG_EXITJOBSINQUEUEQUEST;Ste si istí, že chcete ukončiť program? V rade sú nespracované obrázky. MAIN_MSG_JOBSINQUEUE;Úlohy v rade +MAIN_MSG_NAVIGATOR;Navigátor +MAIN_MSG_PLACES;Miesta MAIN_MSG_QOVERWRITE;Chcete ho prepísať? MAIN_TAB_BASIC;Základné MAIN_TAB_COLOR;Farba MAIN_TAB_DETAIL;Detail -MAIN_TAB_DEVELOP;Develop +MAIN_TAB_DEVELOP;Vyvinúť MAIN_TAB_EXIF;Exif MAIN_TAB_EXPOSURE;Expozícia MAIN_TAB_FILTER;Filter @@ -285,6 +333,7 @@ MAIN_TAB_IPTC;IPTC MAIN_TAB_METADATA;Metadáta MAIN_TAB_TAGGING;Tagging MAIN_TAB_TRANSFORM;Transformácie +MAIN_TOGGLE_BEFORE_AFTER;B|A MAIN_TOOLTIP_HIDEFP;Zobraziť/ukázať panel tlačidiel (prehliadač adresárov a súborov, shortcut key: F) MAIN_TOOLTIP_HIDEHP;Zobraziť/ukázať ľavý panel (vrátane histórie, shortcut key: H) MAIN_TOOLTIP_INDCLIPPEDH;Indikácia orezania najvyšších svetiel @@ -293,6 +342,20 @@ MAIN_TOOLTIP_PREFERENCES;Nastaviť predvoľby MAIN_TOOLTIP_QINFO;Rýchle informácie o obrázku MAIN_TOOLTIP_SAVE;Uložiť obrázok do predvoleného adresára MAIN_TOOLTIP_SAVEAS;Uložiť obrázok do vybraného adresára +MAIN_TOOLTIP_TOGGLE;Prepnúť pohľad predtým/potom B +NAVIGATOR_B_NA;B = n/a +NAVIGATOR_B_VALUE;B = %1 +NAVIGATOR_G_NA;G = n/a +NAVIGATOR_G_VALUE;G = %1 +NAVIGATOR_H_NA;H = n/a +NAVIGATOR_H_VALUE;H = %1 +NAVIGATOR_R_NA;R = n/a +NAVIGATOR_R_VALUE;R = %1 +NAVIGATOR_S_NA;S = n/a +NAVIGATOR_S_VALUE;S = %1 +NAVIGATOR_V_NA;V = n/a +NAVIGATOR_V_VALUE;V = %1 +NAVIGATOR_XY_NA;x = n/a, y = n/a PARTIALPASTE_BASICGROUP;Základné nastavenia PARTIALPASTE_CACORRECTION;Korekcia C/A PARTIALPASTE_COARSETRANS;90° otočenie/preklopenie @@ -310,6 +373,7 @@ PARTIALPASTE_EXPOSURE;Expozícia PARTIALPASTE_HLRECOVERY;Obnova najvyšších svetiel PARTIALPASTE_ICMSETTINGS;Nastavenia ICM PARTIALPASTE_IPTCINFO;IPTC informácie +PARTIALPASTE_LABCURVE;Krivka svietivosti PARTIALPASTE_LENSGROUP;Nastavenia súvisiace s objektívom PARTIALPASTE_LUMACURVE;Krivka svietivosti PARTIALPASTE_LUMADENOISE;Redukcia šumu v oblasti svietivosti @@ -321,8 +385,12 @@ PARTIALPASTE_SHADOWSHIGHLIGHTS;Tiene/Najvyššie svetlá PARTIALPASTE_SHARPENING;Doostrenie PARTIALPASTE_VIGNETTING;Korekcia vignetácie PARTIALPASTE_WHITEBALANCE;Vyváženie bielej +PREFERENCES_ADD;Pridať PREFERENCES_APPLNEXTSTARTUP;Aplikovaný pri ďalšom spustení +PREFERENCES_BATCH_PROCESSING;dávkové spracovanie +PREFERENCES_BEHAVIOR;Správanie sa PREFERENCES_BLINKCLIPPED;Blikať orezanými miestami +PREFERENCES_CACORRECTION;Použiť automatickú úpravu CA PREFERENCES_CACHECLEARALL;Vyčistiť všetko PREFERENCES_CACHECLEARPROFILES;Vyčistiť profily PREFERENCES_CACHECLEARTHUMBS;Vyčistiť zmenšeniny @@ -330,9 +398,9 @@ PREFERENCES_CACHEFORMAT1;Vlastné (rýchlejšie a kvalitnejšie) PREFERENCES_CACHEFORMAT2;JPEG (menšia veľkosť na disku) PREFERENCES_CACHEMAXENTRIES;Maximálny počet vstupov v cache PREFERENCES_CACHEOPTS;Možnosti cache +PREFERENCES_CACHESTRAT;Stratégia použitia cache PREFERENCES_CACHESTRAT1;Uprednostniť rýchlosť pred malou spotrebou pamäte PREFERENCES_CACHESTRAT2;Uprednostniť malú spotrebu pamäte pred rýchlosťou -PREFERENCES_CACHESTRAT;Stratégia použitia cache PREFERENCES_CACHETHUMBFORM;Formát zmenšenín pre cache PREFERENCES_CACHETHUMBHEIGHT;Maximálna výška zmenšenín PREFERENCES_CLEARDLG_LINE1;Čistím cache @@ -342,6 +410,8 @@ PREFERENCES_CLIPPINGIND;Indikácia orezu PREFERENCES_CMETRICINTENT;Kolorimetrický zámer PREFERENCES_DATEFORMAT;Formát dátumu PREFERENCES_DATEFORMATHINT;Môžete použiť nasledujúce formátovacie reťazce:\n%y : rok\n%m : mesiac\n%d : deň\n\nNapríklad, slovenský formát je:\n%d.%m.%y +PREFERENCES_DCBENHANCE;Použiť vylepšovací krok DCB +PREFERENCES_DCBITERATIONS;Počet iterácií DCB PREFERENCES_DEFAULTLANG;Predvolený jazyk PREFERENCES_DEFAULTTHEME;Predvolený vzhľad PREFERENCES_DEMOSAICINGALGO;Demozaikovací algoritmus @@ -351,7 +421,9 @@ PREFERENCES_DIROTHER;Iný PREFERENCES_DIRSELECTDLG;Vybrať adresár s obrázkami pri spustení... PREFERENCES_DIRSOFTWARE;Inštalačný adresár PREFERENCES_DMETHOD;Metóda +PREFERENCES_DMETHODBATCH;Dávka PREFERENCES_EDITORCMDLINE;Iný príkazový riadok +PREFERENCES_EDITORLAYOUT;Rozloženie editora PREFERENCES_EXTERNALEDITOR;Externý editor PREFERENCES_FALSECOLOR;Kroky potlačenia chybných farieb PREFERENCES_FBROWSEROPTS;Voľby prehliadača súborov @@ -359,23 +431,28 @@ PREFERENCES_FILEFORMAT;Formát súborov PREFERENCES_FORIMAGE;Pre obrazové súbory PREFERENCES_FORRAW;Pre RAW súbory PREFERENCES_GIMPPATH;Inštalačný adresár GIMPu +PREFERENCES_GREENEQUIL;Vyvažovanie zelenej PREFERENCES_GTKTHEME;GTK predvolený PREFERENCES_HINT;Tip PREFERENCES_HLTHRESHOLD;Prah pre orezanie najvyšších svetiel +PREFERENCES_HOTDEADPIXFILT;Použiť filter na horúce/mŕtve pixely PREFERENCES_ICCDIR;Adresár s ICC profilmy PREFERENCES_IMPROCPARAMS;Predvolené parametre spracovania obrazu PREFERENCES_INTENT_ABSOLUTE;Absolútny kolorimetrický PREFERENCES_INTENT_PERCEPTUAL;Vnímaný PREFERENCES_INTENT_RELATIVE;Relatívny kolorimetrický PREFERENCES_INTENT_SATURATION;Sýtosť +PREFERENCES_LINEDENOISE;Filter šumu vedenia PREFERENCES_LIVETHUMBNAILS;Živé zmenšeniny (pomalšie) PREFERENCES_MONITORICC;Profil monitora +PREFERENCES_MULTITAB;Režim viacerých kariet PREFERENCES_OUTDIR;Výstupný adresár PREFERENCES_OUTDIRFOLDER;Uložiť do adresára PREFERENCES_OUTDIRFOLDERHINT;Uložiť obrázky do vybraného adresára PREFERENCES_OUTDIRHINT;Môžete použiť nasledujúce formátovacie reťazce:\n%f, %d1, %d2, ..., %p1, %p2, ...\n\nTieto formátovacie reťazce odkazujú na adresáre a časti cesty k raw súboru.\n\nNapríklad, ak bol /home/tom/image/02-09-2006/dsc0012.nefotvorený, význam formátovacích reťazcov je:\n%f=dsc0012, %d1=02-09-2006, %d2=image, ...\n%p1=/home/tom/image/02-09-2006, %p2=/home/tom/image, p3=/home/tom, ...\n\nAk chcete uložiť výstupný obraz tam, kde je originál, napíšte:\n%p1/%f\n\nAk chcete uložiť výstupný obraz v adresári 'converted' nachádzajúcom sa v adresári s originálom, napíšte:\n%p1/converted/%f\n\nAk chcete uložiť výstupný obraz v adresári '/home/tom/converted' pri zachovaní toho istého podadresára s dátumami, napíšte:\n%p2/converted/%d1/%f PREFERENCES_OUTDIRTEMPLATE;Použiť šablónu PREFERENCES_OUTDIRTEMPLATEHINT;Môžete použiť nasledujúce formátovacie reťazce:\n%f, %d1, %d2, ..., %p1, %p2, ...\n\nTieto formátovacie reťazce odkazujú na adresáre a časti cesty k raw súboru.\n\nNapríklad, ak bol /home/tom/image/02-09-2006/dsc0012.nefotvorený, význam formátovacích reťazcov je:\n%f=dsc0012, %d1=02-09-2006, %d2=image, ...\n%p1=/home/tom/image/02-09-2006, %p2=/home/tom/image, p3=/home/tom, ...\n\nIf you want to save the output image where the original is, write:\n%p1/%f\n\nIf you want to save the output image in a directory 'converted' located the directory of the original, write:\n%p1/converted/%f\n\nAk chcete uložiť výstupný obraz tam, kde je originál, napíšte:\n%p1/%f\n\nAk chcete uložiť výstupný obraz v adresári 'converted' nachádzajúcom sa v adresári s originálom, napíšte:\n%p1/converted/%f\n\nAk chcete uložiť výstupný obraz v adresári '/home/tom/converted' pri zachovaní toho istého podadresára s dátumami, napíšte:\n%p2/converted/%d1/%f +PREFERENCES_OVERLAY_FILENAMES;Prekryť mená súborov cez zmenšeniny PREFERENCES_PARSEDEXT;Spracúvané prípony PREFERENCES_PARSEDEXTADD;Pridať príponu PREFERENCES_PARSEDEXTADDHINT;Napíšte príponu a stlačte tento gombík pre pripojenie k zoznamu @@ -386,15 +463,19 @@ PREFERENCES_PROFILEPRCACHE;Profil v cache PREFERENCES_PROFILEPRFILE;Profil pri vstupnom súbore PREFERENCES_PROFILESAVECACHE;Uložiť parametre spracovania do cache PREFERENCES_PROFILESAVEINPUT;Uložiť parametre spracovania k vstupnému súboru +PREFERENCES_PROPERTY;Vlastnosť PREFERENCES_PSPATH;Inštalačný adresár Adobe Photoshop +PREFERENCES_SELECTFONT;Vybrať písmo PREFERENCES_SELECTICCDIRDLG;Vybrať adresár s ICC profilmi... PREFERENCES_SELECTLANG;Vybrať si jazyk PREFERENCES_SELECTMONITORPROFDLG;Vybrať ICC profil monitora... PREFERENCES_SELECTTHEME;Vybrať vzhľad +PREFERENCES_SET;Nastaviť PREFERENCES_SHOWBASICEXIF;Zobrazovať základné EXIF informácie PREFERENCES_SHOWDATETIME;Ukázovať dátum a čas PREFERENCES_SHOWONLYRAW;Ukazovať len RAW súbory PREFERENCES_SHTHRESHOLD;Prah pre orezané tiene +PREFERENCES_SINGLETAB;Režim jednej karty PREFERENCES_STARTUPIMDIR;Adresár s obrázkami pri spustení PREFERENCES_TAB_BROWSER;Prehliadač súborov PREFERENCES_TAB_COLORMGR;Správa farieb @@ -402,6 +483,8 @@ PREFERENCES_TAB_GENERAL;Všeobecné PREFERENCES_TAB_IMPROC;Spracovanie obrazu PREFERENCES_TAB_OUTPUT;Výstupné možnosti PREFERENCES_THUMBSIZE;Veľkosť zmenšeniny +PREFERENCES_USESYSTEMTHEME; Použiť systémový vzhľad +PREFERENCES_WORKFLOW;Tok práce PROFILEPANEL_FILEDLGFILTERANY;Všetky súbory PROFILEPANEL_FILEDLGFILTERPP;Profily spracovania PROFILEPANEL_LABEL;Profily spracovania @@ -429,11 +512,13 @@ PROGRESSBAR_SAVEPNG;Ukladám PNG súbor... PROGRESSBAR_SAVETIFF;Ukladám TIFF súbor... PROGRESSDLG_LOADING;Načítava sa súbor... PROGRESSDLG_PROCESSING;Spracúva sa obrázok... +PROGRESSDLG_PROFILECHANGEDINBROWSER;Profil zmenený v prehliadači PROGRESSDLG_SAVING;Ukladá sa súbor... QINFO_FOCALLENGTH;Ohnisková vzdialenosť QINFO_ISO;ISO QINFO_LENS;Objektív QINFO_NOEXIF;Exif údaje sú nedostupné. +SAVEDLG_AUTOSUFFIX;Automaticky pridať príponu, ak už súbor existuje SAVEDLG_FILEFORMAT;Formát súboru SAVEDLG_JPEGQUAL;JPEG Kvalita SAVEDLG_JPGFILTER;JPEG súbory @@ -445,6 +530,7 @@ SAVEDLG_PUTTOQUEUETAIL;Presunúť na koniec radu na spracovanie SAVEDLG_SAVEIMMEDIATELY;Uložiť okamžite SAVEDLG_SAVESPP;Uložiť parametre spracovania s obrázkom SAVEDLG_TIFFFILTER;TIFF súbory +SAVEDLG_TIFFUNCOMPRESSED;Nekomprimovaný TIFF TOOLBAR_TOOLTIP_CROP;Orezanie výberu (shortcut key: C) TOOLBAR_TOOLTIP_HAND;Nástroj ruka (shortcut key: N) TOOLBAR_TOOLTIP_STRAIGHTEN;Výber rovnej čiary (shortcut key: S) @@ -461,10 +547,10 @@ TP_COARSETRAF_TOOLTIP_HFLIP;Prevrátiť horizontálne TP_COARSETRAF_TOOLTIP_ROTLEFT;Otočiť doľava TP_COARSETRAF_TOOLTIP_ROTRIGHT;Otočiť doprava TP_COARSETRAF_TOOLTIP_VFLIP;Prevrátiť vertikálne -TP_COLORBOOST_ACHANNEL;kanál "a" +TP_COLORBOOST_ACHANNEL;Kanál "a" TP_COLORBOOST_AMOUNT;Množstvo TP_COLORBOOST_AVOIDCOLORCLIP;Vyhnúť sa orezaniu farieb -TP_COLORBOOST_BCHANNEL;kanál "b" +TP_COLORBOOST_BCHANNEL;Kanál "b" TP_COLORBOOST_CHAB;a & b TP_COLORBOOST_CHANNEL;Kanál TP_COLORBOOST_CHSEPARATE;oddelené @@ -494,8 +580,26 @@ TP_CROP_SELECTCROP; Vyberte Orez TP_CROP_W;Š TP_CROP_X;x TP_CROP_Y;y +TP_DETAIL_AMOUNT;Množstvo +TP_DIRPYRDENOISE_CHROMA;Farebnosť +TP_DIRPYRDENOISE_GAMMA;Gamma +TP_DIRPYRDENOISE_LABEL;Redukcia šumu pomocou smerovej pyramídy +TP_DIRPYRDENOISE_LUMA;Svietivosť +TP_DIRPYREQUALIZER_LABEL;Vyrovnávač smerovej pyramídy +TP_DIRPYREQUALIZER_LUMACOARSEST;Najhrubšie +TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Kontrast- +TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;Kontrast+ +TP_DIRPYREQUALIZER_LUMAFINEST;Najjemnejšie +TP_DIRPYREQUALIZER_LUMANEUTRAL;Neutrálne +TP_DIRPYREQUALIZER_THRESHOLD;Threshold TP_DISTORTION_AMOUNT;Množstvo TP_DISTORTION_LABEL;Zakrivenie +TP_EQUALIZER_CONTRAST_MINUS;Kontrast- +TP_EQUALIZER_CONTRAST_PLUS;Kontrast+ +TP_EQUALIZER_FINEST;najjemnejšie +TP_EQUALIZER_LABEL;Vyrovnávač vlnky +TP_EQUALIZER_LARGEST;najhrubšie +TP_EQUALIZER_NEUTRAL;Neutrálne TP_EXPOSURE_AUTOLEVELS;Auto úrovne TP_EXPOSURE_BLACKLEVEL;Čierna TP_EXPOSURE_BRIGHTNESS;Jas @@ -525,6 +629,16 @@ TP_ICM_OUTPUTDLGLABEL;Vybrať výstupný ICC profil... TP_ICM_OUTPUTPROFILE;Výstupný profil TP_ICM_SAVEREFERENCE;Uložiť referenčný obrázok pre tvorbu profilu TP_ICM_WORKINGPROFILE;Pracovný profil +TP_IMPULSEDENOISE_LABEL;Impulzná redukcia šumu +TP_IMPULSEDENOISE_THRESH;Prah +TP_LABCURVE_BRIGHTNESS;Jas +TP_LABCURVE_CONTRAST;Kontrast +TP_LABCURVE_CURVEEDITOR;Krivka svietivosti +TP_LABCURVE_LABEL;Krivka svietivosti +TP_LABCURVE_SATURATION;Sýtosť +TP_LENSGEOM_AUTOCROP;Automatické orezanie +TP_LENSGEOM_FILL;Automatické vyplnenie +TP_LENSGEOM_LABEL;Objektív/Geometria TP_LUMACURVE_BLACKLEVEL;Čierna TP_LUMACURVE_BRIGHTNESS;Jas TP_LUMACURVE_COMPRHIGHLIGHTS;Kompresia najvyšších svetiel @@ -535,17 +649,25 @@ TP_LUMACURVE_LABEL;Krivka svietivosti TP_LUMADENOISE_EDGETOLERANCE;Tolerancia okrajov TP_LUMADENOISE_LABEL;Redukcia šumu v oblasti svietivosti TP_LUMADENOISE_RADIUS;Polomer +TP_PERSPECTIVE_HORIZONTAL;Horizontálne +TP_PERSPECTIVE_LABEL;Perspektíva +TP_PERSPECTIVE_VERTICAL;Vertikálne TP_RESIZE_BICUBIC;Bikubická TP_RESIZE_BICUBICSF;Bikubická (Mäkšia) TP_RESIZE_BICUBICSH;Bikubická (Ostrejšia) TP_RESIZE_BILINEAR;Bilineárna +TP_RESIZE_DOWNSCALEB;Downscale (Lepšie) +TP_RESIZE_DOWNSCALEF;Downscale (Rýchlejšie) TP_RESIZE_FULLSIZE;Celá veľkosť obrázka: TP_RESIZE_H;V: +TP_RESIZE_HEIGHT;Výška TP_RESIZE_LABEL;Zmeniť veľkosť TP_RESIZE_METHOD;Metóda: TP_RESIZE_NEAREST;Najbližšie -TP_RESIZE_SCALE;Rozmer +TP_RESIZE_SCALE;Pomer +TP_RESIZE_SPECIFY;Zadať: TP_RESIZE_W;Š: +TP_RESIZE_WIDTH;Šírka TP_ROTATE_AUTOCROP;Automatické orezanie TP_ROTATE_DEGREE;Stupeň TP_ROTATE_FILL;Výplň @@ -592,114 +714,9 @@ ZOOMBAR_NORMAL;Normálny ZOOMBAR_PREVIEW;Náhľad ZOOMBAR_SCALE;Rozmer ZOOMBAR_SMALL;Malý - - -!!!!!!!!!!!!!!!!!!!!!!!!! -! Untranslated keys follow; remove the ! prefix after an entry is translated. -!!!!!!!!!!!!!!!!!!!!!!!!! - - -!BATCHQUEUE_AUTOSTART;Auto start -!BATCH_PROCESSING;batch processing -!CURVEEDITOR_CUSTOM;Custom -!CURVEEDITOR_DARKS;Darks -!CURVEEDITOR_HIGHLIGHTS;Highlights -!CURVEEDITOR_LIGHTS;Lights -!CURVEEDITOR_NURBS;Control cage -!CURVEEDITOR_PARAMETRIC;Parametric -!CURVEEDITOR_SHADOWS;Shadows -!CURVEEDITOR_TYPE;Type: -!EXIFFILTER_METADATAFILTER;Enable Metadata Filters -!FILEBROWSER_ADDDELTEMPLATE;Add/Del templates... -!FILEBROWSER_CURRENT_NAME;Current name: -!FILEBROWSER_NEW_NAME;New name: -!FILEBROWSER_SHOWEXIFINFO;Show EXIF info i -!FILEBROWSER_TOOLTIP_STOPPROCESSING;Start processing automatically when a new job arrives -!FILEBROWSER_USETEMPLATE;Use template: -!GENERAL_AFTER;After -!GENERAL_BEFORE;Before -!GENERAL_HIGH_QUALITY;High Quality -!GENERAL_UNCHANGED;(Unchanged) -!HISTOGRAM_BUTTON_B;B -!HISTOGRAM_BUTTON_G;G -!HISTOGRAM_BUTTON_L;L -!HISTOGRAM_BUTTON_R;R -!HISTORY_MSG_82;Profile Changed -!HISTORY_MSG_83;High quality shadows/highlights -!HISTORY_MSG_84;Perspective correction -!HISTORY_MSG_85;Wavelet coefficients -!HISTORY_MSG_86;Wavelet equalizer -!HISTORY_MSG_87;Impulse noise reduction -!HISTORY_MSG_89;Directional pyramid -!HISTORY_MSG_90;Directional pyramid luminance -!HISTORY_MSG_91;Directional pyramid chominance -!HISTORY_MSG_92;Directional pyramid gamma -!MAIN_BUTTON_FULLSCREEN;Fullscreen -!MAIN_BUTTON_PUTTOQUEUE;Put to queue -!MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Add current image to processing queue Ctrl+Q -!MAIN_BUTTON_SAVE_TOOLTIP;Save current image Ctrl+S -!MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Edit current image in external editor Ctrl+E -!MAIN_BUTTON_UNFULLSCREEN;Exit fullscreen -!MAIN_MSG_ERRORDURINGIMAGESAVING;Error during image saving -!MAIN_MSG_NAVIGATOR;Navigator -!MAIN_MSG_PLACES;Places -!MAIN_TOGGLE_BEFORE_AFTER;B|A -!MAIN_TOOLTIP_TOGGLE;Toggle before/after view B -!NAVIGATOR_B_NA;B = n/a -!NAVIGATOR_B_VALUE;B = %1 -!NAVIGATOR_G_NA;G = n/a -!NAVIGATOR_G_VALUE;G = %1 -!NAVIGATOR_H_NA;H = n/a -!NAVIGATOR_H_VALUE;H = %1 -!NAVIGATOR_R_NA;R = n/a -!NAVIGATOR_R_VALUE;R = %1 -!NAVIGATOR_S_NA;S = n/a -!NAVIGATOR_S_VALUE;S = %1 -!NAVIGATOR_V_NA;V = n/a -!NAVIGATOR_V_VALUE;V = %1 -!NAVIGATOR_XY_NA;x = n/a, y = n/a -!PREFERENCES_ADD;ADD -!PREFERENCES_BATCH_PROCESSING;batch processing -!PREFERENCES_BEHAVIOR;Behavior -!PREFERENCES_CACORRECTION;Apply CA auto correction -!PREFERENCES_DCBENHANCE;Apply DCB enhancement step -!PREFERENCES_DCBITERATIONS;Number of DCB iterations -!PREFERENCES_GREENEQUIL;Green equilibration -!PREFERENCES_HOTDEADPIXFILT;Apply hot/dead pixel filter -!PREFERENCES_LINEDENOISE;Line noise filter -!PREFERENCES_OVERLAY_FILENAMES;Overlay filenames on thumbnails -!PREFERENCES_PROPERTY;Property -!PREFERENCES_SET;SET -!PROGRESSDLG_PROFILECHANGEDINBROWSER;Profile changed in browser -!SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists -!SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF -!TP_DETAIL_AMOUNT;Amount -!TP_DIRPYRDENOISE_CHROMA;Chrominance -!TP_DIRPYRDENOISE_GAMMA;Gamma -!TP_DIRPYRDENOISE_LABEL;Directional Pyramid Noise Reduction -!TP_DIRPYRDENOISE_LUMA;Luminance -!TP_EQUALIZER_CONTRAST_MINUS;Contrast- -!TP_EQUALIZER_CONTRAST_PLUS;Contrast+ -!TP_EQUALIZER_FINEST;finest -!TP_EQUALIZER_LABEL;Wavelet equalizer -!TP_EQUALIZER_LARGEST;coarsest -!TP_EQUALIZER_NEUTRAL;Neutral -!TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction -!TP_IMPULSEDENOISE_THRESH;Threshold -!TP_LENSGEOM_AUTOCROP;Auto Crop -!TP_LENSGEOM_FILL;Auto Fill -!TP_LENSGEOM_LABEL;Lens / Geometry -!TP_PERSPECTIVE_HORIZONTAL;Horizontal -!TP_PERSPECTIVE_LABEL;Perspective -!TP_PERSPECTIVE_VERTICAL;Vertical -!TP_RESIZE_DOWNSCALEB;Downscale (Better) -!TP_RESIZE_DOWNSCALEF;Downscale (Faster) -!TP_RESIZE_HEIGHT;Height -!TP_RESIZE_SPECIFY;Specify: -!TP_RESIZE_WIDTH;Width -!ZOOMPANEL_100;(100%) -!ZOOMPANEL_NEWCROPWINDOW;Open (new) detail window -!ZOOMPANEL_ZOOM100;Zoom to 100% 1 -!ZOOMPANEL_ZOOMFITSCREEN;Fit to screen F -!ZOOMPANEL_ZOOMIN;Zoom In + -!ZOOMPANEL_ZOOMOUT;Zoom Out - +ZOOMPANEL_100;(100%) +ZOOMPANEL_NEWCROPWINDOW;Otvoriť (nové) okno s detailom +ZOOMPANEL_ZOOM100;Priblíženie na 100% 1 +ZOOMPANEL_ZOOMFITSCREEN;Prispôsobiť obrazovke F +ZOOMPANEL_ZOOMIN;Priblížiť + +ZOOMPANEL_ZOOMOUT;Oddialiť - diff --git a/rtdata/languages/Suomi b/rtdata/languages/Suomi index 914592b0b..86bbe46e1 100644 --- a/rtdata/languages/Suomi +++ b/rtdata/languages/Suomi @@ -600,7 +600,7 @@ ZOOMBAR_SMALL;Pieni !BATCHQUEUE_AUTOSTART;Auto start -!BATCH_PROCESSING;batch processing +!BATCH_PROCESSING;Batch processing !CURVEEDITOR_CUSTOM;Custom !CURVEEDITOR_DARKS;Darks !CURVEEDITOR_HIGHLIGHTS;Highlights @@ -651,6 +651,12 @@ ZOOMBAR_SMALL;Pieni !NAVIGATOR_G_VALUE;G = %1 !NAVIGATOR_H_NA;H = n/a !NAVIGATOR_H_VALUE;H = %1 +!NAVIGATOR_LAB_A_NA;A = n/a +!NAVIGATOR_LAB_A_VALUE;A = %1 +!NAVIGATOR_LAB_B_NA;B = n/a +!NAVIGATOR_LAB_B_VALUE;B = %1 +!NAVIGATOR_LAB_L_NA;L = n/a +!NAVIGATOR_LAB_L_VALUE;L = %1 !NAVIGATOR_R_NA;R = n/a !NAVIGATOR_R_VALUE;R = %1 !NAVIGATOR_S_NA;S = n/a @@ -658,25 +664,41 @@ ZOOMBAR_SMALL;Pieni !NAVIGATOR_V_NA;V = n/a !NAVIGATOR_V_VALUE;V = %1 !NAVIGATOR_XY_NA;x = n/a, y = n/a +!PARTIALPASTE_LABCURVE;Lab curve +!PARTIALPASTE_LABCURVE;Luminance curve !PREFERENCES_ADD;ADD !PREFERENCES_BATCH_PROCESSING;batch processing !PREFERENCES_BEHAVIOR;Behavior !PREFERENCES_CACORRECTION;Apply CA auto correction !PREFERENCES_DCBENHANCE;Apply DCB enhancement step !PREFERENCES_DCBITERATIONS;Number of DCB iterations +!PREFERENCES_DMETHODBATCH;Batch +!PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_GREENEQUIL;Green equilibration !PREFERENCES_HOTDEADPIXFILT;Apply hot/dead pixel filter !PREFERENCES_LINEDENOISE;Line noise filter +!PREFERENCES_MULTITAB;Multiple tabs mode !PREFERENCES_OVERLAY_FILENAMES;Overlay filenames on thumbnails !PREFERENCES_PROPERTY;Property +!PREFERENCES_SELECTFONT;Select font !PREFERENCES_SET;SET +!PREFERENCES_SINGLETAB;Single tab mode +!PREFERENCES_USESYSTEMTHEME; Use System Theme +!PREFERENCES_WORKFLOW;Workflow !PROGRESSDLG_PROFILECHANGEDINBROWSER;Profile changed in browser !SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists !TP_DETAIL_AMOUNT;Amount !TP_DIRPYRDENOISE_CHROMA;Chrominance !TP_DIRPYRDENOISE_GAMMA;Gamma -!TP_DIRPYRDENOISE_LABEL;Directional Pyramid Noise Reduction +!TP_DIRPYRDENOISE_LABEL;Directional pyramid noise reduction !TP_DIRPYRDENOISE_LUMA;Luminance +!TP_DIRPYREQUALIZER_LABEL;Directional pyramid equalizer +!TP_DIRPYREQUALIZER_LUMACOARSEST;Coarsest +!TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Contrast- +!TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;Contrast+ +!TP_DIRPYREQUALIZER_LUMAFINEST;Finest +!TP_DIRPYREQUALIZER_LUMANEUTRAL;Neutral +!TP_DIRPYREQUALIZER_THRESHOLD;Threshold !TP_EQUALIZER_CONTRAST_MINUS;Contrast- !TP_EQUALIZER_CONTRAST_PLUS;Contrast+ !TP_EQUALIZER_FINEST;finest @@ -685,6 +707,11 @@ ZOOMBAR_SMALL;Pieni !TP_EQUALIZER_NEUTRAL;Neutral !TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction !TP_IMPULSEDENOISE_THRESH;Threshold +!TP_LABCURVE_BRIGHTNESS;Brightness +!TP_LABCURVE_CONTRAST;Contrast +!TP_LABCURVE_CURVEEDITOR;Luminance Curve +!TP_LABCURVE_LABEL;Lab Curves +!TP_LABCURVE_SATURATION;Saturation !TP_LENSGEOM_AUTOCROP;Auto Crop !TP_LENSGEOM_FILL;Auto Fill !TP_LENSGEOM_LABEL;Lens / Geometry diff --git a/rtdata/languages/Swedish b/rtdata/languages/Swedish index a40b41d80..770208395 100644 --- a/rtdata/languages/Swedish +++ b/rtdata/languages/Swedish @@ -2,110 +2,135 @@ #00 Swedish #01 Translated by Emil Ericsson #02 2008-01-22 +#03 2010-10-12, 2010-10-18, 2010-10-24 update by Johan Andersson ADJUSTER_RESET_TO_DEFAULT;Återställ till standard +BATCHQUEUE_AUTOSTART;Autostart +BATCH_PROCESSING;Batchbehandling +CURVEEDITOR_CUSTOM;Egen +CURVEEDITOR_DARKS;Svärta CURVEEDITOR_FILEDLGFILTERANY;Vilka filer som helst CURVEEDITOR_FILEDLGFILTERCURVE;Kurvfiler +CURVEEDITOR_HIGHLIGHTS;Högdagrar +CURVEEDITOR_LIGHTS;Högdagrar CURVEEDITOR_LINEAR;Linjär CURVEEDITOR_LOADDLGLABEL;Ladda kurva... +CURVEEDITOR_PARAMETRIC;Parametisk CURVEEDITOR_SAVEDLGLABEL;Spara kurva... +CURVEEDITOR_SHADOWS;Skuggor CURVEEDITOR_TOOLTIPLINEAR;Återställ kurva till linjär CURVEEDITOR_TOOLTIPLOAD;Ladda kurva från fil CURVEEDITOR_TOOLTIPSAVE;Spara nuvarande kurva -EXIFFILTER_APERTURE;Aperture -EXIFFILTER_CAMERA;Camera -EXIFFILTER_DIALOGLABEL;Exif Filter -EXIFFILTER_FOCALLEN;Focal Length +CURVEEDITOR_TYPE;Typ: +EXIFFILTER_APERTURE;Bländare +EXIFFILTER_CAMERA;Kamera +EXIFFILTER_DIALOGLABEL;EXIFfilter +EXIFFILTER_FOCALLEN;Brännvidd EXIFFILTER_ISO;ISO -EXIFFILTER_LENS;Lens -EXIFFILTER_SHUTTER;Shutter -EXIFPANEL_ADDEDIT;Add/Edit -EXIFPANEL_ADDEDITHINT;Add new tag or edit tag -EXIFPANEL_ADDTAGDLG_ENTERVALUE;Enter value -EXIFPANEL_ADDTAGDLG_SELECTTAG;Select tag -EXIFPANEL_ADDTAGDLG_TITLE;Add/Edit Tag -EXIFPANEL_KEEP;Keep -EXIFPANEL_KEEPHINT;Keep the selected tags when writing output file -EXIFPANEL_REMOVE;Remove -EXIFPANEL_REMOVEHINT;Remove the selected tags when writing output file -EXIFPANEL_RESET;Reset -EXIFPANEL_RESETALL;Reset All -EXIFPANEL_RESETALLHINT;Reset all tags to their original values -EXIFPANEL_RESETHINT;Reset the selected tags to their original values -EXIFPANEL_SUBDIRECTORY;Subdirectory -FILEBROWSER_APPLYPROFILE;Apply profile -FILEBROWSER_ARRANGEMENTHINT;Change between vertical/horizontal alignment of thumbnails -FILEBROWSER_CLEARPROFILE;Clear profile -FILEBROWSER_COPYPROFILE;Copy profile -FILEBROWSER_DELETEDLGLABEL;File delete confirmation -FILEBROWSER_DELETEDLGMSG;Are you sure you want to delete the selected %1 files? -FILEBROWSER_EMPTYTRASH;Empty Trash -FILEBROWSER_EMPTYTRASHHINT;Permanently delete the files of the trash -FILEBROWSER_EXIFFILTERAPPLY;Apply -FILEBROWSER_EXIFFILTERAPPLYHINT;Switch on/off exif filter of the file browser -FILEBROWSER_EXIFFILTERLABEL;Exif Filter -FILEBROWSER_EXIFFILTERSETTINGS;Setup -FILEBROWSER_EXIFFILTERSETTINGSHINT;Change settings of the exif filter -FILEBROWSER_PARTIALPASTEPROFILE;Partial paste -FILEBROWSER_PASTEPROFILE;Paste profile -FILEBROWSER_POPUPCANCELJOB;Cancel job -FILEBROWSER_POPUPMOVEEND;Move to end of queue -FILEBROWSER_POPUPMOVEHEAD;Move to head of queue -FILEBROWSER_POPUPOPEN;Open -FILEBROWSER_POPUPPROCESS;Put to processing queue -FILEBROWSER_POPUPRANK1;Rank 1 -FILEBROWSER_POPUPRANK2;Rank 2 -FILEBROWSER_POPUPRANK3;Rank 3 -FILEBROWSER_POPUPRANK4;Rank 4 -FILEBROWSER_POPUPRANK5;Rank 5 -FILEBROWSER_POPUPREMOVE;Remove from filesystem -FILEBROWSER_POPUPRENAME;Rename -FILEBROWSER_POPUPSELECTALL;Select all -FILEBROWSER_POPUPTRASH;Move to trash -FILEBROWSER_POPUPUNRANK;Unrank -FILEBROWSER_POPUPUNTRASH;Remove from trash -FILEBROWSER_PROCESSINGSETTINGS;Settings -FILEBROWSER_PROCESSINGSETTINGSHINT;Set the file format and output directory -FILEBROWSER_RENAMEDLGLABEL;Rename file -FILEBROWSER_RENAMEDLGMSG;Rename file "%1" to: -FILEBROWSER_SHOWDIRHINT;Show all images of the directory -FILEBROWSER_SHOWQUEUEHINT;Show content of the processing queue -FILEBROWSER_SHOWRANK1HINT;Show images ranked as 1 star -FILEBROWSER_SHOWRANK2HINT;Show images ranked as 2 star -FILEBROWSER_SHOWRANK3HINT;Show images ranked as 3 star -FILEBROWSER_SHOWRANK4HINT;Show images ranked as 4 star -FILEBROWSER_SHOWRANK5HINT;Show images ranked as 5 star -FILEBROWSER_SHOWTRASHHINT;Show content of the trash -FILEBROWSER_SHOWUNRANKHINT;Show unranked images -FILEBROWSER_STARTPROCESSING;Start Processing -FILEBROWSER_STARTPROCESSINGHINT;Start processing/saving of images in the queue -FILEBROWSER_STOPPROCESSING;Stop processing -FILEBROWSER_STOPPROCESSINGHINT;Stop processing of images -FILEBROWSER_THUMBSIZE;Thumb. size -FILEBROWSER_ZOOMINHINT;Increase thumbnail size -FILEBROWSER_ZOOMOUTHINT;Decrease thumbnail size +EXIFFILTER_LENS;Objektiv +EXIFFILTER_METADATAFILTER;Använd metadatafilter +EXIFFILTER_SHUTTER;Slutartid +EXIFPANEL_ADDEDIT;Lägg till/Redigera +EXIFPANEL_ADDEDITHINT;Lägg till en ny eller redigera en etikett +EXIFPANEL_ADDTAGDLG_ENTERVALUE;Ange värde +EXIFPANEL_ADDTAGDLG_SELECTTAG;Välj etikett +EXIFPANEL_ADDTAGDLG_TITLE;Lägg till/redigera etikett +EXIFPANEL_KEEP;Behåll +EXIFPANEL_KEEPHINT;Behåll de valda etiketterna vid spara +EXIFPANEL_REMOVE;Ta bort +EXIFPANEL_REMOVEHINT;Ta bort de valda etiketterna vid spara +EXIFPANEL_RESET;Återställ +EXIFPANEL_RESETALL;Återställ alla +EXIFPANEL_RESETALLHINT;Återställ alla etiketter till deras originalvärden +EXIFPANEL_RESETHINT;Återställ de valda etiketterna till deras originalvärden +EXIFPANEL_SUBDIRECTORY;Underkatalog +FILEBROWSER_ADDDELTEMPLATE;Lägg till/ta bort förinställningar... +FILEBROWSER_APPLYPROFILE;Använd profil +FILEBROWSER_ARRANGEMENTHINT;Växla mellan vertikal och horistonell visning av miniatyrbilder +FILEBROWSER_CLEARPROFILE;Återställ profilen +FILEBROWSER_COPYPROFILE;Kopiera profil +FILEBROWSER_CURRENT_NAME;Nuvarande namn: +FILEBROWSER_DELETEDLGLABEL;Bekräftelse vid borttag +FILEBROWSER_DELETEDLGMSG;Är du säker på att du vill ta bort de valda %1 filerna? +FILEBROWSER_EMPTYTRASH;Töm papperskorgen +FILEBROWSER_EMPTYTRASHHINT;Ta bort papperskorgens filer permanent +FILEBROWSER_EXIFFILTERAPPLY;Använd +FILEBROWSER_EXIFFILTERAPPLYHINT;Visa/dölj EXIF-filtret i filhanteraren +FILEBROWSER_EXIFFILTERLABEL;EXIF-filter +FILEBROWSER_EXIFFILTERSETTINGS;Inställningar +FILEBROWSER_EXIFFILTERSETTINGSHINT;Ändra inställningar för EXIF-filtret +FILEBROWSER_NEW_NAME;Nytt namn: +FILEBROWSER_PARTIALPASTEPROFILE;Klistra in partiell profil +FILEBROWSER_PASTEPROFILE;Klistra in profil +FILEBROWSER_POPUPCANCELJOB;Avbryt +FILEBROWSER_POPUPMOVEEND;Flytta till slutet av behandlingskön +FILEBROWSER_POPUPMOVEHEAD;Flytta till början av behandlingskön +FILEBROWSER_POPUPOPEN;Öppna +FILEBROWSER_POPUPPROCESS;Flytta till behandlingskön +FILEBROWSER_POPUPRANK1;Betyg 1 +FILEBROWSER_POPUPRANK2;Betyg 2 +FILEBROWSER_POPUPRANK3;Betyg 3 +FILEBROWSER_POPUPRANK4;Betyg 4 +FILEBROWSER_POPUPRANK5;Betyg 5 +FILEBROWSER_POPUPREMOVE;Ta bort från filsystemet +FILEBROWSER_POPUPRENAME;Byt namn +FILEBROWSER_POPUPSELECTALL;Markera allt +FILEBROWSER_POPUPTRASH;Flytta till papperskorgen +FILEBROWSER_POPUPUNRANK;Ta bort betyg +FILEBROWSER_POPUPUNTRASH;Ta bort från papperskorgen +FILEBROWSER_PROCESSINGSETTINGS;Inställningar +FILEBROWSER_PROCESSINGSETTINGSHINT;Ange filformat och målmapp +FILEBROWSER_RENAMEDLGLABEL;Byt namn +FILEBROWSER_RENAMEDLGMSG;Byt namn på "%1" till: +FILEBROWSER_SHOWDIRHINT;Visa alla bilder i biblioteket +FILEBROWSER_SHOWEXIFINFO;Visa EXIF-information +FILEBROWSER_SHOWQUEUEHINT;Visa innehållet i behandlingskön +FILEBROWSER_SHOWRANK1HINT;Visa bilder med betyg 1 +FILEBROWSER_SHOWRANK2HINT;Visa bilder med betyg 2 +FILEBROWSER_SHOWRANK3HINT;Visa bilder med betyg 3 +FILEBROWSER_SHOWRANK4HINT;Visa bilder med betyg 4 +FILEBROWSER_SHOWRANK5HINT;Visa bilder med betyg 5 +FILEBROWSER_SHOWTRASHHINT;Visa innehållet i papperskorgen +FILEBROWSER_SHOWUNRANKHINT;Visa icke-betygsatta bilder +FILEBROWSER_STARTPROCESSING;Börja behandlingen +FILEBROWSER_STARTPROCESSINGHINT;Börja behandlingen och spara bilderna i behandlingskön +FILEBROWSER_STOPPROCESSING;Avbryt behandlingen +FILEBROWSER_STOPPROCESSINGHINT;Avbryt behandlingen av bilderna +FILEBROWSER_THUMBSIZE;Miniatyrbildens storlek +FILEBROWSER_TOOLTIP_STOPPROCESSING;Påbörja behandling automatiskt när ett nytt objekt kommer in +FILEBROWSER_USETEMPLATE;Använd förinställning: +FILEBROWSER_ZOOMINHINT;Öka miniatyrbildernas storlek +FILEBROWSER_ZOOMOUTHINT;Minska miniatyrbildernas storlek GENERAL_ABOUT;Om +GENERAL_AFTER;Efter +GENERAL_BEFORE;Före GENERAL_CANCEL;Avbryt GENERAL_DISABLE;Avaktivera GENERAL_DISABLED;Avaktivera GENERAL_ENABLE;Verkställ GENERAL_ENABLED;Verkställ +GENERAL_HIGH_QUALITY;Hög kvalitet GENERAL_LANDSCAPE;Landskap GENERAL_LOAD;Ladda -GENERAL_NA;n/a +GENERAL_NA;Ej tillgänglig GENERAL_NO;Nej GENERAL_OK;Ok GENERAL_PORTRAIT;Porträtt GENERAL_SAVE;Spara +GENERAL_UNCHANGED;(Oförändrad) GENERAL_YES;Ja +HISTOGRAM_BUTTON_B;B +HISTOGRAM_BUTTON_G;G +HISTOGRAM_BUTTON_L;L +HISTOGRAM_BUTTON_R;R HISTOGRAM_LABEL;Histogram -HISTOGRAM_TOOLTIP_B;Visa/göm blått histogram -HISTOGRAM_TOOLTIP_G;Visa/göm grönt histogram -HISTOGRAM_TOOLTIP_L;Visa/göm CIELAB Luminans histogram -HISTOGRAM_TOOLTIP_R;Visa/göm rött histogram -HISTORY_CHANGED;Changed +HISTOGRAM_TOOLTIP_B;Visa/dölj blått histogram +HISTOGRAM_TOOLTIP_G;Visa/dölj grönt histogram +HISTOGRAM_TOOLTIP_L;Visa/dölj CIELAB Luminans histogram +HISTOGRAM_TOOLTIP_R;Visa/dölj rött histogram +HISTORY_CHANGED;Ändrad HISTORY_CUSTOMCURVE;Egen kurva HISTORY_DELSNAPSHOT;Ta bort bokmärke -HISTORY_FROMCLIPBOARD;From clipboard +HISTORY_FROMCLIPBOARD;Från klippbordet HISTORY_LABEL;Historia HISTORY_MSG_10;Skuggkomprimering HISTORY_MSG_11;Tonkurva @@ -114,10 +139,10 @@ HISTORY_MSG_13;Exponeringsmarkering HISTORY_MSG_14;Luminansljusstyrka HISTORY_MSG_15;Luminanskontrast HISTORY_MSG_16;Svart luminans -HISTORY_MSG_17;Luminans högdager kompr. -HISTORY_MSG_18;Luminans skugg kompr. +HISTORY_MSG_17;Luminans högdagerkompr. +HISTORY_MSG_18;Luminans skuggkompr. HISTORY_MSG_19;Luminanskurva -HISTORY_MSG_1;Foto laddat +HISTORY_MSG_1;Fotot laddades HISTORY_MSG_20;Skärpning HISTORY_MSG_21;Skärpningsradie HISTORY_MSG_22;Skärpningsmängd @@ -140,54 +165,59 @@ HISTORY_MSG_37;Färgförstärkning HISTORY_MSG_38;Vitbalansmetod HISTORY_MSG_39;Färgtemperatur HISTORY_MSG_3;Profil ändrad -HISTORY_MSG_40;Vitbalansnyans +HISTORY_MSG_40;Färgton HISTORY_MSG_41;Färgskiftning "A" HISTORY_MSG_42;Färgskiftning "B" HISTORY_MSG_43;Luminans brusborttagning -HISTORY_MSG_44;Lum. brusborttagnings-radie -HISTORY_MSG_45;Lum. brusborttagnings kanttolerans +HISTORY_MSG_44;Borttagningsradie för luminansbrusreducering +HISTORY_MSG_45;Kanttolerans för luminansbrusreducering HISTORY_MSG_46;Färgbrusborttagning -HISTORY_MSG_47;Färgbrusborttagnings-radie -HISTORY_MSG_48;Färgbrusborttagnings-kanttolerans -HISTORY_MSG_49;Kantkänslig färgbrusborttagning +HISTORY_MSG_47;Radie för färgbrusreducering +HISTORY_MSG_48;Kanttolerans för färgbrusreducering +HISTORY_MSG_49;Kantkänslighet för färgbrusreducering HISTORY_MSG_4;Historia-bläddrande -HISTORY_MSG_50;Skugg/högdager verktyg -HISTORY_MSG_51;Högdager-förstärkning +HISTORY_MSG_50;Skugg/högdagerverktyg +HISTORY_MSG_51;Högdagerförstärkning HISTORY_MSG_52;Skuggförstärkning -HISTORY_MSG_53;Högdager-tonvidd -HISTORY_MSG_54;Skugg-tonvidd +HISTORY_MSG_53;Högdagertonvidd +HISTORY_MSG_54;Skuggtonvidd HISTORY_MSG_55;Lokal kontrast -HISTORY_MSG_56;Skugg/högdager -radie +HISTORY_MSG_56;Skugg/högdagerradie HISTORY_MSG_57;Enkel rotation HISTORY_MSG_58;Vänd horisontellt HISTORY_MSG_59;Vänd vertikalt HISTORY_MSG_5;Ljusstyrka HISTORY_MSG_60;Rotation -HISTORY_MSG_61;Rotation -HISTORY_MSG_62;Objektivdistorsions-korrigering +HISTORY_MSG_61;Fyll automatiskt +HISTORY_MSG_62;Korrigering av objektivdistorsion HISTORY_MSG_63;Valt bokmärke HISTORY_MSG_64;Beskär foto -HISTORY_MSG_65;C/A korrigering -HISTORY_MSG_66;Högdager-förbättring -HISTORY_MSG_67;Högdager-förbättringsstorlek -HISTORY_MSG_68;Högdager-förbättringsmetod +HISTORY_MSG_65;Korrigera kromatiska abberationer +HISTORY_MSG_66;Högdagerförbättring +HISTORY_MSG_67;Mängd på högdagerförbättringen +HISTORY_MSG_68;Metod för högdagerförbättring HISTORY_MSG_69;Arbetsfärgrymd HISTORY_MSG_6;Kontrast HISTORY_MSG_70;Utmatningsfärgrymd HISTORY_MSG_71;Inmatningsfärgrymd -HISTORY_MSG_72;Vinjettering-korrigering +HISTORY_MSG_72;Korrigering av vinjettering HISTORY_MSG_73;Kanalmixer HISTORY_MSG_74;Ändra storleksskala -HISTORY_MSG_75;Ändra storleks metod -HISTORY_MSG_76;Exif Metadata +HISTORY_MSG_75;Ändra storleksmetod +HISTORY_MSG_76;EXIF Metadata HISTORY_MSG_77;IPTC Metadata -HISTORY_MSG_78;Data specified for resize -HISTORY_MSG_79;Resize width -HISTORY_MSG_7;Svart -HISTORY_MSG_80;Resize height -HISTORY_MSG_81;Resize enabled -HISTORY_MSG_8;Exponerings-komprimering -HISTORY_MSG_9;Högdager-komprimering +HISTORY_MSG_79;Storleksförändring, bredd +HISTORY_MSG_7;Svärta +HISTORY_MSG_80;Storleksförändring, höjd +HISTORY_MSG_81;Storleksförändring aktiverad +HISTORY_MSG_82;Profilen har ändrats +HISTORY_MSG_83;Högkvalitet Skuggor/högdager +HISTORY_MSG_84;Korrigering av perspektiv +HISTORY_MSG_85;Wavelet koefficienter +HISTORY_MSG_86;Wavelet equalizer +HISTORY_MSG_87;Brusreducering mha av stegsvar +HISTORY_MSG_8;Exponeringskomprimering +HISTORY_MSG_9;Högdagerkomprimering HISTORY_NEWSNAPSHOT;Nytt bokmärke HISTORY_NEWSNAPSHOTAS;Som... HISTORY_NEWSSDIALOGLABEL;Namn på bokmärket: @@ -197,7 +227,7 @@ HISTORY_SNAPSHOT;Bokmärke HISTORY_SNAPSHOTS;Bokmärken ICMPANEL_FILEDLGFILTERANY;Vilka filer som helst ICMPANEL_FILEDLGFILTERICM;ICC profilfiler -ICMPANEL_GAMMABEFOREINPUT;Profile applies Gamma +ICMPANEL_GAMMABEFOREINPUT;Profilapplicerad gamma ICMPANEL_INPUTCAMERA;Kameraval ICMPANEL_INPUTCUSTOM;Egen ICMPANEL_INPUTDLGLABEL;Välj inmatnings ICC-profil... @@ -206,251 +236,272 @@ ICMPANEL_INPUTPROFILE;Inmatningsprofil ICMPANEL_NOICM;Ingen ICM: sRGB-utmatning ICMPANEL_OUTPUTDLGLABEL;Välj utmatnings ICC-profil... ICMPANEL_OUTPUTPROFILE;Utmatningsprofil -ICMPANEL_SAVEREFERENCE;Save reference image for profiling +ICMPANEL_SAVEREFERENCE;Spara referensbild för profilering ICMPANEL_WORKINGPROFILE;Arbetsprofil IMAGEAREA_DETAILVIEW;Detalj -IPTCPANEL_AUTHOR;Author -IPTCPANEL_AUTHORHINT;Name of the creator of the object, e.g. writer, photographer or graphic artist (By-line). -IPTCPANEL_AUTHORSPOSITION;Author's position -IPTCPANEL_AUTHORSPOSITIONHINT;Title of the creator or creators of the object (By-line Title). -IPTCPANEL_CAPTION;Caption -IPTCPANEL_CAPTIONHINT;A textual description of the data (Caption - Abstract). -IPTCPANEL_CAPTIONWRITER;Caption Writer -IPTCPANEL_CAPTIONWRITERHINT;The name of the person involved in the writing, editing or correcting the image or caption/abstract (Writer - Editor). -IPTCPANEL_CATEGORY;Category -IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider (Category). -IPTCPANEL_CITY;City -IPTCPANEL_CITYHINT;City of image origin (City). -IPTCPANEL_COPYHINT;Copy IPTC settings to clipboard -IPTCPANEL_COPYRIGHT;Copyright -IPTCPANEL_COPYRIGHTHINT;Any necessary copyright notice (Copyright Notice). -IPTCPANEL_COUNTRY;Country -IPTCPANEL_COUNTRYHINT;The name of the country/primary location where the image was created (Country - Primary Location Name). -IPTCPANEL_CREDIT;Credit -IPTCPANEL_CREDITHINT;Identifies the provider of the image, not necessarily the owner/creator (Credit). -IPTCPANEL_DATECREATED;Date Created -IPTCPANEL_DATECREATEDHINT;The date the intellectual content of the image was created; Format: JJJJMMTT (Date Created). -IPTCPANEL_EMBEDDED;Embedded -IPTCPANEL_EMBEDDEDHINT;Reset to IPTC data embedded in the image file -IPTCPANEL_HEADLINE;Headline -IPTCPANEL_HEADLINEHINT;A publishable entry providing a synopsis of the contents of the image (Headline). -IPTCPANEL_INSTRUCTIONS;Instructions -IPTCPANEL_INSTRUCTIONSHINT;Other editorial instructions concerning the use of the image (Special Instructions). -IPTCPANEL_KEYWORDS;Keywords -IPTCPANEL_KEYWORDSHINT;Used to indicate specific information retrieval words (Keywords). -IPTCPANEL_PASTEHINT;Paste IPTC settings from clipboard -IPTCPANEL_PROVINCE;Province -IPTCPANEL_PROVINCEHINT;The Province/State where the image originates (Province-State). -IPTCPANEL_RESET;Reset -IPTCPANEL_RESETHINT;Reset to profile default -IPTCPANEL_SOURCE;Source -IPTCPANEL_SOURCEHINT;The original owner of the intellectual content of the image (Source). -IPTCPANEL_SUPPCATEGORIES;Suppl. Categories -IPTCPANEL_SUPPCATEGORIESHINT;Further refines the subject of the image (Supplemental Categories). -IPTCPANEL_TITLE;Title -IPTCPANEL_TITLEHINT;A shorthand reference for the image (Object Name). -IPTCPANEL_TRANSREFERENCE;Trans. Reference -IPTCPANEL_TRANSREFERENCEHINT;A code representing the location of original transmission (Original Transmission Reference). -MAIN_BUTTON_EXIT;Exit +IPTCPANEL_AUTHOR;Upphovsman +IPTCPANEL_AUTHORHINT;Namn på skaparen, t ex skribenten, fotografen eller den grafiska artisten (by-line) +IPTCPANEL_CATEGORY;Kategori +IPTCPANEL_CITY;Stad +IPTCPANEL_COUNTRY;Land +IPTCPANEL_EMBEDDED;Inbäddad +IPTCPANEL_INSTRUCTIONS;Instruktioner +IPTCPANEL_KEYWORDS;Nyckelord +IPTCPANEL_RESET;Återställ +IPTCPANEL_RESETHINT;Återställ till standardprofilen +IPTCPANEL_SOURCE;Källa +IPTCPANEL_TITLE;Titel +MAIN_BUTTON_EXIT;Avsluta +MAIN_BUTTON_FULLSCREEN;Helskärm MAIN_BUTTON_PREFERENCES;Inställningar -MAIN_BUTTON_QUEUE;Put to queue +MAIN_BUTTON_PUTTOQUEUE;Flytta till behandlingskön +MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Lägg till nuvarande bild i behandlingskön Ctrl+Q +MAIN_BUTTON_QUEUE;Placera i behandlingskön MAIN_BUTTON_SAVE;Spara bild MAIN_BUTTON_SAVEAS;Som... -MAIN_BUTTON_SENDTOEDITOR;Send to editor -MAIN_FRAME_BATCHQUEUE;Batch Queue -MAIN_FRAME_FILEBROWSER;File Browser -MAIN_FRAME_PLACES;Places -MAIN_FRAME_PLACES_ADD;Add -MAIN_FRAME_PLACES_DEL;Del -MAIN_FRAME_RECENT;Recent Folders +MAIN_BUTTON_SAVE_TOOLTIP;Spara nuvarande bild Ctrl+S +MAIN_BUTTON_SENDTOEDITOR;Skicka till externt bildbehandlingsprogram +MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Redigera nuvarande bild i externt bildredigeringsprogram Ctrl+E +MAIN_BUTTON_UNFULLSCREEN;Avsluta helskärm +MAIN_FRAME_BATCHQUEUE;Batchkö +MAIN_FRAME_FILEBROWSER;Filhanterare +MAIN_FRAME_PLACES;Platser +MAIN_FRAME_PLACES_ADD;Lägg till +MAIN_FRAME_PLACES_DEL;Ta bort +MAIN_FRAME_RECENT;Nyligen använda mappar MAIN_MSG_ALREADYEXISTS;Filen existerar redan. MAIN_MSG_CANNOTLOAD;Kan inte ladda bilden MAIN_MSG_CANNOTSAVE;Filsparningsfel -MAIN_MSG_CANNOTSTARTEDITOR;Can not start editor. -MAIN_MSG_CANNOTSTARTEDITOR_SECONDARY;Please set the correct path in the "Preferences" dialog. -MAIN_MSG_EXITJOBSINQUEUEINFO;Unprocessed images in the queue will be lost on exit. -MAIN_MSG_EXITJOBSINQUEUEQUEST;Are you sure you want to exit? There are unprocessed images waiting in the queue. +MAIN_MSG_CANNOTSTARTEDITOR;Kan ej starta externt redigeringsprogram +MAIN_MSG_CANNOTSTARTEDITOR_SECONDARY;Var vänlig och ange rätt sökväg i inställningarna +MAIN_MSG_ERRORDURINGIMAGESAVING;Fel uppstod när bilden sparades +MAIN_MSG_EXITJOBSINQUEUEINFO;Obehandlade bilder i behandlingskön kommer att gå förlorade om programmet stängs av. +MAIN_MSG_EXITJOBSINQUEUEQUEST;Är du säker på att du vill avsluta? Det finns obehandlade bilder i behandlingskön. MAIN_MSG_JOBSINQUEUE;Arbete(n) i kö +MAIN_MSG_NAVIGATOR;Översikt +MAIN_MSG_PLACES;Platser MAIN_MSG_QOVERWRITE;Vill du skriva över den? MAIN_TAB_BASIC;Grund -MAIN_TAB_COLOR;Color -MAIN_TAB_DETAIL;Detail -MAIN_TAB_DEVELOP;Develop -MAIN_TAB_EXIF;Exif -MAIN_TAB_EXPOSURE;Exposure +MAIN_TAB_COLOR;Färger +MAIN_TAB_DETAIL;Detaljer +MAIN_TAB_DEVELOP;Framkalla +MAIN_TAB_EXIF;EXIF +MAIN_TAB_EXPOSURE;Exponering MAIN_TAB_FILTER;Filter MAIN_TAB_ICM;ICM MAIN_TAB_IPTC;IPTC MAIN_TAB_METADATA;Metadata -MAIN_TAB_TAGGING;Tagging +MAIN_TAB_TAGGING;Etiketter MAIN_TAB_TRANSFORM;Omvandla -MAIN_TOOLTIP_HIDEFP;Visa/göm den nedre panelen (katalog och filbläddrare, shortcut key: F) -MAIN_TOOLTIP_HIDEHP;Visa/göm den vänstra panelen (innehåller historiken, shortcut key: H) -MAIN_TOOLTIP_INDCLIPPEDH;Markerad högdager-indikation -MAIN_TOOLTIP_INDCLIPPEDS;Markerad skugg-indikation +MAIN_TOGGLE_BEFORE_AFTER;B|A +MAIN_TOOLTIP_HIDEFP;Visa/göm den nedre panelen (katalog och filbläddrare, Kortkommando: F) +MAIN_TOOLTIP_HIDEHP;Visa/göm den vänstra panelen (innehåller historiken, Kortkommando: H) +MAIN_TOOLTIP_INDCLIPPEDH;Markerad högdagerindikation +MAIN_TOOLTIP_INDCLIPPEDS;Markerad skuggindikation MAIN_TOOLTIP_PREFERENCES;Ställ in inställningar -MAIN_TOOLTIP_QINFO;Snabb info om bilden +MAIN_TOOLTIP_QINFO;Visa kortfattad information om bilden MAIN_TOOLTIP_SAVE;Spara bilden till standardmappen MAIN_TOOLTIP_SAVEAS;Spara bilden till en vald mapp -PARTIALPASTE_BASICGROUP;Basic settings -PARTIALPASTE_CACORRECTION;C/A correction -PARTIALPASTE_COARSETRANS;90 deg rotation / flipping -PARTIALPASTE_COLORBOOST;Color boost -PARTIALPASTE_COLORDENOISE;Color denoise -PARTIALPASTE_COLORGROUP;Color related settings -PARTIALPASTE_COLORMIXER;Color mixer -PARTIALPASTE_COLORSHIFT;Color shift -PARTIALPASTE_COMPOSITIONGROUP;Composition settings -PARTIALPASTE_CROP;Crop -PARTIALPASTE_DIALOGLABEL;Partial paste processing profile -PARTIALPASTE_DISTORTION;Distortion correction -PARTIALPASTE_EXIFCHANGES;Changes to exif data -PARTIALPASTE_EXPOSURE;Exposure -PARTIALPASTE_HLRECOVERY;Highlight recovery -PARTIALPASTE_ICMSETTINGS;ICM settings +MAIN_TOOLTIP_TOGGLE;Växla före/efter vy B +NAVIGATOR_B_NA;B = - +NAVIGATOR_B_VALUE;B = %1 +NAVIGATOR_G_NA;G = - +NAVIGATOR_G_VALUE;G = %1 +NAVIGATOR_H_NA;H = - +NAVIGATOR_H_VALUE;H = %1 +NAVIGATOR_LAB_A_NA;A = - +NAVIGATOR_LAB_A_VALUE;A = %1 +NAVIGATOR_LAB_B_NA;B = - +NAVIGATOR_LAB_B_VALUE;B = %1 +NAVIGATOR_LAB_L_NA;L = - +NAVIGATOR_LAB_L_VALUE;L = %1 +NAVIGATOR_R_NA;R = - +NAVIGATOR_R_VALUE;R = %1 +NAVIGATOR_S_NA;S = - +NAVIGATOR_S_VALUE;S = %1 +NAVIGATOR_V_NA;V = - +NAVIGATOR_V_VALUE;V = %1 +NAVIGATOR_XY_NA;x = -, y = - +PARTIALPASTE_BASICGROUP;Grundläggande inställningar +PARTIALPASTE_CACORRECTION;Reducera kromatiska abberationer +PARTIALPASTE_COARSETRANS;90-graders rotering +PARTIALPASTE_COLORBOOST;Förstärk färger +PARTIALPASTE_COLORDENOISE;Reducera färgbrus +PARTIALPASTE_COLORGROUP;Färgrelaterade inställningar +PARTIALPASTE_COLORMIXER;Färgmixer +PARTIALPASTE_COLORSHIFT;Färgskift +PARTIALPASTE_COMPOSITIONGROUP;Komponeringsinställningar +PARTIALPASTE_CROP;Beskär +PARTIALPASTE_DIALOGLABEL;Partiell inklistring av processprofiler +PARTIALPASTE_DISTORTION;Distortionsrättning +PARTIALPASTE_EXIFCHANGES;Förändringar i EXIF-informationen +PARTIALPASTE_EXPOSURE;Exponering +PARTIALPASTE_HLRECOVERY;Högdageråterskapning +PARTIALPASTE_ICMSETTINGS;ICM-inställningar PARTIALPASTE_IPTCINFO;IPTC info -PARTIALPASTE_LENSGROUP;Lens related settings -PARTIALPASTE_LUMACURVE;Luminance curve -PARTIALPASTE_LUMADENOISE;Luminance noise reduction -PARTIALPASTE_LUMINANCEGROUP;Luminance related settings -PARTIALPASTE_METAICMGROUP;Metadata/ICM settings -PARTIALPASTE_RESIZE;Resize -PARTIALPASTE_ROTATION;Rotation -PARTIALPASTE_SHADOWSHIGHLIGHTS;Shadows/Highlights -PARTIALPASTE_SHARPENING;Sharpening -PARTIALPASTE_VIGNETTING;Vignetting correction -PARTIALPASTE_WHITEBALANCE;White balance -PREFERENCES_APPLNEXTSTARTUP;ändras vid nästa uppstart +PARTIALPASTE_LABCURVE;Labkurva +PARTIALPASTE_LABCURVE;Luminanskurva +PARTIALPASTE_LENSGROUP;Objektivrelaterade inställningar +PARTIALPASTE_LUMACURVE;Luminanskurva +PARTIALPASTE_LUMADENOISE;Reducera luminansbrus +PARTIALPASTE_LUMINANCEGROUP;Luminansrelaterade inställningar +PARTIALPASTE_METAICMGROUP;Metadata/ICM inställningar +PARTIALPASTE_RESIZE;Ändra storlek +PARTIALPASTE_ROTATION;Rotering +PARTIALPASTE_SHADOWSHIGHLIGHTS;Skuggor/Högdagrar +PARTIALPASTE_SHARPENING;Skärpa +PARTIALPASTE_VIGNETTING;Reducera vinjettering +PARTIALPASTE_WHITEBALANCE;Vitbalans +PREFERENCES_ADD;Lägg till +PREFERENCES_APPLNEXTSTARTUP;Ändras vid nästa uppstart +PREFERENCES_BATCH_PROCESSING;Batchbehandling +PREFERENCES_BEHAVIOR;Uppträdande PREFERENCES_BLINKCLIPPED;Blinka markerade områden -PREFERENCES_CACHECLEARALL;Clear All -PREFERENCES_CACHECLEARPROFILES;Clear Profiles -PREFERENCES_CACHECLEARTHUMBS;Clear Thumbnails -PREFERENCES_CACHEFORMAT1;Proprietary (faster and better quality) -PREFERENCES_CACHEFORMAT2;JPEG (smaller disk footprint) -PREFERENCES_CACHEMAXENTRIES;Maximal Number of Cache Entries -PREFERENCES_CACHEOPTS;Cache Options -PREFERENCES_CACHESTRAT1;Prefer Speed to Low Memory Consumption -PREFERENCES_CACHESTRAT2;Prefer Low Memory Consumption to Speed -PREFERENCES_CACHESTRAT;Cache Strategy -PREFERENCES_CACHETHUMBFORM;Cache Thumbnail Format -PREFERENCES_CACHETHUMBHEIGHT;Maximal Thumbnail Height -PREFERENCES_CLEARDLG_LINE1;Clearing cache -PREFERENCES_CLEARDLG_LINE2;This may take a few seconds. -PREFERENCES_CLEARDLG_TITLE;Please wait -PREFERENCES_CLIPPINGIND;Markerings-indikation -PREFERENCES_CMETRICINTENT;Colorimetric Intent +PREFERENCES_CACHECLEARALL;Återställ alla +PREFERENCES_CACHECLEARPROFILES;Återställ profiler +PREFERENCES_CACHECLEARTHUMBS;Ta bort cachade miniatyrbilder +PREFERENCES_CACHEFORMAT1;Proprietär (snabbare och med bättre kvalitet) +PREFERENCES_CACHEFORMAT2;JPEG (tar mindre plats) +PREFERENCES_CACHEMAXENTRIES;Maximalt antal cachefiler +PREFERENCES_CACHEOPTS;Cacheinställningar +PREFERENCES_CACHESTRAT1;Föredra hastighet framför låg minnesanvändning +PREFERENCES_CACHESTRAT2;Föredra låg minnesanvändning framför hastighet +PREFERENCES_CACHESTRAT;Cachestrategi +PREFERENCES_CACHETHUMBFORM;Miniatyrbildens format i cachen +PREFERENCES_CACHETHUMBHEIGHT;Maximal storlek på miniatyrbilderna +PREFERENCES_CACORRECTION;Använd autoreducering av kromatiska abberationer (CA) +PREFERENCES_CLEARDLG_LINE1;Rensa cache +PREFERENCES_CLEARDLG_LINE2;Det här tar kanske ett par sekunder... +PREFERENCES_CLEARDLG_TITLE;Var vänlig vänta +PREFERENCES_CLIPPINGIND;Markeringsindikation +PREFERENCES_CMETRICINTENT;Kolorimetrisk återgivning PREFERENCES_DATEFORMAT;Datumformat -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_DATEFORMATHINT;Du kan använda de följande formatteringssträngarna:\n%y : år\n%m : månad\n%d : dag\n\nTill exempel är det svenska datumformatet:-n%y-%m-%d +PREFERENCES_DCBENHANCE;Applicera DCB-förbättringssteg +PREFERENCES_DCBITERATIONS;Antal DCB-iterationer PREFERENCES_DEFAULTLANG;Förvalt språk -PREFERENCES_DEFAULTTHEME;Default theme -PREFERENCES_DEMOSAICINGALGO;Demosaicing Algorithm +PREFERENCES_DEFAULTTHEME;Förvalt tema +PREFERENCES_DEMOSAICINGALGO;Algoritm för demosaicing PREFERENCES_DIRHOME;Hemkatalog PREFERENCES_DIRLAST;Senaste besökta katalog PREFERENCES_DIROTHER;Annan -PREFERENCES_DIRSELECTDLG;Välj Bildkatalog vid uppstart... -PREFERENCES_DIRSOFTWARE;Installations-katalog +PREFERENCES_DIRSELECTDLG;Välj bildkatalog vid uppstart... +PREFERENCES_DIRSOFTWARE;Installationskatalog PREFERENCES_DMETHOD;Metod -PREFERENCES_EDITORCMDLINE;Other command line -PREFERENCES_EXTERNALEDITOR;External editor +PREFERENCES_DMETHODBATCH;Batch +PREFERENCES_EDITORCMDLINE;Annan kommandorad +PREFERENCES_EDITORLAYOUT;Layout på redigeringsvyn +PREFERENCES_EXTERNALEDITOR;Externt bildredigeringsprogram PREFERENCES_FALSECOLOR;Falskt färgbortträngningssteg -PREFERENCES_FBROWSEROPTS;Filbläddrar-inställningar +PREFERENCES_FBROWSEROPTS;Filbläddrarinställningar PREFERENCES_FILEFORMAT;Filformat PREFERENCES_FORIMAGE;För bildfiler -PREFERENCES_FORRAW;För RAW-filer -PREFERENCES_GIMPPATH;GIMP installation directory -PREFERENCES_GTKTHEME;GTK default +PREFERENCES_FORRAW;För råfiler +PREFERENCES_GIMPPATH;Installationskatalog för GIMP +PREFERENCES_GTKTHEME;GTK standard PREFERENCES_HINT;Tips -PREFERENCES_HLTHRESHOLD;Tröskelvärde för markerade högdager +PREFERENCES_HLTHRESHOLD;Tröskelvärde för högdagrar +PREFERENCES_HOTDEADPIXFILT;Applicera het/död-pixelfilter PREFERENCES_ICCDIR;Katalog för ICC-profiler -PREFERENCES_IMPROCPARAMS;Standard-bildbehandlingsparametrar -PREFERENCES_INTENT_ABSOLUTE;Total colorimetric -PREFERENCES_INTENT_PERCEPTUAL;Perceptual -PREFERENCES_INTENT_RELATIVE;Relativ colorimetric +PREFERENCES_IMPROCPARAMS;Standardprofiler +PREFERENCES_INTENT_ABSOLUTE;Totalkolorimetrisk +PREFERENCES_INTENT_PERCEPTUAL;Upplevd +PREFERENCES_INTENT_RELATIVE;Relativ kolorimetrisk PREFERENCES_INTENT_SATURATION;Mättnad -PREFERENCES_LIVETHUMBNAILS;Live Thumbnails (slower) +PREFERENCES_LIVETHUMBNAILS;Alltid uppdaterade miniatyrbilder(långsammare) PREFERENCES_MONITORICC;Skärmprofil +PREFERENCES_MULTITAB;Öppna bilderna i olika flikar PREFERENCES_OUTDIR;Utmatningskatalog -PREFERENCES_OUTDIRFOLDER;Save to folder -PREFERENCES_OUTDIRFOLDERHINT;Put the saved images to the seledted folder -PREFERENCES_OUTDIRHINT;You can use the following formatting strings:\n%f, %d1, %d2, ..., %p1, %p2, ...\n\nThese formatting strings refer to the directories and sub-paths of the path of the raw file.\n\nFor example, if /home/tom/image/02-09-2006/dsc0012.nefhas been opened, the meaning of the formatting strings are:\n%f=dsc0012, %d1=02-09-2006, %d2=image, ...\n%p1=/home/tom/image/02-09-2006, %p2=/home/tom/image, p3=/home/tom, ...\n\nIf you want to save the output image where the original is, write:\n%p1/%f\n\nIf you want to save the output image in a directory 'converted' located the directory of the original, write:\n%p1/converted/%f\n\nIf you want to save the output image in directory '/home/tom/converted' with keeping the same subdirectory of dates, write:\n%p2/converted/%d1/%f -PREFERENCES_OUTDIRTEMPLATE;Use Template -PREFERENCES_OUTDIRTEMPLATEHINT;You can use the following formatting strings:\n%f, %d1, %d2, ..., %p1, %p2, ...\n\nThese formatting strings refer to the directories and sub-paths of the path of the raw file.\n\nFor example, if /home/tom/image/02-09-2006/dsc0012.nefhas been opened, the meaning of the formatting strings are:\n%f=dsc0012, %d1=02-09-2006, %d2=image, ...\n%p1=/home/tom/image/02-09-2006, %p2=/home/tom/image, p3=/home/tom, ...\n\nIf you want to save the output image where the original is, write:\n%p1/%f\n\nIf you want to save the output image in a directory 'converted' located the directory of the original, write:\n%p1/converted/%f\n\nIf you want to save the output image in directory '/home/tom/converted' with keeping the same subdirectory of dates, write:\n%p2/converted/%d1/%f -PREFERENCES_PARSEDEXT;Parsed Extensions -PREFERENCES_PARSEDEXTADD;Add Extension -PREFERENCES_PARSEDEXTADDHINT;Type an extension and press this button to append list -PREFERENCES_PARSEDEXTDELHINT;Delete selected extension from the list -PREFERENCES_PROFILEHANDLING;Processing Profile Handling -PREFERENCES_PROFILELOADPR;Profile Loading Priority -PREFERENCES_PROFILEPRCACHE;Profile in Cache -PREFERENCES_PROFILEPRFILE;Profile Next to the Input File -PREFERENCES_PROFILESAVECACHE;Save Processing Parameters to the Cache -PREFERENCES_PROFILESAVEINPUT;Save Processing Parameters Next to the Input File -PREFERENCES_PSPATH;Adobe Photoshop installation directory +PREFERENCES_OUTDIRFOLDER;Spara till katalog +PREFERENCES_OUTDIRFOLDERHINT;Flytta de sparade filerna i den valda katalogen +PREFERENCES_OUTDIRHINT;Du kan använda de följande formatteringssträngarna:\n%f, %d1, %d2, ..., %p1, %p2, ...\n\nDe här formatsträngarna hänvisar till katalogerna och underkatalogerna till råfilens sökväg.\n\nTill exempel, om /home/tom/bilder/2010-09-02/dsc0012.nefhar öppnats, betyder formatsträngen:\n%f=dsc0012, %d1=2010-09-02, %d2=bildfilen, ...\n%p1=/home/tom/bilder/2010-09-02, %p2=/home/tom/bilder, p3=/home/tom, ...\n\nOm du vill spara den behandlade filen där originalet finns, skriver du:\n%p1/%f\n\nOm du vill spara den behandlade filen i en katalog som heter "Konverterade filer", belägen i originalets katalog, skriver du:\n%p1/Konverterade filer/%f\n\nOm du vill spara den behandlade filen i en katalog '/home/tom/Konverterade filer' där du behåller samma underkatalog med datum, skriver du:\n%p2/Konverterade filer/%d1/%f +PREFERENCES_OUTDIRTEMPLATE;Använd förinställning +PREFERENCES_OUTDIRTEMPLATEHINT;Du kan använda de följande formatteringssträngarna:\n%f, %d1, %d2, ..., %p1, %p2, ...\n\nDe här formatsträngarna hänvisar till katalogerna och underkatalogerna till råfilens sökväg.\n\nTill exempel, om /home/tom/bilder/2010-09-02/dsc0012.nefhar öppnats, betyder formatsträngen följande:\n%f=dsc0012, %d1=2010-09-02, %d2=bildfilen, ...\n%p1=/home/tom/bilder/2010-09-02, %p2=/home/tom/bilder, p3=/home/tom, ...\n\nOm du vill spara den behandlade filen där originalet finns, skriver du:\n%p1/%f\n\nOm du vill spara den behandlade filen i en katalog som heter "Konverterade filer", belägen i originalets katalog, skriver du:\n%p1/Konverterade filer/%f\n\nOm du vill spara den behandlade filen i en katalog '/home/tom/Konverterade filer' där du behåller samma underkatalog med datum, skriver du:\n%p2/Konverterade filer/%d1/%f +PREFERENCES_OVERLAY_FILENAMES;Visa filnamn över miniatyrbilder +PREFERENCES_PARSEDEXT;Behandlade filtyper +PREFERENCES_PARSEDEXTADD;Lägg till filtyp +PREFERENCES_PARSEDEXTADDHINT;Skriv in en filändelse och tryck på den här knappen för att lägga till den i listan +PREFERENCES_PARSEDEXTDELHINT;Ta bort de markerade filändelserna från listan +PREFERENCES_PROFILEHANDLING;Hantering av bildbehandlingsparametrar +PREFERENCES_PROFILELOADPR;Laddningsprioritet för profil +PREFERENCES_PROFILEPRCACHE;Profil i cache +PREFERENCES_PROFILEPRFILE;Profil i indatafilen +PREFERENCES_PROFILESAVECACHE;Spara behandlingsparametrar till cachen +PREFERENCES_PROFILESAVEINPUT;Spara behandlingsparametrar med indatabildfilen +PREFERENCES_PROPERTY;Egenskaper +PREFERENCES_PSPATH;Adobe Photoshops installationskatalog +PREFERENCES_SELECTFONT;Välj typsnitt PREFERENCES_SELECTICCDIRDLG;Välj ICC-profil katalog... PREFERENCES_SELECTLANG;Välj språk PREFERENCES_SELECTMONITORPROFDLG;Välj ICC-profil för skärmen... -PREFERENCES_SELECTTHEME;Select theme -PREFERENCES_SHOWBASICEXIF;Visa grundlig Exif-information +PREFERENCES_SELECTTHEME;Välj tema +PREFERENCES_SET;Aktivera +PREFERENCES_SHOWBASICEXIF;Visa grundlig EXIF-information PREFERENCES_SHOWDATETIME;Visa datum och tid PREFERENCES_SHOWONLYRAW;Visa bara RAW-filer -PREFERENCES_SHTHRESHOLD;Tröskelvärde för markerade skuggor +PREFERENCES_SHTHRESHOLD;Tröskelvärde för skuggor +PREFERENCES_SINGLETAB;Öppna en bild åt gången PREFERENCES_STARTUPIMDIR;Bildkatalog som visas vid uppstart PREFERENCES_TAB_BROWSER;Filbläddrare PREFERENCES_TAB_COLORMGR;Färghantering PREFERENCES_TAB_GENERAL;Allmän PREFERENCES_TAB_IMPROC;Bildbehandling -PREFERENCES_TAB_OUTPUT;Utmatnings-inställningar +PREFERENCES_TAB_OUTPUT;Utmatningsinställningar PREFERENCES_THUMBSIZE;Miniatyrbildstorlek +PREFERENCES_USESYSTEMTHEME;Använd systemtema +PREFERENCES_WORKFLOW;Arbetsflöde PROFILEPANEL_FILEDLGFILTERANY;Vilka filer som helst -PROFILEPANEL_FILEDLGFILTERPP;Postbehandlar profiler -PROFILEPANEL_LABEL;Postbehandlar profiler -PROFILEPANEL_LOADDLGLABEL;Ladda Postbehandlingsparametrar... +PROFILEPANEL_FILEDLGFILTERPP;Efterbehandlingsprofiler +PROFILEPANEL_LABEL;Efterbehandlingsprofiler +PROFILEPANEL_LOADDLGLABEL;Ladda efterbehandlingsparametrar... PROFILEPANEL_PCUSTOM;Egen PROFILEPANEL_PFILE;Från fil PROFILEPANEL_PLASTPHOTO;Senaste foto PROFILEPANEL_PLASTSAVED;Senast sparad PROFILEPANEL_PROFILE;Profil -PROFILEPANEL_SAVEDLGLABEL;Spara Postbehandlingsparametrar... -PROFILEPANEL_TOOLTIPCOPY;Copy current profile to clipboard +PROFILEPANEL_SAVEDLGLABEL;Spara efterbehandlingsparametrar... +PROFILEPANEL_TOOLTIPCOPY;Kopiera nuvarande profil till klippbordet PROFILEPANEL_TOOLTIPLOAD;Ladda profil från fil -PROFILEPANEL_TOOLTIPPASTE; Paste profile from clipboard +PROFILEPANEL_TOOLTIPPASTE; Klistra in profil från klippbordet PROFILEPANEL_TOOLTIPSAVE;Spara nuvarande profil -PROGRESSBAR_DECODING;Avkodar Raw-fil... +PROGRESSBAR_DECODING;Avkodar råfil... PROGRESSBAR_DEMOSAICING;Demosaicing... PROGRESSBAR_LOADING;Laddar bild... PROGRESSBAR_LOADJPEG;Laddar JPEG-fil... PROGRESSBAR_LOADPNG;Laddar PNG-fil... PROGRESSBAR_LOADTIFF;Laddar TIFF-fil... -PROGRESSBAR_PROCESSING;Bearbetar Bild... -PROGRESSBAR_READY;Klar. +PROGRESSBAR_PROCESSING;Bearbetar bild... +PROGRESSBAR_READY;Klar PROGRESSBAR_SAVEJPEG;Sparar JPEG-fil... PROGRESSBAR_SAVEPNG;Sparar PNG-fil... PROGRESSBAR_SAVETIFF;Sparar TIFF-fil... PROGRESSDLG_LOADING;Loading file... -PROGRESSDLG_PROCESSING;Processing image... -PROGRESSDLG_SAVING;Saving file... +PROGRESSDLG_PROCESSING;Bearbetar bild... +PROGRESSDLG_PROFILECHANGEDINBROWSER;Profilen har ändrats i filhanteraren +PROGRESSDLG_SAVING;Sparar fil... QINFO_FOCALLENGTH;Brännvidd QINFO_ISO;ISO -QINFO_LENS;Lens -QINFO_NOEXIF;Exifdata otillgänglig. +QINFO_LENS;Objektiv +QINFO_NOEXIF;EXIF-information ej tillgänglig. +SAVEDLG_AUTOSUFFIX;Lägg automatiskt till en ändelse om filnamnet redan existerar SAVEDLG_FILEFORMAT;Filformat SAVEDLG_JPEGQUAL;JPEG-kvalitet SAVEDLG_JPGFILTER;JPEG-filer SAVEDLG_PNGCOMPR;PNG-komprimering SAVEDLG_PNGFILTER;PNG-filer -SAVEDLG_PUTTOQUEUE;Put into processing queue -SAVEDLG_PUTTOQUEUEHEAD;Put to the head of the processing queue -SAVEDLG_PUTTOQUEUETAIL;Put to the end of the processing queue -SAVEDLG_SAVEIMMEDIATELY;Save immediately +SAVEDLG_PUTTOQUEUE;Lägg till i behandlingskön +SAVEDLG_PUTTOQUEUEHEAD;Flytta längst fram i behandlingskön +SAVEDLG_PUTTOQUEUETAIL;Flytta längst bak i behandlingskön +SAVEDLG_SAVEIMMEDIATELY;Spara direkt SAVEDLG_SAVESPP;Spara behandlingsparametrarna med bilderna SAVEDLG_TIFFFILTER;TIFF-filer -SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF -TOOLBAR_TOOLTIP_CROP;Välj beskärningsområde (shortcut key: C) -TOOLBAR_TOOLTIP_HAND;Handverktyg (shortcut key: N) -TOOLBAR_TOOLTIP_STRAIGHTEN;Räta ut (shortcut key: S) -TOOLBAR_TOOLTIP_WB;Punkt-vitbalans (shortcut key: W) +SAVEDLG_TIFFUNCOMPRESSED;Okomprimerad TIFF +TOOLBAR_TOOLTIP_CROP;Välj beskärningsområde (Kortkommando: C) +TOOLBAR_TOOLTIP_HAND;Handverktyg (Kortkommando: N) +TOOLBAR_TOOLTIP_STRAIGHTEN;Räta ut (Kortkommando: S) +TOOLBAR_TOOLTIP_WB;Egen vitbalans (Kortkommando: W) TP_CACORRECTION_BLUE;Blå -TP_CACORRECTION_LABEL;C/A justering +TP_CACORRECTION_LABEL;Korrigera kromatiska abberationer TP_CACORRECTION_RED;Röd TP_CHMIXER_BLUE;Blå TP_CHMIXER_GREEN;Grön @@ -461,59 +512,75 @@ TP_COARSETRAF_TOOLTIP_HFLIP;Vänd horisontellt TP_COARSETRAF_TOOLTIP_ROTLEFT;Rotera åt vänster TP_COARSETRAF_TOOLTIP_ROTRIGHT;Rotera åt höger TP_COARSETRAF_TOOLTIP_VFLIP;Vänd vertikalt -TP_COLORBOOST_ACHANNEL;kanal "a" +TP_COLORBOOST_ACHANNEL;Kanal "a" TP_COLORBOOST_AMOUNT;Mängd -TP_COLORBOOST_AVOIDCOLORCLIP;Undvik färgclipping -TP_COLORBOOST_BCHANNEL;kanal "b" +TP_COLORBOOST_AVOIDCOLORCLIP;Undvik att färgen klipper +TP_COLORBOOST_BCHANNEL;Kanal "b" TP_COLORBOOST_CHAB;a & b TP_COLORBOOST_CHANNEL;Kanal -TP_COLORBOOST_CHSEPARATE;separat +TP_COLORBOOST_CHSEPARATE;Separat TP_COLORBOOST_ENABLESATLIMITER;Verkställ mättnadsgräns TP_COLORBOOST_LABEL;Färgförstärkning TP_COLORBOOST_SATLIMIT;Mättnadsgräns TP_COLORDENOISE_EDGESENSITIVE;Kantkänslighet TP_COLORDENOISE_EDGETOLERANCE;Kanttolerans -TP_COLORDENOISE_LABEL;Färgbrus-reducering +TP_COLORDENOISE_LABEL;Färgbrusreducering TP_COLORDENOISE_RADIUS;Radie TP_COLORSHIFT_BLUEYELLOW;Blå-Gul TP_COLORSHIFT_GREENMAGENTA;Grön-Magenta TP_COLORSHIFT_LABEL;Färgskiftningar TP_CROP_DPI;DPI= -TP_CROP_FIXRATIO;Fixa proportion +TP_CROP_FIXRATIO;Fix proportion TP_CROP_GTDIAGONALS;Diagonalregeln -TP_CROP_GTHARMMEANS1;Harmonic means 1 -TP_CROP_GTHARMMEANS2;Harmonic means 2 -TP_CROP_GTHARMMEANS3;Harmonic means 3 -TP_CROP_GTHARMMEANS4;Harmonic means 4 +TP_CROP_GTHARMMEANS1;Harmoniskt medel 1 +TP_CROP_GTHARMMEANS2;Harmoniskt medel 2 +TP_CROP_GTHARMMEANS3;Harmoniskt medel 3 +TP_CROP_GTHARMMEANS4;Harmoniskt medel 4 TP_CROP_GTNONE;Ingen TP_CROP_GTRULETHIRDS;Tredjedelsregeln TP_CROP_GUIDETYPE;Guidetyp: TP_CROP_H;H TP_CROP_LABEL;Beskär -TP_CROP_SELECTCROP; Välj beskärningsområde +TP_CROP_SELECTCROP;Välj beskärningsområde TP_CROP_W;B TP_CROP_X;x TP_CROP_Y;y +TP_DETAIL_AMOUNT;Mängd +TP_DIRPYRDENOISE_CHROMA;Krominans +TP_DIRPYRDENOISE_GAMMA;Gamma +TP_DIRPYRDENOISE_LUMA;Luminans +TP_DIRPYREQUALIZER_LUMACOARSEST;Grovast +TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Minska kontrasten +TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;Öka kontrasten +TP_DIRPYREQUALIZER_LUMAFINEST;Finaste +TP_DIRPYREQUALIZER_LUMANEUTRAL;Neutralt +TP_DIRPYREQUALIZER_THRESHOLD;Tröskelvärde TP_DISTORTION_AMOUNT;Mängd TP_DISTORTION_LABEL;Distorsion +TP_EQUALIZER_CONTRAST_MINUS;Minska kontrasten +TP_EQUALIZER_CONTRAST_PLUS;Öka kontrasten +TP_EQUALIZER_FINEST;Finast +TP_EQUALIZER_LABEL;Waveletequalizer +TP_EQUALIZER_LARGEST;Grovast +TP_EQUALIZER_NEUTRAL;Neutral TP_EXPOSURE_AUTOLEVELS;Autonivåer -TP_EXPOSURE_BLACKLEVEL;Svart +TP_EXPOSURE_BLACKLEVEL;Svärta TP_EXPOSURE_BRIGHTNESS;Ljusstyrka -TP_EXPOSURE_CLIP;Clip +TP_EXPOSURE_CLIP;Klippnivå TP_EXPOSURE_COMPRHIGHLIGHTS;Högdagerkomprimering TP_EXPOSURE_COMPRSHADOWS;Skuggkomprimering TP_EXPOSURE_CONTRAST;Kontrast TP_EXPOSURE_CURVEEDITOR;Tonkurva -TP_EXPOSURE_EXPCOMP;Exp. Comp. +TP_EXPOSURE_EXPCOMP;Exponeringskompensation TP_EXPOSURE_LABEL;Exponering -TP_HLREC_CIELAB;CIELab Blending +TP_HLREC_CIELAB;CIELab mix TP_HLREC_COLOR;Färgspridning -TP_HLREC_LABEL;Högdager-förbättring +TP_HLREC_LABEL;Högdagerförbättring TP_HLREC_LUMINANCE;Bättring av luminans TP_HLREC_METHOD;Metod: TP_ICM_FILEDLGFILTERANY;Vilka filer som helst TP_ICM_FILEDLGFILTERICM;ICC profilfiler -TP_ICM_GAMMABEFOREINPUT;Profile applies Gamma +TP_ICM_GAMMABEFOREINPUT;Profilapplicerad gamma TP_ICM_INPUTCAMERA;Kameraval TP_ICM_INPUTCUSTOM;Egen TP_ICM_INPUTDLGLABEL;Välj inmatnings ICC-profil... @@ -523,9 +590,19 @@ TP_ICM_LABEL;ICM TP_ICM_NOICM;Ingen ICM: sRGB-utmatning TP_ICM_OUTPUTDLGLABEL;Välj utmatnings ICC-profil... TP_ICM_OUTPUTPROFILE;Utmatningsprofil -TP_ICM_SAVEREFERENCE;Save reference image for profiling +TP_ICM_SAVEREFERENCE;Spara referensbild för profilering TP_ICM_WORKINGPROFILE;Arbetsprofil -TP_LUMACURVE_BLACKLEVEL;Svart +TP_IMPULSEDENOISE_LABEL;Brusreducering, stegsvar +TP_IMPULSEDENOISE_THRESH;Tröskelvärde +TP_LABCURVE_BRIGHTNESS;Ljushet +TP_LABCURVE_CONTRAST;Kontrast +TP_LABCURVE_CURVEEDITOR;Luminanskurva +TP_LABCURVE_LABEL;Labkurvor +TP_LABCURVE_SATURATION;Mättnad +TP_LENSGEOM_AUTOCROP;Autobeskärning +TP_LENSGEOM_FILL;Fyll automatiskt +TP_LENSGEOM_LABEL;Geometri- och distorsionskorrigering +TP_LUMACURVE_BLACKLEVEL;Svärta TP_LUMACURVE_BRIGHTNESS;Ljusstyrka TP_LUMACURVE_COMPRHIGHLIGHTS;Högdagerkomprimering TP_LUMACURVE_COMPRSHADOWS;Skuggkomprimering @@ -533,57 +610,65 @@ TP_LUMACURVE_CONTRAST;Kontrast TP_LUMACURVE_CURVEEDITOR;Luminanskurva TP_LUMACURVE_LABEL;Luminanskurva TP_LUMADENOISE_EDGETOLERANCE;Kanttolerans -TP_LUMADENOISE_LABEL;Luminans-brusreducering +TP_LUMADENOISE_LABEL;Reducering av luminansbrus TP_LUMADENOISE_RADIUS;Radie -TP_RESIZE_BICUBIC;Bicubic -TP_RESIZE_BICUBICSF;Bicubic (Mjukare) -TP_RESIZE_BICUBICSH;Bicubic (Skarpare) +TP_PERSPECTIVE_HORIZONTAL;Horisontell +TP_PERSPECTIVE_LABEL;Perspektiv +TP_PERSPECTIVE_VERTICAL;Vertikal +TP_RESIZE_BICUBIC;Bikubisk +TP_RESIZE_BICUBICSF;Bikubisk (Mjukare) +TP_RESIZE_BICUBICSH;Bikubisk (Skarpare) TP_RESIZE_BILINEAR;Bilinjär +TP_RESIZE_DOWNSCALEB;Nedsampla (Bättre) +TP_RESIZE_DOWNSCALEF;Skala ned (Snabbare) TP_RESIZE_FULLSIZE;Full bildstorlek: TP_RESIZE_H;H: +TP_RESIZE_HEIGHT;Höjd TP_RESIZE_LABEL;Ändra storlek TP_RESIZE_METHOD;Metod: TP_RESIZE_NEAREST;Närmast TP_RESIZE_SCALE;Skala +TP_RESIZE_SPECIFY;Specificera: TP_RESIZE_W;B: +TP_RESIZE_WIDTH;Bredd TP_ROTATE_AUTOCROP;Autobeskär TP_ROTATE_DEGREE;Antal grader TP_ROTATE_FILL;Fyll TP_ROTATE_LABEL;Räta ut -TP_ROTATE_SELECTLINE; Välj rak linje +TP_ROTATE_SELECTLINE;Välj rak linje TP_SHADOWSHLIGHTS_HIGHLIGHTS;Högdager -TP_SHADOWSHLIGHTS_HLTONALW;Tonvidd -TP_SHADOWSHLIGHTS_LABEL;Skuggor/högdager -TP_SHADOWSHLIGHTS_LOCALCONTR;Lokal konstrast +TP_SHADOWSHLIGHTS_HLTONALW;Tonvidd (Högdagrar) +TP_SHADOWSHLIGHTS_LABEL;Skuggor/högdagrar +TP_SHADOWSHLIGHTS_LOCALCONTR;Lokal kontrast TP_SHADOWSHLIGHTS_RADIUS;Radie TP_SHADOWSHLIGHTS_SHADOWS;Skuggor -TP_SHADOWSHLIGHTS_SHTONALW;Tonvidd +TP_SHADOWSHLIGHTS_SHTONALW;Tonvidd (Skuggor) TP_SHARPENING_AMOUNT;Mängd TP_SHARPENING_EDRADIUS;Radie TP_SHARPENING_EDTOLERANCE;Kanttolerans -TP_SHARPENING_HALOCONTROL;Halo-kontrol +TP_SHARPENING_HALOCONTROL;Halo-kontroll TP_SHARPENING_HCAMOUNT;Mängd TP_SHARPENING_LABEL;Skärpa TP_SHARPENING_METHOD;Metod TP_SHARPENING_ONLYEDGES;Skärp bara kanter TP_SHARPENING_RADIUS;Radie -TP_SHARPENING_RLD;RL Deconvolution +TP_SHARPENING_RLD;RL-dekonvolution TP_SHARPENING_RLD_AMOUNT;Mängd TP_SHARPENING_RLD_DAMPING;Dämpning TP_SHARPENING_RLD_ITERATIONS;Upprepningar TP_SHARPENING_THRESHOLD;Tröskelvärde TP_SHARPENING_USM;Oskarp mask TP_VIGNETTING_AMOUNT;Mängd -TP_VIGNETTING_LABEL;Vinjettering-korrigering +TP_VIGNETTING_LABEL;Vinjetteringskorrigering TP_VIGNETTING_RADIUS;Radie TP_WBALANCE_AUTO;Auto TP_WBALANCE_CAMERA;Kamera TP_WBALANCE_CUSTOM;Egen -TP_WBALANCE_GREEN;Nyans +TP_WBALANCE_GREEN;Färgton TP_WBALANCE_LABEL;Vitbalans TP_WBALANCE_METHOD;Metod TP_WBALANCE_SIZE;Storlek: -TP_WBALANCE_SPOTWB;Punkt VB +TP_WBALANCE_SPOTWB;Vitbalansväljare TP_WBALANCE_TEMPERATURE;Temperatur ZOOMBAR_DETAIL;Lupp ZOOMBAR_HUGE;Enorm @@ -592,6 +677,12 @@ ZOOMBAR_NORMAL;Normal ZOOMBAR_PREVIEW;Förhandsvisning ZOOMBAR_SCALE;Skala ZOOMBAR_SMALL;Liten +ZOOMPANEL_100;(100%) +ZOOMPANEL_NEWCROPWINDOW;Öppna (nytt) detaljfönster +ZOOMPANEL_ZOOM100;Zooma till 100% 1 +ZOOMPANEL_ZOOMFITSCREEN;Passa till skärmenF +ZOOMPANEL_ZOOMIN;Zooma in + +ZOOMPANEL_ZOOMOUT;Zooma ut - !!!!!!!!!!!!!!!!!!!!!!!!! @@ -599,106 +690,43 @@ ZOOMBAR_SMALL;Liten !!!!!!!!!!!!!!!!!!!!!!!!! -!BATCHQUEUE_AUTOSTART;Auto start -!BATCH_PROCESSING;batch processing -!CURVEEDITOR_CUSTOM;Custom -!CURVEEDITOR_DARKS;Darks -!CURVEEDITOR_HIGHLIGHTS;Highlights -!CURVEEDITOR_LIGHTS;Lights !CURVEEDITOR_NURBS;Control cage -!CURVEEDITOR_PARAMETRIC;Parametric -!CURVEEDITOR_SHADOWS;Shadows -!CURVEEDITOR_TYPE;Type: -!EXIFFILTER_METADATAFILTER;Enable Metadata Filters -!FILEBROWSER_ADDDELTEMPLATE;Add/Del templates... -!FILEBROWSER_CURRENT_NAME;Current name: -!FILEBROWSER_NEW_NAME;New name: -!FILEBROWSER_SHOWEXIFINFO;Show EXIF info i -!FILEBROWSER_TOOLTIP_STOPPROCESSING;Start processing automatically when a new job arrives -!FILEBROWSER_USETEMPLATE;Use template: -!GENERAL_AFTER;After -!GENERAL_BEFORE;Before -!GENERAL_HIGH_QUALITY;High Quality -!GENERAL_UNCHANGED;(Unchanged) -!HISTOGRAM_BUTTON_B;B -!HISTOGRAM_BUTTON_G;G -!HISTOGRAM_BUTTON_L;L -!HISTOGRAM_BUTTON_R;R -!HISTORY_MSG_82;Profile Changed -!HISTORY_MSG_83;High quality shadows/highlights -!HISTORY_MSG_84;Perspective correction -!HISTORY_MSG_85;Wavelet coefficients -!HISTORY_MSG_86;Wavelet equalizer -!HISTORY_MSG_87;Impulse noise reduction +!HISTORY_MSG_78;Data specified for resize !HISTORY_MSG_89;Directional pyramid !HISTORY_MSG_90;Directional pyramid luminance !HISTORY_MSG_91;Directional pyramid chominance !HISTORY_MSG_92;Directional pyramid gamma -!MAIN_BUTTON_FULLSCREEN;Fullscreen -!MAIN_BUTTON_PUTTOQUEUE;Put to queue -!MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Add current image to processing queue Ctrl+Q -!MAIN_BUTTON_SAVE_TOOLTIP;Save current image Ctrl+S -!MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Edit current image in external editor Ctrl+E -!MAIN_BUTTON_UNFULLSCREEN;Exit fullscreen -!MAIN_MSG_ERRORDURINGIMAGESAVING;Error during image saving -!MAIN_MSG_NAVIGATOR;Navigator -!MAIN_MSG_PLACES;Places -!MAIN_TOGGLE_BEFORE_AFTER;B|A -!MAIN_TOOLTIP_TOGGLE;Toggle before/after view B -!NAVIGATOR_B_NA;B = n/a -!NAVIGATOR_B_VALUE;B = %1 -!NAVIGATOR_G_NA;G = n/a -!NAVIGATOR_G_VALUE;G = %1 -!NAVIGATOR_H_NA;H = n/a -!NAVIGATOR_H_VALUE;H = %1 -!NAVIGATOR_R_NA;R = n/a -!NAVIGATOR_R_VALUE;R = %1 -!NAVIGATOR_S_NA;S = n/a -!NAVIGATOR_S_VALUE;S = %1 -!NAVIGATOR_V_NA;V = n/a -!NAVIGATOR_V_VALUE;V = %1 -!NAVIGATOR_XY_NA;x = n/a, y = n/a -!PREFERENCES_ADD;ADD -!PREFERENCES_BATCH_PROCESSING;batch processing -!PREFERENCES_BEHAVIOR;Behavior -!PREFERENCES_CACORRECTION;Apply CA auto correction -!PREFERENCES_DCBENHANCE;Apply DCB enhancement step -!PREFERENCES_DCBITERATIONS;Number of DCB iterations +!IPTCPANEL_AUTHORSPOSITION;Author's position +!IPTCPANEL_AUTHORSPOSITIONHINT;Title of the creator or creators of the object (By-line Title). +!IPTCPANEL_CAPTION;Caption +!IPTCPANEL_CAPTIONHINT;A textual description of the data (Caption - Abstract). +!IPTCPANEL_CAPTIONWRITER;Caption Writer +!IPTCPANEL_CAPTIONWRITERHINT;The name of the person involved in the writing, editing or correcting the image or caption/abstract (Writer - Editor). +!IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider (Category). +!IPTCPANEL_CITYHINT;City of image origin (City). +!IPTCPANEL_COPYHINT;Copy IPTC settings to clipboard +!IPTCPANEL_COPYRIGHT;Copyright +!IPTCPANEL_COPYRIGHTHINT;Any necessary copyright notice (Copyright Notice). +!IPTCPANEL_COUNTRYHINT;The name of the country/primary location where the image was created (Country - Primary Location Name). +!IPTCPANEL_CREDIT;Credit +!IPTCPANEL_CREDITHINT;Identifies the provider of the image, not necessarily the owner/creator (Credit). +!IPTCPANEL_DATECREATED;Date Created +!IPTCPANEL_DATECREATEDHINT;The date the intellectual content of the image was created; Format: JJJJMMTT (Date Created). +!IPTCPANEL_EMBEDDEDHINT;Reset to IPTC data embedded in the image file +!IPTCPANEL_HEADLINE;Headline +!IPTCPANEL_HEADLINEHINT;A publishable entry providing a synopsis of the contents of the image (Headline). +!IPTCPANEL_INSTRUCTIONSHINT;Other editorial instructions concerning the use of the image (Special Instructions). +!IPTCPANEL_KEYWORDSHINT;Used to indicate specific information retrieval words (Keywords). +!IPTCPANEL_PASTEHINT;Paste IPTC settings from clipboard +!IPTCPANEL_PROVINCE;Province +!IPTCPANEL_PROVINCEHINT;The Province/State where the image originates (Province-State). +!IPTCPANEL_SOURCEHINT;The original owner of the intellectual content of the image (Source). +!IPTCPANEL_SUPPCATEGORIES;Suppl. Categories +!IPTCPANEL_SUPPCATEGORIESHINT;Further refines the subject of the image (Supplemental Categories). +!IPTCPANEL_TITLEHINT;A shorthand reference for the image (Object Name). +!IPTCPANEL_TRANSREFERENCE;Trans. Reference +!IPTCPANEL_TRANSREFERENCEHINT;A code representing the location of original transmission (Original Transmission Reference). !PREFERENCES_GREENEQUIL;Green equilibration -!PREFERENCES_HOTDEADPIXFILT;Apply hot/dead pixel filter !PREFERENCES_LINEDENOISE;Line noise filter -!PREFERENCES_OVERLAY_FILENAMES;Overlay filenames on thumbnails -!PREFERENCES_PROPERTY;Property -!PREFERENCES_SET;SET -!PROGRESSDLG_PROFILECHANGEDINBROWSER;Profile changed in browser -!SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists -!TP_DETAIL_AMOUNT;Amount -!TP_DIRPYRDENOISE_CHROMA;Chrominance -!TP_DIRPYRDENOISE_GAMMA;Gamma -!TP_DIRPYRDENOISE_LABEL;Directional Pyramid Noise Reduction -!TP_DIRPYRDENOISE_LUMA;Luminance -!TP_EQUALIZER_CONTRAST_MINUS;Contrast- -!TP_EQUALIZER_CONTRAST_PLUS;Contrast+ -!TP_EQUALIZER_FINEST;finest -!TP_EQUALIZER_LABEL;Wavelet equalizer -!TP_EQUALIZER_LARGEST;coarsest -!TP_EQUALIZER_NEUTRAL;Neutral -!TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction -!TP_IMPULSEDENOISE_THRESH;Threshold -!TP_LENSGEOM_AUTOCROP;Auto Crop -!TP_LENSGEOM_FILL;Auto Fill -!TP_LENSGEOM_LABEL;Lens / Geometry -!TP_PERSPECTIVE_HORIZONTAL;Horizontal -!TP_PERSPECTIVE_LABEL;Perspective -!TP_PERSPECTIVE_VERTICAL;Vertical -!TP_RESIZE_DOWNSCALEB;Downscale (Better) -!TP_RESIZE_DOWNSCALEF;Downscale (Faster) -!TP_RESIZE_HEIGHT;Height -!TP_RESIZE_SPECIFY;Specify: -!TP_RESIZE_WIDTH;Width -!ZOOMPANEL_100;(100%) -!ZOOMPANEL_NEWCROPWINDOW;Open (new) detail window -!ZOOMPANEL_ZOOM100;Zoom to 100% 1 -!ZOOMPANEL_ZOOMFITSCREEN;Fit to screen F -!ZOOMPANEL_ZOOMIN;Zoom In + -!ZOOMPANEL_ZOOMOUT;Zoom Out - +!TP_DIRPYRDENOISE_LABEL;Directional pyramid noise reduction +!TP_DIRPYREQUALIZER_LABEL;Directional pyramid equalizer diff --git a/rtdata/languages/Turkish b/rtdata/languages/Turkish index e9c6de3c6..dddc8e31f 100644 --- a/rtdata/languages/Turkish +++ b/rtdata/languages/Turkish @@ -600,7 +600,7 @@ ZOOMBAR_SMALL;Küçük !BATCHQUEUE_AUTOSTART;Auto start -!BATCH_PROCESSING;batch processing +!BATCH_PROCESSING;Batch processing !CURVEEDITOR_CUSTOM;Custom !CURVEEDITOR_DARKS;Darks !CURVEEDITOR_HIGHLIGHTS;Highlights @@ -651,6 +651,12 @@ ZOOMBAR_SMALL;Küçük !NAVIGATOR_G_VALUE;G = %1 !NAVIGATOR_H_NA;H = n/a !NAVIGATOR_H_VALUE;H = %1 +!NAVIGATOR_LAB_A_NA;A = n/a +!NAVIGATOR_LAB_A_VALUE;A = %1 +!NAVIGATOR_LAB_B_NA;B = n/a +!NAVIGATOR_LAB_B_VALUE;B = %1 +!NAVIGATOR_LAB_L_NA;L = n/a +!NAVIGATOR_LAB_L_VALUE;L = %1 !NAVIGATOR_R_NA;R = n/a !NAVIGATOR_R_VALUE;R = %1 !NAVIGATOR_S_NA;S = n/a @@ -658,25 +664,41 @@ ZOOMBAR_SMALL;Küçük !NAVIGATOR_V_NA;V = n/a !NAVIGATOR_V_VALUE;V = %1 !NAVIGATOR_XY_NA;x = n/a, y = n/a +!PARTIALPASTE_LABCURVE;Lab curve +!PARTIALPASTE_LABCURVE;Luminance curve !PREFERENCES_ADD;ADD !PREFERENCES_BATCH_PROCESSING;batch processing !PREFERENCES_BEHAVIOR;Behavior !PREFERENCES_CACORRECTION;Apply CA auto correction !PREFERENCES_DCBENHANCE;Apply DCB enhancement step !PREFERENCES_DCBITERATIONS;Number of DCB iterations +!PREFERENCES_DMETHODBATCH;Batch +!PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_GREENEQUIL;Green equilibration !PREFERENCES_HOTDEADPIXFILT;Apply hot/dead pixel filter !PREFERENCES_LINEDENOISE;Line noise filter +!PREFERENCES_MULTITAB;Multiple tabs mode !PREFERENCES_OVERLAY_FILENAMES;Overlay filenames on thumbnails !PREFERENCES_PROPERTY;Property +!PREFERENCES_SELECTFONT;Select font !PREFERENCES_SET;SET +!PREFERENCES_SINGLETAB;Single tab mode +!PREFERENCES_USESYSTEMTHEME; Use System Theme +!PREFERENCES_WORKFLOW;Workflow !PROGRESSDLG_PROFILECHANGEDINBROWSER;Profile changed in browser !SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists !TP_DETAIL_AMOUNT;Amount !TP_DIRPYRDENOISE_CHROMA;Chrominance !TP_DIRPYRDENOISE_GAMMA;Gamma -!TP_DIRPYRDENOISE_LABEL;Directional Pyramid Noise Reduction +!TP_DIRPYRDENOISE_LABEL;Directional pyramid noise reduction !TP_DIRPYRDENOISE_LUMA;Luminance +!TP_DIRPYREQUALIZER_LABEL;Directional pyramid equalizer +!TP_DIRPYREQUALIZER_LUMACOARSEST;Coarsest +!TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Contrast- +!TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;Contrast+ +!TP_DIRPYREQUALIZER_LUMAFINEST;Finest +!TP_DIRPYREQUALIZER_LUMANEUTRAL;Neutral +!TP_DIRPYREQUALIZER_THRESHOLD;Threshold !TP_EQUALIZER_CONTRAST_MINUS;Contrast- !TP_EQUALIZER_CONTRAST_PLUS;Contrast+ !TP_EQUALIZER_FINEST;finest @@ -685,6 +707,11 @@ ZOOMBAR_SMALL;Küçük !TP_EQUALIZER_NEUTRAL;Neutral !TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction !TP_IMPULSEDENOISE_THRESH;Threshold +!TP_LABCURVE_BRIGHTNESS;Brightness +!TP_LABCURVE_CONTRAST;Contrast +!TP_LABCURVE_CURVEEDITOR;Luminance Curve +!TP_LABCURVE_LABEL;Lab Curves +!TP_LABCURVE_SATURATION;Saturation !TP_LENSGEOM_AUTOCROP;Auto Crop !TP_LENSGEOM_FILL;Auto Fill !TP_LENSGEOM_LABEL;Lens / Geometry diff --git a/rtdata/languages/default b/rtdata/languages/default index 236d23aa8..72a1b51ad 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2,7 +2,7 @@ #01 Developers should add translations to this file and then run 'generateDifferences.sh' script to update other locales. ADJUSTER_RESET_TO_DEFAULT;Reset to default BATCHQUEUE_AUTOSTART;Auto start -BATCH_PROCESSING;batch processing +BATCH_PROCESSING;Batch processing CURVEEDITOR_CUSTOM;Custom CURVEEDITOR_DARKS;Darks CURVEEDITOR_FILEDLGFILTERANY;Any files @@ -345,6 +345,12 @@ NAVIGATOR_G_NA;G = n/a NAVIGATOR_G_VALUE;G = %1 NAVIGATOR_H_NA;H = n/a NAVIGATOR_H_VALUE;H = %1 +NAVIGATOR_LAB_A_NA;A = n/a +NAVIGATOR_LAB_A_VALUE;A = %1 +NAVIGATOR_LAB_B_NA;B = n/a +NAVIGATOR_LAB_B_VALUE;B = %1 +NAVIGATOR_LAB_L_NA;L = n/a +NAVIGATOR_LAB_L_VALUE;L = %1 NAVIGATOR_R_NA;R = n/a NAVIGATOR_R_VALUE;R = %1 NAVIGATOR_S_NA;S = n/a @@ -369,8 +375,9 @@ PARTIALPASTE_EXPOSURE;Exposure PARTIALPASTE_HLRECOVERY;Highlight recovery PARTIALPASTE_ICMSETTINGS;ICM settings PARTIALPASTE_IPTCINFO;IPTC info +PARTIALPASTE_LABCURVE;Lab curve +PARTIALPASTE_LABCURVE;Luminance curve PARTIALPASTE_LENSGROUP;Lens related settings -PARTIALPASTE_LUMACURVE;Luminance curve PARTIALPASTE_LUMADENOISE;Luminance noise reduction PARTIALPASTE_LUMINANCEGROUP;Luminance related settings PARTIALPASTE_METAICMGROUP;Metadata/ICM settings @@ -381,7 +388,7 @@ PARTIALPASTE_SHARPENING;Sharpening PARTIALPASTE_VIGNETTING;Vignetting correction PARTIALPASTE_WHITEBALANCE;White balance PREFERENCES_ADD;ADD -PREFERENCES_APPLNEXTSTARTUP;applied at next startup +PREFERENCES_APPLNEXTSTARTUP;restart required PREFERENCES_BATCH_PROCESSING;batch processing PREFERENCES_BEHAVIOR;Behavior PREFERENCES_BLINKCLIPPED;Blink clipped areas @@ -398,9 +405,6 @@ PREFERENCES_CACHESTRAT;Cache Strategy PREFERENCES_CACHETHUMBFORM;Cache Thumbnail Format PREFERENCES_CACHETHUMBHEIGHT;Maximal Thumbnail Height PREFERENCES_CACORRECTION;Apply CA auto correction -PREFERENCES_CLEARDLG_LINE1;Clearing cache -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 @@ -417,8 +421,10 @@ PREFERENCES_DIRLAST;Last visited directory PREFERENCES_DIROTHER;Other PREFERENCES_DIRSELECTDLG;Select Image Directory at Startup... PREFERENCES_DIRSOFTWARE;Installation directory -PREFERENCES_DMETHOD;Method +PREFERENCES_DMETHOD;Preview +PREFERENCES_DMETHODBATCH;Batch PREFERENCES_EDITORCMDLINE;Other command line +PREFERENCES_EDITORLAYOUT;Editor Layout PREFERENCES_EXTERNALEDITOR;External editor PREFERENCES_FALSECOLOR;False color suppression steps PREFERENCES_FBROWSEROPTS;File Browser Options @@ -440,12 +446,13 @@ PREFERENCES_INTENT_SATURATION;Saturation PREFERENCES_LINEDENOISE;Line noise filter PREFERENCES_LIVETHUMBNAILS;Live Thumbnails (slower) PREFERENCES_MONITORICC;Monitor Profile +PREFERENCES_MULTITAB;Multiple tabs mode PREFERENCES_OUTDIR;Output Directory PREFERENCES_OUTDIRFOLDER;Save to folder PREFERENCES_OUTDIRFOLDERHINT;Put the saved images to the selected folder -PREFERENCES_OUTDIRHINT;You can use the following formatting strings:\n%f, %d1, %d2, ..., %p1, %p2, ...\n\nThese formatting strings refer to the directories and sub-paths of the path of the raw file.\n\nFor example, if /home/tom/image/02-09-2006/dsc0012.nefhas been opened, the meaning of the formatting strings are:\n%f=dsc0012, %d1=02-09-2006, %d2=image, ...\n%p1=/home/tom/image/02-09-2006, %p2=/home/tom/image, %p3=/home/tom, ...\n\nIf you want to save the output image where the original is, write:\n%p1/%f\n\nIf you want to save the output image in a directory 'converted' located the directory of the original, write:\n%p1/converted/%f\n\nIf you want to save the output image in directory '/home/tom/converted' with keeping the same subdirectory of dates, write:\n%p2/converted/%d1/%f +PREFERENCES_OUTDIRHINT;You can use the following formatting strings:\n%f, %d1, %d2, ..., %p1, %p2, ...\n\nThese formatting strings refer to the different parts of the photo's pathname.\n\nFor example, if the photo being processed has the following pathname:\n/home/tom/photos/2010-10-31/dsc0042.nef\nthe meaning of the formatting strings are:\n%d4 = home\n%d3 = tom\n%d2 = photos\n%d1 = 2010-10-31\n%f = dsc0042\n%p1 = /home/tom/photos/2010-10-31/\n%p2 = /home/tom/photos/\n%p3 = /home/tom/\n%p4 = /home/\n\nIf you want to save the output image where the original is, write:\n%p1/%f\n\nIf you want to save the output image in a directory named "converted" located in the directory of the opened image, write:\n%p1/converted/%f\n\nIf you want to save the output image in a directory named "/home/tom/photos/converted/2010-10-31", write:\n%p2/converted/%d1/%f PREFERENCES_OUTDIRTEMPLATE;Use Template -PREFERENCES_OUTDIRTEMPLATEHINT;You can use the following formatting strings:\n%f, %d1, %d2, ..., %p1, %p2, ...\n\nThese formatting strings refer to the directories and sub-paths of the path of the raw file.\n\nFor example, if /home/tom/image/02-09-2006/dsc0012.nefhas been opened, the meaning of the formatting strings are:\n%f=dsc0012, %d1=02-09-2006, %d2=image, ...\n%p1=/home/tom/image/02-09-2006, %p2=/home/tom/image, %p3=/home/tom, ...\n\nIf you want to save the output image where the original is, write:\n%p1/%f\n\nIf you want to save the output image in a directory 'converted' located the directory of the original, write:\n%p1/converted/%f\n\nIf you want to save the output image in directory '/home/tom/converted' with keeping the same subdirectory of dates, write:\n%p2/converted/%d1/%f +PREFERENCES_OUTDIRTEMPLATEHINT;You can use the following formatting strings:\n%f, %d1, %d2, ..., %p1, %p2, ...\n\nThese formatting strings refer to the different parts of the photo's pathname.\n\nFor example, if the photo being processed has the following pathname:\n/home/tom/photos/2010-10-31/dsc0042.nef\nthe meaning of the formatting strings are:\n%d4 = home\n%d3 = tom\n%d2 = photos\n%d1 = 2010-10-31\n%f = dsc0042\n%p1 = /home/tom/photos/2010-10-31/\n%p2 = /home/tom/photos/\n%p3 = /home/tom/\n%p4 = /home/\n\nIf you want to save the output image where the original is, write:\n%p1/%f\n\nIf you want to save the output image in a directory named "converted" located in the directory of the opened image, write:\n%p1/converted/%f\n\nIf you want to save the output image in a directory named "/home/tom/photos/converted/2010-10-31", write:\n%p2/converted/%d1/%f PREFERENCES_OVERLAY_FILENAMES;Overlay filenames on thumbnails PREFERENCES_PARSEDEXT;Parsed Extensions PREFERENCES_PARSEDEXTADD;Add Extension @@ -459,6 +466,7 @@ PREFERENCES_PROFILESAVECACHE;Save Processing Parameters to the Cache PREFERENCES_PROFILESAVEINPUT;Save Processing Parameters Next to the Input File PREFERENCES_PROPERTY;Property PREFERENCES_PSPATH;Adobe Photoshop installation directory +PREFERENCES_SELECTFONT;Select font PREFERENCES_SELECTICCDIRDLG;Select ICC Profile Directory... PREFERENCES_SELECTLANG;Select language PREFERENCES_SELECTMONITORPROFDLG;Select ICC Profile of the Display... @@ -468,6 +476,7 @@ PREFERENCES_SHOWBASICEXIF;Show basic Exif info PREFERENCES_SHOWDATETIME;Show date and time PREFERENCES_SHOWONLYRAW;Show only RAW files PREFERENCES_SHTHRESHOLD;Threshold for clipped shadows +PREFERENCES_SINGLETAB;Single tab mode PREFERENCES_STARTUPIMDIR;Image directory at startup PREFERENCES_TAB_BROWSER;File Browser PREFERENCES_TAB_COLORMGR;Color Management @@ -475,6 +484,8 @@ PREFERENCES_TAB_GENERAL;General PREFERENCES_TAB_IMPROC;Image Processing PREFERENCES_TAB_OUTPUT;Output Options PREFERENCES_THUMBSIZE;Thumbnail Size +PREFERENCES_USESYSTEMTHEME; Use System Theme +PREFERENCES_WORKFLOW;Workflow PROFILEPANEL_FILEDLGFILTERANY;Any files PROFILEPANEL_FILEDLGFILTERPP;Postprocessing profiles PROFILEPANEL_LABEL;Postprocessing Profiles @@ -575,12 +586,12 @@ TP_DIRPYRDENOISE_CHROMA;Chrominance TP_DIRPYRDENOISE_GAMMA;Gamma TP_DIRPYRDENOISE_LABEL;Directional pyramid noise reduction TP_DIRPYRDENOISE_LUMA;Luminance +TP_DIRPYREQUALIZER_LABEL;Directional pyramid equalizer TP_DIRPYREQUALIZER_LUMACOARSEST;Coarsest TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Contrast- TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;Contrast+ TP_DIRPYREQUALIZER_LUMAFINEST;Finest TP_DIRPYREQUALIZER_LUMANEUTRAL;Neutral -TP_DIRPYREQUALIZER_LABEL;Directional pyramid equalizer TP_DIRPYREQUALIZER_THRESHOLD;Threshold TP_DISTORTION_AMOUNT;Amount TP_DISTORTION_LABEL;Distortion @@ -594,15 +605,15 @@ TP_EXPOSURE_AUTOLEVELS;Auto Levels TP_EXPOSURE_BLACKLEVEL;Black TP_EXPOSURE_BRIGHTNESS;Brightness TP_EXPOSURE_CLIP;Clip -TP_EXPOSURE_COMPRHIGHLIGHTS;Highlight compression -TP_EXPOSURE_COMPRSHADOWS;Shadow compression +TP_EXPOSURE_COMPRHIGHLIGHTS;Highlight recovery +TP_EXPOSURE_COMPRSHADOWS;Shadow recovery TP_EXPOSURE_CONTRAST;Contrast TP_EXPOSURE_CURVEEDITOR;Tone Curve TP_EXPOSURE_EXPCOMP;Exp. Comp. TP_EXPOSURE_LABEL;Exposure TP_HLREC_CIELAB;CIELab Blending TP_HLREC_COLOR;Color Propagation -TP_HLREC_LABEL;Highlight Recovery +TP_HLREC_LABEL;Highlight Reconstruction TP_HLREC_LUMINANCE;Luminance Recovery TP_HLREC_METHOD;Method: TP_ICM_FILEDLGFILTERANY;Any files @@ -621,16 +632,14 @@ TP_ICM_SAVEREFERENCE;Save reference image for profiling TP_ICM_WORKINGPROFILE;Working Profile TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction TP_IMPULSEDENOISE_THRESH;Threshold +TP_LABCURVE_BRIGHTNESS;Brightness +TP_LABCURVE_CONTRAST;Contrast +TP_LABCURVE_CURVEEDITOR;Luminance Curve +TP_LABCURVE_LABEL;Lab Curves +TP_LABCURVE_SATURATION;Saturation TP_LENSGEOM_AUTOCROP;Auto Crop TP_LENSGEOM_FILL;Auto Fill TP_LENSGEOM_LABEL;Lens / Geometry -TP_LUMACURVE_BLACKLEVEL;Black -TP_LUMACURVE_BRIGHTNESS;Brightness -TP_LUMACURVE_COMPRHIGHLIGHTS;Highlight compression -TP_LUMACURVE_COMPRSHADOWS;Shadow compression -TP_LUMACURVE_CONTRAST;Contrast -TP_LUMACURVE_CURVEEDITOR;Luminance Curve -TP_LUMACURVE_LABEL;Luminance Curve TP_LUMADENOISE_EDGETOLERANCE;Edge Tolerance TP_LUMADENOISE_LABEL;Luminance Noise Reduction TP_LUMADENOISE_RADIUS;Radius @@ -683,6 +692,10 @@ TP_SHARPENING_USM;Unsharp Mask TP_VIGNETTING_AMOUNT;Amount TP_VIGNETTING_LABEL;Vignetting Correction TP_VIGNETTING_RADIUS;Radius +TP_VIGNETTING_STRENGTH;Strength +TP_VIGNETTING_CENTER_X;Center X +TP_VIGNETTING_CENTER_Y;Center Y +TP_VIGNETTING_CENTER;Center TP_WBALANCE_AUTO;Auto TP_WBALANCE_CAMERA;Camera TP_WBALANCE_CUSTOM;Custom diff --git a/rtdata/options/options.lin b/rtdata/options/options.lin index aa64fe988..02016e9e4 100644 --- a/rtdata/options/options.lin +++ b/rtdata/options/options.lin @@ -1,5 +1,6 @@ [General] +TabbedEditor=true StoreLastProfile=true StartupDirectory=last StartupPath= @@ -9,6 +10,7 @@ DualProcSupport=true MultiUser=true Language=English (US) Theme=Gray +UseSystemTheme=false Version=300 FirstRun=true @@ -39,6 +41,9 @@ RenameUseTemplates=false ThumbnailZoomRatios=0.2;0.3;0.45;0.6;0.8;1; OverlayedFileNames=true +# if TRUE, only fast, internal preview images are taken if the image is not edited yet +InternalThumbIfUntouched=true + [Clipping Indication] HighlightThreshold=253 ShadowThreshold=8 @@ -56,6 +61,9 @@ PathFolder= UsePathTemplate=true LastSaveAsPath= +# if TRUE, existing output JPGs/PNGs are overwritten, instead of adding ..-1.jpg, -2.jpg etc. +OverwriteOutputFile=false + [Profiles] Directory=profiles RawDefault=default @@ -85,6 +93,7 @@ ToolPanelsExpanded=1;1;0;0;0;1;1;0;0;0;0;1;1;0;0;0;0;0; [Algorithms] DemosaicMethod=hphd +DemosaicMethodBatch=hphd ColorCorrection=1 [Crop Settings] diff --git a/rtdata/options/options.osx b/rtdata/options/options.osx index a7c5e6ec3..f05215ae6 100644 --- a/rtdata/options/options.osx +++ b/rtdata/options/options.osx @@ -1,5 +1,6 @@ [General] +TabbedEditor=true StoreLastProfile=true StartupDirectory=last StartupPath= @@ -9,6 +10,7 @@ DualProcSupport=true MultiUser=true Language=English (US) Theme=Gray Textured +UseSystemTheme=false Version=300 FirstRun=true @@ -39,6 +41,9 @@ RenameUseTemplates=false ThumbnailZoomRatios=0.2;0.3;0.45;0.6;0.8;1; OverlayedFileNames=true +# if TRUE, only fast, internal preview images are taken if the image is not edited yet +InternalThumbIfUntouched=true + [Clipping Indication] HighlightThreshold=253 ShadowThreshold=8 @@ -56,6 +61,9 @@ PathFolder= UsePathTemplate=true LastSaveAsPath= +# if TRUE, existing output JPGs/PNGs are overwritten, instead of adding ..-1.jpg, -2.jpg etc. +OverwriteOutputFile=false + [Profiles] Directory=profiles RawDefault=default @@ -85,6 +93,7 @@ ToolPanelsExpanded=1;1;0;0;0;1;1;0;0;0;0;1;1;0;0;0;0;0; [Algorithms] DemosaicMethod=hphd +DemosaicMethodBatch=hphd ColorCorrection=1 [Crop Settings] diff --git a/rtdata/options/options.win b/rtdata/options/options.win index f589ba814..8834ed124 100644 --- a/rtdata/options/options.win +++ b/rtdata/options/options.win @@ -1,5 +1,6 @@ [General] +TabbedEditor=true StoreLastProfile=true StartupDirectory=last StartupPath= @@ -9,6 +10,7 @@ DualProcSupport=true MultiUser=true Language=English (US) Theme=Gray +UseSystemTheme=false Version=300 FirstRun=true @@ -39,6 +41,9 @@ RenameUseTemplates=false ThumbnailZoomRatios=0.2;0.3;0.45;0.6;0.8;1; OverlayedFileNames=true +# if TRUE, only fast, internal preview images are taken if the image is not edited yet +InternalThumbIfUntouched=true + [Clipping Indication] HighlightThreshold=253 ShadowThreshold=8 @@ -56,6 +61,9 @@ PathFolder= UsePathTemplate=true LastSaveAsPath= +# if TRUE, existing output JPGs/PNGs are overwritten, instead of adding ..-1.jpg, -2.jpg etc. +OverwriteOutputFile=false + [Profiles] Directory=profiles RawDefault=default @@ -85,6 +93,7 @@ ToolPanelsExpanded=1;1;0;0;0;1;1;0;0;0;0;1;1;0;0;0;0;0; [Algorithms] DemosaicMethod=hphd +DemosaicMethodBatch=hphd ColorCorrection=1 [Crop Settings] diff --git a/rtdata/profiles/crisp.pp3 b/rtdata/profiles/crisp.pp3 index b49fe52b4..75b7910cc 100644 --- a/rtdata/profiles/crisp.pp3 +++ b/rtdata/profiles/crisp.pp3 @@ -1,16 +1,16 @@ [Version] -Version=231 +Version=466 [Exposure] Auto=true -Clip=0.02 +Clip=0.001 Compensation=0 Brightness=0 Contrast=12 Black=0 -HighlightCompr=100 -ShadowCompr=100 +HighlightCompr=70 +ShadowCompr=25 Curve=1;0;0;1;1; [Channel Mixer] diff --git a/rtdata/profiles/default.pp3 b/rtdata/profiles/default.pp3 index a76f8d10c..fd8f1c188 100644 --- a/rtdata/profiles/default.pp3 +++ b/rtdata/profiles/default.pp3 @@ -1,16 +1,16 @@ [Version] -Version=231 +Version=466 [Exposure] Auto=true -Clip=0.01 +Clip=0.001 Compensation=0 Brightness=0 Contrast=0 Black=0 -HighlightCompr=100 -ShadowCompr=100 +HighlightCompr=70 +ShadowCompr=25 Curve=1;0;0;1;1; [Channel Mixer] diff --git a/rtdata/profiles/neutral.pp3 b/rtdata/profiles/neutral.pp3 index 7d9000170..6c8070367 100644 --- a/rtdata/profiles/neutral.pp3 +++ b/rtdata/profiles/neutral.pp3 @@ -1,16 +1,16 @@ [Version] -Version=231 +Version=466 [Exposure] Auto=false -Clip=0.01 +Clip=0.001 Compensation=0 Brightness=0 Contrast=0 Black=0 -HighlightCompr=100 -ShadowCompr=100 +HighlightCompr=70 +ShadowCompr=25 Curve=1;0;0;1;1; [Channel Mixer] diff --git a/rtdata/themes/ClearLooks (Dark Orange) b/rtdata/themes/ClearLooks (Dark Orange) index dc86995e6..281bd7c01 100644 --- a/rtdata/themes/ClearLooks (Dark Orange) +++ b/rtdata/themes/ClearLooks (Dark Orange) @@ -21,9 +21,8 @@ # Color scheme contributed by Franco Gotusso based on Clearlooks-DarkCoffee by Chibi # and edited by bvc as Clearlooks-DarkCoffee2. Downloaded from http://art.gnome.org/themes/gtk2/1065 -style "clearlooks-default" -{ - font_name = "sans 8" +style "clearlooks-default" { + GtkMenuItem::selected_shadow_type = none GtkWidget::interior_focus = 1 GtkButton::default_border = { 3, 3, 3, 3 } diff --git a/rtdata/themes/Dark b/rtdata/themes/Dark index 3d1d6dded..06ddc5e25 100644 --- a/rtdata/themes/Dark +++ b/rtdata/themes/Dark @@ -23,10 +23,8 @@ # which is based on Bluecurve # Created by Richard Stellingwerff, Emil Jacobs and Daniel Borgmann. +style "clearlooks-default" { -style "clearlooks-default" -{ - font_name = "sans 8" GtkButton ::default_border = { 0, 0, 0, 0 } GtkComboBox ::default_border = { 0, 0, 0, 0 } GtkRange ::trough_border = 0 diff --git a/rtdata/themes/Default b/rtdata/themes/Default index 600eeefa2..92aa17c3a 100644 --- a/rtdata/themes/Default +++ b/rtdata/themes/Default @@ -23,10 +23,8 @@ # which is based on Bluecurve # Created by Richard Stellingwerff, Emil Jacobs and Daniel Borgmann. +style "clearlooks-default" { -style "clearlooks-default" -{ - font_name = "sans 8" GtkButton ::default_border = { 0, 0, 0, 0 } GtkRange ::trough_border = 0 GtkPaned ::handle_size = 6 diff --git a/rtdata/themes/Gray b/rtdata/themes/Gray index 9a5cf0170..c43833218 100644 --- a/rtdata/themes/Gray +++ b/rtdata/themes/Gray @@ -17,9 +17,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -style "theme-default" { - - font_name = "sans 8" +style "clearlooks-default" { GtkButton ::default_border = { 0, 0, 0, 0 } GtkRange ::trough_border = 1 @@ -65,31 +63,31 @@ style "theme-default" { } } -style "theme-wide" = "theme-default" { +style "clearlooks-wide" = "clearlooks-default" { xthickness = 3 ythickness = 3 } -style "theme-text" = "theme-default" { +style "clearlooks-text" = "clearlooks-default" { #base[SELECTED] = "#fc9747" # Outline? } -style "theme-toolbar" = "theme-default" { +style "clearlooks-toolbar" = "clearlooks-default" { bg[NORMAL] = "#A1A1A1" } -style "theme-tasklist" = "theme-default" { +style "clearlooks-tasklist" = "clearlooks-default" { xthickness = 5 ythickness = 3 } -style "theme-menu" = "theme-default" { +style "clearlooks-menu" = "clearlooks-default" { xthickness = 2 ythickness = 2 bg[NORMAL] = "#A1A1A1" } -style "theme-menu-item" = "theme-default" { +style "clearlooks-menu-item" = "clearlooks-default" { xthickness = 1 ythickness = 1 fg[PRELIGHT] = "#ffffff" @@ -97,60 +95,60 @@ style "theme-menu-item" = "theme-default" { base[PRELIGHT] = "#A1A1A1" } -style "theme-menu-itembar" = "theme-default" { +style "clearlooks-menu-itembar" = "clearlooks-default" { xthickness = 0 ythickness = 0 } -style "theme-tree" = "theme-default" { +style "clearlooks-tree" = "clearlooks-default" { xthickness = 2 ythickness = 2 GtkTreeView::odd_row_color = "#f7f7ff" GtkTreeView::even_row_color = "#ffffff" } -style "theme-frame-title" = "theme-default" { +style "clearlooks-frame-title" = "clearlooks-default" { fg[NORMAL] = "#2a2a2a" } -style "theme-panel" = "theme-default" { +style "clearlooks-panel" = "clearlooks-default" { xthickness = 3 ythickness = 3 } -style "theme-tooltips" = "theme-default" { +style "clearlooks-tooltips" = "clearlooks-default" { xthickness = 4 ythickness = 4 bg[NORMAL] = { 1.0,1.0,0.75 } } -style "theme-progressbar" = "theme-default" { +style "clearlooks-progressbar" = "clearlooks-default" { xthickness = 1 ythickness = 1 fg[PRELIGHT] = "#ffffff" } -style "theme-combo" = "theme-default" { +style "clearlooks-combo" = "clearlooks-default" { xthickness = 2 ythickness = 0 } -style "theme-button" = "theme-wide" { +style "clearlooks-button" = "clearlooks-wide" { xthickness = 1 ythickness = 1 #bg[NORMAL] = "#31353A" #bg[PRELIGHT] = "#555555" #bg[NORMAL] = "#31353A" } -style "theme-check" = "theme-button" { +style "clearlooks-check" = "clearlooks-button" { } -style "theme-panel" = "theme-default" { +style "clearlooks-panel" = "clearlooks-default" { xthickness = 3 ythickness = 3 } -style "theme-notebook" = "theme-wide" { +style "clearlooks-notebook" = "clearlooks-wide" { base[SELECTED] = "#A1A1A1" bg[ACTIVE] = "#A1A1A1" base[PRELIGHT] = "#A1A1A1" @@ -161,7 +159,7 @@ style "metacity-frame" { bg[SELECTED] = "#5c82b5" } -style "theme-slab" = "theme-default" { +style "clearlooks-slab" = "clearlooks-default" { bg[SELECTED] = "#84b0da" bg[NORMAL] = "#fdfbf7" bg[ACTIVE] = "#e9eef5" @@ -169,11 +167,11 @@ style "theme-slab" = "theme-default" { fg[INSENSITIVE] = "#5c8dbf" } -style "theme-slab-group" = "theme-default" { +style "clearlooks-slab-group" = "clearlooks-default" { #bg[SELECTED] = "#adc09b" # Slab group text } -style "theme-shell" = "theme-default" { +style "clearlooks-shell" = "clearlooks-default" { bg[ACTIVE] = "#e9eef5" # Left side bg color fg[NORMAL] = "#5c8dbf" # Left side text color fg[INSENSITIVE] = "#bdcce1" # Left side line @@ -189,53 +187,47 @@ style "evolution-hack" = "clearlooks-default" { fg[SELECTED] = "#ffffff" } -style "theme-shell-highlight" = "theme-default" { +style "clearlooks-shell-highlight" = "clearlooks-default" { } -style "extra-view" { - bg[NORMAL] = "#729fcf" - font = "Sans 6" -} - -style "rox" = "theme-default" { +style "rox" = "clearlooks-default" { bg[NORMAL] = "#ffffff" bg[ACTIVE] = "#ffffff" fg[NORMAL] = "#000000" fg[ACTIVE] = "#000000" } -class "GtkWidget" style "theme-default" -class "GtkButton" style "theme-button" -class "GtkCombo" style "theme-button" -class "GtkRange" style "theme-wide" -class "GtkFrame" style "theme-wide" -class "GtkMenu" style "theme-menu" -class "GtkEntry" style "theme-button" -class "GtkMenuItem" style "theme-menu-item" -class "GtkStatusbar" style "theme-wide" -class "GtkNotebook" style "theme-notebook" -class "GtkProgressBar" style "theme-progressbar" -class "GtkCheckButton" style "theme-check" -class "GtkRadioButton" style "theme-check" +class "GtkWidget" style "clearlooks-default" +class "GtkButton" style "clearlooks-button" +class "GtkCombo" style "clearlooks-button" +class "GtkRange" style "clearlooks-wide" +class "GtkFrame" style "clearlooks-wide" +class "GtkMenu" style "clearlooks-menu" +class "GtkEntry" style "clearlooks-button" +class "GtkMenuItem" style "clearlooks-menu-item" +class "GtkStatusbar" style "clearlooks-wide" +class "GtkNotebook" style "clearlooks-notebook" +class "GtkProgressBar" style "clearlooks-progressbar" +class "GtkCheckButton" style "clearlooks-check" +class "GtkRadioButton" style "clearlooks-check" -widget_class "*MenuItem.*" style "theme-menu-item" -widget_class "*.GtkComboBox.GtkButton" style "theme-combo" -widget_class "*.GtkCombo.GtkButton" style "theme-combo" -widget_class "*.tooltips.*.GtkToggleButton" style "theme-tasklist" -widget "gtk-tooltip" style "theme-tooltips" -widget_class "*.GtkTreeView.GtkButton" style "theme-tree" -widget_class "*.GtkCTree.GtkButton" style "theme-tree" -widget_class "*.GtkList.GtkButton" style "theme-tree" -widget_class "*.GtkCList.GtkButton" style "theme-tree" -widget_class "*.GtkFrame.GtkLabel" style "theme-frame-title" -widget_class "*.GtkNotebook.*.GtkEventBox" style "theme-notebook" -widget_class "*.GtkNotebook.*.GtkViewport" style "theme-notebook" +widget_class "*MenuItem.*" style "clearlooks-menu-item" +widget_class "*.GtkComboBox.GtkButton" style "clearlooks-combo" +widget_class "*.GtkCombo.GtkButton" style "clearlooks-combo" +widget_class "*.tooltips.*.GtkToggleButton" style "clearlooks-tasklist" +widget "gtk-tooltip" style "clearlooks-tooltips" +widget_class "*.GtkTreeView.GtkButton" style "clearlooks-tree" +widget_class "*.GtkCTree.GtkButton" style "clearlooks-tree" +widget_class "*.GtkList.GtkButton" style "clearlooks-tree" +widget_class "*.GtkCList.GtkButton" style "clearlooks-tree" +widget_class "*.GtkFrame.GtkLabel" style "clearlooks-frame-title" +widget_class "*.GtkNotebook.*.GtkEventBox" style "clearlooks-notebook" +widget_class "*.GtkNotebook.*.GtkViewport" style "clearlooks-notebook" class "MetaFrames" style "metacity-frame" -widget_class "BasePWidget.GtkEventBox.GtkTable.GtkFrame" style "theme-panel" -widget "*.nautilus-extra-view-widget" style:highest "extra-view" -class "SlabWindow" style "theme-slab" -class "ShellWindow" style "theme-shell" -widget_class "ShellWindow.*.GtkEventBox" style "theme-shell-highlight" +widget_class "BasePWidget.GtkEventBox.GtkTable.GtkFrame" style "clearlooks-panel" +class "SlabWindow" style "clearlooks-slab" +class "ShellWindow" style "clearlooks-shell" +widget_class "ShellWindow.*.GtkEventBox" style "clearlooks-shell-highlight" widget_class "*GtkCTree*" style "evolution-hack" widget_class "*GtkList*" style "evolution-hack" widget_class "*GtkCList*" style "evolution-hack" diff --git a/rtdata/themes/Gray Textured b/rtdata/themes/Gray Textured index f906abd87..bdaa0d8be 100644 --- a/rtdata/themes/Gray Textured +++ b/rtdata/themes/Gray Textured @@ -22,17 +22,8 @@ # Modified by Wyatt Olson. # Sneaking through the code are we.? ;) -style "clearlooks-default" -{ - #This is actually just a non-existant font to force RT to load - # the default system font. On OSX the GTK default will show some - # incorrect ligatures (e.g., fi is interpreted as the double dagger - # symbol), but by reverting to system default it works. You could - # actually use any non-font here and it will work, e.g. "Foo". To - # change it to use an actual font, enter the full name of the font - # here, along with optional style and size, e.g. - # "Monaco Bold 15". - font_name = "sans 10" + +style "clearlooks-default" { GtkRange::trough_border = 0 GtkRange::slider_width = 14 diff --git a/rtdata/themes/Light b/rtdata/themes/Light index 05e7d6621..383034a59 100644 --- a/rtdata/themes/Light +++ b/rtdata/themes/Light @@ -21,9 +21,8 @@ # Created by Richard Stellingwerff, Emil Jacobs and Daniel Borgmann. -style "clearlooks-default" -{ - font_name = "sans 8" +style "clearlooks-default" { + GtkButton ::default_border = { 0, 0, 0, 0 } GtkRange ::trough_border = 0 GtkPaned ::handle_size = 6 diff --git a/rtdata/themes/Unity_Gray b/rtdata/themes/Unity_Gray new file mode 100644 index 000000000..b70e09ac4 --- /dev/null +++ b/rtdata/themes/Unity_Gray @@ -0,0 +1,453 @@ +# Set GtkSettings color scheme property. +# This can be overriden (via an xsetting) with eg. the gnome-appearance-properties. +gtk_color_scheme = "fg_color:#0A0A0A\nbg_color:#A1A1A1\nbase_color:#dddddd\ntext_color:#000\nselected_bg_color:#95B0DB\nselected_fg_color:#fff\ntooltip_bg_color:#F5F5B5\ntooltip_fg_color:#000" + +style "clearlooks-default" +{ + ######## + # Style Properties + ######## + GtkButton ::child-displacement-x = 1 + GtkButton ::child-displacement-y = 1 + GtkButton ::default-border = { 0, 0, 0, 0 } + GtkCheckButton ::indicator-size = 14 + + GtkPaned ::handle-size = 6 + + GtkRange ::trough-border = 0 + GtkRange ::slider-width = 15 + GtkRange ::stepper-size = 15 + + GtkScale ::slider-length = 23 + GtkScale ::trough-side-details = 1 + GtkScrollbar ::min-slider-length = 30 + + GtkMenuBar ::internal-padding = 0 + GtkExpander ::expander-size = 14 + GtkToolbar ::internal-padding = 1 + GtkTreeView ::expander-size = 12 + GtkTreeView ::vertical-separator = 0 + + GtkMenu ::horizontal-padding = 0 + GtkMenu ::vertical-padding = 0 + + # Glow the tasklist by changing the color, instead of overlaying it with a rectangle + WnckTasklist ::fade-overlay-rect = 0 + + xthickness = 1 + ythickness = 1 + + + fg[NORMAL] = @fg_color + fg[PRELIGHT] = @fg_color + fg[SELECTED] = @selected_fg_color + fg[ACTIVE] = @fg_color + fg[INSENSITIVE] = darker (@bg_color) + + bg[NORMAL] = @bg_color + bg[PRELIGHT] = shade (1.02, @bg_color) + bg[SELECTED] = @selected_bg_color + bg[INSENSITIVE] = @bg_color + bg[ACTIVE] = shade (0.9, @bg_color) + + base[NORMAL] = @base_color + base[PRELIGHT] = shade (0.95, @bg_color) + base[ACTIVE] = shade (0.9, @selected_bg_color) + base[SELECTED] = @selected_bg_color + base[INSENSITIVE] = @bg_color + + text[NORMAL] = @text_color + text[PRELIGHT] = @text_color + text[ACTIVE] = @selected_fg_color + text[SELECTED] = @selected_fg_color + text[INSENSITIVE] = darker (@bg_color) + + engine "clearlooks" + { + colorize_scrollbar = TRUE + reliefstyle = 1 + menubarstyle = 2 # 0 = flat, 1 = sunken, 2 = flat gradient + toolbarstyle = 1 # 0 = flat, 1 = enable effects + animation = FALSE + style = GUMMY + radius = 4.0 + + # Set a hint to disable backward compatibility fallbacks. + hint = "use-hints" + } +} + +style "clearlooks-wide" +{ + xthickness = 2 + ythickness = 2 +} + +style "clearlooks-wider" +{ + xthickness = 3 + ythickness = 3 +} + +style "clearlooks-button" +{ + xthickness = 3 + ythickness = 3 + + bg[NORMAL] = shade (1.07, @bg_color) + bg[PRELIGHT] = shade (1.09, @bg_color) + bg[ACTIVE] = shade (0.85, @bg_color) + + engine "clearlooks" + { + hint = "scrollbar" + radius = 5.0 + } +} + +style "clearlooks-notebook-bg" +{ + bg[NORMAL] = shade (1.05, @bg_color) + bg[ACTIVE] = shade (0.98, @bg_color) +} + +style "clearlooks-notebook" = "clearlooks-notebook-bg" +{ + xthickness = 3 + ythickness = 3 +} + +style "clearlooks-tasklist" +{ + xthickness = 5 + ythickness = 3 +} + +style "clearlooks-menu" +{ + xthickness = 0 + ythickness = 0 + + bg[NORMAL] = shade (1.09, @bg_color) + + # Radius of the menu items (inside menus) + engine "clearlooks" + { + radius = 0.0 + } +} + +style "clearlooks-menu-item" +{ + xthickness = 2 + ythickness = 3 + + fg[PRELIGHT] = @selected_fg_color +} + +style "clearlooks-separator-menu-item" +{ + GtkSeparatorMenuItem::horizontal-padding = 0 + # We are setting the desired height by using wide-separators + # There is no other way to get the odd height ... + GtkWidget::wide-separators = 1 + GtkWidget::separator-width = 1 + GtkWidget::separator-height = 5 + xthickness = 1 + ythickness = 0 +} + +style "clearlooks-treeview" +{ + engine "clearlooks" { + hint = "treeview" + } +} + +# Based on the default style so that the colors from the button +# style are overriden again. +style "clearlooks-treeview-header" = "clearlooks-default" +{ + xthickness = 2 + ythickness = 1 + + bg[NORMAL] = shade (1.07, @bg_color) + + engine "clearlooks" { + hint = "treeview-header" + } +} + +style "clearlooks-frame-title" +{ + fg[NORMAL] = lighter (@fg_color) +} + +style "clearlooks-tooltips" +{ + xthickness = 4 + ythickness = 4 + + bg[NORMAL] = @tooltip_bg_color + fg[NORMAL] = @tooltip_fg_color +} + +style "clearlooks-progressbar" +{ + xthickness = 1 + ythickness = 1 + + fg[PRELIGHT] = @selected_fg_color + + engine "clearlooks" + { + # Explicitly set the radius, for progress + # bars inside menuitems + radius = 3.0 + + hint = "progressbar" + } +} + +style "clearlooks-statusbar" +{ + engine "clearlooks" + { + hint = "statusbar" + } +} + +style "clearlooks-comboboxentry" +{ + # NOTE: + # If you set the appears-as-list option on comboboxes in the theme + # you should set this hint on the combobox instead. + engine "clearlooks" + { + hint = "comboboxentry" + } +} + +style "clearlooks-spinbutton" +{ + engine "clearlooks" + { + hint = "spinbutton" + } +} + +style "clearlooks-scale-bg" +{ + bg[NORMAL] = shade (1.07, @bg_color) + bg[PRELIGHT] = shade (1.09, @bg_color) +} + +style "clearlooks-scale" = "clearlooks-scale-bg" +{ + engine "clearlooks" + { + hint = "scale" + } +} + +style "clearlooks-hscale" = "clearlooks-scale-bg" +{ + engine "clearlooks" + { + hint = "hscale" + } +} + +style "clearlooks-vscale" = "clearlooks-scale-bg" +{ + engine "clearlooks" + { + hint = "vscale" + } +} + +style "clearlooks-scrollbar" +{ + bg[NORMAL] = shade (1.07, @bg_color) + + engine "clearlooks" + { + hint = "scrollbar" + } +} + +style "clearlooks-hscrollbar" +{ + engine "clearlooks" + { + hint = "hscrollbar" + } +} + +style "clearlooks-vscrollbar" +{ + engine "clearlooks" + { + hint = "vscrollbar" + } +} + +style "clearlooks-toolbar" +{ + bg[NORMAL] = shade (1.07, @bg_color) + + engine "clearlooks" { + contrast = 1.16 + } +} + +style "clearlooks-menubar" +{ + engine "clearlooks" + { + contrast = 1.1 + hint = "menubar" + } +} + +style "clearlooks-nautilus-location" +{ + bg[NORMAL] = mix(0.60, shade (1.05,@bg_color), @selected_bg_color) +} + + +######################################### +# Matches +######################################### + +# Clearlooks default style is applied to every widget +class "GtkWidget" style "clearlooks-default" + +# Increase the x/ythickness in some widgets +class "GtkToolbar" style "clearlooks-toolbar" +class "GtkRange" style "clearlooks-wide" +class "GtkFrame" style "clearlooks-wide" +class "GtkSeparator" style "clearlooks-wide" +class "GtkEntry" style "clearlooks-wider" + +class "GtkSpinButton" style "clearlooks-spinbutton" +class "GtkScale" style "clearlooks-scale" +class "GtkVScale" style "clearlooks-vscale" +class "GtkHScale" style "clearlooks-hscale" +class "GtkScrollbar" style "clearlooks-scrollbar" +class "GtkVScrollbar" style "clearlooks-vscrollbar" +class "GtkHScrollbar" style "clearlooks-hscrollbar" + +# General matching following, the order is choosen so that the right styles override each other +# eg. progressbar needs to be more important then the menu match. + +# This is not perfect, it could be done better +# (That is modify *every* widget in the notebook, and change those back that +# we really don't want changed) +widget_class "**" style "clearlooks-notebook-bg" +widget_class "**" style "clearlooks-notebook-bg" +widget_class "**" style "clearlooks-notebook-bg" + +widget_class "*" style "clearlooks-button" +widget_class "*" style "clearlooks-notebook" +widget_class "**" style "clearlooks-statusbar" + +widget_class "**" style "clearlooks-comboboxentry" +widget_class "**" style "clearlooks-comboboxentry" + +widget_class "**" style "clearlooks-menubar" +widget_class "**" style "clearlooks-menu" +widget_class "**" style "clearlooks-menu-item" +widget_class "**" style "clearlooks-separator-menu-item" + +widget_class "*.." style "clearlooks-frame-title" +widget_class "*.*" style "clearlooks-treeview" + +widget_class "*" style "clearlooks-progressbar" + +# Treeview header +widget_class "*.." style "clearlooks-treeview-header" +widget_class "*.." style "clearlooks-treeview-header" +widget_class "*.." style "clearlooks-treeview-header" +widget_class "*.." style "clearlooks-treeview-header" + +# Workarounds for Evolution +widget_class "*.ETable.ECanvas" style "clearlooks-treeview-header" +widget_class "*.ETree.ECanvas" style "clearlooks-treeview-header" + +# The window of the tooltip is called "gtk-tooltip" +################################ +# FIXME: +# This will not work if one embeds eg. a button into the tooltip. +# As far as I can tell right now we will need to rework the theme +# quite a bit to get this working correctly. +# (It will involve setting different priorities, etc.) +################################ +widget "gtk-tooltip*" style "clearlooks-tooltips" + +################################################### +# Special cases and work arounds +################################################### + +# Special case the nautilus-extra-view-widget +# ToDo: A more generic approach for all applications that have a widget like this. +widget "*.nautilus-extra-view-widget" style : highest "clearlooks-nautilus-location" + +# Work around for http://bugzilla.gnome.org/show_bug.cgi?id=382646 +# Note that the work around assumes that the combobox is _not_ in +# appears-as-list mode. +# Similar hack also in the menuitem style. +# This style does not affect GtkComboBoxEntry, it does have an effect +# on comboboxes in appears-as-list mode though. +style "clearlooks-text-is-fg-color-workaround" +{ + text[NORMAL] = @fg_color + text[PRELIGHT] = @fg_color + text[SELECTED] = @selected_fg_color + text[ACTIVE] = @fg_color + text[INSENSITIVE] = darker (@bg_color) +} +widget_class "*.." style "clearlooks-text-is-fg-color-workaround" + +style "clearlooks-menuitem-text-is-fg-color-workaround" +{ + text[NORMAL] = @fg_color + text[PRELIGHT] = @selected_fg_color + text[SELECTED] = @selected_fg_color + text[ACTIVE] = @fg_color + text[INSENSITIVE] = darker (@bg_color) +} +widget "*.gtk-combobox-popup-menu.*" style "clearlooks-menuitem-text-is-fg-color-workaround" + +# Work around the usage of GtkLabel inside GtkListItems to display text. +# This breaks because the label is shown on a background that is based on the +# base color set. +style "clearlooks-fg-is-text-color-workaround" +{ + fg[NORMAL] = @text_color + fg[PRELIGHT] = @text_color + fg[ACTIVE] = @selected_fg_color + fg[SELECTED] = @selected_fg_color + fg[INSENSITIVE] = darker (@bg_color) +} +widget_class "**" style "clearlooks-fg-is-text-color-workaround" +# The same problem also exists for GtkCList and GtkCTree +# Only match GtkCList and not the parent widgets, because that would also change the headers. +widget_class "*" style "clearlooks-fg-is-text-color-workaround" + +# Work around the evolution "New" button bug by making the toolbar flat. +# http://bugzilla.gnome.org/show_bug.cgi?id=446953 +# Maybe remove this workaround in unstable releases. +style "clearlooks-evo-new-button-workaround" +{ + GtkMenuBar ::shadow-type = GTK_SHADOW_NONE + GtkToolbar ::shadow-type = GTK_SHADOW_NONE + + bg[NORMAL] = @bg_color + + engine "clearlooks" + { + toolbarstyle = 0 + } +} +widget_class "EShellWindow.GtkVBox.BonoboDock.BonoboDockBand.BonoboDockItem*" style "clearlooks-evo-new-button-workaround" diff --git a/rtengine/CA_correct_RT.cc b/rtengine/CA_correct_RT.cc index 86ca4a973..69f4f14b6 100644 --- a/rtengine/CA_correct_RT.cc +++ b/rtengine/CA_correct_RT.cc @@ -382,8 +382,8 @@ void RawImageSource::CA_correct_RT() { // along line segments, find the point along each segment that minimizes the color variance // averaged over the tile; evaluate for up/down and left/right away from R/B grid point - for (rr=8; rr < rr1-8; rr++) - for (cc=8+(FC(rr,2)&1), indx=rr*TS+cc, c = FC(rr,cc); cc < cc1-8; cc+=2, indx+=2) { + for (rr=rrmin+8; rr < rrmax-8; rr++) + for (cc=ccmin+8+(FC(rr,2)&1), indx=rr*TS+cc, c = FC(rr,cc); cc < ccmax-8; cc+=2, indx+=2) { if (rgb[indx][c]>0.8*clip_pt || Gtmp[indx]>0.8*clip_pt) continue; @@ -422,7 +422,9 @@ void RawImageSource::CA_correct_RT() { for (c=0; c<3; c+=2){ for (j=0; j<2; j++) {// vert/hor //printf("hblock %d vblock %d j %d c %d areawt %d \n",hblock,vblock,j,c,areawt[j][c]); - if (areawt[j][c]>500) { + //printf("hblock %d vblock %d j %d c %d areawt %d ",hblock,vblock,j,c,areawt[j][c]); + + if (areawt[j][c]>0) { CAshift[j][c]=coeff[j][1][c]/coeff[j][2][c]; blockwt[vblock*hblsz+hblock]= areawt[j][c];//*coeff[j][2][c]/(eps+coeff[j][0][c]) ; } else { @@ -430,6 +432,8 @@ void RawImageSource::CA_correct_RT() { blockwt[vblock*hblsz+hblock]=0; } + //printf("%f \n",CAshift[j][c]); + //CAshift[j][c]=coeff[j][1][c]/coeff[j][2][c]; //blockwt[vblock*hblsz+hblock] = (float)(rr1-8)*(cc1-8)/4 * coeff[j][2][c]/(eps+coeff[j][0][c]) ; @@ -482,7 +486,7 @@ void RawImageSource::CA_correct_RT() { } } - //if (verbose) fprintf (stderr,_("tile variances %f %f %f %f \n"),blockvar[0][0],blockvar[1][0],blockvar[0][2],blockvar[1][2] ); + //printf ("tile variances %f %f %f %f \n",blockvar[0][0],blockvar[1][0],blockvar[0][2],blockvar[1][2] ); // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/rtengine/CMakeLists.txt b/rtengine/CMakeLists.txt index cfa804fa9..181f05037 100644 --- a/rtengine/CMakeLists.txt +++ b/rtengine/CMakeLists.txt @@ -2,7 +2,7 @@ include_directories (${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/../rtexif ${EXTRA_INCDIR} ${GTHREAD_INCLUDE_DIRS} ${GOBJECT_INCLUDE_DIRS} ${GLIB2_INCLUDE_DIRS} ${GLIBMM_INCLUDE_DIRS} ${IPTCDATA_INCLUDE_DIRS} ${LCMS_INCLUDE_DIRS} - ${CMAKE_CURRENT_SOURCE_DIR}/../rtgui ${GTKMM_INCLUDE_DIRS}) + ${CMAKE_CURRENT_SOURCE_DIR}/../rtgui ${GTKMM_INCLUDE_DIRS} ${GTK_INCLUDE_DIRS}) link_directories (${CMAKE_CURRENT_SOURCE_DIR}/../rtexif ${EXTRA_LIBDIR} ${GTHREAD_LIBRARY_DIRS} ${GOBJECT_LIBRARY_DIRS} ${GLIB2_LIBRARY_DIRS} ${GLIBMM_LIBRARY_DIRS} ${IPTCDATA_LIBRARY_DIRS} ${LCMS_LIBRARY_DIRS}) @@ -13,6 +13,7 @@ set (RTENGINESOURCEFILES colortemp.cc curves.cc dcraw.cc iccstore.cc dfmanager.c stdimagesource.cc myfile.cc iccjpeg.c hlmultipliers.cc improccoordinator.cc processingjob.cc rtthumbnail.cc utils.cc labimage.cc slicer.cc iplab2rgb.cc ipsharpen.cc iptransform.cc ipresize.cc + jpeg_memsrc.c wavelet_dec.cc ipequalizer.cc dirpyrLab_denoise.cc dirpyrLab_equalizer.cc dirpyr_equalizer.cc) add_library (rtengine ${RTENGINESOURCEFILES}) diff --git a/rtengine/bilateral2.h b/rtengine/bilateral2.h index 0a7cb7bb8..242595db4 100644 --- a/rtengine/bilateral2.h +++ b/rtengine/bilateral2.h @@ -334,9 +334,11 @@ template void bilateral25 (T** src, T** dst, T** buffer, int W // main bilateral filter template void bilateral (T** src, T** dst, T** buffer, int W, int H, double sigma, double sens, bool multiThread) { - - if (sigma<0.45) - #pragma omp parallel for if (multiThread) +//parallel if (multiThread) + if (sigma<0.45) +#ifdef _OPENMP +#pragma omp for +#endif for (int i=0; idefgain; + + float eps=1e-5; //tolerance to avoid dividing by zero float gauss[5] = {0.20416368871516755, 0.18017382291138087, 0.1238315368057753, 0.0662822452863612, 0.02763055063889883}; float rolloff[8] = {0, 0.135335, 0.249352, 0.411112, 0.606531, 0.800737, 0.945959, 1}; //gaussian with sigma=3 @@ -189,7 +191,8 @@ void RawImageSource::CLASS cfa_linedn(float noise) for (rr=16; rr < numrows-16; rr++) { row = rr + top; for (col=16+left, indx=rr*TS+16; indx < rr*TS+numcols-16; indx++, col++) { - rawData[row][col] = CLIP((int)(cfadn[indx]+ 0.5)); + if (rawData[row][col]setProgress(fabs((float)top/height)); diff --git a/rtengine/curves.cc b/rtengine/curves.cc index 6922441d4..236c95b58 100644 --- a/rtengine/curves.cc +++ b/rtengine/curves.cc @@ -51,7 +51,8 @@ Curve::Curve (const std::vector& p, int poly_pn) : x(NULL), y(NULL), ypp if (kind==Spline) spline_cubic_set (); else if (kind==NURBS && N > 2) - NURBS_set (); + NURBS_set (); + else kind=Linear; } else if (kind==Parametric) { if (p.size()!=8 && p.size()!=9) @@ -110,7 +111,7 @@ void Curve::NURBS_set () { std::vector sc_x(nbSubCurvesPoints); // X sub-curve points ( XP0,XP1,XP2, XP2,XP3,XP4, ...) std::vector sc_y(nbSubCurvesPoints); // Y sub-curve points ( YP0,YP1,YP2, YP2,YP3,YP4, ...) - std::vector sc_length(N-2); // Length of the subcurves + std::vector sc_length(N+2); // Length of the subcurves double total_length=0.; // Create the list of Bezier sub-curves @@ -120,6 +121,8 @@ void Curve::NURBS_set () { int k = 0; for (int i = 0; i < N-1;) { double length; + double dx; + double dy; // first point (on the curve) if (!i) { @@ -146,7 +149,9 @@ void Curve::NURBS_set () { sc_x[j] = (x[i-1] + x[i]) / 2.; sc_y[j] = (y[i-1] + y[i]) / 2.; } - length += sqrt(pow(sc_x[j] - sc_x[j-1],2) + pow(sc_y[j] - sc_y[j-1],2)); + dx = sc_x[j] - sc_x[j-1]; + dy = sc_y[j] - sc_y[j-1]; + length += sqrt(dx*dx + dy*dy); j++; // Storing the length of all sub-curves and the total length (to have a better distribution @@ -155,24 +160,24 @@ void Curve::NURBS_set () { total_length += length; } - unsigned int total_points = 0; - for (unsigned int i=0; i < sc_x.size(); i+=3) { - total_points += (int)(((double)ppn+N-2) * sc_length[i/3] / total_length) + (i==0 ? 1 : 0) - 1; - } - poly_x.resize(total_points); - poly_y.resize(total_points); - + poly_x.clear(); + poly_y.clear(); + unsigned int sc_xsize=j-1; j = 0; // create the polyline with the number of points adapted to the X range of the sub-curve - for (unsigned int i=0; i < sc_x.size(); i+=3) { + for (unsigned int i=0; i < sc_xsize /*sc_x.size()*/; i+=3) { // TODO: Speeding-up the interface by caching the polyline, instead of rebuilding it at each action on sliders !!! - int nbr_points = (int)(((double)ppn+N-2) * sc_length[i/3] / total_length); - + int nbr_points = (int)(((double)(ppn+N-2) * sc_length[i/3] )/ total_length); + if (nbr_points<0){ + for(int it=0;it < sc_x.size(); it+=3) printf("sc_length[%d/3]=%f \n",it,sc_length[it/3]); + printf("NURBS: error detected!\n i=%d nbr_points=%d ppn=%d N=%d sc_length[i/3]=%f total_length=%f",i,nbr_points,ppn,N,sc_length[i/3],total_length); + exit(0); + } // increment along the curve, not along the X axis double increment = 1.0 / (double)(nbr_points-1); if (!i) { - poly_x[j ] = sc_x[i]; - poly_y[j++] = sc_y[i]; + poly_x.push_back( sc_x[i]); + poly_y.push_back(sc_y[i]); } for (k=1; k<(nbr_points-1); k++) { double t = k*increment; @@ -182,12 +187,12 @@ void Curve::NURBS_set () { double tr2t = tr*2*t; // adding a point to the polyline - poly_x[j ] = tr2*sc_x[i] + tr2t*sc_x[i+1] + t2*sc_x[i+2]; - poly_y[j++] = tr2*sc_y[i] + tr2t*sc_y[i+1] + t2*sc_y[i+2]; + poly_x.push_back( tr2*sc_x[i] + tr2t*sc_x[i+1] + t2*sc_x[i+2]); + poly_y.push_back( tr2*sc_y[i] + tr2t*sc_y[i+1] + t2*sc_y[i+2]); } // adding the last point of the sub-curve - poly_x[j ] = sc_x[i+2]; - poly_y[j++] = sc_y[i+2]; + poly_x.push_back( sc_x[i+2]); + poly_y.push_back(sc_y[i+2]); } } @@ -417,8 +422,11 @@ if (igamma) { delete [] dcurve; }*/ +/* void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, double shcompr, double br, double contr, double defmul, double gamma_, bool igamma, const std::vector& curvePoints, unsigned int* histogram, int* outCurve, unsigned int* outBeforeCCurveHistogram, int skip) { + printf ("ecomp= %f black= %f hlcompr= %f shcompr= %f br= %f contr= %f defmul= %f gamma= %f, skip= %d \n",ecomp,black,hlcompr,shcompr,br,contr,defmul,gamma_,skip); + double def_mul = pow (2.0, defmul); // compute parameters of the gamma curve @@ -428,7 +436,7 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou double add = 0.099; // theoretical maximum of the curve - double D = /* gamma_>0 ? gamma (def_mul, gamma_, start, slope, mul, add) : */ def_mul; + double D = def_mul; // a: slope of the curve, black: starting point at the x axis double a = pow (2.0, ecomp); @@ -450,9 +458,6 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou // clear array that stores histogram valid before applying the custom curve if (outBeforeCCurveHistogram) memset (outBeforeCCurveHistogram, 0, 256*sizeof(int)); - - //float atmp=a; - //a = 1; for (int i=0; i<=0xffff; i+= i<0xffff-skip ? skip : 1 ) { @@ -461,13 +466,7 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou // apply default multiplier (that is >1 if highlight recovery is on) val *= def_mul; - - //exposure compensation - //val *= atmp; - //black *= atmp; - //D *= atmp; - - + // apply base curve, thus, exposure compensation and black point with shadow and highlight protection val = basecurve (val, a, black, D, hlcompr/100.0, shcompr/100.0); @@ -539,7 +538,391 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou outCurve[i] = (int) (65535.0 * dcurve[i]); delete [] dcurve; } +*/ +/* + void CurveFactory::complexsgnCurve (double satclip, double satcompr, double saturation, double colormult, const std::vector& curvePoints, int* outCurve, int skip) { + + //colormult = chroma_scale for Lab manipulations + + bool needsaturation = (saturation<-0.0001 || saturation>0.0001); + + // curve without contrast + double* dcurve = new double[65536]; + + // create a curve if needed + Curve* tcurve = NULL; + if (curvePoints.size()>0 && curvePoints[0]!=0) + tcurve = new Curve (curvePoints, CURVES_MIN_POLY_POINTS/skip); + + for (int i=0; i<=0xffff; i+= i<0xffff-skip ? skip : 1 ) { + + // change to [0,1] range + double val = (double)i / 65535.0; + + // apply default multiplier (that is >1 if highlight recovery is on) + val *= colormult; + + // apply base curve, thus, exposure compensation and black point with shadow and highlight protection + //val = basecurve (val, 1.0, 0, colormult, satcompr/100.0, satcompr/100.0); + + // apply custom/parametric/NURBS curve, if any + if (tcurve) { + val = tcurve->getVal (val); + } + + // store result in a temporary array + dcurve[i] = CLIPD(val); + } + delete tcurve; + + // if skip>1, let apply linear interpolation in the skipped points of the curve + int prev = 0; + for (int i=1; i<=0xffff-skip; i++) { + if (i%skip==0) { + prev+=skip; + continue; + } + dcurve[i] = ( dcurve[prev] * (skip - i%skip) + dcurve[prev+skip] * (i%skip) ) / skip; + } + + if (needsaturation) { + float avg = 0.5; + + // compute contrast parameter + double saturation_b = saturation / 20; + if (saturation_b>=0 && saturation_b < 0.00001) + saturation_b = 0.00001; + else if (saturation_b<0 && saturation_b > -0.00001) + saturation_b = -0.00001; + + // apply contrast enhancement + for (int i=0; i<=0xffff; i++) { + double val = centercontrast (dcurve[i], saturation_b, avg); + outCurve[i] = (int) (65535.0 * CLIPD(val)); + } + } + else + for (int i=0; i<=0xffff; i++) + outCurve[i] = (int) (65535.0 * dcurve[i]); + delete [] dcurve; + } + */ + void CurveFactory::complexsgnCurve (double satclip, double satcompr, double saturation, double colormult, const std::vector& curvePoints, int* outCurve, int skip) { + + //colormult = chroma_scale for Lab manipulations + + // check if contrast curve is needed + bool needsaturation = (saturation<-0.0001 || saturation>0.0001); + + // curve without contrast + double* dcurve = new double[65536]; + + //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + std::vector satcurvePoints; + satcurvePoints.push_back((double)((CurveType)NURBS)); + if (saturation>0) { + satcurvePoints.push_back(0); //black point. Value in [0 ; 1] range + satcurvePoints.push_back(0); //black point. Value in [0 ; 1] range + + satcurvePoints.push_back(0.25+saturation/500.0); //toe point + satcurvePoints.push_back(0.25-saturation/500.0); //value at toe point + + satcurvePoints.push_back(0.75-saturation/500.0); //shoulder point + satcurvePoints.push_back(0.75+saturation/500.0); //value at shoulder point + + satcurvePoints.push_back(1); // white point + satcurvePoints.push_back(1); // value at white point + } else { + satcurvePoints.push_back(0); + satcurvePoints.push_back(-0.5*(saturation/100.0)); + + satcurvePoints.push_back(1); + satcurvePoints.push_back(1+saturation/200.0); + } + Curve* satcurve = NULL; + satcurve = new Curve (satcurvePoints, CURVES_MIN_POLY_POINTS/skip); // Actually, CURVES_MIN_POLY_POINTS = 1000, + //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + // create a curve if needed + Curve* tcurve = NULL; + if (curvePoints.size()>0 && curvePoints[0]!=0) + tcurve = new Curve (curvePoints, CURVES_MIN_POLY_POINTS/skip); + + for (int i=0; i<=0xffff; i+= i<0xffff-skip ? skip : 1 ) { + + // change to [0,1] range + double val = (double)i / 65535.0; + + // apply default multiplier (that is >1 if highlight recovery is on) + val *= colormult; + + // apply saturation curve + if (needsaturation) + val = satcurve->getVal (val); + + // apply custom/parametric/NURBS curve, if any + if (tcurve) { + val = tcurve->getVal (val); + } + + // store result in a temporary array + dcurve[i] = CLIPD(val); + } + delete tcurve; + + // if skip>1, let apply linear interpolation in the skipped points of the curve + int prev = 0; + for (int i=1; i<=0xffff-skip; i++) { + if (i%skip==0) { + prev+=skip; + continue; + } + dcurve[i] = ( dcurve[prev] * (skip - i%skip) + dcurve[prev+skip] * (i%skip) ) / skip; + } + + for (int i=0; i<=0xffff; i++) + outCurve[i] = (int) (65535.0 * dcurve[i]); + delete [] dcurve; + delete satcurve; + } + + + //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, double shcompr, double br, double contr, double defmul, double gamma_, bool igamma, const std::vector& curvePoints, unsigned int* histogram, int* outCurve1, int* outCurve2, unsigned int* outBeforeCCurveHistogram, int skip) { + + double def_mul = pow (2.0, defmul); + + //printf ("def_mul= %f ecomp= %f black= %f hlcompr= %f shcompr= %f br= %f contr= %f defmul= %f gamma= %f, skip= %d \n",def_mul,ecomp,black,hlcompr,shcompr,br,contr,defmul,gamma_,skip); + + // compute parameters of the gamma curve + double start = exp(gamma_*log( -0.099 / ((1.0/gamma_-1.0)*1.099 ))); + double slope = 1.099 * pow (start, 1.0/gamma_-1) - 0.099/start; + double mul = 1.099; + double add = 0.099; + + // a: slope of the curve, black: starting point at the x axis + double a = pow (2.0, ecomp); + + // curve without contrast + double* dcurve = new double[65536]; + + // check if contrast curve is needed + bool needcontrast = contr>0.00001 || contr<-0.00001; + + // check if inverse gamma is needed at the end + bool needigamma = !needcontrast && igamma && gamma_>0; + + // create a curve if needed + Curve* tcurve = NULL; + if (curvePoints.size()>0 && curvePoints[0]!=0) + tcurve = new Curve (curvePoints, CURVES_MIN_POLY_POINTS/skip); + + // clear array that stores histogram valid before applying the custom curve + if (outBeforeCCurveHistogram) + memset (outBeforeCCurveHistogram, 0, 256*sizeof(int)); + + //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + // tone curve base. a: slope (from exp.comp.), b: black, def_mul: max. x value (can be>1), hr,sr: highlight,shadow recovery + + std::vector basecurvePoints; + basecurvePoints.push_back((double)((CurveType)NURBS)); + //float toex = MIN(1,black/(a*def_mul)); + //float toey = MAX(0,toex*a*def_mul*(shcompr/25.0-1)); + float toex = black; + float toey = MAX(0,toex*(shcompr/25.0-1)); + float shoulderx = MAX(black,1/(a*def_mul));//point in x at which line of slope a starting at (0,0) reaches y=1 + float shouldery=1; + float toneslope=(shouldery-toey)/(shoulderx-toex); + if (shoulderx<1) {//a>1; positive EC + //move shoulder down if there is highlight rolloff + shouldery = shouldery-(0.3)*(hlcompr/100.0); + shoulderx = shoulderx - (1-shouldery)/toneslope; + } else {//a<1; negative EC + //if (shoulderx>1) { + shoulderx = 1; + shouldery = a*def_mul; + } + /*float shoulderx = toex+(1-toey)/a;//point in x at which line of slope a starting at toe point reaches y=1 + float shouldery; + if (shoulderx<1) { + shouldery = MAX(2*toey, 1-(1-shoulderx)*(hlcompr/200.0)); + shoulderx = shoulderx - (1-shouldery)/a; + } else { + shoulderx = 1; + shouldery = toey + (1-toex)*a; + }*/ + + basecurvePoints.push_back(MAX(0,0.99*toex*(1-shcompr/25.0))); //black point. Value in [0 ; 1] range + basecurvePoints.push_back(0); //black point. Value in [0 ; 1] range + + basecurvePoints.push_back(toex); //toe point + basecurvePoints.push_back(toey); //value at toe point + + if (toex<1) { + //add a point along the line between the toe point and shoulder point + basecurvePoints.push_back(0.4*toex+0.6*shoulderx); //mid point + basecurvePoints.push_back(0.4*toey+0.6*shouldery); //value at mid point + + basecurvePoints.push_back(shoulderx); //shoulder point + basecurvePoints.push_back(shouldery); //value at shoulder point + if (shoulderx<1) { + basecurvePoints.push_back(1-0.95*(1-shoulderx)*(1-hlcompr/105.0)); // lead into point + basecurvePoints.push_back(1); // value near white point + basecurvePoints.push_back(1); // white point + basecurvePoints.push_back(1); // value at white point + } + } + Curve* basecurve = NULL; + basecurve = new Curve (basecurvePoints, CURVES_MIN_POLY_POINTS/skip); // Actually, CURVES_MIN_POLY_POINTS = 1000, + //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + std::vector brightcurvePoints; + brightcurvePoints.push_back((double)((CurveType)NURBS)); + + brightcurvePoints.push_back(0); //black point. Value in [0 ; 1] range + brightcurvePoints.push_back(0); //black point. Value in [0 ; 1] range + + if(br>0) { + brightcurvePoints.push_back(0.1); //toe point + brightcurvePoints.push_back(0.1+br/150.0); //value at toe point + + brightcurvePoints.push_back(0.7); //shoulder point + brightcurvePoints.push_back(MIN(1.0,0.7+br/300.0)); //value at shoulder point + } else { + brightcurvePoints.push_back(0.1-br/150.0); //toe point + brightcurvePoints.push_back(0.1); //value at toe point + + brightcurvePoints.push_back(MIN(1.0,0.7-br/300.0)); //shoulder point + brightcurvePoints.push_back(0.7); //value at shoulder point + } + brightcurvePoints.push_back(1); // white point + brightcurvePoints.push_back(1); // value at white point + + Curve* brightcurve = NULL; + brightcurve = new Curve (brightcurvePoints, CURVES_MIN_POLY_POINTS/skip); // Actually, CURVES_MIN_POLY_POINTS = 1000, + //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for (int i=0; i<=0xffff; i+= i<0xffff-skip ? skip : 1 ) { + + // change to [0,1] range + double val = (double)i / 65535.0; + + // apply default multiplier (that is >1 if highlight recovery is on) + // val *= def_mul; + + // apply base curve, thus, exposure compensation and black point with shadow and highlight protection + //val = basecurve (val, a, black, def_mul, hlcompr/100.0, shcompr/100.0); + val = basecurve->getVal (val); + + outCurve1[i] = (int) (65535.0 * CLIPD(val)); + + // change to [0,1] range + val = (double)i / 65535.0; + + // gamma correction + if (gamma_>0) + val = gamma (val, gamma_, start, slope, mul, add); + + // apply brightness curve + //val = brightness (val, br/100.0); + val = brightcurve->getVal (val); + + // apply custom/parametric/NURBS curve, if any + if (tcurve) { + if (outBeforeCCurveHistogram) { + double hval = val; + //if (needigamma) + // hval = igamma2 (hval); + int hi = (int)(255.0*CLIPD(hval)); + outBeforeCCurveHistogram[hi]+=histogram[i] ; + } + val = tcurve->getVal (val); + } + + // if inverse gamma is needed, do it (standard sRGB inverse gamma is applied) + if (needigamma) + val = igamma2 (val); + + // store result in a temporary array + dcurve[i] = CLIPD(val); + } + delete tcurve; + + delete basecurve; // ...when you don't need it anymore + delete brightcurve; + + // if skip>1, let apply linear interpolation in the skipped points of the curve + int prev = 0; + for (int i=1; i<=0xffff-skip; i++) { + if (i%skip==0) { + prev+=skip; + continue; + } + outCurve1[i] = ( outCurve1[prev] * (skip - i%skip) + outCurve1[prev+skip] * (i%skip) ) / skip; + dcurve[i] = ( dcurve[prev] * (skip - i%skip) + dcurve[prev+skip] * (i%skip) ) / skip; + } + + if (needcontrast) { + // compute mean luminance of the image with the curve applied + int sum = 0; + double avg = 0; + //double sqavg = 0; + for (int i=0; i<=0xffff; i++) { + avg += dcurve[i] * histogram[i]; + //sqavg += dcurve[i]*dcurve[i] * histogram[i]; + sum += histogram[i]; + } + avg /= sum; + //sqavg /= sum; + //double stddev = sqrt(sqavg-avg*avg); + float contrslope = (50)/(50-0.25*contr); + //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + std::vector contrastcurvePoints; + contrastcurvePoints.push_back((double)((CurveType)NURBS)); + + contrastcurvePoints.push_back(0); //black point. Value in [0 ; 1] range + contrastcurvePoints.push_back(0); //black point. Value in [0 ; 1] range + + contrastcurvePoints.push_back(avg*(1-1/contrslope)); //toe point + contrastcurvePoints.push_back(0); //value at toe point + + contrastcurvePoints.push_back(avg); //mid point + contrastcurvePoints.push_back(avg); //value at mid point + + contrastcurvePoints.push_back(avg+(1-avg)/contrslope); // shoulder point + contrastcurvePoints.push_back(1); // value at shoulder point + + contrastcurvePoints.push_back(1); // white point + contrastcurvePoints.push_back(1); // value at white point + + Curve* contrastcurve = NULL; + contrastcurve = new Curve (contrastcurvePoints, CURVES_MIN_POLY_POINTS/skip); // Actually, CURVES_MIN_POLY_POINTS = 1000, + //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + // apply contrast enhancement + for (int i=0; i<=0xffff; i++) { + //double val = centercontrast (dcurve[i], contr_b, avg); + double val = contrastcurve->getVal (dcurve[i]); + if (igamma && gamma_>0) + val = igamma2 (val); + outCurve2[i] = (int) (65535.0 * CLIPD(val)); + } + } + else + for (int i=0; i<=0xffff; i++) + outCurve2[i] = (int) (65535.0 * dcurve[i]); + delete [] dcurve; + } + + //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + + //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + int CurveFactory::gammatab [65536]; int CurveFactory::igammatab_srgb [65536]; diff --git a/rtengine/curves.h b/rtengine/curves.h index 59b3a326d..fb81f3ce6 100644 --- a/rtengine/curves.h +++ b/rtengine/curves.h @@ -101,6 +101,7 @@ class CurveFactory { else return 1.0 - brightnessbase (1.0-x, -amount); } + public: @@ -127,7 +128,8 @@ class CurveFactory { public: // static void updateCurve3 (int* curve, int* ohistogram, const std::vector& cpoints, double defmul, double ecomp, int black, double hlcompr, double shcompr, double br, double contr, double gamma_, bool igamma, int skip=1); - static void complexCurve (double ecomp, double black, double hlcompr, double shcompr, double br, double contr, double defmul, double gamma_, bool igamma, const std::vector& curvePoints, unsigned int* histogram, int* outCurve, unsigned int* outBeforeCCurveHistogram, int skip=1); + static void complexCurve (double ecomp, double black, double hlcompr, double shcompr, double br, double contr, double defmul, double gamma_, bool igamma, const std::vector& curvePoints, unsigned int* histogram, int* outCurve1, int* outCurve2, unsigned int* outBeforeCCurveHistogram, int skip=1); + static void complexsgnCurve (double satclip, double satcompr, double saturation, double colormult, const std::vector& curvePoints, int* outCurve, int skip=1); }; @@ -160,6 +162,6 @@ class Curve { double getVal (double x); void getVal (const std::vector& t, std::vector& res); }; -}; +} #endif diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index 0c5c1a015..e7f0e5a65 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -1,6 +1,5 @@ /*RT*/#include /*RT*/#include -/*RT*/int ciff_base, ciff_len, exif_base, pre_filters; /*RT*/#undef MAX /*RT*/#undef MIN /*RT*/#define NO_LCMS @@ -111,60 +110,70 @@ typedef unsigned long long UINT64; typedef unsigned char uchar; typedef unsigned short ushort; +// RT specify thread local storage +#ifdef __GNUC__ +#define THREAD_LOCAL static __thread +#define THREAD_LOCK +#else +#define THREAD_LOCAL +#define THREAD_LOCK Glib::Mutex::Lock locker(*dcrMutex); +#endif + /* All global variables are defined here, and all functions that access them are prefixed with "CLASS". Note that a thread-safe C++ class cannot have non-const static local variables. */ -/*RT*/IMFILE *ifp; -FILE * ofp; -short order; -const char *ifname; -char *meta_data; -char cdesc[5], desc[512], make[64], model[64], model2[64], artist[64]; -float flash_used, canon_ev, iso_speed, shutter, aperture, focal_len; -time_t timestamp; -unsigned shot_order, kodak_cbpp, filters, exif_cfa, unique_id; -off_t strip_offset, data_offset; -off_t thumb_offset, meta_offset, profile_offset; -unsigned thumb_length, meta_length, profile_length; -unsigned thumb_misc, *oprof, fuji_layout, shot_select=0, multi_out=0; -unsigned tiff_nifds, tiff_samples, tiff_bps, tiff_compress; -unsigned black, cblack[8], maximum, mix_green, raw_color, zero_is_bad; -unsigned zero_after_ff, is_raw, dng_version, is_foveon, data_error; -unsigned tile_width, tile_length, gpsdata[32], load_flags; -ushort raw_height, raw_width, height, width, top_margin, left_margin; -ushort shrink, iheight, iwidth, fuji_width, thumb_width, thumb_height; -int flip, tiff_flip, colors; -double pixel_aspect, aber[4]={1,1,1,1}, gamm[6]={ 0.45,4.5,0,0,0,0 }; -ushort (*image)[4], white[8][8], curve[0x10000], cr2_slice[3], sraw_mul[4]; -float bright=1, user_mul[4]={0,0,0,0}, threshold=0; -int half_size=0, four_color_rgb=0, document_mode=0, highlight=0; -int verbose=0, use_auto_wb=0, use_camera_wb=0, use_camera_matrix=-1; -int output_color=1, output_bps=8, output_tiff=0, med_passes=0; -int no_auto_bright=0; -unsigned greybox[4] = { 0, 0, UINT_MAX, UINT_MAX }; -float cam_mul[4], pre_mul[4], cmatrix[3][4], rgb_cam[3][4]; -const double xyz_rgb[3][3] = { /* XYZ from RGB */ +/*RT*/THREAD_LOCAL int ciff_base, ciff_len, exif_base, pre_filters; +/*RT*/THREAD_LOCAL IMFILE *ifp; +THREAD_LOCAL FILE * ofp; +THREAD_LOCAL short order; +THREAD_LOCAL const char *ifname; +THREAD_LOCAL char *meta_data; +THREAD_LOCAL char cdesc[5], desc[512], make[64], model[64], model2[64], artist[64]; +THREAD_LOCAL float flash_used, canon_ev, iso_speed, shutter, aperture, focal_len; +THREAD_LOCAL time_t timestamp; +THREAD_LOCAL unsigned shot_order, kodak_cbpp, filters, exif_cfa, unique_id; +THREAD_LOCAL off_t strip_offset, data_offset; +THREAD_LOCAL off_t thumb_offset, meta_offset, profile_offset; +THREAD_LOCAL unsigned thumb_length, meta_length, profile_length; +THREAD_LOCAL unsigned thumb_misc, *oprof, fuji_layout, shot_select=0, multi_out=0; +THREAD_LOCAL unsigned tiff_nifds, tiff_samples, tiff_bps, tiff_compress; +THREAD_LOCAL unsigned black, cblack[8], maximum, mix_green, raw_color, zero_is_bad; +THREAD_LOCAL unsigned zero_after_ff, is_raw, dng_version, is_foveon, data_error; +THREAD_LOCAL unsigned tile_width, tile_length, gpsdata[32], load_flags; +THREAD_LOCAL ushort raw_height, raw_width, height, width, top_margin, left_margin; +THREAD_LOCAL ushort shrink, iheight, iwidth, fuji_width, thumb_width, thumb_height; +THREAD_LOCAL int flip, tiff_flip, colors; +THREAD_LOCAL double pixel_aspect, aber[4]={1,1,1,1}, gamm[6]={ 0.45,4.5,0,0,0,0 }; +THREAD_LOCAL ushort (*image)[4], white[8][8], curve[0x10000], cr2_slice[3], sraw_mul[4]; +THREAD_LOCAL float bright=1, user_mul[4]={0,0,0,0}, threshold=0; +THREAD_LOCAL int half_size=0, four_color_rgb=0, document_mode=0, highlight=0; +THREAD_LOCAL int verbose=0, use_auto_wb=0, use_camera_wb=0, use_camera_matrix=-1; +THREAD_LOCAL int output_color=1, output_bps=8, output_tiff=0, med_passes=0; +THREAD_LOCAL int no_auto_bright=0; +THREAD_LOCAL unsigned greybox[4] = { 0, 0, UINT_MAX, UINT_MAX }; +THREAD_LOCAL float cam_mul[4], pre_mul[4], cmatrix[3][4], rgb_cam[3][4]; +static const double xyz_rgb[3][3] = { /* XYZ from RGB */ { 0.412453, 0.357580, 0.180423 }, { 0.212671, 0.715160, 0.072169 }, { 0.019334, 0.119193, 0.950227 } }; -const float d65_white[3] = { 0.950456, 1, 1.088754 }; -int histogram[4][0x2000]; -void (*write_thumb)(), (*write_fun)(); -void (*load_raw)(), (*thumb_load_raw)(); -jmp_buf failure; +static const float d65_white[3] = { 0.950456, 1, 1.088754 }; +THREAD_LOCAL int histogram[4][0x2000]; +THREAD_LOCAL void (*write_thumb)(), (*write_fun)(); +THREAD_LOCAL void (*load_raw)(), (*thumb_load_raw)(); +THREAD_LOCAL jmp_buf failure; -struct decode { +THREAD_LOCAL struct decode { struct decode *branch[2]; int leaf; } first_decode[2048], *second_decode, *free_decode; -struct tiff_ifd { +THREAD_LOCAL struct tiff_ifd { int width, height, bps, comp, phint, offset, flip, samples, bytes; } tiff_ifd[10]; -struct ph1 { +THREAD_LOCAL struct ph1 { int format, key_off, black, black_off, split_col, tag_21a; float tag_210; } ph1; @@ -555,8 +564,8 @@ int CLASS canon_s2is() */ unsigned CLASS getbithuff (int nbits, ushort *huff) { - static unsigned bitbuf=0; - static int vbits=0, reset=0; + THREAD_LOCAL unsigned bitbuf=0; + THREAD_LOCAL int vbits=0, reset=0; unsigned c; if (nbits == -1) @@ -1577,8 +1586,8 @@ void CLASS phase_one_load_raw() unsigned CLASS ph1_bithuff (int nbits, ushort *huff) { - static UINT64 bitbuf=0; - static int vbits=0; + THREAD_LOCAL UINT64 bitbuf=0; + THREAD_LOCAL int vbits=0; unsigned c; if (nbits == -1) @@ -1840,8 +1849,8 @@ void CLASS nokia_load_raw() unsigned CLASS pana_bits (int nbits) { - static uchar buf[0x4000]; - static int vbits; + THREAD_LOCAL uchar buf[0x4000]; + THREAD_LOCAL int vbits; int byte; if (!nbits) return vbits=0; @@ -2130,7 +2139,7 @@ void CLASS kodak_jpeg_load_raw() {} METHODDEF(boolean) fill_input_buffer (j_decompress_ptr cinfo) { - static uchar jpeg_buffer[4096]; + THREAD_LOCAL uchar jpeg_buffer[4096]; size_t nbytes; nbytes = fread (jpeg_buffer, 1, 4096, ifp); @@ -2408,7 +2417,7 @@ void CLASS kodak_thumb_load_raw() void CLASS sony_decrypt (unsigned *data, int len, int start, int key) { - static unsigned pad[128], p; + THREAD_LOCAL unsigned pad[128], p; if (start) { for (p=0; p < 4; p++) @@ -2655,7 +2664,7 @@ void CLASS smal_v9_load_raw() void CLASS foveon_decoder (unsigned size, unsigned code) { - static unsigned huff[1024]; + THREAD_LOCAL unsigned huff[1024]; struct decode *cur; int i, len; @@ -6894,6 +6903,8 @@ void CLASS identify() if (height == 3136 && width == 4736) /* Pentax K-7 */ { height = 3122; width = 4684; top_margin = 2; filters = 0x16161616; } + if (height == 2868 && width == 4352) /* Pentax K-x */ + width = 4308; if (height == 3014 && width == 4096) /* Ricoh GX200 */ width = 4014; if (dng_version) { @@ -7227,6 +7238,8 @@ canon_cr2: } else if (!strcmp(model,"D1X")) { width -= 4; pixel_aspect = 0.5; + } else if (!strcmp(model,"D7000")) { + width -= 40; } else if (!strcmp(model,"D40X") || !strcmp(model,"D60") || !strcmp(model,"D80") || @@ -7441,7 +7454,7 @@ konica_400z: } else if (!strcmp(model,"K20D")) { filters = 0x16161616; } else if (!strcmp(model,"K-x")) { - width = 4309; + width = 4308; filters = 0x16161616; } else if (!strcmp(model,"Optio S")) { if (fsize == 3178560) { @@ -8930,6 +8943,7 @@ Glib::Mutex* dcrMutex=NULL; int RawImage::loadRaw (bool loadData) { Glib::Mutex::Lock lock(*dcrMutex); // auto unlock + THREAD_LOCK ifname = fname.c_str(); image = NULL; @@ -9073,9 +9087,9 @@ int RawImage::loadRaw (bool loadData) { int getRawFileBasicInfo (const Glib::ustring& fname, rtengine::RawMetaDataLocation& rml, int& rotation, int& thumbWidth, int& thumbHeight, int& thumbOffset, int& thumbType) { - int status=0; + THREAD_LOCK -dcrMutex->lock (); + int status=0; exif_base = -1; ciff_base = -1; @@ -9094,14 +9108,12 @@ dcrMutex->lock (); ifname = fname.c_str(); if (!(ifp = gfopen (ifname))) { status = 2; - dcrMutex->unlock (); return status; } identify (); if (!is_raw || colors>3) { status = 3; fclose (ifp); - dcrMutex->unlock (); return status; } @@ -9133,15 +9145,78 @@ dcrMutex->lock (); rml.ciffLength = ciff_len; fclose (ifp); -dcrMutex->unlock (); return !is_raw; } #include +rtengine::Thumbnail* rtengine::Thumbnail::loadQuickFromRaw (const Glib::ustring& fname, rtengine::RawMetaDataLocation& rml, int &w, int &h, int fixwh) { + + THREAD_LOCK + + image = NULL; + ifname = fname.c_str(); + exif_base = -1; + ciff_base = -1; + ciff_len = -1; + verbose = settings->verbose; + oprof = NULL; + ifp = gfopen (fname.c_str()); + if (!ifp) { + printf("DCRAW: failed0\n"); + return NULL; + } + + if (setjmp (failure)) { + printf("DCRAW: failed1\n"); + fclose (ifp); + return NULL; + } + + identify (); + if (!is_raw || colors>3) { + printf("DCRAW: failed2\n"); + fclose(ifp); + return NULL; + } + + rml.exifBase = exif_base; + rml.ciffBase = ciff_base; + rml.ciffLength = ciff_len; + + char thumb_buffer[thumb_length]; + fseek(ifp,thumb_offset,SEEK_SET); + fread(thumb_buffer,1,thumb_length,ifp); + fclose(ifp); + + rtengine::Thumbnail* tpp = rtengine::Thumbnail::loadFromMemory(thumb_buffer,thumb_length,w,h,fixwh); + if ( tpp == 0 ) + { + printf("DCRAW: failed3\n"); + return NULL; + } + + int deg = 0; + if (flip==5) + deg = 270; + else if (flip==3) + deg = 180; + else if (flip==6) + deg = 90; + + if (deg>0) { + Image16* rot = tpp->thumbImg->rotate (deg); + delete tpp->thumbImg; + tpp->thumbImg = rot; + } + + return tpp; +} + rtengine::Thumbnail* rtengine::Thumbnail::loadFromRaw (const Glib::ustring& fname, rtengine::RawMetaDataLocation& rml, int &w, int &h, int fixwh) { -dcrMutex->lock (); + THREAD_LOCK + MyTime t0, t1, t2, t3, t4, t5, t6; t0.set (); @@ -9154,7 +9229,6 @@ t0.set (); oprof = NULL; ifp = gfopen (fname.c_str()); if (!ifp) { - dcrMutex->unlock (); return NULL; } @@ -9164,7 +9238,6 @@ t1.set (); if (image) free (image); fclose (ifp); - dcrMutex->unlock (); return NULL; } @@ -9176,7 +9249,6 @@ t1.set (); use_camera_wb = 1; if (!is_raw || colors>3) { fclose(ifp); - dcrMutex->unlock (); return NULL; } @@ -9438,8 +9510,6 @@ if (settings->verbose) printf ("0: %d, 1: %d, 2: %d, 3: %d, 4: %d, 5: %d All: %d free (image); -dcrMutex->unlock (); - return tpp; } diff --git a/rtengine/dcraw.patch b/rtengine/dcraw.patch index 826580dff..fec902bbc 100644 --- a/rtengine/dcraw.patch +++ b/rtengine/dcraw.patch @@ -1,9 +1,8 @@ ---- dcraw.c 2010-06-30 10:40:16.000000000 -0600 -+++ dcraw.cc 2010-06-30 10:36:00.000000000 -0600 -@@ -1,3 +1,16 @@ +--- dcraw.c 2010-10-25 09:45:14.000000000 -0400 ++++ dcraw.cc 2010-10-27 11:30:33.000000000 -0400 +@@ -1,3 +1,15 @@ +/*RT*/#include +/*RT*/#include -+/*RT*/int ciff_base, ciff_len, exif_base, pre_filters; +/*RT*/#undef MAX +/*RT*/#undef MIN +/*RT*/#define NO_LCMS @@ -17,7 +16,7 @@ /* dcraw.c -- Dave Coffin's raw photo decoder Copyright 1997-2010 by Dave Coffin, dcoffin a cybercom o net -@@ -46,7 +59,9 @@ +@@ -46,7 +58,9 @@ NO_LCMS disables the "-p" option. */ #ifndef NO_JPEG @@ -28,17 +27,115 @@ #endif #ifndef NO_LCMS #include -@@ -101,7 +116,8 @@ +@@ -96,59 +110,70 @@ + typedef unsigned char uchar; + typedef unsigned short ushort; + ++// RT specify thread local storage ++#ifdef __GNUC__ ++#define THREAD_LOCAL static __thread ++#define THREAD_LOCK ++#else ++#define THREAD_LOCAL ++#define THREAD_LOCK Glib::Mutex::Lock locker(*dcrMutex); ++#endif ++ + /* + All global variables are defined here, and all functions that access them are prefixed with "CLASS". Note that a thread-safe C++ class cannot have non-const static local variables. */ -FILE *ifp, *ofp; -+/*RT*/IMFILE *ifp; -+FILE * ofp; - short order; - const char *ifname; - char *meta_data; -@@ -271,6 +287,7 @@ +-short order; +-const char *ifname; +-char *meta_data; +-char cdesc[5], desc[512], make[64], model[64], model2[64], artist[64]; +-float flash_used, canon_ev, iso_speed, shutter, aperture, focal_len; +-time_t timestamp; +-unsigned shot_order, kodak_cbpp, filters, exif_cfa, unique_id; +-off_t strip_offset, data_offset; +-off_t thumb_offset, meta_offset, profile_offset; +-unsigned thumb_length, meta_length, profile_length; +-unsigned thumb_misc, *oprof, fuji_layout, shot_select=0, multi_out=0; +-unsigned tiff_nifds, tiff_samples, tiff_bps, tiff_compress; +-unsigned black, cblack[8], maximum, mix_green, raw_color, zero_is_bad; +-unsigned zero_after_ff, is_raw, dng_version, is_foveon, data_error; +-unsigned tile_width, tile_length, gpsdata[32], load_flags; +-ushort raw_height, raw_width, height, width, top_margin, left_margin; +-ushort shrink, iheight, iwidth, fuji_width, thumb_width, thumb_height; +-int flip, tiff_flip, colors; +-double pixel_aspect, aber[4]={1,1,1,1}, gamm[6]={ 0.45,4.5,0,0,0,0 }; +-ushort (*image)[4], white[8][8], curve[0x10000], cr2_slice[3], sraw_mul[4]; +-float bright=1, user_mul[4]={0,0,0,0}, threshold=0; +-int half_size=0, four_color_rgb=0, document_mode=0, highlight=0; +-int verbose=0, use_auto_wb=0, use_camera_wb=0, use_camera_matrix=-1; +-int output_color=1, output_bps=8, output_tiff=0, med_passes=0; +-int no_auto_bright=0; +-unsigned greybox[4] = { 0, 0, UINT_MAX, UINT_MAX }; +-float cam_mul[4], pre_mul[4], cmatrix[3][4], rgb_cam[3][4]; +-const double xyz_rgb[3][3] = { /* XYZ from RGB */ ++/*RT*/THREAD_LOCAL int ciff_base, ciff_len, exif_base, pre_filters; ++/*RT*/THREAD_LOCAL IMFILE *ifp; ++THREAD_LOCAL FILE * ofp; ++THREAD_LOCAL short order; ++THREAD_LOCAL const char *ifname; ++THREAD_LOCAL char *meta_data; ++THREAD_LOCAL char cdesc[5], desc[512], make[64], model[64], model2[64], artist[64]; ++THREAD_LOCAL float flash_used, canon_ev, iso_speed, shutter, aperture, focal_len; ++THREAD_LOCAL time_t timestamp; ++THREAD_LOCAL unsigned shot_order, kodak_cbpp, filters, exif_cfa, unique_id; ++THREAD_LOCAL off_t strip_offset, data_offset; ++THREAD_LOCAL off_t thumb_offset, meta_offset, profile_offset; ++THREAD_LOCAL unsigned thumb_length, meta_length, profile_length; ++THREAD_LOCAL unsigned thumb_misc, *oprof, fuji_layout, shot_select=0, multi_out=0; ++THREAD_LOCAL unsigned tiff_nifds, tiff_samples, tiff_bps, tiff_compress; ++THREAD_LOCAL unsigned black, cblack[8], maximum, mix_green, raw_color, zero_is_bad; ++THREAD_LOCAL unsigned zero_after_ff, is_raw, dng_version, is_foveon, data_error; ++THREAD_LOCAL unsigned tile_width, tile_length, gpsdata[32], load_flags; ++THREAD_LOCAL ushort raw_height, raw_width, height, width, top_margin, left_margin; ++THREAD_LOCAL ushort shrink, iheight, iwidth, fuji_width, thumb_width, thumb_height; ++THREAD_LOCAL int flip, tiff_flip, colors; ++THREAD_LOCAL double pixel_aspect, aber[4]={1,1,1,1}, gamm[6]={ 0.45,4.5,0,0,0,0 }; ++THREAD_LOCAL ushort (*image)[4], white[8][8], curve[0x10000], cr2_slice[3], sraw_mul[4]; ++THREAD_LOCAL float bright=1, user_mul[4]={0,0,0,0}, threshold=0; ++THREAD_LOCAL int half_size=0, four_color_rgb=0, document_mode=0, highlight=0; ++THREAD_LOCAL int verbose=0, use_auto_wb=0, use_camera_wb=0, use_camera_matrix=-1; ++THREAD_LOCAL int output_color=1, output_bps=8, output_tiff=0, med_passes=0; ++THREAD_LOCAL int no_auto_bright=0; ++THREAD_LOCAL unsigned greybox[4] = { 0, 0, UINT_MAX, UINT_MAX }; ++THREAD_LOCAL float cam_mul[4], pre_mul[4], cmatrix[3][4], rgb_cam[3][4]; ++static const double xyz_rgb[3][3] = { /* XYZ from RGB */ + { 0.412453, 0.357580, 0.180423 }, + { 0.212671, 0.715160, 0.072169 }, + { 0.019334, 0.119193, 0.950227 } }; +-const float d65_white[3] = { 0.950456, 1, 1.088754 }; +-int histogram[4][0x2000]; +-void (*write_thumb)(), (*write_fun)(); +-void (*load_raw)(), (*thumb_load_raw)(); +-jmp_buf failure; ++static const float d65_white[3] = { 0.950456, 1, 1.088754 }; ++THREAD_LOCAL int histogram[4][0x2000]; ++THREAD_LOCAL void (*write_thumb)(), (*write_fun)(); ++THREAD_LOCAL void (*load_raw)(), (*thumb_load_raw)(); ++THREAD_LOCAL jmp_buf failure; + +-struct decode { ++THREAD_LOCAL struct decode { + struct decode *branch[2]; + int leaf; + } first_decode[2048], *second_decode, *free_decode; + +-struct tiff_ifd { ++THREAD_LOCAL struct tiff_ifd { + int width, height, bps, comp, phint, offset, flip, samples, bytes; + } tiff_ifd[10]; + +-struct ph1 { ++THREAD_LOCAL struct ph1 { + int format, key_off, black, black_off, split_col, tag_21a; + float tag_210; + } ph1; +@@ -271,6 +296,7 @@ fprintf (stderr,_("Corrupt data near 0x%llx\n"), (INT64) ftello(ifp)); } data_error++; @@ -46,7 +143,7 @@ } ushort CLASS sget2 (uchar *s) -@@ -344,7 +361,7 @@ +@@ -344,7 +370,7 @@ { if (fread (pixel, 2, count, ifp) < count) derror(); if ((order == 0x4949) == (ntohs(0x1234) == 0x1234)) @@ -55,7 +152,45 @@ } void CLASS canon_600_fixed_wb (int temp) -@@ -2117,7 +2134,7 @@ +@@ -538,8 +564,8 @@ + */ + unsigned CLASS getbithuff (int nbits, ushort *huff) + { +- static unsigned bitbuf=0; +- static int vbits=0, reset=0; ++ THREAD_LOCAL unsigned bitbuf=0; ++ THREAD_LOCAL int vbits=0, reset=0; + unsigned c; + + if (nbits == -1) +@@ -1560,8 +1586,8 @@ + + unsigned CLASS ph1_bithuff (int nbits, ushort *huff) + { +- static UINT64 bitbuf=0; +- static int vbits=0; ++ THREAD_LOCAL UINT64 bitbuf=0; ++ THREAD_LOCAL int vbits=0; + unsigned c; + + if (nbits == -1) +@@ -1823,8 +1849,8 @@ + + unsigned CLASS pana_bits (int nbits) + { +- static uchar buf[0x4000]; +- static int vbits; ++ THREAD_LOCAL uchar buf[0x4000]; ++ THREAD_LOCAL int vbits; + int byte; + + if (!nbits) return vbits=0; +@@ -2113,11 +2139,11 @@ + METHODDEF(boolean) + fill_input_buffer (j_decompress_ptr cinfo) + { +- static uchar jpeg_buffer[4096]; ++ THREAD_LOCAL uchar jpeg_buffer[4096]; size_t nbytes; nbytes = fread (jpeg_buffer, 1, 4096, ifp); @@ -64,7 +199,25 @@ cinfo->src->next_input_byte = jpeg_buffer; cinfo->src->bytes_in_buffer = nbytes; return TRUE; -@@ -3765,6 +3782,7 @@ +@@ -2391,7 +2417,7 @@ + + void CLASS sony_decrypt (unsigned *data, int len, int start, int key) + { +- static unsigned pad[128], p; ++ THREAD_LOCAL unsigned pad[128], p; + + if (start) { + for (p=0; p < 4; p++) +@@ -2638,7 +2664,7 @@ + + void CLASS foveon_decoder (unsigned size, unsigned code) + { +- static unsigned huff[1024]; ++ THREAD_LOCAL unsigned huff[1024]; + struct decode *cur; + int i, len; + +@@ -3765,6 +3791,7 @@ for (row = FC(1,0) >> 1; row < height; row+=2) for (col = FC(row,1) & 1; col < width; col+=2) image[row*width+col][1] = image[row*width+col][3]; @@ -72,7 +225,7 @@ filters &= ~((filters & 0x55555555) << 1); } } -@@ -4817,7 +4835,7 @@ +@@ -4817,7 +4844,7 @@ unsigned sony_curve[] = { 0,0,0,0,0,4095 }; unsigned *buf, sony_offset=0, sony_length=0, sony_key=0; struct jhead jh; @@ -81,7 +234,7 @@ if (tiff_nifds >= sizeof tiff_ifd / sizeof tiff_ifd[0]) return 1; -@@ -5225,12 +5243,13 @@ +@@ -5225,12 +5252,13 @@ fread (buf, sony_length, 1, ifp); sony_decrypt (buf, sony_length/4, 1, sony_key); sfp = ifp; @@ -100,7 +253,7 @@ ifp = sfp; free (buf); } -@@ -5256,6 +5275,8 @@ +@@ -5256,6 +5284,8 @@ int doff, max_samp=0, raw=-1, thm=-1, i; struct jhead jh; @@ -109,7 +262,7 @@ fseek (ifp, base, SEEK_SET); order = get2(); if (order != 0x4949 && order != 0x4d4d) return; -@@ -5424,7 +5445,7 @@ +@@ -5424,7 +5454,7 @@ { const char *file, *ext; char *jname, *jfile, *jext; @@ -118,7 +271,7 @@ ext = strrchr (ifname, '.'); file = strrchr (ifname, '/'); -@@ -5452,7 +5473,8 @@ +@@ -5452,7 +5482,8 @@ *jext = '0'; } if (strcmp (jname, ifname)) { @@ -128,7 +281,7 @@ if (verbose) fprintf (stderr,_("Reading metadata from %s ...\n"), jname); parse_tiff (12); -@@ -5790,7 +5812,11 @@ +@@ -5790,7 +5821,11 @@ order = get2(); hlen = get4(); if (get4() == 0x48454150) /* "HEAP" */ @@ -140,7 +293,7 @@ parse_tiff (save+6); fseek (ifp, save+len, SEEK_SET); } -@@ -6738,6 +6764,12 @@ +@@ -6738,6 +6773,12 @@ fread (head, 1, 32, ifp); fseek (ifp, 0, SEEK_END); flen = fsize = ftell(ifp); @@ -153,7 +306,7 @@ if ((cp = (char *) memmem (head, 32, "MMMM", 4)) || (cp = (char *) memmem (head, 32, "IIII", 4))) { parse_phase_one (cp-head); -@@ -6745,6 +6777,8 @@ +@@ -6745,6 +6786,8 @@ } else if (order == 0x4949 || order == 0x4d4d) { if (!memcmp (head+6,"HEAPCCDR",8)) { data_offset = hlen; @@ -162,7 +315,25 @@ parse_ciff (hlen, flen - hlen); } else { parse_tiff(0); -@@ -8494,13 +8528,13 @@ +@@ -6858,6 +6901,8 @@ + if (height == 3136 && width == 4736) /* Pentax K-7 */ + { height = 3122; width = 4684; + top_margin = 2; filters = 0x16161616; } ++ if (height == 2868 && width == 4352) /* Pentax K-x */ ++ width = 4308; + if (height == 3014 && width == 4096) /* Ricoh GX200 */ + width = 4014; + if (dng_version) { +@@ -7405,7 +7450,7 @@ + } else if (!strcmp(model,"K20D")) { + filters = 0x16161616; + } else if (!strcmp(model,"K-x")) { +- width = 4309; ++ width = 4308; + filters = 0x16161616; + } else if (!strcmp(model,"Optio S")) { + if (fsize == 3178560) { +@@ -8494,13 +8539,13 @@ FORCC ppm [col*colors+c] = curve[image[soff][c]] >> 8; else FORCC ppm2[col*colors+c] = curve[image[soff][c]]; if (output_bps == 16 && !output_tiff && htons(0x55aa) != 0x55aa) @@ -178,7 +349,7 @@ { int arg, status=0; int timestamp_only=0, thumbnail_only=0, identify_only=0; -@@ -8613,7 +8647,7 @@ +@@ -8613,7 +8658,7 @@ case 'i': identify_only = 1; break; case 'c': write_to_stdout = 1; break; case 'v': verbose = 1; break; @@ -187,7 +358,7 @@ case 'f': four_color_rgb = 1; break; case 'A': FORC4 greybox[c] = atoi(argv[arg++]); case 'a': use_auto_wb = 1; break; -@@ -8877,3 +8911,537 @@ +@@ -8877,3 +8922,526 @@ } return status; } @@ -213,7 +384,7 @@ + { 0.222507, 0.716888, 0.060608 }, + { 0.013930, 0.097097, 0.714022 } }; + -+dcrMutex->lock (); ++ THREAD_LOCK + + ifname = fname;//strdup (fname); + image = NULL; @@ -228,7 +399,6 @@ + ri->profile_data = NULL; + ifp = gfopen (fname); + if (!ifp) { -+ dcrMutex->unlock (); + return 3; + } + @@ -240,7 +410,6 @@ + use_camera_wb = 1; + if (!is_raw) { + fclose(ifp); -+ dcrMutex->unlock (); + return 2; + } + @@ -259,7 +428,6 @@ + if (ri->data) + free(ri->data); + fclose (ifp); -+ dcrMutex->unlock (); + return 100; + } + @@ -346,15 +514,14 @@ + ri->coeff[a][b] = rgb_cam[a][b]; + + free (image); -+dcrMutex->unlock (); + return 0; +} + +int getRawFileBasicInfo (const Glib::ustring& fname, rtengine::RawMetaDataLocation& rml, int& rotation, int& thumbWidth, int& thumbHeight, int& thumbOffset, int& thumbType) { + -+ int status=0; ++ THREAD_LOCK + -+dcrMutex->lock (); ++ int status=0; + + exif_base = -1; + ciff_base = -1; @@ -373,14 +540,12 @@ + ifname = fname.c_str(); + if (!(ifp = gfopen (ifname))) { + status = 2; -+ dcrMutex->unlock (); + return status; + } + identify (); + if (!is_raw || colors>3) { + status = 3; + fclose (ifp); -+ dcrMutex->unlock (); + return status; + } + @@ -412,7 +577,6 @@ + rml.ciffLength = ciff_len; + + fclose (ifp); -+dcrMutex->unlock (); + return !is_raw; +} + @@ -420,7 +584,8 @@ + +rtengine::Thumbnail* rtengine::Thumbnail::loadFromRaw (const Glib::ustring& fname, rtengine::RawMetaDataLocation& rml, int &w, int &h, int fixwh) { + -+dcrMutex->lock (); ++ THREAD_LOCK ++ +MyTime t0, t1, t2, t3, t4, t5, t6; +t0.set (); + @@ -433,7 +598,6 @@ + oprof = NULL; + ifp = gfopen (fname.c_str()); + if (!ifp) { -+ dcrMutex->unlock (); + return NULL; + } + @@ -443,7 +607,6 @@ + if (image) + free (image); + fclose (ifp); -+ dcrMutex->unlock (); + return NULL; + } + @@ -455,7 +618,6 @@ + use_camera_wb = 1; + if (!is_raw || colors>3) { + fclose(ifp); -+ dcrMutex->unlock (); + return NULL; + } + @@ -610,7 +772,7 @@ + + // generate histogram for auto exposure + tpp->aeHistCompression = 3; -+ tpp->aeHistogram = new int[65536>>tpp->aeHistCompression]; ++ tpp->aeHistogram = new unsigned int[65536>>tpp->aeHistCompression]; + memset (tpp->aeHistogram, 0, (65536>>tpp->aeHistCompression)*sizeof(int)); + int radd = 4; + int gadd = 2; @@ -717,8 +879,6 @@ + + free (image); + -+dcrMutex->unlock (); -+ + return tpp; +} + diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 7c0f5b8fd..dc54910cf 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -167,13 +167,16 @@ void Crop::update (int todo, bool internal) { // shadows & highlights & tone curve & convert to cielab if (todo & M_RGBCURVE) - parent->ipf.rgbProc (baseCrop, laboCrop, parent->tonecurve, cshmap); + parent->ipf.rgbProc (baseCrop, laboCrop, parent->tonecurve1, parent->tonecurve2, cshmap); // apply luminance operations if (todo & (M_LUMINANCE+M_COLOR)) { - parent->ipf.luminanceCurve (laboCrop, labnCrop, parent->lumacurve, 0, croph); - parent->ipf.colorCurve (laboCrop, labnCrop); + parent->ipf.luminanceCurve (laboCrop, labnCrop, parent->lumacurve2, 0, croph); + parent->ipf.chrominanceCurve (laboCrop, labnCrop, 0, parent->chroma_acurve, 0, croph); + parent->ipf.chrominanceCurve (laboCrop, labnCrop, 1, parent->chroma_bcurve, 0, croph); + + parent->ipf.colorCurve (labnCrop, labnCrop); if (skip==1) { parent->ipf.impulsedenoise (labnCrop); @@ -347,7 +350,9 @@ void Crop::fullUpdate () { parent->updaterThreadStart.lock (); if (parent->updaterRunning && parent->thread) { - parent->changeSinceLast = 0; + // Do NOT reset changes here, since in a long chain of events it will lead to chroma_scale not being updated, + // causing ImProcFunctions::lab2rgb to return a black image on some opens + //parent->changeSinceLast = 0; parent->thread->join (); } diff --git a/rtengine/dirpyr_equalizer.cc b/rtengine/dirpyr_equalizer.cc index 67ce8f1f0..6c6cb82bc 100644 --- a/rtengine/dirpyr_equalizer.cc +++ b/rtengine/dirpyr_equalizer.cc @@ -194,7 +194,7 @@ namespace rtengine { //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - }; + } void ImProcFunctions::dirpyr_channel(unsigned short ** data_fine, unsigned short ** data_coarse, int width, int height, int * rangefn, int level, int scale, const double * mult ) { @@ -220,7 +220,7 @@ namespace rtengine { #endif for(int i = 0; i < height; i++) { for(int j = 0; j < width; j++) - { + { float val=0; float norm=0; @@ -238,14 +238,12 @@ namespace rtengine { - }; + } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% void ImProcFunctions::idirpyr_eq_channel(unsigned short ** data_coarse, unsigned short ** data_fine, int ** buffer, int width, int height, int level, const double * mult ) { - int hipass; - float noisehi = 1.33*noise*mult[4]/pow(3,level), noiselo = 0.66*noise*mult[4]/pow(3,level); float * irangefn = new float [0x20000]; @@ -265,15 +263,16 @@ namespace rtengine { #ifdef _OPENMP #pragma omp parallel for #endif - for(int i = 0; i < height; i++) + for(int i = 0; i < height; i++) { for(int j = 0; j < width; j++) { - hipass = (data_fine[i][j]-data_coarse[i][j]); + int hipass = (data_fine[i][j]-data_coarse[i][j]); buffer[i][j] += irangefn[hipass+0x10000] * hipass ; } + } delete [] irangefn; - }; + } #undef DIRWT_L diff --git a/rtengine/gauss.h b/rtengine/gauss.h index 527274b02..c3eaf408b 100644 --- a/rtengine/gauss.h +++ b/rtengine/gauss.h @@ -31,13 +31,12 @@ template void gaussHorizontal3 (T** src, T** dst, T* buffer, int W, int H, const float c0, const float c1, bool multiThread) { - #pragma omp parallel for if (multiThread) - for (int i=0; i void gaussHorizontal3 (T** src, T** dst, T* buffer, int W, int template void gaussVertical3 (T** src, T** dst, T* buffer, int W, int H, const float c0, const float c1, bool multiThread) { - #pragma omp parallel for if (multiThread) - for (int i=0; i void gaussHorizontal (T** src, T** dst, AlignedBuffer* for (int i=0; i<3; i++) for (int j=0; j<3; j++) M[i][j] /= (1.0+b1-b2+b3)*(1.0+b2+(b1-b3)*b3); - - #pragma omp parallel for if (multiThread) + // if (multiThread) + #pragma omp for for (int i=0; idata + omp_get_thread_num() * W; -#else double* temp2 = buffer->data; -#endif temp2[0] = B * src[i][0] + b1*src[i][0] + b2*src[i][0] + b3*src[i][0]; temp2[1] = B * src[i][1] + b1*temp2[0] + b2*src[i][0] + b3*src[i][0]; temp2[2] = B * src[i][2] + b1*temp2[1] + b2*temp2[0] + b3*src[i][0]; @@ -192,14 +186,11 @@ template void gaussVertical (T** src, T** dst, AlignedBuffer* b for (int i=0; i<3; i++) for (int j=0; j<3; j++) M[i][j] /= (1.0+b1-b2+b3)*(1.0+b2+(b1-b3)*b3); - - #pragma omp parallel for if (multiThread) - for (int i=0; idata + omp_get_thread_num() * H; -#else - double* temp2 = buffer->data; +#pragma omp for #endif + for (int i=0; idata; temp2[0] = B * src[0][i] + b1*src[0][i] + b2*src[0][i] + b3*src[0][i]; temp2[1] = B * src[1][i] + b1*temp2[0] + b2*src[0][i] + b3*src[0][i]; temp2[2] = B * src[2][i] + b1*temp2[1] + b2*temp2[0] + b3*src[0][i]; diff --git a/rtengine/iccstore.cc b/rtengine/iccstore.cc index 8e9ba21ef..f5e96f713 100644 --- a/rtengine/iccstore.cc +++ b/rtengine/iccstore.cc @@ -27,8 +27,6 @@ namespace rtengine { -ICCStore iccStore; - const double (*wprofiles[])[3] = {sRGB_d50, adobe_d50, prophoto_d50, widegamut_d50, bruce_d50, beta_d50, best_d50}; const double (*iwprofiles[])[3] = {d50_sRGB, d50_adobe, d50_prophoto, d50_widegamut, d50_bruce, d50_beta, d50_best}; const char* wpnames[] = {"sRGB", "Adobe RGB", "ProPhoto", "WideGamut", "BruceRGB", "Beta RGB", "BestRGB"}; @@ -43,11 +41,13 @@ std::vector getWorkingProfiles () { std::vector getOutputProfiles () { - return iccStore.getOutputProfiles (); + return iccStore->getOutputProfiles (); } std::vector ICCStore::getOutputProfiles () { + Glib::Mutex::Lock lock(mutex_); + std::vector res; for (std::map::iterator i=fileProfiles.begin(); i!=fileProfiles.end(); i++) res.push_back (i->first); @@ -55,14 +55,30 @@ std::vector ICCStore::getOutputProfiles () { } -ICCStore::ICCStore () { +ICCStore* +ICCStore::getInstance(void) +{ + static ICCStore* instance_ = 0; + if ( instance_ == 0 ) + { + static Glib::Mutex smutex_; + Glib::Mutex::Lock lock(smutex_); + if ( instance_ == 0 ) + { + instance_ = new ICCStore(); + } + } + return instance_; +} +ICCStore::ICCStore () +{ cmsErrorAction (LCMS_ERROR_SHOW); int N = sizeof(wpnames)/sizeof(wpnames[0]); for (int i=0; i::iterator r = fileProfiles.find (name); if (r!=fileProfiles.end()) @@ -137,11 +154,15 @@ cmsHPROFILE ICCStore::getProfile (Glib::ustring name) { ProfileContent ICCStore::getContent (Glib::ustring name) { + Glib::Mutex::Lock lock(mutex_); + return fileProfileContents[name]; } std::vector ICCStore::parseDir (Glib::ustring pdir) { + Glib::Mutex::Lock lock(mutex_); + fileProfiles.clear (); fileProfileContents.clear (); std::vector result; @@ -164,7 +185,7 @@ std::vector ICCStore::parseDir (Glib::ustring pdir) { // ignore directories if (!Glib::file_test (fname, Glib::FILE_TEST_IS_DIR)) { int lastdot = sname.find_last_of ('.'); - if (lastdot!=Glib::ustring::npos && lastdot<=sname.size()-4 && (!sname.casefold().compare (lastdot, 4, ".icm") || !sname.casefold().compare (lastdot, 4, ".icc"))) { + if (lastdot!=Glib::ustring::npos && lastdot<=(int)sname.size()-4 && (!sname.casefold().compare (lastdot, 4, ".icm") || !sname.casefold().compare (lastdot, 4, ".icc"))) { // printf ("processing file %s...\n", fname.c_str()); Glib::ustring name = sname.substr(0,lastdot); ProfileContent pc (fname); @@ -309,6 +330,8 @@ cmsHPROFILE ICCStore::createFromMatrix (const double matrix[3][3], bool gamma, G strcpy ((char *)oprof+pbody[5]+12, name.c_str()); - return cmsOpenProfileFromMem (oprof, ntohl(oprof[0])); + cmsHPROFILE p = cmsOpenProfileFromMem (oprof, ntohl(oprof[0])); + delete [] oprof; + return p; } } diff --git a/rtengine/iccstore.h b/rtengine/iccstore.h index 3c0a9dc49..5e67b55a7 100644 --- a/rtengine/iccstore.h +++ b/rtengine/iccstore.h @@ -54,9 +54,14 @@ class ICCStore { cmsHPROFILE xyz; cmsHPROFILE srgb; + + Glib::Mutex mutex_; + + ICCStore (); public: - ICCStore (); + + static ICCStore* getInstance(void); int numOfWProfiles (); cmsHPROFILE createFromMatrix (const double matrix[3][3], bool gamma=false, Glib::ustring name=""); @@ -74,7 +79,7 @@ class ICCStore { std::vector getOutputProfiles (); }; -extern ICCStore iccStore; +#define iccStore ICCStore::getInstance() //extern const char* wpnames[]; } diff --git a/rtengine/image16.cc b/rtengine/image16.cc index 1afe0e258..1f6227f98 100644 --- a/rtengine/image16.cc +++ b/rtengine/image16.cc @@ -17,6 +17,7 @@ * along with RawTherapee. If not, see . */ #include +#include #include #include @@ -239,3 +240,19 @@ Image16* Image16::resize (int nw, int nh, TypeInterpolation interp) { } return NULL; } + +Image8* +Image16::to8() const +{ + Image8* img8 = new Image8(width,height); + for ( int h = 0; h < height; ++h ) + { + for ( int w = 0; w < width; ++w ) + { + img8->r(h,w,r[h][w] >> 8); + img8->g(h,w,g[h][w] >> 8); + img8->b(h,w,b[h][w] >> 8); + } + } + return img8; +} diff --git a/rtengine/image16.h b/rtengine/image16.h index 8a778215b..ba719535b 100644 --- a/rtengine/image16.h +++ b/rtengine/image16.h @@ -29,6 +29,8 @@ namespace rtengine { enum TypeInterpolation { TI_Nearest, TI_Bilinear }; +class Image8; + class Image16 : public ImageIO, public IImage16 { private: @@ -54,6 +56,8 @@ class Image16 : public ImageIO, public IImage16 { Image16* copy (); + Image8* to8() const; + Image16* rotate (int deg); Image16* hflip (); Image16* vflip (); diff --git a/rtengine/imagedata.cc b/rtengine/imagedata.cc index e2523a3c9..2146a4d79 100644 --- a/rtengine/imagedata.cc +++ b/rtengine/imagedata.cc @@ -95,7 +95,7 @@ ImageData::ImageData (Glib::ustring fname, RawMetaDataLocation* ri) { extractInfo (); } } - else if (dotpos - * - * 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 -#include -#include -#include -#include -#include -#include -#include -extern "C" { -#include "jdatasrc.c" -#include -#include -} -#ifdef WIN32 -#include -#else -#include -#endif -#include -#include - -Glib::ustring safe_locale_to_utf8 (const std::string& src); - -using namespace rtengine; -using namespace rtengine::procparams; - -Glib::ustring ImageIO::errorMsg[6] = {"Success", "Cannot read file.", "Invalid header.","Error while reading header.","File reading error", "Image format not supported."}; - -void ImageIO::setMetadata (const rtexif::TagDirectory* eroot, const std::vector& exif, const std::vector& iptcc) { - - // store exif info - exifChange.resize (exif.size()); - for (int i=0; iclone (NULL); - - if (iptc) - iptc_data_free (iptc); - iptc = NULL; - - // build iptc structures for libiptcdata - if (iptcc.size()==0) - return; - - iptc = iptc_data_new (); - for (int i=0; i0) { - for (int j=0; j0) { - for (int j=0; j0) { - IptcDataSet * ds = iptc_dataset_new (); - iptc_dataset_set_tag (ds, IPTC_RECORD_APP_2, strTags[j].tag); - std::string loc = safe_locale_to_utf8(iptcc[i].values[0]); - iptc_dataset_set_data (ds, (unsigned char*)loc.c_str(), MIN(strTags[j].size,loc.size()), IPTC_DONT_VALIDATE); - iptc_data_add_dataset (iptc, ds); - iptc_dataset_unref (ds); - } - } - iptc_data_sort (iptc); -} - -void ImageIO::setOutputProfile (char* pdata, int plen) { - - delete [] profileData; - if (pdata) { - profileData = new char [plen]; - memcpy (profileData, pdata, plen); - } - else - profileData = NULL; - profileLength = plen; -} - -ImageIO::~ImageIO () { - - if (embProfile) - cmsCloseProfile(embProfile); - delete loadedProfileData; - delete exifRoot; - delete profileData; -} - -void png_read_data(png_struct_def *png_ptr, unsigned char *data, size_t length); -void png_write_data(png_struct_def *png_ptr, unsigned char *data, size_t length); -void png_flush(png_struct_def *png_ptr); - -int ImageIO::loadPNG (Glib::ustring fname) { - - FILE *file = g_fopen (fname.c_str(),"rb"); - if (!file) - return IMIO_CANNOTREADFILE; - - if (pl) { - pl->setProgressStr ("Loading PNG file..."); - pl->setProgress (0.0); - } - - //reading PNG header - unsigned char header[8]; - fread (header, 1, 8, file); - if (png_sig_cmp (header, 0, 8)) { - fclose(file); - return IMIO_HEADERERROR; - } - //initializing main structures - png_structp png = png_create_read_struct (PNG_LIBPNG_VER_STRING, 0, 0, 0); - if (!png) { - fclose (file); - return IMIO_HEADERERROR; - } - png_infop info = png_create_info_struct (png); - png_infop end_info = png_create_info_struct (png); - if (!end_info || !info) { - png_destroy_read_struct (&png, &info, &end_info); - fclose (file); - return IMIO_HEADERERROR; - } - - if (setjmp (png_jmpbuf(png))) { - png_destroy_read_struct (&png, &info, &end_info); - fclose (file); - return IMIO_READERROR; - } - - //set up png read - png_set_read_fn (png, file, png_read_data); - png_set_sig_bytes (png,8); - - png_read_info(png,info); - - embProfile = NULL; - - //retrieving image information - png_uint_32 width,height; - int bit_depth,color_type,interlace_type,compression_type,filter_method; - png_get_IHDR(png,info,&width,&height,&bit_depth,&color_type,&interlace_type, - &compression_type, &filter_method); - - //converting to 32bpp format - if (color_type==PNG_COLOR_TYPE_PALETTE) png_set_palette_to_rgb(png); - - if (color_type==PNG_COLOR_TYPE_GRAY || color_type==PNG_COLOR_TYPE_GRAY_ALPHA) - png_set_gray_to_rgb(png); - - if (png_get_valid(png,info,PNG_INFO_tRNS)) png_set_tRNS_to_alpha(png); - - if (interlace_type!=PNG_INTERLACE_NONE) { - png_destroy_read_struct (&png, &info, &end_info); - fclose (file); - return IMIO_VARIANTNOTSUPPORTED; - } - - if (color_type & PNG_COLOR_MASK_ALPHA) - png_set_strip_alpha(png); - - //setting gamma - double gamma; - if (png_get_gAMA(png,info,&gamma)) - png_set_gamma(png, 2.0, gamma); - else - png_set_gamma(png,2.0, 0.45455); - - int bps = getBPS (); - - -// if (bps==8 && bit_depth==16) png_set_strip_16(png); - - //updating png info struct - png_read_update_info(png,info); - png_get_IHDR(png,info,&width,&height,&bit_depth,&color_type,&interlace_type, - &compression_type, &filter_method); - - if (color_type & PNG_COLOR_MASK_ALPHA) - png_set_strip_alpha(png); - - png_read_update_info(png,info); - png_get_IHDR(png,info,&width,&height,&bit_depth,&color_type,&interlace_type, - &compression_type, &filter_method); - - allocate (width, height); - - int rowlen = width*3*bit_depth/8; - unsigned char *row = new unsigned char [rowlen]; - - for (unsigned int i=0;isetProgress ((double)(i+1)/height); - } - - png_read_end (png, 0); - png_destroy_read_struct (&png, &info, &end_info); - - delete [] row; - fclose(file); - if (pl) { - pl->setProgressStr ("Ready."); - pl->setProgress (1.0); - } - return IMIO_SUCCESS; -} - -extern jmp_buf jpeg_jmp_buf; - -int ImageIO::loadJPEG (Glib::ustring fname) { - - FILE *file=g_fopen(fname.c_str(),"rb"); - if (!file) - return IMIO_CANNOTREADFILE; - - jpeg_decompress_struct cinfo; - jpeg_error_mgr jerr; - cinfo.err = my_jpeg_std_error(&jerr); - jpeg_create_decompress(&cinfo); - my_jpeg_stdio_src (&cinfo,file); - - if (pl) { - pl->setProgressStr ("Loading JPEG file..."); - pl->setProgress (0.0); - - } - - setup_read_icc_profile (&cinfo); - - if (!setjmp(jpeg_jmp_buf)) { - jpeg_stdio_src(&cinfo,file); - jpeg_read_header(&cinfo, TRUE); - - unsigned int proflen; - delete loadedProfileData; - loadedProfileData = NULL; - bool hasprofile = read_icc_profile (&cinfo, (JOCTET**)&loadedProfileData, (unsigned int*)&loadedProfileLength); - if (hasprofile) - embProfile = cmsOpenProfileFromMem (loadedProfileData, loadedProfileLength); - else - embProfile = NULL; - - jpeg_start_decompress(&cinfo); - - int width = cinfo.output_width; - int height = cinfo.output_height; - - allocate (width, height); - - unsigned char *row=new unsigned char[width*3]; - while (cinfo.output_scanline < height) { - if (jpeg_read_scanlines(&cinfo,&row,1) < 1) { - jpeg_finish_decompress(&cinfo); - jpeg_destroy_decompress(&cinfo); - delete [] row; - return IMIO_READERROR; - } - setScanline (cinfo.output_scanline-1, row, 8); - - if (pl && !(cinfo.output_scanline%100)) - pl->setProgress ((double)(cinfo.output_scanline)/cinfo.output_height); - } - delete [] row; - - jpeg_finish_decompress(&cinfo); - jpeg_destroy_decompress(&cinfo); - fclose(file); - if (pl) { - pl->setProgressStr ("Ready."); - pl->setProgress (1.0); - } - return IMIO_SUCCESS; - } - else { - jpeg_destroy_decompress(&cinfo); - return IMIO_READERROR; - } -} - -int ImageIO::loadTIFF (Glib::ustring fname) { - -#ifdef WIN32 - wchar_t *wfilename = (wchar_t*)g_utf8_to_utf16 (fname.c_str(), -1, NULL, NULL, NULL); - TIFF* in = TIFFOpenW (wfilename, "r"); - g_free (wfilename); -#else - TIFF* in = TIFFOpen(fname.c_str(), "r"); -#endif - if (in == NULL) - return IMIO_CANNOTREADFILE; - - if (pl) { - pl->setProgressStr ("Loading TIFF file..."); - pl->setProgress (0.0); - } - - int width, height; - TIFFGetField(in, TIFFTAG_IMAGEWIDTH, &width); - TIFFGetField(in, TIFFTAG_IMAGELENGTH, &height); - - uint16 bitspersample, samplesperpixel; - TIFFGetField(in, TIFFTAG_BITSPERSAMPLE, &bitspersample); - TIFFGetField(in, TIFFTAG_SAMPLESPERPIXEL, &samplesperpixel); - uint16 photometric; - if (!TIFFGetField(in, TIFFTAG_PHOTOMETRIC, &photometric) || - photometric != PHOTOMETRIC_RGB || samplesperpixel < 3) { - TIFFClose(in); - return IMIO_VARIANTNOTSUPPORTED; - } - - uint16 config; - TIFFGetField(in, TIFFTAG_PLANARCONFIG, &config); - if (config != PLANARCONFIG_CONTIG) { - TIFFClose(in); - return IMIO_VARIANTNOTSUPPORTED; - } - - char* profdata; - delete loadedProfileData; - loadedProfileData = NULL; - if (TIFFGetField(in, TIFFTAG_ICCPROFILE, &loadedProfileLength, &profdata)) { - embProfile = cmsOpenProfileFromMem (profdata, loadedProfileLength); - loadedProfileData = new char [loadedProfileLength]; - memcpy (loadedProfileData, profdata, loadedProfileLength); - } - else - embProfile = NULL; - - - allocate (width, height); - - unsigned char* linebuffer = new unsigned char[TIFFScanlineSize(in)]; - for (int row = 0; row < height; row++) { - if (TIFFReadScanline(in, linebuffer, row, 0) <0) { - TIFFClose(in); - delete [] linebuffer; - return IMIO_READERROR; - } - if (samplesperpixel>3) - for (int i=0; isetProgress ((double)(row+1)/height); - } - TIFFClose(in); - delete [] linebuffer; - - if (pl) { - pl->setProgressStr ("Ready."); - pl->setProgress (1.0); - } - - return IMIO_SUCCESS; -} - - -int ImageIO::savePNG (Glib::ustring fname, int compression, int bps) { - - FILE* file=g_fopen(safe_locale_from_utf8(fname).c_str (),"wb"); - - if (!file) - return IMIO_CANNOTREADFILE; - - if (pl) { - pl->setProgressStr ("Saving PNG file..."); - pl->setProgress (0.0); - } - - png_structp png = png_create_write_struct (PNG_LIBPNG_VER_STRING,0,0,0); - if (!png) { - fclose (file); - return IMIO_HEADERERROR; - } - png_infop info = png_create_info_struct(png); - if (!info) { - png_destroy_write_struct (&png,0); - fclose (file); - return IMIO_HEADERERROR; - } - - if (setjmp(png_jmpbuf(png))) { - png_destroy_write_struct (&png,&info); - fclose(file); - return IMIO_READERROR; - } - - png_set_write_fn (png, file, png_write_data, png_flush); - - png_set_compression_level(png,compression); - - int width = getW (); - int height = getH (); - if (bps<0) - bps = getBPS (); - - png_set_IHDR(png, info, width, height, bps, PNG_COLOR_TYPE_RGB, - PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT,PNG_FILTER_TYPE_BASE); - - - int rowlen = width*3*bps/8; - unsigned char *row = new unsigned char [rowlen]; - - png_write_info(png,info); - for (unsigned int i=0;isetProgress ((double)(i+1)/height); - } - - png_write_end(png,info); - png_destroy_write_struct(&png,&info); - - delete [] row; - fclose (file); - - if (pl) { - pl->setProgressStr ("Ready."); - pl->setProgress (1.0); - } - - return IMIO_SUCCESS; -} - - -int ImageIO::saveJPEG (Glib::ustring fname, int quality) { - - jpeg_compress_struct cinfo; - jpeg_error_mgr jerr; - - cinfo.err = jpeg_std_error (&jerr); - jpeg_create_compress (&cinfo); - - FILE *file = g_fopen (safe_locale_from_utf8(fname).c_str (), "wb"); - - if (!file) - return IMIO_CANNOTREADFILE; - - if (pl) { - pl->setProgressStr ("Saving JPEG file..."); - pl->setProgress (0.0); - } - - jpeg_stdio_dest (&cinfo, file); - - int width = getW (); - int height = getH (); - - cinfo.image_width = width; - cinfo.image_height = height; - cinfo.in_color_space = JCS_RGB; - cinfo.input_components = 3; - jpeg_set_defaults (&cinfo); - cinfo.write_JFIF_header = FALSE; - - - if (quality>=0 && quality<=100) - jpeg_set_quality (&cinfo, quality, true); - - jpeg_start_compress(&cinfo, TRUE); - - // buffer for exif and iptc markers - unsigned char buffer[165535]; - unsigned int size; - // assemble and write exif marker - if (exifRoot) { - int size = rtexif::ExifManager::createJPEGMarker (exifRoot, exifChange, cinfo.image_width, cinfo.image_height, buffer); - if (size>0 && size<65530) - jpeg_write_marker(&cinfo, JPEG_APP0+1, buffer, size); - } - // assemble and write iptc marker - if (iptc) { - unsigned char* iptcdata; - bool error = false; - if (iptc_data_save (iptc, &iptcdata, &size)) { - if (iptcdata) - iptc_data_free_buf (iptc, iptcdata); - error = true; - } - int bytes = 0; - if (!error && (bytes = iptc_jpeg_ps3_save_iptc (NULL, 0, iptcdata, size, buffer, 65532)) < 0) { - if (iptcdata) - iptc_data_free_buf (iptc, iptcdata); - error = true; - } - if (!error) - jpeg_write_marker(&cinfo, JPEG_APP0+13, buffer, bytes); - } - // write icc profile to the output - if (profileData) - write_icc_profile (&cinfo, (JOCTET*)profileData, profileLength); - - // write image data - int rowlen = width*3; - unsigned char *row = new unsigned char [rowlen]; - - while (cinfo.next_scanline < cinfo.image_height) { - - getScanline (cinfo.next_scanline, row, 8); - - if (jpeg_write_scanlines (&cinfo, &row, 1) < 1) { - jpeg_finish_compress (&cinfo); - jpeg_destroy_compress (&cinfo); - fclose (file); - return IMIO_READERROR; - } - - if (pl && !(cinfo.next_scanline%100)) - pl->setProgress ((double)(cinfo.next_scanline)/cinfo.image_height); - } - - jpeg_finish_compress (&cinfo); - jpeg_destroy_compress (&cinfo); - - delete [] row; - fclose (file); - - if (pl) { - pl->setProgressStr ("Ready."); - pl->setProgress (1.0); - } - - return IMIO_SUCCESS; -} - -int ImageIO::saveTIFF (Glib::ustring fname, int bps, bool uncompressed) { - - int width = getW (); - int height = getH (); - - if (bps<0) - bps = getBPS (); - - int lineWidth = width*3*bps/8; - unsigned char* linebuffer = new unsigned char[lineWidth]; -// TODO the following needs to be looked into - do we really need two ways to write a Tiff file ? - if (exifRoot && uncompressed) { - FILE *file = g_fopen (safe_locale_from_utf8(fname).c_str (), "wb"); - - if (!file) - return IMIO_CANNOTREADFILE; - - if (pl) { - pl->setProgressStr ("Saving TIFF file ..."); - pl->setProgress (0.0); - } - - // buffer for the exif and iptc - unsigned char buffer[165535]; - unsigned char* iptcdata = NULL; - unsigned int iptclen = 0; - if (iptc && iptc_data_save (iptc, &iptcdata, &iptclen) && iptcdata) { - iptc_data_free_buf (iptc, iptcdata); - iptcdata = NULL; - } - int size = rtexif::ExifManager::createTIFFHeader (exifRoot, exifChange, width, height, bps, profileData, profileLength, (char*)iptcdata, iptclen, buffer); - if (iptcdata) - iptc_data_free_buf (iptc, iptcdata); - if (size>0 && size<165530) - fwrite (buffer, size, 1, file); - - bool needsReverse = bps==16 && exifRoot->getOrder()==rtexif::MOTOROLA; - - for (int i=0; isetProgress ((double)(i+1)/height); - } - - fclose (file); - } - else { - // little hack to get libTiff to use proper byte order (see TIFFClienOpen()): - const char *mode = !exifRoot ? "w" : (exifRoot->getOrder()==rtexif::INTEL ? "wl":"wb"); - #ifdef WIN32 - wchar_t *wfilename = (wchar_t*)g_utf8_to_utf16 (fname.c_str(), -1, NULL, NULL, NULL); - TIFF* out = TIFFOpenW (wfilename, mode); - g_free (wfilename); - #else - TIFF* out = TIFFOpen(fname.c_str(), mode); - #endif - if (!out) - return IMIO_CANNOTREADFILE; - - if (pl) { - pl->setProgressStr ("Saving TIFF file ..."); - pl->setProgress (0.0); - } - - if (exifRoot){ - rtexif::Tag *tag = exifRoot->getTag (TIFFTAG_EXIFIFD); - if (tag && tag->isDirectory()){ - rtexif::TagDirectory *exif = tag->getDirectory(); - if (exif) { - int exif_size = exif->calculateSize(); - unsigned char *buffer = new unsigned char[exif_size+8]; - // TIFFOpen writes out the header and sets file pointer at position 8 - - exif->write (8, buffer); - write (TIFFFileno (out), buffer+8, exif_size); - delete buffer; - // let libtiff know that scanlines or any other following stuff should go - // at a different offset: - TIFFSetWriteOffset (out, exif_size+8); - TIFFSetField (out, TIFFTAG_EXIFIFD, 8); - } - } - -//TODO Even though we are saving EXIF IFD - MakerNote still comes out screwy. - - if ((tag = exifRoot->getTag (TIFFTAG_MODEL)) != NULL) - TIFFSetField (out, TIFFTAG_MODEL, tag->getValue()); - if ((tag = exifRoot->getTag (TIFFTAG_MAKE)) != NULL) - TIFFSetField (out, TIFFTAG_MAKE, tag->getValue()); - if ((tag = exifRoot->getTag (TIFFTAG_DATETIME)) != NULL) - TIFFSetField (out, TIFFTAG_DATETIME, tag->getValue()); - if ((tag = exifRoot->getTag (TIFFTAG_ARTIST)) != NULL) - TIFFSetField (out, TIFFTAG_ARTIST, tag->getValue()); - if ((tag = exifRoot->getTag (TIFFTAG_COPYRIGHT)) != NULL) - TIFFSetField (out, TIFFTAG_COPYRIGHT, tag->getValue()); - - } - - TIFFSetField (out, TIFFTAG_SOFTWARE, "RawTherapee 3"); - TIFFSetField (out, TIFFTAG_IMAGEWIDTH, width); - TIFFSetField (out, TIFFTAG_IMAGELENGTH, height); - TIFFSetField (out, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); - TIFFSetField (out, TIFFTAG_SAMPLESPERPIXEL, 3); - TIFFSetField(out, TIFFTAG_ROWSPERSTRIP, height); - TIFFSetField (out, TIFFTAG_BITSPERSAMPLE, bps); - TIFFSetField (out, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); - TIFFSetField (out, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT); - TIFFSetField (out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB); - TIFFSetField (out, TIFFTAG_COMPRESSION, uncompressed ? COMPRESSION_NONE : COMPRESSION_DEFLATE); - if (!uncompressed) - TIFFSetField (out, TIFFTAG_PREDICTOR, PREDICTOR_NONE); - - if (profileData) - TIFFSetField (out, TIFFTAG_ICCPROFILE, profileLength, profileData); - - for (int row = 0; row < height; row++) { - getScanline (row, linebuffer, bps); - - if (TIFFWriteScanline (out, linebuffer, row, 0) < 0) { - TIFFClose (out); - delete [] linebuffer; - return IMIO_READERROR; - } - if (pl && !(row%100)) - pl->setProgress ((double)(row+1)/height); - } - TIFFClose (out); - } - - delete [] linebuffer; - if (pl) { - pl->setProgressStr ("Ready."); - pl->setProgress (1.0); - } - - return IMIO_SUCCESS; -} - -// PNG read and write routines: - -void png_read_data(png_structp png_ptr, png_bytep data, png_size_t length) { - png_size_t check; - - /* fread() returns 0 on error, so it is OK to store this in a png_size_t - * instead of an int, which is what fread() actually returns. - */ - check = (png_size_t)fread(data, (png_size_t)1, length, (FILE *)png_ptr->io_ptr); - - if (check != length) - { - png_error(png_ptr, "Read Error"); - } -} - -void png_write_data(png_structp png_ptr, png_bytep data, png_size_t length) { - png_uint_32 check; - - check = fwrite(data, 1, length, (FILE *)(png_ptr->io_ptr)); - if (check != length) - { - png_error(png_ptr, "Write Error"); - } -} - -void png_flush(png_structp png_ptr) { - FILE *io_ptr; - io_ptr = (FILE *)CVT_PTR((png_ptr->io_ptr)); - if (io_ptr != NULL) - fflush(io_ptr); -} - -int ImageIO::load (Glib::ustring fname) { - - int lastdot = fname.find_last_of ('.'); - - if (!fname.casefold().compare (lastdot, 4, ".png")) - return loadPNG (fname); - else if (!fname.casefold().compare (lastdot, 4, ".jpg")) - return loadJPEG (fname); - else if (!fname.casefold().compare (lastdot, 4, ".tif")) - return loadTIFF (fname); - else return IMIO_FILETYPENOTSUPPORTED; -} - -int ImageIO::save (Glib::ustring fname) { - - int lastdot = fname.find_last_of ('.'); - - if (!fname.casefold().compare (lastdot, 4, ".png")) - return savePNG (fname); - else if (!fname.casefold().compare (lastdot, 4, ".jpg")) - return saveJPEG (fname); - else if (!fname.casefold().compare (lastdot, 4, ".tif")) - return saveTIFF (fname); - else return IMIO_FILETYPENOTSUPPORTED; -} - +/* + * 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 +#include +#include +#include +#include +#include +#include +#include +extern "C" { +#include "jdatasrc.c" +#include +#include +} +#ifdef WIN32 +#include +#else +#include +#endif +#include +#include + +Glib::ustring safe_locale_to_utf8 (const std::string& src); + +using namespace rtengine; +using namespace rtengine::procparams; + +Glib::ustring ImageIO::errorMsg[6] = {"Success", "Cannot read file.", "Invalid header.","Error while reading header.","File reading error", "Image format not supported."}; + +void ImageIO::setMetadata (const rtexif::TagDirectory* eroot, const std::vector& exif, const std::vector& iptcc) { + + // store exif info + exifChange.resize (exif.size()); + for (int i=0; iclone (NULL); + + if (iptc) + iptc_data_free (iptc); + iptc = NULL; + + // build iptc structures for libiptcdata + if (iptcc.size()==0) + return; + + iptc = iptc_data_new (); + for (int i=0; i0) { + for (int j=0; j0) { + for (int j=0; j0) { + IptcDataSet * ds = iptc_dataset_new (); + iptc_dataset_set_tag (ds, IPTC_RECORD_APP_2, strTags[j].tag); + std::string loc = safe_locale_to_utf8(iptcc[i].values[0]); + iptc_dataset_set_data (ds, (unsigned char*)loc.c_str(), MIN(strTags[j].size,loc.size()), IPTC_DONT_VALIDATE); + iptc_data_add_dataset (iptc, ds); + iptc_dataset_unref (ds); + } + } + iptc_data_sort (iptc); +} + +void ImageIO::setOutputProfile (char* pdata, int plen) { + + delete [] profileData; + if (pdata) { + profileData = new char [plen]; + memcpy (profileData, pdata, plen); + } + else + profileData = NULL; + profileLength = plen; +} + +ImageIO::~ImageIO () { + + if (embProfile) + cmsCloseProfile(embProfile); + delete loadedProfileData; + delete exifRoot; + delete profileData; +} + +void png_read_data(png_struct_def *png_ptr, unsigned char *data, size_t length); +void png_write_data(png_struct_def *png_ptr, unsigned char *data, size_t length); +void png_flush(png_struct_def *png_ptr); + +int ImageIO::loadPNG (Glib::ustring fname) { + + FILE *file = g_fopen (fname.c_str(),"rb"); + if (!file) + return IMIO_CANNOTREADFILE; + + if (pl) { + pl->setProgressStr ("Loading PNG file..."); + pl->setProgress (0.0); + } + + //reading PNG header + unsigned char header[8]; + fread (header, 1, 8, file); + if (png_sig_cmp (header, 0, 8)) { + fclose(file); + return IMIO_HEADERERROR; + } + //initializing main structures + png_structp png = png_create_read_struct (PNG_LIBPNG_VER_STRING, 0, 0, 0); + if (!png) { + fclose (file); + return IMIO_HEADERERROR; + } + png_infop info = png_create_info_struct (png); + png_infop end_info = png_create_info_struct (png); + if (!end_info || !info) { + png_destroy_read_struct (&png, &info, &end_info); + fclose (file); + return IMIO_HEADERERROR; + } + + if (setjmp (png_jmpbuf(png))) { + png_destroy_read_struct (&png, &info, &end_info); + fclose (file); + return IMIO_READERROR; + } + + //set up png read + png_set_read_fn (png, file, png_read_data); + png_set_sig_bytes (png,8); + + png_read_info(png,info); + + embProfile = NULL; + + //retrieving image information + png_uint_32 width,height; + int bit_depth,color_type,interlace_type,compression_type,filter_method; + png_get_IHDR(png,info,&width,&height,&bit_depth,&color_type,&interlace_type, + &compression_type, &filter_method); + + //converting to 32bpp format + if (color_type==PNG_COLOR_TYPE_PALETTE) png_set_palette_to_rgb(png); + + if (color_type==PNG_COLOR_TYPE_GRAY || color_type==PNG_COLOR_TYPE_GRAY_ALPHA) + png_set_gray_to_rgb(png); + + if (png_get_valid(png,info,PNG_INFO_tRNS)) png_set_tRNS_to_alpha(png); + + if (interlace_type!=PNG_INTERLACE_NONE) { + png_destroy_read_struct (&png, &info, &end_info); + fclose (file); + return IMIO_VARIANTNOTSUPPORTED; + } + + if (color_type & PNG_COLOR_MASK_ALPHA) + png_set_strip_alpha(png); + + //setting gamma + double gamma; + if (png_get_gAMA(png,info,&gamma)) + png_set_gamma(png, 2.0, gamma); + else + png_set_gamma(png,2.0, 0.45455); + + int bps = getBPS (); + + +// if (bps==8 && bit_depth==16) png_set_strip_16(png); + + //updating png info struct + png_read_update_info(png,info); + png_get_IHDR(png,info,&width,&height,&bit_depth,&color_type,&interlace_type, + &compression_type, &filter_method); + + if (color_type & PNG_COLOR_MASK_ALPHA) + png_set_strip_alpha(png); + + png_read_update_info(png,info); + png_get_IHDR(png,info,&width,&height,&bit_depth,&color_type,&interlace_type, + &compression_type, &filter_method); + + allocate (width, height); + + int rowlen = width*3*bit_depth/8; + unsigned char *row = new unsigned char [rowlen]; + + for (unsigned int i=0;isetProgress ((double)(i+1)/height); + } + + png_read_end (png, 0); + png_destroy_read_struct (&png, &info, &end_info); + + delete [] row; + fclose(file); + if (pl) { + pl->setProgressStr ("Ready."); + pl->setProgress (1.0); + } + return IMIO_SUCCESS; +} + +extern jmp_buf jpeg_jmp_buf; + +extern "C" { +void jpeg_memory_src (jpeg_decompress_struct* cinfo, const char* buffer, int bufsize); +} + +int ImageIO::loadJPEGFromMemory (const char* buffer, int bufsize) +{ + jpeg_decompress_struct cinfo; + jpeg_error_mgr jerr; + cinfo.err = my_jpeg_std_error(&jerr); + jpeg_create_decompress(&cinfo); + jpeg_memory_src (&cinfo,buffer,bufsize); + + if (pl) { + pl->setProgressStr ("Loading JPEG file..."); + pl->setProgress (0.0); + + } + + setup_read_icc_profile (&cinfo); + + if (!setjmp(jpeg_jmp_buf)) { + jpeg_memory_src (&cinfo,buffer,bufsize); + jpeg_read_header(&cinfo, TRUE); + + unsigned int proflen; + delete loadedProfileData; + loadedProfileData = NULL; + bool hasprofile = read_icc_profile (&cinfo, (JOCTET**)&loadedProfileData, (unsigned int*)&loadedProfileLength); + if (hasprofile) + embProfile = cmsOpenProfileFromMem (loadedProfileData, loadedProfileLength); + else + embProfile = NULL; + + jpeg_start_decompress(&cinfo); + + int width = cinfo.output_width; + int height = cinfo.output_height; + + allocate (width, height); + + unsigned char *row=new unsigned char[width*3]; + while (cinfo.output_scanline < height) { + if (jpeg_read_scanlines(&cinfo,&row,1) < 1) { + jpeg_finish_decompress(&cinfo); + jpeg_destroy_decompress(&cinfo); + delete [] row; + return IMIO_READERROR; + } + setScanline (cinfo.output_scanline-1, row, 8); + + if (pl && !(cinfo.output_scanline%100)) + pl->setProgress ((double)(cinfo.output_scanline)/cinfo.output_height); + } + delete [] row; + + jpeg_finish_decompress(&cinfo); + jpeg_destroy_decompress(&cinfo); + if (pl) { + pl->setProgressStr ("Ready."); + pl->setProgress (1.0); + } + return IMIO_SUCCESS; + } + else { + jpeg_destroy_decompress(&cinfo); + return IMIO_READERROR; + } +} + +int ImageIO::loadJPEG (Glib::ustring fname) { + + FILE *file=g_fopen(fname.c_str(),"rb"); + if (!file) + return IMIO_CANNOTREADFILE; + + jpeg_decompress_struct cinfo; + jpeg_error_mgr jerr; + cinfo.err = my_jpeg_std_error(&jerr); + jpeg_create_decompress(&cinfo); + my_jpeg_stdio_src (&cinfo,file); + + if (pl) { + pl->setProgressStr ("Loading JPEG file..."); + pl->setProgress (0.0); + + } + + setup_read_icc_profile (&cinfo); + + if (!setjmp(jpeg_jmp_buf)) { + jpeg_stdio_src(&cinfo,file); + jpeg_read_header(&cinfo, TRUE); + + unsigned int proflen; + delete loadedProfileData; + loadedProfileData = NULL; + bool hasprofile = read_icc_profile (&cinfo, (JOCTET**)&loadedProfileData, (unsigned int*)&loadedProfileLength); + if (hasprofile) + embProfile = cmsOpenProfileFromMem (loadedProfileData, loadedProfileLength); + else + embProfile = NULL; + + jpeg_start_decompress(&cinfo); + + int width = cinfo.output_width; + int height = cinfo.output_height; + + allocate (width, height); + + unsigned char *row=new unsigned char[width*3]; + while (cinfo.output_scanline < height) { + if (jpeg_read_scanlines(&cinfo,&row,1) < 1) { + jpeg_finish_decompress(&cinfo); + jpeg_destroy_decompress(&cinfo); + delete [] row; + return IMIO_READERROR; + } + setScanline (cinfo.output_scanline-1, row, 8); + + if (pl && !(cinfo.output_scanline%100)) + pl->setProgress ((double)(cinfo.output_scanline)/cinfo.output_height); + } + delete [] row; + + jpeg_finish_decompress(&cinfo); + jpeg_destroy_decompress(&cinfo); + fclose(file); + if (pl) { + pl->setProgressStr ("Ready."); + pl->setProgress (1.0); + } + return IMIO_SUCCESS; + } + else { + jpeg_destroy_decompress(&cinfo); + return IMIO_READERROR; + } +} + +int ImageIO::loadTIFF (Glib::ustring fname) { + +#ifdef WIN32 + wchar_t *wfilename = (wchar_t*)g_utf8_to_utf16 (fname.c_str(), -1, NULL, NULL, NULL); + TIFF* in = TIFFOpenW (wfilename, "r"); + g_free (wfilename); +#else + TIFF* in = TIFFOpen(fname.c_str(), "r"); +#endif + if (in == NULL) + return IMIO_CANNOTREADFILE; + + if (pl) { + pl->setProgressStr ("Loading TIFF file..."); + pl->setProgress (0.0); + } + + int width, height; + TIFFGetField(in, TIFFTAG_IMAGEWIDTH, &width); + TIFFGetField(in, TIFFTAG_IMAGELENGTH, &height); + + uint16 bitspersample, samplesperpixel; + TIFFGetField(in, TIFFTAG_BITSPERSAMPLE, &bitspersample); + TIFFGetField(in, TIFFTAG_SAMPLESPERPIXEL, &samplesperpixel); + uint16 photometric; + if (!TIFFGetField(in, TIFFTAG_PHOTOMETRIC, &photometric) || + photometric != PHOTOMETRIC_RGB || samplesperpixel < 3) { + TIFFClose(in); + return IMIO_VARIANTNOTSUPPORTED; + } + + uint16 config; + TIFFGetField(in, TIFFTAG_PLANARCONFIG, &config); + if (config != PLANARCONFIG_CONTIG) { + TIFFClose(in); + return IMIO_VARIANTNOTSUPPORTED; + } + + char* profdata; + delete loadedProfileData; + loadedProfileData = NULL; + if (TIFFGetField(in, TIFFTAG_ICCPROFILE, &loadedProfileLength, &profdata)) { + embProfile = cmsOpenProfileFromMem (profdata, loadedProfileLength); + loadedProfileData = new char [loadedProfileLength]; + memcpy (loadedProfileData, profdata, loadedProfileLength); + } + else + embProfile = NULL; + + + allocate (width, height); + + unsigned char* linebuffer = new unsigned char[TIFFScanlineSize(in)]; + for (int row = 0; row < height; row++) { + if (TIFFReadScanline(in, linebuffer, row, 0) <0) { + TIFFClose(in); + delete [] linebuffer; + return IMIO_READERROR; + } + if (samplesperpixel>3) + for (int i=0; isetProgress ((double)(row+1)/height); + } + TIFFClose(in); + delete [] linebuffer; + + if (pl) { + pl->setProgressStr ("Ready."); + pl->setProgress (1.0); + } + + return IMIO_SUCCESS; +} + + +int ImageIO::savePNG (Glib::ustring fname, int compression, int bps) { + + // create a temporary file name that is opened in parallel by e.g. image viewers whilte RT is still writing + Glib::ustring tmpFname=fname; + tmpFname.append(".tmp"); + + FILE *file = g_fopen (safe_locale_from_utf8(tmpFname).c_str (), "wb"); + + if (!file) + return IMIO_CANNOTREADFILE; + + if (pl) { + pl->setProgressStr ("Saving PNG file..."); + pl->setProgress (0.0); + } + + png_structp png = png_create_write_struct (PNG_LIBPNG_VER_STRING,0,0,0); + if (!png) { + fclose (file); + return IMIO_HEADERERROR; + } + png_infop info = png_create_info_struct(png); + if (!info) { + png_destroy_write_struct (&png,0); + fclose (file); + return IMIO_HEADERERROR; + } + + if (setjmp(png_jmpbuf(png))) { + png_destroy_write_struct (&png,&info); + fclose(file); + return IMIO_READERROR; + } + + png_set_write_fn (png, file, png_write_data, png_flush); + + png_set_compression_level(png,compression); + + int width = getW (); + int height = getH (); + if (bps<0) + bps = getBPS (); + + png_set_IHDR(png, info, width, height, bps, PNG_COLOR_TYPE_RGB, + PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT,PNG_FILTER_TYPE_BASE); + + + int rowlen = width*3*bps/8; + unsigned char *row = new unsigned char [rowlen]; + + png_write_info(png,info); + for (unsigned int i=0;isetProgress ((double)(i+1)/height); + } + + png_write_end(png,info); + png_destroy_write_struct(&png,&info); + + delete [] row; + fclose (file); + + // Rename temporary filename, practically atomic + g_rename(safe_locale_from_utf8(tmpFname).c_str (),safe_locale_from_utf8(fname).c_str ()); + + if (pl) { + pl->setProgressStr ("Ready."); + pl->setProgress (1.0); + } + + return IMIO_SUCCESS; +} + + +int ImageIO::saveJPEG (Glib::ustring fname, int quality) { + + jpeg_compress_struct cinfo; + jpeg_error_mgr jerr; + + cinfo.err = jpeg_std_error (&jerr); + jpeg_create_compress (&cinfo); + + // create a temporary file name that is opened in parallel by e.g. image viewers whilte RT is still writing + Glib::ustring tmpFname=fname; + tmpFname.append(".tmp"); + + FILE *file = g_fopen (safe_locale_from_utf8(tmpFname).c_str (), "wb"); + + if (!file) + return IMIO_CANNOTREADFILE; + + if (pl) { + pl->setProgressStr ("Saving JPEG file..."); + pl->setProgress (0.0); + } + + jpeg_stdio_dest (&cinfo, file); + + int width = getW (); + int height = getH (); + + cinfo.image_width = width; + cinfo.image_height = height; + cinfo.in_color_space = JCS_RGB; + cinfo.input_components = 3; + jpeg_set_defaults (&cinfo); + cinfo.write_JFIF_header = FALSE; + + // compute optimal Huffman coding tables for the image. Bit slower to generate, but size of result image is a bit less (default was FALSE) + cinfo.optimize_coding = TRUE; + + // Since math coprocessors are common these days, FLOAT should be a bit more accurate AND fast (default is ISLOW) + // (machine dependency is not really an issue, since we all run on x86 and having exactly the same file is not a requirement) + cinfo.dct_method = JDCT_FLOAT; + + if (quality>=0 && quality<=100) + jpeg_set_quality (&cinfo, quality, true); + + jpeg_start_compress(&cinfo, TRUE); + + // buffer for exif and iptc markers + unsigned char buffer[165535]; + unsigned int size; + // assemble and write exif marker + if (exifRoot) { + int size = rtexif::ExifManager::createJPEGMarker (exifRoot, exifChange, cinfo.image_width, cinfo.image_height, buffer); + if (size>0 && size<65530) + jpeg_write_marker(&cinfo, JPEG_APP0+1, buffer, size); + } + // assemble and write iptc marker + if (iptc) { + unsigned char* iptcdata; + bool error = false; + if (iptc_data_save (iptc, &iptcdata, &size)) { + if (iptcdata) + iptc_data_free_buf (iptc, iptcdata); + error = true; + } + int bytes = 0; + if (!error && (bytes = iptc_jpeg_ps3_save_iptc (NULL, 0, iptcdata, size, buffer, 65532)) < 0) { + if (iptcdata) + iptc_data_free_buf (iptc, iptcdata); + error = true; + } + if (!error) + jpeg_write_marker(&cinfo, JPEG_APP0+13, buffer, bytes); + } + // write icc profile to the output + if (profileData) + write_icc_profile (&cinfo, (JOCTET*)profileData, profileLength); + + // write image data + int rowlen = width*3; + unsigned char *row = new unsigned char [rowlen]; + + while (cinfo.next_scanline < cinfo.image_height) { + + getScanline (cinfo.next_scanline, row, 8); + + if (jpeg_write_scanlines (&cinfo, &row, 1) < 1) { + jpeg_finish_compress (&cinfo); + jpeg_destroy_compress (&cinfo); + fclose (file); + return IMIO_READERROR; + } + + if (pl && !(cinfo.next_scanline%100)) + pl->setProgress ((double)(cinfo.next_scanline)/cinfo.image_height); + } + + jpeg_finish_compress (&cinfo); + jpeg_destroy_compress (&cinfo); + + delete [] row; + fclose (file); + + // Rename temporary filename, practically atomic + g_rename(safe_locale_from_utf8(tmpFname).c_str (),safe_locale_from_utf8(fname).c_str ()); + + if (pl) { + pl->setProgressStr ("Ready."); + pl->setProgress (1.0); + } + + return IMIO_SUCCESS; +} + +int ImageIO::saveTIFF (Glib::ustring fname, int bps, bool uncompressed) { + + int width = getW (); + int height = getH (); + + if (bps<0) + bps = getBPS (); + + int lineWidth = width*3*bps/8; + unsigned char* linebuffer = new unsigned char[lineWidth]; +// TODO the following needs to be looked into - do we really need two ways to write a Tiff file ? + if (exifRoot && uncompressed) { + FILE *file = g_fopen (safe_locale_from_utf8(fname).c_str (), "wb"); + + if (!file) + return IMIO_CANNOTREADFILE; + + if (pl) { + pl->setProgressStr ("Saving TIFF file ..."); + pl->setProgress (0.0); + } + + // buffer for the exif and iptc + unsigned char buffer[165535]; + unsigned char* iptcdata = NULL; + unsigned int iptclen = 0; + if (iptc && iptc_data_save (iptc, &iptcdata, &iptclen) && iptcdata) { + iptc_data_free_buf (iptc, iptcdata); + iptcdata = NULL; + } + int size = rtexif::ExifManager::createTIFFHeader (exifRoot, exifChange, width, height, bps, profileData, profileLength, (char*)iptcdata, iptclen, buffer); + if (iptcdata) + iptc_data_free_buf (iptc, iptcdata); + if (size>0 && size<165530) + fwrite (buffer, size, 1, file); + + bool needsReverse = bps==16 && exifRoot->getOrder()==rtexif::MOTOROLA; + + for (int i=0; isetProgress ((double)(i+1)/height); + } + + fclose (file); + } + else { + // little hack to get libTiff to use proper byte order (see TIFFClienOpen()): + const char *mode = !exifRoot ? "w" : (exifRoot->getOrder()==rtexif::INTEL ? "wl":"wb"); + #ifdef WIN32 + wchar_t *wfilename = (wchar_t*)g_utf8_to_utf16 (fname.c_str(), -1, NULL, NULL, NULL); + TIFF* out = TIFFOpenW (wfilename, mode); + g_free (wfilename); + #else + TIFF* out = TIFFOpen(fname.c_str(), mode); + #endif + if (!out) + return IMIO_CANNOTREADFILE; + + if (pl) { + pl->setProgressStr ("Saving TIFF file ..."); + pl->setProgress (0.0); + } + + if (exifRoot){ + rtexif::Tag *tag = exifRoot->getTag (TIFFTAG_EXIFIFD); + if (tag && tag->isDirectory()){ + rtexif::TagDirectory *exif = tag->getDirectory(); + if (exif) { + int exif_size = exif->calculateSize(); + unsigned char *buffer = new unsigned char[exif_size+8]; + // TIFFOpen writes out the header and sets file pointer at position 8 + + exif->write (8, buffer); + write (TIFFFileno (out), buffer+8, exif_size); + delete buffer; + // let libtiff know that scanlines or any other following stuff should go + // at a different offset: + TIFFSetWriteOffset (out, exif_size+8); + TIFFSetField (out, TIFFTAG_EXIFIFD, 8); + } + } + +//TODO Even though we are saving EXIF IFD - MakerNote still comes out screwy. + + if ((tag = exifRoot->getTag (TIFFTAG_MODEL)) != NULL) + TIFFSetField (out, TIFFTAG_MODEL, tag->getValue()); + if ((tag = exifRoot->getTag (TIFFTAG_MAKE)) != NULL) + TIFFSetField (out, TIFFTAG_MAKE, tag->getValue()); + if ((tag = exifRoot->getTag (TIFFTAG_DATETIME)) != NULL) + TIFFSetField (out, TIFFTAG_DATETIME, tag->getValue()); + if ((tag = exifRoot->getTag (TIFFTAG_ARTIST)) != NULL) + TIFFSetField (out, TIFFTAG_ARTIST, tag->getValue()); + if ((tag = exifRoot->getTag (TIFFTAG_COPYRIGHT)) != NULL) + TIFFSetField (out, TIFFTAG_COPYRIGHT, tag->getValue()); + + } + + TIFFSetField (out, TIFFTAG_SOFTWARE, "RawTherapee 3"); + TIFFSetField (out, TIFFTAG_IMAGEWIDTH, width); + TIFFSetField (out, TIFFTAG_IMAGELENGTH, height); + TIFFSetField (out, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); + TIFFSetField (out, TIFFTAG_SAMPLESPERPIXEL, 3); + TIFFSetField(out, TIFFTAG_ROWSPERSTRIP, height); + TIFFSetField (out, TIFFTAG_BITSPERSAMPLE, bps); + TIFFSetField (out, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); + TIFFSetField (out, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT); + TIFFSetField (out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB); + TIFFSetField (out, TIFFTAG_COMPRESSION, uncompressed ? COMPRESSION_NONE : COMPRESSION_DEFLATE); + if (!uncompressed) + TIFFSetField (out, TIFFTAG_PREDICTOR, PREDICTOR_NONE); + + if (profileData) + TIFFSetField (out, TIFFTAG_ICCPROFILE, profileLength, profileData); + + for (int row = 0; row < height; row++) { + getScanline (row, linebuffer, bps); + + if (TIFFWriteScanline (out, linebuffer, row, 0) < 0) { + TIFFClose (out); + delete [] linebuffer; + return IMIO_READERROR; + } + if (pl && !(row%100)) + pl->setProgress ((double)(row+1)/height); + } + TIFFClose (out); + } + + delete [] linebuffer; + if (pl) { + pl->setProgressStr ("Ready."); + pl->setProgress (1.0); + } + + return IMIO_SUCCESS; +} + +// PNG read and write routines: + +void png_read_data(png_structp png_ptr, png_bytep data, png_size_t length) { + png_size_t check; + + /* fread() returns 0 on error, so it is OK to store this in a png_size_t + * instead of an int, which is what fread() actually returns. + */ + check = (png_size_t)fread(data, (png_size_t)1, length, (FILE *)png_ptr->io_ptr); + + if (check != length) + { + png_error(png_ptr, "Read Error"); + } +} + +void png_write_data(png_structp png_ptr, png_bytep data, png_size_t length) { + png_uint_32 check; + + check = fwrite(data, 1, length, (FILE *)(png_ptr->io_ptr)); + if (check != length) + { + png_error(png_ptr, "Write Error"); + } +} + +void png_flush(png_structp png_ptr) { + FILE *io_ptr; + io_ptr = (FILE *)CVT_PTR((png_ptr->io_ptr)); + if (io_ptr != NULL) + fflush(io_ptr); +} + +int ImageIO::load (Glib::ustring fname) { + + int lastdot = fname.find_last_of ('.'); + + if (!fname.casefold().compare (lastdot, 4, ".png")) + return loadPNG (fname); + else if (!fname.casefold().compare (lastdot, 4, ".jpg")) + return loadJPEG (fname); + else if (!fname.casefold().compare (lastdot, 4, ".tif")) + return loadTIFF (fname); + else return IMIO_FILETYPENOTSUPPORTED; +} + +int ImageIO::save (Glib::ustring fname) { + + int lastdot = fname.find_last_of ('.'); + + if (!fname.casefold().compare (lastdot, 4, ".png")) + return savePNG (fname); + else if (!fname.casefold().compare (lastdot, 4, ".jpg")) + return saveJPEG (fname); + else if (!fname.casefold().compare (lastdot, 4, ".tif")) + return saveTIFF (fname); + else return IMIO_FILETYPENOTSUPPORTED; +} + diff --git a/rtengine/imageio.h b/rtengine/imageio.h index 5c7a2a033..a036060b0 100644 --- a/rtengine/imageio.h +++ b/rtengine/imageio.h @@ -72,6 +72,8 @@ class ImageIO { int loadJPEG (Glib::ustring fname); int loadTIFF (Glib::ustring fname); + int loadJPEGFromMemory (const char* buffer, int bufsize); + int savePNG (Glib::ustring fname, int compression = -1, int bps = -1); int saveJPEG (Glib::ustring fname, int quality = 100); int saveTIFF (Glib::ustring fname, int bps = -1, bool uncompressed = false); diff --git a/rtengine/imagesource.h b/rtengine/imagesource.h index 1d4850e01..ceecf37b2 100644 --- a/rtengine/imagesource.h +++ b/rtengine/imagesource.h @@ -65,7 +65,7 @@ class ImageSource : public InitialImage { ImageSource () : references (1), embProfile(NULL), idata(NULL) {} virtual ~ImageSource () {} - virtual int load (Glib::ustring fname) =0; + virtual int load (Glib::ustring fname, bool batch = false) =0; virtual void preprocess (const RAWParams &raw){}; virtual void demosaic (const RAWParams &raw){}; virtual void getImage (ColorTemp ctemp, int tran, Image16* image, PreviewProps pp, HRecParams hlp, ColorManagementParams cmp, RAWParams raw) {} diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 03f3fb78a..44715697d 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -20,6 +20,7 @@ #include #include #include +#include #define CLIPTO(a,b,c) ((a)>b?((a)getDefGain(), imgsrc->getGamma(), true, params.toneCurve.curve, vhist16, tonecurve, bcrgbhist, scale==1 ? 1 : 1); - ipf.rgbProc (oprevi, oprevl, tonecurve, shmap); + CurveFactory::complexCurve (params.toneCurve.expcomp, params.toneCurve.black/65535.0, params.toneCurve.hlcompr, params.toneCurve.shcompr, params.toneCurve.brightness, params.toneCurve.contrast, imgsrc->getDefGain(), imgsrc->getGamma(), true, params.toneCurve.curve, vhist16, tonecurve1, tonecurve2, bcrgbhist, scale==1 ? 1 : 1); + ipf.rgbProc (oprevi, oprevl, tonecurve1, tonecurve2, shmap); // recompute luminance histogram memset (lhist16, 0, 65536*sizeof(int)); @@ -176,15 +177,23 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) { } readyphase++; - if (todo & M_LUMACURVE) - CurveFactory::complexCurve (0.0, 0.0, 0.0, 0.0, params.lumaCurve.brightness, params.lumaCurve.contrast, 0.0, 0.0, false, params.lumaCurve.curve, lhist16, lumacurve, bcLhist, scale==1 ? 1 : 16); - + if (todo & M_LUMACURVE) { + CurveFactory::complexCurve (0.0, 0.0, 0.0, 0.0, params.labCurve.brightness, params.labCurve.contrast, 0.0, 0.0, false, params.labCurve.lcurve, lhist16, lumacurve1, lumacurve2, bcLhist, scale==1 ? 1 : 16); + CurveFactory::complexsgnCurve (0.0, 100.0, params.labCurve.saturation, 1.0, params.labCurve.acurve, chroma_acurve, scale==1 ? 1 : 16); + CurveFactory::complexsgnCurve (0.0, 100.0, params.labCurve.saturation, 1.0, params.labCurve.bcurve, chroma_bcurve, scale==1 ? 1 : 16); + } + + if (todo & (M_LUMINANCE+M_COLOR) ) { progress ("Applying Luminance Curve...",100*readyphase/numofphases); - ipf.luminanceCurve (oprevl, nprevl, lumacurve, 0, pH); + ipf.luminanceCurve (oprevl, nprevl, lumacurve2, 0, pH); + readyphase++; progress ("Applying Color Boost...",100*readyphase/numofphases); - ipf.colorCurve (oprevl, nprevl); + ipf.chrominanceCurve (oprevl, nprevl, 0, chroma_acurve, 0, pH); + ipf.chrominanceCurve (oprevl, nprevl, 1, chroma_bcurve, 0, pH); + ipf.colorCurve (nprevl, nprevl); + readyphase++; if (scale==1) { progress ("Denoising luminance impulse...",100*readyphase/numofphases); @@ -228,7 +237,16 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) { progress ("Conversion to RGB...",100*readyphase/numofphases); if (todo!=CROP) { previmg->getMutex().lock(); - ipf.lab2rgb (nprevl, previmg); + try + { + ipf.lab2rgb (nprevl, previmg); + } + catch(char * str) + { + progress ("Error converting file...",0); + mProcessing.unlock (); + return; + } previmg->getMutex().unlock(); } if (!resultValid) { @@ -538,7 +556,11 @@ void ImProcCoordinator::startProcessing () { thread = NULL; updaterRunning = true; updaterThreadStart.unlock (); - thread = Glib::Thread::create(sigc::mem_fun(*this, &ImProcCoordinator::process), 0, false, true, Glib::THREAD_PRIORITY_NORMAL); + + batchThread->yield(); //the running batch should wait other threads to avoid conflict + + thread = Glib::Thread::create(sigc::mem_fun(*this, &ImProcCoordinator::process), 0, true, true, Glib::THREAD_PRIORITY_NORMAL); + } else updaterThreadStart.unlock (); diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index cf81c20b4..b45857acb 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -62,13 +62,18 @@ class ImProcCoordinator : public StagedImageProcessor { void freeAll (); - int tonecurve [65536]; - int lumacurve [65536]; + int tonecurve1 [65536]; + int tonecurve2 [65536]; + + int lumacurve1 [65536]; + int lumacurve2 [65536]; + int chroma_acurve [65536]; + int chroma_bcurve [65536]; unsigned int vhist16[65536]; unsigned int lhist16[65536]; - unsigned int rhist[256], ghist[256], bhist[256], Lhist[256], bcrgbhist[256], bcLhist[256]; + unsigned int rhist[256], ghist[256], bhist[256], Lhist[256], bcrgbhist[256], bcLhist[256], bcabhist[256]; int fw, fh, tr, fullw, fullh; int pW, pH; diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 7b11e1a79..07e771092 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -124,7 +124,7 @@ void ImProcFunctions::setScale (double iscale) { void ImProcFunctions::firstAnalysis_ (Image16* original, Glib::ustring wprofile, unsigned int* histogram, int* chroma_radius, int row_from, int row_to) { - TMatrix wprof = iccStore.workingSpaceMatrix (wprofile); + TMatrix wprof = iccStore->workingSpaceMatrix (wprofile); int toxyz[3][3]; toxyz[0][0] = round(32768.0 * wprof[0][0] / 0.96422); toxyz[1][0] = round(32768.0 * wprof[1][0] / 0.96422); @@ -184,12 +184,12 @@ void ImProcFunctions::firstAnalysis (Image16* original, const ProcParams* params if (monitorTransform) cmsDeleteTransform (monitorTransform); monitorTransform = NULL; - cmsHPROFILE monitor = iccStore.getProfile ("file:"+settings->monitorProfile); + cmsHPROFILE monitor = iccStore->getProfile ("file:"+settings->monitorProfile); if (monitor) { - cmsHPROFILE iprof = iccStore.getXYZProfile (); - cmsHPROFILE oprof = iccStore.getProfile (params->icm.output); + cmsHPROFILE iprof = iccStore->getXYZProfile (); + cmsHPROFILE oprof = iccStore->getProfile (params->icm.output); if (!oprof) - oprof = iccStore.getsRGBProfile (); + oprof = iccStore->getsRGBProfile (); lcmsMutex->lock (); monitorTransform = cmsCreateTransform (iprof, TYPE_RGB_16, monitor, TYPE_RGB_8, settings->colorimetricIntent, 0); lcmsMutex->unlock (); @@ -245,7 +245,7 @@ void ImProcFunctions::firstAnalysis (Image16* original, const ProcParams* params delete [] hist; } -void ImProcFunctions::rgbProc (Image16* working, LabImage* lab, int* tonecurve, SHMap* shmap) { +void ImProcFunctions::rgbProc (Image16* working, LabImage* lab, int* tonecurve1, int* tonecurve2, SHMap* shmap) { int h_th, s_th; if (shmap) { @@ -257,7 +257,7 @@ void ImProcFunctions::rgbProc (Image16* working, LabImage* lab, int* tonecurve, bool processLCE = params->sh.enabled && shmap!=NULL && params->sh.localcontrast>0; double lceamount = params->sh.localcontrast / 200.0; - TMatrix wprof = iccStore.workingSpaceMatrix (params->icm.working); + TMatrix wprof = iccStore->workingSpaceMatrix (params->icm.working); int toxyz[3][3] = { { floor(32768.0 * wprof[0][0] / 0.96422), @@ -321,10 +321,43 @@ void ImProcFunctions::rgbProc (Image16* working, LabImage* lab, int* tonecurve, b = CLIP((int)(factor*b)); } } - r = tonecurve[r]; + /*r = tonecurve[r]; g = tonecurve[g]; - b = tonecurve[b]; + b = tonecurve[b];*/ + int Y = (0.299*r + 0.587*g + 0.114*b); + int Ynew = tonecurve1[Y]; + float tonefactor = (Y>0 ? (float)Ynew/Y : 1); + r *= tonefactor; + g *= tonefactor; + b *= tonefactor; + /*float maxfactor = 1; + if (r>65535) + maxfactor = MIN(maxfactor, (float)(65535.0f-Ynew)/(r-Ynew)); + if (g>65535) + maxfactor = MIN(maxfactor, (float)(65535.0f-Ynew)/(g-Ynew)); + if (b>65535) + maxfactor = MIN(maxfactor, (float)(65535.0f-Ynew)/(b-Ynew)); + + if (r<0) + maxfactor = MIN(maxfactor, ((float)Ynew)/(Ynew-r)); + if (g<0) + maxfactor = MIN(maxfactor, ((float)Ynew)/(Ynew-g)); + if (b<0) + maxfactor = MIN(maxfactor, ((float)Ynew)/(Ynew-b)); + + float U = (float)(-0.14713*r - 0.28886*g + 0.436*b)*maxfactor; + float V = (float)(0.615*r - 0.51499*g - 0.10001*b)*maxfactor; + + r = CLIP(Ynew + 1.13983*V); + g = CLIP(Ynew - 0.39465*U - 0.58060*V); + b = CLIP(Ynew + 2.03211*U);*/ + + r = tonecurve2[CLIP(r)]; + g = tonecurve2[CLIP(g)]; + b = tonecurve2[CLIP(b)]; + + int x = (toxyz[0][0] * r + toxyz[1][0] * g + toxyz[2][0] * b) >> 15; int y = (toxyz[0][1] * r + toxyz[1][1] * g + toxyz[2][1] * b) >> 15; int z = (toxyz[0][2] * r + toxyz[1][2] * g + toxyz[2][2] * b) >> 15; @@ -344,11 +377,27 @@ void ImProcFunctions::rgbProc (Image16* working, LabImage* lab, int* tonecurve, void ImProcFunctions::luminanceCurve (LabImage* lold, LabImage* lnew, int* curve, int row_from, int row_to) { int W = lold->W; - int H = lold->H; + //int H = lold->H; for (int i=row_from; iL[i][j] = curve[lold->L[i][j]]; } + + void ImProcFunctions::chrominanceCurve (LabImage* lold, LabImage* lnew, int channel, int* curve, int row_from, int row_to) { + + int W = lold->W; + //int H = lold->H; + if (channel==0) { + for (int i=row_from; ia[i][j] = curve[lold->a[i][j]+32768]-32768; + } + if (channel==1) { + for (int i=row_from; ib[i][j] = curve[lold->b[i][j]+32768]-32768; + } + } #include "cubic.cc" @@ -458,6 +507,9 @@ void ImProcFunctions::colorCurve (LabImage* lold, LabImage* lnew) { void ImProcFunctions::lumadenoise (LabImage* lab, int** b2) { if (params->lumaDenoise.enabled && lab->W>=8 && lab->H>=8) +#ifdef _OPENMP +#pragma omp parallel +#endif bilateral (lab->L, lab->L, (unsigned short**)b2, lab->W, lab->H, params->lumaDenoise.radius / scale, params->lumaDenoise.edgetolerance, multiThread); } @@ -465,10 +517,10 @@ void ImProcFunctions::colordenoise (LabImage* lab, int** b2) { if (params->colorDenoise.enabled && lab->W>=8 && lab->H>=8) { #ifdef _OPENMP - AlignedBuffer* buffer = new AlignedBuffer (MAX(lab->W,lab->H)*omp_get_max_threads()); -#else - AlignedBuffer* buffer = new AlignedBuffer (MAX(lab->W,lab->H)); +#pragma omp parallel #endif + { + AlignedBuffer* buffer = new AlignedBuffer (MAX(lab->W,lab->H)); gaussHorizontal (lab->a, lab->a, buffer, lab->W, lab->H, params->colorDenoise.amount / 10.0 / scale, multiThread); gaussHorizontal (lab->b, lab->b, buffer, lab->W, lab->H, params->colorDenoise.amount / 10.0 / scale, multiThread); gaussVertical (lab->a, lab->a, buffer, lab->W, lab->H, params->colorDenoise.amount / 10.0 / scale, multiThread); @@ -476,6 +528,7 @@ void ImProcFunctions::colordenoise (LabImage* lab, int** b2) { delete buffer; } + } } void ImProcFunctions::getAutoExp (unsigned int* histogram, int histcompr, double expcomp, double clip, double& br, int& bl) { @@ -506,7 +559,7 @@ void ImProcFunctions::getAutoExp (unsigned int* histogram, int histcompr, doubl double corr = pow(2.0, expcomp); // black point selection is based on the linear result (yielding better visual results) - bl = (int)(shc * corr); + bl = (int)(shc /* * corr*/); // compute the white point of the exp. compensated gamma corrected image double awg = (int)(CurveFactory::gamma2 (aw * corr / 65536.0) * 65536.0); diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index d065cfac3..7de8b703b 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -79,8 +79,9 @@ class ImProcFunctions { bool needsTransform (); void firstAnalysis (Image16* working, const ProcParams* params, unsigned int* vhist16, double gamma); - void rgbProc (Image16* working, LabImage* lab, int* tonecurve, SHMap* shmap); + void rgbProc (Image16* working, LabImage* lab, int* tonecurve1, int* tonecurve2, SHMap* shmap); void luminanceCurve (LabImage* lold, LabImage* lnew, int* curve, int row_from, int row_to); + void chrominanceCurve (LabImage* lold, LabImage* lnew, int channel, int* curve, int row_from, int row_to); void colorCurve (LabImage* lold, LabImage* lnew); void sharpening (LabImage* lab, unsigned short** buffer); void lumadenoise (LabImage* lab, int** buffer); diff --git a/rtengine/impulse_denoise.h b/rtengine/impulse_denoise.h index ed9d226fb..f1bb9bf3c 100644 --- a/rtengine/impulse_denoise.h +++ b/rtengine/impulse_denoise.h @@ -24,15 +24,17 @@ #include // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -// Gabor's implementation of bilateral filtering, without input pixel +// modified version of Gabor's implementation of bilateral filtering, without input pixel #define NBRWT(a,b) (src[i - a][j - b] * ec[src[i - a][j - b]-src[i][j]+0x10000]) -#define NORM(a,b) (1 + ec[src[i - a][j - b]-src[i][j]+0x10000]) +#define NORM(a,b) (ec[src[i - a][j - b]-src[i][j]+0x10000]) + +//ec[i] = (int)(exp(-(double)(i-0x10000)*(double)(i-0x10000) / (2.0*rangewidth*rangewidth))*scale); \ #define RB_BEGIN(a,b) double scale = (a); \ int* ec = new int [0x20000]; \ for (int i=0; i<0x20000; i++) \ - ec[i] = (int)(exp(-(double)(i-0x10000)*(double)(i-0x10000) / (2.0*rangewidth*rangewidth))*scale); \ + ec[i] = (int)(1 + 1024/(abs(i-0x10000) + 1)); \ int rstart = b; \ int rend = H-b; \ int cstart = b; \ @@ -97,7 +99,7 @@ template void impulse_nr (T** src, T** dst, int width, int height, doub //The cleaning algorithm starts here //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - // modified bilateral filter for lowpass image, omitting input pixel + // modified bilateral filter for lowpass image, omitting input pixel; or Gaussian blur static float eps = 1.0; float wtdsum, dirwt, norm; @@ -127,7 +129,7 @@ template void impulse_nr (T** src, T** dst, int width, int height, doub hfnbrave = (hfnbrave-hpfabs)/24; hpfabs>(hfnbrave*(5.5-thresh)) ? impish[i][j]=1 : impish[i][j]=0; - }//now impulsive values have been corrected + }//now impulsive values have been identified for (int i=0; i < height; i++) for (int j=0; j < width; j++) { diff --git a/rtengine/init.cc b/rtengine/init.cc index 86044077c..eca8ed7ff 100644 --- a/rtengine/init.cc +++ b/rtengine/init.cc @@ -33,7 +33,7 @@ Glib::Mutex* lcmsMutex = NULL; int init (const Settings* s) { settings = s; - iccStore.parseDir (s->iccDirectory); + iccStore->parseDir (s->iccDirectory); CurveFactory::init (); ImProcFunctions::initCache (); delete dcrMutex; diff --git a/rtengine/iplab2rgb.cc b/rtengine/iplab2rgb.cc index 659d839a2..95900da69 100644 --- a/rtengine/iplab2rgb.cc +++ b/rtengine/iplab2rgb.cc @@ -38,6 +38,9 @@ extern const Settings* settings; void ImProcFunctions::lab2rgb (LabImage* lab, Image8* image) { + if (chroma_scale == 0) + return; + if (monitorTransform) { int ix = 0; short* buffer = new short [3*lab->W]; @@ -111,10 +114,10 @@ Image8* ImProcFunctions::lab2rgb (LabImage* lab, int cx, int cy, int cw, int ch, Image8* image = new Image8 (cw, ch); - cmsHPROFILE oprof = iccStore.getProfile (profile); + cmsHPROFILE oprof = iccStore->getProfile (profile); if (oprof) { - cmsHPROFILE iprof = iccStore.getXYZProfile (); + cmsHPROFILE iprof = iccStore->getXYZProfile (); lcmsMutex->lock (); cmsHTRANSFORM hTransform = cmsCreateTransform (iprof, TYPE_RGB_16, oprof, TYPE_RGB_8, settings->colorimetricIntent, 0); lcmsMutex->unlock (); @@ -190,7 +193,7 @@ Image16* ImProcFunctions::lab2rgb16 (LabImage* lab, int cx, int cy, int cw, int Image16* image = new Image16 (cw, ch); - cmsHPROFILE oprof = iccStore.getProfile (profile); + cmsHPROFILE oprof = iccStore->getProfile (profile); if (oprof) { #pragma omp parallel for if (multiThread) @@ -219,7 +222,7 @@ Image16* ImProcFunctions::lab2rgb16 (LabImage* lab, int cx, int cy, int cw, int za[j-cx] = CLIP(z_); } } - cmsHPROFILE iprof = iccStore.getXYZProfile (); + cmsHPROFILE iprof = iccStore->getXYZProfile (); lcmsMutex->lock (); cmsHTRANSFORM hTransform = cmsCreateTransform (iprof, TYPE_RGB_16_PLANAR, oprof, TYPE_RGB_16_PLANAR, settings->colorimetricIntent, 0); lcmsMutex->unlock (); diff --git a/rtengine/ipsharpen.cc b/rtengine/ipsharpen.cc index 98345d98f..7fb3bbc81 100644 --- a/rtengine/ipsharpen.cc +++ b/rtengine/ipsharpen.cc @@ -37,7 +37,9 @@ namespace rtengine { void ImProcFunctions::dcdamping (float** aI, unsigned short** aO, float damping, int W, int H) { - #pragma omp parallel for if (multiThread) +#ifdef _OPENMP +#pragma omp for +#endif for (int i=0; i* buffer = new AlignedBuffer (MAX(W,H)*omp_get_max_threads()); -#else - AlignedBuffer* buffer = new AlignedBuffer (MAX(W,H)); +#pragma omp parallel #endif + { + AlignedBuffer* buffer = new AlignedBuffer (MAX(W,H)); float damping = params->sharpening.deconvdamping / 5.0; bool needdamp = params->sharpening.deconvdamping > 0; for (int k=0; ksharpening.deconviter; k++) { @@ -82,7 +84,9 @@ void ImProcFunctions::deconvsharpening (LabImage* lab, unsigned short** b2) { gaussVertical (tmp, tmp, buffer, W, H, params->sharpening.deconvradius / scale, multiThread); if (!needdamp) { - #pragma omp parallel for if (multiThread) +#ifdef _OPENMP +#pragma omp for +#endif for (int i=0; i0) @@ -94,17 +98,25 @@ void ImProcFunctions::deconvsharpening (LabImage* lab, unsigned short** b2) { gaussHorizontal (tmp, tmp, buffer, W, H, params->sharpening.deconvradius / scale, multiThread); gaussVertical (tmp, tmp, buffer, W, H, params->sharpening.deconvradius / scale, multiThread); - #pragma omp parallel for if (multiThread) +#ifdef _OPENMP +#pragma omp for +#endif for (int i=0; iL[i][j] = lab->L[i][j]*(100-params->sharpening.deconvamount) / 100 + (int)CLIP(tmpI[i][j])*params->sharpening.deconvamount / 100; + + for (int i=0; iW, H = lab->H; - unsigned short** b3; #ifdef _OPENMP - AlignedBuffer* buffer = new AlignedBuffer (MAX(W,H)*omp_get_max_threads()); -#else - AlignedBuffer* buffer = new AlignedBuffer (MAX(W,H)); +#pragma omp parallel #endif + { + unsigned short** b3; + + AlignedBuffer* buffer = new AlignedBuffer (MAX(W,H)); if (params->sharpening.edgesonly==false) { gaussHorizontal (lab->L, b2, buffer, W, H, params->sharpening.radius / scale, multiThread); @@ -148,7 +161,7 @@ void ImProcFunctions::sharpening (LabImage* lab, unsigned short** b2) { base = b3; if (params->sharpening.halocontrol==false) { - #pragma omp parallel for if (multiThread) + #pragma omp for for (int i=0; ivignetting.amount * 3.0 / 400.0; - double b = 1.0 + params->vignetting.radius * 7.0 / 100.0; - - double mul = (1.0-v) / tanh(b); + double vig_w2; + double vig_h2; + double maxRadius; + double v; + double b; + double mul; + calcVignettingParams(oW, oH, params->vignetting, vig_w2, vig_h2, maxRadius, v, b, mul); #pragma omp parallel for if (multiThread) for (int y=0; yheight; y++) { - double y_d = (double) (y + cy) - h2 ; + double vig_y_d = (double) (y + cy) - vig_h2 ; int val; for (int x=0; xwidth; x++) { - double x_d = (double) (x + cx) - w2 ; - double r = sqrt(x_d*x_d + y_d*y_d); + double vig_x_d = (double) (x + cx) - vig_w2 ; + double r = sqrt(vig_x_d*vig_x_d + vig_y_d*vig_y_d); double vign = v + mul * tanh (b*(maxRadius-r) / maxRadius); val = original->r[y][x] / vign; transformed->r[y][x] = CLIP(val); @@ -255,9 +272,16 @@ void ImProcFunctions::vignetting (Image16* original, Image16* transformed, int c #include "cubint.cc" void ImProcFunctions::transformNonSep (Image16* original, Image16* transformed, int cx, int cy, int sx, int sy, int oW, int oH) { + double w2 = (double) oW / 2.0 - 0.5; + double h2 = (double) oH / 2.0 - 0.5; - double w2 = (double) oW / 2.0 - 0.5; - double h2 = (double) oH / 2.0 - 0.5; + double vig_w2; + double vig_h2; + double maxRadius; + double v; + double b; + double mul; + calcVignettingParams(oW, oH, params->vignetting, vig_w2, vig_h2, maxRadius, v, b, mul); // auxiliary variables for distortion correction double a = params->distortion.amount; @@ -266,11 +290,6 @@ void ImProcFunctions::transformNonSep (Image16* original, Image16* transformed, double cost = cos(params->rotate.degree * 3.14/180.0); double sint = sin(params->rotate.degree * 3.14/180.0); - // auxiliary variables for vignetting - double maxRadius = sqrt( (double)( oW*oW + oH*oH ) ) / 2; - double v = 1.0 - params->vignetting.amount * 3.0 / 400.0; - double b = 1.0 + params->vignetting.radius * 7.0 / 100.0; - double mul = (1.0-v) / tanh(b); bool dovign = params->vignetting.amount != 0; // auxiliary variables for vertical perspective correction @@ -293,6 +312,8 @@ void ImProcFunctions::transformNonSep (Image16* original, Image16* transformed, for (int x=0; xwidth; x++) { double x_d = ascale * (x + cx - w2); // centering x coord & scale double y_d = ascale * (y + cy - h2); // centering y coord & scale + double vig_x_d = ascale * (x + cx - vig_w2); // centering x coord & scale + double vig_y_d = ascale * (y + cy - vig_h2); // centering y coord & scale // horizontal perspective transformation y_d = y_d * maxRadius / (maxRadius + x_d*hptanpt); @@ -312,6 +333,10 @@ void ImProcFunctions::transformNonSep (Image16* original, Image16* transformed, Dx *= s; Dy *= s; + double vig_Dx = vig_x_d * cost - vig_y_d * sint; + double vig_Dy = vig_x_d * sint + vig_y_d * cost; + double r2 = sqrt(vig_Dx*vig_Dx + vig_Dy*vig_Dy); + // de-center Dx += w2; Dy += h2; @@ -326,7 +351,7 @@ void ImProcFunctions::transformNonSep (Image16* original, Image16* transformed, // multiplier for vignetting correction double vignmul = 1.0; if (dovign) - vignmul /= (v + mul * tanh (b*(maxRadius-s*r) / maxRadius)); + vignmul /= (v + mul * tanh (b*(maxRadius-s*r2) / maxRadius)); if (yc > 0 && yc < original->height-2 && xc > 0 && xc < original->width-2) // all interpolation pixels inside image cubint (original, xc-1, yc-1, Dx, Dy, &(transformed->r[y][x]), &(transformed->g[y][x]), &(transformed->b[y][x]), vignmul); @@ -356,8 +381,16 @@ void ImProcFunctions::transformNonSep (Image16* original, Image16* transformed, #include "cubintch.cc" void ImProcFunctions::transformSep (Image16* original, Image16* transformed, int cx, int cy, int sx, int sy, int oW, int oH) { - double w2 = (double) oW / 2.0 - 0.5; - double h2 = (double) oH / 2.0 - 0.5; + double w2 = (double) oW / 2.0 - 0.5; + double h2 = (double) oH / 2.0 - 0.5; + + double vig_w2; + double vig_h2; + double maxRadius; + double v; + double b; + double mul; + calcVignettingParams(oW, oH, params->vignetting, vig_w2, vig_h2, maxRadius, v, b, mul); // auxiliary variables for c/a correction double cdist[3]; @@ -380,11 +413,6 @@ void ImProcFunctions::transformSep (Image16* original, Image16* transformed, int double cost = cos(params->rotate.degree * 3.14/180.0); double sint = sin(params->rotate.degree * 3.14/180.0); - // auxiliary variables for vignetting - double maxRadius = sqrt( (double)( oW*oW + oH*oH ) ) / 2; - double v = 1.0 - params->vignetting.amount * 3.0 / 400.0; - double b = 1.0 + params->vignetting.radius * 7.0 / 100.0; - double mul = (1.0-v) / tanh(b); bool dovign = params->vignetting.amount != 0; // auxiliary variables for vertical perspective correction @@ -407,6 +435,8 @@ void ImProcFunctions::transformSep (Image16* original, Image16* transformed, int for (int x=0; xwidth; x++) { double x_d = ascale * (x + cx - w2); // centering x coord & scale double y_d = ascale * (y + cy - h2); // centering y coord & scale + double vig_x_d = ascale * (x + cx - vig_w2); // centering x coord & scale + double vig_y_d = ascale * (y + cy - vig_h2); // centering y coord & scale // horizontal perspective transformation y_d = y_d * maxRadius / (maxRadius + x_d*hptanpt); @@ -424,6 +454,10 @@ void ImProcFunctions::transformSep (Image16* original, Image16* transformed, int double r = sqrt(Dxc*Dxc + Dyc*Dyc) / maxRadius; double s = 1.0 - a + a * r ; + double vig_Dx = vig_x_d * cost - vig_y_d * sint; + double vig_Dy = vig_x_d * sint + vig_y_d * cost; + double r2 = sqrt(vig_Dx*vig_Dx + vig_Dy*vig_Dy); + for (int c=0; c<3; c++) { double Dx = Dxc * (s + cdist[c]); @@ -443,7 +477,7 @@ void ImProcFunctions::transformSep (Image16* original, Image16* transformed, int // multiplier for vignetting correction double vignmul = 1.0; if (dovign) - vignmul /= (v + mul * tanh (b*(maxRadius-s*r) / maxRadius)); + vignmul /= (v + mul * tanh (b*(maxRadius-s*r2) / maxRadius)); if (yc > 0 && yc < original->height-2 && xc > 0 && xc < original->width-2) // all interpolation pixels inside image cubintch (chorig[c], xc-1, yc-1, Dx, Dy, &(chtrans[c][y][x]), vignmul); @@ -466,8 +500,16 @@ void ImProcFunctions::transformSep (Image16* original, Image16* transformed, int void ImProcFunctions::simpltransform (Image16* original, Image16* transformed, int cx, int cy, int sx, int sy, int oW, int oH) { - double w2 = (double) oW / 2.0 - 0.5; - double h2 = (double) oH / 2.0 - 0.5; + double w2 = (double) oW / 2.0 - 0.5; + double h2 = (double) oH / 2.0 - 0.5; + + double vig_w2; + double vig_h2; + double maxRadius; + double v; + double b; + double mul; + calcVignettingParams(oW, oH, params->vignetting, vig_w2, vig_h2, maxRadius, v, b, mul); // auxiliary variables for distortion correction double a = params->distortion.amount; @@ -476,11 +518,6 @@ void ImProcFunctions::simpltransform (Image16* original, Image16* transformed, i double cost = cos(params->rotate.degree * 3.14/180.0); double sint = sin(params->rotate.degree * 3.14/180.0); - // auxiliary variables for vignetting - double maxRadius = sqrt( (double)( oW*oW + oH*oH ) ) / 2; - double v = 1.0 - params->vignetting.amount * 3.0 / 400.0; - double b = 1.0 + params->vignetting.radius * 7.0 / 100.0; - double mul = (1.0-v) / tanh(b); bool dovign = params->vignetting.amount != 0; // auxiliary variables for vertical perspective correction @@ -503,6 +540,8 @@ void ImProcFunctions::simpltransform (Image16* original, Image16* transformed, i for (int x=0; xwidth; x++) { double y_d = ascale * (y + cy - h2); // centering y coord & scale double x_d = ascale * (x + cx - w2); // centering x coord & scale + double vig_x_d = ascale * (x + cx - vig_w2); // centering x coord & scale + double vig_y_d = ascale * (y + cy - vig_h2); // centering y coord & scale // horizontal perspective transformation y_d = y_d * maxRadius / (maxRadius + x_d*hptanpt); @@ -522,6 +561,10 @@ void ImProcFunctions::simpltransform (Image16* original, Image16* transformed, i Dx *= s; Dy *= s; + double vig_Dx = vig_x_d * cost - vig_y_d * sint; + double vig_Dy = vig_x_d * sint + vig_y_d * cost; + double r2 = sqrt(vig_Dx*vig_Dx + vig_Dy*vig_Dy); + // de-center Dx += w2; Dy += h2; @@ -536,7 +579,7 @@ void ImProcFunctions::simpltransform (Image16* original, Image16* transformed, i // multiplier for vignetting correction double vignmul = 1.0; if (dovign) - vignmul /= (v + mul * tanh (b*(maxRadius-s*r) / maxRadius)); + vignmul /= (v + mul * tanh (b*(maxRadius-s*r2) / maxRadius)); if (yc < original->height-1 && xc < original->width-1) { // all interpolation pixels inside image int r = vignmul*(original->r[yc][xc]*(1.0-Dx)*(1.0-Dy) + original->r[yc][xc+1]*Dx*(1.0-Dy) + original->r[yc+1][xc]*(1.0-Dx)*Dy + original->r[yc+1][xc+1]*Dx*Dy); diff --git a/rtengine/jpeg_memsrc.c b/rtengine/jpeg_memsrc.c new file mode 100644 index 000000000..595649b85 --- /dev/null +++ b/rtengine/jpeg_memsrc.c @@ -0,0 +1,167 @@ +/* + * memsrc.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains decompression data source routines for the case of + * reading JPEG data from a memory buffer that is preloaded with the entire + * JPEG file. This would not seem especially useful at first sight, but + * a number of people have asked for it. + * This is really just a stripped-down version of jdatasrc.c. Comparison + * of this code with jdatasrc.c may be helpful in seeing how to make + * custom source managers for other purposes. + */ + +/* this is not a core library module, so it doesn't define JPEG_INTERNALS */ +//#include "jinclude.h" +//#include "jmorecfg.h" +//#include "jpeglib.h" +//#include "jerror.h" +#include +#include +#include + + +/* Expanded data source object for memory input */ + +typedef struct { + struct jpeg_source_mgr pub; /* public fields */ + + JOCTET eoi_buffer[2]; /* a place to put a dummy EOI */ +} my_source_mgr; + +typedef my_source_mgr * my_src_ptr; + + +/* + * Initialize source --- called by jpeg_read_header + * before any data is actually read. + */ + +static void +init_source (j_decompress_ptr cinfo) +{ + /* No work, since jpeg_memory_src set up the buffer pointer and count. + * Indeed, if we want to read multiple JPEG images from one buffer, + * this *must* not do anything to the pointer. + */ +} + + +/* + * Fill the input buffer --- called whenever buffer is emptied. + * + * In this application, this routine should never be called; if it is called, + * the decompressor has overrun the end of the input buffer, implying we + * supplied an incomplete or corrupt JPEG datastream. A simple error exit + * might be the most appropriate response. + * + * But what we choose to do in this code is to supply dummy EOI markers + * in order to force the decompressor to finish processing and supply + * some sort of output image, no matter how corrupted. + */ + +static int +fill_input_buffer(j_decompress_ptr cinfo) +{ + my_src_ptr src = (my_src_ptr) cinfo->src; + + WARNMS(cinfo, JWRN_JPEG_EOF); + + /* Create a fake EOI marker */ + src->eoi_buffer[0] = (JOCTET) 0xFF; + src->eoi_buffer[1] = (JOCTET) JPEG_EOI; + src->pub.next_input_byte = src->eoi_buffer; + src->pub.bytes_in_buffer = 2; + + return TRUE; +} + + +/* + * Skip data --- used to skip over a potentially large amount of + * uninteresting data (such as an APPn marker). + * + * If we overrun the end of the buffer, we let fill_input_buffer deal with + * it. An extremely large skip could cause some time-wasting here, but + * it really isn't supposed to happen ... and the decompressor will never + * skip more than 64K anyway. + */ + +static void +skip_input_data (j_decompress_ptr cinfo, long num_bytes) +{ + my_src_ptr src = (my_src_ptr) cinfo->src; + + if (num_bytes > 0) { + while (num_bytes > (long) src->pub.bytes_in_buffer) { + num_bytes -= (long) src->pub.bytes_in_buffer; + (void) fill_input_buffer(cinfo); + /* note we assume that fill_input_buffer will never return FALSE, + * so suspension need not be handled. + */ + } + src->pub.next_input_byte += (size_t) num_bytes; + src->pub.bytes_in_buffer -= (size_t) num_bytes; + } +} + + +/* + * An additional method that can be provided by data source modules is the + * resync_to_restart method for error recovery in the presence of RST markers. + * For the moment, this source module just uses the default resync method + * provided by the JPEG library. That method assumes that no backtracking + * is possible. + */ + + +/* + * Terminate source --- called by jpeg_finish_decompress + * after all data has been read. Often a no-op. + * + * NB: *not* called by jpeg_abort or jpeg_destroy; surrounding + * application must deal with any cleanup that should happen even + * for error exit. + */ + +static void +term_source (j_decompress_ptr cinfo) +{ + /* no work necessary here */ +} + + +/* + * Prepare for input from a memory buffer. + */ + +GLOBAL(void) +jpeg_memory_src (j_decompress_ptr cinfo, const JOCTET * buffer, size_t bufsize) +{ + my_src_ptr src; + + /* The source object is made permanent so that a series of JPEG images + * can be read from a single buffer by calling jpeg_memory_src + * only before the first one. + * This makes it unsafe to use this manager and a different source + * manager serially with the same JPEG object. Caveat programmer. + */ + if (cinfo->src == NULL) { /* first time for this JPEG object? */ + cinfo->src = (struct jpeg_source_mgr *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, + sizeof(my_source_mgr)); + } + + src = (my_src_ptr) cinfo->src; + src->pub.init_source = init_source; + src->pub.fill_input_buffer = fill_input_buffer; + src->pub.skip_input_data = skip_input_data; + src->pub.resync_to_restart = jpeg_resync_to_restart; /* use default method */ + src->pub.term_source = term_source; + + src->pub.next_input_byte = buffer; + src->pub.bytes_in_buffer = bufsize; +} diff --git a/rtengine/loadinitial.cc b/rtengine/loadinitial.cc index f12ce63b8..0bd524351 100644 --- a/rtengine/loadinitial.cc +++ b/rtengine/loadinitial.cc @@ -32,7 +32,11 @@ InitialImage* InitialImage::load (const Glib::ustring& fname, bool isRaw, int* e isrc = new RawImageSource (); isrc->setProgressListener (pl); - *errorCode = isrc->load (fname); + + if(isRaw && pl == NULL) + *errorCode = isrc->load (fname, true); + else + *errorCode = isrc->load (fname); if (*errorCode) { delete isrc; return NULL; diff --git a/rtengine/procevents.h b/rtengine/procevents.h index 12b45ad93..fbe40fa1e 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -1,124 +1,127 @@ -/* - * 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 . - */ -#ifndef __PROCEVENT__ -#define __PROCEVENT__ - -namespace rtengine { - -enum ProcEvent { - EvPhotoLoaded=0, - EvProfileLoaded=1, - EvProfileChanged=2, - EvHistoryBrowsed=3, - EvBrightness=4, - EvContrast=5, - EvBlack=6, - EvExpComp=7, - EvHLCompr=8, - EvSHCompr=9, - EvToneCurve=10, - EvAutoExp=11, - EvClip=12, - EvLBrightness=13, - EvLContrast=14, - EvLBlack=15, - EvLHLCompr=16, - EvLSHCompr=17, - EvLCurve=18, - EvShrEnabled=19, - EvShrRadius=20, - EvShrAmount=21, - EvShrThresh=22, - EvShrEdgeOnly=23, - EvShrEdgeRadius=24, - EvShrEdgeTolerance=25, - EvShrHaloControl=26, - EvShrHaloAmount=27, - EvShrMethod=28, - EvShrDRadius=29, - EvShrDAmount=30, - EvShrDDamping=31, - EvShrDIterations=32, - EvCBAvoidClip=33, - EvCBSatLimiter=34, - EvCBSatLimit=35, - EvCBBoost=36, - EvWBMethod=37, - EvWBTemp=38, - EvWBGreen=39, - EvCShiftA=40, - EvCShiftB=41, - EvLDNEnabled=42, - EvLDNRadius=43, - EvLDNEdgeTolerance=44, - EvCDNEnabled=45, - EvCDNRadius=46, - EvCDNEdgeTolerance=47, - EvCDNEdgeSensitive=48, - EvSHEnabled=49, - EvSHHighlights=50, - EvSHShadows=51, - EvSHHLTonalW=52, - EvSHSHTonalW=53, - EvSHLContrast=54, - EvSHRadius=55, - EvCTRotate=56, - EvCTHFlip=57, - EvCTVFlip=58, - EvROTDegree=59, - EvTransAutoFill=60, - EvDISTAmount=61, - EvBookmarkSelected=62, - EvCrop=63, - EvCACorr=64, - EvHREnabled=65, - EvHRAmount=66, - EvHRMethod=67, - EvWProfile=68, - EvOProfile=69, - EvIProfile=70, - EvVignetting=71, - EvChMixer=72, - EvResizeScale=73, - EvResizeMethod=74, - EvExif=75, - EvIPTC=76, - EvResizeSpec=77, - EvResizeWidth=78, - EvResizeHeight=79, - EvResizeEnabled=80, - EvProfileChangeNotification=81, - EvSHHighQuality=82, - EvPerspCorr=83, - EvEqualizer=84, - EvEqlEnabled=85, - EvDemosaic=86, - EvPreProcess=87, - EvIDNEnabled=88, - EvIDNThresh=89, - EvDPDNEnabled=90, - EvDPDNLuma=91, - EvDPDNChroma=92, - EvDPDNGamma=93, - EvDirPyrEqualizer=94, - EvDirPyrEqlEnabled=95, - NUMOFEVENTS=96 - }; -} -#endif +/* + * 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 . + */ +#ifndef __PROCEVENT__ +#define __PROCEVENT__ + +namespace rtengine { + +enum ProcEvent { + EvPhotoLoaded=0, + EvProfileLoaded=1, + EvProfileChanged=2, + EvHistoryBrowsed=3, + EvBrightness=4, + EvContrast=5, + EvBlack=6, + EvExpComp=7, + EvHLCompr=8, + EvSHCompr=9, + EvToneCurve=10, + EvAutoExp=11, + EvClip=12, + EvLBrightness=13, + EvLContrast=14, + EvLBlack=15, + EvLHLCompr=16, + EvLSHCompr=17, + EvLLCurve=18, + EvShrEnabled=19, + EvShrRadius=20, + EvShrAmount=21, + EvShrThresh=22, + EvShrEdgeOnly=23, + EvShrEdgeRadius=24, + EvShrEdgeTolerance=25, + EvShrHaloControl=26, + EvShrHaloAmount=27, + EvShrMethod=28, + EvShrDRadius=29, + EvShrDAmount=30, + EvShrDDamping=31, + EvShrDIterations=32, + EvCBAvoidClip=33, + EvCBSatLimiter=34, + EvCBSatLimit=35, + EvCBBoost=36, + EvWBMethod=37, + EvWBTemp=38, + EvWBGreen=39, + EvCShiftA=40, + EvCShiftB=41, + EvLDNEnabled=42, + EvLDNRadius=43, + EvLDNEdgeTolerance=44, + EvCDNEnabled=45, + EvCDNRadius=46, + EvCDNEdgeTolerance=47, + EvCDNEdgeSensitive=48, + EvSHEnabled=49, + EvSHHighlights=50, + EvSHShadows=51, + EvSHHLTonalW=52, + EvSHSHTonalW=53, + EvSHLContrast=54, + EvSHRadius=55, + EvCTRotate=56, + EvCTHFlip=57, + EvCTVFlip=58, + EvROTDegree=59, + EvTransAutoFill=60, + EvDISTAmount=61, + EvBookmarkSelected=62, + EvCrop=63, + EvCACorr=64, + EvHREnabled=65, + EvHRAmount=66, + EvHRMethod=67, + EvWProfile=68, + EvOProfile=69, + EvIProfile=70, + EvVignetting=71, + EvChMixer=72, + EvResizeScale=73, + EvResizeMethod=74, + EvExif=75, + EvIPTC=76, + EvResizeSpec=77, + EvResizeWidth=78, + EvResizeHeight=79, + EvResizeEnabled=80, + EvProfileChangeNotification=81, + EvSHHighQuality=82, + EvPerspCorr=83, + EvEqualizer=84, + EvEqlEnabled=85, + EvDemosaic=86, + EvPreProcess=87, + EvIDNEnabled=88, + EvIDNThresh=89, + EvDPDNEnabled=90, + EvDPDNLuma=91, + EvDPDNChroma=92, + EvDPDNGamma=93, + EvDirPyrEqualizer=94, + EvDirPyrEqlEnabled=95, + EvLSaturation=96, + EvLaCurve=97, + EvLbCurve=98, + NUMOFEVENTS=99 + }; +} +#endif diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 9541913c9..97567906c 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -48,18 +48,21 @@ void ProcParams::destroy (ProcParams* pp) { void ProcParams::setDefaults () { toneCurve.autoexp = false; - toneCurve.clip = 0.002; + toneCurve.clip = 0.001; toneCurve.expcomp = 0; toneCurve.brightness = 0; toneCurve.contrast = 0; toneCurve.black = 0; - toneCurve.hlcompr = 85; - toneCurve.shcompr = 85; + toneCurve.hlcompr = 70; + toneCurve.shcompr = 25; toneCurve.curve.clear (); - lumaCurve.brightness = 0; - lumaCurve.contrast = 0; - lumaCurve.curve.clear (); + labCurve.brightness = 0; + labCurve.contrast = 0; + labCurve.saturation = 0; + labCurve.lcurve.clear (); + labCurve.acurve.clear (); + labCurve.bcurve.clear (); sharpening.enabled = true; sharpening.radius = 1.0; @@ -107,11 +110,11 @@ void ProcParams::setDefaults () { sh.enabled = false; sh.hq = false; - sh.highlights = 10; + sh.highlights = 0; sh.htonalwidth = 80; - sh.shadows = 10; + sh.shadows = 0; sh.stonalwidth = 80; - sh.localcontrast = 15; + sh.localcontrast = 0; sh.radius = 40; crop.enabled = false; @@ -146,6 +149,9 @@ void ProcParams::setDefaults () { vignetting.amount = 0; vignetting.radius = 50; + vignetting.strength = 1; + vignetting.centerX = 0; + vignetting.centerY = 0; chmixer.red[0] = 100; chmixer.red[1] = 0; @@ -200,7 +206,7 @@ int ProcParams::save (Glib::ustring fname) const { SafeKeyFile keyFile; - keyFile.set_integer ("Version", "Version", 231); + keyFile.set_integer ("Version", "Version", 20101019); // save tonecurve: keyFile.set_boolean ("Exposure", "Auto", toneCurve.autoexp); @@ -223,10 +229,15 @@ int ProcParams::save (Glib::ustring fname) const { keyFile.set_integer_list("Channel Mixer", "Blue", bmix); // save luma curve - keyFile.set_integer ("Luminance Curve", "Brightness", lumaCurve.brightness); - keyFile.set_integer ("Luminance Curve", "Contrast", lumaCurve.contrast); - Glib::ArrayHandle lcurve = lumaCurve.curve; - keyFile.set_double_list("Luminance Curve", "Curve", lcurve); + keyFile.set_integer ("Luminance Curve", "Brightness", labCurve.brightness); + keyFile.set_integer ("Luminance Curve", "Contrast", labCurve.contrast); + keyFile.set_integer ("Luminance Curve", "Saturation", labCurve.saturation); + Glib::ArrayHandle lcurve = labCurve.lcurve; + Glib::ArrayHandle acurve = labCurve.acurve; + Glib::ArrayHandle bcurve = labCurve.bcurve; + keyFile.set_double_list("Luminance Curve", "LCurve", lcurve); + keyFile.set_double_list("Luminance Curve", "aCurve", acurve); + keyFile.set_double_list("Luminance Curve", "bCurve", bcurve); // save sharpening keyFile.set_boolean ("Sharpening", "Enabled", sharpening.enabled); @@ -329,6 +340,9 @@ int ProcParams::save (Glib::ustring fname) const { // save vignetting correction keyFile.set_integer ("Vignetting Correction", "Amount", vignetting.amount); keyFile.set_integer ("Vignetting Correction", "Radius", vignetting.radius); + keyFile.set_integer ("Vignetting Correction", "Strength", vignetting.strength); + keyFile.set_integer ("Vignetting Correction", "CenterX", vignetting.centerX); + keyFile.set_integer ("Vignetting Correction", "CenterY", vignetting.centerY); // save highlight recovery settings keyFile.set_boolean ("HLRecovery", "Enabled", hlrecovery.enabled); @@ -450,10 +464,13 @@ if (keyFile.has_group ("Channel Mixer")) { // load luma curve if (keyFile.has_group ("Luminance Curve")) { - if (keyFile.has_key ("Luminance Curve", "Brightness")) lumaCurve.brightness = keyFile.get_integer ("Luminance Curve", "Brightness"); - if (keyFile.has_key ("Luminance Curve", "Contrast")) lumaCurve.contrast = keyFile.get_integer ("Luminance Curve", "Contrast"); + if (keyFile.has_key ("Luminance Curve", "Brightness")) labCurve.brightness = keyFile.get_integer ("Luminance Curve", "Brightness"); + if (keyFile.has_key ("Luminance Curve", "Contrast")) labCurve.contrast = keyFile.get_integer ("Luminance Curve", "Contrast"); + if (keyFile.has_key ("Luminance Curve", "Saturation")) labCurve.saturation = keyFile.get_integer ("Luminance Curve", "Saturation"); if (version>200) - if (keyFile.has_key ("Luminance Curve", "Curve")) lumaCurve.curve = keyFile.get_double_list ("Luminance Curve", "Curve"); + if (keyFile.has_key ("Luminance Curve", "LCurve")) labCurve.lcurve = keyFile.get_double_list ("Luminance Curve", "LCurve"); + if (keyFile.has_key ("Luminance Curve", "aCurve")) labCurve.acurve = keyFile.get_double_list ("Luminance Curve", "aCurve"); + if (keyFile.has_key ("Luminance Curve", "bCurve")) labCurve.bcurve = keyFile.get_double_list ("Luminance Curve", "bCurve"); } // load sharpening @@ -592,6 +609,9 @@ if (keyFile.has_group ("CACorrection")) { if (keyFile.has_group ("Vignetting Correction")) { if (keyFile.has_key ("Vignetting Correction", "Amount")) vignetting.amount = keyFile.get_integer ("Vignetting Correction", "Amount"); if (keyFile.has_key ("Vignetting Correction", "Radius")) vignetting.radius = keyFile.get_integer ("Vignetting Correction", "Radius"); + if (keyFile.has_key ("Vignetting Correction", "Strength")) vignetting.strength = keyFile.get_integer ("Vignetting Correction", "Strength"); + if (keyFile.has_key ("Vignetting Correction", "CenterX")) vignetting.centerX = keyFile.get_integer ("Vignetting Correction", "CenterX"); + if (keyFile.has_key ("Vignetting Correction", "CenterY")) vignetting.centerY = keyFile.get_integer ("Vignetting Correction", "CenterY"); } // load highlight recovery settings @@ -729,9 +749,12 @@ bool ProcParams::operator== (const ProcParams& other) { && toneCurve.autoexp == other.toneCurve.autoexp && toneCurve.clip == other.toneCurve.clip && toneCurve.expcomp == other.toneCurve.expcomp - && lumaCurve.curve == other.lumaCurve.curve - && lumaCurve.brightness == other.lumaCurve.brightness - && lumaCurve.contrast == other.lumaCurve.contrast + && labCurve.lcurve == other.labCurve.lcurve + && labCurve.acurve == other.labCurve.acurve + && labCurve.bcurve == other.labCurve.bcurve + && labCurve.brightness == other.labCurve.brightness + && labCurve.contrast == other.labCurve.contrast + && labCurve.saturation == other.labCurve.saturation && sharpening.enabled == other.sharpening.enabled && sharpening.radius == other.sharpening.radius && sharpening.amount == other.sharpening.amount @@ -798,6 +821,9 @@ bool ProcParams::operator== (const ProcParams& other) { && cacorrection.blue == other.cacorrection.blue && vignetting.amount == other.vignetting.amount && vignetting.radius == other.vignetting.radius + && vignetting.strength == other.vignetting.strength + && vignetting.centerX == other.vignetting.centerX + && vignetting.centerY == other.vignetting.centerY && !memcmp (&chmixer.red, &other.chmixer.red, 3*sizeof(int)) && !memcmp (&chmixer.green, &other.chmixer.green, 3*sizeof(int)) && !memcmp (&chmixer.blue, &other.chmixer.blue, 3*sizeof(int)) diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 55f1c1ae8..3b10d032a 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -48,9 +48,12 @@ class ToneCurveParams { class LCurveParams { public: - std::vector curve; + std::vector lcurve; + std::vector acurve; + std::vector bcurve; int brightness; int contrast; + int saturation; }; /** @@ -246,6 +249,9 @@ class VignettingParams { public: int amount; int radius; + int strength; + int centerX; + int centerY; }; /** @@ -376,7 +382,7 @@ class ProcParams { public: ToneCurveParams toneCurve; ///< Tone curve parameters - LCurveParams lumaCurve; ///< CIELAB luminance curve parameters + LCurveParams labCurve; ///< CIELAB luminance curve parameters SharpeningParams sharpening; ///< Sharpening parameters ColorBoostParams colorBoost; ///< Color boost parameters WBParams wb; ///< White balance parameters diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 63b03483b..a16058fbb 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -717,7 +717,7 @@ void RawImageSource::inverse33 (double (*coeff)[3], double (*icoeff)[3]) { icoeff[2][2] = (coeff[0][1]*coeff[1][0]-coeff[0][0]*coeff[1][1]) / nom; } -int RawImageSource::load (Glib::ustring fname) { +int RawImageSource::load (Glib::ustring fname, bool batch) { MyTime t1,t2; t1.set(); @@ -757,7 +757,7 @@ int RawImageSource::load (Glib::ustring fname) { for (int j=0; j<3; j++) for (int k=0; k<3; k++) cam[i][j] += coeff[k][i] * sRGB_d50[k][j]; - camProfile = iccStore.createFromMatrix (cam, false, "Camera"); + camProfile = iccStore->createFromMatrix (cam, false, "Camera"); inverse33 (cam, icam); @@ -943,9 +943,11 @@ void RawImageSource::preprocess (const RAWParams &raw) // check if it is an olympus E camera, if yes, compute G channel pre-compensation factors if ( raw.greenthresh || (((idata->getMake().size()>=7 && idata->getMake().substr(0,7)=="OLYMPUS" && idata->getModel()[0]=='E') || (idata->getMake().size()>=9 && idata->getMake().substr(0,7)=="Panasonic")) && raw.dmethod != RAWParams::methodstring[ RAWParams::vng4] && ri->filters) ) { // global correction - int ng1=0, ng2=0; - double avgg1=0, avgg2=0; - for (int i=border; i0) { if (plistener) { plistener->setProgressStr ("Green equilibrate..."); @@ -1002,7 +1009,7 @@ void RawImageSource::demosaic(const RAWParams &raw) MyTime t1,t2; t1.set(); if ( raw.dmethod == RAWParams::methodstring[RAWParams::hphd] ) - hphd_demosaic (); + hphd_demosaic (); else if (raw.dmethod == RAWParams::methodstring[RAWParams::vng4] ) vng4_demosaic (); else if (raw.dmethod == RAWParams::methodstring[RAWParams::ahd] ) @@ -1017,7 +1024,7 @@ void RawImageSource::demosaic(const RAWParams &raw) fast_demo (0,0,W,H); else if (raw.dmethod == RAWParams::methodstring[RAWParams::bilinear] ) bilinear_demosaic(); - else + else nodemosaic(); t2.set(); if( settings->verbose ) @@ -1300,7 +1307,7 @@ void RawImageSource::colorSpaceConversion (Image16* im, ColorManagementParams cm else if (inProfile=="(camera)" || inProfile=="") in = camprofile; else { - in = iccStore.getProfile (inProfile); + in = iccStore->getProfile (inProfile); if (in==NULL) inProfile = "(camera)"; } @@ -1309,17 +1316,18 @@ void RawImageSource::colorSpaceConversion (Image16* im, ColorManagementParams cm if (inProfile=="(camera)" || inProfile=="" || (inProfile=="(embedded)" && !embedded)) { // in this case we avoid using the slllllooooooowwww lcms -// out = iccStore.workingSpace (wProfile); +// out = iccStore->workingSpace (wProfile); // hTransform = cmsCreateTransform (in, TYPE_RGB_16_PLANAR, out, TYPE_RGB_16_PLANAR, settings->colorimetricIntent, cmsFLAGS_MATRIXINPUT | cmsFLAGS_MATRIXOUTPUT);//cmsFLAGS_MATRIXINPUT | cmsFLAGS_MATRIXOUTPUT); // cmsDoTransform (hTransform, im->data, im->data, im->planestride/2); // cmsDeleteTransform(hTransform); - TMatrix work = iccStore.workingSpaceInverseMatrix (cmp.working); + TMatrix work = iccStore->workingSpaceInverseMatrix (cmp.working); double mat[3][3] = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}}; for (int i=0; i<3; i++) for (int j=0; j<3; j++) for (int k=0; k<3; k++) mat[i][j] += camMatrix[i][k] * work[k][j]; - + +#pragma omp parallel for for (int i=0; iheight; i++) for (int j=0; jwidth; j++) { @@ -1333,15 +1341,16 @@ void RawImageSource::colorSpaceConversion (Image16* im, ColorManagementParams cm } } else { - out = iccStore.workingSpace (cmp.working); -// out = iccStore.workingSpaceGamma (wProfile); + out = iccStore->workingSpace (cmp.working); +// out = iccStore->workingSpaceGamma (wProfile); lcmsMutex->lock (); cmsHTRANSFORM hTransform = cmsCreateTransform (in, TYPE_RGB_16_PLANAR, out, TYPE_RGB_16_PLANAR, settings->colorimetricIntent, 0); lcmsMutex->unlock (); if (hTransform) { if (cmp.gammaOnInput) { double gd = pow (2.0, defgain); - defgain = 0.0; + defgain = 0.0; +#pragma omp parallel for for (int i=0; iheight; i++) for (int j=0; jwidth; j++) { im->r[i][j] = CurveFactory::gamma (CLIP(defgain*im->r[i][j])); @@ -1982,14 +1991,14 @@ int RawImageSource::getAEHistogram (unsigned int* histogram, int& histcompr) { } if (ri->filters) for (int j=start; j>histcompr]+=2; - else + else*/ histogram[rawData[i][j]>>histcompr]+=4; else for (int j=start; j<3*end; j++) { histogram[rawData[i][j+0]>>histcompr]++; - histogram[rawData[i][j+1]>>histcompr]++; + histogram[rawData[i][j+1]>>histcompr]+=2; histogram[rawData[i][j+2]>>histcompr]++; } } diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index c7f24a260..8a4fa5d22 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -111,7 +111,7 @@ class RawImageSource : public ImageSource { RawImageSource (); ~RawImageSource (); - int load (Glib::ustring fname); + int load (Glib::ustring fname, bool batch = false); void preprocess (const RAWParams &raw); void demosaic (const RAWParams &raw); void copyOriginalPixels( RawImage *ri, RawImage *riDark ); @@ -149,14 +149,14 @@ class RawImageSource : public ImageSource { inline void interpolate_row_rb_mul_pp (unsigned short* ar, unsigned short* ab, unsigned short* pg, unsigned short* cg, unsigned short* ng, int i, double r_mul, double g_mul, double b_mul, int x1, int width, int skip); int LinEqSolve( int nDim, float* pfMatr, float* pfVect, float* pfSolution);//Emil's CA auto correction - void CA_correct_RT (); //Emil's pre-demosaic CA correction + void CA_correct_RT (); int cfaCleanFromMap( BYTE* bitmapBads ); int findHotDeadPixel( BYTE *bpMap, float thresh); - void ddct8x8s(int isgn, float **a); + void ddct8x8s(int isgn, float **a); - void cfa_linedn (float linenoiselevel); //Emil's line denoise + void cfa_linedn (float linenoiselevel);//Emil's line denoise - void green_equilibrate (float greenthresh);//Emil's green equilibration + void green_equilibrate (float greenthresh);//Emil's green equilibration void nodemosaic(); void eahd_demosaic(); diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index 5d5c009b1..500e3757c 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -38,7 +38,7 @@ LUMINANCECURVE, // EvLContrast, LUMINANCECURVE, // EvLBlack, LUMINANCECURVE, // EvLHLCompr, LUMINANCECURVE, // EvLSHCompr, -LUMINANCECURVE, // EvLCurve, +LUMINANCECURVE, // EvLLCurve, SHARPENING, // EvShrEnabled, SHARPENING, // EvShrRadius, SHARPENING, // EvShrAmount, @@ -114,7 +114,10 @@ DIRPYRDENOISE, // EvDPDNEnabled, DIRPYRDENOISE, // EvDPDNLuma, DIRPYRDENOISE, // EvDPDNChroma, DIRPYRDENOISE, // EvDPDNGamma, -DIRPYREQUALIZER, // EvDirPyrEqualizer -DIRPYREQUALIZER // EvDirPyrEqlEnabled +DIRPYREQUALIZER, // EvDirPyrEqualizer, +DIRPYREQUALIZER, // EvDirPyrEqlEnabled, +LUMINANCECURVE, // EvLSaturation, +LUMINANCECURVE, // EvLaCurve, +LUMINANCECURVE, // EvLbCurve }; diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index 2f7c182bb..43f64539c 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -48,6 +48,62 @@ my_jpeg_stdio_src (j_decompress_ptr cinfo, FILE * infile); namespace rtengine { +Thumbnail* Thumbnail::loadFromMemory (const char* image, int length, int &w, int &h, int fixwh) { + Image16* img = new Image16 (); + int err = img->loadJPEGFromMemory(image,length); + if (err) { + printf("loadfromMemory: error\n"); + delete img; + return NULL; + } + + Thumbnail* tpp = new Thumbnail (); + + tpp->camwbRed = 1.0; + tpp->camwbGreen = 1.0; + tpp->camwbBlue = 1.0; + + tpp->embProfileLength = 0; + unsigned char* data; + img->getEmbeddedProfileData (tpp->embProfileLength, data); + if (data && tpp->embProfileLength) { + tpp->embProfileData = new unsigned char [tpp->embProfileLength]; + memcpy (tpp->embProfileData, data, tpp->embProfileLength); + } + else { + tpp->embProfileLength = 0; + tpp->embProfileData = NULL; + } + + tpp->redMultiplier = 1.0; + tpp->greenMultiplier = 1.0; + tpp->blueMultiplier = 1.0; + + tpp->scaleForSave = 8192; + tpp->defGain = 1.0; + tpp->gammaCorrected = false; + tpp->isRaw = 1; + memset (tpp->colorMatrix, 0, sizeof(tpp->colorMatrix)); + tpp->colorMatrix[0][0] = 1.0; + tpp->colorMatrix[1][1] = 1.0; + tpp->colorMatrix[2][2] = 1.0; + + if (fixwh==1) { + w = h * img->width / img->height; + tpp->scale = (double)img->height / h; + } + else { + h = w * img->height / img->width; + tpp->scale = (double)img->width / w; + } + + tpp->thumbImg = img->resize (w, h, TI_Nearest); + delete img; + + tpp->init (); + return tpp; +} + Thumbnail* Thumbnail::loadFromImage (const Glib::ustring& fname, int &w, int &h, int fixwh) { Image16* img = new Image16 (); @@ -143,7 +199,7 @@ void Thumbnail::init () { for (int j=0; j<3; j++) for (int k=0; k<3; k++) camToD50[i][j] += colorMatrix[k][i] * sRGB_d50[k][j]; - camProfile = iccStore.createFromMatrix (camToD50, false, "Camera"); + camProfile = iccStore->createFromMatrix (camToD50, false, "Camera"); } bool Thumbnail::igammacomputed = false; @@ -173,6 +229,39 @@ Thumbnail::~Thumbnail () { cmsCloseProfile(camProfile); } +IImage8* Thumbnail::quickProcessImage (const procparams::ProcParams& params, int rheight, TypeInterpolation interp, double& myscale) { + + int rwidth; + if (params.coarse.rotate==90 || params.coarse.rotate==270) { + rwidth = rheight; + rheight = thumbImg->height * rwidth / thumbImg->width; + } + else + rwidth = thumbImg->width * rheight / thumbImg->height; + Image16* baseImg = thumbImg->resize (rwidth, rheight, interp); + + if (params.coarse.rotate) { + Image16* tmp = baseImg->rotate (params.coarse.rotate); + rwidth = tmp->width; + rheight = tmp->height; + delete baseImg; + baseImg = tmp; + } + if (params.coarse.hflip) { + Image16* tmp = baseImg->hflip (); + delete baseImg; + baseImg = tmp; + } + if (params.coarse.vflip) { + Image16* tmp = baseImg->vflip (); + delete baseImg; + baseImg = tmp; + } + Image8* img8 = baseImg->to8(); + delete baseImg; + return img8; +} + IImage8* Thumbnail::processImage (const procparams::ProcParams& params, int rheight, TypeInterpolation interp, double& myscale) { // compute WB multipliers @@ -311,11 +400,12 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, int rhei if (params.toneCurve.autoexp && aeHistogram) ipf.getAutoExp (aeHistogram, aeHistCompression, logDefGain, params.toneCurve.clip, br, bl); - int* curve = new int [65536]; - CurveFactory::complexCurve (br, bl/65535.0, params.toneCurve.hlcompr, params.toneCurve.shcompr, params.toneCurve.brightness, params.toneCurve.contrast, logDefGain, isRaw ? 2.2 : 0, true, params.toneCurve.curve, hist16, curve, NULL, 16); + int* curve1 = new int [65536]; + int* curve2 = new int [65536]; + CurveFactory::complexCurve (br, bl/65535.0, params.toneCurve.hlcompr, params.toneCurve.shcompr, params.toneCurve.brightness, params.toneCurve.contrast, logDefGain, isRaw ? 2.2 : 0, true, params.toneCurve.curve, hist16, curve1, curve2, NULL, 16); LabImage* labView = new LabImage (baseImg); - ipf.rgbProc (baseImg, labView, curve, shmap); + ipf.rgbProc (baseImg, labView, curve1, curve2, shmap); if (shmap) delete shmap; @@ -327,11 +417,15 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, int rhei hist16[labView->L[i][j]]++; // luminance processing - CurveFactory::complexCurve (0.0, 0.0, 0.0, 0.0, params.lumaCurve.brightness, params.lumaCurve.contrast, 0.0, 0.0, false, params.lumaCurve.curve, hist16, curve, NULL, 16); + CurveFactory::complexCurve (0.0, 0.0, 0.0, 0.0, params.labCurve.brightness, params.labCurve.contrast, 0.0, 0.0, false, params.labCurve.lcurve, hist16, curve1, curve2, NULL, 16); + ipf.luminanceCurve (labView, labView, curve2, 0, fh); + CurveFactory::complexsgnCurve (0.0, 100.0, params.labCurve.saturation, 1.0, params.labCurve.acurve, curve1, 16); + ipf.chrominanceCurve (labView, labView, 0, curve1, 0, fh); + CurveFactory::complexsgnCurve (0.0, 100.0, params.labCurve.saturation, 1.0, params.labCurve.bcurve, curve1, 16); + ipf.chrominanceCurve (labView, labView, 1, curve1, 0, fh); - ipf.luminanceCurve (labView, labView, curve, 0, fh); - - delete [] curve; + delete [] curve1; + delete [] curve2; delete [] hist16; // color processing diff --git a/rtengine/rtthumbnail.h b/rtengine/rtthumbnail.h index f9b1c9914..438fe2e04 100644 --- a/rtengine/rtthumbnail.h +++ b/rtengine/rtthumbnail.h @@ -70,9 +70,12 @@ namespace rtengine { void init (); IImage8* processImage (const procparams::ProcParams& pparams, int rheight, TypeInterpolation interp, double& scale); + IImage8* quickProcessImage (const procparams::ProcParams& pparams, int rheight, TypeInterpolation interp, double& scale); int getImageWidth (const procparams::ProcParams& pparams, int rheight); void getFinalSize (const rtengine::procparams::ProcParams& pparams, int& w, int& h); + static Thumbnail* loadQuickFromRaw (const Glib::ustring& fname, rtengine::RawMetaDataLocation& rml, int &w, int &h, int fixwh); + static Thumbnail* loadFromMemory (const char* image, int length, int &w, int &h, int fixwh); static Thumbnail* loadFromRaw (const Glib::ustring& fname, RawMetaDataLocation& rml, int &w, int &h, int fixwh); static Thumbnail* loadFromImage (const Glib::ustring& fname, int &w, int &h, int fixwh); diff --git a/rtengine/settings.h b/rtengine/settings.h index fac2557ca..d91d425c5 100644 --- a/rtengine/settings.h +++ b/rtengine/settings.h @@ -1,44 +1,45 @@ -/* - * 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 . - */ -#ifndef _RTSETTINGS_ -#define _RTSETTINGS_ - -namespace rtengine { - - /** This structure holds the global parameters used by the RT engine. */ - class Settings { - public: - bool dualThreadEnabled; ///< If true, the image processing operations with utilize two processor cores (if possible) - Glib::ustring iccDirectory; ///< The directory containing the possible output icc profiles - int colorimetricIntent; ///< Colorimetric intent used at color space conversions - Glib::ustring monitorProfile; ///< ICC profile of the monitor (full path recommended) - bool verbose; - Glib::ustring darkFramesPath; ///< The default directory for dark frames - - /** Creates a new instance of Settings. - * @return a pointer to the new Settings instance. */ - static Settings* create (); - /** Destroys an instance of Settings. - * @param s a pointer to the Settings instance to destroy. */ - static void destroy (Settings* s); - }; -} - -#endif - +/* + * 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 . + */ +#ifndef _RTSETTINGS_ +#define _RTSETTINGS_ + +namespace rtengine { + + /** This structure holds the global parameters used by the RT engine. */ + class Settings { + public: + bool dualThreadEnabled; ///< If true, the image processing operations with utilize two processor cores (if possible) + std::string demosaicMethodBatch; ///< The algorithm used for demosaicing. Can be "eahd", "hphd", "ahd", "vng4", "amaze", "bilinear". + Glib::ustring iccDirectory; ///< The directory containing the possible output icc profiles + int colorimetricIntent; ///< Colorimetric intent used at color space conversions + Glib::ustring monitorProfile; ///< ICC profile of the monitor (full path recommended) + bool verbose; + Glib::ustring darkFramesPath; ///< The default directory for dark frames + + /** Creates a new instance of Settings. + * @return a pointer to the new Settings instance. */ + static Settings* create (); + /** Destroys an instance of Settings. + * @param s a pointer to the Settings instance to destroy. */ + static void destroy (Settings* s); + }; +} + +#endif + diff --git a/rtengine/shmap.cc b/rtengine/shmap.cc index 6bcb4dcbf..836f60e06 100644 --- a/rtengine/shmap.cc +++ b/rtengine/shmap.cc @@ -51,20 +51,21 @@ void SHMap::update (Image16* img, unsigned short** buffer, double radius, double int val = lumi[0]*img->r[i][j] + lumi[1]*img->g[i][j] + lumi[2]*img->b[i][j]; map[i][j] = CLIP(val); } - - if (!hq) { #ifdef _OPENMP - AlignedBuffer* buffer = new AlignedBuffer (MAX(W,H)*omp_get_max_threads()); -#else - AlignedBuffer* buffer = new AlignedBuffer (MAX(W,H)); +#pragma omp parallel #endif + { + if (!hq) { + AlignedBuffer* buffer = new AlignedBuffer (MAX(W,H)); gaussHorizontal (map, map, buffer, W, H, radius, multiThread); gaussVertical (map, map, buffer, W, H, radius, multiThread); delete buffer; } else { -#ifdef _OPENMP +#if 0 +// the new OpenMP method does not need thread number specific code. +// #ifdef _OPENMP #pragma omp parallel if (multiThread) { int tid = omp_get_thread_num(); @@ -80,6 +81,9 @@ void SHMap::update (Image16* img, unsigned short** buffer, double radius, double bilateral (map, buffer, W, H, 8000, radius, 0, H); #endif // anti-alias filtering the result +#ifdef _OPENMP +#pragma omp for +#endif for (int i=0; i0 && j>0 && igetDefGain(), params.toneCurve.clip, br, bl); } - int* curve = new int [65536]; + int* curve1 = new int [65536]; + int* curve2 = new int [65536]; - CurveFactory::complexCurve (br, bl/65535.0, params.toneCurve.hlcompr, params.toneCurve.shcompr, params.toneCurve.brightness, params.toneCurve.contrast, imgsrc->getDefGain(), imgsrc->getGamma(), true, params.toneCurve.curve, hist16, curve, NULL); + CurveFactory::complexCurve (br, bl/65535.0, params.toneCurve.hlcompr, params.toneCurve.shcompr, params.toneCurve.brightness, params.toneCurve.contrast, imgsrc->getDefGain(), imgsrc->getGamma(), true, params.toneCurve.curve, hist16, curve1, curve2, NULL); LabImage* labView = new LabImage (baseImg); - ipf.rgbProc (baseImg, labView, curve, shmap); + ipf.rgbProc (baseImg, labView, curve1, curve2, shmap); if (shmap) delete shmap; @@ -149,13 +150,19 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p hist16[labView->L[i][j]]++; // luminance processing - CurveFactory::complexCurve (0.0, 0.0, 0.0, 0.0, params.lumaCurve.brightness, params.lumaCurve.contrast, 0.0, 0.0, false, params.lumaCurve.curve, hist16, curve, NULL); - ipf.luminanceCurve (labView, labView, curve, 0, fh); + CurveFactory::complexCurve (0.0, 0.0, 0.0, 0.0, params.labCurve.brightness, params.labCurve.contrast, 0.0, 0.0, false, params.labCurve.lcurve, hist16, curve1, curve2, NULL); + ipf.luminanceCurve (labView, labView, curve2, 0, fh); + CurveFactory::complexsgnCurve (0.0, 100.0, params.labCurve.saturation, 1.0, params.labCurve.acurve, curve1, 1); + ipf.chrominanceCurve (labView, labView, 0, curve1, 0, fh); + CurveFactory::complexsgnCurve (0.0, 100.0, params.labCurve.saturation, 1.0, params.labCurve.bcurve, curve1, 1); + ipf.chrominanceCurve (labView, labView, 1, curve1, 0, fh); + ipf.impulsedenoise (labView); ipf.lumadenoise (labView, buffer); ipf.sharpening (labView, (unsigned short**)buffer); - delete [] curve; + delete [] curve1; + delete [] curve2; delete [] hist16; // color processing @@ -194,7 +201,7 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p ProfileContent pc; if (params.icm.output.compare (0, 6, "No ICM") && params.icm.output!="") - pc = iccStore.getContent (params.icm.output); + pc = iccStore->getContent (params.icm.output); readyImg->setOutputProfile (pc.data, pc.length); @@ -229,7 +236,8 @@ void batchProcessingThread (ProcessingJob* job, BatchProcessingListener* bpl) { void startBatchProcessing (ProcessingJob* job, BatchProcessingListener* bpl) { if (bpl) - Glib::Thread::create(sigc::bind(sigc::ptr_fun(batchProcessingThread), job, bpl), 0, false, true, Glib::THREAD_PRIORITY_NORMAL); + Glib::Thread::create(sigc::bind(sigc::ptr_fun(batchProcessingThread), job, bpl), 0, true, true, Glib::THREAD_PRIORITY_LOW); + } } diff --git a/rtengine/simpleprocess.h b/rtengine/simpleprocess.h new file mode 100644 index 000000000..fb5a24ff6 --- /dev/null +++ b/rtengine/simpleprocess.h @@ -0,0 +1,26 @@ +/* + * File: simpleprocess.h + * Author: askv + * + * Created on September 18, 2010, 8:31 PM + */ + +#ifndef SIMPLEPROCESS_H +#define SIMPLEPROCESS_H + +#ifdef __cplusplus +extern "C" { +#endif + + + + +#ifdef __cplusplus +} +#endif +namespace rtengine { + +extern Glib::Thread *batchThread; +} +#endif /* SIMPLEPROCESS_H */ + diff --git a/rtengine/stdimagesource.cc b/rtengine/stdimagesource.cc index 16096580a..3c8e1b55b 100644 --- a/rtengine/stdimagesource.cc +++ b/rtengine/stdimagesource.cc @@ -70,7 +70,7 @@ StdImageSource::~StdImageSource () { freeArray(needhr, img->height); } -int StdImageSource::load (Glib::ustring fname) { +int StdImageSource::load (Glib::ustring fname, bool batch) { fileName = fname; @@ -256,19 +256,19 @@ void StdImageSource::getImage (ColorTemp ctemp, int tran, Image16* image, Previe void StdImageSource::colorSpaceConversion (Image16* im, ColorManagementParams cmp, cmsHPROFILE embedded) { cmsHPROFILE in; - cmsHPROFILE out = iccStore.workingSpace (cmp.working); + cmsHPROFILE out = iccStore->workingSpace (cmp.working); if (cmp.input=="(embedded)" || cmp.input=="" || cmp.input=="(camera)") { if (embedded) in = embedded; else - in = iccStore.getsRGBProfile (); + in = iccStore->getsRGBProfile (); } else if (cmp.input!="(none)") { - in = iccStore.getProfile (cmp.input); + in = iccStore->getProfile (cmp.input); if (in==NULL && embedded) in = embedded; else if (in==NULL) - in = iccStore.getsRGBProfile (); + in = iccStore->getsRGBProfile (); else if (cmp.gammaOnInput) for (int i=0; iheight; i++) for (int j=0; jwidth; j++) { diff --git a/rtengine/stdimagesource.h b/rtengine/stdimagesource.h index 811d063ae..b06f53916 100644 --- a/rtengine/stdimagesource.h +++ b/rtengine/stdimagesource.h @@ -43,7 +43,7 @@ class StdImageSource : public ImageSource { StdImageSource (); ~StdImageSource (); - int load (Glib::ustring fname); + int load (Glib::ustring fname, bool batch = false); void getImage (ColorTemp ctemp, int tran, Image16* image, PreviewProps pp, HRecParams hrp, ColorManagementParams cmp, RAWParams raw); ColorTemp getWB () { return wb; } ColorTemp getAutoWB (); diff --git a/rtengine/updater.cc b/rtengine/updater.cc index 5a0b5a3b6..b0ff8f433 100644 --- a/rtengine/updater.cc +++ b/rtengine/updater.cc @@ -54,13 +54,13 @@ ProcParams* Updater::getParams () { void Updater::startProcessing () { - #undef THREAD_PRIORITY_NORMAL + #undef THREAD_PRIORITY_LOW tstart.lock (); if (ipc && !running) { running = true; tstart.unlock (); - Glib::Thread::create(sigc::mem_fun(*this, &Updater::process), 0, false, true, Glib::THREAD_PRIORITY_NORMAL); + Glib::Thread::create(sigc::mem_fun(*this, &Updater::process), 0, false, true, Glib::THREAD_PRIORITY_LOW); } else tstart.unlock (); diff --git a/rtexif/pentaxattribs.cc b/rtexif/pentaxattribs.cc index f41090c82..ab15b73c3 100644 --- a/rtexif/pentaxattribs.cc +++ b/rtexif/pentaxattribs.cc @@ -964,7 +964,9 @@ public: case 2: return "Depth"; case 3: return "MTF"; } + return"Normal"; } + }; PAAFModeInterpreter paAFModeInterpreter; diff --git a/rtgui/CMakeLists.txt b/rtgui/CMakeLists.txt index efbb075ee..4cba0b926 100644 --- a/rtgui/CMakeLists.txt +++ b/rtgui/CMakeLists.txt @@ -14,8 +14,9 @@ set (BASESOURCEFILES whitebalance.cc vignetting.cc rotate.cc distortion.cc crophandler.cc curveeditor.cc dirbrowser.cc filecatalog.cc + previewloader.cc histogrampanel.cc history.cc imagearea.cc - imageareapanel.cc iptcpanel.cc lcurve.cc lumadenoise.cc main.cc + imageareapanel.cc iptcpanel.cc labcurve.cc lumadenoise.cc main.cc multilangmgr.cc mycurve.cc options.cc preferences.cc profilepanel.cc safegtk.cc saveasdlg.cc saveformatpanel.cc splash.cc diff --git a/rtgui/addsetids.h b/rtgui/addsetids.h index ed5192d8a..80d23c3b1 100644 --- a/rtgui/addsetids.h +++ b/rtgui/addsetids.h @@ -22,7 +22,10 @@ #define ADDSET_PERSPECTIVE 18 #define ADDSET_CA 19 #define ADDSET_VIGN_AMOUNT 20 +#define ADDSET_LC_SATURATION 21 +// When adding items, make sure to update ADDSET_PARAM_NUM +#define ADDSET_PARAM_NUM 22 // THIS IS USED AS A DELIMITER!! + -#define ADDSET_PARAM_NUM 21 #endif diff --git a/rtgui/batchqueue.cc b/rtgui/batchqueue.cc index 10571944d..d6cd5ab32 100644 --- a/rtgui/batchqueue.cc +++ b/rtgui/batchqueue.cc @@ -18,10 +18,12 @@ */ #include #include +#include #include #include #include #include +#include using namespace rtengine; @@ -335,6 +337,10 @@ Glib::ustring BatchQueue::autoCompleteFileName (const Glib::ustring& fileName, c // create directory, if does not exist if (g_mkdir_with_parents (dstdir.c_str(), 0755) ) return ""; + + // In overwrite mode we TRY to delete the old file first. + // if that's not possible (e.g. locked by viewer, R/O), we revert to the standard naming scheme + bool inOverwriteMode=options.overwriteOutputFile; for (int tries=0; tries<100; tries++) { Glib::ustring fname; @@ -343,7 +349,17 @@ Glib::ustring BatchQueue::autoCompleteFileName (const Glib::ustring& fileName, c else fname = Glib::ustring::compose ("%1-%2.%3", Glib::build_filename (dstdir, dstfname), tries, format); - if (!Glib::file_test (fname, Glib::FILE_TEST_EXISTS)) { + int fileExists=Glib::file_test (fname, Glib::FILE_TEST_EXISTS); + + if (inOverwriteMode && fileExists) { + // do NOT use g_remove as it has compiler problems on Unix and OSX (GTK namespace problem) + if (::remove(safe_locale_from_utf8(fname).c_str ()) == -1) + inOverwriteMode = false; // failed to delete- revert to old naming scheme + else + fileExists = false; // deleted now + } + + if (!fileExists) { return fname; } } diff --git a/rtgui/batchqueuepanel.cc b/rtgui/batchqueuepanel.cc index 6428c34e5..e73e3853b 100644 --- a/rtgui/batchqueuepanel.cc +++ b/rtgui/batchqueuepanel.cc @@ -1,269 +1,269 @@ -/* - * 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 -#include -#include -#include -#include - -BatchQueuePanel::BatchQueuePanel () { - - batchQueue = new BatchQueue(); - - // construct batch queue panel with the extra "start" and "stop" button - Gtk::VBox* batchQueueButtonBox = Gtk::manage (new Gtk::VBox); - start = Gtk::manage (new Gtk::ToggleButton (M("FILEBROWSER_STARTPROCESSING"))); - stop = Gtk::manage (new Gtk::ToggleButton (M("FILEBROWSER_STOPPROCESSING"))); - autoStart = Gtk::manage (new Gtk::CheckButton (M("BATCHQUEUE_AUTOSTART"))); - start->set_tooltip_text (M("FILEBROWSER_STARTPROCESSINGHINT")); - stop->set_tooltip_text (M("FILEBROWSER_STOPPROCESSINGHINT")); - autoStart->set_tooltip_text (M("FILEBROWSER_TOOLTIP_STOPPROCESSING")); - start->set_active (false); - stop->set_active (true); - autoStart->set_active (options.procQueueEnabled); - - start->set_image (*Gtk::manage (new Gtk::Image (Gtk::StockID("gtk-media-play"), Gtk::ICON_SIZE_BUTTON))); - startConnection = start->signal_toggled().connect (sigc::mem_fun(*this, &BatchQueuePanel::startBatchProc)); - stop->set_image (*Gtk::manage (new Gtk::Image (Gtk::StockID("gtk-media-stop"), Gtk::ICON_SIZE_BUTTON))); - stopConnection = stop->signal_toggled().connect (sigc::mem_fun(*this, &BatchQueuePanel::stopBatchProc)); - batchQueueButtonBox->pack_start (*start, Gtk::PACK_SHRINK, 4); - batchQueueButtonBox->pack_start (*stop, Gtk::PACK_SHRINK, 4); - batchQueueButtonBox->pack_start (*autoStart, Gtk::PACK_SHRINK, 4); - - // Output directory selection - fdir = Gtk::manage (new Gtk::Frame (M("PREFERENCES_OUTDIR"))); - Gtk::VBox* odvb = Gtk::manage (new Gtk::VBox ()); - odvb->set_border_width (4); - Gtk::HBox* hb2 = Gtk::manage (new Gtk::HBox ()); - useTemplate = Gtk::manage (new Gtk::RadioButton (M("PREFERENCES_OUTDIRTEMPLATE")+":")); - hb2->pack_start (*useTemplate, Gtk::PACK_SHRINK,4); - outdirTemplate = Gtk::manage (new Gtk::Entry ()); - hb2->pack_start (*outdirTemplate); - odvb->pack_start (*hb2, Gtk::PACK_SHRINK, 4); - outdirTemplate->set_tooltip_markup (M("PREFERENCES_OUTDIRTEMPLATEHINT")); - useTemplate->set_tooltip_markup (M("PREFERENCES_OUTDIRTEMPLATEHINT")); - Gtk::HBox* hb3 = Gtk::manage (new Gtk::HBox ()); - useFolder = Gtk::manage (new Gtk::RadioButton (M("PREFERENCES_OUTDIRFOLDER")+":")); - hb3->pack_start (*useFolder, Gtk::PACK_SHRINK,4); - outdirFolder = Gtk::manage (new Gtk::FileChooserButton (M("PREFERENCES_OUTDIRFOLDER"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER)); - hb3->pack_start (*outdirFolder); - odvb->pack_start (*hb3, Gtk::PACK_SHRINK, 4); - outdirFolder->set_tooltip_markup (M("PREFERENCES_OUTDIRFOLDERHINT")); - useFolder->set_tooltip_markup (M("PREFERENCES_OUTDIRFOLDERHINT")); - Gtk::RadioButton::Group g = useTemplate->get_group(); - useFolder->set_group (g); - fdir->add (*odvb); - - // Output file format selection - fformat = Gtk::manage (new Gtk::Frame (M("PREFERENCES_FILEFORMAT"))); - saveFormatPanel = Gtk::manage (new SaveFormatPanel ()); - fformat->add (*saveFormatPanel); - - saveFormatPanel->init (options.saveFormat); - outdirTemplate->set_text (options.savePathTemplate); - if (Glib::file_test (options.savePathFolder, Glib::FILE_TEST_IS_DIR)) - outdirFolder->set_filename (options.savePathFolder); - useTemplate->set_active (options.saveUsePathTemplate); - useFolder->set_active (!options.saveUsePathTemplate); - - // setup signal handlers - outdirTemplate->signal_changed().connect (sigc::mem_fun(*this, &BatchQueuePanel::saveOptions)); - outdirFolder->signal_current_folder_changed().connect (sigc::mem_fun(*this, &BatchQueuePanel::pathFolderChanged)); - useTemplate->signal_toggled().connect (sigc::mem_fun(*this, &BatchQueuePanel::saveOptions)); - useFolder->signal_toggled().connect (sigc::mem_fun(*this, &BatchQueuePanel::saveOptions)); - saveFormatPanel->setListener (this); - - // setup button bar - topBox = Gtk::manage (new Gtk::HBox ()); - pack_start (*topBox, Gtk::PACK_SHRINK); - - topBox->pack_start (*batchQueueButtonBox, Gtk::PACK_SHRINK, 4); - topBox->pack_start (*fdir); - topBox->pack_start (*fformat, Gtk::PACK_SHRINK, 4); - - // add middle browser area - Gtk::HBox* hBox = Gtk::manage (new Gtk::HBox ()); - pack_start (*batchQueue); - - // lower box with thumbnail zoom - bottomBox = Gtk::manage (new Gtk::HBox ()); - pack_start (*bottomBox, Gtk::PACK_SHRINK); - - // change thumbnail arrangement button - hAlignIcon = new Gtk::Image (argv0+"/images/horizontals.png"); - vAlignIcon = new Gtk::Image (argv0+"/images/verticals.png"); - hAlignIcon->show (); - vAlignIcon->show (); - chAlign = Gtk::manage (new Gtk::Button ()); - chAlign->show (); - bottomBox->pack_end (*chAlign, Gtk::PACK_SHRINK); - chAlign->set_image (*hAlignIcon); - chAlign->set_relief (Gtk::RELIEF_NONE); - chAlign->signal_pressed().connect (sigc::mem_fun(*this, &BatchQueuePanel::arrangementButtonPressed)); - chAlign->set_tooltip_text (M("FILEBROWSER_ARRANGEMENTHINT")); - bottomBox->pack_end (*Gtk::manage (new Gtk::VSeparator), Gtk::PACK_SHRINK, 4); - if (options.fbArrangement==1) - chAlign->set_image (*vAlignIcon); - else - chAlign->set_image (*hAlignIcon); - arrangementButtonPressed (); - - // thumbnail zoom - Gtk::HBox* zoomBox = Gtk::manage (new Gtk::HBox ()); - zoomBox->pack_start (*Gtk::manage (new Gtk::VSeparator), Gtk::PACK_SHRINK, 4); - Gtk::Label* zoomLabel = Gtk::manage (new Gtk::Label (Glib::ustring("")+M("FILEBROWSER_THUMBSIZE")+":")); - zoomLabel->set_use_markup (true); - zoomBox->pack_start (*zoomLabel, Gtk::PACK_SHRINK, 4); - zoomInButton = Gtk::manage (new Gtk::Button ()); - zoomInButton->set_image (*Gtk::manage (new Gtk::Image (Gtk::StockID("gtk-zoom-in"), Gtk::ICON_SIZE_SMALL_TOOLBAR))); - zoomInButton->signal_pressed().connect (sigc::mem_fun(*batchQueue, &BatchQueue::zoomIn)); - zoomInButton->set_relief (Gtk::RELIEF_NONE); - zoomInButton->set_tooltip_text (M("FILEBROWSER_ZOOMINHINT")); - zoomBox->pack_end (*zoomInButton, Gtk::PACK_SHRINK); - zoomOutButton = Gtk::manage (new Gtk::Button ()); - zoomOutButton->set_image (*Gtk::manage (new Gtk::Image (Gtk::StockID("gtk-zoom-out"), Gtk::ICON_SIZE_SMALL_TOOLBAR))); - zoomOutButton->signal_pressed().connect (sigc::mem_fun(*batchQueue, &BatchQueue::zoomOut)); - zoomOutButton->set_relief (Gtk::RELIEF_NONE); - zoomOutButton->set_tooltip_text (M("FILEBROWSER_ZOOMOUTHINT")); - zoomBox->pack_end (*zoomOutButton, Gtk::PACK_SHRINK); - bottomBox->pack_end (*zoomBox, Gtk::PACK_SHRINK); - - - batchQueue->setBatchQueueListener (this); - - show_all (); -} - -void BatchQueuePanel::arrangementButtonPressed () { - - if (chAlign->get_image()==hAlignIcon) { - chAlign->set_image (*vAlignIcon); - batchQueue->setArrangement (BatchQueue::TB_Vertical); - } - else { - chAlign->set_image (*hAlignIcon); - batchQueue->setArrangement (BatchQueue::TB_Horizontal); - } -} - -void BatchQueuePanel::updateTab (int qsize) -{ - Gtk::Notebook *nb =(Gtk::Notebook *)(this->get_parent()); - Gtk::HBox* hbb = Gtk::manage (new Gtk::HBox ()); - if(!qsize ){ - hbb->pack_start (*Gtk::manage (new Gtk::Image (argv0+"/images/processing.png"))); - hbb->pack_start (*Gtk::manage (new Gtk::Label (M("MAIN_FRAME_BATCHQUEUE") ))); - }else if( start->get_active () ){ - hbb->pack_start (*Gtk::manage (new Gtk::Image (argv0+"/images/processing-play.png"))); - hbb->pack_start (*Gtk::manage (new Gtk::Label (M("MAIN_FRAME_BATCHQUEUE")+" [" +Glib::ustring::format( qsize )+"]" ))); - }else{ - hbb->pack_start (*Gtk::manage (new Gtk::Image (argv0+"/images/processing-pause.png"))); - hbb->pack_start (*Gtk::manage (new Gtk::Label (M("MAIN_FRAME_BATCHQUEUE")+" [" +Glib::ustring::format( qsize )+"]" ))); - } - hbb->set_spacing (2); - hbb->show_all (); - nb->set_tab_label(*this,*hbb); -} - -void BatchQueuePanel::queueSizeChanged (int qsize) -{ - updateTab ( qsize); -} - -void BatchQueuePanel::imageProcessingReady (Glib::ustring fname) { - - parent->imageDeveloped (fname); -} - -void BatchQueuePanel::startBatchProc () { - - stopConnection.block (true); - startConnection.block (true); - stop->set_active (false); - start->set_active (true); - stopConnection.block (false); - startConnection.block (false); - - if (batchQueue->hasJobs()) { - fdir->set_sensitive (false); - fformat->set_sensitive (false); - saveOptions(); - batchQueue->startProcessing (); - } - else - stopBatchProc (); - updateTab (batchQueue->getEntries().size()); -} - -void BatchQueuePanel::stopBatchProc () { - - stopConnection.block (true); - startConnection.block (true); - stop->set_active (true); - start->set_active (false); - stopConnection.block (false); - startConnection.block (false); - updateTab (batchQueue->getEntries().size()); -} - -void BatchQueuePanel::addBatchQueueJob (BatchQueueEntry* bqe, bool head) { - - batchQueue->addEntry (bqe, head); - - if (stop->get_active () && autoStart->get_active ()) - startBatchProc (); -} - -void BatchQueuePanel::queueEmpty () { - - stopBatchProc (); - fdir->set_sensitive (true); - fformat->set_sensitive (true); -} - -bool BatchQueuePanel::canStartNext () { - - if (start->get_active ()) - return true; - else { - fdir->set_sensitive (true); - fformat->set_sensitive (true); - return false; - } -} - -void BatchQueuePanel::saveOptions () { - - options.savePathTemplate = outdirTemplate->get_text(); - options.saveUsePathTemplate = useTemplate->get_active(); - options.procQueueEnabled = autoStart->get_active (); -} - -// We only want to save the following when it changes, \ -// since these settings are shared with editorpanel : -void BatchQueuePanel::pathFolderChanged () { - - options.savePathFolder = outdirFolder->get_filename(); -} - -void BatchQueuePanel::formatChanged (Glib::ustring f) { - - options.saveFormat = saveFormatPanel->getFormat (); - -} +/* + * 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 +#include +#include +#include +#include + +BatchQueuePanel::BatchQueuePanel () { + + batchQueue = new BatchQueue(); + + // construct batch queue panel with the extra "start" and "stop" button + Gtk::VBox* batchQueueButtonBox = Gtk::manage (new Gtk::VBox); + start = Gtk::manage (new Gtk::ToggleButton (M("FILEBROWSER_STARTPROCESSING"))); + stop = Gtk::manage (new Gtk::ToggleButton (M("FILEBROWSER_STOPPROCESSING"))); + autoStart = Gtk::manage (new Gtk::CheckButton (M("BATCHQUEUE_AUTOSTART"))); + start->set_tooltip_text (M("FILEBROWSER_STARTPROCESSINGHINT")); + stop->set_tooltip_text (M("FILEBROWSER_STOPPROCESSINGHINT")); + autoStart->set_tooltip_text (M("FILEBROWSER_TOOLTIP_STOPPROCESSING")); + start->set_active (false); + stop->set_active (true); + autoStart->set_active (options.procQueueEnabled); + + start->set_image (*Gtk::manage (new Gtk::Image (Gtk::StockID("gtk-media-play"), Gtk::ICON_SIZE_BUTTON))); + startConnection = start->signal_toggled().connect (sigc::mem_fun(*this, &BatchQueuePanel::startBatchProc)); + stop->set_image (*Gtk::manage (new Gtk::Image (Gtk::StockID("gtk-media-stop"), Gtk::ICON_SIZE_BUTTON))); + stopConnection = stop->signal_toggled().connect (sigc::mem_fun(*this, &BatchQueuePanel::stopBatchProc)); + batchQueueButtonBox->pack_start (*start, Gtk::PACK_SHRINK, 4); + batchQueueButtonBox->pack_start (*stop, Gtk::PACK_SHRINK, 4); + batchQueueButtonBox->pack_start (*autoStart, Gtk::PACK_SHRINK, 4); + + // Output directory selection + fdir = Gtk::manage (new Gtk::Frame (M("PREFERENCES_OUTDIR"))); + Gtk::VBox* odvb = Gtk::manage (new Gtk::VBox ()); + odvb->set_border_width (4); + Gtk::HBox* hb2 = Gtk::manage (new Gtk::HBox ()); + useTemplate = Gtk::manage (new Gtk::RadioButton (M("PREFERENCES_OUTDIRTEMPLATE")+":")); + hb2->pack_start (*useTemplate, Gtk::PACK_SHRINK,4); + outdirTemplate = Gtk::manage (new Gtk::Entry ()); + hb2->pack_start (*outdirTemplate); + odvb->pack_start (*hb2, Gtk::PACK_SHRINK, 4); + outdirTemplate->set_tooltip_markup (M("PREFERENCES_OUTDIRTEMPLATEHINT")); + useTemplate->set_tooltip_markup (M("PREFERENCES_OUTDIRTEMPLATEHINT")); + Gtk::HBox* hb3 = Gtk::manage (new Gtk::HBox ()); + useFolder = Gtk::manage (new Gtk::RadioButton (M("PREFERENCES_OUTDIRFOLDER")+":")); + hb3->pack_start (*useFolder, Gtk::PACK_SHRINK,4); + outdirFolder = Gtk::manage (new Gtk::FileChooserButton (M("PREFERENCES_OUTDIRFOLDER"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER)); + hb3->pack_start (*outdirFolder); + odvb->pack_start (*hb3, Gtk::PACK_SHRINK, 4); + outdirFolder->set_tooltip_markup (M("PREFERENCES_OUTDIRFOLDERHINT")); + useFolder->set_tooltip_markup (M("PREFERENCES_OUTDIRFOLDERHINT")); + Gtk::RadioButton::Group g = useTemplate->get_group(); + useFolder->set_group (g); + fdir->add (*odvb); + + // Output file format selection + fformat = Gtk::manage (new Gtk::Frame (M("PREFERENCES_FILEFORMAT"))); + saveFormatPanel = Gtk::manage (new SaveFormatPanel ()); + fformat->add (*saveFormatPanel); + + saveFormatPanel->init (options.saveFormat); + outdirTemplate->set_text (options.savePathTemplate); + if (Glib::file_test (options.savePathFolder, Glib::FILE_TEST_IS_DIR)) + outdirFolder->set_current_folder (options.savePathFolder); + useTemplate->set_active (options.saveUsePathTemplate); + useFolder->set_active (!options.saveUsePathTemplate); + + // setup signal handlers + outdirTemplate->signal_changed().connect (sigc::mem_fun(*this, &BatchQueuePanel::saveOptions)); + outdirFolder->signal_current_folder_changed().connect (sigc::mem_fun(*this, &BatchQueuePanel::pathFolderChanged)); + useTemplate->signal_toggled().connect (sigc::mem_fun(*this, &BatchQueuePanel::saveOptions)); + useFolder->signal_toggled().connect (sigc::mem_fun(*this, &BatchQueuePanel::saveOptions)); + saveFormatPanel->setListener (this); + + // setup button bar + topBox = Gtk::manage (new Gtk::HBox ()); + pack_start (*topBox, Gtk::PACK_SHRINK); + + topBox->pack_start (*batchQueueButtonBox, Gtk::PACK_SHRINK, 4); + topBox->pack_start (*fdir); + topBox->pack_start (*fformat, Gtk::PACK_SHRINK, 4); + + // add middle browser area + Gtk::HBox* hBox = Gtk::manage (new Gtk::HBox ()); + pack_start (*batchQueue); + + // lower box with thumbnail zoom + bottomBox = Gtk::manage (new Gtk::HBox ()); + pack_start (*bottomBox, Gtk::PACK_SHRINK); + + // change thumbnail arrangement button + hAlignIcon = new Gtk::Image (argv0+"/images/horizontals.png"); + vAlignIcon = new Gtk::Image (argv0+"/images/verticals.png"); + hAlignIcon->show (); + vAlignIcon->show (); + chAlign = Gtk::manage (new Gtk::Button ()); + chAlign->show (); + bottomBox->pack_end (*chAlign, Gtk::PACK_SHRINK); + chAlign->set_image (*hAlignIcon); + chAlign->set_relief (Gtk::RELIEF_NONE); + chAlign->signal_pressed().connect (sigc::mem_fun(*this, &BatchQueuePanel::arrangementButtonPressed)); + chAlign->set_tooltip_text (M("FILEBROWSER_ARRANGEMENTHINT")); + bottomBox->pack_end (*Gtk::manage (new Gtk::VSeparator), Gtk::PACK_SHRINK, 4); + if (options.fbArrangement==1) + chAlign->set_image (*vAlignIcon); + else + chAlign->set_image (*hAlignIcon); + arrangementButtonPressed (); + + // thumbnail zoom + Gtk::HBox* zoomBox = Gtk::manage (new Gtk::HBox ()); + zoomBox->pack_start (*Gtk::manage (new Gtk::VSeparator), Gtk::PACK_SHRINK, 4); + Gtk::Label* zoomLabel = Gtk::manage (new Gtk::Label (Glib::ustring("")+M("FILEBROWSER_THUMBSIZE")+":")); + zoomLabel->set_use_markup (true); + zoomBox->pack_start (*zoomLabel, Gtk::PACK_SHRINK, 4); + zoomInButton = Gtk::manage (new Gtk::Button ()); + zoomInButton->set_image (*Gtk::manage (new Gtk::Image (Gtk::StockID("gtk-zoom-in"), Gtk::ICON_SIZE_SMALL_TOOLBAR))); + zoomInButton->signal_pressed().connect (sigc::mem_fun(*batchQueue, &BatchQueue::zoomIn)); + zoomInButton->set_relief (Gtk::RELIEF_NONE); + zoomInButton->set_tooltip_text (M("FILEBROWSER_ZOOMINHINT")); + zoomBox->pack_end (*zoomInButton, Gtk::PACK_SHRINK); + zoomOutButton = Gtk::manage (new Gtk::Button ()); + zoomOutButton->set_image (*Gtk::manage (new Gtk::Image (Gtk::StockID("gtk-zoom-out"), Gtk::ICON_SIZE_SMALL_TOOLBAR))); + zoomOutButton->signal_pressed().connect (sigc::mem_fun(*batchQueue, &BatchQueue::zoomOut)); + zoomOutButton->set_relief (Gtk::RELIEF_NONE); + zoomOutButton->set_tooltip_text (M("FILEBROWSER_ZOOMOUTHINT")); + zoomBox->pack_end (*zoomOutButton, Gtk::PACK_SHRINK); + bottomBox->pack_end (*zoomBox, Gtk::PACK_SHRINK); + + + batchQueue->setBatchQueueListener (this); + + show_all (); +} + +void BatchQueuePanel::arrangementButtonPressed () { + + if (chAlign->get_image()==hAlignIcon) { + chAlign->set_image (*vAlignIcon); + batchQueue->setArrangement (BatchQueue::TB_Vertical); + } + else { + chAlign->set_image (*hAlignIcon); + batchQueue->setArrangement (BatchQueue::TB_Horizontal); + } +} + +void BatchQueuePanel::updateTab (int qsize) +{ + Gtk::Notebook *nb =(Gtk::Notebook *)(this->get_parent()); + Gtk::HBox* hbb = Gtk::manage (new Gtk::HBox ()); + if(!qsize ){ + hbb->pack_start (*Gtk::manage (new Gtk::Image (argv0+"/images/processing.png"))); + hbb->pack_start (*Gtk::manage (new Gtk::Label (M("MAIN_FRAME_BATCHQUEUE") ))); + }else if( start->get_active () ){ + hbb->pack_start (*Gtk::manage (new Gtk::Image (argv0+"/images/processing-play.png"))); + hbb->pack_start (*Gtk::manage (new Gtk::Label (M("MAIN_FRAME_BATCHQUEUE")+" [" +Glib::ustring::format( qsize )+"]" ))); + }else{ + hbb->pack_start (*Gtk::manage (new Gtk::Image (argv0+"/images/processing-pause.png"))); + hbb->pack_start (*Gtk::manage (new Gtk::Label (M("MAIN_FRAME_BATCHQUEUE")+" [" +Glib::ustring::format( qsize )+"]" ))); + } + hbb->set_spacing (2); + hbb->show_all (); + nb->set_tab_label(*this,*hbb); +} + +void BatchQueuePanel::queueSizeChanged (int qsize) +{ + updateTab ( qsize); +} + +void BatchQueuePanel::imageProcessingReady (Glib::ustring fname) { + + parent->imageDeveloped (fname); +} + +void BatchQueuePanel::startBatchProc () { + + stopConnection.block (true); + startConnection.block (true); + stop->set_active (false); + start->set_active (true); + stopConnection.block (false); + startConnection.block (false); + + if (batchQueue->hasJobs()) { + fdir->set_sensitive (false); + fformat->set_sensitive (false); + saveOptions(); + batchQueue->startProcessing (); + } + else + stopBatchProc (); + updateTab (batchQueue->getEntries().size()); +} + +void BatchQueuePanel::stopBatchProc () { + + stopConnection.block (true); + startConnection.block (true); + stop->set_active (true); + start->set_active (false); + stopConnection.block (false); + startConnection.block (false); + updateTab (batchQueue->getEntries().size()); +} + +void BatchQueuePanel::addBatchQueueJob (BatchQueueEntry* bqe, bool head) { + + batchQueue->addEntry (bqe, head); + + if (stop->get_active () && autoStart->get_active ()) + startBatchProc (); +} + +void BatchQueuePanel::queueEmpty () { + + stopBatchProc (); + fdir->set_sensitive (true); + fformat->set_sensitive (true); +} + +bool BatchQueuePanel::canStartNext () { + + if (start->get_active ()) + return true; + else { + fdir->set_sensitive (true); + fformat->set_sensitive (true); + return false; + } +} + +void BatchQueuePanel::saveOptions () { + + options.savePathTemplate = outdirTemplate->get_text(); + options.saveUsePathTemplate = useTemplate->get_active(); + options.procQueueEnabled = autoStart->get_active (); +} + +// We only want to save the following when it changes, \ +// since these settings are shared with editorpanel : +void BatchQueuePanel::pathFolderChanged () { + + options.savePathFolder = outdirFolder->get_current_folder(); +} + +void BatchQueuePanel::formatChanged (Glib::ustring f) { + + options.saveFormat = saveFormatPanel->getFormat (); + +} diff --git a/rtgui/batchtoolpanelcoord.cc b/rtgui/batchtoolpanelcoord.cc index 8ad08c61e..a4fe97d94 100644 --- a/rtgui/batchtoolpanelcoord.cc +++ b/rtgui/batchtoolpanelcoord.cc @@ -121,7 +121,7 @@ void BatchToolPanelCoordinator::initSession () { coarse->initBatchBehavior (); curve->setAdjusterBehavior (options.baBehav[ADDSET_TC_EXPCOMP], options.baBehav[ADDSET_TC_BRIGHTNESS], options.baBehav[ADDSET_TC_BLACKLEVEL], options.baBehav[ADDSET_TC_CONTRAST]); - lcurve->setAdjusterBehavior (options.baBehav[ADDSET_LC_BRIGHTNESS], options.baBehav[ADDSET_LC_CONTRAST]); + lcurve->setAdjusterBehavior (options.baBehav[ADDSET_LC_BRIGHTNESS], options.baBehav[ADDSET_LC_CONTRAST], options.baBehav[ADDSET_LC_SATURATION]); whitebalance->setAdjusterBehavior (options.baBehav[ADDSET_WB_TEMPERATURE], options.baBehav[ADDSET_WB_GREEN]); vignetting->setAdjusterBehavior (options.baBehav[ADDSET_VIGN_AMOUNT]); rotate->setAdjusterBehavior (options.baBehav[ADDSET_ROTATE_DEGREE]); @@ -143,9 +143,10 @@ void BatchToolPanelCoordinator::initSession () { 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.lumaCurve.brightness = 0; - if (options.baBehav[ADDSET_LC_CONTRAST]) pparams.lumaCurve.contrast = 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_SATURATION]) pparams.labCurve.saturation = 0; + if (options.baBehav[ADDSET_SHARP_AMOUNT]) pparams.sharpening.amount = 0; if (options.baBehav[ADDSET_LD_EDGETOLERANCE]) pparams.lumaDenoise.edgetolerance = 0; diff --git a/rtgui/bqentryupdater.cc b/rtgui/bqentryupdater.cc index f98cab189..3ad75b669 100644 --- a/rtgui/bqentryupdater.cc +++ b/rtgui/bqentryupdater.cc @@ -57,9 +57,10 @@ void BatchQueueEntryUpdater::add (guint8* oimg, int ow, int oh, int newh, BQEntr void BatchQueueEntryUpdater::process () { - if (stopped) - #undef THREAD_PRIORITY_NORMAL - thread = Glib::Thread::create(sigc::mem_fun(*this, &BatchQueueEntryUpdater::process_), (unsigned long int)0, true, true, Glib::THREAD_PRIORITY_NORMAL); + if (stopped){ + #undef THREAD_PRIORITY_LOW + thread = Glib::Thread::create(sigc::mem_fun(*this, &BatchQueueEntryUpdater::process_), (unsigned long int)0, true, true, Glib::THREAD_PRIORITY_LOW); + } } void BatchQueueEntryUpdater::process_ () { @@ -93,7 +94,7 @@ void BatchQueueEntryUpdater::stop () { tostop = true; Glib::Thread::self()->yield(); if (!stopped) - thread->join (); + thread->join (); gdk_threads_enter(); } diff --git a/rtgui/cachemanager.cc b/rtgui/cachemanager.cc index a7029951a..f44fcb165 100644 --- a/rtgui/cachemanager.cc +++ b/rtgui/cachemanager.cc @@ -24,10 +24,26 @@ #include #include -CacheManager cacheMgr; +CacheManager* +CacheManager::getInstance(void) +{ + static CacheManager* instance_ = 0; + if ( instance_ == 0 ) + { + static Glib::Mutex smutex_; + Glib::Mutex::Lock lock(smutex_); + if ( instance_ == 0 ) + { + instance_ = new CacheManager(); + } + } + return instance_; +} void CacheManager::init () { + Glib::Mutex::Lock lock(mutex_); + openEntries.clear (); baseDir = options.cacheBaseDir; @@ -49,12 +65,18 @@ Thumbnail* CacheManager::getEntry (const Glib::ustring& fname) { Thumbnail* res = NULL; - std::map::iterator r = openEntries.find (fname); - // if it is open, return it - if (r!=openEntries.end()) { - r->second->increaseRef (); - return r->second; - } + // take manager lock and search for entry, if found return it else release + // lock and create it + { + Glib::Mutex::Lock lock(mutex_); + + string_thumb_map::iterator r = openEntries.find (fname); + // if it is open, return it + if (r!=openEntries.end()) { + r->second->increaseRef (); + return r->second; + } + } // compute the md5 std::string md5 = getMD5 (fname); @@ -78,6 +100,7 @@ Thumbnail* CacheManager::getEntry (const Glib::ustring& fname) { } // if not, create a new one if (!res) { + res = new Thumbnail (this, fname, md5); if (!res->isSupported ()) { delete res; @@ -85,20 +108,45 @@ Thumbnail* CacheManager::getEntry (const Glib::ustring& fname) { } } + // retake the lock and see if it was added while we we're unlocked, if it + // was use it over our version. if not added we create the cache entry if (res) - openEntries[fname] = res; + { + Glib::Mutex::Lock lock(mutex_); + + string_thumb_map::iterator r = openEntries.find (fname); + if (r!=openEntries.end()) { + delete res; + r->second->increaseRef (); + return r->second; + } + + // it wasn't, create a new entry + openEntries[fname] = res; + } + return res; } void CacheManager::deleteEntry (const Glib::ustring& fname) { + Glib::Mutex::Lock lock(mutex_); + // check if it is opened - std::map::iterator r = openEntries.find (fname); + string_thumb_map::iterator r = openEntries.find (fname); // if it is open, dont delete it if (r!=openEntries.end()) { std::string md5 = r->second->getMD5 (); - r->second->decreaseRef (); + + // decrease reference count; this will call back into CacheManager so + // we release the lock for it. + { + lock.release(); + r->second->decreaseRef (); + lock.acquire(); + } + // if in the editor, the thumbnail still exists. If not, delete it: r = openEntries.find (fname); if (r==openEntries.end() && md5!="") { @@ -126,6 +174,8 @@ void CacheManager::deleteEntry (const Glib::ustring& fname) { void CacheManager::renameEntry (const std::string& oldfilename, const std::string& oldmd5, const std::string& newfilename) { + Glib::Mutex::Lock lock(mutex_); + std::string newmd5 = getMD5 (newfilename); ::g_rename ((getCacheFileName ("profiles", oldfilename, oldmd5) + paramFileExtension).c_str(), (getCacheFileName ("profiles", newfilename, newmd5) + paramFileExtension).c_str()); @@ -136,7 +186,7 @@ void CacheManager::renameEntry (const std::string& oldfilename, const std::strin ::g_rename ((getCacheFileName ("data", oldfilename, oldmd5) + ".txt").c_str(), (getCacheFileName ("data", newfilename, newmd5) + ".txt").c_str()); // check if it is opened - std::map::iterator r = openEntries.find (oldfilename); + string_thumb_map::iterator r = openEntries.find (oldfilename); // if it is open, update md5 if (r!=openEntries.end()) { Thumbnail* t = r->second; @@ -144,14 +194,16 @@ void CacheManager::renameEntry (const std::string& oldfilename, const std::strin t->setFileName (newfilename); openEntries[newfilename] = t; t->updateCache (); - t->reSaveThumbnail (); + t->saveThumbnail (); } } void CacheManager::closeThumbnail (Thumbnail* t) { + Glib::Mutex::Lock lock(mutex_); + t->updateCache (); - std::map::iterator r = openEntries.find (t->getFileName()); + string_thumb_map::iterator r = openEntries.find (t->getFileName()); if (r!=openEntries.end()) openEntries.erase (r); delete t; @@ -159,11 +211,15 @@ void CacheManager::closeThumbnail (Thumbnail* t) { void CacheManager::closeCache () { + Glib::Mutex::Lock lock(mutex_); + applyCacheSizeLimitation (); } void CacheManager::clearAll () { + Glib::Mutex::Lock lock(mutex_); + deleteDir ("images"); deleteDir ("aehistograms"); deleteDir ("embprofiles"); @@ -171,30 +227,34 @@ void CacheManager::clearAll () { deleteDir ("data"); // re-generate thumbnail images and clear profiles of open thumbnails - std::map::iterator i; - for (i=openEntries.begin(); i!=openEntries.end(); i++) { - i->second->clearProcParams (CACHEMGR); - i->second->generateThumbnailImage (); - i->second->updateCache (); - } + //string_thumb_map::iterator i; + //for (i=openEntries.begin(); i!=openEntries.end(); i++) { + // i->second->clearProcParams (CACHEMGR); + // i->second->generateThumbnailImage (); + // i->second->updateCache (); + //} } void CacheManager::clearThumbImages () { + Glib::Mutex::Lock lock(mutex_); + deleteDir ("images"); deleteDir ("aehistograms"); deleteDir ("embprofiles"); // re-generate thumbnail images of open thumbnails - std::map::iterator i; - for (i=openEntries.begin(); i!=openEntries.end(); i++) - i->second->generateThumbnailImage (); + //string_thumb_map::iterator i; + //for (i=openEntries.begin(); i!=openEntries.end(); i++) + // i->second->generateThumbnailImage (); } void CacheManager::clearProfiles () { + Glib::Mutex::Lock lock(mutex_); + deleteDir ("profiles"); // clear profiles of open thumbnails - std::map::iterator i; + string_thumb_map::iterator i; for (i=openEntries.begin(); i!=openEntries.end(); i++) i->second->clearProcParams (CACHEMGR); } @@ -234,9 +294,9 @@ void CacheManager::applyCacheSizeLimitation () { std::vector flist; Glib::ustring dataDir = Glib::build_filename (baseDir, "data"); Glib::RefPtr dir = Gio::File::create_for_path (dataDir); - - safe_build_file_list (dir, flist); - + + safe_build_file_list (dir, flist); + if (flist.size() > options.maxCacheEntries) { std::sort (flist.begin(), flist.end()); while (flist.size() > options.maxCacheEntries) { @@ -245,7 +305,7 @@ void CacheManager::applyCacheSizeLimitation () { ::g_remove ((Glib::build_filename (Glib::build_filename (baseDir, "images"), flist.front().fname) + ".jpg").c_str()); ::g_remove ((Glib::build_filename (Glib::build_filename (baseDir, "aehistograms"), flist.front().fname)).c_str()); ::g_remove ((Glib::build_filename (Glib::build_filename (baseDir, "embprofiles"), flist.front().fname) + ".icc").c_str()); -// ::g_remove ((Glib::build_filename (Glib::build_filename (baseDir, "profiles"), flist.front().fname) + paramFileExtension).c_str()); + // ::g_remove ((Glib::build_filename (Glib::build_filename (baseDir, "profiles"), flist.front().fname) + paramFileExtension).c_str()); flist.erase (flist.begin()); } } diff --git a/rtgui/cachemanager.h b/rtgui/cachemanager.h index f2f15c59d..983c2acbd 100644 --- a/rtgui/cachemanager.h +++ b/rtgui/cachemanager.h @@ -29,14 +29,21 @@ class Thumbnail; class CacheManager { - std::map openEntries; - Glib::ustring baseDir; + typedef std::pair string_thumb_pair; + typedef std::map string_thumb_map; + + string_thumb_map openEntries; + Glib::ustring baseDir; + Glib::Mutex mutex_; void deleteDir (const Glib::ustring& dirName); - public: CacheManager () {} + public: + + static CacheManager* getInstance(void); + void init (); Thumbnail* getEntry (const Glib::ustring& fname); void deleteEntry (const Glib::ustring& fname); @@ -44,7 +51,7 @@ class CacheManager { void closeThumbnail (Thumbnail* t); - const Glib::ustring& getBaseDir () { return baseDir; } + const Glib::ustring& getBaseDir () { Glib::Mutex::Lock lock(mutex_); return baseDir; } void closeCache (); static std::string getMD5 (const Glib::ustring& fname); @@ -58,7 +65,7 @@ class CacheManager { Glib::ustring getCacheFileName (const Glib::ustring& subdir, const Glib::ustring& fname, const Glib::ustring& md5); }; -extern CacheManager cacheMgr; +#define cacheMgr CacheManager::getInstance() #endif diff --git a/rtgui/crophandler.cc b/rtgui/crophandler.cc index 257f037fe..9843a1aa1 100644 --- a/rtgui/crophandler.cc +++ b/rtgui/crophandler.cc @@ -268,7 +268,7 @@ void CropHandler::update () { // crop->setWindow (cropX, cropY, cropW, cropH, zoom>=1000 ? 1 : zoom); --> we use the "getWindow" hook instead of setting the size before crop->setListener (this); cropPixbuf.clear (); - Glib::Thread::create(sigc::mem_fun(*crop, &DetailedCrop::fullUpdate), 0, false, true, Glib::THREAD_PRIORITY_NORMAL); + Glib::Thread::create(sigc::mem_fun(*crop, &DetailedCrop::fullUpdate), 0, false, true, Glib::THREAD_PRIORITY_LOW); } } diff --git a/rtgui/cropwindow.h b/rtgui/cropwindow.h index 5a69154d1..59b7129fc 100644 --- a/rtgui/cropwindow.h +++ b/rtgui/cropwindow.h @@ -66,7 +66,7 @@ class CropWindow : public LWButtonListener, public CropHandlerListener { int xpos, ypos, width, height; // image handling - CropHandler cropHandler; + ImageArea* iarea; int cropZoom; // *1000 @@ -88,6 +88,7 @@ class CropWindow : public LWButtonListener, public CropHandlerListener { void getObservedFrameArea(int& x, int& y, int& w, int& h); public: + CropHandler cropHandler; CropWindow (ImageArea* parent, rtengine::StagedImageProcessor* ipc_); ~CropWindow (); diff --git a/rtgui/curveeditor.cc b/rtgui/curveeditor.cc index 395e965b3..d156aaf98 100644 --- a/rtgui/curveeditor.cc +++ b/rtgui/curveeditor.cc @@ -412,8 +412,12 @@ void CurveEditor::typeSelectionChanged () { void CurveEditor::curveChanged () { - if (cl) - cl->curveChanged (); + if (cl) { + if (cl->isMulti()) + cl->curveChanged (this); + else + cl->curveChanged (); + } } void CurveEditor::curveResetPressed () { @@ -441,15 +445,23 @@ void CurveEditor::curveResetPressed () { void CurveEditor::shcChanged () { paramCurve->setPoints (getCurve()); - if (cl) - cl->curveChanged (); + if (cl) { + if (cl->isMulti()) + cl->curveChanged (this); + else + cl->curveChanged (); + } } void CurveEditor::adjusterChanged (Adjuster* a, double newval) { paramCurve->setPoints (getCurve()); - if (cl) - cl->curveChanged (); + if (cl) { + if (cl->isMulti()) + cl->curveChanged (this); + else + cl->curveChanged (); + } } bool CurveEditor::adjusterEntered (GdkEventCrossing* ev, int ac) { diff --git a/rtgui/curvelistener.h b/rtgui/curvelistener.h index e07fed2d5..72980c5d2 100644 --- a/rtgui/curvelistener.h +++ b/rtgui/curvelistener.h @@ -19,10 +19,18 @@ #ifndef _CURVELISTENER_ #define _CURVELISTENER_ +class CurveEditor; + class CurveListener { + private: + bool multi; public: virtual void curveChanged () {} + virtual void curveChanged (CurveEditor* ce) {} + void setMulti(bool value) { multi = value; } + bool isMulti() { return multi; } + CurveListener() : multi(false) {} }; #endif diff --git a/rtgui/dirbrowser.cc b/rtgui/dirbrowser.cc index 2e6c9f3ff..5e0bfe14e 100644 --- a/rtgui/dirbrowser.cc +++ b/rtgui/dirbrowser.cc @@ -40,7 +40,7 @@ DirBrowser::DirBrowser () { scrolledwindow4->set_flags(Gtk::CAN_FOCUS); scrolledwindow4->set_border_width(2); scrolledwindow4->set_shadow_type(Gtk::SHADOW_NONE); - scrolledwindow4->set_policy(Gtk::POLICY_ALWAYS, Gtk::POLICY_ALWAYS); + scrolledwindow4->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); scrolledwindow4->property_window_placement().set_value(Gtk::CORNER_TOP_LEFT); scrolledwindow4->add(*dirtree); diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc index f673624c2..c567fe1b5 100644 --- a/rtgui/editorpanel.cc +++ b/rtgui/editorpanel.cc @@ -1,1013 +1,1082 @@ -/* - * 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 -#include -#include -#include -#include -#include -#include -#include - -using namespace rtengine::procparams; - -EditorPanel::EditorPanel () : beforePreviewHandler(NULL), beforeIarea(NULL), parent(NULL), beforeIpc(NULL) { - - epih = new EditorPanelIdleHelper; - epih->epanel = this; - epih->destroyed = false; - epih->pending = 0; - -// construct toolpanelcoordinator - tpc = new ToolPanelCoordinator (); - -// build GUI - // build left side panel - leftbox = new Gtk::VBox (); - leftbox->set_border_width (4); - leftbox->set_size_request(100,250); - - histogramPanel = Gtk::manage (new HistogramPanel ()); - histogramPanel->set_size_request (-1, 150); -// leftbox->pack_start (*histogramPanel, Gtk::PACK_SHRINK, 4); - - profilep = Gtk::manage (new ProfilePanel ()); - Gtk::Frame* ppframe = Gtk::manage (new Gtk::Frame ()); - ppframe->add (*profilep); - ppframe->set_label (M("PROFILEPANEL_LABEL")); -// leftbox->pack_start (*ppframe, Gtk::PACK_SHRINK, 4); - - navigator = Gtk::manage (new Navigator ()); - navigator->previewWindow->set_size_request (-1, 150); - leftbox->pack_start (*navigator, Gtk::PACK_SHRINK, 4); - - history = Gtk::manage (new History ()); - leftbox->pack_start (*history); - - leftbox->show_all (); - - // build the middle of the screen - Gtk::VBox* editbox = Gtk::manage (new Gtk::VBox ()); - - info = Gtk::manage (new Gtk::ToggleButton ()); - Gtk::Image* infoimg = Gtk::manage (new Gtk::Image (argv0+"/images/info.png")); - info->add (*infoimg); - info->set_relief(Gtk::RELIEF_NONE); - info->set_tooltip_markup (M("MAIN_TOOLTIP_QINFO")); - - beforeAfter = Gtk::manage (new Gtk::ToggleButton ()); - Gtk::Image* beforeAfterIcon = Gtk::manage (new Gtk::Image (argv0+"/images/beforeafter.png")); - beforeAfter->add(*beforeAfterIcon); - beforeAfter->set_relief(Gtk::RELIEF_NONE); - beforeAfter->set_tooltip_markup (M("MAIN_TOOLTIP_TOGGLE")); - - - Gtk::VSeparator* vsept = Gtk::manage (new Gtk::VSeparator ()); - Gtk::VSeparator* vsepz = Gtk::manage (new Gtk::VSeparator ()); - Gtk::VSeparator* vsepi = Gtk::manage (new Gtk::VSeparator ()); - Gtk::VSeparator* vseph = Gtk::manage (new Gtk::VSeparator ()); - - hidehp = Gtk::manage (new Gtk::ToggleButton ()); - Gtk::Label* hidehpLabel = Gtk::manage (new Gtk::Label ()); - hidehpLabel->set_markup ("H"); - Gtk::Image* hpimg = Gtk::manage (new Gtk::Image (argv0+"/images/left.png")); - Gtk::HBox* hidehpBox = Gtk::manage (new Gtk::HBox ()); - hidehpBox->pack_start (*hpimg, Gtk::PACK_SHRINK, 2); - hidehpBox->pack_start (*hidehpLabel, Gtk::PACK_SHRINK, 2); - hidehp->add (*hidehpBox); - hidehp->set_relief(Gtk::RELIEF_NONE); - hidehp->set_active (options.showHistory); - hidehp->set_tooltip_markup (M("MAIN_TOOLTIP_HIDEHP")); - - Gtk::VSeparator* vsepcl = Gtk::manage (new Gtk::VSeparator ()); - Gtk::VSeparator* vsepz2 = Gtk::manage (new Gtk::VSeparator ()); - - iarea = new ImageAreaPanel (); - - Gtk::HBox* toolBarPanel = Gtk::manage (new Gtk::HBox ()); - toolBarPanel->pack_start (*hidehp, Gtk::PACK_SHRINK, 1); - toolBarPanel->pack_start (*vseph, Gtk::PACK_SHRINK, 2); - toolBarPanel->pack_start (*info, Gtk::PACK_SHRINK, 1); - toolBarPanel->pack_start (*beforeAfter, Gtk::PACK_SHRINK, 1); - toolBarPanel->pack_start (*vsepi, Gtk::PACK_SHRINK, 2); - toolBarPanel->pack_start (*tpc->getToolBar(), Gtk::PACK_SHRINK, 1); - toolBarPanel->pack_start (*vsept, Gtk::PACK_SHRINK, 2); - toolBarPanel->pack_end (*tpc->coarse, Gtk::PACK_SHRINK, 4); - toolBarPanel->pack_end (*vsepcl, Gtk::PACK_SHRINK, 4); - toolBarPanel->pack_end (*iarea->imageArea->indClippedPanel, Gtk::PACK_SHRINK, 0); - toolBarPanel->pack_end (*vsepz, Gtk::PACK_SHRINK, 2); - - afterBox = Gtk::manage (new Gtk::VBox ()); - afterBox->pack_start (*iarea); - - beforeAfterBox = Gtk::manage (new Gtk::HBox()); - beforeAfterBox->pack_start (*afterBox); - - editbox->pack_start (*toolBarPanel, Gtk::PACK_SHRINK); - editbox->pack_start (*beforeAfterBox); - - // build right side panel - vboxright = new Gtk::VBox (false, 0); - vboxright->set_size_request(100,250); - - vboxright->set_border_width (4); - vboxright->pack_start (*histogramPanel, Gtk::PACK_SHRINK, 4); - vboxright->pack_start (*ppframe, Gtk::PACK_SHRINK, 4); - // main notebook - vboxright->pack_start (*tpc->toolPanelNotebook); - - // Save buttons - Gtk::HBox* iops = Gtk::manage (new Gtk::HBox ()); - - Gtk::HBox * saveButtonBox = Gtk::manage(new Gtk::HBox()); - saveButtonBox->pack_start(*Gtk::manage (new Gtk::Image (Gtk::StockID("gtk-save"), Gtk::ICON_SIZE_BUTTON)), Gtk::PACK_SHRINK, 2); - saveButtonBox->pack_start(*Gtk::manage (new Gtk::Label (M("MAIN_BUTTON_SAVE"))), Gtk::PACK_SHRINK, 2); - saveimgas = Gtk::manage (new Gtk::Button ()); - saveimgas->add(*saveButtonBox); - saveimgas->set_tooltip_markup(M("MAIN_BUTTON_SAVE_TOOLTIP")); - - Gtk::HBox * queueButtonBox = Gtk::manage(new Gtk::HBox()); - queueButtonBox->pack_start(*Gtk::manage (new Gtk::Image (Gtk::StockID("gtk-execute"), Gtk::ICON_SIZE_BUTTON)), Gtk::PACK_SHRINK, 2); - queueButtonBox->pack_start(*Gtk::manage (new Gtk::Label (M("MAIN_BUTTON_PUTTOQUEUE"))), Gtk::PACK_SHRINK, 2); - queueimg = Gtk::manage (new Gtk::Button ()); - queueimg->add(*queueButtonBox); - queueimg->set_tooltip_markup(M("MAIN_BUTTON_PUTTOQUEUE_TOOLTIP")); - - Gtk::HBox * sendToEditorButtonBox = Gtk::manage(new Gtk::HBox()); - sendToEditorButtonBox->pack_start(*Gtk::manage (new Gtk::Image (argv0+"/images/gimp.png")), Gtk::PACK_SHRINK, 2); - sendToEditorButtonBox->pack_start(*Gtk::manage (new Gtk::Label (M("MAIN_BUTTON_SENDTOEDITOR"))), Gtk::PACK_SHRINK, 2); - sendtogimp = Gtk::manage (new Gtk::Button ()); - sendtogimp->add(*sendToEditorButtonBox); - sendtogimp->set_tooltip_markup(M("MAIN_BUTTON_SENDTOEDITOR_TOOLTIP")); - - iops->pack_start (*saveimgas, Gtk::PACK_SHRINK); - iops->pack_start (*queueimg, Gtk::PACK_SHRINK); - iops->pack_start (*sendtogimp, Gtk::PACK_SHRINK); - - // Status box - statusBox = Gtk::manage (new Gtk::HBox ()); - progressLabel = Gtk::manage (new Gtk::Label("")); - statusBox->pack_start (*progressLabel); - red = new Gtk::Image (argv0+"/images/red.png"); - green = new Gtk::Image (argv0+"/images/green.png"); - red->show (); - green->show (); - statusBox->pack_end (*green, Gtk::PACK_SHRINK, 4); - iops->pack_start(*statusBox, Gtk::PACK_SHRINK, 4); - - // Zoom panel - iops->pack_end (*iarea->imageArea->zoomPanel, Gtk::PACK_SHRINK, 1); - iops->pack_end (*vsepz2, Gtk::PACK_SHRINK, 2); - - - editbox->pack_start (*Gtk::manage(new Gtk::HSeparator()), Gtk::PACK_SHRINK, 4); - editbox->pack_start (*iops, Gtk::PACK_SHRINK, 4); - editbox->show_all (); - - // build screen - hpanedl = Gtk::manage (new Gtk::HPaned()); - hpanedr = Gtk::manage (new Gtk::HPaned()); - leftbox->reference (); - vboxright->reference (); - if (options.showHistory) { - hpanedl->pack1(*leftbox, false, true); - hpanedl->set_position (options.historyPanelWidth); - } - - Gtk::Frame* vbfr = Gtk::manage (new Gtk::Frame ()); - vbfr->set_size_request(100,250); - vbfr->add (*editbox); - hpanedl->pack2(*vbfr, true, true); - - hpanedr->pack1(*hpanedl, true, true); - hpanedr->pack2(*vboxright, false, true); - hpanedl->signal_button_release_event().connect_notify( sigc::mem_fun(*this, &EditorPanel::leftPaneButtonReleased) ); - hpanedr->signal_button_release_event().connect_notify( sigc::mem_fun(*this, &EditorPanel::rightPaneButtonReleased) ); - - pack_start (*hpanedr); - show_all (); - - // save as dialog - if (Glib::file_test (options.lastSaveAsPath, Glib::FILE_TEST_IS_DIR)) - saveAsDialog = new SaveAsDialog (options.lastSaveAsPath); - else - saveAsDialog = new SaveAsDialog (Glib::get_user_special_dir (G_USER_DIRECTORY_PICTURES)); - - saveAsDialog->set_default_size (options.saveAsDialogWidth, options.saveAsDialogHeight); - -// connect listeners - profilep->setProfileChangeListener (tpc); - history->setProfileChangeListener (tpc); - history->setHistoryBeforeLineListener (this); - tpc->addPParamsChangeListener (profilep); - tpc->addPParamsChangeListener (history); - tpc->addPParamsChangeListener (this); - iarea->imageArea->setCropGUIListener (tpc->getCropGUIListener()); - iarea->imageArea->setPointerMotionListener (navigator); - iarea->imageArea->setImageAreaToolListener (tpc); - -// initialize components - info->set_active (options.showInfo); - tpc->readOptions (); - -// connect event handlers - info->signal_toggled().connect( sigc::mem_fun(*this, &EditorPanel::info_toggled) ); - beforeAfter->signal_toggled().connect( sigc::mem_fun(*this, &EditorPanel::beforeAfterToggled) ); - hidehp->signal_toggled().connect( sigc::mem_fun(*this, &EditorPanel::hideHistoryActivated) ); - saveimgas->signal_pressed().connect( sigc::mem_fun(*this, &EditorPanel::saveAsPressed) ); - queueimg->signal_pressed().connect( sigc::mem_fun(*this, &EditorPanel::queueImgPressed) ); - sendtogimp->signal_pressed().connect( sigc::mem_fun(*this, &EditorPanel::sendToGimpPressed) ); - -} - -EditorPanel::~EditorPanel () { - - history->setHistoryBeforeLineListener (NULL); - // the order is important! - delete iarea; - delete beforeIarea; - - if (ipc) - ipc->setPreviewImageListener (NULL); - if (beforeIpc) - beforeIpc->setPreviewImageListener (NULL); - - delete previewHandler; - delete beforePreviewHandler; - - if (ipc) - close (); - - if (epih->pending) - epih->destroyed = true; - else - delete epih; - - delete tpc; - - delete red; - delete green; - delete leftbox; - delete vboxright; - - delete saveAsDialog; -} - -void EditorPanel::leftPaneButtonReleased(GdkEventButton *event) { - if (event->button == 1) { - // Button 1 released : it's a resize - options.historyPanelWidth = hpanedl->get_position(); - } - /*else if (event->button == 3) { - }*/ -} - -void EditorPanel::rightPaneButtonReleased(GdkEventButton *event) { - if (event->button == 1) { - int winW, winH; - parent->get_size(winW, winH); - // Button 1 released : it's a resize - options.toolPanelWidth = winW - hpanedr->get_position(); - } - /*else if (event->button == 3) { - }*/ -} - -void EditorPanel::setAspect () { - int winW, winH; - parent->get_size(winW, winH); - hpanedl->set_position(options.historyPanelWidth); - hpanedr->set_position(winW - options.toolPanelWidth); - // initialize components - if (info->get_active() != options.showInfo) - info->set_active (options.showInfo); -} - -void EditorPanel::on_realize () { - - Gtk::VBox::on_realize (); - // This line is needed to avoid autoexpansion of the window :-/ - vboxright->set_size_request (options.toolPanelWidth, -1); -} - -void EditorPanel::open (Thumbnail* tmb, rtengine::InitialImage* isrc) { - - // initialize everything - openThm = tmb; - openThm->increaseRef (); - - previewHandler = new PreviewHandler (); - - this->isrc = isrc; - ipc = rtengine::StagedImageProcessor::create (isrc); - ipc->setProgressListener (this); - ipc->setPreviewImageListener (previewHandler); - ipc->setPreviewScale (10); - tpc->initImage (ipc, tmb->getType()==FT_Raw); - ipc->setHistogramListener (this); - -// iarea->fitZoom (); // tell to the editorPanel that the next image has to be fitted to the screen - iarea->imageArea->setPreviewHandler (previewHandler); - iarea->imageArea->setImProcCoordinator (ipc); - navigator->previewWindow->setPreviewHandler (previewHandler); - navigator->previewWindow->setImageArea (iarea->imageArea); - - // try to load the last saved parameters from the cache or from the paramfile file - ProcParams* ldprof = NULL; - if (openThm->hasProcParams()) { - 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); - else - profilep->initProfile (options.defProfRaw, ldprof, NULL); - - openThm->addThumbnailListener (this); - info_toggled (); -} - -void EditorPanel::close () { - - saveProfile (); - - // close image processor and the current thumbnail - tpc->closeImage (); // this call stops image processing - tpc->writeOptions (); - rtengine::ImageSource* is=isrc->getImageSource(); - is->setProgressListener( NULL ); - if (ipc) - rtengine::StagedImageProcessor::destroy (ipc); - if (beforeIpc) - rtengine::StagedImageProcessor::destroy (beforeIpc); - - openThm->removeThumbnailListener (this); - openThm->decreaseRef (); -} - -void EditorPanel::saveProfile () { - - ProcParams params; - ipc->getParams (¶ms); - - if (options.saveParamsFile) - params.save (openThm->getFileName() + paramFileExtension); - if (openThm && options.saveParamsCache) - openThm->setProcParams (params, EDITOR); -} - -Glib::ustring EditorPanel::getShortName () { - - return Glib::path_get_basename (openThm->getFileName ()); -} - -Glib::ustring EditorPanel::getFileName () { - - return openThm->getFileName (); -} - -// TODO!!! -void EditorPanel::procParamsChanged (rtengine::procparams::ProcParams* params, rtengine::ProcEvent ev, Glib::ustring descr, ParamsEdited* paramsEdited) { - -// if (ev!=EvPhotoLoaded) -// saveLabel->set_markup (Glib::ustring("") + M("MAIN_BUTTON_SAVE") + ""); -} - -struct spsparams { - bool state; - EditorPanelIdleHelper* epih; -}; - -int setprocstate (void* data) { - - gdk_threads_enter (); - spsparams* p = (spsparams*)data; - - if (p->epih->destroyed) { - if (p->epih->pending == 1) - delete p->epih; - else - p->epih->pending--; - delete p; - gdk_threads_leave (); - return 0; - } - - p->epih->epanel->refreshProcessingState (p->state); - p->epih->pending--; - delete p; - gdk_threads_leave (); - return 0; -} - -void EditorPanel::setProgressState (int state) { - - epih->pending++; - - spsparams* p = new spsparams; - p->state = state; - p->epih = epih; - 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. - if (ipc && openThm && !state && tpc->getChangedState()) { - rtengine::procparams::ProcParams pparams; - ipc->getParams (&pparams); - openThm->setProcParams (pparams, EDITOR, false); - } - - // change state of the led - std::vector children = (std::vector) statusBox->get_children(); - if (children.size()>=1) { - Gtk::Widget* wlast = children[children.size()-1]; - if (wlast) - statusBox->remove (*wlast); - } - if (state) - statusBox->pack_end (*red, Gtk::PACK_SHRINK, 4); - else - statusBox->pack_end (*green, Gtk::PACK_SHRINK, 4); -} - -struct errparams { - Glib::ustring descr; - EditorPanelIdleHelper* epih; -}; - -void EditorPanel::displayError (Glib::ustring descr) { - - if (parent) { - Gtk::MessageDialog* msgd = new Gtk::MessageDialog (*parent, descr, true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); - msgd->set_title (M("MAIN_MSG_CANNOTSAVE")); - msgd->run (); - delete msgd; - } -} - -int disperror (void* data) { - - gdk_threads_enter (); - errparams* p = (errparams*)data; - - if (p->epih->destroyed) { - if (p->epih->pending == 1) - delete p->epih; - else - p->epih->pending--; - delete p; - gdk_threads_leave (); - return 0; - } - - p->epih->epanel->displayError (p->descr); - p->epih->pending--; - delete p; - gdk_threads_leave (); - return 0; -} - -void EditorPanel::error (Glib::ustring descr) { - - epih->pending++; - errparams* p = new errparams; - p->descr = descr; - p->epih = epih; - g_idle_add (disperror, p); -} - -void EditorPanel::info_toggled () { - - Glib::ustring infoString; - - const rtengine::ImageMetaData* idata = ipc->getInitialImage()->getMetaData(); - if (idata && idata->hasExif()) -// infoString = Glib::ustring::compose ("%1 %2\nF/%3 %4 sec\n%5: %6\n%7: %8 mm\n", -// Glib::ustring(idata->getMake()), Glib::ustring(idata->getModel()), -// Glib::ustring(idata->apertureToString(idata->getFNumber())), Glib::ustring(idata->shutterToString(idata->getShutterSpeed())), -// M("QINFO_ISO"), idata->getISOSpeed(), -// M("QINFO_FOCALLENGTH"), idata->getFocalLen()) -// + Glib::ustring::compose ("%1: %2", M("QINFO_LENS"), Glib::ustring(idata->getLens())); - infoString = Glib::ustring::compose ( - "%1 + %2\n%3s f/%4 %5%6 f=%7mm", - Glib::ustring(idata->getModel()), - Glib::ustring(idata->getLens()), - Glib::ustring(idata->shutterToString(idata->getShutterSpeed())), - Glib::ustring(idata->apertureToString(idata->getFNumber())), - M("QINFO_ISO"), idata->getISOSpeed(), - idata->getFocalLen() - ); - else - infoString = M("QINFO_NOEXIF"); - - iarea->imageArea->setInfoText (infoString); - iarea->imageArea->infoEnabled (info->get_active ()); -} - -void EditorPanel::hideHistoryActivated () { - - removeIfThere (hpanedl, leftbox, false); - if (hidehp->get_active()) - hpanedl->pack1 (*leftbox, false, true); - options.showHistory = hidehp->get_active(); -} - -bool EditorPanel::handleShortcutKey (GdkEventKey* event) { - - bool ctrl = event->state & GDK_CONTROL_MASK; - bool shift = event->state & GDK_SHIFT_MASK; - - if (!ctrl) { - switch(event->keyval) { - case GDK_h: - case GDK_H: - hidehp->set_active (!hidehp->get_active()); - return true; - case GDK_i: - case GDK_I: - info->set_active (!info->get_active()); - return true; - case GDK_b: - case GDK_B: - beforeAfter->set_active (!beforeAfter->get_active()); - return true; - case GDK_plus: - case GDK_equal: - iarea->imageArea->zoomPanel->zoomInClicked(); - return true; - case GDK_minus: - case GDK_underscore: - iarea->imageArea->zoomPanel->zoomOutClicked(); - return true; - case GDK_1: - iarea->imageArea->zoomPanel->zoom11Clicked(); - return true; - case GDK_f: - case GDK_F: - iarea->imageArea->zoomPanel->zoomFitClicked(); - return true; - } - } - else { - switch (event->keyval) { - case GDK_s: - saveAsPressed(); - return true; - case GDK_q: - queueImgPressed(); - return true; - case GDK_e: - sendToGimpPressed(); - return true; - case GDK_z: - history->undo (); - return true; - case GDK_Z: - history->redo (); - return true; - } - } - - if(tpc->getToolBar()->handleShortcutKey(event)) - return true; - - return false; -} - -void EditorPanel::procParamsChanged (Thumbnail* thm, int whoChangedIt) { - - if (whoChangedIt!=EDITOR) - tpc->profileChange (&openThm->getProcParams(), rtengine::EvProfileChangeNotification, M("PROGRESSDLG_PROFILECHANGEDINBROWSER")); -} - -bool EditorPanel::idle_saveImage (ProgressConnector *pc, Glib::ustring fname, SaveFormat sf, bool findNewNameIfNeeded){ - rtengine::IImage16* img = pc->returnValue(); - delete pc; - if( img ) - saveImage( img, fname, sf, findNewNameIfNeeded); - else{ - Glib::ustring msg_ = Glib::ustring("") + fname + ": Error during image processing\n"; - Gtk::MessageDialog msgd (*parent, msg_, true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); - msgd.run (); - - saveimgas->set_sensitive(true); - sendtogimp->set_sensitive(true); - - } - return false; -} - -BatchQueueEntry* EditorPanel::createBatchQueueEntry () { - - rtengine::procparams::ProcParams pparams; - ipc->getParams (&pparams); - rtengine::ProcessingJob* job = rtengine::ProcessingJob::create (ipc->getInitialImage(), pparams); - int prevh = options.maxThumbnailHeight; - int prevw = prevh; - guint8* prev = NULL;//(guint8*) previewHandler->getImagePreview (prevw, prevh); - double tmpscale; - rtengine::IImage8* img = openThm->processThumbImage (pparams, options.maxThumbnailHeight, tmpscale); - if (img) { - prevw = img->getWidth (); - prevh = img->getHeight (); - prev = new guint8 [prevw*prevh*3]; - memcpy (prev, img->getData (), prevw*prevh*3); - img->free(); - } - return new BatchQueueEntry (job, pparams, openThm->getFileName(), prev, prevw, prevh, openThm); -} - -int EditorPanel::saveImage (rtengine::IImage16* img, Glib::ustring& fname, SaveFormat sf, bool findNewNameIfNeeded) { - - Glib::ustring fileName = Glib::ustring::compose ("%1.%2", fname, sf.format); - if (findNewNameIfNeeded) { - int tries = 1; - while (Glib::file_test (fileName, Glib::FILE_TEST_EXISTS) && tries<1000) { - fileName = Glib::ustring::compose("%1-%2.%3", fname, tries, sf.format); - tries++; - } - if (tries==1000) - return -1000; - } - ProgressConnector *ld = new ProgressConnector(); - img->setSaveProgressListener (parent->getProgressListener()); - if (sf.format=="tif") - ld->startFunc (sigc::bind(sigc::mem_fun(img, &rtengine::IImage16::saveAsTIFF), fileName, sf.tiffBits, sf.tiffUncompressed), - sigc::bind(sigc::mem_fun(*this,&EditorPanel::idle_imageSaved), ld, img, fileName,sf)); - else if (sf.format=="png") - ld->startFunc (sigc::bind(sigc::mem_fun(img, &rtengine::IImage16::saveAsPNG), fileName, sf.pngCompression, sf.pngBits), - sigc::bind(sigc::mem_fun(*this,&EditorPanel::idle_imageSaved), ld, img, fileName,sf)); - else if (sf.format=="jpg") - ld->startFunc (sigc::bind(sigc::mem_fun(img, &rtengine::IImage16::saveAsJPEG), fileName, sf.jpegQuality), - sigc::bind(sigc::mem_fun(*this,&EditorPanel::idle_imageSaved), ld, img, fileName,sf)); - return 0; -} - -bool EditorPanel::idle_imageSaved(ProgressConnector *pc,rtengine::IImage16* img,Glib::ustring fname, SaveFormat sf){ - img->free (); - if (! pc->returnValue() ) { - openThm->imageDeveloped (); - // save processing parameters, if needed - if (sf.saveParams) { - rtengine::procparams::ProcParams pparams; - ipc->getParams (&pparams); - // We keep the extension to avoid overwriting the profile when we have - // the same output filename with different extension - //pparams.save (removeExtension (fname) + ".out" + paramFileExtension); - pparams.save (fname + ".out" + paramFileExtension); - } - }else{ - Glib::ustring msg_ = Glib::ustring("") + fname + ": Error during image saving\n"; - Gtk::MessageDialog msgd (*parent, msg_, true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); - msgd.run (); - } - saveimgas->set_sensitive(true); - sendtogimp->set_sensitive(true); - parent->setProgressStr(""); - parent->setProgress(0.); - delete pc; - return false; -} - -void EditorPanel::saveAsPressed () { - - bool fnameOK = false; - Glib::ustring fname; - - saveAsDialog->setInitialFileName (removeExtension (Glib::path_get_basename (openThm->getFileName()))); - do { - saveAsDialog->run (); - fname = saveAsDialog->getFileName (); - if (fname=="") - return; - - options.lastSaveAsPath = saveAsDialog->getDirectory (); - options.saveAsDialogWidth = saveAsDialog->get_width(); - options.saveAsDialogHeight = saveAsDialog->get_height(); - - SaveFormat sf = saveAsDialog->getFormat (); - - options.saveFormat = sf; - options.autoSuffix = saveAsDialog->getAutoSuffix(); - - if (saveAsDialog->getImmediately ()) { - // separate filename and the path to the destination directory - Glib::ustring dstdir = Glib::path_get_dirname (fname); - Glib::ustring dstfname = Glib::path_get_basename (removeExtension(fname)); - - if (saveAsDialog->getAutoSuffix()) { - - Glib::ustring fnameTemp; - for (int tries=0; tries<100; tries++) { - if (tries==0) - fnameTemp = Glib::ustring::compose ("%1.%2", Glib::build_filename (dstdir, dstfname), sf.format); - else - fnameTemp = Glib::ustring::compose ("%1-%2.%3", Glib::build_filename (dstdir, dstfname), tries, sf.format); - - if (!Glib::file_test (fnameTemp, Glib::FILE_TEST_EXISTS)) { - fname = fnameTemp; - fnameOK = true; - break; - } - } - } - // check if it exists - if (!fnameOK) { - fname = Glib::ustring::compose ("%1.%2", Glib::build_filename (dstdir, dstfname), sf.format); - if (Glib::file_test (fname, Glib::FILE_TEST_EXISTS)) { - Glib::ustring msg_ = Glib::ustring("") + fname + ": " + M("MAIN_MSG_ALREADYEXISTS") + "\n" + M("MAIN_MSG_QOVERWRITE") + ""; - Gtk::MessageDialog msgd (*parent, msg_, true, Gtk::MESSAGE_WARNING, Gtk::BUTTONS_YES_NO, true); - int response = msgd.run (); - if (response==Gtk::RESPONSE_YES) - fnameOK = true; - } - else fnameOK = true; - } - - if (fnameOK) { - // save image - rtengine::procparams::ProcParams pparams; - ipc->getParams (&pparams); - rtengine::ProcessingJob* job = rtengine::ProcessingJob::create (ipc->getInitialImage(), pparams); - fname = removeExtension (fname); - ProgressConnector *ld = new ProgressConnector(); - ld->startFunc(sigc::bind(sigc::ptr_fun(&rtengine::processImage), job, err, parent->getProgressListener() ), - sigc::bind(sigc::mem_fun( *this,&EditorPanel::idle_saveImage ),ld,fname,sf,false )); - saveimgas->set_sensitive(false); - sendtogimp->set_sensitive(false); - } - } - else { - BatchQueueEntry* bqe = createBatchQueueEntry (); - bqe->outFileName = fname; - bqe->saveFormat = saveAsDialog->getFormat (); - parent->addBatchQueueJob (bqe, saveAsDialog->getToHeadOfQueue ()); - fnameOK = true; - } - // ask parent to redraw file browser - // ... or does it automatically when the tab is switched to it - } while (!fnameOK); -} - -void EditorPanel::queueImgPressed () { - - saveProfile (); - parent->addBatchQueueJob (createBatchQueueEntry ()); -} - -void EditorPanel::sendToGimpPressed () { - // develop image - rtengine::procparams::ProcParams pparams; - ipc->getParams (&pparams); - rtengine::ProcessingJob* job = rtengine::ProcessingJob::create (ipc->getInitialImage(), pparams); - ProgressConnector *ld = new ProgressConnector(); - ld->startFunc(sigc::bind(sigc::ptr_fun(&rtengine::processImage), job, err, parent->getProgressListener() ), - sigc::bind(sigc::mem_fun( *this,&EditorPanel::idle_sendToGimp ),ld )); - saveimgas->set_sensitive(false); - sendtogimp->set_sensitive(false); -} - -bool EditorPanel::idle_sendToGimp( ProgressConnector *pc){ - - rtengine::IImage16* img = pc->returnValue(); - delete pc; - if (img) { - // get file name base - Glib::ustring shortname = removeExtension (Glib::path_get_basename (openThm->getFileName())); - Glib::ustring dirname = Glib::get_tmp_dir (); - Glib::ustring fname = Glib::build_filename (dirname, shortname); - - SaveFormat sf; - sf.format = "tif"; - sf.tiffBits = 16; - - Glib::ustring fileName = Glib::ustring::compose ("%1.%2", fname, sf.format); - - int tries = 1; - while (Glib::file_test (fileName, Glib::FILE_TEST_EXISTS) && tries<1000) { - fileName = Glib::ustring::compose("%1-%2.%3", fname, tries, sf.format); - tries++; - } - if (tries==1000){ - img->free (); - return false; - } - - ProgressConnector *ld = new ProgressConnector(); - img->setSaveProgressListener (parent->getProgressListener()); - ld->startFunc (sigc::bind(sigc::mem_fun(img, &rtengine::IImage16::saveAsTIFF), fileName, sf.tiffBits, sf.tiffUncompressed), - sigc::bind(sigc::mem_fun(*this,&EditorPanel::idle_sentToGimp), ld, img, fileName)); - }else{ - Glib::ustring msg_ = Glib::ustring(" Error during image processing\n"); - Gtk::MessageDialog msgd (*parent, msg_, true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); - msgd.run (); - saveimgas->set_sensitive(true); - sendtogimp->set_sensitive(true); - } - return false; -} - -bool EditorPanel::idle_sentToGimp(ProgressConnector *pc,rtengine::IImage16* img,Glib::ustring filename){ - img->free (); - int errore = pc->returnValue(); - delete pc; - if (!errore) { - saveimgas->set_sensitive(true); - sendtogimp->set_sensitive(true); - parent->setProgressStr(""); - parent->setProgress(0.); - bool success=false; - Glib::ustring cmdLine; - // start gimp - if (options.editorToSendTo==1) { -#ifdef _WIN32 - cmdLine = Glib::ustring("\"") + Glib::build_filename (Glib::build_filename(options.gimpDir,"bin"), "gimp-win-remote") + "\" gimp-2.4.exe" + " \"" + filename + "\""; -#else - cmdLine = Glib::ustring("gimp-remote ") + " \"" + filename + "\""; -#endif - success = safe_spawn_command_line_async (cmdLine); - if (!success){ -#ifdef _WIN32 - int ver = 12; - while (!success && ver) { - cmdLine = Glib::ustring("\"") + Glib::build_filename (Glib::build_filename(options.gimpDir,"bin"), Glib::ustring::compose("gimp-2.%1.exe",ver)) + "\" \"" + filename + "\""; - ver--; - success = safe_spawn_command_line_async (cmdLine); - } -#elif defined __APPLE__ - cmdLine = Glib::ustring("gimp ") + " \"" + filename + "\""; - success = safe_spawn_command_line_async (cmdLine); -#else - cmdLine = Glib::ustring("gimp ") + " \"" + filename + "\""; - success = safe_spawn_command_line_async (cmdLine); -#endif - } - } - else if (options.editorToSendTo==2) { -#ifdef __APPLE__ - cmdLine = Glib::ustring("open -a \'") + Glib::build_filename(options.psDir,"Photoshop.app\' ") + "\'" + filename + "\'"; -#else - cmdLine = Glib::ustring("\"") + Glib::build_filename(options.psDir,"Photoshop.exe") + "\" \"" + filename + "\""; -#endif - success = safe_spawn_command_line_async (cmdLine); - } - else if (options.editorToSendTo==3) { -#ifdef __APPLE__ - cmdLine = Glib::ustring("") + options.customEditorProg + filename; -#else - cmdLine = Glib::ustring("\"") + options.customEditorProg + "\" \"" + filename + "\""; -#endif - success = safe_spawn_command_line_async (cmdLine); - } - - if (!success) { - Gtk::MessageDialog* msgd = new Gtk::MessageDialog (*parent, M("MAIN_MSG_CANNOTSTARTEDITOR"), false, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); - msgd->set_secondary_text (M("MAIN_MSG_CANNOTSTARTEDITOR_SECONDARY")); - msgd->set_title (M("MAIN_BUTTON_SENDTOEDITOR")); - msgd->run (); - delete msgd; - } - - } - - return false; -} - -/* -void EditorPanel::saveOptions () { -} -*/ - -void EditorPanel::historyBeforeLineChanged (const rtengine::procparams::ProcParams& params) { - - if (beforeIpc) { - ProcParams* pparams = beforeIpc->getParamsForUpdate (rtengine::EvProfileChanged); - *pparams = params; - beforeIpc->paramsUpdateReady (); - } -} - -void EditorPanel::beforeAfterToggled () { - - removeIfThere (beforeAfterBox, beforeBox, false); - removeIfThere (afterBox, afterLabel, false); - - if (beforeIarea) { - if (beforeIpc) - beforeIpc->stopProcessing (); - iarea->setBeforeAfterViews (NULL, iarea); - delete beforeIarea; - beforeIarea = NULL; - if (beforeIpc) - beforeIpc->setPreviewImageListener (NULL); - delete beforePreviewHandler; - beforePreviewHandler = NULL; - if (beforeIpc) - rtengine::StagedImageProcessor::destroy (beforeIpc); - beforeIpc = NULL; - } - - if (beforeAfter->get_active ()) { - - beforeIarea = new ImageAreaPanel (); - - beforeLabel = Gtk::manage (new Gtk::Label ()); - beforeLabel->set_markup (Glib::ustring("") + M("GENERAL_BEFORE") + ""); - beforeBox = Gtk::manage (new Gtk::VBox ()); - beforeBox->pack_start (*beforeLabel, Gtk::PACK_SHRINK, 2); - beforeBox->pack_start (*beforeIarea); - - afterLabel = Gtk::manage (new Gtk::Label ()); - afterLabel->set_markup (Glib::ustring("") + M("GENERAL_AFTER") + ""); - afterBox->pack_start (*afterLabel, Gtk::PACK_SHRINK, 2); - afterBox->reorder_child (*afterLabel, 0); - - beforeAfterBox->pack_start (*beforeBox); - beforeAfterBox->reorder_child (*beforeBox, 0); - beforeAfterBox->show_all (); - - beforePreviewHandler = new PreviewHandler (); - isrc->increaseRef (); - beforeIpc = rtengine::StagedImageProcessor::create (isrc); - beforeIpc->setPreviewScale (10); - beforeIpc->setPreviewImageListener (beforePreviewHandler); - beforeIarea->imageArea->setPreviewHandler (beforePreviewHandler); - beforeIarea->imageArea->setImProcCoordinator (beforeIpc); - - iarea->setBeforeAfterViews (beforeIarea, iarea); - beforeIarea->setBeforeAfterViews (beforeIarea, iarea); - - rtengine::procparams::ProcParams params; - if (history->getBeforeLineParams (params)) - historyBeforeLineChanged (params); - } -} - -void EditorPanel::histogramChanged (unsigned int* rh, unsigned int* gh, unsigned int* bh, unsigned int* lh, unsigned int* bcrgb, unsigned int* bcl) { - - histogramPanel->histogramChanged (rh, gh, bh, lh); - tpc->updateCurveBackgroundHistogram (bcrgb, bcl); -} +/* + * 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 +#include +#include +#include +#include +#include +#include +#include + +using namespace rtengine::procparams; + +EditorPanel::EditorPanel (FilePanel* filePanel) : beforePreviewHandler(NULL), beforeIarea(NULL), parent(NULL), beforeIpc(NULL), ipc(NULL), catalogPane(NULL) { + + epih = new EditorPanelIdleHelper; + epih->epanel = this; + epih->destroyed = false; + epih->pending = 0; + +// construct toolpanelcoordinator + tpc = new ToolPanelCoordinator (); + +// build GUI + // build left side panel + leftbox = new Gtk::VBox (); + leftbox->set_border_width (4); + leftbox->set_size_request(100,250); + + histogramPanel = Gtk::manage (new HistogramPanel ()); + histogramPanel->set_size_request (-1, 150); +// leftbox->pack_start (*histogramPanel, Gtk::PACK_SHRINK, 4); + + profilep = Gtk::manage (new ProfilePanel ()); + Gtk::Frame* ppframe = Gtk::manage (new Gtk::Frame ()); + ppframe->add (*profilep); + ppframe->set_label (M("PROFILEPANEL_LABEL")); +// leftbox->pack_start (*ppframe, Gtk::PACK_SHRINK, 4); + + navigator = Gtk::manage (new Navigator ()); + navigator->previewWindow->set_size_request (-1, 150); + leftbox->pack_start (*navigator, Gtk::PACK_SHRINK, 4); + + history = Gtk::manage (new History ()); + leftbox->pack_start (*history); + + leftbox->show_all (); + + // build the middle of the screen + Gtk::VBox* editbox = Gtk::manage (new Gtk::VBox ()); + + info = Gtk::manage (new Gtk::ToggleButton ()); + Gtk::Image* infoimg = Gtk::manage (new Gtk::Image (argv0+"/images/info.png")); + info->add (*infoimg); + info->set_relief(Gtk::RELIEF_NONE); + info->set_tooltip_markup (M("MAIN_TOOLTIP_QINFO")); + + beforeAfter = Gtk::manage (new Gtk::ToggleButton ()); + Gtk::Image* beforeAfterIcon = Gtk::manage (new Gtk::Image (argv0+"/images/beforeafter.png")); + beforeAfter->add(*beforeAfterIcon); + beforeAfter->set_relief(Gtk::RELIEF_NONE); + beforeAfter->set_tooltip_markup (M("MAIN_TOOLTIP_TOGGLE")); + + + Gtk::VSeparator* vsept = Gtk::manage (new Gtk::VSeparator ()); + Gtk::VSeparator* vsepz = Gtk::manage (new Gtk::VSeparator ()); + Gtk::VSeparator* vsepi = Gtk::manage (new Gtk::VSeparator ()); + Gtk::VSeparator* vseph = Gtk::manage (new Gtk::VSeparator ()); + + hidehp = Gtk::manage (new Gtk::ToggleButton ()); + Gtk::Label* hidehpLabel = Gtk::manage (new Gtk::Label ()); + hidehpLabel->set_markup ("H"); + Gtk::Image* hpimg = Gtk::manage (new Gtk::Image (argv0+"/images/left.png")); + Gtk::HBox* hidehpBox = Gtk::manage (new Gtk::HBox ()); + hidehpBox->pack_start (*hpimg, Gtk::PACK_SHRINK, 2); + hidehpBox->pack_start (*hidehpLabel, Gtk::PACK_SHRINK, 2); + hidehp->add (*hidehpBox); + hidehp->set_relief(Gtk::RELIEF_NONE); + hidehp->set_active (options.showHistory); + hidehp->set_tooltip_markup (M("MAIN_TOOLTIP_HIDEHP")); + + Gtk::VSeparator* vsepcl = Gtk::manage (new Gtk::VSeparator ()); + Gtk::VSeparator* vsepz2 = Gtk::manage (new Gtk::VSeparator ()); + + iarea = new ImageAreaPanel (); + + Gtk::HBox* toolBarPanel = Gtk::manage (new Gtk::HBox ()); + toolBarPanel->pack_start (*hidehp, Gtk::PACK_SHRINK, 1); + toolBarPanel->pack_start (*vseph, Gtk::PACK_SHRINK, 2); + toolBarPanel->pack_start (*info, Gtk::PACK_SHRINK, 1); + toolBarPanel->pack_start (*beforeAfter, Gtk::PACK_SHRINK, 1); + toolBarPanel->pack_start (*vsepi, Gtk::PACK_SHRINK, 2); + toolBarPanel->pack_start (*tpc->getToolBar(), Gtk::PACK_SHRINK, 1); + toolBarPanel->pack_start (*vsept, Gtk::PACK_SHRINK, 2); + toolBarPanel->pack_end (*tpc->coarse, Gtk::PACK_SHRINK, 4); + toolBarPanel->pack_end (*vsepcl, Gtk::PACK_SHRINK, 4); + toolBarPanel->pack_end (*iarea->imageArea->indClippedPanel, Gtk::PACK_SHRINK, 0); + toolBarPanel->pack_end (*vsepz, Gtk::PACK_SHRINK, 2); + + afterBox = Gtk::manage (new Gtk::VBox ()); + afterBox->pack_start (*iarea); + + beforeAfterBox = Gtk::manage (new Gtk::HBox()); + beforeAfterBox->pack_start (*afterBox); + + editbox->pack_start (*toolBarPanel, Gtk::PACK_SHRINK); + editbox->pack_start (*beforeAfterBox); + + // build right side panel + vboxright = new Gtk::VBox (false, 0); + vboxright->set_size_request(100,250); + + vboxright->set_border_width (4); + vboxright->pack_start (*histogramPanel, Gtk::PACK_SHRINK, 4); + vboxright->pack_start (*ppframe, Gtk::PACK_SHRINK, 4); + // main notebook + vboxright->pack_start (*tpc->toolPanelNotebook); + + // Save buttons + Gtk::HBox* iops = Gtk::manage (new Gtk::HBox ()); + + Gtk::HBox * saveButtonBox = Gtk::manage(new Gtk::HBox()); + saveButtonBox->pack_start(*Gtk::manage (new Gtk::Image (Gtk::StockID("gtk-save"), Gtk::ICON_SIZE_BUTTON)), Gtk::PACK_SHRINK, 2); + saveButtonBox->pack_start(*Gtk::manage (new Gtk::Label (M("MAIN_BUTTON_SAVE"))), Gtk::PACK_SHRINK, 2); + saveimgas = Gtk::manage (new Gtk::Button ()); + saveimgas->add(*saveButtonBox); + saveimgas->set_tooltip_markup(M("MAIN_BUTTON_SAVE_TOOLTIP")); + + Gtk::HBox * queueButtonBox = Gtk::manage(new Gtk::HBox()); + queueButtonBox->pack_start(*Gtk::manage (new Gtk::Image (Gtk::StockID("gtk-execute"), Gtk::ICON_SIZE_BUTTON)), Gtk::PACK_SHRINK, 2); + queueButtonBox->pack_start(*Gtk::manage (new Gtk::Label (M("MAIN_BUTTON_PUTTOQUEUE"))), Gtk::PACK_SHRINK, 2); + queueimg = Gtk::manage (new Gtk::Button ()); + queueimg->add(*queueButtonBox); + queueimg->set_tooltip_markup(M("MAIN_BUTTON_PUTTOQUEUE_TOOLTIP")); + + Gtk::HBox * sendToEditorButtonBox = Gtk::manage(new Gtk::HBox()); + sendToEditorButtonBox->pack_start(*Gtk::manage (new Gtk::Image (argv0+"/images/gimp.png")), Gtk::PACK_SHRINK, 2); + sendToEditorButtonBox->pack_start(*Gtk::manage (new Gtk::Label (M("MAIN_BUTTON_SENDTOEDITOR"))), Gtk::PACK_SHRINK, 2); + sendtogimp = Gtk::manage (new Gtk::Button ()); + sendtogimp->add(*sendToEditorButtonBox); + sendtogimp->set_tooltip_markup(M("MAIN_BUTTON_SENDTOEDITOR_TOOLTIP")); + + iops->pack_start (*saveimgas, Gtk::PACK_SHRINK); + iops->pack_start (*queueimg, Gtk::PACK_SHRINK); + iops->pack_start (*sendtogimp, Gtk::PACK_SHRINK); + + // Status box + statusBox = Gtk::manage (new Gtk::HBox ()); + progressLabel = Gtk::manage (new Gtk::Label("")); + statusBox->pack_start (*progressLabel); + red = new Gtk::Image (argv0+"/images/red.png"); + green = new Gtk::Image (argv0+"/images/green.png"); + red->show (); + green->show (); + statusBox->pack_end (*green, Gtk::PACK_SHRINK, 4); + iops->pack_start(*statusBox, Gtk::PACK_SHRINK, 4); + + // Zoom panel + iops->pack_end (*iarea->imageArea->zoomPanel, Gtk::PACK_SHRINK, 1); + iops->pack_end (*vsepz2, Gtk::PACK_SHRINK, 2); + + + editbox->pack_start (*Gtk::manage(new Gtk::HSeparator()), Gtk::PACK_SHRINK, 4); + editbox->pack_start (*iops, Gtk::PACK_SHRINK, 4); + editbox->show_all (); + + // build screen + hpanedl = Gtk::manage (new Gtk::HPaned()); + hpanedr = Gtk::manage (new Gtk::HPaned()); + leftbox->reference (); + vboxright->reference (); + if (options.showHistory) { + hpanedl->pack1(*leftbox, false, true); + hpanedl->set_position (options.historyPanelWidth); + } + + + Gtk::VPaned * viewpaned = Gtk::manage (new Gtk::VPaned()); + fPanel = filePanel; + if(filePanel) + { + catalogPane = new Gtk::Paned(); + viewpaned->pack1(*catalogPane, false, true); + } + viewpaned->pack2(*editbox, true, true); + + + Gtk::Frame* vbfr = Gtk::manage (new Gtk::Frame ()); + vbfr->add (*viewpaned); + vbfr->set_size_request(100,250); + hpanedl->pack2(*vbfr, true, true); + + hpanedr->pack1(*hpanedl, true, true); + hpanedr->pack2(*vboxright, false, true); + hpanedl->signal_button_release_event().connect_notify( sigc::mem_fun(*this, &EditorPanel::leftPaneButtonReleased) ); + hpanedr->signal_button_release_event().connect_notify( sigc::mem_fun(*this, &EditorPanel::rightPaneButtonReleased) ); + + pack_start (*hpanedr); + show_all (); + + // save as dialog + if (Glib::file_test (options.lastSaveAsPath, Glib::FILE_TEST_IS_DIR)) + saveAsDialog = new SaveAsDialog (options.lastSaveAsPath); + else + saveAsDialog = new SaveAsDialog (Glib::get_user_special_dir (G_USER_DIRECTORY_PICTURES)); + + saveAsDialog->set_default_size (options.saveAsDialogWidth, options.saveAsDialogHeight); + +// connect listeners + profilep->setProfileChangeListener (tpc); + history->setProfileChangeListener (tpc); + history->setHistoryBeforeLineListener (this); + tpc->addPParamsChangeListener (profilep); + tpc->addPParamsChangeListener (history); + tpc->addPParamsChangeListener (this); + iarea->imageArea->setCropGUIListener (tpc->getCropGUIListener()); + iarea->imageArea->setPointerMotionListener (navigator); + iarea->imageArea->setImageAreaToolListener (tpc); + +// initialize components + info->set_active (options.showInfo); + tpc->readOptions (); + +// connect event handlers + info->signal_toggled().connect( sigc::mem_fun(*this, &EditorPanel::info_toggled) ); + beforeAfter->signal_toggled().connect( sigc::mem_fun(*this, &EditorPanel::beforeAfterToggled) ); + hidehp->signal_toggled().connect( sigc::mem_fun(*this, &EditorPanel::hideHistoryActivated) ); + saveimgas->signal_pressed().connect( sigc::mem_fun(*this, &EditorPanel::saveAsPressed) ); + queueimg->signal_pressed().connect( sigc::mem_fun(*this, &EditorPanel::queueImgPressed) ); + sendtogimp->signal_pressed().connect( sigc::mem_fun(*this, &EditorPanel::sendToGimpPressed) ); + +} + + + +EditorPanel::~EditorPanel () { + + history->setHistoryBeforeLineListener (NULL); + // the order is important! + delete iarea; + iarea = NULL; + delete beforeIarea; + beforeIarea = NULL; + + delete beforePreviewHandler; + + close (); + + if (epih->pending) + epih->destroyed = true; + else + delete epih; + + delete tpc; + + delete red; + delete green; + delete leftbox; + delete vboxright; + delete saveAsDialog; + if(catalogPane) + delete catalogPane; +} + +void EditorPanel::leftPaneButtonReleased(GdkEventButton *event) { + if (event->button == 1) { + // Button 1 released : it's a resize + options.historyPanelWidth = hpanedl->get_position(); + } + /*else if (event->button == 3) { + }*/ +} + +void EditorPanel::rightPaneButtonReleased(GdkEventButton *event) { + if (event->button == 1) { + int winW, winH; + parent->get_size(winW, winH); + // Button 1 released : it's a resize + options.toolPanelWidth = winW - hpanedr->get_position(); + } + /*else if (event->button == 3) { + }*/ +} + +void EditorPanel::setAspect () { + int winW, winH; + parent->get_size(winW, winH); + hpanedl->set_position(options.historyPanelWidth); + hpanedr->set_position(winW - options.toolPanelWidth); + // initialize components + if (info->get_active() != options.showInfo) + info->set_active (options.showInfo); +} + +void EditorPanel::on_realize () { + + Gtk::VBox::on_realize (); + // This line is needed to avoid autoexpansion of the window :-/ + vboxright->set_size_request (options.toolPanelWidth, -1); +} + +void EditorPanel::open (Thumbnail* tmb, rtengine::InitialImage* isrc) { + + if (ipc) close(); + // initialize everything + openThm = tmb; + openThm->increaseRef (); + + previewHandler = new PreviewHandler (); + + this->isrc = isrc; + ipc = rtengine::StagedImageProcessor::create (isrc); + ipc->setProgressListener (this); + ipc->setPreviewImageListener (previewHandler); + ipc->setPreviewScale (10); + tpc->initImage (ipc, tmb->getType()==FT_Raw); + ipc->setHistogramListener (this); + +// iarea->fitZoom (); // tell to the editorPanel that the next image has to be fitted to the screen + iarea->imageArea->setPreviewHandler (previewHandler); + iarea->imageArea->setImProcCoordinator (ipc); + navigator->previewWindow->setPreviewHandler (previewHandler); + navigator->previewWindow->setImageArea (iarea->imageArea); + + // try to load the last saved parameters from the cache or from the paramfile file + ProcParams* ldprof = NULL; + if (openThm->hasProcParams()) { + 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); + else + profilep->initProfile (options.defProfRaw, ldprof, NULL); + + openThm->addThumbnailListener (this); + info_toggled (); + + if (beforeIarea) + { + beforeAfterToggled(); + beforeAfterToggled(); + } + + if (iarea->imageArea->mainCropWindow) + { + iarea->imageArea->mainCropWindow->cropHandler.newImage(ipc); + iarea->imageArea->mainCropWindow->initialImageArrived(); + } +} + +void EditorPanel::close () { + + if (ipc) + { + saveProfile (); + // close image processor and the current thumbnail + tpc->closeImage (); // this call stops image processing + tpc->writeOptions (); + rtengine::ImageSource* is=isrc->getImageSource(); + is->setProgressListener( NULL ); + if (ipc) + ipc->setPreviewImageListener (NULL); + + if (beforeIpc) + beforeIpc->setPreviewImageListener (NULL); + + delete previewHandler; + previewHandler= NULL; + + rtengine::StagedImageProcessor::destroy (ipc); + ipc = NULL; + + if(iarea) + { + iarea->imageArea->setPreviewHandler (NULL); + iarea->imageArea->setImProcCoordinator (NULL); + } + navigator->previewWindow->setPreviewHandler (NULL); + // navigator->previewWindow->setImageArea (NULL); + + openThm->removeThumbnailListener (this); + openThm->decreaseRef (); + + } +} + +void EditorPanel::saveProfile () { + + if (!ipc) + return; + ProcParams params; + ipc->getParams (¶ms); + + if (options.saveParamsFile) + params.save (openThm->getFileName() + paramFileExtension); + if (openThm && options.saveParamsCache) + openThm->setProcParams (params, EDITOR); +} + +Glib::ustring EditorPanel::getShortName () { + + return Glib::path_get_basename (openThm->getFileName ()); +} + +Glib::ustring EditorPanel::getFileName () { + + return openThm->getFileName (); +} + +// TODO!!! +void EditorPanel::procParamsChanged (rtengine::procparams::ProcParams* params, rtengine::ProcEvent ev, Glib::ustring descr, ParamsEdited* paramsEdited) { + +// if (ev!=EvPhotoLoaded) +// saveLabel->set_markup (Glib::ustring("") + M("MAIN_BUTTON_SAVE") + ""); +} + +struct spsparams { + bool state; + EditorPanelIdleHelper* epih; +}; + +int setprocstate (void* data) { + + gdk_threads_enter (); + spsparams* p = (spsparams*)data; + + if (p->epih->destroyed) { + if (p->epih->pending == 1) + delete p->epih; + else + p->epih->pending--; + delete p; + gdk_threads_leave (); + return 0; + } + + p->epih->epanel->refreshProcessingState (p->state); + p->epih->pending--; + delete p; + gdk_threads_leave (); + return 0; +} + +void EditorPanel::setProgressState (int state) { + + epih->pending++; + + spsparams* p = new spsparams; + p->state = state; + p->epih = epih; + 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. + if (ipc && openThm && !state && tpc->getChangedState()) { + rtengine::procparams::ProcParams pparams; + ipc->getParams (&pparams); + openThm->setProcParams (pparams, EDITOR, false); + } + + // change state of the led + std::vector children = (std::vector) statusBox->get_children(); + if (children.size()>=1) { + Gtk::Widget* wlast = children[children.size()-1]; + if (wlast) + statusBox->remove (*wlast); + } + if (state) + statusBox->pack_end (*red, Gtk::PACK_SHRINK, 4); + else + statusBox->pack_end (*green, Gtk::PACK_SHRINK, 4); +} + +struct errparams { + Glib::ustring descr; + EditorPanelIdleHelper* epih; +}; + +void EditorPanel::displayError (Glib::ustring descr) { + + if (parent) { + Gtk::MessageDialog* msgd = new Gtk::MessageDialog (*parent, descr, true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); + msgd->set_title (M("MAIN_MSG_CANNOTSAVE")); + msgd->run (); + delete msgd; + } +} + +int disperror (void* data) { + + gdk_threads_enter (); + errparams* p = (errparams*)data; + + if (p->epih->destroyed) { + if (p->epih->pending == 1) + delete p->epih; + else + p->epih->pending--; + delete p; + gdk_threads_leave (); + return 0; + } + + p->epih->epanel->displayError (p->descr); + p->epih->pending--; + delete p; + gdk_threads_leave (); + return 0; +} + +void EditorPanel::error (Glib::ustring descr) { + + epih->pending++; + errparams* p = new errparams; + p->descr = descr; + p->epih = epih; + g_idle_add (disperror, p); +} + +void EditorPanel::info_toggled () { + + Glib::ustring infoString; + + const rtengine::ImageMetaData* idata = ipc->getInitialImage()->getMetaData(); + if (idata && idata->hasExif()) +// infoString = Glib::ustring::compose ("%1 %2\nF/%3 %4 sec\n%5: %6\n%7: %8 mm\n", +// Glib::ustring(idata->getMake()), Glib::ustring(idata->getModel()), +// Glib::ustring(idata->apertureToString(idata->getFNumber())), Glib::ustring(idata->shutterToString(idata->getShutterSpeed())), +// M("QINFO_ISO"), idata->getISOSpeed(), +// M("QINFO_FOCALLENGTH"), idata->getFocalLen()) +// + Glib::ustring::compose ("%1: %2", M("QINFO_LENS"), Glib::ustring(idata->getLens())); +infoString = Glib::ustring::compose ( + "%1 + %2\n%3s f/%4 %5%6 f=%7mm", + Glib::ustring(idata->getModel()), + Glib::ustring(idata->getLens()), + Glib::ustring(idata->shutterToString(idata->getShutterSpeed())), + Glib::ustring(idata->apertureToString(idata->getFNumber())), + M("QINFO_ISO"), idata->getISOSpeed(), + idata->getFocalLen() + ); + else + infoString = M("QINFO_NOEXIF"); + + iarea->imageArea->setInfoText (infoString); + iarea->imageArea->infoEnabled (info->get_active ()); +} + +void EditorPanel::hideHistoryActivated () { + + removeIfThere (hpanedl, leftbox, false); + if (hidehp->get_active()) + hpanedl->pack1 (*leftbox, false, true); + options.showHistory = hidehp->get_active(); +} + +bool EditorPanel::handleShortcutKey (GdkEventKey* event) { + + bool ctrl = event->state & GDK_CONTROL_MASK; + bool shift = event->state & GDK_SHIFT_MASK; + + if (!ctrl) { + switch(event->keyval) { + case GDK_h: + case GDK_H: + hidehp->set_active (!hidehp->get_active()); + return true; + case GDK_i: + case GDK_I: + info->set_active (!info->get_active()); + return true; + case GDK_b: + case GDK_B: + beforeAfter->set_active (!beforeAfter->get_active()); + return true; + case GDK_plus: + case GDK_equal: + iarea->imageArea->zoomPanel->zoomInClicked(); + return true; + case GDK_minus: + case GDK_underscore: + iarea->imageArea->zoomPanel->zoomOutClicked(); + return true; + case GDK_1: + iarea->imageArea->zoomPanel->zoom11Clicked(); + return true; + case GDK_f: + case GDK_F: + iarea->imageArea->zoomPanel->zoomFitClicked(); + return true; + } + } + else { + switch (event->keyval) { + case GDK_s: + saveAsPressed(); + return true; + case GDK_q: + queueImgPressed(); + return true; + case GDK_e: + sendToGimpPressed(); + return true; + case GDK_z: + history->undo (); + return true; + case GDK_Z: + history->redo (); + return true; + } + } + + if(tpc->getToolBar()->handleShortcutKey(event)) + return true; + + return false; +} + +void EditorPanel::procParamsChanged (Thumbnail* thm, int whoChangedIt) { + + if (whoChangedIt!=EDITOR) + tpc->profileChange (&openThm->getProcParams(), rtengine::EvProfileChangeNotification, M("PROGRESSDLG_PROFILECHANGEDINBROWSER")); +} + +bool EditorPanel::idle_saveImage (ProgressConnector *pc, Glib::ustring fname, SaveFormat sf, bool findNewNameIfNeeded){ + rtengine::IImage16* img = pc->returnValue(); + delete pc; + if( img ) + saveImage( img, fname, sf, findNewNameIfNeeded); + else{ + Glib::ustring msg_ = Glib::ustring("") + fname + ": Error during image processing\n"; + Gtk::MessageDialog msgd (*parent, msg_, true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); + msgd.run (); + + saveimgas->set_sensitive(true); + sendtogimp->set_sensitive(true); + + } + return false; +} + +BatchQueueEntry* EditorPanel::createBatchQueueEntry () { + + rtengine::procparams::ProcParams pparams; + ipc->getParams (&pparams); + //rtengine::ProcessingJob* job = rtengine::ProcessingJob::create (ipc->getInitialImage(), pparams); + rtengine::ProcessingJob* job = rtengine::ProcessingJob::create (openThm->getFileName (), openThm->getType()==FT_Raw, pparams); + int prevh = options.maxThumbnailHeight; + int prevw = prevh; + guint8* prev = NULL;//(guint8*) previewHandler->getImagePreview (prevw, prevh); + double tmpscale; + rtengine::IImage8* img = openThm->processThumbImage (pparams, options.maxThumbnailHeight, tmpscale); + if (img) { + prevw = img->getWidth (); + prevh = img->getHeight (); + prev = new guint8 [prevw*prevh*3]; + memcpy (prev, img->getData (), prevw*prevh*3); + img->free(); + } + return new BatchQueueEntry (job, pparams, openThm->getFileName(), prev, prevw, prevh, openThm); +} + +int EditorPanel::saveImage (rtengine::IImage16* img, Glib::ustring& fname, SaveFormat sf, bool findNewNameIfNeeded) { + + Glib::ustring fileName = Glib::ustring::compose ("%1.%2", fname, sf.format); + if (findNewNameIfNeeded) { + int tries = 1; + while (Glib::file_test (fileName, Glib::FILE_TEST_EXISTS) && tries<1000) { + fileName = Glib::ustring::compose("%1-%2.%3", fname, tries, sf.format); + tries++; + } + if (tries==1000) + return -1000; + } + ProgressConnector *ld = new ProgressConnector(); + img->setSaveProgressListener (parent->getProgressListener()); + if (sf.format=="tif") + ld->startFunc (sigc::bind(sigc::mem_fun(img, &rtengine::IImage16::saveAsTIFF), fileName, sf.tiffBits, sf.tiffUncompressed), + sigc::bind(sigc::mem_fun(*this,&EditorPanel::idle_imageSaved), ld, img, fileName,sf)); + else if (sf.format=="png") + ld->startFunc (sigc::bind(sigc::mem_fun(img, &rtengine::IImage16::saveAsPNG), fileName, sf.pngCompression, sf.pngBits), + sigc::bind(sigc::mem_fun(*this,&EditorPanel::idle_imageSaved), ld, img, fileName,sf)); + else if (sf.format=="jpg") + ld->startFunc (sigc::bind(sigc::mem_fun(img, &rtengine::IImage16::saveAsJPEG), fileName, sf.jpegQuality), + sigc::bind(sigc::mem_fun(*this,&EditorPanel::idle_imageSaved), ld, img, fileName,sf)); + return 0; +} + +bool EditorPanel::idle_imageSaved(ProgressConnector *pc,rtengine::IImage16* img,Glib::ustring fname, SaveFormat sf){ + img->free (); + if (! pc->returnValue() ) { + openThm->imageDeveloped (); + // save processing parameters, if needed + if (sf.saveParams) { + rtengine::procparams::ProcParams pparams; + ipc->getParams (&pparams); + // We keep the extension to avoid overwriting the profile when we have + // the same output filename with different extension + //pparams.save (removeExtension (fname) + ".out" + paramFileExtension); + pparams.save (fname + ".out" + paramFileExtension); + } + }else{ + Glib::ustring msg_ = Glib::ustring("") + fname + ": Error during image saving\n"; + Gtk::MessageDialog msgd (*parent, msg_, true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); + msgd.run (); + } + saveimgas->set_sensitive(true); + sendtogimp->set_sensitive(true); + parent->setProgressStr(""); + parent->setProgress(0.); + delete pc; + return false; +} + +void EditorPanel::saveAsPressed () { + + bool fnameOK = false; + Glib::ustring fname; + + saveAsDialog->setInitialFileName (removeExtension (Glib::path_get_basename (openThm->getFileName()))); + do { + saveAsDialog->run (); + fname = saveAsDialog->getFileName (); + if (fname=="") + return; + + options.lastSaveAsPath = saveAsDialog->getDirectory (); + options.saveAsDialogWidth = saveAsDialog->get_width(); + options.saveAsDialogHeight = saveAsDialog->get_height(); + + SaveFormat sf = saveAsDialog->getFormat (); + + options.saveFormat = sf; + options.autoSuffix = saveAsDialog->getAutoSuffix(); + + if (saveAsDialog->getImmediately ()) { + // separate filename and the path to the destination directory + Glib::ustring dstdir = Glib::path_get_dirname (fname); + Glib::ustring dstfname = Glib::path_get_basename (removeExtension(fname)); + + if (saveAsDialog->getAutoSuffix()) { + + Glib::ustring fnameTemp; + for (int tries=0; tries<100; tries++) { + if (tries==0) + fnameTemp = Glib::ustring::compose ("%1.%2", Glib::build_filename (dstdir, dstfname), sf.format); + else + fnameTemp = Glib::ustring::compose ("%1-%2.%3", Glib::build_filename (dstdir, dstfname), tries, sf.format); + + if (!Glib::file_test (fnameTemp, Glib::FILE_TEST_EXISTS)) { + fname = fnameTemp; + fnameOK = true; + break; + } + } + } + // check if it exists + if (!fnameOK) { + fname = Glib::ustring::compose ("%1.%2", Glib::build_filename (dstdir, dstfname), sf.format); + if (Glib::file_test (fname, Glib::FILE_TEST_EXISTS)) { + Glib::ustring msg_ = Glib::ustring("") + fname + ": " + M("MAIN_MSG_ALREADYEXISTS") + "\n" + M("MAIN_MSG_QOVERWRITE") + ""; + Gtk::MessageDialog msgd (*parent, msg_, true, Gtk::MESSAGE_WARNING, Gtk::BUTTONS_YES_NO, true); + int response = msgd.run (); + if (response==Gtk::RESPONSE_YES) + fnameOK = true; + } + else fnameOK = true; + } + + if (fnameOK) { + // save image + rtengine::procparams::ProcParams pparams; + ipc->getParams (&pparams); + rtengine::ProcessingJob* job = rtengine::ProcessingJob::create (ipc->getInitialImage(), pparams); + fname = removeExtension (fname); + ProgressConnector *ld = new ProgressConnector(); + ld->startFunc(sigc::bind(sigc::ptr_fun(&rtengine::processImage), job, err, parent->getProgressListener() ), + sigc::bind(sigc::mem_fun( *this,&EditorPanel::idle_saveImage ),ld,fname,sf,false )); + saveimgas->set_sensitive(false); + sendtogimp->set_sensitive(false); + } + } + else { + BatchQueueEntry* bqe = createBatchQueueEntry (); + bqe->outFileName = fname; + bqe->saveFormat = saveAsDialog->getFormat (); + parent->addBatchQueueJob (bqe, saveAsDialog->getToHeadOfQueue ()); + fnameOK = true; + } + // ask parent to redraw file browser + // ... or does it automatically when the tab is switched to it + } while (!fnameOK); +} + +void EditorPanel::queueImgPressed () { + + saveProfile (); + parent->addBatchQueueJob (createBatchQueueEntry ()); +} + +void EditorPanel::sendToGimpPressed () { + // develop image + rtengine::procparams::ProcParams pparams; + ipc->getParams (&pparams); + rtengine::ProcessingJob* job = rtengine::ProcessingJob::create (ipc->getInitialImage(), pparams); + ProgressConnector *ld = new ProgressConnector(); + ld->startFunc(sigc::bind(sigc::ptr_fun(&rtengine::processImage), job, err, parent->getProgressListener() ), + sigc::bind(sigc::mem_fun( *this,&EditorPanel::idle_sendToGimp ),ld )); + saveimgas->set_sensitive(false); + sendtogimp->set_sensitive(false); +} + +bool EditorPanel::idle_sendToGimp( ProgressConnector *pc){ + + rtengine::IImage16* img = pc->returnValue(); + delete pc; + if (img) { + // get file name base + Glib::ustring shortname = removeExtension (Glib::path_get_basename (openThm->getFileName())); + Glib::ustring dirname = Glib::get_tmp_dir (); + Glib::ustring fname = Glib::build_filename (dirname, shortname); + + SaveFormat sf; + sf.format = "tif"; + sf.tiffBits = 16; + + Glib::ustring fileName = Glib::ustring::compose ("%1.%2", fname, sf.format); + + int tries = 1; + while (Glib::file_test (fileName, Glib::FILE_TEST_EXISTS) && tries<1000) { + fileName = Glib::ustring::compose("%1-%2.%3", fname, tries, sf.format); + tries++; + } + if (tries==1000){ + img->free (); + return false; + } + + ProgressConnector *ld = new ProgressConnector(); + img->setSaveProgressListener (parent->getProgressListener()); + ld->startFunc (sigc::bind(sigc::mem_fun(img, &rtengine::IImage16::saveAsTIFF), fileName, sf.tiffBits, sf.tiffUncompressed), + sigc::bind(sigc::mem_fun(*this,&EditorPanel::idle_sentToGimp), ld, img, fileName)); + }else{ + Glib::ustring msg_ = Glib::ustring(" Error during image processing\n"); + Gtk::MessageDialog msgd (*parent, msg_, true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); + msgd.run (); + saveimgas->set_sensitive(true); + sendtogimp->set_sensitive(true); + } + return false; +} + +bool EditorPanel::idle_sentToGimp(ProgressConnector *pc,rtengine::IImage16* img,Glib::ustring filename){ + img->free (); + int errore = pc->returnValue(); + delete pc; + if (!errore) { + saveimgas->set_sensitive(true); + sendtogimp->set_sensitive(true); + parent->setProgressStr(""); + parent->setProgress(0.); + bool success=false; + Glib::ustring cmdLine; + Glib::ustring executable; + // start gimp + if (options.editorToSendTo==1) { +#ifdef _WIN32 + executable = Glib::build_filename (Glib::build_filename(options.gimpDir,"bin"), "gimp-win-remote"); + cmdLine = Glib::ustring("\"") + executable + Glib::ustring("\" gimp-2.4.exe ") + Glib::ustring("\"") + filename + Glib::ustring("\""); + if ( Glib::file_test(executable, (Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_EXECUTABLE)) ) { + success = safe_spawn_command_line_async (cmdLine); + } +#else + cmdLine = Glib::ustring("gimp-remote ") + Glib::ustring(" \"") + filename + Glib::ustring("\""); + success = safe_spawn_command_line_async (cmdLine); +#endif + if (!success){ +#ifdef _WIN32 + int ver = 12; + while (!success && ver) { + executable = Glib::build_filename (Glib::build_filename(options.gimpDir,"bin"), Glib::ustring::compose(Glib::ustring("gimp-2.%1.exe"),ver)); + if ( Glib::file_test(executable, (Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_EXECUTABLE)) ) { + cmdLine = Glib::ustring("\"") + executable + Glib::ustring("\" \"") + filename + Glib::ustring("\""); + success = safe_spawn_command_line_async (cmdLine); + } + ver--; + } +#elif defined __APPLE__ + cmdLine = Glib::ustring("gimp \"") + filename + Glib::ustring("\""); + success = safe_spawn_command_line_async (cmdLine); +#else + cmdLine = Glib::ustring("gimp \"") + filename + Glib::ustring("\""); + success = safe_spawn_command_line_async (cmdLine); +#endif + } + } + else if (options.editorToSendTo==2) { +#ifdef _WIN32 + executable = Glib::build_filename(options.psDir,"Photoshop.exe"); + if ( Glib::file_test(executable, (Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_EXECUTABLE)) ) { + cmdLine = Glib::ustring("\"") + executable + Glib::ustring("\" \"") + filename + Glib::ustring("\""); + success = safe_spawn_command_line_async (cmdLine); + } +#else + #ifdef __APPLE__ + cmdLine = Glib::ustring("open -a \'") + Glib::build_filename(options.psDir,"Photoshop.app\' ") + Glib::ustring("\'") + filename + Glib::ustring("\'"); + #else + cmdLine = Glib::ustring("\"") + Glib::build_filename(options.psDir,"Photoshop.exe") + Glib::ustring("\" \"") + filename + Glib::ustring("\""); + #endif + success = safe_spawn_command_line_async (cmdLine); +#endif + } + else if (options.editorToSendTo==3) { +#ifdef _WIN32 + if ( Glib::file_test(options.customEditorProg, (Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_EXECUTABLE)) ) { + cmdLine = Glib::ustring("\"") + options.customEditorProg + Glib::ustring("\" \"") + filename + Glib::ustring("\""); + success = safe_spawn_command_line_async (cmdLine); + } +#else + #ifdef __APPLE__ + cmdLine = options.customEditorProg + filename; + #else + cmdLine = Glib::ustring("\"") + options.customEditorProg + Glib::ustring("\" \"") + filename + Glib::ustring("\""); + #endif + success = safe_spawn_command_line_async (cmdLine); +#endif + } + + if (!success) { + Gtk::MessageDialog* msgd = new Gtk::MessageDialog (*parent, M("MAIN_MSG_CANNOTSTARTEDITOR"), false, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); + msgd->set_secondary_text (M("MAIN_MSG_CANNOTSTARTEDITOR_SECONDARY")); + msgd->set_title (M("MAIN_BUTTON_SENDTOEDITOR")); + msgd->run (); + delete msgd; + } + + } + + return false; +} + +/* +void EditorPanel::saveOptions () { +} +*/ + +void EditorPanel::historyBeforeLineChanged (const rtengine::procparams::ProcParams& params) { + + if (beforeIpc) { + ProcParams* pparams = beforeIpc->getParamsForUpdate (rtengine::EvProfileChanged); + *pparams = params; + beforeIpc->paramsUpdateReady (); + } +} + +void EditorPanel::beforeAfterToggled () { + + if(!ipc) + return; + + removeIfThere (beforeAfterBox, beforeBox, false); + removeIfThere (afterBox, afterLabel, false); + + if (beforeIarea) { + if (beforeIpc) + beforeIpc->stopProcessing (); + iarea->setBeforeAfterViews (NULL, iarea); + delete beforeIarea; + beforeIarea = NULL; + if (beforeIpc) + beforeIpc->setPreviewImageListener (NULL); + delete beforePreviewHandler; + beforePreviewHandler = NULL; + if (beforeIpc) + rtengine::StagedImageProcessor::destroy (beforeIpc); + beforeIpc = NULL; + } + + if (beforeAfter->get_active ()) { + + beforeIarea = new ImageAreaPanel (); + + beforeLabel = Gtk::manage (new Gtk::Label ()); + beforeLabel->set_markup (Glib::ustring("") + M("GENERAL_BEFORE") + ""); + beforeBox = Gtk::manage (new Gtk::VBox ()); + beforeBox->pack_start (*beforeLabel, Gtk::PACK_SHRINK, 2); + beforeBox->pack_start (*beforeIarea); + + afterLabel = Gtk::manage (new Gtk::Label ()); + afterLabel->set_markup (Glib::ustring("") + M("GENERAL_AFTER") + ""); + afterBox->pack_start (*afterLabel, Gtk::PACK_SHRINK, 2); + afterBox->reorder_child (*afterLabel, 0); + + beforeAfterBox->pack_start (*beforeBox); + beforeAfterBox->reorder_child (*beforeBox, 0); + beforeAfterBox->show_all (); + + beforePreviewHandler = new PreviewHandler (); + isrc->increaseRef (); + beforeIpc = rtengine::StagedImageProcessor::create (isrc); + beforeIpc->setPreviewScale (10); + beforeIpc->setPreviewImageListener (beforePreviewHandler); + beforeIarea->imageArea->setPreviewHandler (beforePreviewHandler); + beforeIarea->imageArea->setImProcCoordinator (beforeIpc); + + iarea->setBeforeAfterViews (beforeIarea, iarea); + beforeIarea->setBeforeAfterViews (beforeIarea, iarea); + + rtengine::procparams::ProcParams params; + if (history->getBeforeLineParams (params)) + historyBeforeLineChanged (params); + } +} + +void EditorPanel::histogramChanged (unsigned int* rh, unsigned int* gh, unsigned int* bh, unsigned int* lh, unsigned int* bcrgb, unsigned int* bcl) { + + histogramPanel->histogramChanged (rh, gh, bh, lh); + tpc->updateCurveBackgroundHistogram (bcrgb, bcl); +} diff --git a/rtgui/editorpanel.h b/rtgui/editorpanel.h index 58a915006..bf6156962 100644 --- a/rtgui/editorpanel.h +++ b/rtgui/editorpanel.h @@ -32,6 +32,7 @@ #include #include #include +#include class EditorPanel; struct EditorPanelIdleHelper { @@ -81,6 +82,9 @@ class EditorPanel : public Gtk::VBox, ToolPanelCoordinator* tpc; RTWindow* parent; SaveAsDialog* saveAsDialog; + BatchToolPanelCoordinator* btpCoordinator; + FilePanel* fPanel; + Thumbnail* openThm; rtengine::InitialImage* isrc; @@ -100,7 +104,7 @@ class EditorPanel : public Gtk::VBox, int err; public: - EditorPanel (); + EditorPanel (FilePanel* filePanel = NULL); virtual ~EditorPanel (); void open (Thumbnail* tmb, rtengine::InitialImage* isrc); @@ -145,6 +149,8 @@ class EditorPanel : public Gtk::VBox, bool handleShortcutKey (GdkEventKey* event); //void saveOptions (); + + Gtk::Paned *catalogPane; }; #endif diff --git a/rtgui/filebrowser.cc b/rtgui/filebrowser.cc index ecc3e0c13..70959a333 100644 --- a/rtgui/filebrowser.cc +++ b/rtgui/filebrowser.cc @@ -35,7 +35,7 @@ FileBrowser::FileBrowser () fbih->destroyed = false; fbih->pending = 0; - profileStore.parseProfiles (); + // profileStore.parseProfiles (); signal_style_changed().connect( sigc::mem_fun(*this, &FileBrowser::styleChanged) ); diff --git a/rtgui/filebrowserentry.cc b/rtgui/filebrowserentry.cc index ef813410e..b31d6b454 100644 --- a/rtgui/filebrowserentry.cc +++ b/rtgui/filebrowserentry.cc @@ -56,14 +56,20 @@ FileBrowserEntry::FileBrowserEntry (Thumbnail* thm, const Glib::ustring& fname) FileBrowserEntry::~FileBrowserEntry () { - thumbImageUpdater.removeJobs (this); + // so jobs arriving now do nothing + if (feih->pending) + { + feih->destroyed = true; + } + else + { + delete feih; + feih = 0; + } + + thumbImageUpdater->removeJobs (this); if (thumbnail) thumbnail->removeThumbnailListener (this); - - if (feih->pending) - feih->destroyed = true; - else - delete feih; } void FileBrowserEntry::refreshThumbnailImage () { @@ -71,8 +77,16 @@ void FileBrowserEntry::refreshThumbnailImage () { if (!thumbnail) return; - thumbImageUpdater.add (thumbnail, thumbnail->getProcParams(), preh, &updatepriority, this); - thumbImageUpdater.process (); + thumbImageUpdater->add (thumbnail, thumbnail->getProcParams(), preh, &updatepriority, false, this); +} + +void FileBrowserEntry::refreshQuickThumbnailImage () { + // Only make a (slow) processed preview if the picture has been edited at all + if ( thumbnail && + thumbnail->isQuick() && (!options.internalThumbIfUntouched || thumbnail->isPParamsValid()) ) + { + thumbImageUpdater->add(thumbnail, thumbnail->getProcParams(), preh, &updatepriority, true, this); + } } void FileBrowserEntry::calcThumbnailSize () { @@ -134,10 +148,11 @@ struct tiupdate { int fbeupdate (void* data) { - gdk_threads_enter (); tiupdate* params = (tiupdate*)data; FileBrowserEntryIdleHelper* feih = params->feih; + GThreadLock lock; + if (feih->destroyed) { if (feih->pending == 1) delete feih; @@ -145,14 +160,12 @@ int fbeupdate (void* data) { feih->pending--; params->img->free (); delete params; - gdk_threads_leave (); return 0; } feih->fbentry->_updateImage (params->img, params->scale, params->cropParams); feih->pending--; - gdk_threads_leave (); delete params; return 0; @@ -160,8 +173,19 @@ int fbeupdate (void* data) { void FileBrowserEntry::updateImage (rtengine::IImage8* img, double scale, rtengine::procparams::CropParams cropParams) { - redrawRequests++; - feih->pending++; + { + GThreadLock lock; + + if ( feih == 0 || + feih->destroyed ) + { + return; + } + + redrawRequests++; + feih->pending++; + } + tiupdate* param = new tiupdate (); param->feih = feih; param->img = img; diff --git a/rtgui/filebrowserentry.h b/rtgui/filebrowserentry.h index 53a1fcf16..490e0d100 100644 --- a/rtgui/filebrowserentry.h +++ b/rtgui/filebrowserentry.h @@ -76,6 +76,7 @@ public: FileThumbnailButtonSet* getThumbButtonSet (); void refreshThumbnailImage (); + void refreshQuickThumbnailImage (); void calcThumbnailSize (); std::vector > getIconsOnImageArea (); diff --git a/rtgui/filecatalog.cc b/rtgui/filecatalog.cc index 2f62cf6fd..26866cee4 100644 --- a/rtgui/filecatalog.cc +++ b/rtgui/filecatalog.cc @@ -1,971 +1,941 @@ -/* - * 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define CHECKTIME 2000 - -extern Glib::ustring argv0; - -#ifdef _WIN32 -int _directoryUpdater (void* cat) { - - ((FileCatalog*)cat)->checkCounter++; - if (((FileCatalog*)cat)->checkCounter==2) { - gdk_threads_enter (); - ((FileCatalog*)cat)->reparseDirectory (); - gdk_threads_leave (); - } - return 1; -} -#endif - -FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb) : listener(NULL), fslistener(NULL), hasValidCurrentEFS(false), filterPanel(NULL), coarsePanel(cp), toolBar(tb) { - - previewLoader.setPreviewLoaderListener (this); - - // construct and initialize thumbnail browsers - fileBrowser = new FileBrowser(); - fileBrowser->setFileBrowserListener (this); - fileBrowser->setArrangement (ThumbBrowserBase::TB_Vertical); - fileBrowser->show (); - - // construct trash panel with the extra "empty trash" button - trashButtonBox = new Gtk::VBox; - Gtk::Button* emptyT = new Gtk::Button (M("FILEBROWSER_EMPTYTRASH")); - emptyT->set_tooltip_markup (M("FILEBROWSER_EMPTYTRASHHINT")); - emptyT->set_image (*(new Gtk::Image (Gtk::StockID("gtk-delete"), Gtk::ICON_SIZE_BUTTON))); - emptyT->signal_pressed().connect (sigc::mem_fun(*this, &FileCatalog::emptyTrash)); - trashButtonBox->pack_start (*emptyT, Gtk::PACK_SHRINK, 4); - emptyT->show (); - trashButtonBox->show (); - - // setup button bar - buttonBar = new Gtk::HBox (); - pack_start (*buttonBar, Gtk::PACK_SHRINK); - - buttonBar->pack_start (*(new Gtk::VSeparator), Gtk::PACK_SHRINK); - bDir = new Gtk::ToggleButton (); - bDir->set_active (true); - bDir->set_image (*(new Gtk::Image (argv0+"/images/folder.png"))); - bDir->set_relief (Gtk::RELIEF_NONE); - bDir->set_tooltip_markup (M("FILEBROWSER_SHOWDIRHINT")); - bDir->signal_button_press_event().connect (sigc::mem_fun(*this, &FileCatalog::capture_event),false); - bCateg[0] = bDir->signal_toggled().connect (sigc::bind(sigc::mem_fun(*this, &FileCatalog::categoryButtonToggled), bDir)); - buttonBar->pack_start (*bDir, Gtk::PACK_SHRINK); - buttonBar->pack_start (*(new Gtk::VSeparator), Gtk::PACK_SHRINK); - - bUnRanked = new Gtk::ToggleButton (); - bUnRanked->set_active (false); - bUnRanked->set_image (*(new Gtk::Image (argv0+"/images/unrated.png"))); - bUnRanked->set_relief (Gtk::RELIEF_NONE); - bUnRanked->set_tooltip_markup (M("FILEBROWSER_SHOWUNRANKHINT")); - bCateg[1] = bUnRanked->signal_toggled().connect (sigc::bind(sigc::mem_fun(*this, &FileCatalog::categoryButtonToggled), bUnRanked)); - buttonBar->pack_start (*bUnRanked, Gtk::PACK_SHRINK); - bUnRanked->signal_button_press_event().connect (sigc::mem_fun(*this, &FileCatalog::capture_event),false); - - for (int i=0; i<5; i++) { - iranked[i] = new Gtk::Image (argv0+"/images/rated.png"); - igranked[i] = new Gtk::Image (argv0+"/images/grayrated.png"); - iranked[i]->show (); - igranked[i]->show (); - bRank[i] = new Gtk::ToggleButton (); - bRank[i]->set_image (*igranked[i]); - bRank[i]->set_relief (Gtk::RELIEF_NONE); - buttonBar->pack_start (*bRank[i], Gtk::PACK_SHRINK); - bCateg[i+2] = bRank[i]->signal_toggled().connect (sigc::bind(sigc::mem_fun(*this, &FileCatalog::categoryButtonToggled), bRank[i])); - bRank[i]->signal_button_press_event().connect (sigc::mem_fun(*this, &FileCatalog::capture_event),false); - } - bRank[0]->set_tooltip_markup (M("FILEBROWSER_SHOWRANK1HINT")); - bRank[1]->set_tooltip_markup (M("FILEBROWSER_SHOWRANK2HINT")); - bRank[2]->set_tooltip_markup (M("FILEBROWSER_SHOWRANK3HINT")); - bRank[3]->set_tooltip_markup (M("FILEBROWSER_SHOWRANK4HINT")); - bRank[4]->set_tooltip_markup (M("FILEBROWSER_SHOWRANK5HINT")); - buttonBar->pack_start (*(new Gtk::VSeparator), Gtk::PACK_SHRINK); - - iTrashEmpty = new Gtk::Image(argv0+"/images/trash-show-empty.png"); - iTrashFull = new Gtk::Image(argv0+"/images/trash-show-full.png"); - - bTrash = new Gtk::ToggleButton (); - bTrash->set_image (*iTrashEmpty); - bTrash->set_relief (Gtk::RELIEF_NONE); - bTrash->set_tooltip_markup (M("FILEBROWSER_SHOWTRASHHINT")); - bCateg[7] = bTrash->signal_toggled().connect (sigc::bind(sigc::mem_fun(*this, &FileCatalog::categoryButtonToggled), bTrash)); - bTrash->signal_button_press_event().connect (sigc::mem_fun(*this, &FileCatalog::capture_event),false); - buttonBar->pack_start (*bTrash, Gtk::PACK_SHRINK); - buttonBar->pack_start (*(new Gtk::VSeparator), Gtk::PACK_SHRINK); - fileBrowser->trash_changed().connect( sigc::mem_fun(*this, &FileCatalog::trashChanged) ); - - categoryButtons[0] = bDir; - categoryButtons[1] = bUnRanked; - for (int i=0; i<5; i++) - categoryButtons[i+2] = bRank[i]; - categoryButtons[7] = bTrash; - - exifInfo = Gtk::manage(new Gtk::ToggleButton ()); - exifInfo->set_image (*(new Gtk::Image (argv0+"/images/info.png"))); - exifInfo->set_relief (Gtk::RELIEF_NONE); - exifInfo->set_tooltip_markup (M("FILEBROWSER_SHOWEXIFINFO")); - exifInfo->set_active( options.showFileNames ); - exifInfo->signal_toggled().connect(sigc::mem_fun(*this, &FileCatalog::exifInfoButtonToggled)); - buttonBar->pack_start (*exifInfo, Gtk::PACK_SHRINK); - - // thumbnail zoom - Gtk::HBox* zoomBox = new Gtk::HBox (); - zoomInButton = new Gtk::Button (); - zoomInButton->set_image (*(new Gtk::Image (Gtk::StockID("gtk-zoom-in"), Gtk::ICON_SIZE_SMALL_TOOLBAR))); - zoomInButton->signal_pressed().connect (sigc::mem_fun(*this, &FileCatalog::zoomIn)); - zoomInButton->set_relief (Gtk::RELIEF_NONE); - zoomInButton->set_tooltip_markup (M("FILEBROWSER_ZOOMINHINT")); - zoomBox->pack_end (*zoomInButton, Gtk::PACK_SHRINK); - zoomOutButton = new Gtk::Button (); - zoomOutButton->set_image (*(new Gtk::Image (Gtk::StockID("gtk-zoom-out"), Gtk::ICON_SIZE_SMALL_TOOLBAR))); - zoomOutButton->signal_pressed().connect (sigc::mem_fun(*this, &FileCatalog::zoomOut)); - zoomOutButton->set_relief (Gtk::RELIEF_NONE); - zoomOutButton->set_tooltip_markup (M("FILEBROWSER_ZOOMOUTHINT")); - zoomBox->pack_end (*zoomOutButton, Gtk::PACK_SHRINK); - - // add default panel - hBox = new Gtk::HBox (); - hBox->show (); - hBox->pack_end (*fileBrowser); - fileBrowser->applyFilter (getFilter()); - pack_start (*hBox); - - buttonBar2 = new Gtk::HBox (); - pack_end (*buttonBar2, Gtk::PACK_SHRINK); - progressBar = new Gtk::ProgressBar (); - buttonBar2->pack_start (*progressBar, Gtk::PACK_SHRINK, 4); - progressBar->set_size_request (-1, 16); - - buttonBar->pack_start (*zoomBox, Gtk::PACK_SHRINK); - - buttonBar->pack_end (*coarsePanel, Gtk::PACK_SHRINK); - buttonBar->pack_end (*Gtk::manage(new Gtk::VSeparator), Gtk::PACK_SHRINK, 4); - buttonBar->pack_end (*toolBar, Gtk::PACK_SHRINK); - buttonBar->pack_end (*Gtk::manage(new Gtk::VSeparator), Gtk::PACK_SHRINK, 4); - - enabled = true; - - lastScrollPos = 0; - for (int i=0; i<8; i++) { - hScrollPos[i] = 0; - vScrollPos[i] = 0; - } - - selectedDirectory = ""; -#ifdef _WIN32 - wdMonitor = NULL; - checkCounter = 2; - g_timeout_add (CHECKTIME, _directoryUpdater, this); -#endif -} - -bool FileCatalog::capture_event(GdkEventButton* event){ - // need to record modifiers on the button press, because signal_toggled does not pass the event. - modifierKey = event->state; - return false; -} - -void FileCatalog::exifInfoButtonToggled() -{ - options.showFileNames = exifInfo->get_active(); - fileBrowser->refreshThumbImages (); -} - -void FileCatalog::on_realize() { - - Gtk::VBox::on_realize(); - Pango::FontDescription fontd = get_pango_context()->get_font_description (); - fileBrowser->get_pango_context()->set_font_description (fontd); -// batchQueue->get_pango_context()->set_font_description (fontd); -} - -void FileCatalog::closeDir () { - - if (filterPanel) - filterPanel->set_sensitive (false); - -#ifndef _WIN32 - if (dirMonitor) - dirMonitor->cancel (); -#else - if (wdMonitor) { - delete wdMonitor; - wdMonitor = NULL; - } -#endif - // terminate thumbnail preview loading - previewLoader.terminate (); - - // terminate thumbnail updater - thumbImageUpdater.terminate (); - - // remove entries - fileBrowser->close (); - fileNameList.clear (); - - dirEFS.clear (); - hasValidCurrentEFS = false; - selectedDirectory = ""; - redrawAll (); -} - -std::vector FileCatalog::getFileList () { - - std::vector names; - Glib::RefPtr dir = Gio::File::create_for_path (selectedDirectory); - safe_build_file_list (dir, names, selectedDirectory); - return names; -} - -void FileCatalog::dirSelected (const Glib::ustring& dirname, const Glib::ustring& openfile) { - - try { - Glib::RefPtr dir = Gio::File::create_for_path (dirname); - - if (!dir) - return; - closeDir (); - previewsToLoad = 0; - previewsLoaded = 0; - // if openfile exists, we have to open it first (it is a command line argument) - if (openfile!="") - addAndOpenFile (openfile); - - selectedDirectory = dir->get_parse_name(); - fileNameList = getFileList (); - - for (unsigned int i=0; i f = Gio::File::create_for_path(fileNameList[i]); - if (f->get_parse_name() != openfile) // if we opened a file at the beginning don't add it again - checkAndAddFile (f); - } - - _refreshProgressBar (); - previewLoader.process (); - -#ifdef _WIN32 - wdMonitor = new WinDirMonitor (selectedDirectory, this); -#elif defined __APPLE__ - printf("TODO fix dir->monitor_directory () for OSX\n"); -#else - dirMonitor = dir->monitor_directory (); - dirMonitor->signal_changed().connect (sigc::bind(sigc::mem_fun(*this, &FileCatalog::on_dir_changed), false)); -#endif - } - catch (Glib::Exception& ex) { - std::cout << ex.what(); - } -} - -void FileCatalog::_refreshProgressBar () { - - // check if progress bar is visible -/* Glib::ListHandle list = buttonBar2->get_children (); - Glib::ListHandle::iterator i = list.begin (); - for (; i!=list.end() && *i!=progressBar; i++); - if (i==list.end()) { - buttonBar2->pack_start (*progressBar, Gtk::PACK_SHRINK, 4); - buttonBar2->reorder_child (*progressBar, 2); - } -*/ - progressBar->show (); - if (previewsToLoad>0) - progressBar->set_fraction ((double)previewsLoaded / previewsToLoad); - else - progressBar->set_fraction (1.0); -} - -int refreshpb (void* data) { - - gdk_threads_enter (); - ((FileCatalog*)data)->_refreshProgressBar (); - gdk_threads_leave (); - return 0; -} - -void FileCatalog::previewReady (FileBrowserEntry* fdn) { - - // put it into the "full directory" browser - fdn->setImageAreaToolListener (iatlistener); - fileBrowser->addEntry (fdn); - - // update exif filter settings (minimal & maximal values of exif tags, cameras, lenses, etc...) - const CacheImageData* cfs = fdn->thumbnail->getCacheImageData(); - if (cfs->exifValid) { - if (cfs->fnumber < dirEFS.fnumberFrom) - dirEFS.fnumberFrom = cfs->fnumber; - if (cfs->fnumber > dirEFS.fnumberTo) - dirEFS.fnumberTo = cfs->fnumber; - if (cfs->shutter < dirEFS.shutterFrom) - dirEFS.shutterFrom = cfs->shutter; - if (cfs->shutter > dirEFS.shutterTo) - dirEFS.shutterTo = cfs->shutter; - if (cfs->iso>0 && (int)cfs->iso < dirEFS.isoFrom) - dirEFS.isoFrom = (int)cfs->iso; - if (cfs->iso>0 && (int)cfs->iso > dirEFS.isoTo) - dirEFS.isoTo = (int)cfs->iso; - if (cfs->focalLen < dirEFS.focalFrom) - dirEFS.focalFrom = cfs->focalLen; - if (cfs->focalLen > dirEFS.focalTo) - dirEFS.focalTo = cfs->focalLen; - } - dirEFS.cameras.insert (cfs->camera); - dirEFS.lenses.insert (cfs->lens); - previewsLoaded++; - g_idle_add (refreshpb, this); -} - -int prevfinished (void* data) { - - gdk_threads_enter(); - ((FileCatalog*)data)->_previewsFinished (); - gdk_threads_leave(); - return 0; -} - -void FileCatalog::_previewsFinished () { - - redrawAll (); - previewsToLoad = 0; - previewsLoaded = 0; -// removeIfThere (buttonBar2, progressBar); - progressBar->hide (); - if (filterPanel) { - filterPanel->set_sensitive (true); - if ( !hasValidCurrentEFS ){ - currentEFS = dirEFS; - filterPanel->setFilter ( dirEFS,true ); - }else { - filterPanel->setFilter ( currentEFS,false ); - } - } -} - -void FileCatalog::previewsFinished () { - - if (!hasValidCurrentEFS) - currentEFS = dirEFS; - g_idle_add (prevfinished, this); -} - -void PreviewLoader::remove (Glib::ustring fname) { - std::list::iterator i; - for (i=jqueue.begin(); i!=jqueue.end(); i++) - if (i->fullName==fname) - break; - if (i!=jqueue.end()) - jqueue.erase (i); -} - -void PreviewLoader::start () { - - jqueue.sort (); -} - -void PreviewLoader::process (DirEntry& current) { - - if (Glib::file_test (current.fullName, Glib::FILE_TEST_EXISTS)) { - Thumbnail* tmb = cacheMgr.getEntry (current.fullName); - if (tmb && pl) - pl->previewReady (new FileBrowserEntry (tmb, current.fullName)); - } -} - -void PreviewLoader::end () { - - if (pl) - pl->previewsFinished (); -} - -void FileCatalog::setEnabled (bool e) { - - enabled = e; -} - -void FileCatalog::redrawAll () { - - fileBrowser->queue_draw (); -} - -void FileCatalog::refreshAll () { - - fileBrowser->refreshThumbImages (); -} - -void FileCatalog::_openImage (std::vector tmb) { - - if (enabled && listener!=NULL) { - previewLoader.stop (); - thumbImageUpdater.stop (); - for (size_t i=0; igetFileName())==editedFiles.end()) - listener->fileSelected (tmb[i]); - tmb[i]->decreaseRef (); - } - previewLoader.process (); - thumbImageUpdater.process (); - } -} - -struct FCOIParams { - FileCatalog* catalog; - std::vector tmb; -}; - -int fcopenimg (void* p) { - - gdk_threads_enter (); - FCOIParams* params = (FCOIParams*)p; - params->catalog->_openImage (params->tmb); - delete params; - gdk_threads_leave (); - return 0; -} - -void FileCatalog::openRequested (std::vector tmb) { - - FCOIParams* params = new FCOIParams; - params->catalog = this; - params->tmb = tmb; - for (size_t i=0; iincreaseRef (); - g_idle_add (fcopenimg, params); -} - -void FileCatalog::deleteRequested (std::vector tbe) { - - if (tbe.size()==0) - return; - - Gtk::MessageDialog msd (M("FILEBROWSER_DELETEDLGLABEL"), false, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_YES_NO, true); - msd.set_secondary_text(Glib::ustring::compose (M("FILEBROWSER_DELETEDLGMSG"), tbe.size())); - - if (msd.run()==Gtk::RESPONSE_YES) { - for (unsigned int i=0; ifilename; - // remove from browser - FileBrowserEntry* t = fileBrowser->delEntry (fname); -// t->thumbnail->decreaseRef (); - delete t; - // remove from cache - cacheMgr.deleteEntry (fname); - // delete from file system - ::g_remove (fname.c_str()); - // delete paramfile if found - ::g_remove (Glib::ustring(fname+paramFileExtension).c_str()); - ::g_remove (Glib::ustring(removeExtension(fname)+paramFileExtension).c_str()); - // delete .thm file - ::g_remove (Glib::ustring(removeExtension(fname)+".thm").c_str()); - ::g_remove (Glib::ustring(removeExtension(fname)+".THM").c_str()); - } - redrawAll (); - } -} - -void FileCatalog::developRequested (std::vector tbe) { - - if (listener) { - thumbImageUpdater.stop (); - for (size_t i=0; ithumbnail->getProcParams(); - rtengine::ProcessingJob* pjob = rtengine::ProcessingJob::create (tbe[i]->filename, tbe[i]->thumbnail->getType()==FT_Raw, params); - double tmpscale; - rtengine::IImage8* img = tbe[i]->thumbnail->processThumbImage (params, options.maxThumbnailHeight, tmpscale); - if (img) { - int pw = img->getWidth (); - int ph = img->getHeight (); - guint8* prev = new guint8 [pw*ph*3]; - memcpy (prev, img->getData (), pw*ph*3); - img->free(); - listener->addBatchQueueJob (new BatchQueueEntry (pjob, params, tbe[i]->filename, prev, pw, ph, tbe[i]->thumbnail)); - } - else { - int pw, ph; - tbe[i]->thumbnail->getThumbnailSize (pw, ph); - listener->addBatchQueueJob (new BatchQueueEntry (pjob, params, tbe[i]->filename, NULL, pw, ph, tbe[i]->thumbnail)); - } - } - thumbImageUpdater.process (); - } -} - -void FileCatalog::renameRequested (std::vector tbe) { - - RenameDialog* renameDlg = new RenameDialog ((Gtk::Window*)get_toplevel()); - - for (size_t i=0; iinitName (Glib::path_get_basename (tbe[i]->filename), tbe[i]->thumbnail->getCacheImageData()); - - Glib::ustring ofname = tbe[i]->filename; - Glib::ustring dirName = Glib::path_get_dirname (tbe[i]->filename); - Glib::ustring baseName = Glib::path_get_basename (tbe[i]->filename); - - if (renameDlg->run ()== Gtk::RESPONSE_OK) { - Glib::ustring nBaseName = renameDlg->getNewName (); - // if path has directory components, exit - if (Glib::path_get_dirname (nBaseName) != ".") - continue; - // if no extension is given, concatenate the extension of the original file - Glib::ustring ext = getExtension (nBaseName); - if (ext=="") - nBaseName += "." + getExtension (baseName); - Glib::ustring nfname = Glib::build_filename (dirName, nBaseName); - if (!::g_rename (ofname.c_str(), nfname.c_str())) { - cacheMgr.renameEntry (ofname, tbe[i]->thumbnail->getMD5(), nfname); - reparseDirectory (); - } - renameDlg->hide (); - } - } - delete renameDlg; -/* // ask for new file name - Gtk::Dialog dialog (M("FILEBROWSER_RENAMEDLGLABEL"), *((Gtk::Window*)get_toplevel()), true, true); - - dialog.add_button (Gtk::Stock::OK, Gtk::RESPONSE_OK); - dialog.add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); - - Gtk::Label l; - dialog.get_vbox()->pack_start (l, Gtk::PACK_SHRINK); - - Gtk::Entry nfentry; - - dialog.get_vbox()->pack_start (nfentry, Gtk::PACK_SHRINK); - dialog.get_vbox()->show_all (); - - nfentry.set_activates_default (true); - dialog.set_default_response (Gtk::RESPONSE_OK); - - for (int i=0; ifilename; - Glib::ustring dirName = Glib::path_get_dirname (tbe[i]->filename); - Glib::ustring baseName = Glib::path_get_basename (tbe[i]->filename); - - l.set_markup (Glib::ustring("") + Glib::ustring::compose (M("FILEBROWSER_RENAMEDLGMSG"), baseName) + Glib::ustring("")); - nfentry.set_text (baseName); - nfentry.select_region (0, baseName.size()); - - if (dialog.run ()== Gtk::RESPONSE_OK) { - Glib::ustring nBaseName = nfentry.get_text (); - // if path has directory components, exit - if (Glib::path_get_dirname (nBaseName) != ".") - continue; - // if no extension is given, concatenate the extension of the original file - if (nBaseName.find ('.')==nBaseName.npos) { - int lastdot = baseName.find_last_of ('.'); - nBaseName += "." + (lastdot!=Glib::ustring::npos ? baseName.substr (lastdot+1) : ""); - } - Glib::ustring nfname = Glib::build_filename (dirName, nBaseName); - if (!::g_rename (ofname.c_str(), nfname.c_str())) { - cacheMgr.renameEntry (ofname, tbe[i]->thumbnail->getMD5(), nfname); - // the remaining part (removing old and adding new entry) is done by the directory monitor - reparseDirectory (); -// on_dir_changed (Gio::File::create_for_path (nfname), Gio::File::create_for_path (nfname), Gio::FILE_MONITOR_EVENT_CHANGED, true); - } - } - } - */ -} - -void FileCatalog::categoryButtonToggled (Gtk::ToggleButton* b) { - - //was control key pressed - bool control_down = modifierKey & GDK_CONTROL_MASK; - - //was shift key pressed - bool shift_down = modifierKey & GDK_SHIFT_MASK; - - for (int i=0; i<8; i++) - bCateg[i].block (true); - - //button is already toggled when entering this function, so we switch it back to its initial state - b->set_active(!b->get_active()); - - //if both control and shift keys were pressed, do nothing - if (!(control_down && shift_down)) { - - fileBrowser->getScrollPosition (hScrollPos[lastScrollPos], vScrollPos[lastScrollPos]); - - //we look how many stars are already toggled on, if any - int toggled_stars_count=0, buttons=0, start_star=0, toggled_button=0; - - for (int i=0; i<8; i++) { - if (categoryButtons[i]->get_active()) { - if (i>0 && i<7) { - toggled_stars_count ++; - start_star = i; - } - buttons |= (1 << i); - } - if (categoryButtons[i] == b) toggled_button = i; - } - - //if no modifier key were pressed, we can switch-on the button, and clear all others - if (!(control_down || shift_down)) { - for (int i=0; i<8; i++) { - categoryButtons[i]->set_active (i==toggled_button); - } - } - //modifier key allowed only for stars - else if (toggled_button>0 && toggled_button<7) { - if (control_down) { - //control is pressed - if (toggled_stars_count == 1 && (buttons & (1 << toggled_button))) { - //we're deselecting the only star still active, so we activate the folder filter - categoryButtons[0]->set_active(true); - //and we deselect the toggled star - categoryButtons[toggled_button]->set_active (false); - } - else if (toggled_stars_count >= 1) { - //we toggle the state of a star (eventually another one than the only one selected) - categoryButtons[toggled_button]->set_active(!categoryButtons[toggled_button]->get_active()); - } - else { - //no star selected - //we deselect the 2 non star filters - if (buttons & 1 ) categoryButtons[0]->set_active(false); - if (buttons & (1 << 7)) categoryButtons[7]->set_active(false); - //and we toggle on the star - categoryButtons[toggled_button]->set_active (true); - } - } - else { - //shift is pressed, only allowed if 0 or 1 star is selected - if (!toggled_stars_count) { - //we deselect the 2 non star filters - if (buttons & 1 ) categoryButtons[0]->set_active(false); - if (buttons & (1 << 7)) categoryButtons[7]->set_active(false); - //and we set the start star to 1 (unrated images) - start_star = 1; - //we act as if one star were selected - toggled_stars_count = 1; - } - if (toggled_stars_count == 1) { - int current_star=MIN(start_star,toggled_button); - int last_star =MAX(start_star,toggled_button); - //we permute the start and the end star for the next loop - for (; current_star <= last_star; current_star++) { - //we toggle on all the star in the range - if (!(buttons & (1 << current_star))) categoryButtons[current_star]->set_active(true); - } - } - //if more than one star selected, do nothing - } - } - - //so set the right images - for (int i=0; i<5; i++) { - bool active_now, active_before; - active_now = bRank[i]->get_active(); - active_before = buttons & (1 << (i+2)); - if ( active_now && !active_before) bRank[i]->set_image (*iranked[i]); - else if (!active_now && active_before) bRank[i]->set_image (*igranked[i]); - } - - fileBrowser->applyFilter (getFilter ()); - - //rearrange panels according to the selected filter - removeIfThere (hBox, trashButtonBox); - if (bTrash->get_active ()) - hBox->pack_start (*trashButtonBox, Gtk::PACK_SHRINK, 4); - hBox->queue_draw (); - - fileBrowser->setScrollPosition (hScrollPos[lastScrollPos], vScrollPos[lastScrollPos]); - } - - for (int i=0; i<8; i++) - bCateg[i].block (false); -} - -BrowserFilter FileCatalog::getFilter () { - - BrowserFilter filter; - filter.showRanked[0] = bDir->get_active() || bUnRanked->get_active () || bTrash->get_active (); - for (int i=1; i<=5; i++) - filter.showRanked[i] = bDir->get_active() || bRank[i-1]->get_active () || bTrash->get_active (); - filter.showTrash = bDir->get_active() || bTrash->get_active (); - filter.showNotTrash = !bTrash->get_active (); - if (!filterPanel) - filter.exifFilterEnabled = false; - else { - if (!hasValidCurrentEFS) - filter.exifFilter = dirEFS; - else - filter.exifFilter = currentEFS; - filter.exifFilterEnabled = filterPanel->isEnabled (); - } - return filter; -} - -void FileCatalog::filterChanged () { - - fileBrowser->applyFilter (getFilter()); -} - -int FileCatalog::reparseDirectory () { - - if (selectedDirectory=="") - return 0; - - if (!Glib::file_test (selectedDirectory, Glib::FILE_TEST_IS_DIR)) { - closeDir (); - return 0; - } - - std::vector nfileNameList = getFileList (); - - // check if a thumbnailed file has been deleted - const std::vector& t = fileBrowser->getEntries (); - std::vector fileNamesToDel; - for (size_t i=0; ifilename, Glib::FILE_TEST_EXISTS)) - fileNamesToDel.push_back (t[i]->filename); - for (size_t i=0; idelEntry (fileNamesToDel[i]); - cacheMgr.deleteEntry (fileNamesToDel[i]); - } - - // check if a new file has been added - for (size_t i=0; i& file, const Glib::RefPtr& other_file, Gio::FileMonitorEvent event_type, bool internal) { - - if (!internal) - gdk_threads_enter(); - - if (event_type == Gio::FILE_MONITOR_EVENT_CREATED || event_type == Gio::FILE_MONITOR_EVENT_DELETED || event_type == Gio::FILE_MONITOR_EVENT_CHANGED) - reparseDirectory (); - - if (!internal) - gdk_threads_leave(); -} - -void FileCatalog::checkAndAddFile (Glib::RefPtr file) { - - if (!file ) - return; - if( !file->query_exists()) - return; - Glib::RefPtr info = safe_query_file_info(file); - if (info && info->get_file_type() != Gio::FILE_TYPE_DIRECTORY && (!info->is_hidden() || !options.fbShowHidden)) { - int lastdot = info->get_name().find_last_of ('.'); - if (options.is_extention_enabled(lastdot!=(int)Glib::ustring::npos ? info->get_name().substr (lastdot+1) : "")){ - previewLoader.add (DirEntry (file->get_parse_name())); - previewsToLoad++; - } - } -} - -void FileCatalog::addAndOpenFile (const Glib::ustring& fname) { - - Glib::RefPtr file = Gio::File::create_for_path (fname); - if (!file ) - return; - if( !file->query_exists()) - return; - Glib::RefPtr info = safe_query_file_info(file); - if( !info ) - return; - int lastdot = info->get_name().find_last_of ('.'); - if (options.is_extention_enabled(lastdot!=(int)Glib::ustring::npos ? info->get_name().substr (lastdot+1) : "")){ - // if supported, load thumbnail first - Thumbnail* tmb = cacheMgr.getEntry (file->get_parse_name()); - if (tmb) { - FileBrowserEntry* entry = new FileBrowserEntry (tmb, file->get_parse_name()); - previewReady (entry); - // open the file - FCOIParams* params = new FCOIParams; - params->catalog = this; - params->tmb.push_back (tmb); - tmb->increaseRef (); - g_idle_add (fcopenimg, params); - } - } -} - -void FileCatalog::emptyTrash () { - - const std::vector t = fileBrowser->getEntries (); - std::vector toDel; - for (size_t i=0; ithumbnail->getStage()==1) - toDel.push_back (((FileBrowserEntry*)t[i])); - deleteRequested (toDel); - trashChanged(); -} - -bool FileCatalog::trashIsEmpty () { - const std::vector t = fileBrowser->getEntries (); - for (size_t i=0; ithumbnail->getStage()==1) - return false; - - return true; -} - -void FileCatalog::zoomIn () { - - bool pLoad = previewLoader.runs(); - if (pLoad) - previewLoader.stop (); - - fileBrowser->zoomIn (); - - if (pLoad) - previewLoader.process (); -} -void FileCatalog::zoomOut () { - - bool pLoad = previewLoader.runs(); - if (pLoad) - previewLoader.stop (); - - fileBrowser->zoomOut (); - - if (pLoad) - previewLoader.process (); -} -void FileCatalog::refreshEditedState (const std::set& efiles) { - - editedFiles = efiles; - fileBrowser->refreshEditedState (efiles); -} - -void FileCatalog::selectionChanged (std::vector tbe) { - - if (fslistener) - fslistener->selectionChanged (tbe); -} - -void FileCatalog::exifFilterChanged () { - - currentEFS = filterPanel->getFilter (); - hasValidCurrentEFS = true; - fileBrowser->applyFilter (getFilter ()); -} - -void FileCatalog::setFilterPanel (FilterPanel* fpanel) { - - filterPanel = fpanel; - filterPanel->set_sensitive (false); - filterPanel->setFilterPanelListener (this); -} -void FileCatalog::trashChanged () { - if (trashIsEmpty()) { - bTrash->set_image(*iTrashEmpty); - } - else { - bTrash->set_image(*iTrashFull); - } -} - -bool FileCatalog::handleShortcutKey (GdkEventKey* event) { - - bool ctrl = event->state & GDK_CONTROL_MASK; - bool shift = event->state & GDK_SHIFT_MASK; - - modifierKey = event->state; - - switch(event->keyval) { - case GDK_1: - categoryButtonToggled(bRank[0]); - return true; - case GDK_2: - categoryButtonToggled(bRank[1]); - return true; - case GDK_3: - categoryButtonToggled(bRank[2]); - return true; - case GDK_4: - categoryButtonToggled(bRank[3]); - return true; - case GDK_5: - categoryButtonToggled(bRank[4]); - return true; - case GDK_grave: - categoryButtonToggled(bUnRanked); - return true; - case GDK_d: - case GDK_D: - categoryButtonToggled(bDir); - return true; - case GDK_t: - case GDK_T: - categoryButtonToggled(bTrash); - return true; - } - - if (!ctrl) { - switch(event->keyval) { - case GDK_i: - case GDK_I: - exifInfo->set_active (!exifInfo->get_active()); - return true; - case GDK_plus: - case GDK_equal: - zoomIn(); - return true; - case GDK_minus: - case GDK_underscore: - zoomOut(); - return true; - } - } - else { - switch (event->keyval) { - } - } - - return false; -} - +/* + * 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define CHECKTIME 2000 + +extern Glib::ustring argv0; + +#ifdef _WIN32 +int _directoryUpdater (void* cat) { + + ((FileCatalog*)cat)->checkCounter++; + if (((FileCatalog*)cat)->checkCounter==2) { + gdk_threads_enter (); + ((FileCatalog*)cat)->reparseDirectory (); + gdk_threads_leave (); + } + return 1; +} +#endif + +FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb) : selectedDirectoryId(1), listener(NULL), fslistener(NULL), hasValidCurrentEFS(false), filterPanel(NULL), coarsePanel(cp), toolBar(tb) { + + // construct and initialize thumbnail browsers + fileBrowser = new FileBrowser(); + fileBrowser->setFileBrowserListener (this); + fileBrowser->setArrangement (ThumbBrowserBase::TB_Vertical); + fileBrowser->show (); + + set_size_request(0,250); + // construct trash panel with the extra "empty trash" button + trashButtonBox = new Gtk::VBox; + Gtk::Button* emptyT = new Gtk::Button (M("FILEBROWSER_EMPTYTRASH")); + emptyT->set_tooltip_markup (M("FILEBROWSER_EMPTYTRASHHINT")); + emptyT->set_image (*(new Gtk::Image (Gtk::StockID("gtk-delete"), Gtk::ICON_SIZE_BUTTON))); + emptyT->signal_pressed().connect (sigc::mem_fun(*this, &FileCatalog::emptyTrash)); + trashButtonBox->pack_start (*emptyT, Gtk::PACK_SHRINK, 4); + emptyT->show (); + trashButtonBox->show (); + + // setup button bar + buttonBar = new Gtk::HBox (); + pack_start (*buttonBar, Gtk::PACK_SHRINK); + + buttonBar->pack_start (*(new Gtk::VSeparator), Gtk::PACK_SHRINK); + bDir = new Gtk::ToggleButton (); + bDir->set_active (true); + bDir->set_image (*(new Gtk::Image (argv0+"/images/folder.png"))); + bDir->set_relief (Gtk::RELIEF_NONE); + bDir->set_tooltip_markup (M("FILEBROWSER_SHOWDIRHINT")); + bDir->signal_button_press_event().connect (sigc::mem_fun(*this, &FileCatalog::capture_event),false); + bCateg[0] = bDir->signal_toggled().connect (sigc::bind(sigc::mem_fun(*this, &FileCatalog::categoryButtonToggled), bDir)); + buttonBar->pack_start (*bDir, Gtk::PACK_SHRINK); + buttonBar->pack_start (*(new Gtk::VSeparator), Gtk::PACK_SHRINK); + + bUnRanked = new Gtk::ToggleButton (); + bUnRanked->set_active (false); + bUnRanked->set_image (*(new Gtk::Image (argv0+"/images/unrated.png"))); + bUnRanked->set_relief (Gtk::RELIEF_NONE); + bUnRanked->set_tooltip_markup (M("FILEBROWSER_SHOWUNRANKHINT")); + bCateg[1] = bUnRanked->signal_toggled().connect (sigc::bind(sigc::mem_fun(*this, &FileCatalog::categoryButtonToggled), bUnRanked)); + buttonBar->pack_start (*bUnRanked, Gtk::PACK_SHRINK); + bUnRanked->signal_button_press_event().connect (sigc::mem_fun(*this, &FileCatalog::capture_event),false); + + for (int i=0; i<5; i++) { + iranked[i] = new Gtk::Image (argv0+"/images/rated.png"); + igranked[i] = new Gtk::Image (argv0+"/images/grayrated.png"); + iranked[i]->show (); + igranked[i]->show (); + bRank[i] = new Gtk::ToggleButton (); + bRank[i]->set_image (*igranked[i]); + bRank[i]->set_relief (Gtk::RELIEF_NONE); + buttonBar->pack_start (*bRank[i], Gtk::PACK_SHRINK); + bCateg[i+2] = bRank[i]->signal_toggled().connect (sigc::bind(sigc::mem_fun(*this, &FileCatalog::categoryButtonToggled), bRank[i])); + bRank[i]->signal_button_press_event().connect (sigc::mem_fun(*this, &FileCatalog::capture_event),false); + } + bRank[0]->set_tooltip_markup (M("FILEBROWSER_SHOWRANK1HINT")); + bRank[1]->set_tooltip_markup (M("FILEBROWSER_SHOWRANK2HINT")); + bRank[2]->set_tooltip_markup (M("FILEBROWSER_SHOWRANK3HINT")); + bRank[3]->set_tooltip_markup (M("FILEBROWSER_SHOWRANK4HINT")); + bRank[4]->set_tooltip_markup (M("FILEBROWSER_SHOWRANK5HINT")); + buttonBar->pack_start (*(new Gtk::VSeparator), Gtk::PACK_SHRINK); + + iTrashEmpty = new Gtk::Image(argv0+"/images/trash-show-empty.png"); + iTrashFull = new Gtk::Image(argv0+"/images/trash-show-full.png"); + + bTrash = new Gtk::ToggleButton (); + bTrash->set_image (*iTrashEmpty); + bTrash->set_relief (Gtk::RELIEF_NONE); + bTrash->set_tooltip_markup (M("FILEBROWSER_SHOWTRASHHINT")); + bCateg[7] = bTrash->signal_toggled().connect (sigc::bind(sigc::mem_fun(*this, &FileCatalog::categoryButtonToggled), bTrash)); + bTrash->signal_button_press_event().connect (sigc::mem_fun(*this, &FileCatalog::capture_event),false); + buttonBar->pack_start (*bTrash, Gtk::PACK_SHRINK); + buttonBar->pack_start (*(new Gtk::VSeparator), Gtk::PACK_SHRINK); + fileBrowser->trash_changed().connect( sigc::mem_fun(*this, &FileCatalog::trashChanged) ); + + categoryButtons[0] = bDir; + categoryButtons[1] = bUnRanked; + for (int i=0; i<5; i++) + categoryButtons[i+2] = bRank[i]; + categoryButtons[7] = bTrash; + + exifInfo = Gtk::manage(new Gtk::ToggleButton ()); + exifInfo->set_image (*(new Gtk::Image (argv0+"/images/info.png"))); + exifInfo->set_relief (Gtk::RELIEF_NONE); + exifInfo->set_tooltip_markup (M("FILEBROWSER_SHOWEXIFINFO")); + exifInfo->set_active( options.showFileNames ); + exifInfo->signal_toggled().connect(sigc::mem_fun(*this, &FileCatalog::exifInfoButtonToggled)); + buttonBar->pack_start (*exifInfo, Gtk::PACK_SHRINK); + + // thumbnail zoom + Gtk::HBox* zoomBox = new Gtk::HBox (); + zoomInButton = new Gtk::Button (); + zoomInButton->set_image (*(new Gtk::Image (Gtk::StockID("gtk-zoom-in"), Gtk::ICON_SIZE_SMALL_TOOLBAR))); + zoomInButton->signal_pressed().connect (sigc::mem_fun(*this, &FileCatalog::zoomIn)); + zoomInButton->set_relief (Gtk::RELIEF_NONE); + zoomInButton->set_tooltip_markup (M("FILEBROWSER_ZOOMINHINT")); + zoomBox->pack_end (*zoomInButton, Gtk::PACK_SHRINK); + zoomOutButton = new Gtk::Button (); + zoomOutButton->set_image (*(new Gtk::Image (Gtk::StockID("gtk-zoom-out"), Gtk::ICON_SIZE_SMALL_TOOLBAR))); + zoomOutButton->signal_pressed().connect (sigc::mem_fun(*this, &FileCatalog::zoomOut)); + zoomOutButton->set_relief (Gtk::RELIEF_NONE); + zoomOutButton->set_tooltip_markup (M("FILEBROWSER_ZOOMOUTHINT")); + zoomBox->pack_end (*zoomOutButton, Gtk::PACK_SHRINK); + + // add default panel + hBox = new Gtk::HBox (); + hBox->show (); + hBox->pack_end (*fileBrowser); + fileBrowser->applyFilter (getFilter()); + pack_start (*hBox); + + buttonBar2 = new Gtk::HBox (); + pack_end (*buttonBar2, Gtk::PACK_SHRINK); + progressBar = new Gtk::ProgressBar (); + buttonBar2->pack_start (*progressBar, Gtk::PACK_SHRINK, 4); + progressBar->set_size_request (-1, 16); + + buttonBar->pack_start (*zoomBox, Gtk::PACK_SHRINK); + + buttonBar->pack_end (*coarsePanel, Gtk::PACK_SHRINK); + buttonBar->pack_end (*Gtk::manage(new Gtk::VSeparator), Gtk::PACK_SHRINK, 4); + buttonBar->pack_end (*toolBar, Gtk::PACK_SHRINK); + buttonBar->pack_end (*Gtk::manage(new Gtk::VSeparator), Gtk::PACK_SHRINK, 4); + + enabled = true; + + lastScrollPos = 0; + for (int i=0; i<8; i++) { + hScrollPos[i] = 0; + vScrollPos[i] = 0; + } + + selectedDirectory = ""; +#ifdef _WIN32 + wdMonitor = NULL; + checkCounter = 2; + g_timeout_add (CHECKTIME, _directoryUpdater, this); +#endif +} + +bool FileCatalog::capture_event(GdkEventButton* event){ + // need to record modifiers on the button press, because signal_toggled does not pass the event. + modifierKey = event->state; + return false; +} + +void FileCatalog::exifInfoButtonToggled() +{ + options.showFileNames = exifInfo->get_active(); + fileBrowser->refreshThumbImages (); +} + +void FileCatalog::on_realize() { + + Gtk::VBox::on_realize(); + Pango::FontDescription fontd = get_pango_context()->get_font_description (); + fileBrowser->get_pango_context()->set_font_description (fontd); +// batchQueue->get_pango_context()->set_font_description (fontd); +} + +void FileCatalog::closeDir () { + + if (filterPanel) + filterPanel->set_sensitive (false); + +#ifndef _WIN32 + if (dirMonitor) + dirMonitor->cancel (); +#else + if (wdMonitor) { + delete wdMonitor; + wdMonitor = NULL; + } +#endif + + // ignore old requests + ++selectedDirectoryId; + + // terminate thumbnail preview loading + previewLoader->removeAllJobs (); + + // terminate thumbnail updater + thumbImageUpdater->removeAllJobs (); + + // remove entries + selectedDirectory = ""; + fileBrowser->close (); + fileNameList.clear (); + + dirEFS.clear (); + hasValidCurrentEFS = false; + redrawAll (); +} + +std::vector FileCatalog::getFileList () { + + std::vector names; + Glib::RefPtr dir = Gio::File::create_for_path (selectedDirectory); + safe_build_file_list (dir, names, selectedDirectory); + return names; +} + +void FileCatalog::dirSelected (const Glib::ustring& dirname, const Glib::ustring& openfile) { + + try { + Glib::RefPtr dir = Gio::File::create_for_path (dirname); + + if (!dir) + return; + closeDir (); + previewsToLoad = 0; + previewsLoaded = 0; + // if openfile exists, we have to open it first (it is a command line argument) + if (openfile!="") + addAndOpenFile (openfile); + + selectedDirectory = dir->get_parse_name(); + fileNameList = getFileList (); + + for (unsigned int i=0; i f = Gio::File::create_for_path(fileNameList[i]); + if (f->get_parse_name() != openfile) // if we opened a file at the beginning don't add it again + checkAndAddFile (f); + } + + _refreshProgressBar (); + +#ifdef _WIN32 + wdMonitor = new WinDirMonitor (selectedDirectory, this); +#elif defined __APPLE__ + printf("TODO fix dir->monitor_directory () for OSX\n"); +#else + dirMonitor = dir->monitor_directory (); + dirMonitor->signal_changed().connect (sigc::bind(sigc::mem_fun(*this, &FileCatalog::on_dir_changed), false)); +#endif + } + catch (Glib::Exception& ex) { + std::cout << ex.what(); + } +} + +void FileCatalog::_refreshProgressBar () { + + // check if progress bar is visible +/* Glib::ListHandle list = buttonBar2->get_children (); + Glib::ListHandle::iterator i = list.begin (); + for (; i!=list.end() && *i!=progressBar; i++); + if (i==list.end()) { + buttonBar2->pack_start (*progressBar, Gtk::PACK_SHRINK, 4); + buttonBar2->reorder_child (*progressBar, 2); + } +*/ + progressBar->show (); + if (previewsToLoad>0) + progressBar->set_fraction ((double)previewsLoaded / previewsToLoad); + else + progressBar->set_fraction (1.0); +} + +int refreshpb (void* data) { + + gdk_threads_enter (); + ((FileCatalog*)data)->_refreshProgressBar (); + gdk_threads_leave (); + return 0; +} + +void FileCatalog::previewReady (int dir_id, FileBrowserEntry* fdn) { + + GThreadLock lock; + + if ( dir_id != selectedDirectoryId ) + { + return; + } + + // put it into the "full directory" browser + fdn->setImageAreaToolListener (iatlistener); + fileBrowser->addEntry (fdn); + + // update exif filter settings (minimal & maximal values of exif tags, cameras, lenses, etc...) + const CacheImageData* cfs = fdn->thumbnail->getCacheImageData(); + if (cfs->exifValid) { + if (cfs->fnumber < dirEFS.fnumberFrom) + dirEFS.fnumberFrom = cfs->fnumber; + if (cfs->fnumber > dirEFS.fnumberTo) + dirEFS.fnumberTo = cfs->fnumber; + if (cfs->shutter < dirEFS.shutterFrom) + dirEFS.shutterFrom = cfs->shutter; + if (cfs->shutter > dirEFS.shutterTo) + dirEFS.shutterTo = cfs->shutter; + if (cfs->iso>0 && (int)cfs->iso < dirEFS.isoFrom) + dirEFS.isoFrom = (int)cfs->iso; + if (cfs->iso>0 && (int)cfs->iso > dirEFS.isoTo) + dirEFS.isoTo = (int)cfs->iso; + if (cfs->focalLen < dirEFS.focalFrom) + dirEFS.focalFrom = cfs->focalLen; + if (cfs->focalLen > dirEFS.focalTo) + dirEFS.focalTo = cfs->focalLen; + } + dirEFS.cameras.insert (cfs->camera); + dirEFS.lenses.insert (cfs->lens); + previewsLoaded++; + g_idle_add (refreshpb, this); +} + +int prevfinished (void* data) { + + gdk_threads_enter(); + ((FileCatalog*)data)->_previewsFinished (); + gdk_threads_leave(); + return 0; +} + +void FileCatalog::_previewsFinished () { + + redrawAll (); + previewsToLoad = 0; + previewsLoaded = 0; +// removeIfThere (buttonBar2, progressBar); + progressBar->hide (); + if (filterPanel) { + filterPanel->set_sensitive (true); + if ( !hasValidCurrentEFS ){ + currentEFS = dirEFS; + filterPanel->setFilter ( dirEFS,true ); + }else { + filterPanel->setFilter ( currentEFS,false ); + } + } + // restart anything that might have been loaded low quality + fileBrowser->refreshQuickThumbImages(); +} + +void FileCatalog::previewsFinished (int dir_id) { + + GThreadLock lock; + + if ( dir_id != selectedDirectoryId ) + { + return; + } + + if (!hasValidCurrentEFS) + currentEFS = dirEFS; + g_idle_add (prevfinished, this); +} + +void FileCatalog::setEnabled (bool e) { + + enabled = e; +} + +void FileCatalog::redrawAll () { + + fileBrowser->queue_draw (); +} + +void FileCatalog::refreshAll () { + + fileBrowser->refreshThumbImages (); +} + +void FileCatalog::_openImage (std::vector tmb) { + + if (enabled && listener!=NULL) { + for (size_t i=0; igetFileName())==editedFiles.end()) + listener->fileSelected (tmb[i]); + tmb[i]->decreaseRef (); + } + } +} + +struct FCOIParams { + FileCatalog* catalog; + std::vector tmb; +}; + +int fcopenimg (void* p) { + + gdk_threads_enter (); + FCOIParams* params = (FCOIParams*)p; + params->catalog->_openImage (params->tmb); + delete params; + gdk_threads_leave (); + return 0; +} + +void FileCatalog::openRequested (std::vector tmb) { + + FCOIParams* params = new FCOIParams; + params->catalog = this; + params->tmb = tmb; + for (size_t i=0; iincreaseRef (); + g_idle_add (fcopenimg, params); +} + +void FileCatalog::deleteRequested (std::vector tbe) { + + if (tbe.size()==0) + return; + + Gtk::MessageDialog msd (M("FILEBROWSER_DELETEDLGLABEL"), false, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_YES_NO, true); + msd.set_secondary_text(Glib::ustring::compose (M("FILEBROWSER_DELETEDLGMSG"), tbe.size())); + + if (msd.run()==Gtk::RESPONSE_YES) { + for (unsigned int i=0; ifilename; + // remove from browser + FileBrowserEntry* t = fileBrowser->delEntry (fname); +// t->thumbnail->decreaseRef (); + delete t; + // remove from cache + cacheMgr->deleteEntry (fname); + // delete from file system + ::g_remove (fname.c_str()); + // delete paramfile if found + ::g_remove (Glib::ustring(fname+paramFileExtension).c_str()); + ::g_remove (Glib::ustring(removeExtension(fname)+paramFileExtension).c_str()); + // delete .thm file + ::g_remove (Glib::ustring(removeExtension(fname)+".thm").c_str()); + ::g_remove (Glib::ustring(removeExtension(fname)+".THM").c_str()); + } + redrawAll (); + } +} + +void FileCatalog::developRequested (std::vector tbe) { + + if (listener) { + for (size_t i=0; ithumbnail->getProcParams(); + rtengine::ProcessingJob* pjob = rtengine::ProcessingJob::create (tbe[i]->filename, tbe[i]->thumbnail->getType()==FT_Raw, params); + double tmpscale; + rtengine::IImage8* img = tbe[i]->thumbnail->processThumbImage (params, options.maxThumbnailHeight, tmpscale); + if (img) { + int pw = img->getWidth (); + int ph = img->getHeight (); + guint8* prev = new guint8 [pw*ph*3]; + memcpy (prev, img->getData (), pw*ph*3); + img->free(); + listener->addBatchQueueJob (new BatchQueueEntry (pjob, params, tbe[i]->filename, prev, pw, ph, tbe[i]->thumbnail)); + } + else { + int pw, ph; + tbe[i]->thumbnail->getThumbnailSize (pw, ph); + listener->addBatchQueueJob (new BatchQueueEntry (pjob, params, tbe[i]->filename, NULL, pw, ph, tbe[i]->thumbnail)); + } + } + } +} + +void FileCatalog::renameRequested (std::vector tbe) { + + RenameDialog* renameDlg = new RenameDialog ((Gtk::Window*)get_toplevel()); + + for (size_t i=0; iinitName (Glib::path_get_basename (tbe[i]->filename), tbe[i]->thumbnail->getCacheImageData()); + + Glib::ustring ofname = tbe[i]->filename; + Glib::ustring dirName = Glib::path_get_dirname (tbe[i]->filename); + Glib::ustring baseName = Glib::path_get_basename (tbe[i]->filename); + + if (renameDlg->run ()== Gtk::RESPONSE_OK) { + Glib::ustring nBaseName = renameDlg->getNewName (); + // if path has directory components, exit + if (Glib::path_get_dirname (nBaseName) != ".") + continue; + // if no extension is given, concatenate the extension of the original file + Glib::ustring ext = getExtension (nBaseName); + if (ext=="") + nBaseName += "." + getExtension (baseName); + Glib::ustring nfname = Glib::build_filename (dirName, nBaseName); + if (!::g_rename (ofname.c_str(), nfname.c_str())) { + cacheMgr->renameEntry (ofname, tbe[i]->thumbnail->getMD5(), nfname); + reparseDirectory (); + } + renameDlg->hide (); + } + } + delete renameDlg; +/* // ask for new file name + Gtk::Dialog dialog (M("FILEBROWSER_RENAMEDLGLABEL"), *((Gtk::Window*)get_toplevel()), true, true); + + dialog.add_button (Gtk::Stock::OK, Gtk::RESPONSE_OK); + dialog.add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); + + Gtk::Label l; + dialog.get_vbox()->pack_start (l, Gtk::PACK_SHRINK); + + Gtk::Entry nfentry; + + dialog.get_vbox()->pack_start (nfentry, Gtk::PACK_SHRINK); + dialog.get_vbox()->show_all (); + + nfentry.set_activates_default (true); + dialog.set_default_response (Gtk::RESPONSE_OK); + + for (int i=0; ifilename; + Glib::ustring dirName = Glib::path_get_dirname (tbe[i]->filename); + Glib::ustring baseName = Glib::path_get_basename (tbe[i]->filename); + + l.set_markup (Glib::ustring("") + Glib::ustring::compose (M("FILEBROWSER_RENAMEDLGMSG"), baseName) + Glib::ustring("")); + nfentry.set_text (baseName); + nfentry.select_region (0, baseName.size()); + + if (dialog.run ()== Gtk::RESPONSE_OK) { + Glib::ustring nBaseName = nfentry.get_text (); + // if path has directory components, exit + if (Glib::path_get_dirname (nBaseName) != ".") + continue; + // if no extension is given, concatenate the extension of the original file + if (nBaseName.find ('.')==nBaseName.npos) { + int lastdot = baseName.find_last_of ('.'); + nBaseName += "." + (lastdot!=Glib::ustring::npos ? baseName.substr (lastdot+1) : ""); + } + Glib::ustring nfname = Glib::build_filename (dirName, nBaseName); + if (!::g_rename (ofname.c_str(), nfname.c_str())) { + cacheMgr->renameEntry (ofname, tbe[i]->thumbnail->getMD5(), nfname); + // the remaining part (removing old and adding new entry) is done by the directory monitor + reparseDirectory (); +// on_dir_changed (Gio::File::create_for_path (nfname), Gio::File::create_for_path (nfname), Gio::FILE_MONITOR_EVENT_CHANGED, true); + } + } + } + */ +} + +void FileCatalog::categoryButtonToggled (Gtk::ToggleButton* b) { + + //was control key pressed + bool control_down = modifierKey & GDK_CONTROL_MASK; + + //was shift key pressed + bool shift_down = modifierKey & GDK_SHIFT_MASK; + + for (int i=0; i<8; i++) + bCateg[i].block (true); + + //button is already toggled when entering this function, so we switch it back to its initial state + b->set_active(!b->get_active()); + + //if both control and shift keys were pressed, do nothing + if (!(control_down && shift_down)) { + + fileBrowser->getScrollPosition (hScrollPos[lastScrollPos], vScrollPos[lastScrollPos]); + + //we look how many stars are already toggled on, if any + int toggled_stars_count=0, buttons=0, start_star=0, toggled_button=0; + + for (int i=0; i<8; i++) { + if (categoryButtons[i]->get_active()) { + if (i>0 && i<7) { + toggled_stars_count ++; + start_star = i; + } + buttons |= (1 << i); + } + if (categoryButtons[i] == b) toggled_button = i; + } + + //if no modifier key were pressed, we can switch-on the button, and clear all others + if (!(control_down || shift_down)) { + for (int i=0; i<8; i++) { + categoryButtons[i]->set_active (i==toggled_button); + } + } + //modifier key allowed only for stars + else if (toggled_button>0 && toggled_button<7) { + if (control_down) { + //control is pressed + if (toggled_stars_count == 1 && (buttons & (1 << toggled_button))) { + //we're deselecting the only star still active, so we activate the folder filter + categoryButtons[0]->set_active(true); + //and we deselect the toggled star + categoryButtons[toggled_button]->set_active (false); + } + else if (toggled_stars_count >= 1) { + //we toggle the state of a star (eventually another one than the only one selected) + categoryButtons[toggled_button]->set_active(!categoryButtons[toggled_button]->get_active()); + } + else { + //no star selected + //we deselect the 2 non star filters + if (buttons & 1 ) categoryButtons[0]->set_active(false); + if (buttons & (1 << 7)) categoryButtons[7]->set_active(false); + //and we toggle on the star + categoryButtons[toggled_button]->set_active (true); + } + } + else { + //shift is pressed, only allowed if 0 or 1 star is selected + if (!toggled_stars_count) { + //we deselect the 2 non star filters + if (buttons & 1 ) categoryButtons[0]->set_active(false); + if (buttons & (1 << 7)) categoryButtons[7]->set_active(false); + //and we set the start star to 1 (unrated images) + start_star = 1; + //we act as if one star were selected + toggled_stars_count = 1; + } + if (toggled_stars_count == 1) { + int current_star=MIN(start_star,toggled_button); + int last_star =MAX(start_star,toggled_button); + //we permute the start and the end star for the next loop + for (; current_star <= last_star; current_star++) { + //we toggle on all the star in the range + if (!(buttons & (1 << current_star))) categoryButtons[current_star]->set_active(true); + } + } + //if more than one star selected, do nothing + } + } + + //so set the right images + for (int i=0; i<5; i++) { + bool active_now, active_before; + active_now = bRank[i]->get_active(); + active_before = buttons & (1 << (i+2)); + if ( active_now && !active_before) bRank[i]->set_image (*iranked[i]); + else if (!active_now && active_before) bRank[i]->set_image (*igranked[i]); + } + + fileBrowser->applyFilter (getFilter ()); + + //rearrange panels according to the selected filter + removeIfThere (hBox, trashButtonBox); + if (bTrash->get_active ()) + hBox->pack_start (*trashButtonBox, Gtk::PACK_SHRINK, 4); + hBox->queue_draw (); + + fileBrowser->setScrollPosition (hScrollPos[lastScrollPos], vScrollPos[lastScrollPos]); + } + + for (int i=0; i<8; i++) + bCateg[i].block (false); +} + +BrowserFilter FileCatalog::getFilter () { + + BrowserFilter filter; + filter.showRanked[0] = bDir->get_active() || bUnRanked->get_active () || bTrash->get_active (); + for (int i=1; i<=5; i++) + filter.showRanked[i] = bDir->get_active() || bRank[i-1]->get_active () || bTrash->get_active (); + filter.showTrash = bDir->get_active() || bTrash->get_active (); + filter.showNotTrash = !bTrash->get_active (); + if (!filterPanel) + filter.exifFilterEnabled = false; + else { + if (!hasValidCurrentEFS) + filter.exifFilter = dirEFS; + else + filter.exifFilter = currentEFS; + filter.exifFilterEnabled = filterPanel->isEnabled (); + } + return filter; +} + +void FileCatalog::filterChanged () { + + fileBrowser->applyFilter (getFilter()); +} + +int FileCatalog::reparseDirectory () { + + if (selectedDirectory=="") + return 0; + + if (!Glib::file_test (selectedDirectory, Glib::FILE_TEST_IS_DIR)) { + closeDir (); + return 0; + } + + std::vector nfileNameList = getFileList (); + + // check if a thumbnailed file has been deleted + const std::vector& t = fileBrowser->getEntries (); + std::vector fileNamesToDel; + for (size_t i=0; ifilename, Glib::FILE_TEST_EXISTS)) + fileNamesToDel.push_back (t[i]->filename); + for (size_t i=0; idelEntry (fileNamesToDel[i]); + cacheMgr->deleteEntry (fileNamesToDel[i]); + } + + // check if a new file has been added + for (size_t i=0; i& file, const Glib::RefPtr& other_file, Gio::FileMonitorEvent event_type, bool internal) { + + if (!internal) + gdk_threads_enter(); + + if (event_type == Gio::FILE_MONITOR_EVENT_CREATED || event_type == Gio::FILE_MONITOR_EVENT_DELETED || event_type == Gio::FILE_MONITOR_EVENT_CHANGED) + reparseDirectory (); + + if (!internal) + gdk_threads_leave(); +} + +void FileCatalog::checkAndAddFile (Glib::RefPtr file) { + + if (!file ) + return; + if( !file->query_exists()) + return; + Glib::RefPtr info = safe_query_file_info(file); + if (info && info->get_file_type() != Gio::FILE_TYPE_DIRECTORY && (!info->is_hidden() || !options.fbShowHidden)) { + int lastdot = info->get_name().find_last_of ('.'); + if (options.is_extention_enabled(lastdot!=(int)Glib::ustring::npos ? info->get_name().substr (lastdot+1) : "")){ + previewLoader->add (selectedDirectoryId,file->get_parse_name(),this); + previewsToLoad++; + } + } +} + +void FileCatalog::addAndOpenFile (const Glib::ustring& fname) { + + Glib::RefPtr file = Gio::File::create_for_path (fname); + if (!file ) + return; + if( !file->query_exists()) + return; + Glib::RefPtr info = safe_query_file_info(file); + if( !info ) + return; + int lastdot = info->get_name().find_last_of ('.'); + if (options.is_extention_enabled(lastdot!=(int)Glib::ustring::npos ? info->get_name().substr (lastdot+1) : "")){ + // if supported, load thumbnail first + Thumbnail* tmb = cacheMgr->getEntry (file->get_parse_name()); + if (tmb) { + FileBrowserEntry* entry = new FileBrowserEntry (tmb, file->get_parse_name()); + previewReady (selectedDirectoryId,entry); + // open the file + FCOIParams* params = new FCOIParams; + params->catalog = this; + params->tmb.push_back (tmb); + tmb->increaseRef (); + g_idle_add (fcopenimg, params); + } + } +} + +void FileCatalog::emptyTrash () { + + const std::vector t = fileBrowser->getEntries (); + std::vector toDel; + for (size_t i=0; ithumbnail->getStage()==1) + toDel.push_back (((FileBrowserEntry*)t[i])); + deleteRequested (toDel); + trashChanged(); +} + +bool FileCatalog::trashIsEmpty () { + const std::vector t = fileBrowser->getEntries (); + for (size_t i=0; ithumbnail->getStage()==1) + return false; + + return true; +} + +void FileCatalog::zoomIn () { + + + fileBrowser->zoomIn (); + +} +void FileCatalog::zoomOut () { + + + fileBrowser->zoomOut (); + +} +void FileCatalog::refreshEditedState (const std::set& efiles) { + + editedFiles = efiles; + fileBrowser->refreshEditedState (efiles); +} + +void FileCatalog::selectionChanged (std::vector tbe) { + + if (fslistener) + fslistener->selectionChanged (tbe); +} + +void FileCatalog::exifFilterChanged () { + + currentEFS = filterPanel->getFilter (); + hasValidCurrentEFS = true; + fileBrowser->applyFilter (getFilter ()); +} + +void FileCatalog::setFilterPanel (FilterPanel* fpanel) { + + filterPanel = fpanel; + filterPanel->set_sensitive (false); + filterPanel->setFilterPanelListener (this); +} +void FileCatalog::trashChanged () { + if (trashIsEmpty()) { + bTrash->set_image(*iTrashEmpty); + } + else { + bTrash->set_image(*iTrashFull); + } +} + +bool FileCatalog::handleShortcutKey (GdkEventKey* event) { + + bool ctrl = event->state & GDK_CONTROL_MASK; + bool shift = event->state & GDK_SHIFT_MASK; + + modifierKey = event->state; + + switch(event->keyval) { + case GDK_1: + categoryButtonToggled(bRank[0]); + return true; + case GDK_2: + categoryButtonToggled(bRank[1]); + return true; + case GDK_3: + categoryButtonToggled(bRank[2]); + return true; + case GDK_4: + categoryButtonToggled(bRank[3]); + return true; + case GDK_5: + categoryButtonToggled(bRank[4]); + return true; + case GDK_grave: + categoryButtonToggled(bUnRanked); + return true; + case GDK_d: + case GDK_D: + categoryButtonToggled(bDir); + return true; + case GDK_t: + case GDK_T: + categoryButtonToggled(bTrash); + return true; + } + + if (!ctrl) { + switch(event->keyval) { + case GDK_i: + case GDK_I: + exifInfo->set_active (!exifInfo->get_active()); + return true; + case GDK_plus: + case GDK_equal: + zoomIn(); + return true; + case GDK_minus: + case GDK_underscore: + zoomOut(); + return true; + } + } + else { + switch (event->keyval) { + } + } + + return false; +} diff --git a/rtgui/filecatalog.h b/rtgui/filecatalog.h index a23e5b893..85e669c23 100644 --- a/rtgui/filecatalog.h +++ b/rtgui/filecatalog.h @@ -33,12 +33,7 @@ #include #include #include - -class PreviewLoaderListener { - public: - virtual void previewReady (FileBrowserEntry* fd) {} - virtual void previewsFinished () {} -}; +#include class DirEntry { @@ -52,22 +47,7 @@ class DirEntry { } }; -class PreviewLoader : public ProcessingThread { - - protected: - PreviewLoaderListener* pl; - - public: - PreviewLoader () : pl(NULL) { ProcessingThread(); } - void setPreviewLoaderListener (PreviewLoaderListener* p) { pl = p; } - void start (); - void process () { ProcessingThread::process (); } - void process (DirEntry& current); - void remove (Glib::ustring fname); - void end (); -}; - -class FileCatalog : public Gtk::VBox, +class FileCatalog : public Gtk::VBox, public DirSelectionListener, public PreviewLoaderListener, public FilterPanelListener, @@ -77,14 +57,15 @@ class FileCatalog : public Gtk::VBox, #endif { - // thumbnail browsers - FileBrowser* fileBrowser; - + Gtk::HBox* hBox; Glib::ustring selectedDirectory; + int selectedDirectoryId; bool enabled; - PreviewLoader previewLoader; + // Restore PreviewLoader if the new threadsafe is not that threadsafe ;-) + //PreviewLoader previewLoader; + //PreviewMultiLoader previewLoader; FileSelectionListener* listener; FileSelectionChangeListener* fslistener; ImageAreaToolListener* iatlistener; @@ -141,6 +122,9 @@ class FileCatalog : public Gtk::VBox, void trashChanged (); public: + // thumbnail browsers + FileBrowser* fileBrowser; + CoarsePanel* coarsePanel; ToolBar* toolBar; @@ -150,8 +134,8 @@ class FileCatalog : public Gtk::VBox, void refreshEditedState (const std::set& efiles); // previewloaderlistener interface - void previewReady (FileBrowserEntry* fdn); - void previewsFinished (); + void previewReady (int dir_id, FileBrowserEntry* fdn); + void previewsFinished (int dir_id); void _previewsFinished (); void _refreshProgressBar (); diff --git a/rtgui/filepanel.cc b/rtgui/filepanel.cc index dfe67ac77..c59e6c716 100644 --- a/rtgui/filepanel.cc +++ b/rtgui/filepanel.cc @@ -1,3 +1,4 @@ + /* * This file is part of RawTherapee. * @@ -30,6 +31,7 @@ int fbinit (void* data) { FilePanel::FilePanel () : parent(NULL) { + isloading = false; dirpaned = new Gtk::HPaned (); dirpaned->set_position (options.dirBrowserWidth); @@ -52,8 +54,10 @@ FilePanel::FilePanel () : parent(NULL) { tpc = new BatchToolPanelCoordinator (this); fileCatalog = new FileCatalog (tpc->coarse, tpc->getToolBar()); - fileCatalog->set_size_request(50,150); - dirpaned->pack2 (*fileCatalog, true, true); + ribbonPane = new Gtk::Paned(); + ribbonPane->add(*fileCatalog); + ribbonPane->set_size_request(50,150); + dirpaned->pack2 (*ribbonPane, true, true); placesBrowser->setDirBrowserRemoteInterface (dirBrowser); recentBrowser->setDirBrowserRemoteInterface (dirBrowser); @@ -61,12 +65,12 @@ FilePanel::FilePanel () : parent(NULL) { dirBrowser->addDirSelectionListener (recentBrowser); dirBrowser->addDirSelectionListener (placesBrowser); fileCatalog->setFileSelectionListener (this); - + rightBox = new Gtk::HBox (); rightBox->set_size_request(50,100); rightNotebook = new Gtk::Notebook (); Gtk::VBox* taggingBox = new Gtk::VBox (); - + history = new History (false); tpc->addPParamsChangeListener (history); @@ -79,11 +83,11 @@ FilePanel::FilePanel () : parent(NULL) { fileCatalog->setFilterPanel (filterPanel); fileCatalog->setImageAreaToolListener (tpc); - + //------------------ rightNotebook->set_tab_pos (Gtk::POS_LEFT); - + Gtk::Label* devLab = new Gtk::Label (M("MAIN_TAB_DEVELOP")); devLab->set_angle (90); Gtk::Label* filtLab = new Gtk::Label (M("MAIN_TAB_FILTER")); @@ -94,7 +98,7 @@ FilePanel::FilePanel () : parent(NULL) { tpcPaned = new Gtk::VPaned (); tpcPaned->pack1 (*tpc->toolPanelNotebook, false, true); tpcPaned->pack2 (*history, true, true); - + rightNotebook->append_page (*tpcPaned, *devLab); rightNotebook->append_page (*sFilterPanel, *filtLab); rightNotebook->append_page (*taggingBox, *tagLab); @@ -144,7 +148,11 @@ bool FilePanel::fileSelected (Thumbnail* thm) { return false; // try to open the file - fileCatalog->setEnabled (false); + // fileCatalog->setEnabled (false); + if (isloading) + return false; + + isloading = true; ProgressConnector *ld = new ProgressConnector(); ld->startFunc (sigc::bind(sigc::ptr_fun(&rtengine::InitialImage::load), thm->getFileName (), thm->getType()==FT_Raw, &error, parent->getProgressListener()), sigc::bind(sigc::mem_fun(*this,&FilePanel::imageLoaded), thm, ld) ); @@ -153,19 +161,29 @@ bool FilePanel::fileSelected (Thumbnail* thm) { bool FilePanel::imageLoaded( Thumbnail* thm, ProgressConnector *pc ){ if (pc->returnValue() && thm) { - EditorPanel* epanel = Gtk::manage (new EditorPanel ()); - parent->addEditorPanel (epanel,Glib::path_get_basename (thm->getFileName())); - epanel->open(thm, pc->returnValue() ); + + if (options.tabbedUI){ + EditorPanel* epanel = Gtk::manage (new EditorPanel ()); + parent->addEditorPanel (epanel,Glib::path_get_basename (thm->getFileName())); + epanel->open(thm, pc->returnValue() ); + } + else{ + parent->SetEditorCurrent(); + parent->epanel->open(thm, pc->returnValue() ); + } + + }else { Glib::ustring msg_ = Glib::ustring("") + M("MAIN_MSG_CANNOTLOAD") + " \"" + thm->getFileName() + "\" .\n"; Gtk::MessageDialog msgd (msg_, true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); msgd.run (); } delete pc; - + parent->setProgress(0.); parent->setProgressStr(""); - fileCatalog->setEnabled (true); + isloading = false; + return false; // MUST return false from idle function } @@ -177,9 +195,9 @@ void FilePanel::saveOptions () { options.dirBrowserHeight = placespaned->get_position (); options.browserToolPanelWidth = winW - get_position(); options.browserToolPanelHeight = tpcPaned->get_position (); - if (options.startupDir==STARTUPDIR_LAST && fileCatalog->lastSelectedDir ()!="") + if (options.startupDir==STARTUPDIR_LAST && fileCatalog->lastSelectedDir ()!="") options.startupPath = fileCatalog->lastSelectedDir (); - fileCatalog->closeDir (); + fileCatalog->closeDir (); } void FilePanel::open (const Glib::ustring& d) { @@ -225,4 +243,3 @@ bool FilePanel::handleShortcutKey (GdkEventKey* event) { return false; } - diff --git a/rtgui/filepanel.h b/rtgui/filepanel.h index bfdf38cf4..0cef8b289 100644 --- a/rtgui/filepanel.h +++ b/rtgui/filepanel.h @@ -1,80 +1,85 @@ -/* - * 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 . - */ -#ifndef _FILEPANEL_ -#define _FILEPANEL_ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -class RTWindow; -class FilePanel : public Gtk::HPaned, - public FileSelectionListener, - public PParamsChangeListener -{ - - protected: - Gtk::VPaned* placespaned; - Gtk::HPaned* dirpaned; - DirBrowser* dirBrowser; - PlacesBrowser* placesBrowser; - RecentBrowser* recentBrowser; - FileCatalog* fileCatalog; // filecatalog is the file browser with the button bar above it - Gtk::HBox* rightBox; - Gtk::VPaned* tpcPaned; - BatchToolPanelCoordinator* tpc; - History* history; - FilterPanel* filterPanel; - RTWindow* parent; - Gtk::Notebook* rightNotebook; - - int error; - - public: - FilePanel (); - - void setParent (RTWindow* p) { parent = p; } - void init (); // dont call it directly, the constructor calls it as idle source - void setAspect(); - void open (const Glib::ustring& d); // open a file or a directory - void refreshEditedState (const std::set& efiles) { fileCatalog->refreshEditedState (efiles); } - - // call this before closeing rt: it saves file browser relating things into options - void saveOptions (); - - // interface fileselectionlistener - bool fileSelected (Thumbnail* thm); - bool addBatchQueueJob (BatchQueueEntry* bqe); - - void optionsChanged (); - bool imageLoaded( Thumbnail* thm, ProgressConnector * ); - - bool handleShortcutKey (GdkEventKey* event); -}; - -#endif - +/* + * 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 . + */ +#ifndef _FILEPANEL_ +#define _FILEPANEL_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class RTWindow; +class FilePanel : public Gtk::HPaned, + public FileSelectionListener, + public PParamsChangeListener +{ + + protected: + Gtk::Paned* placespaned; + Gtk::HPaned* dirpaned; + //DirBrowser* dirBrowser; + PlacesBrowser* placesBrowser; + RecentBrowser* recentBrowser; + // FileCatalog* fileCatalog; // filecatalog is the file browser with the button bar above it + Gtk::HBox* rightBox; + Gtk::VPaned* tpcPaned; + BatchToolPanelCoordinator* tpc; + History* history; + //FilterPanel* filterPanel; + RTWindow* parent; + Gtk::Notebook* rightNotebook; + + int error; + bool isloading; + public: + FilePanel (); + + DirBrowser* dirBrowser; + FilterPanel* filterPanel; + FileCatalog* fileCatalog; + Gtk::Paned *ribbonPane; + + void setParent (RTWindow* p) { parent = p; } + void init (); // dont call it directly, the constructor calls it as idle source + void setAspect(); + void open (const Glib::ustring& d); // open a file or a directory + void refreshEditedState (const std::set& efiles) { fileCatalog->refreshEditedState (efiles); } + + // call this before closeing rt: it saves file browser relating things into options + void saveOptions (); + + // interface fileselectionlistener + bool fileSelected (Thumbnail* thm); + bool addBatchQueueJob (BatchQueueEntry* bqe); + + void optionsChanged (); + bool imageLoaded( Thumbnail* thm, ProgressConnector * ); + + bool handleShortcutKey (GdkEventKey* event); +}; + +#endif + diff --git a/rtgui/filethumbnailbuttonset.cc b/rtgui/filethumbnailbuttonset.cc index 96bfa380e..78954cd3f 100644 --- a/rtgui/filethumbnailbuttonset.cc +++ b/rtgui/filethumbnailbuttonset.cc @@ -43,23 +43,23 @@ FileThumbnailButtonSet::FileThumbnailButtonSet (FileBrowserEntry* myEntry) { iconsLoaded = true; } + add (new LWButton (processIcon, 6, myEntry, LWButton::Left, LWButton::Center, M("FILEBROWSER_POPUPPROCESS"))); add (new LWButton (unRankIcon, 0, myEntry, LWButton::Left, LWButton::Center, M("FILEBROWSER_POPUPUNRANK"))); for (int i=0; i<5; i++) - add (new LWButton (rankIcon, i+1, myEntry, LWButton::Left)); - add (new LWButton (processIcon, 6, myEntry, LWButton::Right, LWButton::Center, M("FILEBROWSER_POPUPPROCESS"))); + add (new LWButton (rankIcon, i+1, myEntry, LWButton::Left)); add (new LWButton (trashIcon, 7, myEntry, LWButton::Right, LWButton::Center, M("FILEBROWSER_POPUPTRASH"))); - buttons[1]->setToolTip (M("FILEBROWSER_POPUPRANK1")); - buttons[2]->setToolTip (M("FILEBROWSER_POPUPRANK2")); - buttons[3]->setToolTip (M("FILEBROWSER_POPUPRANK3")); - buttons[4]->setToolTip (M("FILEBROWSER_POPUPRANK4")); - buttons[5]->setToolTip (M("FILEBROWSER_POPUPRANK5")); + buttons[2]->setToolTip (M("FILEBROWSER_POPUPRANK1")); + buttons[3]->setToolTip (M("FILEBROWSER_POPUPRANK2")); + buttons[4]->setToolTip (M("FILEBROWSER_POPUPRANK3")); + buttons[5]->setToolTip (M("FILEBROWSER_POPUPRANK4")); + buttons[6]->setToolTip (M("FILEBROWSER_POPUPRANK5")); } void FileThumbnailButtonSet::setRank (int stars) { for (int i=1; i<=5; i++) - buttons[i]->setIcon (i<=stars ? rankIcon : gRankIcon); + buttons[i+1]->setIcon (i<=stars ? rankIcon : gRankIcon); } void FileThumbnailButtonSet::setInTrash (bool inTrash) { diff --git a/rtgui/guiutils.h b/rtgui/guiutils.h index 6c4a9423c..126733a64 100644 --- a/rtgui/guiutils.h +++ b/rtgui/guiutils.h @@ -16,8 +16,8 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef __UTILS_ -#define __UTILS_ +#ifndef __GUI_UTILS_ +#define __GUI_UTILS_ #include #include @@ -28,4 +28,47 @@ Glib::ustring removeExtension (const Glib::ustring& filename); Glib::ustring getExtension (const Glib::ustring& filename); void drawCrop (Cairo::RefPtr cr, int imx, int imy, int imw, int imh, int startx, int starty, double scale, const rtengine::procparams::CropParams& cparams); +/** + * @brief Lock GTK for critical section. + * + * Will unlock on destruction. To use: + * + * + * { + * GThreadLock lock; + * // critical code + * } + * + */ +class GThreadLock +{ +public: + GThreadLock() + { + gdk_threads_enter(); + } + ~GThreadLock() + { + gdk_threads_leave(); + } +}; + +/** + * @brief Unlock GTK critical section. + * + * Will relock on destruction. + */ +class GThreadUnLock +{ +public: + GThreadUnLock() + { + gdk_threads_leave(); + } + ~GThreadUnLock() + { + gdk_threads_enter(); + } +}; + #endif diff --git a/rtgui/imagearea.cc b/rtgui/imagearea.cc index 7fcf536dd..ede4567a4 100644 --- a/rtgui/imagearea.cc +++ b/rtgui/imagearea.cc @@ -44,6 +44,7 @@ ImageArea::ImageArea (ImageAreaPanel* p) : parent(p) { signal_size_allocate().connect( sigc::mem_fun(*this, &ImageArea::on_resized) ); dirty = false; + ipc = NULL; } void ImageArea::on_realize() diff --git a/rtgui/imagearea.h b/rtgui/imagearea.h index 08e1386fc..cbf489c60 100644 --- a/rtgui/imagearea.h +++ b/rtgui/imagearea.h @@ -44,7 +44,7 @@ class ImageArea : public Gtk::DrawingArea, public CropWindowListener { bool showClippedH, showClippedS; ImageAreaPanel* parent; - CropWindow* mainCropWindow; + std::list cropWins; PreviewHandler* previewHandler; rtengine::StagedImageProcessor* ipc; @@ -60,7 +60,7 @@ class ImageArea : public Gtk::DrawingArea, public CropWindowListener { CropWindow* getCropWindow (int x, int y); public: - + CropWindow* mainCropWindow; ZoomPanel* zoomPanel; IndicateClippedPanel* indClippedPanel; diff --git a/rtgui/imageareapanel.cc b/rtgui/imageareapanel.cc index e03bd3e5c..8d343889e 100644 --- a/rtgui/imageareapanel.cc +++ b/rtgui/imageareapanel.cc @@ -30,7 +30,7 @@ ImageAreaPanel::ImageAreaPanel () : before(NULL), after(NULL) { Gtk::Frame* frame = Gtk::manage (new Gtk::Frame ()); frame->add (*imageArea); frame->set_shadow_type (Gtk::SHADOW_IN ); - hb1->pack_start (*frame); + hb1->pack_start (*frame, Gtk::PACK_EXPAND_WIDGET); hb1->pack_end (*vscroll, Gtk::PACK_SHRINK, 0); pack_start (*hb1); @@ -39,15 +39,10 @@ ImageAreaPanel::ImageAreaPanel () : before(NULL), after(NULL) { imageArea->show (); hb1->show (); - Gtk::HBox* tmp = Gtk::manage (new Gtk::HBox ()); hb2->pack_start (*hscroll); - Gtk::Requisition vcr = vscroll->size_request (); - tmp->set_size_request (vcr.width, vcr.width); - hb2->pack_end (*tmp, Gtk::PACK_SHRINK, 0); pack_start (*hb2,Gtk::PACK_SHRINK, 0); hscroll->show (); - tmp->show (); hb2->show (); hscroll->set_update_policy (Gtk::UPDATE_CONTINUOUS); @@ -93,6 +88,16 @@ void ImageAreaPanel::configScrollBars () { hscroll->set_value (x); vscroll->set_value (y); + if(iw>=imgw) + hscroll->hide(); + else + hscroll->show(); + + if(ih>=imgh) + vscroll->hide(); + else + vscroll->show(); + if (before && this==after) before->synchronize (); else if (after && this==before) diff --git a/rtgui/labcurve.cc b/rtgui/labcurve.cc new file mode 100644 index 000000000..e8a38f6a3 --- /dev/null +++ b/rtgui/labcurve.cc @@ -0,0 +1,243 @@ +/* + * 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 +#include + +using namespace rtengine; +using namespace rtengine::procparams; + +LCurve::LCurve () : ToolPanel(), brAdd(false), contrAdd(false), satAdd(false) { + + //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +/* + Gtk::HBox* hb = Gtk::manage (new Gtk::HBox ()); + hb->set_border_width (4); + hb->show (); + Gtk::Label* labchan = Gtk::manage (new Gtk::Label (M("TP_LABCURVE_CHANNEL")+":")); + labchan->show (); + channel = Gtk::manage (new Gtk::ComboBoxText ()); + channel->append_text (M("TP_LCURVE")); + channel->append_text (M("TP_ACURVE")); + channel->append_text (M("TP_BCURVE")); + channel->show (); + hb->pack_start(*labchan, Gtk::PACK_SHRINK, 4); + hb->pack_start(*channel); + pack_start (*hb); +*/ + //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + Gtk::HBox* abox = Gtk::manage (new Gtk::HBox ()); + abox->set_border_width (2); + + brightness = Gtk::manage (new Adjuster (M("TP_LABCURVE_BRIGHTNESS"), -100, 100, 0.01, 0)); + contrast = Gtk::manage (new Adjuster (M("TP_LABCURVE_CONTRAST"), -100, 100, 1, 0)); + saturation = Gtk::manage (new Adjuster (M("TP_LABCURVE_SATURATION"), -100, 100, 1, 0)); + + pack_start (*brightness); + brightness->show (); + + pack_start (*contrast); + contrast->show (); + + pack_start (*saturation); + saturation->show (); + + Gtk::HSeparator *hsep3 = Gtk::manage (new Gtk::HSeparator()); + hsep3->show (); + pack_start (*hsep3); + + lshape = Gtk::manage (new CurveEditor ()); + lshape->show (); + lshape->setCurveListener (this); + CurveListener::setMulti(true); + + ashape = Gtk::manage (new CurveEditor ()); + ashape->show (); + ashape->setCurveListener (this); + CurveListener::setMulti(true); + + bshape = Gtk::manage (new CurveEditor ()); + bshape->show (); + bshape->setCurveListener (this); + CurveListener::setMulti(true); + + pack_start (*lshape, Gtk::PACK_SHRINK, 4); + pack_start (*ashape, Gtk::PACK_SHRINK, 4); + pack_start (*bshape, Gtk::PACK_SHRINK, 4); + + + brightness->setAdjusterListener (this); + contrast->setAdjusterListener (this); + saturation->setAdjusterListener (this); + + //channel->signal_changed().connect( sigc::mem_fun(*this, &LCurve::channel) ); + + +} + +void LCurve::read (const ProcParams* pp, const ParamsEdited* pedited) { + + disableListener (); + + if (pedited) { + brightness->setEditedState (pedited->labCurve.brightness ? Edited : UnEdited); + contrast->setEditedState (pedited->labCurve.contrast ? Edited : UnEdited); + saturation->setEditedState (pedited->labCurve.saturation ? Edited : UnEdited); + + lshape->setUnChanged (!pedited->labCurve.lcurve); + ashape->setUnChanged (!pedited->labCurve.acurve); + bshape->setUnChanged (!pedited->labCurve.bcurve); + + } + + brightness->setValue (pp->labCurve.brightness); + contrast->setValue (pp->labCurve.contrast); + saturation->setValue (pp->labCurve.saturation); + + lshape->setCurve (pp->labCurve.lcurve); + ashape->setCurve (pp->labCurve.acurve); + bshape->setCurve (pp->labCurve.bcurve); + + + enableListener (); +} + +void LCurve::write (ProcParams* pp, ParamsEdited* pedited) { + + pp->labCurve.brightness = brightness->getValue (); + pp->labCurve.contrast = (int)contrast->getValue (); + pp->labCurve.saturation = (int)saturation->getValue (); + + pp->labCurve.lcurve = lshape->getCurve (); + pp->labCurve.acurve = ashape->getCurve (); + pp->labCurve.bcurve = bshape->getCurve (); + + if (pedited) { + pedited->labCurve.brightness = brightness->getEditedState (); + pedited->labCurve.contrast = contrast->getEditedState (); + pedited->labCurve.saturation = saturation->getEditedState (); + + pedited->labCurve.lcurve = !lshape->isUnChanged (); + pedited->labCurve.acurve = !ashape->isUnChanged (); + pedited->labCurve.bcurve = !bshape->isUnChanged (); + } +} + +void LCurve::setDefaults (const ProcParams* defParams, const ParamsEdited* pedited) { + + brightness->setDefault (defParams->labCurve.brightness); + contrast->setDefault (defParams->labCurve.contrast); + saturation->setDefault (defParams->labCurve.saturation); + + if (pedited) { + brightness->setDefaultEditedState (pedited->labCurve.brightness ? Edited : UnEdited); + contrast->setDefaultEditedState (pedited->labCurve.contrast ? Edited : UnEdited); + saturation->setDefaultEditedState (pedited->labCurve.saturation ? Edited : UnEdited); + + } + else { + brightness->setDefaultEditedState (Irrelevant); + contrast->setDefaultEditedState (Irrelevant); + saturation->setDefaultEditedState (Irrelevant); + } +} + +void LCurve::curveChanged (CurveEditor* ce) { + + if (listener) { + if (ce == lshape) + listener->panelChanged (EvLLCurve, M("HISTORY_CUSTOMCURVE")); + if (ce == ashape) + listener->panelChanged (EvLaCurve, M("HISTORY_CUSTOMCURVE")); + if (ce == bshape) + listener->panelChanged (EvLbCurve, M("HISTORY_CUSTOMCURVE")); + } +} + +void LCurve::adjusterChanged (Adjuster* a, double newval) { + + if (!listener) + return; + + Glib::ustring costr; + if (a==brightness) + costr = Glib::ustring::format (std::setw(3), std::fixed, std::setprecision(2), a->getValue()); + else + costr = Glib::ustring::format ((int)a->getValue()); + + if (a==brightness) + listener->panelChanged (EvLBrightness, costr); + else if (a==contrast) + listener->panelChanged (EvLContrast, costr); + else if (a==saturation) + listener->panelChanged (EvLSaturation, costr); +} + +//attempt to hide unused channels +/*void LCurve::channel_changed () { + + removeIfThere (this, lcurve, false); + removeIfThere (this, acurve, false); + removeIfThere (this, bcurve, false); + + if (channel->get_active_row_number()==0) + pack_start (*lcurve); + else if (channel->get_active_row_number()==1) + pack_start (*acurve); + else if (method->get_active_row_number()==2) + pack_start (*bcurve); + + + if (listener && enabled->get_active ()) + listener->panelChanged (EvLabCurvetype, channel->get_active_text ()); + +}*/ + +void LCurve::setBatchMode (bool batchMode) { + + ToolPanel::setBatchMode (batchMode); + brightness->showEditedCB (); + contrast->showEditedCB (); + saturation->showEditedCB (); + + lshape->setBatchMode (batchMode); + ashape->setBatchMode (batchMode); + bshape->setBatchMode (batchMode); +} + +void LCurve::setAdjusterBehavior (bool bradd, bool contradd, bool satadd) { + + if ((!brAdd && bradd) || (brAdd && !bradd)) + brightness->setLimits (-100, 100, 1, 0); + if ((!contrAdd && contradd) || (contrAdd && !contradd)) + contrast->setLimits (-100, 100, 1, 0); + if ((!satAdd && satadd) || (satAdd && !satadd)) + saturation->setLimits (-100, 100, 1, 0); + + brAdd = bradd; + contrAdd = contradd; + satAdd = satadd; + +} + +void LCurve::updateCurveBackgroundHistogram (unsigned* hist) { + + lshape->updateBackgroundHistogram (hist); +} diff --git a/rtgui/labcurve.h b/rtgui/labcurve.h new file mode 100644 index 000000000..14dc531f2 --- /dev/null +++ b/rtgui/labcurve.h @@ -0,0 +1,57 @@ +/* + * 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 . + */ +#ifndef _LABCURVE_H_ +#define _LABCURVE_H_ + +#include +#include +#include +#include +#include + +class LCurve : public Gtk::VBox, public AdjusterListener, public ToolPanel, public CurveListener { + + protected: + Gtk::ComboBoxText* channel; + + Adjuster* brightness; + Adjuster* contrast; + Adjuster* saturation; + CurveEditor* lshape; + CurveEditor* ashape; + CurveEditor* bshape; + + bool brAdd, contrAdd, satAdd; + + public: + + LCurve (); + + void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited=NULL); + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited=NULL); + void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited=NULL); + void setBatchMode (bool batchMode); + void setAdjusterBehavior (bool bradd, bool contradd, bool satadd); + + void curveChanged (CurveEditor* ce); + void adjusterChanged (Adjuster* a, double newval); + void updateCurveBackgroundHistogram (unsigned* hist); +}; + +#endif diff --git a/rtgui/main.cc b/rtgui/main.cc index 15e3efecf..5d136e76b 100644 --- a/rtgui/main.cc +++ b/rtgui/main.cc @@ -85,9 +85,15 @@ int main(int argc, char **argv) argv1_ = argv[1]; else argv1_ = ""; - + +#ifdef GLIBMM_EXCEPTIONS_ENABLED argv0 = Glib::filename_to_utf8 (argv0_); argv1 = Glib::filename_to_utf8 (argv1_); +#else + std::auto_ptr error; + argv0 = Glib::filename_to_utf8 (argv0_, error); + argv1 = Glib::filename_to_utf8 (argv1_, error); +#endif //GLIBMM_EXCEPTIONS_ENABLED Glib::thread_init(); gdk_threads_init(); @@ -102,10 +108,15 @@ int main(int argc, char **argv) #endif // Gtk::RC::add_default_file (argv0+"/themes/"+options.theme); - std::vector rcfiles; - rcfiles.push_back (argv0+"/themes/"+options.theme); - Gtk::RC::set_default_files (rcfiles); - + if (!options.useSystemTheme) + { + std::vector rcfiles; + rcfiles.push_back (argv0+"/themes/"+options.theme); + // Set the font face and size + Gtk::RC::parse_string (Glib::ustring::compose( + "style \"clearlooks-default\" { font_name = \"%1\" }", options.font)); + Gtk::RC::set_default_files (rcfiles); + } Gtk::Main m(&argc, &argv); // MainWindow *MainWindow = new class MainWindow(); RTWindow *rtWindow = new class RTWindow(); diff --git a/rtgui/mycurve.cc b/rtgui/mycurve.cc index ff079b1d4..4430fabba 100644 --- a/rtgui/mycurve.cc +++ b/rtgui/mycurve.cc @@ -621,7 +621,7 @@ void MyCurve::setType (CurveType t) { void MyCurve::notifyListener () { if (listener) - listener->curveChanged (); + listener->curveChanged (); } void MyCurve::setActiveParam (int ac) { diff --git a/rtgui/navigator.cc b/rtgui/navigator.cc index c65f4530a..cda896052 100644 --- a/rtgui/navigator.cc +++ b/rtgui/navigator.cc @@ -34,14 +34,20 @@ Navigator::Navigator () { H = Gtk::manage (new Gtk::Label ()); S = Gtk::manage (new Gtk::Label ()); V = Gtk::manage (new Gtk::Label ()); + LAB_A = Gtk::manage (new Gtk::Label ()); + LAB_B = Gtk::manage (new Gtk::Label ()); + LAB_L = Gtk::manage (new Gtk::Label ()); - Gtk::Table* table = new Gtk::Table (3, 2); + Gtk::Table* table = new Gtk::Table (3, 3); table->attach (*R, 0, 1, 0, 1, Gtk::EXPAND, Gtk::SHRINK, 0, 0); table->attach (*G, 0, 1, 1, 2, Gtk::EXPAND, Gtk::SHRINK, 0, 0); table->attach (*B, 0, 1, 2, 3, Gtk::EXPAND, Gtk::SHRINK, 0, 0); table->attach (*H, 1, 2, 0, 1, Gtk::EXPAND, Gtk::SHRINK, 0, 0); table->attach (*S, 1, 2, 1, 2, Gtk::EXPAND, Gtk::SHRINK, 0, 0); table->attach (*V, 1, 2, 2, 3, Gtk::EXPAND, Gtk::SHRINK, 0, 0); + table->attach (*LAB_L, 2, 3, 0, 1, Gtk::EXPAND, Gtk::SHRINK, 0, 0); + table->attach (*LAB_A, 2, 3, 1, 2, Gtk::EXPAND, Gtk::SHRINK, 0, 0); + table->attach (*LAB_B, 2, 3, 2, 3, Gtk::EXPAND, Gtk::SHRINK, 0, 0); mbox->pack_start (*table, Gtk::PACK_SHRINK, 2); @@ -60,6 +66,9 @@ void Navigator::setInvalid () { H->set_text (M("NAVIGATOR_H_NA")); S->set_text (M("NAVIGATOR_S_NA")); V->set_text (M("NAVIGATOR_V_NA")); + LAB_A->set_text (M("NAVIGATOR_LAB_A_NA")); + LAB_B->set_text (M("NAVIGATOR_LAB_B_NA")); + LAB_L->set_text (M("NAVIGATOR_LAB_L_NA")); } void Navigator::pointerMoved (bool validPos, int x, int y, int r, int g, int b) { @@ -76,6 +85,12 @@ void Navigator::pointerMoved (bool validPos, int x, int y, int r, int g, int b) H->set_text (Glib::ustring::compose (M("NAVIGATOR_H_VALUE"), h)); S->set_text (Glib::ustring::compose (M("NAVIGATOR_S_VALUE"), s)); V->set_text (Glib::ustring::compose (M("NAVIGATOR_V_VALUE"), v)); + int LAB_a, LAB_b, LAB_l; + rgb2lab (r, g, b, LAB_l, LAB_a, LAB_b); + LAB_A->set_text (Glib::ustring::compose (M("NAVIGATOR_LAB_A_VALUE"), LAB_a)); + LAB_B->set_text (Glib::ustring::compose (M("NAVIGATOR_LAB_B_VALUE"), LAB_b)); + LAB_L->set_text (Glib::ustring::compose (M("NAVIGATOR_LAB_L_VALUE"), LAB_l)); + } } @@ -113,3 +128,49 @@ void Navigator::rgb2hsv (int r, int g, int b, int &h, int &s, int &v) { s = (int)(S*255.0); v = (int)(V*255.0); } + +void Navigator::rgb2lab (int r, int g, int b, int &LAB_l, int &LAB_a, int &LAB_b) { + + volatile double var_R = r / 255.0; + volatile double var_G = g / 255.0; + volatile double var_B = b / 255.0; + + if ( var_R > 0.04045 ) + var_R = pow ( ( ( var_R + 0.055 ) / 1.055 ), 2.4); + else + var_R = var_R / 12.92; + if ( var_G > 0.04045 ) + var_G = pow ( ( ( var_G + 0.055 ) / 1.055 ), 2.4); + else + var_G = var_G / 12.92; + if ( var_B > 0.04045 ) + var_B = pow ( ( ( var_B + 0.055 ) / 1.055 ), 2.4); + else + var_B = var_B / 12.92; + + var_R = var_R * 100; + var_G = var_G * 100; + var_B = var_B * 100; + + double var_X = ( var_R * 0.4124 + var_G * 0.3576 + var_B * 0.1805 ) / 95.047; + double var_Y = ( var_R * 0.2126 + var_G * 0.7152 + var_B * 0.0722 ) / 100.000; + double var_Z = ( var_R * 0.0193 + var_G * 0.1192 + var_B * 0.9505 ) / 108.883; + + if ( var_X > 0.008856 ) + var_X = pow (var_X, ( 1.0/3.0 )); + else + var_X = ( 7.787 * var_X ) + ( 16.0 / 116.0 ); + if ( var_Y > 0.008856 ) + var_Y = pow (var_Y, ( 1.0/3.0 )); + else + var_Y = ( 7.787 * var_Y ) + ( 16.0 / 116.0 ); + if ( var_Z > 0.008856 ) + var_Z = pow (var_Z, ( 1.0/3.0 )); + else + var_Z = ( 7.787 * var_Z ) + ( 16.0 / 116.0 ); + + LAB_l = ( 116 * var_Y ) - 16; + LAB_a = 500 * ( var_X - var_Y ); + LAB_b = 200 * ( var_Y - var_Z ); + +} diff --git a/rtgui/navigator.h b/rtgui/navigator.h index 27220ada2..0c94c31db 100644 --- a/rtgui/navigator.h +++ b/rtgui/navigator.h @@ -29,8 +29,10 @@ class Navigator : public Gtk::Frame, public PointerMotionListener { Gtk::Label* position; Gtk::Label *R, *G, *B; Gtk::Label *H, *S, *V; + Gtk::Label *LAB_A, *LAB_B, *LAB_L; void rgb2hsv (int r, int g, int b, int &h, int &s, int &v); + void rgb2lab (int r, int g, int b, int &LAB_l, int &LAB_a, int &LAB_b); void setInvalid (); public: PreviewWindow* previewWindow; diff --git a/rtgui/options.cc b/rtgui/options.cc index 16ac7aaed..23c9aa8e9 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -38,6 +38,7 @@ const char *DefaultLanguage = "English (US)"; void Options::setDefaults () { + font = "sans, 10"; windowWidth = 900; windowHeight = 560; windowMaximized = false; @@ -88,6 +89,7 @@ void Options::setDefaults () { language = DefaultLanguage; lastSaveAsPath = ""; theme = ""; + useSystemTheme = false; maxThumbnailHeight = 400; maxCacheEntries = 10000; thumbnailFormat = FT_Custom16; @@ -117,12 +119,14 @@ void Options::setDefaults () { thumbnailZoomRatios.push_back (1.0); overlayedFileNames = true; showFileNames = true; + tabbedUI = false; int babehav[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0}; baBehav = std::vector (babehav, babehav+ADDSET_PARAM_NUM); rtSettings.dualThreadEnabled = true; rtSettings.darkFramesPath = ""; + rtSettings.iccDirectory = "/usr/share/color/icc"; rtSettings.colorimetricIntent = 1; rtSettings.monitorProfile = ""; @@ -151,8 +155,8 @@ int Options::readFromFile (Glib::ustring fname) { setDefaults (); -if (keyFile.has_group ("General")) { - Glib::ustring stup; +if (keyFile.has_group ("General")) { + if (keyFile.has_key ("General", "TabbedEditor")) tabbedUI= keyFile.get_boolean ("General", "TabbedEditor"); if (keyFile.has_key ("General", "StartupDirectory") && keyFile.get_string ("General", "StartupDirectory") == "home") startupDir = STARTUPDIR_HOME; else if (keyFile.has_key ("General", "StartupDirectory") && keyFile.get_string ("General", "StartupDirectory") == "current") @@ -171,6 +175,7 @@ if (keyFile.has_group ("General")) { // if (keyFile.has_key ("General", "Version")) version = keyFile.get_integer ("General", "Version"); if (keyFile.has_key ("General", "Language")) language = keyFile.get_string ("General", "Language"); if (keyFile.has_key ("General", "Theme")) theme = keyFile.get_string ("General", "Theme"); + if (keyFile.has_key ("General", "UseSystemTheme")) useSystemTheme = keyFile.get_boolean ("General", "UseSystemTheme"); if (keyFile.has_key ("General", "FirstRun")) firstRun = keyFile.get_boolean ("General", "FirstRun"); if( keyFile.has_key ("General", "DarkFramesPath")) rtSettings.darkFramesPath = keyFile.get_string("General", "DarkFramesPath"); if( keyFile.has_key ("General", "Verbose")) rtSettings.verbose = keyFile.get_boolean ( "General", "Verbose"); @@ -197,6 +202,7 @@ if (keyFile.has_group ("Output")) { if (keyFile.has_key ("Output", "AutoSuffix")) autoSuffix = keyFile.get_boolean("Output", "AutoSuffix"); if (keyFile.has_key ("Output", "UsePathTemplate")) saveUsePathTemplate = keyFile.get_boolean("Output", "UsePathTemplate"); if (keyFile.has_key ("Output", "LastSaveAsPath")) lastSaveAsPath = keyFile.get_string ("Output", "LastSaveAsPath"); + if (keyFile.has_key ("Output", "OverwriteOutputFile")) overwriteOutputFile = keyFile.get_boolean("Output", "OverwriteOutputFile"); } if (keyFile.has_group ("Profiles")) { @@ -228,6 +234,7 @@ if (keyFile.has_group ("File Browser")) { if (keyFile.has_key ("File Browser", "ThumbnailZoomRatios"))thumbnailZoomRatios= keyFile.get_double_list ("File Browser", "ThumbnailZoomRatios"); if (keyFile.has_key ("File Browser", "OverlayedFileNames")) overlayedFileNames = keyFile.get_boolean ("File Browser", "OverlayedFileNames"); if (keyFile.has_key ("File Browser", "ShowFileNames")) showFileNames = keyFile.get_boolean ("File Browser", "ShowFileNames"); + if (keyFile.has_key ("File Browser", "InternalThumbIfUntouched")) internalThumbIfUntouched = keyFile.get_boolean ("File Browser", "InternalThumbIfUntouched"); } if (keyFile.has_group ("Clipping Indication")) { @@ -237,6 +244,7 @@ if (keyFile.has_group ("Clipping Indication")) { } if (keyFile.has_group ("GUI")) { + if (keyFile.has_key ("GUI", "Font")) font = keyFile.get_string ("GUI", "Font"); if (keyFile.has_key ("GUI", "WindowWidth")) windowWidth = keyFile.get_integer ("GUI", "WindowWidth"); if (keyFile.has_key ("GUI", "WindowHeight")) windowHeight = keyFile.get_integer ("GUI", "WindowHeight"); if (keyFile.has_key ("GUI", "WindowMaximized")) windowMaximized = keyFile.get_boolean ("GUI", "WindowMaximized"); @@ -283,7 +291,8 @@ if (keyFile.has_group ("Batch Processing")) { int Options::saveToFile (Glib::ustring fname) { rtengine::SafeKeyFile keyFile; - + keyFile.set_boolean ("General", "TabbedEditor", tabbedUI); + keyFile.set_boolean ("General", "StoreLastProfile", savesParamsAtExit); if (startupDir==STARTUPDIR_HOME) keyFile.set_string ("General", "StartupDirectory", "home"); @@ -293,13 +302,14 @@ int Options::saveToFile (Glib::ustring fname) { keyFile.set_string ("General", "StartupDirectory", "custom"); else if (startupDir==STARTUPDIR_LAST) keyFile.set_string ("General", "StartupDirectory", "last"); - keyFile.set_string ("General", "StartupPath", startupPath); - keyFile.set_string ("General", "DateFormat", dateFormat); + keyFile.set_string ("General", "StartupPath", startupPath); + keyFile.set_string ("General", "DateFormat", dateFormat); keyFile.set_integer ("General", "AdjusterDelay", Adjuster::delay); keyFile.set_boolean ("General", "DualProcSupport", rtSettings.dualThreadEnabled); keyFile.set_boolean ("General", "MultiUser", multiUser); keyFile.set_string ("General", "Language", language); keyFile.set_string ("General", "Theme", theme); + keyFile.set_boolean ("General", "UseSystemTheme", useSystemTheme); keyFile.set_integer ("General", "Version", 290); keyFile.set_boolean ("General", "FirstRun", firstRun); keyFile.set_string ("General", "DarkFramesPath", rtSettings.darkFramesPath); @@ -335,31 +345,34 @@ int Options::saveToFile (Glib::ustring fname) { keyFile.set_double_list ("File Browser", "ThumbnailZoomRatios", ptzoom); keyFile.set_boolean ("File Browser", "OverlayedFileNames", overlayedFileNames); keyFile.set_boolean ("File Browser", "ShowFileNames", showFileNames ); - + keyFile.set_boolean ("File Browser", "InternalThumbIfUntouched", internalThumbIfUntouched ); + keyFile.set_integer ("Clipping Indication", "HighlightThreshold", highlightThreshold); keyFile.set_integer ("Clipping Indication", "ShadowThreshold", shadowThreshold); keyFile.set_boolean ("Clipping Indication", "BlinkClipped", blinkClipped); - keyFile.set_string ("Output", "Format", saveFormat.format); + keyFile.set_string ("Output", "Format", saveFormat.format); keyFile.set_integer ("Output", "JpegQuality", saveFormat.jpegQuality); keyFile.set_integer ("Output", "PngCompression", saveFormat.pngCompression); keyFile.set_integer ("Output", "PngBps", saveFormat.pngBits); keyFile.set_integer ("Output", "TiffBps", saveFormat.tiffBits); keyFile.set_boolean ("Output", "TiffUncompressed", saveFormat.tiffUncompressed); keyFile.set_boolean ("Output", "SaveProcParams", saveFormat.saveParams); - keyFile.set_string ("Output", "PathTemplate", savePathTemplate); - keyFile.set_string ("Output", "PathFolder", savePathFolder); - keyFile.set_boolean("Output", "AutoSuffix", autoSuffix); - keyFile.set_boolean("Output", "UsePathTemplate", saveUsePathTemplate); - keyFile.set_string ("Output", "LastSaveAsPath", lastSaveAsPath); + keyFile.set_string ("Output", "PathTemplate", savePathTemplate); + keyFile.set_string ("Output", "PathFolder", savePathFolder); + keyFile.set_boolean ("Output", "AutoSuffix", autoSuffix); + keyFile.set_boolean ("Output", "UsePathTemplate", saveUsePathTemplate); + keyFile.set_string ("Output", "LastSaveAsPath", lastSaveAsPath); + keyFile.set_boolean ("Output", "OverwriteOutputFile", overwriteOutputFile); - keyFile.set_string ("Profiles", "Directory", profilePath); - keyFile.set_string ("Profiles", "RawDefault", defProfRaw); - keyFile.set_string ("Profiles", "ImgDefault", defProfImg); + keyFile.set_string ("Profiles", "Directory", profilePath); + keyFile.set_string ("Profiles", "RawDefault", defProfRaw); + keyFile.set_string ("Profiles", "ImgDefault", defProfImg); keyFile.set_boolean ("Profiles", "SaveParamsWithFile", saveParamsFile); keyFile.set_boolean ("Profiles", "SaveParamsToCache", saveParamsCache); keyFile.set_integer ("Profiles", "LoadParamsFromLocation", paramsLoadLocation); + keyFile.set_string ("GUI", "Font", font); keyFile.set_integer ("GUI", "WindowWidth", windowWidth); keyFile.set_integer ("GUI", "WindowHeight", windowHeight); keyFile.set_boolean ("GUI", "WindowMaximized", windowMaximized); @@ -472,8 +485,8 @@ void Options::save () { } bool Options::is_extention_enabled (Glib::ustring ext) { - for (int j=0; j=parseExtensionsEnabled.size() || parseExtensionsEnabled[j]; + return j>=(int)parseExtensionsEnabled.size() || parseExtensionsEnabled[j]; return false; } diff --git a/rtgui/options.h b/rtgui/options.h index 8ae2c9bd3..c56475948 100644 --- a/rtgui/options.h +++ b/rtgui/options.h @@ -68,6 +68,7 @@ class Options { int browserToolPanelWidth; int browserToolPanelHeight; int historyPanelWidth; + Glib::ustring font; int windowWidth; int windowHeight; bool windowMaximized; @@ -96,6 +97,7 @@ class Options { int bgcolor; Glib::ustring language; Glib::ustring theme; + bool useSystemTheme; static Glib::ustring cacheBaseDir; bool autoSuffix; bool saveParamsFile; @@ -121,10 +123,13 @@ class Options { std::vector favoriteDirs; std::vector renameTemplates; bool renameUseTemplates; - + bool internalThumbIfUntouched; + bool overwriteOutputFile; + std::vector thumbnailZoomRatios; bool overlayedFileNames; bool showFileNames; + bool tabbedUI; Options (); diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 2a62f0e1a..1e11e93bb 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -37,9 +37,12 @@ void ParamsEdited::set (bool v) { toneCurve.autoexp = v; toneCurve.clip = v; toneCurve.expcomp = v; - lumaCurve.curve = v; - lumaCurve.brightness = v; - lumaCurve.contrast = v; + labCurve.lcurve = v; + labCurve.acurve = v; + labCurve.bcurve = v; + labCurve.brightness = v; + labCurve.contrast = v; + labCurve.saturation = v; sharpening.enabled = v; sharpening.radius = v; sharpening.amount = v; @@ -104,6 +107,9 @@ void ParamsEdited::set (bool v) { cacorrection.blue = v; vignetting.amount = v; vignetting.radius = v; + vignetting.strength = v; + vignetting.centerX = v; + vignetting.centerY = v; chmixer.red[0] = v; chmixer.red[1] = v; chmixer.red[2] = v; @@ -162,10 +168,13 @@ void ParamsEdited::initFrom (const std::vector toneCurve.autoexp = toneCurve.autoexp && p.toneCurve.autoexp == other.toneCurve.autoexp; toneCurve.clip = toneCurve.clip && p.toneCurve.clip == other.toneCurve.clip; toneCurve.expcomp = toneCurve.expcomp && p.toneCurve.expcomp == other.toneCurve.expcomp; - lumaCurve.curve = lumaCurve.curve && p.lumaCurve.curve == other.lumaCurve.curve; - lumaCurve.brightness = lumaCurve.brightness && p.lumaCurve.brightness == other.lumaCurve.brightness; - lumaCurve.contrast = lumaCurve.contrast && p.lumaCurve.contrast == other.lumaCurve.contrast; - sharpening.enabled = sharpening.enabled && p.sharpening.enabled == other.sharpening.enabled; + labCurve.lcurve = labCurve.lcurve && p.labCurve.lcurve == other.labCurve.lcurve; + labCurve.acurve = labCurve.acurve && p.labCurve.acurve == other.labCurve.acurve; + labCurve.bcurve = labCurve.bcurve && p.labCurve.bcurve == other.labCurve.bcurve; + labCurve.brightness = labCurve.brightness && p.labCurve.brightness == other.labCurve.brightness; + labCurve.contrast = labCurve.contrast && p.labCurve.contrast == other.labCurve.contrast; + labCurve.saturation = labCurve.saturation && p.labCurve.saturation == other.labCurve.saturation; + sharpening.enabled = sharpening.enabled && p.sharpening.enabled == other.sharpening.enabled; sharpening.radius = sharpening.radius && p.sharpening.radius == other.sharpening.radius; sharpening.amount = sharpening.amount && p.sharpening.amount == other.sharpening.amount; sharpening.threshold = sharpening.threshold && p.sharpening.threshold == other.sharpening.threshold; @@ -232,6 +241,9 @@ void ParamsEdited::initFrom (const std::vector cacorrection.blue = cacorrection.blue && p.cacorrection.blue == other.cacorrection.blue; vignetting.amount = vignetting.amount && p.vignetting.amount == other.vignetting.amount; vignetting.radius = vignetting.radius && p.vignetting.radius == other.vignetting.radius; + vignetting.strength = vignetting.strength && p.vignetting.strength == other.vignetting.strength; + vignetting.centerX = vignetting.centerX && p.vignetting.centerX == other.vignetting.centerX; + vignetting.centerY = vignetting.centerY && p.vignetting.centerY == other.vignetting.centerY; chmixer.red[0] = chmixer.red[0] && p.chmixer.red[0] == other.chmixer.red[0]; chmixer.red[1] = chmixer.red[1] && p.chmixer.red[1] == other.chmixer.red[1]; chmixer.red[2] = chmixer.red[2] && p.chmixer.red[2] == other.chmixer.red[2]; @@ -288,9 +300,12 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten if (toneCurve.autoexp) toEdit.toneCurve.autoexp = mods.toneCurve.autoexp; if (toneCurve.clip) toEdit.toneCurve.clip = mods.toneCurve.clip; if (toneCurve.expcomp) toEdit.toneCurve.expcomp = options.baBehav[ADDSET_TC_EXPCOMP] ? toEdit.toneCurve.expcomp + mods.toneCurve.expcomp : mods.toneCurve.expcomp; - if (lumaCurve.curve) toEdit.lumaCurve.curve = mods.lumaCurve.curve; - if (lumaCurve.brightness) toEdit.lumaCurve.brightness = options.baBehav[ADDSET_LC_BRIGHTNESS] ? toEdit.lumaCurve.brightness + mods.lumaCurve.brightness : mods.lumaCurve.brightness; - if (lumaCurve.contrast) toEdit.lumaCurve.contrast = options.baBehav[ADDSET_LC_CONTRAST] ? toEdit.lumaCurve.contrast + mods.lumaCurve.contrast : mods.lumaCurve.contrast; + if (labCurve.lcurve) toEdit.labCurve.lcurve = mods.labCurve.lcurve; + if (labCurve.acurve) toEdit.labCurve.acurve = mods.labCurve.acurve; + if (labCurve.bcurve) toEdit.labCurve.bcurve = mods.labCurve.bcurve; + if (labCurve.brightness) toEdit.labCurve.brightness = options.baBehav[ADDSET_LC_BRIGHTNESS] ? toEdit.labCurve.brightness + mods.labCurve.brightness : mods.labCurve.brightness; + if (labCurve.contrast) toEdit.labCurve.contrast = options.baBehav[ADDSET_LC_CONTRAST] ? toEdit.labCurve.contrast + mods.labCurve.contrast : mods.labCurve.contrast; + if (labCurve.saturation) toEdit.labCurve.saturation = options.baBehav[ADDSET_LC_SATURATION] ? toEdit.labCurve.saturation + mods.labCurve.saturation : mods.labCurve.saturation; if (sharpening.enabled) toEdit.sharpening.enabled = mods.sharpening.enabled; if (sharpening.radius) toEdit.sharpening.radius = mods.sharpening.radius; if (sharpening.amount) toEdit.sharpening.amount = options.baBehav[ADDSET_SHARP_AMOUNT] ? toEdit.sharpening.amount + mods.sharpening.amount : mods.sharpening.amount; @@ -358,6 +373,9 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten if (cacorrection.blue) toEdit.cacorrection.blue = options.baBehav[ADDSET_CA] ? toEdit.cacorrection.blue + mods.cacorrection.blue : mods.cacorrection.blue; if (vignetting.amount) toEdit.vignetting.amount = options.baBehav[ADDSET_VIGN_AMOUNT] ? toEdit.vignetting.amount + mods.vignetting.amount : mods.vignetting.amount; if (vignetting.radius) toEdit.vignetting.radius = mods.vignetting.radius; + if (vignetting.strength) toEdit.vignetting.strength = mods.vignetting.strength; + if (vignetting.centerX) toEdit.vignetting.centerX = mods.vignetting.centerX; + if (vignetting.centerY) toEdit.vignetting.centerY = mods.vignetting.centerY; if (chmixer.red[0]) toEdit.chmixer.red[0] = mods.chmixer.red[0]; if (chmixer.red[1]) toEdit.chmixer.red[1] = mods.chmixer.red[1]; if (chmixer.red[2]) toEdit.chmixer.red[2] = mods.chmixer.red[2]; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 176c6e3ad..4e7f745c8 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -43,7 +43,10 @@ class LCurveParamsEdited { public: bool brightness; bool contrast; - bool curve; + bool saturation; + bool lcurve; + bool acurve; + bool bcurve; }; class SharpeningParamsEdited { @@ -188,6 +191,9 @@ class VignettingParamsEdited { public: bool amount; bool radius; + bool strength; + bool centerX; + bool centerY; }; class ChannelMixerParamsEdited { @@ -279,7 +285,7 @@ class ParamsEdited { public: ToneCurveParamsEdited toneCurve; - LCurveParamsEdited lumaCurve; + LCurveParamsEdited labCurve; SharpeningParamsEdited sharpening; ColorBoostParamsEdited colorBoost; WBParamsEdited wb; diff --git a/rtgui/partialpastedlg.cc b/rtgui/partialpastedlg.cc index 1310d9c84..b903365af 100644 --- a/rtgui/partialpastedlg.cc +++ b/rtgui/partialpastedlg.cc @@ -40,7 +40,7 @@ PartialPasteDlg::PartialPasteDlg () { sharpen = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_SHARPENING"))); impden = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_IMPULSEDENOISE"))); lumaden = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_LUMADENOISE"))); - lumacurve = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_LUMACURVE"))); + labcurve = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_LABCURVE"))); sh = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_SHADOWSHIGHLIGHTS"))); dirpyreq = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_DIRPYREQUALIZER"))); waveq = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_WAVELETEQUALIZER"))); @@ -87,7 +87,7 @@ PartialPasteDlg::PartialPasteDlg () { vboxes[1]->pack_start (*sharpen, Gtk::PACK_SHRINK, 2); vboxes[1]->pack_start (*impden, Gtk::PACK_SHRINK, 2); vboxes[1]->pack_start (*lumaden, Gtk::PACK_SHRINK, 2); - vboxes[1]->pack_start (*lumacurve, Gtk::PACK_SHRINK, 2); + vboxes[1]->pack_start (*labcurve, Gtk::PACK_SHRINK, 2); vboxes[1]->pack_start (*sh, Gtk::PACK_SHRINK, 2); vboxes[1]->pack_start (*dirpyreq, Gtk::PACK_SHRINK, 2); vboxes[1]->pack_start (*waveq, Gtk::PACK_SHRINK, 2); @@ -152,7 +152,7 @@ PartialPasteDlg::PartialPasteDlg () { sharpenConn = sharpen->signal_toggled().connect (sigc::bind (sigc::mem_fun(*luminance, &Gtk::CheckButton::set_inconsistent), true)); impdenConn = impden->signal_toggled().connect (sigc::bind (sigc::mem_fun(*luminance, &Gtk::CheckButton::set_inconsistent), true)); lumadenConn = lumaden->signal_toggled().connect (sigc::bind (sigc::mem_fun(*luminance, &Gtk::CheckButton::set_inconsistent), true)); - lumacurveConn = lumacurve->signal_toggled().connect (sigc::bind (sigc::mem_fun(*luminance, &Gtk::CheckButton::set_inconsistent), true)); + labcurveConn = labcurve->signal_toggled().connect (sigc::bind (sigc::mem_fun(*luminance, &Gtk::CheckButton::set_inconsistent), true)); shConn = sh->signal_toggled().connect (sigc::bind (sigc::mem_fun(*luminance, &Gtk::CheckButton::set_inconsistent), true)); dirpyreqConn = dirpyreq->signal_toggled().connect (sigc::bind (sigc::mem_fun(*luminance, &Gtk::CheckButton::set_inconsistent), true)); waveqConn = waveq->signal_toggled().connect (sigc::bind (sigc::mem_fun(*luminance, &Gtk::CheckButton::set_inconsistent), true)); @@ -205,7 +205,7 @@ void PartialPasteDlg::luminanceToggled () { sharpenConn.block (true); impdenConn.block (true); lumadenConn.block (true); - lumacurveConn.block (true); + labcurveConn.block (true); shConn.block (true); dirpyreqConn.block (true); waveqConn.block (true); @@ -215,7 +215,7 @@ void PartialPasteDlg::luminanceToggled () { sharpen->set_active (luminance->get_active ()); impden->set_active (luminance->get_active ()); lumaden->set_active (luminance->get_active ()); - lumacurve->set_active (luminance->get_active ()); + labcurve->set_active (luminance->get_active ()); sh->set_active (luminance->get_active ()); dirpyreq->set_active (luminance->get_active ()); waveq->set_active (luminance->get_active ()); @@ -223,7 +223,7 @@ void PartialPasteDlg::luminanceToggled () { sharpenConn.block (false); impdenConn.block (false); lumadenConn.block (false); - lumacurveConn.block (false); + labcurveConn.block (false); shConn.block (false); dirpyreqConn.block (false); waveqConn.block (false); @@ -316,7 +316,7 @@ void PartialPasteDlg::applyPaste (rtengine::procparams::ProcParams* dst, const r if (sharpen->get_active ()) dst->sharpening = src->sharpening; if (impden->get_active ()) dst->impulseDenoise = src->impulseDenoise; if (lumaden->get_active ()) dst->lumaDenoise = src->lumaDenoise; - if (lumacurve->get_active ()) dst->lumaCurve = src->lumaCurve; + if (labcurve->get_active ()) dst->labCurve = src->labCurve; if (sh->get_active ()) dst->sh = src->sh; if (dirpyreq->get_active ()) dst->dirpyrequalizer = src->dirpyrequalizer; if (waveq->get_active ()) dst->equalizer = src->equalizer; diff --git a/rtgui/partialpastedlg.h b/rtgui/partialpastedlg.h index 3c4dcb152..2ea23772a 100644 --- a/rtgui/partialpastedlg.h +++ b/rtgui/partialpastedlg.h @@ -42,7 +42,7 @@ class PartialPasteDlg : public Gtk::Dialog { Gtk::CheckButton* sharpen; Gtk::CheckButton* impden; Gtk::CheckButton* lumaden; - Gtk::CheckButton* lumacurve; + Gtk::CheckButton* labcurve; Gtk::CheckButton* sh; Gtk::CheckButton* dirpyreq; Gtk::CheckButton* waveq; @@ -73,7 +73,7 @@ class PartialPasteDlg : public Gtk::Dialog { sigc::connection basicConn, luminanceConn, colorConn, lensConn, compositionConn, metaicmConn; sigc::connection wbConn, exposureConn, hlrecConn; - sigc::connection sharpenConn, impdenConn, lumadenConn, lumacurveConn, shConn, dirpyreqConn, waveqConn; + sigc::connection sharpenConn, impdenConn, lumadenConn, labcurveConn, shConn, dirpyreqConn, waveqConn; sigc::connection colormixerConn, colorshiftConn, colorboostConn, colordenConn, dirpyrdenConn; sigc::connection distortionConn, cacorrConn, vignettingConn; sigc::connection coarserotConn, finerotConn, cropConn, resizeConn; diff --git a/rtgui/preferences.cc b/rtgui/preferences.cc index 2cffee9ca..d1eebaa79 100644 --- a/rtgui/preferences.cc +++ b/rtgui/preferences.cc @@ -1,936 +1,1044 @@ -/* - * 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 -#include "preferences.h" -#include -#include -#include -#include -#include -#include - -extern Options options; -extern Glib::ustring argv0; - -Preferences::Preferences (int initialPage) { - - set_title (M("MAIN_BUTTON_PREFERENCES")); - - moptions.copyFrom (&options); - - set_size_request (650, 650); - set_border_width (4); - - Gtk::VBox* mainvb = get_vbox (); - set_has_separator (false); - - Gtk::Notebook* nb = Gtk::manage (new Gtk::Notebook ()); - mainvb->pack_start (*nb); - - Gtk::HSeparator* hsep1 = Gtk::manage (new Gtk::HSeparator ()); - mainvb->pack_start (*hsep1, Gtk::PACK_SHRINK, 2); - - Gtk::HBox* buttonpanel = Gtk::manage (new Gtk::HBox ()); - mainvb->pack_end (*buttonpanel, Gtk::PACK_SHRINK, 2); - - Gtk::Button* load = Gtk::manage (new Gtk::Button (M("GENERAL_LOAD"))); - Gtk::Button* save = Gtk::manage (new Gtk::Button (M("GENERAL_SAVE"))); - Gtk::Button* about = Gtk::manage (new Gtk::Button (M("GENERAL_ABOUT"))); - Gtk::Button* ok = Gtk::manage (new Gtk::Button (M("GENERAL_OK"))); - Gtk::Button* cancel = Gtk::manage (new Gtk::Button (M("GENERAL_CANCEL"))); - - save->set_image (*Gtk::manage(new Gtk::Image (Gtk::StockID("gtk-save"), Gtk::ICON_SIZE_BUTTON))); - load->set_image (*Gtk::manage(new Gtk::Image (Gtk::StockID("gtk-open"), Gtk::ICON_SIZE_BUTTON))); - about->set_image (*Gtk::manage(new Gtk::Image (argv0+"/images/logoicon16.png"))); - ok->set_image (*Gtk::manage(new Gtk::Image (Gtk::StockID("gtk-ok"), Gtk::ICON_SIZE_BUTTON))); - cancel->set_image (*Gtk::manage(new Gtk::Image (Gtk::StockID("gtk-cancel"), Gtk::ICON_SIZE_BUTTON))); - - - load->signal_clicked().connect( sigc::mem_fun(*this, &Preferences::loadPressed) ); - save->signal_clicked().connect( sigc::mem_fun(*this, &Preferences::savePressed) ); - about->signal_clicked().connect( sigc::mem_fun(*this, &Preferences::aboutPressed) ); - ok->signal_clicked().connect( sigc::mem_fun(*this, &Preferences::okPressed) ); - cancel->signal_clicked().connect( sigc::mem_fun(*this, &Preferences::cancelPressed) ); - - buttonpanel->pack_start (*load, Gtk::PACK_SHRINK, 4); - buttonpanel->pack_start (*save, Gtk::PACK_SHRINK, 4); - buttonpanel->pack_start (*about, Gtk::PACK_SHRINK, 4); - buttonpanel->pack_end (*ok, Gtk::PACK_SHRINK, 4); - buttonpanel->pack_end (*cancel, Gtk::PACK_SHRINK, 4); - - nb->append_page (*getGeneralPanel(), M("PREFERENCES_TAB_GENERAL")); - nb->append_page (*getProcParamsPanel(), M("PREFERENCES_TAB_IMPROC")); - nb->append_page (*getFileBrowserPanel(), M("PREFERENCES_TAB_BROWSER")); - nb->append_page (*getColorManagementPanel(),M("PREFERENCES_TAB_COLORMGR")); - nb->append_page (*getBatchProcPanel(), M("PREFERENCES_BATCH_PROCESSING")); - nb->set_current_page (initialPage); - - fillPreferences (); - - show_all_children (); - set_modal (true); -} - -Gtk::Widget* Preferences::getBatchProcPanel () { - - Gtk::VBox* mvbpp = Gtk::manage (new Gtk::VBox ()); - - Gtk::ScrolledWindow* behscrollw = Gtk::manage (new Gtk::ScrolledWindow ()); - behscrollw->set_policy (Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); - Gtk::Frame* behFrame = Gtk::manage (new Gtk::Frame (M("PREFERENCES_BEHAVIOR"))); - behFrame->add (*behscrollw); - mvbpp->pack_start (*behFrame); -// mvbpp->pack_start (*behFrame, Gtk::PACK_SHRINK, 2); - Gtk::TreeView* behTreeView = Gtk::manage (new Gtk::TreeView ()); - behscrollw->add (*behTreeView); - - behModel = Gtk::TreeStore::create (behavColumns); - behTreeView->set_model (behModel); - - behTreeView->append_column (M("PREFERENCES_PROPERTY"), behavColumns.label); - behTreeView->append_column_editable (M("PREFERENCES_ADD"), behavColumns.badd); - behTreeView->append_column_editable (M("PREFERENCES_SET"), behavColumns.bset); - - Gtk::CellRendererToggle* cr_add = static_cast (behTreeView->get_column (1)->get_first_cell_renderer()); - Gtk::CellRendererToggle* cr_set = static_cast (behTreeView->get_column (2)->get_first_cell_renderer()); - - cr_add->set_radio (true); - cr_add->set_property("xalign", 0.0f); - sigc::connection addc = cr_add->signal_toggled().connect (sigc::mem_fun (*this, &Preferences::behAddRadioToggled)); - cr_set->set_radio (true); - cr_set->set_property("xalign", 0.0f); - sigc::connection setc = cr_set->signal_toggled().connect (sigc::mem_fun (*this, &Preferences::behSetRadioToggled)); - - behTreeView->get_column (1)->add_attribute (*cr_add, "visible", behavColumns.visible); - behTreeView->get_column (1)->set_sizing(Gtk::TREE_VIEW_COLUMN_FIXED); - behTreeView->get_column (1)->set_fixed_width (50); - behTreeView->get_column (2)->add_attribute (*cr_set, "visible", behavColumns.visible); - behTreeView->get_column (2)->set_sizing(Gtk::TREE_VIEW_COLUMN_FIXED); - behTreeView->get_column (2)->set_fixed_width (50); - - // fill model - Gtk::TreeModel::iterator mi, ci; - - mi = behModel->append (); - mi->set_value (behavColumns.label, M("TP_EXPOSURE_LABEL")); - appendBehavList (mi, M("TP_EXPOSURE_EXPCOMP"), ADDSET_TC_EXPCOMP, false); - appendBehavList (mi, M("TP_EXPOSURE_BRIGHTNESS"), ADDSET_TC_BRIGHTNESS, false); - appendBehavList (mi, M("TP_EXPOSURE_BLACKLEVEL"), ADDSET_TC_BLACKLEVEL, false); - appendBehavList (mi, M("TP_EXPOSURE_CONTRAST"), ADDSET_TC_CONTRAST, false); - - mi = behModel->append (); - mi->set_value (behavColumns.label, M("TP_SHADOWSHLIGHTS_LABEL")); - appendBehavList (mi, M("TP_SHADOWSHLIGHTS_HIGHLIGHTS"), ADDSET_SH_HIGHLIGHTS, false); - appendBehavList (mi, M("TP_SHADOWSHLIGHTS_SHADOWS"), ADDSET_SH_SHADOWS, false); - appendBehavList (mi, M("TP_SHADOWSHLIGHTS_LOCALCONTR"), ADDSET_SH_LOCALCONTRAST, false); - - mi = behModel->append (); - mi->set_value (behavColumns.label, M("TP_LUMACURVE_LABEL")); - appendBehavList (mi, M("TP_LUMACURVE_BRIGHTNESS"), ADDSET_LC_BRIGHTNESS, false); - appendBehavList (mi, M("TP_LUMACURVE_CONTRAST"), ADDSET_LC_CONTRAST, false); - - mi = behModel->append (); - mi->set_value (behavColumns.label, M("TP_SHARPENING_LABEL")); - appendBehavList (mi, M("TP_SHARPENING_AMOUNT"), ADDSET_SHARP_AMOUNT, false); - - mi = behModel->append (); - mi->set_value (behavColumns.label, M("TP_LUMADENOISE_LABEL")); - appendBehavList (mi, M("TP_LUMADENOISE_EDGETOLERANCE"), ADDSET_LD_EDGETOLERANCE, true); - - mi = behModel->append (); - mi->set_value (behavColumns.label, M("TP_WBALANCE_LABEL")); - appendBehavList (mi, M("TP_WBALANCE_TEMPERATURE"), ADDSET_WB_TEMPERATURE, true); - appendBehavList (mi, M("TP_WBALANCE_GREEN"), ADDSET_WB_GREEN, true); - - mi = behModel->append (); - mi->set_value (behavColumns.label, M("TP_COLORBOOST_LABEL")); - appendBehavList (mi, M("TP_COLORBOOST_AMOUNT"), ADDSET_CBOOST_AMOUNT, false); - - mi = behModel->append (); - mi->set_value (behavColumns.label, M("TP_COLORSHIFT_LABEL")); - appendBehavList (mi, M("TP_COLORSHIFT_BLUEYELLOW"), ADDSET_CS_BLUEYELLOW, false); - appendBehavList (mi, M("TP_COLORSHIFT_GREENMAGENTA"), ADDSET_CS_GREENMAGENTA, false); - - mi = behModel->append (); - mi->set_value (behavColumns.label, M("TP_ROTATE_LABEL")); - appendBehavList (mi, M("TP_ROTATE_DEGREE"), ADDSET_ROTATE_DEGREE, false); - - mi = behModel->append (); - mi->set_value (behavColumns.label, M("TP_DISTORTION_LABEL")); - appendBehavList (mi, M("TP_DISTORTION_AMOUNT"), ADDSET_DIST_AMOUNT, false); - - mi = behModel->append (); - mi->set_value (behavColumns.label, M("TP_PERSPECTIVE_LABEL")); - appendBehavList (mi, M("TP_PERSPECTIVE_HORIZONTAL")+", "+M("TP_PERSPECTIVE_VERTICAL"), ADDSET_PERSPECTIVE, false); - - mi = behModel->append (); - mi->set_value (behavColumns.label, M("TP_CACORRECTION_LABEL")); - appendBehavList (mi, M("TP_CACORRECTION_BLUE")+", "+M("TP_CACORRECTION_RED"), ADDSET_CA, true); - - mi = behModel->append (); - mi->set_value (behavColumns.label, M("TP_VIGNETTING_LABEL")); - appendBehavList (mi, M("TP_VIGNETTING_AMOUNT"), ADDSET_VIGN_AMOUNT, false); - - behTreeView->expand_all (); - - return mvbpp; -} - -void Preferences::appendBehavList (Gtk::TreeModel::iterator& parent, Glib::ustring label, int id, bool set) { - - Gtk::TreeModel::iterator ci = behModel->append (parent->children()); - ci->set_value (behavColumns.label, label); - ci->set_value (behavColumns.visible, true); - ci->set_value (behavColumns.badd, !set); - ci->set_value (behavColumns.bset, set); - ci->set_value (behavColumns.addsetid, id); -} - -void Preferences::behAddRadioToggled (const Glib::ustring& path) { - - Gtk::TreeModel::iterator iter = behModel->get_iter (path); - bool set = iter->get_value (behavColumns.bset); - iter->set_value (behavColumns.bset, false); - iter->set_value (behavColumns.badd, true); -} - -void Preferences::behSetRadioToggled (const Glib::ustring& path) { - - Gtk::TreeModel::iterator iter = behModel->get_iter (path); - bool add = iter->get_value (behavColumns.badd); - iter->set_value (behavColumns.bset, true); - iter->set_value (behavColumns.badd, false); -} - -Gtk::Widget* Preferences::getProcParamsPanel () { - - Gtk::VBox* mvbpp = Gtk::manage (new Gtk::VBox ()); - - Gtk::Frame* fpp = Gtk::manage (new Gtk::Frame (M("PREFERENCES_IMPROCPARAMS"))); - Gtk::Label* drlab = Gtk::manage (new Gtk::Label (M("PREFERENCES_FORRAW")+":")); - rprofiles = Gtk::manage (new Gtk::ComboBoxText ()); - Gtk::Label* drimg = Gtk::manage (new Gtk::Label (M("PREFERENCES_FORIMAGE")+":")); - iprofiles = Gtk::manage (new Gtk::ComboBoxText ()); - Gtk::Table* defpt = Gtk::manage (new Gtk::Table (2, 2)); - defpt->attach (*drlab, 0, 1, 0, 1, Gtk::SHRINK, Gtk::SHRINK, 2, 2); - defpt->attach (*rprofiles, 1, 2, 0, 1, Gtk::EXPAND | Gtk::FILL, Gtk::SHRINK, 2, 2); - defpt->attach (*drimg, 0, 1, 1, 2, Gtk::SHRINK, Gtk::SHRINK, 2, 2); - defpt->attach (*iprofiles, 1, 2, 1, 2, Gtk::EXPAND | Gtk::FILL, Gtk::SHRINK, 2, 2); - fpp->add (*defpt); - - mvbpp->pack_start (*fpp, Gtk::PACK_SHRINK, 4); - - Gtk::Frame* fdp = Gtk::manage (new Gtk::Frame (M("PREFERENCES_PROFILEHANDLING"))); - Gtk::VBox* vbdp = Gtk::manage (new Gtk::VBox ()); - saveParamsFile = Gtk::manage (new Gtk::CheckButton (M("PREFERENCES_PROFILESAVEINPUT"))); - vbdp->pack_start (*saveParamsFile, Gtk::PACK_SHRINK, 4); - saveParamsCache = Gtk::manage (new Gtk::CheckButton (M("PREFERENCES_PROFILESAVECACHE"))); - vbdp->pack_start (*saveParamsCache, Gtk::PACK_SHRINK, 4); - Gtk::Label* lplab = Gtk::manage (new Gtk::Label (M("PREFERENCES_PROFILELOADPR")+":")); - loadParamsPreference = Gtk::manage (new Gtk::ComboBoxText ()); - loadParamsPreference->append_text (M("PREFERENCES_PROFILEPRCACHE")); - loadParamsPreference->append_text (M("PREFERENCES_PROFILEPRFILE")); - Gtk::HBox* hb41 = Gtk::manage (new Gtk::HBox ()); - hb41->pack_start (*lplab, Gtk::PACK_SHRINK, 4); - hb41->pack_start (*loadParamsPreference); - vbdp->pack_start (*hb41, Gtk::PACK_SHRINK, 4); - fdp->add (*vbdp); - mvbpp->pack_start (*fdp, Gtk::PACK_SHRINK, 4); - - 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(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:")); - Gtk::VBox* vbdf = Gtk::manage (new Gtk::VBox ()); - vbdf->pack_start( *hb42, Gtk::PACK_SHRINK, 4); - vbdf->pack_start( *dfLabel, Gtk::PACK_SHRINK, 4 ); - fdf->add( *vbdf ); - mvbpp->pack_start ( *fdf , Gtk::PACK_SHRINK, 4); - mvbpp->set_border_width (4); - - std::vector pnames; - if (options.multiUser) - parseDir (Options::rtdir + "/" + options.profilePath, pnames, paramFileExtension); - parseDir (argv0 + "/" + options.profilePath, pnames, paramFileExtension); - for (int i=0; iappend_text (pnames[i]); - iprofiles->append_text (pnames[i]); - } - - dfconn = darkFrameDir->signal_file_set().connect ( sigc::mem_fun(*this, &Preferences::darkFrameChanged), true); - - return mvbpp; -} - -Gtk::Widget* Preferences::getColorManagementPanel () { - - Gtk::VBox* mvbcm = Gtk::manage (new Gtk::VBox ()); - mvbcm->set_border_width (4); - - Gtk::Label* intlab = Gtk::manage (new Gtk::Label (M("PREFERENCES_CMETRICINTENT")+":")); - intent = Gtk::manage (new Gtk::ComboBoxText ()); - intent->append_text (M("PREFERENCES_INTENT_PERCEPTUAL")); - intent->append_text (M("PREFERENCES_INTENT_RELATIVE")); - intent->append_text (M("PREFERENCES_INTENT_SATURATION")); - intent->append_text (M("PREFERENCES_INTENT_ABSOLUTE")); - - iccDir = Gtk::manage (new Gtk::FileChooserButton (M("PREFERENCES_ICCDIR"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER)); - Gtk::Label* pdlabel = Gtk::manage (new Gtk::Label (M("PREFERENCES_ICCDIR")+":")); - - monProfile = Gtk::manage (new Gtk::FileChooserButton (M("PREFERENCES_MONITORICC"), Gtk::FILE_CHOOSER_ACTION_OPEN)); - Gtk::Label* mplabel = Gtk::manage (new Gtk::Label (M("PREFERENCES_MONITORICC")+":")); - - Gtk::Table* colt = Gtk::manage (new Gtk::Table (3, 2)); - colt->attach (*intlab, 0, 1, 0, 1, Gtk::SHRINK, Gtk::SHRINK, 2, 2); - colt->attach (*intent, 1, 2, 0, 1, Gtk::EXPAND | Gtk::FILL, Gtk::SHRINK, 2, 2); - colt->attach (*pdlabel, 0, 1, 1, 2, Gtk::SHRINK, Gtk::SHRINK, 2, 2); - colt->attach (*iccDir, 1, 2, 1, 2, Gtk::EXPAND | Gtk::FILL, Gtk::SHRINK, 2, 2); - colt->attach (*mplabel, 0, 1, 2, 3, Gtk::SHRINK, Gtk::SHRINK, 2, 2); - colt->attach (*monProfile, 1, 2, 2, 3, Gtk::EXPAND | Gtk::FILL, Gtk::SHRINK, 2, 2); - - mvbcm->pack_start (*colt, Gtk::PACK_SHRINK, 4); - - return mvbcm; -} - -Gtk::Widget* Preferences::getGeneralPanel () { - - Gtk::VBox* mvbsd = new Gtk::VBox (); - - Gtk::Frame* flang = new Gtk::Frame (M("PREFERENCES_DEFAULTLANG")); - Gtk::HBox* hblang = new Gtk::HBox (); - hblang->set_border_width (4); - Gtk::Label* langlab = new Gtk::Label (M("PREFERENCES_SELECTLANG")+":"); - languages = new Gtk::ComboBoxText (); - - std::vector langs; - parseDir (argv0 + "/languages", langs, ""); - for (int i=0; iappend_text (langs[i]); - } - } - - Gtk::Label* langw = new Gtk::Label (Glib::ustring("(") + M("PREFERENCES_APPLNEXTSTARTUP") + ")"); - hblang->pack_start (*langlab, Gtk::PACK_SHRINK, 4); - hblang->pack_start (*languages); - hblang->pack_end (*langw, Gtk::PACK_SHRINK, 4); - flang->add (*hblang); - mvbsd->pack_start (*flang, Gtk::PACK_SHRINK, 4); - - Gtk::Frame* ftheme = new Gtk::Frame (M("PREFERENCES_DEFAULTTHEME")); - Gtk::HBox* hbtheme = new Gtk::HBox (); - hbtheme->set_border_width (4); - Gtk::Label* themelab = new Gtk::Label (M("PREFERENCES_SELECTTHEME")+":"); - theme = new Gtk::ComboBoxText (); - - theme->append_text (Glib::ustring("(")+M("PREFERENCES_GTKTHEME")+")"); - theme->set_active (0); - std::vector themes; - parseDir (argv0 + "/themes", themes, ""); - for (int i=0; iappend_text (themes[i]); - - hbtheme->pack_start (*themelab, Gtk::PACK_SHRINK, 4); - hbtheme->pack_start (*theme); - ftheme->add (*hbtheme); - mvbsd->pack_start (*ftheme, Gtk::PACK_SHRINK, 4); - -//----- - - Gtk::Frame* frl = new Gtk::Frame (M("PREFERENCES_CLIPPINGIND")); - blinkClipped = new Gtk::CheckButton (M("PREFERENCES_BLINKCLIPPED")); - Gtk::VBox* vbrl = new Gtk::VBox (); - vbrl->set_border_width (4); - vbrl->pack_start (*blinkClipped, Gtk::PACK_SHRINK, 4); - - Gtk::HBox* vbhl = new Gtk::HBox (); - Gtk::Label* hll = new Gtk::Label (M("PREFERENCES_HLTHRESHOLD")+": "); - hlThresh = new Gtk::SpinButton (); - hlThresh->set_digits (0); - hlThresh->set_increments (1, 10); - hlThresh->set_range (0, 255); - vbhl->pack_start (*hll, Gtk::PACK_SHRINK, 8); - vbhl->pack_start (*hlThresh, Gtk::PACK_SHRINK, 8); - - vbrl->pack_start (*vbhl, Gtk::PACK_SHRINK, 4); - - Gtk::HBox* vbsh = new Gtk::HBox (); - Gtk::Label* shl = new Gtk::Label (M("PREFERENCES_SHTHRESHOLD")+": "); - shThresh = new Gtk::SpinButton (); - shThresh->show (); - shThresh->set_digits (0); - shThresh->set_increments (1, 10); - shThresh->set_range (0, 255); - vbsh->pack_start (*shl, Gtk::PACK_SHRINK, 8); - vbsh->pack_start (*shThresh, Gtk::PACK_SHRINK, 8); - vbrl->pack_start (*vbsh, Gtk::PACK_SHRINK, 4); - - frl->add (*vbrl); - mvbsd->pack_start (*frl, Gtk::PACK_SHRINK, 4); - -//----- - Gtk::Frame* fdf = new Gtk::Frame (M("PREFERENCES_DATEFORMAT")); - - Gtk::HBox* hb6 = new Gtk::HBox (); - Gtk::VBox* dfvb = new Gtk::VBox (); - Gtk::Label* dflab = new Gtk::Label (M("PREFERENCES_DATEFORMAT")+":"); - hb6->pack_start (*dflab, Gtk::PACK_SHRINK,4); - dateformat = new Gtk::Entry (); - dateformat->set_tooltip_markup (M("PREFERENCES_DATEFORMATHINT")); - dflab->set_tooltip_markup (M("PREFERENCES_DATEFORMATHINT")); - hb6->pack_start (*dateformat); - dfvb->pack_start (*hb6, Gtk::PACK_SHRINK, 4); - fdf->add (*dfvb); - dfvb->set_border_width (4); - - mvbsd->pack_start (*fdf, Gtk::PACK_SHRINK, 4); - - //----- - Gtk::Frame* fdg = new Gtk::Frame (M("PREFERENCES_EXTERNALEDITOR")); - Gtk::VBox* dgvb = new Gtk::VBox (); - - Gtk::HBox* hb7c = new Gtk::HBox (); - edOther = new Gtk::RadioButton (M("PREFERENCES_EDITORCMDLINE")+":"); - hb7c->pack_start (*edOther, Gtk::PACK_SHRINK,4); - editorToSendTo = new Gtk::Entry (); - hb7c->pack_start (*editorToSendTo); - Gtk::RadioButton::Group ge = edOther->get_group(); - -#ifdef __APPLE__ - Gtk::HBox* hb7 = new Gtk::HBox (); - edGimp = new Gtk::RadioButton ("GIMP"); - hb7->pack_start (*edGimp, Gtk::PACK_SHRINK,4); - dgvb->pack_start (*hb7, Gtk::PACK_SHRINK, 4); - edGimp->set_group (ge); - - Gtk::HBox* hb7b = new Gtk::HBox (); - edPS = new Gtk::RadioButton (M("PREFERENCES_PSPATH")+":"); - hb7b->pack_start (*edPS, Gtk::PACK_SHRINK,4); - psDir = new Gtk::FileChooserButton (M("PREFERENCES_PSPATH"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER); - hb7b->pack_start (*psDir); - dgvb->pack_start (*hb7b, Gtk::PACK_SHRINK, 4); - edPS->set_group (ge); -#elif defined _WIN32 - Gtk::HBox* hb7 = new Gtk::HBox (); - edGimp = new Gtk::RadioButton (M("PREFERENCES_GIMPPATH")+":"); - hb7->pack_start (*edGimp, Gtk::PACK_SHRINK,4); - gimpDir = new Gtk::FileChooserButton (M("PREFERENCES_GIMPPATH"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER); - hb7->pack_start (*gimpDir); - dgvb->pack_start (*hb7, Gtk::PACK_SHRINK, 4); - edGimp->set_group (ge); - - Gtk::HBox* hb7b = new Gtk::HBox (); - edPS = new Gtk::RadioButton (M("PREFERENCES_PSPATH")+":"); - hb7b->pack_start (*edPS, Gtk::PACK_SHRINK,4); - psDir = new Gtk::FileChooserButton (M("PREFERENCES_PSPATH"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER); - hb7b->pack_start (*psDir); - dgvb->pack_start (*hb7b, Gtk::PACK_SHRINK, 4); - edPS->set_group (ge); -#else - Gtk::HBox* hb7 = new Gtk::HBox (); - edGimp = new Gtk::RadioButton ("GIMP"); - hb7->pack_start (*edGimp, Gtk::PACK_SHRINK,4); - dgvb->pack_start (*hb7, Gtk::PACK_SHRINK, 4); - edGimp->set_group (ge); -#endif - - dgvb->pack_start (*hb7c, Gtk::PACK_SHRINK, 4); - dgvb->set_border_width (4); - fdg->add (*dgvb); - mvbsd->pack_start (*fdg, Gtk::PACK_SHRINK, 4); - - mvbsd->set_border_width (4); - - tconn = theme->signal_changed().connect( sigc::mem_fun(*this, &Preferences::themeChanged) ); - - return mvbsd; -} - -Gtk::Widget* Preferences::getFileBrowserPanel () { - - Gtk::VBox* mvbfb = new Gtk::VBox (); - mvbfb->set_border_width (4); - - Gtk::Frame* fsd = new Gtk::Frame (M("PREFERENCES_STARTUPIMDIR")); - - sdcurrent = new Gtk::RadioButton (M("PREFERENCES_DIRSOFTWARE")); - sdlast = new Gtk::RadioButton (M("PREFERENCES_DIRLAST")); - sdhome = new Gtk::RadioButton (M("PREFERENCES_DIRHOME")); - sdother = new Gtk::RadioButton (M("PREFERENCES_DIROTHER")+": "); - startupdir = new Gtk::Entry (); - - Gtk::Button* sdselect = new Gtk::Button (""); - sdselect->set_image (*(new Gtk::Image (Gtk::StockID("gtk-open"), Gtk::ICON_SIZE_BUTTON))); - - Gtk::RadioButton::Group opts = sdcurrent->get_group(); - sdlast->set_group (opts); - sdhome->set_group (opts); - sdother->set_group (opts); - - Gtk::VBox* vbsd = new Gtk::VBox (); - vbsd->pack_start (*sdcurrent, Gtk::PACK_SHRINK,0); - vbsd->pack_start (*sdlast, Gtk::PACK_SHRINK,0); - vbsd->pack_start (*sdhome, Gtk::PACK_SHRINK,0); - Gtk::HBox* otherbox = new Gtk::HBox (); - otherbox->pack_start (*sdother, Gtk::PACK_SHRINK); - otherbox->pack_start (*startupdir); - otherbox->pack_end (*sdselect, Gtk::PACK_SHRINK, 4); - vbsd->pack_start (*otherbox, Gtk::PACK_SHRINK, 0); - vbsd->set_border_width (4); - - fsd->add (*vbsd); - mvbfb->pack_start (*fsd, Gtk::PACK_SHRINK, 4); - - sdselect->signal_clicked().connect( sigc::mem_fun(*this, &Preferences::selectStartupDir) ); - -//--- - - - Gtk::Frame* fro = new Gtk::Frame (M("PREFERENCES_FBROWSEROPTS")); - showDateTime = new Gtk::CheckButton (M("PREFERENCES_SHOWDATETIME")); - showBasicExif = new Gtk::CheckButton (M("PREFERENCES_SHOWBASICEXIF")); - Gtk::VBox* vbro = new Gtk::VBox (); - overlayedFileNames = new Gtk::CheckButton (M("PREFERENCES_OVERLAY_FILENAMES")); - vbro->set_border_width (4); - vbro->pack_start (*showDateTime, Gtk::PACK_SHRINK, 0); - vbro->pack_start (*showBasicExif, Gtk::PACK_SHRINK, 0); - vbro->pack_start (*overlayedFileNames, Gtk::PACK_SHRINK, 4); - - fro->add (*vbro); - - Gtk::Frame* fre = new Gtk::Frame (M("PREFERENCES_PARSEDEXT")); - Gtk::VBox* vbre = new Gtk::VBox (); - vbre->set_border_width (4); - Gtk::HBox* hb0 = new Gtk::HBox (); - Gtk::Label* elab = new Gtk::Label (M("PREFERENCES_PARSEDEXTADD")+":"); - hb0->pack_start (*elab, Gtk::PACK_SHRINK, 4); - extension = new Gtk::Entry (); - hb0->pack_start (*extension); - addExt = new Gtk::Button (); - delExt = new Gtk::Button (); - addExt->set_tooltip_text (M("PREFERENCES_PARSEDEXTADDHINT")); - delExt->set_tooltip_text (M("PREFERENCES_PARSEDEXTDELHINT")); - Gtk::Image* addExtImg = new Gtk::Image (argv0+"/images/list-add12.png"); - Gtk::Image* delExtImg = new Gtk::Image (argv0+"/images/list-remove12r.png"); - addExt->add (*addExtImg); - delExt->add (*delExtImg); - hb0->pack_end (*delExt, Gtk::PACK_SHRINK, 4); - hb0->pack_end (*addExt, Gtk::PACK_SHRINK, 4); - extensions = new Gtk::TreeView (); - Gtk::ScrolledWindow* hscrollw = new Gtk::ScrolledWindow (); - hscrollw->set_policy (Gtk::POLICY_AUTOMATIC, Gtk::POLICY_ALWAYS); - hscrollw->add (*extensions); - extensionModel = Gtk::ListStore::create (extensionColumns); - extensions->set_model (extensionModel); - extensions->append_column_editable("Enabled", extensionColumns.enabled); - extensions->append_column("Extension", extensionColumns.ext); - extensions->set_headers_visible (false); - vbre->pack_start (*hscrollw); - vbre->pack_start (*hb0, Gtk::PACK_SHRINK, 0); - - fre->add (*vbre); - - Gtk::Frame* frc = new Gtk::Frame (M("PREFERENCES_CACHEOPTS")); - Gtk::VBox* vbc = new Gtk::VBox (); - frc->add (*vbc); - vbc->set_border_width (4); - - Gtk::Label* cflab = new Gtk::Label (M("PREFERENCES_CACHETHUMBFORM")+":"); - cformat = new Gtk::ComboBoxText (); - cformat->append_text (M("PREFERENCES_CACHEFORMAT1")); - cformat->append_text (M("PREFERENCES_CACHEFORMAT2")); - cformat->append_text (M("PREFERENCES_CACHEFORMAT1")+", 16 bit"); - Gtk::HBox* hb2 = new Gtk::HBox (); - hb2->pack_start (*cflab, Gtk::PACK_SHRINK, 4); - hb2->pack_start (*cformat); - vbc->pack_start (*hb2, Gtk::PACK_SHRINK, 0); - - Gtk::HBox* hb3 = new Gtk::HBox (); - Gtk::Label* chlab = new Gtk::Label (M("PREFERENCES_CACHETHUMBHEIGHT")+":"); - maxThumbSize = new Gtk::SpinButton (); - hb3->pack_start (*chlab, Gtk::PACK_SHRINK, 8); - hb3->pack_start (*maxThumbSize, Gtk::PACK_SHRINK, 8); - - maxThumbSize->set_digits (0); - maxThumbSize->set_increments (1, 10); - maxThumbSize->set_range (40, 400); - vbc->pack_start (*hb3, Gtk::PACK_SHRINK, 0); - - Gtk::HBox* hb4 = new Gtk::HBox (); - Gtk::Label* celab = new Gtk::Label (M("PREFERENCES_CACHEMAXENTRIES")+":"); - maxCacheEntries = new Gtk::SpinButton (); - hb4->pack_start (*celab, Gtk::PACK_SHRINK, 8); - hb4->pack_start (*maxCacheEntries, Gtk::PACK_SHRINK, 8); - - maxCacheEntries->set_digits (0); - maxCacheEntries->set_increments (1, 10); - maxCacheEntries->set_range (10, 100000); - vbc->pack_start (*hb4, Gtk::PACK_SHRINK, 0); - - Gtk::HBox* hb5 = new Gtk::HBox (); - clearThumbnails = new Gtk::Button (M("PREFERENCES_CACHECLEARTHUMBS")); - clearProfiles = new Gtk::Button (M("PREFERENCES_CACHECLEARPROFILES")); - clearAll = new Gtk::Button (M("PREFERENCES_CACHECLEARALL")); - hb5->pack_start (*clearThumbnails, Gtk::PACK_SHRINK, 8); - hb5->pack_start (*clearProfiles, Gtk::PACK_SHRINK, 8); - hb5->pack_start (*clearAll, Gtk::PACK_SHRINK, 8); - vbc->pack_start (*hb5, Gtk::PACK_SHRINK, 0); - - Gtk::HBox* hb6 = new Gtk::HBox (); - Gtk::VBox* vb6 = new Gtk::VBox (); - - vb6->pack_start (*fro); - vb6->pack_end (*frc); - hb6->pack_start (*vb6); - hb6->pack_start (*fre); - - mvbfb->pack_start (*hb6, Gtk::PACK_SHRINK, 4); - -// mvbfb->pack_start (*fro, Gtk::PACK_SHRINK, 4); -// mvbfb->pack_start (*fre); -// mvbfb->pack_start (*frc, Gtk::PACK_SHRINK, 4); - - addExt->signal_clicked().connect( sigc::mem_fun(*this, &Preferences::addExtPressed) ); - delExt->signal_clicked().connect( sigc::mem_fun(*this, &Preferences::delExtPressed) ); - extension->signal_activate().connect( sigc::mem_fun(*this, &Preferences::addExtPressed) ); - clearThumbnails->signal_clicked().connect( sigc::mem_fun(*this, &Preferences::clearThumbImagesPressed) ); - clearProfiles->signal_clicked().connect( sigc::mem_fun(*this, &Preferences::clearProfilesPressed) ); - clearAll->signal_clicked().connect( sigc::mem_fun(*this, &Preferences::clearAllPressed) ); - - return mvbfb; -} - -void Preferences::parseDir (Glib::ustring dirname, std::vector& items, Glib::ustring ext) { - - // process directory - Glib::Dir* dir = NULL; - try { - dir = new Glib::Dir (dirname); - } - catch (const Glib::FileError& fe) { - return; - } - dirname = dirname + "/"; - for (Glib::DirIterator i = dir->begin(); i!=dir->end(); ++i) { - Glib::ustring fname = dirname + *i; - Glib::ustring sname = *i; - // ignore directories - if (!Glib::file_test (fname, Glib::FILE_TEST_IS_DIR) && sname.size() >= ext.size() && sname.substr (sname.size()-ext.size(), ext.size()).casefold() == ext) - items.push_back (sname.substr(0,sname.size()-ext.size())); - } - delete dir; -} - -void Preferences::storePreferences () { - - moptions.defProfRaw = rprofiles->get_active_text(); - moptions.defProfImg = iprofiles->get_active_text(); - moptions.dateFormat = dateformat->get_text(); - moptions.fbShowDateTime = showDateTime->get_active (); - moptions.fbShowBasicExif = showBasicExif->get_active (); - moptions.blinkClipped = blinkClipped->get_active (); - moptions.highlightThreshold = (int)hlThresh->get_value (); - moptions.shadowThreshold = (int)shThresh->get_value (); - moptions.language = languages->get_active_text (); - moptions.theme = theme->get_active_text (); -#ifdef _WIN32 - moptions.gimpDir = gimpDir->get_filename (); - moptions.psDir = psDir->get_filename (); -#elif defined __APPLE__ - moptions.psDir = psDir->get_filename (); -#endif - moptions.customEditorProg = editorToSendTo->get_text (); - if (edGimp->get_active ()) - moptions.editorToSendTo = 1; -#ifdef _WIN32 - else if (edPS->get_active ()) - moptions.editorToSendTo = 2; -#elif defined __APPLE__ - else if (edPS->get_active ()) - moptions.editorToSendTo = 2; -#endif - else if (edOther->get_active ()) - moptions.editorToSendTo = 3; - - - moptions.rtSettings.monitorProfile = monProfile->get_filename (); - moptions.rtSettings.iccDirectory = iccDir->get_filename (); - moptions.rtSettings.colorimetricIntent = intent->get_active_row_number (); - - if (sdcurrent->get_active ()) - moptions.startupDir = STARTUPDIR_CURRENT; - else if (sdhome->get_active ()) - moptions.startupDir = STARTUPDIR_HOME; - else if (sdlast->get_active ()) - moptions.startupDir = STARTUPDIR_LAST; - else if (sdother->get_active ()) { - moptions.startupDir = STARTUPDIR_CUSTOM; - moptions.startupPath = startupdir->get_text(); - } - - moptions.parseExtensions.clear (); - moptions.parseExtensionsEnabled.clear (); - Gtk::TreeNodeChildren c = extensionModel->children (); - for (int i=0; iget_active_row_number() == 0) - moptions.thumbnailFormat = FT_Custom; - else if (cformat->get_active_row_number() == 1) - moptions.thumbnailFormat = FT_Jpeg; - else if (cformat->get_active_row_number() == 2) - moptions.thumbnailFormat = FT_Custom16; - - moptions.maxThumbnailHeight = (int)maxThumbSize->get_value (); - moptions.maxCacheEntries = (int)maxCacheEntries->get_value (); - moptions.overlayedFileNames = overlayedFileNames->get_active (); - - moptions.saveParamsFile = saveParamsFile->get_active (); - moptions.saveParamsCache = saveParamsCache->get_active (); - moptions.paramsLoadLocation = (PPLoadLocation)loadParamsPreference->get_active_row_number (); - - moptions.rtSettings.darkFramesPath = darkFrameDir->get_filename(); - - int i = 0; - moptions.baBehav.resize (ADDSET_PARAM_NUM); - for (Gtk::TreeIter sections=behModel->children().begin(); sections!=behModel->children().end(); sections++) - for (Gtk::TreeIter adjs=sections->children().begin(); adjs!=sections->children().end(); adjs++) - moptions.baBehav[adjs->get_value (behavColumns.addsetid)] = adjs->get_value (behavColumns.badd); -} - -void Preferences::fillPreferences () { - - tconn.block (true); - dfconn.block (true); - - rprofiles->set_active_text (moptions.defProfRaw); - iprofiles->set_active_text (moptions.defProfImg); - dateformat->set_text (moptions.dateFormat); - if (Glib::file_test (moptions.rtSettings.monitorProfile, Glib::FILE_TEST_EXISTS)) - monProfile->set_filename (moptions.rtSettings.monitorProfile); - if (Glib::file_test (moptions.rtSettings.iccDirectory, Glib::FILE_TEST_IS_DIR)) - iccDir->set_filename (moptions.rtSettings.iccDirectory); - intent->set_active (moptions.rtSettings.colorimetricIntent); - languages->set_active_text (moptions.language); - theme->set_active_text (moptions.theme); - showDateTime->set_active (moptions.fbShowDateTime); - showBasicExif->set_active (moptions.fbShowBasicExif); - blinkClipped->set_active (moptions.blinkClipped); - hlThresh->set_value (moptions.highlightThreshold); - shThresh->set_value (moptions.shadowThreshold); - - edGimp->set_active (moptions.editorToSendTo==1); - edOther->set_active (moptions.editorToSendTo==3); -#ifdef _WIN32 - edPS->set_active (moptions.editorToSendTo==2); - if (Glib::file_test (moptions.gimpDir, Glib::FILE_TEST_IS_DIR)) - gimpDir->set_filename (moptions.gimpDir); - if (Glib::file_test (moptions.psDir, Glib::FILE_TEST_IS_DIR)) - psDir->set_filename (moptions.psDir); -#elif defined __APPLE__ - edPS->set_active (moptions.editorToSendTo==2); - if (Glib::file_test (moptions.psDir, Glib::FILE_TEST_IS_DIR)) - psDir->set_filename (moptions.psDir); -#endif - editorToSendTo->set_text (moptions.customEditorProg); - - if (moptions.startupDir==STARTUPDIR_CURRENT) - sdcurrent->set_active (); - else if (moptions.startupDir==STARTUPDIR_LAST) - sdlast->set_active (); - else if (moptions.startupDir==STARTUPDIR_HOME) - sdhome->set_active (); - else if (moptions.startupDir==STARTUPDIR_CUSTOM) { - sdother->set_active (); - startupdir->set_text (moptions.startupPath); - } - - extensionModel->clear (); - for (int i=0; iappend()); - row[extensionColumns.enabled] = moptions.parseExtensionsEnabled[i]; - row[extensionColumns.ext] = moptions.parseExtensions[i]; - } - - if (moptions.thumbnailFormat == FT_Custom) - cformat->set_active (0); - else if (moptions.thumbnailFormat == FT_Jpeg) - cformat->set_active (1); - else if (moptions.thumbnailFormat == FT_Custom16) - cformat->set_active (2); - - maxThumbSize->set_value (moptions.maxThumbnailHeight); - maxCacheEntries->set_value (moptions.maxCacheEntries); - overlayedFileNames->set_active (moptions.overlayedFileNames); - - saveParamsFile->set_active (moptions.saveParamsFile); - saveParamsCache->set_active (moptions.saveParamsCache); - loadParamsPreference->set_active (moptions.paramsLoadLocation); - - darkFrameDir->set_filename( moptions.rtSettings.darkFramesPath ); - updateDFinfos(); - - addc.block (true); - setc.block (true); - if (moptions.baBehav.size() == ADDSET_PARAM_NUM) { - for (int i=0; ichildren().begin(); sections!=behModel->children().end(); sections++) - for (Gtk::TreeIter adjs=sections->children().begin(); adjs!=sections->children().end(); adjs++) - if (adjs->get_value (behavColumns.addsetid) == i) { - adjs->set_value (behavColumns.badd, moptions.baBehav[i]==1); - adjs->set_value (behavColumns.bset, moptions.baBehav[i]!=1); - break; - } - } - addc.block (false); - setc.block (false); - tconn.block (false); - dfconn.block (false); -} - -void Preferences::loadPressed () { - - moptions.copyFrom (&options); - fillPreferences (); -} - -void Preferences::savePressed () { - - storePreferences (); - options.copyFrom (&moptions); - Options::save (); -} - -void Preferences::okPressed () { - - storePreferences (); - options.copyFrom (&moptions); - hide (); -} - -void Preferences::cancelPressed () { - - hide (); -} - -void Preferences::selectStartupDir () { - - Gtk::FileChooserDialog dialog(M("PREFERENCES_DIRSELECTDLG"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER); -// dialog.set_transient_for(*this); - - //Add response buttons the the dialog: - dialog.add_button(Gtk::StockID("gtk-cancel"), Gtk::RESPONSE_CANCEL); - dialog.add_button(Gtk::StockID("gtk-open"), Gtk::RESPONSE_OK); - - int result = dialog.run(); - - if (result==Gtk::RESPONSE_OK) - startupdir->set_text (dialog.get_filename()); -} - -void Preferences::aboutPressed () { - - Splash* splash = new Splash (-1); - splash->set_transient_for (*this); - splash->set_modal (true); - splash->show (); -} -void Preferences::themeChanged () { - - std::vector files; - files.push_back (argv0+"/themes/"+theme->get_active_text ()); - Gtk::RC::set_default_files (files); - Gtk::RC::reparse_all (Gtk::Settings::get_default()); - GdkEventClient event = { GDK_CLIENT_EVENT, NULL, TRUE, gdk_atom_intern("_GTK_READ_RCFILES", FALSE), 8 }; - gdk_event_send_clientmessage_toall ((GdkEvent*)&event); -} - -void Preferences::addExtPressed () { - - Gtk::TreeNodeChildren c = extensionModel->children (); - for (int i=0; iget_text ()) - return; - - Gtk::TreeRow row = *(extensionModel->append()); - - row[extensionColumns.enabled] = true; - row[extensionColumns.ext] = extension->get_text (); -} - -void Preferences::delExtPressed () { - - extensionModel->erase (extensions->get_selection()->get_selected ()); -} - -void Preferences::clearProfilesPressed () { - - Gtk::MessageDialog md (*this, M("PREFERENCES_CLEARDLG_LINE1"), false, Gtk::MESSAGE_INFO, Gtk::BUTTONS_NONE, true); - md.set_secondary_text (M("PREFERENCES_CLEARDLG_LINE2")); - md.set_title (M("PREFERENCES_CLEARDLG_TITLE")); - md.show_all (); - while (gtk_events_pending ()) gtk_main_iteration (); - cacheMgr.clearProfiles (); - md.hide (); -} - -void Preferences::clearThumbImagesPressed () { - - Gtk::MessageDialog md (*this, M("PREFERENCES_CLEARDLG_LINE1"), false, Gtk::MESSAGE_INFO, Gtk::BUTTONS_NONE, true); - md.set_secondary_text (M("PREFERENCES_CLEARDLG_LINE2")); - md.set_title (M("PREFERENCES_CLEARDLG_TITLE")); - md.show_all (); - while (gtk_events_pending ()) gtk_main_iteration (); - cacheMgr.clearThumbImages (); - md.hide (); -} - -void Preferences::clearAllPressed () { - - Gtk::MessageDialog md (*this, M("PREFERENCES_CLEARDLG_LINE1"), false, Gtk::MESSAGE_INFO, Gtk::BUTTONS_NONE, true); - md.set_secondary_text (M("PREFERENCES_CLEARDLG_LINE2")); - md.set_title (M("PREFERENCES_CLEARDLG_TITLE")); - md.show_all (); - while (gtk_events_pending ()) gtk_main_iteration (); - cacheMgr.clearAll (); - md.hide (); -} - -void Preferences::darkFrameChanged () -{ - Glib::ustring s(darkFrameDir->get_filename()); - if( s.compare( rtengine::dfm.getPathname()) !=0 ){ - rtengine::dfm.init( s ); - updateDFinfos(); - } -} -void Preferences::updateDFinfos() -{ - int t1,t2; - rtengine::dfm.getStat(t1,t2); - std::ostringstream s; - s << "Found: "<< t1 << " shots, " << t2 << " templates"; - dfLabel->set_text(s.str()); -} +/* + * 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 +#include "preferences.h" +#include +#include +#include +#include +#include +#include + +extern Options options; +extern Glib::ustring argv0; + +Preferences::Preferences (RTWindow *rtwindow):parent(rtwindow) { + + set_title (M("MAIN_BUTTON_PREFERENCES")); + + moptions.copyFrom (&options); + + set_size_request (650, 650); + set_border_width (4); + + Gtk::VBox* mainvb = get_vbox (); + set_has_separator (false); + + Gtk::Notebook* nb = Gtk::manage (new Gtk::Notebook ()); + mainvb->pack_start (*nb); + + Gtk::HSeparator* hsep1 = Gtk::manage (new Gtk::HSeparator ()); + mainvb->pack_start (*hsep1, Gtk::PACK_SHRINK, 2); + + Gtk::HBox* buttonpanel = Gtk::manage (new Gtk::HBox ()); + mainvb->pack_end (*buttonpanel, Gtk::PACK_SHRINK, 2); + +// Gtk::Button* load = Gtk::manage (new Gtk::Button (M("GENERAL_LOAD"))); +// Gtk::Button* save = Gtk::manage (new Gtk::Button (M("GENERAL_SAVE"))); + Gtk::Button* about = Gtk::manage (new Gtk::Button (M("GENERAL_ABOUT"))); + Gtk::Button* ok = Gtk::manage (new Gtk::Button (M("GENERAL_OK"))); + Gtk::Button* cancel = Gtk::manage (new Gtk::Button (M("GENERAL_CANCEL"))); + +// save->set_image (*Gtk::manage(new Gtk::Image (Gtk::StockID("gtk-save"), Gtk::ICON_SIZE_BUTTON))); +// load->set_image (*Gtk::manage(new Gtk::Image (Gtk::StockID("gtk-open"), Gtk::ICON_SIZE_BUTTON))); + about->set_image (*Gtk::manage(new Gtk::Image (argv0+"/images/logoicon16.png"))); + ok->set_image (*Gtk::manage(new Gtk::Image (Gtk::StockID("gtk-ok"), Gtk::ICON_SIZE_BUTTON))); + cancel->set_image (*Gtk::manage(new Gtk::Image (Gtk::StockID("gtk-cancel"), Gtk::ICON_SIZE_BUTTON))); + + +// load->signal_clicked().connect( sigc::mem_fun(*this, &Preferences::loadPressed) ); +// save->signal_clicked().connect( sigc::mem_fun(*this, &Preferences::savePressed) ); + about->signal_clicked().connect( sigc::mem_fun(*this, &Preferences::aboutPressed) ); + ok->signal_clicked().connect( sigc::mem_fun(*this, &Preferences::okPressed) ); + cancel->signal_clicked().connect( sigc::mem_fun(*this, &Preferences::cancelPressed) ); + +// buttonpanel->pack_start (*load, Gtk::PACK_SHRINK, 4); +// buttonpanel->pack_start (*save, Gtk::PACK_SHRINK, 4); + buttonpanel->pack_start (*about, Gtk::PACK_SHRINK, 4); + buttonpanel->pack_end (*ok, Gtk::PACK_SHRINK, 4); + buttonpanel->pack_end (*cancel, Gtk::PACK_SHRINK, 4); + + nb->append_page (*getGeneralPanel(), M("PREFERENCES_TAB_GENERAL")); + nb->append_page (*getProcParamsPanel(), M("PREFERENCES_TAB_IMPROC")); + nb->append_page (*getFileBrowserPanel(), M("PREFERENCES_TAB_BROWSER")); + nb->append_page (*getColorManagementPanel(),M("PREFERENCES_TAB_COLORMGR")); + nb->append_page (*getBatchProcPanel(), M("PREFERENCES_BATCH_PROCESSING")); + nb->set_current_page (0); + + fillPreferences (); + + show_all_children (); + set_modal (true); +} + +Gtk::Widget* Preferences::getBatchProcPanel () { + + Gtk::VBox* mvbpp = Gtk::manage (new Gtk::VBox ()); + + Gtk::ScrolledWindow* behscrollw = Gtk::manage (new Gtk::ScrolledWindow ()); + behscrollw->set_policy (Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); + Gtk::Frame* behFrame = Gtk::manage (new Gtk::Frame (M("PREFERENCES_BEHAVIOR"))); + behFrame->add (*behscrollw); + mvbpp->pack_start (*behFrame); +// mvbpp->pack_start (*behFrame, Gtk::PACK_SHRINK, 2); + Gtk::TreeView* behTreeView = Gtk::manage (new Gtk::TreeView ()); + behscrollw->add (*behTreeView); + + behModel = Gtk::TreeStore::create (behavColumns); + behTreeView->set_model (behModel); + + behTreeView->append_column (M("PREFERENCES_PROPERTY"), behavColumns.label); + behTreeView->append_column_editable (M("PREFERENCES_ADD"), behavColumns.badd); + behTreeView->append_column_editable (M("PREFERENCES_SET"), behavColumns.bset); + + Gtk::CellRendererToggle* cr_add = static_cast (behTreeView->get_column (1)->get_first_cell_renderer()); + Gtk::CellRendererToggle* cr_set = static_cast (behTreeView->get_column (2)->get_first_cell_renderer()); + + cr_add->set_radio (true); + cr_add->set_property("xalign", 0.0f); + sigc::connection addc = cr_add->signal_toggled().connect (sigc::mem_fun (*this, &Preferences::behAddRadioToggled)); + cr_set->set_radio (true); + cr_set->set_property("xalign", 0.0f); + sigc::connection setc = cr_set->signal_toggled().connect (sigc::mem_fun (*this, &Preferences::behSetRadioToggled)); + + behTreeView->get_column (1)->add_attribute (*cr_add, "visible", behavColumns.visible); + behTreeView->get_column (1)->set_sizing(Gtk::TREE_VIEW_COLUMN_FIXED); + behTreeView->get_column (1)->set_fixed_width (50); + behTreeView->get_column (2)->add_attribute (*cr_set, "visible", behavColumns.visible); + behTreeView->get_column (2)->set_sizing(Gtk::TREE_VIEW_COLUMN_FIXED); + behTreeView->get_column (2)->set_fixed_width (50); + + // fill model + Gtk::TreeModel::iterator mi, ci; + + mi = behModel->append (); + mi->set_value (behavColumns.label, M("TP_EXPOSURE_LABEL")); + appendBehavList (mi, M("TP_EXPOSURE_EXPCOMP"), ADDSET_TC_EXPCOMP, false); + appendBehavList (mi, M("TP_EXPOSURE_BRIGHTNESS"), ADDSET_TC_BRIGHTNESS, false); + appendBehavList (mi, M("TP_EXPOSURE_BLACKLEVEL"), ADDSET_TC_BLACKLEVEL, false); + appendBehavList (mi, M("TP_EXPOSURE_CONTRAST"), ADDSET_TC_CONTRAST, false); + + mi = behModel->append (); + mi->set_value (behavColumns.label, M("TP_SHADOWSHLIGHTS_LABEL")); + appendBehavList (mi, M("TP_SHADOWSHLIGHTS_HIGHLIGHTS"), ADDSET_SH_HIGHLIGHTS, false); + appendBehavList (mi, M("TP_SHADOWSHLIGHTS_SHADOWS"), ADDSET_SH_SHADOWS, false); + appendBehavList (mi, M("TP_SHADOWSHLIGHTS_LOCALCONTR"), ADDSET_SH_LOCALCONTRAST, false); + + mi = behModel->append (); + mi->set_value (behavColumns.label, M("TP_LABCURVE_LABEL")); + appendBehavList (mi, M("TP_LABCURVE_BRIGHTNESS"), ADDSET_LC_BRIGHTNESS, false); + appendBehavList (mi, M("TP_LABCURVE_CONTRAST"), ADDSET_LC_CONTRAST, false); + appendBehavList (mi, M("TP_LABCURVE_SATURATION"), ADDSET_LC_SATURATION, false); + + mi = behModel->append (); + mi->set_value (behavColumns.label, M("TP_SHARPENING_LABEL")); + appendBehavList (mi, M("TP_SHARPENING_AMOUNT"), ADDSET_SHARP_AMOUNT, false); + + mi = behModel->append (); + mi->set_value (behavColumns.label, M("TP_LUMADENOISE_LABEL")); + appendBehavList (mi, M("TP_LUMADENOISE_EDGETOLERANCE"), ADDSET_LD_EDGETOLERANCE, true); + + mi = behModel->append (); + mi->set_value (behavColumns.label, M("TP_WBALANCE_LABEL")); + appendBehavList (mi, M("TP_WBALANCE_TEMPERATURE"), ADDSET_WB_TEMPERATURE, true); + appendBehavList (mi, M("TP_WBALANCE_GREEN"), ADDSET_WB_GREEN, true); + + mi = behModel->append (); + mi->set_value (behavColumns.label, M("TP_COLORBOOST_LABEL")); + appendBehavList (mi, M("TP_COLORBOOST_AMOUNT"), ADDSET_CBOOST_AMOUNT, false); + + mi = behModel->append (); + mi->set_value (behavColumns.label, M("TP_COLORSHIFT_LABEL")); + appendBehavList (mi, M("TP_COLORSHIFT_BLUEYELLOW"), ADDSET_CS_BLUEYELLOW, false); + appendBehavList (mi, M("TP_COLORSHIFT_GREENMAGENTA"), ADDSET_CS_GREENMAGENTA, false); + + mi = behModel->append (); + mi->set_value (behavColumns.label, M("TP_ROTATE_LABEL")); + appendBehavList (mi, M("TP_ROTATE_DEGREE"), ADDSET_ROTATE_DEGREE, false); + + mi = behModel->append (); + mi->set_value (behavColumns.label, M("TP_DISTORTION_LABEL")); + appendBehavList (mi, M("TP_DISTORTION_AMOUNT"), ADDSET_DIST_AMOUNT, false); + + mi = behModel->append (); + mi->set_value (behavColumns.label, M("TP_PERSPECTIVE_LABEL")); + appendBehavList (mi, M("TP_PERSPECTIVE_HORIZONTAL")+", "+M("TP_PERSPECTIVE_VERTICAL"), ADDSET_PERSPECTIVE, false); + + mi = behModel->append (); + mi->set_value (behavColumns.label, M("TP_CACORRECTION_LABEL")); + appendBehavList (mi, M("TP_CACORRECTION_BLUE")+", "+M("TP_CACORRECTION_RED"), ADDSET_CA, true); + + mi = behModel->append (); + mi->set_value (behavColumns.label, M("TP_VIGNETTING_LABEL")); + appendBehavList (mi, M("TP_VIGNETTING_AMOUNT"), ADDSET_VIGN_AMOUNT, false); + + behTreeView->expand_all (); + + return mvbpp; +} + +void Preferences::appendBehavList (Gtk::TreeModel::iterator& parent, Glib::ustring label, int id, bool set) { + + Gtk::TreeModel::iterator ci = behModel->append (parent->children()); + ci->set_value (behavColumns.label, label); + ci->set_value (behavColumns.visible, true); + ci->set_value (behavColumns.badd, !set); + ci->set_value (behavColumns.bset, set); + ci->set_value (behavColumns.addsetid, id); +} + +void Preferences::behAddRadioToggled (const Glib::ustring& path) { + + Gtk::TreeModel::iterator iter = behModel->get_iter (path); + bool set = iter->get_value (behavColumns.bset); + iter->set_value (behavColumns.bset, false); + iter->set_value (behavColumns.badd, true); +} + +void Preferences::behSetRadioToggled (const Glib::ustring& path) { + + Gtk::TreeModel::iterator iter = behModel->get_iter (path); + bool add = iter->get_value (behavColumns.badd); + iter->set_value (behavColumns.bset, true); + iter->set_value (behavColumns.badd, false); +} + +Gtk::Widget* Preferences::getProcParamsPanel () { + + Gtk::VBox* mvbpp = Gtk::manage (new Gtk::VBox ()); + + Gtk::Frame* fpp = Gtk::manage (new Gtk::Frame (M("PREFERENCES_IMPROCPARAMS"))); + Gtk::Label* drlab = Gtk::manage (new Gtk::Label (M("PREFERENCES_FORRAW")+":")); + rprofiles = Gtk::manage (new Gtk::ComboBoxText ()); + Gtk::Label* drimg = Gtk::manage (new Gtk::Label (M("PREFERENCES_FORIMAGE")+":")); + iprofiles = Gtk::manage (new Gtk::ComboBoxText ()); + Gtk::Table* defpt = Gtk::manage (new Gtk::Table (2, 2)); + defpt->attach (*drlab, 0, 1, 0, 1, Gtk::SHRINK, Gtk::SHRINK, 2, 2); + defpt->attach (*rprofiles, 1, 2, 0, 1, Gtk::EXPAND | Gtk::FILL, Gtk::SHRINK, 2, 2); + defpt->attach (*drimg, 0, 1, 1, 2, Gtk::SHRINK, Gtk::SHRINK, 2, 2); + defpt->attach (*iprofiles, 1, 2, 1, 2, Gtk::EXPAND | Gtk::FILL, Gtk::SHRINK, 2, 2); + fpp->add (*defpt); + + mvbpp->pack_start (*fpp, Gtk::PACK_SHRINK, 4); + + Gtk::Frame* fdp = Gtk::manage (new Gtk::Frame (M("PREFERENCES_PROFILEHANDLING"))); + Gtk::VBox* vbdp = Gtk::manage (new Gtk::VBox ()); + saveParamsFile = Gtk::manage (new Gtk::CheckButton (M("PREFERENCES_PROFILESAVEINPUT"))); + vbdp->pack_start (*saveParamsFile, Gtk::PACK_SHRINK, 4); + saveParamsCache = Gtk::manage (new Gtk::CheckButton (M("PREFERENCES_PROFILESAVECACHE"))); + vbdp->pack_start (*saveParamsCache, Gtk::PACK_SHRINK, 4); + Gtk::Label* lplab = Gtk::manage (new Gtk::Label (M("PREFERENCES_PROFILELOADPR")+":")); + loadParamsPreference = Gtk::manage (new Gtk::ComboBoxText ()); + loadParamsPreference->append_text (M("PREFERENCES_PROFILEPRCACHE")); + loadParamsPreference->append_text (M("PREFERENCES_PROFILEPRFILE")); + Gtk::HBox* hb41 = Gtk::manage (new Gtk::HBox ()); + hb41->pack_start (*lplab, Gtk::PACK_SHRINK, 4); + hb41->pack_start (*loadParamsPreference); + vbdp->pack_start (*hb41, Gtk::PACK_SHRINK, 4); + fdp->add (*vbdp); + mvbpp->pack_start (*fdp, Gtk::PACK_SHRINK, 4); + + 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(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:")); + Gtk::VBox* vbdf = Gtk::manage (new Gtk::VBox ()); + vbdf->pack_start( *hb42, Gtk::PACK_SHRINK, 4); + vbdf->pack_start( *dfLabel, Gtk::PACK_SHRINK, 4 ); + fdf->add( *vbdf ); + mvbpp->pack_start ( *fdf , Gtk::PACK_SHRINK, 4); + mvbpp->set_border_width (4); + + std::vector pnames; + if (options.multiUser) + parseDir (Options::rtdir + "/" + options.profilePath, pnames, paramFileExtension); + parseDir (argv0 + "/" + options.profilePath, pnames, paramFileExtension); + for (int i=0; iappend_text (pnames[i]); + iprofiles->append_text (pnames[i]); + } + + dfconn = darkFrameDir->signal_file_set().connect ( sigc::mem_fun(*this, &Preferences::darkFrameChanged), true); + + return mvbpp; +} + +Gtk::Widget* Preferences::getColorManagementPanel () { + + Gtk::VBox* mvbcm = Gtk::manage (new Gtk::VBox ()); + mvbcm->set_border_width (4); + + Gtk::Label* intlab = Gtk::manage (new Gtk::Label (M("PREFERENCES_CMETRICINTENT")+":")); + intent = Gtk::manage (new Gtk::ComboBoxText ()); + intent->append_text (M("PREFERENCES_INTENT_PERCEPTUAL")); + intent->append_text (M("PREFERENCES_INTENT_RELATIVE")); + intent->append_text (M("PREFERENCES_INTENT_SATURATION")); + intent->append_text (M("PREFERENCES_INTENT_ABSOLUTE")); + + iccDir = Gtk::manage (new Gtk::FileChooserButton (M("PREFERENCES_ICCDIR"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER)); + Gtk::Label* pdlabel = Gtk::manage (new Gtk::Label (M("PREFERENCES_ICCDIR")+":")); + + monProfile = Gtk::manage (new Gtk::FileChooserButton (M("PREFERENCES_MONITORICC"), Gtk::FILE_CHOOSER_ACTION_OPEN)); + Gtk::Label* mplabel = Gtk::manage (new Gtk::Label (M("PREFERENCES_MONITORICC")+":")); + + Gtk::Table* colt = Gtk::manage (new Gtk::Table (3, 2)); + colt->attach (*intlab, 0, 1, 0, 1, Gtk::SHRINK, Gtk::SHRINK, 2, 2); + colt->attach (*intent, 1, 2, 0, 1, Gtk::EXPAND | Gtk::FILL, Gtk::SHRINK, 2, 2); + colt->attach (*pdlabel, 0, 1, 1, 2, Gtk::SHRINK, Gtk::SHRINK, 2, 2); + colt->attach (*iccDir, 1, 2, 1, 2, Gtk::EXPAND | Gtk::FILL, Gtk::SHRINK, 2, 2); + colt->attach (*mplabel, 0, 1, 2, 3, Gtk::SHRINK, Gtk::SHRINK, 2, 2); + colt->attach (*monProfile, 1, 2, 2, 3, Gtk::EXPAND | Gtk::FILL, Gtk::SHRINK, 2, 2); + + mvbcm->pack_start (*colt, Gtk::PACK_SHRINK, 4); + + return mvbcm; +} + +Gtk::Widget* Preferences::getGeneralPanel () { + + Gtk::VBox* mvbsd = new Gtk::VBox (); + + Gtk::Frame* fworklflow = new Gtk::Frame (M("PREFERENCES_WORKFLOW")); + Gtk::HBox* hbworkflow = new Gtk::HBox (); + hbworkflow->set_border_width (4); + Gtk::Label* flayoutlab = new Gtk::Label (M("PREFERENCES_EDITORLAYOUT")+":"); + editorLayout = new Gtk::ComboBoxText (); + + editorLayout->append_text (M("PREFERENCES_SINGLETAB")); + editorLayout->append_text (M("PREFERENCES_MULTITAB")); + editorLayout->set_active (1); + + hbworkflow->pack_start (*flayoutlab, Gtk::PACK_SHRINK, 4); + hbworkflow->pack_start (*editorLayout); + fworklflow->add (*hbworkflow); + mvbsd->pack_start (*fworklflow, Gtk::PACK_SHRINK, 4); + + Gtk::Frame* flang = new Gtk::Frame (M("PREFERENCES_DEFAULTLANG")); + Gtk::HBox* hblang = new Gtk::HBox (); + hblang->set_border_width (4); + Gtk::Label* langlab = new Gtk::Label (M("PREFERENCES_SELECTLANG")+":"); + languages = new Gtk::ComboBoxText (); + + std::vector langs; + parseDir (argv0 + "/languages", langs, ""); + for (int i=0; iappend_text (langs[i]); + } + } + + Gtk::Label* langw = new Gtk::Label (Glib::ustring("(") + M("PREFERENCES_APPLNEXTSTARTUP") + ")"); + hblang->pack_start (*langlab, Gtk::PACK_SHRINK, 4); + hblang->pack_start (*languages); + hblang->pack_end (*langw, Gtk::PACK_SHRINK, 4); + flang->add (*hblang); + mvbsd->pack_start (*flang, Gtk::PACK_SHRINK, 4); + + Gtk::Frame* ftheme = new Gtk::Frame (M("PREFERENCES_DEFAULTTHEME")); + Gtk::VBox* vbftheme = new Gtk::VBox (); + Gtk::HBox* hbUseSystemTheme = new Gtk::HBox (); + hbUseSystemTheme->set_border_width (4); + Gtk::Label* useNextStart = new Gtk::Label (Glib::ustring("(") + M("PREFERENCES_APPLNEXTSTARTUP") + ")"); + chUseSystemTheme = new Gtk::CheckButton (M("PREFERENCES_USESYSTEMTHEME")); + hbUseSystemTheme->pack_start(*chUseSystemTheme, Gtk::PACK_SHRINK); + hbUseSystemTheme->pack_start (*useNextStart, Gtk::PACK_SHRINK, 4); + vbftheme->pack_start(*hbUseSystemTheme, Gtk::PACK_SHRINK, 4); + + hbtheme = new Gtk::HBox (); + hbtheme->set_border_width (4); + Gtk::Label* themelab = new Gtk::Label (M("PREFERENCES_SELECTTHEME")+":"); + theme = new Gtk::ComboBoxText (); + + theme->append_text (Glib::ustring("(")+M("PREFERENCES_GTKTHEME")+")"); + theme->set_active (0); + std::vector themes; + parseDir (argv0 + "/themes", themes, ""); + for (int i=0; iappend_text (themes[i]); + + Gtk::Label* fontlab = new Gtk::Label (M("PREFERENCES_SELECTFONT")+":"); + fontbutton = new Gtk::FontButton (); + fontbutton->set_use_size(true); + fontbutton->set_font_name(options.font); + + hbtheme->pack_start (*themelab, Gtk::PACK_SHRINK, 4); + hbtheme->pack_start (*theme); + hbtheme->pack_start (*fontlab, Gtk::PACK_SHRINK, 4); + hbtheme->pack_start (*fontbutton); + vbftheme->pack_end(*hbtheme, Gtk::PACK_SHRINK, 4); + ftheme->add (*vbftheme); + mvbsd->pack_start (*ftheme, Gtk::PACK_SHRINK, 4); + +//----- + + Gtk::Frame* frl = new Gtk::Frame (M("PREFERENCES_CLIPPINGIND")); + blinkClipped = new Gtk::CheckButton (M("PREFERENCES_BLINKCLIPPED")); + Gtk::VBox* vbrl = new Gtk::VBox (); + vbrl->set_border_width (4); + vbrl->pack_start (*blinkClipped, Gtk::PACK_SHRINK, 4); + + Gtk::HBox* vbhl = new Gtk::HBox (); + Gtk::Label* hll = new Gtk::Label (M("PREFERENCES_HLTHRESHOLD")+": "); + hlThresh = new Gtk::SpinButton (); + hlThresh->set_digits (0); + hlThresh->set_increments (1, 10); + hlThresh->set_range (0, 255); + vbhl->pack_start (*hll, Gtk::PACK_SHRINK, 8); + vbhl->pack_start (*hlThresh, Gtk::PACK_SHRINK, 8); + + vbrl->pack_start (*vbhl, Gtk::PACK_SHRINK, 4); + + Gtk::HBox* vbsh = new Gtk::HBox (); + Gtk::Label* shl = new Gtk::Label (M("PREFERENCES_SHTHRESHOLD")+": "); + shThresh = new Gtk::SpinButton (); + shThresh->show (); + shThresh->set_digits (0); + shThresh->set_increments (1, 10); + shThresh->set_range (0, 255); + vbsh->pack_start (*shl, Gtk::PACK_SHRINK, 8); + vbsh->pack_start (*shThresh, Gtk::PACK_SHRINK, 8); + vbrl->pack_start (*vbsh, Gtk::PACK_SHRINK, 4); + + frl->add (*vbrl); + mvbsd->pack_start (*frl, Gtk::PACK_SHRINK, 4); + +//----- + Gtk::Frame* fdf = new Gtk::Frame (M("PREFERENCES_DATEFORMAT")); + + Gtk::HBox* hb6 = new Gtk::HBox (); + Gtk::VBox* dfvb = new Gtk::VBox (); + Gtk::Label* dflab = new Gtk::Label (M("PREFERENCES_DATEFORMAT")+":"); + hb6->pack_start (*dflab, Gtk::PACK_SHRINK,4); + dateformat = new Gtk::Entry (); + dateformat->set_tooltip_markup (M("PREFERENCES_DATEFORMATHINT")); + dflab->set_tooltip_markup (M("PREFERENCES_DATEFORMATHINT")); + hb6->pack_start (*dateformat); + dfvb->pack_start (*hb6, Gtk::PACK_SHRINK, 4); + fdf->add (*dfvb); + dfvb->set_border_width (4); + + mvbsd->pack_start (*fdf, Gtk::PACK_SHRINK, 4); + + //----- + Gtk::Frame* fdg = new Gtk::Frame (M("PREFERENCES_EXTERNALEDITOR")); + Gtk::VBox* dgvb = new Gtk::VBox (); + + Gtk::HBox* hb7c = new Gtk::HBox (); + edOther = new Gtk::RadioButton (M("PREFERENCES_EDITORCMDLINE")+":"); + hb7c->pack_start (*edOther, Gtk::PACK_SHRINK,4); + editorToSendTo = new Gtk::Entry (); + hb7c->pack_start (*editorToSendTo); + Gtk::RadioButton::Group ge = edOther->get_group(); + +#ifdef __APPLE__ + Gtk::HBox* hb7 = new Gtk::HBox (); + edGimp = new Gtk::RadioButton ("GIMP"); + hb7->pack_start (*edGimp, Gtk::PACK_SHRINK,4); + dgvb->pack_start (*hb7, Gtk::PACK_SHRINK, 4); + edGimp->set_group (ge); + + Gtk::HBox* hb7b = new Gtk::HBox (); + edPS = new Gtk::RadioButton (M("PREFERENCES_PSPATH")+":"); + hb7b->pack_start (*edPS, Gtk::PACK_SHRINK,4); + psDir = new Gtk::FileChooserButton (M("PREFERENCES_PSPATH"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER); + hb7b->pack_start (*psDir); + dgvb->pack_start (*hb7b, Gtk::PACK_SHRINK, 4); + edPS->set_group (ge); +#elif defined _WIN32 + Gtk::HBox* hb7 = new Gtk::HBox (); + edGimp = new Gtk::RadioButton (M("PREFERENCES_GIMPPATH")+":"); + hb7->pack_start (*edGimp, Gtk::PACK_SHRINK,4); + gimpDir = new Gtk::FileChooserButton (M("PREFERENCES_GIMPPATH"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER); + hb7->pack_start (*gimpDir); + dgvb->pack_start (*hb7, Gtk::PACK_SHRINK, 4); + edGimp->set_group (ge); + + Gtk::HBox* hb7b = new Gtk::HBox (); + edPS = new Gtk::RadioButton (M("PREFERENCES_PSPATH")+":"); + hb7b->pack_start (*edPS, Gtk::PACK_SHRINK,4); + psDir = new Gtk::FileChooserButton (M("PREFERENCES_PSPATH"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER); + hb7b->pack_start (*psDir); + dgvb->pack_start (*hb7b, Gtk::PACK_SHRINK, 4); + edPS->set_group (ge); +#else + Gtk::HBox* hb7 = new Gtk::HBox (); + edGimp = new Gtk::RadioButton ("GIMP"); + hb7->pack_start (*edGimp, Gtk::PACK_SHRINK,4); + dgvb->pack_start (*hb7, Gtk::PACK_SHRINK, 4); + edGimp->set_group (ge); +#endif + + dgvb->pack_start (*hb7c, Gtk::PACK_SHRINK, 4); + dgvb->set_border_width (4); + fdg->add (*dgvb); + mvbsd->pack_start (*fdg, Gtk::PACK_SHRINK, 4); + + mvbsd->set_border_width (4); + + tconn = theme->signal_changed().connect( sigc::mem_fun(*this, &Preferences::themeChanged) ); + fconn = fontbutton->signal_font_set().connect( sigc::mem_fun(*this, &Preferences::fontChanged) ); + usethcon = chUseSystemTheme->signal_clicked ().connect( sigc::mem_fun(*this, &Preferences::useThemeChanged) ); + + return mvbsd; +} + +Gtk::Widget* Preferences::getFileBrowserPanel () { + + Gtk::VBox* mvbfb = new Gtk::VBox (); + mvbfb->set_border_width (4); + + Gtk::Frame* fsd = new Gtk::Frame (M("PREFERENCES_STARTUPIMDIR")); + + sdcurrent = new Gtk::RadioButton (M("PREFERENCES_DIRSOFTWARE")); + sdlast = new Gtk::RadioButton (M("PREFERENCES_DIRLAST")); + sdhome = new Gtk::RadioButton (M("PREFERENCES_DIRHOME")); + sdother = new Gtk::RadioButton (M("PREFERENCES_DIROTHER")+": "); + startupdir = new Gtk::Entry (); + + Gtk::Button* sdselect = new Gtk::Button (""); + sdselect->set_image (*(new Gtk::Image (Gtk::StockID("gtk-open"), Gtk::ICON_SIZE_BUTTON))); + + Gtk::RadioButton::Group opts = sdcurrent->get_group(); + sdlast->set_group (opts); + sdhome->set_group (opts); + sdother->set_group (opts); + + Gtk::VBox* vbsd = new Gtk::VBox (); + vbsd->pack_start (*sdcurrent, Gtk::PACK_SHRINK,0); + vbsd->pack_start (*sdlast, Gtk::PACK_SHRINK,0); + vbsd->pack_start (*sdhome, Gtk::PACK_SHRINK,0); + Gtk::HBox* otherbox = new Gtk::HBox (); + otherbox->pack_start (*sdother, Gtk::PACK_SHRINK); + otherbox->pack_start (*startupdir); + otherbox->pack_end (*sdselect, Gtk::PACK_SHRINK, 4); + vbsd->pack_start (*otherbox, Gtk::PACK_SHRINK, 0); + vbsd->set_border_width (4); + + fsd->add (*vbsd); + mvbfb->pack_start (*fsd, Gtk::PACK_SHRINK, 4); + + sdselect->signal_clicked().connect( sigc::mem_fun(*this, &Preferences::selectStartupDir) ); + +//--- + + + Gtk::Frame* fro = new Gtk::Frame (M("PREFERENCES_FBROWSEROPTS")); + showDateTime = new Gtk::CheckButton (M("PREFERENCES_SHOWDATETIME")); + showBasicExif = new Gtk::CheckButton (M("PREFERENCES_SHOWBASICEXIF")); + Gtk::VBox* vbro = new Gtk::VBox (); + overlayedFileNames = new Gtk::CheckButton (M("PREFERENCES_OVERLAY_FILENAMES")); + vbro->set_border_width (4); + vbro->pack_start (*showDateTime, Gtk::PACK_SHRINK, 0); + vbro->pack_start (*showBasicExif, Gtk::PACK_SHRINK, 0); + vbro->pack_start (*overlayedFileNames, Gtk::PACK_SHRINK, 4); + + fro->add (*vbro); + + Gtk::Frame* fre = new Gtk::Frame (M("PREFERENCES_PARSEDEXT")); + Gtk::VBox* vbre = new Gtk::VBox (); + vbre->set_border_width (4); + Gtk::HBox* hb0 = new Gtk::HBox (); + Gtk::Label* elab = new Gtk::Label (M("PREFERENCES_PARSEDEXTADD")+":"); + hb0->pack_start (*elab, Gtk::PACK_SHRINK, 4); + extension = new Gtk::Entry (); + hb0->pack_start (*extension); + addExt = new Gtk::Button (); + delExt = new Gtk::Button (); + addExt->set_tooltip_text (M("PREFERENCES_PARSEDEXTADDHINT")); + delExt->set_tooltip_text (M("PREFERENCES_PARSEDEXTDELHINT")); + Gtk::Image* addExtImg = new Gtk::Image (argv0+"/images/list-add12.png"); + Gtk::Image* delExtImg = new Gtk::Image (argv0+"/images/list-remove12r.png"); + addExt->add (*addExtImg); + delExt->add (*delExtImg); + hb0->pack_end (*delExt, Gtk::PACK_SHRINK, 4); + hb0->pack_end (*addExt, Gtk::PACK_SHRINK, 4); + extensions = new Gtk::TreeView (); + Gtk::ScrolledWindow* hscrollw = new Gtk::ScrolledWindow (); + hscrollw->set_policy (Gtk::POLICY_AUTOMATIC, Gtk::POLICY_ALWAYS); + hscrollw->add (*extensions); + extensionModel = Gtk::ListStore::create (extensionColumns); + extensions->set_model (extensionModel); + extensions->append_column_editable("Enabled", extensionColumns.enabled); + extensions->append_column("Extension", extensionColumns.ext); + extensions->set_headers_visible (false); + vbre->pack_start (*hscrollw); + vbre->pack_start (*hb0, Gtk::PACK_SHRINK, 0); + + fre->add (*vbre); + + Gtk::Frame* frc = new Gtk::Frame (M("PREFERENCES_CACHEOPTS")); + Gtk::VBox* vbc = new Gtk::VBox (); + frc->add (*vbc); + vbc->set_border_width (4); + + Gtk::Label* cflab = new Gtk::Label (M("PREFERENCES_CACHETHUMBFORM")+":"); + cformat = new Gtk::ComboBoxText (); + cformat->append_text (M("PREFERENCES_CACHEFORMAT1")); + cformat->append_text (M("PREFERENCES_CACHEFORMAT2")); + cformat->append_text (M("PREFERENCES_CACHEFORMAT1")+", 16 bit"); + Gtk::HBox* hb2 = new Gtk::HBox (); + hb2->pack_start (*cflab, Gtk::PACK_SHRINK, 4); + hb2->pack_start (*cformat); + vbc->pack_start (*hb2, Gtk::PACK_SHRINK, 0); + + Gtk::HBox* hb3 = new Gtk::HBox (); + Gtk::Label* chlab = new Gtk::Label (M("PREFERENCES_CACHETHUMBHEIGHT")+":"); + maxThumbSize = new Gtk::SpinButton (); + hb3->pack_start (*chlab, Gtk::PACK_SHRINK, 8); + hb3->pack_start (*maxThumbSize, Gtk::PACK_SHRINK, 8); + + maxThumbSize->set_digits (0); + maxThumbSize->set_increments (1, 10); + maxThumbSize->set_range (40, 400); + vbc->pack_start (*hb3, Gtk::PACK_SHRINK, 0); + + Gtk::HBox* hb4 = new Gtk::HBox (); + Gtk::Label* celab = new Gtk::Label (M("PREFERENCES_CACHEMAXENTRIES")+":"); + maxCacheEntries = new Gtk::SpinButton (); + hb4->pack_start (*celab, Gtk::PACK_SHRINK, 8); + hb4->pack_start (*maxCacheEntries, Gtk::PACK_SHRINK, 8); + + maxCacheEntries->set_digits (0); + maxCacheEntries->set_increments (1, 10); + maxCacheEntries->set_range (10, 100000); + vbc->pack_start (*hb4, Gtk::PACK_SHRINK, 0); + + Gtk::HBox* hb5 = new Gtk::HBox (); + clearThumbnails = new Gtk::Button (M("PREFERENCES_CACHECLEARTHUMBS")); + clearProfiles = new Gtk::Button (M("PREFERENCES_CACHECLEARPROFILES")); + clearAll = new Gtk::Button (M("PREFERENCES_CACHECLEARALL")); + hb5->pack_start (*clearThumbnails, Gtk::PACK_SHRINK, 8); + hb5->pack_start (*clearProfiles, Gtk::PACK_SHRINK, 8); + hb5->pack_start (*clearAll, Gtk::PACK_SHRINK, 8); + vbc->pack_start (*hb5, Gtk::PACK_SHRINK, 0); + + Gtk::HBox* hb6 = new Gtk::HBox (); + Gtk::VBox* vb6 = new Gtk::VBox (); + + vb6->pack_start (*fro); + vb6->pack_end (*frc); + hb6->pack_start (*vb6); + hb6->pack_start (*fre); + + mvbfb->pack_start (*hb6, Gtk::PACK_SHRINK, 4); + +// mvbfb->pack_start (*fro, Gtk::PACK_SHRINK, 4); +// mvbfb->pack_start (*fre); +// mvbfb->pack_start (*frc, Gtk::PACK_SHRINK, 4); + + addExt->signal_clicked().connect( sigc::mem_fun(*this, &Preferences::addExtPressed) ); + delExt->signal_clicked().connect( sigc::mem_fun(*this, &Preferences::delExtPressed) ); + extension->signal_activate().connect( sigc::mem_fun(*this, &Preferences::addExtPressed) ); + clearThumbnails->signal_clicked().connect( sigc::mem_fun(*this, &Preferences::clearThumbImagesPressed) ); + clearProfiles->signal_clicked().connect( sigc::mem_fun(*this, &Preferences::clearProfilesPressed) ); + clearAll->signal_clicked().connect( sigc::mem_fun(*this, &Preferences::clearAllPressed) ); + + return mvbfb; +} + +void Preferences::parseDir (Glib::ustring dirname, std::vector& items, Glib::ustring ext) { + + // process directory + Glib::Dir* dir = NULL; + try { + dir = new Glib::Dir (dirname); + } + catch (const Glib::FileError& fe) { + return; + } + dirname = dirname + "/"; + for (Glib::DirIterator i = dir->begin(); i!=dir->end(); ++i) { + Glib::ustring fname = dirname + *i; + Glib::ustring sname = *i; + // ignore directories + if (!Glib::file_test (fname, Glib::FILE_TEST_IS_DIR) && sname.size() >= ext.size() && sname.substr (sname.size()-ext.size(), ext.size()).casefold() == ext) + items.push_back (sname.substr(0,sname.size()-ext.size())); + } + delete dir; +} + +void Preferences::storePreferences () { + + moptions.defProfRaw = rprofiles->get_active_text(); + moptions.defProfImg = iprofiles->get_active_text(); + moptions.dateFormat = dateformat->get_text(); + moptions.fbShowDateTime = showDateTime->get_active (); + moptions.fbShowBasicExif = showBasicExif->get_active (); + moptions.blinkClipped = blinkClipped->get_active (); + moptions.highlightThreshold = (int)hlThresh->get_value (); + moptions.shadowThreshold = (int)shThresh->get_value (); + moptions.language = languages->get_active_text (); + moptions.theme = theme->get_active_text (); + moptions.useSystemTheme = chUseSystemTheme->get_active (); + moptions.font = fontbutton->get_font_name(); +#ifdef _WIN32 + moptions.gimpDir = gimpDir->get_filename (); + moptions.psDir = psDir->get_filename (); +#elif defined __APPLE__ + moptions.psDir = psDir->get_filename (); +#endif + moptions.customEditorProg = editorToSendTo->get_text (); + if (edGimp->get_active ()) + moptions.editorToSendTo = 1; +#ifdef _WIN32 + else if (edPS->get_active ()) + moptions.editorToSendTo = 2; +#elif defined __APPLE__ + else if (edPS->get_active ()) + moptions.editorToSendTo = 2; +#endif + else if (edOther->get_active ()) + moptions.editorToSendTo = 3; + + + moptions.rtSettings.monitorProfile = monProfile->get_filename (); + moptions.rtSettings.iccDirectory = iccDir->get_filename (); + moptions.rtSettings.colorimetricIntent = intent->get_active_row_number (); + + if (dmethodBatch->get_active_row_number()==0) + moptions.rtSettings.demosaicMethodBatch = "eahd"; + else if (dmethodBatch->get_active_row_number()==1) + moptions.rtSettings.demosaicMethodBatch = "hphd"; + else if (dmethodBatch->get_active_row_number()==2) + moptions.rtSettings.demosaicMethodBatch = "vng4"; + else if (dmethodBatch->get_active_row_number()==3) + moptions.rtSettings.demosaicMethodBatch = "amaze"; + else if (dmethodBatch->get_active_row_number()==4) + moptions.rtSettings.demosaicMethodBatch = "dcb"; + else if (dmethodBatch->get_active_row_number()==5) + moptions.rtSettings.demosaicMethodBatch = "ahd"; + else if (dmethodBatch->get_active_row_number()==6) + moptions.rtSettings.demosaicMethodBatch = "bilinear"; + + if (sdcurrent->get_active ()) + moptions.startupDir = STARTUPDIR_CURRENT; + else if (sdhome->get_active ()) + moptions.startupDir = STARTUPDIR_HOME; + else if (sdlast->get_active ()) + moptions.startupDir = STARTUPDIR_LAST; + else if (sdother->get_active ()) { + moptions.startupDir = STARTUPDIR_CUSTOM; + moptions.startupPath = startupdir->get_text(); + } + + moptions.parseExtensions.clear (); + moptions.parseExtensionsEnabled.clear (); + Gtk::TreeNodeChildren c = extensionModel->children (); + for (int i=0; iget_active_row_number() == 0) + moptions.thumbnailFormat = FT_Custom; + else if (cformat->get_active_row_number() == 1) + moptions.thumbnailFormat = FT_Jpeg; + else if (cformat->get_active_row_number() == 2) + moptions.thumbnailFormat = FT_Custom16; + + moptions.maxThumbnailHeight = (int)maxThumbSize->get_value (); + moptions.maxCacheEntries = (int)maxCacheEntries->get_value (); + moptions.overlayedFileNames = overlayedFileNames->get_active (); + + moptions.saveParamsFile = saveParamsFile->get_active (); + moptions.saveParamsCache = saveParamsCache->get_active (); + moptions.paramsLoadLocation = (PPLoadLocation)loadParamsPreference->get_active_row_number (); + + moptions.rtSettings.darkFramesPath = darkFrameDir->get_filename(); + + int i = 0; + moptions.baBehav.resize (ADDSET_PARAM_NUM); + for (Gtk::TreeIter sections=behModel->children().begin(); sections!=behModel->children().end(); sections++) + for (Gtk::TreeIter adjs=sections->children().begin(); adjs!=sections->children().end(); adjs++) + moptions.baBehav[adjs->get_value (behavColumns.addsetid)] = adjs->get_value (behavColumns.badd); + + moptions.tabbedUI = (bool)editorLayout->get_active_row_number(); +} + +void Preferences::fillPreferences () { + + tconn.block (true); + dfconn.block (true); + + rprofiles->set_active_text (moptions.defProfRaw); + iprofiles->set_active_text (moptions.defProfImg); + dateformat->set_text (moptions.dateFormat); + if (Glib::file_test (moptions.rtSettings.monitorProfile, Glib::FILE_TEST_EXISTS)) + monProfile->set_filename (moptions.rtSettings.monitorProfile); + if (Glib::file_test (moptions.rtSettings.iccDirectory, Glib::FILE_TEST_IS_DIR)) + iccDir->set_filename (moptions.rtSettings.iccDirectory); + intent->set_active (moptions.rtSettings.colorimetricIntent); + languages->set_active_text (moptions.language); + theme->set_active_text (moptions.theme); + chUseSystemTheme->set_active(moptions.useSystemTheme); + fontbutton->set_font_name(moptions.font); + showDateTime->set_active (moptions.fbShowDateTime); + showBasicExif->set_active (moptions.fbShowBasicExif); + blinkClipped->set_active (moptions.blinkClipped); + hlThresh->set_value (moptions.highlightThreshold); + shThresh->set_value (moptions.shadowThreshold); + + edGimp->set_active (moptions.editorToSendTo==1); + edOther->set_active (moptions.editorToSendTo==3); +#ifdef _WIN32 + edPS->set_active (moptions.editorToSendTo==2); + if (Glib::file_test (moptions.gimpDir, Glib::FILE_TEST_IS_DIR)) + gimpDir->set_filename (moptions.gimpDir); + if (Glib::file_test (moptions.psDir, Glib::FILE_TEST_IS_DIR)) + psDir->set_filename (moptions.psDir); +#elif defined __APPLE__ + edPS->set_active (moptions.editorToSendTo==2); + if (Glib::file_test (moptions.psDir, Glib::FILE_TEST_IS_DIR)) + psDir->set_filename (moptions.psDir); +#endif + editorToSendTo->set_text (moptions.customEditorProg); + + + if (moptions.rtSettings.demosaicMethodBatch=="eahd") + dmethodBatch->set_active (0); + else if (moptions.rtSettings.demosaicMethodBatch=="hphd") + dmethodBatch->set_active (1); + else if (moptions.rtSettings.demosaicMethodBatch=="vng4") + dmethodBatch->set_active (2); + else if (moptions.rtSettings.demosaicMethodBatch=="amaze")//Emil's code for AMaZE + dmethodBatch->set_active (3); + else if (moptions.rtSettings.demosaicMethodBatch=="dcb") + dmethodBatch->set_active (4); + else if (moptions.rtSettings.demosaicMethodBatch=="ahd") + dmethodBatch->set_active (5); + else if (moptions.rtSettings.demosaicMethodBatch=="bilinear") + dmethodBatch->set_active (6); + + if (moptions.startupDir==STARTUPDIR_CURRENT) + sdcurrent->set_active (); + else if (moptions.startupDir==STARTUPDIR_LAST) + sdlast->set_active (); + else if (moptions.startupDir==STARTUPDIR_HOME) + sdhome->set_active (); + else if (moptions.startupDir==STARTUPDIR_CUSTOM) { + sdother->set_active (); + startupdir->set_text (moptions.startupPath); + } + + extensionModel->clear (); + for (int i=0; iappend()); + row[extensionColumns.enabled] = moptions.parseExtensionsEnabled[i]; + row[extensionColumns.ext] = moptions.parseExtensions[i]; + } + + if (moptions.thumbnailFormat == FT_Custom) + cformat->set_active (0); + else if (moptions.thumbnailFormat == FT_Jpeg) + cformat->set_active (1); + else if (moptions.thumbnailFormat == FT_Custom16) + cformat->set_active (2); + + maxThumbSize->set_value (moptions.maxThumbnailHeight); + maxCacheEntries->set_value (moptions.maxCacheEntries); + overlayedFileNames->set_active (moptions.overlayedFileNames); + + saveParamsFile->set_active (moptions.saveParamsFile); + saveParamsCache->set_active (moptions.saveParamsCache); + loadParamsPreference->set_active (moptions.paramsLoadLocation); + + editorLayout->set_active(moptions.tabbedUI); + darkFrameDir->set_filename( moptions.rtSettings.darkFramesPath ); + updateDFinfos(); + + addc.block (true); + setc.block (true); + if (moptions.baBehav.size() == ADDSET_PARAM_NUM) { + for (int i=0; ichildren().begin(); sections!=behModel->children().end(); sections++) + for (Gtk::TreeIter adjs=sections->children().begin(); adjs!=sections->children().end(); adjs++) + if (adjs->get_value (behavColumns.addsetid) == i) { + adjs->set_value (behavColumns.badd, moptions.baBehav[i]==1); + adjs->set_value (behavColumns.bset, moptions.baBehav[i]!=1); + break; + } + } + addc.block (false); + setc.block (false); + tconn.block (false); + dfconn.block (false); +} + +void Preferences::loadPressed () { + + moptions.copyFrom (&options); + fillPreferences (); +} + +void Preferences::savePressed () { + + storePreferences (); + options.copyFrom (&moptions); + Options::save (); +} + +void Preferences::okPressed () { + + storePreferences (); + workflowUpdate(); + options.copyFrom (&moptions); + hide (); +} + +void Preferences::cancelPressed () { + + // set the initial theme back + if (theme->get_active_text () != options.theme) + switchThemeTo(options.theme); + + // set the initial font back + if (fontbutton->get_font_name() != options.font) + switchFontTo(options.font); + hide (); +} + +void Preferences::selectStartupDir () { + + Gtk::FileChooserDialog dialog(M("PREFERENCES_DIRSELECTDLG"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER); +// dialog.set_transient_for(*this); + + //Add response buttons the the dialog: + dialog.add_button(Gtk::StockID("gtk-cancel"), Gtk::RESPONSE_CANCEL); + dialog.add_button(Gtk::StockID("gtk-open"), Gtk::RESPONSE_OK); + + int result = dialog.run(); + + if (result==Gtk::RESPONSE_OK) + startupdir->set_text (dialog.get_filename()); +} + +void Preferences::aboutPressed () { + + Splash* splash = new Splash (-1); + splash->set_transient_for (*this); + splash->set_modal (true); + splash->show (); +} + +void Preferences::themeChanged () { + + switchThemeTo(theme->get_active_text ()); +} + +void Preferences::fontChanged () { + + switchFontTo(fontbutton->get_font_name()); +} + +void Preferences::switchThemeTo(Glib::ustring newTheme) { + + std::vector files; + files.push_back (argv0+"/themes/"+newTheme); + Gtk::RC::set_default_files (files); + Gtk::RC::reparse_all (Gtk::Settings::get_default()); + GdkEventClient event = { GDK_CLIENT_EVENT, NULL, TRUE, gdk_atom_intern("_GTK_READ_RCFILES", FALSE), 8 }; + gdk_event_send_clientmessage_toall ((GdkEvent*)&event); +} + +void Preferences::workflowUpdate (){ + + if(moptions.tabbedUI != options.tabbedUI) + { + parent->MoveFileBrowserToMain(); + parent->SetMainCurrent(); + if(moptions.tabbedUI) + parent->epanel->hide_all(); + else + parent->epanel->show_all(); + } +} + +void Preferences::switchFontTo(Glib::ustring newFont) { + + Gtk::RC::parse_string (Glib::ustring::compose( + "style \"clearlooks-default\" { font_name = \"%1\" }", newFont)); + Gtk::RC::reparse_all (Gtk::Settings::get_default()); + GdkEventClient event = { GDK_CLIENT_EVENT, NULL, TRUE, gdk_atom_intern("_GTK_READ_RCFILES", FALSE), 8 }; + gdk_event_send_clientmessage_toall ((GdkEvent*)&event); +} + +void Preferences::useThemeChanged(){ + + if(!chUseSystemTheme->get_active()){ + hbtheme->set_sensitive(true); + fontbutton->set_sensitive(true); + } + else{ + hbtheme->set_sensitive(false); + fontbutton->set_sensitive(false); + } +} + +void Preferences::addExtPressed () { + + Gtk::TreeNodeChildren c = extensionModel->children (); + for (int i=0; iget_text ()) + return; + + Gtk::TreeRow row = *(extensionModel->append()); + + row[extensionColumns.enabled] = true; + row[extensionColumns.ext] = extension->get_text (); +} + +void Preferences::delExtPressed () { + + extensionModel->erase (extensions->get_selection()->get_selected ()); +} + +void Preferences::clearProfilesPressed () { + + cacheMgr->clearProfiles (); +} + +void Preferences::clearThumbImagesPressed () { + + cacheMgr->clearThumbImages (); +} + +void Preferences::clearAllPressed () { + + cacheMgr->clearAll (); +} + +void Preferences::darkFrameChanged () +{ + Glib::ustring s(darkFrameDir->get_filename()); + if( s.compare( rtengine::dfm.getPathname()) !=0 ){ + rtengine::dfm.init( s ); + updateDFinfos(); + } +} +void Preferences::updateDFinfos() +{ + int t1,t2; + rtengine::dfm.getStat(t1,t2); + std::ostringstream s; + s << "Found: "<< t1 << " shots, " << t2 << " templates"; + dfLabel->set_text(s.str()); +} diff --git a/rtgui/preferences.h b/rtgui/preferences.h index 83072cd78..77f9689aa 100644 --- a/rtgui/preferences.h +++ b/rtgui/preferences.h @@ -1,140 +1,154 @@ -/* - * 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 . - */ -#ifndef __PREFERENCES_H__ -#define __PREFERENCES_H__ - -#include -#include -#include -#include - -class Preferences : public Gtk::Dialog { - - class ExtensionColumns : public Gtk::TreeModel::ColumnRecord { - public: - Gtk::TreeModelColumn enabled; - Gtk::TreeModelColumn ext; - ExtensionColumns() { add(enabled); add(ext); } - }; - ExtensionColumns extensionColumns; - Glib::RefPtr extensionModel; - - - class BehavColumns : public Gtk::TreeModel::ColumnRecord { - public: - Gtk::TreeModelColumn label; - Gtk::TreeModelColumn badd; - Gtk::TreeModelColumn bset; - Gtk::TreeModelColumn visible; - Gtk::TreeModelColumn addsetid; - BehavColumns() { add(label); add(badd); add(bset); add(visible); add(addsetid); } - }; - Glib::RefPtr behModel; - BehavColumns behavColumns; - - - protected: - Gtk::ComboBoxText* rprofiles; - Gtk::ComboBoxText* iprofiles; - Gtk::ComboBoxText* languages; - Gtk::Entry* dateformat; - Gtk::Entry* startupdir; - Gtk::RadioButton* sdcurrent; - Gtk::RadioButton* sdlast; - Gtk::RadioButton* sdhome; - Gtk::RadioButton* sdother; - Gtk::FileChooserButton* gimpDir; - Gtk::FileChooserButton* psDir; - Gtk::Entry* editorToSendTo; - Gtk::RadioButton* edGimp; - Gtk::RadioButton* edPS; - Gtk::RadioButton* edOther; - Gtk::FileChooserButton* darkFrameDir; - Gtk::Label *dfLabel; - - Gtk::CheckButton* showDateTime; - Gtk::CheckButton* showBasicExif; - - Gtk::FileChooserButton* iccDir; - Gtk::FileChooserButton* monProfile; - - Gtk::CheckButton* blinkClipped; - Gtk::SpinButton* hlThresh; - Gtk::SpinButton* shThresh; - - Gtk::ComboBoxText* intent; - - Gtk::ComboBoxText* theme; - - Gtk::ComboBoxText* cformat; - Gtk::SpinButton* maxThumbSize; - Gtk::SpinButton* maxCacheEntries; - Gtk::Button* clearThumbnails; - Gtk::Button* clearProfiles; - Gtk::Button* clearAll; - Gtk::Entry* extension; - Gtk::TreeView* extensions; - Gtk::Button* addExt; - Gtk::Button* delExt; - Gtk::CheckButton* overlayedFileNames; - - Gtk::CheckButton* saveParamsFile; - Gtk::CheckButton* saveParamsCache; - Gtk::ComboBoxText* loadParamsPreference; - - Options moptions; - sigc::connection tconn, addc, setc, dfconn; - - void fillPreferences (); - void storePreferences (); - void parseDir (Glib::ustring dirname, std::vector& items, Glib::ustring ext); - void updateDFinfos (); - void themeChanged (); - - void appendBehavList (Gtk::TreeModel::iterator& parent, Glib::ustring label, int id, bool set); - - Gtk::Widget* getProcParamsPanel (); - Gtk::Widget* getColorManagementPanel (); - Gtk::Widget* getFileBrowserPanel (); - Gtk::Widget* getGeneralPanel (); - Gtk::Widget* getBatchProcPanel (); - - public: - Preferences (int initialPage=0); - - void savePressed (); - void loadPressed (); - void okPressed (); - void cancelPressed (); - void aboutPressed (); - - void selectStartupDir (); - void addExtPressed (); - void delExtPressed (); - void darkFrameChanged (); - void clearProfilesPressed (); - void clearThumbImagesPressed (); - void clearAllPressed (); - void behAddRadioToggled (const Glib::ustring& path); - void behSetRadioToggled (const Glib::ustring& path); -// void selectICCProfileDir (); -// void selectMonitorProfile (); -}; - -#endif +/* + * 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 . + */ +#ifndef __PREFERENCES_H__ +#define __PREFERENCES_H__ + +#include +#include +#include +#include +#include "rtwindow.h" + +class Preferences : public Gtk::Dialog { + + class ExtensionColumns : public Gtk::TreeModel::ColumnRecord { + public: + Gtk::TreeModelColumn enabled; + Gtk::TreeModelColumn ext; + ExtensionColumns() { add(enabled); add(ext); } + }; + ExtensionColumns extensionColumns; + Glib::RefPtr extensionModel; + + + class BehavColumns : public Gtk::TreeModel::ColumnRecord { + public: + Gtk::TreeModelColumn label; + Gtk::TreeModelColumn badd; + Gtk::TreeModelColumn bset; + Gtk::TreeModelColumn visible; + Gtk::TreeModelColumn addsetid; + BehavColumns() { add(label); add(badd); add(bset); add(visible); add(addsetid); } + }; + Glib::RefPtr behModel; + BehavColumns behavColumns; + + + protected: + Gtk::ComboBoxText* rprofiles; + Gtk::ComboBoxText* iprofiles; + Gtk::ComboBoxText* dmethodBatch; + Gtk::ComboBoxText* languages; + Gtk::Entry* dateformat; + Gtk::Entry* startupdir; + Gtk::RadioButton* sdcurrent; + Gtk::RadioButton* sdlast; + Gtk::RadioButton* sdhome; + Gtk::RadioButton* sdother; + Gtk::FileChooserButton* gimpDir; + Gtk::FileChooserButton* psDir; + Gtk::Entry* editorToSendTo; + Gtk::RadioButton* edGimp; + Gtk::RadioButton* edPS; + Gtk::RadioButton* edOther; + Gtk::FileChooserButton* darkFrameDir; + Gtk::Label *dfLabel; + + Gtk::CheckButton* showDateTime; + Gtk::CheckButton* showBasicExif; + + Gtk::FileChooserButton* iccDir; + Gtk::FileChooserButton* monProfile; + + Gtk::CheckButton* blinkClipped; + Gtk::SpinButton* hlThresh; + Gtk::SpinButton* shThresh; + + Gtk::ComboBoxText* intent; + + Gtk::ComboBoxText* theme; + Gtk::HBox* hbtheme; + Gtk::CheckButton* chUseSystemTheme; + Gtk::FontButton* fontbutton; + + Gtk::ComboBoxText* cformat; + Gtk::SpinButton* maxThumbSize; + Gtk::SpinButton* maxCacheEntries; + Gtk::Button* clearThumbnails; + Gtk::Button* clearProfiles; + Gtk::Button* clearAll; + Gtk::Entry* extension; + Gtk::TreeView* extensions; + Gtk::Button* addExt; + Gtk::Button* delExt; + Gtk::CheckButton* overlayedFileNames; + + Gtk::CheckButton* saveParamsFile; + Gtk::CheckButton* saveParamsCache; + Gtk::ComboBoxText* loadParamsPreference; + Gtk::ComboBoxText* editorLayout; + RTWindow* parent; + + Options moptions; + sigc::connection tconn, fconn, usethcon, addc, setc, dfconn; + Glib::ustring initialTheme; + Glib::ustring initialFont; + + void fillPreferences (); + void storePreferences (); + void parseDir (Glib::ustring dirname, std::vector& items, Glib::ustring ext); + void updateDFinfos (); + void workflowUpdate(); + void themeChanged (); + void useThemeChanged(); + void fontChanged (); + void switchThemeTo (Glib::ustring newTheme); + void switchFontTo (Glib::ustring newFont); + + void appendBehavList (Gtk::TreeModel::iterator& parent, Glib::ustring label, int id, bool set); + + Gtk::Widget* getProcParamsPanel (); + Gtk::Widget* getColorManagementPanel (); + Gtk::Widget* getFileBrowserPanel (); + Gtk::Widget* getGeneralPanel (); + Gtk::Widget* getBatchProcPanel (); + + public: + Preferences (RTWindow *rtwindow); + + void savePressed (); + void loadPressed (); + void okPressed (); + void cancelPressed (); + void aboutPressed (); + + void selectStartupDir (); + void addExtPressed (); + void delExtPressed (); + void darkFrameChanged (); + void clearProfilesPressed (); + void clearThumbImagesPressed (); + void clearAllPressed (); + void behAddRadioToggled (const Glib::ustring& path); + void behSetRadioToggled (const Glib::ustring& path); +// void selectICCProfileDir (); +// void selectMonitorProfile (); +}; + +#endif diff --git a/rtgui/previewloader.cc b/rtgui/previewloader.cc new file mode 100644 index 000000000..c8a5fa337 --- /dev/null +++ b/rtgui/previewloader.cc @@ -0,0 +1,170 @@ +/* + * 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 +#include +#include + +#ifdef _OPENMP +#include +#endif + +#define DEBUG(format,args...) +//#define DEBUG(format,args...) printf("PreviewLoader::%s: " format "\n", __FUNCTION__, ## args) + +class PreviewLoader::Impl +{ +public: + struct Job + { + Job(int dir_id, const Glib::ustring& dir_entry, PreviewLoaderListener* listener): + dir_id_(dir_id), + dir_entry_(dir_entry), + listener_(listener) + {} + + Job(): + dir_id_(0), + listener_(0) + {} + + int dir_id_; + Glib::ustring dir_entry_; + PreviewLoaderListener* listener_; + }; + + struct JobCompare + { + bool operator()(const Job& lhs, const Job& rhs) + { + if ( lhs.dir_id_ == rhs.dir_id_ ) + { + return lhs.dir_entry_ < rhs.dir_entry_; + } + return lhs.dir_id_ < rhs.dir_id_; + } + }; + + typedef std::set JobSet; + + Impl() + { + int threadCount=1; + #ifdef _OPENMP + threadCount=omp_get_num_procs(); + #endif + + threadPool_=new Glib::ThreadPool(threadCount,0); + } + + Glib::ThreadPool* threadPool_; + + Glib::Mutex mutex_; + + JobSet jobs_; + + void + processNextJob(void) + { + Job j; + { + Glib::Mutex::Lock lock(mutex_); + + // nothing to do; could be jobs have been removed + if ( jobs_.empty() ) + { + DEBUG("processing: nothing to do"); + return; + } + + // copy and remove front job + j = *jobs_.begin(); + jobs_.erase(jobs_.begin()); + DEBUG("processing %s",j.dir_entry_.c_str()); + DEBUG("%d job(s) remaining",jobs_.size()); + } + + // unlock and do processing; will relock on block exit, then call listener + // if something got + Thumbnail* tmb = 0; + { + if (Glib::file_test(j.dir_entry_, Glib::FILE_TEST_EXISTS)) + { + tmb = cacheMgr->getEntry(j.dir_entry_); + } + } + + // we got something so notify listener + if ( tmb ) + { + j.listener_->previewReady(j.dir_id_,new FileBrowserEntry(tmb,j.dir_entry_)); + } + + // signal at end + if ( jobs_.empty() ) + { + j.listener_->previewsFinished(j.dir_id_); + } + } +}; + +PreviewLoader::PreviewLoader(): + impl_(new Impl()) +{ +} + +PreviewLoader* +PreviewLoader::getInstance(void) +{ + // this will not be deleted... + static PreviewLoader* instance_ = 0; + if ( instance_ == 0 ) + { + instance_ = new PreviewLoader(); + } + return instance_; +} + +void +PreviewLoader::add(int dir_id, const Glib::ustring& dir_entry, PreviewLoaderListener* l) +{ + // somebody listening? + if ( l != 0 ) + { + Glib::Mutex::Lock lock(impl_->mutex_); + + // create a new job and append to queue + DEBUG("saving job %s",dir_entry.c_str()); + impl_->jobs_.insert(Impl::Job(dir_id,dir_entry,l)); + + // queue a run request + DEBUG("adding run request %s",dir_entry.c_str()); + impl_->threadPool_->push(sigc::mem_fun(*impl_, &PreviewLoader::Impl::processNextJob)); + } +} + +void +PreviewLoader::removeAllJobs(void) +{ + DEBUG("stop"); + + impl_->jobs_.clear(); +} + + diff --git a/rtgui/previewloader.h b/rtgui/previewloader.h new file mode 100644 index 000000000..b113d590d --- /dev/null +++ b/rtgui/previewloader.h @@ -0,0 +1,93 @@ +/* + * 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 . + */ +#ifndef _PREVIEWLOADER_ +#define _PREVIEWLOADER_ + +#include +#include +#include + +class PreviewLoaderListener +{ +public: + + /** + * @brief a preview is ready + * + * @param dir_id directory ID this is for + * @param fd entry + */ + virtual void previewReady (int dir_id, FileBrowserEntry* fd) {} + + /** + * @brief all previews have finished loading + */ + virtual void previewsFinished (int dir_id_) {} +}; + +class PreviewLoader +{ + public: + + /** + * @brief Singleton entry point. + * + * @note expects to be called inside gtk thread lock + * + * @return Pointer to thumbnail image updater. + */ + static PreviewLoader* getInstance(void); + + /** + * @brief Add an thumbnail image update request. + * + * Code will add the request to the queue and, if needed, start a pool + * thread to process it. + * + * @param dir_id directory we're looking at + * @param dir_entry entry in it + * @param l listener + */ + void add(int dir_id, const Glib::ustring& dir_entry, PreviewLoaderListener* l); + + /** + * @brief Stop processing and remove all jobs. + * + * Will not return till all jobs have completed. + * + * @note expects to be called inside gtk thread lock + */ + void removeAllJobs(void); + + private: + + PreviewLoader(); + + class Impl; + Impl* impl_; +}; + +/** + * @brief Singleton boiler plate. + * + * To use: \c previewLoader->start() , + */ +#define previewLoader PreviewLoader::getInstance() + +#endif diff --git a/rtgui/previewwindow.cc b/rtgui/previewwindow.cc index 5d6f0a99d..f3f4c4a7b 100644 --- a/rtgui/previewwindow.cc +++ b/rtgui/previewwindow.cc @@ -1,214 +1,215 @@ -/* - * 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 -#include -#include - -PreviewWindow::PreviewWindow () : previewHandler(NULL), mainCropWin(NULL),cCropMoving(NULL),cNormal(NULL), isMoving(false) { - - rconn = signal_size_allocate().connect( sigc::mem_fun(*this, &PreviewWindow::on_resized) ); -} - -PreviewWindow::~PreviewWindow () { - - if( cCropMoving ) - delete cCropMoving; - if( cNormal ) - delete cNormal; - -} - -void PreviewWindow::on_realize () { - - Gtk::DrawingArea::on_realize (); - add_events(Gdk::EXPOSURE_MASK | Gdk::POINTER_MOTION_MASK | Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK | Gdk::SCROLL_MASK); - cCropMoving = new Gdk::Cursor (Gdk::FLEUR); - cNormal = new Gdk::Cursor (Gdk::ARROW); -} - -void PreviewWindow::getObservedFrameArea (int& x, int& y, int& w, int& h) { - - if (mainCropWin) { - int cropX, cropY, cropW, cropH; - mainCropWin->getCropRectangle (cropX, cropY, cropW, cropH); - // translate it to screen coordinates - x = imgX + cropX*zoom; - y = imgY + cropY*zoom; - w = cropW * zoom; - h = cropH * zoom; - } -} - -void PreviewWindow::updatePreviewImage () { - - int W = get_width(), H = get_height(); - Glib::RefPtr wind = get_window(); - if( ! wind ) - return; - backBuffer = Gdk::Pixmap::create (wind, W, H, -1); - backBuffer->draw_rectangle (get_style()->get_base_gc(Gtk::STATE_NORMAL), true, 0, 0, W, H); - if (previewHandler) { - Glib::RefPtr resPixbuf = previewHandler->getRoughImage (W, H, zoom); - if (resPixbuf) { - imgW = resPixbuf->get_width(); - imgH = resPixbuf->get_height(); - imgX = (W-imgW)/2; - imgY = (H-imgH)/2; - backBuffer->draw_pixbuf (get_style()->get_base_gc(Gtk::STATE_NORMAL), resPixbuf, 0, 0, imgX, imgY, -1, -1, Gdk::RGB_DITHER_NONE, 0, 0); - Cairo::RefPtr cr = backBuffer->create_cairo_context(); - if (previewHandler->getCropParams().enabled) - drawCrop (cr, imgX, imgY, imgW, imgH, 0, 0, zoom, previewHandler->getCropParams()); - } - } -} - -void PreviewWindow::setPreviewHandler (PreviewHandler* ph) { - - previewHandler = ph; - previewHandler->addPreviewImageListener (this); -} - -void PreviewWindow::on_resized (Gtk::Allocation& req) { - - updatePreviewImage (); - queue_draw (); -} - -bool PreviewWindow::on_expose_event (GdkEventExpose* event) { - - if (backBuffer) { - Glib::RefPtr window = get_window(); - - int bufferW, bufferH; - backBuffer->get_size (bufferW, bufferH); - - if (!mainCropWin) { - mainCropWin = imageArea->getMainCropWindow (); - if (mainCropWin) - mainCropWin->addCropWindowListener (this); - } - - if (get_width()!=bufferW && get_height()!=bufferH) - updatePreviewImage (); - - window->draw_drawable (get_style()->get_base_gc(Gtk::STATE_NORMAL), backBuffer, 0, 0, 0, 0, -1, -1); - - if (mainCropWin) { - Cairo::RefPtr cr = get_window()->create_cairo_context(); - int x, y, w, h; - getObservedFrameArea (x, y, w, h); - cr->set_source_rgb (1.0, 1.0, 1.0); - cr->set_line_width (3); - cr->rectangle (x-1.5, y-1.5, w+2, h+2); - cr->stroke (); - cr->set_source_rgb (1.0, 0.0, 0.0); - cr->set_line_width (1); - cr->rectangle (x-1.5, y-1.5, w+2, h+2); - cr->stroke (); - } - } - return true; -} - -void PreviewWindow::previewImageChanged () { - - updatePreviewImage (); - queue_draw (); -} - -void PreviewWindow::setImageArea (ImageArea* ia) { - - imageArea = ia; - mainCropWin = ia->getMainCropWindow (); - if (mainCropWin) - mainCropWin->addCropWindowListener (this); -} - -void PreviewWindow::cropPositionChanged (CropWindow* w) { - - queue_draw (); -} - -void PreviewWindow::cropWindowSizeChanged (CropWindow* w) { - - queue_draw (); -} - -void PreviewWindow::cropZoomChanged (CropWindow* w) { - - queue_draw (); -} - -bool PreviewWindow::on_motion_notify_event (GdkEventMotion* event) { - - if (!mainCropWin) - return true; - - int x, y, w, h; - getObservedFrameArea (x, y, w, h); - bool inside = event->x > x-6 && event->x < x+w-1+6 && event->y > y-6 && event->y < y+h-1+6; - bool moreInside = event->x > x+6 && event->x < x+w-1-6 && event->y > y+6 && event->y < y+h-1-6; - - if (isMoving) - mainCropWin->remoteMove ((event->x - press_x)/zoom, (event->y - press_y)/zoom); - else if (inside && !moreInside) - get_window()->set_cursor (*cCropMoving); - else - get_window()->set_cursor (*cNormal); - return true; -} - -bool PreviewWindow::on_button_press_event (GdkEventButton* event) { - - if (!mainCropWin) - return true; - - int x, y, w, h; - getObservedFrameArea (x, y, w, h); - bool inside = event->x > x-6 && event->x < x+w-1+6 && event->y > y-6 && event->y < y+h-1+6; - bool moreInside = event->x > x+6 && event->x < x+w-1-6 && event->y > y+6 && event->y < y+h-1-6; - - if (!isMoving) { - isMoving = true; - if (!inside || moreInside) { - mainCropWin->remoteMove ((event->x - (x+w/2))/zoom, (event->y - (y+h/2))/zoom); - press_x = x+w/2; - press_y = y+h/2; - } - else { - press_x = event->x; - press_y = event->y; - } - get_window()->set_cursor (*cCropMoving); - } - return true; -} - -bool PreviewWindow::on_button_release_event (GdkEventButton* event) { - - if (!mainCropWin) - return true; - - if (isMoving) { - isMoving = false; - get_window()->set_cursor (*cNormal); - mainCropWin->remoteMoveReady (); - } - return true; -} +/* + * 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 +#include +#include + +PreviewWindow::PreviewWindow () : previewHandler(NULL), mainCropWin(NULL),cCropMoving(NULL),cNormal(NULL), isMoving(false), imageArea(NULL) { + + rconn = signal_size_allocate().connect( sigc::mem_fun(*this, &PreviewWindow::on_resized) ); +} + +PreviewWindow::~PreviewWindow () { + + if( cCropMoving ) + delete cCropMoving; + if( cNormal ) + delete cNormal; + +} + +void PreviewWindow::on_realize () { + + Gtk::DrawingArea::on_realize (); + add_events(Gdk::EXPOSURE_MASK | Gdk::POINTER_MOTION_MASK | Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK | Gdk::SCROLL_MASK); + cCropMoving = new Gdk::Cursor (Gdk::FLEUR); + cNormal = new Gdk::Cursor (Gdk::ARROW); +} + +void PreviewWindow::getObservedFrameArea (int& x, int& y, int& w, int& h) { + + if (mainCropWin) { + int cropX, cropY, cropW, cropH; + mainCropWin->getCropRectangle (cropX, cropY, cropW, cropH); + // translate it to screen coordinates + x = imgX + cropX*zoom; + y = imgY + cropY*zoom; + w = cropW * zoom; + h = cropH * zoom; + } +} + +void PreviewWindow::updatePreviewImage () { + + int W = get_width(), H = get_height(); + Glib::RefPtr wind = get_window(); + if( ! wind ) + return; + backBuffer = Gdk::Pixmap::create (wind, W, H, -1); + backBuffer->draw_rectangle (get_style()->get_base_gc(Gtk::STATE_NORMAL), true, 0, 0, W, H); + if (previewHandler) { + Glib::RefPtr resPixbuf = previewHandler->getRoughImage (W, H, zoom); + if (resPixbuf) { + imgW = resPixbuf->get_width(); + imgH = resPixbuf->get_height(); + imgX = (W-imgW)/2; + imgY = (H-imgH)/2; + backBuffer->draw_pixbuf (get_style()->get_base_gc(Gtk::STATE_NORMAL), resPixbuf, 0, 0, imgX, imgY, -1, -1, Gdk::RGB_DITHER_NONE, 0, 0); + Cairo::RefPtr cr = backBuffer->create_cairo_context(); + if (previewHandler->getCropParams().enabled) + drawCrop (cr, imgX, imgY, imgW, imgH, 0, 0, zoom, previewHandler->getCropParams()); + } + } +} + +void PreviewWindow::setPreviewHandler (PreviewHandler* ph) { + + previewHandler = ph; + if (previewHandler) + previewHandler->addPreviewImageListener (this); +} + +void PreviewWindow::on_resized (Gtk::Allocation& req) { + + updatePreviewImage (); + queue_draw (); +} + +bool PreviewWindow::on_expose_event (GdkEventExpose* event) { + + if (backBuffer) { + Glib::RefPtr window = get_window(); + + int bufferW, bufferH; + backBuffer->get_size (bufferW, bufferH); + + if (!mainCropWin && imageArea) { + mainCropWin = imageArea->getMainCropWindow (); + if (mainCropWin) + mainCropWin->addCropWindowListener (this); + } + + if (get_width()!=bufferW && get_height()!=bufferH) + updatePreviewImage (); + + window->draw_drawable (get_style()->get_base_gc(Gtk::STATE_NORMAL), backBuffer, 0, 0, 0, 0, -1, -1); + + if (mainCropWin) { + Cairo::RefPtr cr = get_window()->create_cairo_context(); + int x, y, w, h; + getObservedFrameArea (x, y, w, h); + cr->set_source_rgb (1.0, 1.0, 1.0); + cr->set_line_width (3); + cr->rectangle (x-1.5, y-1.5, w+2, h+2); + cr->stroke (); + cr->set_source_rgb (1.0, 0.0, 0.0); + cr->set_line_width (1); + cr->rectangle (x-1.5, y-1.5, w+2, h+2); + cr->stroke (); + } + } + return true; +} + +void PreviewWindow::previewImageChanged () { + + updatePreviewImage (); + queue_draw (); +} + +void PreviewWindow::setImageArea (ImageArea* ia) { + + imageArea = ia; + mainCropWin = ia->getMainCropWindow (); + if (mainCropWin) + mainCropWin->addCropWindowListener (this); +} + +void PreviewWindow::cropPositionChanged (CropWindow* w) { + + queue_draw (); +} + +void PreviewWindow::cropWindowSizeChanged (CropWindow* w) { + + queue_draw (); +} + +void PreviewWindow::cropZoomChanged (CropWindow* w) { + + queue_draw (); +} + +bool PreviewWindow::on_motion_notify_event (GdkEventMotion* event) { + + if (!mainCropWin) + return true; + + int x, y, w, h; + getObservedFrameArea (x, y, w, h); + bool inside = event->x > x-6 && event->x < x+w-1+6 && event->y > y-6 && event->y < y+h-1+6; + bool moreInside = event->x > x+6 && event->x < x+w-1-6 && event->y > y+6 && event->y < y+h-1-6; + + if (isMoving) + mainCropWin->remoteMove ((event->x - press_x)/zoom, (event->y - press_y)/zoom); + else if (inside && !moreInside) + get_window()->set_cursor (*cCropMoving); + else + get_window()->set_cursor (*cNormal); + return true; +} + +bool PreviewWindow::on_button_press_event (GdkEventButton* event) { + + if (!mainCropWin) + return true; + + int x, y, w, h; + getObservedFrameArea (x, y, w, h); + bool inside = event->x > x-6 && event->x < x+w-1+6 && event->y > y-6 && event->y < y+h-1+6; + bool moreInside = event->x > x+6 && event->x < x+w-1-6 && event->y > y+6 && event->y < y+h-1-6; + + if (!isMoving) { + isMoving = true; + if (!inside || moreInside) { + mainCropWin->remoteMove ((event->x - (x+w/2))/zoom, (event->y - (y+h/2))/zoom); + press_x = x+w/2; + press_y = y+h/2; + } + else { + press_x = event->x; + press_y = event->y; + } + get_window()->set_cursor (*cCropMoving); + } + return true; +} + +bool PreviewWindow::on_button_release_event (GdkEventButton* event) { + + if (!mainCropWin) + return true; + + if (isMoving) { + isMoving = false; + get_window()->set_cursor (*cNormal); + mainCropWin->remoteMoveReady (); + } + return true; +} diff --git a/rtgui/procthread.h b/rtgui/procthread.h index c025bd028..fe0d0a90f 100644 --- a/rtgui/procthread.h +++ b/rtgui/procthread.h @@ -44,9 +44,10 @@ class ProcessingThread { virtual void end () {} void process () { - if (stopped) + if (stopped){ #undef THREAD_PRIORITY_NORMAL thread = Glib::Thread::create(sigc::mem_fun(*this, &ProcessingThread::process_), (unsigned long int)0, true, true, Glib::THREAD_PRIORITY_NORMAL); + } } void process_ () { stopped = false; diff --git a/rtgui/rtwindow.cc b/rtgui/rtwindow.cc index 0fd85a304..6dd3cfe40 100644 --- a/rtgui/rtwindow.cc +++ b/rtgui/rtwindow.cc @@ -23,7 +23,7 @@ RTWindow::RTWindow () { - cacheMgr.init (); + cacheMgr->init (); #ifdef GLIBMM_EXCEPTIONS_ENABLED try { set_default_icon_from_file (argv0+"/images/logoicon16.png"); @@ -44,6 +44,7 @@ RTWindow::RTWindow () { else unmaximize(); property_destroy_with_parent().set_value(false); + signal_window_state_event().connect( sigc::mem_fun(*this, &RTWindow::on_window_state_event) ); mainNB = Gtk::manage (new Gtk::Notebook ()); mainNB->set_scrollable (true); @@ -59,6 +60,7 @@ RTWindow::RTWindow () { hbf->set_spacing (2); hbf->show_all (); mainNB->append_page (*fpanel, *hbf); + fpanel->signal_expose_event().connect( sigc::mem_fun(*this, &RTWindow::on_expose_event_fpanel) ); bpanel = new BatchQueuePanel (); bpanel->setParent (this); @@ -70,6 +72,20 @@ RTWindow::RTWindow () { hbb->set_spacing (2); hbb->show_all (); mainNB->append_page (*bpanel, *hbb); + + + epanel = new EditorPanel (fpanel); + epanel->setParent (this); + // decorate tab + Gtk::HBox* hbe = Gtk::manage (new Gtk::HBox ()); + hbe->pack_start (*Gtk::manage (new Gtk::Image (Gtk::Stock::EXECUTE, Gtk::ICON_SIZE_MENU))); + hbe->pack_start (*Gtk::manage (new Gtk::Label("Editor"))); + hbe->set_spacing (2); + hbe->show_all (); + mainNB->append_page (*epanel, *hbe); + mainNB->set_current_page (mainNB->page_num (*fpanel)); + epanel->signal_expose_event().connect( sigc::mem_fun(*this, &RTWindow::on_expose_event_epanel) ); + signal_key_press_event().connect( sigc::mem_fun(*this, &RTWindow::keyPressed) ); @@ -103,6 +119,9 @@ RTWindow::RTWindow () { add (*mainBox); show_all (); + + if(options.tabbedUI) + epanel->hide_all(); } void RTWindow::on_realize () { @@ -114,7 +133,7 @@ void RTWindow::on_realize () { cursorManager.init (get_window()); } -bool RTWindow::on_my_window_state_event(GdkEventWindowState* event) { +bool RTWindow::on_window_state_event(GdkEventWindowState* event) { if (!event->new_window_state) { // Window mode options.windowMaximized = false; @@ -163,7 +182,7 @@ void RTWindow::addEditorPanel (EditorPanel* ep, const std::string &name) { epanels[ name ] = ep; filesEdited.insert ( name ); - fpanel->refreshEditedState (filesEdited); + fpanel->refreshEditedState (filesEdited); } void RTWindow::remEditorPanel (EditorPanel* ep) { @@ -211,8 +230,10 @@ void RTWindow::addBatchQueueJob (BatchQueueEntry* bqe, bool head) { bool RTWindow::on_delete_event(GdkEventAny* event) { + fpanel->saveOptions (); bpanel->saveOptions (); + // epanel->saveOptions(); /* if (fileBrowser->getFileCatalog()->getBatchQueue()->hasJobs()) { Gtk::MessageDialog msgd (M("MAIN_MSG_EXITJOBSINQUEUEQUEST"), false, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_YES_NO, true); @@ -227,7 +248,7 @@ bool RTWindow::on_delete_event(GdkEventAny* event) { if (options.startupDir==STARTUPDIR_LAST && fileBrowser->lastSelectedDir ()!="") options.startupPath = fileBrowser->lastSelectedDir (); fileBrowser->close (); - cacheMgr.closeCache (); + cacheMgr->closeCache (); options.lastScale = editorPanel->zoomBar->getScale (); @@ -258,7 +279,7 @@ bool RTWindow::on_delete_event(GdkEventAny* event) { void RTWindow::showPreferences () { - Preferences *pref = new Preferences (); + Preferences *pref = new Preferences (this); pref->run (); delete pref; @@ -296,3 +317,52 @@ void RTWindow::toggle_fullscreen () { void RTWindow::error (Glib::ustring descr){ prLabel.set_text ( descr ); } + +void RTWindow::SetEditorCurrent() +{ + mainNB->set_current_page (mainNB->page_num (*epanel)); +} + +void RTWindow::SetMainCurrent() +{ + mainNB->set_current_page (mainNB->page_num (*fpanel)); +} + +void RTWindow::MoveFileBrowserToMain() +{ + if( fpanel->ribbonPane->get_children().size() ==0) + { + FileCatalog *fCatalog = fpanel->fileCatalog; + epanel->catalogPane->remove(*fCatalog); + fpanel->ribbonPane->add(*fCatalog); + fCatalog->fileBrowser->setArrangement(ThumbBrowserBase::TB_Vertical); + fCatalog->redrawAll(); + } +} + +void RTWindow::MoveFileBrowserToEditor() +{ + if(epanel->catalogPane->get_children().size() ==0 ) + { + FileCatalog *fCatalog = fpanel->fileCatalog; + fpanel->ribbonPane->remove(*fCatalog); + epanel->catalogPane->add(*fCatalog); + fCatalog->fileBrowser->setArrangement(ThumbBrowserBase::TB_Horizontal); + fCatalog->redrawAll(); + } +} + +bool RTWindow::on_expose_event_epanel(GdkEventExpose* event) +{ + if(!options.tabbedUI) + MoveFileBrowserToEditor(); + return false; // Gtk::VBox::on_expose_event(event); +} + + +bool RTWindow::on_expose_event_fpanel(GdkEventExpose* event) +{ + if(!options.tabbedUI) + MoveFileBrowserToMain(); + return false; // Gtk::HPaned::on_expose_event(event); +} diff --git a/rtgui/rtwindow.h b/rtgui/rtwindow.h index aa0db4048..afd4af067 100644 --- a/rtgui/rtwindow.h +++ b/rtgui/rtwindow.h @@ -30,7 +30,7 @@ class RTWindow : public Gtk::Window, public rtengine::ProgressListener{ private: Gtk::Notebook* mainNB; - FilePanel* fpanel; + FilePanel* fpanel; BatchQueuePanel* bpanel; std::set filesEdited; std::map epanels; @@ -41,7 +41,8 @@ class RTWindow : public Gtk::Window, public rtengine::ProgressListener{ bool is_fullscreen; Gtk::Button * btn_fullscreen; - + bool on_expose_event_epanel(GdkEventExpose* event); + bool on_expose_event_fpanel(GdkEventExpose* event); public: RTWindow (); @@ -52,7 +53,7 @@ class RTWindow : public Gtk::Window, public rtengine::ProgressListener{ bool keyPressed (GdkEventKey* event); bool on_delete_event(GdkEventAny* event); - bool on_my_window_state_event(GdkEventWindowState* event); + bool on_window_state_event(GdkEventWindowState* event); void on_mainNB_switch_page(GtkNotebookPage* page, guint page_num); void imageDeveloped (Glib::ustring fname); // called by the batchqueue when it finishes an image @@ -64,6 +65,11 @@ class RTWindow : public Gtk::Window, public rtengine::ProgressListener{ void setProgressState (int state); void error (Glib::ustring descr); rtengine::ProgressListener* getProgressListener () { return pldBridge; } + EditorPanel* epanel; + void SetEditorCurrent(); + void SetMainCurrent(); + void MoveFileBrowserToEditor(); + void MoveFileBrowserToMain(); }; #endif diff --git a/rtgui/shcselector.cc b/rtgui/shcselector.cc index c11b67b10..7dec130d6 100644 --- a/rtgui/shcselector.cc +++ b/rtgui/shcselector.cc @@ -120,6 +120,7 @@ bool SHCSelector::on_expose_event(GdkEventExpose* event) { cr->fill_preserve (); cr->stroke (); } + return true; } bool SHCSelector::on_button_press_event (GdkEventButton* event) { @@ -135,6 +136,7 @@ bool SHCSelector::on_button_press_event (GdkEventButton* event) { break; } queue_draw (); + return true; } bool SHCSelector::on_button_release_event (GdkEventButton* event) { @@ -143,6 +145,7 @@ bool SHCSelector::on_button_release_event (GdkEventButton* event) { movingPosition = -1; queue_draw (); } + return true; } bool SHCSelector::on_motion_notify_event (GdkEventMotion* event) { @@ -163,6 +166,7 @@ bool SHCSelector::on_motion_notify_event (GdkEventMotion* event) { cl->shcChanged (); queue_draw (); } + return true; } void SHCSelector::styleChanged (const Glib::RefPtr& style) { diff --git a/rtgui/thumbbrowserbase.cc b/rtgui/thumbbrowserbase.cc index 4038c346e..cea0bbc83 100644 --- a/rtgui/thumbbrowserbase.cc +++ b/rtgui/thumbbrowserbase.cc @@ -37,11 +37,7 @@ ThumbBrowserBase::ThumbBrowserBase () pack_start (*hb1); - Gtk::HBox* tmp = new Gtk::HBox (); hb2->pack_start (hscroll); - Gtk::Requisition vcr = vscroll.size_request (); - tmp->set_size_request (vcr.width, vcr.width); - hb2->pack_end (*tmp, Gtk::PACK_SHRINK, 0); pack_start (*hb2,Gtk::PACK_SHRINK, 0); @@ -119,6 +115,16 @@ void ThumbBrowserBase::configScrollBars () { vscroll.get_adjustment()->set_page_increment (ih); hscroll.get_adjustment()->set_page_size (iw); vscroll.get_adjustment()->set_page_size (ih); + + if(iw>=inW) + hscroll.hide(); + else + hscroll.show(); + + if(ih>=inH) + vscroll.hide(); + else + vscroll.show(); } } @@ -138,11 +144,11 @@ void ThumbBrowserBase::arrangeFiles () { if (arrangement==TB_Horizontal) { int numOfRows = 1; - if (rowHeight>0) { - numOfRows = (internal.get_height()+rowHeight/2)/rowHeight; - if (numOfRows<1) - numOfRows = 1; - } +// if (rowHeight>0) { +// numOfRows = (internal.get_height()+rowHeight/2)/rowHeight; +// if (numOfRows<1) +// numOfRows = 1; +// } int ct = 0; int currx = 0; int curry = 0; @@ -401,7 +407,7 @@ bool ThumbBrowserBase::Internal::on_expose_event(GdkEventExpose* event) { dirty = false; - Glib::RefPtr window = get_window(); + Glib::RefPtr window = get_window(); int w = get_width(); int h = get_height(); @@ -411,14 +417,14 @@ bool ThumbBrowserBase::Internal::on_expose_event(GdkEventExpose* event) { Glib::RefPtr context = get_pango_context (); context->set_font_description (get_style()->get_font()); for (int i=0; ifd.size(); i++) { - if (!parent->fd[i]->drawable || !parent->fd[i]->insideWindow (0, 0, w, h)) + if (!parent->fd[i]->drawable || !parent->fd[i]->insideWindow (0, 0, w, h)) parent->fd[i]->updatepriority = false; else { parent->fd[i]->updatepriority = true; parent->fd[i]->draw (); } } - + return true; } @@ -480,7 +486,7 @@ void ThumbBrowserBase::zoomChanged (bool zoomIn) { #ifdef _WIN32 gdk_window_process_updates (get_window()->gobj(), true); #endif -} +} void ThumbBrowserBase::refreshThumbImages () { for (int i=0; irefreshQuickThumbnailImage (); + } +} + void ThumbBrowserBase::refreshEditedState (const std::set& efiles) { editedFiles = efiles; @@ -502,7 +514,7 @@ void ThumbBrowserBase::refreshEditedState (const std::set& efiles void ThumbBrowserBase::setArrangement (Arrangement a) { - arrangement = a; + arrangement = a; redraw (); } diff --git a/rtgui/thumbbrowserbase.h b/rtgui/thumbbrowserbase.h index 2dc38e8b7..801a96756 100644 --- a/rtgui/thumbbrowserbase.h +++ b/rtgui/thumbbrowserbase.h @@ -91,10 +91,11 @@ class ThumbBrowserBase : public Gtk::VBox { void zoomIn () { zoomChanged (true); } void zoomOut () { zoomChanged (false); } - const std::vector& getEntries () { return fd; } + const std::vector& getEntries () { return fd; } void styleChanged (const Glib::RefPtr& style); void redraw (); // arrange files and draw area void refreshThumbImages (); // refresh thumbnail sizes, re-generate thumbnail images, arrange and draw + void refreshQuickThumbImages (); // refresh thumbnail sizes, re-generate thumbnail images, arrange and draw void refreshEditedState (const std::set& efiles); void initEntry (ThumbBrowserEntryBase* entry); diff --git a/rtgui/thumbbrowserentrybase.cc b/rtgui/thumbbrowserentrybase.cc index 8e9039d31..e94f2605b 100644 --- a/rtgui/thumbbrowserentrybase.cc +++ b/rtgui/thumbbrowserentrybase.cc @@ -344,8 +344,8 @@ void ThumbBrowserEntryBase::draw () { Glib::RefPtr gc_ = Gdk::GC::create (w->get_window()); - Gdk::Color textn = w->get_style()->get_text(Gtk::STATE_NORMAL); - Gdk::Color texts = w->get_style()->get_text(Gtk::STATE_SELECTED); + // Gdk::Color textn = w->get_style()->get_text(Gtk::STATE_NORMAL); + // Gdk::Color texts = w->get_style()->get_text(Gtk::STATE_SELECTED); Gdk::Color bgn = w->get_style()->get_bg(Gtk::STATE_NORMAL); Gdk::Color bgs = w->get_style()->get_bg(Gtk::STATE_SELECTED); diff --git a/rtgui/thumbbrowserentrybase.h b/rtgui/thumbbrowserentrybase.h index 20f8dda77..6562633d0 100644 --- a/rtgui/thumbbrowserentrybase.h +++ b/rtgui/thumbbrowserentrybase.h @@ -109,6 +109,7 @@ protected: bool operator< (ThumbBrowserEntryBase& other) { return shortname.casefold()>other.shortname.casefold(); } virtual void refreshThumbnailImage () {} + virtual void refreshQuickThumbnailImage () {} virtual void calcThumbnailSize () {} virtual void drawProgressBar (Glib::RefPtr win, Glib::RefPtr gc, const Gdk::Color& foregr, const Gdk::Color& backgr, int x, int w, int y, int h) {} diff --git a/rtgui/thumbimageupdater.cc b/rtgui/thumbimageupdater.cc index df6bee8bf..38720095f 100644 --- a/rtgui/thumbimageupdater.cc +++ b/rtgui/thumbimageupdater.cc @@ -1,175 +1,285 @@ -/* - * 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 -#include - -#define threadNum 4 // IF LCMS GETS THREAD SAFETY WE CAN ENABLE MORE THREADS -ThumbImageUpdater thumbImageUpdater; - -ThumbImageUpdater::ThumbImageUpdater () - : tostop(false), stopped(true), qMutex(NULL), startMutex(NULL) { - - threadPool = new Glib::Thread* [threadNum]; - -} - -ThumbImageUpdater::~ThumbImageUpdater () -{ - delete [] threadPool; -} - -void ThumbImageUpdater::add (Thumbnail* t, const rtengine::procparams::ProcParams& params, int height, bool* priority, ThumbImageUpdateListener* l) { - - if (!qMutex) - qMutex = new Glib::Mutex (); - if (!startMutex) - startMutex = new Glib::Mutex (); - - qMutex->lock (); - // look up if an older version is in the queue - std::list::iterator i; - for (i=jqueue.begin(); i!=jqueue.end(); i++) - if (i->thumbnail==t && i->listener==l) { - i->pparams = params; - i->height = height; - i->priority = priority; - break; - } - // not found, create and append new job - if (i==jqueue.end ()) { - Job j; - j.thumbnail = t; - j.pparams = params; - j.height = height; - j.listener = l; - j.priority = priority; - jqueue.push_back (j); - } - qMutex->unlock (); -} - -void ThumbImageUpdater::process () { - - if (stopped) { - #undef THREAD_PRIORITY_LOW - stopped = false; - thread = Glib::Thread::create(sigc::mem_fun(*this, &ThumbImageUpdater::process_), (unsigned long int)0, true, true, Glib::THREAD_PRIORITY_LOW); - } -} - -void ThumbImageUpdater::process_ () { - - stopped = false; - tostop = false; - - - while (!tostop && !jqueue.empty ()) { - - qMutex->lock (); - int threads = 0; - for (; threads::iterator i; - for (i=jqueue.begin (); i!=jqueue.end(); i++) - if (*(i->priority)) - break; - if (i==jqueue.end()) - i = jqueue.begin(); - Job current = *i; - jqueue.erase (i); - if (current.listener) - threadPool[threads] = Glib::Thread::create(sigc::bind(sigc::mem_fun(*this, &ThumbImageUpdater::processJob), current), 0, true, true, Glib::THREAD_PRIORITY_LOW); - //else - // threadPool[threads] = NULL; - } - qMutex->unlock (); - - for (int j=0; jjoin (); - - for(int j =0; j processThumbImage (current.pparams, current.height, scale); - if (img) - current.listener->updateImage (img, scale, current.pparams.crop); - } - -} - -void ThumbImageUpdater::stop () { - - if (stopped) { - tostop = true; - return; } - - gdk_threads_leave(); - tostop = true; - Glib::Thread::self()->yield(); - if (!stopped) - thread->join (); - gdk_threads_enter(); -} - -void ThumbImageUpdater::removeJobs () { - - if (!qMutex) - return; - - qMutex->lock (); - while (!jqueue.empty()) - jqueue.pop_front (); - qMutex->unlock (); -} - -void ThumbImageUpdater::removeJobs (ThumbImageUpdateListener* listener) { - - if (!qMutex) - return; - - qMutex->lock (); - bool ready = false; - while (!ready) { - ready = true; - std::list::iterator i; - for (i=jqueue.begin(); i!=jqueue.end(); i++) - if (i->listener == listener) { - jqueue.erase (i); - ready = false; - break; - } - } - qMutex->unlock (); -} - -void ThumbImageUpdater::terminate () { - - stop (); - removeJobs (); -} - - +/* + * 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 +#include +#include +#include + +#ifdef _OPENMP +#include +#endif + +#define DEBUG(format,args...) +//#define DEBUG(format,args...) printf("ThumbImageUpdate::%s: " format "\n", __FUNCTION__, ## args) + +class +ThumbImageUpdater::Impl +{ +public: + + struct Job + { + Job(Thumbnail* thumbnail, const rtengine::procparams::ProcParams& pparams, + int height, bool* priority, bool upgrade, + ThumbImageUpdateListener* listener): + thumbnail_(thumbnail), + pparams_(pparams), + height_(height), + priority_(priority), + upgrade_(upgrade), + listener_(listener) + {} + + Job(): + thumbnail_(0), + listener_(0) + {} + + Thumbnail* thumbnail_; + rtengine::procparams::ProcParams pparams_; + int height_; + bool* priority_; + bool upgrade_; + ThumbImageUpdateListener* listener_; + }; + + typedef std::list JobList; + + Impl(): + active_(0), + inactive_waiting_(false) + { + int threadCount=1; + #ifdef _OPENMP + threadCount=omp_get_num_procs(); + #endif + + threadPool_=new Glib::ThreadPool(threadCount,0); + } + + Glib::ThreadPool* threadPool_; + + Glib::Mutex mutex_; + + JobList jobs_; + + unsigned int active_; + + bool inactive_waiting_; + + Glib::Cond inactive_; + + void + processNextJob(void) + { + Job j; + + { + Glib::Mutex::Lock lock(mutex_); + + // nothing to do; could be jobs have been removed + if ( jobs_.empty() ) + { + DEBUG("processing: nothing to do (%d,%d)",paused_,jobs_.empty()); + return; + } + + JobList::iterator i; + + // see if any priority jobs exist + for ( i = jobs_.begin(); i != jobs_.end(); ++i) + { + if ( *(i->priority_) ) + { + DEBUG("processing(priority) %s",i->thumbnail_->getFileName().c_str()); + break; + } + } + + // see if any none upgrade jobs exist + for ( i = jobs_.begin(); i != jobs_.end(); ++i) + { + if ( !i->upgrade_ ) + { + DEBUG("processing(not-upgrade) %s",i->thumbnail_->getFileName().c_str()); + break; + } + } + + // if none, then use first + if ( i == jobs_.end() ) + { + i = jobs_.begin(); + DEBUG("processing(first) %s",i->thumbnail_->getFileName().c_str()); + } + + // copy found job + j = *i; + + // remove so not run again + jobs_.erase(i); + DEBUG("%d job(s) remaining",jobs_.size()); + + ++active_; + } + + // unlock and do processing; will relock on block exit, then call listener + double scale = 1.0; + rtengine::IImage8* img = 0; + + if ( j.upgrade_ ) + { + if ( j.thumbnail_->isQuick() ) + { + img = j.thumbnail_->upgradeThumbImage(j.pparams_, j.height_, scale); + } + } + else + { + img = j.thumbnail_->processThumbImage(j.pparams_, j.height_, scale); + } + + if (img) + { + DEBUG("pushing image %s",j.thumbnail_->getFileName().c_str()); + j.listener_->updateImage(img, scale, j.pparams_.crop); + } + + { + Glib::Mutex::Lock lock(mutex_); + + if ( --active_ == 0 && + inactive_waiting_ ) + { + inactive_waiting_ = false; + inactive_.signal(); + } + } + } +}; + +ThumbImageUpdater* +ThumbImageUpdater::getInstance(void) +{ + // this will not be deleted... + static ThumbImageUpdater* instance_ = 0; + if ( instance_ == 0 ) + { + instance_ = new ThumbImageUpdater(); + } + return instance_; +} + +ThumbImageUpdater::ThumbImageUpdater(): + impl_(new Impl()) +{ +} + +void +ThumbImageUpdater::add(Thumbnail* t, const rtengine::procparams::ProcParams& params, + int height, bool* priority, bool upgrade, ThumbImageUpdateListener* l) +{ + // nobody listening? + if ( l == 0 ) + { + return; + } + + Glib::Mutex::Lock lock(impl_->mutex_); + + // look up if an older version is in the queue + Impl::JobList::iterator i(impl_->jobs_.begin()); + for ( ; i != impl_->jobs_.end(); ++i ) + { + if ( i->thumbnail_ == t && + i->listener_ == l && + i->upgrade_ == upgrade ) + { + DEBUG("updating job %s",t->getFileName().c_str()); + // we have one, update queue entry, will be picked up by thread when processed + i->pparams_ = params; + i->height_ = height; + i->priority_ = priority; + return; + } + } + + // create a new job and append to queue + DEBUG("queing job %s",t->getFileName().c_str()); + impl_->jobs_.push_back(Impl::Job(t,params,height,priority,upgrade,l)); + + DEBUG("adding run request %s",t->getFileName().c_str()); + impl_->threadPool_->push(sigc::mem_fun(*impl_, &ThumbImageUpdater::Impl::processNextJob)); +} + + +void +ThumbImageUpdater::removeJobs(ThumbImageUpdateListener* listener) +{ + DEBUG("removeJobs(%p)",listener); + + Glib::Mutex::Lock lock(impl_->mutex_); + + for( Impl::JobList::iterator i(impl_->jobs_.begin()); i != impl_->jobs_.end(); ) + { + if (i->listener_ == listener) + { + DEBUG("erasing specific job"); + Impl::JobList::iterator e(i++); + impl_->jobs_.erase(e); + } + else + { + ++i; + } + } + + while ( impl_->active_ != 0 ) + { + // XXX this is nasty... it would be nicer if we weren't called with + // this lock held + GThreadUnLock unlock; + DEBUG("waiting for running jobs1"); + impl_->inactive_waiting_ = true; + impl_->inactive_.wait(impl_->mutex_); + } +} + +void +ThumbImageUpdater::removeAllJobs(void) +{ + DEBUG("stop"); + + + Glib::Mutex::Lock lock(impl_->mutex_); + + impl_->jobs_.clear(); + + while ( impl_->active_ != 0 ) + { + // XXX this is nasty... it would be nicer if we weren't called with + // this lock held + GThreadUnLock unlock; + DEBUG("waiting for running jobs2"); + impl_->inactive_waiting_ = true; + impl_->inactive_.wait(impl_->mutex_); + } +} + diff --git a/rtgui/thumbimageupdater.h b/rtgui/thumbimageupdater.h index 16bc8ec50..6fdce5bc1 100644 --- a/rtgui/thumbimageupdater.h +++ b/rtgui/thumbimageupdater.h @@ -1,68 +1,101 @@ -/* - * 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 . - */ -#ifndef _THUMBIMAGEUPDATER_ -#define _THUMBIMAGEUPDATER_ - -#include -#include -#include - -class ThumbImageUpdateListener { - - public: - virtual void updateImage (rtengine::IImage8* img, double scale, rtengine::procparams::CropParams cropParams) {} -}; - -class ThumbImageUpdater { - - struct Job { - Thumbnail* thumbnail; - rtengine::procparams::ProcParams pparams; - int height; - bool* priority; - ThumbImageUpdateListener* listener; - }; - - protected: - bool tostop; - bool stopped; - std::list jqueue; - Glib::Thread* thread; - Glib::Mutex* qMutex; - Glib::Mutex* startMutex; - Glib::Thread **threadPool; - - public: - ThumbImageUpdater (); - ~ThumbImageUpdater (); - - void add (Thumbnail* t, const rtengine::procparams::ProcParams& params, int height, bool* priority, ThumbImageUpdateListener* l); - void process (); - void stop (); - void removeJobs (); - void removeJobs (ThumbImageUpdateListener* listener); - void terminate (); - - void process_ (); - void processJob (Job current); -}; - -extern ThumbImageUpdater thumbImageUpdater; - -#endif +/* + * 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 . + */ +#ifndef _THUMBIMAGEUPDATER_ +#define _THUMBIMAGEUPDATER_ + +#include +#include +#include +#include + +class ThumbImageUpdateListener { + +public: + + /** + * @brief Called when thumbnail image is update + * + * @param img new thumbnail image + * @param scale scale (??) + * @param cropParams how it was cropped (??) + * + * @note no locks are held when called back + */ + virtual void updateImage (rtengine::IImage8* img, double scale, rtengine::procparams::CropParams cropParams) {} +}; + +class ThumbImageUpdater { + + public: + + /** + * @brief Singleton entry point. + * + * @return Pointer to thumbnail image updater. + */ + static ThumbImageUpdater* getInstance(void); + + /** + * @brief Add an thumbnail image update request. + * + * Code will add the request to the queue and, if needed, start a pool + * thread to process it. + * + * @param t thumbnail + * @param params processing params (?) + * @param height how big + * @param priority if \c true then run as soon as possible + * @param l listener waiting on update + */ + void add(Thumbnail* t, const rtengine::procparams::ProcParams& params, + int height, bool* priority, bool upgrade, ThumbImageUpdateListener* l); + + /** + * @brief Remove jobs associated with listener \c l. + * + * Jobs being processed will be finished. Will not return till all jobs for + * \c l have been completed. + * + * @param listener jobs associated with this will be stopped + */ + void removeJobs(ThumbImageUpdateListener* listener); + + /** + * @brief Stop processing and remove all jobs. + * + * Will not return till all running jobs have completed. + */ + void removeAllJobs(void); + + private: + + ThumbImageUpdater(); + + class Impl; + Impl* impl_; +}; + +/** + * @brief Singleton boiler plate. + * + * To use: \c thumbImageUpdater->start() , + */ +#define thumbImageUpdater ThumbImageUpdater::getInstance() + +#endif diff --git a/rtgui/thumbnail.cc b/rtgui/thumbnail.cc index 3f9cd2e72..0ffe641de 100644 --- a/rtgui/thumbnail.cc +++ b/rtgui/thumbnail.cc @@ -34,86 +34,106 @@ using namespace rtengine::procparams; Thumbnail::Thumbnail (CacheManager* cm, const Glib::ustring& fname, CacheImageData* cf) : fname(fname), cfs(*cf), cachemgr(cm), ref(1), enqueueNumber(0), tpp(NULL), - pparamsValid(false), needsReProcessing(true), lastImg(NULL) { + pparamsValid(false), needsReProcessing(true), lastImg(NULL), + quick_(false), initial_(false) { - mutex = new Glib::Mutex (); cfs.load (getCacheFileName ("data")+".txt"); loadProcParams (); - loadThumbnail (); + _loadThumbnail (); generateExifDateTimeStrings (); } Thumbnail::Thumbnail (CacheManager* cm, const Glib::ustring& fname, const std::string& md5) : fname(fname), cachemgr(cm), ref(1), enqueueNumber(0), tpp(NULL), pparamsValid(false), - needsReProcessing(true), lastImg(NULL) { + needsReProcessing(true), lastImg(NULL), + quick_(false), initial_(true) { - mutex = new Glib::Mutex (); cfs.md5 = md5; - generateThumbnailImage (); + _generateThumbnailImage (); loadProcParams (); cfs.recentlySaved = false; + + initial_ = false; } -void Thumbnail::generateThumbnailImage (bool internal) { +void Thumbnail::_generateThumbnailImage () { - if (!internal) - mutex->lock (); + // delete everything loaded into memory + delete tpp; + tpp = NULL; + delete [] lastImg; + lastImg = NULL; + tw = -1; + th = options.maxThumbnailHeight; -// delete everything loaded into memory - delete tpp; - tpp = NULL; - delete [] lastImg; - lastImg = NULL; - tw = -1; - th = options.maxThumbnailHeight; + // generate thumbnail image -// generate thumbnail image + Glib::ustring ext = getExtension (fname); + if (ext=="") + return; + cfs.supported = false; + cfs.exifValid = false; + cfs.timeValid = false; - Glib::ustring ext = getExtension (fname); - if (ext=="") - return; - cfs.supported = false; - cfs.exifValid = false; - cfs.timeValid = false; - - delete tpp; - tpp = NULL; - if (ext.lowercase()=="jpg" || ext.lowercase()=="png" || ext.lowercase()=="tif" || ext.lowercase()=="tiff") - tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, 1); - if (tpp) { - if (ext.lowercase()=="jpg") { - cfs.format = FT_Jpeg; - infoFromImage (fname); - } - else if (ext.lowercase()=="png") - cfs.format = FT_Png; - else if (ext.lowercase()=="tif" || ext.lowercase()=="tiff") { - cfs.format = FT_Tiff; - infoFromImage (fname); - } - } - else { - rtengine::RawMetaDataLocation ri; - tpp = rtengine::Thumbnail::loadFromRaw (fname, ri, tw, th, 1); - if (tpp) { - cfs.format = FT_Raw; - infoFromImage (fname, &ri); - } - } - if (tpp) { - // save thumbnail image to cache - saveThumbnail (); - cfs.supported = true; - } - needsReProcessing = true; + delete tpp; + tpp = NULL; + if (ext.lowercase()=="jpg" || ext.lowercase()=="png" || ext.lowercase()=="tif" || ext.lowercase()=="tiff") + tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, 1); + if (tpp) { + if (ext.lowercase()=="jpg") { + cfs.format = FT_Jpeg; + infoFromImage (fname); + } + else if (ext.lowercase()=="png") + cfs.format = FT_Png; + else if (ext.lowercase()=="tif" || ext.lowercase()=="tiff") { + cfs.format = FT_Tiff; + infoFromImage (fname); + } + } + else { + // RAW works like this: + // 1. if we are here it's because we aren't in the cache so load the JPG + // image out of the RAW. Mark as "quick". + // 2. if we don't find that then just grab the real image. + rtengine::RawMetaDataLocation ri; + if ( initial_ ) + { + quick_ = true; + tpp = rtengine::Thumbnail::loadQuickFromRaw (fname, ri, tw, th, 1); + } + if ( tpp == 0 ) + { + quick_ = false; + tpp = rtengine::Thumbnail::loadFromRaw (fname, ri, tw, th, 1); + } + if (tpp) { + cfs.format = FT_Raw; + infoFromImage (fname, &ri); + } + } + if (tpp ) + { + if ( !quick_ ) + { + _saveThumbnail (); + } + cfs.supported = true; + } + needsReProcessing = true; - cfs.save (getCacheFileName ("data")+".txt"); + if ( !quick_ ) + { + cfs.save (getCacheFileName ("data")+".txt"); + } - generateExifDateTimeStrings (); - - if (!internal) - mutex->unlock (); + generateExifDateTimeStrings (); +} + +void Thumbnail::generateThumbnailImage () { + Glib::Mutex::Lock lock(mutex); + _generateThumbnailImage(); } bool Thumbnail::isSupported () { @@ -231,8 +251,24 @@ bool Thumbnail::isEnqueued () { return enqueueNumber > 0; } -void Thumbnail::increaseRef () { ref++; } -void Thumbnail::decreaseRef () { ref--; if (!ref) cachemgr->closeThumbnail (this); } +void Thumbnail::increaseRef () +{ + Glib::Mutex::Lock lock(mutex); + ++ref; +} + +void Thumbnail::decreaseRef () +{ + Glib::Mutex::Lock lock(mutex); + if ( ref != 0 ) + { + --ref; + if ( ref == 0 ) + { + cachemgr->closeThumbnail (this); + } + } +} void Thumbnail::getThumbnailSize (int &w, int &h) { @@ -244,15 +280,33 @@ void Thumbnail::getThumbnailSize (int &w, int &h) { rtengine::IImage8* Thumbnail::processThumbImage (const rtengine::procparams::ProcParams& pparams, int h, double& scale) { - mutex->lock (); + Glib::Mutex::Lock lock(mutex); if (!tpp) return NULL; - rtengine::IImage8* res = tpp->processImage (pparams, h, rtengine::TI_Bilinear, scale); + if ( quick_ ) + { + return tpp->quickProcessImage (pparams, h, rtengine::TI_Nearest, scale); + } + else + { + return tpp->processImage (pparams, h, rtengine::TI_Bilinear, scale); + } +} - mutex->unlock (); - return res; +rtengine::IImage8* Thumbnail::upgradeThumbImage (const rtengine::procparams::ProcParams& pparams, int h, double& scale) { + + Glib::Mutex::Lock lock(mutex); + + if ( !quick_ ) + { + return 0; + } + + quick_ = false; + _generateThumbnailImage(); + return tpp->processImage (pparams, h, rtengine::TI_Bilinear, scale); } void Thumbnail::generateExifDateTimeStrings () { @@ -340,10 +394,7 @@ void Thumbnail::infoFromImage (const Glib::ustring& fname, rtengine::RawMetaData delete idata; } -void Thumbnail::loadThumbnail (bool internal, bool firstTrial) { - - if (!internal) - mutex->lock (); +void Thumbnail::_loadThumbnail(bool firstTrial) { needsReProcessing = true; delete tpp; @@ -357,9 +408,9 @@ void Thumbnail::loadThumbnail (bool internal, bool firstTrial) { succ = succ && tpp->readImage (getCacheFileName ("images")); if (!succ && firstTrial) { - generateThumbnailImage (true); + _generateThumbnailImage (); if (cfs.supported && firstTrial) - loadThumbnail (true, false); + _loadThumbnail (false); } else if (!succ) { delete tpp; @@ -375,11 +426,14 @@ void Thumbnail::loadThumbnail (bool internal, bool firstTrial) { tpp->init (); } - if (!internal) - mutex->unlock (); } -void Thumbnail::saveThumbnail () { +void Thumbnail::loadThumbnail (bool firstTrial) { + Glib::Mutex::Lock lock(mutex); + _loadThumbnail(firstTrial); +} + +void Thumbnail::_saveThumbnail () { if (!tpp) return; @@ -406,6 +460,12 @@ void Thumbnail::saveThumbnail () { tpp->writeData (getCacheFileName ("data")+".txt"); } +void Thumbnail::saveThumbnail () +{ + Glib::Mutex::Lock lock(mutex); + _saveThumbnail(); +} + void Thumbnail::updateCache () { if (pparamsValid) { diff --git a/rtgui/thumbnail.h b/rtgui/thumbnail.h index fc57d3b6a..0373f4f3d 100644 --- a/rtgui/thumbnail.h +++ b/rtgui/thumbnail.h @@ -31,7 +31,7 @@ class CacheManager; class Thumbnail { - Glib::Mutex* mutex; + Glib::Mutex mutex; Glib::ustring fname; // file name corresponding to the thumbnail CacheImageData cfs; // cache entry corresponding to the thumbnail @@ -58,12 +58,17 @@ class Thumbnail { Glib::ustring exifString; Glib::ustring dateTimeString; + bool initial_; + bool quick_; + // vector of listeners std::vector listeners; + void _loadThumbnail (bool firstTrial=true); + void _saveThumbnail (); + void _generateThumbnailImage (); void infoFromImage (const Glib::ustring& fname, rtengine::RawMetaDataLocation* rml=NULL); - void loadThumbnail (bool internal=false, bool firstTrial=true); - void saveThumbnail (); + void loadThumbnail (bool firstTrial=true); void generateExifDateTimeStrings (); Glib::ustring getCacheFileName (Glib::ustring subdir); @@ -79,6 +84,8 @@ class Thumbnail { void clearProcParams (int whoClearedIt=-1); void loadProcParams (); + bool isQuick() { return quick_; } + bool isPParamsValid() { return pparamsValid; } bool isRecentlySaved (); void imageDeveloped (); void imageEnqueued (); @@ -87,11 +94,11 @@ class Thumbnail { // unsigned char* getThumbnailImage (int &w, int &h, int fixwh=1); // fixwh = 0: fix w and calculate h, =1: fix h and calculate w rtengine::IImage8* processThumbImage (const rtengine::procparams::ProcParams& pparams, int h, double& scale); - void processThumbImage2 (const rtengine::procparams::ProcParams& pparams, int h, rtengine::IImage8*& img, double& scale) { img = processThumbImage(pparams, h, scale); } + rtengine::IImage8* upgradeThumbImage (const rtengine::procparams::ProcParams& pparams, int h, double& scale); void getThumbnailSize (int &w, int &h); void getFinalSize (const rtengine::procparams::ProcParams& pparams, int& w, int& h) { if (tpp) tpp->getFinalSize (pparams, w, h); } - void generateThumbnailImage (bool internal=false); + void generateThumbnailImage (); const Glib::ustring& getExifString (); const Glib::ustring& getDateTimeString (); @@ -122,7 +129,7 @@ class Thumbnail { void decreaseRef (); void updateCache (); - void reSaveThumbnail () { mutex->lock (); saveThumbnail(); mutex->unlock(); } + void saveThumbnail (); }; diff --git a/rtgui/tonecurve.cc b/rtgui/tonecurve.cc index c0efb25f6..f0f194844 100644 --- a/rtgui/tonecurve.cc +++ b/rtgui/tonecurve.cc @@ -51,13 +51,13 @@ ToneCurve::ToneCurve () : ToolPanel(), expAdd(false), blackAdd(false), brAdd(fal //----------- Exposure Compensation ------------------------ expcomp = Gtk::manage (new Adjuster (M("TP_EXPOSURE_EXPCOMP"), -5, 5, 0.01, 0)); pack_start (*expcomp); - hlcompr = Gtk::manage (new Adjuster (M("TP_EXPOSURE_COMPRHIGHLIGHTS"), 0, 150, 1, 0)); + hlcompr = Gtk::manage (new Adjuster (M("TP_EXPOSURE_COMPRHIGHLIGHTS"), 0, 100, 1, 70)); pack_start (*hlcompr); //----------- Black Level ---------------------------------- - black = Gtk::manage (new Adjuster (M("TP_EXPOSURE_BLACKLEVEL"), 0, 32768, 1, 0)); + black = Gtk::manage (new Adjuster (M("TP_EXPOSURE_BLACKLEVEL"), 0, 16384, 1, 0)); pack_start (*black); - shcompr = Gtk::manage (new Adjuster (M("TP_EXPOSURE_COMPRSHADOWS"), 0, 150, 1, 0)); + shcompr = Gtk::manage (new Adjuster (M("TP_EXPOSURE_COMPRSHADOWS"), 0, 100, 1, 25)); pack_start (*shcompr); pack_start (*Gtk::manage (new Gtk::HSeparator())); diff --git a/rtgui/toolpanelcoord.cc b/rtgui/toolpanelcoord.cc index f803b6bf7..cbf7382d2 100644 --- a/rtgui/toolpanelcoord.cc +++ b/rtgui/toolpanelcoord.cc @@ -69,7 +69,7 @@ ToolPanelCoordinator::ToolPanelCoordinator () : ipc(NULL) { addPanel (detailsPanel, sharpening, M("TP_SHARPENING_LABEL")); toolPanels.push_back (sharpening); addPanel (colorPanel, colorboost, M("TP_COLORBOOST_LABEL")); toolPanels.push_back (colorboost); addPanel (colorPanel, colorshift, M("TP_COLORSHIFT_LABEL")); toolPanels.push_back (colorshift); - addPanel (exposurePanel, lcurve, M("TP_LUMACURVE_LABEL")); toolPanels.push_back (lcurve); + addPanel (exposurePanel, lcurve, M("TP_LABCURVE_LABEL")); toolPanels.push_back (lcurve); addPanel (detailsPanel, impulsedenoise, M("TP_IMPULSEDENOISE_LABEL")); toolPanels.push_back (impulsedenoise); addPanel (detailsPanel, lumadenoise, M("TP_LUMADENOISE_LABEL")); toolPanels.push_back (lumadenoise); addPanel (detailsPanel, colordenoise, M("TP_COLORDENOISE_LABEL")); toolPanels.push_back (colordenoise); @@ -263,7 +263,7 @@ void ToolPanelCoordinator::initImage (rtengine::StagedImageProcessor* ipc_, bool void ToolPanelCoordinator::closeImage () { if (ipc) { - ipc->stopProcessing (); + ipc->stopProcessing (); ipc = NULL; } } diff --git a/rtgui/toolpanelcoord.h b/rtgui/toolpanelcoord.h index c09d91fcd..e17c1940d 100644 --- a/rtgui/toolpanelcoord.h +++ b/rtgui/toolpanelcoord.h @@ -36,7 +36,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/rtgui/vignetting.cc b/rtgui/vignetting.cc index 622885f19..3839326c9 100644 --- a/rtgui/vignetting.cc +++ b/rtgui/vignetting.cc @@ -30,8 +30,20 @@ Vignetting::Vignetting () : vigAdd(false) { radius = Gtk::manage (new Adjuster (M("TP_VIGNETTING_RADIUS"), 0, 100, 1, 50)); radius->setAdjusterListener (this); + strength = Gtk::manage (new Adjuster (M("TP_VIGNETTING_STRENGTH"), 1, 100, 1, 1)); + strength->setAdjusterListener (this); + + centerX = Gtk::manage (new Adjuster (M("TP_VIGNETTING_CENTER_X"), -100, 100, 1, 0)); + centerX->setAdjusterListener (this); + + centerY = Gtk::manage (new Adjuster (M("TP_VIGNETTING_CENTER_Y"), -100, 100, 1, 0)); + centerY->setAdjusterListener (this); + pack_start (*amount); pack_start (*radius); + pack_start (*strength); + pack_start (*centerX); + pack_start (*centerY); show_all(); } @@ -45,6 +57,9 @@ void Vignetting::read (const ProcParams* pp, const ParamsEdited* pedited) { amount->setValue (pp->vignetting.amount); radius->setValue (pp->vignetting.radius); + strength->setValue (pp->vignetting.strength); + centerX->setValue (pp->vignetting.centerX); + centerY->setValue (pp->vignetting.centerY); enableListener (); } @@ -53,6 +68,9 @@ void Vignetting::write (ProcParams* pp, ParamsEdited* pedited) { pp->vignetting.amount = (int)amount->getValue (); pp->vignetting.radius = (int)radius->getValue (); + pp->vignetting.strength = (int)strength->getValue (); + pp->vignetting.centerX = (int)centerX->getValue (); + pp->vignetting.centerY = (int)centerY->getValue (); if (pedited) pedited->vignetting.amount = amount->getEditedState (); @@ -62,6 +80,9 @@ void Vignetting::setDefaults (const ProcParams* defParams, const ParamsEdited* p amount->setDefault (defParams->vignetting.amount); radius->setDefault (defParams->vignetting.radius); + strength->setDefault (defParams->vignetting.strength); + centerX->setDefault (defParams->vignetting.centerX); + centerY->setDefault (defParams->vignetting.centerY); if (pedited) amount->setDefaultEditedState (pedited->vignetting.amount ? Edited : UnEdited); @@ -72,7 +93,7 @@ void Vignetting::setDefaults (const ProcParams* defParams, const ParamsEdited* p void Vignetting::adjusterChanged (Adjuster* a, double newval) { if (listener) - listener->panelChanged (EvVignetting, Glib::ustring::compose ("%1=%3\n%2=%4", M("TP_VIGNETTING_AMOUNT"), M("TP_VIGNETTING_RADIUS"), (int)amount->getValue(), (int)radius->getValue())); + listener->panelChanged (EvVignetting, Glib::ustring::compose ("%1=%5\n%2=%6\n%3=%7\n%4=%8 %9", M("TP_VIGNETTING_AMOUNT"), M("TP_VIGNETTING_RADIUS"), M("TP_VIGNETTING_STRENGTH"), M("TP_VIGNETTING_CENTER"), (int)amount->getValue(), (int)radius->getValue(), (int)strength->getValue(), (int)centerX->getValue(), (int)centerY->getValue())); } void Vignetting::setAdjusterBehavior (bool bvadd) { diff --git a/rtgui/vignetting.h b/rtgui/vignetting.h index a4fc0dcd3..64d51c75d 100644 --- a/rtgui/vignetting.h +++ b/rtgui/vignetting.h @@ -28,6 +28,9 @@ class Vignetting : public Gtk::VBox, public AdjusterListener, public ToolPanel { protected: Adjuster* amount; Adjuster* radius; + Adjuster* strength; + Adjuster* centerX; + Adjuster* centerY; bool vigAdd; public: diff --git a/tools/generateTranslationDiffs.sh b/tools/generateTranslationDiffs.sh old mode 100644 new mode 100755