merge with dev

This commit is contained in:
Desmis 2018-12-11 07:40:54 +01:00
commit d0029e81a4
99 changed files with 2409 additions and 1833 deletions

View File

@ -63,4 +63,5 @@ Other contributors (profiles, ideas, mockups, testing, forum activity, translati
Johan Thor
Vitalis Tiknius
TooWaBoo
Franz Trischberger
Colin Walker

View File

@ -1,11 +1,11 @@
if(APPLE)
cmake_minimum_required(VERSION 3.3)
CMAKE_POLICY(SET CMP0025 NEW)
cmake_policy(SET CMP0025 NEW)
else()
cmake_minimum_required(VERSION 2.8.8)
endif()
# Must stay before the PROJECT() command:
# Must stay before the project() command:
if(${CMAKE_EXTRA_GENERATOR} MATCHES "Eclipse CDT4")
set(CMAKE_CXX_COMPILER_ARG1 "-std=c++11" CACHE STRING "C++ version for eclipse" FORCE)
# Users building with Eclipse should set CMAKE_ECLIPSE_VERSION through the
@ -13,18 +13,18 @@ if(${CMAKE_EXTRA_GENERATOR} MATCHES "Eclipse CDT4")
#set(CMAKE_ECLIPSE_VERSION "4.6.0" CACHE STRING "Eclipse version" FORCE)
endif()
PROJECT(RawTherapee)
project(RawTherapee)
# The default target is Debug:
if(CMAKE_BUILD_TYPE STREQUAL "")
set (CMAKE_BUILD_TYPE Debug CACHE STRING "One of: None Debug Release RelWithDebInfo MinSizeRel" FORCE)
set(CMAKE_BUILD_TYPE Debug CACHE STRING "One of: None Debug Release RelWithDebInfo MinSizeRel" FORCE)
endif()
string(TOUPPER ${CMAKE_BUILD_TYPE} UPPER_CMAKE_BUILD_TYPE)
# Set required C and C++ standards and check GCC version:
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c11")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c11")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.9")
message(FATAL_ERROR "Building RawTherapee requires using GCC version 4.9 or higher!")
@ -32,14 +32,14 @@ endif()
# We might want to build using the old C++ ABI, even when using a new GCC version:
if(USE_OLD_CXX_ABI)
add_definitions (-D_GLIBCXX_USE_CXX11_ABI=0)
add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0)
endif()
if(UPPER_CMAKE_BUILD_TYPE STREQUAL "DEBUG")
add_definitions (-D_DEBUG)
add_definitions(-D_DEBUG)
else()
add_definitions (-DNDEBUG)
add_definitions (-D_DNDEBUG)
add_definitions(-DNDEBUG)
add_definitions(-D_DNDEBUG)
endif()
message(STATUS "CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
@ -141,7 +141,7 @@ if(WIN32 OR APPLE)
if(BUILD_BUNDLE)
message(STATUS "You have set BUILD_BUNDLE=ON but this is not necessary - the option is forced to ON for Windows and macOS.")
endif()
set (BUILD_BUNDLE ON FORCE)
set(BUILD_BUNDLE ON FORCE)
endif()
if(NOT DEFINED BUNDLE_BASE_INSTALL_DIR)
@ -262,7 +262,7 @@ endif()
if(NOT BUILD_BUNDLE)
foreach(path BINDIR DATADIR LIBDIR DOCDIR CREDITSDIR LICENCEDIR)
if(NOT (IS_ABSOLUTE "${${path}}"))
message (FATAL_ERROR "The ${path} path has to be absolute when using -DBUILD_BUNDLE=OFF")
message(FATAL_ERROR "The ${path} path has to be absolute when using -DBUILD_BUNDLE=OFF")
endif()
endforeach()
endif()
@ -342,41 +342,42 @@ endif()
if(WITH_LTO)
# Using LTO with older versions of binutils requires setting extra flags
SET(BINUTILS_VERSION_MININUM "2.29")
set(BINUTILS_VERSION_MININUM "2.29")
execute_process(COMMAND ar --version OUTPUT_VARIABLE BINUTILS_VERSION_DETECTED)
string(REGEX REPLACE ".* ([0-9.]+)\n.*" "\\1" BINUTILS_VERSION_DETECTED "${BINUTILS_VERSION_DETECTED}")
if("${BINUTILS_VERSION_DETECTED}" VERSION_LESS "${BINUTILS_VERSION_MININUM}")
if(APPLE)
SET(CMAKE_AR "/opt/local/bin/ar")
SET(CMAKE_RANLIB "/opt/local/bin/ranlib")
set(CMAKE_AR "/opt/local/bin/ar")
set(CMAKE_RANLIB "/opt/local/bin/ranlib")
else()
SET(CMAKE_AR "/usr/bin/gcc-ar")
SET(CMAKE_RANLIB "/usr/bin/gcc-ranlib")
set(CMAKE_AR "/usr/bin/gcc-ar")
set(CMAKE_RANLIB "/usr/bin/gcc-ranlib")
endif()
message(STATUS "Binutils version detected as less than " ${BINUTILS_VERSION_MININUM} " - setting CMake parameters to enable LTO linking:\n CMAKE_AR=\"" ${CMAKE_AR} "\"\n CMAKE_RANLIB=\"" ${CMAKE_RANLIB} "\"")
endif()
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -flto")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -flto")
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -flto")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -flto")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -flto")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -flto")
endif()
if(WITH_SAN)
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=${WITH_SAN}")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=${WITH_SAN}")
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=${WITH_SAN}")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=${WITH_SAN}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=${WITH_SAN}")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=${WITH_SAN}")
endif()
if(WITH_PROF)
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pg")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pg")
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pg")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pg")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pg")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pg")
endif()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wuninitialized -Wno-deprecated-declarations -Wno-unused-result")
if(OPTION_OMP)
find_package(OpenMP)
if(OPENMP_FOUND)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS} -Werror=unknown-pragmas -Wall -Wno-unused-result -Wno-deprecated-declarations")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS} -Werror=unknown-pragmas")
endif()
endif()

View File

@ -2,25 +2,25 @@
# If we find ReleaseInfo.cmake we use the info from there and don't need Git to be installed
find_file(REL_INFO_FILE ReleaseInfo.cmake PATHS "${PROJECT_SOURCE_DIR}" NO_DEFAULT_PATH)
if (REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND)
if(REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND)
# we look for the git command in this paths by order of preference
if (WIN32)
if(WIN32)
find_program(GIT_CMD git.exe HINTS ENV Path PATH_SUFFIXES ../)
elseif (APPLE)
elseif(APPLE)
find_program(GIT_CMD git PATHS "/opt/local/bin" "/usr/local/bin" "/usr/bin")
find_program(GIT_CMD git)
set (SHELL "/bin/bash")
else (WIN32) # Linux
set(SHELL "/bin/bash")
else(WIN32) # Linux
find_program(GIT_CMD git)
set (SHELL "/bin/bash")
endif (WIN32)
set(SHELL "/bin/bash")
endif(WIN32)
# Fail if Git is not installed
if (GIT_CMD STREQUAL GIT_CMD-NOTFOUND)
if(GIT_CMD STREQUAL GIT_CMD-NOTFOUND)
message(FATAL_ERROR "git command not found!")
else ()
else()
message(STATUS "git command found: ${GIT_CMD}")
endif ()
endif()
# Get version description.
# Depending on whether you checked out a branch (dev) or a tag (release),
@ -50,19 +50,19 @@ if (REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND)
execute_process(COMMAND ${GIT_CMD} rev-list --count HEAD --not --tags OUTPUT_VARIABLE GIT_COMMITS_SINCE_BRANCH OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}")
# If user checked-out something which is not a branch, use the description as branch name.
if (GIT_BRANCH STREQUAL "")
set (GIT_BRANCH "${GIT_DESCRIBE}")
if(GIT_BRANCH STREQUAL "")
set(GIT_BRANCH "${GIT_DESCRIBE}")
endif()
# Create numeric version.
# This version is nonsense, either don't use it at all or use it only where you have no other choice, e.g. Inno Setup's VersionInfoVersion.
# Strip everything after hyphen, e.g. "5.0-gtk2" -> "5.0", "5.1-rc1" -> "5.1" (ergo BS).
if (GIT_COMMITS_SINCE_TAG STREQUAL "")
set (GIT_NUMERIC_VERSION_BS "0.0.0")
else ()
if(GIT_COMMITS_SINCE_TAG STREQUAL "")
set(GIT_NUMERIC_VERSION_BS "0.0.0")
else()
string(REGEX REPLACE "-.*" "" GIT_NUMERIC_VERSION_BS ${GIT_DESCRIBE})
set(GIT_NUMERIC_VERSION_BS "${GIT_NUMERIC_VERSION_BS}.${GIT_COMMITS_SINCE_TAG}")
endif ()
endif()
message(STATUS "Git checkout information:")
message(STATUS " Commit description: ${GIT_DESCRIBE}")
@ -73,38 +73,38 @@ if (REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND)
message(STATUS " Commits since branch: ${GIT_COMMITS_SINCE_BRANCH}")
message(STATUS " Version (unreliable): ${GIT_NUMERIC_VERSION_BS}")
if (NOT DEFINED CACHE_NAME_SUFFIX)
if(NOT DEFINED CACHE_NAME_SUFFIX)
set(CACHE_NAME_SUFFIX "${GIT_DESCRIBE}")
message(STATUS "CACHE_NAME_SUFFIX was not defined, it is now \"${CACHE_NAME_SUFFIX}\"")
else ()
else()
message(STATUS "CACHE_NAME_SUFFIX is \"${CACHE_NAME_SUFFIX}\"")
endif ()
endif()
else (REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND)
else(REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND)
include("${PROJECT_SOURCE_DIR}/ReleaseInfo.cmake")
endif (REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND)
endif(REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND)
if (WIN32)
if (BIT_DEPTH EQUAL 4)
if(WIN32)
if(BIT_DEPTH EQUAL 4)
set(BUILD_BIT_DEPTH 32)
# 32 bits builds has to be installable on 64 bits system, to support WinXP/64.
set(ARCHITECTURE_ALLOWED "x86 x64 ia64")
# installing in 32 bits mode even on 64 bits OS and architecture
set(INSTALL_MODE "")
elseif (BIT_DEPTH EQUAL 8)
elseif(BIT_DEPTH EQUAL 8)
set(BUILD_BIT_DEPTH 64)
# Restricting the 64 bits builds to 64 bits systems only
set(ARCHITECTURE_ALLOWED "x64 ia64")
# installing in 64 bits mode for all 64 bits processors, even for itanium architecture
set(INSTALL_MODE "x64 ia64")
endif (BIT_DEPTH EQUAL 4)
endif(BIT_DEPTH EQUAL 4)
# set part of the output archive name
set(SYSTEM_NAME "WinVista")
configure_file ("${PROJECT_SOURCE_DIR}/tools/win/InnoSetup/WindowsInnoSetup.iss.in" "${CMAKE_BINARY_DIR}/rtdata/WindowsInnoSetup.iss")
endif (WIN32)
configure_file("${PROJECT_SOURCE_DIR}/tools/win/InnoSetup/WindowsInnoSetup.iss.in" "${CMAKE_BINARY_DIR}/rtdata/WindowsInnoSetup.iss")
endif(WIN32)
# build version.h from template
configure_file ("${PROJECT_SOURCE_DIR}/rtgui/version.h.in" "${CMAKE_BINARY_DIR}/rtgui/version.h")
configure_file("${PROJECT_SOURCE_DIR}/rtgui/version.h.in" "${CMAKE_BINARY_DIR}/rtgui/version.h")
# build AboutThisBuild.txt from template
configure_file ("${PROJECT_SOURCE_DIR}/AboutThisBuild.txt.in" "${CMAKE_BINARY_DIR}/AboutThisBuild.txt")
configure_file("${PROJECT_SOURCE_DIR}/AboutThisBuild.txt.in" "${CMAKE_BINARY_DIR}/AboutThisBuild.txt")

Binary file not shown.

After

Width:  |  Height:  |  Size: 430 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 463 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 560 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 437 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 490 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 579 B

View File

@ -0,0 +1,159 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16"
height="16"
viewBox="0 0 16 16"
version="1.1"
id="SVGRoot"
inkscape:export-filename="/tmp/template.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96"
inkscape:version="0.92.2 2405546, 2018-03-11"
sodipodi:docname="curve-catmullrom-small.svg">
<sodipodi:namedview
id="base"
pagecolor="#E0E1E2"
bordercolor="#666768"
borderopacity="1.0"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:zoom="50.5"
inkscape:cx="8"
inkscape:cy="8"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:grid-bbox="true"
inkscape:pagecheckerboard="false"
inkscape:snap-bbox="true"
inkscape:bbox-nodes="true"
inkscape:snap-others="false"
inkscape:object-nodes="true"
inkscape:snap-grids="true"
inkscape:snap-bbox-midpoints="false"
inkscape:object-paths="true"
inkscape:snap-intersection-paths="true"
inkscape:snap-smooth-nodes="true"
inkscape:snap-midpoints="true"
inkscape:snap-object-midpoints="true"
inkscape:snap-nodes="false"
showborder="true"
borderlayer="false"
inkscape:showpageshadow="true">
<inkscape:grid
type="xygrid"
id="grid1374"
originx="1"
originy="1"
empspacing="7"
dotted="false" />
</sodipodi:namedview>
<defs
id="defs815" />
<metadata
id="metadata818">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Maciej Dworak</dc:title>
</cc:Agent>
</dc:creator>
<dc:rights>
<cc:Agent>
<dc:title />
</cc:Agent>
</dc:rights>
<dc:description>RawTherapee icon.</dc:description>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:groupmode="layer"
inkscape:label="Layer 1"
transform="translate(0,-8)">
<circle
r="2.1000001"
cy="-7.5"
cx="10.5"
id="circle3732"
style="opacity:0.7;fill:#2a7fff;fill-opacity:1;fill-rule:nonzero;stroke:#2a7fff;stroke-width:0.80000007;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2.00314951;stroke-opacity:1;paint-order:normal" />
<circle
style="opacity:0.7;fill:#2a7fff;fill-opacity:1;fill-rule:nonzero;stroke:#2a7fff;stroke-width:0.80000007;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2.00314951;stroke-opacity:1;paint-order:normal"
id="circle3734"
cx="6.5"
cy="0.5"
r="2.1000001" />
<path
sodipodi:nodetypes="caac"
inkscape:connector-curvature="0"
id="path3736"
d="M 2,2 C 2,2 5.336352,1.536652 6.539604,0.490099 8.782506,-1.46071 8.57285,-5.236736 10.5,-7.5 11.429492,-8.591604 14,-10 14,-10"
style="opacity:0.9;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a7fff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
<circle
r="2.6000001"
cy="-8"
cx="30"
id="circle4393"
style="opacity:0.7;fill:#2a7fff;fill-opacity:1;fill-rule:nonzero;stroke:#2a7fff;stroke-width:0.80000007;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2.00314951;stroke-opacity:1;paint-order:normal" />
<circle
style="opacity:0.7;fill:#2a7fff;fill-opacity:1;fill-rule:nonzero;stroke:#2a7fff;stroke-width:0.80000007;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2.00314951;stroke-opacity:1;paint-order:normal"
id="circle4395"
cx="26"
cy="0"
r="2.6000001" />
<path
sodipodi:nodetypes="caac"
inkscape:connector-curvature="0"
id="path4397"
d="m 22,2 c 0,0 2.945907,-0.945907 4,-2 2.108185,-2.108185 1.891815,-5.891815 4,-8 1.054093,-1.054093 4,-2 4,-2"
style="opacity:0.9;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a7fff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.7;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#2a7fff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000007;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2.00314951;stroke-opacity:1;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 13.957617,9.0010308 a 0.99703958,0.99930081 0 0 0 -0.445902,0.128803 c 0,0 -0.669824,0.3673832 -1.458413,0.8762522 -0.134886,0.08704 -0.27712,0.195722 -0.416691,0.288832 -0.342359,-0.177992 -0.724456,-0.288832 -1.135186,-0.288832 -1.3717587,0 -2.4923491,1.123128 -2.4923491,2.498002 0,0.549878 0.1839155,1.055935 0.4867858,1.469528 -0.3263981,0.787192 -0.5622541,1.587644 -0.8002735,2.336023 -0.202987,0.638199 -0.4127132,1.221238 -0.6522978,1.750553 -0.1713441,-0.03761 -0.3473737,-0.0605 -0.5296243,-0.0605 -1.3717594,0 -2.4923497,1.123128 -2.4923497,2.498002 0,0.01 0.00179,0.0193 0.00189,0.02928 -0.1454635,0.04365 -0.2824131,0.102887 -0.424477,0.138561 -0.9240894,0.232048 -1.7076443,0.341524 -1.7076443,0.341524 a 0.99703958,0.99930081 0 1 0 0.2726033,1.978885 c 0,0 0.8810157,-0.121637 1.9198869,-0.382506 0.2647274,-0.06648 0.5384671,-0.139215 0.8158557,-0.220527 0.4365799,0.376198 0.996262,0.612788 1.6142351,0.612788 1.3717594,0 2.4923497,-1.123127 2.4923497,-2.498002 0,-0.438945 -0.1230822,-0.846798 -0.3232278,-1.206066 0.3946885,-0.776236 0.6653676,-1.595807 0.9132168,-2.375054 0.2181704,-0.685981 0.4272682,-1.338908 0.6620272,-1.939855 0.08137,0.0081 0.159969,0.02537 0.243393,0.02537 1.37176,0 2.49235,-1.123128 2.49235,-2.498002 0,-0.226332 -0.0405,-0.44107 -0.09736,-0.649871 0.08068,-0.05425 0.158822,-0.11703 0.237551,-0.167834 0.724416,-0.467449 1.33575,-0.804045 1.33575,-0.804045 A 0.99703958,0.99930081 0 0 0 13.957617,9.0010308 Z"
id="circle4399"
inkscape:connector-curvature="0" />
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.7;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#2a7fff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000007;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2.00314951;stroke-opacity:1;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 33.95898,8.996094 a 1.0001,1.0001 0 0 0 -0.26562,0.05273 c 0,0 -0.77575,0.247246 -1.68945,0.634765 -0.026,0.01104 -0.0539,0.02398 -0.0801,0.03516 C 31.40115,9.277093 30.735,9 30,9 c -1.65212,0 -3,1.347884 -3,3 0,0.717059 0.26501,1.367657 0.6875,1.884766 -0.24334,0.608424 -0.45019,1.221586 -0.63867,1.808593 -0.15423,0.480329 -0.31093,0.93057 -0.47461,1.363282 C 26.38812,17.020277 26.19646,17 26,17 c -1.65212,0 -3,1.347884 -3,3 0,0.183819 0.0228,0.362261 0.0547,0.537109 -0.74094,0.305136 -1.36133,0.511719 -1.36133,0.511719 a 1.0001,1.0001 0 1 0 0.61328,1.902344 c 0,0 0.77575,-0.247247 1.68945,-0.634766 0.026,-0.01103 0.0539,-0.02398 0.0801,-0.03516 C 24.59885,22.722907 25.265,23 26,23 c 1.65212,0 3,-1.347884 3,-3 0,-0.717059 -0.26501,-1.367657 -0.6875,-1.884766 0.24334,-0.608424 0.45019,-1.221586 0.63867,-1.808593 0.15423,-0.480329 0.31093,-0.93057 0.47461,-1.363282 C 29.61188,14.979723 29.80354,15 30,15 c 1.65212,0 3,-1.347884 3,-3 0,-0.183819 -0.0228,-0.362261 -0.0547,-0.537109 0.74094,-0.305136 1.36133,-0.511719 1.36133,-0.511719 a 1.0001,1.0001 0 0 0 -0.24805,-1.955078 1.0001,1.0001 0 0 0 -0.0996,0 z"
id="circle4405"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -0,0 +1,131 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="24px"
height="24px"
viewBox="0 0 24 24"
version="1.1"
id="SVGRoot"
inkscape:export-filename="/tmp/template.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96"
inkscape:version="0.92.2 2405546, 2018-03-11"
sodipodi:docname="curve-catmullrom.svg">
<sodipodi:namedview
id="base"
pagecolor="#E0E1E2"
bordercolor="#666768"
borderopacity="1.0"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:zoom="33.666667"
inkscape:cx="12"
inkscape:cy="12"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:grid-bbox="true"
inkscape:pagecheckerboard="false"
inkscape:snap-bbox="true"
inkscape:bbox-nodes="true"
inkscape:snap-others="true"
inkscape:object-nodes="true"
inkscape:snap-grids="true"
inkscape:snap-bbox-midpoints="true"
inkscape:snap-intersection-paths="false"
inkscape:object-paths="true"
inkscape:snap-smooth-nodes="false"
inkscape:snap-midpoints="false"
inkscape:snap-object-midpoints="true">
<inkscape:grid
type="xygrid"
id="grid1374"
originx="1"
originy="1"
empspacing="11"
dotted="false" />
</sodipodi:namedview>
<defs
id="defs815" />
<metadata
id="metadata818">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Maciej Dworak</dc:title>
</cc:Agent>
</dc:creator>
<dc:rights>
<cc:Agent>
<dc:title />
</cc:Agent>
</dc:rights>
<dc:description>RawTherapee icon.</dc:description>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:groupmode="layer"
inkscape:label="Layer 1">
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.7;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#2a7fff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 21.961385,1.0008339 a 0.99786946,0.99965853 0 0 0 -0.446268,0.1249448 c 0,0 -1.320539,0.7149725 -2.872486,1.7101822 -0.726935,0.4661586 -1.500431,0.9886892 -2.23134,1.5422877 -0.422327,-0.229707 -0.896874,-0.3728822 -1.407011,-0.3728822 -1.641341,0 -2.993309,1.3543922 -2.993309,2.9986757 0,0.7218688 0.270322,1.3795002 0.701557,1.8995517 -0.64861,1.4824552 -1.035206,3.0616262 -1.445987,4.5448682 -0.377799,1.364155 -0.775111,2.628847 -1.331009,3.713203 -0.2915113,-0.09608 -0.5961135,-0.162037 -0.9178702,-0.162037 -1.6413407,0 -2.9933091,1.354392 -2.9933091,2.998676 0,0.08674 0.017964,0.168817 0.025334,0.253794 -0.4669772,0.137993 -0.9444077,0.264577 -1.4089603,0.357264 -1.453702,0.290044 -2.689301,0.392405 -2.689301,0.392405 a 0.99786946,0.99965853 0 1 0 0.1636965,1.991308 c 0,0 1.336573,-0.108641 2.9153582,-0.423641 0.6045648,-0.120624 1.2415233,-0.274321 1.8708182,-0.458782 0.543473,0.546411 1.293738,0.886327 2.1163631,0.886327 1.6413416,0 2.9933096,-1.354391 2.9933096,-2.998675 0,-0.580391 -0.175599,-1.119993 -0.465756,-1.581333 0.775824,-1.387713 1.230097,-2.936322 1.644762,-4.433589 0.394368,-1.423985 0.765718,-2.808151 1.268648,-4.0353276 0.177472,0.033413 0.359151,0.054663 0.545655,0.054663 1.641341,0 2.993309,-1.3543916 2.993309,-2.998675 0,-0.3989768 -0.08399,-0.7787742 -0.228006,-1.1284079 C 18.400516,5.4015772 19.076546,4.930379 19.718352,4.518811 21.202494,3.5670816 22.462218,2.8867193 22.462218,2.8867193 A 0.99786946,0.99965853 0 0 0 21.961385,1.0008339 Z"
id="circle817"
inkscape:connector-curvature="0" />
<circle
style="opacity:0.7;fill:#2a7fff;fill-opacity:1;stroke:#2a7fff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="circle5141"
cx="-25"
cy="7"
r="2" />
<circle
r="2"
cy="20"
cx="-31"
id="circle5143"
style="opacity:0.7;fill:#2a7fff;fill-opacity:1;stroke:#2a7fff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" />
<path
sodipodi:nodetypes="caac"
inkscape:connector-curvature="0"
id="path5145"
d="m -38,22 c 0,0 5.157064,-0.421242 7,-2 3.62451,-3.104949 2.956624,-9.323638 6,-13 1.828498,-2.2088042 7,-5 7,-5"
style="opacity:0.7;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a7fff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2.00314951;stroke-opacity:1;paint-order:normal" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.1 KiB

View File

@ -0,0 +1,134 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="24px"
height="24px"
viewBox="0 0 24 24"
version="1.1"
id="SVGRoot"
inkscape:export-filename="/tmp/template.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96"
inkscape:version="0.92.2 2405546, 2018-03-11"
sodipodi:docname="warning.svg">
<sodipodi:namedview
id="base"
pagecolor="#E0E1E2"
bordercolor="#666768"
borderopacity="1.0"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:zoom="33.833333"
inkscape:cx="7.684729"
inkscape:cy="12.059113"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:grid-bbox="true"
inkscape:pagecheckerboard="false"
inkscape:snap-bbox="true"
inkscape:bbox-nodes="true"
inkscape:snap-others="false"
inkscape:object-nodes="false"
inkscape:snap-grids="true"
inkscape:snap-bbox-midpoints="false"
inkscape:bbox-paths="false"
inkscape:snap-bbox-edge-midpoints="true">
<inkscape:grid
type="xygrid"
id="grid1374"
originx="1"
originy="1"
empspacing="11"
dotted="false" />
</sodipodi:namedview>
<defs
id="defs815" />
<metadata
id="metadata818">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Maciej Dworak</dc:title>
</cc:Agent>
</dc:creator>
<dc:rights>
<cc:Agent>
<dc:title />
</cc:Agent>
</dc:rights>
<dc:description>RawTherapee icon.</dc:description>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:groupmode="layer"
inkscape:label="Layer 1">
<path
sodipodi:type="star"
style="opacity:0.7;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a7fff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2.00314951;stroke-opacity:1;paint-order:normal"
id="path851"
sodipodi:sides="3"
sodipodi:cx="12"
sodipodi:cy="15"
sodipodi:r1="12"
sodipodi:r2="6"
sodipodi:arg1="-1.5707963"
sodipodi:arg2="-0.52359878"
inkscape:flatsided="true"
inkscape:rounded="0"
inkscape:randomized="0"
d="M 12,3 22.392305,21 1.6076952,21 Z"
inkscape:transform-center-y="-3" />
<path
inkscape:connector-curvature="0"
sodipodi:nodetypes="csssc"
id="path4562-5"
d="m 13.207467,10.82925 c 0,2.185129 -0.540947,5.087874 -1.207468,5.087874 -0.666523,0 -1.207467,-2.902745 -1.207467,-5.087874 0,-2.1851257 0.540944,-2.8292503 1.207467,-2.8292503 0.666521,0 1.207468,0.6441246 1.207468,2.8292503 z"
style="opacity:0.9;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999988" />
<ellipse
ry="1.2399021"
rx="1.2388306"
cy="17.753935"
cx="12"
id="path4565-0"
style="opacity:0.9;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.18797946" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.5 KiB

View File

@ -1001,6 +1001,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: <b>-</b>
!GENERAL_ASIMAGE;As Image
!GENERAL_AUTO;Automatic
!GENERAL_CLOSE;Close
!GENERAL_CURRENT;Current
!GENERAL_OPEN;Open
!GENERAL_RESET;Reset
!GENERAL_SAVE_AS;Save as...

View File

@ -1016,6 +1016,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: <b>-</b>
!FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Show unsaved images.\nShortcut: <b>Alt-6</b>
!FILEBROWSER_SHOWUNCOLORHINT;Show images without a color label.\nShortcut: <b>Alt-0</b>
!FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: <b>Shift-0</b>
!GENERAL_CURRENT;Current
!GENERAL_RESET;Reset
!GENERAL_SAVE_AS;Save as...
!GENERAL_SLIDER;Slider

View File

@ -574,6 +574,7 @@ TP_WBALANCE_TEMPERATURE;色溫
!GENERAL_ASIMAGE;As Image
!GENERAL_AUTO;Automatic
!GENERAL_CLOSE;Close
!GENERAL_CURRENT;Current
!GENERAL_FILE;File
!GENERAL_NONE;None
!GENERAL_OPEN;Open

View File

@ -2168,6 +2168,7 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: <b>-</b>
!DYNPROFILEEDITOR_IMGTYPE_STD;Standard
!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles
!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles
!GENERAL_CURRENT;Current
!GENERAL_RESET;Reset
!GENERAL_SAVE_AS;Save as...
!HISTOGRAM_TOOLTIP_MODE;Toggle between linear, log-linear and log-log scaling of the histogram.

View File

@ -568,6 +568,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur
!GENERAL_AUTO;Automatic
!GENERAL_BEFORE;Before
!GENERAL_CLOSE;Close
!GENERAL_CURRENT;Current
!GENERAL_FILE;File
!GENERAL_NONE;None
!GENERAL_OPEN;Open

View File

@ -73,6 +73,7 @@
#72 05.10.2018 Korrekturen (TooWaBoo) RT 5.5
#73 21.11.2018 Erweiterung (TooWaBoo) RT 5.5
#74 24.11.2018 Erweiterung (TooWaBoo) RT 5.5
#75 02.12.2018 Erweiterung (TooWaBoo) RT 5.5
ABOUT_TAB_BUILD;Version
ABOUT_TAB_CREDITS;Danksagungen
@ -295,6 +296,7 @@ GENERAL_AUTO;Automatisch
GENERAL_BEFORE;Vorher
GENERAL_CANCEL;Abbrechen
GENERAL_CLOSE;Schließen
GENERAL_CURRENT;Aktuell
GENERAL_DISABLE;Deaktivieren
GENERAL_DISABLED;Deaktiviert
GENERAL_ENABLE;Aktivieren

View File

@ -339,6 +339,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh
!GENERAL_BEFORE;Before
!GENERAL_CANCEL;Cancel
!GENERAL_CLOSE;Close
!GENERAL_CURRENT;Current
!GENERAL_DISABLE;Disable
!GENERAL_DISABLED;Disabled
!GENERAL_ENABLE;Enable

View File

@ -224,6 +224,7 @@
!GENERAL_BEFORE;Before
!GENERAL_CANCEL;Cancel
!GENERAL_CLOSE;Close
!GENERAL_CURRENT;Current
!GENERAL_DISABLE;Disable
!GENERAL_DISABLED;Disabled
!GENERAL_ENABLE;Enable

File diff suppressed because it is too large Load Diff

View File

@ -569,6 +569,7 @@ TP_WBALANCE_TEMPERATURE;Tenperatura
!GENERAL_AUTO;Automatic
!GENERAL_BEFORE;Before
!GENERAL_CLOSE;Close
!GENERAL_CURRENT;Current
!GENERAL_FILE;File
!GENERAL_NONE;None
!GENERAL_OPEN;Open

View File

@ -221,6 +221,7 @@ GENERAL_AUTO;Automatique
GENERAL_BEFORE;Avant
GENERAL_CANCEL;Annuler
GENERAL_CLOSE;Fermer
GENERAL_CURRENT;Actuel
GENERAL_DISABLE;Désactiver
GENERAL_DISABLED;Désactivé
GENERAL_ENABLE;Activer
@ -509,33 +510,33 @@ HISTORY_MSG_254;CpND - Teinte chair
HISTORY_MSG_255;Réd. de bruit - Filtre médian
HISTORY_MSG_256;Réd. de bruit - Médian - Type
HISTORY_MSG_257;Virage Partiel
HISTORY_MSG_258;Virage Partiel - Couleur
HISTORY_MSG_259;Virage Partiel - Opacité
HISTORY_MSG_260;Virage Partiel - Opacité 'a[b]'
HISTORY_MSG_261;Virage Partiel - Méthode
HISTORY_MSG_262;Virage Partiel - Opacité 'b'
HISTORY_MSG_263;Virage Partiel - Ombres - Rouge
HISTORY_MSG_264;Virage Partiel - Ombres - Vert
HISTORY_MSG_265;Virage Partiel - Ombres - Bleu
HISTORY_MSG_266;Virage Partiel - Moyen - Rouge
HISTORY_MSG_267;Virage Partiel - Moyen - Vert
HISTORY_MSG_268;Virage Partiel - Moyen - Bleu
HISTORY_MSG_269;Virage Partiel - HL - Rouge
HISTORY_MSG_270;Virage Partiel - HL - Vert
HISTORY_MSG_271;Virage Partiel - HL - Bleu
HISTORY_MSG_272;Virage Partiel - Balance
HISTORY_MSG_273;Virage Partiel - Balance Couleur O/TM/HL
HISTORY_MSG_274;Virage Partiel - Saturation des ombres
HISTORY_MSG_275;Virage Partiel - Saturation des HL
HISTORY_MSG_276;Virage Partiel - Opacité
HISTORY_MSG_258;VP - Couleur
HISTORY_MSG_259;VP - Opacité
HISTORY_MSG_260;VP - Opacité 'a[b]'
HISTORY_MSG_261;VP - Méthode
HISTORY_MSG_262;VP - Opacité 'b'
HISTORY_MSG_263;VP - Ombres - Rouge
HISTORY_MSG_264;VP - Ombres - Vert
HISTORY_MSG_265;VP - Ombres - Bleu
HISTORY_MSG_266;VP - Moyen - Rouge
HISTORY_MSG_267;VP - Moyen - Vert
HISTORY_MSG_268;VP - Moyen - Bleu
HISTORY_MSG_269;VP - HL - Rouge
HISTORY_MSG_270;VP - HL - Vert
HISTORY_MSG_271;VP - HL - Bleu
HISTORY_MSG_272;VP - Balance
HISTORY_MSG_273;VP - Balance Couleur O/TM/HL
HISTORY_MSG_274;VP - Saturation des ombres
HISTORY_MSG_275;VP - Saturation des HL
HISTORY_MSG_276;VP - Opacité
HISTORY_MSG_277;--inutilisé--
HISTORY_MSG_278;Virage Partiel - Préserver luminance
HISTORY_MSG_279;Virage partiel - Ombres
HISTORY_MSG_280;Virage partiel - Hautes lumières
HISTORY_MSG_281;Virage partiel - Protect. Saturé
HISTORY_MSG_282;Virage partiel - Seuil de protection
HISTORY_MSG_283;Virage partiel - Force
HISTORY_MSG_284;Virage partiel - Protect. saturé auto
HISTORY_MSG_278;VP - Préserver luminance
HISTORY_MSG_279;VP - Ombres
HISTORY_MSG_280;VP - Hautes lumières
HISTORY_MSG_281;VP - Protect. Saturé
HISTORY_MSG_282;VP - Seuil de protection
HISTORY_MSG_283;VP - Force
HISTORY_MSG_284;VP - Protect. saturé auto
HISTORY_MSG_285;Réd. de bruit - Médiane - Méthode
HISTORY_MSG_286;Réd. de bruit - Médiane - Type
HISTORY_MSG_287;Réd. de bruit - Médiane - Itérations
@ -730,15 +731,20 @@ HISTORY_MSG_491;Balances des Blancs
HISTORY_MSG_492;Courbes RVB
HISTORY_MSG_493;Ajustements L*a*b*
HISTORY_MSG_CLAMPOOG;Tronquer les couleurs hors gamut
HISTORY_MSG_COLORTONING_LABGRID_VALUE;Virage Partiel - Correction couleur
HISTORY_MSG_COLORTONING_LABREGION_AB;Virage Partiel - Correction couleur
HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;Virage Partiel - Masque C
HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;Virage Partiel - Masque T
HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;Virage Partiel - Luminosité
HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;Virage Partiel - Masque L
HISTORY_MSG_COLORTONING_LABREGION_LIST;Virage Partiel - Liste
HISTORY_MSG_COLORTONING_LABREGION_SATURATION;Virage Partiel - Saturation
HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;Virage Partiel - Montrer le masque
HISTORY_MSG_COLORTONING_LABGRID_VALUE;VP - Correction couleur
HISTORY_MSG_COLORTONING_LABREGION_AB;VP - Correction couleur
HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;VP - Canal
HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;VP - Masque C
HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;VP - Masque T
HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;VP - Luminosité
HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;VP - Masque L
HISTORY_MSG_COLORTONING_LABREGION_LIST;VP - Liste
HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;VP - Masque flou local
HISTORY_MSG_COLORTONING_LABREGION_OFFSET;VP - Offset local
HISTORY_MSG_COLORTONING_LABREGION_POWER;VP - Puissance locale
HISTORY_MSG_COLORTONING_LABREGION_SATURATION;VP - Saturation
HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;VP - Montrer le masque
HISTORY_MSG_COLORTONING_LABREGION_SLOPE;VP - Pente locale
HISTORY_MSG_DEHAZE_DEPTH;EB - Profondeur
HISTORY_MSG_DEHAZE_ENABLED;Élimination de la Brume
HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;EB - Montrer carte de profondeur
@ -1036,9 +1042,15 @@ PARTIALPASTE_VIGNETTING;Correction du vignettage
PARTIALPASTE_WAVELETGROUP;Niveaux d'ondelette
PARTIALPASTE_WHITEBALANCE;Balance des blancs
PREFERENCES_ADD;Ajoute
PREFERENCES_APPEARANCE;Apparence
PREFERENCES_APPEARANCE_COLORPICKERFONT;Police des ancres de vérification couleur
PREFERENCES_APPEARANCE_CROPMASKCOLOR;Couleur du masque de recadrage
PREFERENCES_APPEARANCE_MAINFONT;Police principale
PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Couleur du cadre dans le Navigateur
PREFERENCES_APPEARANCE_THEME;Thème
PREFERENCES_APPLNEXTSTARTUP;appliqué au prochain lancement
PREFERENCES_AUTOMONPROFILE;Utiliser automatiquement le profil de l'écran principal
PREFERENCES_AUTOSAVE_TP_OPEN;Sauvegarder l'état ouvert/fermé des outils en quittant
PREFERENCES_BATCH_PROCESSING;Traitement par lot
PREFERENCES_BEHADDALL;Tout à 'Ajoute'
PREFERENCES_BEHADDALLHINT;Règle tous les paramètres sur le mode <b>Ajoute</b>.\nLa modification des paramètres dans le panneau d'édition en par lot sera des <b>deltas</b> par-rapport aux valeurs existantes
@ -1097,6 +1109,7 @@ PREFERENCES_EDITORCMDLINE;Ligne de commande personnelle
PREFERENCES_EDITORLAYOUT;Disposition de l'éditeur
PREFERENCES_EXTERNALEDITOR;Éditeur externe
PREFERENCES_FBROWSEROPTS;Options du navigateur de fichiers et de vignettes
PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Barre d'outil compact dans le Navigateur de Fichiers
PREFERENCES_FILEFORMAT;Format du fichier
PREFERENCES_FLATFIELDFOUND;Trouvé
PREFERENCES_FLATFIELDSDIR;Dossier des images de Champ Uniforme
@ -1379,6 +1392,7 @@ TP_COARSETRAF_TOOLTIP_HFLIP;Symétriser / axe vertical
TP_COARSETRAF_TOOLTIP_ROTLEFT;Rotation vers la gauche\nRaccourci: <b>[</b>\n\nRaccourci en mode Éditeur unique: <b>Alt-[</b>
TP_COARSETRAF_TOOLTIP_ROTRIGHT;Rotation vers la droite\nRaccourci: <b>]</b>\n\nRaccourci en mode Éditeur unique: <b>Alt-]</b>
TP_COARSETRAF_TOOLTIP_VFLIP;Symétriser / axe horizontal
TP_COLORAPP_ABSOLUTELUMINANCE;Luminance absolue
TP_COLORAPP_ALGO;Algorithme
TP_COLORAPP_ALGO_ALL;Tout
TP_COLORAPP_ALGO_JC;Luminosité + Chroma (JC)
@ -1389,6 +1403,7 @@ TP_COLORAPP_BADPIXSL;Filtrer les pixels chauds/morts
TP_COLORAPP_BADPIXSL_TOOLTIP;Suppression des pixels chauds/morts (colorés de manière intense).\n0=Aucun effet 1=Médian 2=Gaussien.\n\nCes artefacts sont dus aux limitations de CIECAM02. Vous pouvez également adjuster l'image afin d'éviter les ombres très sombres.
TP_COLORAPP_BRIGHT;Brillance (Q)
TP_COLORAPP_BRIGHT_TOOLTIP;Brillance dans CIECAM02 est différent de Lab et RVB, prend en compte la luminosité du blanc
TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;Lorsque réglé manuellement, les valeurs au-dessus de 65 sont recommandées.
TP_COLORAPP_CHROMA;Chroma (C)
TP_COLORAPP_CHROMA_M;Niveau de couleurs (M)
TP_COLORAPP_CHROMA_M_TOOLTIP;Niveau de couleurs dans CIECAM02 est différent de Lab et RVB
@ -1419,6 +1434,7 @@ TP_COLORAPP_LABEL_SCENE;Conditions de la scène
TP_COLORAPP_LABEL_VIEWING;Conditions de visionnage
TP_COLORAPP_LIGHT;Luminosité (J)
TP_COLORAPP_LIGHT_TOOLTIP;Luminosité dans CIECAM02 est différent de celui de Lab et RVB
TP_COLORAPP_MEANLUMINANCE;Luminance moyenne (Yb%)
TP_COLORAPP_MODEL;Modèle de Point Blanc
TP_COLORAPP_MODEL_TOOLTIP;Modèle de Point Blanc\n\n<b>BB [RT] + [sortie]:</b>\nLa BB de RT est utilisée pour la scène, CIECAM est réglé sur D50, le blanc du périphérique de sortie utilise la valeur réglée dans Préférences\n\n<b>BB [RT+CAT02] + [sortie]:</b>\nLes réglages de BB de RT sont utilisés par CAT02 et le blanc du périphérique de sortie utilise la valeur réglée dans Préférences
TP_COLORAPP_NEUTRAL;Résinitialiser
@ -1462,14 +1478,23 @@ TP_COLORTONING_LABGRID;Grille de correction L*a*b*
TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nO: a=%3 b=%4
TP_COLORTONING_LABREGIONS;Régions de correction L*a*b*
TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2
TP_COLORTONING_LABREGION_CHANNEL;Canal
TP_COLORTONING_LABREGION_CHANNEL_ALL;Tous
TP_COLORTONING_LABREGION_CHANNEL_B;Bleu
TP_COLORTONING_LABREGION_CHANNEL_G;Vert
TP_COLORTONING_LABREGION_CHANNEL_R;Rouge
TP_COLORTONING_LABREGION_CHROMATICITYMASK;C
TP_COLORTONING_LABREGION_HUEMASK;T
TP_COLORTONING_LABREGION_LIGHTNESS;Luminosité
TP_COLORTONING_LABREGION_LIGHTNESSMASK;L
TP_COLORTONING_LABREGION_LIST_TITLE;Correction
TP_COLORTONING_LABREGION_MASK;Masque
TP_COLORTONING_LABREGION_MASKBLUR;Masque Flou
TP_COLORTONING_LABREGION_OFFSET;Décalage
TP_COLORTONING_LABREGION_POWER;Puissance
TP_COLORTONING_LABREGION_SATURATION;Saturation
TP_COLORTONING_LABREGION_SHOWMASK;Montrer le masque
TP_COLORTONING_LABREGION_SLOPE;Pente
TP_COLORTONING_LUMA;Luminance
TP_COLORTONING_LUMAMODE;Préserver la luminance
TP_COLORTONING_LUMAMODE_TOOLTIP;Si activé, lorsque vous changez la couleur (rouge, vert, cyan, bleu, etc.), la luminance de chaque pixel est préservé
@ -1509,6 +1534,8 @@ TP_CROP_GUIDETYPE;Type de guide:
TP_CROP_H;H
TP_CROP_LABEL;Recadrage
TP_CROP_PPI;PPI=
TP_CROP_RESETCROP;Réinitialiser
TP_CROP_SELECTCROP;Sélectionner
TP_CROP_W;L
TP_CROP_X;X
TP_CROP_Y;Y
@ -1760,7 +1787,16 @@ TP_LABCURVE_RSTPRO_TOOLTIP;Peut être utilisé avec le curseur Chromaticité et
TP_LENSGEOM_AUTOCROP;Recadrage auto
TP_LENSGEOM_FILL;Remplir
TP_LENSGEOM_LABEL;Objectif / Géométrie
TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatiquement
TP_LENSPROFILE_CORRECTION_LCPFILE;Fichier LCP
TP_LENSPROFILE_CORRECTION_MANUAL;Manuellement
TP_LENSPROFILE_LABEL;Profil de correction d'objectif
TP_LENSPROFILE_LENS_WARNING;Attention: le facteur de recadrage utilisé pour la caractérisation d'un objectif est plus grand que le facteur de recadrage de l'appareil photo, les résultats pourraient être faux.
TP_LENSPROFILE_MODE_HEADER;Sélectionner le profil d'objectif:
TP_LENSPROFILE_USE_CA;Aberration chromatique
TP_LENSPROFILE_USE_GEOMETRIC;Géometrique
TP_LENSPROFILE_USE_HEADER;Sélectionner les distortions à corriger:
TP_LENSPROFILE_USE_VIGNETTING;Vignetage
TP_LOCALCONTRAST_AMOUNT;Quantité
TP_LOCALCONTRAST_DARKNESS;Niveau des ombres
TP_LOCALCONTRAST_LABEL;Contraste Local
@ -1803,6 +1839,7 @@ TP_PRSHARPENING_LABEL;Netteté post-redimensionnement
TP_PRSHARPENING_TOOLTIP;Augmente la netteté de l'image après le redimentionnement. Ne fonctionne que si la méthode de redimensionnement "Lanczos" est utilisé. Il est impossible de prévisualiser les effets de cet outil. Cf. RawPedia pour les instructions d'utilisation.
TP_RAWCACORR_AUTO;Correction automatique
TP_RAWCACORR_AUTOIT;Itérations
TP_RAWCACORR_AUTOIT_TOOLTIP;Ce réglage est disponible si "Correction-auto" est activé.\nCorrection-auto est conservatif, signifiant qu'il ne corrige souvent pas toute l'aberration chromatique.\nPour corriger l'aberration restante, vous pouvez uttiliser jusqu'à cinq itérations de de la correction automatique de l'aberration chromatique.\nChaque itération réduira l'aberration restante de l'itération précédente avec un prix d'un temps de traitement plus long.
TP_RAWCACORR_AVOIDCOLORSHIFT;Éviter les dérives couleurs
TP_RAWCACORR_CABLUE;Bleu
TP_RAWCACORR_CARED;Rouge
@ -1926,6 +1963,7 @@ TP_RESIZE_WIDTH;Largeur
TP_RETINEX_CONTEDIT_HSL;Égaliseur d'histogramme TSV
TP_RETINEX_CONTEDIT_LAB;Égaliseur d'histogramme L*a*b*
TP_RETINEX_CONTEDIT_LH;Égaliseur de teinte
TP_RETINEX_CONTEDIT_MAP;Égaliseur
TP_RETINEX_CURVEEDITOR_CD;L=f(L)
TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminance en fonction de la luminance L=f(L)\nCorrige les données raw pour réduire halos et artéfacts.
TP_RETINEX_CURVEEDITOR_LH;Force=f(T)
@ -1963,6 +2001,7 @@ TP_RETINEX_LABEL;Retinex
TP_RETINEX_LABEL_MASK;Masque
TP_RETINEX_LABSPACE;L*a*b*
TP_RETINEX_LOW;Bas
TP_RETINEX_MAP;Méthode
TP_RETINEX_MAP_GAUS;Masque gaussien
TP_RETINEX_MAP_MAPP;Masque pointu (ondelettes partielles)
TP_RETINEX_MAP_MAPT;Masque pointu (ondelettes totales)
@ -2272,6 +2311,7 @@ TP_WBALANCE_LED_CRS;CRS SP12 WWMR16
TP_WBALANCE_LED_HEADER;LED
TP_WBALANCE_LED_LSI;LSI Lumelex 2040
TP_WBALANCE_METHOD;Méthode
TP_WBALANCE_PICKER;Sélectionner
TP_WBALANCE_SHADE;Ombre
TP_WBALANCE_SIZE;Taille:
TP_WBALANCE_SOLUX35;Solux 3500K
@ -2294,46 +2334,3 @@ ZOOMPANEL_ZOOMFITSCREEN;Affiche l'image entière\nRaccourci: <b>Alt</b>-<b>f</b>
ZOOMPANEL_ZOOMIN;Zoom Avant\nRaccourci: <b>+</b>
ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: <b>-</b>
!!!!!!!!!!!!!!!!!!!!!!!!!
! Untranslated keys follow; remove the ! prefix after an entry is translated.
!!!!!!!!!!!!!!!!!!!!!!!!!
!HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Channel
!HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;CT - region mask blur
!HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - region offset
!HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - region power
!HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope
!PREFERENCES_APPEARANCE;Appearance
!PREFERENCES_APPEARANCE_COLORPICKERFONT;Color picker font
!PREFERENCES_APPEARANCE_CROPMASKCOLOR;Crop mask color
!PREFERENCES_APPEARANCE_MAINFONT;Main font
!PREFERENCES_APPEARANCE_THEME;Theme
!PREFERENCES_AUTOSAVE_TP_OPEN;Save tool collapsed/expanded state on exit
!PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Compact toolbars in File Browser
!TP_COLORAPP_ABSOLUTELUMINANCE;Absolute luminance
!TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;When setting manually, values above 65 are recommended.
!TP_COLORAPP_MEANLUMINANCE;Mean luminance (Yb%)
!TP_COLORTONING_LABREGION_CHANNEL;Channel
!TP_COLORTONING_LABREGION_CHANNEL_ALL;All
!TP_COLORTONING_LABREGION_CHANNEL_B;Blue
!TP_COLORTONING_LABREGION_CHANNEL_G;Green
!TP_COLORTONING_LABREGION_CHANNEL_R;Red
!TP_COLORTONING_LABREGION_MASKBLUR;Mask Blur
!TP_COLORTONING_LABREGION_OFFSET;Offset
!TP_COLORTONING_LABREGION_POWER;Power
!TP_COLORTONING_LABREGION_SLOPE;Slope
!TP_CROP_RESETCROP;Reset
!TP_CROP_SELECTCROP;Select
!TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically
!TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file
!TP_LENSPROFILE_CORRECTION_MANUAL;Manually
!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;Select the lens profile:
!TP_LENSPROFILE_USE_CA;Chromatic aberration
!TP_LENSPROFILE_USE_GEOMETRIC;Geometric
!TP_LENSPROFILE_USE_HEADER;Select distortions to correct:
!TP_LENSPROFILE_USE_VIGNETTING;Vignetting
!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_RETINEX_CONTEDIT_MAP;Equalizer
!TP_RETINEX_MAP;Method
!TP_WBALANCE_PICKER;Pick

View File

@ -568,6 +568,7 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία
!GENERAL_AUTO;Automatic
!GENERAL_BEFORE;Before
!GENERAL_CLOSE;Close
!GENERAL_CURRENT;Current
!GENERAL_FILE;File
!GENERAL_NONE;None
!GENERAL_OPEN;Open

View File

@ -569,6 +569,7 @@ TP_WBALANCE_TEMPERATURE;מידת חום
!GENERAL_AUTO;Automatic
!GENERAL_BEFORE;Before
!GENERAL_CLOSE;Close
!GENERAL_CURRENT;Current
!GENERAL_FILE;File
!GENERAL_NONE;None
!GENERAL_OPEN;Open

View File

@ -1328,6 +1328,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: <b>-</b>
!FILECHOOSER_FILTER_TIFF;TIFF files
!GENERAL_APPLY;Apply
!GENERAL_ASIMAGE;As Image
!GENERAL_CURRENT;Current
!GENERAL_OPEN;Open
!GENERAL_RESET;Reset
!GENERAL_SAVE_AS;Save as...

View File

@ -765,13 +765,18 @@ HISTORY_MSG_493;L*a*b*調整
HISTORY_MSG_CLAMPOOG;色域外の色を切り取る
HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - カラー補正
HISTORY_MSG_COLORTONING_LABREGION_AB;CT - 色の補正
HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - 色チャンネル
HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - 色度のマスク
HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - 色相のマスク
HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - 明度
HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - 輝度のマスク
HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - リスト
HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;CT - マスクぼかし
HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - オフセット
HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - 強化
HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - 彩度
HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - マスクの表示
HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - スロープ
HISTORY_MSG_DEHAZE_DEPTH;霞除去 - 深度
HISTORY_MSG_DEHAZE_ENABLED;霞除去
HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;霞除去 - 深度マップの表示
@ -1065,9 +1070,15 @@ PARTIALPASTE_VIBRANCE;自然な彩度
PARTIALPASTE_VIGNETTING;周辺光量補正
PARTIALPASTE_WHITEBALANCE;ホワイトバランス
PREFERENCES_ADD;追加
PREFERENCES_APPEARANCE;外観
PREFERENCES_APPEARANCE_COLORPICKERFONT;カラーピッカーのフォント
PREFERENCES_APPEARANCE_CROPMASKCOLOR;切り抜きのマスクカラー
PREFERENCES_APPEARANCE_MAINFONT;メインフォント
PREFERENCES_APPEARANCE_NAVGUIDECOLOR;ナビゲーターのガイドカラー
PREFERENCES_APPEARANCE_THEME;テーマ
PREFERENCES_APPLNEXTSTARTUP;要再起動
PREFERENCES_AUTOMONPROFILE;OSのメインモニター・プロファイルを使用
PREFERENCES_AUTOSAVE_TP_OPEN;プログラム終了時の機能パネルの開閉状態を保存
PREFERENCES_BATCH_PROCESSING;バッチ処理
PREFERENCES_BEHADDALL;すべて '追加'
PREFERENCES_BEHADDALLHINT;すべてのパラメータを <b>追加</b>モードにします\nバッチツールパネルで設定される調整値が、各画像の既定値に<b>加算</b>されます
@ -1080,12 +1091,12 @@ PREFERENCES_CACHECLEAR_ALL;cacheに入れられたファイルを全てクリア
PREFERENCES_CACHECLEAR_ALLBUTPROFILES;cacheに入れた処理プロファイル以外をクリア:
PREFERENCES_CACHECLEAR_ONLYPROFILES;cacheに入れた処理プロファイルだけをクリア:
PREFERENCES_CACHECLEAR_SAFETY;casheに入れたファイルだけをクリア。元画像に付随した処理プロファイルはそのまま
PREFERENCES_CACHEMAXENTRIES;キャッシュエントリーの最大数
PREFERENCES_CACHEMAXENTRIES;cacheに入れるファイルの最大数
PREFERENCES_CACHEOPTS;cache オプション
PREFERENCES_CACHETHUMBHEIGHT;サムネイル縦の最大値
PREFERENCES_CLIPPINGIND;クリッピング領域の表示
PREFERENCES_CLUTSCACHE;HaldCLUT cache
PREFERENCES_CLUTSCACHE_LABEL;cacheに置けるHaldCLUTの最大数
PREFERENCES_CLUTSCACHE_LABEL;cacheに入れるHaldCLUTの最大数
PREFERENCES_CLUTSDIR;HaldCLUTのディレクトリー
PREFERENCES_CMMBPC;ブラックポイントの補正
PREFERENCES_CROP;切り抜き画像の編集
@ -1126,6 +1137,7 @@ PREFERENCES_EDITORCMDLINE;カスタムコマンドライン
PREFERENCES_EDITORLAYOUT;編集 レイアウト
PREFERENCES_EXTERNALEDITOR;外部エディタ
PREFERENCES_FBROWSEROPTS;ファイルブラウザ/サムネイルのオプション
PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;ファイルブラウザのツールバーを圧縮
PREFERENCES_FILEFORMAT;ファイル形式
PREFERENCES_FLATFIELDFOUND;検出
PREFERENCES_FLATFIELDSDIR;フラットフィールド・ディレクトリ
@ -1223,13 +1235,13 @@ PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;現在の画像のズームレベルとパ
PREFERENCES_SAVE_TP_OPEN_NOW;機能パネルの今の開閉状態を保存する
PREFERENCES_SELECTLANG;言語選択
PREFERENCES_SERIALIZE_TIFF_READ;TIFFファイルの読み込み設定
PREFERENCES_SERIALIZE_TIFF_READ_LABEL;TIFFファイルのシリアル化
PREFERENCES_SERIALIZE_TIFF_READ_LABEL;TIFFファイルの読み込みをシリアライズ
PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;画像フォルダーが多数の非圧縮のTIFFファイルで閉められている場合、このオプションを有効にすることで、サムネイル画像生成の効率が上がります
PREFERENCES_SET;設定
PREFERENCES_SHOWBASICEXIF;基本Exif情報を表示
PREFERENCES_SHOWDATETIME;日付表示
PREFERENCES_SHOWEXPOSURECOMPENSATION;露光補正追加
PREFERENCES_SHOWFILMSTRIPTOOLBAR;画像スライドツールバーを表示する
PREFERENCES_SHOWFILMSTRIPTOOLBAR;画像スライドツールバーを表示する
PREFERENCES_SHTHRESHOLD;シャドウ・クリッピング領域のしきい値
PREFERENCES_SINGLETAB;シングルタブモードモード
PREFERENCES_SINGLETABVERTAB;シングル編集タブモード, 垂直タブ
@ -1407,6 +1419,7 @@ TP_COARSETRAF_TOOLTIP_HFLIP;左右反転
TP_COARSETRAF_TOOLTIP_ROTLEFT;90度左回転\nショートカット: <b>[</b>\n\nシングル・エディタ・タブのショートカット: <b>Alt-[</b>
TP_COARSETRAF_TOOLTIP_ROTRIGHT;90度右回転\nショートカット: <b>]</b>\n\nシングル・エディタ・タブのショートカット: <b>Alt-]</b>
TP_COARSETRAF_TOOLTIP_VFLIP;上下反転
TP_COLORAPP_ABSOLUTELUMINANCE;絶対輝度
TP_COLORAPP_ALGO;アルゴリズム
TP_COLORAPP_ALGO_ALL;すべて
TP_COLORAPP_ALGO_JC;明度 + 色度 (JC)
@ -1417,6 +1430,7 @@ TP_COLORAPP_BADPIXSL;ホット/バッドピクセルフィルター
TP_COLORAPP_BADPIXSL_TOOLTIP;明るい部分のホット/バッドピクセルを圧縮します\n 0は効果なし 1は中間 2はガウスほかし\n\nこれらアーティファクトはCIECAM02の限界に起因するものです。色域を抑制する代わりに、イメージに暗い影が現れるのを防ぎます
TP_COLORAPP_BRIGHT;明るさ (Q)
TP_COLORAPP_BRIGHT_TOOLTIP;CIECAM02の明るさは L*a*b*やRGBとは異なり、白の輝度を計算に入れます
TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;設定を手動で行う場合、65以上の設定値を推奨
TP_COLORAPP_CHROMA;色度 (C)
TP_COLORAPP_CHROMA_M;鮮やかさ (M)
TP_COLORAPP_CHROMA_M_TOOLTIP;CIECAM02の鮮やかさは L*a*b*やRGBの鮮やかさとは異なります
@ -1447,6 +1461,7 @@ TP_COLORAPP_LABEL_SCENE;撮影環境条件
TP_COLORAPP_LABEL_VIEWING;観視条件
TP_COLORAPP_LIGHT;明度 (J)
TP_COLORAPP_LIGHT_TOOLTIP;CIECAM02の明度は L*a*b*やRGBの明度とは異なります
TP_COLORAPP_MEANLUMINANCE;中間輝度 (Yb%)
TP_COLORAPP_MODEL;ホワイトポイント・モデル
TP_COLORAPP_MODEL_TOOLTIP;<b>WB [RT] + [出力]:</b>\nRTのホワイトバランスは、撮影環境に使用されます。CIECAM02はD50の設定, 出力デバイスのホワイトバランスは「環境設定」の「カラーマネジメント」の設定\n\n<b>WB [RT+CAT02] + [出力]:</b>\nRTのホワイトバランス設定は、CAT02で使用され、出力デバイスのホワイトバランスは環境設定の値を使用します
TP_COLORAPP_NEUTRAL;リセット
@ -1490,14 +1505,23 @@ TP_COLORTONING_LABGRID;L*a*b*カラー補正グリッド
TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4
TP_COLORTONING_LABREGIONS;L*a*b*の補正領域
TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2
TP_COLORTONING_LABREGION_CHANNEL;色チャンネル
TP_COLORTONING_LABREGION_CHANNEL_ALL;全ての色チャンネル
TP_COLORTONING_LABREGION_CHANNEL_B;ブルー
TP_COLORTONING_LABREGION_CHANNEL_G;グリーン
TP_COLORTONING_LABREGION_CHANNEL_R;レッド
TP_COLORTONING_LABREGION_CHROMATICITYMASK;色度
TP_COLORTONING_LABREGION_HUEMASK;色相
TP_COLORTONING_LABREGION_LIGHTNESS;明度
TP_COLORTONING_LABREGION_LIGHTNESSMASK;明度
TP_COLORTONING_LABREGION_LIST_TITLE;補正
TP_COLORTONING_LABREGION_MASK;マスク
TP_COLORTONING_LABREGION_MASKBLUR;マスクぼかし
TP_COLORTONING_LABREGION_OFFSET;オフセット
TP_COLORTONING_LABREGION_POWER;強化
TP_COLORTONING_LABREGION_SATURATION;彩度
TP_COLORTONING_LABREGION_SHOWMASK;マスクの表示
TP_COLORTONING_LABREGION_SLOPE;スロープ
TP_COLORTONING_LUMA;明度
TP_COLORTONING_LUMAMODE;明度を維持
TP_COLORTONING_LUMAMODE_TOOLTIP;カラー(レッド、グリーン、シアン、ブルーなど)を変える際に、これを有効にすると、各ピクセルの明度は維持されます。
@ -1537,6 +1561,8 @@ TP_CROP_GUIDETYPE;ガイドタイプ:
TP_CROP_H;高さ
TP_CROP_LABEL;切り抜き
TP_CROP_PPI;PPI=
TP_CROP_RESETCROP;リセット
TP_CROP_SELECTCROP;セレクト
TP_CROP_W;W 幅
TP_CROP_X;X
TP_CROP_Y;Y
@ -1782,7 +1808,16 @@ TP_LABCURVE_RSTPRO_TOOLTIP;色度スライダーとCCカーブを使用するこ
TP_LENSGEOM_AUTOCROP;自動的に切り抜き選択
TP_LENSGEOM_FILL;オートフィル
TP_LENSGEOM_LABEL;レンズ / ジオメトリ
TP_LENSPROFILE_CORRECTION_AUTOMATCH;自動で
TP_LENSPROFILE_CORRECTION_LCPFILE;LCPファイル
TP_LENSPROFILE_CORRECTION_MANUAL;手動で
TP_LENSPROFILE_LABEL;レンズ補正 プロファイル
TP_LENSPROFILE_LENS_WARNING;注意:レンズプロファイルに使われるクロップファクターはカメラのクロップファクターより大きいので、誤った結果になる可能性があります。
TP_LENSPROFILE_MODE_HEADER;レンズプロファイルを選択
TP_LENSPROFILE_USE_CA;色収差
TP_LENSPROFILE_USE_GEOMETRIC;歪曲収差
TP_LENSPROFILE_USE_HEADER;補正する収差を選択:
TP_LENSPROFILE_USE_VIGNETTING;周辺光量
TP_LOCALCONTRAST_AMOUNT;量
TP_LOCALCONTRAST_DARKNESS;暗い部分のレベル
TP_LOCALCONTRAST_LABEL;ローカルコントラスト
@ -1825,6 +1860,7 @@ TP_PRSHARPENING_LABEL;リサイズ後のシャープ化
TP_PRSHARPENING_TOOLTIP;リサイズ後の画像をシャープ化します。但し、リサイズの方式がランチョスの場合に限ります。プレビュー画面でこの機能の効果を見ることは出来ません。使用法に関してはRawPediaを参照して下さい。
TP_RAWCACORR_AUTO;自動補正
TP_RAWCACORR_AUTOIT;繰り返し
TP_RAWCACORR_AUTOIT_TOOLTIP;”自動補正”が有効になっている場合にこの設定が可能です。\n自動補正の作用は控えめなため、全ての色収差が常に補正されるとは限りません。\n残りの色収差を補正するためには、自動色収差補正の繰り返しを最大5回行います。\n繰り返すたびに、直前の繰り返しで残った色収差を軽減しますが、その分処理時間は増えます。
TP_RAWCACORR_AVOIDCOLORSHIFT;色ずれを回避
TP_RAWCACORR_CABLUE;ブルー
TP_RAWCACORR_CARED;レッド
@ -1929,6 +1965,7 @@ TP_RESIZE_WIDTH;幅
TP_RETINEX_CONTEDIT_HSL;ヒストグラムイコライザ HSL
TP_RETINEX_CONTEDIT_LAB;ヒストグラムイコライザ L*a*b*
TP_RETINEX_CONTEDIT_LH;色相イコライザ
TP_RETINEX_CONTEDIT_MAP;イコライザ
TP_RETINEX_CURVEEDITOR_CD;輝度=f(輝度)
TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;輝度に応じた輝度の関数 L=f(L)\nハロとアーティファクトを減らすためにrawデータを補正します
TP_RETINEX_CURVEEDITOR_LH;強さ=f(色相)
@ -1966,6 +2003,7 @@ TP_RETINEX_LABEL;レティネックス
TP_RETINEX_LABEL_MASK;マスク
TP_RETINEX_LABSPACE;L*a*b*
TP_RETINEX_LOW;低
TP_RETINEX_MAP;方式
TP_RETINEX_MAP_GAUS;ガウシアンマスク
TP_RETINEX_MAP_MAPP;シャープマスク (一部ウェーブレット)
TP_RETINEX_MAP_MAPT;シャープマスク (全てウェーブレット)
@ -2275,6 +2313,7 @@ TP_WBALANCE_LED_CRS;CRS SP12 WWMR16
TP_WBALANCE_LED_HEADER;LED
TP_WBALANCE_LED_LSI;LSI Lumelex 2040
TP_WBALANCE_METHOD;モード
TP_WBALANCE_PICKER;ピック
TP_WBALANCE_SHADE;日陰
TP_WBALANCE_SIZE;サイズ:
TP_WBALANCE_SOLUX35;Solux 3500K
@ -2301,42 +2340,4 @@ ZOOMPANEL_ZOOMOUT;ズームアウト\nショートカット: <b>-</b>
! Untranslated keys follow; remove the ! prefix after an entry is translated.
!!!!!!!!!!!!!!!!!!!!!!!!!
!HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Channel
!HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;CT - region mask blur
!HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - region offset
!HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - region power
!HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope
!PREFERENCES_APPEARANCE;Appearance
!PREFERENCES_APPEARANCE_COLORPICKERFONT;Color picker font
!PREFERENCES_APPEARANCE_CROPMASKCOLOR;Crop mask color
!PREFERENCES_APPEARANCE_MAINFONT;Main font
!PREFERENCES_APPEARANCE_THEME;Theme
!PREFERENCES_AUTOSAVE_TP_OPEN;Save tool collapsed/expanded state on exit
!PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Compact toolbars in File Browser
!TP_COLORAPP_ABSOLUTELUMINANCE;Absolute luminance
!TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;When setting manually, values above 65 are recommended.
!TP_COLORAPP_MEANLUMINANCE;Mean luminance (Yb%)
!TP_COLORTONING_LABREGION_CHANNEL;Channel
!TP_COLORTONING_LABREGION_CHANNEL_ALL;All
!TP_COLORTONING_LABREGION_CHANNEL_B;Blue
!TP_COLORTONING_LABREGION_CHANNEL_G;Green
!TP_COLORTONING_LABREGION_CHANNEL_R;Red
!TP_COLORTONING_LABREGION_MASKBLUR;Mask Blur
!TP_COLORTONING_LABREGION_OFFSET;Offset
!TP_COLORTONING_LABREGION_POWER;Power
!TP_COLORTONING_LABREGION_SLOPE;Slope
!TP_CROP_RESETCROP;Reset
!TP_CROP_SELECTCROP;Select
!TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically
!TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file
!TP_LENSPROFILE_CORRECTION_MANUAL;Manually
!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;Select the lens profile:
!TP_LENSPROFILE_USE_CA;Chromatic aberration
!TP_LENSPROFILE_USE_GEOMETRIC;Geometric
!TP_LENSPROFILE_USE_HEADER;Select distortions to correct:
!TP_LENSPROFILE_USE_VIGNETTING;Vignetting
!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_RETINEX_CONTEDIT_MAP;Equalizer
!TP_RETINEX_MAP;Method
!TP_WBALANCE_PICKER;Pick
!GENERAL_CURRENT;Current

View File

@ -569,6 +569,7 @@ TP_WBALANCE_TEMPERATURE;Temperatūra
!GENERAL_AUTO;Automatic
!GENERAL_BEFORE;Before
!GENERAL_CLOSE;Close
!GENERAL_CURRENT;Current
!GENERAL_FILE;File
!GENERAL_NONE;None
!GENERAL_OPEN;Open

View File

@ -927,6 +927,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés <b>-</b>
!GENERAL_ASIMAGE;As Image
!GENERAL_AUTO;Automatic
!GENERAL_CLOSE;Close
!GENERAL_CURRENT;Current
!GENERAL_OPEN;Open
!GENERAL_RESET;Reset
!GENERAL_SAVE_AS;Save as...

View File

@ -2058,6 +2058,7 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: <b>-</b>
!EXIFPANEL_SHOWALL;Show all
!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles
!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles
!GENERAL_CURRENT;Current
!GENERAL_RESET;Reset
!GENERAL_SAVE_AS;Save as...
!GENERAL_SLIDER;Slider

View File

@ -568,6 +568,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur
!GENERAL_AUTO;Automatic
!GENERAL_BEFORE;Before
!GENERAL_CLOSE;Close
!GENERAL_CURRENT;Current
!GENERAL_FILE;File
!GENERAL_NONE;None
!GENERAL_OPEN;Open

View File

@ -1450,6 +1450,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: <b>-</b>
!FILECHOOSER_FILTER_TIFF;TIFF files
!GENERAL_APPLY;Apply
!GENERAL_ASIMAGE;As Image
!GENERAL_CURRENT;Current
!GENERAL_OPEN;Open
!GENERAL_RESET;Reset
!GENERAL_SAVE_AS;Save as...

View File

@ -1450,6 +1450,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: <b>-</b>
!FILECHOOSER_FILTER_TIFF;TIFF files
!GENERAL_APPLY;Apply
!GENERAL_ASIMAGE;As Image
!GENERAL_CURRENT;Current
!GENERAL_OPEN;Open
!GENERAL_RESET;Reset
!GENERAL_SAVE_AS;Save as...

View File

@ -2225,6 +2225,7 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: <b>-</b>
!DYNPROFILEEDITOR_IMGTYPE_STD;Standard
!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles
!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles
!GENERAL_CURRENT;Current
!HISTOGRAM_TOOLTIP_MODE;Toggle between linear, log-linear and log-log scaling of the histogram.
!HISTORY_MSG_489;DRC - Detail
!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction

View File

@ -1447,6 +1447,7 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: <b>-</b>
!FILEBROWSER_SHOWORIGINALHINT;Show only original images.\n\nWhen several images exist with the same filename but different extensions, the one considered original is the one whose extension is nearest the top of the parsed extensions list in Preferences > File Browser > Parsed Extensions.
!FILECHOOSER_FILTER_PP;Processing profiles
!FILECHOOSER_FILTER_SAME;Same format as current photo
!GENERAL_CURRENT;Current
!GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP.
!HISTOGRAM_TOOLTIP_MODE;Toggle between linear, log-linear and log-log scaling of the histogram.
!HISTORY_MSG_235;B&amp;W - CM - Auto

View File

@ -1301,6 +1301,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике <b>-</b>
!FILECHOOSER_FILTER_TIFF;TIFF files
!GENERAL_APPLY;Apply
!GENERAL_ASIMAGE;As Image
!GENERAL_CURRENT;Current
!GENERAL_OPEN;Open
!GENERAL_RESET;Reset
!GENERAL_SAVE_AS;Save as...

View File

@ -1301,6 +1301,7 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike <b>-</b>
!FILECHOOSER_FILTER_TIFF;TIFF files
!GENERAL_APPLY;Apply
!GENERAL_ASIMAGE;As Image
!GENERAL_CURRENT;Current
!GENERAL_OPEN;Open
!GENERAL_RESET;Reset
!GENERAL_SAVE_AS;Save as...

View File

@ -641,6 +641,7 @@ ZOOMPANEL_ZOOMOUT;Oddialiť <b>-</b>
!GENERAL_ASIMAGE;As Image
!GENERAL_AUTO;Automatic
!GENERAL_CLOSE;Close
!GENERAL_CURRENT;Current
!GENERAL_FILE;File
!GENERAL_NONE;None
!GENERAL_OPEN;Open

View File

@ -570,6 +570,7 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K]
!GENERAL_AUTO;Automatic
!GENERAL_BEFORE;Before
!GENERAL_CLOSE;Close
!GENERAL_CURRENT;Current
!GENERAL_FILE;File
!GENERAL_NONE;None
!GENERAL_OPEN;Open

View File

@ -1826,6 +1826,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: <b>-</b>
!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles
!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles
!FILEBROWSER_RESETDEFAULTPROFILE;Reset to default
!GENERAL_CURRENT;Current
!GENERAL_RESET;Reset
!GENERAL_SAVE_AS;Save as...
!GENERAL_SLIDER;Slider

View File

@ -569,6 +569,7 @@ TP_WBALANCE_TEMPERATURE;Isı
!GENERAL_AUTO;Automatic
!GENERAL_BEFORE;Before
!GENERAL_CLOSE;Close
!GENERAL_CURRENT;Current
!GENERAL_FILE;File
!GENERAL_NONE;None
!GENERAL_OPEN;Open

View File

@ -17,9 +17,10 @@ CURVEEDITOR_AXIS_IN;I:
CURVEEDITOR_AXIS_LEFT_TAN;LT:
CURVEEDITOR_AXIS_OUT;O:
CURVEEDITOR_AXIS_RIGHT_TAN;RT:
CURVEEDITOR_CATMULLROM;Flexible
CURVEEDITOR_CURVE;Curve
CURVEEDITOR_CURVES;Curves
CURVEEDITOR_CUSTOM;Custom
CURVEEDITOR_CUSTOM;Standard
CURVEEDITOR_DARKS;Darks
CURVEEDITOR_EDITPOINT_HINT;Enable edition of node in/out values.\n\nRight-click on a node to select it.\nRight-click on empty space to de-select the node.
CURVEEDITOR_HIGHLIGHTS;Highlights
@ -223,6 +224,7 @@ GENERAL_AUTO;Automatic
GENERAL_BEFORE;Before
GENERAL_CANCEL;Cancel
GENERAL_CLOSE;Close
GENERAL_CURRENT;Current
GENERAL_DISABLE;Disable
GENERAL_DISABLED;Disabled
GENERAL_ENABLE;Enable

View File

@ -37,8 +37,8 @@ Redchro=0
Bluechro=0
Gamma=1.7
Passes=1
LCurve=0
CCCurve=0
LCurve=0;
CCCurve=0;
[LensProfile]
LcMode=lfauto

View File

@ -38,8 +38,8 @@ Redchro=0
Bluechro=0
Gamma=1.7
Passes=1
LCurve=0
CCCurve=0
LCurve=0;
CCCurve=0;
[LensProfile]
LcMode=lfauto

View File

@ -38,8 +38,8 @@ Redchro=0
Bluechro=0
Gamma=1.7
Passes=1
LCurve=0
CCCurve=0
LCurve=0;
CCCurve=0;
[LensProfile]
LcMode=lfauto

View File

@ -38,8 +38,8 @@ Redchro=0
Bluechro=0
Gamma=1.7
Passes=1
LCurve=0
CCCurve=0
LCurve=0;
CCCurve=0;
[LensProfile]
LcMode=lfauto

View File

@ -2,7 +2,7 @@
This file is part of RawTherapee.
Copyright (c) 2016-2018 TooWaBoo
Version 2.98
Version 3.00
RawTherapee is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -1191,7 +1191,7 @@ window.csd:not(.fullscreen) #MainNotebook > header.top {
/*** end ***************************************************************************************/
/*** Context & popups menus *****************************************************************************/
.popup > decoration {
.csd.popup > decoration {
background-image: none;
border-radius: 0;
border: none;
@ -1245,47 +1245,47 @@ menu image:not(.dummy),
}
/*** Selection popup list (used in filechooser) ***/
entry > window > frame {
entry > window > frame:not(.dummy) {
background-color: @bg-dark-grey;
padding: 0;
}
entry > window > frame > border {
entry > window > frame > border:not(.dummy) {
background-color: @bg-dark-grey;
padding: 0.083333333333333333em;
border: 0.083333333333333333em solid @accent-color;
}
entry > window > frame > border {
margin: 0.083333333333333333em;
border: 0.083333333333333333em solid @accent-color;
}
/* end */
/*** end ***************************************************************************************/
/*** Popover *** Context menu filechooser ******************************************************/
popover.background {
popover {
box-shadow: 0 1px 6px 1px rgba(0, 0, 0, 0.5), 0 0 0 1px @bg-dark-grey;
}
popover {
background-color: @bg-dark-grey;
border: 0.083333333333333333em solid @accent-color;
border-radius: 0;
padding: 0;
margin: 0;
box-shadow: 0 1px 6px 1px rgba(0, 0, 0, 0.5), 0 0 0 1px @bg-dark-grey;
}
popover.background > box {
popover > box {
padding: 0;
margin: -9px;
}
popover.background modelbutton {
popover modelbutton {
min-height: 2em;
padding: 0 0.416666666666666666em;
margin: 0;
border-radius: 0;
}
popover.background label {
popover label {
margin-right: 0.5em;
}
popover.background modelbutton:hover label,
popover.background modelbutton:hover {
popover modelbutton:hover label,
popover modelbutton:hover {
background-color: @accent-color;
color: @text-hl-color;
}
@ -2042,7 +2042,7 @@ entry:focus > selection {
/*** end ***************************************************************************************/
/*** Window Layout *****************************************************************************/
:not(.popup):not(tooltip) > decoration {
.csd:not(.popup):not(tooltip) > decoration {
background-color: @winHeaderbar;
background-image: none;
border-radius: 0.416666666666666666em 0.416666666666666666em 0 0;
@ -2057,14 +2057,10 @@ headerbar {
background-image: linear-gradient(shade(@winHeaderbar,1.14), shade(@winHeaderbar,.86));
border-bottom: 0.083333333333333333em solid @bg-dark-grey;
border-radius: 0.416666666666666666em 0.416666666666666666em 0 0;
min-height: 2.333333333333333333em;
min-height: 2em;
padding: 0.083333333333333333em 0.416666666666666666em 0;
margin: 0;
}
messagedialog headerbar {
min-height: 2em;
}
headerbar .title{
color: @winTitle;
}
@ -2076,7 +2072,7 @@ headerbar .title{
/**/
/* Window in background */
:not(.popup):not(tooltip) > decoration:backdrop {
.csd:not(.popup):not(tooltip) > decoration:backdrop {
box-shadow: 0 0.25em 0.75em 0.083333333333333333em rgba(0, 0, 0, 0.3), 0 0 0 0.083333333333333333em @bg-dark-grey;
}
headerbar:backdrop {

View File

@ -165,7 +165,7 @@ add_dependencies(rtengine UpdateInfo)
# It may be nice to store library version too
if(BUILD_SHARED_LIBS)
install (TARGETS rtengine DESTINATION ${LIBDIR})
install(TARGETS rtengine DESTINATION ${LIBDIR})
endif()
set_target_properties(rtengine PROPERTIES COMPILE_FLAGS "${RTENGINE_CXX_FLAGS}")

View File

@ -1131,6 +1131,10 @@ Camera constants:
},
// Canon Powershot
{ // Quality C, CHDK DNGs, raw frame correction
"make_model": "Canon PowerShot A3100 IS",
"raw_crop": [ 24, 12, 4032, 3024 ] // full size 4036X3026
},
{ // Quality C, CHDK DNGs, raw frame corrections, experimental infrared support commented out
"make_model": "Canon PowerShot A480",
@ -1213,6 +1217,11 @@ Camera constants:
"ranges": { "white": 4050 } // nominal 4080-4093
},
{ // Quality C
"make_model": "Canon PowerShot SX150 IS",
"raw_crop": [ 26, 10, 4364, 3254 ] // cut 2pix left and right
},
{ // Quality C
"make_model": "Canon PowerShot SX220 HS",
"raw_crop": [ 92, 16, 4072, 3042 ] // Cut 2pix at lower border because of too high values in blue channel
@ -1343,6 +1352,7 @@ Camera constants:
"make_model": "LG mobile LG-H815",
"dcraw_matrix": [ 5859,547,-1250,-6484,15547,547,-2422,5625,3906 ], // DNG D65
//"dcraw_matrix": [ 11563,-2891,-3203,-5313,15625,625,-781,2813,5625 ], // DNG A
"raw_crop": [ 0, 0, 5312, 2986 ], // cropped last two rows because last row was garbage
"ranges": { "white": 1000 }
},
{ // Quality C
@ -1684,6 +1694,13 @@ Camera constants:
"global_green_equilibration" : true
},
{ // Quality X
"make_model": [ "Panasonic DC-LX100M2" ],
"dcraw_matrix": [ 11577, -4230, -1106, -3967, 12211, 1957, -758, 1762, 5610 ], // Adobe DNG Converter 11.0 ColorMatrix2
"raw_crop": [ 0, 0, 0, 0 ],
"ranges": { "black": 15 }
},
{ // Quality C, proper ISO 100-125-160 samples missing, pixelshift files have no black offset etc. #4574
"make_model": [ "Panasonic DC-G9" ],
"dcraw_matrix": [ 7685, -2375, -634, -3687, 11700, 2249, -748, 1546, 5111 ], // Adobe DNG Converter 10.3 ColorMatrix2

View File

@ -1,13 +1,8 @@
#ifdef __GNUC__
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Warray-bounds"
#pragma GCC diagnostic ignored "-Wsign-compare"
#pragma GCC diagnostic ignored "-Wparentheses"
#if (__GNUC__ >= 6)
#pragma GCC diagnostic ignored "-Wmisleading-indentation"
#if (__GNUC__ >= 7)
#pragma GCC diagnostic ignored "-Wdangling-else"
#endif
#endif
#endif
@ -1045,10 +1040,11 @@ void CLASS canon_sraw_load_raw()
for (row=0; row < height; row++, ip+=width) {
if (row & (jh.sraw >> 1))
for (col=0; col < width; col+=2)
for (c=1; c < 3; c++)
for (c=1; c < 3; c++) {
if (row == height-1)
ip[col][c] = ip[col-width][c];
else ip[col][c] = (ip[col-width][c] + ip[col+width][c] + 1) >> 1;
}
for (col=1; col < width; col+=2)
for (c=1; c < 3; c++)
if (col == width-1)

View File

@ -343,7 +343,7 @@ void parse_qt (int end);
// ph1_bithuff(int nbits, ushort *huff);
class ph1_bithuff_t {
public:
ph1_bithuff_t(DCraw *p, IMFILE *i, short &o):parent(p),order(o),ifp(i),bitbuf(0),vbits(0){}
ph1_bithuff_t(DCraw *p, IMFILE *i, short &o):order(o),ifp(i),bitbuf(0),vbits(0){}
unsigned operator()(int nbits, ushort *huff);
unsigned operator()(int nbits);
unsigned operator()();
@ -376,7 +376,6 @@ private:
}
}
DCraw *parent;
short &order;
IMFILE* const ifp;
UINT64 bitbuf;

View File

@ -828,9 +828,9 @@ void Crop::update(int todo)
const int ch = baseCrop->getHeight();
workingCrop = new Imagefloat(cw, ch);
//first put gamma TRC to 1
parent->ipf.workingtrc(baseCrop, workingCrop, cw, ch, -5, params.icm.workingProfile, 2.4, 12.92310, true, false);
parent->ipf.workingtrc(baseCrop, workingCrop, cw, ch, -5, params.icm.workingProfile, 2.4, 12.92310, parent->getCustomTransformIn(), true, false, true);
//adjust gamma TRC
parent->ipf.workingtrc(workingCrop, workingCrop, cw, ch, 5, params.icm.workingProfile, params.icm.workingTRCGamma, params.icm.workingTRCSlope, false, true);
parent->ipf.workingtrc(workingCrop, workingCrop, cw, ch, 5, params.icm.workingProfile, params.icm.workingTRCGamma, params.icm.workingTRCSlope, parent->getCustomTransformOut(), false, true, true);
}
}
double rrm, ggm, bbm;
@ -955,7 +955,6 @@ void Crop::update(int todo)
}
// int moderetinex;
// parent->ipf.MSR(labnCrop, labnCrop->W, labnCrop->H, 1);
parent->ipf.chromiLuminanceCurve(this, 1, labnCrop, labnCrop, parent->chroma_acurve, parent->chroma_bcurve, parent->satcurve, parent->lhskcurve, parent->clcurve, parent->lumacurve, utili, autili, butili, ccutili, cclutili, clcutili, dummy, dummy);
parent->ipf.vibrance(labnCrop);
parent->ipf.labColorCorrectionRegions(labnCrop);

View File

@ -1425,8 +1425,6 @@ void RawImageSource::igv_interpolate(int winw, int winh)
chr[2] = hdif;
chr[3] = vdif;
border_interpolate2(winw, winh, 7, rawData, red, green, blue);
if (plistener) {
plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::IGV)));
plistener->setProgress (0.0);
@ -1781,6 +1779,7 @@ void RawImageSource::igv_interpolate(int winw, int winh)
}
}
}// End of parallelization
border_interpolate2(winw, winh, 8, rawData, red, green, blue);
if (plistener) {
plistener->setProgress (1.0);
@ -1815,8 +1814,6 @@ void RawImageSource::igv_interpolate(int winw, int winh)
vdif = (float (*)) calloc(width * height / 2, sizeof * vdif);
hdif = (float (*)) calloc(width * height / 2, sizeof * hdif);
border_interpolate2(winw, winh, 7, rawData, red, green, blue);
if (plistener) {
plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::IGV)));
plistener->setProgress (0.0);
@ -2045,6 +2042,8 @@ void RawImageSource::igv_interpolate(int winw, int winh)
blue [row][col] = CLIP(rgb[1][indx] - 65535.f * chr[1][indx]);
}
}// End of parallelization
border_interpolate2(winw, winh, 8, rawData, red, green, blue);
if (plistener) {
plistener->setProgress (1.0);
@ -3083,6 +3082,7 @@ BENCHFUN
free(buffer0);
}
border_interpolate2(W, H, 1, rawData, red, green, blue);
if(plistener) {
plistener->setProgress (1.0);
}

View File

@ -48,7 +48,7 @@ DiagonalCurve::DiagonalCurve (const std::vector<double>& p, int poly_pn)
bool identity = true;
kind = (DiagonalCurveType)p[0];
if (kind == DCT_Linear || kind == DCT_Spline || kind == DCT_NURBS) {
if (kind == DCT_Linear || kind == DCT_Spline || kind == DCT_NURBS || kind == DCT_CatumullRom) {
N = (p.size() - 1) / 2;
x = new double[N];
y = new double[N];
@ -86,11 +86,12 @@ DiagonalCurve::DiagonalCurve (const std::vector<double>& p, int poly_pn)
if (!identity) {
if (kind == DCT_Spline && N > 2) {
//spline_cubic_set ();
catmull_rom_set();
spline_cubic_set ();
} else if (kind == DCT_NURBS && N > 2) {
NURBS_set ();
fillHash();
} else if (kind == DCT_CatumullRom && N > 2) {
catmull_rom_set();
} else {
kind = DCT_Linear;
}
@ -325,6 +326,9 @@ inline void catmull_rom_spline(int n_points,
if (p1_y == p2_y && (p1_y == 0 || p1_y == 1)) {
for (i = 1; i < n_points-1; ++i) {
t = p1_x + space * i;
if (t >= p2_x) {
break;
}
res_x.push_back(t);
res_y.push_back(p1_y);
}
@ -459,7 +463,7 @@ double DiagonalCurve::getVal (double t) const
}
case DCT_Linear :
// case DCT_Spline :
case DCT_Spline :
{
// values under and over the first and last point
if (t > x[N - 1]) {
@ -484,21 +488,21 @@ double DiagonalCurve::getVal (double t) const
double h = x[k_hi] - x[k_lo];
// linear
// if (kind == DCT_Linear) {
if (kind == DCT_Linear) {
return y[k_lo] + (t - x[k_lo]) * ( y[k_hi] - y[k_lo] ) / h;
// }
// // spline curve
// else { // if (kind==Spline) {
// double a = (x[k_hi] - t) / h;
// double b = (t - x[k_lo]) / h;
// double r = a * y[k_lo] + b * y[k_hi] + ((a * a * a - a) * ypp[k_lo] + (b * b * b - b) * ypp[k_hi]) * (h * h) * 0.1666666666666666666666666666666;
// return CLIPD(r);
// }
}
// spline curve
else { // if (kind==Spline) {
double a = (x[k_hi] - t) / h;
double b = (t - x[k_lo]) / h;
double r = a * y[k_lo] + b * y[k_hi] + ((a * a * a - a) * ypp[k_lo] + (b * b * b - b) * ypp[k_hi]) * (h * h) * 0.1666666666666666666666666666666;
return CLIPD(r);
}
break;
}
case DCT_Spline: {
case DCT_CatumullRom: {
auto it = std::lower_bound(poly_x.begin(), poly_x.end(), t);
if (it == poly_x.end()) {
return poly_y.back();

View File

@ -34,7 +34,7 @@ GamutWarning::GamutWarning(cmsHPROFILE iprof, cmsHPROFILE gamutprof, RenderingIn
softproof2ref(nullptr)
{
if (cmsIsMatrixShaper(gamutprof) && !cmsIsCLUT(gamutprof, intent, LCMS_USED_AS_OUTPUT)) {
cmsHPROFILE aces = ICCStore::getInstance()->getProfile("RTv4_ACES-AP0");
cmsHPROFILE aces = ICCStore::getInstance()->workingSpace("ACESp0");
if (aces) {
lab2ref = cmsCreateTransform(iprof, TYPE_Lab_FLT, aces, TYPE_RGB_FLT, INTENT_ABSOLUTE_COLORIMETRIC, cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE);
lab2softproof = cmsCreateTransform(iprof, TYPE_Lab_FLT, gamutprof, TYPE_RGB_FLT, INTENT_ABSOLUTE_COLORIMETRIC, cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE);
@ -81,6 +81,10 @@ void GamutWarning::markLine(Image8 *image, int y, float *srcbuf, float *buf1, fl
float delta_max = lab2ref ? 0.0001f : 4.9999f;
cmsDoTransform(lab2softproof, srcbuf, buf2, width);
// since we are checking for out-of-gamut, we do want to clamp here!
for (int i = 0; i < width * 3; ++i) {
buf2[i] = LIM01(buf2[i]);
}
cmsDoTransform(softproof2ref, buf2, buf1, width);
float *proofdata = buf1;

View File

@ -97,55 +97,6 @@ int findMatch(int val, const std::vector<int> &cdf, int j)
}
class CubicSplineCurve: public DiagonalCurve {
public:
CubicSplineCurve(const std::vector<double> &points):
DiagonalCurve({DCT_Linear})
{
N = points.size() / 2;
x = new double[N];
y = new double[N];
for (int i = 0; i < N; ++i) {
x[i] = points[2*i];
y[i] = points[2*i+1];
}
kind = DCT_Spline;
spline_cubic_set();
}
double getVal(double t) const override
{
// values under and over the first and last point
if (t > x[N - 1]) {
return y[N - 1];
} else if (t < x[0]) {
return y[0];
}
// do a binary search for the right interval:
unsigned int k_lo = 0, k_hi = N - 1;
while (k_hi > 1 + k_lo) {
unsigned int k = (k_hi + k_lo) / 2;
if (x[k] > t) {
k_hi = k;
} else {
k_lo = k;
}
}
double h = x[k_hi] - x[k_lo];
double a = (x[k_hi] - t) / h;
double b = (t - x[k_lo]) / h;
double r = a * y[k_lo] + b * y[k_hi] + ((a * a * a - a) * ypp[k_lo] + (b * b * b - b) * ypp[k_hi]) * (h * h) * 0.1666666666666666666666666666666;
return LIM01(r);
}
};
void mappingToCurve(const std::vector<int> &mapping, std::vector<double> &curve)
{
curve.clear();
@ -259,10 +210,11 @@ void mappingToCurve(const std::vector<int> &mapping, std::vector<double> &curve)
if (curve.size() < 4) {
curve = { DCT_Linear }; // not enough points, fall back to linear
} else {
CubicSplineCurve c(curve);
curve.insert(curve.begin(), DCT_Spline);
DiagonalCurve c(curve);
double gap = 0.05;
double x = 0.0;
curve = { DCT_Spline };
curve = { DCT_CatumullRom };
while (x < 1.0) {
curve.push_back(x);
curve.push_back(c.getVal(x));

View File

@ -310,20 +310,6 @@ Image8* Image16::to8() const
return img8;
}
Imagefloat* Image16::tofloat() const
{
Imagefloat* imgfloat = new Imagefloat(width, height);
for (int h = 0; h < height; ++h) {
for (int w = 0; w < width; ++w) {
imgfloat->r(h, w) = r(h, w);
imgfloat->g(h, w) = g(h, w);
imgfloat->b(h, w) = b(h, w);
}
}
return imgfloat;
}
// Parallelized transformation; create transform with cmsFLAGS_NOCACHE!
void Image16::ExecCMSTransform(cmsHTRANSFORM hTransform)
{

View File

@ -43,7 +43,6 @@ public:
Image16* copy() const;
Image8* to8() const;
Imagefloat* tofloat() const;
void getStdImage(const ColorTemp &ctemp, int tran, Imagefloat* image, PreviewProps pp) const override;

View File

@ -76,7 +76,6 @@ public:
virtual void flushRGB () {};
virtual void HLRecovery_Global (const ToneCurveParams &hrp) {};
virtual void HLRecovery_inpaint (float** red, float** green, float** blue) {};
virtual void MSR (LabImage* lab, LUTf & mapcurve, bool &mapcontlutili, int width, int height, int skip, RetinexParams deh, const RetinextransmissionCurve & dehatransmissionCurve, const RetinexgaintransmissionCurve & dehagaintransmissionCurve, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax) {};
virtual bool isRGBSourceModified () const = 0; // tracks whether cached rgb output of demosaic has been modified

View File

@ -102,8 +102,12 @@ ImProcCoordinator::ImProcCoordinator()
pW(-1), pH(-1),
plistener(nullptr), imageListener(nullptr), aeListener(nullptr), acListener(nullptr), abwListener(nullptr), awbListener(nullptr), flatFieldAutoClipListener(nullptr), bayerAutoContrastListener(nullptr), xtransAutoContrastListener(nullptr), frameCountListener(nullptr), imageTypeListener(nullptr), actListener(nullptr), adnListener(nullptr), awavListener(nullptr), dehaListener(nullptr), hListener(nullptr),
resultValid(false), lastOutputProfile("BADFOOD"), lastOutputIntent(RI__COUNT), lastOutputBPC(false), thread(nullptr), changeSinceLast(0), updaterRunning(false), destroying(false), utili(false), autili(false),
butili(false), ccutili(false), cclutili(false), clcutili(false), opautili(false), wavcontlutili(false),
butili(false), ccutili(false), cclutili(false), clcutili(false), opautili(false), wavcontlutili(false), colourToningSatLimit(0.f), colourToningSatLimitOpacity(0.f), highQualityComputed(false), customTransformIn(nullptr), customTransformOut(nullptr),
locallutili(false), localcutili(false), localskutili(false), localexutili(false), LHutili(false), HHutili(false),
// plistener(nullptr), imageListener(nullptr), aeListener(nullptr), acListener(nullptr), abwListener(nullptr), awbListener(nullptr), flatFieldAutoClipListener(nullptr), bayerAutoContrastListener(nullptr), xtransAutoContrastListener(nullptr), frameCountListener(nullptr), imageTypeListener(nullptr), actListener(nullptr), adnListener(nullptr), awavListener(nullptr), dehaListener(nullptr), hListener(nullptr),
// resultValid(false), lastOutputProfile("BADFOOD"), lastOutputIntent(RI__COUNT), lastOutputBPC(false), thread(nullptr), changeSinceLast(0), updaterRunning(false), destroying(false), utili(false), autili(false),
// butili(false), ccutili(false), cclutili(false), clcutili(false), opautili(false), wavcontlutili(false), colourToningSatLimit(0.f), colourToningSatLimitOpacity(0.f), highQualityComputed(false), customTransformIn(nullptr), customTransformOut(nullptr)
centerx(500, -10000),
centery(500, -10000),
@ -117,7 +121,7 @@ ImProcCoordinator::ImProcCoordinator()
chromar(0),
lumar(0),
sobeler(0),
colourToningSatLimit(0.f), colourToningSatLimitOpacity(0.f), lastspotdup(false), highQualityComputed(false),
lastspotdup(false),
retistrsav(nullptr)
{}
@ -153,6 +157,17 @@ ImProcCoordinator::~ImProcCoordinator()
}
imgsrc->decreaseRef();
if(customTransformIn) {
cmsDeleteTransform(customTransformIn);
customTransformIn = nullptr;
}
if(customTransformOut) {
cmsDeleteTransform(customTransformOut);
customTransformOut = nullptr;
}
updaterThreadStart.unlock();
}
@ -545,9 +560,17 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange)
const int cw = oprevi->getWidth();
const int ch = oprevi->getHeight();
// put gamma TRC to 1
ipf.workingtrc(oprevi, oprevi, cw, ch, -5, params.icm.workingProfile, 2.4, 12.92310, true, false);
if(customTransformIn) {
cmsDeleteTransform(customTransformIn);
customTransformIn = nullptr;
}
ipf.workingtrc(oprevi, oprevi, cw, ch, -5, params.icm.workingProfile, 2.4, 12.92310, customTransformIn, true, false, true);
//adjust TRC
ipf.workingtrc(oprevi, oprevi, cw, ch, 5, params.icm.workingProfile, params.icm.workingTRCGamma, params.icm.workingTRCSlope, false, true);
if(customTransformOut) {
cmsDeleteTransform(customTransformOut);
customTransformOut = nullptr;
}
ipf.workingtrc(oprevi, oprevi, cw, ch, 5, params.icm.workingProfile, params.icm.workingTRCGamma, params.icm.workingTRCSlope, customTransformOut, false, true, true);
}
}
}

View File

@ -259,7 +259,8 @@ protected:
float colourToningSatLimitOpacity;
bool lastspotdup;
bool highQualityComputed;
cmsHTRANSFORM customTransformIn;
cmsHTRANSFORM customTransformOut;
public:
ImProcCoordinator ();
@ -418,6 +419,16 @@ public:
return imgsrc;
}
cmsHTRANSFORM& getCustomTransformIn ()
{
return customTransformIn;
}
cmsHTRANSFORM& getCustomTransformOut ()
{
return customTransformOut;
}
struct DenoiseInfoStore {
DenoiseInfoStore() : chM(0), max_r{}, max_b{}, ch_M{}, valid(false) {}
float chM;

View File

@ -2484,21 +2484,7 @@ void ImProcFunctions::rgbProc(Imagefloat* working, LabImage* lab, PipetteBuffer
btemp[ti * TS + tj] = b;
}
}
} else {
for (int i = istart, ti = 0; i < tH; i++, ti++) {
for (int j = jstart, tj = 0; j < tW; j++, tj++) {
// clip out of gamut colors, without distorting colour too bad
float r = std::max(rtemp[ti * TS + tj], 0.f);
float g = std::max(gtemp[ti * TS + tj], 0.f);
float b = std::max(btemp[ti * TS + tj], 0.f);
if (OOG(max(r, g, b)) && !OOG(min(r, g, b))) {
filmlike_clip(&r, &g, &b);
}
setUnlessOOG(rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj], r, g, b);
}
}
}
if (histToneCurveThr) {

View File

@ -407,7 +407,7 @@ public:
Image8* lab2rgb(LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm, bool consider_histogram_settings = true);
Imagefloat* lab2rgbOut(LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm);
// CieImage *ciec;
void workingtrc(const Imagefloat* src, Imagefloat* dst, int cw, int ch, int mul, const Glib::ustring &profile, double gampos, double slpos, bool normalizeIn = true, bool normalizeOut = true);
void workingtrc(const Imagefloat* src, Imagefloat* dst, int cw, int ch, int mul, const Glib::ustring &profile, double gampos, double slpos, cmsHTRANSFORM &transform, bool normalizeIn = true, bool normalizeOut = true, bool keepTransForm = false) const;
bool transCoord(int W, int H, int x, int y, int w, int h, int& xv, int& yv, int& wv, int& hv, double ascaleDef = -1, const LensCorrection *pLCPMap = nullptr);
bool transCoord(int W, int H, const std::vector<Coord2D> &src, std::vector<Coord2D> &red, std::vector<Coord2D> &green, std::vector<Coord2D> &blue, double ascaleDef = -1, const LensCorrection *pLCPMap = nullptr);

View File

@ -357,7 +357,7 @@ Imagefloat* ImProcFunctions::lab2rgbOut(LabImage* lab, int cx, int cy, int cw, i
}
void ImProcFunctions::workingtrc(const Imagefloat* src, Imagefloat* dst, int cw, int ch, int mul, const Glib::ustring &profile, double gampos, double slpos, bool normalizeIn, bool normalizeOut)
void ImProcFunctions::workingtrc(const Imagefloat* src, Imagefloat* dst, int cw, int ch, int mul, const Glib::ustring &profile, double gampos, double slpos, cmsHTRANSFORM &transform, bool normalizeIn, bool normalizeOut, bool keepTransForm) const
{
const TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix(params->icm.workingProfile);
@ -382,160 +382,167 @@ void ImProcFunctions::workingtrc(const Imagefloat* src, Imagefloat* dst, int cw,
}
};
double pwr = 1.0 / gampos;
double ts = slpos;
int five = mul;
if (gampos < 1.0) {
pwr = gampos;
gampos = 1. / gampos;
five = -mul;
}
// int select_temp = 1; //5003K
constexpr double eps = 0.000000001; // not divide by zero
enum class ColorTemp {
D50 = 5003, // for Widegamut, ProPhoto Best, Beta -> D50
D65 = 6504, // for sRGB, AdobeRGB, Bruce Rec2020 -> D65
D60 = 6005 // for ACES AP0 and AP1
};
ColorTemp temp = ColorTemp::D50;
float p[6]; //primaries
//primaries for 10 working profiles ==> output profiles
if (profile == "WideGamut") {
p[0] = 0.7350; //Widegamut primaries
p[1] = 0.2650;
p[2] = 0.1150;
p[3] = 0.8260;
p[4] = 0.1570;
p[5] = 0.0180;
} else if (profile == "Adobe RGB") {
p[0] = 0.6400; //Adobe primaries
p[1] = 0.3300;
p[2] = 0.2100;
p[3] = 0.7100;
p[4] = 0.1500;
p[5] = 0.0600;
temp = ColorTemp::D65;
} else if (profile == "sRGB") {
p[0] = 0.6400; // sRGB primaries
p[1] = 0.3300;
p[2] = 0.3000;
p[3] = 0.6000;
p[4] = 0.1500;
p[5] = 0.0600;
temp = ColorTemp::D65;
} else if (profile == "BruceRGB") {
p[0] = 0.6400; // Bruce primaries
p[1] = 0.3300;
p[2] = 0.2800;
p[3] = 0.6500;
p[4] = 0.1500;
p[5] = 0.0600;
temp = ColorTemp::D65;
} else if (profile == "Beta RGB") {
p[0] = 0.6888; // Beta primaries
p[1] = 0.3112;
p[2] = 0.1986;
p[3] = 0.7551;
p[4] = 0.1265;
p[5] = 0.0352;
} else if (profile == "BestRGB") {
p[0] = 0.7347; // Best primaries
p[1] = 0.2653;
p[2] = 0.2150;
p[3] = 0.7750;
p[4] = 0.1300;
p[5] = 0.0350;
} else if (profile == "Rec2020") {
p[0] = 0.7080; // Rec2020 primaries
p[1] = 0.2920;
p[2] = 0.1700;
p[3] = 0.7970;
p[4] = 0.1310;
p[5] = 0.0460;
temp = ColorTemp::D65;
} else if (profile == "ACESp0") {
p[0] = 0.7347; // ACES P0 primaries
p[1] = 0.2653;
p[2] = 0.0000;
p[3] = 1.0;
p[4] = 0.0001;
p[5] = -0.0770;
temp = ColorTemp::D60;
} else if (profile == "ACESp1") {
p[0] = 0.713; // ACES P1 primaries
p[1] = 0.293;
p[2] = 0.165;
p[3] = 0.830;
p[4] = 0.128;
p[5] = 0.044;
temp = ColorTemp::D60;
} else if (profile == "ProPhoto") {
p[0] = 0.7347; //ProPhoto and default primaries
p[1] = 0.2653;
p[2] = 0.1596;
p[3] = 0.8404;
p[4] = 0.0366;
p[5] = 0.0001;
cmsHTRANSFORM hTransform = nullptr;
if (transform) {
hTransform = transform;
} else {
p[0] = 0.7347; //default primaries always unused
p[1] = 0.2653;
p[2] = 0.1596;
p[3] = 0.8404;
p[4] = 0.0366;
p[5] = 0.0001;
double pwr = 1.0 / gampos;
double ts = slpos;
int five = mul;
if (gampos < 1.0) {
pwr = gampos;
gampos = 1. / gampos;
five = -mul;
}
// int select_temp = 1; //5003K
constexpr double eps = 0.000000001; // not divide by zero
enum class ColorTemp {
D50 = 5003, // for Widegamut, ProPhoto Best, Beta -> D50
D65 = 6504, // for sRGB, AdobeRGB, Bruce Rec2020 -> D65
D60 = 6005 // for ACES AP0 and AP1
};
ColorTemp temp = ColorTemp::D50;
float p[6]; //primaries
//primaries for 10 working profiles ==> output profiles
if (profile == "WideGamut") {
p[0] = 0.7350; //Widegamut primaries
p[1] = 0.2650;
p[2] = 0.1150;
p[3] = 0.8260;
p[4] = 0.1570;
p[5] = 0.0180;
} else if (profile == "Adobe RGB") {
p[0] = 0.6400; //Adobe primaries
p[1] = 0.3300;
p[2] = 0.2100;
p[3] = 0.7100;
p[4] = 0.1500;
p[5] = 0.0600;
temp = ColorTemp::D65;
} else if (profile == "sRGB") {
p[0] = 0.6400; // sRGB primaries
p[1] = 0.3300;
p[2] = 0.3000;
p[3] = 0.6000;
p[4] = 0.1500;
p[5] = 0.0600;
temp = ColorTemp::D65;
} else if (profile == "BruceRGB") {
p[0] = 0.6400; // Bruce primaries
p[1] = 0.3300;
p[2] = 0.2800;
p[3] = 0.6500;
p[4] = 0.1500;
p[5] = 0.0600;
temp = ColorTemp::D65;
} else if (profile == "Beta RGB") {
p[0] = 0.6888; // Beta primaries
p[1] = 0.3112;
p[2] = 0.1986;
p[3] = 0.7551;
p[4] = 0.1265;
p[5] = 0.0352;
} else if (profile == "BestRGB") {
p[0] = 0.7347; // Best primaries
p[1] = 0.2653;
p[2] = 0.2150;
p[3] = 0.7750;
p[4] = 0.1300;
p[5] = 0.0350;
} else if (profile == "Rec2020") {
p[0] = 0.7080; // Rec2020 primaries
p[1] = 0.2920;
p[2] = 0.1700;
p[3] = 0.7970;
p[4] = 0.1310;
p[5] = 0.0460;
temp = ColorTemp::D65;
} else if (profile == "ACESp0") {
p[0] = 0.7347; // ACES P0 primaries
p[1] = 0.2653;
p[2] = 0.0000;
p[3] = 1.0;
p[4] = 0.0001;
p[5] = -0.0770;
temp = ColorTemp::D60;
} else if (profile == "ACESp1") {
p[0] = 0.713; // ACES P1 primaries
p[1] = 0.293;
p[2] = 0.165;
p[3] = 0.830;
p[4] = 0.128;
p[5] = 0.044;
temp = ColorTemp::D60;
} else if (profile == "ProPhoto") {
p[0] = 0.7347; //ProPhoto and default primaries
p[1] = 0.2653;
p[2] = 0.1596;
p[3] = 0.8404;
p[4] = 0.0366;
p[5] = 0.0001;
} else {
p[0] = 0.7347; //default primaries always unused
p[1] = 0.2653;
p[2] = 0.1596;
p[3] = 0.8404;
p[4] = 0.0366;
p[5] = 0.0001;
}
if (slpos == 0) {
slpos = eps;
}
GammaValues g_a; //gamma parameters
constexpr int mode = 0;
Color::calcGamma(pwr, ts, mode, g_a); // call to calcGamma with selected gamma and slope : return parameters for LCMS2
cmsFloat64Number gammaParams[7];
gammaParams[4] = g_a[3] * ts;
gammaParams[0] = gampos;
gammaParams[1] = 1. / (1.0 + g_a[4]);
gammaParams[2] = g_a[4] / (1.0 + g_a[4]);
gammaParams[3] = 1. / slpos;
gammaParams[5] = 0.0;
gammaParams[6] = 0.0;
// printf("ga0=%f ga1=%f ga2=%f ga3=%f ga4=%f\n", ga0, ga1, ga2, ga3, ga4);
// 7 parameters for smoother curves
cmsCIExyY xyD;
cmsWhitePointFromTemp(&xyD, (double)temp);
if (profile == "ACESp0") {
xyD = {0.32168, 0.33767, 1.0};//refine white point to avoid differences
}
cmsToneCurve* GammaTRC[3];
GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildParametricToneCurve(NULL, five, gammaParams);//5 = more smoother than 4
const cmsCIExyYTRIPLE Primaries = {
{p[0], p[1], 1.0}, // red
{p[2], p[3], 1.0}, // green
{p[4], p[5], 1.0} // blue
};
const cmsHPROFILE oprofdef = cmsCreateRGBProfile(&xyD, &Primaries, GammaTRC);
cmsFreeToneCurve(GammaTRC[0]);
if (oprofdef) {
constexpr cmsUInt32Number flags = cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE;
const cmsHPROFILE iprof = ICCStore::getInstance()->getXYZProfile();
lcmsMutex->lock();
hTransform = cmsCreateTransform(iprof, TYPE_RGB_FLT, oprofdef, TYPE_RGB_FLT, params->icm.outputIntent, flags);
lcmsMutex->unlock();
}
}
if (slpos == 0) {
slpos = eps;
}
GammaValues g_a; //gamma parameters
constexpr int mode = 0;
Color::calcGamma(pwr, ts, mode, g_a); // call to calcGamma with selected gamma and slope : return parameters for LCMS2
cmsFloat64Number gammaParams[7];
gammaParams[4] = g_a[3] * ts;
gammaParams[0] = gampos;
gammaParams[1] = 1. / (1.0 + g_a[4]);
gammaParams[2] = g_a[4] / (1.0 + g_a[4]);
gammaParams[3] = 1. / slpos;
gammaParams[5] = 0.0;
gammaParams[6] = 0.0;
// printf("ga0=%f ga1=%f ga2=%f ga3=%f ga4=%f\n", ga0, ga1, ga2, ga3, ga4);
// 7 parameters for smoother curves
cmsCIExyY xyD;
cmsWhitePointFromTemp(&xyD, (double)temp);
if (profile == "ACESp0") {
xyD = {0.32168, 0.33767, 1.0};//refine white point to avoid differences
}
cmsToneCurve* GammaTRC[3];
GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildParametricToneCurve(NULL, five, gammaParams);//5 = more smoother than 4
const cmsCIExyYTRIPLE Primaries = {
{p[0], p[1], 1.0}, // red
{p[2], p[3], 1.0}, // green
{p[4], p[5], 1.0} // blue
};
const cmsHPROFILE oprofdef = cmsCreateRGBProfile(&xyD, &Primaries, GammaTRC);
cmsFreeToneCurve(GammaTRC[0]);
if (oprofdef) {
constexpr cmsUInt32Number flags = cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE;
const cmsHPROFILE iprof = ICCStore::getInstance()->getXYZProfile();
lcmsMutex->lock();
const cmsHTRANSFORM hTransform = cmsCreateTransform(iprof, TYPE_RGB_FLT, oprofdef, TYPE_RGB_FLT, params->icm.outputIntent, flags);
lcmsMutex->unlock();
if (hTransform) {
#ifdef _OPENMP
#pragma omp parallel if (multiThread)
#endif
@ -567,8 +574,11 @@ void ImProcFunctions::workingtrc(const Imagefloat* src, Imagefloat* dst, int cw,
}
}
}
cmsDeleteTransform(hTransform);
if (!keepTransForm) {
cmsDeleteTransform(hTransform);
hTransform = nullptr;
}
transform = hTransform;
}
}

View File

@ -20,10 +20,9 @@
#include <algorithm>
#include <cassert>
#include <cmath>
#include <cstddef>
#include <cstdint>
#include <vector>
#include <iostream>
#include <vector>
#ifdef _OPENMP
#include <omp.h>
#endif
@ -33,7 +32,6 @@
#include "rt_algo.h"
#include "rt_math.h"
#include "sleef.c"
#include "jaggedarray.h"
namespace {
float calcBlendFactor(float val, float threshold) {
@ -53,6 +51,113 @@ vfloat calcBlendFactor(vfloat valv, vfloat thresholdv) {
return onev / (onev + xexpf(c16v - c16v * valv / thresholdv));
}
#endif
float tileAverage(float **data, size_t tileY, size_t tileX, size_t tilesize) {
float avg = 0.f;
#ifdef __SSE2__
vfloat avgv = ZEROV;
#endif
for (std::size_t y = tileY; y < tileY + tilesize; ++y) {
std::size_t x = tileX;
#ifdef __SSE2__
for (; x < tileX + tilesize - 3; x += 4) {
avgv += LVFU(data[y][x]);
}
#endif
for (; x < tileX + tilesize; ++x) {
avg += data[y][x];
}
}
#ifdef __SSE2__
avg += vhadd(avgv);
#endif
return avg / rtengine::SQR(tilesize);
}
float tileVariance(float **data, size_t tileY, size_t tileX, size_t tilesize, float avg) {
float var = 0.f;
#ifdef __SSE2__
vfloat varv = ZEROV;
const vfloat avgv = F2V(avg);
#endif
for (std::size_t y = tileY; y < tileY + tilesize; ++y) {
std::size_t x = tileX;
#ifdef __SSE2__
for (; x < tileX + tilesize - 3; x += 4) {
varv += SQRV(LVFU(data[y][x]) - avgv);
}
#endif
for (; x < tileX + tilesize; ++x) {
var += rtengine::SQR(data[y][x] - avg);
}
}
#ifdef __SSE2__
var += vhadd(varv);
#endif
return var / (rtengine::SQR(tilesize) * avg);
}
float calcContrastThreshold(float** luminance, int tileY, int tileX, int tilesize) {
constexpr float scale = 0.0625f / 327.68f;
std::vector<std::vector<float>> blend(tilesize - 4, std::vector<float>(tilesize - 4));
#ifdef __SSE2__
const vfloat scalev = F2V(scale);
#endif
for(int j = tileY + 2; j < tileY + tilesize - 2; ++j) {
int i = tileX + 2;
#ifdef __SSE2__
for(; i < tileX + tilesize - 5; i += 4) {
vfloat contrastv = vsqrtf(SQRV(LVFU(luminance[j][i+1]) - LVFU(luminance[j][i-1])) + SQRV(LVFU(luminance[j+1][i]) - LVFU(luminance[j-1][i])) +
SQRV(LVFU(luminance[j][i+2]) - LVFU(luminance[j][i-2])) + SQRV(LVFU(luminance[j+2][i]) - LVFU(luminance[j-2][i]))) * scalev;
STVFU(blend[j - tileY - 2][i - tileX - 2], contrastv);
}
#endif
for(; i < tileX + tilesize - 2; ++i) {
float contrast = sqrtf(rtengine::SQR(luminance[j][i+1] - luminance[j][i-1]) + rtengine::SQR(luminance[j+1][i] - luminance[j-1][i]) +
rtengine::SQR(luminance[j][i+2] - luminance[j][i-2]) + rtengine::SQR(luminance[j+2][i] - luminance[j-2][i])) * scale;
blend[j - tileY - 2][i - tileX - 2] = contrast;
}
}
const float limit = rtengine::SQR(tilesize - 4) / 100.f;
int c;
for (c = 1; c < 100; ++c) {
const float contrastThreshold = c / 100.f;
float sum = 0.f;
#ifdef __SSE2__
const vfloat contrastThresholdv = F2V(contrastThreshold);
vfloat sumv = ZEROV;
#endif
for(int j = 0; j < tilesize - 4; ++j) {
int i = 0;
#ifdef __SSE2__
for(; i < tilesize - 7; i += 4) {
sumv += calcBlendFactor(LVFU(blend[j][i]), contrastThresholdv);
}
#endif
for(; i < tilesize - 4; ++i) {
sum += calcBlendFactor(blend[j][i], contrastThreshold);
}
}
#ifdef __SSE2__
sum += vhadd(sumv);
#endif
if (sum <= limit) {
break;
}
}
return c / 100.f;
}
}
namespace rtengine
@ -172,6 +277,7 @@ void findMinMaxPercentile(const float* data, size_t size, float minPrct, float&
// go back to original range
minOut /= scale;
minOut += minVal;
minOut = rtengine::LIM(minOut, minVal, maxVal);
// find (maxPrct*size) smallest value
const float threshmax = maxPrct * size;
@ -190,11 +296,111 @@ void findMinMaxPercentile(const float* data, size_t size, float minPrct, float&
// go back to original range
maxOut /= scale;
maxOut += minVal;
maxOut = rtengine::LIM(maxOut, minVal, maxVal);
}
void buildBlendMask(float** luminance, float **blend, int W, int H, float &contrastThreshold, float amount, bool autoContrast) {
if(contrastThreshold == 0.f && !autoContrast) {
if (autoContrast) {
constexpr float minLuminance = 2000.f;
constexpr float maxLuminance = 20000.f;
constexpr float minTileVariance = 0.5f;
for (int pass = 0; pass < 2; ++pass) {
const int tilesize = 80 / (pass + 1);
const int skip = pass == 0 ? tilesize : tilesize / 4;
const int numTilesW = W / skip - 3 * pass;
const int numTilesH = H / skip - 3 * pass;
std::vector<std::vector<float>> variances(numTilesH, std::vector<float>(numTilesW));
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic)
#endif
for (int i = 0; i < numTilesH; ++i) {
const int tileY = i * skip;
for (int j = 0; j < numTilesW; ++j) {
const int tileX = j * skip;
const float avg = tileAverage(luminance, tileY, tileX, tilesize);
if (avg < minLuminance || avg > maxLuminance) {
// too dark or too bright => skip the tile
variances[i][j] = RT_INFINITY_F;
continue;
} else {
variances[i][j] = tileVariance(luminance, tileY, tileX, tilesize, avg);
// exclude tiles with a variance less than minTileVariance
variances[i][j] = variances[i][j] < minTileVariance ? RT_INFINITY_F : variances[i][j];
}
}
}
float minvar = RT_INFINITY_F;
int minI = 0, minJ = 0;
for (int i = 0; i < numTilesH; ++i) {
for (int j = 0; j < numTilesW; ++j) {
if (variances[i][j] < minvar) {
minvar = variances[i][j];
minI = i;
minJ = j;
}
}
}
if (minvar <= 1.f || pass == 1) {
const int minY = skip * minI;
const int minX = skip * minJ;
if (pass == 0) {
// a variance <= 1 means we already found a flat region and can skip second pass
contrastThreshold = calcContrastThreshold(luminance, minY, minX, tilesize);
break;
} else {
// in second pass we allow a variance of 4
// we additionally scan the tiles +-skip pixels around the best tile from pass 2
// Means we scan (2 * skip + 1)^2 tiles in this step to get a better hit rate
// fortunately the scan is quite fast, so we use only one core and don't parallelize
const int topLeftYStart = std::max(minY - skip, 0);
const int topLeftXStart = std::max(minX - skip, 0);
const int topLeftYEnd = std::min(minY + skip, H - tilesize);
const int topLeftXEnd = std::min(minX + skip, W - tilesize);
const int numTilesH = topLeftYEnd - topLeftYStart + 1;
const int numTilesW = topLeftXEnd - topLeftXStart + 1;
std::vector<std::vector<float>> variances(numTilesH, std::vector<float>(numTilesW));
for (int i = 0; i < numTilesH; ++i) {
const int tileY = topLeftYStart + i;
for (int j = 0; j < numTilesW; ++j) {
const int tileX = topLeftXStart + j;
const float avg = tileAverage(luminance, tileY, tileX, tilesize);
if (avg < minLuminance || avg > maxLuminance) {
// too dark or too bright => skip the tile
variances[i][j] = RT_INFINITY_F;
continue;
} else {
variances[i][j] = tileVariance(luminance, tileY, tileX, tilesize, avg);
// exclude tiles with a variance less than minTileVariance
variances[i][j] = variances[i][j] < minTileVariance ? RT_INFINITY_F : variances[i][j];
}
}
}
float minvar = RT_INFINITY_F;
int minI = 0, minJ = 0;
for (int i = 0; i < numTilesH; ++i) {
for (int j = 0; j < numTilesW; ++j) {
if (variances[i][j] < minvar) {
minvar = variances[i][j];
minI = i;
minJ = j;
}
}
}
contrastThreshold = minvar <= 4.f ? calcContrastThreshold(luminance, topLeftYStart + minI, topLeftXStart + minJ, tilesize) : 0.f;
}
}
}
}
if(contrastThreshold == 0.f) {
for(int j = 0; j < H; ++j) {
for(int i = 0; i < W; ++i) {
blend[j][i] = amount;
@ -202,216 +408,66 @@ void buildBlendMask(float** luminance, float **blend, int W, int H, float &contr
}
} else {
constexpr float scale = 0.0625f / 327.68f;
if (autoContrast) {
for (int pass = 0; pass < 2; ++pass) {
const int tilesize = 80 / (pass + 1);
const int numTilesW = W / tilesize;
const int numTilesH = H / tilesize;
std::vector<std::vector<std::pair<float, float>>> variances(numTilesH, std::vector<std::pair<float, float>>(numTilesW));
#pragma omp parallel for
for (int i = 0; i < numTilesH; ++i) {
int tileY = i * tilesize;
for (int j = 0; j < numTilesW; ++j) {
int tileX = j * tilesize;
#ifdef __SSE2__
vfloat avgv = ZEROV;
for (int y = tileY; y < tileY + tilesize; ++y) {
for (int x = tileX; x < tileX + tilesize; x += 4) {
avgv += LVFU(luminance[y][x]);
}
}
float avg = vhadd(avgv);
#else
float avg = 0.;
for (int y = tileY; y < tileY + tilesize; ++y) {
for (int x = tileX; x < tileX + tilesize; ++x) {
avg += luminance[y][x];
}
}
#endif
avg /= SQR(tilesize);
#ifdef __SSE2__
vfloat varv = ZEROV;
avgv = F2V(avg);
for (int y = tileY; y < tileY + tilesize; ++y) {
for (int x = tileX; x < tileX + tilesize; x +=4) {
varv += SQRV(LVFU(luminance[y][x]) - avgv);
}
}
float var = vhadd(varv);
#else
float var = 0.0;
for (int y = tileY; y < tileY + tilesize; ++y) {
for (int x = tileX; x < tileX + tilesize; ++x) {
var += SQR(luminance[y][x] - avg);
}
}
#endif
var /= (SQR(tilesize) * avg);
variances[i][j].first = var;
variances[i][j].second = avg;
}
}
float minvar = RT_INFINITY_F;
int minI = 0, minJ = 0;
for (int i = 0; i < numTilesH; ++i) {
for (int j = 0; j < numTilesW; ++j) {
if (variances[i][j].first < minvar && variances[i][j].second > 2000.f && variances[i][j].second < 20000.f) {
minvar = variances[i][j].first;
minI = i;
minJ = j;
}
}
}
const int minY = tilesize * minI;
const int minX = tilesize * minJ;
// std::cout << pass << ": minvar : " << minvar << std::endl;
if (minvar <= 1.f || pass == 1) {
// a variance <= 1 means we already found a flat region and can skip second pass
// in second pass we allow a variance of 2
JaggedArray<float> Lum(tilesize, tilesize);
JaggedArray<float> Blend(tilesize, tilesize);
for (int i = 0; i < tilesize; ++i) {
for (int j = 0; j < tilesize; ++j) {
Lum[i][j] = luminance[i + minY][j + minX];
}
}
contrastThreshold = (pass == 0 || minvar <= 2.f) ? calcContrastThreshold(Lum, Blend, tilesize, tilesize) / 100.f : 0.f;
break;
}
}
}
if(contrastThreshold == 0.f) {
for(int j = 0; j < H; ++j) {
for(int i = 0; i < W; ++i) {
blend[j][i] = amount;
}
}
} else {
#ifdef _OPENMP
#pragma omp parallel
#pragma omp parallel
#endif
{
#ifdef __SSE2__
const vfloat contrastThresholdv = F2V(contrastThreshold);
const vfloat scalev = F2V(scale);
const vfloat amountv = F2V(amount);
#endif
#ifdef _OPENMP
#pragma omp for schedule(dynamic,16)
#endif
for(int j = 2; j < H - 2; ++j) {
int i = 2;
#ifdef __SSE2__
for(; i < W - 5; i += 4) {
vfloat contrastv = vsqrtf(SQRV(LVFU(luminance[j][i+1]) - LVFU(luminance[j][i-1])) + SQRV(LVFU(luminance[j+1][i]) - LVFU(luminance[j-1][i])) +
SQRV(LVFU(luminance[j][i+2]) - LVFU(luminance[j][i-2])) + SQRV(LVFU(luminance[j+2][i]) - LVFU(luminance[j-2][i]))) * scalev;
STVFU(blend[j][i], amountv * calcBlendFactor(contrastv, contrastThresholdv));
}
#endif
for(; i < W - 2; ++i) {
float contrast = sqrtf(rtengine::SQR(luminance[j][i+1] - luminance[j][i-1]) + rtengine::SQR(luminance[j+1][i] - luminance[j-1][i]) +
rtengine::SQR(luminance[j][i+2] - luminance[j][i-2]) + rtengine::SQR(luminance[j+2][i] - luminance[j-2][i])) * scale;
blend[j][i] = amount * calcBlendFactor(contrast, contrastThreshold);
}
}
#ifdef _OPENMP
#pragma omp single
#endif
{
#ifdef __SSE2__
const vfloat contrastThresholdv = F2V(contrastThreshold);
const vfloat scalev = F2V(scale);
const vfloat amountv = F2V(amount);
#endif
#ifdef _OPENMP
#pragma omp for schedule(dynamic,16)
#endif
for(int j = 2; j < H - 2; ++j) {
int i = 2;
#ifdef __SSE2__
for(; i < W - 5; i += 4) {
vfloat contrastv = vsqrtf(SQRV(LVFU(luminance[j][i+1]) - LVFU(luminance[j][i-1])) + SQRV(LVFU(luminance[j+1][i]) - LVFU(luminance[j-1][i])) +
SQRV(LVFU(luminance[j][i+2]) - LVFU(luminance[j][i-2])) + SQRV(LVFU(luminance[j+2][i]) - LVFU(luminance[j-2][i]))) * scalev;
STVFU(blend[j][i], amountv * calcBlendFactor(contrastv, contrastThresholdv));
}
#endif
for(; i < W - 2; ++i) {
float contrast = sqrtf(rtengine::SQR(luminance[j][i+1] - luminance[j][i-1]) + rtengine::SQR(luminance[j+1][i] - luminance[j-1][i]) +
rtengine::SQR(luminance[j][i+2] - luminance[j][i-2]) + rtengine::SQR(luminance[j+2][i] - luminance[j-2][i])) * scale;
blend[j][i] = amount * calcBlendFactor(contrast, contrastThreshold);
// upper border
for(int j = 0; j < 2; ++j) {
for(int i = 2; i < W - 2; ++i) {
blend[j][i] = blend[2][i];
}
}
#ifdef _OPENMP
#pragma omp single
#endif
{
// upper border
for(int j = 0; j < 2; ++j) {
for(int i = 2; i < W - 2; ++i) {
blend[j][i] = blend[2][i];
}
}
// lower border
for(int j = H - 2; j < H; ++j) {
for(int i = 2; i < W - 2; ++i) {
blend[j][i] = blend[H-3][i];
}
}
for(int j = 0; j < H; ++j) {
// left border
blend[j][0] = blend[j][1] = blend[j][2];
// right border
blend[j][W - 2] = blend[j][W - 1] = blend[j][W - 3];
// lower border
for(int j = H - 2; j < H; ++j) {
for(int i = 2; i < W - 2; ++i) {
blend[j][i] = blend[H-3][i];
}
}
// blur blend mask to smooth transitions
gaussianBlur(blend, blend, W, H, 2.0);
for(int j = 0; j < H; ++j) {
// left border
blend[j][0] = blend[j][1] = blend[j][2];
// right border
blend[j][W - 2] = blend[j][W - 1] = blend[j][W - 3];
}
}
// blur blend mask to smooth transitions
gaussianBlur(blend, blend, W, H, 2.0);
}
}
}
int calcContrastThreshold(float** luminance, float **blend, int W, int H) {
constexpr float scale = 0.0625f / 327.68f;
#ifdef __SSE2__
const vfloat scalev = F2V(scale);
#endif
for(int j = 2; j < H - 2; ++j) {
int i = 2;
#ifdef __SSE2__
for(; i < W - 5; i += 4) {
vfloat contrastv = vsqrtf(SQRV(LVFU(luminance[j][i+1]) - LVFU(luminance[j][i-1])) + SQRV(LVFU(luminance[j+1][i]) - LVFU(luminance[j-1][i])) +
SQRV(LVFU(luminance[j][i+2]) - LVFU(luminance[j][i-2])) + SQRV(LVFU(luminance[j+2][i]) - LVFU(luminance[j-2][i]))) * scalev;
STVFU(blend[j -2 ][i - 2], contrastv);
}
#endif
for(; i < W - 2; ++i) {
float contrast = sqrtf(rtengine::SQR(luminance[j][i+1] - luminance[j][i-1]) + rtengine::SQR(luminance[j+1][i] - luminance[j-1][i]) +
rtengine::SQR(luminance[j][i+2] - luminance[j][i-2]) + rtengine::SQR(luminance[j+2][i] - luminance[j-2][i])) * scale;
blend[j -2][i- 2] = contrast;
}
}
const float limit = (W - 4) * (H - 4) / 100.f;
int c;
for (c = 1; c < 100; ++c) {
const float contrastThreshold = c / 100.f;
float sum = 0.f;
#ifdef __SSE2__
const vfloat contrastThresholdv = F2V(contrastThreshold);
vfloat sumv = ZEROV;
#endif
for(int j = 0; j < H - 4; ++j) {
int i = 0;
#ifdef __SSE2__
for(; i < W - 7; i += 4) {
sumv += calcBlendFactor(LVFU(blend[j][i]), contrastThresholdv);
}
#endif
for(; i < W - 4; ++i) {
sum += calcBlendFactor(blend[j][i], contrastThreshold);
}
}
#ifdef __SSE2__
sum += vhadd(sumv);
#endif
if (sum <= limit) {
break;
}
}
return c;
}
}

View File

@ -25,5 +25,4 @@ namespace rtengine
{
void findMinMaxPercentile(const float* data, size_t size, float minPrct, float& minOut, float maxPrct, float& maxOut, bool multiThread = true);
void buildBlendMask(float** luminance, float **blend, int W, int H, float &contrastThreshold, float amount = 1.f, bool autoContrast = false);
int calcContrastThreshold(float** luminance, float **blend, int W, int H);
}

View File

@ -907,10 +907,11 @@ private:
if (profile == "sRGB" || profile == "Adobe RGB" || profile == "ProPhoto" || profile == "WideGamut" || profile == "BruceRGB" || profile == "Beta RGB" || profile == "BestRGB" || profile == "Rec2020" || profile == "ACESp0" || profile == "ACESp1") {
const int cw = baseImg->getWidth();
const int ch = baseImg->getHeight();
cmsHTRANSFORM dummy = nullptr;
// put gamma TRC to 1
ipf.workingtrc(baseImg, baseImg, cw, ch, -5, params.icm.workingProfile, 2.4, 12.92310, true, false);
ipf.workingtrc(baseImg, baseImg, cw, ch, -5, params.icm.workingProfile, 2.4, 12.92310, dummy, true, false, false);
//adjust TRC
ipf.workingtrc(baseImg, baseImg, cw, ch, 5, params.icm.workingProfile, params.icm.workingTRCGamma, params.icm.workingTRCSlope, false, true);
ipf.workingtrc(baseImg, baseImg, cw, ch, 5, params.icm.workingProfile, params.icm.workingTRCGamma, params.icm.workingTRCSlope, dummy, false, true, false);
}
}

View File

@ -1074,6 +1074,7 @@ const std::map<std::string, std::string> NALensDataInterpreter::lenses = {
{"C3 34 68 98 38 40 4B 4E", "Sigma 100-400mm f/5-6.3 DG OS HSM | C"},
{"C8 54 62 62 0C 0C 4B 46", "Sigma 85mm f/1.4 DG HSM | A"},
{"C9 48 37 5C 24 24 4B 4E", "Sigma 24-70mm f/2.8 DG OS HSM | A"},
{"CA 48 27 3E 24 24 DF 4E", "Tamron SP 15-30mm f/2.8 Di VC USD G2 (A041)"},
{"CC 4C 50 68 14 14 4B 06", "Sigma 50-100mm f/1.8 DC HSM | A"},
{"CD 3D 2D 70 2E 3C 4B 0E", "Sigma 18-125mm f/3.8-5.6 DC OS HSM"},
{"CE 34 76 A0 38 40 4B 0E", "Sigma 150-500mm f/5-6.3 DG OS APO HSM"},

View File

@ -172,7 +172,7 @@ endif()
if(WIN32)
set(EXTRA_SRC_CLI myicon.rc)
set(EXTRA_SRC_NONCLI myicon.rc windirmonitor.cc)
set(EXTRA_SRC_NONCLI myicon.rc)
set(EXTRA_LIB_RTGUI winmm)
include_directories(${EXTRA_INCDIR}
${GIOMM_INCLUDE_DIRS}

View File

@ -640,7 +640,7 @@ void ColorToning::read (const ProcParams* pp, const ParamsEdited* pedited)
labgrid->setParams(pp->colorToning.labgridALow / ColorToningParams::LABGRID_CORR_MAX, pp->colorToning.labgridBLow / ColorToningParams::LABGRID_CORR_MAX, pp->colorToning.labgridAHigh / ColorToningParams::LABGRID_CORR_MAX, pp->colorToning.labgridBHigh / ColorToningParams::LABGRID_CORR_MAX, false);
if (pedited && !pedited->colorToning.method) {
method->set_active (5);
method->set_active (7);
} else if (pp->colorToning.method == "Lab") {
method->set_active (0);
} else if (pp->colorToning.method == "RGBSliders") {

View File

@ -52,12 +52,29 @@ int notifyListenerUI (void* data)
return 0;
}
inline void get_custom_ratio(int w, int h, double &rw, double &rh)
{
if (w < h) {
double r = double(h) / double(w);
int rr = r * 100 + 0.5;
rw = 1.0;
rh = rr / 100.0;
} else {
double r = double(w) / double(h);
int rr = r * 100 + 0.5;
rw = rr / 100.0;
rh = 1.0;
}
}
} // namespace
Crop::Crop():
FoldableToolPanel(this, "crop", M("TP_CROP_LABEL"), false, true),
crop_ratios{
{M("GENERAL_ASIMAGE"), 0.0},
{M("GENERAL_CURRENT"), -1.0},
{"3:2", 3.0 / 2.0}, // L1.5, P0.666...
{"4:3", 4.0 / 3.0}, // L1.333..., P0.75
{"16:9", 16.0 / 9.0}, // L1.777..., P0.5625
@ -176,10 +193,17 @@ Crop::Crop():
guide = Gtk::manage (new MyComboBoxText ());
setExpandAlignProperties(guide, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER);
customRatioLabel = Gtk::manage(new Gtk::Label(""));
customRatioLabel->hide();
Gtk::HBox *hb = Gtk::manage(new Gtk::HBox());
hb->pack_start(*orientation);
hb->pack_start(*customRatioLabel);
settingsgrid->set_column_homogeneous(true);
settingsgrid->attach (*fixr, 0, 0, 1, 1);
settingsgrid->attach (*ratio, 1, 0, 1, 1);
settingsgrid->attach (*orientation, 2, 0, 1, 1);
settingsgrid->attach (*hb, 2, 0, 1, 1);
settingsgrid->attach (*guidelab, 0, 1, 1, 1);
settingsgrid->attach (*guide, 1, 1, 2, 1);
pack_start (*settingsgrid, Gtk::PACK_SHRINK, 0 );
@ -349,13 +373,6 @@ void Crop::read (const ProcParams* pp, const ParamsEdited* pedited)
setDimensions (pp->crop.x + pp->crop.w, pp->crop.y + pp->crop.h);
}
if (pp->crop.ratio == "As Image") {
ratio->set_active(0);
} else {
ratio->set_active_text (pp->crop.ratio);
}
fixr->set_active (pp->crop.fixratio);
const bool flip_orientation = pp->crop.fixratio && crop_ratios[ratio->get_active_row_number()].value > 0 && crop_ratios[ratio->get_active_row_number()].value < 1.0;
if (pp->crop.orientation == "Landscape") {
@ -396,6 +413,20 @@ void Crop::read (const ProcParams* pp, const ParamsEdited* pedited)
nw = pp->crop.w;
nh = pp->crop.h;
customRatioLabel->hide();
orientation->show();
if (pp->crop.ratio == "As Image") {
ratio->set_active(0);
} else if (pp->crop.ratio == "Current") {
ratio->set_active(1);
updateCurrentRatio();
customRatioLabel->show();
orientation->hide();
} else {
ratio->set_active_text (pp->crop.ratio);
}
fixr->set_active (pp->crop.fixratio);
lastRotationDeg = pp->coarse.rotate;
wDirty = false;
@ -448,7 +479,13 @@ void Crop::write (ProcParams* pp, ParamsEdited* pedited)
pp->crop.w = nw;
pp->crop.h = nh;
pp->crop.fixratio = fixr->get_active ();
pp->crop.ratio = ratio->get_active_text ();
if (ratio->get_active_row_number() == 0) {
pp->crop.ratio = "As Image";
} else if (ratio->get_active_row_number() == 1) {
pp->crop.ratio = "Current";
} else {
pp->crop.ratio = ratio->get_active_text ();
}
// for historical reasons we store orientation different if ratio is written as 2:3 instead of 3:2, but in GUI 'landscape' is always long side horizontal regardless of the ratio is written short or long side first.
const bool flip_orientation = fixr->get_active() && crop_ratios[ratio->get_active_row_number()].value > 0 && crop_ratios[ratio->get_active_row_number()].value < 1.0;
@ -701,6 +738,15 @@ void Crop::ratioFixedChanged ()
// change to orientation or ration
void Crop::ratioChanged ()
{
if (ratio->get_active_row_number() == 1) {
orientation->hide();
updateCurrentRatio();
customRatioLabel->show();
} else {
orientation->show();
customRatioLabel->hide();
}
if (!fixr->get_active ()) {
fixr->set_active(true); // will adjust ratio anyway
} else {
@ -712,18 +758,51 @@ void Crop::ratioChanged ()
void Crop::adjustCropToRatio()
{
if (fixr->get_active() && !fixr->get_inconsistent()) {
int W1 = nw, W2 = nw;
int H1 = nh, H2 = nh;
int X1 = nx, X2 = nx;
int Y1 = ny, Y2 = ny;
// int W = w->get_value ();
// int H = h->get_value ();
int W = nw;
int H = nh;
int X = nx;
int Y = ny;
float r = getRatio();
if (W >= H) {
cropWidth2Resized (X, Y, W, H);
H1 = round(W1 / r);
Y1 = ny + (nh - H1)/2.0;
if (Y1 < 0) {
Y1 = 0;
}
if (H1 > maxh) {
H1 = maxh;
W1 = round(H1 * r);
X1 = nx + (nw - W1)/2.0;
}
if (Y1+H1 > maxh) {
Y1 = maxh - H1;
}
W2 = round(H2 * r);
X2 = nx + (nw - W2)/2.0;
if (X2 < 0) {
X2 = 0;
}
if (W2 > maxw) {
W2 = maxw;
H2 = round(W2 / r);
Y2 = ny + (nh - H2)/2.0;
}
if (X2+W2 > maxw) {
X2 = maxw - W2;
}
if (W1 * H1 >= W2 * H2) {
nx = X1;
ny = Y1;
nw = W1;
nh = H1;
} else {
cropHeight2Resized (X, Y, W, H);
nx = X2;
ny = Y2;
nw = W2;
nh = H2;
}
}
@ -847,6 +926,10 @@ bool Crop::refreshSpins (bool notify)
wconn.block (false);
hconn.block (false);
if (ratio->get_active_row_number() == 1 && !fixr->get_active()) {
updateCurrentRatio();
}
refreshSize ();
if (notify) {
@ -1372,3 +1455,12 @@ void Crop::setBatchMode (bool batchMode)
removeIfThere (methodgrid, selectCrop);
removeIfThere (methodgrid, resetCrop);
}
void Crop::updateCurrentRatio()
{
double rw, rh;
get_custom_ratio(w->get_value(), h->get_value(), rw, rh);
customRatioLabel->set_text(Glib::ustring::compose("%1:%2", rw, rh));
crop_ratios[1].value = double(w->get_value())/double(h->get_value());
}

View File

@ -95,9 +95,10 @@ private:
double value;
};
const std::vector<CropRatio> crop_ratios;
std::vector<CropRatio> crop_ratios;
void adjustCropToRatio();
void updateCurrentRatio();
Gtk::CheckButton* fixr;
MyComboBoxText* ratio;
@ -117,6 +118,7 @@ private:
Gtk::Label* sizein;
Gtk::Grid* ppigrid;
Gtk::Grid* methodgrid;
Gtk::Label *customRatioLabel;
int maxw, maxh;
double nx, ny;

View File

@ -275,6 +275,10 @@ void CropWindow::scroll (int state, GdkScrollDirection direction, int x, int y,
} else {
delta = deltaY;
}
if (delta == 0.0 && direction == GDK_SCROLL_SMOOTH) {
// sometimes this case happens. To avoid zooming into the wrong direction in this case, we just do nothing
return;
}
bool isUp = direction == GDK_SCROLL_UP || (direction == GDK_SCROLL_SMOOTH && delta < 0.0);
if ((state & GDK_CONTROL_MASK) && onArea(ColorPicker, x, y)) {
// resizing a color picker
@ -1960,7 +1964,7 @@ void CropWindow::zoomIn (bool toCursor, int cursorX, int cursorY)
int x1 = cropHandler.cropParams.x + cropHandler.cropParams.w / 2;
int y1 = cropHandler.cropParams.y + cropHandler.cropParams.h / 2;
double cropd = sqrt(cropHandler.cropParams.h * cropHandler.cropParams.h + cropHandler.cropParams.w * cropHandler.cropParams.w) * zoomSteps[cropZoom].zoom;
double imd = sqrt(imgW * imgW + imgH + imgH);
double imd = sqrt(imgW * imgW + imgH * imgH);
double d;
// the more we can see of the crop, the more gravity towards crop center

View File

@ -25,6 +25,47 @@
#include <cstring>
namespace {
class CurveTypePopUpButton: public PopUpToggleButton {
public:
CurveTypePopUpButton(const Glib::ustring &label=""):
PopUpToggleButton(label) {}
void setPosIndexMap(const std::vector<int> &pmap)
{
posidxmap_ = pmap;
}
protected:
int posToIndex(int pos) const override
{
if (pos < 0 || size_t(pos) >= posidxmap_.size()) {
return pos;
}
return posidxmap_[pos];
}
int indexToPos(int index) const override
{
if (index < 0 || size_t(index) >= posidxmap_.size()) {
return index;
}
for (int i = 0, n = int(posidxmap_.size()); i < n; ++i) {
if (posidxmap_[i] == index) {
return i;
}
}
return -1;
}
private:
std::vector<int> posidxmap_;
};
} // namespace
bool CurveEditor::reset()
{
return subGroup->curveReset(this);
@ -33,12 +74,14 @@ bool CurveEditor::reset()
DiagonalCurveEditor::DiagonalCurveEditor (Glib::ustring text, CurveEditorGroup* ceGroup, CurveEditorSubGroup* ceSubGroup) : CurveEditor::CurveEditor(text, static_cast<CurveEditorGroup*>(ceGroup), ceSubGroup)
{
// Order set in the same order than "enum DiagonalCurveType". Shouldn't change, for compatibility reason
curveType->addEntry("curve-linear-small.png", M("CURVEEDITOR_LINEAR")); // 0 Linear
curveType->addEntry("curve-spline-small.png", M("CURVEEDITOR_CUSTOM")); // 1 Spline
curveType->addEntry("curve-catmullrom-small.png", M("CURVEEDITOR_CATMULLROM")); // 4 CatmullRom
curveType->addEntry("curve-parametric-small.png", M("CURVEEDITOR_PARAMETRIC")); // 2 Parametric
curveType->addEntry("curve-nurbs-small.png", M("CURVEEDITOR_NURBS")); // 3 NURBS
static_cast<CurveTypePopUpButton *>(curveType)->setPosIndexMap({ 0, 1, 4, 2, 3 });
curveType->setSelected(DCT_Linear);
curveType->show();
rangeLabels[0] = M("CURVEEDITOR_SHADOWS");
@ -65,6 +108,9 @@ std::vector<double> DiagonalCurveEditor::getCurve ()
case (DCT_NURBS):
return curve = NURBSCurveEd;
case (DCT_CatumullRom):
return curve = catmullRomCurveEd;
default:
// returning Linear or Unchanged
curve.push_back((double)(selected));
@ -96,6 +142,13 @@ void DiagonalCurveEditor::setResetCurve(DiagonalCurveType cType, const std::vect
break;
case (DCT_CatumullRom):
if (resetCurve.size() && DiagonalCurveType(resetCurve.at(0)) == cType) {
catmullRomResetCurve = resetCurve;
}
break;
default:
break;
}
@ -209,9 +262,9 @@ CurveEditor::CurveEditor (Glib::ustring text, CurveEditorGroup* ceGroup, CurveEd
subGroup = ceSubGroup;
if (group && text.size()) {
curveType = new PopUpToggleButton(text + ":");
curveType = new CurveTypePopUpButton(text + ":");
} else {
curveType = new PopUpToggleButton();
curveType = new CurveTypePopUpButton();
}
curveType->set_tooltip_text(M("CURVEEDITOR_TYPE"));

View File

@ -156,6 +156,8 @@ protected:
std::vector<double> paramResetCurve;
std::vector<double> NURBSCurveEd;
std::vector<double> NURBSResetCurve;
std::vector<double> catmullRomCurveEd;
std::vector<double> catmullRomResetCurve;
Glib::ustring rangeLabels[4];
double rangeMilestones[3];

View File

@ -393,6 +393,7 @@ DiagonalCurveEditor* DiagonalCurveEditorSubGroup::addCurve(Glib::ustring curveLa
storeCurveValues(newCE, getCurveFromGUI(DCT_Spline));
storeCurveValues(newCE, getCurveFromGUI(DCT_Parametric));
storeCurveValues(newCE, getCurveFromGUI(DCT_NURBS));
storeCurveValues(newCE, getCurveFromGUI(DCT_CatumullRom));
return newCE;
}
@ -437,6 +438,7 @@ void DiagonalCurveEditorSubGroup::pipetteMouseOver(EditDataProvider *provider, i
switch((DiagonalCurveType)(curveEditor->curveType->getSelected())) {
case (DCT_Spline):
case (DCT_CatumullRom):
customCurve->pipetteMouseOver(curveEditor, provider, modifierKey);
customCurve->setDirty(true);
break;
@ -511,6 +513,7 @@ bool DiagonalCurveEditorSubGroup::pipetteButton1Pressed(EditDataProvider *provid
switch((DiagonalCurveType)(curveEditor->curveType->getSelected())) {
case (DCT_Spline):
case (DCT_CatumullRom):
isDragging = customCurve->pipetteButton1Pressed(provider, modifierKey);
break;
@ -539,6 +542,7 @@ void DiagonalCurveEditorSubGroup::pipetteButton1Released(EditDataProvider *provi
switch((DiagonalCurveType)(curveEditor->curveType->getSelected())) {
case (DCT_Spline):
case (DCT_CatumullRom):
customCurve->pipetteButton1Released(provider);
break;
@ -562,6 +566,7 @@ void DiagonalCurveEditorSubGroup::pipetteDrag(EditDataProvider *provider, int mo
switch((DiagonalCurveType)(curveEditor->curveType->getSelected())) {
case (DCT_Spline):
case (DCT_CatumullRom):
customCurve->pipetteDrag(provider, modifierKey);
break;
@ -615,6 +620,7 @@ void DiagonalCurveEditorSubGroup::refresh(CurveEditor *curveToRefresh)
if (curveToRefresh != nullptr && curveToRefresh == static_cast<DiagonalCurveEditor*>(parent->displayedCurve)) {
switch((DiagonalCurveType)(curveToRefresh->curveType->getSelected())) {
case (DCT_Spline):
case (DCT_CatumullRom):
customCurve->refresh();
break;
@ -703,9 +709,10 @@ void DiagonalCurveEditorSubGroup::switchGUI()
}
}
switch((DiagonalCurveType)(dCurve->curveType->getSelected())) {
switch(auto tp = (DiagonalCurveType)(dCurve->curveType->getSelected())) {
case (DCT_Spline):
customCurve->setPoints (dCurve->customCurveEd);
case (DCT_CatumullRom):
customCurve->setPoints(tp == DCT_Spline ? dCurve->customCurveEd : dCurve->catmullRomCurveEd);
customCurve->setColorProvider(dCurve->getCurveColorProvider(), dCurve->getCurveCallerId());
customCurve->setColoredBar(leftBar, bottomBar);
customCurve->queue_resize_no_redraw();
@ -776,6 +783,7 @@ void DiagonalCurveEditorSubGroup::savePressed ()
switch (parent->displayedCurve->selected) {
case DCT_Spline: // custom
case DCT_CatumullRom:
p = customCurve->getPoints ();
break;
@ -797,6 +805,8 @@ void DiagonalCurveEditorSubGroup::savePressed ()
f << "Linear" << std::endl;
} else if (p[ix] == (double)(DCT_Spline)) {
f << "Spline" << std::endl;
} else if (p[ix] == (double)(DCT_CatumullRom)) {
f << "CatmullRom" << std::endl;
} else if (p[ix] == (double)(DCT_NURBS)) {
f << "NURBS" << std::endl;
} else if (p[ix] == (double)(DCT_Parametric)) {
@ -838,6 +848,8 @@ void DiagonalCurveEditorSubGroup::loadPressed ()
p.push_back ((double)(DCT_Linear));
} else if (s == "Spline") {
p.push_back ((double)(DCT_Spline));
} else if (s == "CatmullRom") {
p.push_back ((double)(DCT_CatumullRom));
} else if (s == "NURBS") {
p.push_back ((double)(DCT_NURBS));
} else if (s == "Parametric") {
@ -858,7 +870,7 @@ void DiagonalCurveEditorSubGroup::loadPressed ()
rtengine::sanitizeCurve(p);
if (p[0] == (double)(DCT_Spline)) {
if (p[0] == (double)(DCT_Spline) || p[0] == (double)(DCT_CatumullRom)) {
customCurve->setPoints (p);
customCurve->queue_draw ();
customCurve->notifyListener ();
@ -903,6 +915,12 @@ void DiagonalCurveEditorSubGroup::copyPressed ()
clipboard.setDiagonalCurveData (curve, DCT_NURBS);
break;
case DCT_CatumullRom:
curve = customCurve->getPoints ();
curve[0] = DCT_CatumullRom;
clipboard.setDiagonalCurveData (curve, DCT_CatumullRom);
break;
default: // (DCT_Linear, DCT_Unchanged)
// ... do nothing
break;
@ -923,6 +941,7 @@ void DiagonalCurveEditorSubGroup::pastePressed ()
switch (type) {
case DCT_Spline: // custom
case DCT_CatumullRom:
customCurve->setPoints (curve);
customCurve->queue_draw ();
customCurve->notifyListener ();
@ -1060,6 +1079,10 @@ void DiagonalCurveEditorSubGroup::storeDisplayedCurve()
storeCurveValues(parent->displayedCurve, getCurveFromGUI(DCT_NURBS));
break;
case (DCT_CatumullRom):
storeCurveValues(parent->displayedCurve, getCurveFromGUI(DCT_CatumullRom));
break;
default:
break;
}
@ -1097,6 +1120,10 @@ void DiagonalCurveEditorSubGroup::storeCurveValues (CurveEditor* ce, const std::
(static_cast<DiagonalCurveEditor*>(ce))->NURBSCurveEd = p;
break;
case (DCT_CatumullRom):
(static_cast<DiagonalCurveEditor*>(ce))->catmullRomCurveEd = p;
break;
default:
break;
}
@ -1126,6 +1153,14 @@ const std::vector<double> DiagonalCurveEditorSubGroup::getCurveFromGUI (int type
case (DCT_NURBS):
return NURBSCurve->getPoints ();
case (DCT_CatumullRom): {
auto ret = customCurve->getPoints();
if (!ret.empty()) {
ret[0] = DCT_CatumullRom;
}
return ret;
}
default: {
// linear and other solutions
std::vector<double> lcurve (1);
@ -1162,6 +1197,10 @@ bool DiagonalCurveEditorSubGroup::curveReset(CurveEditor *ce)
customCurve->reset (dce->customResetCurve, dce->getIdentityValue());
return true;
case (DCT_CatumullRom) :
customCurve->reset (dce->catmullRomResetCurve, dce->getIdentityValue());
return true;
case (DCT_Parametric) : {
DiagonalCurveEditor* dCurve = static_cast<DiagonalCurveEditor*>(parent->displayedCurve);
double mileStone[3];

View File

@ -246,16 +246,6 @@ int updateVolumesUI (void* br)
return 1;
}
void DirBrowser::winDirChanged ()
{
const auto func = [](gpointer data) -> gboolean {
static_cast<DirBrowser*>(data)->updateDirTreeRoot();
return FALSE;
};
idle_register.add(func, this);
}
#endif
void DirBrowser::fillRoot ()
@ -333,14 +323,9 @@ void DirBrowser::row_expanded (const Gtk::TreeModel::iterator& iter, const Gtk::
expandSuccess = true;
}
#ifdef WIN32
Glib::RefPtr<WinDirMonitor> monitor = Glib::RefPtr<WinDirMonitor>(new WinDirMonitor (iter->get_value (dtColumns.dirname), this));
iter->set_value (dtColumns.monitor, monitor);
#else
Glib::RefPtr<Gio::FileMonitor> monitor = dir->monitor_directory ();
iter->set_value (dtColumns.monitor, monitor);
monitor->signal_changed().connect (sigc::bind(sigc::mem_fun(*this, &DirBrowser::file_changed), iter, dir->get_parse_name()));
#endif
}
void DirBrowser::updateDir (const Gtk::TreeModel::iterator& iter)

View File

@ -21,16 +21,13 @@
#include <gtkmm.h>
#include <giomm.h>
#ifdef WIN32
#include "windirmonitor.h"
#endif
#include "guiutils.h"
#ifdef WIN32
#include "windows.h"
#endif
class DirBrowser : public Gtk::VBox
#ifdef WIN32
, public WinDirChangeListener
#endif
{
public:
typedef sigc::signal<void, const Glib::ustring&, const Glib::ustring&> DirSelectionSignal;
@ -45,11 +42,7 @@ private:
Gtk::TreeModelColumn<Glib::RefPtr<Gdk::Pixbuf> > icon1;
Gtk::TreeModelColumn<Glib::RefPtr<Gdk::Pixbuf> > icon2;
Gtk::TreeModelColumn<Glib::ustring> dirname;
#ifdef WIN32
Gtk::TreeModelColumn<Glib::RefPtr<WinDirMonitor> > monitor;
#else
Gtk::TreeModelColumn<Glib::RefPtr<Gio::FileMonitor> > monitor;
#endif
DirTreeColumns()
{
@ -89,7 +82,6 @@ public:
void updateVolumes ();
void updateDirTree (const Gtk::TreeModel::iterator& iter);
void updateDirTreeRoot ();
void winDirChanged () override;
private:
void addRoot (char letter);
#endif

View File

@ -459,9 +459,6 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) :
}
selectedDirectory = "";
#ifdef WIN32
wdMonitor = NULL;
#endif
}
FileCatalog::~FileCatalog()
@ -540,21 +537,10 @@ void FileCatalog::closeDir ()
exportPanel->set_sensitive (false);
}
#ifndef WIN32
if (dirMonitor) {
dirMonitor->cancel ();
}
#else
if (wdMonitor) {
delete wdMonitor;
wdMonitor = NULL;
}
#endif
// ignore old requests
++selectedDirectoryId;
@ -671,12 +657,8 @@ void FileCatalog::dirSelected (const Glib::ustring& dirname, const Glib::ustring
filepanel->loadingThumbs(M("PROGRESSBAR_LOADINGTHUMBS"), 0);
}
#ifdef WIN32
wdMonitor = new WinDirMonitor (selectedDirectory, this);
#else
dirMonitor = dir->monitor_directory ();
dirMonitor->signal_changed().connect (sigc::bind(sigc::mem_fun(*this, &FileCatalog::on_dir_changed), false));
#endif
} catch (Glib::Exception& ex) {
std::cout << ex.what();
}
@ -1748,21 +1730,6 @@ void FileCatalog::reparseDirectory ()
fileNameList = nfileNameList;
}
#ifdef WIN32
void FileCatalog::winDirChanged ()
{
const auto func = [](gpointer data) -> gboolean {
static_cast<FileCatalog*>(data)->reparseDirectory();
return FALSE;
};
idle_register.add(func, this);
}
#else
void FileCatalog::on_dir_changed (const Glib::RefPtr<Gio::File>& file, const Glib::RefPtr<Gio::File>& other_file, Gio::FileMonitorEvent event_type, bool internal)
{
@ -1777,8 +1744,6 @@ void FileCatalog::on_dir_changed (const Glib::RefPtr<Gio::File>& file, const Gli
}
}
#endif
void FileCatalog::checkAndAddFile (Glib::RefPtr<Gio::File> file)
{

View File

@ -19,9 +19,6 @@
#ifndef _FILECATALOG_
#define _FILECATALOG_
#ifdef WIN32
#include "windirmonitor.h"
#endif
#include "filebrowser.h"
#include "exiffiltersettings.h"
#include <giomm.h>
@ -48,9 +45,6 @@ class FileCatalog : public Gtk::VBox,
public FilterPanelListener,
public FileBrowserListener,
public ExportPanelListener
#ifdef WIN32
, public WinDirChangeListener
#endif
{
public:
typedef sigc::slot<void, const Glib::ustring&> DirSelectionSlot;
@ -142,11 +136,7 @@ private:
std::set<Glib::ustring> editedFiles;
guint modifierKey; // any modifiers held when rank button was pressed
#ifndef _WIN32
Glib::RefPtr<Gio::FileMonitor> dirMonitor;
#else
WinDirMonitor* wdMonitor;
#endif
IdleRegister idle_register;
@ -288,11 +278,7 @@ public:
void showToolBar();
void hideToolBar();
#ifndef _WIN32
void on_dir_changed (const Glib::RefPtr<Gio::File>& file, const Glib::RefPtr<Gio::File>& other_file, Gio::FileMonitorEvent event_type, bool internal);
#else
void winDirChanged ();
#endif
};

View File

@ -55,7 +55,7 @@ LensProfilePanel::LensProfilePanel() :
lensfunCameras(Gtk::manage((new MyComboBox()))),
lensfunLensesLbl(Gtk::manage((new Gtk::Label(M("EXIFFILTER_LENS"))))),
lensfunLenses(Gtk::manage((new MyComboBox()))),
warning(Gtk::manage((new Gtk::Image()))),
warning(Gtk::manage(new RTImage("warning.png"))),
ckbUseDist(Gtk::manage((new Gtk::CheckButton(M("TP_LENSPROFILE_USE_GEOMETRIC"))))),
ckbUseVign(Gtk::manage((new Gtk::CheckButton(M("TP_LENSPROFILE_USE_VIGNETTING"))))),
ckbUseCA(Gtk::manage((new Gtk::CheckButton(M("TP_LENSPROFILE_USE_CA")))))
@ -66,20 +66,18 @@ LensProfilePanel::LensProfilePanel() :
// Main containers:
Gtk::Frame *nodesFrame = Gtk::manage(new Gtk::Frame(M("TP_LENSPROFILE_MODE_HEADER")));
modesGrid->get_style_context()->add_class("grid-spacing");
setExpandAlignProperties(modesGrid, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER);
Gtk::Frame *distFrame = Gtk::manage(new Gtk::Frame(M("TP_LENSPROFILE_USE_HEADER")));
distGrid->get_style_context()->add_class("grid-spacing");
setExpandAlignProperties(distGrid, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER);
// Mode choice widgets:
Gtk::Label* const corrHeaderLbl = Gtk::manage(new Gtk::Label(M("TP_LENSPROFILE_MODE_HEADER")));
setExpandAlignProperties(corrHeaderLbl, true, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER);
corrUnchangedRB->hide();
corrGroup = corrUnchangedRB->get_group();
setExpandAlignProperties(corrLcpFileChooser, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER);
// Manually-selected profile widgets:
@ -106,7 +104,6 @@ LensProfilePanel::LensProfilePanel() :
lensesCellRenderer->property_ellipsize() = Pango::ELLIPSIZE_MIDDLE;
lensesCellRenderer->property_ellipsize_set() = true;
warning->set_from_icon_name("dialog-warning", Gtk::ICON_SIZE_LARGE_TOOLBAR);
warning->set_tooltip_text(M("TP_LENSPROFILE_LENS_WARNING"));
warning->hide();
@ -133,37 +130,33 @@ LensProfilePanel::LensProfilePanel() :
// Choice of properties to correct, applicable to all modes:
Gtk::Label* const useHeaderLbl = Gtk::manage(new Gtk::Label(M("TP_LENSPROFILE_USE_HEADER")));
setExpandAlignProperties(useHeaderLbl, true, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER);
// Populate modes grid:
modesGrid->attach(*corrHeaderLbl, 0, 0, 2, 1);
modesGrid->attach(*corrUnchangedRB, 0, 1, 2, 1);
modesGrid->attach(*corrOffRB, 0, 2, 2, 1);
modesGrid->attach(*corrLensfunAutoRB, 0, 3, 2, 1);
modesGrid->attach(*corrLensfunManualRB, 0, 4, 2, 1);
modesGrid->attach(*corrOffRB, 0, 0, 3, 1);
modesGrid->attach(*corrLensfunAutoRB, 0, 1, 3, 1);
modesGrid->attach(*corrLensfunManualRB, 0, 2, 3, 1);
modesGrid->attach(*lensfunCamerasLbl, 0, 5, 1, 1);
modesGrid->attach(*lensfunCameras, 1, 5, 1, 1);
modesGrid->attach(*lensfunLensesLbl, 0, 6, 1, 1);
modesGrid->attach(*lensfunLenses, 1, 6, 1, 1);
modesGrid->attach(*warning, 2, 6, 1, 1);
modesGrid->attach(*lensfunCamerasLbl, 0, 3, 1, 1);
modesGrid->attach(*lensfunCameras, 1, 3, 1, 1);
modesGrid->attach(*lensfunLensesLbl, 0, 4, 1, 1);
modesGrid->attach(*lensfunLenses, 1, 4, 1, 1);
modesGrid->attach(*warning, 2, 3, 1, 2);
modesGrid->attach(*corrLcpFileRB, 0, 7, 1, 1);
modesGrid->attach(*corrLcpFileChooser, 1, 7, 1, 1);
modesGrid->attach(*corrLcpFileRB, 0, 5, 1, 1);
modesGrid->attach(*corrLcpFileChooser, 1, 5, 1, 1);
// Populate distortions grid:
distGrid->attach(*useHeaderLbl, 0, 0, 1, 1);
distGrid->attach(*ckbUseDist, 0, 1, 1, 1);
distGrid->attach(*ckbUseVign, 0, 2, 1, 1);
distGrid->attach(*ckbUseCA, 0, 3, 1, 1);
distGrid->attach(*ckbUseDist, 0, 0, 1, 1);
distGrid->attach(*ckbUseVign, 0, 1, 1, 1);
distGrid->attach(*ckbUseCA, 0, 2, 1, 1);
// Attach grids:
pack_start(*modesGrid);
pack_start(*distGrid);
nodesFrame->add(*modesGrid);
distFrame->add(*distGrid);
pack_start(*nodesFrame, Gtk::PACK_EXPAND_WIDGET);
pack_start(*distFrame, Gtk::PACK_EXPAND_WIDGET);
// Signals:
@ -185,11 +178,7 @@ void LensProfilePanel::read(const rtengine::procparams::ProcParams* pp, const Pa
disableListener();
conUseDist.block(true);
if (!batchMode) {
corrUnchangedRB->hide();
}
corrLensfunAutoRB->set_sensitive(true);
// corrLensfunAutoRB->set_sensitive(true);
switch (pp->lensProf.lcMode) {
case procparams::LensProfParams::LcMode::LCP: {
@ -200,6 +189,9 @@ void LensProfilePanel::read(const rtengine::procparams::ProcParams* pp, const Pa
case procparams::LensProfParams::LcMode::LENSFUNAUTOMATCH: {
corrLensfunAutoRB->set_active(true);
if (batchMode) {
setManualParamsVisibility(false);
}
break;
}
@ -237,24 +229,27 @@ void LensProfilePanel::read(const rtengine::procparams::ProcParams* pp, const Pa
const LFDatabase* const db = LFDatabase::getInstance();
LFCamera c;
if (!setLensfunCamera(pp->lensProf.lfCameraMake, pp->lensProf.lfCameraModel) && !pp->lensProf.lfManual()) {
if (pp->lensProf.lfAutoMatch()) {
if (metadata) {
c = db->findCamera(metadata->getMake(), metadata->getModel());
setLensfunCamera(c.getMake(), c.getModel());
}
} else if (pp->lensProf.lfManual()) {
setLensfunCamera(pp->lensProf.lfCameraMake, pp->lensProf.lfCameraModel);
}
if (!setLensfunLens(pp->lensProf.lfLens) && !pp->lensProf.lfManual()) {
if (pp->lensProf.lfAutoMatch()) {
if (metadata) {
const LFLens l = db->findLens(c, metadata->getLens());
setLensfunLens(l.getLens());
}
} else if (pp->lensProf.lfManual()) {
setLensfunLens(pp->lensProf.lfLens);
}
lcModeChanged = lcpFileChanged = useDistChanged = useVignChanged = useCAChanged = false;
useLensfunChanged = lensfunAutoChanged = lensfunCameraChanged = lensfunLensChanged = false;
if (!batchMode && !checkLensfunCanCorrect(true)) {
/*
if (!batchMode && !checkLensfunCanCorrect(true)) {
if (corrLensfunAutoRB->get_active()) {
corrOffRB->set_active(true);
}
@ -262,16 +257,37 @@ void LensProfilePanel::read(const rtengine::procparams::ProcParams* pp, const Pa
corrLensfunAutoRB->set_sensitive(false);
}
if (corrLensfunManualRB->get_active() && !checkLensfunCanCorrect(false)) {
if (!batchMode && corrLensfunManualRB->get_active() && !checkLensfunCanCorrect(false)) {
corrOffRB->set_active(true);
}
*/
ckbUseDist->set_active(pp->lensProf.useDist);
ckbUseVign->set_active(pp->lensProf.useVign);
ckbUseCA->set_active(pp->lensProf.useCA);
if (pedited) {
corrUnchangedRB->set_active(!pedited->lensProf.lcMode);
ckbUseDist->set_inconsistent(!pedited->lensProf.useDist);
ckbUseVign->set_inconsistent(!pedited->lensProf.useVign);
ckbUseCA->set_inconsistent(!pedited->lensProf.useCA);
if (!pedited->lensProf.lfCameraMake || !pedited->lensProf.lfCameraModel) {
setLensfunCamera("", "");
}
if (!pedited->lensProf.lfLens) {
setLensfunLens("");
}
ckbUseDist->set_sensitive(true);
ckbUseVign->set_sensitive(true);
ckbUseCA->set_sensitive(true);
}
lcModeChanged = lcpFileChanged = useDistChanged = useVignChanged = useCAChanged = false;
useLensfunChanged = lensfunAutoChanged = lensfunCameraChanged = lensfunLensChanged = false;
updateLensfunWarning();
ckbUseDist->set_active(pp->lensProf.useDist);
ckbUseVign->set_active(pp->lensProf.useVign && isRaw);
ckbUseCA->set_active(pp->lensProf.useCA && isRaw && ckbUseCA->get_sensitive());
enableListener();
conUseDist.block(false);
}
@ -303,7 +319,7 @@ void LensProfilePanel::write(rtengine::procparams::ProcParams* pp, ParamsEdited*
const auto itc = lensfunCameras->get_active();
if (itc) {
if (itc && !corrLensfunAutoRB->get_active()) {
pp->lensProf.lfCameraMake = (*itc)[lf->lensfunModelCam.make];
pp->lensProf.lfCameraModel = (*itc)[lf->lensfunModelCam.model];
} else {
@ -313,7 +329,7 @@ void LensProfilePanel::write(rtengine::procparams::ProcParams* pp, ParamsEdited*
const auto itl = lensfunLenses->get_active();
if (itl) {
if (itl && !corrLensfunAutoRB->get_active()) {
pp->lensProf.lfLens = (*itl)[lf->lensfunModelLens.lens];
} else {
pp->lensProf.lfLens = "";
@ -335,7 +351,7 @@ void LensProfilePanel::write(rtengine::procparams::ProcParams* pp, ParamsEdited*
void LensProfilePanel::setRawMeta(bool raw, const rtengine::FramesMetaData* pMeta)
{
if (!raw || pMeta->getFocusDist() <= 0) {
if ((!raw || pMeta->getFocusDist() <= 0) && !batchMode) {
disableListener();
// CA is very focus layer dependent, otherwise it might even worsen things
@ -370,6 +386,10 @@ void LensProfilePanel::onLCPFileChanged()
void LensProfilePanel::onUseDistChanged()
{
useDistChanged = true;
if (ckbUseDist->get_inconsistent()) {
ckbUseDist->set_inconsistent(false);
ckbUseDist->set_active(false);
}
if (listener) {
listener->panelChanged(EvLCPUseDist, ckbUseDist->get_active() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED"));
@ -379,6 +399,10 @@ void LensProfilePanel::onUseDistChanged()
void LensProfilePanel::onUseVignChanged()
{
useVignChanged = true;
if (ckbUseVign->get_inconsistent()) {
ckbUseVign->set_inconsistent(false);
ckbUseVign->set_active(false);
}
if (listener) {
listener->panelChanged(EvLCPUseVign, ckbUseVign->get_active() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED"));
@ -388,6 +412,10 @@ void LensProfilePanel::onUseVignChanged()
void LensProfilePanel::onUseCAChanged()
{
useCAChanged = true;
if (ckbUseCA->get_inconsistent()) {
ckbUseCA->set_inconsistent(false);
ckbUseCA->set_active(false);
}
if (listener) {
listener->panelChanged(EvLCPUseCA, ckbUseCA->get_active() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED"));
@ -397,13 +425,11 @@ void LensProfilePanel::onUseCAChanged()
void LensProfilePanel::setBatchMode(bool yes)
{
FoldableToolPanel::setBatchMode(yes);
if (yes) {
corrUnchangedRB->show();
corrUnchangedRB->set_active(true);
} else {
corrUnchangedRB->hide();
}
corrUnchangedRB->set_group(corrGroup);
modesGrid->attach_next_to(*corrUnchangedRB, Gtk::POS_TOP, 3, 1);
corrUnchangedRB->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &LensProfilePanel::onCorrModeChanged), corrUnchangedRB));
corrUnchangedRB->set_active(true);
}
void LensProfilePanel::onLensfunCameraChanged()
@ -453,63 +479,73 @@ void LensProfilePanel::onCorrModeChanged(const Gtk::RadioButton* rbChanged)
Glib::ustring mode;
if (rbChanged == corrOffRB) {
lcModeChanged = true;
useLensfunChanged = true;
lensfunAutoChanged = true;
lcpFileChanged = true;
lcpFileChanged = false;
ckbUseDist->set_sensitive(false);
ckbUseVign->set_sensitive(false);
ckbUseCA->set_sensitive(false);
mode = M("GENERAL_NONE");
} else if (rbChanged == corrLensfunAutoRB) {
lcModeChanged = true;
useLensfunChanged = true;
lensfunAutoChanged = true;
lcpFileChanged = true;
useDistChanged = true;
useVignChanged = true;
lensfunCameraChanged = true;
lensfunLensChanged = true;
lcpFileChanged = false;
ckbUseDist->set_sensitive(true);
ckbUseVign->set_sensitive(true);
ckbUseCA->set_sensitive(false);
ckbUseCA->set_sensitive(true);
if (metadata) {
const bool disabled = disableListener();
const bool disabled = disableListener();
if (batchMode) {
setLensfunCamera("", "");
setLensfunLens("");
} else if (metadata) {
const LFDatabase* const db = LFDatabase::getInstance();
const LFCamera c = db->findCamera(metadata->getMake(), metadata->getModel());
const LFLens l = db->findLens(c, metadata->getLens());
setLensfunCamera(c.getMake(), c.getModel());
setLensfunLens(l.getLens());
if (disabled) {
enableListener();
}
}
if (disabled) {
enableListener();
}
mode = M("TP_LENSPROFILE_CORRECTION_AUTOMATCH");
} else if (rbChanged == corrLensfunManualRB) {
lcModeChanged = true;
useLensfunChanged = true;
lensfunAutoChanged = true;
lcpFileChanged = true;
useDistChanged = true;
useVignChanged = true;
lensfunCameraChanged = true;
lensfunLensChanged = true;
lcpFileChanged = false;
ckbUseDist->set_sensitive(true);
ckbUseVign->set_sensitive(true);
ckbUseCA->set_sensitive(false);
mode = M("TP_LENSPROFILE_CORRECTION_MANUAL");
} else if (rbChanged == corrLcpFileRB) {
lcModeChanged = true;
useLensfunChanged = true;
lensfunAutoChanged = true;
lcpFileChanged = true;
useDistChanged = true;
useVignChanged = true;
updateDisabled(true);
mode = M("TP_LENSPROFILE_CORRECTION_LCPFILE");
} else if (rbChanged == corrUnchangedRB) {
lcModeChanged = false;
useLensfunChanged = false;
lensfunAutoChanged = false;
lcpFileChanged = false;
@ -523,10 +559,9 @@ void LensProfilePanel::onCorrModeChanged(const Gtk::RadioButton* rbChanged)
mode = M("GENERAL_UNCHANGED");
}
lcModeChanged = true;
updateLensfunWarning();
if (rbChanged == corrLensfunManualRB || rbChanged == corrLensfunAutoRB) {
if (rbChanged == corrLensfunManualRB || (!batchMode && rbChanged == corrLensfunAutoRB)) {
setManualParamsVisibility(true);
} else {
setManualParamsVisibility(false);
@ -634,9 +669,11 @@ void LensProfilePanel::LFDbHelper::fillLensfunLenses()
void LensProfilePanel::updateDisabled(bool enable)
{
ckbUseDist->set_sensitive(enable);
ckbUseVign->set_sensitive(enable && isRaw);
ckbUseCA->set_sensitive(enable && allowFocusDep);
if (!batchMode) {
ckbUseDist->set_sensitive(enable);
ckbUseVign->set_sensitive(enable && isRaw);
ckbUseCA->set_sensitive(enable && allowFocusDep);
}
}
bool LensProfilePanel::setLensfunCamera(const Glib::ustring& make, const Glib::ustring& model)

View File

@ -209,27 +209,6 @@ Glib::ustring MultiLangMgr::getOSUserLanguage ()
{
Glib::ustring langName ("default");
#if defined (WIN32)
const LCID localeID = GetUserDefaultLCID ();
TCHAR localeName[18];
const int langLen = GetLocaleInfo (localeID, LOCALE_SISO639LANGNAME, localeName, 9);
if (langLen <= 0) {
return langName;
}
localeName[langLen - 1] = '-';
const int countryLen = GetLocaleInfo (localeID, LOCALE_SISO3166CTRYNAME, &localeName[langLen], 9);
if (countryLen <= 0) {
return langName;
}
langName = localeToLang (localeName);
#elif defined (__linux__) || defined (__APPLE__)
// Query the current locale and force decimal point to dot.
const char *locale = getenv("LANG");
if (locale || (locale = setlocale (LC_CTYPE, ""))) {
@ -238,7 +217,5 @@ Glib::ustring MultiLangMgr::getOSUserLanguage ()
setlocale (LC_NUMERIC, "C");
#endif
return langName;
}

View File

@ -775,7 +775,7 @@ bool MyDiagonalCurve::handleEvents (GdkEvent* event)
case GDK_MOTION_NOTIFY:
snapToElmt = -100;
if (curve.type == DCT_Linear || curve.type == DCT_Spline || curve.type == DCT_NURBS) {
if (curve.type == DCT_Linear || curve.type == DCT_Spline || curve.type == DCT_NURBS || curve.type == DCT_CatumullRom) {
snapToMinDistY = snapToMinDistX = 10.;
snapToValY = snapToValX = 0.;
@ -1026,7 +1026,7 @@ void MyDiagonalCurve::pipetteMouseOver (CurveEditor *ce, EditDataProvider *provi
double minDistanceX = double(MIN_DISTANCE) / double(graphW - 1);
if (curve.type == DCT_Linear || curve.type == DCT_Spline || curve.type == DCT_NURBS) {
if (curve.type == DCT_Linear || curve.type == DCT_Spline || curve.type == DCT_NURBS || curve.type == DCT_CatumullRom) {
// get the pointer position
getCursorPositionFromCurve(pipetteVal);
@ -1415,6 +1415,8 @@ std::vector<double> MyDiagonalCurve::getPoints ()
result.push_back (double(DCT_Spline));
} else if (curve.type == DCT_NURBS) {
result.push_back (double(DCT_NURBS));
} else if (curve.type == DCT_CatumullRom) {
result.push_back (double(DCT_CatumullRom));
}
// then we push all the points coordinate
@ -1552,6 +1554,7 @@ void MyDiagonalCurve::reset(const std::vector<double> &resetCurve, double identi
switch (curve.type) {
case DCT_Spline :
case DCT_NURBS :
case DCT_CatumullRom:
curve.x.resize(2);
curve.y.resize(2);
curve.x.at(0) = 0.;

View File

@ -34,6 +34,7 @@ enum DiagonalCurveType {
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

@ -971,11 +971,17 @@ void Options::readFromFile(Glib::ustring fname)
}
if (keyFile.has_key("File Browser", "ParseExtensions")) {
parseExtensions = keyFile.get_string_list("File Browser", "ParseExtensions");
auto l = keyFile.get_string_list("File Browser", "ParseExtensions");
if (!l.empty()) {
parseExtensions = l;
}
}
if (keyFile.has_key("File Browser", "ParseExtensionsEnabled")) {
parseExtensionsEnabled = keyFile.get_integer_list("File Browser", "ParseExtensionsEnabled");
auto l = keyFile.get_integer_list("File Browser", "ParseExtensionsEnabled");
if (!l.empty()) {
parseExtensionsEnabled = l;
}
}
if (keyFile.has_key("File Browser", "ThumbnailArrangement")) {

View File

@ -103,17 +103,18 @@ bool PopUpCommon::addEntry (const Glib::ustring& fileName, const Glib::ustring&
void PopUpCommon::entrySelected (int i)
{
// Emit a signal if the selected item has changed
if (setSelected (i))
messageChanged (selected);
if (setSelected (posToIndex(i)))
messageChanged (posToIndex(selected));
// Emit a signal in all case (i.e. propagate the signal_activate event)
messageItemSelected (selected);
messageItemSelected (posToIndex(selected));
}
void PopUpCommon::setItemSensitivity (int index, bool isSensitive) {
const auto items = menu->get_children ();
if (size_t(index) < items.size ()) {
items[size_t(index)]->set_sensitive (isSensitive);
size_t pos = indexToPos(index);
if (pos < items.size ()) {
items[pos]->set_sensitive (isSensitive);
}
}
@ -123,6 +124,8 @@ void PopUpCommon::setItemSensitivity (int index, bool isSensitive) {
*/
bool PopUpCommon::setSelected (int entryNum)
{
entryNum = indexToPos(entryNum);
if (entryNum < 0 || entryNum > ((int)images.size() - 1) || (int)entryNum == selected) {
return false;
} else {

View File

@ -75,6 +75,9 @@ private:
void showMenu(GdkEventButton* event);
protected:
virtual int posToIndex(int p) const { return p; }
virtual int indexToPos(int i) const { return i; }
void entrySelected (int i);
};
@ -96,7 +99,7 @@ inline int PopUpCommon::getEntryCount () const
inline int PopUpCommon::getSelected () const
{
return selected;
return posToIndex(selected);
}
#endif

View File

@ -268,17 +268,17 @@ Gtk::Widget* Preferences::getBatchProcPanel()
mi = behModel->append();
mi->set_value(behavColumns.label, M("TP_COLORAPP_LABEL"));
appendBehavList(mi, M("TP_COLORAPP_ADAPTSCENE"), ADDSET_CAT_ADAPTSCENE, true);
appendBehavList (mi, M("TP_COLORAPP_LABEL_SCENE") + " - " + M("TP_COLORAPP_ABSOLUTELUMINANCE"), ADDSET_CAT_ADAPTSCENE, true);
appendBehavList (mi, M("TP_COLORAPP_LABEL_VIEWING") + " - " + M("TP_COLORAPP_ABSOLUTELUMINANCE"), ADDSET_CAT_ADAPTVIEWING, true);
appendBehavList(mi, M("TP_COLORAPP_LIGHT"), ADDSET_CAT_LIGHT, true);
appendBehavList(mi, M("TP_COLORAPP_BRIGHT"), ADDSET_CAT_BRIGHT, true);
appendBehavList(mi, M("TP_COLORAPP_CHROMA"), ADDSET_CAT_CHROMA, true);
appendBehavList (mi, M ("TP_COLORAPP_CHROMA_S"), ADDSET_CAT_CHROMA_S, true);
appendBehavList (mi, M ("TP_COLORAPP_CHROMA_M"), ADDSET_CAT_CHROMA_M, true);
appendBehavList(mi, M("TP_COLORAPP_RSTPRO"), ADDSET_CAT_RSTPRO, true);
appendBehavList(mi, M("TP_COLORAPP_CONTRAST"), ADDSET_CAT_CONTRAST, true);
appendBehavList(mi, M("TP_COLORAPP_CONTRAST_Q"), ADDSET_CAT_CONTRAST_Q, true);
appendBehavList(mi, M("TP_COLORAPP_CHROMA_S"), ADDSET_CAT_CHROMA_S, true);
appendBehavList(mi, M("TP_COLORAPP_CHROMA_M"), ADDSET_CAT_CHROMA_M, true);
appendBehavList(mi, M("TP_COLORAPP_HUE"), ADDSET_CAT_HUE, true);
appendBehavList(mi, M("TP_COLORAPP_ADAPTVIEWING"), ADDSET_CAT_ADAPTVIEWING, true);
appendBehavList(mi, M("TP_COLORAPP_BADPIXSL"), ADDSET_CAT_BADPIX, true);
mi = behModel->append();
@ -1005,6 +1005,8 @@ Gtk::Widget* Preferences::getGeneralPanel()
Gtk::Label* themeLbl = Gtk::manage(new Gtk::Label(M("PREFERENCES_APPEARANCE_THEME") + ":"));
setExpandAlignProperties(themeLbl, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER);
Gtk::Label* themeRestartLbl = Gtk::manage ( new Gtk::Label (Glib::ustring (" (") + M ("PREFERENCES_APPLNEXTSTARTUP") + ")") );
setExpandAlignProperties(themeRestartLbl, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER);
themeCBT = Gtk::manage(new Gtk::ComboBoxText());
themeCBT->set_active(0);
@ -1051,7 +1053,8 @@ Gtk::Widget* Preferences::getGeneralPanel()
appearanceGrid->attach(*themeLbl, 0, 0, 1, 1);
appearanceGrid->attach(*themeCBT, 1, 0, 1, 1);
appearanceGrid->attach(*vSep, 2, 0, 1, 3);
appearanceGrid->attach(*themeRestartLbl, 2, 0, 2, 1);
appearanceGrid->attach(*vSep, 2, 1, 1, 3);
appearanceGrid->attach(*mainFontLbl, 0, 1, 1, 1);
appearanceGrid->attach(*mainFontFB, 1, 1, 1, 1);
appearanceGrid->attach(*cropMaskColorLbl, 3, 1, 1, 1);

View File

@ -168,6 +168,10 @@ PreviewLoader::PreviewLoader():
{
}
PreviewLoader::~PreviewLoader() {
delete impl_;
}
PreviewLoader* PreviewLoader::getInstance()
{
static PreviewLoader instance_;

View File

@ -82,6 +82,7 @@ public:
private:
PreviewLoader();
~PreviewLoader();
class Impl;
Impl* impl_;

View File

@ -307,8 +307,6 @@ void ProfilePanel::save_clicked (GdkEventButton* event)
do {
if (dialog.run() == Gtk::RESPONSE_OK) {
dialog.hide();
std::string fname = dialog.get_filename();
Glib::ustring ext = getExtension (fname);

View File

@ -76,6 +76,10 @@ void ThumbBrowserBase::scroll (int direction, double deltaX, double deltaY)
} else {
delta = deltaY;
}
if (direction == GDK_SCROLL_SMOOTH && delta == 0.0) {
// sometimes this case happens. To avoid scrolling the wrong direction in this case, we just do nothing
return;
}
double coef = direction == GDK_SCROLL_DOWN || (direction == GDK_SCROLL_SMOOTH && delta > 0.0) ? +1.0 : -1.0;
// GUI already acquired when here
@ -1005,9 +1009,6 @@ void ThumbBrowserBase::zoomChanged (bool zoomIn)
}
redraw ();
#ifdef WIN32
gdk_window_process_updates (get_window()->gobj(), true);
#endif
}
void ThumbBrowserBase::refreshThumbImages ()

View File

@ -183,6 +183,10 @@ ThumbImageUpdater::ThumbImageUpdater():
{
}
ThumbImageUpdater::~ThumbImageUpdater() {
delete impl_;
}
void ThumbImageUpdater::add(ThumbBrowserEntryBase* tbe, bool* priority, bool upgrade, ThumbImageUpdateListener* l)
{
// nobody listening?

View File

@ -89,6 +89,7 @@ public:
private:
ThumbImageUpdater();
~ThumbImageUpdater();
class Impl;
Impl* impl_;

View File

@ -322,7 +322,6 @@ WhiteBalance::WhiteBalance () : FoldableToolPanel(this, "whitebalance", M("TP_WB
temp = Gtk::manage (new Adjuster (M("TP_WBALANCE_TEMPERATURE"), MINTEMP, MAXTEMP, 5, CENTERTEMP, itempL, itempR, &wbSlider2Temp, &wbTemp2Slider));
green = Gtk::manage (new Adjuster (M("TP_WBALANCE_GREEN"), MINGREEN, MAXGREEN, 0.001, 1.0, igreenL, igreenR));
green->setLogScale(10, 1, true);
equal = Gtk::manage (new Adjuster (M("TP_WBALANCE_EQBLUERED"), MINEQUAL, MAXEQUAL, 0.001, 1.0, iblueredL, iblueredR));
tempBias = Gtk::manage (new Adjuster(M("TP_WBALANCE_TEMPBIAS"), -0.5, 0.5, 0.01, 0.0, itempbiasL, itempbiasR));
cache_customTemp (0);
@ -701,7 +700,6 @@ void WhiteBalance::read (const ProcParams* pp, const ParamsEdited* pedited)
set_inconsistent(multiImage && !pedited->wb.enabled);
}
green->setLogScale(10, green->getValue(), true);
methconn.block (false);
enableListener ();
@ -809,7 +807,6 @@ void WhiteBalance::setWB (int vtemp, double vgreen)
listener->panelChanged (EvWBTemp, Glib::ustring::compose("%1, %2", (int)temp->getValue(), Glib::ustring::format (std::setw(4), std::fixed, std::setprecision(3), green->getValue())));
}
green->setLogScale(10, vgreen, true);
}
void WhiteBalance::setAdjusterBehavior (bool tempadd, bool greenadd, bool equaladd, bool tempbiasadd)

View File

@ -1,109 +0,0 @@
/*
* This file is part of RawTherapee.
*
* Copyright (c) 2004-2010 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 <http://www.gnu.org/licenses/>.
*/
#include "windirmonitor.h"
#include "options.h"
static void CALLBACK current_directory_monitor_callback (DWORD error, DWORD nBytes, LPOVERLAPPED lpOverlapped)
{
DWORD dwOffset = 0;
FILE_NOTIFY_INFORMATION* pInfo = NULL;
WinDirMonitor::MonitorData* monData = (WinDirMonitor::MonitorData*)lpOverlapped;
if (!nBytes) {
delete monData;
return;
}
bool notify = false;
// Analysis of the modifications. Let only parsed file extensions emit a notify, not PP3 changes
do {
// Get a pointer to the first change record...
pInfo = (FILE_NOTIFY_INFORMATION*) &monData->file_notify_buffer[dwOffset];
char fnameC[(MAX_PATH + 1) * 2] = {0};
int strLen = WideCharToMultiByte(CP_UTF8, 0, pInfo->FileName, pInfo->FileNameLength / sizeof(WCHAR), fnameC, sizeof(fnameC), 0, 0);
fnameC[strLen] = 0;
Glib::ustring fname = fnameC;
if (options.has_retained_extention(fname)) {
notify = true;
}
// More than one change may happen at the same time. Load the next change and continue...
dwOffset += pInfo->NextEntryOffset;
} while (!notify && pInfo->NextEntryOffset != 0);
// ReadDirectoryChangesW sometimes emits multiple events per change (one for each change type)
// To make sure it's not flooding update, this gets filtered.
DWORD curTick = GetTickCount();
if (notify && monData->listener && (curTick - monData->lastTimeUpdateTick) > 500) {
monData->lastTimeUpdateTick = curTick;
monData->listener->winDirChanged ();
}
ReadDirectoryChangesW (monData->hDirectory,
monData->file_notify_buffer,
monData->buffer_allocated_bytes,
FALSE,
FILE_NOTIFY_CHANGE_FILE_NAME |
FILE_NOTIFY_CHANGE_DIR_NAME |
FILE_NOTIFY_CHANGE_LAST_WRITE,
&monData->buffer_filled_bytes,
&monData->overlapped,
current_directory_monitor_callback);
}
WinDirMonitor::WinDirMonitor (Glib::ustring dirName, WinDirChangeListener* listener) : monData(NULL)
{
wchar_t* wdirname = (wchar_t*)g_utf8_to_utf16 (dirName.c_str(), -1, NULL, NULL, NULL);
HANDLE hDirectory = CreateFileW (wdirname, FILE_LIST_DIRECTORY, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED, NULL);
g_free (wdirname);
if (hDirectory != INVALID_HANDLE_VALUE) {
monData = new MonitorData ();
monData->listener = listener;
monData->buffer_allocated_bytes = 32768;
monData->file_notify_buffer = new char [monData->buffer_allocated_bytes];
monData->hDirectory = hDirectory;
monData->lastTimeUpdateTick = GetTickCount();
ReadDirectoryChangesW (monData->hDirectory,
monData->file_notify_buffer,
monData->buffer_allocated_bytes,
FALSE,
FILE_NOTIFY_CHANGE_FILE_NAME |
FILE_NOTIFY_CHANGE_DIR_NAME |
FILE_NOTIFY_CHANGE_LAST_WRITE,
&monData->buffer_filled_bytes,
&monData->overlapped,
current_directory_monitor_callback);
}
}
WinDirMonitor::~WinDirMonitor ()
{
if (monData && monData->hDirectory != INVALID_HANDLE_VALUE) {
CloseHandle (monData->hDirectory);
}
}

View File

@ -1,57 +0,0 @@
/*
* This file is part of RawTherapee.
*
* Copyright (c) 2004-2010 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 <http://www.gnu.org/licenses/>.
*/
#ifndef _WINDIRMONITOR_
#define _WINDIRMONITOR_
#include <glibmm.h>
#include <windows.h>
class WinDirChangeListener
{
public:
virtual ~WinDirChangeListener() = default;
virtual void winDirChanged() = 0;
};
class WinDirMonitor : public Glib::Object
{
public:
struct MonitorData {
OVERLAPPED overlapped;
DWORD buffer_allocated_bytes;
char *file_notify_buffer;
DWORD buffer_filled_bytes;
HANDLE hDirectory;
WinDirChangeListener* listener;
int bigyo;
DWORD lastTimeUpdateTick; // for filtering multiple updates events
};
private:
MonitorData* monData;
public:
WinDirMonitor (Glib::ustring dirName, WinDirChangeListener* listener);
~WinDirMonitor ();
};
#endif

View File

@ -152,12 +152,18 @@ done
ditto {"${GTK_PREFIX}","${RESOURCES}"}/share/icons/Adwaita/index.theme
"${GTK_PREFIX}/bin/gtk-update-icon-cache-3.0" "${RESOURCES}/share/icons/Adwaita"
# Copy libjpeg-turbo into the app bundle
cp /opt/local/lib/libjpeg.62.dylib "${RESOURCES}/../Frameworks"
# Copy libtiff into the app bundle
cp /opt/local/lib/libtiff.5.dylib "${RESOURCES}/../Frameworks"
# Copy the Lensfun database into the app bundle
mkdir -p "${RESOURCES}/share/lensfun"
cp /opt/local/share/lensfun/version_2/* "${RESOURCES}/share/lensfun"
# Copy liblensfun to Frameworks
cp /opt/local/lib/liblensfun.1.dylib "${RESOURCES}/../Frameworks"
cp /opt/local/lib/liblensfun.2.dylib "${RESOURCES}/../Frameworks"
# Copy libiomp5 to Frameworks
cp /opt/local/lib/libomp/libiomp5.dylib "${RESOURCES}/../Frameworks"
@ -228,7 +234,7 @@ function CreateDmg {
fi
msg "Creating disk image:"
hdiutil create -format UDBZ -srcdir "${srcDir}" -volname "${PROJECT_NAME}_${PROJECT_FULL_VERSION}" "${dmg_name}.dmg"
hdiutil create -format UDBZ -fs HFS+ -srcdir "${srcDir}" -volname "${PROJECT_NAME}_${PROJECT_FULL_VERSION}" "${dmg_name}.dmg"
# Sign disk image
codesign --deep --force -v -s "${CODESIGNID}" "${dmg_name}.dmg"

View File

@ -24,7 +24,7 @@ set(PROC_TARGET_NUMBER 0 CACHE STRING "Target Processor")
# If you want to force the target processor name when PROC_TARGET_NUMBER = 0 or 2,
# uncomment the next line and replace labelWithoutQuotes by its value
#set (PROC_LABEL labelWithoutQuotes CACHE STRING "Target Processor label")
#set(PROC_LABEL labelWithoutQuotes CACHE STRING "Target Processor label")
# Important: MinGW-w64 user may need to specify the -m32 or -m64 flag in CMAKE_CXX_FLAGS,
# CMAKE_C_FLAGS and CMAKE_EXE_LINKER_FLAGS to select between 32/64bit build