Merge branch 'dev' into spot-removal-tool

This commit is contained in:
Hombre57 2019-12-08 00:37:54 +01:00
commit c23f976302
463 changed files with 16158 additions and 10338 deletions

View File

@ -1,44 +0,0 @@
sudo: required
dist: trusty
language: cpp
compiler:
- gcc
os:
- linux
#branches:
# only:
# - master
notifications:
irc:
channels:
- "chat.freenode.net#rawtherapee"
skip_join: true
template:
- "%{repository}/%{branch} (%{commit} - %{author}): %{build_url}: %{message}"
email:
on_success: change
on_failure: always
env:
global:
- OMP_NUM_THREADS=4
before_install:
- sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y
- sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu/ xenial main"
- sudo apt-get -qq update
- sudo apt-get install gcc-6 g++-6
- sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-6 60 --slave /usr/bin/g++ g++ /usr/bin/g++-6
- sudo apt-get install build-essential cmake curl git libbz2-dev libcanberra-gtk3-dev libexiv2-dev libexpat-dev libfftw3-dev libglibmm-2.4-dev libgtk-3-dev libgtkmm-3.0-dev libiptcdata0-dev libjpeg8-dev liblcms2-dev libpng12-dev libsigc++-2.0-dev libtiff5-dev zlib1g-dev
before_script:
- mkdir build
- cd build
- cmake -DCMAKE_CXX_FLAGS="-Wno-deprecated-declarations" -DWITH_LTO="OFF" -DPROC_TARGET_NUMBER="2" ..
script: make

View File

@ -39,6 +39,7 @@ Development contributors, in last name alphabetical order:
Other contributors (profiles, ideas, mockups, testing, forum activity, translations, etc.), in last name alphabetical order: Other contributors (profiles, ideas, mockups, testing, forum activity, translations, etc.), in last name alphabetical order:
Marcin Bajor Marcin Bajor
Javier Bartol
Thorsten Bartolomäus Thorsten Bartolomäus
Patrik Brunner Patrik Brunner
Fernando Carello Fernando Carello

View File

@ -89,6 +89,7 @@ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${PROC_FLAGS}")
# Stop compilation on typos such as std:swap (missing colon will be detected as unused label): # Stop compilation on typos such as std:swap (missing colon will be detected as unused label):
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror=unused-label") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror=unused-label")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror=delete-incomplete")
# Special treatment for x87 and x86-32 SSE (see GitHub issue #4324) # Special treatment for x87 and x86-32 SSE (see GitHub issue #4324)
include(FindX87Math) include(FindX87Math)
@ -136,6 +137,9 @@ option(TRACE_MYRWMUTEX "Trace custom R/W Mutex (Debug builds only); redirecting
option(AUTO_GDK_FLUSH "Use gdk_flush on all gdk_thread_leave other than the GUI thread; set it ON if you experience X Server warning/errors" OFF) option(AUTO_GDK_FLUSH "Use gdk_flush on all gdk_thread_leave other than the GUI thread; set it ON if you experience X Server warning/errors" OFF)
#option(TARGET32BIT "Build for 32-bit architecture when ON, otherwise 64-bit. Default is OFF" OFF) #option(TARGET32BIT "Build for 32-bit architecture when ON, otherwise 64-bit. Default is OFF" OFF)
option(ENABLE_TCMALLOC "Use the tcmalloc library if available" OFF)
set(TCMALLOC_LIB_DIR "" CACHE PATH "Custom path for the tcmalloc library")
# Set installation directories: # Set installation directories:
if(WIN32 OR APPLE) if(WIN32 OR APPLE)
if(BUILD_BUNDLE) if(BUILD_BUNDLE)
@ -564,6 +568,23 @@ int main()
return 0; return 0;
}" LENSFUN_HAS_LOAD_DIRECTORY) }" LENSFUN_HAS_LOAD_DIRECTORY)
set(TCMALLOC_LIB_DIR)
if(ENABLE_TCMALLOC)
if(TCMALLOC_LIB_DIR)
find_library(TCMALLOC_LIBRARIES tcmalloc PATHS ${TCMALLOC_LIB_DIR} NO_DEFAULT_PATH)
else()
find_library(TCMALLOC_LIBRARIES tcmalloc)
endif()
if(TCMALLOC_LIBRARIES)
message(STATUS "using tcmalloc library in ${TCMALLOC_LIBRARIES}")
else()
set(TCMALLOC_LIBRARIES "" CACHE INTERNAL "" FORCE)
message(STATUS "tcmalloc not found")
endif()
else()
set(TCMALLOC_LIBRARIES "" CACHE INTERNAL "" FORCE)
endif()
add_subdirectory(rtexif) add_subdirectory(rtexif)
add_subdirectory(rtengine) add_subdirectory(rtengine)

View File

@ -8,31 +8,17 @@
<summary xml:lang="pl">Zaawansowany program do wywoływania zdjęć typu raw</summary> <summary xml:lang="pl">Zaawansowany program do wywoływania zdjęć typu raw</summary>
<translation type="gettext">rawtherapee</translation> <translation type="gettext">rawtherapee</translation>
<description> <description>
<p> <p>RawTherapee is a powerful, cross-platform raw photo processing program. It is written mostly in C++ using a GTK+ front-end. It uses a patched version of dcraw for reading raw files, with an in-house solution which adds the highest quality support for certain camera models unsupported by dcraw and enhances the accuracy of certain raw files already supported by dcraw. It is notable for the advanced control it gives the user over the demosaicing and development process.</p>
RawTherapee is a powerful, cross-platform raw photo processing program. It is written mostly in C++ using a GTK+ front-end. It uses a patched version of dcraw for reading raw files, with an in-house solution which adds the highest quality support for certain camera models unsupported by dcraw and enhances the accuracy of certain raw files already supported by dcraw. It is notable for the advanced control it gives the user over the demosaicing and development process. <p>RawTherapee is designed for developing raw files from a broad range of digital cameras, as well as HDR DNG files and non-raw image formats (JPEG, TIFF and PNG). The target audience ranges from enthusiast newcomers who wish to broaden their understanding of how digital imaging works to semi-professional photographers. Knowledge in color science is not compulsory, but it is recommended that you are eager to learn and ready to read our documentation (RawPedia) as well as look up basic concepts which lie outside the scope of RawPedia, such as color balance, elsewhere.</p>
</p> <p>Of course, professionals may use RawTherapee too while enjoying complete freedom, but will probably lack some peripheral features such as Digital Asset Management, printing, uploading, etc. RawTherapee is not aimed at being an inclusive all-in-one program, and the open-source community is sufficiently developed by now to offer all those peripheral features in other specialized software.</p>
<p>
RawTherapee is designed for developing raw files from a broad range of digital cameras, as well as HDR DNG files and non-raw image formats (JPEG, TIFF and PNG). The target audience ranges from enthusiast newcomers who wish to broaden their understanding of how digital imaging works to semi-professional photographers. Knowledge in color science is not compulsory, but it is recommended that you are eager to learn and ready to read our documentation (RawPedia) as well as look up basic concepts which lie outside the scope of RawPedia, such as color balance, elsewhere.
</p>
<p>
Of course, professionals may use RawTherapee too while enjoying complete freedom, but will probably lack some peripheral features such as Digital Asset Management, printing, uploading, etc. RawTherapee is not aimed at being an inclusive all-in-one program, and the open-source community is sufficiently developed by now to offer all those peripheral features in other specialized software.
</p>
</description> </description>
<keywords>
<keyword>raw</keyword>
<keyword>photo</keyword>
<keyword>photography</keyword>
<keyword>develop</keyword>
<keyword>pp3</keyword>
<keyword>graphics</keyword>
</keywords>
<content_rating type="oars-1.0" /> <content_rating type="oars-1.0" />
<metadata_license>CC-BY-SA-4.0</metadata_license> <metadata_license>CC-BY-SA-4.0</metadata_license>
<project_license>GPL-3.0+</project_license> <project_license>GPL-3.0+</project_license>
<url type="bugtracker">https://github.com/Beep6581/RawTherapee/issues/new</url> <url type="bugtracker">https://github.com/Beep6581/RawTherapee/issues</url>
<url type="donation">https://www.paypal.me/rawtherapee</url> <url type="donation">https://www.paypal.me/rawtherapee</url>
<url type="help">https://rawpedia.rawtherapee.com/</url> <url type="help">https://rawpedia.rawtherapee.com</url>
<url type="homepage">https://www.rawtherapee.com/</url> <url type="homepage">https://www.rawtherapee.com</url>
<url type="translate">https://discuss.pixls.us/t/localization-how-to-translate-rawtherapee-and-rawpedia/2594</url> <url type="translate">https://discuss.pixls.us/t/localization-how-to-translate-rawtherapee-and-rawpedia/2594</url>
<launchable type="desktop-id">rawtherapee.desktop</launchable> <launchable type="desktop-id">rawtherapee.desktop</launchable>
<releases> <releases>
@ -48,20 +34,20 @@
</provides> </provides>
<screenshots> <screenshots>
<screenshot type="default"> <screenshot type="default">
<caption>Color-correcting a drosera rotundifolia in RawTherapee 5.7.</caption> <caption>Color correction</caption>
<image width="1920" height="1080">https://rawtherapee.com/images/screenshots/rt570_1.jpg</image> <image width="1920" height="1080">https://rawtherapee.com/images/screenshots/rt57_drosera_rotundifolia.png</image>
</screenshot> </screenshot>
<screenshot> <screenshot>
<caption>HDR DNG of a misty morning in the countryside</caption> <caption>File browser</caption>
<image width="1920" height="1080">https://rawtherapee.com/images/screenshots/rt540_1.jpg</image> <image width="1920" height="1080">https://rawtherapee.com/images/screenshots/rt57_file_browser.png</image>
</screenshot> </screenshot>
<screenshot> <screenshot type="default">
<caption>Straight-out-of-camera vs RawTherapee</caption> <caption>High dynamic range compression</caption>
<image width="1920" height="1080">https://rawtherapee.com/images/screenshots/rt540_2.jpg</image> <image width="1920" height="1080">https://rawtherapee.com/images/screenshots/rt57_field_sunset.png</image>
</screenshot> </screenshot>
<screenshot> <screenshot type="default">
<caption>RawTherapee using the Auto-Matched Tone Curve tool</caption> <caption>Developing a film negative</caption>
<image width="1920" height="1080">https://rawtherapee.com/images/screenshots/rt540_3.jpg</image> <image width="1920" height="1080">https://rawtherapee.com/images/screenshots/rt57_film_negative.png</image>
</screenshot> </screenshot>
</screenshots> </screenshots>
<update_contact>contactus@rawtherapee.com</update_contact> <update_contact>contactus@rawtherapee.com</update_contact>

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1293,6 +1293,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: <b>-</b>
!HISTORY_MSG_491;White Balance !HISTORY_MSG_491;White Balance
!HISTORY_MSG_492;RGB Curves !HISTORY_MSG_492;RGB Curves
!HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_MSG_493;L*a*b* Adjustments
!HISTORY_MSG_494;Capture Sharpening
!HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors
!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction
!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction !HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction
@ -1310,6 +1311,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: <b>-</b>
!HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope !HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope
!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth !HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth
!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal !HISTORY_MSG_DEHAZE_ENABLED;Haze Removal
!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only
!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map !HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map
!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength !HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength
!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold !HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold
@ -1330,6 +1332,13 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: <b>-</b>
!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius
!HISTORY_MSG_METADATA_MODE;Metadata copy mode !HISTORY_MSG_METADATA_MODE;Metadata copy mode
!HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold !HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold
!HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold
!HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius
!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations
!HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold
!HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations
!HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius
!HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost
!HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion !HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion
!HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction !HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction
!HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter
@ -1786,6 +1795,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: <b>-</b>
!TP_CROP_SELECTCROP;Select !TP_CROP_SELECTCROP;Select
!TP_DEHAZE_DEPTH;Depth !TP_DEHAZE_DEPTH;Depth
!TP_DEHAZE_LABEL;Haze Removal !TP_DEHAZE_LABEL;Haze Removal
!TP_DEHAZE_LUMINANCE;Luminance only
!TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map !TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map
!TP_DEHAZE_STRENGTH;Strength !TP_DEHAZE_STRENGTH;Strength
!TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones
@ -1856,16 +1866,16 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: <b>-</b>
!TP_EXPOS_WHITEPOINT_LABEL;Raw White Points !TP_EXPOS_WHITEPOINT_LABEL;Raw White Points
!TP_FILMNEGATIVE_BLUE;Blue ratio !TP_FILMNEGATIVE_BLUE;Blue ratio
!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) !TP_FILMNEGATIVE_GREEN;Reference exponent (contrast)
!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked. !TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards.
!TP_FILMNEGATIVE_LABEL;Film Negative !TP_FILMNEGATIVE_LABEL;Film Negative
!TP_FILMNEGATIVE_PICK;Pick white and black spots !TP_FILMNEGATIVE_PICK;Pick neutral spots
!TP_FILMNEGATIVE_RED;Red ratio !TP_FILMNEGATIVE_RED;Red ratio
!TP_FILMSIMULATION_LABEL;Film Simulation !TP_FILMSIMULATION_LABEL;Film Simulation
!TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now? !TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now?
!TP_FILMSIMULATION_STRENGTH;Strength !TP_FILMSIMULATION_STRENGTH;Strength
!TP_FILMSIMULATION_ZEROCLUTSFOUND;Set HaldCLUT directory in Preferences !TP_FILMSIMULATION_ZEROCLUTSFOUND;Set HaldCLUT directory in Preferences
!TP_FLATFIELD_CLIPCONTROL;Clip control !TP_FLATFIELD_CLIPCONTROL;Clip control
!TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, clip control can lead to color cast. !TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, value 0 is used.
!TP_GENERAL_11SCALE_TOOLTIP;The effects of this tool are only visible or only accurate at a preview scale of 1:1. !TP_GENERAL_11SCALE_TOOLTIP;The effects of this tool are only visible or only accurate at a preview scale of 1:1.
!TP_GRADIENT_CENTER;Center !TP_GRADIENT_CENTER;Center
!TP_GRADIENT_CENTER_X;Center X !TP_GRADIENT_CENTER_X;Center X
@ -1935,6 +1945,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: <b>-</b>
!TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Roundness:\n0 = rectangle,\n50 = fitted ellipse,\n100 = circle. !TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Roundness:\n0 = rectangle,\n50 = fitted ellipse,\n100 = circle.
!TP_PCVIGNETTE_STRENGTH;Strength !TP_PCVIGNETTE_STRENGTH;Strength
!TP_PCVIGNETTE_STRENGTH_TOOLTIP;Filter strength in stops (reached in corners). !TP_PCVIGNETTE_STRENGTH_TOOLTIP;Filter strength in stops (reached in corners).
!TP_PDSHARPENING_LABEL;Capture Sharpening
!TP_PFCURVE_CURVEEDITOR_CH;Hue !TP_PFCURVE_CURVEEDITOR_CH;Hue
!TP_PFCURVE_CURVEEDITOR_CH_TOOLTIP;Controls defringe strength by color.\nHigher = more,\nLower = less. !TP_PFCURVE_CURVEEDITOR_CH_TOOLTIP;Controls defringe strength by color.\nHigher = more,\nLower = less.
!TP_PREPROCESS_DEADPIXFILT;Dead pixel filter !TP_PREPROCESS_DEADPIXFILT;Dead pixel filter
@ -2110,6 +2121,8 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: <b>-</b>
!TP_SAVEDIALOG_OK_TIP;Shortcut: <b>Ctrl-Enter</b> !TP_SAVEDIALOG_OK_TIP;Shortcut: <b>Ctrl-Enter</b>
!TP_SHARPENING_BLUR;Blur radius !TP_SHARPENING_BLUR;Blur radius
!TP_SHARPENING_CONTRAST;Contrast threshold !TP_SHARPENING_CONTRAST;Contrast threshold
!TP_SHARPENING_ITERCHECK;Auto limit iterations
!TP_SHARPENING_RADIUS_BOOST;Corner radius boost
!TP_SHARPENMICRO_CONTRAST;Contrast threshold !TP_SHARPENMICRO_CONTRAST;Contrast threshold
!TP_SOFTLIGHT_LABEL;Soft Light !TP_SOFTLIGHT_LABEL;Soft Light
!TP_SOFTLIGHT_STRENGTH;Strength !TP_SOFTLIGHT_STRENGTH;Strength

View File

@ -1340,6 +1340,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: <b>-</b>
!HISTORY_MSG_491;White Balance !HISTORY_MSG_491;White Balance
!HISTORY_MSG_492;RGB Curves !HISTORY_MSG_492;RGB Curves
!HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_MSG_493;L*a*b* Adjustments
!HISTORY_MSG_494;Capture Sharpening
!HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors
!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction
!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction !HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction
@ -1357,6 +1358,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: <b>-</b>
!HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope !HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope
!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth !HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth
!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal !HISTORY_MSG_DEHAZE_ENABLED;Haze Removal
!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only
!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map !HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map
!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength !HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength
!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold !HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold
@ -1377,6 +1379,13 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: <b>-</b>
!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius
!HISTORY_MSG_METADATA_MODE;Metadata copy mode !HISTORY_MSG_METADATA_MODE;Metadata copy mode
!HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold !HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold
!HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold
!HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius
!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations
!HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold
!HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations
!HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius
!HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost
!HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion !HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion
!HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction !HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction
!HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter
@ -1732,6 +1741,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: <b>-</b>
!TP_DEFRINGE_THRESHOLD;Threshold !TP_DEFRINGE_THRESHOLD;Threshold
!TP_DEHAZE_DEPTH;Depth !TP_DEHAZE_DEPTH;Depth
!TP_DEHAZE_LABEL;Haze Removal !TP_DEHAZE_LABEL;Haze Removal
!TP_DEHAZE_LUMINANCE;Luminance only
!TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map !TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map
!TP_DEHAZE_STRENGTH;Strength !TP_DEHAZE_STRENGTH;Strength
!TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones
@ -1803,16 +1813,16 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: <b>-</b>
!TP_EXPOS_WHITEPOINT_LABEL;Raw White Points !TP_EXPOS_WHITEPOINT_LABEL;Raw White Points
!TP_FILMNEGATIVE_BLUE;Blue ratio !TP_FILMNEGATIVE_BLUE;Blue ratio
!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) !TP_FILMNEGATIVE_GREEN;Reference exponent (contrast)
!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked. !TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards.
!TP_FILMNEGATIVE_LABEL;Film Negative !TP_FILMNEGATIVE_LABEL;Film Negative
!TP_FILMNEGATIVE_PICK;Pick white and black spots !TP_FILMNEGATIVE_PICK;Pick neutral spots
!TP_FILMNEGATIVE_RED;Red ratio !TP_FILMNEGATIVE_RED;Red ratio
!TP_FILMSIMULATION_LABEL;Film Simulation !TP_FILMSIMULATION_LABEL;Film Simulation
!TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now? !TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now?
!TP_FILMSIMULATION_STRENGTH;Strength !TP_FILMSIMULATION_STRENGTH;Strength
!TP_FILMSIMULATION_ZEROCLUTSFOUND;Set HaldCLUT directory in Preferences !TP_FILMSIMULATION_ZEROCLUTSFOUND;Set HaldCLUT directory in Preferences
!TP_FLATFIELD_CLIPCONTROL;Clip control !TP_FLATFIELD_CLIPCONTROL;Clip control
!TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, clip control can lead to color cast. !TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, value 0 is used.
!TP_GENERAL_11SCALE_TOOLTIP;The effects of this tool are only visible or only accurate at a preview scale of 1:1. !TP_GENERAL_11SCALE_TOOLTIP;The effects of this tool are only visible or only accurate at a preview scale of 1:1.
!TP_GRADIENT_CENTER_X_TOOLTIP;Shift gradient to the left (negative values) or right (positive values). !TP_GRADIENT_CENTER_X_TOOLTIP;Shift gradient to the left (negative values) or right (positive values).
!TP_GRADIENT_CENTER_Y_TOOLTIP;Shift gradient up (negative values) or down (positive values). !TP_GRADIENT_CENTER_Y_TOOLTIP;Shift gradient up (negative values) or down (positive values).
@ -1896,6 +1906,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: <b>-</b>
!TP_NEUTRAL_TIP;Resets exposure sliders to neutral values.\nApplies to the same controls that Auto Levels applies to, regardless of whether you used Auto Levels or not. !TP_NEUTRAL_TIP;Resets exposure sliders to neutral values.\nApplies to the same controls that Auto Levels applies to, regardless of whether you used Auto Levels or not.
!TP_PCVIGNETTE_FEATHER_TOOLTIP;Feathering:\n0 = corners only,\n50 = halfway to center,\n100 = to center. !TP_PCVIGNETTE_FEATHER_TOOLTIP;Feathering:\n0 = corners only,\n50 = halfway to center,\n100 = to center.
!TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Roundness:\n0 = rectangle,\n50 = fitted ellipse,\n100 = circle. !TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Roundness:\n0 = rectangle,\n50 = fitted ellipse,\n100 = circle.
!TP_PDSHARPENING_LABEL;Capture Sharpening
!TP_PFCURVE_CURVEEDITOR_CH;Hue !TP_PFCURVE_CURVEEDITOR_CH;Hue
!TP_PFCURVE_CURVEEDITOR_CH_TOOLTIP;Controls defringe strength by color.\nHigher = more,\nLower = less. !TP_PFCURVE_CURVEEDITOR_CH_TOOLTIP;Controls defringe strength by color.\nHigher = more,\nLower = less.
!TP_PREPROCESS_DEADPIXFILT;Dead pixel filter !TP_PREPROCESS_DEADPIXFILT;Dead pixel filter
@ -2078,6 +2089,8 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: <b>-</b>
!TP_RETINEX_VIEW_UNSHARP;Unsharp mask !TP_RETINEX_VIEW_UNSHARP;Unsharp mask
!TP_SHARPENING_BLUR;Blur radius !TP_SHARPENING_BLUR;Blur radius
!TP_SHARPENING_CONTRAST;Contrast threshold !TP_SHARPENING_CONTRAST;Contrast threshold
!TP_SHARPENING_ITERCHECK;Auto limit iterations
!TP_SHARPENING_RADIUS_BOOST;Corner radius boost
!TP_SHARPENMICRO_CONTRAST;Contrast threshold !TP_SHARPENMICRO_CONTRAST;Contrast threshold
!TP_SHARPENMICRO_LABEL;Microcontrast !TP_SHARPENMICRO_LABEL;Microcontrast
!TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5 !TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5

View File

@ -961,8 +961,8 @@ MAIN_TOOLTIP_BACKCOLOR2;Barva pozadí náhledu: <b>bílá</b>\nZkratka: <b>9</b>
MAIN_TOOLTIP_BACKCOLOR3;Barva pozadí náhledu: <b>středně šedá</b>\nZkratka: <b>9</b> MAIN_TOOLTIP_BACKCOLOR3;Barva pozadí náhledu: <b>středně šedá</b>\nZkratka: <b>9</b>
MAIN_TOOLTIP_BEFOREAFTERLOCK;<b>Zamknout</b> / <b>Odemknout</b> pohled <b>Před</b>\n\n<b>Zamknout</b>: ponechá pohled <b>Před</b> nezměněn.\nUžitečné pro posouzení výsledného efektu po použití více nástrojů.\nNavíc může být porovnání provedeno proti kterémukoli stavu v historii.\n\n<b>Odemknout</b>: pohled <b>Před</b> bude následovat pohled <b>Poté</b>, vždy jen o jeden krok zpět, představí vliv právě použitého nástroje. MAIN_TOOLTIP_BEFOREAFTERLOCK;<b>Zamknout</b> / <b>Odemknout</b> pohled <b>Před</b>\n\n<b>Zamknout</b>: ponechá pohled <b>Před</b> nezměněn.\nUžitečné pro posouzení výsledného efektu po použití více nástrojů.\nNavíc může být porovnání provedeno proti kterémukoli stavu v historii.\n\n<b>Odemknout</b>: pohled <b>Před</b> bude následovat pohled <b>Poté</b>, vždy jen o jeden krok zpět, představí vliv právě použitého nástroje.
MAIN_TOOLTIP_HIDEHP;Zobrazit či schovat levý panel (obsahující historii).\nZkratka: <b>l</b> MAIN_TOOLTIP_HIDEHP;Zobrazit či schovat levý panel (obsahující historii).\nZkratka: <b>l</b>
MAIN_TOOLTIP_INDCLIPPEDH;Zvýraznit oříznutá světla.\nZkratka: <b>&lt;</b> MAIN_TOOLTIP_INDCLIPPEDH;Zvýraznit oříznutá světla.\nZkratka: <b>&gt;</b>
MAIN_TOOLTIP_INDCLIPPEDS;Zvýraznit oříznuté stíny.\nZkratka: <b>&gt;</b> MAIN_TOOLTIP_INDCLIPPEDS;Zvýraznit oříznuté stíny.\nZkratka: <b>&lt;</b>
MAIN_TOOLTIP_PREVIEWB;Náhled <b>modrého kanálu</b>.\nZkratka: <b>b</b> MAIN_TOOLTIP_PREVIEWB;Náhled <b>modrého kanálu</b>.\nZkratka: <b>b</b>
MAIN_TOOLTIP_PREVIEWFOCUSMASK;Náhled <b>masky zaostření</b>.\nZkratka: <b>Shift-f</b>\n\nVíce přesné u snímků s nízkou hloubkou ostrosti, nízkým šumem a na vyšších úrovních zvětšení.\n\nPoužijte přiblížení v rozsahu 10 až 30% pro zlepšení přesnosti detekce u zašuměných snímků. MAIN_TOOLTIP_PREVIEWFOCUSMASK;Náhled <b>masky zaostření</b>.\nZkratka: <b>Shift-f</b>\n\nVíce přesné u snímků s nízkou hloubkou ostrosti, nízkým šumem a na vyšších úrovních zvětšení.\n\nPoužijte přiblížení v rozsahu 10 až 30% pro zlepšení přesnosti detekce u zašuměných snímků.
MAIN_TOOLTIP_PREVIEWG;Náhled <b>zeleného kanálu</b>.\nZkratka: <b>g</b> MAIN_TOOLTIP_PREVIEWG;Náhled <b>zeleného kanálu</b>.\nZkratka: <b>g</b>
@ -2323,13 +2323,26 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: <b>-</b>
!FILEBROWSER_POPUPREMOVE;Delete permanently !FILEBROWSER_POPUPREMOVE;Delete permanently
!FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version !FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version
!FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. !FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash.
!HISTORY_MSG_494;Capture Sharpening
!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only
!HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative !HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative
!HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values !HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values
!HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold
!HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius
!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations
!HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold
!HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations
!HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius
!HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost
!PARTIALPASTE_FILMNEGATIVE;Film Negative !PARTIALPASTE_FILMNEGATIVE;Film Negative
!PREFERENCES_APPEARANCE_PSEUDOHIDPI;Pseudo-HiDPI mode !PREFERENCES_APPEARANCE_PSEUDOHIDPI;Pseudo-HiDPI mode
!TP_DEHAZE_LUMINANCE;Luminance only
!TP_FILMNEGATIVE_BLUE;Blue ratio !TP_FILMNEGATIVE_BLUE;Blue ratio
!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) !TP_FILMNEGATIVE_GREEN;Reference exponent (contrast)
!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked. !TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards.
!TP_FILMNEGATIVE_LABEL;Film Negative !TP_FILMNEGATIVE_LABEL;Film Negative
!TP_FILMNEGATIVE_PICK;Pick white and black spots !TP_FILMNEGATIVE_PICK;Pick neutral spots
!TP_FILMNEGATIVE_RED;Red ratio !TP_FILMNEGATIVE_RED;Red ratio
!TP_PDSHARPENING_LABEL;Capture Sharpening
!TP_SHARPENING_ITERCHECK;Auto limit iterations
!TP_SHARPENING_RADIUS_BOOST;Corner radius boost

View File

@ -82,6 +82,7 @@
#81 15.04.2019 Erweiterung (TooWaBoo) RT 5.6 #81 15.04.2019 Erweiterung (TooWaBoo) RT 5.6
#82 25.05.2019 Erweiterung (TooWaBoo) RT 5.6 #82 25.05.2019 Erweiterung (TooWaBoo) RT 5.6
#83 06.07.2019 Erweiterung (TooWaBoo) RT 5.6 #83 06.07.2019 Erweiterung (TooWaBoo) RT 5.6
#84 06.10.2019 Erweiterung (TooWaBoo) RT 5.7
#84 18.07.2019 Erweiterung (TooWaBoo) RT 5.6 #84 18.07.2019 Erweiterung (TooWaBoo) RT 5.6
ABOUT_TAB_BUILD;Version ABOUT_TAB_BUILD;Version
@ -808,6 +809,7 @@ HISTORY_MSG_490;(Dynamikkompression)\nIntensität
HISTORY_MSG_491;(Weißabgleich) HISTORY_MSG_491;(Weißabgleich)
HISTORY_MSG_492;(RGB-Kurven) HISTORY_MSG_492;(RGB-Kurven)
HISTORY_MSG_493;(L*a*b*) HISTORY_MSG_493;(L*a*b*)
HISTORY_MSG_494;(Eingangsschärfung)
HISTORY_MSG_CLAMPOOG;(Belichtung) - Farben\nauf Farbraum beschränken HISTORY_MSG_CLAMPOOG;(Belichtung) - Farben\nauf Farbraum beschränken
HISTORY_MSG_COLORTONING_LABGRID_VALUE;(Farbanpassungen)\nL*a*b*-Farbkorrektur HISTORY_MSG_COLORTONING_LABGRID_VALUE;(Farbanpassungen)\nL*a*b*-Farbkorrektur
HISTORY_MSG_COLORTONING_LABREGION_AB;(Farbanpassungen)\nL*a*b*-Farbkorrektur\nBereich HISTORY_MSG_COLORTONING_LABREGION_AB;(Farbanpassungen)\nL*a*b*-Farbkorrektur\nBereich
@ -825,6 +827,7 @@ HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;(Farbanpassungen)\nL*a*b*-Farbkorrekt
HISTORY_MSG_COLORTONING_LABREGION_SLOPE;(Farbanpassungen)\nL*a*b*-Farbkorrektur\nBereich - Steigung HISTORY_MSG_COLORTONING_LABREGION_SLOPE;(Farbanpassungen)\nL*a*b*-Farbkorrektur\nBereich - Steigung
HISTORY_MSG_DEHAZE_DEPTH;(Bildschleier entfernen)\nTiefe HISTORY_MSG_DEHAZE_DEPTH;(Bildschleier entfernen)\nTiefe
HISTORY_MSG_DEHAZE_ENABLED;(Bildschleier entfernen) HISTORY_MSG_DEHAZE_ENABLED;(Bildschleier entfernen)
HISTORY_MSG_DEHAZE_LUMINANCE;(Bildschleier entfernen)\nNur Luminanz
HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;(Bildschleier entfernen)\nMaske anzeigen HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;(Bildschleier entfernen)\nMaske anzeigen
HISTORY_MSG_DEHAZE_STRENGTH;(Bildschleier entfernen)\nIntensität HISTORY_MSG_DEHAZE_STRENGTH;(Bildschleier entfernen)\nIntensität
HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;(Sensor—Matrix)\nFarbinterpolation\nAuto-Kontrastschwelle HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;(Sensor—Matrix)\nFarbinterpolation\nAuto-Kontrastschwelle
@ -845,6 +848,13 @@ HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;(Lokaler Kontrast)\nHelle Bereiche
HISTORY_MSG_LOCALCONTRAST_RADIUS;(Lokaler Kontrast)\nRadius HISTORY_MSG_LOCALCONTRAST_RADIUS;(Lokaler Kontrast)\nRadius
HISTORY_MSG_METADATA_MODE;(Metadaten)\nKopiermodus HISTORY_MSG_METADATA_MODE;(Metadaten)\nKopiermodus
HISTORY_MSG_MICROCONTRAST_CONTRAST;(Mikrokontrast)\nKontrastschwelle HISTORY_MSG_MICROCONTRAST_CONTRAST;(Mikrokontrast)\nKontrastschwelle
HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;(Eingangsschärfung)\nAuto-Schwelle
HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;(Eingangsschärfung)\nAuto-Radius
HISTORY_MSG_PDSHARPEN_CONTRAST;(Eingangsschärfung)\nKontrastschwelle
HISTORY_MSG_PDSHARPEN_GAMMA;(Eingangsschärfung)\nGamma
HISTORY_MSG_PDSHARPEN_ITERATIONS;(Eingangsschärfung)\nIterationen
HISTORY_MSG_PDSHARPEN_RADIUS;(Eingangsschärfung)\nRadius
HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;(Eingangsschärfung)\nRandschärfe erhöhen
HISTORY_MSG_PIXELSHIFT_DEMOSAIC;(Sensor-Matrix)\nFarbinterpolation - PS\nBewegungsmethode HISTORY_MSG_PIXELSHIFT_DEMOSAIC;(Sensor-Matrix)\nFarbinterpolation - PS\nBewegungsmethode
HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;(Sensor-Matrix)\nVorverarbeitung\nRichtung HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;(Sensor-Matrix)\nVorverarbeitung\nRichtung
HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;(Sensor-Matrix)\nVorverarbeitung\nPDAF-Zeilenfilter HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;(Sensor-Matrix)\nVorverarbeitung\nPDAF-Zeilenfilter
@ -855,6 +865,7 @@ HISTORY_MSG_RAW_BORDER;(Sensor-Matrix)\nFarbinterpolation\nBildrand
HISTORY_MSG_RESIZE_ALLOWUPSCALING;(Skalieren)\nHochskalieren zulassen HISTORY_MSG_RESIZE_ALLOWUPSCALING;(Skalieren)\nHochskalieren zulassen
HISTORY_MSG_SHARPENING_BLUR;(Schärfung)\nWeichzeichnerradius HISTORY_MSG_SHARPENING_BLUR;(Schärfung)\nWeichzeichnerradius
HISTORY_MSG_SHARPENING_CONTRAST;(Schärfung)\nKontrastschwelle HISTORY_MSG_SHARPENING_CONTRAST;(Schärfung)\nKontrastschwelle
HISTORY_MSG_SHARPENING_GAMMA;(Schärfung) - Gamma
HISTORY_MSG_SH_COLORSPACE;Farbraum HISTORY_MSG_SH_COLORSPACE;Farbraum
HISTORY_MSG_SOFTLIGHT_ENABLED;(Weiches Licht) HISTORY_MSG_SOFTLIGHT_ENABLED;(Weiches Licht)
HISTORY_MSG_SOFTLIGHT_STRENGTH;(Weiches Licht)\nIntensität HISTORY_MSG_SOFTLIGHT_STRENGTH;(Weiches Licht)\nIntensität
@ -1011,8 +1022,8 @@ MAIN_TOOLTIP_BACKCOLOR2;Hintergrundfarbe der Vorschau: <b>Weiß</b>\nTaste: <b>9
MAIN_TOOLTIP_BACKCOLOR3;Hintergrundfarbe der Vorschau: <b>Mittleres Grau</b>\nTaste: <b>9</b> MAIN_TOOLTIP_BACKCOLOR3;Hintergrundfarbe der Vorschau: <b>Mittleres Grau</b>\nTaste: <b>9</b>
MAIN_TOOLTIP_BEFOREAFTERLOCK;<b>Vorher-Ansicht:</b> Sperren / Entsperren\n\n<b>Gesperrt</b>: Friert die Vorher-Ansicht ein, so\ndass sich die Gesamtwirkung mehrerer\nBearbeitungsschritte beurteilen lässt.\n\n<b>Entsperrt</b>: Die Vorher-Ansicht hinkt dem\naktuellen Bild immer einen Bearbeitungs-\nschritt hinterher. MAIN_TOOLTIP_BEFOREAFTERLOCK;<b>Vorher-Ansicht:</b> Sperren / Entsperren\n\n<b>Gesperrt</b>: Friert die Vorher-Ansicht ein, so\ndass sich die Gesamtwirkung mehrerer\nBearbeitungsschritte beurteilen lässt.\n\n<b>Entsperrt</b>: Die Vorher-Ansicht hinkt dem\naktuellen Bild immer einen Bearbeitungs-\nschritt hinterher.
MAIN_TOOLTIP_HIDEHP;Linkes Bedienfeld ein-/ausblenden.\nTaste: <b>l</b> MAIN_TOOLTIP_HIDEHP;Linkes Bedienfeld ein-/ausblenden.\nTaste: <b>l</b>
MAIN_TOOLTIP_INDCLIPPEDH;Anzeige zu heller Bereiche ein-/ausschalten.\nTaste: <b>&lt;</b> MAIN_TOOLTIP_INDCLIPPEDH;Anzeige zu heller Bereiche ein-/ausschalten.\nTaste: <b>&gt;</b>
MAIN_TOOLTIP_INDCLIPPEDS;Anzeige zu dunkler Bereiche ein-/ausschalten.\nTaste: <b>&gt;</b> MAIN_TOOLTIP_INDCLIPPEDS;Anzeige zu dunkler Bereiche ein-/ausschalten.\nTaste: <b>&lt;</b>
MAIN_TOOLTIP_PREVIEWB;Vorschau Blau-Kanal\nTaste: <b>b</b> MAIN_TOOLTIP_PREVIEWB;Vorschau Blau-Kanal\nTaste: <b>b</b>
MAIN_TOOLTIP_PREVIEWFOCUSMASK;Vorschau Fokusmaske\nTaste: <b>Umschalt</b> + <b>f</b>\n\nPräziser bei Bildern mit geringer Tiefenschärfe,\nniedrigem Rauschen und bei hoher Vergrößerung. MAIN_TOOLTIP_PREVIEWFOCUSMASK;Vorschau Fokusmaske\nTaste: <b>Umschalt</b> + <b>f</b>\n\nPräziser bei Bildern mit geringer Tiefenschärfe,\nniedrigem Rauschen und bei hoher Vergrößerung.
MAIN_TOOLTIP_PREVIEWG;Vorschau Grün-Kanal\nTaste: <b>g</b> MAIN_TOOLTIP_PREVIEWG;Vorschau Grün-Kanal\nTaste: <b>g</b>
@ -1613,6 +1624,7 @@ TP_DEFRINGE_RADIUS;Radius
TP_DEFRINGE_THRESHOLD;Schwelle TP_DEFRINGE_THRESHOLD;Schwelle
TP_DEHAZE_DEPTH;Tiefe TP_DEHAZE_DEPTH;Tiefe
TP_DEHAZE_LABEL;Bildschleier entfernen TP_DEHAZE_LABEL;Bildschleier entfernen
TP_DEHAZE_LUMINANCE;Nur Luminanz
TP_DEHAZE_SHOW_DEPTH_MAP;Maske anzeigen TP_DEHAZE_SHOW_DEPTH_MAP;Maske anzeigen
TP_DEHAZE_STRENGTH;Intensität TP_DEHAZE_STRENGTH;Intensität
TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto-Multizonen TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto-Multizonen
@ -1723,9 +1735,9 @@ TP_EXPOS_BLACKPOINT_LABEL;Schwarzpunkt
TP_EXPOS_WHITEPOINT_LABEL;Weißpunkt TP_EXPOS_WHITEPOINT_LABEL;Weißpunkt
TP_FILMNEGATIVE_BLUE;Blauverhältnis TP_FILMNEGATIVE_BLUE;Blauverhältnis
TP_FILMNEGATIVE_GREEN;Bezugsexponent (Kontrast) TP_FILMNEGATIVE_GREEN;Bezugsexponent (Kontrast)
TP_FILMNEGATIVE_GUESS_TOOLTIP;Berechnet die Exponenten durch Auswahl zweier neutraler\nReferenzpunkte im Bild. Weiß (Hellgrau) und Schwarz (Dunkelgrau).\nDie Reihenfolge spielt keine Rolle. Die Exponenten werden aktualisiert,\nnachdem der zweite Punkt ausgewählt wurde. TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards.
TP_FILMNEGATIVE_LABEL;Filmnegativ TP_FILMNEGATIVE_LABEL;Filmnegativ
TP_FILMNEGATIVE_PICK;Weißen und schwarzen Bereich auswählen TP_FILMNEGATIVE_PICK;Pick neutral spots
TP_FILMNEGATIVE_RED;Rotverhältnis TP_FILMNEGATIVE_RED;Rotverhältnis
TP_FILMSIMULATION_LABEL;Filmsimulation TP_FILMSIMULATION_LABEL;Filmsimulation
TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee sucht nach Hald-CLUT-Bildern, die für die Filmsimulation benötigt werden, in einem Ordner, der viel Zeit benötigt.\nGehen Sie zu\n< Einstellungen > Bildbearbeitung > Filmsimulation >\nund prüfen Sie welcher Order benutzt wird. Wählen Sie den Ordner aus, der nur die Hald-CLUT-Bilder beinhaltet, oder einen leeren Ordner, wenn Sie die Filsimulation nicht verwenden möchten.\n\nWeitere Informationen über die Filmsimulation finden Sie auf RawPedia.\n\nMöchten Sie die Suche beenden? TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee sucht nach Hald-CLUT-Bildern, die für die Filmsimulation benötigt werden, in einem Ordner, der viel Zeit benötigt.\nGehen Sie zu\n< Einstellungen > Bildbearbeitung > Filmsimulation >\nund prüfen Sie welcher Order benutzt wird. Wählen Sie den Ordner aus, der nur die Hald-CLUT-Bilder beinhaltet, oder einen leeren Ordner, wenn Sie die Filsimulation nicht verwenden möchten.\n\nWeitere Informationen über die Filmsimulation finden Sie auf RawPedia.\n\nMöchten Sie die Suche beenden?
@ -1875,6 +1887,7 @@ TP_PCVIGNETTE_ROUNDNESS;Form
TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Form:\n0 = Rechteck\n50 = Ellipse\n100 = Kreis TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Form:\n0 = Rechteck\n50 = Ellipse\n100 = Kreis
TP_PCVIGNETTE_STRENGTH;Intensität TP_PCVIGNETTE_STRENGTH;Intensität
TP_PCVIGNETTE_STRENGTH_TOOLTIP;Filterstärke in Blendenstufen (bezogen auf die Bildecken). TP_PCVIGNETTE_STRENGTH_TOOLTIP;Filterstärke in Blendenstufen (bezogen auf die Bildecken).
TP_PDSHARPENING_LABEL;Eingangsschärfung
TP_PERSPECTIVE_HORIZONTAL;Horizontal TP_PERSPECTIVE_HORIZONTAL;Horizontal
TP_PERSPECTIVE_LABEL;Perspektive TP_PERSPECTIVE_LABEL;Perspektive
TP_PERSPECTIVE_VERTICAL;Vertikal TP_PERSPECTIVE_VERTICAL;Vertikal
@ -2104,12 +2117,14 @@ TP_SHARPENING_BLUR;Weichzeichnerradius
TP_SHARPENING_CONTRAST;Kontrastschwelle TP_SHARPENING_CONTRAST;Kontrastschwelle
TP_SHARPENING_EDRADIUS;Radius TP_SHARPENING_EDRADIUS;Radius
TP_SHARPENING_EDTOLERANCE;Kantentoleranz TP_SHARPENING_EDTOLERANCE;Kantentoleranz
TP_SHARPENING_GAMMA;Gamma
TP_SHARPENING_HALOCONTROL;Halokontrolle TP_SHARPENING_HALOCONTROL;Halokontrolle
TP_SHARPENING_HCAMOUNT;Intensität TP_SHARPENING_HCAMOUNT;Intensität
TP_SHARPENING_LABEL;Schärfung TP_SHARPENING_LABEL;Schärfung
TP_SHARPENING_METHOD;Methode TP_SHARPENING_METHOD;Methode
TP_SHARPENING_ONLYEDGES;Nur Kanten schärfen TP_SHARPENING_ONLYEDGES;Nur Kanten schärfen
TP_SHARPENING_RADIUS;Radius TP_SHARPENING_RADIUS;Radius
TP_SHARPENING_RADIUS_BOOST;Randschärfe erhöhen
TP_SHARPENING_RLD;RL-Dekonvolution TP_SHARPENING_RLD;RL-Dekonvolution
TP_SHARPENING_RLD_AMOUNT;Intensität TP_SHARPENING_RLD_AMOUNT;Intensität
TP_SHARPENING_RLD_DAMPING;Dämpfung TP_SHARPENING_RLD_DAMPING;Dämpfung
@ -2371,3 +2386,9 @@ ZOOMPANEL_ZOOMFITSCREEN;An Bildschirm anpassen.\nTaste: <b>Alt</b> + <b>f</b>
ZOOMPANEL_ZOOMIN;Hineinzoomen\nTaste: <b>+</b> ZOOMPANEL_ZOOMIN;Hineinzoomen\nTaste: <b>+</b>
ZOOMPANEL_ZOOMOUT;Herauszoomen\nTaste: <b>-</b> ZOOMPANEL_ZOOMOUT;Herauszoomen\nTaste: <b>-</b>
!!!!!!!!!!!!!!!!!!!!!!!!!
! Untranslated keys follow; remove the ! prefix after an entry is translated.
!!!!!!!!!!!!!!!!!!!!!!!!!
!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations
!TP_SHARPENING_ITERCHECK;Auto limit iterations

View File

@ -88,7 +88,7 @@ TP_DIRPYREQUALIZER_ALGO;Skin Colour Range
TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colours of the skin, minimizing the action on other colours\nLarge: avoid more artifacts. TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colours of the skin, minimizing the action on other colours\nLarge: avoid more artifacts.
TP_DIRPYREQUALIZER_TOOLTIP;Attempts to reduce artifacts in the transitions between skin colours (hue, chroma, luma) and the rest of the image. TP_DIRPYREQUALIZER_TOOLTIP;Attempts to reduce artifacts in the transitions between skin colours (hue, chroma, luma) and the rest of the image.
TP_EXPOSURE_CLAMPOOG;Clip out-of-gamut colours TP_EXPOSURE_CLAMPOOG;Clip out-of-gamut colours
TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, clip control can lead to colour cast. TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no colour) in the original scene. The patches should differ in brightness. Set the white balance afterwards.
TP_GRADIENT_CENTER;Centre TP_GRADIENT_CENTER;Centre
TP_GRADIENT_CENTER_X;Centre X TP_GRADIENT_CENTER_X;Centre X
TP_GRADIENT_CENTER_Y;Centre Y TP_GRADIENT_CENTER_Y;Centre Y
@ -820,6 +820,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh
!HISTORY_MSG_491;White Balance !HISTORY_MSG_491;White Balance
!HISTORY_MSG_492;RGB Curves !HISTORY_MSG_492;RGB Curves
!HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_MSG_493;L*a*b* Adjustments
!HISTORY_MSG_494;Capture Sharpening
!HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Channel !HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Channel
!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - region C mask !HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - region C mask
!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask !HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask
@ -834,6 +835,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh
!HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope !HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope
!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth !HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth
!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal !HISTORY_MSG_DEHAZE_ENABLED;Haze Removal
!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only
!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map !HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map
!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength !HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength
!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold !HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold
@ -854,6 +856,13 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh
!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius
!HISTORY_MSG_METADATA_MODE;Metadata copy mode !HISTORY_MSG_METADATA_MODE;Metadata copy mode
!HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold !HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold
!HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold
!HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius
!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations
!HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold
!HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations
!HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius
!HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost
!HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion !HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion
!HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction !HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction
!HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter
@ -1012,8 +1021,8 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh
!MAIN_TAB_TRANSFORM_TOOLTIP;Shortcut: <b>Alt-t</b> !MAIN_TAB_TRANSFORM_TOOLTIP;Shortcut: <b>Alt-t</b>
!MAIN_TOOLTIP_BEFOREAFTERLOCK;<b>Lock</b> / <b>Unlock</b> the <b>Before</b> view\n\n<b>Lock</b>: keep the <b>Before</b> view unchanged.\nUseful to evaluate the cumulative effect of multiple tools.\nAdditionally, comparisons can be made to any state in the History.\n\n<b>Unlock</b>: the <b>Before</b> view will follow the <b>After</b> view one step behind, showing the image before the effect of the currently used tool. !MAIN_TOOLTIP_BEFOREAFTERLOCK;<b>Lock</b> / <b>Unlock</b> the <b>Before</b> view\n\n<b>Lock</b>: keep the <b>Before</b> view unchanged.\nUseful to evaluate the cumulative effect of multiple tools.\nAdditionally, comparisons can be made to any state in the History.\n\n<b>Unlock</b>: the <b>Before</b> view will follow the <b>After</b> view one step behind, showing the image before the effect of the currently used tool.
!MAIN_TOOLTIP_HIDEHP;Show/Hide the left panel (including the history).\nShortcut: <b>l</b> !MAIN_TOOLTIP_HIDEHP;Show/Hide the left panel (including the history).\nShortcut: <b>l</b>
!MAIN_TOOLTIP_INDCLIPPEDH;Clipped highlight indication.\nShortcut: <b>&lt;</b> !MAIN_TOOLTIP_INDCLIPPEDH;Clipped highlight indication.\nShortcut: <b>&gt;</b>
!MAIN_TOOLTIP_INDCLIPPEDS;Clipped shadow indication.\nShortcut: <b>&gt;</b> !MAIN_TOOLTIP_INDCLIPPEDS;Clipped shadow indication.\nShortcut: <b>&lt;</b>
!MAIN_TOOLTIP_PREVIEWB;Preview the <b>blue channel</b>.\nShortcut: <b>b</b> !MAIN_TOOLTIP_PREVIEWB;Preview the <b>blue channel</b>.\nShortcut: <b>b</b>
!MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the <b>focus mask</b>.\nShortcut: <b>Shift-f</b>\n\nMore accurate on images with shallow depth of field, low noise and at higher zoom levels.\nZoom out to 10-30% to improve detection accuracy on noisy images. !MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the <b>focus mask</b>.\nShortcut: <b>Shift-f</b>\n\nMore accurate on images with shallow depth of field, low noise and at higher zoom levels.\nZoom out to 10-30% to improve detection accuracy on noisy images.
!MAIN_TOOLTIP_PREVIEWG;Preview the <b>green channel</b>.\nShortcut: <b>g</b> !MAIN_TOOLTIP_PREVIEWG;Preview the <b>green channel</b>.\nShortcut: <b>g</b>
@ -1568,6 +1577,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh
!TP_DEFRINGE_THRESHOLD;Threshold !TP_DEFRINGE_THRESHOLD;Threshold
!TP_DEHAZE_DEPTH;Depth !TP_DEHAZE_DEPTH;Depth
!TP_DEHAZE_LABEL;Haze Removal !TP_DEHAZE_LABEL;Haze Removal
!TP_DEHAZE_LUMINANCE;Luminance only
!TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map !TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map
!TP_DEHAZE_STRENGTH;Strength !TP_DEHAZE_STRENGTH;Strength
!TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones
@ -1670,9 +1680,8 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh
!TP_EXPOS_WHITEPOINT_LABEL;Raw White Points !TP_EXPOS_WHITEPOINT_LABEL;Raw White Points
!TP_FILMNEGATIVE_BLUE;Blue ratio !TP_FILMNEGATIVE_BLUE;Blue ratio
!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) !TP_FILMNEGATIVE_GREEN;Reference exponent (contrast)
!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked.
!TP_FILMNEGATIVE_LABEL;Film Negative !TP_FILMNEGATIVE_LABEL;Film Negative
!TP_FILMNEGATIVE_PICK;Pick white and black spots !TP_FILMNEGATIVE_PICK;Pick neutral spots
!TP_FILMNEGATIVE_RED;Red ratio !TP_FILMNEGATIVE_RED;Red ratio
!TP_FILMSIMULATION_LABEL;Film Simulation !TP_FILMSIMULATION_LABEL;Film Simulation
!TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now? !TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now?
@ -1686,6 +1695,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh
!TP_FLATFIELD_BT_VERTHORIZ;Vertical + Horizontal !TP_FLATFIELD_BT_VERTHORIZ;Vertical + Horizontal
!TP_FLATFIELD_BT_VERTICAL;Vertical !TP_FLATFIELD_BT_VERTICAL;Vertical
!TP_FLATFIELD_CLIPCONTROL;Clip control !TP_FLATFIELD_CLIPCONTROL;Clip control
!TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, value 0 is used.
!TP_FLATFIELD_LABEL;Flat-Field !TP_FLATFIELD_LABEL;Flat-Field
!TP_GENERAL_11SCALE_TOOLTIP;The effects of this tool are only visible or only accurate at a preview scale of 1:1. !TP_GENERAL_11SCALE_TOOLTIP;The effects of this tool are only visible or only accurate at a preview scale of 1:1.
!TP_GRADIENT_CENTER_X_TOOLTIP;Shift gradient to the left (negative values) or right (positive values). !TP_GRADIENT_CENTER_X_TOOLTIP;Shift gradient to the left (negative values) or right (positive values).
@ -1808,6 +1818,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh
!TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Roundness:\n0 = rectangle,\n50 = fitted ellipse,\n100 = circle. !TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Roundness:\n0 = rectangle,\n50 = fitted ellipse,\n100 = circle.
!TP_PCVIGNETTE_STRENGTH;Strength !TP_PCVIGNETTE_STRENGTH;Strength
!TP_PCVIGNETTE_STRENGTH_TOOLTIP;Filter strength in stops (reached in corners). !TP_PCVIGNETTE_STRENGTH_TOOLTIP;Filter strength in stops (reached in corners).
!TP_PDSHARPENING_LABEL;Capture Sharpening
!TP_PERSPECTIVE_HORIZONTAL;Horizontal !TP_PERSPECTIVE_HORIZONTAL;Horizontal
!TP_PERSPECTIVE_LABEL;Perspective !TP_PERSPECTIVE_LABEL;Perspective
!TP_PERSPECTIVE_VERTICAL;Vertical !TP_PERSPECTIVE_VERTICAL;Vertical
@ -2033,10 +2044,12 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh
!TP_SHARPENING_EDTOLERANCE;Edge tolerance !TP_SHARPENING_EDTOLERANCE;Edge tolerance
!TP_SHARPENING_HALOCONTROL;Halo control !TP_SHARPENING_HALOCONTROL;Halo control
!TP_SHARPENING_HCAMOUNT;Amount !TP_SHARPENING_HCAMOUNT;Amount
!TP_SHARPENING_ITERCHECK;Auto limit iterations
!TP_SHARPENING_LABEL;Sharpening !TP_SHARPENING_LABEL;Sharpening
!TP_SHARPENING_METHOD;Method !TP_SHARPENING_METHOD;Method
!TP_SHARPENING_ONLYEDGES;Sharpen only edges !TP_SHARPENING_ONLYEDGES;Sharpen only edges
!TP_SHARPENING_RADIUS;Radius !TP_SHARPENING_RADIUS;Radius
!TP_SHARPENING_RADIUS_BOOST;Corner radius boost
!TP_SHARPENING_RLD;RL Deconvolution !TP_SHARPENING_RLD;RL Deconvolution
!TP_SHARPENING_RLD_AMOUNT;Amount !TP_SHARPENING_RLD_AMOUNT;Amount
!TP_SHARPENING_RLD_DAMPING;Damping !TP_SHARPENING_RLD_DAMPING;Damping

View File

@ -727,6 +727,7 @@
!HISTORY_MSG_491;White Balance !HISTORY_MSG_491;White Balance
!HISTORY_MSG_492;RGB Curves !HISTORY_MSG_492;RGB Curves
!HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_MSG_493;L*a*b* Adjustments
!HISTORY_MSG_494;Capture Sharpening
!HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors
!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction
!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction !HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction
@ -744,6 +745,7 @@
!HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope !HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope
!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth !HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth
!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal !HISTORY_MSG_DEHAZE_ENABLED;Haze Removal
!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only
!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map !HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map
!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength !HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength
!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold !HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold
@ -764,6 +766,13 @@
!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius
!HISTORY_MSG_METADATA_MODE;Metadata copy mode !HISTORY_MSG_METADATA_MODE;Metadata copy mode
!HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold !HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold
!HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold
!HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius
!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations
!HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold
!HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations
!HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius
!HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost
!HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion !HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion
!HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction !HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction
!HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter
@ -929,8 +938,8 @@
!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: <b>middle grey</b>\nShortcut: <b>9</b> !MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: <b>middle grey</b>\nShortcut: <b>9</b>
!MAIN_TOOLTIP_BEFOREAFTERLOCK;<b>Lock</b> / <b>Unlock</b> the <b>Before</b> view\n\n<b>Lock</b>: keep the <b>Before</b> view unchanged.\nUseful to evaluate the cumulative effect of multiple tools.\nAdditionally, comparisons can be made to any state in the History.\n\n<b>Unlock</b>: the <b>Before</b> view will follow the <b>After</b> view one step behind, showing the image before the effect of the currently used tool. !MAIN_TOOLTIP_BEFOREAFTERLOCK;<b>Lock</b> / <b>Unlock</b> the <b>Before</b> view\n\n<b>Lock</b>: keep the <b>Before</b> view unchanged.\nUseful to evaluate the cumulative effect of multiple tools.\nAdditionally, comparisons can be made to any state in the History.\n\n<b>Unlock</b>: the <b>Before</b> view will follow the <b>After</b> view one step behind, showing the image before the effect of the currently used tool.
!MAIN_TOOLTIP_HIDEHP;Show/Hide the left panel (including the history).\nShortcut: <b>l</b> !MAIN_TOOLTIP_HIDEHP;Show/Hide the left panel (including the history).\nShortcut: <b>l</b>
!MAIN_TOOLTIP_INDCLIPPEDH;Clipped highlight indication.\nShortcut: <b>&lt;</b> !MAIN_TOOLTIP_INDCLIPPEDH;Clipped highlight indication.\nShortcut: <b>&gt;</b>
!MAIN_TOOLTIP_INDCLIPPEDS;Clipped shadow indication.\nShortcut: <b>&gt;</b> !MAIN_TOOLTIP_INDCLIPPEDS;Clipped shadow indication.\nShortcut: <b>&lt;</b>
!MAIN_TOOLTIP_PREVIEWB;Preview the <b>blue channel</b>.\nShortcut: <b>b</b> !MAIN_TOOLTIP_PREVIEWB;Preview the <b>blue channel</b>.\nShortcut: <b>b</b>
!MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the <b>focus mask</b>.\nShortcut: <b>Shift-f</b>\n\nMore accurate on images with shallow depth of field, low noise and at higher zoom levels.\nZoom out to 10-30% to improve detection accuracy on noisy images. !MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the <b>focus mask</b>.\nShortcut: <b>Shift-f</b>\n\nMore accurate on images with shallow depth of field, low noise and at higher zoom levels.\nZoom out to 10-30% to improve detection accuracy on noisy images.
!MAIN_TOOLTIP_PREVIEWG;Preview the <b>green channel</b>.\nShortcut: <b>g</b> !MAIN_TOOLTIP_PREVIEWG;Preview the <b>green channel</b>.\nShortcut: <b>g</b>
@ -1531,6 +1540,7 @@
!TP_DEFRINGE_THRESHOLD;Threshold !TP_DEFRINGE_THRESHOLD;Threshold
!TP_DEHAZE_DEPTH;Depth !TP_DEHAZE_DEPTH;Depth
!TP_DEHAZE_LABEL;Haze Removal !TP_DEHAZE_LABEL;Haze Removal
!TP_DEHAZE_LUMINANCE;Luminance only
!TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map !TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map
!TP_DEHAZE_STRENGTH;Strength !TP_DEHAZE_STRENGTH;Strength
!TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones
@ -1641,9 +1651,9 @@
!TP_EXPOS_WHITEPOINT_LABEL;Raw White Points !TP_EXPOS_WHITEPOINT_LABEL;Raw White Points
!TP_FILMNEGATIVE_BLUE;Blue ratio !TP_FILMNEGATIVE_BLUE;Blue ratio
!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) !TP_FILMNEGATIVE_GREEN;Reference exponent (contrast)
!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked. !TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards.
!TP_FILMNEGATIVE_LABEL;Film Negative !TP_FILMNEGATIVE_LABEL;Film Negative
!TP_FILMNEGATIVE_PICK;Pick white and black spots !TP_FILMNEGATIVE_PICK;Pick neutral spots
!TP_FILMNEGATIVE_RED;Red ratio !TP_FILMNEGATIVE_RED;Red ratio
!TP_FILMSIMULATION_LABEL;Film Simulation !TP_FILMSIMULATION_LABEL;Film Simulation
!TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now? !TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now?
@ -1657,7 +1667,7 @@
!TP_FLATFIELD_BT_VERTHORIZ;Vertical + Horizontal !TP_FLATFIELD_BT_VERTHORIZ;Vertical + Horizontal
!TP_FLATFIELD_BT_VERTICAL;Vertical !TP_FLATFIELD_BT_VERTICAL;Vertical
!TP_FLATFIELD_CLIPCONTROL;Clip control !TP_FLATFIELD_CLIPCONTROL;Clip control
!TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, clip control can lead to color cast. !TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, value 0 is used.
!TP_FLATFIELD_LABEL;Flat-Field !TP_FLATFIELD_LABEL;Flat-Field
!TP_GENERAL_11SCALE_TOOLTIP;The effects of this tool are only visible or only accurate at a preview scale of 1:1. !TP_GENERAL_11SCALE_TOOLTIP;The effects of this tool are only visible or only accurate at a preview scale of 1:1.
!TP_GRADIENT_CENTER;Center !TP_GRADIENT_CENTER;Center
@ -1793,6 +1803,7 @@
!TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Roundness:\n0 = rectangle,\n50 = fitted ellipse,\n100 = circle. !TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Roundness:\n0 = rectangle,\n50 = fitted ellipse,\n100 = circle.
!TP_PCVIGNETTE_STRENGTH;Strength !TP_PCVIGNETTE_STRENGTH;Strength
!TP_PCVIGNETTE_STRENGTH_TOOLTIP;Filter strength in stops (reached in corners). !TP_PCVIGNETTE_STRENGTH_TOOLTIP;Filter strength in stops (reached in corners).
!TP_PDSHARPENING_LABEL;Capture Sharpening
!TP_PERSPECTIVE_HORIZONTAL;Horizontal !TP_PERSPECTIVE_HORIZONTAL;Horizontal
!TP_PERSPECTIVE_LABEL;Perspective !TP_PERSPECTIVE_LABEL;Perspective
!TP_PERSPECTIVE_VERTICAL;Vertical !TP_PERSPECTIVE_VERTICAL;Vertical
@ -2023,10 +2034,12 @@
!TP_SHARPENING_EDTOLERANCE;Edge tolerance !TP_SHARPENING_EDTOLERANCE;Edge tolerance
!TP_SHARPENING_HALOCONTROL;Halo control !TP_SHARPENING_HALOCONTROL;Halo control
!TP_SHARPENING_HCAMOUNT;Amount !TP_SHARPENING_HCAMOUNT;Amount
!TP_SHARPENING_ITERCHECK;Auto limit iterations
!TP_SHARPENING_LABEL;Sharpening !TP_SHARPENING_LABEL;Sharpening
!TP_SHARPENING_METHOD;Method !TP_SHARPENING_METHOD;Method
!TP_SHARPENING_ONLYEDGES;Sharpen only edges !TP_SHARPENING_ONLYEDGES;Sharpen only edges
!TP_SHARPENING_RADIUS;Radius !TP_SHARPENING_RADIUS;Radius
!TP_SHARPENING_RADIUS_BOOST;Corner radius boost
!TP_SHARPENING_RLD;RL Deconvolution !TP_SHARPENING_RLD;RL Deconvolution
!TP_SHARPENING_RLD_AMOUNT;Amount !TP_SHARPENING_RLD_AMOUNT;Amount
!TP_SHARPENING_RLD_DAMPING;Damping !TP_SHARPENING_RLD_DAMPING;Damping

View File

@ -979,8 +979,8 @@ MAIN_TOOLTIP_BACKCOLOR2;Color de fondo de la previsualización: <b>Blanco</b>\nT
MAIN_TOOLTIP_BACKCOLOR3;Color de fondo de la vista previa: <b> Medio gris </b> \nMétodo rápido: <b> 9 </b> MAIN_TOOLTIP_BACKCOLOR3;Color de fondo de la vista previa: <b> Medio gris </b> \nMétodo rápido: <b> 9 </b>
MAIN_TOOLTIP_BEFOREAFTERLOCK;<b>Bloquear</b> / <b>Desbloquear</b> la vista <b>Antes</b>\n\n<b>Bloquear</b>: la vista <b>Antes</b> permanece inalterada - \nútil para evaluar el efecto acumulativo de varias herramientas.\nAdemás, se puede hacer una comparación con cualquier estado en el Historial\n\n<b>Desbloquear</b>: la vista <b>Antes</b> seguirá a la vista <b>Después</b> un paso por detrás, mostrando la imagen antes del efecto de la herramienta que se está usando MAIN_TOOLTIP_BEFOREAFTERLOCK;<b>Bloquear</b> / <b>Desbloquear</b> la vista <b>Antes</b>\n\n<b>Bloquear</b>: la vista <b>Antes</b> permanece inalterada - \nútil para evaluar el efecto acumulativo de varias herramientas.\nAdemás, se puede hacer una comparación con cualquier estado en el Historial\n\n<b>Desbloquear</b>: la vista <b>Antes</b> seguirá a la vista <b>Después</b> un paso por detrás, mostrando la imagen antes del efecto de la herramienta que se está usando
MAIN_TOOLTIP_HIDEHP;Mostrar/Ocultar panel izquierdo (incluyendo historial).\nTecla de Atajo: <b>i</b> MAIN_TOOLTIP_HIDEHP;Mostrar/Ocultar panel izquierdo (incluyendo historial).\nTecla de Atajo: <b>i</b>
MAIN_TOOLTIP_INDCLIPPEDH;Indicación de luces altas recortadas.\nTecla de Atajo: <b>&lt;</b> MAIN_TOOLTIP_INDCLIPPEDH;Indicación de luces altas recortadas.\nTecla de Atajo: <b>&gt;</b>
MAIN_TOOLTIP_INDCLIPPEDS;Indicación de sombras recortadas.\nTecla de Atajo: <b>&gt;</b> MAIN_TOOLTIP_INDCLIPPEDS;Indicación de sombras recortadas.\nTecla de Atajo: <b>&lt;</b>
MAIN_TOOLTIP_PREVIEWB;Previsualización <b>Canal azul</b>.\nTecla de Atajo: <b>b</b> MAIN_TOOLTIP_PREVIEWB;Previsualización <b>Canal azul</b>.\nTecla de Atajo: <b>b</b>
MAIN_TOOLTIP_PREVIEWFOCUSMASK;Previsualización <b>Máscara de Foco</b>.\nTecla de Atajo: <b>Shift-F</b>\n\nMás preciso en imágenes con poca profundidad de campo, bajo ruido y a mayores niveles de aumento\n\nPara mejorar la precisión en imágenes con ruido evalúe usando menor aumento (10%-30%)\n\nLa vista previa es realizada más lentamente cuando la Máscara de Foco esta activa. MAIN_TOOLTIP_PREVIEWFOCUSMASK;Previsualización <b>Máscara de Foco</b>.\nTecla de Atajo: <b>Shift-F</b>\n\nMás preciso en imágenes con poca profundidad de campo, bajo ruido y a mayores niveles de aumento\n\nPara mejorar la precisión en imágenes con ruido evalúe usando menor aumento (10%-30%)\n\nLa vista previa es realizada más lentamente cuando la Máscara de Foco esta activa.
MAIN_TOOLTIP_PREVIEWG;Previsualización <b>Canal verde</b>.\nTecla de Atajo: <b>g</b> MAIN_TOOLTIP_PREVIEWG;Previsualización <b>Canal verde</b>.\nTecla de Atajo: <b>g</b>
@ -2321,8 +2321,17 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: <b>-</b>
!FILEBROWSER_POPUPREMOVE;Delete permanently !FILEBROWSER_POPUPREMOVE;Delete permanently
!FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version !FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version
!FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. !FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash.
!HISTORY_MSG_494;Capture Sharpening
!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only
!HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative !HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative
!HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values !HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values
!HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold
!HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius
!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations
!HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold
!HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations
!HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius
!HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost
!HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius !HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius
!MAIN_FRAME_PLACES_DEL;Remove !MAIN_FRAME_PLACES_DEL;Remove
!MAIN_TAB_FAVORITES;Favorites !MAIN_TAB_FAVORITES;Favorites
@ -2345,18 +2354,22 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: <b>-</b>
!PROGRESSBAR_RAWCACORR;Raw CA correction... !PROGRESSBAR_RAWCACORR;Raw CA correction...
!QUEUE_LOCATION_TITLE;Output Location !QUEUE_LOCATION_TITLE;Output Location
!TP_CROP_PPI;PPI !TP_CROP_PPI;PPI
!TP_DEHAZE_LUMINANCE;Luminance only
!TP_FILMNEGATIVE_BLUE;Blue ratio !TP_FILMNEGATIVE_BLUE;Blue ratio
!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) !TP_FILMNEGATIVE_GREEN;Reference exponent (contrast)
!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked. !TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards.
!TP_FILMNEGATIVE_LABEL;Film Negative !TP_FILMNEGATIVE_LABEL;Film Negative
!TP_FILMNEGATIVE_PICK;Pick white and black spots !TP_FILMNEGATIVE_PICK;Pick neutral spots
!TP_FILMNEGATIVE_RED;Red ratio !TP_FILMNEGATIVE_RED;Red ratio
!TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically selected !TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically selected
!TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected !TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected
!TP_LENSPROFILE_MODE_HEADER;Lens Profile !TP_LENSPROFILE_MODE_HEADER;Lens Profile
!TP_LENSPROFILE_USE_GEOMETRIC;Geometric distortion !TP_LENSPROFILE_USE_GEOMETRIC;Geometric distortion
!TP_LENSPROFILE_USE_HEADER;Correct !TP_LENSPROFILE_USE_HEADER;Correct
!TP_PDSHARPENING_LABEL;Capture Sharpening
!TP_RAW_IMAGENUM_SN;SN mode !TP_RAW_IMAGENUM_SN;SN mode
!TP_RAW_XTRANS;X-Trans !TP_RAW_XTRANS;X-Trans
!TP_RAW_XTRANSFAST;Fast X-Trans !TP_RAW_XTRANSFAST;Fast X-Trans
!TP_SHARPENING_BLUR;Blur radius !TP_SHARPENING_BLUR;Blur radius
!TP_SHARPENING_ITERCHECK;Auto limit iterations
!TP_SHARPENING_RADIUS_BOOST;Corner radius boost

View File

@ -918,8 +918,8 @@ MAIN_TOOLTIP_BACKCOLOR2;Couleur de fond de l'aperçu: <b>Blanc</b>\nRaccourci: <
MAIN_TOOLTIP_BACKCOLOR3;Couleur de fond de l'aperçu: <b>Gris moyen</b>\nRaccourci : <b>9</b> MAIN_TOOLTIP_BACKCOLOR3;Couleur de fond de l'aperçu: <b>Gris moyen</b>\nRaccourci : <b>9</b>
MAIN_TOOLTIP_BEFOREAFTERLOCK;<b>Vérouille</b> / <b>déverouille</b> la vue <b>Avant</b>\n\n<b>Vérouille</b>: garde la vue <b>Avant</b> inchangée - \nutile pour évaluer l'effet cumulatif de plusieurs outils.\nDe plus, une comparaison peut être faite à partir de n'importe quelle étape de l'historique\n\n<b>Déverouille</b>: la vue <b>Avant</b> représentera l'étape précédant la vue <b>Après</b>, montrant l'effet qui vient d'être modifié MAIN_TOOLTIP_BEFOREAFTERLOCK;<b>Vérouille</b> / <b>déverouille</b> la vue <b>Avant</b>\n\n<b>Vérouille</b>: garde la vue <b>Avant</b> inchangée - \nutile pour évaluer l'effet cumulatif de plusieurs outils.\nDe plus, une comparaison peut être faite à partir de n'importe quelle étape de l'historique\n\n<b>Déverouille</b>: la vue <b>Avant</b> représentera l'étape précédant la vue <b>Après</b>, montrant l'effet qui vient d'être modifié
MAIN_TOOLTIP_HIDEHP;Montrer/cacher le panneau gauche (incluant l'historique)\nRaccourci: <b>l</b> MAIN_TOOLTIP_HIDEHP;Montrer/cacher le panneau gauche (incluant l'historique)\nRaccourci: <b>l</b>
MAIN_TOOLTIP_INDCLIPPEDH;Indication hautes lumières hors domaine\nRaccourci: <b>&lt;</b> MAIN_TOOLTIP_INDCLIPPEDH;Indication hautes lumières hors domaine\nRaccourci: <b>&gt;</b>
MAIN_TOOLTIP_INDCLIPPEDS;Indication ombres hors domaine\nRaccourci: <b>&gt;</b> MAIN_TOOLTIP_INDCLIPPEDS;Indication ombres hors domaine\nRaccourci: <b>&lt;</b>
MAIN_TOOLTIP_PREVIEWB;Affichage du <b>canal Bleu</b>\nRaccourci: <b>b</b> MAIN_TOOLTIP_PREVIEWB;Affichage du <b>canal Bleu</b>\nRaccourci: <b>b</b>
MAIN_TOOLTIP_PREVIEWFOCUSMASK;Affichage du <b>Masque du focus</b>\nRaccourci: <b>Shift-f</b>\n\nPlus précis sur les images avec une faible profondeur de champ, à faible bruit et à des niveaux de zoom élevé\n\nPour améliorer la précision de détection des images bruitées, évaluez les à un facteur de zoom de 10-30%\n\nLa prévisualisation met plus de temps à se calculer lorsque cet outil est actif. MAIN_TOOLTIP_PREVIEWFOCUSMASK;Affichage du <b>Masque du focus</b>\nRaccourci: <b>Shift-f</b>\n\nPlus précis sur les images avec une faible profondeur de champ, à faible bruit et à des niveaux de zoom élevé\n\nPour améliorer la précision de détection des images bruitées, évaluez les à un facteur de zoom de 10-30%\n\nLa prévisualisation met plus de temps à se calculer lorsque cet outil est actif.
MAIN_TOOLTIP_PREVIEWG;Affichage du <b>canal Vert</b>\nRaccourci: <b>g</b> MAIN_TOOLTIP_PREVIEWG;Affichage du <b>canal Vert</b>\nRaccourci: <b>g</b>
@ -2272,8 +2272,17 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: <b>-</b>
!FILEBROWSER_POPUPREMOVE;Delete permanently !FILEBROWSER_POPUPREMOVE;Delete permanently
!FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version !FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version
!FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. !FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash.
!HISTORY_MSG_494;Capture Sharpening
!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only
!HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative !HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative
!HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values !HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values
!HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold
!HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius
!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations
!HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold
!HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations
!HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius
!HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost
!MAIN_FRAME_PLACES_DEL;Remove !MAIN_FRAME_PLACES_DEL;Remove
!PARTIALPASTE_FILMNEGATIVE;Film Negative !PARTIALPASTE_FILMNEGATIVE;Film Negative
!PROGRESSBAR_DECODING;Decoding... !PROGRESSBAR_DECODING;Decoding...
@ -2284,16 +2293,20 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: <b>-</b>
!PROGRESSBAR_RAWCACORR;Raw CA correction... !PROGRESSBAR_RAWCACORR;Raw CA correction...
!QUEUE_LOCATION_TITLE;Output Location !QUEUE_LOCATION_TITLE;Output Location
!TP_CROP_PPI;PPI !TP_CROP_PPI;PPI
!TP_DEHAZE_LUMINANCE;Luminance only
!TP_FILMNEGATIVE_BLUE;Blue ratio !TP_FILMNEGATIVE_BLUE;Blue ratio
!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) !TP_FILMNEGATIVE_GREEN;Reference exponent (contrast)
!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked. !TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards.
!TP_FILMNEGATIVE_LABEL;Film Negative !TP_FILMNEGATIVE_LABEL;Film Negative
!TP_FILMNEGATIVE_PICK;Pick white and black spots !TP_FILMNEGATIVE_PICK;Pick neutral spots
!TP_FILMNEGATIVE_RED;Red ratio !TP_FILMNEGATIVE_RED;Red ratio
!TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically selected !TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically selected
!TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected !TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected
!TP_LENSPROFILE_MODE_HEADER;Lens Profile !TP_LENSPROFILE_MODE_HEADER;Lens Profile
!TP_LENSPROFILE_USE_GEOMETRIC;Geometric distortion !TP_LENSPROFILE_USE_GEOMETRIC;Geometric distortion
!TP_LENSPROFILE_USE_HEADER;Correct !TP_LENSPROFILE_USE_HEADER;Correct
!TP_PDSHARPENING_LABEL;Capture Sharpening
!TP_RAW_XTRANS;X-Trans !TP_RAW_XTRANS;X-Trans
!TP_RAW_XTRANSFAST;Fast X-Trans !TP_RAW_XTRANSFAST;Fast X-Trans
!TP_SHARPENING_ITERCHECK;Auto limit iterations
!TP_SHARPENING_RADIUS_BOOST;Corner radius boost

View File

@ -519,8 +519,8 @@ MAIN_TOOLTIP_BACKCOLOR1;Colore di sfondo dell'anteprima: <b>Nero</b>\nScorciatoi
MAIN_TOOLTIP_BACKCOLOR2;Colore di sfondo dell'anteprima: <b>Bianco</b>\nScorciatoia: <b>9</b> MAIN_TOOLTIP_BACKCOLOR2;Colore di sfondo dell'anteprima: <b>Bianco</b>\nScorciatoia: <b>9</b>
MAIN_TOOLTIP_BEFOREAFTERLOCK;<b>Blocca</b>/<b>Sblocca</b> la vista <b>Prima</b>\n\n<b>Blocca</b>: Conserva la vista <b>Prima</b>.\nUtile per valutare l'effetto cumulativo di diversi strumenti.\nIn più, possono essere confrontati diversi passi della cronologia.\n\n<b>Sblocca</b>: la vista <b>Prima</b> segue di un passo la vista <b>Dopo</b>, mostrando l'immagine prima dell'effetto dello strumento corrente. MAIN_TOOLTIP_BEFOREAFTERLOCK;<b>Blocca</b>/<b>Sblocca</b> la vista <b>Prima</b>\n\n<b>Blocca</b>: Conserva la vista <b>Prima</b>.\nUtile per valutare l'effetto cumulativo di diversi strumenti.\nIn più, possono essere confrontati diversi passi della cronologia.\n\n<b>Sblocca</b>: la vista <b>Prima</b> segue di un passo la vista <b>Dopo</b>, mostrando l'immagine prima dell'effetto dello strumento corrente.
MAIN_TOOLTIP_HIDEHP;Mostra/Nascondi il pannello sinistro (inclusa la cronologia)\nScorciatoia: <b>l</b> MAIN_TOOLTIP_HIDEHP;Mostra/Nascondi il pannello sinistro (inclusa la cronologia)\nScorciatoia: <b>l</b>
MAIN_TOOLTIP_INDCLIPPEDH;Indicazione delle alteluci tosate.\nScorciatoia: <b>&lt;</b> MAIN_TOOLTIP_INDCLIPPEDH;Indicazione delle alteluci tosate.\nScorciatoia: <b>&gt;</b>
MAIN_TOOLTIP_INDCLIPPEDS;Indicazione delle ombre tosate.\nScorciatoia: <b>&gt;</b> MAIN_TOOLTIP_INDCLIPPEDS;Indicazione delle ombre tosate.\nScorciatoia: <b>&lt;</b>
MAIN_TOOLTIP_PREVIEWB;Anteprima del <b>Canale Blu</b>.\nScorciatoia: <b>b</b> MAIN_TOOLTIP_PREVIEWB;Anteprima del <b>Canale Blu</b>.\nScorciatoia: <b>b</b>
MAIN_TOOLTIP_PREVIEWFOCUSMASK;Anteprima della <b>Focus Mask</b>.\nScorciatoia: <b>Maiuscolo-F</b>\n\nPiù accurato su immagini con bassa profondità di campo, poco rumore e ad elevati livelli di zoom.\n\nPer aumentare l'accuratezza della rilevazione su immagini con molto rumore, riduci le dimensioni del 10-30%. MAIN_TOOLTIP_PREVIEWFOCUSMASK;Anteprima della <b>Focus Mask</b>.\nScorciatoia: <b>Maiuscolo-F</b>\n\nPiù accurato su immagini con bassa profondità di campo, poco rumore e ad elevati livelli di zoom.\n\nPer aumentare l'accuratezza della rilevazione su immagini con molto rumore, riduci le dimensioni del 10-30%.
MAIN_TOOLTIP_PREVIEWG;Anteprima del <b>Canale Verde</b>.\nScorciatoia: <b>g</b> MAIN_TOOLTIP_PREVIEWG;Anteprima del <b>Canale Verde</b>.\nScorciatoia: <b>g</b>
@ -1518,6 +1518,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: <b>-</b>
!HISTORY_MSG_491;White Balance !HISTORY_MSG_491;White Balance
!HISTORY_MSG_492;RGB Curves !HISTORY_MSG_492;RGB Curves
!HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_MSG_493;L*a*b* Adjustments
!HISTORY_MSG_494;Capture Sharpening
!HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors
!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction
!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction !HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction
@ -1535,6 +1536,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: <b>-</b>
!HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope !HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope
!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth !HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth
!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal !HISTORY_MSG_DEHAZE_ENABLED;Haze Removal
!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only
!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map !HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map
!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength !HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength
!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold !HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold
@ -1555,6 +1557,13 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: <b>-</b>
!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius
!HISTORY_MSG_METADATA_MODE;Metadata copy mode !HISTORY_MSG_METADATA_MODE;Metadata copy mode
!HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold !HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold
!HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold
!HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius
!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations
!HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold
!HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations
!HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius
!HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost
!HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion !HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion
!HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction !HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction
!HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter
@ -1852,6 +1861,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: <b>-</b>
!TP_CROP_SELECTCROP;Select !TP_CROP_SELECTCROP;Select
!TP_DEHAZE_DEPTH;Depth !TP_DEHAZE_DEPTH;Depth
!TP_DEHAZE_LABEL;Haze Removal !TP_DEHAZE_LABEL;Haze Removal
!TP_DEHAZE_LUMINANCE;Luminance only
!TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map !TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map
!TP_DEHAZE_STRENGTH;Strength !TP_DEHAZE_STRENGTH;Strength
!TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones
@ -1908,16 +1918,16 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: <b>-</b>
!TP_EXPOS_WHITEPOINT_LABEL;Raw White Points !TP_EXPOS_WHITEPOINT_LABEL;Raw White Points
!TP_FILMNEGATIVE_BLUE;Blue ratio !TP_FILMNEGATIVE_BLUE;Blue ratio
!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) !TP_FILMNEGATIVE_GREEN;Reference exponent (contrast)
!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked. !TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards.
!TP_FILMNEGATIVE_LABEL;Film Negative !TP_FILMNEGATIVE_LABEL;Film Negative
!TP_FILMNEGATIVE_PICK;Pick white and black spots !TP_FILMNEGATIVE_PICK;Pick neutral spots
!TP_FILMNEGATIVE_RED;Red ratio !TP_FILMNEGATIVE_RED;Red ratio
!TP_FILMSIMULATION_LABEL;Film Simulation !TP_FILMSIMULATION_LABEL;Film Simulation
!TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now? !TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now?
!TP_FILMSIMULATION_STRENGTH;Strength !TP_FILMSIMULATION_STRENGTH;Strength
!TP_FILMSIMULATION_ZEROCLUTSFOUND;Set HaldCLUT directory in Preferences !TP_FILMSIMULATION_ZEROCLUTSFOUND;Set HaldCLUT directory in Preferences
!TP_FLATFIELD_CLIPCONTROL;Clip control !TP_FLATFIELD_CLIPCONTROL;Clip control
!TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, clip control can lead to color cast. !TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, value 0 is used.
!TP_ICM_APPLYBASELINEEXPOSUREOFFSET;Baseline exposure !TP_ICM_APPLYBASELINEEXPOSUREOFFSET;Baseline exposure
!TP_ICM_APPLYBASELINEEXPOSUREOFFSET_TOOLTIP;Employ the embedded DCP baseline exposure offset. The setting is only available if the selected DCP has one. !TP_ICM_APPLYBASELINEEXPOSUREOFFSET_TOOLTIP;Employ the embedded DCP baseline exposure offset. The setting is only available if the selected DCP has one.
!TP_ICM_APPLYHUESATMAP;Base table !TP_ICM_APPLYHUESATMAP;Base table
@ -1954,6 +1964,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: <b>-</b>
!TP_METADATA_STRIP;Strip all metadata !TP_METADATA_STRIP;Strip all metadata
!TP_METADATA_TUNNEL;Copy unchanged !TP_METADATA_TUNNEL;Copy unchanged
!TP_NEUTRAL;Reset !TP_NEUTRAL;Reset
!TP_PDSHARPENING_LABEL;Capture Sharpening
!TP_PREPROCESS_DEADPIXFILT;Dead pixel filter !TP_PREPROCESS_DEADPIXFILT;Dead pixel filter
!TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Tries to suppress dead pixels. !TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Tries to suppress dead pixels.
!TP_PREPROCESS_HOTPIXFILT;Hot pixel filter !TP_PREPROCESS_HOTPIXFILT;Hot pixel filter
@ -2119,6 +2130,8 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: <b>-</b>
!TP_RETINEX_VIEW_UNSHARP;Unsharp mask !TP_RETINEX_VIEW_UNSHARP;Unsharp mask
!TP_SHARPENING_BLUR;Blur radius !TP_SHARPENING_BLUR;Blur radius
!TP_SHARPENING_CONTRAST;Contrast threshold !TP_SHARPENING_CONTRAST;Contrast threshold
!TP_SHARPENING_ITERCHECK;Auto limit iterations
!TP_SHARPENING_RADIUS_BOOST;Corner radius boost
!TP_SHARPENMICRO_CONTRAST;Contrast threshold !TP_SHARPENMICRO_CONTRAST;Contrast threshold
!TP_SOFTLIGHT_LABEL;Soft Light !TP_SOFTLIGHT_LABEL;Soft Light
!TP_SOFTLIGHT_STRENGTH;Strength !TP_SOFTLIGHT_STRENGTH;Strength

View File

@ -960,8 +960,8 @@ MAIN_TOOLTIP_BACKCOLOR2;プレビューの背景色を指定します: <b>白</b
MAIN_TOOLTIP_BACKCOLOR3;プレビューの背景色を指定します: <b>中間のグレー</b>\nショートカット: <b>9</b> MAIN_TOOLTIP_BACKCOLOR3;プレビューの背景色を指定します: <b>中間のグレー</b>\nショートカット: <b>9</b>
MAIN_TOOLTIP_BEFOREAFTERLOCK;<b>固定</b> / <b>固定解除</b> - <b>補正前</b> の表示設定\n\n<b>固定</b>: <b>補正前</b>をそのまま表示し変更されません\n複数のツールの累積効果を評価するのに役立ちます\nさらに、比較は履歴上のどこからでも行うことができます\n\n<b>固定解除</b>: 現在使用のツールの効果が <b>補正後</b> に表示され、その1段階前が <b>補正前</b> に表示されます MAIN_TOOLTIP_BEFOREAFTERLOCK;<b>固定</b> / <b>固定解除</b> - <b>補正前</b> の表示設定\n\n<b>固定</b>: <b>補正前</b>をそのまま表示し変更されません\n複数のツールの累積効果を評価するのに役立ちます\nさらに、比較は履歴上のどこからでも行うことができます\n\n<b>固定解除</b>: 現在使用のツールの効果が <b>補正後</b> に表示され、その1段階前が <b>補正前</b> に表示されます
MAIN_TOOLTIP_HIDEHP;左パネル 表示/非表示 (履歴含む)\nショートカット: <b>l</b> MAIN_TOOLTIP_HIDEHP;左パネル 表示/非表示 (履歴含む)\nショートカット: <b>l</b>
MAIN_TOOLTIP_INDCLIPPEDH;ハイライト・クリッピング領域の表示\nショートカット: <b>&lt;</b> MAIN_TOOLTIP_INDCLIPPEDH;ハイライト・クリッピング領域の表示\nショートカット: <b>&gt;</b>
MAIN_TOOLTIP_INDCLIPPEDS;シャドウ・クリッピング領域の表示\nショートカット: <b>&gt;</b> MAIN_TOOLTIP_INDCLIPPEDS;シャドウ・クリッピング領域の表示\nショートカット: <b>&lt;</b>
MAIN_TOOLTIP_PREVIEWB;<b>ブルー チャンネル</b>表示\nショートカット: <b>b</b> MAIN_TOOLTIP_PREVIEWB;<b>ブルー チャンネル</b>表示\nショートカット: <b>b</b>
MAIN_TOOLTIP_PREVIEWFOCUSMASK;<b>フォーカス・マスク</b>表示\nショートカット: <b>Shift-f</b>\n\n浅い被写界深度、低イズ、高ズームの画像の場合は、より正確に\n\nイズの多い画像に対しては、検出精度を向上させるため10から30%縮小して評価します\n\nフォーカス・マスクをオンにすると表示に時間が掛かります MAIN_TOOLTIP_PREVIEWFOCUSMASK;<b>フォーカス・マスク</b>表示\nショートカット: <b>Shift-f</b>\n\n浅い被写界深度、低イズ、高ズームの画像の場合は、より正確に\n\nイズの多い画像に対しては、検出精度を向上させるため10から30%縮小して評価します\n\nフォーカス・マスクをオンにすると表示に時間が掛かります
MAIN_TOOLTIP_PREVIEWG;<b>グリーン チャンネル</b>表示\nショートカット: <b>g</b> MAIN_TOOLTIP_PREVIEWG;<b>グリーン チャンネル</b>表示\nショートカット: <b>g</b>
@ -1672,9 +1672,9 @@ TP_EXPOS_BLACKPOINT_LABEL;raw ブラック・ポイント
TP_EXPOS_WHITEPOINT_LABEL;raw ホワイト・ポイント TP_EXPOS_WHITEPOINT_LABEL;raw ホワイト・ポイント
TP_FILMNEGATIVE_BLUE;ブルーの比率 TP_FILMNEGATIVE_BLUE;ブルーの比率
TP_FILMNEGATIVE_GREEN;参考指数(コントラスト) TP_FILMNEGATIVE_GREEN;参考指数(コントラスト)
TP_FILMNEGATIVE_GUESS_TOOLTIP;画像の中でニュートラルな参考ポイントを2点選んで指数を計算します;白い(明るいグレー)1点と黒い(暗いグレー)1点を選びます。順番は関係ありません。2つ目のポイントが選択されると指数が更新されます。 TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards.
TP_FILMNEGATIVE_LABEL;ネガフィルム TP_FILMNEGATIVE_LABEL;ネガフィルム
TP_FILMNEGATIVE_PICK;白と黒のポイントをピックアップする TP_FILMNEGATIVE_PICK;Pick neutral spots
TP_FILMNEGATIVE_RED;レッドの比率 TP_FILMNEGATIVE_RED;レッドの比率
TP_FILMSIMULATION_LABEL;フィルムシミュレーション TP_FILMSIMULATION_LABEL;フィルムシミュレーション
TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapeeはフィルムシミュレーション機能に使う画像をHald CLUTフォルダーの中から探すよう設計されていますプログラムに組み込むにはフォルダーが大き過ぎるため。\n変更するには、環境設定 > 画像処理 > フィルムシミュレーションと進み\nどのフォルダーが使われているか確認します。機能を利用する場合は、Hald CLUTだけが入っているフォルダーを指定するか、 この機能を使わない場合はそのフォルダーを空にしておきます。\n\n詳しくはRawPediaを参照して下さい。\n\nフィルム画像のスキャンを止めますか TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapeeはフィルムシミュレーション機能に使う画像をHald CLUTフォルダーの中から探すよう設計されていますプログラムに組み込むにはフォルダーが大き過ぎるため。\n変更するには、環境設定 > 画像処理 > フィルムシミュレーションと進み\nどのフォルダーが使われているか確認します。機能を利用する場合は、Hald CLUTだけが入っているフォルダーを指定するか、 この機能を使わない場合はそのフォルダーを空にしておきます。\n\n詳しくはRawPediaを参照して下さい。\n\nフィルム画像のスキャンを止めますか
@ -2319,3 +2319,20 @@ ZOOMPANEL_ZOOMFITSCREEN;画像全体を画面に合わせる\nショートカッ
ZOOMPANEL_ZOOMIN;ズームイン\nショートカット: <b>+</b> ZOOMPANEL_ZOOMIN;ズームイン\nショートカット: <b>+</b>
ZOOMPANEL_ZOOMOUT;ズームアウト\nショートカット: <b>-</b> ZOOMPANEL_ZOOMOUT;ズームアウト\nショートカット: <b>-</b>
!!!!!!!!!!!!!!!!!!!!!!!!!
! Untranslated keys follow; remove the ! prefix after an entry is translated.
!!!!!!!!!!!!!!!!!!!!!!!!!
!HISTORY_MSG_494;Capture Sharpening
!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only
!HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold
!HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius
!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations
!HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold
!HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations
!HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius
!HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost
!TP_DEHAZE_LUMINANCE;Luminance only
!TP_PDSHARPENING_LABEL;Capture Sharpening
!TP_SHARPENING_ITERCHECK;Auto limit iterations
!TP_SHARPENING_RADIUS_BOOST;Corner radius boost

View File

@ -1227,6 +1227,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés <b>-</b>
!HISTORY_MSG_491;White Balance !HISTORY_MSG_491;White Balance
!HISTORY_MSG_492;RGB Curves !HISTORY_MSG_492;RGB Curves
!HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_MSG_493;L*a*b* Adjustments
!HISTORY_MSG_494;Capture Sharpening
!HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors
!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction
!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction !HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction
@ -1244,6 +1245,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés <b>-</b>
!HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope !HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope
!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth !HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth
!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal !HISTORY_MSG_DEHAZE_ENABLED;Haze Removal
!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only
!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map !HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map
!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength !HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength
!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold !HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold
@ -1264,6 +1266,13 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés <b>-</b>
!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius
!HISTORY_MSG_METADATA_MODE;Metadata copy mode !HISTORY_MSG_METADATA_MODE;Metadata copy mode
!HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold !HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold
!HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold
!HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius
!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations
!HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold
!HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations
!HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius
!HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost
!HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion !HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion
!HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction !HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction
!HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter
@ -1741,6 +1750,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés <b>-</b>
!TP_CROP_SELECTCROP;Select !TP_CROP_SELECTCROP;Select
!TP_DEHAZE_DEPTH;Depth !TP_DEHAZE_DEPTH;Depth
!TP_DEHAZE_LABEL;Haze Removal !TP_DEHAZE_LABEL;Haze Removal
!TP_DEHAZE_LUMINANCE;Luminance only
!TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map !TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map
!TP_DEHAZE_STRENGTH;Strength !TP_DEHAZE_STRENGTH;Strength
!TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones
@ -1821,16 +1831,16 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés <b>-</b>
!TP_EXPOS_WHITEPOINT_LABEL;Raw White Points !TP_EXPOS_WHITEPOINT_LABEL;Raw White Points
!TP_FILMNEGATIVE_BLUE;Blue ratio !TP_FILMNEGATIVE_BLUE;Blue ratio
!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) !TP_FILMNEGATIVE_GREEN;Reference exponent (contrast)
!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked. !TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards.
!TP_FILMNEGATIVE_LABEL;Film Negative !TP_FILMNEGATIVE_LABEL;Film Negative
!TP_FILMNEGATIVE_PICK;Pick white and black spots !TP_FILMNEGATIVE_PICK;Pick neutral spots
!TP_FILMNEGATIVE_RED;Red ratio !TP_FILMNEGATIVE_RED;Red ratio
!TP_FILMSIMULATION_LABEL;Film Simulation !TP_FILMSIMULATION_LABEL;Film Simulation
!TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now? !TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now?
!TP_FILMSIMULATION_STRENGTH;Strength !TP_FILMSIMULATION_STRENGTH;Strength
!TP_FILMSIMULATION_ZEROCLUTSFOUND;Set HaldCLUT directory in Preferences !TP_FILMSIMULATION_ZEROCLUTSFOUND;Set HaldCLUT directory in Preferences
!TP_FLATFIELD_CLIPCONTROL;Clip control !TP_FLATFIELD_CLIPCONTROL;Clip control
!TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, clip control can lead to color cast. !TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, value 0 is used.
!TP_GENERAL_11SCALE_TOOLTIP;The effects of this tool are only visible or only accurate at a preview scale of 1:1. !TP_GENERAL_11SCALE_TOOLTIP;The effects of this tool are only visible or only accurate at a preview scale of 1:1.
!TP_GRADIENT_CENTER;Center !TP_GRADIENT_CENTER;Center
!TP_GRADIENT_CENTER_X;Center X !TP_GRADIENT_CENTER_X;Center X
@ -1928,6 +1938,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés <b>-</b>
!TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Roundness:\n0 = rectangle,\n50 = fitted ellipse,\n100 = circle. !TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Roundness:\n0 = rectangle,\n50 = fitted ellipse,\n100 = circle.
!TP_PCVIGNETTE_STRENGTH;Strength !TP_PCVIGNETTE_STRENGTH;Strength
!TP_PCVIGNETTE_STRENGTH_TOOLTIP;Filter strength in stops (reached in corners). !TP_PCVIGNETTE_STRENGTH_TOOLTIP;Filter strength in stops (reached in corners).
!TP_PDSHARPENING_LABEL;Capture Sharpening
!TP_PFCURVE_CURVEEDITOR_CH;Hue !TP_PFCURVE_CURVEEDITOR_CH;Hue
!TP_PFCURVE_CURVEEDITOR_CH_TOOLTIP;Controls defringe strength by color.\nHigher = more,\nLower = less. !TP_PFCURVE_CURVEEDITOR_CH_TOOLTIP;Controls defringe strength by color.\nHigher = more,\nLower = less.
!TP_PREPROCESS_DEADPIXFILT;Dead pixel filter !TP_PREPROCESS_DEADPIXFILT;Dead pixel filter
@ -2103,6 +2114,8 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés <b>-</b>
!TP_SAVEDIALOG_OK_TIP;Shortcut: <b>Ctrl-Enter</b> !TP_SAVEDIALOG_OK_TIP;Shortcut: <b>Ctrl-Enter</b>
!TP_SHARPENING_BLUR;Blur radius !TP_SHARPENING_BLUR;Blur radius
!TP_SHARPENING_CONTRAST;Contrast threshold !TP_SHARPENING_CONTRAST;Contrast threshold
!TP_SHARPENING_ITERCHECK;Auto limit iterations
!TP_SHARPENING_RADIUS_BOOST;Corner radius boost
!TP_SHARPENMICRO_CONTRAST;Contrast threshold !TP_SHARPENMICRO_CONTRAST;Contrast threshold
!TP_SOFTLIGHT_LABEL;Soft Light !TP_SOFTLIGHT_LABEL;Soft Light
!TP_SOFTLIGHT_STRENGTH;Strength !TP_SOFTLIGHT_STRENGTH;Strength

View File

@ -788,8 +788,8 @@ MAIN_TOOLTIP_BACKCOLOR1;Achtergrond kleur van het voorbeeld: <b>Zwart</b>\nSnelt
MAIN_TOOLTIP_BACKCOLOR2;Achtergrond kleur van het voorbeeld: <b>Wit</b>\nSneltoets: <b>0</b> MAIN_TOOLTIP_BACKCOLOR2;Achtergrond kleur van het voorbeeld: <b>Wit</b>\nSneltoets: <b>0</b>
MAIN_TOOLTIP_BEFOREAFTERLOCK;<b>Vergrendel</b> / <b>Ontgrendel</b> de <b>Voor</b>afbeelding.\n\n<b>Vergrendel</b>: hou de <b>Voor</b>afbeelding ongewijzigd.\nDit is handig om het cumulatieve effect van meerdere gereedschappen te beoordelen.\nBovendien kan er worden vergeleken met elke stap in de geschiedenislijst.\n\n<b>Ontgrendel</b>: de <b>Voor</b>afbeelding volgt een stap achter de <b>Na</b>afbeelding en laat de afbeelding zien zonder het effect van het huidige gereedschap. MAIN_TOOLTIP_BEFOREAFTERLOCK;<b>Vergrendel</b> / <b>Ontgrendel</b> de <b>Voor</b>afbeelding.\n\n<b>Vergrendel</b>: hou de <b>Voor</b>afbeelding ongewijzigd.\nDit is handig om het cumulatieve effect van meerdere gereedschappen te beoordelen.\nBovendien kan er worden vergeleken met elke stap in de geschiedenislijst.\n\n<b>Ontgrendel</b>: de <b>Voor</b>afbeelding volgt een stap achter de <b>Na</b>afbeelding en laat de afbeelding zien zonder het effect van het huidige gereedschap.
MAIN_TOOLTIP_HIDEHP;Toon/verberg linkerpaneel (geschiedenis).\nSneltoets: <b>H</b> MAIN_TOOLTIP_HIDEHP;Toon/verberg linkerpaneel (geschiedenis).\nSneltoets: <b>H</b>
MAIN_TOOLTIP_INDCLIPPEDH;Overbelichtingsindicatie.\nSneltoets: <b>&lt;</b> MAIN_TOOLTIP_INDCLIPPEDH;Overbelichtingsindicatie.\nSneltoets: <b>&gt;</b>
MAIN_TOOLTIP_INDCLIPPEDS;Onderbelichtingsindicatie.\nSneltoets: <b>&gt;</b> MAIN_TOOLTIP_INDCLIPPEDS;Onderbelichtingsindicatie.\nSneltoets: <b>&lt;</b>
MAIN_TOOLTIP_PREVIEWB;Bekijk het <b>Blauwe kanaal</b>.\nSneltoets: <b>b</b> MAIN_TOOLTIP_PREVIEWB;Bekijk het <b>Blauwe kanaal</b>.\nSneltoets: <b>b</b>
MAIN_TOOLTIP_PREVIEWFOCUSMASK;Bekijk het <b>Focus Masker</b>.\nSneltoets: <b>Shift-F</b>\n\nAccurater bij afbeeldingen met geringe scherptediepte, weinig ruis en hogere zoomniveaus.\n\nBekijk de afbeelding op lagere zoomniveaus (10-30%) om de accuratesse te vergroten bij afbeeldingen met veel ruis.\n\nHet voorbeeld wordt langzamer aangemaakt als Focus Masker aanstaat. MAIN_TOOLTIP_PREVIEWFOCUSMASK;Bekijk het <b>Focus Masker</b>.\nSneltoets: <b>Shift-F</b>\n\nAccurater bij afbeeldingen met geringe scherptediepte, weinig ruis en hogere zoomniveaus.\n\nBekijk de afbeelding op lagere zoomniveaus (10-30%) om de accuratesse te vergroten bij afbeeldingen met veel ruis.\n\nHet voorbeeld wordt langzamer aangemaakt als Focus Masker aanstaat.
MAIN_TOOLTIP_PREVIEWG;Bekijk het <b>Groene kanaal</b>.\nSneltoets: <b>g</b> MAIN_TOOLTIP_PREVIEWG;Bekijk het <b>Groene kanaal</b>.\nSneltoets: <b>g</b>
@ -2015,6 +2015,7 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: <b>-</b>
!HISTORY_MSG_491;White Balance !HISTORY_MSG_491;White Balance
!HISTORY_MSG_492;RGB Curves !HISTORY_MSG_492;RGB Curves
!HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_MSG_493;L*a*b* Adjustments
!HISTORY_MSG_494;Capture Sharpening
!HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors
!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction
!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction !HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction
@ -2032,6 +2033,7 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: <b>-</b>
!HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope !HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope
!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth !HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth
!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal !HISTORY_MSG_DEHAZE_ENABLED;Haze Removal
!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only
!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map !HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map
!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength !HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength
!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold !HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold
@ -2052,6 +2054,13 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: <b>-</b>
!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius
!HISTORY_MSG_METADATA_MODE;Metadata copy mode !HISTORY_MSG_METADATA_MODE;Metadata copy mode
!HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold !HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold
!HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold
!HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius
!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations
!HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold
!HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations
!HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius
!HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost
!HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion !HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion
!HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction !HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction
!HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter
@ -2226,6 +2235,7 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: <b>-</b>
!TP_CROP_SELECTCROP;Select !TP_CROP_SELECTCROP;Select
!TP_DEHAZE_DEPTH;Depth !TP_DEHAZE_DEPTH;Depth
!TP_DEHAZE_LABEL;Haze Removal !TP_DEHAZE_LABEL;Haze Removal
!TP_DEHAZE_LUMINANCE;Luminance only
!TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map !TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map
!TP_DEHAZE_STRENGTH;Strength !TP_DEHAZE_STRENGTH;Strength
!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. !TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation.
@ -2235,9 +2245,9 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: <b>-</b>
!TP_EXPOSURE_HISTMATCHING_TOOLTIP;Automatically adjust sliders and curves (except exposure compensation) to match the look of the embedded JPEG thumbnail. !TP_EXPOSURE_HISTMATCHING_TOOLTIP;Automatically adjust sliders and curves (except exposure compensation) to match the look of the embedded JPEG thumbnail.
!TP_FILMNEGATIVE_BLUE;Blue ratio !TP_FILMNEGATIVE_BLUE;Blue ratio
!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) !TP_FILMNEGATIVE_GREEN;Reference exponent (contrast)
!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked. !TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards.
!TP_FILMNEGATIVE_LABEL;Film Negative !TP_FILMNEGATIVE_LABEL;Film Negative
!TP_FILMNEGATIVE_PICK;Pick white and black spots !TP_FILMNEGATIVE_PICK;Pick neutral spots
!TP_FILMNEGATIVE_RED;Red ratio !TP_FILMNEGATIVE_RED;Red ratio
!TP_ICM_WORKING_TRC;Tone response curve: !TP_ICM_WORKING_TRC;Tone response curve:
!TP_ICM_WORKING_TRC_CUSTOM;Custom !TP_ICM_WORKING_TRC_CUSTOM;Custom
@ -2263,6 +2273,7 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: <b>-</b>
!TP_METADATA_MODE;Metadata copy mode !TP_METADATA_MODE;Metadata copy mode
!TP_METADATA_STRIP;Strip all metadata !TP_METADATA_STRIP;Strip all metadata
!TP_METADATA_TUNNEL;Copy unchanged !TP_METADATA_TUNNEL;Copy unchanged
!TP_PDSHARPENING_LABEL;Capture Sharpening
!TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction !TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction
!TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both !TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both
!TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal !TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal
@ -2300,6 +2311,8 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: <b>-</b>
!TP_RETINEX_MAP;Method !TP_RETINEX_MAP;Method
!TP_SHARPENING_BLUR;Blur radius !TP_SHARPENING_BLUR;Blur radius
!TP_SHARPENING_CONTRAST;Contrast threshold !TP_SHARPENING_CONTRAST;Contrast threshold
!TP_SHARPENING_ITERCHECK;Auto limit iterations
!TP_SHARPENING_RADIUS_BOOST;Corner radius boost
!TP_SHARPENMICRO_CONTRAST;Contrast threshold !TP_SHARPENMICRO_CONTRAST;Contrast threshold
!TP_SOFTLIGHT_LABEL;Soft Light !TP_SOFTLIGHT_LABEL;Soft Light
!TP_SOFTLIGHT_STRENGTH;Strength !TP_SOFTLIGHT_STRENGTH;Strength

View File

@ -563,8 +563,8 @@ MAIN_TOOLTIP_BACKCOLOR1;Kolor tła podglądu: <b>Czarny</b>\nSkrót: <b>9</b>
MAIN_TOOLTIP_BACKCOLOR2;Kolor tła podglądu: <b>Biały</b>\nSkrót: <b>9</b> MAIN_TOOLTIP_BACKCOLOR2;Kolor tła podglądu: <b>Biały</b>\nSkrót: <b>9</b>
MAIN_TOOLTIP_BEFOREAFTERLOCK;<b>Zablokuj</b> / <b>Odblokuj</b> widok <b>Przed</b>\n\n<b>Zablokuj</b>: nie zmieniaj widoku <b>Przed</b> - \nPrzydatne w porównywaniu zablokowanego obrazu z obrazem na ktorym wykonano wiele zmian.\n\n<b>Odblokuj</b>: widok <b>Przed</b> będzie śledził widok <b>Po</b> o jeden krok do tyłu, pokazując obraz przed efektem aktualnie użytego narzędzia. MAIN_TOOLTIP_BEFOREAFTERLOCK;<b>Zablokuj</b> / <b>Odblokuj</b> widok <b>Przed</b>\n\n<b>Zablokuj</b>: nie zmieniaj widoku <b>Przed</b> - \nPrzydatne w porównywaniu zablokowanego obrazu z obrazem na ktorym wykonano wiele zmian.\n\n<b>Odblokuj</b>: widok <b>Przed</b> będzie śledził widok <b>Po</b> o jeden krok do tyłu, pokazując obraz przed efektem aktualnie użytego narzędzia.
MAIN_TOOLTIP_HIDEHP;Pokaż/ukryj lewy panel (razem z historią).\nSkrót: <b>l</b> MAIN_TOOLTIP_HIDEHP;Pokaż/ukryj lewy panel (razem z historią).\nSkrót: <b>l</b>
MAIN_TOOLTIP_INDCLIPPEDH;Pokaż obcięte prześwietlenia.\nSkrót: <b>&lt;</b> MAIN_TOOLTIP_INDCLIPPEDH;Pokaż obcięte prześwietlenia.\nSkrót: <b>&gt;</b>
MAIN_TOOLTIP_INDCLIPPEDS;Pokaż obcięte niedoświetlenia.\nSkrót: <b>&gt;</b> MAIN_TOOLTIP_INDCLIPPEDS;Pokaż obcięte niedoświetlenia.\nSkrót: <b>&lt;</b>
MAIN_TOOLTIP_PREVIEWB;Podgląd <b>kanału niebieskiego</b>.\nSkrót: <b>b</b> MAIN_TOOLTIP_PREVIEWB;Podgląd <b>kanału niebieskiego</b>.\nSkrót: <b>b</b>
MAIN_TOOLTIP_PREVIEWFOCUSMASK;Podgląd <b>maski ostrości</b>.\nSkrót: <b>Shift-f</b>\n\nDokładniejsze w przypadku zdjęc o płytkiej głębi ostrości, niskim pozimie szumów i o większym przybliżeniu. W przypadku zdjęć o wyższym poziomie szumów maska ostrości będzie dokładniejsza przy mniejszym zoomie (10-30%). MAIN_TOOLTIP_PREVIEWFOCUSMASK;Podgląd <b>maski ostrości</b>.\nSkrót: <b>Shift-f</b>\n\nDokładniejsze w przypadku zdjęc o płytkiej głębi ostrości, niskim pozimie szumów i o większym przybliżeniu. W przypadku zdjęć o wyższym poziomie szumów maska ostrości będzie dokładniejsza przy mniejszym zoomie (10-30%).
MAIN_TOOLTIP_PREVIEWG;Podgląd <b>kanału zielonego</b>.\nSkrót: <b>g</b> MAIN_TOOLTIP_PREVIEWG;Podgląd <b>kanału zielonego</b>.\nSkrót: <b>g</b>
@ -1600,6 +1600,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: <b>-</b>
!HISTORY_MSG_491;White Balance !HISTORY_MSG_491;White Balance
!HISTORY_MSG_492;RGB Curves !HISTORY_MSG_492;RGB Curves
!HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_MSG_493;L*a*b* Adjustments
!HISTORY_MSG_494;Capture Sharpening
!HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors
!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction
!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction !HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction
@ -1617,6 +1618,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: <b>-</b>
!HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope !HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope
!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth !HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth
!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal !HISTORY_MSG_DEHAZE_ENABLED;Haze Removal
!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only
!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map !HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map
!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength !HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength
!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold !HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold
@ -1637,6 +1639,13 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: <b>-</b>
!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius
!HISTORY_MSG_METADATA_MODE;Metadata copy mode !HISTORY_MSG_METADATA_MODE;Metadata copy mode
!HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold !HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold
!HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold
!HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius
!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations
!HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold
!HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations
!HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius
!HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost
!HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion !HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion
!HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction !HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction
!HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter
@ -1892,6 +1901,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: <b>-</b>
!TP_CROP_SELECTCROP;Select !TP_CROP_SELECTCROP;Select
!TP_DEHAZE_DEPTH;Depth !TP_DEHAZE_DEPTH;Depth
!TP_DEHAZE_LABEL;Haze Removal !TP_DEHAZE_LABEL;Haze Removal
!TP_DEHAZE_LUMINANCE;Luminance only
!TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map !TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map
!TP_DEHAZE_STRENGTH;Strength !TP_DEHAZE_STRENGTH;Strength
!TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones
@ -1934,9 +1944,9 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: <b>-</b>
!TP_EXPOSURE_TCMODE_PERCEPTUAL;Perceptual !TP_EXPOSURE_TCMODE_PERCEPTUAL;Perceptual
!TP_FILMNEGATIVE_BLUE;Blue ratio !TP_FILMNEGATIVE_BLUE;Blue ratio
!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) !TP_FILMNEGATIVE_GREEN;Reference exponent (contrast)
!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked. !TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards.
!TP_FILMNEGATIVE_LABEL;Film Negative !TP_FILMNEGATIVE_LABEL;Film Negative
!TP_FILMNEGATIVE_PICK;Pick white and black spots !TP_FILMNEGATIVE_PICK;Pick neutral spots
!TP_FILMNEGATIVE_RED;Red ratio !TP_FILMNEGATIVE_RED;Red ratio
!TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now? !TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now?
!TP_ICM_APPLYBASELINEEXPOSUREOFFSET;Baseline exposure !TP_ICM_APPLYBASELINEEXPOSUREOFFSET;Baseline exposure
@ -1975,6 +1985,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: <b>-</b>
!TP_METADATA_STRIP;Strip all metadata !TP_METADATA_STRIP;Strip all metadata
!TP_METADATA_TUNNEL;Copy unchanged !TP_METADATA_TUNNEL;Copy unchanged
!TP_NEUTRAL;Reset !TP_NEUTRAL;Reset
!TP_PDSHARPENING_LABEL;Capture Sharpening
!TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction !TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction
!TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both !TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both
!TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal !TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal
@ -2125,6 +2136,8 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: <b>-</b>
!TP_RETINEX_VIEW_UNSHARP;Unsharp mask !TP_RETINEX_VIEW_UNSHARP;Unsharp mask
!TP_SHARPENING_BLUR;Blur radius !TP_SHARPENING_BLUR;Blur radius
!TP_SHARPENING_CONTRAST;Contrast threshold !TP_SHARPENING_CONTRAST;Contrast threshold
!TP_SHARPENING_ITERCHECK;Auto limit iterations
!TP_SHARPENING_RADIUS_BOOST;Corner radius boost
!TP_SHARPENMICRO_CONTRAST;Contrast threshold !TP_SHARPENMICRO_CONTRAST;Contrast threshold
!TP_SOFTLIGHT_LABEL;Soft Light !TP_SOFTLIGHT_LABEL;Soft Light
!TP_SOFTLIGHT_STRENGTH;Strength !TP_SOFTLIGHT_STRENGTH;Strength

View File

@ -916,8 +916,8 @@ MAIN_TOOLTIP_BACKCOLOR2;Cor de fundo da pré-visualização: <b>branco</b>\nAtal
MAIN_TOOLTIP_BACKCOLOR3;Cor de fundo da pré-visualização: <b>cinza médio</b>\nAtalho: <b>9</b> MAIN_TOOLTIP_BACKCOLOR3;Cor de fundo da pré-visualização: <b>cinza médio</b>\nAtalho: <b>9</b>
MAIN_TOOLTIP_BEFOREAFTERLOCK;<b>Bloquear</b> / <b>desbloquear</b> a visualização <b>antes</b>\n\n<b>Bloquear</b>: manter a visualização <b>antes</b> inalterada.\nÚtil para avaliar o efeito cumulativo de várias ferramentas.\nAlém disso, podem ser feitas comparações a qualquer momento no histórico.\n\n<b>Desbloquear</b>: a visualização <b>antes</b> seguirá a visualização <b>depois</b> um passo antes, mostrando a imagem antes do efeito da ferramenta atualmente utilizada. MAIN_TOOLTIP_BEFOREAFTERLOCK;<b>Bloquear</b> / <b>desbloquear</b> a visualização <b>antes</b>\n\n<b>Bloquear</b>: manter a visualização <b>antes</b> inalterada.\nÚtil para avaliar o efeito cumulativo de várias ferramentas.\nAlém disso, podem ser feitas comparações a qualquer momento no histórico.\n\n<b>Desbloquear</b>: a visualização <b>antes</b> seguirá a visualização <b>depois</b> um passo antes, mostrando a imagem antes do efeito da ferramenta atualmente utilizada.
MAIN_TOOLTIP_HIDEHP;Mostrar o painel esquerdo (incluindo o histórico).\nAtalho: <b>l</b> MAIN_TOOLTIP_HIDEHP;Mostrar o painel esquerdo (incluindo o histórico).\nAtalho: <b>l</b>
MAIN_TOOLTIP_INDCLIPPEDH;Ver altas luzes cortadas.\nAtalho: <b>&lt;</b> MAIN_TOOLTIP_INDCLIPPEDH;Ver altas luzes cortadas.\nAtalho: <b>&gt;</b>
MAIN_TOOLTIP_INDCLIPPEDS;Ver sombras cortadas.\nAtalho: <b>&gt;</b> MAIN_TOOLTIP_INDCLIPPEDS;Ver sombras cortadas.\nAtalho: <b>&lt;</b>
MAIN_TOOLTIP_PREVIEWB;Pré-visualizar o <b>canal azul</b>.\nAtalho: <b>b</b> MAIN_TOOLTIP_PREVIEWB;Pré-visualizar o <b>canal azul</b>.\nAtalho: <b>b</b>
MAIN_TOOLTIP_PREVIEWFOCUSMASK;Pré-visualizar a <b>máscara de foco</b>.\nAtalho: <b>Shift-f</b>\n\nMais preciso em imagens com pouca profundidade de campo, baixo ruído e níveis de zoom mais altos.\n\nUtilize um zoom menor entre 10-30% para melhorar a precisão da deteção de imagens com muito ruído. MAIN_TOOLTIP_PREVIEWFOCUSMASK;Pré-visualizar a <b>máscara de foco</b>.\nAtalho: <b>Shift-f</b>\n\nMais preciso em imagens com pouca profundidade de campo, baixo ruído e níveis de zoom mais altos.\n\nUtilize um zoom menor entre 10-30% para melhorar a precisão da deteção de imagens com muito ruído.
MAIN_TOOLTIP_PREVIEWG;Pré-visualizar o <b>canal verde</b>.\nAtalho: <b>g</b> MAIN_TOOLTIP_PREVIEWG;Pré-visualizar o <b>canal verde</b>.\nAtalho: <b>g</b>
@ -2264,8 +2264,17 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: <b>-</b>
!FILEBROWSER_POPUPREMOVE;Delete permanently !FILEBROWSER_POPUPREMOVE;Delete permanently
!FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version !FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version
!FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. !FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash.
!HISTORY_MSG_494;Capture Sharpening
!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only
!HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative !HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative
!HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values !HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values
!HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold
!HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius
!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations
!HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold
!HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations
!HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius
!HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost
!MAIN_FRAME_PLACES_DEL;Remove !MAIN_FRAME_PLACES_DEL;Remove
!PARTIALPASTE_FILMNEGATIVE;Film Negative !PARTIALPASTE_FILMNEGATIVE;Film Negative
!PREFERENCES_APPEARANCE_PSEUDOHIDPI;Pseudo-HiDPI mode !PREFERENCES_APPEARANCE_PSEUDOHIDPI;Pseudo-HiDPI mode
@ -2277,16 +2286,20 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: <b>-</b>
!PROGRESSBAR_RAWCACORR;Raw CA correction... !PROGRESSBAR_RAWCACORR;Raw CA correction...
!QUEUE_LOCATION_TITLE;Output Location !QUEUE_LOCATION_TITLE;Output Location
!TP_CROP_PPI;PPI !TP_CROP_PPI;PPI
!TP_DEHAZE_LUMINANCE;Luminance only
!TP_FILMNEGATIVE_BLUE;Blue ratio !TP_FILMNEGATIVE_BLUE;Blue ratio
!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) !TP_FILMNEGATIVE_GREEN;Reference exponent (contrast)
!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked. !TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards.
!TP_FILMNEGATIVE_LABEL;Film Negative !TP_FILMNEGATIVE_LABEL;Film Negative
!TP_FILMNEGATIVE_PICK;Pick white and black spots !TP_FILMNEGATIVE_PICK;Pick neutral spots
!TP_FILMNEGATIVE_RED;Red ratio !TP_FILMNEGATIVE_RED;Red ratio
!TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically selected !TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically selected
!TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected !TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected
!TP_LENSPROFILE_MODE_HEADER;Lens Profile !TP_LENSPROFILE_MODE_HEADER;Lens Profile
!TP_LENSPROFILE_USE_GEOMETRIC;Geometric distortion !TP_LENSPROFILE_USE_GEOMETRIC;Geometric distortion
!TP_LENSPROFILE_USE_HEADER;Correct !TP_LENSPROFILE_USE_HEADER;Correct
!TP_PDSHARPENING_LABEL;Capture Sharpening
!TP_RAW_XTRANS;X-Trans !TP_RAW_XTRANS;X-Trans
!TP_RAW_XTRANSFAST;Fast X-Trans !TP_RAW_XTRANSFAST;Fast X-Trans
!TP_SHARPENING_ITERCHECK;Auto limit iterations
!TP_SHARPENING_RADIUS_BOOST;Corner radius boost

View File

@ -119,8 +119,12 @@ FILEBROWSER_COLORLABEL_TOOLTIP;Etiqueta de cor.\n\nUse o menu suspenso ou atalho
FILEBROWSER_COPYPROFILE;Copiar perfil FILEBROWSER_COPYPROFILE;Copiar perfil
FILEBROWSER_CURRENT_NAME;Nome atual: FILEBROWSER_CURRENT_NAME;Nome atual:
FILEBROWSER_DARKFRAME;Quadro escuro FILEBROWSER_DARKFRAME;Quadro escuro
FILEBROWSER_DELETEDIALOG_ALL;Você tem certeza que quer deletas <b>permanentemente</b> todos os <b>%1</b> arquivos na lixeira?
FILEBROWSER_DELETEDIALOG_HEADER;Confirmação de exclusão de arquivo FILEBROWSER_DELETEDIALOG_HEADER;Confirmação de exclusão de arquivo
FILEBROWSER_DELETEDIALOG_SELECTED;Você tem certeza que quer deletar <b>permanentemente</b> os <b>%1</b> arquivos selecionados?
FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Você tem certeza que quer deletar <b>permanentemente</b> os <b>%1</b> arquivos selecionados, <b>incluindo</b> a versão processada em fila?
FILEBROWSER_EMPTYTRASH;Esvaziar lixeira FILEBROWSER_EMPTYTRASH;Esvaziar lixeira
FILEBROWSER_EMPTYTRASHHINT;Deletar <b>permanentemente</b> todos os arquivos na lixeira.
FILEBROWSER_EXTPROGMENU;Abrir com FILEBROWSER_EXTPROGMENU;Abrir com
FILEBROWSER_FLATFIELD;Flat-Field FILEBROWSER_FLATFIELD;Flat-Field
FILEBROWSER_MOVETODARKFDIR;Mover para o diretório de quadros escuros FILEBROWSER_MOVETODARKFDIR;Mover para o diretório de quadros escuros
@ -154,6 +158,8 @@ FILEBROWSER_POPUPRANK2;Classificação 2 **
FILEBROWSER_POPUPRANK3;Classificação 3 *** FILEBROWSER_POPUPRANK3;Classificação 3 ***
FILEBROWSER_POPUPRANK4;Classificação 4 **** FILEBROWSER_POPUPRANK4;Classificação 4 ****
FILEBROWSER_POPUPRANK5;Classificação 5 ***** FILEBROWSER_POPUPRANK5;Classificação 5 *****
FILEBROWSER_POPUPREMOVE;Deletar permanentemente
FILEBROWSER_POPUPREMOVEINCLPROC;Excluir permanentemente, incluindo a versão processada em fila
FILEBROWSER_POPUPRENAME;Renomear FILEBROWSER_POPUPRENAME;Renomear
FILEBROWSER_POPUPSELECTALL;Selecionar tudo FILEBROWSER_POPUPSELECTALL;Selecionar tudo
FILEBROWSER_POPUPTRASH;Mover para a lixeira FILEBROWSER_POPUPTRASH;Mover para a lixeira
@ -180,6 +186,7 @@ FILEBROWSER_SHOWDIRHINT;Limpar todos os filtros.\nAtalho: <b>d</b>
FILEBROWSER_SHOWEDITEDHINT;Mostrar imagens editadas.\nAtalho: <b>7</b> FILEBROWSER_SHOWEDITEDHINT;Mostrar imagens editadas.\nAtalho: <b>7</b>
FILEBROWSER_SHOWEDITEDNOTHINT;Mostrar imagens não editadas.\nAtalho: <b>6</b> FILEBROWSER_SHOWEDITEDNOTHINT;Mostrar imagens não editadas.\nAtalho: <b>6</b>
FILEBROWSER_SHOWEXIFINFO;Mostrar informações Exif.\n\nAtalhos:\n<b>i</b> - Modo de Guias de Editores Múltiplos,\n<b>Alt-i</b> - Modo de Guia de Editor Único. FILEBROWSER_SHOWEXIFINFO;Mostrar informações Exif.\n\nAtalhos:\n<b>i</b> - Modo de Guias de Editores Múltiplos,\n<b>Alt-i</b> - Modo de Guia de Editor Único.
FILEBROWSER_SHOWNOTTRASHHINT;Mostrar apenas imagens que não estão no lixo.
FILEBROWSER_SHOWORIGINALHINT;Mostre somente imagens originais.\n\nQuando existem várias imagens com o mesmo nome de arquivo, mas extensões diferentes, a única considerada original é aquela cuja extensão está mais próxima da parte superior da lista de extensões analisadas em Preferências > Navegador de Arquivos > Extensões Analisadas. FILEBROWSER_SHOWORIGINALHINT;Mostre somente imagens originais.\n\nQuando existem várias imagens com o mesmo nome de arquivo, mas extensões diferentes, a única considerada original é aquela cuja extensão está mais próxima da parte superior da lista de extensões analisadas em Preferências > Navegador de Arquivos > Extensões Analisadas.
FILEBROWSER_SHOWRANK1HINT;Mostrar imagens classificadas com 1 estrela.\nAtalho: <b>1</b> FILEBROWSER_SHOWRANK1HINT;Mostrar imagens classificadas com 1 estrela.\nAtalho: <b>1</b>
FILEBROWSER_SHOWRANK2HINT;Mostrar imagens classificadas com 2 estrelas.\nAtalho: <b>2</b> FILEBROWSER_SHOWRANK2HINT;Mostrar imagens classificadas com 2 estrelas.\nAtalho: <b>2</b>
@ -870,6 +877,7 @@ MAIN_FRAME_FILEBROWSER;Navegador de Arquivos
MAIN_FRAME_FILEBROWSER_TOOLTIP;Navegador de arquivos.\nAtalho: <b>Ctrl-F2</b> MAIN_FRAME_FILEBROWSER_TOOLTIP;Navegador de arquivos.\nAtalho: <b>Ctrl-F2</b>
MAIN_FRAME_PLACES;Locais MAIN_FRAME_PLACES;Locais
MAIN_FRAME_PLACES_ADD;Adicionar MAIN_FRAME_PLACES_ADD;Adicionar
MAIN_FRAME_PLACES_DEL;Remover
MAIN_FRAME_QUEUE;Fila MAIN_FRAME_QUEUE;Fila
MAIN_FRAME_QUEUE_TOOLTIP;Processando fila.\nAtalho: <b>Ctrl-F3</b> MAIN_FRAME_QUEUE_TOOLTIP;Processando fila.\nAtalho: <b>Ctrl-F3</b>
MAIN_FRAME_RECENT;Pastas Recentes MAIN_FRAME_RECENT;Pastas Recentes
@ -915,8 +923,8 @@ MAIN_TOOLTIP_BACKCOLOR2;Cor de fundo da pré-visualização: <b>Branco</b>\nAtal
MAIN_TOOLTIP_BACKCOLOR3;Cor de fundo da pré-visualização: <b>Cinza médio</b>\nAtalho: <b>9</b> MAIN_TOOLTIP_BACKCOLOR3;Cor de fundo da pré-visualização: <b>Cinza médio</b>\nAtalho: <b>9</b>
MAIN_TOOLTIP_BEFOREAFTERLOCK;<b>Travar</b> / <b>Destravar</b> a <b>Antes</b> visualização\n\n<b>Travar</b>: mantenha o <b>Antes</b> visualização inalterada.\nÚtil para avaliar o efeito cumulativo de várias ferramentas.\nAlém disso, comparações podem ser feitas a qualquer momento.\n\n<b>Destravar</b>: o <b>Antes</b> visualização seguinte <b>Depois</b> visualização anterior, mostrando a imagem antes do efeito da ferramenta atualmente utilizada. MAIN_TOOLTIP_BEFOREAFTERLOCK;<b>Travar</b> / <b>Destravar</b> a <b>Antes</b> visualização\n\n<b>Travar</b>: mantenha o <b>Antes</b> visualização inalterada.\nÚtil para avaliar o efeito cumulativo de várias ferramentas.\nAlém disso, comparações podem ser feitas a qualquer momento.\n\n<b>Destravar</b>: o <b>Antes</b> visualização seguinte <b>Depois</b> visualização anterior, mostrando a imagem antes do efeito da ferramenta atualmente utilizada.
MAIN_TOOLTIP_HIDEHP;Mostrar/Ocultar o painel esquerdo (incluindo o histórico).\nAtalho: <b>l</b> MAIN_TOOLTIP_HIDEHP;Mostrar/Ocultar o painel esquerdo (incluindo o histórico).\nAtalho: <b>l</b>
MAIN_TOOLTIP_INDCLIPPEDH;Indicação de realce recortado.\nAtalho: <b>&lt;</b> MAIN_TOOLTIP_INDCLIPPEDH;Indicação de realce recortado.\nAtalho: <b>&gt;</b>
MAIN_TOOLTIP_INDCLIPPEDS;Indicação de sombra recortada.\nAtalho: <b>&gt;</b> MAIN_TOOLTIP_INDCLIPPEDS;Indicação de sombra recortada.\nAtalho: <b>&lt;</b>
MAIN_TOOLTIP_PREVIEWB;Pré-visualize o <b>Canal Azul</b>.\nAtalho: <b>b</b> MAIN_TOOLTIP_PREVIEWB;Pré-visualize o <b>Canal Azul</b>.\nAtalho: <b>b</b>
MAIN_TOOLTIP_PREVIEWFOCUSMASK;Pré-visualize a <b>Máscara de Foco</b>.\nAtalho: <b>Shift-f</b>\n\nMais preciso em imagens com pouca profundidade de campo, baixo ruído e níveis de zoom mais altos.\n\nPara melhorar a precisão da detecção de imagens ruidosas, avalie com zoom menor, cerca de 10-30%. MAIN_TOOLTIP_PREVIEWFOCUSMASK;Pré-visualize a <b>Máscara de Foco</b>.\nAtalho: <b>Shift-f</b>\n\nMais preciso em imagens com pouca profundidade de campo, baixo ruído e níveis de zoom mais altos.\n\nPara melhorar a precisão da detecção de imagens ruidosas, avalie com zoom menor, cerca de 10-30%.
MAIN_TOOLTIP_PREVIEWG;Pré-visualize o <b>Canal verde</b>.\nAtalho: <b>g</b> MAIN_TOOLTIP_PREVIEWG;Pré-visualize o <b>Canal verde</b>.\nAtalho: <b>g</b>
@ -1029,6 +1037,7 @@ PREFERENCES_APPEARANCE_COLORPICKERFONT;Fonte do seletor de cor
PREFERENCES_APPEARANCE_CROPMASKCOLOR;Cor da máscara de corte PREFERENCES_APPEARANCE_CROPMASKCOLOR;Cor da máscara de corte
PREFERENCES_APPEARANCE_MAINFONT;Fonte principal PREFERENCES_APPEARANCE_MAINFONT;Fonte principal
PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Cor do guia do navegador PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Cor do guia do navegador
PREFERENCES_APPEARANCE_PSEUDOHIDPI;Modo pseudo-HiDPI
PREFERENCES_APPEARANCE_THEME;Tema PREFERENCES_APPEARANCE_THEME;Tema
PREFERENCES_APPLNEXTSTARTUP;é necessário reiniciar PREFERENCES_APPLNEXTSTARTUP;é necessário reiniciar
PREFERENCES_AUTOMONPROFILE;Usar o perfil de cores do monitor principal do sistema operacional PREFERENCES_AUTOMONPROFILE;Usar o perfil de cores do monitor principal do sistema operacional
@ -1215,6 +1224,9 @@ PROFILEPANEL_TOOLTIPCOPY;Copie o perfil de processamento atual para a área de t
PROFILEPANEL_TOOLTIPLOAD;Carregue um perfil do arquivo.\n<b>Ctrl-click</b> para selecionar os parâmetros a serem carregados. PROFILEPANEL_TOOLTIPLOAD;Carregue um perfil do arquivo.\n<b>Ctrl-click</b> para selecionar os parâmetros a serem carregados.
PROFILEPANEL_TOOLTIPPASTE;Cole o perfil da área de transferência.\n<b>Ctrl-click</b> para selecionar os parâmetros a serem colados. PROFILEPANEL_TOOLTIPPASTE;Cole o perfil da área de transferência.\n<b>Ctrl-click</b> para selecionar os parâmetros a serem colados.
PROFILEPANEL_TOOLTIPSAVE;Salvar o perfil atual.\n<b>Ctrl-click</b> para selecionar os parâmetros a serem salvos. PROFILEPANEL_TOOLTIPSAVE;Salvar o perfil atual.\n<b>Ctrl-click</b> para selecionar os parâmetros a serem salvos.
PROGRESSBAR_GREENEQUIL;Equilíbrio de verde...
PROGRESSBAR_HLREC;Reconstrução de realces...
PROGRESSBAR_LINEDENOISE;Filtro de ruído de linha...
PROGRESSBAR_LOADING;Carregando imagem... PROGRESSBAR_LOADING;Carregando imagem...
PROGRESSBAR_LOADINGTHUMBS;Carregando miniaturas... PROGRESSBAR_LOADINGTHUMBS;Carregando miniaturas...
PROGRESSBAR_LOADJPEG;Carregando arquivo JPEG... PROGRESSBAR_LOADJPEG;Carregando arquivo JPEG...
@ -1241,6 +1253,7 @@ QUEUE_FORMAT_TITLE;Formato de arquivo
QUEUE_LOCATION_FOLDER;Salvar na pasta QUEUE_LOCATION_FOLDER;Salvar na pasta
QUEUE_LOCATION_TEMPLATE;Use modelo QUEUE_LOCATION_TEMPLATE;Use modelo
QUEUE_LOCATION_TEMPLATE_TOOLTIP;Podes usar as seguintes sequências de formatação:\n<b>%f</b>, <b>%d1</b>, <b>%d2</b>, ..., <b>%p1</b>, <b>%p2</b>, ..., <b>%r</b>, <b>%s1</b>, <b>%s2</b>, ...\n\nEssas cadeias de formatação referem-se às diferentes partes do endereço do nome da foto, alguns atributos da foto ou um índice de sequência arbitrário no processamento em lote.\n\nPor exemplo, se a foto que está sendo processada tiver o seguinte endereço do nome:\n<b><i>/inicio/rodrigo/fotos/2010-10-31/dsc0042.nef</i></b>\no significado das cadeias de formatação são:\n<b>%d4</b> = <i>inicio</i>\n<b>%d3</b> = <i>rodrigo</i>\n<b>%d2</b> = <i>fotos</i>\n<b>%d1</b> = <i>2010-10-31</i>\n<b>%f</b> = <i>dsc0042</i>\n<b>%p1</b> = <i>/inicio/rodrigo/fotos/2010-10-31/</i>\n<b>%p2</b> = <i>/inicio/rodrigo/fotos/</i>\n<b>%p3</b> = <i>/inicio/rodrigo/</i>\n<b>%p4</b> = <i>/inicio/</i>\n\n<b>%r</b> será substituído pela classificação da foto. Se a foto não tiver classificação, %r será substituído por '0'. Se a foto estiver na lixeira, %r será substituído por 'x'.\n\n<b>%s1</b>, <b>%s2</b>, etc. será substituído por um índice de sequência que é preenchido entre 1 e 9 dígitos. O índice de sequência iniciará em 1 sempre que o processamento da fila for iniciado e será incrementado em 1 para cada imagem processada.\n\nSe quiseres salvar a imagem de saída no local onde se encontra a original, escreva:\n<b>%p1/%f</b>\n\nSe quiseres salvar a imagem de saída num diretório chamado "<i>convertido</i>" localizado no diretório da imagem aberta, escreva:\n<b>%p1/convertido/%f</b>\n\nSe quiseres salvar a imagem de saída num diretório chamado\n"<i>/inicio/rodrigo/fotos/convertido/2010-10-31</i>", escreva:\n<b>%p2/convertido/%d1/%f</b> QUEUE_LOCATION_TEMPLATE_TOOLTIP;Podes usar as seguintes sequências de formatação:\n<b>%f</b>, <b>%d1</b>, <b>%d2</b>, ..., <b>%p1</b>, <b>%p2</b>, ..., <b>%r</b>, <b>%s1</b>, <b>%s2</b>, ...\n\nEssas cadeias de formatação referem-se às diferentes partes do endereço do nome da foto, alguns atributos da foto ou um índice de sequência arbitrário no processamento em lote.\n\nPor exemplo, se a foto que está sendo processada tiver o seguinte endereço do nome:\n<b><i>/inicio/rodrigo/fotos/2010-10-31/dsc0042.nef</i></b>\no significado das cadeias de formatação são:\n<b>%d4</b> = <i>inicio</i>\n<b>%d3</b> = <i>rodrigo</i>\n<b>%d2</b> = <i>fotos</i>\n<b>%d1</b> = <i>2010-10-31</i>\n<b>%f</b> = <i>dsc0042</i>\n<b>%p1</b> = <i>/inicio/rodrigo/fotos/2010-10-31/</i>\n<b>%p2</b> = <i>/inicio/rodrigo/fotos/</i>\n<b>%p3</b> = <i>/inicio/rodrigo/</i>\n<b>%p4</b> = <i>/inicio/</i>\n\n<b>%r</b> será substituído pela classificação da foto. Se a foto não tiver classificação, %r será substituído por '0'. Se a foto estiver na lixeira, %r será substituído por 'x'.\n\n<b>%s1</b>, <b>%s2</b>, etc. será substituído por um índice de sequência que é preenchido entre 1 e 9 dígitos. O índice de sequência iniciará em 1 sempre que o processamento da fila for iniciado e será incrementado em 1 para cada imagem processada.\n\nSe quiseres salvar a imagem de saída no local onde se encontra a original, escreva:\n<b>%p1/%f</b>\n\nSe quiseres salvar a imagem de saída num diretório chamado "<i>convertido</i>" localizado no diretório da imagem aberta, escreva:\n<b>%p1/convertido/%f</b>\n\nSe quiseres salvar a imagem de saída num diretório chamado\n"<i>/inicio/rodrigo/fotos/convertido/2010-10-31</i>", escreva:\n<b>%p2/convertido/%d1/%f</b>
QUEUE_LOCATION_TITLE;Local da Saída
QUEUE_STARTSTOP_TOOLTIP;Inicia ou para o processamento das imagens na fila.\n\nAtalho: <b>Ctrl</b>+<b>s</b> QUEUE_STARTSTOP_TOOLTIP;Inicia ou para o processamento das imagens na fila.\n\nAtalho: <b>Ctrl</b>+<b>s</b>
SAMPLEFORMAT_0;Formato de dados desconhecido SAMPLEFORMAT_0;Formato de dados desconhecido
SAMPLEFORMAT_1;8 bits sem assinatura SAMPLEFORMAT_1;8 bits sem assinatura
@ -1612,6 +1625,9 @@ TP_EXPOSURE_TCMODE_STANDARD;Padrão
TP_EXPOSURE_TCMODE_WEIGHTEDSTD;Padrão Ponderado TP_EXPOSURE_TCMODE_WEIGHTEDSTD;Padrão Ponderado
TP_EXPOS_BLACKPOINT_LABEL;Pontos Pretos Raw TP_EXPOS_BLACKPOINT_LABEL;Pontos Pretos Raw
TP_EXPOS_WHITEPOINT_LABEL;Pontos Brancos Raw TP_EXPOS_WHITEPOINT_LABEL;Pontos Brancos Raw
TP_FILMNEGATIVE_BLUE;Relação de azul
TP_FILMNEGATIVE_PICK;Pick neutral spots
TP_FILMNEGATIVE_RED;Relação de vermelho
TP_FILMSIMULATION_LABEL;Simulação de Filme TP_FILMSIMULATION_LABEL;Simulação de Filme
TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee está configurado para procurar por imagens Hald CLUT, que são usadas para a ferramenta Simulação de Filme, numa pasta que está demorando para carregar.\nVá para Preferências > Processamento de Imagem > Simulação de Filme\npara ver qual pasta está sendo usada. Deves apontar RawTherapee para uma pasta que contenha apenas imagens Hald CLUT e nada mais, ou para uma pasta vazia, se não quiseres usar a ferramenta Simulação de Filme.\n\nLeia o artigo sobre Simulação de Filme na RawPedia para mais informações.\n\nDesejas cancelar a verificação agora? TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee está configurado para procurar por imagens Hald CLUT, que são usadas para a ferramenta Simulação de Filme, numa pasta que está demorando para carregar.\nVá para Preferências > Processamento de Imagem > Simulação de Filme\npara ver qual pasta está sendo usada. Deves apontar RawTherapee para uma pasta que contenha apenas imagens Hald CLUT e nada mais, ou para uma pasta vazia, se não quiseres usar a ferramenta Simulação de Filme.\n\nLeia o artigo sobre Simulação de Filme na RawPedia para mais informações.\n\nDesejas cancelar a verificação agora?
TP_FILMSIMULATION_STRENGTH;Intensidade TP_FILMSIMULATION_STRENGTH;Intensidade
@ -1732,9 +1748,13 @@ TP_LABCURVE_RSTPRO_TOOLTIP;Funciona no controle deslizante de cromaticidade e na
TP_LENSGEOM_AUTOCROP;Corte automático TP_LENSGEOM_AUTOCROP;Corte automático
TP_LENSGEOM_FILL;Preenchimento automático TP_LENSGEOM_FILL;Preenchimento automático
TP_LENSGEOM_LABEL;Lente / Geometria TP_LENSGEOM_LABEL;Lente / Geometria
TP_LENSPROFILE_CORRECTION_AUTOMATCH;Selecionado automaticamente
TP_LENSPROFILE_CORRECTION_LCPFILE;Ficheiro LCP TP_LENSPROFILE_CORRECTION_LCPFILE;Ficheiro LCP
TP_LENSPROFILE_CORRECTION_MANUAL;Selecionado manualmente
TP_LENSPROFILE_LABEL;Correção de lente perfilada TP_LENSPROFILE_LABEL;Correção de lente perfilada
TP_LENSPROFILE_MODE_HEADER;Perfil da Lente
TP_LENSPROFILE_USE_CA;Aberração cromática TP_LENSPROFILE_USE_CA;Aberração cromática
TP_LENSPROFILE_USE_GEOMETRIC;Distorção geométrica
TP_LENSPROFILE_USE_VIGNETTING;Vinhetagem TP_LENSPROFILE_USE_VIGNETTING;Vinhetagem
TP_LOCALCONTRAST_AMOUNT;Montante TP_LOCALCONTRAST_AMOUNT;Montante
TP_LOCALCONTRAST_DARKNESS;Nível de escuridão TP_LOCALCONTRAST_DARKNESS;Nível de escuridão
@ -2249,45 +2269,38 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: <b>-</b>
!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!
!FILEBROWSER_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply "find" keywords. !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply "find" keywords.
!FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to <b>permanently</b> delete all <b>%1</b> files in trash? !HISTORY_MSG_494;Capture Sharpening
!FILEBROWSER_DELETEDIALOG_SELECTED;Are you sure you want to <b>permanently</b> delete the selected <b>%1</b> files?
!FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Are you sure you want to <b>permanently</b> delete the selected <b>%1</b> files, <b>including</b> a queue-processed version?
!FILEBROWSER_EMPTYTRASHHINT;<b>Permanently</b> delete all files in trash.
!FILEBROWSER_POPUPREMOVE;Delete permanently
!FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version
!FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash.
!HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - region offset !HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - region offset
!HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - region power !HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - region power
!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only
!HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative !HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative
!HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values !HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values
!MAIN_FRAME_PLACES_DEL;Remove !HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold
!HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius
!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations
!HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold
!HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations
!HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius
!HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost
!PARTIALPASTE_FILMNEGATIVE;Film Negative !PARTIALPASTE_FILMNEGATIVE;Film Negative
!PREFERENCES_APPEARANCE_PSEUDOHIDPI;Pseudo-HiDPI mode
!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched.
!PROGRESSBAR_DECODING;Decoding... !PROGRESSBAR_DECODING;Decoding...
!PROGRESSBAR_GREENEQUIL;Green equilibration...
!PROGRESSBAR_HLREC;Highlight reconstruction...
!PROGRESSBAR_HOTDEADPIXELFILTER;Hot/dead pixel filter... !PROGRESSBAR_HOTDEADPIXELFILTER;Hot/dead pixel filter...
!PROGRESSBAR_LINEDENOISE;Line noise filter...
!PROGRESSBAR_RAWCACORR;Raw CA correction... !PROGRESSBAR_RAWCACORR;Raw CA correction...
!QUEUE_LOCATION_TITLE;Output Location
!TP_COLORTONING_LABREGION_OFFSET;Offset !TP_COLORTONING_LABREGION_OFFSET;Offset
!TP_COLORTONING_LABREGION_POWER;Power !TP_COLORTONING_LABREGION_POWER;Power
!TP_CROP_PPI;PPI !TP_CROP_PPI;PPI
!TP_FILMNEGATIVE_BLUE;Blue ratio !TP_DEHAZE_LUMINANCE;Luminance only
!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) !TP_FILMNEGATIVE_GREEN;Reference exponent (contrast)
!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked. !TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards.
!TP_FILMNEGATIVE_LABEL;Film Negative !TP_FILMNEGATIVE_LABEL;Film Negative
!TP_FILMNEGATIVE_PICK;Pick white and black spots
!TP_FILMNEGATIVE_RED;Red ratio
!TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically selected
!TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected
!TP_LENSPROFILE_LENS_WARNING;Warning: the crop factor used for lens profiling is larger than the crop factor of the camera, the results might be wrong. !TP_LENSPROFILE_LENS_WARNING;Warning: the crop factor used for lens profiling is larger than the crop factor of the camera, the results might be wrong.
!TP_LENSPROFILE_MODE_HEADER;Lens Profile
!TP_LENSPROFILE_USE_GEOMETRIC;Geometric distortion
!TP_LENSPROFILE_USE_HEADER;Correct !TP_LENSPROFILE_USE_HEADER;Correct
!TP_PDSHARPENING_LABEL;Capture Sharpening
!TP_RAWCACORR_AUTOIT_TOOLTIP;This setting is available if "Auto-correction" is checked.\nAuto-correction is conservative, meaning that it often does not correct all chromatic aberration.\nTo correct the remaining chromatic aberration, you can use up to five iterations of automatic chromatic aberration correction.\nEach iteration will reduce the remaining chromatic aberration from the last iteration at the cost of additional processing time. !TP_RAWCACORR_AUTOIT_TOOLTIP;This setting is available if "Auto-correction" is checked.\nAuto-correction is conservative, meaning that it often does not correct all chromatic aberration.\nTo correct the remaining chromatic aberration, you can use up to five iterations of automatic chromatic aberration correction.\nEach iteration will reduce the remaining chromatic aberration from the last iteration at the cost of additional processing time.
!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the checkbox is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the checkbox first (reasonable values depend on the image). !TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the checkbox is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the checkbox first (reasonable values depend on the image).
!TP_RAW_XTRANS;X-Trans !TP_RAW_XTRANS;X-Trans
!TP_RAW_XTRANSFAST;Fast X-Trans !TP_RAW_XTRANSFAST;Fast X-Trans
!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain. !TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain.
!TP_SHARPENING_ITERCHECK;Auto limit iterations
!TP_SHARPENING_RADIUS_BOOST;Corner radius boost

View File

@ -613,8 +613,8 @@ MAIN_TOOLTIP_BACKCOLOR1;Фоновый цвет предпросмотра: <b>
MAIN_TOOLTIP_BACKCOLOR2;Фоновый цвет предпросмотра: <b>Белый</b>\nГорячая клавиша: <b>9</b> MAIN_TOOLTIP_BACKCOLOR2;Фоновый цвет предпросмотра: <b>Белый</b>\nГорячая клавиша: <b>9</b>
MAIN_TOOLTIP_BEFOREAFTERLOCK;<b>Заблокировать</b> / <b>Разблокировать</b> <b>предыдущий</b> вид\n\n<b>Заблокировать</b>: сохраняет <b>предыдущий</b> вид неизменным.\nПолезно для оценки общего эффекта от применения нескольких инструментов.\nК тому же, сравнения могут быть произведены на любом состоянии истории\n\n<b>Разблокировать</b>: <b>предыдущий</b> вид будет следовать сразу за <b>следующим</b>, показывая состояние изображения до применения текущего инструмента. MAIN_TOOLTIP_BEFOREAFTERLOCK;<b>Заблокировать</b> / <b>Разблокировать</b> <b>предыдущий</b> вид\n\n<b>Заблокировать</b>: сохраняет <b>предыдущий</b> вид неизменным.\nПолезно для оценки общего эффекта от применения нескольких инструментов.\nК тому же, сравнения могут быть произведены на любом состоянии истории\n\n<b>Разблокировать</b>: <b>предыдущий</b> вид будет следовать сразу за <b>следующим</b>, показывая состояние изображения до применения текущего инструмента.
MAIN_TOOLTIP_HIDEHP;Показать/скрыть левую панель (включая историю).\nГорячая клавиша <b>l</b> MAIN_TOOLTIP_HIDEHP;Показать/скрыть левую панель (включая историю).\nГорячая клавиша <b>l</b>
MAIN_TOOLTIP_INDCLIPPEDH;Индикатор пересветов.\nГорячая клавиша: <b>&lt;</b> MAIN_TOOLTIP_INDCLIPPEDH;Индикатор пересветов.\nГорячая клавиша: <b>&gt;</b>
MAIN_TOOLTIP_INDCLIPPEDS;Индикатор затемнений.\nГорячая клавиша: <b>&gt;</b> MAIN_TOOLTIP_INDCLIPPEDS;Индикатор затемнений.\nГорячая клавиша: <b>&lt;</b>
MAIN_TOOLTIP_PREVIEWB;Просмотреть <b>канал синего</b>.\nГорячая клавиша: <b>b</b> MAIN_TOOLTIP_PREVIEWB;Просмотреть <b>канал синего</b>.\nГорячая клавиша: <b>b</b>
MAIN_TOOLTIP_PREVIEWFOCUSMASK;Просмотреть <b>Маску резкости</b>.\nГорячая клавиша: <b>Shift-F</b>\n\nБолее точна на изображениях с небольшой глубиной резкости, малым шумом и при большем приближении изображения\n\nДля улучшения определения на шумных изображениях используйте на маленьком зуме 10-30% MAIN_TOOLTIP_PREVIEWFOCUSMASK;Просмотреть <b>Маску резкости</b>.\nГорячая клавиша: <b>Shift-F</b>\n\nБолее точна на изображениях с небольшой глубиной резкости, малым шумом и при большем приближении изображения\n\nДля улучшения определения на шумных изображениях используйте на маленьком зуме 10-30%
MAIN_TOOLTIP_PREVIEWG;Просмотреть <b>канал зеленого</b>.\nГорячая клавиша: <b>g</b> MAIN_TOOLTIP_PREVIEWG;Просмотреть <b>канал зеленого</b>.\nГорячая клавиша: <b>g</b>
@ -1690,6 +1690,7 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: <b>-</b>
!HISTORY_MSG_483;CAM02 - Yb scene !HISTORY_MSG_483;CAM02 - Yb scene
!HISTORY_MSG_484;CAM02 - Auto Yb scene !HISTORY_MSG_484;CAM02 - Auto Yb scene
!HISTORY_MSG_489;DRC - Detail !HISTORY_MSG_489;DRC - Detail
!HISTORY_MSG_494;Capture Sharpening
!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction
!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction !HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction
!HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Channel !HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Channel
@ -1704,6 +1705,7 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: <b>-</b>
!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation !HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation
!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - region show mask !HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - region show mask
!HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope !HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope
!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only
!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold !HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold
!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold !HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold
!HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative !HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative
@ -1715,6 +1717,13 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: <b>-</b>
!HISTORY_MSG_ICM_WORKING_SLOPE;Working - Slope !HISTORY_MSG_ICM_WORKING_SLOPE;Working - Slope
!HISTORY_MSG_ICM_WORKING_TRC_METHOD;Working - TRC method !HISTORY_MSG_ICM_WORKING_TRC_METHOD;Working - TRC method
!HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold !HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold
!HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold
!HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius
!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations
!HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold
!HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations
!HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius
!HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost
!HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion !HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion
!HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction !HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction
!HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter
@ -1947,6 +1956,7 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: <b>-</b>
!TP_COLORTONING_TWOCOLOR_TOOLTIP;Standard chroma:\nLinear response, a* = b*.\n\nSpecial chroma:\nLinear response, a* = b*, but unbound - try under the diagonal.\n\nSpecial a* and b*:\nLinear response unbound with separate curves for a* and b*. Intended for special effects.\n\nSpecial chroma 2 colors:\nMore predictable. !TP_COLORTONING_TWOCOLOR_TOOLTIP;Standard chroma:\nLinear response, a* = b*.\n\nSpecial chroma:\nLinear response, a* = b*, but unbound - try under the diagonal.\n\nSpecial a* and b*:\nLinear response unbound with separate curves for a* and b*. Intended for special effects.\n\nSpecial chroma 2 colors:\nMore predictable.
!TP_COLORTONING_TWOSTD;Standard chroma !TP_COLORTONING_TWOSTD;Standard chroma
!TP_CROP_PPI;PPI !TP_CROP_PPI;PPI
!TP_DEHAZE_LUMINANCE;Luminance only
!TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones
!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. !TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation.
!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. !TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings.
@ -1979,13 +1989,13 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: <b>-</b>
!TP_EXPOS_WHITEPOINT_LABEL;Raw White Points !TP_EXPOS_WHITEPOINT_LABEL;Raw White Points
!TP_FILMNEGATIVE_BLUE;Blue ratio !TP_FILMNEGATIVE_BLUE;Blue ratio
!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) !TP_FILMNEGATIVE_GREEN;Reference exponent (contrast)
!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked. !TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards.
!TP_FILMNEGATIVE_LABEL;Film Negative !TP_FILMNEGATIVE_LABEL;Film Negative
!TP_FILMNEGATIVE_PICK;Pick white and black spots !TP_FILMNEGATIVE_PICK;Pick neutral spots
!TP_FILMNEGATIVE_RED;Red ratio !TP_FILMNEGATIVE_RED;Red ratio
!TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now? !TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now?
!TP_FLATFIELD_CLIPCONTROL;Clip control !TP_FLATFIELD_CLIPCONTROL;Clip control
!TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, clip control can lead to color cast. !TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, value 0 is used.
!TP_ICM_APPLYBASELINEEXPOSUREOFFSET;Baseline exposure !TP_ICM_APPLYBASELINEEXPOSUREOFFSET;Baseline exposure
!TP_ICM_APPLYBASELINEEXPOSUREOFFSET_TOOLTIP;Employ the embedded DCP baseline exposure offset. The setting is only available if the selected DCP has one. !TP_ICM_APPLYBASELINEEXPOSUREOFFSET_TOOLTIP;Employ the embedded DCP baseline exposure offset. The setting is only available if the selected DCP has one.
!TP_ICM_APPLYHUESATMAP;Base table !TP_ICM_APPLYHUESATMAP;Base table
@ -2008,6 +2018,7 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: <b>-</b>
!TP_LENSPROFILE_MODE_HEADER;Lens Profile !TP_LENSPROFILE_MODE_HEADER;Lens Profile
!TP_LENSPROFILE_USE_GEOMETRIC;Geometric distortion !TP_LENSPROFILE_USE_GEOMETRIC;Geometric distortion
!TP_LENSPROFILE_USE_HEADER;Correct !TP_LENSPROFILE_USE_HEADER;Correct
!TP_PDSHARPENING_LABEL;Capture Sharpening
!TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction !TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction
!TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both !TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both
!TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal !TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal
@ -2135,6 +2146,8 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: <b>-</b>
!TP_RETINEX_VIEW_TRAN2;Transmission - Fixed !TP_RETINEX_VIEW_TRAN2;Transmission - Fixed
!TP_RETINEX_VIEW_UNSHARP;Unsharp mask !TP_RETINEX_VIEW_UNSHARP;Unsharp mask
!TP_SHARPENING_BLUR;Blur radius !TP_SHARPENING_BLUR;Blur radius
!TP_SHARPENING_ITERCHECK;Auto limit iterations
!TP_SHARPENING_RADIUS_BOOST;Corner radius boost
!TP_WAVELET_1;Level 1 !TP_WAVELET_1;Level 1
!TP_WAVELET_2;Level 2 !TP_WAVELET_2;Level 2
!TP_WAVELET_3;Level 3 !TP_WAVELET_3;Level 3

View File

@ -1493,6 +1493,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике <b>-</b>
!HISTORY_MSG_491;White Balance !HISTORY_MSG_491;White Balance
!HISTORY_MSG_492;RGB Curves !HISTORY_MSG_492;RGB Curves
!HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_MSG_493;L*a*b* Adjustments
!HISTORY_MSG_494;Capture Sharpening
!HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors
!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction
!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction !HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction
@ -1510,6 +1511,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике <b>-</b>
!HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope !HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope
!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth !HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth
!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal !HISTORY_MSG_DEHAZE_ENABLED;Haze Removal
!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only
!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map !HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map
!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength !HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength
!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold !HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold
@ -1530,6 +1532,13 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике <b>-</b>
!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius
!HISTORY_MSG_METADATA_MODE;Metadata copy mode !HISTORY_MSG_METADATA_MODE;Metadata copy mode
!HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold !HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold
!HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold
!HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius
!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations
!HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold
!HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations
!HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius
!HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost
!HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion !HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion
!HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction !HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction
!HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter
@ -1843,6 +1852,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике <b>-</b>
!TP_CROP_SELECTCROP;Select !TP_CROP_SELECTCROP;Select
!TP_DEHAZE_DEPTH;Depth !TP_DEHAZE_DEPTH;Depth
!TP_DEHAZE_LABEL;Haze Removal !TP_DEHAZE_LABEL;Haze Removal
!TP_DEHAZE_LUMINANCE;Luminance only
!TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map !TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map
!TP_DEHAZE_STRENGTH;Strength !TP_DEHAZE_STRENGTH;Strength
!TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones
@ -1907,16 +1917,16 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике <b>-</b>
!TP_EXPOS_WHITEPOINT_LABEL;Raw White Points !TP_EXPOS_WHITEPOINT_LABEL;Raw White Points
!TP_FILMNEGATIVE_BLUE;Blue ratio !TP_FILMNEGATIVE_BLUE;Blue ratio
!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) !TP_FILMNEGATIVE_GREEN;Reference exponent (contrast)
!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked. !TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards.
!TP_FILMNEGATIVE_LABEL;Film Negative !TP_FILMNEGATIVE_LABEL;Film Negative
!TP_FILMNEGATIVE_PICK;Pick white and black spots !TP_FILMNEGATIVE_PICK;Pick neutral spots
!TP_FILMNEGATIVE_RED;Red ratio !TP_FILMNEGATIVE_RED;Red ratio
!TP_FILMSIMULATION_LABEL;Film Simulation !TP_FILMSIMULATION_LABEL;Film Simulation
!TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now? !TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now?
!TP_FILMSIMULATION_STRENGTH;Strength !TP_FILMSIMULATION_STRENGTH;Strength
!TP_FILMSIMULATION_ZEROCLUTSFOUND;Set HaldCLUT directory in Preferences !TP_FILMSIMULATION_ZEROCLUTSFOUND;Set HaldCLUT directory in Preferences
!TP_FLATFIELD_CLIPCONTROL;Clip control !TP_FLATFIELD_CLIPCONTROL;Clip control
!TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, clip control can lead to color cast. !TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, value 0 is used.
!TP_ICM_APPLYBASELINEEXPOSUREOFFSET;Baseline exposure !TP_ICM_APPLYBASELINEEXPOSUREOFFSET;Baseline exposure
!TP_ICM_APPLYBASELINEEXPOSUREOFFSET_TOOLTIP;Employ the embedded DCP baseline exposure offset. The setting is only available if the selected DCP has one. !TP_ICM_APPLYBASELINEEXPOSUREOFFSET_TOOLTIP;Employ the embedded DCP baseline exposure offset. The setting is only available if the selected DCP has one.
!TP_ICM_APPLYHUESATMAP;Base table !TP_ICM_APPLYHUESATMAP;Base table
@ -1954,6 +1964,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике <b>-</b>
!TP_METADATA_MODE;Metadata copy mode !TP_METADATA_MODE;Metadata copy mode
!TP_METADATA_STRIP;Strip all metadata !TP_METADATA_STRIP;Strip all metadata
!TP_METADATA_TUNNEL;Copy unchanged !TP_METADATA_TUNNEL;Copy unchanged
!TP_PDSHARPENING_LABEL;Capture Sharpening
!TP_PREPROCESS_DEADPIXFILT;Dead pixel filter !TP_PREPROCESS_DEADPIXFILT;Dead pixel filter
!TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Tries to suppress dead pixels. !TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Tries to suppress dead pixels.
!TP_PREPROCESS_HOTPIXFILT;Hot pixel filter !TP_PREPROCESS_HOTPIXFILT;Hot pixel filter
@ -2119,6 +2130,8 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике <b>-</b>
!TP_RETINEX_VIEW_UNSHARP;Unsharp mask !TP_RETINEX_VIEW_UNSHARP;Unsharp mask
!TP_SHARPENING_BLUR;Blur radius !TP_SHARPENING_BLUR;Blur radius
!TP_SHARPENING_CONTRAST;Contrast threshold !TP_SHARPENING_CONTRAST;Contrast threshold
!TP_SHARPENING_ITERCHECK;Auto limit iterations
!TP_SHARPENING_RADIUS_BOOST;Corner radius boost
!TP_SHARPENMICRO_CONTRAST;Contrast threshold !TP_SHARPENMICRO_CONTRAST;Contrast threshold
!TP_SOFTLIGHT_LABEL;Soft Light !TP_SOFTLIGHT_LABEL;Soft Light
!TP_SOFTLIGHT_STRENGTH;Strength !TP_SOFTLIGHT_STRENGTH;Strength

2310
rtdata/languages/Slovenian Normal file

File diff suppressed because it is too large Load Diff

View File

@ -698,8 +698,8 @@ MAIN_TOOLTIP_BACKCOLOR1;Bakgrundsfärg: <b>Svart</b>\nKortkommando: <b>9</b>
MAIN_TOOLTIP_BACKCOLOR2;Bakgrundsfärg: <b>Vit</b>\nKortkommando: <b>9</b> MAIN_TOOLTIP_BACKCOLOR2;Bakgrundsfärg: <b>Vit</b>\nKortkommando: <b>9</b>
MAIN_TOOLTIP_BEFOREAFTERLOCK;<b>Lås</b> / <b>Lås upp</b> <b>före-vyn</b>\n\n<b>Lås</b>: behåll <b>före-vyn</b> oförändrad.\nAnvändbart för att utvärdera den sammanlagda effekten av flera stegs redigering. Dessutom kan jämförelser göras gentemot varje annat steg i historiken.\n\n<b>Lås upp</b>: <b>Före-vyn</b> kommer hela tiden visa ett tidigare steg jämfört med <b>efter-vyn</b>, och visar därmed effekten av det verktyg som användes senast. MAIN_TOOLTIP_BEFOREAFTERLOCK;<b>Lås</b> / <b>Lås upp</b> <b>före-vyn</b>\n\n<b>Lås</b>: behåll <b>före-vyn</b> oförändrad.\nAnvändbart för att utvärdera den sammanlagda effekten av flera stegs redigering. Dessutom kan jämförelser göras gentemot varje annat steg i historiken.\n\n<b>Lås upp</b>: <b>Före-vyn</b> kommer hela tiden visa ett tidigare steg jämfört med <b>efter-vyn</b>, och visar därmed effekten av det verktyg som användes senast.
MAIN_TOOLTIP_HIDEHP;Visa/göm den vänstra panelen. Kortkommando: <b>l</b> MAIN_TOOLTIP_HIDEHP;Visa/göm den vänstra panelen. Kortkommando: <b>l</b>
MAIN_TOOLTIP_INDCLIPPEDH;Markera högdagerindikation.\nKortkommando: <b>&lt;</b> MAIN_TOOLTIP_INDCLIPPEDH;Markera högdagerindikation.\nKortkommando: <b>&gt;</b>
MAIN_TOOLTIP_INDCLIPPEDS;Markera skuggindikation.\nKortkommando: <b>&gt;</b> MAIN_TOOLTIP_INDCLIPPEDS;Markera skuggindikation.\nKortkommando: <b>&lt;</b>
MAIN_TOOLTIP_PREVIEWB;Förhandsgranska den <b>blå kanalen</b>.\nGenväg: <b>b</b> MAIN_TOOLTIP_PREVIEWB;Förhandsgranska den <b>blå kanalen</b>.\nGenväg: <b>b</b>
MAIN_TOOLTIP_PREVIEWFOCUSMASK;Förhandsgranska <b>fokusmasken</b>.\nKortkommando: <b>Shift-f</b>\n\nNoggrannare på bilder med kort skärpedjup, lågt brus och där en hög zoom-grad är vald.\n\nFör att förbättra detekteringen för brusiga bilder, utvärdera vid en zoom-grad om 10-30%\n\nFörhandsvisningen görs långsammare med fokusmasken påslagen. MAIN_TOOLTIP_PREVIEWFOCUSMASK;Förhandsgranska <b>fokusmasken</b>.\nKortkommando: <b>Shift-f</b>\n\nNoggrannare på bilder med kort skärpedjup, lågt brus och där en hög zoom-grad är vald.\n\nFör att förbättra detekteringen för brusiga bilder, utvärdera vid en zoom-grad om 10-30%\n\nFörhandsvisningen görs långsammare med fokusmasken påslagen.
MAIN_TOOLTIP_PREVIEWG;Förhandsgranska den <b>gröna kanalen</b>.\nGenväg: <b>g</b> MAIN_TOOLTIP_PREVIEWG;Förhandsgranska den <b>gröna kanalen</b>.\nGenväg: <b>g</b>
@ -1842,6 +1842,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: <b>-</b>
!HISTORY_MSG_491;White Balance !HISTORY_MSG_491;White Balance
!HISTORY_MSG_492;RGB Curves !HISTORY_MSG_492;RGB Curves
!HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_MSG_493;L*a*b* Adjustments
!HISTORY_MSG_494;Capture Sharpening
!HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors
!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction
!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction !HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction
@ -1859,6 +1860,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: <b>-</b>
!HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope !HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope
!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth !HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth
!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal !HISTORY_MSG_DEHAZE_ENABLED;Haze Removal
!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only
!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map !HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map
!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength !HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength
!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold !HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold
@ -1879,6 +1881,13 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: <b>-</b>
!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius
!HISTORY_MSG_METADATA_MODE;Metadata copy mode !HISTORY_MSG_METADATA_MODE;Metadata copy mode
!HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold !HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold
!HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold
!HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius
!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations
!HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold
!HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations
!HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius
!HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost
!HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion !HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion
!HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction !HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction
!HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter
@ -2100,6 +2109,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: <b>-</b>
!TP_CROP_SELECTCROP;Select !TP_CROP_SELECTCROP;Select
!TP_DEHAZE_DEPTH;Depth !TP_DEHAZE_DEPTH;Depth
!TP_DEHAZE_LABEL;Haze Removal !TP_DEHAZE_LABEL;Haze Removal
!TP_DEHAZE_LUMINANCE;Luminance only
!TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map !TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map
!TP_DEHAZE_STRENGTH;Strength !TP_DEHAZE_STRENGTH;Strength
!TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones
@ -2122,12 +2132,12 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: <b>-</b>
!TP_EXPOSURE_HISTMATCHING_TOOLTIP;Automatically adjust sliders and curves (except exposure compensation) to match the look of the embedded JPEG thumbnail. !TP_EXPOSURE_HISTMATCHING_TOOLTIP;Automatically adjust sliders and curves (except exposure compensation) to match the look of the embedded JPEG thumbnail.
!TP_FILMNEGATIVE_BLUE;Blue ratio !TP_FILMNEGATIVE_BLUE;Blue ratio
!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) !TP_FILMNEGATIVE_GREEN;Reference exponent (contrast)
!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked. !TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards.
!TP_FILMNEGATIVE_LABEL;Film Negative !TP_FILMNEGATIVE_LABEL;Film Negative
!TP_FILMNEGATIVE_PICK;Pick white and black spots !TP_FILMNEGATIVE_PICK;Pick neutral spots
!TP_FILMNEGATIVE_RED;Red ratio !TP_FILMNEGATIVE_RED;Red ratio
!TP_FLATFIELD_CLIPCONTROL;Clip control !TP_FLATFIELD_CLIPCONTROL;Clip control
!TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, clip control can lead to color cast. !TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, value 0 is used.
!TP_ICM_APPLYBASELINEEXPOSUREOFFSET_TOOLTIP;Employ the embedded DCP baseline exposure offset. The setting is only available if the selected DCP has one. !TP_ICM_APPLYBASELINEEXPOSUREOFFSET_TOOLTIP;Employ the embedded DCP baseline exposure offset. The setting is only available if the selected DCP has one.
!TP_ICM_APPLYHUESATMAP_TOOLTIP;Employ the embedded DCP base table (HueSatMap). The setting is only available if the selected DCP has one. !TP_ICM_APPLYHUESATMAP_TOOLTIP;Employ the embedded DCP base table (HueSatMap). The setting is only available if the selected DCP has one.
!TP_ICM_APPLYLOOKTABLE;Look table !TP_ICM_APPLYLOOKTABLE;Look table
@ -2157,6 +2167,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: <b>-</b>
!TP_METADATA_MODE;Metadata copy mode !TP_METADATA_MODE;Metadata copy mode
!TP_METADATA_STRIP;Strip all metadata !TP_METADATA_STRIP;Strip all metadata
!TP_METADATA_TUNNEL;Copy unchanged !TP_METADATA_TUNNEL;Copy unchanged
!TP_PDSHARPENING_LABEL;Capture Sharpening
!TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction !TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction
!TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both !TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both
!TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal !TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal
@ -2246,6 +2257,8 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: <b>-</b>
!TP_RETINEX_VIEW_METHOD_TOOLTIP;Standard - Normal display.\nMask - Displays the mask.\nUnsharp mask - Displays the image with a high radius unsharp mask.\nTransmission - Auto/Fixed - Displays the file transmission-map, before any action on contrast and brightness.\n\nAttention: the mask does not correspond to reality, but is amplified to make it more visible. !TP_RETINEX_VIEW_METHOD_TOOLTIP;Standard - Normal display.\nMask - Displays the mask.\nUnsharp mask - Displays the image with a high radius unsharp mask.\nTransmission - Auto/Fixed - Displays the file transmission-map, before any action on contrast and brightness.\n\nAttention: the mask does not correspond to reality, but is amplified to make it more visible.
!TP_SHARPENING_BLUR;Blur radius !TP_SHARPENING_BLUR;Blur radius
!TP_SHARPENING_CONTRAST;Contrast threshold !TP_SHARPENING_CONTRAST;Contrast threshold
!TP_SHARPENING_ITERCHECK;Auto limit iterations
!TP_SHARPENING_RADIUS_BOOST;Corner radius boost
!TP_SHARPENMICRO_CONTRAST;Contrast threshold !TP_SHARPENMICRO_CONTRAST;Contrast threshold
!TP_SOFTLIGHT_LABEL;Soft Light !TP_SOFTLIGHT_LABEL;Soft Light
!TP_SOFTLIGHT_STRENGTH;Strength !TP_SOFTLIGHT_STRENGTH;Strength

View File

@ -744,6 +744,7 @@ HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - region show mask
HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope
HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth
HISTORY_MSG_DEHAZE_ENABLED;Haze Removal HISTORY_MSG_DEHAZE_ENABLED;Haze Removal
HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only
HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map
HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength
HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold
@ -764,12 +765,13 @@ HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness
HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius
HISTORY_MSG_METADATA_MODE;Metadata copy mode HISTORY_MSG_METADATA_MODE;Metadata copy mode
HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold
HISTORY_MSG_PDSHARPEN_CONTRAST;CAS - Contrast threshold HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold
HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CAS - Auto threshold HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius
HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CAS - Auto radius HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations
HISTORY_MSG_PDSHARPEN_GAMMA;CAS - Gamma HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold
HISTORY_MSG_PDSHARPEN_ITERATIONS;CAS - Iterations HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations
HISTORY_MSG_PDSHARPEN_RADIUS;CAS - Radius HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius
HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost
HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion
HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction
HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter
@ -780,7 +782,6 @@ HISTORY_MSG_RAW_BORDER;Raw border
HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling
HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius
HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold
HISTORY_MSG_SHARPENING_GAMMA;Sharpening - Gamma
HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace
HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light
HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength
@ -938,8 +939,8 @@ MAIN_TOOLTIP_BACKCOLOR2;Background color of the preview: <b>white</b>\nShortcut:
MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: <b>middle grey</b>\nShortcut: <b>9</b> MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: <b>middle grey</b>\nShortcut: <b>9</b>
MAIN_TOOLTIP_BEFOREAFTERLOCK;<b>Lock</b> / <b>Unlock</b> the <b>Before</b> view\n\n<b>Lock</b>: keep the <b>Before</b> view unchanged.\nUseful to evaluate the cumulative effect of multiple tools.\nAdditionally, comparisons can be made to any state in the History.\n\n<b>Unlock</b>: the <b>Before</b> view will follow the <b>After</b> view one step behind, showing the image before the effect of the currently used tool. MAIN_TOOLTIP_BEFOREAFTERLOCK;<b>Lock</b> / <b>Unlock</b> the <b>Before</b> view\n\n<b>Lock</b>: keep the <b>Before</b> view unchanged.\nUseful to evaluate the cumulative effect of multiple tools.\nAdditionally, comparisons can be made to any state in the History.\n\n<b>Unlock</b>: the <b>Before</b> view will follow the <b>After</b> view one step behind, showing the image before the effect of the currently used tool.
MAIN_TOOLTIP_HIDEHP;Show/Hide the left panel (including the history).\nShortcut: <b>l</b> MAIN_TOOLTIP_HIDEHP;Show/Hide the left panel (including the history).\nShortcut: <b>l</b>
MAIN_TOOLTIP_INDCLIPPEDH;Clipped highlight indication.\nShortcut: <b>&lt;</b> MAIN_TOOLTIP_INDCLIPPEDH;Clipped highlight indication.\nShortcut: <b>&gt;</b>
MAIN_TOOLTIP_INDCLIPPEDS;Clipped shadow indication.\nShortcut: <b>&gt;</b> MAIN_TOOLTIP_INDCLIPPEDS;Clipped shadow indication.\nShortcut: <b>&lt;</b>
MAIN_TOOLTIP_PREVIEWB;Preview the <b>blue channel</b>.\nShortcut: <b>b</b> MAIN_TOOLTIP_PREVIEWB;Preview the <b>blue channel</b>.\nShortcut: <b>b</b>
MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the <b>focus mask</b>.\nShortcut: <b>Shift-f</b>\n\nMore accurate on images with shallow depth of field, low noise and at higher zoom levels.\nZoom out to 10-30% to improve detection accuracy on noisy images. MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the <b>focus mask</b>.\nShortcut: <b>Shift-f</b>\n\nMore accurate on images with shallow depth of field, low noise and at higher zoom levels.\nZoom out to 10-30% to improve detection accuracy on noisy images.
MAIN_TOOLTIP_PREVIEWG;Preview the <b>green channel</b>.\nShortcut: <b>g</b> MAIN_TOOLTIP_PREVIEWG;Preview the <b>green channel</b>.\nShortcut: <b>g</b>
@ -1540,6 +1541,7 @@ TP_DEFRINGE_RADIUS;Radius
TP_DEFRINGE_THRESHOLD;Threshold TP_DEFRINGE_THRESHOLD;Threshold
TP_DEHAZE_DEPTH;Depth TP_DEHAZE_DEPTH;Depth
TP_DEHAZE_LABEL;Haze Removal TP_DEHAZE_LABEL;Haze Removal
TP_DEHAZE_LUMINANCE;Luminance only
TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map
TP_DEHAZE_STRENGTH;Strength TP_DEHAZE_STRENGTH;Strength
TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones
@ -1650,9 +1652,9 @@ TP_EXPOS_BLACKPOINT_LABEL;Raw Black Points
TP_EXPOS_WHITEPOINT_LABEL;Raw White Points TP_EXPOS_WHITEPOINT_LABEL;Raw White Points
TP_FILMNEGATIVE_BLUE;Blue ratio TP_FILMNEGATIVE_BLUE;Blue ratio
TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) TP_FILMNEGATIVE_GREEN;Reference exponent (contrast)
TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked. TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards.
TP_FILMNEGATIVE_LABEL;Film Negative TP_FILMNEGATIVE_LABEL;Film Negative
TP_FILMNEGATIVE_PICK;Pick white and black spots TP_FILMNEGATIVE_PICK;Pick neutral spots
TP_FILMNEGATIVE_RED;Red ratio TP_FILMNEGATIVE_RED;Red ratio
TP_FILMSIMULATION_LABEL;Film Simulation TP_FILMSIMULATION_LABEL;Film Simulation
TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now? TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now?
@ -1666,7 +1668,7 @@ TP_FLATFIELD_BT_HORIZONTAL;Horizontal
TP_FLATFIELD_BT_VERTHORIZ;Vertical + Horizontal TP_FLATFIELD_BT_VERTHORIZ;Vertical + Horizontal
TP_FLATFIELD_BT_VERTICAL;Vertical TP_FLATFIELD_BT_VERTICAL;Vertical
TP_FLATFIELD_CLIPCONTROL;Clip control TP_FLATFIELD_CLIPCONTROL;Clip control
TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, clip control can lead to color cast. TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, value 0 is used.
TP_FLATFIELD_LABEL;Flat-Field TP_FLATFIELD_LABEL;Flat-Field
TP_GENERAL_11SCALE_TOOLTIP;The effects of this tool are only visible or only accurate at a preview scale of 1:1. TP_GENERAL_11SCALE_TOOLTIP;The effects of this tool are only visible or only accurate at a preview scale of 1:1.
TP_GRADIENT_CENTER;Center TP_GRADIENT_CENTER;Center
@ -1803,7 +1805,6 @@ TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Roundness:\n0 = rectangle,\n50 = fitted ellipse,
TP_PCVIGNETTE_STRENGTH;Strength TP_PCVIGNETTE_STRENGTH;Strength
TP_PCVIGNETTE_STRENGTH_TOOLTIP;Filter strength in stops (reached in corners). TP_PCVIGNETTE_STRENGTH_TOOLTIP;Filter strength in stops (reached in corners).
TP_PDSHARPENING_LABEL;Capture Sharpening TP_PDSHARPENING_LABEL;Capture Sharpening
TP_PDSHARPENING_AUTORADIUS_TOOLTIP;If the checkbox is checked, RawTherapee calculates a value based on the raw data of the image.
TP_PERSPECTIVE_HORIZONTAL;Horizontal TP_PERSPECTIVE_HORIZONTAL;Horizontal
TP_PERSPECTIVE_LABEL;Perspective TP_PERSPECTIVE_LABEL;Perspective
TP_PERSPECTIVE_VERTICAL;Vertical TP_PERSPECTIVE_VERTICAL;Vertical
@ -2032,13 +2033,14 @@ TP_SHARPENING_BLUR;Blur radius
TP_SHARPENING_CONTRAST;Contrast threshold TP_SHARPENING_CONTRAST;Contrast threshold
TP_SHARPENING_EDRADIUS;Radius TP_SHARPENING_EDRADIUS;Radius
TP_SHARPENING_EDTOLERANCE;Edge tolerance TP_SHARPENING_EDTOLERANCE;Edge tolerance
TP_SHARPENING_GAMMA;Gamma
TP_SHARPENING_HALOCONTROL;Halo control TP_SHARPENING_HALOCONTROL;Halo control
TP_SHARPENING_HCAMOUNT;Amount TP_SHARPENING_HCAMOUNT;Amount
TP_SHARPENING_ITERCHECK;Auto limit iterations
TP_SHARPENING_LABEL;Sharpening TP_SHARPENING_LABEL;Sharpening
TP_SHARPENING_METHOD;Method TP_SHARPENING_METHOD;Method
TP_SHARPENING_ONLYEDGES;Sharpen only edges TP_SHARPENING_ONLYEDGES;Sharpen only edges
TP_SHARPENING_RADIUS;Radius TP_SHARPENING_RADIUS;Radius
TP_SHARPENING_RADIUS_BOOST;Corner radius boost
TP_SHARPENING_RLD;RL Deconvolution TP_SHARPENING_RLD;RL Deconvolution
TP_SHARPENING_RLD_AMOUNT;Amount TP_SHARPENING_RLD_AMOUNT;Amount
TP_SHARPENING_RLD_DAMPING;Damping TP_SHARPENING_RLD_DAMPING;Damping

View File

@ -12,8 +12,8 @@ MultiUser=true
[File Browser] [File Browser]
# Image filename extensions to be looked for, and their corresponding search state (0/1 -> skip/include) # Image filename extensions to be looked for, and their corresponding search state (0/1 -> skip/include)
ParseExtensions=3fr;arw;arq;cr2;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f; ParseExtensions=3fr;arw;arq;cr2;cr3;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f;
ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;1;1;1;1;1;1;1;1;1;1; ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;1;1;1;1;1;1;1;1;1;1;
[Output] [Output]
PathTemplate=%p1/converted/%f PathTemplate=%p1/converted/%f

View File

@ -12,8 +12,8 @@ MultiUser=true
[File Browser] [File Browser]
# Image filename extensions to be looked for, and their corresponding search state (0/1 -> skip/include) # Image filename extensions to be looked for, and their corresponding search state (0/1 -> skip/include)
ParseExtensions=3fr;arw;arq;cr2;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f; ParseExtensions=3fr;arw;arq;cr2;cr3;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f;
ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;1;1;1;1;1;1;1;1;1;1; ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;1;1;1;1;1;1;1;1;1;1;
[Output] [Output]
PathTemplate=%p1/converted/%f PathTemplate=%p1/converted/%f

View File

@ -14,8 +14,8 @@ UseSystemTheme=false
[File Browser] [File Browser]
# Image filename extensions to be looked for, and their corresponding search state (0/1 -> skip/include) # Image filename extensions to be looked for, and their corresponding search state (0/1 -> skip/include)
ParseExtensions=3fr;arw;arq;cr2;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f; ParseExtensions=3fr;arw;arq;cr2;cr3;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f;
ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;1;1;1;1;1;1;1;1;1;1; ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;1;1;1;1;1;1;1;1;1;1;
[Output] [Output]
PathTemplate=%p1/converted/%f PathTemplate=%p1/converted/%f

View File

@ -21,3 +21,6 @@ DCPIlluminant=0
[RAW] [RAW]
CA=true CA=true
[PostDemosaicSharpening]
Enabled=true

View File

@ -1,18 +1,8 @@
[Sharpening] [Sharpening]
Enabled=true Enabled=false
Contrast=5
Method=rld
DeconvRadius=0.75
DeconvAmount=100
DeconvDamping=0
DeconvIterations=30
[SharpenMicro] [SharpenMicro]
Enabled=true Enabled=false
Contrast=15
Matrix=false
Strength=20
Uniformity=5
[RAW] [RAW]
CA=true CA=true
@ -38,3 +28,6 @@ pixelShiftBlur=true
pixelShiftSmoothFactor=0.69999999999999996 pixelShiftSmoothFactor=0.69999999999999996
pixelShiftLmmse=false pixelShiftLmmse=false
pixelShiftNonGreenCross=true pixelShiftNonGreenCross=true
[PostDemosaicSharpening]
Enabled=true

View File

@ -1,18 +1,8 @@
[Sharpening] [Sharpening]
Enabled=true Enabled=false
Contrast=5
Method=rld
DeconvRadius=0.75
DeconvAmount=100
DeconvDamping=0
DeconvIterations=30
[SharpenMicro] [SharpenMicro]
Enabled=true Enabled=false
Contrast=15
Matrix=false
Strength=20
Uniformity=5
[RAW] [RAW]
CA=true CA=true
@ -22,3 +12,6 @@ Method=pixelshift
PixelShiftMotion=0 PixelShiftMotion=0
PixelShiftMotionCorrection=5 PixelShiftMotionCorrection=5
PixelShiftMotionCorrectionMethod=0 PixelShiftMotionCorrectionMethod=0
[PostDemosaicSharpening]
Enabled=true

View File

@ -23,3 +23,6 @@ DCPIlluminant=0
[RAW] [RAW]
CA=true CA=true
[PostDemosaicSharpening]
Enabled=true

View File

@ -2,7 +2,7 @@
Type=Application Type=Application
Version=1.0 Version=1.0
Name=RawTherapee Name=RawTherapee
GenericName=Raw photo editor GenericName=Raw Photo Editor
GenericName[cs]=Editor raw obrázků GenericName[cs]=Editor raw obrázků
GenericName[fr]=Éditeur d'images raw GenericName[fr]=Éditeur d'images raw
GenericName[pl]=Edytor zdjęć raw GenericName[pl]=Edytor zdjęć raw
@ -11,9 +11,11 @@ Comment[cs]=Program pro konverzi a zpracování digitálních raw fotografií
Comment[fr]=Logiciel de conversion et de traitement de photos numériques de format raw (but de capteur) Comment[fr]=Logiciel de conversion et de traitement de photos numériques de format raw (but de capteur)
Comment[pl]=Zaawansowany program do wywoływania zdjęć typu raw Comment[pl]=Zaawansowany program do wywoływania zdjęć typu raw
Icon=rawtherapee Icon=rawtherapee
TryExec=rawtherapee
Exec=rawtherapee %f Exec=rawtherapee %f
Terminal=false Terminal=false
MimeType=image/jpeg;image/png;image/tiff;image/x-adobe-dng;image/x-canon-cr2;image/x-canon-crf;image/x-canon-crw;image/x-fuji-raf;image/x-hasselblad-3fr;image/x-hasselblad-fff;image/x-jpg;image/x-kodak-dcr;image/x-kodak-k25;image/x-kodak-kdc;image/x-leaf-mos;image/x-leica-rwl;image/x-mamiya-mef;image/x-minolta-mrw;image/x-nikon-nef;image/x-nikon-nrw;image/x-olympus-orf;image/x-panasonic-raw;image/x-panasonic-rw2;image/x-pentax-pef;image/x-pentax-raw;image/x-phaseone-iiq;image/x-raw;image/x-rwz;image/x-samsung-srw;image/x-sigma-x3f;image/x-sony-arq;image/x-sony-arw;image/x-sony-sr2;image/x-sony-srf;image/x-tif; MimeType=image/jpeg;image/png;image/tiff;image/x-adobe-dng;image/x-canon-cr2;image/x-canon-crf;image/x-canon-crw;image/x-fuji-raf;image/x-hasselblad-3fr;image/x-hasselblad-fff;image/x-jpg;image/x-kodak-dcr;image/x-kodak-k25;image/x-kodak-kdc;image/x-leaf-mos;image/x-leica-rwl;image/x-mamiya-mef;image/x-minolta-mrw;image/x-nikon-nef;image/x-nikon-nrw;image/x-olympus-orf;image/x-panasonic-raw;image/x-panasonic-rw2;image/x-pentax-pef;image/x-pentax-raw;image/x-phaseone-iiq;image/x-raw;image/x-rwz;image/x-samsung-srw;image/x-sigma-x3f;image/x-sony-arq;image/x-sony-arw;image/x-sony-sr2;image/x-sony-srf;image/x-tif;
Categories=Photography;Graphics;2DGraphics;RasterGraphics;GTK; Categories=Graphics;Photography;2DGraphics;RasterGraphics;GTK;
Keywords=raw;photography;develop;pp3;graphics; Keywords=raw;photo;photography;develop;pp3;graphics;
StartupNotify=true
StartupWMClass=rawtherapee StartupWMClass=rawtherapee

View File

@ -28,6 +28,14 @@
#include "gauss.h" #include "gauss.h"
#include "median.h" #include "median.h"
#include "StopWatch.h" #include "StopWatch.h"
namespace
{
unsigned fc(const unsigned int cfa[2][2], int r, int c) {
return cfa[r & 1][c & 1];
}
}
namespace { namespace {
bool LinEqSolve(int nDim, double* pfMatr, double* pfVect, double* pfSolution) bool LinEqSolve(int nDim, double* pfMatr, double* pfVect, double* pfSolution)
@ -106,10 +114,6 @@ bool LinEqSolve(int nDim, double* pfMatr, double* pfVect, double* pfSolution)
//end of linear equation solver //end of linear equation solver
} }
namespace rtengine {
extern const Settings* settings;
}
using namespace std; using namespace std;
using namespace rtengine; using namespace rtengine;
@ -138,6 +142,7 @@ float* RawImageSource::CA_correct_RT(
} }
// multithreaded and vectorized by Ingo Weyrich // multithreaded and vectorized by Ingo Weyrich
const unsigned int cfa[2][2] = {{FC(0,0), FC(0,1)}, {FC(1,0), FC(1,1)}};
constexpr int ts = 128; constexpr int ts = 128;
constexpr int tsh = ts / 2; constexpr int tsh = ts / 2;
constexpr int cb = 2; // 2 pixels border will be excluded from correction constexpr int cb = 2; // 2 pixels border will be excluded from correction
@ -148,7 +153,7 @@ float* RawImageSource::CA_correct_RT(
// Test for RGB cfa // Test for RGB cfa
for (int i = 0; i < 2; i++) { for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) { for (int j = 0; j < 2; j++) {
if (FC(i, j) == 3) { if (fc(cfa, i, j) == 3) {
std::cout << "CA correction supports only RGB Colour filter arrays" << std::endl; std::cout << "CA correction supports only RGB Colour filter arrays" << std::endl;
return buffer; return buffer;
} }
@ -167,7 +172,7 @@ float* RawImageSource::CA_correct_RT(
#pragma omp parallel for #pragma omp parallel for
#endif #endif
for (int i = cb; i < H - cb; ++i) { for (int i = cb; i < H - cb; ++i) {
for (int j = cb + (FC(i, 0) & 1); j < W - cb; j += 2) { for (int j = cb + (fc(cfa, i, 0) & 1); j < W - cb; j += 2) {
(*oldraw)[i - cb][(j - cb) / 2] = rawData[i][j]; (*oldraw)[i - cb][(j - cb) / 2] = rawData[i][j];
} }
} }
@ -198,7 +203,7 @@ float* RawImageSource::CA_correct_RT(
//block CA shift values and weight assigned to block //block CA shift values and weight assigned to block
float* const blockwt = buffer + (height * width); float* const blockwt = buffer + (height * width);
memset(blockwt, 0, vblsz * hblsz * (2 * 2 + 1) * sizeof(float)); memset(blockwt, 0, static_cast<unsigned long>(vblsz) * hblsz * (2 * 2 + 1) * sizeof(float));
float (*blockshifts)[2][2] = (float (*)[2][2])(blockwt + vblsz * hblsz); float (*blockshifts)[2][2] = (float (*)[2][2])(blockwt + vblsz * hblsz);
// Because we can't break parallel processing, we need a switch do handle the errors // Because we can't break parallel processing, we need a switch do handle the errors
@ -320,12 +325,12 @@ float* RawImageSource::CA_correct_RT(
int cc = ccmin; int cc = ccmin;
int col = cc + left; int col = cc + left;
#ifdef __SSE2__ #ifdef __SSE2__
int c0 = FC(rr, cc); int c0 = fc(cfa, rr, cc);
if (c0 == 1) { if (c0 == 1) {
rgb[c0][rr * ts + cc] = rawData[row][col] / 65535.f; rgb[c0][rr * ts + cc] = rawData[row][col] / 65535.f;
cc++; cc++;
col++; col++;
c0 = FC(rr, cc); c0 = fc(cfa, rr, cc);
} }
int indx1 = rr * ts + cc; int indx1 = rr * ts + cc;
for (; cc < ccmax - 7; cc+=8, col+=8, indx1 += 8) { for (; cc < ccmax - 7; cc+=8, col+=8, indx1 += 8) {
@ -338,7 +343,7 @@ float* RawImageSource::CA_correct_RT(
} }
#endif #endif
for (; cc < ccmax; cc++, col++) { for (; cc < ccmax; cc++, col++) {
int c = FC(rr, cc); int c = fc(cfa, rr, cc);
int indx1 = rr * ts + cc; int indx1 = rr * ts + cc;
rgb[c][indx1 >> ((c & 1) ^ 1)] = rawData[row][col] / 65535.f; rgb[c][indx1 >> ((c & 1) ^ 1)] = rawData[row][col] / 65535.f;
} }
@ -348,7 +353,7 @@ float* RawImageSource::CA_correct_RT(
if (rrmin > 0) { if (rrmin > 0) {
for (int rr = 0; rr < border; rr++) { for (int rr = 0; rr < border; rr++) {
for (int cc = ccmin; cc < ccmax; cc++) { for (int cc = ccmin; cc < ccmax; cc++) {
int c = FC(rr, cc); int c = fc(cfa, rr, cc);
rgb[c][(rr * ts + cc) >> ((c & 1) ^ 1)] = rgb[c][((border2 - rr) * ts + cc) >> ((c & 1) ^ 1)]; rgb[c][(rr * ts + cc) >> ((c & 1) ^ 1)] = rgb[c][((border2 - rr) * ts + cc) >> ((c & 1) ^ 1)];
} }
} }
@ -357,7 +362,7 @@ float* RawImageSource::CA_correct_RT(
if (rrmax < rr1) { if (rrmax < rr1) {
for (int rr = 0; rr < border; rr++) { for (int rr = 0; rr < border; rr++) {
for (int cc = ccmin; cc < ccmax; cc++) { for (int cc = ccmin; cc < ccmax; cc++) {
int c = FC(rr, cc); int c = fc(cfa, rr, cc);
rgb[c][((rrmax + rr)*ts + cc) >> ((c & 1) ^ 1)] = rawData[(height - rr - 2)][left + cc] / 65535.f; rgb[c][((rrmax + rr)*ts + cc) >> ((c & 1) ^ 1)] = rawData[(height - rr - 2)][left + cc] / 65535.f;
} }
} }
@ -366,7 +371,7 @@ float* RawImageSource::CA_correct_RT(
if (ccmin > 0) { if (ccmin > 0) {
for (int rr = rrmin; rr < rrmax; rr++) { for (int rr = rrmin; rr < rrmax; rr++) {
for (int cc = 0; cc < border; cc++) { for (int cc = 0; cc < border; cc++) {
int c = FC(rr, cc); int c = fc(cfa, rr, cc);
rgb[c][(rr * ts + cc) >> ((c & 1) ^ 1)] = rgb[c][(rr * ts + border2 - cc) >> ((c & 1) ^ 1)]; rgb[c][(rr * ts + cc) >> ((c & 1) ^ 1)] = rgb[c][(rr * ts + border2 - cc) >> ((c & 1) ^ 1)];
} }
} }
@ -375,7 +380,7 @@ float* RawImageSource::CA_correct_RT(
if (ccmax < cc1) { if (ccmax < cc1) {
for (int rr = rrmin; rr < rrmax; rr++) { for (int rr = rrmin; rr < rrmax; rr++) {
for (int cc = 0; cc < border; cc++) { for (int cc = 0; cc < border; cc++) {
int c = FC(rr, cc); int c = fc(cfa, rr, cc);
rgb[c][(rr * ts + ccmax + cc) >> ((c & 1) ^ 1)] = rawData[(top + rr)][(width - cc - 2)] / 65535.f; rgb[c][(rr * ts + ccmax + cc) >> ((c & 1) ^ 1)] = rawData[(top + rr)][(width - cc - 2)] / 65535.f;
} }
} }
@ -385,7 +390,7 @@ float* RawImageSource::CA_correct_RT(
if (rrmin > 0 && ccmin > 0) { if (rrmin > 0 && ccmin > 0) {
for (int rr = 0; rr < border; rr++) { for (int rr = 0; rr < border; rr++) {
for (int cc = 0; cc < border; cc++) { for (int cc = 0; cc < border; cc++) {
int c = FC(rr, cc); int c = fc(cfa, rr, cc);
rgb[c][(rr * ts + cc) >> ((c & 1) ^ 1)] = rawData[border2 - rr][border2 - cc] / 65535.f; rgb[c][(rr * ts + cc) >> ((c & 1) ^ 1)] = rawData[border2 - rr][border2 - cc] / 65535.f;
} }
} }
@ -394,7 +399,7 @@ float* RawImageSource::CA_correct_RT(
if (rrmax < rr1 && ccmax < cc1) { if (rrmax < rr1 && ccmax < cc1) {
for (int rr = 0; rr < border; rr++) { for (int rr = 0; rr < border; rr++) {
for (int cc = 0; cc < border; cc++) { for (int cc = 0; cc < border; cc++) {
int c = FC(rr, cc); int c = fc(cfa, rr, cc);
rgb[c][((rrmax + rr)*ts + ccmax + cc) >> ((c & 1) ^ 1)] = rawData[(height - rr - 2)][(width - cc - 2)] / 65535.f; rgb[c][((rrmax + rr)*ts + ccmax + cc) >> ((c & 1) ^ 1)] = rawData[(height - rr - 2)][(width - cc - 2)] / 65535.f;
} }
} }
@ -403,7 +408,7 @@ float* RawImageSource::CA_correct_RT(
if (rrmin > 0 && ccmax < cc1) { if (rrmin > 0 && ccmax < cc1) {
for (int rr = 0; rr < border; rr++) { for (int rr = 0; rr < border; rr++) {
for (int cc = 0; cc < border; cc++) { for (int cc = 0; cc < border; cc++) {
int c = FC(rr, cc); int c = fc(cfa, rr, cc);
rgb[c][(rr * ts + ccmax + cc) >> ((c & 1) ^ 1)] = rawData[(border2 - rr)][(width - cc - 2)] / 65535.f; rgb[c][(rr * ts + ccmax + cc) >> ((c & 1) ^ 1)] = rawData[(border2 - rr)][(width - cc - 2)] / 65535.f;
} }
} }
@ -412,7 +417,7 @@ float* RawImageSource::CA_correct_RT(
if (rrmax < rr1 && ccmin > 0) { if (rrmax < rr1 && ccmin > 0) {
for (int rr = 0; rr < border; rr++) { for (int rr = 0; rr < border; rr++) {
for (int cc = 0; cc < border; cc++) { for (int cc = 0; cc < border; cc++) {
int c = FC(rr, cc); int c = fc(cfa, rr, cc);
rgb[c][((rrmax + rr)*ts + cc) >> ((c & 1) ^ 1)] = rawData[(height - rr - 2)][(border2 - cc)] / 65535.f; rgb[c][((rrmax + rr)*ts + cc) >> ((c & 1) ^ 1)] = rawData[(height - rr - 2)][(border2 - cc)] / 65535.f;
} }
} }
@ -427,9 +432,9 @@ float* RawImageSource::CA_correct_RT(
#endif #endif
for (int rr = 3; rr < rr1 - 3; rr++) { for (int rr = 3; rr < rr1 - 3; rr++) {
int row = rr + top; int row = rr + top;
int cc = 3 + (FC(rr,3) & 1); int cc = 3 + (fc(cfa, rr,3) & 1);
int indx = rr * ts + cc; int indx = rr * ts + cc;
int c = FC(rr,cc); int c = fc(cfa, rr,cc);
#ifdef __SSE2__ #ifdef __SSE2__
for (; cc < cc1 - 9; cc+=8, indx+=8) { for (; cc < cc1 - 9; cc+=8, indx+=8) {
//compute directional weights using image gradients //compute directional weights using image gradients
@ -463,7 +468,7 @@ float* RawImageSource::CA_correct_RT(
} }
if (row > -1 && row < height) { if (row > -1 && row < height) {
int offset = (FC(row,max(left + 3, 0)) & 1); int offset = (fc(cfa, row,max(left + 3, 0)) & 1);
int col = max(left + 3, 0) + offset; int col = max(left + 3, 0) + offset;
int indx = rr * ts + 3 - (left < 0 ? (left+3) : 0) + offset; int indx = rr * ts + 3 - (left < 0 ? (left+3) : 0) + offset;
#ifdef __SSE2__ #ifdef __SSE2__
@ -481,9 +486,9 @@ float* RawImageSource::CA_correct_RT(
vfloat zd25v = F2V(0.25f); vfloat zd25v = F2V(0.25f);
#endif #endif
for (int rr = 4; rr < rr1 - 4; rr++) { for (int rr = 4; rr < rr1 - 4; rr++) {
int cc = 4 + (FC(rr, 2) & 1); int cc = 4 + (fc(cfa, rr, 2) & 1);
int indx = rr * ts + cc; int indx = rr * ts + cc;
int c = FC(rr, cc); int c = fc(cfa, rr, cc);
#ifdef __SSE2__ #ifdef __SSE2__
for (; cc < cc1 - 10; cc += 8, indx += 8) { for (; cc < cc1 - 10; cc += 8, indx += 8) {
vfloat rgb1v = LC2VFU(rgb[1][indx]); vfloat rgb1v = LC2VFU(rgb[1][indx]);
@ -547,9 +552,9 @@ float* RawImageSource::CA_correct_RT(
// along line segments, find the point along each segment that minimizes the colour variance // along line segments, find the point along each segment that minimizes the colour variance
// averaged over the tile; evaluate for up/down and left/right away from R/B grid point // averaged over the tile; evaluate for up/down and left/right away from R/B grid point
for (int rr = 8; rr < rr1 - 8; rr++) { for (int rr = 8; rr < rr1 - 8; rr++) {
int cc = 8 + (FC(rr, 2) & 1); int cc = 8 + (fc(cfa, rr, 2) & 1);
int indx = rr * ts + cc; int indx = rr * ts + cc;
int c = FC(rr, cc); int c = fc(cfa, rr, cc);
#ifdef __SSE2__ #ifdef __SSE2__
vfloat coeff00v = ZEROV; vfloat coeff00v = ZEROV;
vfloat coeff01v = ZEROV; vfloat coeff01v = ZEROV;
@ -871,14 +876,14 @@ float* RawImageSource::CA_correct_RT(
int indx = row * width + col; int indx = row * width + col;
int indx1 = rr * ts + cc; int indx1 = rr * ts + cc;
#ifdef __SSE2__ #ifdef __SSE2__
int c = FC(rr, cc); int c = fc(cfa, rr, cc);
if (c & 1) { if (c & 1) {
rgb[1][indx1] = rawData[row][col] / 65535.f; rgb[1][indx1] = rawData[row][col] / 65535.f;
indx++; indx++;
indx1++; indx1++;
cc++; cc++;
col++; col++;
c = FC(rr, cc); c = fc(cfa, rr, cc);
} }
for (; cc < ccmax - 7; cc += 8, col += 8, indx += 8, indx1 += 8) { for (; cc < ccmax - 7; cc += 8, col += 8, indx += 8, indx1 += 8) {
vfloat val1v = LVFU(rawData[row][col]) / c65535v; vfloat val1v = LVFU(rawData[row][col]) / c65535v;
@ -890,7 +895,7 @@ float* RawImageSource::CA_correct_RT(
} }
#endif #endif
for (; cc < ccmax; cc++, col++, indx++, indx1++) { for (; cc < ccmax; cc++, col++, indx++, indx1++) {
int c = FC(rr, cc); int c = fc(cfa, rr, cc);
rgb[c][indx1 >> ((c & 1) ^ 1)] = rawData[row][col] / 65535.f; rgb[c][indx1 >> ((c & 1) ^ 1)] = rawData[row][col] / 65535.f;
if ((c & 1) == 0) { if ((c & 1) == 0) {
@ -903,7 +908,7 @@ float* RawImageSource::CA_correct_RT(
if (rrmin > 0) { if (rrmin > 0) {
for (int rr = 0; rr < border; rr++) { for (int rr = 0; rr < border; rr++) {
for (int cc = ccmin; cc < ccmax; cc++) { for (int cc = ccmin; cc < ccmax; cc++) {
int c = FC(rr, cc); int c = fc(cfa, rr, cc);
rgb[c][(rr * ts + cc) >> ((c & 1) ^ 1)] = rgb[c][((border2 - rr) * ts + cc) >> ((c & 1) ^ 1)]; rgb[c][(rr * ts + cc) >> ((c & 1) ^ 1)] = rgb[c][((border2 - rr) * ts + cc) >> ((c & 1) ^ 1)];
rgb[1][rr * ts + cc] = rgb[1][(border2 - rr) * ts + cc]; rgb[1][rr * ts + cc] = rgb[1][(border2 - rr) * ts + cc];
} }
@ -913,7 +918,7 @@ float* RawImageSource::CA_correct_RT(
if (rrmax < rr1) { if (rrmax < rr1) {
for (int rr = 0; rr < std::min(border, rr1 - rrmax); rr++) { for (int rr = 0; rr < std::min(border, rr1 - rrmax); rr++) {
for (int cc = ccmin; cc < ccmax; cc++) { for (int cc = ccmin; cc < ccmax; cc++) {
int c = FC(rr, cc); int c = fc(cfa, rr, cc);
rgb[c][((rrmax + rr)*ts + cc) >> ((c & 1) ^ 1)] = (rawData[(height - rr - 2)][left + cc]) / 65535.f; rgb[c][((rrmax + rr)*ts + cc) >> ((c & 1) ^ 1)] = (rawData[(height - rr - 2)][left + cc]) / 65535.f;
if ((c & 1) == 0) { if ((c & 1) == 0) {
rgb[1][(rrmax + rr)*ts + cc] = Gtmp[((height - rr - 2) * width + left + cc) >> 1]; rgb[1][(rrmax + rr)*ts + cc] = Gtmp[((height - rr - 2) * width + left + cc) >> 1];
@ -925,7 +930,7 @@ float* RawImageSource::CA_correct_RT(
if (ccmin > 0) { if (ccmin > 0) {
for (int rr = rrmin; rr < rrmax; rr++) { for (int rr = rrmin; rr < rrmax; rr++) {
for (int cc = 0; cc < border; cc++) { for (int cc = 0; cc < border; cc++) {
int c = FC(rr, cc); int c = fc(cfa, rr, cc);
rgb[c][(rr * ts + cc) >> ((c & 1) ^ 1)] = rgb[c][(rr * ts + border2 - cc) >> ((c & 1) ^ 1)]; rgb[c][(rr * ts + cc) >> ((c & 1) ^ 1)] = rgb[c][(rr * ts + border2 - cc) >> ((c & 1) ^ 1)];
rgb[1][rr * ts + cc] = rgb[1][rr * ts + border2 - cc]; rgb[1][rr * ts + cc] = rgb[1][rr * ts + border2 - cc];
} }
@ -935,7 +940,7 @@ float* RawImageSource::CA_correct_RT(
if (ccmax < cc1) { if (ccmax < cc1) {
for (int rr = rrmin; rr < rrmax; rr++) { for (int rr = rrmin; rr < rrmax; rr++) {
for (int cc = 0; cc < std::min(border, cc1 - ccmax); cc++) { for (int cc = 0; cc < std::min(border, cc1 - ccmax); cc++) {
int c = FC(rr, cc); int c = fc(cfa, rr, cc);
rgb[c][(rr * ts + ccmax + cc) >> ((c & 1) ^ 1)] = (rawData[(top + rr)][(width - cc - 2)]) / 65535.f; rgb[c][(rr * ts + ccmax + cc) >> ((c & 1) ^ 1)] = (rawData[(top + rr)][(width - cc - 2)]) / 65535.f;
if ((c & 1) == 0) { if ((c & 1) == 0) {
rgb[1][rr * ts + ccmax + cc] = Gtmp[((top + rr) * width + (width - cc - 2)) >> 1]; rgb[1][rr * ts + ccmax + cc] = Gtmp[((top + rr) * width + (width - cc - 2)) >> 1];
@ -948,7 +953,7 @@ float* RawImageSource::CA_correct_RT(
if (rrmin > 0 && ccmin > 0) { if (rrmin > 0 && ccmin > 0) {
for (int rr = 0; rr < border; rr++) { for (int rr = 0; rr < border; rr++) {
for (int cc = 0; cc < border; cc++) { for (int cc = 0; cc < border; cc++) {
int c = FC(rr, cc); int c = fc(cfa, rr, cc);
rgb[c][(rr * ts + cc) >> ((c & 1) ^ 1)] = (rawData[border2 - rr][border2 - cc]) / 65535.f; rgb[c][(rr * ts + cc) >> ((c & 1) ^ 1)] = (rawData[border2 - rr][border2 - cc]) / 65535.f;
if ((c & 1) == 0) { if ((c & 1) == 0) {
rgb[1][rr * ts + cc] = Gtmp[((border2 - rr) * width + border2 - cc) >> 1]; rgb[1][rr * ts + cc] = Gtmp[((border2 - rr) * width + border2 - cc) >> 1];
@ -960,7 +965,7 @@ float* RawImageSource::CA_correct_RT(
if (rrmax < rr1 && ccmax < cc1) { if (rrmax < rr1 && ccmax < cc1) {
for (int rr = 0; rr < std::min(border, rr1 - rrmax); rr++) { for (int rr = 0; rr < std::min(border, rr1 - rrmax); rr++) {
for (int cc = 0; cc < std::min(border, cc1 - ccmax); cc++) { for (int cc = 0; cc < std::min(border, cc1 - ccmax); cc++) {
int c = FC(rr, cc); int c = fc(cfa, rr, cc);
rgb[c][((rrmax + rr)*ts + ccmax + cc) >> ((c & 1) ^ 1)] = (rawData[(height - rr - 2)][(width - cc - 2)]) / 65535.f; rgb[c][((rrmax + rr)*ts + ccmax + cc) >> ((c & 1) ^ 1)] = (rawData[(height - rr - 2)][(width - cc - 2)]) / 65535.f;
if ((c & 1) == 0) { if ((c & 1) == 0) {
rgb[1][(rrmax + rr)*ts + ccmax + cc] = Gtmp[((height - rr - 2) * width + (width - cc - 2)) >> 1]; rgb[1][(rrmax + rr)*ts + ccmax + cc] = Gtmp[((height - rr - 2) * width + (width - cc - 2)) >> 1];
@ -972,7 +977,7 @@ float* RawImageSource::CA_correct_RT(
if (rrmin > 0 && ccmax < cc1) { if (rrmin > 0 && ccmax < cc1) {
for (int rr = 0; rr < border; rr++) { for (int rr = 0; rr < border; rr++) {
for (int cc = 0; cc < std::min(border, cc1 - ccmax); cc++) { for (int cc = 0; cc < std::min(border, cc1 - ccmax); cc++) {
int c = FC(rr, cc); int c = fc(cfa, rr, cc);
rgb[c][(rr * ts + ccmax + cc) >> ((c & 1) ^ 1)] = (rawData[(border2 - rr)][(width - cc - 2)]) / 65535.f; rgb[c][(rr * ts + ccmax + cc) >> ((c & 1) ^ 1)] = (rawData[(border2 - rr)][(width - cc - 2)]) / 65535.f;
if ((c & 1) == 0) { if ((c & 1) == 0) {
rgb[1][rr * ts + ccmax + cc] = Gtmp[((border2 - rr) * width + (width - cc - 2)) >> 1]; rgb[1][rr * ts + ccmax + cc] = Gtmp[((border2 - rr) * width + (width - cc - 2)) >> 1];
@ -984,7 +989,7 @@ float* RawImageSource::CA_correct_RT(
if (rrmax < rr1 && ccmin > 0) { if (rrmax < rr1 && ccmin > 0) {
for (int rr = 0; rr < std::min(border, rr1 - rrmax); rr++) { for (int rr = 0; rr < std::min(border, rr1 - rrmax); rr++) {
for (int cc = 0; cc < border; cc++) { for (int cc = 0; cc < border; cc++) {
int c = FC(rr, cc); int c = fc(cfa, rr, cc);
rgb[c][((rrmax + rr)*ts + cc) >> ((c & 1) ^ 1)] = (rawData[(height - rr - 2)][(border2 - cc)]) / 65535.f; rgb[c][((rrmax + rr)*ts + cc) >> ((c & 1) ^ 1)] = (rawData[(height - rr - 2)][(border2 - cc)]) / 65535.f;
if ((c & 1) == 0) { if ((c & 1) == 0) {
rgb[1][(rrmax + rr)*ts + cc] = Gtmp[((height - rr - 2) * width + (border2 - cc)) >> 1]; rgb[1][(rrmax + rr)*ts + cc] = Gtmp[((height - rr - 2) * width + (border2 - cc)) >> 1];
@ -1001,7 +1006,7 @@ float* RawImageSource::CA_correct_RT(
#endif #endif
//manual CA correction; use red/blue slider values to set CA shift parameters //manual CA correction; use red/blue slider values to set CA shift parameters
for (int rr = 3; rr < rr1 - 3; rr++) { for (int rr = 3; rr < rr1 - 3; rr++) {
int cc = 3 + FC(rr, 1), c = FC(rr,cc), indx = rr * ts + cc; int cc = 3 + fc(cfa, rr, 1), c = fc(cfa, rr,cc), indx = rr * ts + cc;
#ifdef __SSE2__ #ifdef __SSE2__
for (; cc < cc1 - 10; cc += 8, indx += 8) { for (; cc < cc1 - 10; cc += 8, indx += 8) {
//compute directional weights using image gradients //compute directional weights using image gradients
@ -1082,8 +1087,8 @@ float* RawImageSource::CA_correct_RT(
} }
for (int rr = 4; rr < rr1 - 4; rr++) { for (int rr = 4; rr < rr1 - 4; rr++) {
int cc = 4 + (FC(rr, 2) & 1); int cc = 4 + (fc(cfa, rr, 2) & 1);
int c = FC(rr, cc); int c = fc(cfa, rr, cc);
int indx = (rr * ts + cc) >> 1; int indx = (rr * ts + cc) >> 1;
int indxfc = (rr + shiftvfloor[c]) * ts + cc + shifthceil[c]; int indxfc = (rr + shiftvfloor[c]) * ts + cc + shifthceil[c];
int indxff = (rr + shiftvfloor[c]) * ts + cc + shifthfloor[c]; int indxff = (rr + shiftvfloor[c]) * ts + cc + shifthfloor[c];
@ -1132,8 +1137,8 @@ float* RawImageSource::CA_correct_RT(
vfloat epsv = F2V(eps); vfloat epsv = F2V(eps);
#endif #endif
for (int rr = 8; rr < rr1 - 8; rr++) { for (int rr = 8; rr < rr1 - 8; rr++) {
int cc = 8 + (FC(rr, 2) & 1); int cc = 8 + (fc(cfa, rr, 2) & 1);
int c = FC(rr, cc); int c = fc(cfa, rr, cc);
int GRBdir0 = GRBdir[0][c]; int GRBdir0 = GRBdir[0][c];
int GRBdir1 = GRBdir[1][c]; int GRBdir1 = GRBdir[1][c];
#ifdef __SSE2__ #ifdef __SSE2__
@ -1170,7 +1175,7 @@ float* RawImageSource::CA_correct_RT(
STVFU(rgb[c][indx >> 1], RBint); STVFU(rgb[c][indx >> 1], RBint);
} }
#endif #endif
for (int c = FC(rr, cc), indx = rr * ts + cc; cc < cc1 - 8; cc += 2, indx += 2) { for (int c = fc(cfa, rr, cc), indx = rr * ts + cc; cc < cc1 - 8; cc += 2, indx += 2) {
float grbdiffold = rgb[1][indx] - rgb[c][indx >> 1]; float grbdiffold = rgb[1][indx] - rgb[c][indx >> 1];
//interpolate colour difference from optical R/B locations to grid locations //interpolate colour difference from optical R/B locations to grid locations
@ -1212,9 +1217,9 @@ float* RawImageSource::CA_correct_RT(
// copy CA corrected results to temporary image matrix // copy CA corrected results to temporary image matrix
for (int rr = border; rr < rr1 - border; rr++) { for (int rr = border; rr < rr1 - border; rr++) {
int c = FC(rr + top, left + border + (FC(rr + top, 2) & 1)); int c = fc(cfa, rr + top, left + border + (fc(cfa, rr + top, 2) & 1));
int row = rr + top; int row = rr + top;
int cc = border + (FC(rr, 2) & 1); int cc = border + (fc(cfa, rr, 2) & 1);
int indx = (row * width + cc + left) >> 1; int indx = (row * width + cc + left) >> 1;
int indx1 = (rr * ts + cc) >> 1; int indx1 = (rr * ts + cc) >> 1;
#ifdef __SSE2__ #ifdef __SSE2__
@ -1249,7 +1254,7 @@ float* RawImageSource::CA_correct_RT(
#endif #endif
for (int row = cb; row < height - cb; row++) { for (int row = cb; row < height - cb; row++) {
int col = cb + (FC(row, 0) & 1); int col = cb + (fc(cfa, row, 0) & 1);
int indx = (row * width + col) >> 1; int indx = (row * width + col) >> 1;
#ifdef __SSE2__ #ifdef __SSE2__
for (; col < width - 7 - cb; col += 8, indx += 4) { for (; col < width - 7 - cb; col += 8, indx += 4) {
@ -1284,8 +1289,8 @@ float* RawImageSource::CA_correct_RT(
#pragma omp for #pragma omp for
#endif #endif
for (int i = 0; i < H - 2 * cb; ++i) { for (int i = 0; i < H - 2 * cb; ++i) {
const int firstCol = FC(i, 0) & 1; const int firstCol = fc(cfa, i, 0) & 1;
const int colour = FC(i, firstCol); const int colour = fc(cfa, i, firstCol);
const array2D<float>* nonGreen = colour == 0 ? redFactor : blueFactor; const array2D<float>* nonGreen = colour == 0 ? redFactor : blueFactor;
int j = firstCol; int j = firstCol;
#ifdef __SSE2__ #ifdef __SSE2__
@ -1317,9 +1322,9 @@ float* RawImageSource::CA_correct_RT(
if (W % 2) { if (W % 2) {
// odd width => factors for one channel are not set in last column => use value of preceding column // odd width => factors for one channel are not set in last column => use value of preceding column
const int ngRow = 1 - (FC(0, 0) & 1); const int ngRow = 1 - (fc(cfa, 0, 0) & 1);
const int ngCol = FC(ngRow, 0) & 1; const int ngCol = fc(cfa, ngRow, 0) & 1;
const int colour = FC(ngRow, ngCol); const int colour = fc(cfa, ngRow, ngCol);
const array2D<float>* nonGreen = colour == 0 ? redFactor : blueFactor; const array2D<float>* nonGreen = colour == 0 ? redFactor : blueFactor;
for (int i = 0; i < (H + 1 - 2 * cb) / 2; ++i) { for (int i = 0; i < (H + 1 - 2 * cb) / 2; ++i) {
(*nonGreen)[i][(W - 2 * cb + 1) / 2 - 1] = (*nonGreen)[i][(W - 2* cb + 1) / 2 - 2]; (*nonGreen)[i][(W - 2 * cb + 1) / 2 - 1] = (*nonGreen)[i][(W - 2* cb + 1) / 2 - 2];
@ -1336,8 +1341,8 @@ float* RawImageSource::CA_correct_RT(
#pragma omp for #pragma omp for
#endif #endif
for (int i = 0; i < H - 2 * cb; ++i) { for (int i = 0; i < H - 2 * cb; ++i) {
const int firstCol = FC(i, 0) & 1; const int firstCol = fc(cfa, i, 0) & 1;
const int colour = FC(i, firstCol); const int colour = fc(cfa, i, firstCol);
const array2D<float>* nonGreen = colour == 0 ? redFactor : blueFactor; const array2D<float>* nonGreen = colour == 0 ? redFactor : blueFactor;
for (int j = firstCol; j < W - 2 * cb; j += 2) { for (int j = firstCol; j < W - 2 * cb; j += 2) {
rawData[i + cb][j + cb] *= (*nonGreen)[i / 2][j / 2]; rawData[i + cb][j + cb] *= (*nonGreen)[i / 2][j / 2];

View File

@ -11,7 +11,7 @@ include_directories(${EXTRA_INCDIR}
${LCMS_INCLUDE_DIRS} ${LCMS_INCLUDE_DIRS}
${LENSFUN_INCLUDE_DIRS} ${LENSFUN_INCLUDE_DIRS}
${RSVG_INCLUDE_DIRS} ${RSVG_INCLUDE_DIRS}
) )
link_directories("${PROJECT_SOURCE_DIR}/rtexif" link_directories("${PROJECT_SOURCE_DIR}/rtexif"
${EXPAT_LIBRARY_DIRS} ${EXPAT_LIBRARY_DIRS}
@ -25,26 +25,25 @@ link_directories("${PROJECT_SOURCE_DIR}/rtexif"
${LCMS_LIBRARY_DIRS} ${LCMS_LIBRARY_DIRS}
${LENSFUN_LIBRARY_DIRS} ${LENSFUN_LIBRARY_DIRS}
${RSVG_LIBRARY_DIRS} ${RSVG_LIBRARY_DIRS}
) )
set(CAMCONSTSFILE "camconst.json") set(CAMCONSTSFILE "camconst.json")
set(RTENGINESOURCEFILES set(RTENGINESOURCEFILES
badpixels.cc
CA_correct_RT.cc
capturesharpening.cc
EdgePreservingDecomposition.cc
FTblockDN.cc
PF_correct_RT.cc
ahd_demosaic_RT.cc
alpha.cc alpha.cc
ahd_demosaic_RT.cc
amaze_demosaic_RT.cc amaze_demosaic_RT.cc
cJSON.c badpixels.cc
boxblur.cc
canon_cr3_decoder.cc
CA_correct_RT.cc
calc_distort.cc calc_distort.cc
camconst.cc camconst.cc
capturesharpening.cc
cfa_linedn_RT.cc cfa_linedn_RT.cc
ciecam02.cc ciecam02.cc
cieimage.cc cieimage.cc
cJSON.c
clutstore.cc clutstore.cc
color.cc color.cc
colortemp.cc colortemp.cc
@ -61,14 +60,19 @@ set(RTENGINESOURCEFILES
dual_demosaic_RT.cc dual_demosaic_RT.cc
dynamicprofile.cc dynamicprofile.cc
eahd_demosaic.cc eahd_demosaic.cc
EdgePreservingDecomposition.cc
fast_demo.cc fast_demo.cc
ffmanager.cc ffmanager.cc
filmnegativeproc.cc filmnegativeproc.cc
filmnegativethumb.cc filmnegativethumb.cc
flatcurves.cc flatcurves.cc
FTblockDN.cc
gamutwarning.cc
gauss.cc gauss.cc
green_equil_RT.cc green_equil_RT.cc
guidedfilter.cc
hilite_recon.cc hilite_recon.cc
histmatching.cc
hphd_demosaic_RT.cc hphd_demosaic_RT.cc
iccjpeg.cc iccjpeg.cc
iccstore.cc iccstore.cc
@ -83,62 +87,52 @@ set(RTENGINESOURCEFILES
improcfun.cc improcfun.cc
impulse_denoise.cc impulse_denoise.cc
init.cc init.cc
ipdehaze.cc
iplab2rgb.cc iplab2rgb.cc
iplabregions.cc
iplocalcontrast.cc
ipresize.cc ipresize.cc
ipretinex.cc ipretinex.cc
ipshadowshighlights.cc
ipsharpen.cc ipsharpen.cc
ipsoftlight.cc
iptransform.cc iptransform.cc
ipvibrance.cc ipvibrance.cc
ipwavelet.cc ipwavelet.cc
jdatasrc.cc jdatasrc.cc
jpeg_ijg/jpeg_memsrc.cc jpeg_ijg/jpeg_memsrc.cc
klt/convolve.cc
klt/error.cc
klt/klt.cc
klt/klt_util.cc
klt/pnmio.cc
klt/pyramid.cc
klt/selectGoodFeatures.cc
klt/storeFeatures.cc
klt/trackFeatures.cc
klt/writeFeatures.cc
labimage.cc labimage.cc
lcp.cc lcp.cc
lj92.c
lmmse_demosaic.cc
loadinitial.cc loadinitial.cc
myfile.cc myfile.cc
panasonic_decoders.cc
pdaflinesfilter.cc
PF_correct_RT.cc
pipettebuffer.cc pipettebuffer.cc
pixelshift.cc pixelshift.cc
previewimage.cc previewimage.cc
processingjob.cc processingjob.cc
procparams.cc procparams.cc
profilestore.cc profilestore.cc
rawflatfield.cc
rawimage.cc rawimage.cc
rawimagesource.cc rawimagesource.cc
rcd_demosaic.cc rcd_demosaic.cc
refreshmap.cc refreshmap.cc
rt_algo.cc rt_algo.cc
rtlensfun.cc
rtthumbnail.cc rtthumbnail.cc
shmap.cc shmap.cc
simpleprocess.cc simpleprocess.cc
slicer.cc
spot.cc spot.cc
stdimagesource.cc stdimagesource.cc
utils.cc
rtlensfun.cc
tmo_fattal02.cc tmo_fattal02.cc
iplocalcontrast.cc utils.cc
histmatching.cc
pdaflinesfilter.cc
gamutwarning.cc
ipshadowshighlights.cc
xtrans_demosaic.cc
vng4_demosaic_RT.cc vng4_demosaic_RT.cc
ipsoftlight.cc xtrans_demosaic.cc
guidedfilter.cc )
ipdehaze.cc
iplabregions.cc
lj92.c
)
if(LENSFUN_HAS_LOAD_DIRECTORY) if(LENSFUN_HAS_LOAD_DIRECTORY)
set_source_files_properties(rtlensfun.cc PROPERTIES COMPILE_DEFINITIONS RT_LENSFUN_HAS_LOAD_DIRECTORY) set_source_files_properties(rtlensfun.cc PROPERTIES COMPILE_DEFINITIONS RT_LENSFUN_HAS_LOAD_DIRECTORY)
@ -152,8 +146,8 @@ if(NOT WITH_SYSTEM_KLT)
set(RTENGINESOURCEFILES ${RTENGINESOURCEFILES} set(RTENGINESOURCEFILES ${RTENGINESOURCEFILES}
klt/convolve.cc klt/convolve.cc
klt/error.cc klt/error.cc
klt/klt.cc
klt/klt_util.cc klt/klt_util.cc
klt/klt.cc
klt/pnmio.cc klt/pnmio.cc
klt/pyramid.cc klt/pyramid.cc
klt/selectGoodFeatures.cc klt/selectGoodFeatures.cc
@ -166,7 +160,8 @@ endif()
include_directories(BEFORE "${CMAKE_CURRENT_BINARY_DIR}") include_directories(BEFORE "${CMAKE_CURRENT_BINARY_DIR}")
add_library(rtengine ${RTENGINESOURCEFILES}) add_library(rtengine STATIC ${RTENGINESOURCEFILES})
add_dependencies(rtengine UpdateInfo) add_dependencies(rtengine UpdateInfo)
# It may be nice to store library version too # It may be nice to store library version too
@ -192,6 +187,6 @@ target_link_libraries(rtengine rtexif
${ZLIB_LIBRARIES} ${ZLIB_LIBRARIES}
${LENSFUN_LIBRARIES} ${LENSFUN_LIBRARIES}
${RSVG_LIBRARIES} ${RSVG_LIBRARIES}
) )
install(FILES ${CAMCONSTSFILE} DESTINATION "${DATADIR}" PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ) install(FILES ${CAMCONSTSFILE} DESTINATION "${DATADIR}" PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ)

View File

@ -4,8 +4,7 @@
#ifdef _OPENMP #ifdef _OPENMP
#include <omp.h> #include <omp.h>
#endif #endif
#include "sleef.c" #include "sleef.h"
#include "opthelper.h"
#define DIAGONALS 5 #define DIAGONALS 5
#define DIAGONALSP1 6 #define DIAGONALSP1 6

View File

@ -23,25 +23,34 @@
//////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////
#include <cmath> #include <cmath>
#include <fftw3.h> #include <fftw3.h>
#include "../rtgui/threadutils.h"
#include "rtengine.h"
#include "improcfun.h"
#include "LUT.h"
#include "array2D.h" #include "array2D.h"
#include "iccmatrices.h"
#include "boxblur.h" #include "boxblur.h"
#include "rt_math.h"
#include "mytime.h"
#include "sleef.c"
#include "opthelper.h"
#include "cplx_wavelet_dec.h" #include "cplx_wavelet_dec.h"
#include "median.h" #include "color.h"
#include "curves.h"
#include "iccmatrices.h"
#include "iccstore.h" #include "iccstore.h"
#include "imagefloat.h"
#include "improcfun.h"
#include "labimage.h"
#include "LUT.h"
#include "median.h"
#include "mytime.h"
#include "opthelper.h"
#include "procparams.h" #include "procparams.h"
#include "rt_math.h"
#include "sleef.h"
#include "../rtgui/threadutils.h"
#include "../rtgui/options.h"
#ifdef _OPENMP #ifdef _OPENMP
#include <omp.h> #include <omp.h>
#endif #endif
//#define BENCHMARK //#define BENCHMARK
#include "StopWatch.h" #include "StopWatch.h"
@ -69,11 +78,7 @@ namespace rtengine
*/ */
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
extern const Settings* settings;
extern MyMutex *fftwMutex; extern MyMutex *fftwMutex;
@ -479,6 +484,7 @@ enum nrquality {QUALITY_STANDARD, QUALITY_HIGH};
void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagefloat * dst, Imagefloat * calclum, float * ch_M, float *max_r, float *max_b, bool isRAW, const procparams::DirPyrDenoiseParams & dnparams, const double expcomp, const NoiseCurve & noiseLCurve, const NoiseCurve & noiseCCurve, float &nresi, float &highresi) void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagefloat * dst, Imagefloat * calclum, float * ch_M, float *max_r, float *max_b, bool isRAW, const procparams::DirPyrDenoiseParams & dnparams, const double expcomp, const NoiseCurve & noiseLCurve, const NoiseCurve & noiseCCurve, float &nresi, float &highresi)
{ {
BENCHFUN BENCHFUN
//#ifdef _DEBUG //#ifdef _DEBUG
MyTime t1e, t2e; MyTime t1e, t2e;
t1e.set(); t1e.set();
@ -687,8 +693,8 @@ BENCHFUN
} }
} }
int tilesize; int tilesize = 0;
int overlap; int overlap = 0;
if (settings->leveldnti == 0) { if (settings->leveldnti == 0) {
tilesize = 1024; tilesize = 1024;
@ -1341,8 +1347,6 @@ BENCHFUN
#ifdef _OPENMP #ifdef _OPENMP
int masterThread = omp_get_thread_num(); int masterThread = omp_get_thread_num();
#endif
#ifdef _OPENMP
#pragma omp parallel num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) #pragma omp parallel num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1)
#endif #endif
{ {
@ -1351,11 +1355,9 @@ BENCHFUN
#else #else
int subThread = 0; int subThread = 0;
#endif #endif
float blurbuffer[TS * TS] ALIGNED64;
float *Lblox = LbloxArray[subThread]; float *Lblox = LbloxArray[subThread];
float *fLblox = fLbloxArray[subThread]; float *fLblox = fLbloxArray[subThread];
float pBuf[width + TS + 2 * blkrad * offset] ALIGNED16; float pBuf[width + TS + 2 * blkrad * offset] ALIGNED16;
float nbrwt[TS * TS] ALIGNED64;
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp for #pragma omp for
#endif #endif
@ -1430,7 +1432,7 @@ BENCHFUN
for (int hblk = 0; hblk < numblox_W; ++hblk) { for (int hblk = 0; hblk < numblox_W; ++hblk) {
RGBtile_denoise(fLblox, hblk, noisevar_Ldetail, nbrwt, blurbuffer); RGBtile_denoise(fLblox, hblk, noisevar_Ldetail);
}//end of horizontal block loop }//end of horizontal block loop
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -1447,14 +1449,8 @@ BENCHFUN
//add row of blocks to output image tile //add row of blocks to output image tile
RGBoutput_tile_row(Lblox, Ldetail, tilemask_out, height, width, topproc); RGBoutput_tile_row(Lblox, Ldetail, tilemask_out, height, width, topproc);
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
}//end of vertical block loop }//end of vertical block loop
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp parallel for num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) #pragma omp parallel for num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1)
@ -1603,9 +1599,9 @@ BENCHFUN
Color::Lab2RGBLimit(labdn->L[i1], labdn->a[i1], labdn->b[i1], labdn->L[i1], labdn->a[i1], labdn->b[i1], wip, 9000000.f, 1.f + qhighFactor * realred, 1.f + qhighFactor * realblue, width); Color::Lab2RGBLimit(labdn->L[i1], labdn->a[i1], labdn->b[i1], labdn->L[i1], labdn->a[i1], labdn->b[i1], wip, 9000000.f, 1.f + qhighFactor * realred, 1.f + qhighFactor * realblue, width);
for (int j = tileleft; j < tileright; ++j) { for (int j = tileleft; j < tileright; ++j) {
int j1 = j - tileleft; int j1 = j - tileleft;
float r_ = labdn->L[i1][j1]; float r_ = std::max(0.f, labdn->L[i1][j1]);
float g_ = labdn->a[i1][j1]; float g_ = std::max(0.f, labdn->a[i1][j1]);
float b_ = labdn->b[i1][j1]; float b_ = std::max(0.f, labdn->b[i1][j1]);
//inverse gamma standard (slider) //inverse gamma standard (slider)
r_ = r_ < 32768.f ? igamcurve[r_] : (Color::gammanf(r_ / 32768.f, igam) * 65535.f); r_ = r_ < 32768.f ? igamcurve[r_] : (Color::gammanf(r_ / 32768.f, igam) * 65535.f);
g_ = g_ < 32768.f ? igamcurve[g_] : (Color::gammanf(g_ / 32768.f, igam) * 65535.f); g_ = g_ < 32768.f ? igamcurve[g_] : (Color::gammanf(g_ / 32768.f, igam) * 65535.f);
@ -2041,26 +2037,20 @@ BENCHFUN
}//end of main RGB_denoise }//end of main RGB_denoise
void ImProcFunctions::RGBtile_denoise(float* fLblox, int hblproc, float noisevar_Ldetail) //for DCT
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void ImProcFunctions::RGBtile_denoise(float * fLblox, int hblproc, float noisevar_Ldetail, float * nbrwt, float * blurbuffer) //for DCT
{ {
int blkstart = hblproc * TS * TS; float nbrwt[TS * TS] ALIGNED64;
const int blkstart = hblproc * TS * TS;
boxabsblur(fLblox + blkstart, nbrwt, 3, 3, TS, TS, blurbuffer); //blur neighbor weights for more robust estimation //for DCT boxabsblur(fLblox + blkstart, nbrwt, 3, TS, TS, false); //blur neighbor weights for more robust estimation //for DCT
#ifdef __SSE2__ #ifdef __SSE2__
__m128 tempv; const vfloat noisevar_Ldetailv = F2V(-1.f / noisevar_Ldetail);
__m128 noisevar_Ldetailv = _mm_set1_ps(noisevar_Ldetail); const vfloat onev = F2V(1.f);
__m128 onev = _mm_set1_ps(1.0f);
for (int n = 0; n < TS * TS; n += 4) { //for DCT for (int n = 0; n < TS * TS; n += 4) { //for DCT
tempv = onev - xexpf(-SQRV(LVF(nbrwt[n])) / noisevar_Ldetailv); const vfloat tempv = onev - xexpf(SQRV(LVF(nbrwt[n])) * noisevar_Ldetailv);
_mm_storeu_ps(&fLblox[blkstart + n], LVFU(fLblox[blkstart + n]) * tempv); STVF(fLblox[blkstart + n], LVF(fLblox[blkstart + n]) * tempv);
}//output neighbor averaged result }//output neighbor averaged result
#else #else
@ -2071,14 +2061,7 @@ void ImProcFunctions::RGBtile_denoise(float * fLblox, int hblproc, float noiseva
#endif #endif
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% }
//printf("vblk=%d hlk=%d wsqave=%f || ",vblproc,hblproc,wsqave);
}//end of function tile_denoise
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void ImProcFunctions::RGBoutput_tile_row(float *bloxrow_L, float ** Ldetail, float ** tilemask_out, int height, int width, int top) void ImProcFunctions::RGBoutput_tile_row(float *bloxrow_L, float ** Ldetail, float ** tilemask_out, int height, int width, int top)
{ {
@ -2207,7 +2190,7 @@ void ImProcFunctions::Noise_residualAB(const wavelet_decomposition &WaveletCoeff
chmaxresid = maxresid; chmaxresid = maxresid;
} }
bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposition &WaveletCoeffs_L, float *noisevarlum, float madL[8][3]) bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(const wavelet_decomposition &WaveletCoeffs_L, float *noisevarlum, float madL[8][3])
{ {
int maxlvl = min(WaveletCoeffs_L.maxlevel(), 5); int maxlvl = min(WaveletCoeffs_L.maxlevel(), 5);
const float eps = 0.01f; const float eps = 0.01f;
@ -2258,23 +2241,22 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposition &Wavelet
//simple wavelet shrinkage //simple wavelet shrinkage
float * sfave = buffer[0] + 32; float * sfave = buffer[0] + 32;
float * sfaved = buffer[2] + 96; float * sfaved = buffer[2] + 96;
float * blurBuffer = buffer[1] + 64;
float mad_Lr = madL[lvl][dir - 1]; float mad_Lr = madL[lvl][dir - 1];
float levelFactor = mad_Lr * 5.f / (lvl + 1); float levelFactor = mad_Lr * 5.f / (lvl + 1);
#ifdef __SSE2__ #ifdef __SSE2__
__m128 mad_Lv; vfloat mad_Lv;
__m128 ninev = _mm_set1_ps(9.0f); vfloat ninev = F2V(9.0f);
__m128 epsv = _mm_set1_ps(eps); vfloat epsv = F2V(eps);
__m128 mag_Lv; vfloat mag_Lv;
__m128 levelFactorv = _mm_set1_ps(levelFactor); vfloat levelFactorv = F2V(levelFactor);
int coeffloc_L; int coeffloc_L;
for (coeffloc_L = 0; coeffloc_L < Hlvl_L * Wlvl_L - 3; coeffloc_L += 4) { for (coeffloc_L = 0; coeffloc_L < Hlvl_L * Wlvl_L - 3; coeffloc_L += 4) {
mad_Lv = LVFU(noisevarlum[coeffloc_L]) * levelFactorv; mad_Lv = LVFU(noisevarlum[coeffloc_L]) * levelFactorv;
mag_Lv = SQRV(LVFU(WavCoeffs_L[dir][coeffloc_L])); mag_Lv = SQRV(LVFU(WavCoeffs_L[dir][coeffloc_L]));
_mm_storeu_ps(&sfave[coeffloc_L], mag_Lv / (mag_Lv + mad_Lv * xexpf(-mag_Lv / (mad_Lv * ninev)) + epsv)); STVFU(sfave[coeffloc_L], mag_Lv / (mag_Lv + mad_Lv * xexpf(-mag_Lv / (mad_Lv * ninev)) + epsv));
} }
for (; coeffloc_L < Hlvl_L * Wlvl_L; ++coeffloc_L) { for (; coeffloc_L < Hlvl_L * Wlvl_L; ++coeffloc_L) {
@ -2294,15 +2276,15 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposition &Wavelet
} }
#endif #endif
boxblur(sfave, sfaved, blurBuffer, lvl + 2, lvl + 2, Wlvl_L, Hlvl_L); //increase smoothness by locally averaging shrinkage boxblur(sfave, sfaved, lvl + 2, Wlvl_L, Hlvl_L, false); //increase smoothness by locally averaging shrinkage
#ifdef __SSE2__ #ifdef __SSE2__
__m128 sfavev; vfloat sfavev;
__m128 sf_Lv; vfloat sf_Lv;
for (coeffloc_L = 0; coeffloc_L < Hlvl_L * Wlvl_L - 3; coeffloc_L += 4) { for (coeffloc_L = 0; coeffloc_L < Hlvl_L * Wlvl_L - 3; coeffloc_L += 4) {
sfavev = LVFU(sfaved[coeffloc_L]); sfavev = LVFU(sfaved[coeffloc_L]);
sf_Lv = LVFU(sfave[coeffloc_L]); sf_Lv = LVFU(sfave[coeffloc_L]);
_mm_storeu_ps(&WavCoeffs_L[dir][coeffloc_L], LVFU(WavCoeffs_L[dir][coeffloc_L]) * (SQRV(sfavev) + SQRV(sf_Lv)) / (sfavev + sf_Lv + epsv)); STVFU(WavCoeffs_L[dir][coeffloc_L], LVFU(WavCoeffs_L[dir][coeffloc_L]) * (SQRV(sfavev) + SQRV(sf_Lv)) / (sfavev + sf_Lv + epsv));
//use smoothed shrinkage unless local shrinkage is much less //use smoothed shrinkage unless local shrinkage is much less
} }
@ -2340,7 +2322,7 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposition &Wavelet
return (!memoryAllocationFailed); return (!memoryAllocationFailed);
} }
bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(wavelet_decomposition &WaveletCoeffs_L, wavelet_decomposition &WaveletCoeffs_ab, bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(const wavelet_decomposition &WaveletCoeffs_L, const wavelet_decomposition &WaveletCoeffs_ab,
float *noisevarchrom, float madL[8][3], float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb) float *noisevarchrom, float madL[8][3], float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb)
{ {
int maxlvl = WaveletCoeffs_L.maxlevel(); int maxlvl = WaveletCoeffs_L.maxlevel();
@ -2422,12 +2404,12 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(wavelet_decomposition &Wavele
if (noisevar_ab > 0.001f) { if (noisevar_ab > 0.001f) {
#ifdef __SSE2__ #ifdef __SSE2__
__m128 onev = _mm_set1_ps(1.f); vfloat onev = F2V(1.f);
__m128 mad_abrv = _mm_set1_ps(mad_abr); vfloat mad_abrv = F2V(mad_abr);
__m128 rmad_Lm9v = onev / _mm_set1_ps(mad_Lr * 9.f); vfloat rmad_Lm9v = onev / F2V(mad_Lr * 9.f);
__m128 mad_abv; vfloat mad_abv;
__m128 mag_Lv, mag_abv; vfloat mag_Lv, mag_abv;
__m128 tempabv; vfloat tempabv;
int coeffloc_ab; int coeffloc_ab;
for (coeffloc_ab = 0; coeffloc_ab < Hlvl_ab * Wlvl_ab - 3; coeffloc_ab += 4) { for (coeffloc_ab = 0; coeffloc_ab < Hlvl_ab * Wlvl_ab - 3; coeffloc_ab += 4) {
@ -2437,7 +2419,7 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(wavelet_decomposition &Wavele
mag_Lv = LVFU(WavCoeffs_L[dir][coeffloc_ab]); mag_Lv = LVFU(WavCoeffs_L[dir][coeffloc_ab]);
mag_abv = SQRV(tempabv); mag_abv = SQRV(tempabv);
mag_Lv = SQRV(mag_Lv) * rmad_Lm9v; mag_Lv = SQRV(mag_Lv) * rmad_Lm9v;
_mm_storeu_ps(&WavCoeffs_ab[dir][coeffloc_ab], tempabv * SQRV((onev - xexpf(-(mag_abv / mad_abv) - (mag_Lv))))); STVFU(WavCoeffs_ab[dir][coeffloc_ab], tempabv * SQRV((onev - xexpf(-(mag_abv / mad_abv) - (mag_Lv)))));
} }
// few remaining pixels // few remaining pixels
@ -2470,17 +2452,15 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(wavelet_decomposition &Wavele
} }
for (int i = 2; i >= 0; i--) { for (int i = 2; i >= 0; i--) {
if (buffer[i] != nullptr) {
delete[] buffer[i]; delete[] buffer[i];
} }
}
} }
return (!memoryAllocationFailed); return (!memoryAllocationFailed);
} }
bool ImProcFunctions::WaveletDenoiseAllL(wavelet_decomposition &WaveletCoeffs_L, float *noisevarlum, float madL[8][3], float * vari, int edge)//mod JD bool ImProcFunctions::WaveletDenoiseAllL(const wavelet_decomposition &WaveletCoeffs_L, float *noisevarlum, float madL[8][3], float * vari, int edge)//mod JD
{ {
@ -2530,16 +2510,14 @@ bool ImProcFunctions::WaveletDenoiseAllL(wavelet_decomposition &WaveletCoeffs_L,
} }
for (int i = 3; i >= 0; i--) { for (int i = 3; i >= 0; i--) {
if (buffer[i] != nullptr) {
delete[] buffer[i]; delete[] buffer[i];
} }
} }
}
return (!memoryAllocationFailed); return (!memoryAllocationFailed);
} }
bool ImProcFunctions::WaveletDenoiseAllAB(wavelet_decomposition &WaveletCoeffs_L, wavelet_decomposition &WaveletCoeffs_ab, bool ImProcFunctions::WaveletDenoiseAllAB(const wavelet_decomposition &WaveletCoeffs_L, const wavelet_decomposition &WaveletCoeffs_ab,
float *noisevarchrom, float madL[8][3], float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb)//mod JD float *noisevarchrom, float madL[8][3], float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb)//mod JD
{ {
@ -2596,7 +2574,7 @@ bool ImProcFunctions::WaveletDenoiseAllAB(wavelet_decomposition &WaveletCoeffs_L
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void ImProcFunctions::ShrinkAllL(wavelet_decomposition &WaveletCoeffs_L, float **buffer, int level, int dir, void ImProcFunctions::ShrinkAllL(const wavelet_decomposition &WaveletCoeffs_L, float **buffer, int level, int dir,
float *noisevarlum, float * madL, float * vari, int edge) float *noisevarlum, float * madL, float * vari, int edge)
{ {
@ -2607,12 +2585,12 @@ void ImProcFunctions::ShrinkAllL(wavelet_decomposition &WaveletCoeffs_L, float *
float * sfaved = buffer[1] + 64; float * sfaved = buffer[1] + 64;
float * blurBuffer = buffer[2] + 96; float * blurBuffer = buffer[2] + 96;
int W_L = WaveletCoeffs_L.level_W(level); const int W_L = WaveletCoeffs_L.level_W(level);
int H_L = WaveletCoeffs_L.level_H(level); const int H_L = WaveletCoeffs_L.level_H(level);
float ** WavCoeffs_L = WaveletCoeffs_L.level_coeffs(level); float ** WavCoeffs_L = WaveletCoeffs_L.level_coeffs(level);
// printf("OK lev=%d\n",level); const float mad_L = madL[dir - 1] ;
float mad_L = madL[dir - 1] ; const float levelFactor = mad_L * 5.f / static_cast<float>(level + 1);
if (edge == 1 && vari) { if (edge == 1 && vari) {
noisevarlum = blurBuffer; // we need one buffer, but fortunately we don't have to allocate a new one because we can use blurBuffer noisevarlum = blurBuffer; // we need one buffer, but fortunately we don't have to allocate a new one because we can use blurBuffer
@ -2622,71 +2600,45 @@ void ImProcFunctions::ShrinkAllL(wavelet_decomposition &WaveletCoeffs_L, float *
} }
} }
float levelFactor = mad_L * 5.f / static_cast<float>(level + 1); int i = 0;
#ifdef __SSE2__ #ifdef __SSE2__
__m128 magv; const vfloat levelFactorv = F2V(levelFactor);
__m128 levelFactorv = _mm_set1_ps(levelFactor); const vfloat ninev = F2V(9.f);
__m128 mad_Lv; const vfloat epsv = F2V(eps);
__m128 ninev = _mm_set1_ps(9.0f);
__m128 epsv = _mm_set1_ps(eps);
int i;
for (i = 0; i < W_L * H_L - 3; i += 4) { for (; i < W_L * H_L - 3; i += 4) {
mad_Lv = LVFU(noisevarlum[i]) * levelFactorv; const vfloat mad_Lv = LVFU(noisevarlum[i]) * levelFactorv;
magv = SQRV(LVFU(WavCoeffs_L[dir][i])); const vfloat magv = SQRV(LVFU(WavCoeffs_L[dir][i]));
_mm_storeu_ps(&sfave[i], magv / (magv + mad_Lv * xexpf(-magv / (ninev * mad_Lv)) + epsv)); STVFU(sfave[i], magv / (magv + mad_Lv * xexpf(-magv / (ninev * mad_Lv)) + epsv));
} }
#endif
// few remaining pixels // few remaining pixels
for (; i < W_L * H_L; ++i) { for (; i < W_L * H_L; ++i) {
float mag = SQR(WavCoeffs_L[dir][i]); const float mag = SQR(WavCoeffs_L[dir][i]);
sfave[i] = mag / (mag + levelFactor * noisevarlum[i] * xexpf(-mag / (9 * levelFactor * noisevarlum[i])) + eps); sfave[i] = mag / (mag + levelFactor * noisevarlum[i] * xexpf(-mag / (9 * levelFactor * noisevarlum[i])) + eps);
} }
#else boxblur(sfave, sfaved, level + 2, W_L, H_L, false); //increase smoothness by locally averaging shrinkage
for (int i = 0; i < W_L * H_L; ++i) {
float mag = SQR(WavCoeffs_L[dir][i]);
float shrinkfactor = mag / (mag + levelFactor * noisevarlum[i] * xexpf(-mag / (9 * levelFactor * noisevarlum[i])) + eps);
sfave[i] = shrinkfactor;
}
#endif
boxblur(sfave, sfaved, blurBuffer, level + 2, level + 2, W_L, H_L); //increase smoothness by locally averaging shrinkage
i = 0;
#ifdef __SSE2__ #ifdef __SSE2__
__m128 sfv;
for (i = 0; i < W_L * H_L - 3; i += 4) { for (; i < W_L * H_L - 3; i += 4) {
sfv = LVFU(sfave[i]); const vfloat sfv = LVFU(sfave[i]);
//use smoothed shrinkage unless local shrinkage is much less //use smoothed shrinkage unless local shrinkage is much less
_mm_storeu_ps(&WavCoeffs_L[dir][i], _mm_loadu_ps(&WavCoeffs_L[dir][i]) * (SQRV(LVFU(sfaved[i])) + SQRV(sfv)) / (LVFU(sfaved[i]) + sfv + epsv)); STVFU(WavCoeffs_L[dir][i], LVFU(WavCoeffs_L[dir][i]) * (SQRV(LVFU(sfaved[i])) + SQRV(sfv)) / (LVFU(sfaved[i]) + sfv + epsv));
} }
#endif
// few remaining pixels // few remaining pixels
for (; i < W_L * H_L; ++i) { for (; i < W_L * H_L; ++i) {
float sf = sfave[i]; const float sf = sfave[i];
//use smoothed shrinkage unless local shrinkage is much less //use smoothed shrinkage unless local shrinkage is much less
WavCoeffs_L[dir][i] *= (SQR(sfaved[i]) + SQR(sf)) / (sfaved[i] + sf + eps); WavCoeffs_L[dir][i] *= (SQR(sfaved[i]) + SQR(sf)) / (sfaved[i] + sf + eps);
}//now luminance coefficients are denoised }//now luminance coefficients are denoised
#else
for (int i = 0; i < W_L * H_L; ++i) {
float sf = sfave[i];
//use smoothed shrinkage unless local shrinkage is much less
WavCoeffs_L[dir][i] *= (SQR(sfaved[i]) + SQR(sf)) / (sfaved[i] + sf + eps);
}//now luminance coefficients are denoised
#endif
} }
void ImProcFunctions::ShrinkAllAB(wavelet_decomposition &WaveletCoeffs_L, wavelet_decomposition &WaveletCoeffs_ab, float **buffer, int level, int dir, void ImProcFunctions::ShrinkAllAB(const wavelet_decomposition &WaveletCoeffs_L, const wavelet_decomposition &WaveletCoeffs_ab, float **buffer, int level, int dir,
float *noisevarchrom, float noisevar_ab, const bool useNoiseCCurve, bool autoch, float *noisevarchrom, float noisevar_ab, const bool useNoiseCCurve, bool autoch,
bool denoiseMethodRgb, float * madL, float * madaab, bool madCalculated) bool denoiseMethodRgb, float * madL, float * madaab, bool madCalculated)
@ -2700,7 +2652,6 @@ void ImProcFunctions::ShrinkAllAB(wavelet_decomposition &WaveletCoeffs_L, wavele
float * sfaveab = buffer[0] + 32; float * sfaveab = buffer[0] + 32;
float * sfaveabd = buffer[1] + 64; float * sfaveabd = buffer[1] + 64;
float * blurBuffer = buffer[2] + 96;
int W_ab = WaveletCoeffs_ab.level_W(level); int W_ab = WaveletCoeffs_ab.level_W(level);
int H_ab = WaveletCoeffs_ab.level_H(level); int H_ab = WaveletCoeffs_ab.level_H(level);
@ -2724,12 +2675,12 @@ void ImProcFunctions::ShrinkAllAB(wavelet_decomposition &WaveletCoeffs_L, wavele
if (noisevar_ab > 0.001f) { if (noisevar_ab > 0.001f) {
madab = useNoiseCCurve ? madab : madab * noisevar_ab; madab = useNoiseCCurve ? madab : madab * noisevar_ab;
#ifdef __SSE2__ #ifdef __SSE2__
__m128 onev = _mm_set1_ps(1.f); vfloat onev = F2V(1.f);
__m128 mad_abrv = _mm_set1_ps(madab); vfloat mad_abrv = F2V(madab);
__m128 rmadLm9v = onev / _mm_set1_ps(mad_L * 9.f); vfloat rmadLm9v = onev / F2V(mad_L * 9.f);
__m128 mad_abv ; vfloat mad_abv ;
__m128 mag_Lv, mag_abv; vfloat mag_Lv, mag_abv;
int coeffloc_ab; int coeffloc_ab;
for (coeffloc_ab = 0; coeffloc_ab < H_ab * W_ab - 3; coeffloc_ab += 4) { for (coeffloc_ab = 0; coeffloc_ab < H_ab * W_ab - 3; coeffloc_ab += 4) {
@ -2738,7 +2689,7 @@ void ImProcFunctions::ShrinkAllAB(wavelet_decomposition &WaveletCoeffs_L, wavele
mag_Lv = LVFU(WavCoeffs_L[dir][coeffloc_ab]); mag_Lv = LVFU(WavCoeffs_L[dir][coeffloc_ab]);
mag_abv = SQRV(LVFU(WavCoeffs_ab[dir][coeffloc_ab])); mag_abv = SQRV(LVFU(WavCoeffs_ab[dir][coeffloc_ab]));
mag_Lv = (SQRV(mag_Lv)) * rmadLm9v; mag_Lv = (SQRV(mag_Lv)) * rmadLm9v;
_mm_storeu_ps(&sfaveab[coeffloc_ab], (onev - xexpf(-(mag_abv / mad_abv) - (mag_Lv)))); STVFU(sfaveab[coeffloc_ab], (onev - xexpf(-(mag_abv / mad_abv) - (mag_Lv))));
} }
// few remaining pixels // few remaining pixels
@ -2761,18 +2712,18 @@ void ImProcFunctions::ShrinkAllAB(wavelet_decomposition &WaveletCoeffs_L, wavele
#endif #endif
boxblur(sfaveab, sfaveabd, blurBuffer, level + 2, level + 2, W_ab, H_ab); //increase smoothness by locally averaging shrinkage boxblur(sfaveab, sfaveabd, level + 2, W_ab, H_ab, false); //increase smoothness by locally averaging shrinkage
#ifdef __SSE2__ #ifdef __SSE2__
__m128 epsv = _mm_set1_ps(eps); vfloat epsv = F2V(eps);
__m128 sfabv; vfloat sfabv;
__m128 sfaveabv; vfloat sfaveabv;
for (coeffloc_ab = 0; coeffloc_ab < H_ab * W_ab - 3; coeffloc_ab += 4) { for (coeffloc_ab = 0; coeffloc_ab < H_ab * W_ab - 3; coeffloc_ab += 4) {
sfabv = LVFU(sfaveab[coeffloc_ab]); sfabv = LVFU(sfaveab[coeffloc_ab]);
sfaveabv = LVFU(sfaveabd[coeffloc_ab]); sfaveabv = LVFU(sfaveabd[coeffloc_ab]);
//use smoothed shrinkage unless local shrinkage is much less //use smoothed shrinkage unless local shrinkage is much less
_mm_storeu_ps(&WavCoeffs_ab[dir][coeffloc_ab], LVFU(WavCoeffs_ab[dir][coeffloc_ab]) * (SQRV(sfaveabv) + SQRV(sfabv)) / (sfaveabv + sfabv + epsv)); STVFU(WavCoeffs_ab[dir][coeffloc_ab], LVFU(WavCoeffs_ab[dir][coeffloc_ab]) * (SQRV(sfaveabv) + SQRV(sfabv)) / (sfaveabv + sfabv + epsv));
} }
// few remaining pixels // few remaining pixels
@ -2919,8 +2870,8 @@ void ImProcFunctions::ShrinkAll_info(float ** WavCoeffs_a, float ** WavCoeffs_b,
} }
void ImProcFunctions::WaveletDenoiseAll_info(int levwav, wavelet_decomposition &WaveletCoeffs_a, void ImProcFunctions::WaveletDenoiseAll_info(int levwav, const wavelet_decomposition &WaveletCoeffs_a,
wavelet_decomposition &WaveletCoeffs_b, float **noisevarlum, float **noisevarchrom, float **noisevarhue, float &chaut, int &Nb, float &redaut, float &blueaut, float &maxredaut, float &maxblueaut, float &minredaut, float &minblueaut, int schoice, const wavelet_decomposition &WaveletCoeffs_b, float **noisevarlum, float **noisevarchrom, float **noisevarhue, float &chaut, int &Nb, float &redaut, float &blueaut, float &maxredaut, float &maxblueaut, float &minredaut, float &minblueaut, int schoice,
float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc, float &maxchred, float &maxchblue, float &minchred, float &minchblue, int &nb, float &chau, float &chred, float &chblue, bool denoiseMethodRgb) float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc, float &maxchred, float &maxchblue, float &minchred, float &minchblue, int &nb, float &chau, float &chred, float &chblue, bool denoiseMethodRgb)
{ {
@ -3106,7 +3057,7 @@ void ImProcFunctions::calcautodn_info(float &chaut, float &delta, int Nb, int le
} }
void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat * provicalc, const bool isRAW, LUTf &gamcurve, float gam, float gamthresh, float gamslope, const procparams::DirPyrDenoiseParams & dnparams, const double expcomp, float &chaut, int &Nb, float &redaut, float &blueaut, float &maxredaut, float &maxblueaut, float &minredaut, float &minblueaut, float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc, bool multiThread) void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat * provicalc, const bool isRAW, const LUTf &gamcurve, float gam, float gamthresh, float gamslope, const procparams::DirPyrDenoiseParams & dnparams, const double expcomp, float &chaut, int &Nb, float &redaut, float &blueaut, float &maxredaut, float &maxblueaut, float &minredaut, float &minblueaut, float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc, bool multiThread)
{ {
if ((settings->leveldnautsimpl == 1 && dnparams.Cmethod == "MAN") || (settings->leveldnautsimpl == 0 && dnparams.C2method == "MANU")) { if ((settings->leveldnautsimpl == 1 && dnparams.Cmethod == "MAN") || (settings->leveldnautsimpl == 0 && dnparams.C2method == "MANU")) {
//nothing to do //nothing to do
@ -3173,8 +3124,8 @@ void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat * provicalc,
const float gain = pow(2.0f, float(expcomp)); const float gain = pow(2.0f, float(expcomp));
int tilesize; int tilesize = 0;
int overlap; int overlap = 0;
if (settings->leveldnti == 0) { if (settings->leveldnti == 0) {
tilesize = 1024; tilesize = 1024;
@ -3275,16 +3226,16 @@ void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat * provicalc,
for (int i = tiletop; i < tilebottom; i += 2) { for (int i = tiletop; i < tilebottom; i += 2) {
int i1 = i - tiletop; int i1 = i - tiletop;
#ifdef __SSE2__ #ifdef __SSE2__
__m128 aNv, bNv; vfloat aNv, bNv;
__m128 c100v = _mm_set1_ps(100.f); vfloat c100v = F2V(100.f);
int j; int j;
for (j = tileleft; j < tileright - 7; j += 8) { for (j = tileleft; j < tileright - 7; j += 8) {
int j1 = j - tileleft; int j1 = j - tileleft;
aNv = LVFU(acalc[i >> 1][j >> 1]); aNv = LVFU(acalc[i >> 1][j >> 1]);
bNv = LVFU(bcalc[i >> 1][j >> 1]); bNv = LVFU(bcalc[i >> 1][j >> 1]);
_mm_storeu_ps(&noisevarhue[i1 >> 1][j1 >> 1], xatan2f(bNv, aNv)); STVFU(noisevarhue[i1 >> 1][j1 >> 1], xatan2f(bNv, aNv));
_mm_storeu_ps(&noisevarchrom[i1 >> 1][j1 >> 1], vmaxf(vsqrtf(SQRV(aNv) + SQRV(bNv)),c100v)); STVFU(noisevarchrom[i1 >> 1][j1 >> 1], vmaxf(vsqrtf(SQRV(aNv) + SQRV(bNv)),c100v));
} }
for (; j < tileright; j += 2) { for (; j < tileright; j += 2) {

View File

@ -56,21 +56,18 @@
* LUTuc stands for LUT<unsigned char> * LUTuc stands for LUT<unsigned char>
*/ */
#ifndef LUT_H_ #pragma once
#define LUT_H_
#include <cstring> #include <cstring>
#include <cstdint> #include <cstdint>
#include <cassert> #include <cassert>
#ifndef NDEBUG #ifndef NDEBUG
#include <glibmm.h>
#include <fstream> #include <fstream>
#endif #endif
#include "opthelper.h" #include "opthelper.h"
#include "rt_math.h" #include "rt_math.h"
#include "noncopyable.h"
// Bit representations of flags // Bit representations of flags
enum { enum {
@ -485,26 +482,6 @@ public:
return (p1 + p2 * diff); return (p1 + p2 * diff);
} }
#ifndef NDEBUG
// Debug facility ; dump the content of the LUT in a file. No control of the filename is done
void dump(Glib::ustring fname)
{
if (size) {
Glib::ustring fname_ = fname + ".xyz"; // TopSolid'Design "plot" file format
std::ofstream f (fname_.c_str());
f << "$" << std::endl;
for (unsigned int iter = 0; iter < size; iter++) {
f << iter << ", " << data[iter] << ", 0." << std::endl;
}
f << "$" << std::endl;
f.close ();
}
}
#endif
operator bool (void) const operator bool (void) const
{ {
return size > 0; return size > 0;
@ -649,5 +626,3 @@ public:
}; };
#endif /* LUT_H_ */

View File

@ -29,8 +29,12 @@
#include "gauss.h" #include "gauss.h"
#include "improcfun.h" #include "improcfun.h"
#include "sleef.c" #include "cieimage.h"
#include "../rtgui/myflatcurve.h" #include "color.h"
#include "curves.h"
#include "labimage.h"
#include "sleef.h"
#include "curves.h"
#include "rt_math.h" #include "rt_math.h"
#include "opthelper.h" #include "opthelper.h"
#include "median.h" #include "median.h"

View File

@ -27,12 +27,17 @@
#include "rtengine.h" #include "rtengine.h"
#include "rawimagesource.h" #include "rawimagesource.h"
#include "rt_math.h" #include "rt_math.h"
#include "procparams.h"
#include "../rtgui/multilangmgr.h" #include "../rtgui/multilangmgr.h"
#include "median.h" #include "median.h"
//#define BENCHMARK //#define BENCHMARK
#include "StopWatch.h" #include "StopWatch.h"
namespace
{
unsigned fc(const unsigned int cfa[2][2], int r, int c) {
return cfa[r & 1][c & 1];
}
}
namespace rtengine namespace rtengine
{ {
#define TS 144 #define TS 144
@ -40,6 +45,7 @@ void RawImageSource::ahd_demosaic()
{ {
BENCHFUN BENCHFUN
const unsigned int cfa[2][2] = {{FC(0,0), FC(0,1)}, {FC(1,0), FC(1,1)}};
constexpr int dirs[4] = { -1, 1, -TS, TS }; constexpr int dirs[4] = { -1, 1, -TS, TS };
float xyz_cam[3][3]; float xyz_cam[3][3];
LUTf cbrt(65536); LUTf cbrt(65536);
@ -74,7 +80,7 @@ void RawImageSource::ahd_demosaic()
} }
} }
} }
border_interpolate2(W, H, 5, rawData, red, green, blue); border_interpolate(W, H, 5, rawData, red, green, blue);
#ifdef _OPENMP #ifdef _OPENMP
@ -94,7 +100,7 @@ void RawImageSource::ahd_demosaic()
for (int left = 2; left < width - 5; left += TS - 6) { for (int left = 2; left < width - 5; left += TS - 6) {
// Interpolate green horizontally and vertically: // Interpolate green horizontally and vertically:
for (int row = top; row < top + TS && row < height - 2; row++) { for (int row = top; row < top + TS && row < height - 2; row++) {
for (int col = left + (FC(row, left) & 1); col < std::min(left + TS, width - 2); col += 2) { for (int col = left + (fc(cfa, row, left) & 1); col < std::min(left + TS, width - 2); col += 2) {
auto pix = &rawData[row][col]; auto pix = &rawData[row][col];
float val0 = 0.25f * ((pix[-1] + pix[0] + pix[1]) * 2 float val0 = 0.25f * ((pix[-1] + pix[0] + pix[1]) * 2
- pix[-2] - pix[2]) ; - pix[-2] - pix[2]) ;
@ -108,12 +114,12 @@ void RawImageSource::ahd_demosaic()
// Interpolate red and blue, and convert to CIELab: // Interpolate red and blue, and convert to CIELab:
for (int d = 0; d < 2; d++) for (int d = 0; d < 2; d++)
for (int row = top + 1; row < top + TS - 1 && row < height - 3; row++) { for (int row = top + 1; row < top + TS - 1 && row < height - 3; row++) {
int cng = FC(row + 1, FC(row + 1, 0) & 1); int cng = fc(cfa, row + 1, fc(cfa, row + 1, 0) & 1);
for (int col = left + 1; col < std::min(left + TS - 1, width - 3); col++) { for (int col = left + 1; col < std::min(left + TS - 1, width - 3); col++) {
auto pix = &rawData[row][col]; auto pix = &rawData[row][col];
auto rix = &rgb[d][row - top][col - left]; auto rix = &rgb[d][row - top][col - left];
auto lix = lab[d][row - top][col - left]; auto lix = lab[d][row - top][col - left];
if (FC(row, col) == 1) { if (fc(cfa, row, col) == 1) {
rix[0][2 - cng] = CLIP(pix[0] + (0.5f * (pix[-1] + pix[1] rix[0][2 - cng] = CLIP(pix[0] + (0.5f * (pix[-1] + pix[1]
- rix[-1][1] - rix[1][1] ) )); - rix[-1][1] - rix[1][1] ) ));
rix[0][cng] = CLIP(pix[0] + (0.5f * (pix[-width] + pix[width] rix[0][cng] = CLIP(pix[0] + (0.5f * (pix[-width] + pix[width]

View File

@ -16,8 +16,7 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>. * along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/ */
#ifndef _ALIGNEDBUFFER_ #pragma once
#define _ALIGNEDBUFFER_
#include <cstdint> #include <cstdint>
#include <cstdlib> #include <cstdlib>
@ -142,5 +141,3 @@ public:
return unitSize ? allocatedSize / unitSize : 0; return unitSize ? allocatedSize / unitSize : 0;
} }
}; };
#endif

View File

@ -30,12 +30,18 @@
#include "rawimagesource.h" #include "rawimagesource.h"
#include "rt_math.h" #include "rt_math.h"
#include "../rtgui/multilangmgr.h" #include "../rtgui/multilangmgr.h"
#include "sleef.c" #include "sleef.h"
#include "opthelper.h" #include "opthelper.h"
#include "median.h" #include "median.h"
#include "procparams.h"
#include "StopWatch.h" #include "StopWatch.h"
namespace
{
unsigned fc(const unsigned int cfa[2][2], int r, int c) {
return cfa[r & 1][c & 1];
}
}
namespace rtengine namespace rtengine
{ {
@ -56,6 +62,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c
plistener->setProgress(progress); plistener->setProgress(progress);
} }
const unsigned int cfarray[2][2] = {{FC(0,0), FC(0,1)}, {FC(1,0), FC(1,1)}};
const int width = winw, height = winh; const int width = winw, height = winh;
const float clip_pt = 1.0 / initialGain; const float clip_pt = 1.0 / initialGain;
const float clip_pt8 = 0.8 / initialGain; const float clip_pt8 = 0.8 / initialGain;
@ -74,8 +81,8 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c
int ex, ey; int ex, ey;
//determine GRBG coset; (ey,ex) is the offset of the R subarray //determine GRBG coset; (ey,ex) is the offset of the R subarray
if (FC(0, 0) == 1) { //first pixel is G if (fc(cfarray, 0, 0) == 1) { //first pixel is G
if (FC(0, 1) == 0) { if (fc(cfarray, 0, 1) == 0) {
ey = 0; ey = 0;
ex = 1; ex = 1;
} else { } else {
@ -83,7 +90,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c
ex = 0; ex = 0;
} }
} else {//first pixel is R or B } else {//first pixel is R or B
if (FC(0, 0) == 0) { if (fc(cfarray, 0, 0) == 0) {
ey = 0; ey = 0;
ex = 0; ex = 0;
} else { } else {
@ -373,7 +380,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c
#ifdef __SSE2__ #ifdef __SSE2__
vfloat sgnv; vfloat sgnv;
if( !(FC(4, 4) & 1) ) { if( !(fc(cfarray, 4, 4) & 1) ) {
sgnv = _mm_set_ps( 1.f, -1.f, 1.f, -1.f ); sgnv = _mm_set_ps( 1.f, -1.f, 1.f, -1.f );
} else { } else {
sgnv = _mm_set_ps( -1.f, 1.f, -1.f, 1.f ); sgnv = _mm_set_ps( -1.f, 1.f, -1.f, 1.f );
@ -440,7 +447,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c
#else #else
for (int rr = 4; rr < rr1 - 4; rr++) { for (int rr = 4; rr < rr1 - 4; rr++) {
bool fcswitch = FC(rr, 4) & 1; bool fcswitch = fc(cfarray, rr, 4) & 1;
for (int cc = 4, indx = rr * ts + cc; cc < cc1 - 4; cc++, indx++) { for (int cc = 4, indx = rr * ts + cc; cc < cc1 - 4; cc++, indx++) {
@ -532,7 +539,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c
vfloat clip_ptv = F2V( clip_pt ); vfloat clip_ptv = F2V( clip_pt );
vfloat sgn3v; vfloat sgn3v;
if( !(FC(4, 4) & 1) ) { if( !(fc(cfarray, 4, 4) & 1) ) {
sgnv = _mm_set_ps( 1.f, -1.f, 1.f, -1.f ); sgnv = _mm_set_ps( 1.f, -1.f, 1.f, -1.f );
} else { } else {
sgnv = _mm_set_ps( -1.f, 1.f, -1.f, 1.f ); sgnv = _mm_set_ps( -1.f, 1.f, -1.f, 1.f );
@ -590,7 +597,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c
#else #else
for (int rr = 4; rr < rr1 - 4; rr++) { for (int rr = 4; rr < rr1 - 4; rr++) {
for (int cc = 4, indx = rr * ts + cc, c = FC(rr, cc) & 1; cc < cc1 - 4; cc++, indx++) { for (int cc = 4, indx = rr * ts + cc, c = fc(cfarray, rr, cc) & 1; cc < cc1 - 4; cc++, indx++) {
float hcdvar = 3.f * (SQR(hcd[indx - 2]) + SQR(hcd[indx]) + SQR(hcd[indx + 2])) - SQR(hcd[indx - 2] + hcd[indx] + hcd[indx + 2]); float hcdvar = 3.f * (SQR(hcd[indx - 2]) + SQR(hcd[indx]) + SQR(hcd[indx + 2])) - SQR(hcd[indx - 2] + hcd[indx] + hcd[indx + 2]);
float hcdaltvar = 3.f * (SQR(hcdalt[indx - 2]) + SQR(hcdalt[indx]) + SQR(hcdalt[indx + 2])) - SQR(hcdalt[indx - 2] + hcdalt[indx] + hcdalt[indx + 2]); float hcdaltvar = 3.f * (SQR(hcdalt[indx - 2]) + SQR(hcdalt[indx]) + SQR(hcdalt[indx + 2])) - SQR(hcdalt[indx - 2] + hcdalt[indx] + hcdalt[indx + 2]);
float vcdvar = 3.f * (SQR(vcd[indx - v2]) + SQR(vcd[indx]) + SQR(vcd[indx + v2])) - SQR(vcd[indx - v2] + vcd[indx] + vcd[indx + v2]); float vcdvar = 3.f * (SQR(vcd[indx - v2]) + SQR(vcd[indx]) + SQR(vcd[indx + v2])) - SQR(vcd[indx - v2] + vcd[indx] + vcd[indx + v2]);
@ -686,7 +693,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c
vfloat epssqv = F2V( epssq ); vfloat epssqv = F2V( epssq );
for (int rr = 6; rr < rr1 - 6; rr++) { for (int rr = 6; rr < rr1 - 6; rr++) {
for (int indx = rr * ts + 6 + (FC(rr, 2) & 1); indx < rr * ts + cc1 - 6; indx += 8) { for (int indx = rr * ts + 6 + (fc(cfarray, rr, 2) & 1); indx < rr * ts + cc1 - 6; indx += 8) {
//compute colour difference variances in cardinal directions //compute colour difference variances in cardinal directions
vfloat tempv = LC2VFU(vcd[indx]); vfloat tempv = LC2VFU(vcd[indx]);
vfloat uavev = tempv + LC2VFU(vcd[indx - v1]) + LC2VFU(vcd[indx - v2]) + LC2VFU(vcd[indx - v3]); vfloat uavev = tempv + LC2VFU(vcd[indx - v1]) + LC2VFU(vcd[indx - v2]) + LC2VFU(vcd[indx - v3]);
@ -732,7 +739,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c
#else #else
for (int rr = 6; rr < rr1 - 6; rr++) { for (int rr = 6; rr < rr1 - 6; rr++) {
for (int cc = 6 + (FC(rr, 2) & 1), indx = rr * ts + cc; cc < cc1 - 6; cc += 2, indx += 2) { for (int cc = 6 + (fc(cfarray, rr, 2) & 1), indx = rr * ts + cc; cc < cc1 - 6; cc += 2, indx += 2) {
//compute colour difference variances in cardinal directions //compute colour difference variances in cardinal directions
@ -794,7 +801,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c
// precompute nyquist // precompute nyquist
for (int rr = 6; rr < rr1 - 6; rr++) { for (int rr = 6; rr < rr1 - 6; rr++) {
int cc = 6 + (FC(rr, 2) & 1); int cc = 6 + (fc(cfarray, rr, 2) & 1);
int indx = rr * ts + cc; int indx = rr * ts + cc;
#ifdef __SSE2__ #ifdef __SSE2__
@ -857,7 +864,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c
int nyendcol = 0; int nyendcol = 0;
for (int rr = 6; rr < rr1 - 6; rr++) { for (int rr = 6; rr < rr1 - 6; rr++) {
for (int cc = 6 + (FC(rr, 2) & 1), indx = rr * ts + cc; cc < cc1 - 6; cc += 2, indx += 2) { for (int cc = 6 + (fc(cfarray, rr, 2) & 1), indx = rr * ts + cc; cc < cc1 - 6; cc += 2, indx += 2) {
//nyquist texture test: ask if difference of vcd compared to hcd is larger or smaller than RGGB gradients //nyquist texture test: ask if difference of vcd compared to hcd is larger or smaller than RGGB gradients
if(nyqutest[indx >> 1] > 0.f) { if(nyqutest[indx >> 1] > 0.f) {
@ -908,7 +915,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c
#else #else
for (int indx = rr * ts + nystartcol + (FC(rr, 2) & 1); indx < rr * ts + nyendcol; indx += 2) { for (int indx = rr * ts + nystartcol + (fc(cfarray, rr, 2) & 1); indx < rr * ts + nyendcol; indx += 2) {
unsigned int nyquisttemp = (nyquist[(indx - v2) >> 1] + nyquist[(indx - m1) >> 1] + nyquist[(indx + p1) >> 1] + unsigned int nyquisttemp = (nyquist[(indx - v2) >> 1] + nyquist[(indx - m1) >> 1] + nyquist[(indx + p1) >> 1] +
nyquist[(indx - 2) >> 1] + nyquist[(indx + 2) >> 1] + nyquist[(indx - 2) >> 1] + nyquist[(indx + 2) >> 1] +
nyquist[(indx - p1) >> 1] + nyquist[(indx + m1) >> 1] + nyquist[(indx + v2) >> 1]); nyquist[(indx - p1) >> 1] + nyquist[(indx + m1) >> 1] + nyquist[(indx + v2) >> 1]);
@ -923,7 +930,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c
// in areas of Nyquist texture, do area interpolation // in areas of Nyquist texture, do area interpolation
for (int rr = nystartrow; rr < nyendrow; rr++) for (int rr = nystartrow; rr < nyendrow; rr++)
for (int indx = rr * ts + nystartcol + (FC(rr, 2) & 1); indx < rr * ts + nyendcol; indx += 2) { for (int indx = rr * ts + nystartcol + (fc(cfarray, rr, 2) & 1); indx < rr * ts + nyendcol; indx += 2) {
if (nyquist2[indx >> 1]) { if (nyquist2[indx >> 1]) {
// area interpolation // area interpolation
@ -963,7 +970,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c
//populate G at R/B sites //populate G at R/B sites
for (int rr = 8; rr < rr1 - 8; rr++) for (int rr = 8; rr < rr1 - 8; rr++)
for (int indx = rr * ts + 8 + (FC(rr, 2) & 1); indx < rr * ts + cc1 - 8; indx += 2) { for (int indx = rr * ts + 8 + (fc(cfarray, rr, 2) & 1); indx < rr * ts + cc1 - 8; indx += 2) {
//first ask if one gets more directional discrimination from nearby B/R sites //first ask if one gets more directional discrimination from nearby B/R sites
float hvwtalt = xdivf(hvwt[(indx - m1) >> 1] + hvwt[(indx + p1) >> 1] + hvwt[(indx - p1) >> 1] + hvwt[(indx + m1) >> 1], 2); float hvwtalt = xdivf(hvwt[(indx - m1) >> 1] + hvwt[(indx + p1) >> 1] + hvwt[(indx - p1) >> 1] + hvwt[(indx + m1) >> 1], 2);
@ -986,7 +993,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c
// refine Nyquist areas using G curvatures // refine Nyquist areas using G curvatures
if(doNyquist) { if(doNyquist) {
for (int rr = nystartrow; rr < nyendrow; rr++) for (int rr = nystartrow; rr < nyendrow; rr++)
for (int indx = rr * ts + nystartcol + (FC(rr, 2) & 1); indx < rr * ts + nyendcol; indx += 2) { for (int indx = rr * ts + nystartcol + (fc(cfarray, rr, 2) & 1); indx < rr * ts + nyendcol; indx += 2) {
if (nyquist2[indx >> 1]) { if (nyquist2[indx >> 1]) {
//local averages (over Nyquist pixels only) of G curvature squared //local averages (over Nyquist pixels only) of G curvature squared
@ -1009,7 +1016,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c
#ifdef __SSE2__ #ifdef __SSE2__
for (int rr = 6; rr < rr1 - 6; rr++) { for (int rr = 6; rr < rr1 - 6; rr++) {
if((FC(rr, 2) & 1) == 0) { if((fc(cfarray, rr, 2) & 1) == 0) {
for (int cc = 6, indx = rr * ts + cc; cc < cc1 - 6; cc += 8, indx += 8) { for (int cc = 6, indx = rr * ts + cc; cc < cc1 - 6; cc += 8, indx += 8) {
vfloat tempv = LC2VFU(cfa[indx + 1]); vfloat tempv = LC2VFU(cfa[indx + 1]);
vfloat Dgrbsq1pv = (SQRV(tempv - LC2VFU(cfa[indx + 1 - p1])) + SQRV(tempv - LC2VFU(cfa[indx + 1 + p1]))); vfloat Dgrbsq1pv = (SQRV(tempv - LC2VFU(cfa[indx + 1 - p1])) + SQRV(tempv - LC2VFU(cfa[indx + 1 + p1])));
@ -1035,7 +1042,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c
#else #else
for (int rr = 6; rr < rr1 - 6; rr++) { for (int rr = 6; rr < rr1 - 6; rr++) {
if((FC(rr, 2) & 1) == 0) { if((fc(cfarray, rr, 2) & 1) == 0) {
for (int cc = 6, indx = rr * ts + cc; cc < cc1 - 6; cc += 2, indx += 2) { for (int cc = 6, indx = rr * ts + cc; cc < cc1 - 6; cc += 2, indx += 2) {
delp[indx >> 1] = fabsf(cfa[indx + p1] - cfa[indx - p1]); delp[indx >> 1] = fabsf(cfa[indx + p1] - cfa[indx - p1]);
delm[indx >> 1] = fabsf(cfa[indx + m1] - cfa[indx - m1]); delm[indx >> 1] = fabsf(cfa[indx + m1] - cfa[indx - m1]);
@ -1064,7 +1071,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c
for (int rr = 8; rr < rr1 - 8; rr++) { for (int rr = 8; rr < rr1 - 8; rr++) {
#ifdef __SSE2__ #ifdef __SSE2__
for (int indx = rr * ts + 8 + (FC(rr, 2) & 1), indx1 = indx >> 1; indx < rr * ts + cc1 - 8; indx += 8, indx1 += 4) { for (int indx = rr * ts + 8 + (fc(cfarray, rr, 2) & 1), indx1 = indx >> 1; indx < rr * ts + cc1 - 8; indx += 8, indx1 += 4) {
//diagonal colour ratios //diagonal colour ratios
vfloat cfav = LC2VFU(cfa[indx]); vfloat cfav = LC2VFU(cfa[indx]);
@ -1129,7 +1136,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c
#else #else
for (int cc = 8 + (FC(rr, 2) & 1), indx = rr * ts + cc, indx1 = indx >> 1; cc < cc1 - 8; cc += 2, indx += 2, indx1++) { for (int cc = 8 + (fc(cfarray, rr, 2) & 1), indx = rr * ts + cc, indx1 = indx >> 1; cc < cc1 - 8; cc += 2, indx += 2, indx1++) {
//diagonal colour ratios //diagonal colour ratios
float crse = xmul2f(cfa[indx + m1]) / (eps + cfa[indx] + (cfa[indx + m2])); float crse = xmul2f(cfa[indx + m1]) / (eps + cfa[indx] + (cfa[indx + m2]));
@ -1219,7 +1226,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c
for (int rr = 10; rr < rr1 - 10; rr++) for (int rr = 10; rr < rr1 - 10; rr++)
#ifdef __SSE2__ #ifdef __SSE2__
for (int indx = rr * ts + 10 + (FC(rr, 2) & 1), indx1 = indx >> 1; indx < rr * ts + cc1 - 10; indx += 8, indx1 += 4) { for (int indx = rr * ts + 10 + (fc(cfarray, rr, 2) & 1), indx1 = indx >> 1; indx < rr * ts + cc1 - 10; indx += 8, indx1 += 4) {
//first ask if one gets more directional discrimination from nearby B/R sites //first ask if one gets more directional discrimination from nearby B/R sites
vfloat pmwtaltv = zd25v * (LVFU(pmwt[(indx - m1) >> 1]) + LVFU(pmwt[(indx + p1) >> 1]) + LVFU(pmwt[(indx - p1) >> 1]) + LVFU(pmwt[(indx + m1) >> 1])); vfloat pmwtaltv = zd25v * (LVFU(pmwt[(indx - m1) >> 1]) + LVFU(pmwt[(indx + p1) >> 1]) + LVFU(pmwt[(indx - p1) >> 1]) + LVFU(pmwt[(indx + m1) >> 1]));
@ -1231,7 +1238,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c
#else #else
for (int cc = 10 + (FC(rr, 2) & 1), indx = rr * ts + cc, indx1 = indx >> 1; cc < cc1 - 10; cc += 2, indx += 2, indx1++) { for (int cc = 10 + (fc(cfarray, rr, 2) & 1), indx = rr * ts + cc, indx1 = indx >> 1; cc < cc1 - 10; cc += 2, indx += 2, indx1++) {
//first ask if one gets more directional discrimination from nearby B/R sites //first ask if one gets more directional discrimination from nearby B/R sites
float pmwtalt = xdivf(pmwt[(indx - m1) >> 1] + pmwt[(indx + p1) >> 1] + pmwt[(indx - p1) >> 1] + pmwt[(indx + m1) >> 1], 2); float pmwtalt = xdivf(pmwt[(indx - m1) >> 1] + pmwt[(indx + p1) >> 1] + pmwt[(indx - p1) >> 1] + pmwt[(indx + m1) >> 1], 2);
@ -1247,7 +1254,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c
for (int rr = 12; rr < rr1 - 12; rr++) for (int rr = 12; rr < rr1 - 12; rr++)
#ifdef __SSE2__ #ifdef __SSE2__
for (int indx = rr * ts + 12 + (FC(rr, 2) & 1), indx1 = indx >> 1; indx < rr * ts + cc1 - 12; indx += 8, indx1 += 4) { for (int indx = rr * ts + 12 + (fc(cfarray, rr, 2) & 1), indx1 = indx >> 1; indx < rr * ts + cc1 - 12; indx += 8, indx1 += 4) {
vmask copymask = vmaskf_ge(vabsf(zd5v - LVFU(pmwt[indx1])), vabsf(zd5v - LVFU(hvwt[indx1]))); vmask copymask = vmaskf_ge(vabsf(zd5v - LVFU(pmwt[indx1])), vabsf(zd5v - LVFU(hvwt[indx1])));
if(_mm_movemask_ps((vfloat)copymask)) { // if for any of the 4 pixels the condition is true, do the maths for all 4 pixels and mask the unused out at the end if(_mm_movemask_ps((vfloat)copymask)) { // if for any of the 4 pixels the condition is true, do the maths for all 4 pixels and mask the unused out at the end
@ -1302,7 +1309,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c
#else #else
for (int cc = 12 + (FC(rr, 2) & 1), indx = rr * ts + cc, indx1 = indx >> 1; cc < cc1 - 12; cc += 2, indx += 2, indx1++) { for (int cc = 12 + (fc(cfarray, rr, 2) & 1), indx = rr * ts + cc, indx1 = indx >> 1; cc < cc1 - 12; cc += 2, indx += 2, indx1++) {
if (fabsf(0.5f - pmwt[indx >> 1]) < fabsf(0.5f - hvwt[indx >> 1]) ) { if (fabsf(0.5f - pmwt[indx >> 1]) < fabsf(0.5f - hvwt[indx >> 1]) ) {
continue; continue;
@ -1400,7 +1407,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c
for (int rr = 14; rr < rr1 - 14; rr++) for (int rr = 14; rr < rr1 - 14; rr++)
#ifdef __SSE2__ #ifdef __SSE2__
for (int cc = 14 + (FC(rr, 2) & 1), indx = rr * ts + cc, c = 1 - FC(rr, cc) / 2; cc < cc1 - 14; cc += 8, indx += 8) { for (int cc = 14 + (fc(cfarray, rr, 2) & 1), indx = rr * ts + cc, c = 1 - fc(cfarray, rr, cc) / 2; cc < cc1 - 14; cc += 8, indx += 8) {
vfloat tempv = epsv + vabsf(LVFU(Dgrb[c][(indx - m1) >> 1]) - LVFU(Dgrb[c][(indx + m1) >> 1])); vfloat tempv = epsv + vabsf(LVFU(Dgrb[c][(indx - m1) >> 1]) - LVFU(Dgrb[c][(indx + m1) >> 1]));
vfloat temp2v = epsv + vabsf(LVFU(Dgrb[c][(indx + p1) >> 1]) - LVFU(Dgrb[c][(indx - p1) >> 1])); vfloat temp2v = epsv + vabsf(LVFU(Dgrb[c][(indx + p1) >> 1]) - LVFU(Dgrb[c][(indx - p1) >> 1]));
vfloat wtnwv = onev / (tempv + vabsf(LVFU(Dgrb[c][(indx - m1) >> 1]) - LVFU(Dgrb[c][(indx - m3) >> 1])) + vabsf(LVFU(Dgrb[c][(indx + m1) >> 1]) - LVFU(Dgrb[c][(indx - m3) >> 1]))); vfloat wtnwv = onev / (tempv + vabsf(LVFU(Dgrb[c][(indx - m1) >> 1]) - LVFU(Dgrb[c][(indx - m3) >> 1])) + vabsf(LVFU(Dgrb[c][(indx + m1) >> 1]) - LVFU(Dgrb[c][(indx - m3) >> 1])));
@ -1416,7 +1423,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c
#else #else
for (int cc = 14 + (FC(rr, 2) & 1), indx = rr * ts + cc, c = 1 - FC(rr, cc) / 2; cc < cc1 - 14; cc += 2, indx += 2) { for (int cc = 14 + (fc(cfarray, rr, 2) & 1), indx = rr * ts + cc, c = 1 - fc(cfarray, rr, cc) / 2; cc < cc1 - 14; cc += 2, indx += 2) {
float wtnw = 1.f / (eps + fabsf(Dgrb[c][(indx - m1) >> 1] - Dgrb[c][(indx + m1) >> 1]) + fabsf(Dgrb[c][(indx - m1) >> 1] - Dgrb[c][(indx - m3) >> 1]) + fabsf(Dgrb[c][(indx + m1) >> 1] - Dgrb[c][(indx - m3) >> 1])); float wtnw = 1.f / (eps + fabsf(Dgrb[c][(indx - m1) >> 1] - Dgrb[c][(indx + m1) >> 1]) + fabsf(Dgrb[c][(indx - m1) >> 1] - Dgrb[c][(indx - m3) >> 1]) + fabsf(Dgrb[c][(indx + m1) >> 1] - Dgrb[c][(indx - m3) >> 1]));
float wtne = 1.f / (eps + fabsf(Dgrb[c][(indx + p1) >> 1] - Dgrb[c][(indx - p1) >> 1]) + fabsf(Dgrb[c][(indx + p1) >> 1] - Dgrb[c][(indx + p3) >> 1]) + fabsf(Dgrb[c][(indx - p1) >> 1] - Dgrb[c][(indx + p3) >> 1])); float wtne = 1.f / (eps + fabsf(Dgrb[c][(indx + p1) >> 1] - Dgrb[c][(indx - p1) >> 1]) + fabsf(Dgrb[c][(indx + p1) >> 1] - Dgrb[c][(indx + p3) >> 1]) + fabsf(Dgrb[c][(indx - p1) >> 1] - Dgrb[c][(indx + p3) >> 1]));
float wtsw = 1.f / (eps + fabsf(Dgrb[c][(indx - p1) >> 1] - Dgrb[c][(indx + p1) >> 1]) + fabsf(Dgrb[c][(indx - p1) >> 1] - Dgrb[c][(indx + m3) >> 1]) + fabsf(Dgrb[c][(indx + p1) >> 1] - Dgrb[c][(indx - p3) >> 1])); float wtsw = 1.f / (eps + fabsf(Dgrb[c][(indx - p1) >> 1] - Dgrb[c][(indx + p1) >> 1]) + fabsf(Dgrb[c][(indx - p1) >> 1] - Dgrb[c][(indx + m3) >> 1]) + fabsf(Dgrb[c][(indx + p1) >> 1] - Dgrb[c][(indx - p3) >> 1]));
@ -1435,7 +1442,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c
vfloat twov = F2V(2.f); vfloat twov = F2V(2.f);
vmask selmask; vmask selmask;
if((FC(16, 2) & 1) == 1) { if((fc(cfarray, 16, 2) & 1) == 1) {
selmask = _mm_set_epi32(0xffffffff, 0, 0xffffffff, 0); selmask = _mm_set_epi32(0xffffffff, 0, 0xffffffff, 0);
offset = 1; offset = 1;
} else { } else {
@ -1510,7 +1517,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c
#else #else
if((FC(rr, 2) & 1) == 1) { if((fc(cfarray, rr, 2) & 1) == 1) {
for (; indx < rr * ts + cc1 - 16 - (cc1 & 1); indx++, col++) { for (; indx < rr * ts + cc1 - 16 - (cc1 & 1); indx++, col++) {
float temp = 1.f / (hvwt[(indx - v1) >> 1] + 2.f - hvwt[(indx + 1) >> 1] - hvwt[(indx - 1) >> 1] + hvwt[(indx + v1) >> 1]); float temp = 1.f / (hvwt[(indx - v1) >> 1] + 2.f - hvwt[(indx + 1) >> 1] - hvwt[(indx - 1) >> 1] + hvwt[(indx + v1) >> 1]);
red[row][col] = 65535.f * (rgbgreen[indx] - ((hvwt[(indx - v1) >> 1]) * Dgrb[0][(indx - v1) >> 1] + (1.f - hvwt[(indx + 1) >> 1]) * Dgrb[0][(indx + 1) >> 1] + (1.f - hvwt[(indx - 1) >> 1]) * Dgrb[0][(indx - 1) >> 1] + (hvwt[(indx + v1) >> 1]) * Dgrb[0][(indx + v1) >> 1]) * red[row][col] = 65535.f * (rgbgreen[indx] - ((hvwt[(indx - v1) >> 1]) * Dgrb[0][(indx - v1) >> 1] + (1.f - hvwt[(indx + 1) >> 1]) * Dgrb[0][(indx + 1) >> 1] + (1.f - hvwt[(indx - 1) >> 1]) * Dgrb[0][(indx - 1) >> 1] + (hvwt[(indx + v1) >> 1]) * Dgrb[0][(indx + v1) >> 1]) *
@ -1592,7 +1599,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c
free(buffer); free(buffer);
} }
if(border < 4) { if(border < 4) {
border_interpolate2(W, H, 3, rawData, red, green, blue); border_interpolate(W, H, 3, rawData, red, green, blue);
} }
if(plistener) { if(plistener) {

View File

@ -52,8 +52,8 @@
* *
* !! locked arrays cannot be resized and cannot be unlocked again !! * !! locked arrays cannot be resized and cannot be unlocked again !!
*/ */
#ifndef ARRAY2D_H_ #pragma once
#define ARRAY2D_H_
#include <csignal> // for raise() #include <csignal> // for raise()
#include <cassert> #include <cassert>
@ -249,7 +249,7 @@ public:
ar_realloc(w, h, offset); ar_realloc(w, h, offset);
if (flags & ARRAY2D_CLEAR_DATA) { if (flags & ARRAY2D_CLEAR_DATA) {
memset(data + offset, 0, w * h * sizeof(T)); memset(data + offset, 0, static_cast<unsigned long>(w) * h * sizeof(T));
} }
} }
@ -313,4 +313,3 @@ public:
return list[index]; return list[index];
} }
}; };
#endif /* array2D_H_ */

View File

@ -20,7 +20,42 @@
#include "array2D.h" #include "array2D.h"
#include "median.h" #include "median.h"
#include "pixelsmap.h" #include "pixelsmap.h"
#include "rawimage.h"
#include "rawimagesource.h" #include "rawimagesource.h"
//#define BENCHMARK
#include "StopWatch.h"
namespace
{
unsigned fc(const unsigned int cfa[2][2], int r, int c) {
return cfa[r & 1][c & 1];
}
inline void sum5x5(const array2D<float>& in, int col, float &sum) {
#ifdef __SSE2__
// sum up 5*4 = 20 values using SSE
// 10 fabs function calls and 10 float additions with SSE
const vfloat sumv = (vabsf(LVFU(in[0][col])) + vabsf(LVFU(in[1][col]))) +
(vabsf(LVFU(in[2][col])) + vabsf(LVFU(in[3][col]))) +
vabsf(LVFU(in[4][col]));
// horizontally add the values and add the result to hfnbrave
sum += vhadd(sumv);
// add remaining 5 values of last column
sum += (fabsf(in[0][col + 4]) + fabsf(in[1][col + 4])) +
(fabsf(in[2][col + 4]) + fabsf(in[3][col + 4])) +
fabsf(in[4][col + 4]);
#else
// 25 fabs function calls and 25 float additions without SSE
for (int nn = col; nn < col + 5; ++nn) {
sum += (fabsf(in[0][nn]) + fabsf(in[1][nn])) +
(fabsf(in[2][nn]) + fabsf(in[3][nn])) +
fabsf(in[4][nn]);
}
#endif
}
}
namespace rtengine namespace rtengine
{ {
@ -30,6 +65,7 @@ namespace rtengine
*/ */
int RawImageSource::interpolateBadPixelsBayer(const PixelsMap &bitmapBads, array2D<float> &rawData) int RawImageSource::interpolateBadPixelsBayer(const PixelsMap &bitmapBads, array2D<float> &rawData)
{ {
const unsigned int cfarray[2][2] = {{FC(0,0), FC(0,1)}, {FC(1,0), FC(1,1)}};
constexpr float eps = 1.f; constexpr float eps = 1.f;
int counter = 0; int counter = 0;
@ -53,7 +89,7 @@ int RawImageSource::interpolateBadPixelsBayer(const PixelsMap &bitmapBads, array
float wtdsum = 0.f, norm = 0.f; float wtdsum = 0.f, norm = 0.f;
// diagonal interpolation // diagonal interpolation
if (FC(row, col) == 1) { if (fc(cfarray, row, col) == 1) {
// green channel. We can use closer pixels than for red or blue channel. Distance to center pixel is sqrt(2) => weighting is 0.70710678 // green channel. We can use closer pixels than for red or blue channel. Distance to center pixel is sqrt(2) => weighting is 0.70710678
// For green channel following pixels will be used for interpolation. Pixel to be interpolated is in center. // For green channel following pixels will be used for interpolation. Pixel to be interpolated is in center.
// 1 means that pixel is used in this step, if itself and his counterpart are not marked bad // 1 means that pixel is used in this step, if itself and his counterpart are not marked bad
@ -436,126 +472,124 @@ int RawImageSource::interpolateBadPixelsXtrans(const PixelsMap &bitmapBads)
/* Search for hot or dead pixels in the image and update the map /* Search for hot or dead pixels in the image and update the map
* For each pixel compare its value to the average of similar color surrounding * For each pixel compare its value to the average of similar color surrounding
* (Taken from Emil Martinec idea) * (Taken from Emil Martinec idea)
* (Optimized by Ingo Weyrich 2013 and 2015) * (Optimized by Ingo Weyrich 2013, 2015, and 2019)
*/ */
int RawImageSource::findHotDeadPixels(PixelsMap &bpMap, const float thresh, const bool findHotPixels, const bool findDeadPixels) const int RawImageSource::findHotDeadPixels(PixelsMap &bpMap, const float thresh, const bool findHotPixels, const bool findDeadPixels) const
{ {
BENCHFUN
const float varthresh = (20.0 * (thresh / 100.0) + 1.0) / 24.f; const float varthresh = (20.0 * (thresh / 100.0) + 1.0) / 24.f;
// allocate temporary buffer
float* cfablur = new float[H * W];
// counter for dead or hot pixels // counter for dead or hot pixels
int counter = 0; int counter = 0;
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp parallel #pragma omp parallel reduction(+:counter)
#endif #endif
{ {
array2D<float> cfablur(W, 5, ARRAY2D_CLEAR_DATA);
int firstRow = -1;
int lastRow = -1;
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp for schedule(dynamic,16) nowait // note, static scheduling is important in this implementation
#pragma omp for schedule(static) nowait
#endif #endif
for (int i = 2; i < H - 2; i++) { for (int i = 2; i < H - 2; ++i) {
for (int j = 2; j < W - 2; j++) { if (firstRow == -1) {
firstRow = i;
if (firstRow > 2) {
for (int row = firstRow - 2; row < firstRow; ++row) {
const int destRow = row % 5;
for (int j = 2; j < W - 2; ++j) {
const float temp = median(rawData[row - 2][j - 2], rawData[row - 2][j], rawData[row - 2][j + 2],
rawData[row][j - 2], rawData[row][j], rawData[row][j + 2],
rawData[row + 2][j - 2], rawData[row + 2][j], rawData[row + 2][j + 2]);
cfablur[destRow][j] = rawData[row][j] - temp;
}
}
}
}
lastRow = i;
const int destRow = i % 5;
for (int j = 2; j < W - 2; ++j) {
const float temp = median(rawData[i - 2][j - 2], rawData[i - 2][j], rawData[i - 2][j + 2], const float temp = median(rawData[i - 2][j - 2], rawData[i - 2][j], rawData[i - 2][j + 2],
rawData[i][j - 2], rawData[i][j], rawData[i][j + 2], rawData[i][j - 2], rawData[i][j], rawData[i][j + 2],
rawData[i + 2][j - 2], rawData[i + 2][j], rawData[i + 2][j + 2]); rawData[i + 2][j - 2], rawData[i + 2][j], rawData[i + 2][j + 2]);
cfablur[i * W + j] = rawData[i][j] - temp; cfablur[destRow][j] = rawData[i][j] - temp;
}
} }
// process borders. Former version calculated the median using mirrored border which does not make sense because the original pixel loses weight if (i - 1 > firstRow) {
// Setting the difference between pixel and median for border pixels to zero should do the job not worse then former version const int rr = i - 2;
#ifdef _OPENMP const int rr0 = rr % 5;
#pragma omp single for (int cc = 2; cc < W - 2; ++cc) {
#endif
{
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < W; ++j) {
cfablur[i * W + j] = 0.f;
}
}
for (int i = 2; i < H - 2; ++i) {
for (int j = 0; j < 2; ++j) {
cfablur[i * W + j] = 0.f;
}
for (int j = W - 2; j < W; ++j) {
cfablur[i * W + j] = 0.f;
}
}
for (int i = H - 2; i < H; ++i) {
for (int j = 0; j < W; ++j) {
cfablur[i * W + j] = 0.f;
}
}
}
#ifdef _OPENMP
#pragma omp barrier // barrier because of nowait clause above
#pragma omp for reduction(+:counter) schedule(dynamic,16)
#endif
//cfa pixel heat/death evaluation
for (int rr = 2; rr < H - 2; ++rr) {
for (int cc = 2, rrmWpcc = rr * W + 2; cc < W - 2; ++cc, ++rrmWpcc) {
//evaluate pixel for heat/death //evaluate pixel for heat/death
float pixdev = cfablur[rrmWpcc]; float pixdev = cfablur[rr0][cc];
if (pixdev == 0.f) { if (!findDeadPixels && pixdev <= 0.f) {
continue; continue;
} }
if ((!findDeadPixels) && pixdev < 0) { if (!findHotPixels && pixdev >= 0.f) {
continue;
}
if ((!findHotPixels) && pixdev > 0) {
continue; continue;
} }
pixdev = fabsf(pixdev); pixdev = fabsf(pixdev);
float hfnbrave = -pixdev; float hfnbrave = -pixdev;
sum5x5(cfablur, cc - 2, hfnbrave);
#ifdef __SSE2__
// sum up 5*4 = 20 values using SSE
// 10 fabs function calls and 10 float additions with SSE
vfloat sum = vabsf(LVFU(cfablur[(rr - 2) * W + cc - 2])) + vabsf(LVFU(cfablur[(rr - 1) * W + cc - 2]));
sum += vabsf(LVFU(cfablur[(rr) * W + cc - 2]));
sum += vabsf(LVFU(cfablur[(rr + 1) * W + cc - 2]));
sum += vabsf(LVFU(cfablur[(rr + 2) * W + cc - 2]));
// horizontally add the values and add the result to hfnbrave
hfnbrave += vhadd(sum);
// add remaining 5 values of last column
for (int mm = rr - 2; mm <= rr + 2; ++mm) {
hfnbrave += fabsf(cfablur[mm * W + cc + 2]);
}
#else
// 25 fabs function calls and 25 float additions without SSE
for (int mm = rr - 2; mm <= rr + 2; ++mm) {
for (int nn = cc - 2; nn <= cc + 2; ++nn) {
hfnbrave += fabsf(cfablur[mm * W + nn]);
}
}
#endif
if (pixdev > varthresh * hfnbrave) { if (pixdev > varthresh * hfnbrave) {
// mark the pixel as "bad" // mark the pixel as "bad"
bpMap.set(cc, rr); bpMap.set(cc, rr);
counter++; ++counter;
}
} //end of pixel evaluation
}
}
if (lastRow > 0 && lastRow < H - 2) {
//cfa pixel heat/death evaluation
for (int rr = lastRow - 1; rr < lastRow + 1; ++rr) {
const int i = rr + 2;
const int destRow = i % 5;
if (i >= H - 2) {
for (int j = 2; j < W - 2; j++) {
cfablur[destRow][j] = 0.f;
}
} else {
for (int j = 2; j < W - 2; ++j) {
const float temp = median(rawData[i - 2][j - 2], rawData[i - 2][j], rawData[i - 2][j + 2],
rawData[i][j - 2], rawData[i][j], rawData[i][j + 2],
rawData[i + 2][j - 2], rawData[i + 2][j], rawData[i + 2][j + 2]);
cfablur[destRow][j] = rawData[i][j] - temp;
}
}
const int rr0 = rr % 5;
for (int cc = 2; cc < W - 2; ++cc) {
//evaluate pixel for heat/death
float pixdev = cfablur[rr0][cc];
if (!findDeadPixels && pixdev <= 0.f) {
continue;
}
if (!findHotPixels && pixdev >= 0.f) {
continue;
}
pixdev = fabsf(pixdev);
float hfnbrave = -pixdev;
sum5x5(cfablur, cc - 2, hfnbrave);
if (pixdev > varthresh * hfnbrave) {
// mark the pixel as "bad"
bpMap.set(cc, rr);
++counter;
} }
}//end of pixel evaluation }//end of pixel evaluation
} }
}
}//end of parallel processing }//end of parallel processing
delete [] cfablur;
return counter; return counter;
} }

View File

@ -16,22 +16,16 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>. * along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/ */
#ifndef _BILATERAL2_ #pragma once
#define _BILATERAL2_
#include <algorithm>
#include <cmath> #include <cmath>
#include <cstring>
#include <cstdio> #include <cstdio>
#include <glibmm.h> #include <cstring>
#include "rtengine.h"
#include "rt_math.h"
#include "mytime.h"
#include "array2D.h" #include "array2D.h"
#ifdef _OPENMP #include "LUT.h"
#include <omp.h> #include "rt_math.h"
#endif
using namespace rtengine; using namespace rtengine;
@ -573,7 +567,7 @@ template<class T> void bilateral (T** src, T** dst, int W, int H, int sigmar, do
// calculate histogram at the beginning of the row // calculate histogram at the beginning of the row
rhist.clear(); rhist.clear();
for (int x = MAX(0, row_from - r); x <= MIN(H, row_from + r); x++) for (int x = std::max(0, row_from - r); x <= std::min(H, row_from + r); x++)
for (int y = 0; y < r + 1; y++) { for (int y = 0; y < r + 1; y++) {
rhist[((int)src[x][y]) >> TRANSBIT]++; rhist[((int)src[x][y]) >> TRANSBIT]++;
} }
@ -584,12 +578,12 @@ template<class T> void bilateral (T** src, T** dst, int W, int H, int sigmar, do
// calculate histogram at the beginning of the row // calculate histogram at the beginning of the row
if (i > r) if (i > r)
for (int x = 0; x <= MIN(H, r); x++) { for (int x = 0; x <= std::min(H, r); x++) {
rhist[((int)src[i - r - 1][x]) >> TRANSBIT]--; rhist[((int)src[i - r - 1][x]) >> TRANSBIT]--;
} }
if (i < H - r) if (i < H - r)
for (int x = 0; x <= MIN(H, r); x++) { for (int x = 0; x <= std::min(H, r); x++) {
rhist[((int)src[i + r][x]) >> TRANSBIT]++; rhist[((int)src[i + r][x]) >> TRANSBIT]++;
} }
@ -599,12 +593,12 @@ template<class T> void bilateral (T** src, T** dst, int W, int H, int sigmar, do
// subtract pixels at the left and add pixels at the right // subtract pixels at the left and add pixels at the right
if (j > r) if (j > r)
for (int x = MAX(0, i - r); x <= MIN(i + r, H - 1); x++) { for (int x = std::max(0, i - r); x <= std::min(i + r, H - 1); x++) {
hist[(int)(src[x][j - r - 1]) >> TRANSBIT]--; hist[(int)(src[x][j - r - 1]) >> TRANSBIT]--;
} }
if (j < W - r) if (j < W - r)
for (int x = MAX(0, i - r); x <= MIN(i + r, H - 1); x++) { for (int x = std::max(0, i - r); x <= std::min(i + r, H - 1); x++) {
hist[((int)src[x][j + r]) >> TRANSBIT]++; hist[((int)src[x][j + r]) >> TRANSBIT]++;
} }
@ -643,5 +637,3 @@ template<class T> void bilateral (T** src, T** dst, int W, int H, int sigmar, do
} }
#undef BINBIT #undef BINBIT
#undef TRANSBIT #undef TRANSBIT
#endif

421
rtengine/boxblur.cc Normal file
View File

@ -0,0 +1,421 @@
/*
* This file is part of RawTherapee.
*
* Copyright (C) 2010 Emil Martinec <ejmartin@uchicago.edu>
* Copyright (C) 2019 Ingo Weyrich <heckflosse67@gmx.de>
*
* 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 <https://www.gnu.org/licenses/>.
*/
#include <memory>
#include <cmath>
#include "boxblur.h"
#include "rt_math.h"
#include "opthelper.h"
namespace rtengine
{
void boxblur(float** src, float** dst, int radius, int W, int H, bool multiThread)
{
//box blur using rowbuffers and linebuffers instead of a full size buffer
radius = rtengine::min(radius, W - 1, H - 1);
if (radius == 0) {
if (src != dst) {
#ifdef _OPENMP
#pragma omp parallel for if (multiThread)
#endif
for (int row = 0; row < H; ++row) {
for (int col = 0; col < W; ++col) {
dst[row][col] = src[row][col];
}
}
}
return;
}
constexpr int numCols = 8; // process numCols columns at once for better usage of L1 cpu cache
#ifdef _OPENMP
#pragma omp parallel if (multiThread)
#endif
{
std::unique_ptr<float[]> buffer(new float[numCols * (radius + 1)]);
//horizontal blur
float* const lineBuffer = buffer.get();
#ifdef _OPENMP
#pragma omp for
#endif
for (int row = 0; row < H; ++row) {
float len = radius + 1;
float tempval = src[row][0];
lineBuffer[0] = tempval;
for (int j = 1; j <= radius; j++) {
tempval += src[row][j];
}
tempval /= len;
dst[row][0] = tempval;
for (int col = 1; col <= radius; ++col) {
lineBuffer[col] = src[row][col];
tempval = (tempval * len + src[row][col + radius]) / (len + 1);
dst[row][col] = tempval;
++len;
}
int pos = 0;
for (int col = radius + 1; col < W - radius; ++col) {
const float oldVal = lineBuffer[pos];
lineBuffer[pos] = src[row][col];
tempval = tempval + (src[row][col + radius] - oldVal) / len;
dst[row][col] = tempval;
++pos;
pos = pos <= radius ? pos : 0;
}
for (int col = W - radius; col < W; ++col) {
tempval = (tempval * len - lineBuffer[pos]) / (len - 1);
dst[row][col] = tempval;
--len;
++pos;
pos = pos <= radius ? pos : 0;
}
}
//vertical blur
#ifdef __SSE2__
vfloat (* const rowBuffer)[2] = (vfloat(*)[2]) buffer.get();
const vfloat leninitv = F2V(radius + 1);
const vfloat onev = F2V(1.f);
vfloat tempv, temp1v, lenv, lenp1v, lenm1v, rlenv;
#ifdef _OPENMP
#pragma omp for nowait
#endif
for (int col = 0; col < W - 7; col += 8) {
lenv = leninitv;
tempv = LVFU(dst[0][col]);
temp1v = LVFU(dst[0][col + 4]);
rowBuffer[0][0] = tempv;
rowBuffer[0][1] = temp1v;
for (int i = 1; i <= radius; ++i) {
tempv = tempv + LVFU(dst[i][col]);
temp1v = temp1v + LVFU(dst[i][col + 4]);
}
tempv = tempv / lenv;
temp1v = temp1v / lenv;
STVFU(dst[0][col], tempv);
STVFU(dst[0][col + 4], temp1v);
for (int row = 1; row <= radius; ++row) {
rowBuffer[row][0] = LVFU(dst[row][col]);
rowBuffer[row][1] = LVFU(dst[row][col + 4]);
lenp1v = lenv + onev;
tempv = (tempv * lenv + LVFU(dst[row + radius][col])) / lenp1v;
temp1v = (temp1v * lenv + LVFU(dst[row + radius][col + 4])) / lenp1v;
STVFU(dst[row][col], tempv);
STVFU(dst[row][col + 4], temp1v);
lenv = lenp1v;
}
rlenv = onev / lenv;
int pos = 0;
for (int row = radius + 1; row < H - radius; ++row) {
vfloat oldVal0 = rowBuffer[pos][0];
vfloat oldVal1 = rowBuffer[pos][1];
rowBuffer[pos][0] = LVFU(dst[row][col]);
rowBuffer[pos][1] = LVFU(dst[row][col + 4]);
tempv = tempv + (LVFU(dst[row + radius][col]) - oldVal0) * rlenv ;
temp1v = temp1v + (LVFU(dst[row + radius][col + 4]) - oldVal1) * rlenv ;
STVFU(dst[row][col], tempv);
STVFU(dst[row][col + 4], temp1v);
++pos;
pos = pos <= radius ? pos : 0;
}
for (int row = H - radius; row < H; ++row) {
lenm1v = lenv - onev;
tempv = (tempv * lenv - rowBuffer[pos][0]) / lenm1v;
temp1v = (temp1v * lenv - rowBuffer[pos][1]) / lenm1v;
STVFU(dst[row][col], tempv);
STVFU(dst[row][col + 4], temp1v);
lenv = lenm1v;
++pos;
pos = pos <= radius ? pos : 0;
}
}
#else
float (* const rowBuffer)[8] = (float(*)[8]) buffer.get();
#ifdef _OPENMP
#pragma omp for nowait
#endif
for (int col = 0; col < W - numCols + 1; col += 8) {
float len = radius + 1;
for (int k = 0; k < numCols; ++k) {
rowBuffer[0][k] = dst[0][col + k];
}
for (int i = 1; i <= radius; ++i) {
for (int k = 0; k < numCols; ++k) {
dst[0][col + k] += dst[i][col + k];
}
}
for(int k = 0; k < numCols; ++k) {
dst[0][col + k] /= len;
}
for (int row = 1; row <= radius; ++row) {
for(int k = 0; k < numCols; ++k) {
rowBuffer[row][k] = dst[row][col + k];
dst[row][col + k] = (dst[row - 1][col + k] * len + dst[row + radius][col + k]) / (len + 1);
}
len ++;
}
int pos = 0;
for (int row = radius + 1; row < H - radius; ++row) {
for(int k = 0; k < numCols; ++k) {
float oldVal = rowBuffer[pos][k];
rowBuffer[pos][k] = dst[row][col + k];
dst[row][col + k] = dst[row - 1][col + k] + (dst[row + radius][col + k] - oldVal) / len;
}
++pos;
pos = pos <= radius ? pos : 0;
}
for (int row = H - radius; row < H; ++row) {
for(int k = 0; k < numCols; ++k) {
dst[row][col + k] = (dst[row - 1][col + k] * len - rowBuffer[pos][k]) / (len - 1);
}
len --;
++pos;
pos = pos <= radius ? pos : 0;
}
}
#endif
//vertical blur, remaining columns
#ifdef _OPENMP
#pragma omp single
#endif
{
const int remaining = W % numCols;
if (remaining > 0) {
float (* const rowBuffer)[8] = (float(*)[8]) buffer.get();
const int col = W - remaining;
float len = radius + 1;
for(int k = 0; k < remaining; ++k) {
rowBuffer[0][k] = dst[0][col + k];
}
for (int row = 1; row <= radius; ++row) {
for(int k = 0; k < remaining; ++k) {
dst[0][col + k] += dst[row][col + k];
}
}
for(int k = 0; k < remaining; ++k) {
dst[0][col + k] /= len;
}
for (int row = 1; row <= radius; ++row) {
for(int k = 0; k < remaining; ++k) {
rowBuffer[row][k] = dst[row][col + k];
dst[row][col + k] = (dst[row - 1][col + k] * len + dst[row + radius][col + k]) / (len + 1);
}
len ++;
}
const float rlen = 1.f / len;
int pos = 0;
for (int row = radius + 1; row < H - radius; ++row) {
for(int k = 0; k < remaining; ++k) {
float oldVal = rowBuffer[pos][k];
rowBuffer[pos][k] = dst[row][col + k];
dst[row][col + k] = dst[row - 1][col + k] + (dst[row + radius][col + k] - oldVal) * rlen;
}
++pos;
pos = pos <= radius ? pos : 0;
}
for (int row = H - radius; row < H; ++row) {
for(int k = 0; k < remaining; ++k) {
dst[row][col + k] = (dst[(row - 1)][col + k] * len - rowBuffer[pos][k]) / (len - 1);
}
len --;
++pos;
pos = pos <= radius ? pos : 0;
}
}
}
}
}
void boxabsblur(float** src, float** dst, int radius, int W, int H, bool multiThread)
{
//abs box blur using rowbuffers and linebuffers instead of a full size buffer, W should be a multiple of 16
if (radius == 0) {
if (src != dst) {
#ifdef _OPENMP
#pragma omp parallel for if (multiThread)
#endif
for (int row = 0; row < H; ++row) {
for (int col = 0; col < W; ++col) {
dst[row][col] = std::fabs(src[row][col]);
}
}
}
return;
}
constexpr int numCols = 16; // process numCols columns at once for better usage of L1 cpu cache
#ifdef _OPENMP
#pragma omp parallel if (multiThread)
#endif
{
float buffer[numCols * (radius + 1)] ALIGNED64;
//horizontal blur
float* const lineBuffer = buffer;
#ifdef _OPENMP
#pragma omp for
#endif
for (int row = 0; row < H; ++row) {
float len = radius + 1;
float tempval = std::fabs(src[row][0]);
lineBuffer[0] = tempval;
for (int j = 1; j <= radius; j++) {
tempval += std::fabs(src[row][j]);
}
tempval /= len;
dst[row][0] = tempval;
for (int col = 1; col <= radius; ++col) {
lineBuffer[col] = std::fabs(src[row][col]);
tempval = (tempval * len + std::fabs(src[row][col + radius])) / (len + 1);
dst[row][col] = tempval;
++len;
}
const float rlen = 1.f / len;
int pos = 0;
for (int col = radius + 1; col < W - radius; ++col) {
const float oldVal = lineBuffer[pos];
lineBuffer[pos] = std::fabs(src[row][col]);
tempval = tempval + (std::fabs(src[row][col + radius]) - oldVal) * rlen;
dst[row][col] = tempval;
++pos;
pos = pos <= radius ? pos : 0;
}
for (int col = W - radius; col < W; ++col) {
tempval = (tempval * len - lineBuffer[pos]) / (len - 1);
dst[row][col] = tempval;
--len;
++pos;
pos = pos <= radius ? pos : 0;
}
}
//vertical blur
float (* const rowBuffer)[numCols] = (float(*)[numCols]) buffer;
#ifdef _OPENMP
#pragma omp for
#endif
for (int col = 0; col < W; col += numCols) {
float len = radius + 1;
for (int k = 0; k < numCols; ++k) {
rowBuffer[0][k] = dst[0][col + k];
}
for (int i = 1; i <= radius; ++i) {
for (int k = 0; k < numCols; ++k) {
dst[0][col + k] += dst[i][col + k];
}
}
for(int k = 0; k < numCols; ++k) {
dst[0][col + k] /= len;
}
for (int row = 1; row <= radius; ++row) {
for(int k = 0; k < numCols; ++k) {
rowBuffer[row][k] = dst[row][col + k];
dst[row][col + k] = (dst[row - 1][col + k] * len + dst[row + radius][col + k]) / (len + 1);
}
++len;
}
const float rlen = 1.f / len;
int pos = 0;
for (int row = radius + 1; row < H - radius; ++row) {
for(int k = 0; k < numCols; ++k) {
float oldVal = rowBuffer[pos][k];
rowBuffer[pos][k] = dst[row][col + k];
dst[row][col + k] = dst[row - 1][col + k] + (dst[row + radius][col + k] - oldVal) * rlen;
}
++pos;
pos = pos <= radius ? pos : 0;
}
for (int row = H - radius; row < H; ++row) {
for(int k = 0; k < numCols; ++k) {
dst[row][col + k] = (dst[row - 1][col + k] * len - rowBuffer[pos][k]) / (len - 1);
}
--len;
++pos;
pos = pos <= radius ? pos : 0;
}
}
}
}
void boxblur(float* src, float* dst, int radius, int W, int H, bool multiThread)
{
float* srcp[H];
float* dstp[H];
for (int i = 0; i < H; ++i) {
srcp[i] = src + i * W;
dstp[i] = dst + i * W;
}
boxblur(srcp, dstp, radius, W, H, multiThread);
}
void boxabsblur(float* src, float* dst, int radius, int W, int H, bool multiThread)
{
float* srcp[H];
float* dstp[H];
for (int i = 0; i < H; ++i) {
srcp[i] = src + i * W;
dstp[i] = dst + i * W;
}
boxabsblur(srcp, dstp, radius, W, H, multiThread);
}
}

View File

@ -1,7 +1,7 @@
/* /*
* This file is part of RawTherapee. * This file is part of RawTherapee.
* *
* Copyright (C) 2010 Emil Martinec <ejmartin@uchicago.edu> * Copyright (C) 2019 Ingo Weyrich <heckflosse67@gmx.de>
* *
* RawTherapee is free software: you can redistribute it and/or modify * RawTherapee is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -15,632 +15,15 @@
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>. * along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/ */
#ifndef _BOXBLUR_H_ #pragma once
#define _BOXBLUR_H_
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "alignedbuffer.h"
#include "rt_math.h"
#include "opthelper.h"
namespace rtengine namespace rtengine
{ {
// classical filtering if the support window is small: void boxblur(float** src, float** dst, int radius, int W, int H, bool multiThread);
void boxblur(float* src, float* dst, int radius, int W, int H, bool multiThread);
template<class T, class A> void boxblur (T** src, A** dst, int radx, int rady, int W, int H) void boxabsblur(float** src, float** dst, int radius, int W, int H, bool multiThread);
{ void boxabsblur(float* src, float* dst, int radius, int W, int H, bool multiThread);
//box blur image; box range = (radx,rady)
assert(2*radx+1 < W);
assert(2*rady+1 < H);
AlignedBuffer<float>* buffer = new AlignedBuffer<float> (W * H);
float* temp = buffer->data;
if (radx == 0) {
#ifdef _OPENMP
#pragma omp parallel for
#endif
for (int row = 0; row < H; row++)
for (int col = 0; col < W; col++) {
temp[row * W + col] = (float)src[row][col];
}
} else {
//horizontal blur
#ifdef _OPENMP
#pragma omp parallel for
#endif
for (int row = 0; row < H; row++) {
int len = radx + 1;
temp[row * W + 0] = (float)src[row][0] / len;
for (int j = 1; j <= radx; j++) {
temp[row * W + 0] += (float)src[row][j] / len;
}
for (int col = 1; col <= radx; col++) {
temp[row * W + col] = (temp[row * W + col - 1] * len + (float)src[row][col + radx]) / (len + 1);
len ++;
}
for (int col = radx + 1; col < W - radx; col++) {
temp[row * W + col] = temp[row * W + col - 1] + ((float)(src[row][col + radx] - src[row][col - radx - 1])) / len;
}
for (int col = W - radx; col < W; col++) {
temp[row * W + col] = (temp[row * W + col - 1] * len - src[row][col - radx - 1]) / (len - 1);
len --;
}
}
}
if (rady == 0) {
#ifdef _OPENMP
#pragma omp parallel for
#endif
for (int row = 0; row < H; row++)
for (int col = 0; col < W; col++) {
dst[row][col] = temp[row * W + col];
}
} else {
//vertical blur
#ifdef _OPENMP
#pragma omp parallel for
#endif
for (int col = 0; col < W; col++) {
int len = rady + 1;
dst[0][col] = temp[0 * W + col] / len;
for (int i = 1; i <= rady; i++) {
dst[0][col] += temp[i * W + col] / len;
}
for (int row = 1; row <= rady; row++) {
dst[row][col] = (dst[(row - 1)][col] * len + temp[(row + rady) * W + col]) / (len + 1);
len ++;
}
for (int row = rady + 1; row < H - rady; row++) {
dst[row][col] = dst[(row - 1)][col] + (temp[(row + rady) * W + col] - temp[(row - rady - 1) * W + col]) / len;
}
for (int row = H - rady; row < H; row++) {
dst[row][col] = (dst[(row - 1)][col] * len - temp[(row - rady - 1) * W + col]) / (len - 1);
len --;
}
}
}
delete buffer;
} }
template<class T, class A> void boxblur (T** src, A** dst, T* buffer, int radx, int rady, int W, int H)
{
//box blur image; box range = (radx,rady)
float* temp = buffer;
if (radx == 0) {
#ifdef _OPENMP
#pragma omp for
#endif
for (int row = 0; row < H; row++)
for (int col = 0; col < W; col++) {
temp[row * W + col] = (float)src[row][col];
}
} else {
//horizontal blur
#ifdef _OPENMP
#pragma omp for
#endif
for (int row = 0; row < H; row++) {
float len = radx + 1;
float tempval = (float)src[row][0];
for (int j = 1; j <= radx; j++) {
tempval += (float)src[row][j];
}
tempval /= len;
temp[row * W + 0] = tempval;
for (int col = 1; col <= radx; col++) {
temp[row * W + col] = tempval = (tempval * len + (float)src[row][col + radx]) / (len + 1);
len ++;
}
for (int col = radx + 1; col < W - radx; col++) {
temp[row * W + col] = tempval = tempval + ((float)(src[row][col + radx] - src[row][col - radx - 1])) / len;
}
for (int col = W - radx; col < W; col++) {
temp[row * W + col] = tempval = (tempval * len - src[row][col - radx - 1]) / (len - 1);
len --;
}
}
}
if (rady == 0) {
#ifdef _OPENMP
#pragma omp for
#endif
for (int row = 0; row < H; row++)
for (int col = 0; col < W; col++) {
dst[row][col] = temp[row * W + col];
}
} else {
const int numCols = 8; // process numCols columns at once for better usage of L1 cpu cache
#ifdef __SSE2__
vfloat leninitv = F2V( (float)(rady + 1));
vfloat onev = F2V( 1.f );
vfloat tempv, temp1v, lenv, lenp1v, lenm1v, rlenv;
#ifdef _OPENMP
#pragma omp for
#endif
for (int col = 0; col < W - 7; col += 8) {
lenv = leninitv;
tempv = LVFU(temp[0 * W + col]);
temp1v = LVFU(temp[0 * W + col + 4]);
for (int i = 1; i <= rady; i++) {
tempv = tempv + LVFU(temp[i * W + col]);
temp1v = temp1v + LVFU(temp[i * W + col + 4]);
}
tempv = tempv / lenv;
temp1v = temp1v / lenv;
STVFU( dst[0][col], tempv);
STVFU( dst[0][col + 4], temp1v);
for (int row = 1; row <= rady; row++) {
lenp1v = lenv + onev;
tempv = (tempv * lenv + LVFU(temp[(row + rady) * W + col])) / lenp1v;
temp1v = (temp1v * lenv + LVFU(temp[(row + rady) * W + col + 4])) / lenp1v;
STVFU( dst[row][col], tempv);
STVFU( dst[row][col + 4], temp1v);
lenv = lenp1v;
}
rlenv = onev / lenv;
for (int row = rady + 1; row < H - rady; row++) {
tempv = tempv + (LVFU(temp[(row + rady) * W + col]) - LVFU(temp[(row - rady - 1) * W + col])) * rlenv ;
temp1v = temp1v + (LVFU(temp[(row + rady) * W + col + 4]) - LVFU(temp[(row - rady - 1) * W + col + 4])) * rlenv ;
STVFU( dst[row][col], tempv);
STVFU( dst[row][col + 4], temp1v);
}
for (int row = H - rady; row < H; row++) {
lenm1v = lenv - onev;
tempv = (tempv * lenv - LVFU(temp[(row - rady - 1) * W + col])) / lenm1v;
temp1v = (temp1v * lenv - LVFU(temp[(row - rady - 1) * W + col + 4])) / lenm1v;
STVFU( dst[row][col], tempv);
STVFU( dst[row][col + 4], temp1v);
lenv = lenm1v;
}
}
#else
//vertical blur
#ifdef _OPENMP
#pragma omp for
#endif
for (int col = 0; col < W - numCols + 1; col += 8) {
float len = rady + 1;
for(int k = 0; k < numCols; k++) {
dst[0][col + k] = temp[0 * W + col + k];
}
for (int i = 1; i <= rady; i++) {
for(int k = 0; k < numCols; k++) {
dst[0][col + k] += temp[i * W + col + k];
}
}
for(int k = 0; k < numCols; k++) {
dst[0][col + k] /= len;
}
for (int row = 1; row <= rady; row++) {
for(int k = 0; k < numCols; k++) {
dst[row][col + k] = (dst[(row - 1)][col + k] * len + temp[(row + rady) * W + col + k]) / (len + 1);
}
len ++;
}
for (int row = rady + 1; row < H - rady; row++) {
for(int k = 0; k < numCols; k++) {
dst[row][col + k] = dst[(row - 1)][col + k] + (temp[(row + rady) * W + col + k] - temp[(row - rady - 1) * W + col + k]) / len;
}
}
for (int row = H - rady; row < H; row++) {
for(int k = 0; k < numCols; k++) {
dst[row][col + k] = (dst[(row - 1)][col + k] * len - temp[(row - rady - 1) * W + col + k]) / (len - 1);
}
len --;
}
}
#endif
#ifdef _OPENMP
#pragma omp single
#endif
for (int col = W - (W % numCols); col < W; col++) {
float len = rady + 1;
dst[0][col] = temp[0 * W + col] / len;
for (int i = 1; i <= rady; i++) {
dst[0][col] += temp[i * W + col] / len;
}
for (int row = 1; row <= rady; row++) {
dst[row][col] = (dst[(row - 1)][col] * len + temp[(row + rady) * W + col]) / (len + 1);
len ++;
}
for (int row = rady + 1; row < H - rady; row++) {
dst[row][col] = dst[(row - 1)][col] + (temp[(row + rady) * W + col] - temp[(row - rady - 1) * W + col]) / len;
}
for (int row = H - rady; row < H; row++) {
dst[row][col] = (dst[(row - 1)][col] * len - temp[(row - rady - 1) * W + col]) / (len - 1);
len --;
}
}
}
}
template<class T, class A> void boxblur (T* src, A* dst, A* buffer, int radx, int rady, int W, int H)
{
//box blur image; box range = (radx,rady) i.e. box size is (2*radx+1)x(2*rady+1)
float* temp = buffer;
if (radx == 0) {
for (int row = 0; row < H; row++)
for (int col = 0; col < W; col++) {
temp[row * W + col] = src[row * W + col];
}
} else {
//horizontal blur
for (int row = H - 1; row >= 0; row--) {
int len = radx + 1;
float tempval = (float)src[row * W];
for (int j = 1; j <= radx; j++) {
tempval += (float)src[row * W + j];
}
tempval = tempval / len;
temp[row * W] = tempval;
for (int col = 1; col <= radx; col++) {
tempval = (tempval * len + src[row * W + col + radx]) / (len + 1);
temp[row * W + col] = tempval;
len ++;
}
float reclen = 1.f / len;
for (int col = radx + 1; col < W - radx; col++) {
tempval = tempval + ((float)(src[row * W + col + radx] - src[row * W + col - radx - 1])) * reclen;
temp[row * W + col] = tempval;
}
for (int col = W - radx; col < W; col++) {
tempval = (tempval * len - src[row * W + col - radx - 1]) / (len - 1);
temp[row * W + col] = tempval;
len --;
}
}
}
if (rady == 0) {
for (int row = 0; row < H; row++)
for (int col = 0; col < W; col++) {
dst[row * W + col] = temp[row * W + col];
}
} else {
//vertical blur
#ifdef __SSE2__
vfloat leninitv = F2V( (float)(rady + 1));
vfloat onev = F2V( 1.f );
vfloat tempv, temp1v, lenv, lenp1v, lenm1v, rlenv;
int col;
for (col = 0; col < W - 7; col += 8) {
lenv = leninitv;
tempv = LVFU(temp[0 * W + col]);
temp1v = LVFU(temp[0 * W + col + 4]);
for (int i = 1; i <= rady; i++) {
tempv = tempv + LVFU(temp[i * W + col]);
temp1v = temp1v + LVFU(temp[i * W + col + 4]);
}
tempv = tempv / lenv;
temp1v = temp1v / lenv;
STVFU( dst[0 * W + col], tempv);
STVFU( dst[0 * W + col + 4], temp1v);
for (int row = 1; row <= rady; row++) {
lenp1v = lenv + onev;
tempv = (tempv * lenv + LVFU(temp[(row + rady) * W + col])) / lenp1v;
temp1v = (temp1v * lenv + LVFU(temp[(row + rady) * W + col + 4])) / lenp1v;
STVFU( dst[row * W + col], tempv);
STVFU( dst[row * W + col + 4], temp1v);
lenv = lenp1v;
}
rlenv = onev / lenv;
for (int row = rady + 1; row < H - rady; row++) {
tempv = tempv + (LVFU(temp[(row + rady) * W + col]) - LVFU(temp[(row - rady - 1) * W + col])) * rlenv ;
temp1v = temp1v + (LVFU(temp[(row + rady) * W + col + 4]) - LVFU(temp[(row - rady - 1) * W + col + 4])) * rlenv ;
STVFU( dst[row * W + col], tempv);
STVFU( dst[row * W + col + 4], temp1v);
}
for (int row = H - rady; row < H; row++) {
lenm1v = lenv - onev;
tempv = (tempv * lenv - LVFU(temp[(row - rady - 1) * W + col])) / lenm1v;
temp1v = (temp1v * lenv - LVFU(temp[(row - rady - 1) * W + col + 4])) / lenm1v;
STVFU( dst[row * W + col], tempv);
STVFU( dst[row * W + col + 4], temp1v);
lenv = lenm1v;
}
}
for (; col < W - 3; col += 4) {
lenv = leninitv;
tempv = LVFU(temp[0 * W + col]);
for (int i = 1; i <= rady; i++) {
tempv = tempv + LVFU(temp[i * W + col]);
}
tempv = tempv / lenv;
STVFU( dst[0 * W + col], tempv);
for (int row = 1; row <= rady; row++) {
lenp1v = lenv + onev;
tempv = (tempv * lenv + LVFU(temp[(row + rady) * W + col])) / lenp1v;
STVFU( dst[row * W + col], tempv);
lenv = lenp1v;
}
rlenv = onev / lenv;
for (int row = rady + 1; row < H - rady; row++) {
tempv = tempv + (LVFU(temp[(row + rady) * W + col]) - LVFU(temp[(row - rady - 1) * W + col])) * rlenv ;
STVFU( dst[row * W + col], tempv);
}
for (int row = H - rady; row < H; row++) {
lenm1v = lenv - onev;
tempv = (tempv * lenv - LVFU(temp[(row - rady - 1) * W + col])) / lenm1v;
STVFU( dst[row * W + col], tempv);
lenv = lenm1v;
}
}
for (; col < W; col++) {
int len = rady + 1;
dst[0 * W + col] = temp[0 * W + col] / len;
for (int i = 1; i <= rady; i++) {
dst[0 * W + col] += temp[i * W + col] / len;
}
for (int row = 1; row <= rady; row++) {
dst[row * W + col] = (dst[(row - 1) * W + col] * len + temp[(row + rady) * W + col]) / (len + 1);
len ++;
}
for (int row = rady + 1; row < H - rady; row++) {
dst[row * W + col] = dst[(row - 1) * W + col] + (temp[(row + rady) * W + col] - temp[(row - rady - 1) * W + col]) / len;
}
for (int row = H - rady; row < H; row++) {
dst[row * W + col] = (dst[(row - 1) * W + col] * len - temp[(row - rady - 1) * W + col]) / (len - 1);
len --;
}
}
#else
for (int col = 0; col < W; col++) {
int len = rady + 1;
dst[0 * W + col] = temp[0 * W + col] / len;
for (int i = 1; i <= rady; i++) {
dst[0 * W + col] += temp[i * W + col] / len;
}
for (int row = 1; row <= rady; row++) {
dst[row * W + col] = (dst[(row - 1) * W + col] * len + temp[(row + rady) * W + col]) / (len + 1);
len ++;
}
for (int row = rady + 1; row < H - rady; row++) {
dst[row * W + col] = dst[(row - 1) * W + col] + (temp[(row + rady) * W + col] - temp[(row - rady - 1) * W + col]) / len;
}
for (int row = H - rady; row < H; row++) {
dst[row * W + col] = (dst[(row - 1) * W + col] * len - temp[(row - rady - 1) * W + col]) / (len - 1);
len --;
}
}
#endif
}
}
template<class T, class A> void boxabsblur (T* src, A* dst, int radx, int rady, int W, int H, float * temp)
{
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//box blur image; box range = (radx,rady) i.e. box size is (2*radx+1)x(2*rady+1)
if (radx == 0) {
for (int row = 0; row < H; row++)
for (int col = 0; col < W; col++) {
temp[row * W + col] = fabs(src[row * W + col]);
}
} else {
//horizontal blur
for (int row = 0; row < H; row++) {
int len = radx + 1;
float tempval = fabsf((float)src[row * W + 0]);
for (int j = 1; j <= radx; j++) {
tempval += fabsf((float)src[row * W + j]);
}
tempval /= len;
temp[row * W + 0] = tempval;
for (int col = 1; col <= radx; col++) {
tempval = (tempval * len + fabsf(src[row * W + col + radx])) / (len + 1);
temp[row * W + col] = tempval;
len ++;
}
float rlen = 1.f / (float)len;
for (int col = radx + 1; col < W - radx; col++) {
tempval = tempval + ((float)(fabsf(src[row * W + col + radx]) - fabsf(src[row * W + col - radx - 1]))) * rlen;
temp[row * W + col] = tempval;
}
for (int col = W - radx; col < W; col++) {
tempval = (tempval * len - fabsf(src[row * W + col - radx - 1])) / (len - 1);
temp[row * W + col] = tempval;
len --;
}
}
}
if (rady == 0) {
for (int row = 0; row < H; row++)
for (int col = 0; col < W; col++) {
dst[row * W + col] = temp[row * W + col];
}
} else {
//vertical blur
#ifdef __SSE2__
vfloat leninitv = F2V( (float)(rady + 1));
vfloat onev = F2V( 1.f );
vfloat tempv, lenv, lenp1v, lenm1v, rlenv;
for (int col = 0; col < W - 3; col += 4) {
lenv = leninitv;
tempv = LVF(temp[0 * W + col]);
for (int i = 1; i <= rady; i++) {
tempv = tempv + LVF(temp[i * W + col]);
}
tempv = tempv / lenv;
STVF(dst[0 * W + col], tempv);
for (int row = 1; row <= rady; row++) {
lenp1v = lenv + onev;
tempv = (tempv * lenv + LVF(temp[(row + rady) * W + col])) / lenp1v;
STVF(dst[row * W + col], tempv);
lenv = lenp1v;
}
rlenv = onev / lenv;
for (int row = rady + 1; row < H - rady; row++) {
tempv = tempv + (LVF(temp[(row + rady) * W + col]) - LVF(temp[(row - rady - 1) * W + col])) * rlenv;
STVF(dst[row * W + col], tempv);
}
for (int row = H - rady; row < H; row++) {
lenm1v = lenv - onev;
tempv = (tempv * lenv - LVF(temp[(row - rady - 1) * W + col])) / lenm1v;
STVF(dst[row * W + col], tempv);
lenv = lenm1v;
}
}
for (int col = W - (W % 4); col < W; col++) {
int len = rady + 1;
dst[0 * W + col] = temp[0 * W + col] / len;
for (int i = 1; i <= rady; i++) {
dst[0 * W + col] += temp[i * W + col] / len;
}
for (int row = 1; row <= rady; row++) {
dst[row * W + col] = (dst[(row - 1) * W + col] * len + temp[(row + rady) * W + col]) / (len + 1);
len ++;
}
for (int row = rady + 1; row < H - rady; row++) {
dst[row * W + col] = dst[(row - 1) * W + col] + (temp[(row + rady) * W + col] - temp[(row - rady - 1) * W + col]) / len;
}
for (int row = H - rady; row < H; row++) {
dst[row * W + col] = (dst[(row - 1) * W + col] * len - temp[(row - rady - 1) * W + col]) / (len - 1);
len --;
}
}
#else
for (int col = 0; col < W; col++) {
int len = rady + 1;
dst[0 * W + col] = temp[0 * W + col] / len;
for (int i = 1; i <= rady; i++) {
dst[0 * W + col] += temp[i * W + col] / len;
}
for (int row = 1; row <= rady; row++) {
dst[row * W + col] = (dst[(row - 1) * W + col] * len + temp[(row + rady) * W + col]) / (len + 1);
len ++;
}
for (int row = rady + 1; row < H - rady; row++) {
dst[row * W + col] = dst[(row - 1) * W + col] + (temp[(row + rady) * W + col] - temp[(row - rady - 1) * W + col]) / len;
}
for (int row = H - rady; row < H; row++) {
dst[row * W + col] = (dst[(row - 1) * W + col] * len - temp[(row - rady - 1) * W + col]) / (len - 1);
len --;
}
}
#endif
}
}
}
#endif /* _BOXBLUR_H_ */

View File

@ -445,9 +445,7 @@ static unsigned char* ensure(printbuffer * const p, size_t needed)
p->buffer = NULL; p->buffer = NULL;
return NULL; return NULL;
} } else {
if (newbuffer)
{
memcpy(newbuffer, p->buffer, p->offset + 1); memcpy(newbuffer, p->buffer, p->offset + 1);
} }
p->hooks.deallocate(p->buffer); p->hooks.deallocate(p->buffer);
@ -1436,7 +1434,7 @@ fail:
static cJSON_bool print_array(const cJSON * const item, printbuffer * const output_buffer) static cJSON_bool print_array(const cJSON * const item, printbuffer * const output_buffer)
{ {
unsigned char *output_pointer = NULL; unsigned char *output_pointer = NULL;
size_t length = 0; size_t length;
cJSON *current_element = item->child; cJSON *current_element = item->child;
if (output_buffer == NULL) if (output_buffer == NULL)

View File

@ -1,4 +1,3 @@
#ifndef CALC_DISTORTION__H #pragma once
#define CALC_DISTORTION__H
int calcDistortion (unsigned char* img1, unsigned char* img2, int ncols, int nrows, int nfactor, double &distortion); int calcDistortion (unsigned char* img1, unsigned char* img2, int ncols, int nrows, int nfactor, double &distortion);
#endif

View File

@ -2,6 +2,9 @@
* This file is part of RawTherapee. * This file is part of RawTherapee.
*/ */
#include "camconst.h" #include "camconst.h"
#include <glibmm/fileutils.h>
#include <glibmm/miscutils.h>
#include <glibmm/ustring.h>
#include "settings.h" #include "settings.h"
#include "rt_math.h" #include "rt_math.h"
#include <cstdio> #include <cstdio>
@ -17,8 +20,6 @@
namespace rtengine namespace rtengine
{ {
extern const Settings* settings;
CameraConst::CameraConst() : pdafOffset(0) CameraConst::CameraConst() : pdafOffset(0)
{ {
memset(dcraw_matrix, 0, sizeof(dcraw_matrix)); memset(dcraw_matrix, 0, sizeof(dcraw_matrix));

View File

@ -1,11 +1,11 @@
/* /*
* This file is part of RawTherapee. * This file is part of RawTherapee.
*/ */
#ifndef __CAMCONST__ #pragma once
#define __CAMCONST__
#include <glibmm.h> #include <glibmm/ustring.h>
#include <map> #include <map>
#include <vector>
namespace rtengine namespace rtengine
{ {
@ -72,5 +72,3 @@ public:
}; };
} }
#endif

View File

@ -1,4 +1,5 @@
/* /*
vim: set syntax=javascript:
DO NOT EDIT THIS FILE! DO NOT EDIT THIS FILE!
@ -1137,6 +1138,16 @@ Camera constants:
} }
}, },
{ // Quality C, only raw crop
"make_model": [ "Canon EOS M6 Mark II", "Canon EOS 90D" ],
"raw_crop": [ 144, 72, 6984, 4660 ]
},
{ // Quality C, only raw crop
"make_model": [ "Canon EOS R" ],
"raw_crop": [ 144, 46, 6744, 4500 ]
},
// Canon Powershot // Canon Powershot
{ // Quality C, CHDK DNGs, raw frame correction { // Quality C, CHDK DNGs, raw frame correction
"make_model": "Canon PowerShot A3100 IS", "make_model": "Canon PowerShot A3100 IS",
@ -1277,6 +1288,16 @@ Camera constants:
"ranges": { "white": 16100 } "ranges": { "white": 16100 }
}, },
{ // Quality C
"make_model": "Fujifilm X10",
"ranges": { "white": 3788 }
},
{ // Quality C
"make_model": "Fujifilm HS30EXR",
"ranges": { "white": 3765 }
},
{ // Quality B { // Quality B
"make_model": "FUJIFILM X70", "make_model": "FUJIFILM X70",
"dcraw_matrix": [ 10450,-4329,-878,-3217,11105,2421,-752,1758,6519 ], // DNG_v9.4 D65 "dcraw_matrix": [ 10450,-4329,-878,-3217,11105,2421,-752,1758,6519 ], // DNG_v9.4 D65
@ -1481,6 +1502,12 @@ Camera constants:
} }
}, },
{ // Quality B
"make_model": "NIKON COOLPIX P1000",
"dcraw_matrix": [ 14294, -6116, -1333, -1628, 10219, 1637, -14, 1158, 5022 ], // ColorMatrix2 from Adobe DNG Converter 11.4
"ranges": { "black": 200, "white": 4093 }
},
{ // Quality B, no LENR samples { // Quality B, no LENR samples
"make_model": "Nikon D5", "make_model": "Nikon D5",
"dcraw_matrix": [ 9200,-3522,-992,-5755,13803,2117,-753,1486,6338 ], // adobe dng_v9.5 d65 "dcraw_matrix": [ 9200,-3522,-992,-5755,13803,2117,-753,1486,6338 ], // adobe dng_v9.5 d65
@ -2136,6 +2163,31 @@ Camera constants:
} }
}, },
{ // Quality A, issue #5204.
"make_model": [ "Panasonic DC-S1" ],
"dcraw_matrix": [ 9744, -3905, -779, -4899, 12807, 2324, -798, 1630, 5827 ], // ColorMatrix2 using illuminant D65 from Adobe DNG Converter 11.4
"ranges": {
"white": [
{ "iso": 50, "levels": 8400 }, // LENR 8000
{ "iso": 64, "levels": 10450 }, // LENR 10000
{ "iso": 80, "levels": 13050 }, // LENR 12400
{ "iso": 100, "levels": 16320 }
]
}
},
{ // Quality X, issue #5204. No white frames available.
"make_model": [ "Panasonic DC-S1R" ],
"dcraw_matrix": [ 11822, -5321, -1249, -5958, 15114, 766, -614, 1264, 7043 ], // ColorMatrix2 using illuminant D65 from Adobe DNG Converter 11.4
"ranges": {
"white": [
{ "iso": 50, "levels": 9500 },
{ "iso": [64, 80], "levels": 11600 },
{ "iso": 100, "levels": 16336 }
]
}
},
{ // Quality B, per ISO info missing { // Quality B, per ISO info missing
"make_model": "PENTAX K-x", "make_model": "PENTAX K-x",
"dcraw_matrix": [ 8843,-2837,-625,-5025,12644,2668,-411,1234,7410 ], // adobe dcp d65 "dcraw_matrix": [ 8843,-2837,-625,-5025,12644,2668,-411,1234,7410 ], // adobe dcp d65
@ -2474,7 +2526,7 @@ Camera constants:
{ // Quality C, { // Quality C,
"make_model": "Sony ILCE-7RM4", "make_model": "Sony ILCE-7RM4",
"raw_crop": [ 0, 0, 9568, 0 ] // full raw frame 9600x6376 - 32 rightmost columns are garbage "raw_crop": [ 0, 0, -32, 0 ] // full raw frame 9600x6376 - 32 rightmost columns are garbage. Using -32 instead of 9568 to support also 16-shot pixelshift files
}, },
{ // Quality B, color matrix copied from a7rm2 { // Quality B, color matrix copied from a7rm2

File diff suppressed because it is too large Load Diff

View File

@ -20,18 +20,14 @@
#include <iostream> #include <iostream>
#include "rtengine.h" #include "rtengine.h"
#include "rawimage.h"
#include "rawimagesource.h" #include "rawimagesource.h"
#include "rt_math.h" #include "rt_math.h"
#include "improcfun.h"
#include "procparams.h" #include "procparams.h"
#include "color.h" #include "color.h"
#include "gauss.h"
#include "rt_algo.h" #include "rt_algo.h"
//#define BENCHMARK //#define BENCHMARK
#include "StopWatch.h" #include "StopWatch.h"
#ifdef _OPENMP
#include <omp.h>
#endif
#include "opthelper.h" #include "opthelper.h"
#include "../rtgui/multilangmgr.h" #include "../rtgui/multilangmgr.h"
@ -103,33 +99,48 @@ void compute3x3kernel(float sigma, float kernel[3][3]) {
} }
} }
inline void gauss3x3div (float** RESTRICT src, float** RESTRICT dst, float** RESTRICT divBuffer, const int W, const int H, const float kernel[3][3]) inline void initTile(float** dst, const int tileSize)
{
// first rows
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < tileSize; ++j) {
dst[i][j] = 1.f;
}
}
// left and right border
for (int i = 3; i < tileSize - 3; ++i) {
dst[i][0] = dst[i][1] = dst[i][2] = 1.f;
dst[i][tileSize - 3] = dst[i][tileSize - 2] = dst[i][tileSize - 1] = 1.f;
}
// last rows
for (int i = tileSize - 3 ; i < tileSize; ++i) {
for (int j = 0; j < tileSize; ++j) {
dst[i][j] = 1.f;
}
}
}
inline void gauss3x3div (float** RESTRICT src, float** RESTRICT dst, float** RESTRICT divBuffer, const int tileSize, const float kernel[3][3])
{ {
const float c11 = kernel[0][0]; const float c11 = kernel[0][0];
const float c10 = kernel[0][1]; const float c10 = kernel[0][1];
const float c00 = kernel[1][1]; const float c00 = kernel[1][1];
for (int i = 1; i < H - 1; i++) { for (int i = 1; i < tileSize - 1; i++) {
dst[i][0] = 1.f; for (int j = 1; j < tileSize - 1; j++) {
for (int j = 1; j < W - 1; j++) {
const float val = c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) + const float val = c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) +
c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) + c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) +
c00 * src[i][j]; c00 * src[i][j];
dst[i][j] = divBuffer[i][j] / std::max(val, 0.00001f); dst[i][j] = divBuffer[i][j] / std::max(val, 0.00001f);
} }
dst[i][W - 1] = 1.f;
}
// first and last row
for (int j = 0; j < W; ++j) {
dst[0][j] = 1.f;
}
for (int j = 0; j < W; ++j) {
dst[H - 1][j] = 1.f;
} }
} }
inline void gauss5x5div (float** RESTRICT src, float** RESTRICT dst, float** RESTRICT divBuffer, const int W, const int H, const float kernel[5][5]) inline void gauss5x5div (float** RESTRICT src, float** RESTRICT dst, float** RESTRICT divBuffer, const int tileSize, const float kernel[5][5])
{ {
const float c21 = kernel[0][1]; const float c21 = kernel[0][1];
@ -138,10 +149,9 @@ inline void gauss5x5div (float** RESTRICT src, float** RESTRICT dst, float** RES
const float c10 = kernel[1][2]; const float c10 = kernel[1][2];
const float c00 = kernel[2][2]; const float c00 = kernel[2][2];
for (int i = 2; i < H - 2; ++i) { for (int i = 2; i < tileSize - 2; ++i) {
dst[i][0] = dst[i][1] = 1.f;
// I tried hand written SSE code but gcc vectorizes better // I tried hand written SSE code but gcc vectorizes better
for (int j = 2; j < W - 2; ++j) { for (int j = 2; j < tileSize - 2; ++j) {
const float val = c21 * (src[i - 2][j - 1] + src[i - 2][j + 1] + src[i - 1][j - 2] + src[i - 1][j + 2] + src[i + 1][j - 2] + src[i + 1][j + 2] + src[i + 2][j - 1] + src[i + 2][j + 1]) + const float val = c21 * (src[i - 2][j - 1] + src[i - 2][j + 1] + src[i - 1][j - 2] + src[i - 1][j + 2] + src[i + 1][j - 2] + src[i + 1][j + 2] + src[i + 2][j - 1] + src[i + 2][j + 1]) +
c20 * (src[i - 2][j] + src[i][j - 2] + src[i][j + 2] + src[i + 2][j]) + c20 * (src[i - 2][j] + src[i][j - 2] + src[i][j + 2] + src[i + 2][j]) +
c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) + c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) +
@ -150,23 +160,10 @@ inline void gauss5x5div (float** RESTRICT src, float** RESTRICT dst, float** RES
dst[i][j] = divBuffer[i][j] / std::max(val, 0.00001f); dst[i][j] = divBuffer[i][j] / std::max(val, 0.00001f);
} }
dst[i][W - 2] = dst[i][W - 1] = 1.f;
}
// first and last rows
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < W; ++j) {
dst[i][j] = 1.f;
}
}
for (int i = H - 2 ; i < H; ++i) {
for (int j = 0; j < W; ++j) {
dst[i][j] = 1.f;
}
} }
} }
inline void gauss7x7div(float** RESTRICT src, float** RESTRICT dst, float** RESTRICT divBuffer, const int W, const int H, const float kernel[7][7]) inline void gauss7x7div(float** RESTRICT src, float** RESTRICT dst, float** RESTRICT divBuffer, const int tileSize, const float kernel[7][7])
{ {
const float c31 = kernel[0][2]; const float c31 = kernel[0][2];
@ -178,10 +175,9 @@ inline void gauss7x7div(float** RESTRICT src, float** RESTRICT dst, float** REST
const float c10 = kernel[2][3]; const float c10 = kernel[2][3];
const float c00 = kernel[3][3]; const float c00 = kernel[3][3];
for (int i = 3; i < H - 3; ++i) { for (int i = 3; i < tileSize - 3; ++i) {
dst[i][0] = dst[i][1] = dst[i][2] = 1.f;
// I tried hand written SSE code but gcc vectorizes better // I tried hand written SSE code but gcc vectorizes better
for (int j = 3; j < W - 3; ++j) { for (int j = 3; j < tileSize - 3; ++j) {
const float val = c31 * (src[i - 3][j - 1] + src[i - 3][j + 1] + src[i - 1][j - 3] + src[i - 1][j + 3] + src[i + 1][j - 3] + src[i + 1][j + 3] + src[i + 3][j - 1] + src[i + 3][j + 1]) + const float val = c31 * (src[i - 3][j - 1] + src[i - 3][j + 1] + src[i - 1][j - 3] + src[i - 1][j + 3] + src[i + 1][j - 3] + src[i + 1][j + 3] + src[i + 3][j - 1] + src[i + 3][j + 1]) +
c30 * (src[i - 3][j] + src[i][j - 3] + src[i][j + 3] + src[i + 3][j]) + c30 * (src[i - 3][j] + src[i][j - 3] + src[i][j + 3] + src[i + 3][j]) +
c22 * (src[i - 2][j - 2] + src[i - 2][j + 2] + src[i + 2][j - 2] + src[i + 2][j + 2]) + c22 * (src[i - 2][j - 2] + src[i - 2][j + 2] + src[i + 2][j - 2] + src[i + 2][j + 2]) +
@ -193,30 +189,17 @@ inline void gauss7x7div(float** RESTRICT src, float** RESTRICT dst, float** REST
dst[i][j] = divBuffer[i][j] / std::max(val, 0.00001f); dst[i][j] = divBuffer[i][j] / std::max(val, 0.00001f);
} }
dst[i][W - 3] = dst[i][W - 2] = dst[i][W - 1] = 1.f;
}
// first and last rows
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < W; ++j) {
dst[i][j] = 1.f;
}
}
for (int i = H - 3 ; i < H; ++i) {
for (int j = 0; j < W; ++j) {
dst[i][j] = 1.f;
}
} }
} }
inline void gauss3x3mult(float** RESTRICT src, float** RESTRICT dst, const int W, const int H, const float kernel[3][3]) inline void gauss3x3mult(float** RESTRICT src, float** RESTRICT dst, const int tileSize, const float kernel[3][3])
{ {
const float c11 = kernel[0][0]; const float c11 = kernel[0][0];
const float c10 = kernel[0][1]; const float c10 = kernel[0][1];
const float c00 = kernel[1][1]; const float c00 = kernel[1][1];
for (int i = 1; i < H - 1; i++) { for (int i = 1; i < tileSize - 1; i++) {
for (int j = 1; j < W - 1; j++) { for (int j = 1; j < tileSize - 1; j++) {
const float val = c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) + const float val = c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) +
c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) + c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) +
c00 * src[i][j]; c00 * src[i][j];
@ -226,7 +209,7 @@ inline void gauss3x3mult(float** RESTRICT src, float** RESTRICT dst, const int W
} }
inline void gauss5x5mult (float** RESTRICT src, float** RESTRICT dst, const int W, const int H, const float kernel[5][5]) inline void gauss5x5mult (float** RESTRICT src, float** RESTRICT dst, const int tileSize, const float kernel[5][5])
{ {
const float c21 = kernel[0][1]; const float c21 = kernel[0][1];
@ -235,9 +218,9 @@ inline void gauss5x5mult (float** RESTRICT src, float** RESTRICT dst, const int
const float c10 = kernel[1][2]; const float c10 = kernel[1][2];
const float c00 = kernel[2][2]; const float c00 = kernel[2][2];
for (int i = 2; i < H - 2; ++i) { for (int i = 2; i < tileSize - 2; ++i) {
// I tried hand written SSE code but gcc vectorizes better // I tried hand written SSE code but gcc vectorizes better
for (int j = 2; j < W - 2; ++j) { for (int j = 2; j < tileSize - 2; ++j) {
const float val = c21 * (src[i - 2][j - 1] + src[i - 2][j + 1] + src[i - 1][j - 2] + src[i - 1][j + 2] + src[i + 1][j - 2] + src[i + 1][j + 2] + src[i + 2][j - 1] + src[i + 2][j + 1]) + const float val = c21 * (src[i - 2][j - 1] + src[i - 2][j + 1] + src[i - 1][j - 2] + src[i - 1][j + 2] + src[i + 1][j - 2] + src[i + 1][j + 2] + src[i + 2][j - 1] + src[i + 2][j + 1]) +
c20 * (src[i - 2][j] + src[i][j - 2] + src[i][j + 2] + src[i + 2][j]) + c20 * (src[i - 2][j] + src[i][j - 2] + src[i][j + 2] + src[i + 2][j]) +
c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) + c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) +
@ -249,7 +232,7 @@ inline void gauss5x5mult (float** RESTRICT src, float** RESTRICT dst, const int
} }
} }
inline void gauss7x7mult(float** RESTRICT src, float** RESTRICT dst, const int W, const int H, const float kernel[7][7]) inline void gauss7x7mult(float** RESTRICT src, float** RESTRICT dst, const int tileSize, const float kernel[7][7])
{ {
const float c31 = kernel[0][2]; const float c31 = kernel[0][2];
@ -261,9 +244,9 @@ inline void gauss7x7mult(float** RESTRICT src, float** RESTRICT dst, const int W
const float c10 = kernel[2][3]; const float c10 = kernel[2][3];
const float c00 = kernel[3][3]; const float c00 = kernel[3][3];
for (int i = 3; i < H - 3; ++i) { for (int i = 3; i < tileSize - 3; ++i) {
// I tried hand written SSE code but gcc vectorizes better // I tried hand written SSE code but gcc vectorizes better
for (int j = 3; j < W - 3; ++j) { for (int j = 3; j < tileSize - 3; ++j) {
const float val = c31 * (src[i - 3][j - 1] + src[i - 3][j + 1] + src[i - 1][j - 3] + src[i - 1][j + 3] + src[i + 1][j - 3] + src[i + 1][j + 3] + src[i + 3][j - 1] + src[i + 3][j + 1]) + const float val = c31 * (src[i - 3][j - 1] + src[i - 3][j + 1] + src[i - 1][j - 3] + src[i - 1][j + 3] + src[i + 1][j - 3] + src[i + 1][j + 3] + src[i + 3][j - 1] + src[i + 3][j + 1]) +
c30 * (src[i - 3][j] + src[i][j - 3] + src[i][j + 3] + src[i + 3][j]) + c30 * (src[i - 3][j] + src[i][j - 3] + src[i][j + 3] + src[i + 3][j]) +
c22 * (src[i - 2][j - 2] + src[i - 2][j + 2] + src[i + 2][j - 2] + src[i + 2][j + 2]) + c22 * (src[i - 2][j - 2] + src[i - 2][j + 2] + src[i + 2][j - 2] + src[i + 2][j + 2]) +
@ -426,98 +409,118 @@ float calcRadiusXtrans(const float * const *rawData, int W, int H, float lowerLi
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp parallel for reduction(max:maxRatio) schedule(dynamic, 16) #pragma omp parallel for reduction(max:maxRatio) schedule(dynamic, 16)
#endif #endif
for (int row = starty + 3; row < H - 4; row += 3) { for (int row = starty + 2; row < H - 4; row += 3) {
for (int col = startx + 3; col < W - 4; col += 3) { for (int col = startx + 2; col < W - 4; col += 3) {
const float valtl = rawData[row][col]; const float valp1p1 = rawData[row + 1][col + 1];
const float valtr = rawData[row][col + 1]; const bool squareClipped = rtengine::max(valp1p1, rawData[row + 1][col + 2], rawData[row + 2][col + 1], rawData[row + 2][col + 2]) >= upperLimit;
const float valbl = rawData[row + 1][col]; const float greenSolitary = rawData[row][col];
const float valbr = rawData[row + 1][col + 1]; if (greenSolitary > 1.f && std::max(rawData[row - 1][col - 1], rawData[row - 1][col + 1]) < upperLimit) {
if (valtl > 1.f) { if (greenSolitary < upperLimit) {
const float maxValtltr = std::max(valtl, valtr); const float valp1m1 = rawData[row + 1][col - 1];
if (valtr > 1.f && maxValtltr > lowerLimit) { if (valp1m1 > 1.f && rtengine::max(rawData[row + 1][col - 2], valp1m1, rawData[row + 2][col - 2], rawData[row + 1][col - 1]) < upperLimit) {
const float minVal = std::min(valtl, valtr); const float maxVal = std::max(greenSolitary, valp1m1);
if (UNLIKELY(maxValtltr > maxRatio * minVal)) { if (maxVal > lowerLimit) {
bool clipped = false; const float minVal = std::min(greenSolitary, valp1m1);
if (maxValtltr == valtl) { // check for influence by clipped green in neighborhood if (UNLIKELY(maxVal > maxRatio * minVal)) {
if (rtengine::max(rawData[row - 1][col - 1], valtr, valbl, valbr) >= upperLimit) { maxRatio = maxVal / minVal;
clipped = true;
}
} else { // check for influence by clipped green in neighborhood
if (rtengine::max(rawData[row - 1][col + 2], valtl, valbl, valbr) >= upperLimit) {
clipped = true;
}
}
if (!clipped) {
maxRatio = maxValtltr / minVal;
} }
} }
} }
const float maxValtlbl = std::max(valtl, valbl); if (valp1p1 > 1.f && !squareClipped) {
if (valbl > 1.f && maxValtlbl > lowerLimit) { const float maxVal = std::max(greenSolitary, valp1p1);
const float minVal = std::min(valtl, valbl); if (maxVal > lowerLimit) {
if (UNLIKELY(maxValtlbl > maxRatio * minVal)) { const float minVal = std::min(greenSolitary, valp1p1);
bool clipped = false; if (UNLIKELY(maxVal > maxRatio * minVal)) {
if (maxValtlbl == valtl) { // check for influence by clipped green in neighborhood maxRatio = maxVal / minVal;
if (rtengine::max(rawData[row - 1][col - 1], valtr, valbl, valbr) >= upperLimit) {
clipped = true;
}
} else { // check for influence by clipped green in neighborhood
if (rtengine::max(valtl, valtr, rawData[row + 2][col - 1], valbr) >= upperLimit) {
clipped = true;
}
}
if (!clipped) {
maxRatio = maxValtlbl / minVal;
}
}
}
}
if (valbr > 1.f) {
const float maxValblbr = std::max(valbl, valbr);
if (valbl > 1.f && maxValblbr > lowerLimit) {
const float minVal = std::min(valbl, valbr);
if (UNLIKELY(maxValblbr > maxRatio * minVal)) {
bool clipped = false;
if (maxValblbr == valbr) { // check for influence by clipped green in neighborhood
if (rtengine::max(valtl, valtr, valbl, rawData[row + 2][col + 2]) >= upperLimit) {
clipped = true;
}
} else { // check for influence by clipped green in neighborhood
if (rtengine::max(valtl, valtr, rawData[row + 2][col - 1], valbr) >= upperLimit) {
clipped = true;
}
}
if (!clipped) {
maxRatio = maxValblbr / minVal;
}
}
}
const float maxValtrbr = std::max(valtr, valbr);
if (valtr > 1.f && maxValtrbr > lowerLimit) {
const float minVal = std::min(valtr, valbr);
if (UNLIKELY(maxValtrbr > maxRatio * minVal)) {
if (maxValtrbr == valbr) { // check for influence by clipped green in neighborhood
if (rtengine::max(valtl, valtr, valbl, rawData[row + 2][col + 2]) >= upperLimit) {
continue;
}
} else { // check for influence by clipped green in neighborhood
if (rtengine::max(rawData[row - 1][col + 2], valtl, valbl, valbr) >= upperLimit) {
continue;
}
}
maxRatio = maxValtrbr / minVal;
} }
} }
} }
} }
} }
return std::sqrt((1.f / (std::log(1.f / maxRatio))) / -2.f); if (!squareClipped) {
const float valp2p2 = rawData[row + 2][col + 2];
if (valp2p2 > 1.f) {
if (valp1p1 > 1.f) {
const float maxVal = std::max(valp1p1, valp2p2);
if (maxVal > lowerLimit) {
const float minVal = std::min(valp1p1, valp2p2);
if (UNLIKELY(maxVal > maxRatio * minVal)) {
maxRatio = maxVal / minVal;
}
}
}
const float greenSolitaryRight = rawData[row + 3][col + 3];
if (rtengine::max(greenSolitaryRight, rawData[row + 4][col + 2], rawData[row + 4][col + 4]) < upperLimit) {
if (greenSolitaryRight > 1.f) {
const float maxVal = std::max(greenSolitaryRight, valp2p2);
if (maxVal > lowerLimit) {
const float minVal = std::min(greenSolitaryRight, valp2p2);
if (UNLIKELY(maxVal > maxRatio * minVal)) {
maxRatio = maxVal / minVal;
}
}
}
}
}
const float valp1p2 = rawData[row + 1][col + 2];
const float valp2p1 = rawData[row + 2][col + 1];
if (valp2p1 > 1.f) {
if (valp1p2 > 1.f) {
const float maxVal = std::max(valp1p2, valp2p1);
if (maxVal > lowerLimit) {
const float minVal = std::min(valp1p2, valp2p1);
if (UNLIKELY(maxVal > maxRatio * minVal)) {
maxRatio = maxVal / minVal;
}
}
}
const float greenSolitaryLeft = rawData[row + 3][col];
if (rtengine::max(greenSolitaryLeft, rawData[row + 4][col - 1], rawData[row + 4][col + 1]) < upperLimit) {
if (greenSolitaryLeft > 1.f) {
const float maxVal = std::max(greenSolitaryLeft, valp2p1);
if (maxVal > lowerLimit) {
const float minVal = std::min(greenSolitaryLeft, valp2p1);
if (UNLIKELY(maxVal > maxRatio * minVal)) {
maxRatio = maxVal / minVal;
}
}
}
}
}
}
}
}
return std::sqrt((1.f / (std::log(1.f / maxRatio) / 2.f)) / -2.f);
} }
void CaptureDeconvSharpening (float** luminance, float** oldLuminance, const float * const * blend, int W, int H, double sigma, int iterations, rtengine::ProgressListener* plistener, double startVal, double endVal)
bool checkForStop(float** tmpIThr, float** iterCheck, int fullTileSize, int border)
{
bool stopped = false;
for (int ii = border; !stopped && ii < fullTileSize - border; ++ii) {
#ifdef __SSE2__
for (int jj = border; jj < fullTileSize - border; jj += 4) {
if (_mm_movemask_ps((vfloat)vmaskf_lt(LVFU(tmpIThr[ii][jj]), LVFU(iterCheck[ii - border][jj - border])))) {
stopped = true;
break;
}
}
#else
for (int jj = border; jj < fullTileSize - border; ++jj) {
if (tmpIThr[ii][jj] < iterCheck[ii - border][jj - border]) {
stopped = true;
break;
}
}
#endif
}
return stopped;
}
void CaptureDeconvSharpening (float ** clipmask, float** luminance, float** oldLuminance, const float * const * blend, int W, int H, double sigma, double sigmaCornerOffset, int iterations, bool checkIterStop, rtengine::ProgressListener* plistener, double startVal, double endVal)
{ {
BENCHFUN BENCHFUN
const bool is5x5 = (sigma <= 0.84); const bool is5x5 = (sigma <= 0.84 && sigmaCornerOffset == 0.0);
const bool is3x3 = (sigma < 0.6); const bool is3x3 = (sigma < 0.6 && sigmaCornerOffset == 0.0);
float kernel7[7][7]; float kernel7[7][7];
float kernel5[5][5]; float kernel5[5][5];
float kernel3[3][3]; float kernel3[3][3];
@ -529,12 +532,16 @@ BENCHFUN
compute7x7kernel(sigma, kernel7); compute7x7kernel(sigma, kernel7);
} }
constexpr int tileSize = 194; constexpr int tileSize = 32;
constexpr int border = 3; const int border = iterations <= 30 ? 5 : 7;
constexpr int fullTileSize = tileSize + 2 * border; const int fullTileSize = tileSize + 2 * border;
const float cornerRadius = std::min<float>(1.15f, sigma + sigmaCornerOffset);
const float cornerDistance = sqrt(rtengine::SQR(W * 0.5f) + rtengine::SQR(H * 0.5f));
const float distanceFactor = (cornerRadius - sigma) / cornerDistance;
double progress = startVal; double progress = startVal;
const double progressStep = (endVal - startVal) * rtengine::SQR(tileSize) / (W * H); const double progressStep = (endVal - startVal) * rtengine::SQR(tileSize) / (W * H);
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp parallel #pragma omp parallel
#endif #endif
@ -543,7 +550,11 @@ BENCHFUN
array2D<float> tmpIThr(fullTileSize, fullTileSize); array2D<float> tmpIThr(fullTileSize, fullTileSize);
array2D<float> tmpThr(fullTileSize, fullTileSize); array2D<float> tmpThr(fullTileSize, fullTileSize);
array2D<float> lumThr(fullTileSize, fullTileSize); array2D<float> lumThr(fullTileSize, fullTileSize);
#pragma omp for schedule(dynamic,2) collapse(2) array2D<float> iterCheck(tileSize, tileSize);
initTile(tmpThr, fullTileSize);
#ifdef _OPENMP
#pragma omp for schedule(dynamic,16) collapse(2)
#endif
for (int i = border; i < H - border; i+= tileSize) { for (int i = border; i < H - border; i+= tileSize) {
for(int j = border; j < W - border; j+= tileSize) { for(int j = border; j < W - border; j+= tileSize) {
const bool endOfCol = (i + tileSize + border) >= H; const bool endOfCol = (i + tileSize + border) >= H;
@ -551,13 +562,27 @@ BENCHFUN
// fill tiles // fill tiles
if (endOfRow || endOfCol) { if (endOfRow || endOfCol) {
// special handling for small tiles at end of row or column // special handling for small tiles at end of row or column
for (int k = 0, ii = endOfCol ? H - fullTileSize : i; k < fullTileSize; ++k, ++ii) { if (checkIterStop) {
for (int l = 0, jj = endOfRow ? W - fullTileSize : j; l < fullTileSize; ++l, ++jj) { for (int k = 0, ii = endOfCol ? H - fullTileSize + border : i; k < tileSize; ++k, ++ii) {
tmpIThr[k][l] = oldLuminance[ii - border][jj - border]; for (int l = 0, jj = endOfRow ? W - fullTileSize + border : j; l < tileSize; ++l, ++jj) {
lumThr[k][l] = oldLuminance[ii - border][jj - border]; iterCheck[k][l] = oldLuminance[ii][jj] * clipmask[ii][jj] * 0.5f;
}
}
}
for (int k = 0, ii = endOfCol ? H - fullTileSize : i - border; k < fullTileSize; ++k, ++ii) {
for (int l = 0, jj = endOfRow ? W - fullTileSize : j - border; l < fullTileSize; ++l, ++jj) {
tmpIThr[k][l] = oldLuminance[ii][jj];
lumThr[k][l] = oldLuminance[ii][jj];
} }
} }
} else { } else {
if (checkIterStop) {
for (int ii = 0; ii < tileSize; ++ii) {
for (int jj = 0; jj < tileSize; ++jj) {
iterCheck[ii][jj] = oldLuminance[i + ii][j + jj] * clipmask[i + ii][j + jj] * 0.5f;
}
}
}
for (int ii = i; ii < i + fullTileSize; ++ii) { for (int ii = i; ii < i + fullTileSize; ++ii) {
for (int jj = j; jj < j + fullTileSize; ++jj) { for (int jj = j; jj < j + fullTileSize; ++jj) {
tmpIThr[ii - i][jj - j] = oldLuminance[ii - border][jj - border]; tmpIThr[ii - i][jj - j] = oldLuminance[ii - border][jj - border];
@ -565,36 +590,76 @@ BENCHFUN
} }
} }
} }
bool stopped = false;
if (is3x3) { if (is3x3) {
for (int k = 0; k < iterations; ++k) { for (int k = 0; k < iterations && !stopped; ++k) {
// apply 3x3 gaussian blur and divide luminance by result of gaussian blur // apply 3x3 gaussian blur and divide luminance by result of gaussian blur
gauss3x3div(tmpIThr, tmpThr, lumThr, fullTileSize, fullTileSize, kernel3); gauss3x3div(tmpIThr, tmpThr, lumThr, fullTileSize, kernel3);
gauss3x3mult(tmpThr, tmpIThr, fullTileSize, fullTileSize, kernel3); gauss3x3mult(tmpThr, tmpIThr, fullTileSize, kernel3);
if (checkIterStop) {
stopped = checkForStop(tmpIThr, iterCheck, fullTileSize, border);
}
} }
} else if (is5x5) { } else if (is5x5) {
for (int k = 0; k < iterations; ++k) { for (int k = 0; k < iterations && !stopped; ++k) {
// apply 5x5 gaussian blur and divide luminance by result of gaussian blur // apply 5x5 gaussian blur and divide luminance by result of gaussian blur
gauss5x5div(tmpIThr, tmpThr, lumThr, fullTileSize, fullTileSize, kernel5); gauss5x5div(tmpIThr, tmpThr, lumThr, fullTileSize, kernel5);
gauss5x5mult(tmpThr, tmpIThr, fullTileSize, fullTileSize, kernel5); gauss5x5mult(tmpThr, tmpIThr, fullTileSize, kernel5);
if (checkIterStop) {
stopped = checkForStop(tmpIThr, iterCheck, fullTileSize, border);
}
} }
} else { } else {
for (int k = 0; k < iterations; ++k) { if (sigmaCornerOffset != 0.0) {
const float distance = sqrt(rtengine::SQR(i + tileSize / 2 - H / 2) + rtengine::SQR(j + tileSize / 2 - W / 2));
const float sigmaTile = static_cast<float>(sigma) + distanceFactor * distance;
if (sigmaTile >= 0.4f) {
if (sigmaTile > 0.84) { // have to use 7x7 kernel
float lkernel7[7][7];
compute7x7kernel(static_cast<float>(sigma) + distanceFactor * distance, lkernel7);
for (int k = 0; k < iterations && !stopped; ++k) {
// apply 7x7 gaussian blur and divide luminance by result of gaussian blur // apply 7x7 gaussian blur and divide luminance by result of gaussian blur
gauss7x7div(tmpIThr, tmpThr, lumThr, fullTileSize, fullTileSize, kernel7); gauss7x7div(tmpIThr, tmpThr, lumThr, fullTileSize, lkernel7);
gauss7x7mult(tmpThr, tmpIThr, fullTileSize, fullTileSize, kernel7); gauss7x7mult(tmpThr, tmpIThr, fullTileSize, lkernel7);
if (checkIterStop) {
stopped = checkForStop(tmpIThr, iterCheck, fullTileSize, border);
}
}
} else { // can use 5x5 kernel
float lkernel7[5][5];
compute5x5kernel(static_cast<float>(sigma) + distanceFactor * distance, lkernel7);
for (int k = 0; k < iterations && !stopped; ++k) {
// apply 7x7 gaussian blur and divide luminance by result of gaussian blur
gauss5x5div(tmpIThr, tmpThr, lumThr, fullTileSize, lkernel7);
gauss5x5mult(tmpThr, tmpIThr, fullTileSize, lkernel7);
if (checkIterStop) {
stopped = checkForStop(tmpIThr, iterCheck, fullTileSize, border);
}
}
}
}
} else {
for (int k = 0; k < iterations && !stopped; ++k) {
// apply 7x7 gaussian blur and divide luminance by result of gaussian blur
gauss7x7div(tmpIThr, tmpThr, lumThr, fullTileSize, kernel7);
gauss7x7mult(tmpThr, tmpIThr, fullTileSize, kernel7);
if (checkIterStop) {
stopped = checkForStop(tmpIThr, iterCheck, fullTileSize, border);
}
}
} }
} }
if (endOfRow || endOfCol) { if (endOfRow || endOfCol) {
// special handling for small tiles at end of row or column // special handling for small tiles at end of row or column
for (int k = border, ii = endOfCol ? H - fullTileSize - border : i - border; k < fullTileSize - border; ++k) { for (int k = border, ii = endOfCol ? H - fullTileSize : i - border; k < fullTileSize - border; ++k) {
for (int l = border, jj = endOfRow ? W - fullTileSize - border : j - border; l < fullTileSize - border; ++l) { for (int l = border, jj = endOfRow ? W - fullTileSize : j - border; l < fullTileSize - border; ++l) {
luminance[ii + k][jj + l] = rtengine::intp(blend[ii + k][jj + l], max(tmpIThr[k][l], 0.0f), luminance[ii + k][jj + l]); luminance[ii + k][jj + l] = rtengine::intp(blend[ii + k][jj + l], std::max(tmpIThr[k][l], 0.0f), luminance[ii + k][jj + l]);
} }
} }
} else { } else {
for (int ii = border; ii < fullTileSize - border; ++ii) { for (int ii = border; ii < fullTileSize - border; ++ii) {
for (int jj = border; jj < fullTileSize - border; ++jj) { for (int jj = border; jj < fullTileSize - border; ++jj) {
luminance[i + ii - border][j + jj - border] = rtengine::intp(blend[i + ii - border][j + jj - border], max(tmpIThr[ii][jj], 0.0f), luminance[i + ii - border][j + jj - border]); luminance[i + ii - border][j + jj - border] = rtengine::intp(blend[i + ii - border][j + jj - border], std::max(tmpIThr[ii][jj], 0.0f), luminance[i + ii - border][j + jj - border]);
} }
} }
} }
@ -627,7 +692,7 @@ void RawImageSource::captureSharpening(const procparams::CaptureSharpeningParams
plistener->setProgress(0.0); plistener->setProgress(0.0);
} }
BENCHFUN BENCHFUN
const float xyz_rgb[3][3] = { // XYZ from RGB constexpr float xyz_rgb[3][3] = { // XYZ from RGB
{ 0.412453, 0.357580, 0.180423 }, { 0.412453, 0.357580, 0.180423 },
{ 0.212671, 0.715160, 0.072169 }, { 0.212671, 0.715160, 0.072169 },
{ 0.019334, 0.119193, 0.950227 } { 0.019334, 0.119193, 0.950227 }
@ -637,13 +702,15 @@ BENCHFUN
const float clipVal = (ri->get_white(1) - ri->get_cblack(1)) * scale_mul[1]; const float clipVal = (ri->get_white(1) - ri->get_cblack(1)) * scale_mul[1];
array2D<float>& redVals = redCache ? *redCache : red; const array2D<float>& redVals = redCache ? *redCache : red;
array2D<float>& greenVals = greenCache ? *greenCache : green; const array2D<float>& greenVals = greenCache ? *greenCache : green;
array2D<float>& blueVals = blueCache ? *blueCache : blue; const array2D<float>& blueVals = blueCache ? *blueCache : blue;
array2D<float> clipMask(W, H); array2D<float> clipMask(W, H);
constexpr float clipLimit = 0.95f; constexpr float clipLimit = 0.95f;
if (ri->getSensorType() == ST_BAYER) { constexpr float maxSigma = 1.15f;
if (getSensorType() == ST_BAYER) {
const float whites[2][2] = { const float whites[2][2] = {
{(ri->get_white(FC(0,0)) - c_black[FC(0,0)]) * scale_mul[FC(0,0)] * clipLimit, (ri->get_white(FC(0,1)) - c_black[FC(0,1)]) * scale_mul[FC(0,1)] * clipLimit}, {(ri->get_white(FC(0,0)) - c_black[FC(0,0)]) * scale_mul[FC(0,0)] * clipLimit, (ri->get_white(FC(0,1)) - c_black[FC(0,1)]) * scale_mul[FC(0,1)] * clipLimit},
{(ri->get_white(FC(1,0)) - c_black[FC(1,0)]) * scale_mul[FC(1,0)] * clipLimit, (ri->get_white(FC(1,1)) - c_black[FC(1,1)]) * scale_mul[FC(1,1)] * clipLimit} {(ri->get_white(FC(1,0)) - c_black[FC(1,0)]) * scale_mul[FC(1,0)] * clipLimit, (ri->get_white(FC(1,1)) - c_black[FC(1,1)]) * scale_mul[FC(1,1)] * clipLimit}
@ -651,9 +718,9 @@ BENCHFUN
buildClipMaskBayer(rawData, W, H, clipMask, whites); buildClipMaskBayer(rawData, W, H, clipMask, whites);
const unsigned int fc[2] = {FC(0,0), FC(1,0)}; const unsigned int fc[2] = {FC(0,0), FC(1,0)};
if (sharpeningParams.autoRadius) { if (sharpeningParams.autoRadius) {
radius = calcRadiusBayer(rawData, W, H, 1000.f, clipVal, fc); radius = std::min(calcRadiusBayer(rawData, W, H, 1000.f, clipVal, fc), maxSigma);
} }
} else if (ri->getSensorType() == ST_FUJI_XTRANS) { } else if (getSensorType() == ST_FUJI_XTRANS) {
float whites[6][6]; float whites[6][6];
for (int i = 0; i < 6; ++i) { for (int i = 0; i < 6; ++i) {
for (int j = 0; j < 6; ++j) { for (int j = 0; j < 6; ++j) {
@ -679,14 +746,14 @@ BENCHFUN
} }
} }
if (sharpeningParams.autoRadius) { if (sharpeningParams.autoRadius) {
radius = calcRadiusXtrans(rawData, W, H, 1000.f, clipVal, i, j); radius = std::min(calcRadiusXtrans(rawData, W, H, 1000.f, clipVal, i, j), maxSigma);
} }
} else if (ri->get_colors() == 1) { } else if (ri->get_colors() == 1) {
buildClipMaskMono(rawData, W, H, clipMask, (ri->get_white(0) - c_black[0]) * scale_mul[0] * clipLimit); buildClipMaskMono(rawData, W, H, clipMask, (ri->get_white(0) - c_black[0]) * scale_mul[0] * clipLimit);
if (sharpeningParams.autoRadius) { if (sharpeningParams.autoRadius) {
const unsigned int fc[2] = {0, 0}; const unsigned int fc[2] = {0, 0};
radius = calcRadiusBayer(rawData, W, H, 1000.f, clipVal, fc); radius = std::min(calcRadiusBayer(rawData, W, H, 1000.f, clipVal, fc), maxSigma);
} }
} }
@ -740,14 +807,13 @@ BENCHFUN
array2D<float>& L = Lbuffer ? *Lbuffer : red; array2D<float>& L = Lbuffer ? *Lbuffer : red;
array2D<float>& YOld = YOldbuffer ? * YOldbuffer : green; array2D<float>& YOld = YOldbuffer ? * YOldbuffer : green;
array2D<float>& YNew = YNewbuffer ? * YNewbuffer : blue; array2D<float>& YNew = YNewbuffer ? * YNewbuffer : blue;
const float gamma = sharpeningParams.gamma;
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp parallel for schedule(dynamic, 16) #pragma omp parallel for schedule(dynamic, 16)
#endif #endif
for (int i = 0; i < H; ++i) { for (int i = 0; i < H; ++i) {
Color::RGB2L(redVals[i], greenVals[i], blueVals[i], L[i], xyz_rgb, W); Color::RGB2L(redVals[i], greenVals[i], blueVals[i], L[i], xyz_rgb, W);
Color::RGB2Y(redVals[i], greenVals[i], blueVals[i], YOld[i], YNew[i], gamma, W); Color::RGB2Y(redVals[i], greenVals[i], blueVals[i], YOld[i], YNew[i], W);
} }
if (plistener) { if (plistener) {
plistener->setProgress(0.1); plistener->setProgress(0.1);
@ -760,7 +826,7 @@ BENCHFUN
} }
conrastThreshold = contrast * 100.f; conrastThreshold = contrast * 100.f;
CaptureDeconvSharpening(YNew, YOld, blend, W, H, radius, sharpeningParams.deconviter, plistener, 0.2, 0.9); CaptureDeconvSharpening(clipMask, YNew, YOld, blend, W, H, radius, sharpeningParams.deconvradiusOffset, sharpeningParams.deconviter, sharpeningParams.deconvitercheck, plistener, 0.2, 0.9);
if (plistener) { if (plistener) {
plistener->setProgress(0.9); plistener->setProgress(0.9);
} }
@ -770,9 +836,8 @@ BENCHFUN
for (int i = 0; i < H; ++i) { for (int i = 0; i < H; ++i) {
int j = 0; int j = 0;
#ifdef __SSE2__ #ifdef __SSE2__
const vfloat gammav = F2V(gamma);
for (; j < W - 3; j += 4) { for (; j < W - 3; j += 4) {
const vfloat factor = pow_F(vmaxf(LVFU(YNew[i][j]), ZEROV) / vmaxf(LVFU(YOld[i][j]), F2V(0.00001f)), gammav); const vfloat factor = vmaxf(LVFU(YNew[i][j]), ZEROV) / vmaxf(LVFU(YOld[i][j]), F2V(0.00001f));
STVFU(red[i][j], LVFU(redVals[i][j]) * factor); STVFU(red[i][j], LVFU(redVals[i][j]) * factor);
STVFU(green[i][j], LVFU(greenVals[i][j]) * factor); STVFU(green[i][j], LVFU(greenVals[i][j]) * factor);
STVFU(blue[i][j], LVFU(blueVals[i][j]) * factor); STVFU(blue[i][j], LVFU(blueVals[i][j]) * factor);
@ -780,7 +845,7 @@ BENCHFUN
#endif #endif
for (; j < W; ++j) { for (; j < W; ++j) {
const float factor = pow_F(std::max(YNew[i][j], 0.f) / std::max(YOld[i][j], 0.00001f), gamma); const float factor = std::max(YNew[i][j], 0.f) / std::max(YOld[i][j], 0.00001f);
red[i][j] = redVals[i][j] * factor; red[i][j] = redVals[i][j] * factor;
green[i][j] = greenVals[i][j] * factor; green[i][j] = greenVals[i][j] * factor;
blue[i][j] = blueVals[i][j] * factor; blue[i][j] = blueVals[i][j] * factor;
@ -793,6 +858,7 @@ BENCHFUN
if (plistener) { if (plistener) {
plistener->setProgress(1.0); plistener->setProgress(1.0);
} }
rgbSourceModified = false;
} }
} /* namespace */ } /* namespace */

View File

@ -24,7 +24,6 @@
#include <cmath> #include <cmath>
#include "rtengine.h"
#include "rawimagesource.h" #include "rawimagesource.h"
#include "rt_math.h" #include "rt_math.h"
@ -63,7 +62,7 @@ void RawImageSource::CLASS cfa_linedn(float noise, bool horizontal, bool vertica
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
float noisevar = SQR(3 * noise * 65535); // _noise_ (as a fraction of saturation) is input to the algorithm float noisevar = SQR(3 * noise * 65535); // _noise_ (as a fraction of saturation) is input to the algorithm
float noisevarm4 = 4.0f * noisevar; float noisevarm4 = 4.0f * noisevar;
float* RawDataTmp = (float*)malloc( width * height * sizeof(float)); float* RawDataTmp = (float*)malloc(static_cast<unsigned long>(width) * height * sizeof(float));
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp parallel #pragma omp parallel
#endif #endif

View File

@ -17,10 +17,10 @@
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>. * along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/ */
#include "ciecam02.h" #include "ciecam02.h"
#include "rtengine.h" #include "rt_math.h"
#include "curves.h" #include "curves.h"
#include <math.h> #include <math.h>
#include "sleef.c" #include "sleef.h"
#ifdef _DEBUG #ifdef _DEBUG
#include "settings.h" #include "settings.h"
@ -34,10 +34,6 @@
namespace rtengine namespace rtengine
{ {
#ifdef _DEBUG
extern const Settings* settings;
#endif
void Ciecam02::curvecolorfloat (float satind, float satval, float &sres, float parsat) void Ciecam02::curvecolorfloat (float satind, float satval, float &sres, float parsat)
{ {
if (satind > 0.f) { if (satind > 0.f) {
@ -408,7 +404,7 @@ void Ciecam02::calculate_abfloat ( vfloat &aa, vfloat &bb, vfloat h, vfloat e, v
#endif #endif
void Ciecam02::initcam1float (float yb, float pilotd, float f, float la, float xw, float yw, float zw, float &n, float &d, float &nbb, float &ncb, void Ciecam02::initcam1float (float yb, float pilotd, float f, float la, float xw, float yw, float zw, float &n, float &d, float &nbb, float &ncb,
float &cz, float &aw, float &wh, float &pfl, float &fl, float &c) float &cz, float &aw, float &wh, float &pfl, float &fl, float c)
{ {
n = yb / yw; n = yb / yw;

View File

@ -16,12 +16,19 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>. * along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/ */
#ifndef _CIECAM02_ #pragma once
#define _CIECAM02_
#include <cmath> #include <cmath>
#include "LUT.h" #include <cstdint>
#include "opthelper.h" #include "opthelper.h"
template<typename T>
class LUT;
using LUTu = LUT<uint32_t>;
using LUTf = LUT<float>;
namespace rtengine namespace rtengine
{ {
@ -77,7 +84,7 @@ public:
* Forward transform from XYZ to CIECAM02 JCh. * Forward transform from XYZ to CIECAM02 JCh.
*/ */
static void initcam1float (float yb, float pilotd, float f, float la, float xw, float yw, float zw, float &n, float &d, float &nbb, float &ncb, static void initcam1float (float yb, float pilotd, float f, float la, float xw, float yw, float zw, float &n, float &d, float &nbb, float &ncb,
float &cz, float &aw, float &wh, float &pfl, float &fl, float &c); float &cz, float &aw, float &wh, float &pfl, float &fl, float c);
static void initcam2float (float yb, float pilotd, float f, float la, float xw, float yw, float zw, float &n, float &d, float &nbb, float &ncb, static void initcam2float (float yb, float pilotd, float f, float la, float xw, float yw, float zw, float &n, float &d, float &nbb, float &ncb,
float &cz, float &aw, float &fl); float &cz, float &aw, float &fl);
@ -106,4 +113,3 @@ public:
}; };
} }
#endif

View File

@ -1,5 +1,7 @@
#include "cieimage.h" #include "cieimage.h"
#include <memory.h>
#include <new>
#include <cstring>
namespace rtengine namespace rtengine
{ {
@ -10,7 +12,6 @@ CieImage::CieImage (int w, int h) : fromImage(false), W(w), H(h)
M_p = new float*[H]; M_p = new float*[H];
C_p = new float*[H]; C_p = new float*[H];
sh_p = new float*[H]; sh_p = new float*[H];
// ch_p = new float*[H];
h_p = new float*[H]; h_p = new float*[H];
// Initialize the pointers to zero // Initialize the pointers to zero
@ -98,9 +99,6 @@ CieImage::CieImage (int w, int h) : fromImage(false), W(w), H(h)
++c; ++c;
// for (int i=0; i<H; i++)
// ch_p[i] = data[c] + i*W;
// ++c;
for (int i = 0; i < H; i++) { for (int i = 0; i < H; i++) {
h_p[i] = data[c] + i * W; h_p[i] = data[c] + i * W;
} }

View File

@ -16,10 +16,8 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>. * along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/ */
#ifndef _CIEIMAGE_H_ #pragma once
#define _CIEIMAGE_H_
#include "image16.h"
#include "noncopyable.h" #include "noncopyable.h"
namespace rtengine namespace rtengine
@ -39,7 +37,6 @@ public:
float** M_p; float** M_p;
float** C_p; float** C_p;
float** sh_p; float** sh_p;
// float** ch_p;
float** h_p; float** h_p;
CieImage (int w, int h); CieImage (int w, int h);
@ -50,4 +47,3 @@ public:
}; };
} }
#endif

View File

@ -1,7 +1,11 @@
#include <algorithm> #include <algorithm>
#include <glibmm/fileutils.h>
#include <glibmm/miscutils.h>
#include "clutstore.h" #include "clutstore.h"
#include "colortemp.h"
#include "iccstore.h" #include "iccstore.h"
#include "imagefloat.h" #include "imagefloat.h"
#include "opthelper.h" #include "opthelper.h"

View File

@ -3,8 +3,6 @@
#include <memory> #include <memory>
#include <cstdint> #include <cstdint>
#include <gtkmm.h>
#include "cache.h" #include "cache.h"
#include "alignedbuffer.h" #include "alignedbuffer.h"
#include "noncopyable.h" #include "noncopyable.h"

View File

@ -20,18 +20,19 @@
#include "rtengine.h" #include "rtengine.h"
#include "color.h" #include "color.h"
#include "iccmatrices.h" #include "iccmatrices.h"
#include "mytime.h" #include "sleef.h"
#include "sleef.c"
#include "opthelper.h" #include "opthelper.h"
#include "iccstore.h" #include "iccstore.h"
#ifdef _DEBUG
#include "mytime.h"
#endif
using namespace std; using namespace std;
namespace rtengine namespace rtengine
{ {
extern const Settings* settings;
cmsToneCurve* Color::linearGammaTRC; cmsToneCurve* Color::linearGammaTRC;
LUTf Color::cachef; LUTf Color::cachef;
LUTf Color::cachefy; LUTf Color::cachefy;

View File

@ -20,14 +20,13 @@
#pragma once #pragma once
#include <array> #include <array>
#include <glibmm.h> #include <glibmm/ustring.h>
#include "rt_math.h" #include "rt_math.h"
#include "LUT.h" #include "LUT.h"
#include "labimage.h"
#include "iccmatrices.h" #include "iccmatrices.h"
#include "lcms2.h" #include "lcms2.h"
#include "sleef.c" #include "sleef.h"
#define SAT(a,b,c) ((float)max(a,b,c)-(float)min(a,b,c))/(float)max(a,b,c) #define SAT(a,b,c) ((float)max(a,b,c)-(float)min(a,b,c))/(float)max(a,b,c)
@ -210,6 +209,13 @@ public:
return r * workingspace[1][0] + g * workingspace[1][1] + b * workingspace[1][2]; return r * workingspace[1][0] + g * workingspace[1][1] + b * workingspace[1][2];
} }
#ifdef __SSE2__
static vfloat rgbLuminance(vfloat r, vfloat g, vfloat b, const vfloat workingspace[3])
{
return r * workingspace[0] + g * workingspace[1] + b * workingspace[2];
}
#endif
/** /**
* @brief Convert red/green/blue to L*a*b * @brief Convert red/green/blue to L*a*b
* @brief Convert red/green/blue to hue/saturation/luminance * @brief Convert red/green/blue to hue/saturation/luminance
@ -1068,7 +1074,6 @@ public:
//very small differences between the 2 //very small differences between the 2
return x <= 0.003040 ? x * 12.92310 : 1.055 * exp(log(x) / sRGBGammaCurve) - 0.055;//continuous return x <= 0.003040 ? x * 12.92310 : 1.055 * exp(log(x) / sRGBGammaCurve) - 0.055;//continuous
// return x <= 0.003041 ? x * 12.92310 : 1.055011 * exp(log(x) / sRGBGammaCurve) - 0.055011;//continuous // return x <= 0.003041 ? x * 12.92310 : 1.055011 * exp(log(x) / sRGBGammaCurve) - 0.055011;//continuous
} }
@ -1085,7 +1090,6 @@ public:
//very small differences between the 4 //very small differences between the 4
return x <= 0.039286 ? x / 12.92310 : exp(log((x + 0.055) / 1.055) * sRGBGammaCurve);//continuous return x <= 0.039286 ? x / 12.92310 : exp(log((x + 0.055) / 1.055) * sRGBGammaCurve);//continuous
// return x <= 0.039293 ? x / 12.92310 : exp(log((x + 0.055011) / 1.055011) * sRGBGammaCurve);//continuous // return x <= 0.039293 ? x / 12.92310 : exp(log((x + 0.055011) / 1.055011) * sRGBGammaCurve);//continuous
} }
@ -1804,11 +1808,9 @@ public:
return (hr); return (hr);
} }
static inline void RGB2Y(const float* R, const float* G, const float* B, float* Y1, float * Y2, float gamma, int W) { static inline void RGB2Y(const float* R, const float* G, const float* B, float* Y1, float * Y2, int W) {
gamma = 1.f / gamma;
int i = 0; int i = 0;
#ifdef __SSE2__ #ifdef __SSE2__
const vfloat gammav = F2V(gamma);
const vfloat c1v = F2V(0.2627f); const vfloat c1v = F2V(0.2627f);
const vfloat c2v = F2V(0.6780f); const vfloat c2v = F2V(0.6780f);
const vfloat c3v = F2V(0.0593f); const vfloat c3v = F2V(0.0593f);
@ -1816,7 +1818,7 @@ public:
const vfloat Rv = vmaxf(LVFU(R[i]), ZEROV); const vfloat Rv = vmaxf(LVFU(R[i]), ZEROV);
const vfloat Gv = vmaxf(LVFU(G[i]), ZEROV); const vfloat Gv = vmaxf(LVFU(G[i]), ZEROV);
const vfloat Bv = vmaxf(LVFU(B[i]), ZEROV); const vfloat Bv = vmaxf(LVFU(B[i]), ZEROV);
vfloat yv = pow_F(c1v * Rv + c2v * Gv + c3v * Bv, gammav); vfloat yv = c1v * Rv + c2v * Gv + c3v * Bv;
STVFU(Y1[i], yv); STVFU(Y1[i], yv);
STVFU(Y2[i], yv); STVFU(Y2[i], yv);
} }
@ -1825,7 +1827,7 @@ public:
const float r = std::max(R[i], 0.f); const float r = std::max(R[i], 0.f);
const float g = std::max(G[i], 0.f); const float g = std::max(G[i], 0.f);
const float b = std::max(B[i], 0.f); const float b = std::max(B[i], 0.f);
Y1[i] = Y2[i] = pow_F(0.2627f * r + 0.6780f * g + 0.0593f * b, gamma); Y1[i] = Y2[i] = 0.2627f * r + 0.6780f * g + 0.0593f * b;
} }
} }

View File

@ -16,19 +16,21 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>. * along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/ */
#include <glibmm/ustring.h>
#include "colortemp.h" #include "colortemp.h"
#include "rtengine.h" #include "iccmatrices.h"
#include "rt_math.h"
#include <math.h> #include <math.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include "sleef.c" #include "sleef.h"
#include "settings.h" #include "settings.h"
namespace rtengine namespace rtengine
{ {
extern const Settings* settings;
static const double cie_colour_match_jd[97][3] = {//350nm to 830nm 5 nm J.Desmis 2° Standard Observer. static const double cie_colour_match_jd[97][3] = {//350nm to 830nm 5 nm J.Desmis 2° Standard Observer.
{0.0000000, 0.000000, 0.000000}, {0.0000000, 0.000000, 0.000000}, {0.0001299, 0.0003917, 0.0006061}, {0.0000000, 0.000000, 0.000000}, {0.0000000, 0.000000, 0.000000}, {0.0001299, 0.0003917, 0.0006061},
{0.0002321, 0.000006965, 0.001086}, {0.0004149, 0.00001239, 0.001946}, {0.0007416, 0.00002202, 0.003846}, {0.0002321, 0.000006965, 0.001086}, {0.0004149, 0.00001239, 0.001946}, {0.0007416, 0.00002202, 0.003846},

View File

@ -16,8 +16,7 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>. * along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/ */
#ifndef _COLORTEMP_ #pragma once
#define _COLORTEMP_
#include <cmath> #include <cmath>
#include <map> #include <map>
@ -207,4 +206,3 @@ public:
}; };
} }
#endif

View File

@ -17,8 +17,7 @@
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>. * along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/ */
#ifndef __COORD__ #pragma once
#define __COORD__
namespace rtengine namespace rtengine
{ {
@ -253,5 +252,3 @@ inline const PolarCoord operator* (const double lhs, const PolarCoord& rhs)
} }
} }
#endif

View File

@ -16,8 +16,7 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>. * along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/ */
#ifndef __COORD2D__ #pragma once
#define __COORD2D__
namespace rtengine namespace rtengine
{ {
@ -35,5 +34,5 @@ public:
y = y_; y = y_;
} }
}; };
} }
#endif

View File

@ -17,9 +17,7 @@
* 2010 Ilya Popov <ilia_popov@rambler.ru> * 2010 Ilya Popov <ilia_popov@rambler.ru>
* 2012 Emil Martinec <ejmartin@uchicago.edu> * 2012 Emil Martinec <ejmartin@uchicago.edu>
*/ */
#pragma once
#ifndef CPLX_WAVELET_DEC_H_INCLUDED
#define CPLX_WAVELET_DEC_H_INCLUDED
#include <cstddef> #include <cstddef>
#include <cmath> #include <cmath>
@ -266,5 +264,3 @@ void wavelet_decomposition::reconstruct(E * dst, const float blend)
} }
} }
#endif

View File

@ -17,7 +17,7 @@
* 2012 Emil Martinec <ejmartin@uchicago.edu> * 2012 Emil Martinec <ejmartin@uchicago.edu>
* 2014 Jacques Desmis <jdesmis@gmail.com> * 2014 Jacques Desmis <jdesmis@gmail.com>
*/ */
#pragma once
namespace rtengine namespace rtengine
{ {

View File

@ -17,10 +17,8 @@
* 2010 Ilya Popov <ilia_popov@rambler.ru> * 2010 Ilya Popov <ilia_popov@rambler.ru>
* 2012 Emil Martinec <ejmartin@uchicago.edu> * 2012 Emil Martinec <ejmartin@uchicago.edu>
* 2014 Ingo Weyrich <heckflosse@i-weyrich.de> * 2014 Ingo Weyrich <heckflosse@i-weyrich.de>
*/ */
#pragma once
#ifndef CPLX_WAVELET_LEVEL_H_INCLUDED
#define CPLX_WAVELET_LEVEL_H_INCLUDED
#include <cstddef> #include <cstddef>
#include "rt_math.h" #include "rt_math.h"
@ -274,7 +272,7 @@ template<typename T> void wavelet_level<T>::SynthesisFilterHaarVertical (const T
#pragma omp for nowait #pragma omp for nowait
#endif #endif
for(int i = 0; i < skip; i++) for(int i = 0; i < std::min(skip, height); i++)
{ {
for(int j = 0; j < width; j++) { for(int j = 0; j < width; j++) {
dst[width * i + j] = (srcLo[i * width + j] + srcHi[i * width + j]); dst[width * i + j] = (srcLo[i * width + j] + srcHi[i * width + j]);
@ -759,5 +757,3 @@ template<typename T> template<typename E> void wavelet_level<T>::reconstruct_lev
} }
#endif #endif
} }
#endif

View File

@ -23,9 +23,6 @@
#include <cstring> #include <cstring>
#include <glib.h> #include <glib.h>
#include <glib/gstdio.h> #include <glib/gstdio.h>
#ifdef _OPENMP
#include <omp.h>
#endif
#include "rt_math.h" #include "rt_math.h"
@ -514,7 +511,7 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou
double shcompr, double br, double contr, double shcompr, double br, double contr,
const std::vector<double>& curvePoints, const std::vector<double>& curvePoints,
const std::vector<double>& curvePoints2, const std::vector<double>& curvePoints2,
LUTu & histogram, const LUTu & histogram,
LUTf & hlCurve, LUTf & shCurve, LUTf & outCurve, LUTf & hlCurve, LUTf & shCurve, LUTf & outCurve,
LUTu & outBeforeCCurveHistogram, LUTu & outBeforeCCurveHistogram,
ToneCurve & customToneCurve1, ToneCurve & customToneCurve1,

View File

@ -16,24 +16,21 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>. * along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/ */
#ifndef __CURVES_H__ #pragma once
#define __CURVES_H__
#include <map> #include <map>
#include <string> #include <string>
#include <vector> #include <vector>
#include <glibmm.h> #include <glibmm/ustring.h>
#include "rt_math.h" #include "rt_math.h"
#include "../rtgui/mycurve.h" #include "flatcurvetypes.h"
#include "../rtgui/myflatcurve.h" #include "diagonalcurvetypes.h"
#include "../rtgui/mydiagonalcurve.h"
#include "color.h"
#include "pipettebuffer.h" #include "pipettebuffer.h"
#include "noncopyable.h" #include "noncopyable.h"
#include "LUT.h" #include "LUT.h"
#include "sleef.h"
#define CURVES_MIN_POLY_POINTS 1000 #define CURVES_MIN_POLY_POINTS 1000
#include "rt_math.h" #include "rt_math.h"
@ -354,7 +351,7 @@ public:
public: public:
static void complexCurve (double ecomp, double black, double hlcompr, double hlcomprthresh, double shcompr, double br, double contr, static void complexCurve (double ecomp, double black, double hlcompr, double hlcomprthresh, double shcompr, double br, double contr,
const std::vector<double>& curvePoints, const std::vector<double>& curvePoints2, const std::vector<double>& curvePoints, const std::vector<double>& curvePoints2,
LUTu & histogram, LUTf & hlCurve, LUTf & shCurve, LUTf & outCurve, LUTu & outBeforeCCurveHistogram, ToneCurve & outToneCurve, ToneCurve & outToneCurve2, const LUTu & histogram, LUTf & hlCurve, LUTf & shCurve, LUTf & outCurve, LUTu & outBeforeCCurveHistogram, ToneCurve & outToneCurve, ToneCurve & outToneCurve2,
int skip = 1); int skip = 1);
static void curveBW (const std::vector<double>& curvePointsbw, const std::vector<double>& curvePointsbw2, const LUTu & histogrambw, LUTu & outBeforeCCurveHistogrambw, static void curveBW (const std::vector<double>& curvePointsbw, const std::vector<double>& curvePointsbw2, const LUTu & histogrambw, LUTu & outBeforeCCurveHistogrambw,
@ -896,12 +893,6 @@ public:
float *r, float *g, float *b) const; float *r, float *g, float *b) const;
}; };
class SatAndValueBlendingToneCurve : public ToneCurve
{
public:
void Apply(float& r, float& g, float& b) const;
};
class WeightedStdToneCurve : public ToneCurve class WeightedStdToneCurve : public ToneCurve
{ {
private: private:
@ -1271,45 +1262,6 @@ inline void WeightedStdToneCurve::BatchApply(const size_t start, const size_t en
#endif #endif
} }
// Tone curve modifying the value channel only, preserving hue and saturation
// values in 0xffff space
inline void SatAndValueBlendingToneCurve::Apply (float& ir, float& ig, float& ib) const
{
assert (lutToneCurve);
float r = CLIP(ir);
float g = CLIP(ig);
float b = CLIP(ib);
const float lum = (r + g + b) / 3.f;
const float newLum = lutToneCurve[lum];
if (newLum == lum) {
return;
}
float h, s, v;
Color::rgb2hsvtc(r, g, b, h, s, v);
float dV;
if (newLum > lum) {
// Linearly targeting Value = 1 and Saturation = 0
const float coef = (newLum - lum) / (65535.f - lum);
dV = (1.f - v) * coef;
s *= 1.f - coef;
} else {
// Linearly targeting Value = 0
const float coef = (newLum - lum) / lum ;
dV = v * coef;
}
Color::hsv2rgbdcp(h, s, v + dV, r, g, b);
setUnlessOOG(ir, ig, ib, r, g, b);
}
} }
#undef CLIPI #undef CLIPI
#endif

View File

@ -21,22 +21,22 @@
#include <cstdio> #include <cstdio>
#include <cstring> #include <cstring>
#include <functional> #include <functional>
#include <glib/gstdio.h>
#include <glibmm/fileutils.h>
#include <glibmm/miscutils.h>
#include "dcp.h" #include "dcp.h"
#include "cJSON.h" #include "cJSON.h"
#include "color.h"
#include "iccmatrices.h" #include "iccmatrices.h"
#include "iccstore.h" #include "iccstore.h"
#include "improcfun.h" #include "imagefloat.h"
#include "rawimagesource.h" #include "rawimagesource.h"
#include "rt_math.h" #include "rt_math.h"
#include "utils.h"
namespace rtengine #include "../rtexif/rtexif.h"
{ #include "../rtgui/options.h"
extern const Settings* settings;
}
using namespace rtengine; using namespace rtengine;
using namespace rtexif; using namespace rtexif;
@ -432,7 +432,7 @@ std::map<std::string, std::string> getAliases(const Glib::ustring& profile_dir)
} }
struct DCPProfile::ApplyState::Data { struct DCPProfileApplyState::Data {
float pro_photo[3][3]; float pro_photo[3][3];
float work[3][3]; float work[3][3];
bool already_pro_photo; bool already_pro_photo;
@ -441,14 +441,12 @@ struct DCPProfile::ApplyState::Data {
float bl_scale; float bl_scale;
}; };
DCPProfile::ApplyState::ApplyState() : DCPProfileApplyState::DCPProfileApplyState() :
data(new Data{}) data(new Data{})
{ {
} }
DCPProfile::ApplyState::~ApplyState() DCPProfileApplyState::~DCPProfileApplyState() = default;
{
}
DCPProfile::DCPProfile(const Glib::ustring& filename) : DCPProfile::DCPProfile(const Glib::ustring& filename) :
has_color_matrix_1(false), has_color_matrix_1(false),
@ -1148,7 +1146,7 @@ void DCPProfile::apply(
} }
} }
void DCPProfile::setStep2ApplyState(const Glib::ustring& working_space, bool use_tone_curve, bool apply_look_table, bool apply_baseline_exposure, ApplyState& as_out) void DCPProfile::setStep2ApplyState(const Glib::ustring& working_space, bool use_tone_curve, bool apply_look_table, bool apply_baseline_exposure, DCPProfileApplyState& as_out)
{ {
as_out.data->use_tone_curve = use_tone_curve; as_out.data->use_tone_curve = use_tone_curve;
as_out.data->apply_look_table = apply_look_table; as_out.data->apply_look_table = apply_look_table;
@ -1192,7 +1190,7 @@ void DCPProfile::setStep2ApplyState(const Glib::ustring& working_space, bool use
} }
} }
void DCPProfile::step2ApplyTile(float* rc, float* gc, float* bc, int width, int height, int tile_width, const ApplyState& as_in) const void DCPProfile::step2ApplyTile(float* rc, float* gc, float* bc, int width, int height, int tile_width, const DCPProfileApplyState& as_in) const
{ {
#define FCLIP(a) ((a)>0.0?((a)<65535.5?(a):65535.5):0.0) #define FCLIP(a) ((a)>0.0?((a)<65535.5?(a):65535.5):0.0)
@ -1868,7 +1866,7 @@ DCPProfile* DCPStore::getProfile(const Glib::ustring& filename) const
if (res->isValid()) { if (res->isValid()) {
// Add profile // Add profile
profile_cache[key] = res; profile_cache[key] = res;
if (options.rtSettings.verbose) { if (settings->verbose) {
printf("DCP profile '%s' loaded from disk\n", filename.c_str()); printf("DCP profile '%s' loaded from disk\n", filename.c_str());
} }
return res; return res;

View File

@ -24,35 +24,23 @@
#include <array> #include <array>
#include <memory> #include <memory>
#include <glibmm.h> #include <glibmm/ustring.h>
#include "../rtgui/threadutils.h" #include "../rtgui/threadutils.h"
#include "imagefloat.h"
#include "curves.h" #include "curves.h"
#include "colortemp.h"
#include "noncopyable.h" #include "noncopyable.h"
namespace rtengine namespace rtengine
{ {
class ColorTemp;
class Imagefloat;
class DCPProfileApplyState;
class DCPProfile final class DCPProfile final
{ {
public: public:
class ApplyState final
{
public:
ApplyState();
~ApplyState();
private:
struct Data;
const std::unique_ptr<Data> data;
friend class DCPProfile;
};
struct Illuminants { struct Illuminants {
short light_source_1; short light_source_1;
short light_source_2; short light_source_2;
@ -86,8 +74,8 @@ public:
const Matrix& cam_wb_matrix, const Matrix& cam_wb_matrix,
bool apply_hue_sat_map = true bool apply_hue_sat_map = true
) const; ) const;
void setStep2ApplyState(const Glib::ustring& working_space, bool use_tone_curve, bool apply_look_table, bool apply_baseline_exposure, ApplyState& as_out); void setStep2ApplyState(const Glib::ustring& working_space, bool use_tone_curve, bool apply_look_table, bool apply_baseline_exposure, DCPProfileApplyState& as_out);
void step2ApplyTile(float* r, float* g, float* b, int width, int height, int tile_width, const ApplyState& as_in) const; void step2ApplyTile(float* r, float* g, float* b, int width, int height, int tile_width, const DCPProfileApplyState& as_in) const;
private: private:
struct HsbModify { struct HsbModify {
@ -148,6 +136,20 @@ private:
AdobeToneCurve tone_curve; AdobeToneCurve tone_curve;
}; };
class DCPProfileApplyState final
{
public:
DCPProfileApplyState();
~DCPProfileApplyState();
private:
struct Data;
const std::unique_ptr<Data> data;
friend class DCPProfile;
};
class DCPStore final : class DCPStore final :
public NonCopyable public NonCopyable
{ {

View File

@ -26,12 +26,13 @@
/*RT*/#include <omp.h> /*RT*/#include <omp.h>
/*RT*/#endif /*RT*/#endif
#include <memory>
#include <utility> #include <utility>
#include <vector> #include <vector>
#include "opthelper.h" #include "opthelper.h"
//#define BENCHMARK //#define BENCHMARK
#include "StopWatch.h" #include "StopWatch.h"
#include "utils.h"
#include <zlib.h> #include <zlib.h>
#include <stdint.h> #include <stdint.h>
@ -2418,58 +2419,62 @@ void CLASS hasselblad_correct()
void CLASS hasselblad_load_raw() void CLASS hasselblad_load_raw()
{ {
struct jhead jh; struct jhead jh;
int shot, row, col, *back[5], len[2], diff[12], pred, sh, f, s, c; int diff[12];
unsigned upix, urow, ucol;
ushort *ip;
if (!ljpeg_start (&jh, 0)) return; if (!ljpeg_start (&jh, 0)) {
return;
}
order = 0x4949; order = 0x4949;
ph1_bithuff_t ph1_bithuff(this, ifp, order); ph1_bithuff_t ph1_bithuff(this, ifp, order);
hb_bits(-1); hb_bits(-1);
back[4] = (int *) calloc (raw_width, 3*sizeof **back); const int shot = LIM(shot_select, 1, tiff_samples) - 1;
merror (back[4], "hasselblad_load_raw()"); const int predictor_init = static_cast<int>(0x8000 + load_flags);
FORC3 back[c] = back[4] + c*raw_width; for (int row = 0; row < raw_height; ++row) {
cblack[6] >>= sh = tiff_samples > 1; int stashed_predictors[2] = {predictor_init, predictor_init};
shot = LIM(shot_select, 1, tiff_samples) - 1; for (int col = 0; col < raw_width; col += 2) {
for (row=0; row < raw_height; row++) { for (int s = 0; s < tiff_samples * 2; s += 2) {
FORC4 back[(c+3) & 3] = back[c]; const int len[2]= {
for (col=0; col < raw_width; col+=2) { static_cast<int>(ph1_huff(jh.huff[0])),
for (s=0; s < tiff_samples*2; s+=2) { static_cast<int>(ph1_huff(jh.huff[0]))
FORC(2) len[c] = ph1_huff(jh.huff[0]); };
FORC(2) { for (int c = 0; c < 2; ++c) {
diff[s+c] = hb_bits(len[c]); diff[s + c] = hb_bits(len[c]);
if ((diff[s+c] & (1 << (len[c]-1))) == 0) if ((diff[s + c] & (1 << (len[c] - 1))) == 0) {
diff[s+c] -= (1 << len[c]) - 1; diff[s + c] -= (1 << len[c]) - 1;
if (diff[s+c] == 65535) diff[s+c] = -32768; }
if (diff[s + c] == 65535) {
diff[s + c] = -32768;
} }
} }
for (s=col; s < col+2; s++) {
pred = 0x8000 + load_flags;
if (col) pred = back[2][s-2];
if (col && row > 1) switch (jh.psv) {
case 11: pred += back[0][s]/2 - back[0][s-2]/2; break;
} }
f = (row & 1)*3 ^ ((col+s) & 1); for (int s = col; s < col + 2; ++s) {
FORC (tiff_samples) { int pred = stashed_predictors[s & 1];
pred += diff[(s & 1)*tiff_samples+c]; for (int c = 0; c < tiff_samples; ++c) {
upix = pred >> sh & 0xffff; pred += diff[(s & 1) * tiff_samples + c];
if (raw_image && c == shot) const unsigned upix = pred & 0xffff;
RAW(row,s) = upix; if (raw_image && c == shot) {
RAW(row, s) = upix;
}
if (image) { if (image) {
urow = row-top_margin + (c & 1); const int f = (row & 1) * 3 ^ ((col + s) & 1);
ucol = col-left_margin - ((c >> 1) & 1); const unsigned urow = row - top_margin + (c & 1);
ip = &image[urow*width+ucol][f]; const unsigned ucol = col - left_margin - ((c >> 1) & 1);
if (urow < height && ucol < width) ushort* const ip = &image[urow * width + ucol][f];
if (urow < height && ucol < width) {
*ip = c < 4 ? upix : (*ip + upix) >> 1; *ip = c < 4 ? upix : (*ip + upix) >> 1;
} }
} }
back[2][s] = pred; if (c == (tiff_samples-1)) {
stashed_predictors[s & 1] = pred;
} }
} }
} }
free (back[4]); }
ljpeg_end (&jh); }
if (image) mix_green = 1; ljpeg_end(&jh);
if (image) {
mix_green = 1;
}
} }
void CLASS leaf_hdr_load_raw() void CLASS leaf_hdr_load_raw()
@ -2683,93 +2688,6 @@ void CLASS canon_rmf_load_raw()
maximum = curve[0x3ff]; maximum = curve[0x3ff];
} }
unsigned CLASS pana_bits_t::operator() (int nbits, unsigned *bytes)
{
/*RT static uchar buf[0x4000]; */
/*RT static int vbits;*/
int byte;
if (!nbits && !bytes) return vbits=0;
if (!vbits) {
fread (buf+load_flags, 1, 0x4000-load_flags, ifp);
fread (buf, 1, load_flags, ifp);
}
if (encoding == 5) {
for (byte = 0; byte < 16; byte++)
{
bytes[byte] = buf[vbits++];
vbits &= 0x3FFF;
}
return 0;
} else {
vbits = (vbits - nbits) & 0x1ffff;
byte = vbits >> 3 ^ 0x3ff0;
return (buf[byte] | buf[byte+1] << 8) >> (vbits & 7) & ~(-1 << nbits);
}
}
void CLASS panasonic_load_raw()
{
pana_bits_t pana_bits(ifp,load_flags, RT_pana_info.encoding);
int row, col, i, j, sh=0, pred[2], nonz[2];
unsigned bytes[16] = {};
ushort *raw_block_data;
pana_bits(0, 0);
int enc_blck_size = RT_pana_info.bpp == 12 ? 10 : 9;
if (RT_pana_info.encoding == 5) {
for (row = 0; row < raw_height; row++)
{
raw_block_data = raw_image + row * raw_width;
for (col = 0; col < raw_width; col += enc_blck_size) {
pana_bits(0, bytes);
if (RT_pana_info.bpp == 12) {
raw_block_data[col] = ((bytes[1] & 0xF) << 8) + bytes[0];
raw_block_data[col + 1] = 16 * bytes[2] + (bytes[1] >> 4);
raw_block_data[col + 2] = ((bytes[4] & 0xF) << 8) + bytes[3];
raw_block_data[col + 3] = 16 * bytes[5] + (bytes[4] >> 4);
raw_block_data[col + 4] = ((bytes[7] & 0xF) << 8) + bytes[6];
raw_block_data[col + 5] = 16 * bytes[8] + (bytes[7] >> 4);
raw_block_data[col + 6] = ((bytes[10] & 0xF) << 8) + bytes[9];
raw_block_data[col + 7] = 16 * bytes[11] + (bytes[10] >> 4);
raw_block_data[col + 8] = ((bytes[13] & 0xF) << 8) + bytes[12];
raw_block_data[col + 9] = 16 * bytes[14] + (bytes[13] >> 4);
}
else if (RT_pana_info.bpp == 14) {
raw_block_data[col] = bytes[0] + ((bytes[1] & 0x3F) << 8);
raw_block_data[col + 1] = (bytes[1] >> 6) + 4 * (bytes[2]) +
((bytes[3] & 0xF) << 10);
raw_block_data[col + 2] = (bytes[3] >> 4) + 16 * (bytes[4]) +
((bytes[5] & 3) << 12);
raw_block_data[col + 3] = ((bytes[5] & 0xFC) >> 2) + (bytes[6] << 6);
raw_block_data[col + 4] = bytes[7] + ((bytes[8] & 0x3F) << 8);
raw_block_data[col + 5] = (bytes[8] >> 6) + 4 * bytes[9] + ((bytes[10] & 0xF) << 10);
raw_block_data[col + 6] = (bytes[10] >> 4) + 16 * bytes[11] + ((bytes[12] & 3) << 12);
raw_block_data[col + 7] = ((bytes[12] & 0xFC) >> 2) + (bytes[13] << 6);
raw_block_data[col + 8] = bytes[14] + ((bytes[15] & 0x3F) << 8);
}
}
}
} else {
for (row=0; row < height; row++)
for (col=0; col < raw_width; col++) {
if ((i = col % 14) == 0)
pred[0] = pred[1] = nonz[0] = nonz[1] = 0;
if (i % 3 == 2) sh = 4 >> (3 - pana_bits(2));
if (nonz[i & 1]) {
if ((j = pana_bits(8))) {
if ((pred[i & 1] -= 0x80 << sh) < 0 || sh == 4)
pred[i & 1] &= ~(-1 << sh);
pred[i & 1] += j << sh;
}
} else if ((nonz[i & 1] = pana_bits(8)) || i > 11)
pred[i & 1] = nonz[i & 1] << 4 | pana_bits(4);
if ((RAW(row,col) = pred[col & 1]) > 4098 && col < width) derror();
}
}
}
void CLASS olympus_load_raw() void CLASS olympus_load_raw()
{ {
@ -4216,8 +4134,8 @@ void CLASS foveon_interpolate()
foveon_avg (image[row*width]+c, dscr[1], cfilt) * 3 foveon_avg (image[row*width]+c, dscr[1], cfilt) * 3
- ddft[0][c][0] ) / 4 - ddft[0][c][1]; - ddft[0][c][0] ) / 4 - ddft[0][c][1];
} }
memcpy (black, black+8, sizeof *black*8); memmove (black, black+8, sizeof *black*8);
memcpy (black+height-11, black+height-22, 11*sizeof *black); memmove (black+height-11, black+height-22, 11*sizeof *black);
memcpy (last, black, sizeof last); memcpy (last, black, sizeof last);
for (row=1; row < height-1; row++) { for (row=1; row < height-1; row++) {
@ -5677,13 +5595,26 @@ nf: order = 0x4949;
else if (!strcmp (buf,"AOC") || else if (!strcmp (buf,"AOC") ||
!strcmp (buf,"QVC")) !strcmp (buf,"QVC"))
fseek (ifp, -4, SEEK_CUR); fseek (ifp, -4, SEEK_CUR);
// ALB -- taken from LibRaw ------------------------------------------------
else if (!strncmp(buf, "CMT3", 4))
{
order = sget2((uchar *)(buf + 4));
fseek(ifp, 2L, SEEK_CUR);
}
else if (RT_canon_CR3_data.CR3_CTMDtag)
{
order = sget2((uchar *)buf);
fseek(ifp, -2L, SEEK_CUR);
}
// -------------------------------------------------------------------------
else { else {
fseek (ifp, -10, SEEK_CUR); fseek (ifp, -10, SEEK_CUR);
if (!strncmp(make,"SAMSUNG",7)) if (!strncmp(make,"SAMSUNG",7))
base = ftell(ifp); base = ftell(ifp);
} }
entries = get2(); entries = get2();
if (entries > 1000) return; if (entries > 2000) return;
morder = order; morder = order;
while (entries--) { while (entries--) {
order = morder; order = morder;
@ -5888,16 +5819,335 @@ get2_256:
parse_thumb_note (base, 136, 137); parse_thumb_note (base, 136, 137);
} }
if (tag == 0x4001 && len > 500) { if (tag == 0x4001 && len > 500) {
i = len == 582 ? 50 : len == 653 ? 68 : len == 5120 ? 142 : 126; // i = len == 582 ? 50 : len == 653 ? 68 : len == 5120 ? 142 : 126;
fseek (ifp, i, SEEK_CUR); // fseek (ifp, i, SEEK_CUR);
FORC4 cam_mul[c ^ (c >> 1)] = get2(); // FORC4 cam_mul[c ^ (c >> 1)] = get2();
for (i+=18; i <= len; i+=10) { // for (i+=18; i <= len; i+=10) {
get2(); // get2();
// FORC4 sraw_mul[c ^ (c >> 1)] = get2();
// if (sraw_mul[1] == 1170) break;
// }
// -- ALB -- adapted from LibRaw --------------------------------------
int bls = 0;
long int offsetChannelBlackLevel = 0L;
long int offsetChannelBlackLevel2 = 0L;
long int offsetWhiteLevels = 0L;
struct {
int AverageBlackLevel;
int ColorDataSubVer;
int NormalWhiteLevel;
int SpecularWhiteLevel;
} imCanon = { 0, 0, 0, 0 };
long int save1 = ftell(ifp);
switch (len)
{
case 582:
// imCanon.ColorDataVer = 1; // 20D / 350D
fseek(ifp, save1 + (0x0019 << 1), SEEK_SET);
FORC4 cam_mul[c ^ (c >> 1)] = (float)get2();
// fseek(ifp, save1 + (0x001e << 1), SEEK_SET);
// FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Auto][c ^ (c >> 1)] = get2();
// fseek(ifp, save1 + (0x0041 << 1), SEEK_SET);
// FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Custom1][c ^ (c >> 1)] = get2();
// fseek(ifp, save1 + (0x0046 << 1), SEEK_SET);
// FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Custom2][c ^ (c >> 1)] = get2();
// fseek(ifp, save1 + (0x0023 << 1), SEEK_SET);
// Canon_WBpresets(2, 2);
// fseek(ifp, save1 + (0x004b << 1), SEEK_SET);
// Canon_WBCTpresets(1); // ABCT
offsetChannelBlackLevel = save1 + (0x00a6 << 1);
break;
case 653:
// imCanon.ColorDataVer = 2; // 1Dmk2 / 1DsMK2
// fseek(ifp, save1 + (0x0018 << 1), SEEK_SET);
// FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Auto][c ^ (c >> 1)] = get2();
fseek(ifp, save1 + (0x0022 << 1), SEEK_SET);
FORC4 cam_mul[c ^ (c >> 1)] = (float)get2();
// fseek(ifp, save1 + (0x0090 << 1), SEEK_SET);
// FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Custom1][c ^ (c >> 1)] = get2();
// fseek(ifp, save1 + (0x0095 << 1), SEEK_SET);
// FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Custom2][c ^ (c >> 1)] = get2();
// fseek(ifp, save1 + (0x009a << 1), SEEK_SET);
// FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Custom3][c ^ (c >> 1)] = get2();
// fseek(ifp, save1 + (0x0027 << 1), SEEK_SET);
// Canon_WBpresets(2, 12);
// fseek(ifp, save1 + (0x00a4 << 1), SEEK_SET);
// Canon_WBCTpresets(1); // ABCT
offsetChannelBlackLevel = save1 + (0x011e << 1);
break;
case 796:
// imCanon.ColorDataVer = 3; // 1DmkIIN / 5D / 30D / 400D
// imCanon.ColorDataSubVer = get2();
fseek(ifp, save1 + (0x003f << 1), SEEK_SET);
FORC4 cam_mul[c ^ (c >> 1)] = (float)get2();
// fseek(ifp, save1 + (0x0044 << 1), SEEK_SET);
// FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Auto][c ^ (c >> 1)] = get2();
// fseek(ifp, save1 + (0x0049 << 1), SEEK_SET);
// FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Measured][c ^ (c >> 1)] = get2();
// fseek(ifp, save1 + (0x0071 << 1), SEEK_SET);
// FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Custom1][c ^ (c >> 1)] = get2();
// fseek(ifp, save1 + (0x0076 << 1), SEEK_SET);
// FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Custom2][c ^ (c >> 1)] = get2();
// fseek(ifp, save1 + (0x007b << 1), SEEK_SET);
// FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Custom3][c ^ (c >> 1)] = get2();
// fseek(ifp, save1 + (0x0080 << 1), SEEK_SET);
// FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Custom][c ^ (c >> 1)] = get2();
// fseek(ifp, save1 + (0x004e << 1), SEEK_SET);
// Canon_WBpresets(2, 12);
// fseek(ifp, save1 + (0x0085 << 1), SEEK_SET);
// Canon_WBCTpresets(0); // BCAT
offsetChannelBlackLevel = save1 + (0x00c4 << 1);
break;
// 1DmkIII / 1DSmkIII / 1DmkIV / 5DmkII
// 7D / 40D / 50D / 60D / 450D / 500D
// 550D / 1000D / 1100D
case 674:
case 692:
case 702:
case 1227:
case 1250:
case 1251:
case 1337:
case 1338:
case 1346:
// imCanon.ColorDataVer = 4;
imCanon.ColorDataSubVer = get2();
fseek(ifp, save1 + (0x003f << 1), SEEK_SET);
FORC4 cam_mul[c ^ (c >> 1)] = (float)get2();
// fseek(ifp, save1 + (0x0044 << 1), SEEK_SET);
// FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Auto][c ^ (c >> 1)] = get2();
// fseek(ifp, save1 + (0x0049 << 1), SEEK_SET);
// FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Measured][c ^ (c >> 1)] = get2();
fseek(ifp, save1 + (0x004e << 1), SEEK_SET);
FORC4 sraw_mul[c ^ (c >> 1)] = get2(); FORC4 sraw_mul[c ^ (c >> 1)] = get2();
if (sraw_mul[1] == 1170) break; // fseek(ifp, save1 + (0x0053 << 1), SEEK_SET);
// Canon_WBpresets(2, 12);
// fseek(ifp, save1 + (0x00a8 << 1), SEEK_SET);
// Canon_WBCTpresets(0); // BCAT
if ((imCanon.ColorDataSubVer == 4) ||
(imCanon.ColorDataSubVer == 5))
{
offsetChannelBlackLevel = save1 + (0x02b4 << 1);
offsetWhiteLevels = save1 + (0x02b8 << 1);
} }
else if ((imCanon.ColorDataSubVer == 6) ||
(imCanon.ColorDataSubVer == 7))
{
offsetChannelBlackLevel = save1 + (0x02cb << 1);
offsetWhiteLevels = save1 + (0x02cf << 1);
} }
if (tag == 0x4021 && get4() && get4()) else if (imCanon.ColorDataSubVer == 9)
{
offsetChannelBlackLevel = save1 + (0x02cf << 1);
offsetWhiteLevels = save1 + (0x02d3 << 1);
}
else
offsetChannelBlackLevel = save1 + (0x00e7 << 1);
break;
case 5120: // PowerShot G10, G12, G5 X, G7 X, G9 X, EOS M3, EOS M5, EOS M6
// imCanon.ColorDataVer = 5;
imCanon.ColorDataSubVer = get2();
fseek(ifp, save1 + (0x0047 << 1), SEEK_SET);
FORC4 cam_mul[c ^ (c >> 1)] = (float)get2();
if (imCanon.ColorDataSubVer == 0xfffc)
{ // -4: G7 X Mark II, G9 X Mark II, G1 X Mark III, M5, M100, M6
// fseek(ifp, save1 + (0x004f << 1), SEEK_SET);
// FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Auto][c ^ (c >> 1)] = get2();
// fseek(ifp, 8, SEEK_CUR);
// FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Measured][c ^ (c >> 1)] =
// get2();
// fseek(ifp, 8, SEEK_CUR);
// FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Other][c ^ (c >> 1)] = get2();
// fseek(ifp, 8, SEEK_CUR);
// Canon_WBpresets(8, 24);
// fseek(ifp, 168, SEEK_CUR);
// FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_FL_WW][c ^ (c >> 1)] = get2();
// fseek(ifp, 24, SEEK_CUR);
// Canon_WBCTpresets(2); // BCADT
offsetChannelBlackLevel = save1 + (0x014d << 1);
offsetWhiteLevels = save1 + (0x0569 << 1);
}
else if (imCanon.ColorDataSubVer == 0xfffd)
{ // -3: M10/M3/G1 X/G1 X II/G10/G11/G12/G15/G16/G3 X/G5 X/G7 X/G9
// X/S100/S110/S120/S90/S95/SX1 IX/SX50 HS/SX60 HS
// fseek(ifp, save1 + (0x004c << 1), SEEK_SET);
// FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Auto][c ^ (c >> 1)] = get2();
// get2();
// FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Measured][c ^ (c >> 1)] =
// get2();
// get2();
// FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Other][c ^ (c >> 1)] = get2();
// get2();
// Canon_WBpresets(2, 12);
// fseek(ifp, save1 + (0x00ba << 1), SEEK_SET);
// Canon_WBCTpresets(2); // BCADT
offsetChannelBlackLevel = save1 + (0x0108 << 1);
}
break;
case 1273:
case 1275:
// imCanon.ColorDataVer = 6; // 600D / 1200D
imCanon.ColorDataSubVer = get2();
fseek(ifp, save1 + (0x003f << 1), SEEK_SET);
FORC4 cam_mul[c ^ (c >> 1)] = (float)get2();
// fseek(ifp, save1 + (0x0044 << 1), SEEK_SET);
// FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Auto][c ^ (c >> 1)] = get2();
// fseek(ifp, save1 + (0x0049 << 1), SEEK_SET);
// FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Measured][c ^ (c >> 1)] = get2();
fseek(ifp, save1 + (0x0062 << 1), SEEK_SET);
FORC4 sraw_mul[c ^ (c >> 1)] = get2();
// fseek(ifp, save1 + (0x0067 << 1), SEEK_SET);
// Canon_WBpresets(2, 12);
// fseek(ifp, save1 + (0x00bc << 1), SEEK_SET);
// Canon_WBCTpresets(0); // BCAT
offsetChannelBlackLevel = save1 + (0x01df << 1);
offsetWhiteLevels = save1 + (0x01e3 << 1);
break;
// 1DX / 5DmkIII / 6D / 100D / 650D / 700D / EOS M / 7DmkII / 750D / 760D
case 1312:
case 1313:
case 1316:
case 1506:
// imCanon.ColorDataVer = 7;
imCanon.ColorDataSubVer = get2();
fseek(ifp, save1 + (0x003f << 1), SEEK_SET);
FORC4 cam_mul[c ^ (c >> 1)] = (float)get2();
// fseek(ifp, save1 + (0x0044 << 1), SEEK_SET);
// FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Auto][c ^ (c >> 1)] = get2();
// fseek(ifp, save1 + (0x0049 << 1), SEEK_SET);
// FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Measured][c ^ (c >> 1)] = get2();
fseek(ifp, save1 + (0x007b << 1), SEEK_SET);
FORC4 sraw_mul[c ^ (c >> 1)] = get2();
// fseek(ifp, save1 + (0x0080 << 1), SEEK_SET);
// Canon_WBpresets(2, 12);
// fseek(ifp, save1 + (0x00d5 << 1), SEEK_SET);
// Canon_WBCTpresets(0); // BCAT
if (imCanon.ColorDataSubVer == 10)
{
offsetChannelBlackLevel = save1 + (0x01f8 << 1);
offsetWhiteLevels = save1 + (0x01fc << 1);
}
else if (imCanon.ColorDataSubVer == 11)
{
offsetChannelBlackLevel = save1 + (0x02d8 << 1);
offsetWhiteLevels = save1 + (0x02dc << 1);
}
break;
// 5DS / 5DS R / 80D / 1300D / 1500D / 3000D / 5D4 / 800D / 77D / 6D II /
// 200D
case 1560:
case 1592:
case 1353:
case 1602:
// imCanon.ColorDataVer = 8;
imCanon.ColorDataSubVer = get2();
fseek(ifp, save1 + (0x003f << 1), SEEK_SET);
FORC4 cam_mul[c ^ (c >> 1)] = (float)get2();
// fseek(ifp, save1 + (0x0044 << 1), SEEK_SET);
// FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Auto][c ^ (c >> 1)] = get2();
// fseek(ifp, save1 + (0x0049 << 1), SEEK_SET);
// FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Measured][c ^ (c >> 1)] = get2();
fseek(ifp, save1 + (0x0080 << 1), SEEK_SET);
FORC4 sraw_mul[c ^ (c >> 1)] = get2();
// fseek(ifp, save1 + (0x0085 << 1), SEEK_SET);
// Canon_WBpresets(2, 12);
// fseek(ifp, save1 + (0x0107 << 1), SEEK_SET);
// Canon_WBCTpresets(0); // BCAT
if (imCanon.ColorDataSubVer == 14)
{ // 1300D / 1500D / 3000D
offsetChannelBlackLevel = save1 + (0x022c << 1);
offsetWhiteLevels = save1 + (0x0230 << 1);
}
else
{
offsetChannelBlackLevel = save1 + (0x030a << 1);
offsetWhiteLevels = save1 + (0x030e << 1);
}
break;
case 1820: // M50, ColorDataSubVer 16
case 1824: // EOS R, SX740HS, ColorDataSubVer 17
case 1816: // EOS RP, SX70HS, ColorDataSubVer 18;
// EOS M6 Mark II, EOS 90D, G7XmkIII, ColorDataSubVer 19
// imCanon.ColorDataVer = 9;
imCanon.ColorDataSubVer = get2();
fseek(ifp, save1 + (0x0047 << 1), SEEK_SET);
FORC4 cam_mul[c ^ (c >> 1)] = (float)get2();
// get2();
// FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Auto][c ^ (c >> 1)] = get2();
// get2();
// FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Measured][c ^ (c >> 1)] = get2();
// fseek(ifp, save1 + (0x0088 << 1), SEEK_SET);
// Canon_WBpresets(2, 12);
// fseek(ifp, save1 + (0x010a << 1), SEEK_SET);
// Canon_WBCTpresets(0);
offsetChannelBlackLevel = save1 + (0x0318 << 1);
offsetChannelBlackLevel2 = save1 + (0x0149 << 1);
offsetWhiteLevels = save1 + (0x031c << 1);
break;
}
if (offsetChannelBlackLevel)
{
fseek(ifp, offsetChannelBlackLevel, SEEK_SET);
FORC4
bls += (cblack/*imCanon.ChannelBlackLevel*/[c ^ (c >> 1)] = get2());
imCanon.AverageBlackLevel = bls / 4;
// RT_blacklevel_from_constant = ThreeValBool::F;
}
if (offsetWhiteLevels)
{
if ((offsetWhiteLevels - offsetChannelBlackLevel) != 8L)
fseek(ifp, offsetWhiteLevels, SEEK_SET);
imCanon.NormalWhiteLevel = get2();
imCanon.SpecularWhiteLevel = get2();
// FORC4
// imgdata.color.linear_max[c] = imCanon.SpecularWhiteLevel;
maximum = imCanon.SpecularWhiteLevel;
// RT_whitelevel_from_constant = ThreeValBool::F;
}
if(!imCanon.AverageBlackLevel && offsetChannelBlackLevel2)
{
fseek(ifp, offsetChannelBlackLevel2, SEEK_SET);
FORC4
bls += (cblack/*imCanon.ChannelBlackLevel*/[c ^ (c >> 1)] = get2());
imCanon.AverageBlackLevel = bls / 4;
// RT_blacklevel_from_constant = ThreeValBool::F;
}
fseek(ifp, save1, SEEK_SET);
//---------------------------------------------------------------------
} if (tag == 0x4021 && get4() && get4())
FORC4 cam_mul[c] = 1024; FORC4 cam_mul[c] = 1024;
if (tag == 0xa021) if (tag == 0xa021)
FORC4 cam_mul[c ^ (c >> 1)] = get4(); FORC4 cam_mul[c ^ (c >> 1)] = get4();
@ -6765,7 +7015,8 @@ int CLASS parse_tiff (int base)
void CLASS apply_tiff() void CLASS apply_tiff()
{ {
int max_samp=0, ties=0, os, ns, raw=-1, thm=-1, i; int max_samp=0, ties=0, /*os, ns,*/ raw=-1, thm=-1, i;
uint64_t os, ns; // RT
struct jhead jh; struct jhead jh;
thumb_misc = 16; thumb_misc = 16;
@ -6795,6 +7046,7 @@ void CLASS apply_tiff()
} }
if ((tiff_ifd[i].comp != 6 || tiff_ifd[i].samples != 3) && if ((tiff_ifd[i].comp != 6 || tiff_ifd[i].samples != 3) &&
(tiff_ifd[i].width | tiff_ifd[i].height) < 0x10000 && (tiff_ifd[i].width | tiff_ifd[i].height) < 0x10000 &&
(unsigned)tiff_ifd[i].bps < 33 && (unsigned)tiff_ifd[i].samples < 13 && // RT
ns && ((ns > os && (ties = 1)) || ns && ((ns > os && (ties = 1)) ||
(ns == os && shot_select == ties++))) { (ns == os && shot_select == ties++))) {
raw_width = tiff_ifd[i].width; raw_width = tiff_ifd[i].width;
@ -6862,7 +7114,7 @@ void CLASS apply_tiff()
load_raw = &CLASS olympus_load_raw; load_raw = &CLASS olympus_load_raw;
// ------- RT ------- // ------- RT -------
if (!strncmp(make,"SONY",4) && if (!strncmp(make,"SONY",4) &&
!strncmp(model,"ILCE-7RM3",9) && (!strncmp(model,"ILCE-7RM3",9) || !strncmp(model,"ILCE-7RM4",9)) &&
tiff_samples == 4 && tiff_samples == 4 &&
tiff_ifd[raw].bytes == raw_width*raw_height*tiff_samples*2) { tiff_ifd[raw].bytes == raw_width*raw_height*tiff_samples*2) {
load_raw = &CLASS sony_arq_load_raw; load_raw = &CLASS sony_arq_load_raw;
@ -9395,6 +9647,11 @@ void CLASS identify()
parse_foveon(); parse_foveon();
else if (!memcmp (head,"CI",2)) else if (!memcmp (head,"CI",2))
parse_cine(); parse_cine();
//--- RT ----------------------------------------------------------------
else if (!memcmp(head + 4, "ftypcrx ", 8)) {
parse_canon_cr3();
}
//-------------------------------------------------------------------------
if (make[0] == 0) if (make[0] == 0)
for (zero_fsize=i=0; i < sizeof table / sizeof *table; i++) for (zero_fsize=i=0; i < sizeof table / sizeof *table; i++)
if (fsize == table[i].fsize) { if (fsize == table[i].fsize) {
@ -10754,8 +11011,6 @@ void CLASS nikon_14bit_load_raw()
free(buf); free(buf);
} }
//-----------------------------------------------------------------------------
/* RT: Delete from here */ /* RT: Delete from here */
/*RT*/#undef SQR /*RT*/#undef SQR
/*RT*/#undef MAX /*RT*/#undef MAX

View File

@ -17,8 +17,7 @@
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>. * along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/ */
#ifndef DCRAW_H #pragma once
#define DCRAW_H
#include "myfile.h" #include "myfile.h"
#include <csetjmp> #include <csetjmp>
@ -69,6 +68,7 @@ public:
gamm[0]=0.45;gamm[1]=4.5;gamm[2]=gamm[3]=gamm[4]=gamm[5]=0; gamm[0]=0.45;gamm[1]=4.5;gamm[2]=gamm[3]=gamm[4]=gamm[5]=0;
user_mul[0]=user_mul[1]=user_mul[2]=user_mul[3]=0; user_mul[0]=user_mul[1]=user_mul[2]=user_mul[3]=0;
greybox[0]=greybox[1]=0; greybox[2]=greybox[3]= UINT_MAX; greybox[0]=greybox[1]=0; greybox[2]=greybox[3]= UINT_MAX;
RT_canon_CR3_data.CR3_CTMDtag = 0;
} }
protected: protected:
@ -165,11 +165,39 @@ protected:
PanasonicRW2Info(): bpp(0), encoding(0) {} PanasonicRW2Info(): bpp(0), encoding(0) {}
}; };
PanasonicRW2Info RT_pana_info; PanasonicRW2Info RT_pana_info;
public:
struct CanonCR3Data {
// contents of tag CMP1 for relevant track in CR3 file
struct crx_data_header_t {
int32_t version;
int32_t f_width;
int32_t f_height;
int32_t tileWidth;
int32_t tileHeight;
int32_t nBits;
int32_t nPlanes;
int32_t cfaLayout;
int32_t encType;
int32_t imageLevels;
int32_t hasTileCols;
int32_t hasTileRows;
int32_t mdatHdrSize;
// Not from header, but from datastream
uint32_t MediaSize;
int64_t MediaOffset;
uint32_t MediaType; /* 1 -> /C/RAW, 2-> JPEG */
};
static constexpr size_t CRXTRACKS_MAXCOUNT = 16;
crx_data_header_t crx_header[CRXTRACKS_MAXCOUNT];
unsigned int crx_track_selected;
short CR3_CTMDtag;
};
protected:
CanonCR3Data RT_canon_CR3_data;
float cam_mul[4], pre_mul[4], cmatrix[3][4], rgb_cam[3][4]; float cam_mul[4], pre_mul[4], cmatrix[3][4], rgb_cam[3][4];
int histogram[4][0x2000]; void (DCraw::*write_thumb)();
void (DCraw::*write_thumb)(), (DCraw::*write_fun)();
void (DCraw::*load_raw)(), (DCraw::*thumb_load_raw)(); void (DCraw::*load_raw)(), (DCraw::*thumb_load_raw)();
jmp_buf failure; jmp_buf failure;
@ -413,6 +441,9 @@ private:
unsigned encoding; unsigned encoding;
}; };
void panasonicC6_load_raw();
void panasonicC7_load_raw();
void canon_rmf_load_raw(); void canon_rmf_load_raw();
void panasonic_load_raw(); void panasonic_load_raw();
void olympus_load_raw(); void olympus_load_raw();
@ -528,7 +559,20 @@ void shiftXtransMatrix( const int offsy, const int offsx) {
void nikon_14bit_load_raw(); // ported from LibRaw void nikon_14bit_load_raw(); // ported from LibRaw
//-----------------------------------------------------------------------------
// Canon CR3 support ported from LibRaw
//-----------------------------------------------------------------------------
void parse_canon_cr3();
void selectCRXTrack(unsigned short maxTrack);
int parseCR3(unsigned long long oAtomList,
unsigned long long szAtomList, short &nesting,
char *AtomNameStack, unsigned short &nTrack, short &TrackType);
bool crxDecodePlane(void *p, uint32_t planeNumber);
void crxLoadDecodeLoop(void *img, int nPlanes);
void crxConvertPlaneLineDf(void *p, int imageRow);
void crxLoadFinalizeLoopE3(void *p, int planeHeight);
void crxLoadRaw();
bool crxParseImageHeader(uchar *cmp1TagData, unsigned int nTrack);
//-----------------------------------------------------------------------------
}; };
#endif //DCRAW_H

View File

@ -17,12 +17,19 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>. * along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/ */
#include "cieimage.h"
#include "curves.h" #include "curves.h"
#include "dcp.h"
#include "dcrop.h" #include "dcrop.h"
#include "image8.h"
#include "imagefloat.h"
#include "labimage.h"
#include "mytime.h" #include "mytime.h"
#include "procparams.h" #include "procparams.h"
#include "refreshmap.h" #include "refreshmap.h"
#include "rt_math.h" #include "rt_math.h"
#include "../rtgui/editcallbacks.h" #include "../rtgui/editcallbacks.h"
namespace namespace
@ -40,8 +47,6 @@ constexpr T skips(T a, T b)
namespace rtengine namespace rtengine
{ {
extern const Settings* settings;
Crop::Crop(ImProcCoordinator* parent, EditDataProvider *editDataProvider, bool isDetailWindow) Crop::Crop(ImProcCoordinator* parent, EditDataProvider *editDataProvider, bool isDetailWindow)
: PipetteBuffer(editDataProvider), origCrop(nullptr), spotCrop(nullptr), laboCrop(nullptr), : PipetteBuffer(editDataProvider), origCrop(nullptr), spotCrop(nullptr), laboCrop(nullptr),
labnCrop(nullptr), cropImg (nullptr), transCrop (nullptr), cieCrop (nullptr), labnCrop(nullptr), cropImg (nullptr), transCrop (nullptr), cieCrop (nullptr),
@ -191,18 +196,8 @@ void Crop::update(int todo)
params.dirpyrDenoise.getCurves(noiseLCurve, noiseCCurve); params.dirpyrDenoise.getCurves(noiseLCurve, noiseCCurve);
int tilesize; const int tilesize = settings->leveldnti == 0 ? 1024 : 768;
int overlap; const int overlap = settings->leveldnti == 0 ? 128 : 96;
if (settings->leveldnti == 0) {
tilesize = 1024;
overlap = 128;
}
if (settings->leveldnti == 1) {
tilesize = 768;
overlap = 96;
}
int numtiles_W, numtiles_H, tilewidth, tileheight, tileWskip, tileHskip; int numtiles_W, numtiles_H, tilewidth, tileheight, tileWskip, tileHskip;
@ -854,7 +849,7 @@ void Crop::update(int todo)
} }
} }
double rrm, ggm, bbm; double rrm, ggm, bbm;
DCPProfile::ApplyState as; DCPProfileApplyState as;
DCPProfile *dcpProf = parent->imgsrc->getDCP(params.icm, as); DCPProfile *dcpProf = parent->imgsrc->getDCP(params.icm, as);
LUTu histToneCurve; LUTu histToneCurve;

View File

@ -21,8 +21,6 @@
#include "improccoordinator.h" #include "improccoordinator.h"
#include "rtengine.h" #include "rtengine.h"
#include "improcfun.h" #include "improcfun.h"
#include "image8.h"
#include "image16.h"
#include "imagesource.h" #include "imagesource.h"
#include "procevents.h" #include "procevents.h"
#include "pipettebuffer.h" #include "pipettebuffer.h"
@ -31,6 +29,8 @@
namespace rtengine namespace rtengine
{ {
class Image8;
using namespace procparams; using namespace procparams;
class ImProcCoordinator; class ImProcCoordinator;

File diff suppressed because it is too large Load Diff

View File

@ -16,23 +16,27 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>. * along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/ */
#include "dfmanager.h"
#include "../rtgui/options.h"
#include <giomm.h>
#include "../rtgui/guiutils.h"
#include "rawimage.h"
#include <sstream> #include <sstream>
#include <iostream> #include <iostream>
#include <cstdio> #include <cstdio>
#include "imagedata.h" #include <giomm.h>
#include <glibmm/ustring.h> #include <glibmm/ustring.h>
#include "dfmanager.h"
#include "../rtgui/options.h"
#include "rawimage.h"
#include "imagedata.h"
#include "utils.h"
namespace rtengine namespace rtengine
{ {
extern const Settings* settings;
// *********************** class dfInfo ************************************** // *********************** class dfInfo **************************************
dfInfo::~dfInfo()
{
delete ri;
}
inline dfInfo& dfInfo::operator =(const dfInfo &o) inline dfInfo& dfInfo::operator =(const dfInfo &o)
{ {

View File

@ -19,17 +19,18 @@
#pragma once #pragma once
#include <cmath> #include <cmath>
#include <list>
#include <map> #include <map>
#include <string> #include <string>
#include <glibmm/ustring.h> #include <glibmm/ustring.h>
#include "pixelsmap.h" #include "pixelsmap.h"
#include "rawimage.h"
namespace rtengine namespace rtengine
{ {
class RawImage;
class dfInfo class dfInfo
{ {
public: public:
@ -48,13 +49,7 @@ public:
dfInfo( const dfInfo &o) dfInfo( const dfInfo &o)
: pathname(o.pathname), maker(o.maker), model(o.model), iso(o.iso), shutter(o.shutter), timestamp(o.timestamp), ri(nullptr) {} : pathname(o.pathname), maker(o.maker), model(o.model), iso(o.iso), shutter(o.shutter), timestamp(o.timestamp), ri(nullptr) {}
~dfInfo() ~dfInfo();
{
if( ri ) {
delete ri;
}
}
dfInfo &operator =(const dfInfo &o); dfInfo &operator =(const dfInfo &o);
bool operator <(const dfInfo &e2) const; bool operator <(const dfInfo &e2) const;

View File

@ -0,0 +1,31 @@
/*
* This file is part of RawTherapee.
*
* Copyright (c) 2004-2019 Gabor Horvath <hgabor@rawtherapee.com>
*
* 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 <https://www.gnu.org/licenses/>.
*/
#pragma once
// For compatibility and simplicity reason, order shouldn't change, and must be identical to the order specified in the curveType widget
enum DiagonalCurveType {
DCT_Empty = -1, // Also used for identity curves
DCT_Linear, // 0
DCT_Spline, // 1
DCT_Parametric, // 2
DCT_NURBS, // 3
DCT_CatumullRom, // 4
// Insert new curve type above this line
DCT_Unchanged // Must remain the last of the enum
};

View File

@ -18,12 +18,18 @@
* *
*/ */
#include <cstddef> #include <algorithm>
#include <cmath> #include <cmath>
#include "improcfun.h" #include <cstddef>
#include "array2D.h" #include "array2D.h"
#include "rt_math.h" #include "cieimage.h"
#include "color.h"
#include "improcfun.h"
#include "LUT.h"
#include "opthelper.h" #include "opthelper.h"
#include "rt_math.h"
#include "settings.h"
namespace { namespace {
@ -71,8 +77,8 @@ void dirpyr_channel(const float * const * data_fine, float ** data_coarse, int w
float val = 0.f; float val = 0.f;
float norm = 0.f; float norm = 0.f;
for (int inbr = max(0, i - scalewin); inbr <= min(height - 1, i + scalewin); inbr += scale) { for (int inbr = std::max(0, i - scalewin); inbr <= std::min(height - 1, i + scalewin); inbr += scale) {
for (int jnbr = max(0, j - scalewin); jnbr <= j + scalewin; jnbr += scale) { for (int jnbr = std::max(0, j - scalewin); jnbr <= j + scalewin; jnbr += scale) {
const float dirwt = domker[(inbr - i) / scale + halfwin][(jnbr - j)/ scale + halfwin] * rangeFn(fabsf(data_fine[inbr][jnbr] - data_fine[i][j])); const float dirwt = domker[(inbr - i) / scale + halfwin][(jnbr - j)/ scale + halfwin] * rangeFn(fabsf(data_fine[inbr][jnbr] - data_fine[i][j]));
val += dirwt * data_fine[inbr][jnbr]; val += dirwt * data_fine[inbr][jnbr];
norm += dirwt; norm += dirwt;
@ -105,7 +111,7 @@ void dirpyr_channel(const float * const * data_fine, float ** data_coarse, int w
float val = 0.f; float val = 0.f;
float norm = 0.f; float norm = 0.f;
for (int inbr = max(0, i - scalewin); inbr <= min(height - 1, i + scalewin); inbr += scale) { for (int inbr = std::max(0, i - scalewin); inbr <= std::min(height - 1, i + scalewin); inbr += scale) {
for (int jnbr = j - scalewin; jnbr <= j + scalewin; jnbr += scale) { for (int jnbr = j - scalewin; jnbr <= j + scalewin; jnbr += scale) {
const float dirwt = domker[(inbr - i) / scale + halfwin][(jnbr - j)/ scale + halfwin] * rangeFn(fabsf(data_fine[inbr][jnbr] - data_fine[i][j])); const float dirwt = domker[(inbr - i) / scale + halfwin][(jnbr - j)/ scale + halfwin] * rangeFn(fabsf(data_fine[inbr][jnbr] - data_fine[i][j]));
val += dirwt * data_fine[inbr][jnbr]; val += dirwt * data_fine[inbr][jnbr];
@ -119,8 +125,8 @@ void dirpyr_channel(const float * const * data_fine, float ** data_coarse, int w
float val = 0.f; float val = 0.f;
float norm = 0.f; float norm = 0.f;
for (int inbr = max(0, i - scalewin); inbr <= min(height - 1, i + scalewin); inbr += scale) { for (int inbr = std::max(0, i - scalewin); inbr <= std::min(height - 1, i + scalewin); inbr += scale) {
for (int jnbr = j - scalewin; jnbr <= min(width - 1, j + scalewin); jnbr += scale) { for (int jnbr = j - scalewin; jnbr <= std::min(width - 1, j + scalewin); jnbr += scale) {
const float dirwt = domker[(inbr - i) / scale + halfwin][(jnbr - j)/ scale + halfwin] * rangeFn(fabsf(data_fine[inbr][jnbr] - data_fine[i][j])); const float dirwt = domker[(inbr - i) / scale + halfwin][(jnbr - j)/ scale + halfwin] * rangeFn(fabsf(data_fine[inbr][jnbr] - data_fine[i][j]));
val += dirwt * data_fine[inbr][jnbr]; val += dirwt * data_fine[inbr][jnbr];
norm += dirwt; norm += dirwt;
@ -149,8 +155,8 @@ void dirpyr_channel(const float * const * data_fine, float ** data_coarse, int w
float val = 0.f; float val = 0.f;
float norm = 0.f; float norm = 0.f;
for (int inbr = max(0, i - scale); inbr <= min(height - 1, i + scale); inbr += scale) { for (int inbr = std::max(0, i - scale); inbr <= std::min(height - 1, i + scale); inbr += scale) {
for (int jnbr = max(0, j - scale); jnbr <= j + scale; jnbr += scale) { for (int jnbr = std::max(0, j - scale); jnbr <= j + scale; jnbr += scale) {
const float dirwt = rangeFn(fabsf(data_fine[inbr][jnbr] - data_fine[i][j])); const float dirwt = rangeFn(fabsf(data_fine[inbr][jnbr] - data_fine[i][j]));
val += dirwt * data_fine[inbr][jnbr]; val += dirwt * data_fine[inbr][jnbr];
norm += dirwt; norm += dirwt;
@ -182,7 +188,7 @@ void dirpyr_channel(const float * const * data_fine, float ** data_coarse, int w
float val = 0.f; float val = 0.f;
float norm = 0.f; float norm = 0.f;
for (int inbr = max(0, i - scale); inbr <= min(height - 1, i + scale); inbr += scale) { for (int inbr = std::max(0, i - scale); inbr <= std::min(height - 1, i + scale); inbr += scale) {
for (int jnbr = j - scale; jnbr <= j + scale; jnbr += scale) { for (int jnbr = j - scale; jnbr <= j + scale; jnbr += scale) {
const float dirwt = rangeFn(fabsf(data_fine[inbr][jnbr] - data_fine[i][j])); const float dirwt = rangeFn(fabsf(data_fine[inbr][jnbr] - data_fine[i][j]));
val += dirwt * data_fine[inbr][jnbr]; val += dirwt * data_fine[inbr][jnbr];
@ -196,8 +202,8 @@ void dirpyr_channel(const float * const * data_fine, float ** data_coarse, int w
float val = 0.f; float val = 0.f;
float norm = 0.f; float norm = 0.f;
for (int inbr = max(0, i - scale); inbr <= min(height - 1, i + scale); inbr += scale) { for (int inbr = std::max(0, i - scale); inbr <= std::min(height - 1, i + scale); inbr += scale) {
for (int jnbr = j - scale; jnbr <= min(width - 1, j + scale); jnbr += scale) { for (int jnbr = j - scale; jnbr <= std::min(width - 1, j + scale); jnbr += scale) {
const float dirwt = rangeFn(fabsf(data_fine[inbr][jnbr] - data_fine[i][j])); const float dirwt = rangeFn(fabsf(data_fine[inbr][jnbr] - data_fine[i][j]));
val += dirwt * data_fine[inbr][jnbr]; val += dirwt * data_fine[inbr][jnbr];
norm += dirwt; norm += dirwt;
@ -346,8 +352,6 @@ void idirpyr_eq_channelcam(const float * const * data_coarse, const float * cons
namespace rtengine namespace rtengine
{ {
extern const Settings* settings;
void ImProcFunctions::dirpyr_equalizer(const float * const * src, float ** dst, int srcwidth, int srcheight, const float * const * l_a, const float * const * l_b, const double * mult, const double dirpyrThreshold, const double skinprot, float b_l, float t_l, float t_r, int scaleprev) void ImProcFunctions::dirpyr_equalizer(const float * const * src, float ** dst, int srcwidth, int srcheight, const float * const * l_a, const float * const * l_b, const double * mult, const double dirpyrThreshold, const double skinprot, float b_l, float t_l, float t_r, int scaleprev)
{ {
//sequence of scales //sequence of scales

View File

@ -23,36 +23,40 @@
// //
//////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////
#include "color.h"
#include "jaggedarray.h" #include "jaggedarray.h"
#include "rtengine.h"
#include "rawimagesource.h"
#include "rt_math.h"
#include "procparams.h" #include "procparams.h"
#include "rawimagesource.h"
#include "rt_algo.h"
#include "rt_math.h"
#include "rtengine.h"
#include "../rtgui/options.h"
//#define BENCHMARK //#define BENCHMARK
#include "StopWatch.h" #include "StopWatch.h"
#include "rt_algo.h"
using namespace std; using namespace std;
namespace rtengine namespace rtengine
{ {
void RawImageSource::dual_demosaic_RT(bool isBayer, const RAWParams &raw, int winw, int winh, const array2D<float> &rawData, array2D<float> &red, array2D<float> &green, array2D<float> &blue, double &contrast, bool autoContrast) void RawImageSource::dual_demosaic_RT(bool isBayer, const procparams::RAWParams &raw, int winw, int winh, const array2D<float> &rawData, array2D<float> &red, array2D<float> &green, array2D<float> &blue, double &contrast, bool autoContrast)
{ {
BENCHFUN BENCHFUN
if (contrast == 0.f && !autoContrast) { if (contrast == 0.f && !autoContrast) {
// contrast == 0.0 means only first demosaicer will be used // contrast == 0.0 means only first demosaicer will be used
if(isBayer) { if(isBayer) {
if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::AMAZEVNG4) ) { if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::AMAZEVNG4) ) {
amaze_demosaic_RT(0, 0, winw, winh, rawData, red, green, blue, options.chunkSizeAMAZE, options.measure); amaze_demosaic_RT(0, 0, winw, winh, rawData, red, green, blue, options.chunkSizeAMAZE, options.measure);
} else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::DCBVNG4) ) { } else if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::DCBVNG4) ) {
dcb_demosaic(raw.bayersensor.dcb_iterations, raw.bayersensor.dcb_enhance); dcb_demosaic(raw.bayersensor.dcb_iterations, raw.bayersensor.dcb_enhance);
} else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::RCDVNG4) ) { } else if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::RCDVNG4) ) {
rcd_demosaic(options.chunkSizeRCD, options.measure); rcd_demosaic(options.chunkSizeRCD, options.measure);
} }
} else { } else {
if (raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::FOUR_PASS) ) { if (raw.xtranssensor.method == procparams::RAWParams::XTransSensor::getMethodString(procparams::RAWParams::XTransSensor::Method::FOUR_PASS) ) {
xtrans_interpolate (3, true, options.chunkSizeXT, options.measure); xtrans_interpolate (3, true, options.chunkSizeXT, options.measure);
} else { } else {
xtrans_interpolate (1, false, options.chunkSizeXT, options.measure); xtrans_interpolate (1, false, options.chunkSizeXT, options.measure);
@ -62,28 +66,22 @@ void RawImageSource::dual_demosaic_RT(bool isBayer, const RAWParams &raw, int wi
return; return;
} }
array2D<float> redTmp(winw, winh);
array2D<float> greenTmp(winw, winh);
array2D<float> blueTmp(winw, winh);
array2D<float> L(winw, winh); array2D<float> L(winw, winh);
if (isBayer) { if (isBayer) {
vng4_demosaic(rawData, redTmp, greenTmp, blueTmp); if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::AMAZEVNG4) || raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::PIXELSHIFT)) {
if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::AMAZEVNG4) || raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::PIXELSHIFT)) {
amaze_demosaic_RT(0, 0, winw, winh, rawData, red, green, blue, options.chunkSizeAMAZE, options.measure); amaze_demosaic_RT(0, 0, winw, winh, rawData, red, green, blue, options.chunkSizeAMAZE, options.measure);
} else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::DCBVNG4) ) { } else if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::DCBVNG4) ) {
dcb_demosaic(raw.bayersensor.dcb_iterations, raw.bayersensor.dcb_enhance); dcb_demosaic(raw.bayersensor.dcb_iterations, raw.bayersensor.dcb_enhance);
} else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::RCDVNG4) ) { } else if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::RCDVNG4) ) {
rcd_demosaic(options.chunkSizeRCD, options.measure); rcd_demosaic(options.chunkSizeRCD, options.measure);
} }
} else { } else {
if (raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::FOUR_PASS) ) { if (raw.xtranssensor.method == procparams::RAWParams::XTransSensor::getMethodString(procparams::RAWParams::XTransSensor::Method::FOUR_PASS) ) {
xtrans_interpolate (3, true, options.chunkSizeXT, options.measure); xtrans_interpolate (3, true, options.chunkSizeXT, options.measure);
} else { } else {
xtrans_interpolate (1, false, options.chunkSizeXT, options.measure); xtrans_interpolate (1, false, options.chunkSizeXT, options.measure);
} }
fast_xtrans_interpolate(rawData, redTmp, greenTmp, blueTmp);
} }
const float xyz_rgb[3][3] = { // XYZ from RGB const float xyz_rgb[3][3] = { // XYZ from RGB
@ -110,6 +108,17 @@ void RawImageSource::dual_demosaic_RT(bool isBayer, const RAWParams &raw, int wi
buildBlendMask(L, blend, winw, winh, contrastf, 1.f, autoContrast); buildBlendMask(L, blend, winw, winh, contrastf, 1.f, autoContrast);
contrast = contrastf * 100.f; contrast = contrastf * 100.f;
array2D<float>& redTmp = L; // L is not needed anymore => reuse it
array2D<float> greenTmp(winw, winh);
array2D<float> blueTmp(winw, winh);
if (isBayer) {
vng4_demosaic(rawData, redTmp, greenTmp, blueTmp);
} else {
fast_xtrans_interpolate(rawData, redTmp, greenTmp, blueTmp);
}
// the following is split into 3 loops intentionally to avoid cache conflicts on CPUs with only 4-way cache // the following is split into 3 loops intentionally to avoid cache conflicts on CPUs with only 4-way cache
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp parallel for #pragma omp parallel for

View File

@ -17,10 +17,15 @@
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>. * along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/ */
#include "../rtengine/dynamicprofile.h" #include "dynamicprofile.h"
#include <stdlib.h> #include <stdlib.h>
#include <glibmm/regex.h> #include <glibmm/regex.h>
#include <glibmm/miscutils.h>
#include <glibmm/keyfile.h>
#include "rtengine.h"
#include "../rtgui/options.h"
using namespace rtengine; using namespace rtengine;
using namespace rtengine::procparams; using namespace rtengine::procparams;
@ -176,7 +181,7 @@ bool DynamicProfileRules::loadRules()
return false; return false;
} }
if (options.rtSettings.verbose) { if (settings->verbose) {
printf ("loading dynamic profiles...\n"); printf ("loading dynamic profiles...\n");
} }
@ -195,7 +200,7 @@ bool DynamicProfileRules::loadRules()
return false; return false;
} }
if (options.rtSettings.verbose) { if (settings->verbose) {
printf (" loading rule %d\n", serial); printf (" loading rule %d\n", serial);
} }
@ -225,7 +230,7 @@ bool DynamicProfileRules::loadRules()
bool DynamicProfileRules::storeRules() bool DynamicProfileRules::storeRules()
{ {
if (options.rtSettings.verbose) { if (settings->verbose) {
printf ("saving dynamic profiles...\n"); printf ("saving dynamic profiles...\n");
} }

View File

@ -16,12 +16,15 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>. * along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/ */
#ifndef _DYNAMICPROFILE_H_ #pragma once
#define _DYNAMICPROFILE_H_
#include <glibmm.h> #include <glibmm/ustring.h>
#include <vector> #include <vector>
#include "../rtgui/options.h"
namespace rtengine
{
class FramesMetaData;
}
class DynamicProfileRule class DynamicProfileRule
{ {
@ -76,5 +79,3 @@ public:
const std::vector<DynamicProfileRule> &getRules(); const std::vector<DynamicProfileRule> &getRules();
void setRules (const std::vector<DynamicProfileRule> &r); void setRules (const std::vector<DynamicProfileRule> &r);
}; };
#endif // _DYNAMICPROFILE_H_

View File

@ -20,14 +20,13 @@
#include <cmath> #include <cmath>
#include "color.h" #include "color.h"
#include "rawimage.h"
#include "rawimagesource.h" #include "rawimagesource.h"
#include "rawimagesource_i.h" #include "rawimagesource_i.h"
#include "jaggedarray.h" #include "jaggedarray.h"
#include "rawimage.h"
#include "iccmatrices.h" #include "iccmatrices.h"
#include "rt_math.h" #include "rt_math.h"
#include "../rtgui/multilangmgr.h" #include "../rtgui/multilangmgr.h"
#include "procparams.h"
//#define BENCHMARK //#define BENCHMARK
#include "StopWatch.h" #include "StopWatch.h"

View File

@ -25,12 +25,18 @@
#include <cmath> #include <cmath>
#include "rawimagesource.h" #include "rawimagesource.h"
#include "../rtgui/multilangmgr.h" #include "../rtgui/multilangmgr.h"
#include "procparams.h"
#include "opthelper.h" #include "opthelper.h"
using namespace std; using namespace std;
using namespace rtengine; using namespace rtengine;
namespace
{
unsigned fc(const unsigned int cfa[2][2], int r, int c) {
return cfa[r & 1][c & 1];
}
}
#define TS 224 #define TS 224
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -67,6 +73,7 @@ void RawImageSource::fast_demosaic()
} }
const unsigned int cfarray[2][2] = {{FC(0,0), FC(0,1)}, {FC(1,0), FC(1,1)}};
const int bord = 5; const int bord = 5;
float clip_pt = 4 * 65535 * initialGain; float clip_pt = 4 * 65535 * initialGain;
@ -117,12 +124,12 @@ void RawImageSource::fast_demosaic()
for (int i1 = imin; i1 < imax; i1++) for (int i1 = imin; i1 < imax; i1++)
for (int j1 = jmin; j1 < j + 2; j1++) { for (int j1 = jmin; j1 < j + 2; j1++) {
int c = FC(i1, j1); int c = fc(cfarray, i1, j1);
sum[c] += rawData[i1][j1]; sum[c] += rawData[i1][j1];
sum[c + 3]++; sum[c + 3]++;
} }
int c = FC(i, j); int c = fc(cfarray, i, j);
if (c == 1) { if (c == 1) {
red[i][j] = sum[0] / sum[3]; red[i][j] = sum[0] / sum[3];
@ -150,12 +157,12 @@ void RawImageSource::fast_demosaic()
for (int i1 = imin; i1 < imax; i1++) for (int i1 = imin; i1 < imax; i1++)
for (int j1 = j - 1; j1 < jmax; j1++) { for (int j1 = j - 1; j1 < jmax; j1++) {
int c = FC(i1, j1); int c = fc(cfarray, i1, j1);
sum[c] += rawData[i1][j1]; sum[c] += rawData[i1][j1];
sum[c + 3]++; sum[c + 3]++;
} }
int c = FC(i, j); int c = fc(cfarray, i, j);
if (c == 1) { if (c == 1) {
red[i][j] = sum[0] / sum[3]; red[i][j] = sum[0] / sum[3];
@ -193,12 +200,12 @@ void RawImageSource::fast_demosaic()
for (int i1 = max(0, i - 1); i1 < i + 2; i1++) for (int i1 = max(0, i - 1); i1 < i + 2; i1++)
for (int j1 = j - 1; j1 < j + 2; j1++) { for (int j1 = j - 1; j1 < j + 2; j1++) {
int c = FC(i1, j1); int c = fc(cfarray, i1, j1);
sum[c] += rawData[i1][j1]; sum[c] += rawData[i1][j1];
sum[c + 3]++; sum[c + 3]++;
} }
int c = FC(i, j); int c = fc(cfarray, i, j);
if (c == 1) { if (c == 1) {
red[i][j] = sum[0] / sum[3]; red[i][j] = sum[0] / sum[3];
@ -224,12 +231,12 @@ void RawImageSource::fast_demosaic()
for (int i1 = i - 1; i1 < min(i + 2, H); i1++) for (int i1 = i - 1; i1 < min(i + 2, H); i1++)
for (int j1 = j - 1; j1 < j + 2; j1++) { for (int j1 = j - 1; j1 < j + 2; j1++) {
int c = FC(i1, j1); int c = fc(cfarray, i1, j1);
sum[c] += rawData[i1][j1]; sum[c] += rawData[i1][j1];
sum[c + 3]++; sum[c + 3]++;
} }
int c = FC(i, j); int c = fc(cfarray, i, j);
if (c == 1) { if (c == 1) {
red[i][j] = sum[0] / sum[3]; red[i][j] = sum[0] / sum[3];
@ -282,7 +289,7 @@ void RawImageSource::fast_demosaic()
vmask selmask; vmask selmask;
vmask andmask = _mm_set_epi32( 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff ); vmask andmask = _mm_set_epi32( 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff );
if(FC(top, left) == 1) { if(fc(cfarray, top, left) == 1) {
selmask = _mm_set_epi32( 0, 0xffffffff, 0, 0xffffffff ); selmask = _mm_set_epi32( 0, 0xffffffff, 0, 0xffffffff );
} else { } else {
selmask = _mm_set_epi32( 0xffffffff, 0, 0xffffffff, 0 ); selmask = _mm_set_epi32( 0xffffffff, 0, 0xffffffff, 0 );
@ -312,7 +319,7 @@ void RawImageSource::fast_demosaic()
for (; j < right; j++, cc++) { for (; j < right; j++, cc++) {
if (FC(i, j) == 1) { if (fc(cfarray, i, j) == 1) {
greentile[rr * TS + cc] = rawData[i][j]; greentile[rr * TS + cc] = rawData[i][j];
} else { } else {
@ -333,7 +340,7 @@ void RawImageSource::fast_demosaic()
#else #else
for (int j = left, cc = 0; j < right; j++, cc++) { for (int j = left, cc = 0; j < right; j++, cc++) {
if (FC(i, j) == 1) { if (fc(cfarray, i, j) == 1) {
greentile[rr * TS + cc] = rawData[i][j]; greentile[rr * TS + cc] = rawData[i][j];
} else { } else {
//compute directional weights using image gradients //compute directional weights using image gradients
@ -359,7 +366,7 @@ void RawImageSource::fast_demosaic()
#endif #endif
for (int i = top + 1, rr = 1; i < bottom - 1; i++, rr++) { for (int i = top + 1, rr = 1; i < bottom - 1; i++, rr++) {
if (FC(i, left + (FC(i, 2) & 1) + 1) == 0) if (fc(cfarray, i, left + (fc(cfarray, i, 2) & 1) + 1) == 0)
#ifdef __SSE2__ #ifdef __SSE2__
for (int j = left + 1, cc = 1; j < right - 1; j += 4, cc += 4) { for (int j = left + 1, cc = 1; j < right - 1; j += 4, cc += 4) {
//interpolate B/R colors at R/B sites //interpolate B/R colors at R/B sites
@ -369,7 +376,7 @@ void RawImageSource::fast_demosaic()
#else #else
for (int cc = (FC(i, 2) & 1) + 1, j = left + cc; j < right - 1; j += 2, cc += 2) { for (int cc = (fc(cfarray, i, 2) & 1) + 1, j = left + cc; j < right - 1; j += 2, cc += 2) {
//interpolate B/R colors at R/B sites //interpolate B/R colors at R/B sites
bluetile[rr * TS + cc] = greentile[rr * TS + cc] - 0.25f * ((greentile[(rr - 1) * TS + (cc - 1)] + greentile[(rr - 1) * TS + (cc + 1)] + greentile[(rr + 1) * TS + cc + 1] + greentile[(rr + 1) * TS + cc - 1]) - bluetile[rr * TS + cc] = greentile[rr * TS + cc] - 0.25f * ((greentile[(rr - 1) * TS + (cc - 1)] + greentile[(rr - 1) * TS + (cc + 1)] + greentile[(rr + 1) * TS + cc + 1] + greentile[(rr + 1) * TS + cc - 1]) -
min(clip_pt, rawData[i - 1][j - 1] + rawData[i - 1][j + 1] + rawData[i + 1][j + 1] + rawData[i + 1][j - 1])); min(clip_pt, rawData[i - 1][j - 1] + rawData[i - 1][j + 1] + rawData[i + 1][j + 1] + rawData[i + 1][j - 1]));
@ -386,7 +393,7 @@ void RawImageSource::fast_demosaic()
#else #else
for (int cc = (FC(i, 2) & 1) + 1, j = left + cc; j < right - 1; j += 2, cc += 2) { for (int cc = (fc(cfarray, i, 2) & 1) + 1, j = left + cc; j < right - 1; j += 2, cc += 2) {
//interpolate B/R colors at R/B sites //interpolate B/R colors at R/B sites
redtile[rr * TS + cc] = greentile[rr * TS + cc] - 0.25f * ((greentile[(rr - 1) * TS + cc - 1] + greentile[(rr - 1) * TS + cc + 1] + greentile[(rr + 1) * TS + cc + 1] + greentile[(rr + 1) * TS + cc - 1]) - redtile[rr * TS + cc] = greentile[rr * TS + cc] - 0.25f * ((greentile[(rr - 1) * TS + cc - 1] + greentile[(rr - 1) * TS + cc + 1] + greentile[(rr + 1) * TS + cc + 1] + greentile[(rr + 1) * TS + cc - 1]) -
min(clip_pt, rawData[i - 1][j - 1] + rawData[i - 1][j + 1] + rawData[i + 1][j + 1] + rawData[i + 1][j - 1])); min(clip_pt, rawData[i - 1][j - 1] + rawData[i - 1][j + 1] + rawData[i + 1][j + 1] + rawData[i + 1][j - 1]));
@ -405,7 +412,7 @@ void RawImageSource::fast_demosaic()
for (int i = top + 2, rr = 2; i < bottom - 2; i++, rr++) { for (int i = top + 2, rr = 2; i < bottom - 2; i++, rr++) {
#ifdef __SSE2__ #ifdef __SSE2__
for (int cc = 2 + (FC(i, 2) & 1), j = left + cc; j < right - 2; j += 4, cc += 4) { for (int cc = 2 + (fc(cfarray, i, 2) & 1), j = left + cc; j < right - 2; j += 4, cc += 4) {
// no need to take care about the borders of the tile. There's enough free space. // no need to take care about the borders of the tile. There's enough free space.
//interpolate R and B colors at G sites //interpolate R and B colors at G sites
greenv = LVFU(greentile[rr * TS + cc]); greenv = LVFU(greentile[rr * TS + cc]);
@ -429,7 +436,7 @@ void RawImageSource::fast_demosaic()
#else #else
for (int cc = 2 + (FC(i, 2) & 1), j = left + cc; j < right - 2; j += 2, cc += 2) { for (int cc = 2 + (fc(cfarray, i, 2) & 1), j = left + cc; j < right - 2; j += 2, cc += 2) {
//interpolate R and B colors at G sites //interpolate R and B colors at G sites
redtile[rr * TS + cc] = greentile[rr * TS + cc] - 0.25f * ((greentile[(rr - 1) * TS + cc] - redtile[(rr - 1) * TS + cc]) + (greentile[(rr + 1) * TS + cc] - redtile[(rr + 1) * TS + cc]) + redtile[rr * TS + cc] = greentile[rr * TS + cc] - 0.25f * ((greentile[(rr - 1) * TS + cc] - redtile[(rr - 1) * TS + cc]) + (greentile[(rr + 1) * TS + cc] - redtile[(rr + 1) * TS + cc]) +
(greentile[rr * TS + cc - 1] - redtile[rr * TS + cc - 1]) + (greentile[rr * TS + cc + 1] - redtile[rr * TS + cc + 1])); (greentile[rr * TS + cc - 1] - redtile[rr * TS + cc - 1]) + (greentile[rr * TS + cc + 1] - redtile[rr * TS + cc + 1]));

View File

@ -16,6 +16,10 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>. * along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/ */
#include <giomm/file.h>
#include <glibmm/miscutils.h>
#include "ffmanager.h" #include "ffmanager.h"
#include "../rtgui/options.h" #include "../rtgui/options.h"
#include "rawimage.h" #include "rawimage.h"
@ -26,8 +30,6 @@
namespace rtengine namespace rtengine
{ {
extern const Settings* settings;
// *********************** class ffInfo ************************************** // *********************** class ffInfo **************************************
inline ffInfo& ffInfo::operator =(const ffInfo &o) inline ffInfo& ffInfo::operator =(const ffInfo &o)
@ -50,6 +52,11 @@ inline ffInfo& ffInfo::operator =(const ffInfo &o)
return *this; return *this;
} }
ffInfo::~ffInfo()
{
delete ri;
}
bool ffInfo::operator <(const ffInfo &e2) const bool ffInfo::operator <(const ffInfo &e2) const
{ {
if( this->maker.compare( e2.maker) >= 0 ) { if( this->maker.compare( e2.maker) >= 0 ) {

View File

@ -19,16 +19,16 @@
#pragma once #pragma once
#include <cmath> #include <cmath>
#include <list>
#include <map> #include <map>
#include <string> #include <string>
#include <glibmm/ustring.h> #include <glibmm/ustring.h>
#include "rawimage.h"
namespace rtengine namespace rtengine
{ {
class RawImage;
class ffInfo class ffInfo
{ {
public: public:
@ -48,13 +48,8 @@ public:
ffInfo( const ffInfo &o) ffInfo( const ffInfo &o)
: pathname(o.pathname), maker(o.maker), model(o.model), lens(o.lens), aperture(o.aperture), focallength(o.focallength), timestamp(o.timestamp), ri(nullptr) {} : pathname(o.pathname), maker(o.maker), model(o.model), lens(o.lens), aperture(o.aperture), focallength(o.focallength), timestamp(o.timestamp), ri(nullptr) {}
~ffInfo()
{
if( ri ) {
delete ri;
}
}
~ffInfo();
ffInfo &operator =(const ffInfo &o); ffInfo &operator =(const ffInfo &o);
bool operator <(const ffInfo &e2) const; bool operator <(const ffInfo &e2) const;

View File

@ -19,28 +19,20 @@
#include <cmath> #include <cmath>
#include <iostream> #include <iostream>
#ifdef _OPENMP #include "rawimage.h"
#include <omp.h>
#endif
#include "rawimagesource.h" #include "rawimagesource.h"
#include "coord.h"
#include "mytime.h" #include "mytime.h"
#include "opthelper.h" #include "opthelper.h"
#include "pixelsmap.h"
#include "procparams.h" #include "procparams.h"
#include "rt_algo.h" #include "rt_algo.h"
#include "rtengine.h" #include "rtengine.h"
#include "sleef.h"
//#define BENCHMARK //#define BENCHMARK
#include "StopWatch.h" #include "StopWatch.h"
namespace rtengine
{
extern const Settings* settings;
}
namespace namespace
{ {
@ -77,8 +69,8 @@ bool channelsAvg(
} }
std::array<int, 3> pxCount = {}; // Per-channel sample counts std::array<int, 3> pxCount = {}; // Per-channel sample counts
for (int c = spotPos.x - spotSize; c < spotPos.x + spotSize; ++c) { for (int c = x1; c < x2; ++c) {
for (int r = spotPos.y - spotSize; r < spotPos.y + spotSize; ++r) { for (int r = y1; r < y2; ++r) {
const int ch = ri->getSensorType() == rtengine::ST_BAYER ? ri->FC(r,c) : ri->XTRANSFC(r,c); const int ch = ri->getSensorType() == rtengine::ST_BAYER ? ri->FC(r,c) : ri->XTRANSFC(r,c);
++pxCount[ch]; ++pxCount[ch];
@ -98,7 +90,7 @@ bool channelsAvg(
} }
bool rtengine::RawImageSource::getFilmNegativeExponents(Coord2D spotA, Coord2D spotB, int tran, const FilmNegativeParams &currentParams, std::array<float, 3>& newExps) bool rtengine::RawImageSource::getFilmNegativeExponents(Coord2D spotA, Coord2D spotB, int tran, const procparams::FilmNegativeParams &currentParams, std::array<float, 3>& newExps)
{ {
newExps = { newExps = {
static_cast<float>(currentParams.redRatio * currentParams.greenExp), static_cast<float>(currentParams.redRatio * currentParams.greenExp),

View File

@ -18,23 +18,17 @@
*/ */
#include <cmath> #include <cmath>
#include "LUT.h"
#include "rtengine.h" #include "rtengine.h"
#include "rtthumbnail.h" #include "rtthumbnail.h"
#include "opthelper.h" #include "opthelper.h"
#include "sleef.h"
#include "rt_algo.h" #include "rt_algo.h"
#include "rtengine.h"
#include "settings.h" #include "settings.h"
#include "procparams.h" #include "procparams.h"
#define BENCHMARK #define BENCHMARK
#include "StopWatch.h" #include "StopWatch.h"
namespace rtengine
{
extern const Settings* settings;
}
void rtengine::Thumbnail::processFilmNegative( void rtengine::Thumbnail::processFilmNegative(
const procparams::ProcParams &params, const procparams::ProcParams &params,
const Imagefloat* baseImg, const Imagefloat* baseImg,

View File

@ -1,7 +1,7 @@
/* /*
* This file is part of RawTherapee. * This file is part of RawTherapee.
* *
* Copyright (c) 2004-2010 Gabor Horvath <hgabor@rawtherapee.com> * Copyright (c) 2004-2019 Gabor Horvath <hgabor@rawtherapee.com>
* *
* RawTherapee is free software: you can redistribute it and/or modify * RawTherapee is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -15,23 +15,15 @@
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>. * along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/ */
#ifndef _ILABEL_ #pragma once
#define _ILABEL_
#include <gtkmm.h> // For compatibility and simplicity reason, order shouldn't change, and must be identical to the order specified in the curveType widget
enum FlatCurveType {
class ILabel : public Gtk::DrawingArea FCT_Empty = -1, // Also used for identity curves
{ FCT_Linear, // 0
FCT_MinMaxCPoints, // 1
Glib::ustring label; //FCT_Parametric, // 2
// Insert new curve type above this line
public: FCT_Unchanged // Must remain the last of the enum
explicit ILabel (const Glib::ustring &lab);
bool on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr) override;
void on_realize() override;
void on_style_updated () override;
}; };
#endif

View File

@ -23,10 +23,14 @@
* also distributed under the GPL V3+ * also distributed under the GPL V3+
*/ */
#include "gamutwarning.h"
#include <iostream> #include <iostream>
namespace rtengine { #include "gamutwarning.h"
#include "iccstore.h"
#include "image8.h"
namespace rtengine
{
GamutWarning::GamutWarning(cmsHPROFILE iprof, cmsHPROFILE gamutprof, RenderingIntent intent, bool gamutbpc): GamutWarning::GamutWarning(cmsHPROFILE iprof, cmsHPROFILE gamutprof, RenderingIntent intent, bool gamutbpc):
lab2ref(nullptr), lab2ref(nullptr),
@ -126,5 +130,4 @@ inline void GamutWarning::mark(Image8 *image, int y, int x)
image->b(y, x) = 255; image->b(y, x) = 255;
} }
} // namespace rtengine } // namespace rtengine

View File

@ -25,11 +25,14 @@
#pragma once #pragma once
#include "iccstore.h" #include <lcms2.h>
#include "noncopyable.h"
#include "image8.h"
namespace rtengine { #include "noncopyable.h"
namespace rtengine
{
class Image8;
enum RenderingIntent : int; enum RenderingIntent : int;

View File

@ -16,12 +16,16 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>. * along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/ */
#include "gauss.h"
#include "rt_math.h"
#include <cmath> #include <cmath>
#include <cstdlib> #include <cstdlib>
#include "opthelper.h" #include <cstring>
#include "gauss.h"
#include "boxblur.h" #include "boxblur.h"
#include "opthelper.h"
#include "rt_math.h"
namespace namespace
{ {
@ -1349,7 +1353,7 @@ template<class T> void gaussVerticalmult (T** src, T** dst, const int W, const i
} }
#endif #endif
template<class T> void gaussianBlurImpl(T** src, T** dst, const int W, const int H, const double sigma, T *buffer = nullptr, eGaussType gausstype = GAUSS_STANDARD, T** buffer2 = nullptr) template<class T> void gaussianBlurImpl(T** src, T** dst, const int W, const int H, const double sigma, bool useBoxBlur, eGaussType gausstype = GAUSS_STANDARD, T** buffer2 = nullptr)
{ {
static constexpr auto GAUSS_SKIP = 0.25; static constexpr auto GAUSS_SKIP = 0.25;
static constexpr auto GAUSS_3X3_LIMIT = 0.6; static constexpr auto GAUSS_3X3_LIMIT = 0.6;
@ -1357,7 +1361,7 @@ template<class T> void gaussianBlurImpl(T** src, T** dst, const int W, const int
static constexpr auto GAUSS_7X7_LIMIT = 1.15; static constexpr auto GAUSS_7X7_LIMIT = 1.15;
static constexpr auto GAUSS_DOUBLE = 25.0; static constexpr auto GAUSS_DOUBLE = 25.0;
if(buffer) { if (useBoxBlur) {
// special variant for very large sigma, currently only used by retinex algorithm // special variant for very large sigma, currently only used by retinex algorithm
// use iterated boxblur to approximate gaussian blur // use iterated boxblur to approximate gaussian blur
// Compute ideal averaging filter width and number of iterations // Compute ideal averaging filter width and number of iterations
@ -1393,10 +1397,10 @@ template<class T> void gaussianBlurImpl(T** src, T** dst, const int W, const int
sizes[i] = ((i < m ? wl : wu) - 1) / 2; sizes[i] = ((i < m ? wl : wu) - 1) / 2;
} }
rtengine::boxblur(src, dst, buffer, sizes[0], sizes[0], W, H); rtengine::boxblur(src, dst, sizes[0], W, H, true);
for(int i = 1; i < n; i++) { for(int i = 1; i < n; i++) {
rtengine::boxblur(dst, dst, buffer, sizes[i], sizes[i], W, H); rtengine::boxblur(dst, dst, sizes[i], W, H, true);
} }
} else { } else {
if (sigma < GAUSS_SKIP) { if (sigma < GAUSS_SKIP) {
@ -1532,8 +1536,8 @@ template<class T> void gaussianBlurImpl(T** src, T** dst, const int W, const int
} }
} }
void gaussianBlur(float** src, float** dst, const int W, const int H, const double sigma, float *buffer, eGaussType gausstype, float** buffer2) void gaussianBlur(float** src, float** dst, const int W, const int H, const double sigma, bool useBoxBlur, eGaussType gausstype, float** buffer2)
{ {
gaussianBlurImpl<float>(src, dst, W, H, sigma, buffer, gausstype, buffer2); gaussianBlurImpl<float>(src, dst, W, H, sigma, useBoxBlur, gausstype, buffer2);
} }

View File

@ -16,11 +16,8 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>. * along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/ */
#ifndef _GAUSS_H_ #pragma once
#define _GAUSS_H_
enum eGaussType {GAUSS_STANDARD, GAUSS_MULT, GAUSS_DIV}; enum eGaussType {GAUSS_STANDARD, GAUSS_MULT, GAUSS_DIV};
void gaussianBlur(float** src, float** dst, const int W, const int H, const double sigma, float *buffer = nullptr, eGaussType gausstype = GAUSS_STANDARD, float** buffer2 = nullptr); void gaussianBlur(float** src, float** dst, const int W, const int H, const double sigma, bool useBoxBlur = false, eGaussType gausstype = GAUSS_STANDARD, float** buffer2 = nullptr);
#endif

View File

@ -3,6 +3,7 @@
* This file is part of RawTherapee. * This file is part of RawTherapee.
* *
* Copyright (c) 2018 Alberto Griggio <alberto.griggio@gmail.com> * Copyright (c) 2018 Alberto Griggio <alberto.griggio@gmail.com>
* Optimized 2019 Ingo Weyrich <heckflosse67@gmx.de>
* *
* RawTherapee is free software: you can redistribute it and/or modify * RawTherapee is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -16,9 +17,9 @@
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>. * along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/ */
/** /*
* This is a Fast Guided Filter implementation, derived directly from the * This is a Fast Guided Filter implementation, derived directly from the
* pseudo-code of the paper: * pseudo-code of the paper:
* *
@ -26,33 +27,21 @@
* by Kaiming He, Jian Sun * by Kaiming He, Jian Sun
* *
* available at https://arxiv.org/abs/1505.00996 * available at https://arxiv.org/abs/1505.00996
*/ */
#include "guidedfilter.h"
#include "boxblur.h" #include "boxblur.h"
#include "rescale.h" #include "guidedfilter.h"
#include "imagefloat.h" #include "imagefloat.h"
#include "rescale.h"
namespace rtengine { #define BENCHMARK
#include "StopWatch.h"
#if 0 namespace rtengine
# define DEBUG_DUMP(arr) \ {
do { \
Imagefloat im(arr.width(), arr.height()); \
const char *out = "/tmp/" #arr ".tif"; \
for (int y = 0; y < im.getHeight(); ++y) { \
for (int x = 0; x < im.getWidth(); ++x) { \
im.r(y, x) = im.g(y, x) = im.b(y, x) = arr[y][x] * 65535.f; \
} \
} \
im.saveTIFF(out, 16); \
} while (false)
#else
# define DEBUG_DUMP(arr)
#endif
namespace
namespace { {
int calculate_subsampling(int w, int h, int r) int calculate_subsampling(int w, int h, int r)
{ {
@ -75,21 +64,17 @@ int calculate_subsampling(int w, int h, int r)
} // namespace } // namespace
void guidedFilter(const array2D<float> &guide, const array2D<float> &src, array2D<float> &dst, int r, float epsilon, bool multithread, int subsampling) void guidedFilter(const array2D<float> &guide, const array2D<float> &src, array2D<float> &dst, int r, float epsilon, bool multithread, int subsampling)
{ {
enum Op {MUL, DIVEPSILON, SUBMUL};
const int W = src.width();
const int H = src.height();
if (subsampling <= 0) {
subsampling = calculate_subsampling(W, H, r);
}
enum Op { MUL, DIVEPSILON, ADD, SUB, ADDMUL, SUBMUL };
const auto apply = const auto apply =
[=](Op op, array2D<float> &res, const array2D<float> &a, const array2D<float> &b, const array2D<float> &c=array2D<float>()) -> void #ifdef _OPENMP
[multithread, epsilon](Op op, array2D<float> &res, const array2D<float> &a, const array2D<float> &b, const array2D<float> &c=array2D<float>()) -> void
#else
// removed multithread to fix clang warning on msys2 clang builds, which don't support OpenMp
[epsilon](Op op, array2D<float> &res, const array2D<float> &a, const array2D<float> &b, const array2D<float> &c=array2D<float>()) -> void
#endif
{ {
const int w = res.width(); const int w = res.width();
const int h = res.height(); const int h = res.height();
@ -99,137 +84,109 @@ void guidedFilter(const array2D<float> &guide, const array2D<float> &src, array2
#endif #endif
for (int y = 0; y < h; ++y) { for (int y = 0; y < h; ++y) {
for (int x = 0; x < w; ++x) { for (int x = 0; x < w; ++x) {
float r;
float aa = a[y][x];
float bb = b[y][x];
switch (op) { switch (op) {
case MUL: case MUL:
r = aa * bb; res[y][x] = a[y][x] * b[y][x];
break; break;
case DIVEPSILON: case DIVEPSILON:
r = aa / (bb + epsilon); res[y][x] = a[y][x] / (b[y][x] + epsilon); // note: the value of epsilon intentionally has an impact on the result. It is not only to avoid divisions by zero
break;
case ADD:
r = aa + bb;
break;
case SUB:
r = aa - bb;
break;
case ADDMUL:
r = aa * bb + c[y][x];
break; break;
case SUBMUL: case SUBMUL:
r = c[y][x] - (aa * bb); res[y][x] = c[y][x] - (a[y][x] * b[y][x]);
break; break;
default: default:
assert(false); assert(false);
r = 0; res[y][x] = 0;
break; break;
} }
res[y][x] = r;
} }
} }
}; };
// use the terminology of the paper (Algorithm 2)
const array2D<float> &I = guide;
const array2D<float> &p = src;
array2D<float> &q = dst;
const auto f_subsample = const auto f_subsample =
[=](array2D<float> &d, const array2D<float> &s) -> void [multithread](array2D<float> &d, const array2D<float> &s) -> void
{ {
rescaleBilinear(s, d, multithread); rescaleBilinear(s, d, multithread);
}; };
const auto f_upsample = f_subsample; const auto f_mean =
[multithread](array2D<float> &d, array2D<float> &s, int rad) -> void
{
rad = LIM(rad, 0, (min(s.width(), s.height()) - 1) / 2 - 1);
boxblur(static_cast<float**>(s), static_cast<float**>(d), rad, s.width(), s.height(), multithread);
};
const int W = src.width();
const int H = src.height();
if (subsampling <= 0) {
subsampling = calculate_subsampling(W, H, r);
}
const size_t w = W / subsampling; const size_t w = W / subsampling;
const size_t h = H / subsampling; const size_t h = H / subsampling;
const float r1 = float(r) / subsampling;
AlignedBuffer<float> blur_buf(w * h);
const auto f_mean =
[&](array2D<float> &d, array2D<float> &s, int rad) -> void
{
rad = LIM(rad, 0, (min(s.width(), s.height()) - 1) / 2 - 1);
float **src = s;
float **dst = d;
#ifdef _OPENMP
#pragma omp parallel if (multithread)
#endif
boxblur<float, float>(src, dst, blur_buf.data, rad, rad, s.width(), s.height());
};
array2D<float> I1(w, h); array2D<float> I1(w, h);
array2D<float> p1(w, h); array2D<float> p1(w, h);
f_subsample(I1, I); f_subsample(I1, guide);
f_subsample(p1, p);
DEBUG_DUMP(I); if (&guide == &src) {
DEBUG_DUMP(p); f_mean(p1, I1, r1);
DEBUG_DUMP(I1);
DEBUG_DUMP(p1);
float r1 = float(r) / subsampling; apply(MUL, I1, I1, I1); // I1 = I1 * I1
f_mean(I1, I1, r1);
apply(SUBMUL, I1, p1, p1, I1); // I1 = I1 - p1 * p1
apply(DIVEPSILON, I1, I1, I1); // I1 = I1 / (I1 + epsilon)
apply(SUBMUL, p1, I1, p1, p1); // p1 = p1 - I1 * p1
} else {
f_subsample(p1, src);
array2D<float> meanI(w, h); array2D<float> meanI(w, h);
f_mean(meanI, I1, r1); f_mean(meanI, I1, r1);
DEBUG_DUMP(meanI);
array2D<float> meanp(w, h); array2D<float> meanp(w, h);
f_mean(meanp, p1, r1); f_mean(meanp, p1, r1);
DEBUG_DUMP(meanp);
array2D<float> &corrIp = p1; apply(MUL, p1, I1, p1);
apply(MUL, corrIp, I1, p1);
f_mean(corrIp, corrIp, r1);
DEBUG_DUMP(corrIp);
array2D<float> &corrI = I1; f_mean(p1, p1, r1);
apply(MUL, corrI, I1, I1);
f_mean(corrI, corrI, r1);
DEBUG_DUMP(corrI);
array2D<float> &varI = corrI; apply(MUL, I1, I1, I1);
apply(SUBMUL, varI, meanI, meanI, corrI);
DEBUG_DUMP(varI);
array2D<float> &covIp = corrIp; f_mean(I1, I1, r1);
apply(SUBMUL, covIp, meanI, meanp, corrIp);
DEBUG_DUMP(covIp);
array2D<float> &a = varI; apply(SUBMUL, I1, meanI, meanI, I1);
apply(DIVEPSILON, a, covIp, varI); apply(SUBMUL, p1, meanI, meanp, p1);
DEBUG_DUMP(a); apply(DIVEPSILON, I1, p1, I1);
apply(SUBMUL, p1, I1, meanI, meanp);
}
array2D<float> &b = covIp; f_mean(I1, I1, r1);
apply(SUBMUL, b, a, meanI, meanp); f_mean(p1, p1, r1);
DEBUG_DUMP(b);
meanI.free(); // frees w * h * 4 byte const int Ws = I1.width();
meanp.free(); // frees w * h * 4 byte const int Hs = I1.height();
const int Wd = dst.width();
const int Hd = dst.height();
array2D<float> &meana = a; const float col_scale = static_cast<float>(Ws) / static_cast<float>(Wd);
f_mean(meana, a, r1); const float row_scale = static_cast<float>(Hs) / static_cast<float>(Hd);
DEBUG_DUMP(meana);
array2D<float> &meanb = b; #ifdef _OPENMP
f_mean(meanb, b, r1); #pragma omp parallel for if (multithread)
DEBUG_DUMP(meanb); #endif
blur_buf.resize(0); // frees w * h * 4 byte for (int y = 0; y < Hd; ++y) {
const float ymrs = y * row_scale;
array2D<float> meanA(W, H); for (int x = 0; x < Wd; ++x) {
f_upsample(meanA, meana); dst[y][x] = getBilinearValue(I1, x * col_scale, ymrs) * guide[y][x] + getBilinearValue(p1, x * col_scale, ymrs);
DEBUG_DUMP(meanA); }
}
array2D<float> &meanB = q;
f_upsample(meanB, meanb);
DEBUG_DUMP(meanB);
apply(ADDMUL, q, meanA, I, meanB);
DEBUG_DUMP(q);
} }
} // namespace rtengine } // namespace rtengine

Some files were not shown because too many files have changed in this diff Show More