Merge branch 'dev' into rt-cli

This commit is contained in:
Hombre 2017-02-14 00:15:23 +01:00
commit fe83cc8134
100 changed files with 4953 additions and 1521 deletions

View File

@ -1,53 +0,0 @@
# cmakefile executed within a makefile target
# 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)
# we look for the git command in this paths by order of preference
if (WIN32)
find_program(GIT_CMD git.exe HINTS ENV Path PATH_SUFFIXES ../)
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
find_program(GIT_CMD git)
set (SHELL "/bin/bash")
endif (WIN32)
# Fail if Git is not installed
if (GIT_CMD STREQUAL GIT_CMD-NOTFOUND)
message(FATAL_ERROR "git command not found!")
else ()
message(STATUS "git command found: ${GIT_CMD}")
endif ()
execute_process(COMMAND ${GIT_CMD} symbolic-ref --short -q HEAD OUTPUT_VARIABLE GIT_BRANCH OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}")
execute_process(COMMAND ${GIT_CMD} describe --tags --always OUTPUT_VARIABLE GIT_VERSION_WHOLE OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}")
string(REGEX REPLACE "-g.*" "" GIT_VERSION ${GIT_VERSION_WHOLE})
string(REPLACE "-" "." GIT_VERSION ${GIT_VERSION})
execute_process(COMMAND ${GIT_CMD} rev-parse --verify HEAD OUTPUT_VARIABLE GIT_CHANGESET OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}")
string(REGEX REPLACE ".*-(.*)-g.*" "\\1" GIT_TAGDISTANCE ${GIT_VERSION_WHOLE})
if (NOT DEFINED CACHE_NAME_SUFFIX)
string(REGEX REPLACE "-.*" "" CACHE_NAME_SUFFIX ${GIT_VERSION_WHOLE})
message(STATUS "CACHE_NAME_SUFFIX was not defined, it is now \"${CACHE_NAME_SUFFIX}\"")
elseif (CACHE_NAME_SUFFIX STREQUAL "latesttag")
string(REGEX REPLACE "-.*" "" CACHE_NAME_SUFFIX ${GIT_VERSION_WHOLE})
message(STATUS "CACHE_NAME_SUFFIX was \"latesttag\", it is now \"${CACHE_NAME_SUFFIX}\"")
else ()
message(STATUS "CACHE_NAME_SUFFIX is \"${CACHE_NAME_SUFFIX}\"")
endif ()
else (REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND)
include("${PROJECT_SOURCE_DIR}/ReleaseInfo.cmake")
endif (REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND)
if (VERSION_SUFFIX STREQUAL "")
set (GIT_VERSION_SUFFIX "${GIT_VERSION}")
else ()
set (GIT_VERSION_SUFFIX "${GIT_VERSION} ${VERSION_SUFFIX}")
endif ()
# build version.h from template
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")

View File

@ -1,6 +1,7 @@
Version: ${GIT_DESCRIBE}
Branch: ${GIT_BRANCH}
Version: ${GIT_VERSION_SUFFIX}
Changeset: ${GIT_CHANGESET}
Commit: ${GIT_COMMIT}
Commit date: ${GIT_COMMIT_DATE}
Compiler: ${COMPILER_INFO}
Processor: ${PROC_LABEL}
System: ${SYSTEM}
@ -11,4 +12,3 @@ Build flags: ${CXX_FLAGS}
Link flags: ${LFLAGS}
OpenMP support: ${OPTION_OMP}
MMAP support: ${WITH_MYFILE_MMAP}

View File

@ -1,21 +1,21 @@
if (WIN32)
cmake_minimum_required(VERSION 2.8.4)
cmake_minimum_required(VERSION 2.8.4)
else (WIN32)
cmake_minimum_required(VERSION 2.6)
cmake_minimum_required(VERSION 2.6)
endif (WIN32)
# 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 command line to their current version of Eclipse
#set(CMAKE_ECLIPSE_VERSION "4.6.0" CACHE STRING "Eclipse version" FORCE)
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 command line to their current version of Eclipse
#set(CMAKE_ECLIPSE_VERSION "4.6.0" CACHE STRING "Eclipse version" FORCE)
endif()
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)
@ -25,19 +25,19 @@ SET (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu11")
SET (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++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!")
message(FATAL_ERROR "Building RawTherapee requires using GCC version 4.9 or higher!")
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}")
@ -59,10 +59,10 @@ include (ProcessorTargets.cmake)
set (PROC_LABEL "undefined" CACHE STRING "Target processor label, unused if PROC_TARGET_NUMBER = 0 or 2")
set (PROC_FLAGS "" CACHE STRING "Target processor related build/link flags")
if ((NOT(PROC_TARGET_NUMBER EQUAL 0)) AND (NOT(PROC_TARGET_NUMBER EQUAL 2)))
set (PROC_LABEL ${PROC_TARGET_${PROC_TARGET_NUMBER}_LABEL})
set (PROC_LABEL ${PROC_TARGET_${PROC_TARGET_NUMBER}_LABEL})
endif ()
if (NOT(PROC_TARGET_NUMBER EQUAL 0))
set (PROC_FLAGS ${PROC_TARGET_${PROC_TARGET_NUMBER}_FLAGS})
set (PROC_FLAGS ${PROC_TARGET_${PROC_TARGET_NUMBER}_FLAGS})
endif ()
if (UNIX AND PROC_LABEL STREQUAL "undefined")
execute_process(COMMAND uname -p OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE cpu)
@ -75,7 +75,7 @@ endif ()
# if it exists, the PROC_FORCED_LABEL value is loaded in PROC_LABEL to override the one of ProcessorTargets
if (DEFINED PROC_FORCED_LABEL)
set (PROC_LABEL ${PROC_FORCED_LABEL})
set (PROC_LABEL ${PROC_FORCED_LABEL})
endif (DEFINED PROC_FORCED_LABEL)
# adding the proc flags to the build flags
@ -94,7 +94,7 @@ endif (WIN32)
if (APPLE)
if (CMAKE_CXX_COMPILER MATCHES "g\\+\\+-mp-4.[5-8]" OR
CMAKE_CXX_COMPILER_ARG1 MATCHES "g\\+\\+-mp-4.[5-8]")
CMAKE_CXX_COMPILER_ARG1 MATCHES "g\\+\\+-mp-4.[5-8]")
set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /usr/lib/libstdc++.6.dylib")
message (STATUS "CMAKE_CXX_COMPILER is MacPorts GCC.\n CMAKE_EXE_LINKER_FLAGS: ${CMAKE_EXE_LINKER_FLAGS}")
endif ()
@ -144,11 +144,11 @@ if (NOT DEFINED LIBDIR)
else (BUILD_BUNDLE)
# Respect CMAKE_INSTALL_LIBDIR if set
if (DEFINED CMAKE_INSTALL_LIBDIR)
if (IS_ABSOLUTE "${LIBDIR}")
set (LIBDIR "${CMAKE_INSTALL_LIBDIR}")
else (IS_ABSOLUTE "${LIBDIR}")
set (LIBDIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}")
endif (IS_ABSOLUTE "${LIBDIR}")
if (IS_ABSOLUTE "${LIBDIR}")
set (LIBDIR "${CMAKE_INSTALL_LIBDIR}")
else (IS_ABSOLUTE "${LIBDIR}")
set (LIBDIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}")
endif (IS_ABSOLUTE "${LIBDIR}")
else (DEFINED CMAKE_INSTALL_LIBDIR)
set (LIBDIR "${CMAKE_INSTALL_PREFIX}/lib")
endif (DEFINED CMAKE_INSTALL_LIBDIR)
@ -198,9 +198,7 @@ if (NOT DEFINED APPDATADIR)
endif (NOT DEFINED APPDATADIR)
# non-bundle builds has to use absolute paths
if (NOT BUILD_BUNDLE AND
NOT (IS_ABSOLUTE "${BINDIR}" AND IS_ABSOLUTE "${DATADIR}" AND IS_ABSOLUTE "${LIBDIR}" AND
IS_ABSOLUTE "${DOCDIR}" AND IS_ABSOLUTE "${CREDITSDIR}" AND IS_ABSOLUTE "${LICENCEDIR}"))
if (NOT BUILD_BUNDLE AND NOT (IS_ABSOLUTE "${BINDIR}" AND IS_ABSOLUTE "${DATADIR}" AND IS_ABSOLUTE "${LIBDIR}" AND IS_ABSOLUTE "${DOCDIR}" AND IS_ABSOLUTE "${CREDITSDIR}" AND IS_ABSOLUTE "${LICENCEDIR}"))
message (FATAL_ERROR "The paths has to be absolute or use -DBUILD_BUNDLE=ON")
endif ()
@ -243,7 +241,7 @@ if (WIN32)
if (MINGW)
add_definitions (-D__MINGW32__)
endif (MINGW)
if (CMAKE_SIZEOF_VOID_P EQUAL 4)
if (CMAKE_SIZEOF_VOID_P EQUAL 4)
add_definitions (-DWINVER=0x0501)
endif (CMAKE_SIZEOF_VOID_P EQUAL 4)
set (EXTRA_LIB "-lws2_32 -lshlwapi")
@ -260,12 +258,12 @@ find_package (ZLIB REQUIRED)
# link witz bzip
if (WITH_BZIP)
find_package(BZip2)
if (BZIP2_FOUND)
add_definitions (-DBZIP_SUPPORT)
set (EXTRA_INCDIR ${BZIP2_INCLUDE_DIR})
set (EXTRA_LIB ${EXTRA_LIB} ${BZIP2_LIBRARIES})
endif (BZIP2_FOUND)
find_package(BZip2)
if (BZIP2_FOUND)
add_definitions (-DBZIP_SUPPORT)
set (EXTRA_INCDIR ${BZIP2_INCLUDE_DIR})
set (EXTRA_LIB ${EXTRA_LIB} ${BZIP2_LIBRARIES})
endif (BZIP2_FOUND)
endif (WITH_BZIP)
#Check for libcanberra-gtk3 (sound events on Linux)
@ -274,7 +272,7 @@ if (UNIX AND (NOT APPLE))
endif (UNIX AND (NOT APPLE))
if (WITH_MYFILE_MMAP)
add_definitions (-DMYFILE_MMAP)
add_definitions (-DMYFILE_MMAP)
endif (WITH_MYFILE_MMAP)
if (WITH_LTO)
@ -328,26 +326,26 @@ if (OUT_OF_SOURCE_BUILD)
foreach(f ${OOSB_FILES})
if (EXISTS "${f}")
message (SEND_ERROR "Generated \"${f}\" found inside the source tree. Please remove it as it is a relic of the old build system and prevents valid compilation now.")
endif ()
endif ()
endforeach(f)
endif ()
## BEGIN: Generating AboutThisBuild.txt
## BEGIN: Create AboutThisBuild.txt and other version-dependent files.
# set the bit number information of the platform
if (CMAKE_SIZEOF_VOID_P EQUAL 4)
set(PROC_BIT_DEPTH 32 bits)
set(PROC_BIT_DEPTH 32 bits)
elseif (CMAKE_SIZEOF_VOID_P EQUAL 8)
set(PROC_BIT_DEPTH 64 bits)
set(PROC_BIT_DEPTH 64 bits)
endif (CMAKE_SIZEOF_VOID_P EQUAL 4)
# Get comiler name and version
# only cmake > 2.8.7 knows CMAKE_*_COMPILER_VERSION
if (CMAKE_VERSION VERSION_GREATER 2.8.7)
get_filename_component(COMPILER_INFO ${CMAKE_C_COMPILER} NAME_WE)
set(COMPILER_INFO "${COMPILER_INFO} ${CMAKE_C_COMPILER_VERSION}")
get_filename_component(COMPILER_INFO ${CMAKE_C_COMPILER} NAME_WE)
set(COMPILER_INFO "${COMPILER_INFO} ${CMAKE_C_COMPILER_VERSION}")
else ()
execute_process(COMMAND gcc -dumpversion OUTPUT_VARIABLE GCC_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE)
set(COMPILER_INFO "gcc ${GCC_VERSION}")
execute_process(COMMAND gcc -dumpversion OUTPUT_VARIABLE GCC_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE)
set(COMPILER_INFO "gcc ${GCC_VERSION}")
endif ()
# Get c++ and linker flags for rtengine (the gui's c++ flags may have less flags)
@ -355,38 +353,39 @@ set(CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${UPPER_CMAKE_BUILD_TYPE}} $
set(LFLAGS "${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS_${UPPER_CMAKE_BUILD_TYPE}}")
set(ABOUT_COMMAND_WITH_ARGS ${CMAKE_COMMAND}
-DPROJECT_SOURCE_DIR:STRING=${PROJECT_SOURCE_DIR}
-DCACHE_NAME_SUFFIX:STRING=${CACHE_NAME_SUFFIX}
-DPROC_LABEL:STRING="${PROC_LABEL}"
-DPROC_BIT_DEPTH:STRING="${PROC_BIT_DEPTH}"
-DBUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
-DVERSION_SUFFIX:STRING=${VERSION_SUFFIX}
-DGTKMM_VERSION:STRING=${GTKMM_VERSION}
-DOPTION_OMP:STRING=${OPTION_OMP}
-DWITH_MYFILE_MMAP:STRING=${WITH_MYFILE_MMAP})
-DPROJECT_SOURCE_DIR:STRING=${PROJECT_SOURCE_DIR}
-DCACHE_NAME_SUFFIX:STRING=${CACHE_NAME_SUFFIX}
-DPROC_LABEL:STRING="${PROC_LABEL}"
-DPROC_BIT_DEPTH:STRING="${PROC_BIT_DEPTH}"
-DBUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
-DGTKMM_VERSION:STRING=${GTKMM_VERSION}
-DOPTION_OMP:STRING=${OPTION_OMP}
-DWITH_MYFILE_MMAP:STRING=${WITH_MYFILE_MMAP})
if (WIN32)
list(APPEND ABOUT_COMMAND_WITH_ARGS -DSYSTEM:STRING=Windows
-DCXX_FLAGS:STRING="${CXX_FLAGS}"
-DLFLAGS:STRING="${LFLAGS}"
-DCOMPILER_INFO:STRING="${COMPILER_INFO}")
list(APPEND ABOUT_COMMAND_WITH_ARGS -DSYSTEM:STRING=Windows
-DCXX_FLAGS:STRING="${CXX_FLAGS}"
-DLFLAGS:STRING="${LFLAGS}"
-DCOMPILER_INFO:STRING="${COMPILER_INFO}"
-DCMAKE_INSTALL_PREFIX:STRING="${CMAKE_INSTALL_PREFIX}"
-DBIT_DEPTH:STRING="${CMAKE_SIZEOF_VOID_P}")
elseif (APPLE)
list(APPEND ABOUT_COMMAND_WITH_ARGS -DSYSTEM:STRING=Apple
-DCXX_FLAGS:STRING=${CXX_FLAGS}
-DLFLAGS:STRING=${LFLAGS}
-DCOMPILER_INFO:STRING=${COMPILER_INFO})
list(APPEND ABOUT_COMMAND_WITH_ARGS -DSYSTEM:STRING=Apple
-DCXX_FLAGS:STRING=${CXX_FLAGS}
-DLFLAGS:STRING=${LFLAGS}
-DCOMPILER_INFO:STRING=${COMPILER_INFO})
else (WIN32)
list(APPEND ABOUT_COMMAND_WITH_ARGS -DSYSTEM:STRING=Linux
-DCXX_FLAGS:STRING=${CXX_FLAGS}
-DLFLAGS:STRING=${LFLAGS}
-DCOMPILER_INFO:STRING=${COMPILER_INFO})
list(APPEND ABOUT_COMMAND_WITH_ARGS -DSYSTEM:STRING=Linux
-DCXX_FLAGS:STRING=${CXX_FLAGS}
-DLFLAGS:STRING=${LFLAGS}
-DCOMPILER_INFO:STRING=${COMPILER_INFO})
endif (WIN32)
list(APPEND ABOUT_COMMAND_WITH_ARGS -P "${PROJECT_SOURCE_DIR}/AboutThisBuild.cmake")
list(APPEND ABOUT_COMMAND_WITH_ARGS -P "${PROJECT_SOURCE_DIR}/UpdateInfo.cmake")
add_custom_target(AboutFile ALL
add_custom_target(UpdateInfo ALL
COMMAND ${ABOUT_COMMAND_WITH_ARGS}
COMMENT "Creating the about file")
COMMENT "Creating AboutThisBuild.txt and other version-dependent files")
## END: Generating AboutThisBuild.txt
@ -398,8 +397,8 @@ if (WIN32)
install (DIRECTORY "licenses" DESTINATION "${LICENCEDIR}")
endif (WIN32)
if (UNIX)
install (FILES "${PROJECT_SOURCE_DIR}/doc/manpage/rawtherapee.1" DESTINATION "${CMAKE_INSTALL_PREFIX}/share/man/man1")
install (FILES rawtherapee.appdata.xml DESTINATION "${APPDATADIR}")
install (FILES "${PROJECT_SOURCE_DIR}/doc/manpage/rawtherapee.1" DESTINATION "${CMAKE_INSTALL_PREFIX}/share/man/man1")
install (FILES rawtherapee.appdata.xml DESTINATION "${APPDATADIR}")
endif (UNIX)
add_subdirectory (rtexif)

View File

@ -40,5 +40,5 @@ http://rawpedia.rawtherapee.com/Linux
Windows:
http://rawpedia.rawtherapee.com/Windows
OS X:
macOS:
http://rawpedia.rawtherapee.com/macOS

View File

@ -1,9 +1,18 @@
RAWTHERAPEE 5 RELEASE NOTES
---------------------------
RAWTHERAPEE 5 DEVELOPMENT RELEASE NOTES
---------------------------------------
RawTherapee provides you with a selection of powerful tools with which you can practice the art of developing raw photos. Be sure to read RawPedia to understand how each tool works so that you may make the most of it.
http://rawpedia.rawtherapee.com/
A great place to start is the "Getting Started" article. Click on "Main page" in the top-left corner when you have finished reading that article to see all other articles.
This is a development version of RawTherapee. We update the code almost daily. Every few months, once enough changes have accumulated and the code is stabilized, we make a new official release. Every code change between these releases is known as a "development" version, and this is one of them.
While we only commit tested and relatively stable code and so the development versions should be fairly stable, you should be aware that:
- Development versions only had limited testing, so there may be bugs unknown to us.
- You should report these bugs so that they get fixed for the next stable release. See
www.rawpedia.rawtherapee.com/How_to_write_useful_bug_reports
- The way new tools work in the development versions is likely to change as we tweak and tune them, so your processing profiles may produce different results when used in a future stable version.
- Bugs present in the stable versions get fixed in the development versions, and make it into the next stable version when we make a new official release. That means that in some ways the development versions can be "more stable" than the latest stable release. At the same time, new features may introduce new bugs. This is a trade-off you should be aware of.
News Relevant to Photographers
------------------------------
- RawTherapee 5 supports most raw formats, including some unusual ones like those from cameras using Foveon and X-Trans sensors. If you're wondering whether it supports your camera's raw format, first download RawTherapee 5 and try for yourself. If a raw format is not supported it will either not open, or the preview in the Editor tab will appear black, white, or have a strong color cast - usually magenta. In that case, read the "Adding Support for New Raw Formats" RawPedia article.
@ -15,32 +24,18 @@ In order to use RawTherapee efficiently you should know that:
- All curves support the Shift and Ctrl keys while dragging a point. Shift+drag makes the point snap to meaningful axes (top, bottom, diagonal, other), while Ctrl+drag makes your mouse movement super-fine for precise point positioning.
- There are many keyboard shortcuts which make working with RawTherapee much faster and give you greater control. Make sure you familiarize yourself with them on RawPedia's "Keyboard Shortcuts" page!
New Features:
- Wavelets tool.
- Retinex tool.
- Monitor profile and rendering intent support.
- Print soft-proofing support.
- Automatic chroma noise reduction, manual luminance noise reduction using sliders and curves.
- The "Inspect" tab in the File Browser lets you see a 100% preview of the image whose thumbnail your mouse cursor hovers over, which is either the largest JPEG image embedded in the raw file or the image itself when hovering over non-raw images.
- The curve pipette allows you to pick the right point of a curve by clicking in the preview, and input/output values so that you can set the desired output value for a given input value.
- Post-resize sharpening, to give your photos that subtle crispness after resizing them.
- Dual-illuminant DCP support with curves, base tables, look tables and baseline exposure.
- New exposure tone curve modes "Luminance" and "Perceptual".
- Queue processing will stop if an error is encountered while saving, e.g. if you run out of disk space.
- The Contrast by Detail Levels tool received the "Process Locate Before/After Black-and-White" option.
- Rec. 2020 ICC profile added.
- The Navigator can show RGB, HSV and L*a*b* values in a range of 0-255, 0-1 or %.
- The Lockable Color Picker allows you to place multiple sample points over the preview to measure colors and see them change in real time as you manipulate the image. They support the same ranges as the Navigator.
- Grayscale JPEG and TIFF images are now supported.
- 32-bit TIFF files are supported.
- In addition to these new features, RawTherapee received over two years worth of amazing speedups, code cleanups and bug fixes, making it faster and more stable than ever before!
New features since 5.0-r1:
-
News Relevant to Package Maintainers
------------------------------------
- Branch "master" uses GTK2, branch "gtk3" requires GTK+ >=3.16.
- There are known bugs using GTK+ versions 3.20-3.22 where scrollbars may appear stuck (issue #3545) and where the Retinex tool's "Gain and Offset" panel may appear under the "Transmission" panel (issue #3525) until the user hovers the mouse cursor over a curve button. For this reason we recommend using GTK+ 3.16-3.18 if possible.
- To get the latest development version, use the "dev" branch.
- All development now uses GTK3, requiring version >=3.16. There are known bugs using GTK+ versions 3.20-3.22 where scrollbars may appear stuck (issue #3545) and where the Retinex tool's "Gain and Offset" panel may appear under the "Transmission" panel (issue #3525) until the user hovers the mouse cursor over a curve button. For this reason we recommend using GTK+ 3.16-3.18 if possible.
- GTK2 is no longer supported. Use branch "gtk2" if you want to compile a GTK2 version, but remember that there will be no improvements to it after 5.0-r1.
- Branches "master" and "gtk3" are dead, do not use them.
- RawTherapee 5 requires GCC-4.9 or higher, or Clang.
- Use -DCMAKE_CXX_FLAGS="-std=c++11"
- Do not use -ffast-math, it will not make RawTherapee faster but will introduce artifacts.
- Use -o3, it will make RawTherapee faster with no known side-effects.
- For stable builds (RT5) use -DCACHE_NAME_SUFFIX=""
- For development builds use -DCACHE_NAME_SUFFIX="5-dev"
- Windows builders should compile on a drive letter which users are most unlikely to have, such as Y:, due to the "There is no disk in the drive" error (issue #3544).
@ -51,9 +46,6 @@ News Relevant to Developers
- Code must be run through astyle.
- Commits automatically trigger a compilation using Travis CI.
Complete revision history available on GitHub:
https://github.com/Beep6581/RawTherapee/commits/
DOCUMENTATION
-------------
http://rawtherapee.com/blog/documentation

112
UpdateInfo.cmake Normal file
View File

@ -0,0 +1,112 @@
# cmakefile executed within a makefile target
# 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)
# we look for the git command in this paths by order of preference
if (WIN32)
find_program(GIT_CMD git.exe HINTS ENV Path PATH_SUFFIXES ../)
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
find_program(GIT_CMD git)
set (SHELL "/bin/bash")
endif (WIN32)
# Fail if Git is not installed
if (GIT_CMD STREQUAL GIT_CMD-NOTFOUND)
message(FATAL_ERROR "git command not found!")
else ()
message(STATUS "git command found: ${GIT_CMD}")
endif ()
# Get version description.
# Depending on whether you checked out a branch (dev) or a tag (release),
# "git describe" will return "5.0-gtk2-2-g12345678" or "5.0-gtk2", respectively.
execute_process(COMMAND ${GIT_CMD} describe --tags --always OUTPUT_VARIABLE GIT_DESCRIBE OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}")
# Get branch name.
# Will return empty if you checked out a commit or tag. Empty string handled later.
execute_process(COMMAND ${GIT_CMD} symbolic-ref --short -q HEAD OUTPUT_VARIABLE GIT_BRANCH OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}")
# Get commit hash.
execute_process(COMMAND ${GIT_CMD} rev-parse --short --verify HEAD OUTPUT_VARIABLE GIT_COMMIT OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}")
# Get commit date, YYYY-MM-DD.
execute_process(COMMAND ${GIT_CMD} show -s --format=%cd --date=format:%Y-%m-%d OUTPUT_VARIABLE GIT_COMMIT_DATE OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}")
# Get number of commits since tagging. This is what "GIT_DESCRIBE" uses.
# Works when checking out branch, tag or commit.
# Get a list of all tags in repo:
execute_process(COMMAND ${GIT_CMD} tag --merged HEAD OUTPUT_VARIABLE GIT_TAG WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}")
# Replace newlines with semicolons so that it can be split:
string(REPLACE "\n" ";" GIT_TAG_LIST "${GIT_TAG}")
execute_process(COMMAND ${GIT_CMD} rev-list --count HEAD --not ${GIT_TAG_LIST} OUTPUT_VARIABLE GIT_COMMITS_SINCE_TAG OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}")
# Get number of commits since branching.
# Works when checking out branch, tag or commit.
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}")
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 ()
string(REGEX REPLACE "-.*" "" GIT_NUMERIC_VERSION_BS ${GIT_DESCRIBE})
set(GIT_NUMERIC_VERSION_BS "${GIT_NUMERIC_VERSION_BS}.${GIT_COMMITS_SINCE_TAG}")
endif ()
message(STATUS "Git checkout information:")
message(STATUS " Commit description: ${GIT_DESCRIBE}")
message(STATUS " Branch: ${GIT_BRANCH}")
message(STATUS " Commit: ${GIT_COMMIT}")
message(STATUS " Commit date: ${GIT_COMMIT_DATE}")
message(STATUS " Commits since tag: ${GIT_COMMITS_SINCE_TAG}")
message(STATUS " Commits since branch: ${GIT_COMMITS_SINCE_BRANCH}")
message(STATUS " Version (unreliable): ${GIT_NUMERIC_VERSION_BS}")
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 ()
message(STATUS "CACHE_NAME_SUFFIX is \"${CACHE_NAME_SUFFIX}\"")
endif ()
else (REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND)
include("${PROJECT_SOURCE_DIR}/ReleaseInfo.cmake")
endif (REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND)
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 "")
# set part of the output archive name
set(SYSTEM_NAME "WinXP")
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")
# set part of the output archive name
set(SYSTEM_NAME "WinVista")
endif (BIT_DEPTH EQUAL 4)
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")
# build AboutThisBuild.txt from template
configure_file ("${PROJECT_SOURCE_DIR}/AboutThisBuild.txt.in" "${CMAKE_BINARY_DIR}/AboutThisBuild.txt")

View File

@ -27,6 +27,6 @@ include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(MACINTEGRATION DEFAULT_MSG MACINTEGRATION_LIBRARY MACINTEGRATION_INCLUDE_DIR)
IF(MACINTEGRATION_FOUND)
SET(MacIntegration_LIBRARIES ${MACINTEGRATION_LIBRARY})
SET(MacIntegration_INCLUDE_DIRS ${MACINTEGRATION_INCLUDE_DIR})
SET(MacIntegration_LIBRARIES ${MACINTEGRATION_LIBRARY})
SET(MacIntegration_INCLUDE_DIRS ${MACINTEGRATION_INCLUDE_DIR})
ENDIF(MACINTEGRATION_FOUND)

View File

@ -19,45 +19,6 @@ else (WIN32)
endif (WIN32)
if (WIN32)
if (CMAKE_SIZEOF_VOID_P 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 "")
# set part of the output archive name
set(SYSTEM_NAME "WinXP")
elseif (CMAKE_SIZEOF_VOID_P 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")
# set part of the output archive name
set(SYSTEM_NAME "WinVista")
endif (CMAKE_SIZEOF_VOID_P EQUAL 4)
# 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)
# we look for the git command in this paths by order of preference
find_file(GIT_CMD git.exe HINTS ENV Path PATH_SUFFIXES ../)
# Fail if Git is not installed
if (GIT_CMD STREQUAL GIT_CMD-NOTFOUND)
message(FATAL_ERROR "git command not found!")
else ()
message(STATUS "git command found: ${GIT_CMD}")
endif ()
execute_process(COMMAND ${GIT_CMD} describe --tags --always OUTPUT_VARIABLE GIT_VERSION_WHOLE OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}")
string(REGEX REPLACE "-.*" "" GIT_VERSION ${GIT_VERSION_WHOLE})
string(REGEX REPLACE ".*-(.*)-g.*" "\\1" GIT_TAGDISTANCE ${GIT_VERSION_WHOLE})
else (REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND)
include("${PROJECT_SOURCE_DIR}/ReleaseInfo.cmake")
endif (REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND)
configure_file ("${CMAKE_CURRENT_SOURCE_DIR}/../tools/win/InnoSetup/WindowsInnoSetup.iss.in" "${CMAKE_CURRENT_BINARY_DIR}/WindowsInnoSetup.iss")
install (FILES "${CMAKE_CURRENT_BINARY_DIR}/WindowsInnoSetup.iss" DESTINATION ${BINDIR})
endif (WIN32)
@ -88,16 +49,16 @@ install (DIRECTORY ${IMAGESDIR} DESTINATION "${DATADIR}" FILES_MATCHING PATTERN
install (FILES ${OPTIONSFILE} DESTINATION "${DATADIR}" PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ RENAME options)
if (WIN32)
install (FILES "${PROJECT_SOURCE_DIR}/doc/manpage/rawtherapee.1" DESTINATION "${CMAKE_INSTALL_PREFIX}/share/man/man1")
install (FILES "${PROJECT_SOURCE_DIR}/doc/manpage/rawtherapee.1" DESTINATION "${CMAKE_INSTALL_PREFIX}/share/man/man1")
endif (WIN32)
if (APPLE)
# CMake escapes first item quote character. Do not remove 'DUMMY_VARIABLE='.
set (MACOSX_BUNDLE_COMMAND DUMMY_VARIABLE=
PROJECT_NAME="${PROJECT_NAME}"
PROJECT_SOURCE_DIR="${PROJECT_SOURCE_DIR}"
CMAKE_BUILD_TYPE="${CMAKE_BUILD_TYPE}"
GTK_PREFIX="${GTK_PREFIX}")
PROJECT_NAME="${PROJECT_NAME}"
PROJECT_SOURCE_DIR="${PROJECT_SOURCE_DIR}"
CMAKE_BUILD_TYPE="${CMAKE_BUILD_TYPE}"
GTK_PREFIX="${GTK_PREFIX}")
if (PROC_BIT_DEPTH MATCHES 32)
list (APPEND MACOSX_BUNDLE_COMMAND PROC_BIT_DEPTH=32)
elseif (PROC_BIT_DEPTH MATCHES 64)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -21,7 +21,7 @@
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
<title
id="title5575">RawTherapee logo white font white glow</title>
id="title5575">RawTherapee Splash Screen</title>
<defs
id="defs4">
<linearGradient
@ -1384,16 +1384,16 @@
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.7607809"
inkscape:cx="184.96363"
inkscape:zoom="1.7154742"
inkscape:cx="290.94671"
inkscape:cy="103.21"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="1025"
inkscape:window-x="-8"
inkscape:window-y="-3"
inkscape:window-height="1023"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
fit-margin-top="0"
fit-margin-left="0"
@ -1403,12 +1403,63 @@
inkscape:bbox-nodes="true"
inkscape:bbox-paths="true"
inkscape:snap-page="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-edge-midpoints="false"
inkscape:snap-bbox-midpoints="true"
showborder="true"
borderlayer="false"
inkscape:showpageshadow="true"
inkscape:snap-global="false" />
inkscape:snap-global="true"
showguides="true"
inkscape:guide-bbox="true">
<sodipodi:guide
position="30,0"
orientation="1,0"
id="guide3665"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="0,321"
orientation="0,1"
id="guide3667"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="522,0"
orientation="1,0"
id="guide3669"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="0,25"
orientation="0,1"
id="guide3671"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="244.625,239.9831"
orientation="0,1"
id="guide3673" />
<sodipodi:guide
position="29.875,33.6125"
orientation="0,1"
id="guide3675" />
<sodipodi:guide
position="173.0169,189.5"
orientation="1,0"
id="guide3677" />
<sodipodi:guide
position="378.98311,131.125"
orientation="1,0"
id="guide3679" />
<sodipodi:guide
position="273,270.5"
orientation="0,1"
id="guide3687" />
<sodipodi:guide
position="54.738059,35.335001"
orientation="0,1"
id="guide4367" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
@ -1417,17 +1468,17 @@
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>RawTherapee logo white font white glow</dc:title>
<dc:title>RawTherapee Splash Screen</dc:title>
<dc:creator>
<cc:Agent>
<dc:title>RawTherapee</dc:title>
<dc:title>Morgan Hardwood</dc:title>
</cc:Agent>
</dc:creator>
<dc:subject>
<rdf:Bag>
<rdf:li>rawtherapee</rdf:li>
<rdf:li>logo</rdf:li>
<rdf:li>white</rdf:li>
<rdf:li>splash</rdf:li>
</rdf:Bag>
</dc:subject>
<dc:source>www.rawtherapee.com</dc:source>
@ -1647,40 +1698,11 @@
y="152.4408"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:OxygenSans;-inkscape-font-specification:OxygenSans;text-align:justify;text-anchor:start;fill:#ffffff;fill-opacity:1" /></flowRegion><flowPara
id="flowPara3763"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8px;font-family:OxygenSans;-inkscape-font-specification:OxygenSans;text-align:justify;text-anchor:start;fill:#ffffff;fill-opacity:1">Select the desired element and apply one of the effects in the Filter Editor. You might need to ungroup the element before applying. For example to set the RT ring to have a colorful glow, select it and enable the &quot;ring glow&quot;. You can change the flood color of the &quot;ring shadow&quot; effect to make it white if you want to make the logo usable on a dark background.</flowPara><flowPara
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8px;font-family:OxygenSans;-inkscape-font-specification:OxygenSans;text-align:justify;text-anchor:start;fill:#ffffff;fill-opacity:1">Apply glow effects using filters. You might need to ungroup the circle elements before applying. You can change the flood color of the &quot;ring shadow&quot; effect to make it white if you want to make the logo usable on a dark background.</flowPara><flowPara
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8px;font-family:OxygenSans;-inkscape-font-specification:OxygenSans;text-align:justify;text-anchor:start;fill:#ffffff;fill-opacity:1"
id="flowPara3676" /><flowPara
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8px;font-family:OxygenSans;-inkscape-font-specification:OxygenSans;text-align:justify;text-anchor:start;fill:#ffffff;fill-opacity:1"
id="flowPara3678">For logo specifics, refer to rt_logo.svg</flowPara></flowRoot> <text
sodipodi:linespacing="125%"
id="text3929-7"
y="16.646875"
x="154.37589"
style="font-size:64px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;filter:url(#filter4749);enable-background:new;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
xml:space="preserve"
transform="matrix(1.1792004,0,-0.04117843,1.1792004,-114.37084,-179.98059)"><tspan
style="font-size:69px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;letter-spacing:-3px;fill:#ffffff;fill-opacity:1;font-family:Eras-UltraBlk;-inkscape-font-specification:Eras-UltraBlk"
y="16.646875"
x="154.37589"
id="tspan3931"
sodipodi:role="line"
rotate="0 0 0 0"
dx="0">Raw</tspan></text>
<text
xml:space="preserve"
style="font-size:64px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;filter:url(#filter4749);enable-background:new;font-family:Eras-Medium;-inkscape-font-specification:Eras-Medium"
x="303.17801"
y="16.646875"
id="text3935-5"
sodipodi:linespacing="125%"
transform="matrix(1.1792004,0,-0.04117843,1.1792004,-114.37084,-179.98059)"><tspan
sodipodi:role="line"
id="tspan3937"
x="303.17801"
y="16.646875"
style="font-size:68px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;letter-spacing:4px;fill:#ffffff;fill-opacity:1;font-family:Eras-Medium;-inkscape-font-specification:Eras-Medium"
rotate="0 0 0 0 0 0 0 0 0">Therapee</tspan></text>
<flowRoot
id="flowPara4320">For logo specifics, refer to rt_logo.svg</flowPara></flowRoot> <flowRoot
transform="translate(362.47572,-12.572881)"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:125%;font-family:OxygenSans;-inkscape-font-specification:OxygenSans;text-align:justify;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none"
id="flowRoot11563"
@ -1693,19 +1715,25 @@
width="255.35268"
id="rect11567" /></flowRegion><flowPara
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8px;font-family:OxygenSans;-inkscape-font-specification:OxygenSans;text-align:justify;text-anchor:start;fill:#ffffff;fill-opacity:1"
id="flowPara11575">&quot;Raw&quot; font Eras-UltraBlk, 69px, -3px spacing between characters, skewed 2° to the right.</flowPara><flowPara
id="flowPara4343">&quot;Raw&quot;: font ITC Eras Std Ultra, appears in Inkscape as</flowPara><flowPara
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8px;font-family:OxygenSans;-inkscape-font-specification:OxygenSans;text-align:justify;text-anchor:start;fill:#ffffff;fill-opacity:1"
id="flowPara11579">&quot;Therapee&quot; font Eras-Medium, 68px, 4px spacing between characters, skewed 2° to the right.</flowPara><flowPara
id="flowPara4357"> ITC Eras Standard - Ultra-Bold,</flowPara><flowPara
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8px;font-family:OxygenSans;-inkscape-font-specification:OxygenSans;text-align:justify;text-anchor:start;fill:#ffffff;fill-opacity:1"
id="flowPara11581">Both have a dropshadow with an opacity of 0.40 and Gaussian blur standard deviation of 3.5.</flowPara><flowPara
id="flowPara4345"> 60pt, -3px spacing between characters.</flowPara><flowPara
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8px;font-family:OxygenSans;-inkscape-font-specification:OxygenSans;text-align:justify;text-anchor:start;fill:#ffffff;fill-opacity:1"
id="flowPara11591">Version number Eras bold 64 or less.</flowPara><flowPara
id="flowPara4347">&quot;Therapee&quot;: font ITC Eras Std Medium, appears in Inkscape as</flowPara><flowPara
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8px;font-family:OxygenSans;-inkscape-font-specification:OxygenSans;text-align:justify;text-anchor:start;fill:#ffffff;fill-opacity:1"
id="flowPara11585">Eras font from &quot;freefonts-0.10&quot;:</flowPara><flowPara
id="flowPara4361"> ITC Eras Standard - Medium,</flowPara><flowPara
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8px;font-family:OxygenSans;-inkscape-font-specification:OxygenSans;text-align:justify;text-anchor:start;fill:#ffffff;fill-opacity:1"
id="flowPara10541">ftp://ftp.gimp.org/pub/gimp/fonts/</flowPara></flowRoot> <text
id="flowPara4349"> 60pt, +1px spacing between characters.</flowPara><flowPara
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8px;font-family:OxygenSans;-inkscape-font-specification:OxygenSans;text-align:justify;text-anchor:start;fill:#ffffff;fill-opacity:1"
id="flowPara4351">Version: font ITC Eras Std Bold, appears in Inkscape as</flowPara><flowPara
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8px;font-family:OxygenSans;-inkscape-font-specification:OxygenSans;text-align:justify;text-anchor:start;fill:#ffffff;fill-opacity:1"
id="flowPara4365"> ITC Eras Standard - Bold,</flowPara><flowPara
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8px;font-family:OxygenSans;-inkscape-font-specification:OxygenSans;text-align:justify;text-anchor:start;fill:#ffffff;fill-opacity:1"
id="flowPara4353"> 64pt, skewed -3°.</flowPara></flowRoot> <text
xml:space="preserve"
style="font-size:6px;font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Salter;-inkscape-font-specification:Salter Medium"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:6px;line-height:125%;font-family:Salter;-inkscape-font-specification:'Salter Medium';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
x="157.31409"
y="246.19589"
id="text11593"
@ -1714,19 +1742,7 @@
id="tspan11595"
x="157.31409"
y="246.19589"
style="font-size:6px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;letter-spacing:1px;fill:#ffcc00;fill-opacity:1;font-family:OxygenSans;-inkscape-font-specification:OxygenSans">RawTherapee splash screen design version 1.0 from 2014-05-03 | www.rawtherapee.com</tspan></text>
<text
xml:space="preserve"
style="font-size:16px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:100px;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Eras-Medium;-inkscape-font-specification:Eras-Medium Bold"
x="67.395546"
y="89.97583"
id="text4743"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan4745"
x="67.395546"
y="89.97583"
style="font-size:16px;letter-spacing:1px;word-spacing:5px;fill:#ffffff;fill-opacity:1">GNU GPLv3</tspan></text>
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6px;font-family:OxygenSans;-inkscape-font-specification:OxygenSans;letter-spacing:1px;fill:#ffcc00;fill-opacity:1">RawTherapee splash screen design version 1.1 from 2017-01-28 | www.rawtherapee.com</tspan></text>
<flowRoot
xml:space="preserve"
id="flowRoot4759"
@ -1737,19 +1753,7 @@
height="102.29827"
x="-53.53928"
y="224.58057" /></flowRegion><flowPara
id="flowPara4765" /></flowRoot> <flowRoot
xml:space="preserve"
id="flowRoot10508"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:80px;line-height:125%;font-family:Eras;-inkscape-font-specification:'Eras Bold';text-align:end;letter-spacing:-0.05px;word-spacing:0px;text-anchor:end;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter10964);"
transform="translate(-32.241264,-248.35625)"><flowRegion
id="flowRegion10510"><rect
id="rect10512"
width="51.421597"
height="91.457291"
x="315.61359"
y="180.29274"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:80px;font-family:Eras;-inkscape-font-specification:'Eras Bold';fill:#ffffff;" /></flowRegion><flowPara
id="flowPara10514">5</flowPara></flowRoot> <text
id="flowPara4765" /></flowRoot> <text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:Daniel;-inkscape-font-specification:Daniel;text-align:end;letter-spacing:-0.05px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="892.45013"
@ -1760,6 +1764,56 @@
id="tspan10518"
x="892.45013"
y="-4.99089" /></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:800;font-stretch:normal;font-size:80px;line-height:125%;font-family:'ITC Eras Std';-inkscape-font-specification:'ITC Eras Std Ultra-Bold';letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter4749)"
x="61.72514"
y="-157.9659"
id="text3655"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan3657"
x="61.72514"
y="-157.9659"
style="font-size:75px;letter-spacing:-3px;word-spacing:0px"
dx="0">Raw</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:70px;line-height:125%;font-family:'ITC Eras Std';-inkscape-font-specification:'ITC Eras Std Medium';letter-spacing:1px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter4749)"
x="239.99272"
y="-157.9659"
id="text3659"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan3661"
x="239.99272"
y="-157.9659"
style="font-size:75px;letter-spacing:1px">Therapee</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:10px;line-height:125%;font-family:'ITC Eras Std';-inkscape-font-specification:'ITC Eras Std Medium';letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="65.505142"
y="87.844109"
id="text3683"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan3685"
x="65.505142"
y="87.844109"
style="font-size:15px">GNU GPLv3</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter4749)"
x="283.85016"
y="2.2370076"
id="text3689"
sodipodi:linespacing="125%"
transform="matrix(1,0,0.05240778,1,1.2558473,0)"><tspan
sodipodi:role="line"
id="tspan3691"
x="283.85016"
y="2.2370076"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:80px;font-family:'ITC Eras Std';-inkscape-font-specification:'ITC Eras Std Bold'">5</tspan></text>
</g>
<g
inkscape:groupmode="layer"

Before

Width:  |  Height:  |  Size: 67 KiB

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 KiB

After

Width:  |  Height:  |  Size: 74 KiB

View File

@ -1082,7 +1082,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh
!PREFERENCES_OUTDIRFOLDER;Save to folder
!PREFERENCES_OUTDIRFOLDERHINT;Save images to the selected folder.
!PREFERENCES_OUTDIRTEMPLATE;Use template
!PREFERENCES_OUTDIRTEMPLATEHINT;You can use the following formatting strings:\n<b>%f</b>, <b>%d1</b>, <b>%d2</b>, ..., <b>%p1</b>, <b>%p2</b>, ..., <b>%r</b>, <b>%s1</b>, <b>%s2</b>, ...\n\nThese formatting strings refer to the different parts of the photo's pathname, some attributes of the photo or an arbitrary sequence index in the batch job.\n\nFor example, if the photo being processed has the following pathname:\n<b><i>/home/tom/photos/2010-10-31/dsc0042.nef</i></b>\nthe meaning of the formatting strings are:\n<b>%d4</b> = <i>home</i>\n<b>%d3</b> = <i>tom</i>\n<b>%d2</b> = <i>photos</i>\n<b>%d1</b> = <i>2010-10-31</i>\n<b>%f</b> = <i>dsc0042</i>\n<b>%p1</b> = <i>/home/tom/photos/2010-10-31/</i>\n<b>%p2</b> = <i>/home/tom/photos/</i>\n<b>%p3</b> = <i>/home/tom/</i>\n<b>%p4</b> = <i>/home/</i>\n\n<b>%r</b> will be replaced by the rank of the photo. If the photo is unranked, %r will be replaced by '0'. If the photo is in the trash bin, %r will be replaced by 'x'.\n\n<b>%s1</b>, <b>%s2</b>, etc. will be replaced by a sequence index which is padded to between 1 and 9 digits. The sequence index will start at one each time the queue processing is started and is incremented by one for each image processed.\n\nIf you want to save the output image where the original is, write:\n<b>%p1/%f</b>\n\nIf you want to save the output image in a directory named "<i>converted</i>" located in the directory of the opened image, write:\n<b>%p1/converted/%f</b>\n\nIf you want to save the output image in a directory named "<i>/home/tom/photos/converted/2010-10-31</i>", write:\n<b>%p2/converted/%d1/%f</b>
!PREFERENCES_OUTDIRTEMPLATEHINT;You can use the following formatting strings:\n<b>%f</b>, <b>%d1</b>, <b>%d2</b>, ..., <b>%p1</b>, <b>%p2</b>, ..., <b>%r</b>, <b>%s1</b>, <b>%s2</b>, ...\n\nThese formatting strings refer to the different parts of the photo's pathname, some attributes of the photo or an arbitrary sequence index in the batch job.\n\nFor example, if the photo being processed has the following pathname:\n<b><i>/home/tom/photos/2010-10-31/dsc0042.nef</i></b>\nthe meaning of the formatting strings are:\n<b>%d4</b> = <i>home</i>\n<b>%d3</b> = <i>tom</i>\n<b>%d2</b> = <i>photos</i>\n<b>%d1</b> = <i>2010-10-31</i>\n<b>%f</b> = <i>dsc0042</i>\n<b>%p1</b> = <i>/home/tom/photos/2010-10-31/</i>\n<b>%p2</b> = <i>/home/tom/photos/</i>\n<b>%p3</b> = <i>/home/tom/</i>\n<b>%p4</b> = <i>/home/</i>\n\n<b>%r</b> will be replaced by the rank of the photo. If the photo is unranked, %r will be replaced by '0'. If the photo is in the trash bin, %r will be replaced by 'x'.\n\n<b>%s1</b>, <b>%s2</b>, etc. will be replaced by a sequence index which is padded to between 1 and 9 digits. The sequence index will start at one each time the queue processing is started and is incremented by one for each image processed.\n\nIf you want to save the output image where the original is, write:\n<b>%p1/%f</b>\n\nIf you want to save the output image in a directory named "<i>converted</i>" located in the directory of the opened image, write:\n<b>%p1/converted/%f</b>\n\nIf you want to save the output image in a directory named\n"<i>/home/tom/photos/converted/2010-10-31</i>", write:\n<b>%p2/converted/%d1/%f</b>
!PREFERENCES_OVERLAY_FILENAMES;Overlay filenames on thumbnails in the file browser
!PREFERENCES_OVERLAY_FILENAMES_FILMSTRIP;Overlay filenames on thumbnails in the editor pannel
!PREFERENCES_OVERWRITEOUTPUTFILE;Overwrite existing output files

View File

@ -1017,7 +1017,7 @@
!PREFERENCES_OUTDIRFOLDER;Save to folder
!PREFERENCES_OUTDIRFOLDERHINT;Save images to the selected folder.
!PREFERENCES_OUTDIRTEMPLATE;Use template
!PREFERENCES_OUTDIRTEMPLATEHINT;You can use the following formatting strings:\n<b>%f</b>, <b>%d1</b>, <b>%d2</b>, ..., <b>%p1</b>, <b>%p2</b>, ..., <b>%r</b>, <b>%s1</b>, <b>%s2</b>, ...\n\nThese formatting strings refer to the different parts of the photo's pathname, some attributes of the photo or an arbitrary sequence index in the batch job.\n\nFor example, if the photo being processed has the following pathname:\n<b><i>/home/tom/photos/2010-10-31/dsc0042.nef</i></b>\nthe meaning of the formatting strings are:\n<b>%d4</b> = <i>home</i>\n<b>%d3</b> = <i>tom</i>\n<b>%d2</b> = <i>photos</i>\n<b>%d1</b> = <i>2010-10-31</i>\n<b>%f</b> = <i>dsc0042</i>\n<b>%p1</b> = <i>/home/tom/photos/2010-10-31/</i>\n<b>%p2</b> = <i>/home/tom/photos/</i>\n<b>%p3</b> = <i>/home/tom/</i>\n<b>%p4</b> = <i>/home/</i>\n\n<b>%r</b> will be replaced by the rank of the photo. If the photo is unranked, %r will be replaced by '0'. If the photo is in the trash bin, %r will be replaced by 'x'.\n\n<b>%s1</b>, <b>%s2</b>, etc. will be replaced by a sequence index which is padded to between 1 and 9 digits. The sequence index will start at one each time the queue processing is started and is incremented by one for each image processed.\n\nIf you want to save the output image where the original is, write:\n<b>%p1/%f</b>\n\nIf you want to save the output image in a directory named "<i>converted</i>" located in the directory of the opened image, write:\n<b>%p1/converted/%f</b>\n\nIf you want to save the output image in a directory named "<i>/home/tom/photos/converted/2010-10-31</i>", write:\n<b>%p2/converted/%d1/%f</b>
!PREFERENCES_OUTDIRTEMPLATEHINT;You can use the following formatting strings:\n<b>%f</b>, <b>%d1</b>, <b>%d2</b>, ..., <b>%p1</b>, <b>%p2</b>, ..., <b>%r</b>, <b>%s1</b>, <b>%s2</b>, ...\n\nThese formatting strings refer to the different parts of the photo's pathname, some attributes of the photo or an arbitrary sequence index in the batch job.\n\nFor example, if the photo being processed has the following pathname:\n<b><i>/home/tom/photos/2010-10-31/dsc0042.nef</i></b>\nthe meaning of the formatting strings are:\n<b>%d4</b> = <i>home</i>\n<b>%d3</b> = <i>tom</i>\n<b>%d2</b> = <i>photos</i>\n<b>%d1</b> = <i>2010-10-31</i>\n<b>%f</b> = <i>dsc0042</i>\n<b>%p1</b> = <i>/home/tom/photos/2010-10-31/</i>\n<b>%p2</b> = <i>/home/tom/photos/</i>\n<b>%p3</b> = <i>/home/tom/</i>\n<b>%p4</b> = <i>/home/</i>\n\n<b>%r</b> will be replaced by the rank of the photo. If the photo is unranked, %r will be replaced by '0'. If the photo is in the trash bin, %r will be replaced by 'x'.\n\n<b>%s1</b>, <b>%s2</b>, etc. will be replaced by a sequence index which is padded to between 1 and 9 digits. The sequence index will start at one each time the queue processing is started and is incremented by one for each image processed.\n\nIf you want to save the output image where the original is, write:\n<b>%p1/%f</b>\n\nIf you want to save the output image in a directory named "<i>converted</i>" located in the directory of the opened image, write:\n<b>%p1/converted/%f</b>\n\nIf you want to save the output image in a directory named\n"<i>/home/tom/photos/converted/2010-10-31</i>", write:\n<b>%p2/converted/%d1/%f</b>
!PREFERENCES_OVERLAY_FILENAMES;Overlay filenames on thumbnails in the file browser
!PREFERENCES_OVERLAY_FILENAMES_FILMSTRIP;Overlay filenames on thumbnails in the editor pannel
!PREFERENCES_OVERWRITEOUTPUTFILE;Overwrite existing output files

View File

@ -36,7 +36,7 @@ CURVEEDITOR_TYPE;Type:
DIRBROWSER_FOLDERS;Répertoires
EDITWINDOW_TITLE;Édition d'image
EDIT_OBJECT_TOOLTIP;Affiche des éléments dans la fenêtre de prévisualisation qui vous permettront d'ajuster cet outil.
EDIT_PIPETTE_TOOLTIP;Pour ajouter un point d'ajustement de la courbe, maintenez la touche Ctrl préssée et cliquez dans l'image avec le bouton gauche.\nPour ajuster le point, pressez la touche Ctrl lors du clic-gauche sur la zone correspondande dans l'apperçu, puis relachez Ctrl (sauf si vous désirez un control plus fin) et tout en gardant le bouton gauche appuyé, déplacez le curseur vers le haut ou le bas pour ajuster la position du point.
EDIT_PIPETTE_TOOLTIP;Pour ajouter un point d'ajustement de la courbe, maintenez la touche Ctrl pressée et cliquez dans l'image avec le bouton gauche.\nPour ajuster le point, pressez la touche Ctrl lors du clic-gauche sur la zone correspondante dans l'aperçu, puis relachez Ctrl (sauf si vous désirez un contrôle plus fin) et tout en gardant le bouton gauche appuyé, déplacez le curseur vers le haut ou le bas pour ajuster la position du point.
EXIFFILTER_APERTURE;Ouverture
EXIFFILTER_CAMERA;Appareil photo
EXIFFILTER_EXPOSURECOMPENSATION;Compensation d'exposition (EV)
@ -79,7 +79,7 @@ EXPORT_BYPASS_SHARPENING;Ignorer la netteté
EXPORT_BYPASS_SHARPENMICRO;Ignorer netteté des microcontrastes
EXPORT_BYPASS_SH_HQ;Ignorer Ombres/Hautes lumières (HQ)
EXPORT_FASTEXPORTOPTIONS;<b>Options d'Export Rapide</b>
EXPORT_INSTRUCTIONS;Les options d'Export Rapide permettent de forcer des paramètres afin d'éviter d'utiliser des outils très consommateur de temps et de ressources, et d'utiliser ces options dans la file de traitement. Cette méthode est recommandée pour la génération rapide d'images de basse résolution quand la vitesse est une priorité ou lorsqu'on désir une version redimensionnée d'une ou plusieurs images de sortie sans avoir à modifier leurs paramètres de développement.
EXPORT_INSTRUCTIONS;Les options d'Export Rapide permettent de forcer des paramètres afin d'éviter d'utiliser des outils très consommateurs de temps et de ressources, et d'utiliser ces options dans la file de traitement. Cette méthode est recommandée pour la génération rapide d'images de basse résolution quand la vitesse est une priorité ou lorsqu'on désire une version redimensionnée d'une ou plusieurs images de sortie sans avoir à modifier leurs paramètres de développement.
EXPORT_MAXHEIGHT;Hauteur maximum:
EXPORT_MAXWIDTH;Largeur maximum:
EXPORT_PUTTOQUEUEFAST;Mettre dans la file de traitement\npour Export Rapide

View File

@ -1016,7 +1016,7 @@ PREFERENCES_OUTDIR;Output Directory
PREFERENCES_OUTDIRFOLDER;Save to folder
PREFERENCES_OUTDIRFOLDERHINT;Save images to the selected folder.
PREFERENCES_OUTDIRTEMPLATE;Use template
PREFERENCES_OUTDIRTEMPLATEHINT;You can use the following formatting strings:\n<b>%f</b>, <b>%d1</b>, <b>%d2</b>, ..., <b>%p1</b>, <b>%p2</b>, ..., <b>%r</b>, <b>%s1</b>, <b>%s2</b>, ...\n\nThese formatting strings refer to the different parts of the photo's pathname, some attributes of the photo or an arbitrary sequence index in the batch job.\n\nFor example, if the photo being processed has the following pathname:\n<b><i>/home/tom/photos/2010-10-31/dsc0042.nef</i></b>\nthe meaning of the formatting strings are:\n<b>%d4</b> = <i>home</i>\n<b>%d3</b> = <i>tom</i>\n<b>%d2</b> = <i>photos</i>\n<b>%d1</b> = <i>2010-10-31</i>\n<b>%f</b> = <i>dsc0042</i>\n<b>%p1</b> = <i>/home/tom/photos/2010-10-31/</i>\n<b>%p2</b> = <i>/home/tom/photos/</i>\n<b>%p3</b> = <i>/home/tom/</i>\n<b>%p4</b> = <i>/home/</i>\n\n<b>%r</b> will be replaced by the rank of the photo. If the photo is unranked, %r will be replaced by '0'. If the photo is in the trash bin, %r will be replaced by 'x'.\n\n<b>%s1</b>, <b>%s2</b>, etc. will be replaced by a sequence index which is padded to between 1 and 9 digits. The sequence index will start at one each time the queue processing is started and is incremented by one for each image processed.\n\nIf you want to save the output image where the original is, write:\n<b>%p1/%f</b>\n\nIf you want to save the output image in a directory named "<i>converted</i>" located in the directory of the opened image, write:\n<b>%p1/converted/%f</b>\n\nIf you want to save the output image in a directory named "<i>/home/tom/photos/converted/2010-10-31</i>", write:\n<b>%p2/converted/%d1/%f</b>
PREFERENCES_OUTDIRTEMPLATEHINT;You can use the following formatting strings:\n<b>%f</b>, <b>%d1</b>, <b>%d2</b>, ..., <b>%p1</b>, <b>%p2</b>, ..., <b>%r</b>, <b>%s1</b>, <b>%s2</b>, ...\n\nThese formatting strings refer to the different parts of the photo's pathname, some attributes of the photo or an arbitrary sequence index in the batch job.\n\nFor example, if the photo being processed has the following pathname:\n<b><i>/home/tom/photos/2010-10-31/dsc0042.nef</i></b>\nthe meaning of the formatting strings are:\n<b>%d4</b> = <i>home</i>\n<b>%d3</b> = <i>tom</i>\n<b>%d2</b> = <i>photos</i>\n<b>%d1</b> = <i>2010-10-31</i>\n<b>%f</b> = <i>dsc0042</i>\n<b>%p1</b> = <i>/home/tom/photos/2010-10-31/</i>\n<b>%p2</b> = <i>/home/tom/photos/</i>\n<b>%p3</b> = <i>/home/tom/</i>\n<b>%p4</b> = <i>/home/</i>\n\n<b>%r</b> will be replaced by the rank of the photo. If the photo is unranked, %r will be replaced by '0'. If the photo is in the trash bin, %r will be replaced by 'x'.\n\n<b>%s1</b>, <b>%s2</b>, etc. will be replaced by a sequence index which is padded to between 1 and 9 digits. The sequence index will start at one each time the queue processing is started and is incremented by one for each image processed.\n\nIf you want to save the output image where the original is, write:\n<b>%p1/%f</b>\n\nIf you want to save the output image in a directory named "<i>converted</i>" located in the directory of the opened image, write:\n<b>%p1/converted/%f</b>\n\nIf you want to save the output image in a directory named\n"<i>/home/tom/photos/converted/2010-10-31</i>", write:\n<b>%p2/converted/%d1/%f</b>
PREFERENCES_OVERLAY_FILENAMES;Overlay filenames on thumbnails in the file browser
PREFERENCES_OVERLAY_FILENAMES_FILMSTRIP;Overlay filenames on thumbnails in the editor pannel
PREFERENCES_OVERWRITEOUTPUTFILE;Overwrite existing output files

View File

@ -2,7 +2,7 @@
This file is part of RawTherapee.
Copyright (c) 2016-2017 TooWaBoo
Version 2.40 - requires RT 5.0
Version 2.42 - requires RT 5.0
RawTherapee is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -69,7 +69,6 @@
outline-style: none; /* removes the ugly dashed focus line */
border-image: none;
transition: none;
/* -gtk-dpi: 120; */
}
*:disabled {
@ -77,10 +76,10 @@
}
#ToolPanelNotebook {
min-width: 23em
min-width: 23em;
}
#HistoryPanel {
min-width: 17.83333em
min-width: 17.83334em;
}
window.background {
@ -107,7 +106,7 @@ messagedialog {
tooltip {
background-color: @bg-tooltip;
border: 1px solid @border-tooltip;
border-radius: 0.33333em;
border-radius: 0.33334em;
padding: 0;
margin: 0;
box-shadow: none;
@ -205,7 +204,7 @@ dialog frame > label {
padding: 0.16667em 0.5em;
}
#BatchQueueButtonsMainContainer frame > border {
margin-bottom: 0.8334em;
margin-bottom: 0.83334em;
}
#BatchQueueButtonsMainContainer frame:nth-child(3) > border {
padding-left: 0.91667em;
@ -232,10 +231,6 @@ textview.view, treeview.view {
padding: 0.16667em;
margin: 0;
}
#RightNotebook > stack > :nth-child(3) treeview {
border: 1px solid @bg-dark-grey;
border-bottom: none;
}
textview:hover, treeview:hover {
background-color: @bg-list-hover;
}
@ -245,8 +240,13 @@ textview:selected, treeview:selected {
border-top-color: transparent;
}
#RightNotebook > stack > :nth-child(3) treeview {
border: 1px solid @bg-dark-grey;
border-bottom: none;
}
#PlacesPaned > :nth-child(1) treeview {
padding: 0.0834em 0 0.0834em 0.5em;
padding: 0.08334em 0 0.08334em 0.5em;
-gtk-icon-style: symbolic;
}
@ -257,7 +257,7 @@ textview:selected, treeview:selected {
margin-top: 1.75em;
}
#HistoryPanel > label {
margin: 0 0 -1.3334em 0;
margin: 0 0 -1.33334em 0;
padding: 0;
}
@ -285,7 +285,7 @@ textview:selected, treeview:selected {
/*Corrects the space for the snapshot view of the paned separator*/
#Snapshots {
margin-top: -0.3334em;
margin-top: -0.33334em;
}
/**/
@ -381,7 +381,7 @@ filechooser list row:selected {
border-radius: 0;
}
#fullButton {
padding: 0.47em 0.41667em 0.58333em;
padding: 0.47em 0.41667em 0.58334em;
}
#EditorLeftPaned #fullButton,
#EditorLeftPaned #histButton {
@ -433,7 +433,7 @@ paned.vertical > separator {
dialog paned.horizontal > separator {
background-color: @bg-grey;
border-color: @bg-grey;
min-width: 0.33333em;
min-width: 0.33334em;
}
menu separator {
@ -451,13 +451,13 @@ menu separator {
#IopsPanel separator,
#FileBrowser separator {
background-color: shade(@bg-light-grey,.75);
margin-top: 0.33333em;
margin-bottom: 0.33333em;
margin-top: 0.33334em;
margin-bottom: 0.33334em;
}
#MyExpander separator {
background-color: shade(@bg-grey,.7);
margin: 0.33333em 0.66667em;
margin: 0.33334em 0.66667em;
}
#PlacesPaned .view.separator {
@ -474,7 +474,7 @@ menu separator {
}
#PartialPaste separator.vertical {
margin: 0 0.33333em;
margin: 0 0.33334em;
padding: 0;
}
@ -498,7 +498,7 @@ menu separator {
/*** Scrollbar *********************************************************************************/
scrollbar {
background-color: rgba(0,0,0,.45);
background-color: rgba(0,0,0,.40);
border: none;
margin: 0;
padding: 0;
@ -542,7 +542,7 @@ scrollbar.horizontal.hovering.fine-tune slider {
scrollbar.horizontal.overlay-indicator:not(.hovering) slider {
min-width: 2em;
min-height: 0.25em;
border-width: 0.0834em;
border-width: 0.08334em;
border-radius: 0.25em;
margin: 0 0.16667em;
}
@ -562,7 +562,7 @@ scrollbar.vertical.hovering.fine-tune slider {
scrollbar.vertical.overlay-indicator:not(.hovering) slider {
min-width: 0.25em;
min-height: 2em;
border-width: 0.0834em;
border-width: 0.08334em;
border-radius: 0.5em;
margin: 0.16667em 0;
}
@ -573,11 +573,8 @@ scrollbar slider:hover {
}
/* Scrollbar stuck workaround */
scrollbar:not(.overlay-indicator).horizontal:hover slider {
min-width: calc(2em - 0.0001px);
}
scrollbar:not(.overlay-indicator).vertical:hover slider {
min-height: calc(2em - 0.0001px);
scrollbar:not(.overlay-indicator):hover {
min-width: 1px;
}
/*** end ***************************************************************************************/
@ -585,7 +582,7 @@ scrollbar:not(.overlay-indicator).vertical:hover slider {
/*** Scale**************************************************************************************/
scale {
padding: 0;
min-height: 1.83333em;
min-height: 1.83334em;
margin: 0 0.25em;
}
@ -593,8 +590,8 @@ scale slider {
/* Slider size is min-width x min-height; margin have to be half of those values, but negative */
min-width: 1em;
min-height: 1em;
margin: calc(-0.3334em - 1px);
border-radius: 0.83333em;
margin: calc(-0.33334em - 1px);
border-radius: 0.83334em;
background-image: linear-gradient(to bottom, shade (@accent-color4,1.15), shade (@accent-color4,.85));
border: 1px solid @bg-dark-grey;
box-shadow: none;
@ -637,12 +634,10 @@ scale:disabled trough {
/*** Progressbar *******************************************************************************/
progressbar.vertical {
min-width: 0;
margin-right: 0.58333em;
min-height: 9em;
}
progressbar.vertical text {
color: transparent;
margin-right: -0.83333em;
min-width: 0;
}
progressbar.vertical trough {
@ -663,7 +658,7 @@ progressbar.horizontal trough {
background-color: transparent;
border: none;
border-radius: 0.5em;
margin-top: 0.58333em;
margin-top: 0.58334em;
}
progressbar.horizontal trough progress {
min-height: 0.41667em;
@ -716,25 +711,25 @@ notebook tabs {
notebook header tab {
background-color: transparent;
margin: 0.41667em 0.25em;
padding: 0 0.3334em;
padding: 0 0.33334em;
}
notebook header.left tab {
margin: 0.25em 0.41667em;
padding: 0.3334em 0;
padding: 0.33334em 0;
}
notebook header tab > grid > image {
min-height: 2.33333em;
min-height: 2.33334em;
min-width: 0;
padding: 0 0.16667em 0 0;
margin: 0;
}
notebook header.left tab > grid > image {
min-height: 0;
min-width: 2.33333em;
min-width: 2.33334em;
padding: 0.16667em 0 0;
}
notebook header tab label {
margin: 0.33333em;
margin: 0.33334em;
}
notebook header tab:hover label {
color: @headline-hl;
@ -747,7 +742,7 @@ notebook header.left tab:checked {
}
notebook > header > tabs > arrow {
background-color: transparent;
border-radius: 0.16667em;
border-radius: 0.2em;
min-width: 0;
min-height: 0;
padding: 0 0.16667em;
@ -776,7 +771,7 @@ dialog notebook stack {
padding: 0.41667em;
}
#MainNotebook > stack > :nth-child(2) > :nth-child(2) {
margin-bottom: 0.3334em;
margin-bottom: 0.33334em;
}
@ -784,17 +779,17 @@ dialog notebook stack {
dialog.csd #PrefNotebook > header,
dialog.csd #AboutNotebook > header,
window.csd:not(.fullscreen) #MainNotebook > header.top {
border-top: 0.083333em solid rgba(200,200,200,.18);
border-top: 0.083334em solid rgba(200,200,200,.18);
}
/**/
#ToolPanelNotebook > header tabs {
margin-bottom: 0.33333em;
margin-bottom: 0.33334em;
}
#ToolPanelNotebook > header tab image{
min-height: 2.5em;
min-width: 2em;
min-width: calc(1.66667em + 6px);
padding: 0;
margin: 0;
}
@ -813,7 +808,7 @@ window.csd:not(.fullscreen) #MainNotebook > header.top {
}
#PrefNotebook header {
margin: -0.66667em -0.66667em 0.3334em;
margin: -0.66667em -0.66667em 0.33334em;
}
#AboutNotebook header {
margin: -0.66667em -0.66667em 0.66667em;
@ -827,14 +822,15 @@ window.csd:not(.fullscreen) #MainNotebook > header.top {
#MetaPanelNotebook header {
background-color: @bg-grey;
padding: 0.33333em;
padding: 0.33334em;
margin: 0 0.5em 0;
}
#MetaPanelNotebook > header > tabs {
background-color: @bg-dark-grey;
padding-left: 0.33334em;
}
#MetaPanelNotebook > header > tab {
background-color: @bg-dark-grey;
#MetaPanelNotebook > header tab label{
margin: 0.08334em;
}
#MetaPanelNotebook > stack > box {
@ -842,11 +838,11 @@ window.csd:not(.fullscreen) #MainNotebook > header.top {
background-color: @bg-grey;
border-radius: 0;
border-top-style: none;
padding: 0 0.33333em 0.25em;
padding: 0 0.33334em 0.25em;
margin: 0 0.5em -0.5em;
}
#MetaPanelNotebook > stack > box:nth-child(1) > scrolledwindow {
margin: 0 0 0.33333em;
margin: 0 0 0.33334em;
padding: 0;
}
@ -862,10 +858,10 @@ window.csd:not(.fullscreen) #MainNotebook > header.top {
margin-top: 0;
margin-bottom: 0;
min-height: 1.66667em;
min-width: 0.83333em;
min-width: 0.83334em;
}
#MetaPanelNotebook entry {
padding: 0 0.33333em;
padding: 0 0.33334em;
background-color: @bg-dark-grey;
margin: 0;
border-radius: 0;
@ -883,7 +879,7 @@ window.csd:not(.fullscreen) #MainNotebook > header.top {
}
#MetaPanelNotebook textview.view {
background-color: @bg-dark-grey;
padding: 0.08333em 0.33333em;
padding: 0.08334em 0.33334em;
margin: 0;
}
#MetaPanelNotebook text {
@ -904,7 +900,7 @@ window.csd:not(.fullscreen) #MainNotebook > header.top {
}
#MetaPanelNotebook label {
padding: 0.0834em 0;
padding: 0.08334em 0;
}
/*** end ***************************************************************************************/
@ -934,7 +930,7 @@ window.csd:not(.fullscreen) #MainNotebook > header.top {
#ToolBarPanelFileBrowser > box > button,
#ToolBarPanelFileBrowser > button {
margin: 0 0.0834em;
margin: 0 0.08334em;
}
#ToolBarPanelFileBrowser > box > box > button {
min-height: 0.91667em;
@ -952,7 +948,7 @@ window.csd:not(.fullscreen) #MainNotebook > header.top {
min-height: 1.66667em;
min-width: 1.66667em;
margin: 0 0 0 -1.66667em;
border-radius: 0 0.16667em 0.16667em 0;
border-radius: 0 0.2em 0.2em 0;
border: 1px solid transparent;
padding: 0;
}
@ -961,11 +957,11 @@ window.csd:not(.fullscreen) #MainNotebook > header.top {
min-height: 1.66667em;
min-width: 12em;
margin: 0 -2px 0 0;
padding: 0 2em 0 0.33333em;
padding: 0 2em 0 0.33334em;
}
#ToolBarPanelFileBrowser label,
#FileBrowser label {
margin: 0 0.33333em 0 0.5em;
margin: 0 0.33334em 0 0.5em;
}
/*** end ***************************************************************************************/
@ -1005,8 +1001,8 @@ window.csd:not(.fullscreen) #MainNotebook > header.top {
#BeforeAfterContainer button {
min-height: 1.66667em;
min-width: 1.66667em;
margin: 0.25em 0 0.3334em;
padding: 0 0 0 0.0834em;
margin: 0.25em 0 0.33334em;
padding: 0 0 0 0.08334em;
}
/**/
@ -1016,7 +1012,7 @@ window.csd:not(.fullscreen) #MainNotebook > header.top {
min-height: 0;
}
#EditorTopPanel button {
margin: 0 0.0834em;
margin: 0 0.08334em;
min-height: 2.16667em;
min-width: 2.16667em;
}
@ -1027,14 +1023,14 @@ window.csd:not(.fullscreen) #MainNotebook > header.top {
#EditorTopPanel > box > button.image-button:not(:nth-child(6)) {
min-width: 0;
padding-left: 0.33333em;
padding-right: 0.33333em;
padding-left: 0.33334em;
padding-right: 0.33334em;
}
#EditorTopPanel > box > button.image-button:nth-child(6) {
-gtk-icon-shadow: none;
}
#EditorTopPanel > box > box > button {
min-height: 0.64em;
min-height: 0.625em;
min-width: 0;
margin: 0 0.16667em;
padding: 0 0.16667em;
@ -1052,7 +1048,7 @@ window.csd:not(.fullscreen) #MainNotebook > header.top {
#EditorTopPanel > box > box > button:checked {
background-color: transparent;
background-image: none;
border: 1px solid @bg-dark-grey;
border: 1px solid @bg-button-border;
box-shadow: none;
}
@ -1065,8 +1061,8 @@ window.csd:not(.fullscreen) #MainNotebook > header.top {
padding: 0 2px 0 3px;
}
#EditorZoomPanel button {
margin-left: 0.0834em;
margin-right: 0.0834em;
margin-left: 0.08334em;
margin-right: 0.08334em;
}
/*** end ***************************************************************************************/
@ -1126,7 +1122,7 @@ window.csd:not(.fullscreen) #MainNotebook > header.top {
#MyExpanderTitle > box {
margin: 0;
padding: 0.33333em 0;
padding: 0.33334em 0;
}
#MyExpanderTitle label {
@ -1167,7 +1163,7 @@ menu > .bottom:hover {
}
menuitem {
padding: 0 0.33333em;
padding: 0 0.33334em;
margin: 1px;
min-height: 2em;
}
@ -1182,7 +1178,7 @@ menuitem:hover > * {
menu image {
min-height: 2em;
padding: 0;
margin: 0 0.33333em 0 0;
margin: 0 0.33334em 0 0;
}
/*** Selection popup list (used in filechooser) ***/
@ -1239,7 +1235,7 @@ button {
min-width: 2.16667em;
margin: 0;
padding: 0; /* x */
border-radius: 0.16667em;
border-radius: 0.2em;
border: 1px solid @bg-button-border;
background-color: transparent;
box-shadow: inset 0 1px rgba(242, 242, 242, 0.1);
@ -1262,19 +1258,19 @@ button.flat {
/* Resetbutton Queue & Save as*/
dialog scale + button.flat,
scale + button.flat {
min-height: 1.33333em;
min-height: 1.33334em;
min-width: 1.25em;
margin: 0.25em 0 0.16667em 0.16667em;
padding: 0 0 0 0.0834em;
padding: 0 0 0 0.08334em;
-gtk-icon-shadow: none;
}
/* Resetbutton */
#MyExpander button.flat {
min-height: 1.33333em;
min-height: 1.33334em;
min-width: 1.25em;
margin: 0.08333em 0 0.08333em 0.16667em;
padding: 0 0 0 0.0834em;
margin: 0.08334em 0 0.08334em 0.16667em;
padding: 0 0 0 0.08334em;
-gtk-icon-shadow: none;
}
@ -1286,7 +1282,7 @@ scale + button.flat {
}
#MyExpander spinbutton + button.flat {
margin: 0 0 0 0.16667em;
padding-top: 0.08333em;
padding-top: 0.08334em;
}
/**/
@ -1295,7 +1291,7 @@ scale + button.flat {
#MyExpander button.flat:first-child {
min-height: 2.16667em;
min-width: 2.16667em;
margin: 0.08333em;
margin: 0.08334em;
padding: 0;
}
/**/
@ -1304,7 +1300,7 @@ scale + button.flat {
#FileBrowser entry + button:hover,
button.flat:hover,
button:hover {
border: 1px solid @bg-button-border;
border-color: @bg-button-border;
box-shadow: inset 0 1px rgba(242, 242, 242, 0.1);
background-image: linear-gradient(to bottom, rgba(100,100,100,.3), rgba(30,30,30,.3));
background-color: @bg-button-hover;
@ -1316,8 +1312,8 @@ button.flat:active,
button.flat:checked,
button:active,
button:checked {
border-color: black;
box-shadow: inset 0 1px rgba(242, 242, 242, 0.1);
border-color: @bg-button-border;
box-shadow: inset 0 1px rgba(242, 242, 242, 0.08);
background-image: linear-gradient(to bottom, rgba(100,100,100,.3), rgba(30,30,30,.3));
background-color: @bg-button-active;
}
@ -1333,7 +1329,7 @@ button.MiddleH {
/* Applies special styles in main notebook */
#ProfilePanel {
margin-bottom: -2px;
padding-bottom: 0.41667em
padding-bottom: 0.41667em;
}
#ProfilePanel combobox {
margin-left: 0.16667em;
@ -1359,7 +1355,7 @@ combobox .combo,
dialog combobox .combo,
#ToolPanelNotebook combobox .combo,
#BatchQueueButtonsMainContainer combobox .combo {
padding: 0 0.20833em;
padding: 0 0.208334em;
}
/**/
@ -1377,7 +1373,7 @@ dialog combobox .combo,
#MyExpander label + * > button:not(.flat).Left,
#MyExpander label + combobox:not(:first-child):not(:only-child),
#MyExpander label + button:not(.flat):not(spinbutton) {
margin-left: 0.33333em;
margin-left: 0.33334em;
}
/* Arrow toggle combo button */
@ -1385,8 +1381,8 @@ dialog combobox .combo,
#MyExpander button:not(.flat).Left + button:not(.flat).Right {
border-left: none;
margin-left: 0;
padding-left: 0.33333em;
padding-right: 0.33333em;
padding-left: 0.33334em;
padding-right: 0.33334em;
border-top-left-radius: 0;
border-bottom-left-radius: 0;
}
@ -1394,7 +1390,7 @@ dialog combobox .combo,
#MyExpander button:not(.flat).Left {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
min-width: 2.33333em;
min-width: 2.16667em;
}
/**/
@ -1402,8 +1398,8 @@ dialog combobox .combo,
#PrefNotebook stack > box:nth-child(4) combobox,
#MyExpander button.flat,
#MyExpander button {
margin-top: 0.115em;
margin-bottom: 0.115em;
margin-top: 0.08334em;
margin-bottom: 0.08334em;
}
/**/
#MyExpander button.text-button label {
@ -1429,11 +1425,11 @@ button.color {
/* Save, Cancel, OK ... buttons */
.dialog-action-area button {
min-height: 2.16667em;
margin-top: 0.33333em;
margin-top: 0.33334em;
}
messagedialog .dialog-action-area button {
margin: 0 0.66667em 0.66667em 0.66667em;
min-height: 1.83333em;
min-height: 1.83334em;
}
messagedialog .dialog-action-area button:not(:only-child):nth-child(1) {
margin-right: 0.25em;
@ -1457,7 +1453,8 @@ window .view button {
background-image: none;
box-shadow: none;
min-height: 2em;
padding: 0 0.33333em;
min-width: 1.33334em;
padding: 0 0.33334em;
}
dialog .view button.text-button label,
window .view button.text-button label {
@ -1497,22 +1494,22 @@ window .view header button,
padding: 0;
}
.path-bar button:first-child {
border-top-left-radius: 0.16667em;
border-bottom-left-radius: 0.16667em;
border-top-left-radius: 0.2em;
border-bottom-left-radius: 0.2em;
min-width: 2em;
margin: 0;
padding: 0;
}
.path-bar button:last-child {
border-top-right-radius: 0.16667em;
border-bottom-right-radius: 0.16667em;
border-top-right-radius: 0.2em;
border-bottom-right-radius: 0.2em;
min-width: 2em;
margin: 0;
padding: 0;
}
.path-bar button label {
margin: 0;
padding: 0 0.33333em;
padding: 0 0.33334em;
}
/**/
@ -1560,13 +1557,13 @@ headerbar button.titlebutton image {
margin: 0;
}
headerbar button.titlebutton {
margin: 0 0 0 0.33333em;
margin: 0 0 0 0.33334em;
background-image: none;
border: 1px solid transparent;
background-color: transparent;
box-shadow: none;
min-width: 1.5em;
min-height: 1.5em;
min-width: 1.55em;
min-height: 1.55em;
padding: 0;
}
messagedialog headerbar button.titlebutton {
@ -1577,7 +1574,7 @@ messagedialog headerbar button.titlebutton {
#MainNotebook tab #CloseButton {
padding: 0;
margin: 0.3334em -3px 0.3334em 0.0834em;
margin: 0.33334em -3px 0.33334em 0.08334em;
min-width: 1.5em;
min-height: 1.5em;
}
@ -1585,26 +1582,26 @@ messagedialog headerbar button.titlebutton {
#MainNotebook tab #CloseButton:hover,
headerbar button.titlebutton:hover{
border-color: rgba(0,0,0,.8);
box-shadow: inset 0 1px rgba(242, 242, 242, 0.1);
box-shadow: inset 0 1px rgba(242, 242, 242, 0.11);
background-image: linear-gradient(to bottom, rgba(100,100,100,.3), rgba(30,30,30,.3));
background-color: rgba(128, 128, 128,.15);
background-color: rgba(128, 128, 128,.20);
}
#MainNotebook > header > grid > button:active,
headerbar button.titlebutton:active{
border-color: rgba(0,0,0,.8);
box-shadow: inset 0 1px rgba(242, 242, 242, 0.1);
box-shadow: inset 0 1px rgba(242, 242, 242, 0.15);
background-image: linear-gradient(to bottom, rgba(100,100,100,.3), rgba(30,30,30,.3));
background-color: rgba(128, 128, 128,.30);
background-color: rgba(128, 128, 128,.40);
}
#MainNotebook tab #CloseButton:hover,
headerbar button.titlebutton.close:hover{
border-color: rgba(0,0,0,.9);
border-color: rgba(0,0,0,.8);
background-image: linear-gradient(to bottom, rgb(180,0,0), rgb(160,0,0) 40%, rgb(130,0,0));
box-shadow: inset 0 1px rgba(242, 242, 242, 0.3);
box-shadow: inset 0 1px rgba(242, 242, 242, 0.32);
}
#MainNotebook tab #CloseButton:active,
headerbar button.titlebutton.close:active{
border-color: rgba(0,0,0,.9);
border-color: rgba(0,0,0,.8);
background-image: linear-gradient(to bottom, rgb(215,0,0), rgb(185,0,0) 40%, rgb(150,0,0));
box-shadow: inset 0 1px rgba(242, 242, 242, 0.4);
}
@ -1616,17 +1613,17 @@ headerbar button.titlebutton.close:active{
checkbox {
padding:0;
margin:0;
min-height: 1.16667em;
min-height: 2em;
}
checkbutton,
radiobutton {
padding: 0.41667em 0;
padding: 0;
margin: 0;
min-height: 1.16667em;
min-height: 2em;
}
check,
radio {
border: calc(0.08334em + 0.18px) solid shade(@text-color, .9);
border: calc(0.083334em + 0.18px) solid shade(@text-color, .9);
background-image: none;
background-color: transparent;
margin: 0;
@ -1667,24 +1664,26 @@ frame > checkbutton check{
}
#PartialPaste checkbutton:not(#PartialPasteHeader) {
padding: 0.0834em 0;
min-height: 1.4em;
margin-left: 1.16667em;
}
#PartialPasteHeader {
padding: 0.0834em 0;
min-height: 1.4em;
margin-left: 0.5em;
}
#PrefNotebook checkbutton {
padding: 0;
min-height: 1.16667em;
}
#PrefNotebook radiobutton,
#PrefNotebook stack > box:nth-child(3) checkbutton,
#PrefNotebook stack > box:nth-child(4) checkbutton {
padding: 0.25em 0;
min-height: 2em;
}
#PrefNotebook radiobutton {
min-height: 2em;
}
#MyExpander button + checkbutton:last-child {
margin-left: 0.33333em;
margin-left: 0.33334em;
}
/*** end ***************************************************************************************/
@ -1693,11 +1692,11 @@ frame > checkbutton check{
#MyExpander entry,
entry {
margin: 0;
padding: 0 0.33333em;
padding: 0 0.33334em;
min-height: 1.66667em;
min-width: 0;
border-radius: 0.16667em;
box-shadow: inset 1px 1px rgba(0, 0, 0, 0.08), 0 1px rgba(242 , 242, 242, 0.1);
border-radius: 0.2em;
box-shadow: inset 1px 1px rgba(0, 0, 0, 0.08), 0 1px rgba(242, 242, 242, 0.1);
border: 1px solid @bg-entry-border;
background-color: @bg-scale-entry;
}
@ -1707,29 +1706,29 @@ spinbutton {
padding: 0;
min-height: 1.66667em;
min-width: 0;
border-radius: 0.16667em;
border-radius: 0.2em;
background-color: @bg-scale-entry;
border: 1px solid @bg-entry-border;
box-shadow: inset 1px 1px rgba(0, 0, 0, 0.08), 0 1px rgba(242 , 242, 242, 0.1);
box-shadow: inset 1px 1px rgba(0, 0, 0, 0.08), 0 1px rgba(242, 242, 242, 0.1);
}
#MyExpander spinbutton {
margin: 0.16667em 0;
padding: 0;
min-height: 1.35em;
min-height: 1.33334em;
min-width: 0;
border-top-left-radius: 1.83333em;
border-bottom-left-radius: 1.83333em;
border-top-left-radius: 1.83334em;
border-bottom-left-radius: 1.83334em;
background-color: shade(@bg-grey, 1.33);
border: 1px solid @bg-button-border;
color: @text-tbEntry;
box-shadow: inset 1px 1px rgba(0, 0, 0, .12), 0 1px rgba(255 , 255, 255, 0.12);
box-shadow: inset 1px 1px rgba(0, 0, 0, .12), 0 1px rgba(255, 255, 255, 0.12);
}
#MyExpander button + label + spinbutton {
margin: 0.29em 0; /* Needed for Reset & and Auto button height*/
margin: 0.25em 0; /* Needed for Reset & and Auto button height*/
}
#MyExpander checkbutton + label + spinbutton {
margin: 0.41667em 0; /* Needed for Reset & and Auto checkbox button height*/
margin: 0.33334em 0; /* Needed for Reset & and Auto checkbox button height*/
}
#MyExpander image + spinbutton {
@ -1742,7 +1741,7 @@ spinbutton button {
padding: 0;
margin: 0;
min-height: 0;
min-width: 1.33333em;
min-width: 1.33334em;
background-image: none;
background-color: transparent;
border: none;
@ -1752,7 +1751,7 @@ spinbutton button {
}
#MyExpander spinbutton entry,
spinbutton entry {
padding: 0 0.33333em;
padding: 0 0.33334em;
margin: 0;
min-height: 0;
min-width: 0;
@ -1761,7 +1760,7 @@ spinbutton entry {
background-color: transparent;
}
#MyExpander spinbutton entry {
padding: 0 0.33333em 0 0.83333em;
padding: 0 0.33334em 0 0.83334em;
}
#BatchQueueButtonsMainContainer spinbutton button:hover,
@ -1824,7 +1823,7 @@ entry:focus > selection {
border: none;
padding: 0;
box-shadow: 0 0.25em 0.75em 1px rgba(0, 0, 0, 0.5), 0 0 0 1px @bg-dark-grey;
margin: 0.83333em;
margin: 0.83334em;
}
headerbar {
background-color: shade(@winHeaderbar,1.12);
@ -1833,7 +1832,7 @@ headerbar {
border-bottom: 1px solid @bg-dark-grey;
border-radius: 0.41667em 0.41667em 0 0;
min-height: 2.16667em;
padding: 0.08333em 0.41667em 0;
padding: 0.08334em 0.41667em 0;
margin: 0;
}
messagedialog headerbar {

View File

@ -2,7 +2,7 @@
This file is part of RawTherapee.
Copyright (c) 2016-2017 TooWaBoo
Version 2.40 - requires RT 5.0
Version 2.42 - requires RT 5.0
RawTherapee is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -69,7 +69,6 @@
outline-style: none; /* removes the ugly dashed focus line */
border-image: none;
transition: none;
/* -gtk-dpi: 120; */
}
*:disabled {
@ -77,10 +76,10 @@
}
#ToolPanelNotebook {
min-width: 23em
min-width: 23em;
}
#HistoryPanel {
min-width: 17.83333em
min-width: 17.83334em;
}
window.background {
@ -107,7 +106,7 @@ messagedialog {
tooltip {
background-color: @bg-tooltip;
border: 1px solid @border-tooltip;
border-radius: 0.33333em;
border-radius: 0.33334em;
padding: 0;
margin: 0;
box-shadow: none;
@ -205,7 +204,7 @@ dialog frame > label {
padding: 0.16667em 0.5em;
}
#BatchQueueButtonsMainContainer frame > border {
margin-bottom: 0.8334em;
margin-bottom: 0.83334em;
}
#BatchQueueButtonsMainContainer frame:nth-child(3) > border {
padding-left: 0.91667em;
@ -232,10 +231,6 @@ textview.view, treeview.view {
padding: 0.16667em;
margin: 0;
}
#RightNotebook > stack > :nth-child(3) treeview {
border: 1px solid @bg-dark-grey;
border-bottom: none;
}
textview:hover, treeview:hover {
background-color: @bg-list-hover;
}
@ -245,8 +240,13 @@ textview:selected, treeview:selected {
border-top-color: transparent;
}
#RightNotebook > stack > :nth-child(3) treeview {
border: 1px solid @bg-dark-grey;
border-bottom: none;
}
#PlacesPaned > :nth-child(1) treeview {
padding: 0.0834em 0 0.0834em 0.5em;
padding: 0.08334em 0 0.08334em 0.5em;
-gtk-icon-style: symbolic;
}
@ -257,7 +257,7 @@ textview:selected, treeview:selected {
margin-top: 1.75em;
}
#HistoryPanel > label {
margin: 0 0 -1.3334em 0;
margin: 0 0 -1.33334em 0;
padding: 0;
}
@ -285,7 +285,7 @@ textview:selected, treeview:selected {
/*Corrects the space for the snapshot view of the paned separator*/
#Snapshots {
margin-top: -0.3334em;
margin-top: -0.33334em;
}
/**/
@ -381,7 +381,7 @@ filechooser list row:selected {
border-radius: 0;
}
#fullButton {
padding: 0.47em 0.41667em 0.58333em;
padding: 0.47em 0.41667em 0.58334em;
}
#EditorLeftPaned #fullButton,
#EditorLeftPaned #histButton {
@ -433,7 +433,7 @@ paned.vertical > separator {
dialog paned.horizontal > separator {
background-color: @bg-grey;
border-color: @bg-grey;
min-width: 0.33333em;
min-width: 0.33334em;
}
menu separator {
@ -451,13 +451,13 @@ menu separator {
#IopsPanel separator,
#FileBrowser separator {
background-color: shade(@bg-light-grey,.75);
margin-top: 0.33333em;
margin-bottom: 0.33333em;
margin-top: 0.33334em;
margin-bottom: 0.33334em;
}
#MyExpander separator {
background-color: shade(@bg-grey,.7);
margin: 0.33333em 0.66667em;
margin: 0.33334em 0.66667em;
}
#PlacesPaned .view.separator {
@ -474,7 +474,7 @@ menu separator {
}
#PartialPaste separator.vertical {
margin: 0 0.33333em;
margin: 0 0.33334em;
padding: 0;
}
@ -498,7 +498,7 @@ menu separator {
/*** Scrollbar *********************************************************************************/
scrollbar {
background-color: rgba(0,0,0,.45);
background-color: rgba(0,0,0,.40);
border: none;
margin: 0;
padding: 0;
@ -542,7 +542,7 @@ scrollbar.horizontal.hovering.fine-tune slider {
scrollbar.horizontal.overlay-indicator:not(.hovering) slider {
min-width: 2em;
min-height: 0.25em;
border-width: 0.0834em;
border-width: 0.08334em;
border-radius: 0.25em;
margin: 0 0.16667em;
}
@ -562,7 +562,7 @@ scrollbar.vertical.hovering.fine-tune slider {
scrollbar.vertical.overlay-indicator:not(.hovering) slider {
min-width: 0.25em;
min-height: 2em;
border-width: 0.0834em;
border-width: 0.08334em;
border-radius: 0.5em;
margin: 0.16667em 0;
}
@ -573,11 +573,8 @@ scrollbar slider:hover {
}
/* Scrollbar stuck workaround */
scrollbar:not(.overlay-indicator).horizontal:hover slider {
min-width: calc(2em - 0.0001px);
}
scrollbar:not(.overlay-indicator).vertical:hover slider {
min-height: calc(2em - 0.0001px);
scrollbar:not(.overlay-indicator):hover {
min-width: 1px;
}
/*** end ***************************************************************************************/
@ -585,7 +582,7 @@ scrollbar:not(.overlay-indicator).vertical:hover slider {
/*** Scale**************************************************************************************/
scale {
padding: 0;
min-height: 1.83333em;
min-height: 1.83334em;
margin: 0 0.25em;
}
@ -593,8 +590,8 @@ scale slider {
/* Slider size is min-width x min-height; margin have to be half of those values, but negative */
min-width: 1em;
min-height: 1em;
margin: calc(-0.3334em - 1px);
border-radius: 0.83333em;
margin: calc(-0.33334em - 1px);
border-radius: 0.83334em;
background-image: linear-gradient(to bottom, shade (@accent-color4,1.15), shade (@accent-color4,.85));
border: 1px solid @bg-dark-grey;
box-shadow: none;
@ -637,12 +634,10 @@ scale:disabled trough {
/*** Progressbar *******************************************************************************/
progressbar.vertical {
min-width: 0;
margin-right: 0.58333em;
min-height: 9em;
}
progressbar.vertical text {
color: transparent;
margin-right: -0.83333em;
min-width: 0;
}
progressbar.vertical trough {
@ -663,7 +658,7 @@ progressbar.horizontal trough {
background-color: transparent;
border: none;
border-radius: 0.5em;
margin-top: 0.58333em;
margin-top: 0.58334em;
}
progressbar.horizontal trough progress {
min-height: 0.41667em;
@ -716,25 +711,25 @@ notebook tabs {
notebook header tab {
background-color: transparent;
margin: 0.41667em 0.25em;
padding: 0 0.3334em;
padding: 0 0.33334em;
}
notebook header.left tab {
margin: 0.25em 0.41667em;
padding: 0.3334em 0;
padding: 0.33334em 0;
}
notebook header tab > grid > image {
min-height: 2.33333em;
min-height: 2.33334em;
min-width: 0;
padding: 0 0.16667em 0 0;
margin: 0;
}
notebook header.left tab > grid > image {
min-height: 0;
min-width: 2.33333em;
min-width: 2.33334em;
padding: 0.16667em 0 0;
}
notebook header tab label {
margin: 0.33333em;
margin: 0.33334em;
}
notebook header tab:hover label {
color: @headline-hl;
@ -747,7 +742,7 @@ notebook header.left tab:checked {
}
notebook > header > tabs > arrow {
background-color: transparent;
border-radius: 0.16667em;
border-radius: 0.2em;
min-width: 0;
min-height: 0;
padding: 0 0.16667em;
@ -776,7 +771,7 @@ dialog notebook stack {
padding: 0.41667em;
}
#MainNotebook > stack > :nth-child(2) > :nth-child(2) {
margin-bottom: 0.3334em;
margin-bottom: 0.33334em;
}
@ -784,17 +779,17 @@ dialog notebook stack {
dialog.csd #PrefNotebook > header,
dialog.csd #AboutNotebook > header,
window.csd:not(.fullscreen) #MainNotebook > header.top {
border-top: 0.083333em solid rgba(200,200,200,.18);
border-top: 0.083334em solid rgba(200,200,200,.18);
}
/**/
#ToolPanelNotebook > header tabs {
margin-bottom: 0.33333em;
margin-bottom: 0.33334em;
}
#ToolPanelNotebook > header tab image{
min-height: 2.5em;
min-width: 2em;
min-width: calc(1.66667em + 6px);
padding: 0;
margin: 0;
}
@ -813,7 +808,7 @@ window.csd:not(.fullscreen) #MainNotebook > header.top {
}
#PrefNotebook header {
margin: -0.66667em -0.66667em 0.3334em;
margin: -0.66667em -0.66667em 0.33334em;
}
#AboutNotebook header {
margin: -0.66667em -0.66667em 0.66667em;
@ -827,14 +822,15 @@ window.csd:not(.fullscreen) #MainNotebook > header.top {
#MetaPanelNotebook header {
background-color: @bg-grey;
padding: 0.33333em;
padding: 0.33334em;
margin: 0 0.5em 0;
}
#MetaPanelNotebook > header > tabs {
background-color: @bg-dark-grey;
padding-left: 0.33334em;
}
#MetaPanelNotebook > header > tab {
background-color: @bg-dark-grey;
#MetaPanelNotebook > header tab label{
margin: 0.08334em;
}
#MetaPanelNotebook > stack > box {
@ -842,11 +838,11 @@ window.csd:not(.fullscreen) #MainNotebook > header.top {
background-color: @bg-grey;
border-radius: 0;
border-top-style: none;
padding: 0 0.33333em 0.25em;
padding: 0 0.33334em 0.25em;
margin: 0 0.5em -0.5em;
}
#MetaPanelNotebook > stack > box:nth-child(1) > scrolledwindow {
margin: 0 0 0.33333em;
margin: 0 0 0.33334em;
padding: 0;
}
@ -862,10 +858,10 @@ window.csd:not(.fullscreen) #MainNotebook > header.top {
margin-top: 0;
margin-bottom: 0;
min-height: 1.66667em;
min-width: 0.83333em;
min-width: 0.83334em;
}
#MetaPanelNotebook entry {
padding: 0 0.33333em;
padding: 0 0.33334em;
background-color: @bg-dark-grey;
margin: 0;
border-radius: 0;
@ -883,7 +879,7 @@ window.csd:not(.fullscreen) #MainNotebook > header.top {
}
#MetaPanelNotebook textview.view {
background-color: @bg-dark-grey;
padding: 0.08333em 0.33333em;
padding: 0.08334em 0.33334em;
margin: 0;
}
#MetaPanelNotebook text {
@ -904,7 +900,7 @@ window.csd:not(.fullscreen) #MainNotebook > header.top {
}
#MetaPanelNotebook label {
padding: 0.0834em 0;
padding: 0.08334em 0;
}
/*** end ***************************************************************************************/
@ -934,7 +930,7 @@ window.csd:not(.fullscreen) #MainNotebook > header.top {
#ToolBarPanelFileBrowser > box > button,
#ToolBarPanelFileBrowser > button {
margin: 0 0.0834em;
margin: 0 0.08334em;
}
#ToolBarPanelFileBrowser > box > box > button {
min-height: 0.91667em;
@ -952,7 +948,7 @@ window.csd:not(.fullscreen) #MainNotebook > header.top {
min-height: 1.66667em;
min-width: 1.66667em;
margin: 0 0 0 -1.66667em;
border-radius: 0 0.16667em 0.16667em 0;
border-radius: 0 0.2em 0.2em 0;
border: 1px solid transparent;
padding: 0;
}
@ -961,11 +957,11 @@ window.csd:not(.fullscreen) #MainNotebook > header.top {
min-height: 1.66667em;
min-width: 12em;
margin: 0 -2px 0 0;
padding: 0 2em 0 0.33333em;
padding: 0 2em 0 0.33334em;
}
#ToolBarPanelFileBrowser label,
#FileBrowser label {
margin: 0 0.33333em 0 0.5em;
margin: 0 0.33334em 0 0.5em;
}
/*** end ***************************************************************************************/
@ -1005,8 +1001,8 @@ window.csd:not(.fullscreen) #MainNotebook > header.top {
#BeforeAfterContainer button {
min-height: 1.66667em;
min-width: 1.66667em;
margin: 0.25em 0 0.3334em;
padding: 0 0 0 0.0834em;
margin: 0.25em 0 0.33334em;
padding: 0 0 0 0.08334em;
}
/**/
@ -1016,7 +1012,7 @@ window.csd:not(.fullscreen) #MainNotebook > header.top {
min-height: 0;
}
#EditorTopPanel button {
margin: 0 0.0834em;
margin: 0 0.08334em;
min-height: 2.16667em;
min-width: 2.16667em;
}
@ -1027,14 +1023,14 @@ window.csd:not(.fullscreen) #MainNotebook > header.top {
#EditorTopPanel > box > button.image-button:not(:nth-child(6)) {
min-width: 0;
padding-left: 0.33333em;
padding-right: 0.33333em;
padding-left: 0.33334em;
padding-right: 0.33334em;
}
#EditorTopPanel > box > button.image-button:nth-child(6) {
-gtk-icon-shadow: none;
}
#EditorTopPanel > box > box > button {
min-height: 0.64em;
min-height: 0.625em;
min-width: 0;
margin: 0 0.16667em;
padding: 0 0.16667em;
@ -1052,7 +1048,7 @@ window.csd:not(.fullscreen) #MainNotebook > header.top {
#EditorTopPanel > box > box > button:checked {
background-color: transparent;
background-image: none;
border: 1px solid @bg-dark-grey;
border: 1px solid @bg-button-border;
box-shadow: none;
}
@ -1065,8 +1061,8 @@ window.csd:not(.fullscreen) #MainNotebook > header.top {
padding: 0 2px 0 3px;
}
#EditorZoomPanel button {
margin-left: 0.0834em;
margin-right: 0.0834em;
margin-left: 0.08334em;
margin-right: 0.08334em;
}
/*** end ***************************************************************************************/
@ -1126,7 +1122,7 @@ window.csd:not(.fullscreen) #MainNotebook > header.top {
#MyExpanderTitle > box {
margin: 0;
padding: 0.33333em 0;
padding: 0.33334em 0;
}
#MyExpanderTitle label {
@ -1167,7 +1163,7 @@ menu > .bottom:hover {
}
menuitem {
padding: 0 0.33333em;
padding: 0 0.33334em;
margin: 1px;
min-height: 2em;
}
@ -1182,7 +1178,7 @@ menuitem:hover > * {
menu image {
min-height: 2em;
padding: 0;
margin: 0 0.33333em 0 0;
margin: 0 0.33334em 0 0;
}
/*** Selection popup list (used in filechooser) ***/
@ -1239,7 +1235,7 @@ button {
min-width: 2.16667em;
margin: 0;
padding: 0; /* x */
border-radius: 0.16667em;
border-radius: 0.2em;
border: 1px solid @bg-button-border;
background-color: transparent;
box-shadow: inset 0 1px rgba(242, 242, 242, 0.1);
@ -1262,19 +1258,19 @@ button.flat {
/* Resetbutton Queue & Save as*/
dialog scale + button.flat,
scale + button.flat {
min-height: 1.33333em;
min-height: 1.33334em;
min-width: 1.25em;
margin: 0.25em 0 0.16667em 0.16667em;
padding: 0 0 0 0.0834em;
padding: 0 0 0 0.08334em;
-gtk-icon-shadow: none;
}
/* Resetbutton */
#MyExpander button.flat {
min-height: 1.33333em;
min-height: 1.33334em;
min-width: 1.25em;
margin: 0.08333em 0 0.08333em 0.16667em;
padding: 0 0 0 0.0834em;
margin: 0.08334em 0 0.08334em 0.16667em;
padding: 0 0 0 0.08334em;
-gtk-icon-shadow: none;
}
@ -1286,7 +1282,7 @@ scale + button.flat {
}
#MyExpander spinbutton + button.flat {
margin: 0 0 0 0.16667em;
padding-top: 0.08333em;
padding-top: 0.08334em;
}
/**/
@ -1295,7 +1291,7 @@ scale + button.flat {
#MyExpander button.flat:first-child {
min-height: 2.16667em;
min-width: 2.16667em;
margin: 0.08333em;
margin: 0.08334em;
padding: 0;
}
/**/
@ -1304,7 +1300,7 @@ scale + button.flat {
#FileBrowser entry + button:hover,
button.flat:hover,
button:hover {
border: 1px solid @bg-button-border;
border-color: @bg-button-border;
box-shadow: inset 0 1px rgba(242, 242, 242, 0.1);
background-image: linear-gradient(to bottom, rgba(100,100,100,.3), rgba(30,30,30,.3));
background-color: @bg-button-hover;
@ -1316,8 +1312,8 @@ button.flat:active,
button.flat:checked,
button:active,
button:checked {
border-color: black;
box-shadow: inset 0 1px rgba(242, 242, 242, 0.1);
border-color: @bg-button-border;
box-shadow: inset 0 1px rgba(242, 242, 242, 0.08);
background-image: linear-gradient(to bottom, rgba(100,100,100,.3), rgba(30,30,30,.3));
background-color: @bg-button-active;
}
@ -1333,7 +1329,7 @@ button.MiddleH {
/* Applies special styles in main notebook */
#ProfilePanel {
margin-bottom: -2px;
padding-bottom: 0.41667em
padding-bottom: 0.41667em;
}
#ProfilePanel combobox {
margin-left: 0.16667em;
@ -1359,7 +1355,7 @@ combobox .combo,
dialog combobox .combo,
#ToolPanelNotebook combobox .combo,
#BatchQueueButtonsMainContainer combobox .combo {
padding: 0 0.20833em;
padding: 0 0.208334em;
}
/**/
@ -1377,7 +1373,7 @@ dialog combobox .combo,
#MyExpander label + * > button:not(.flat).Left,
#MyExpander label + combobox:not(:first-child):not(:only-child),
#MyExpander label + button:not(.flat):not(spinbutton) {
margin-left: 0.33333em;
margin-left: 0.33334em;
}
/* Arrow toggle combo button */
@ -1385,8 +1381,8 @@ dialog combobox .combo,
#MyExpander button:not(.flat).Left + button:not(.flat).Right {
border-left: none;
margin-left: 0;
padding-left: 0.33333em;
padding-right: 0.33333em;
padding-left: 0.33334em;
padding-right: 0.33334em;
border-top-left-radius: 0;
border-bottom-left-radius: 0;
}
@ -1394,7 +1390,7 @@ dialog combobox .combo,
#MyExpander button:not(.flat).Left {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
min-width: 2.33333em;
min-width: 2.16667em;
}
/**/
@ -1402,8 +1398,8 @@ dialog combobox .combo,
#PrefNotebook stack > box:nth-child(4) combobox,
#MyExpander button.flat,
#MyExpander button {
margin-top: 0.115em;
margin-bottom: 0.115em;
margin-top: 0.08334em;
margin-bottom: 0.08334em;
}
/**/
#MyExpander button.text-button label {
@ -1429,11 +1425,11 @@ button.color {
/* Save, Cancel, OK ... buttons */
.dialog-action-area button {
min-height: 2.16667em;
margin-top: 0.33333em;
margin-top: 0.33334em;
}
messagedialog .dialog-action-area button {
margin: 0 0.66667em 0.66667em 0.66667em;
min-height: 1.83333em;
min-height: 1.83334em;
}
messagedialog .dialog-action-area button:not(:only-child):nth-child(1) {
margin-right: 0.25em;
@ -1457,7 +1453,8 @@ window .view button {
background-image: none;
box-shadow: none;
min-height: 2em;
padding: 0 0.33333em;
min-width: 1.33334em;
padding: 0 0.33334em;
}
dialog .view button.text-button label,
window .view button.text-button label {
@ -1497,22 +1494,22 @@ window .view header button,
padding: 0;
}
.path-bar button:first-child {
border-top-left-radius: 0.16667em;
border-bottom-left-radius: 0.16667em;
border-top-left-radius: 0.2em;
border-bottom-left-radius: 0.2em;
min-width: 2em;
margin: 0;
padding: 0;
}
.path-bar button:last-child {
border-top-right-radius: 0.16667em;
border-bottom-right-radius: 0.16667em;
border-top-right-radius: 0.2em;
border-bottom-right-radius: 0.2em;
min-width: 2em;
margin: 0;
padding: 0;
}
.path-bar button label {
margin: 0;
padding: 0 0.33333em;
padding: 0 0.33334em;
}
/**/
@ -1560,13 +1557,13 @@ headerbar button.titlebutton image {
margin: 0;
}
headerbar button.titlebutton {
margin: 0 0 0 0.33333em;
margin: 0 0 0 0.33334em;
background-image: none;
border: 1px solid transparent;
background-color: transparent;
box-shadow: none;
min-width: 1.5em;
min-height: 1.5em;
min-width: 1.55em;
min-height: 1.55em;
padding: 0;
}
messagedialog headerbar button.titlebutton {
@ -1577,7 +1574,7 @@ messagedialog headerbar button.titlebutton {
#MainNotebook tab #CloseButton {
padding: 0;
margin: 0.3334em -3px 0.3334em 0.0834em;
margin: 0.33334em -3px 0.33334em 0.08334em;
min-width: 1.5em;
min-height: 1.5em;
}
@ -1585,26 +1582,26 @@ messagedialog headerbar button.titlebutton {
#MainNotebook tab #CloseButton:hover,
headerbar button.titlebutton:hover{
border-color: rgba(0,0,0,.8);
box-shadow: inset 0 1px rgba(242, 242, 242, 0.1);
box-shadow: inset 0 1px rgba(242, 242, 242, 0.11);
background-image: linear-gradient(to bottom, rgba(100,100,100,.3), rgba(30,30,30,.3));
background-color: rgba(128, 128, 128,.15);
background-color: rgba(128, 128, 128,.20);
}
#MainNotebook > header > grid > button:active,
headerbar button.titlebutton:active{
border-color: rgba(0,0,0,.8);
box-shadow: inset 0 1px rgba(242, 242, 242, 0.1);
box-shadow: inset 0 1px rgba(242, 242, 242, 0.15);
background-image: linear-gradient(to bottom, rgba(100,100,100,.3), rgba(30,30,30,.3));
background-color: rgba(128, 128, 128,.30);
background-color: rgba(128, 128, 128,.40);
}
#MainNotebook tab #CloseButton:hover,
headerbar button.titlebutton.close:hover{
border-color: rgba(0,0,0,.9);
border-color: rgba(0,0,0,.8);
background-image: linear-gradient(to bottom, rgb(180,0,0), rgb(160,0,0) 40%, rgb(130,0,0));
box-shadow: inset 0 1px rgba(242, 242, 242, 0.3);
box-shadow: inset 0 1px rgba(242, 242, 242, 0.32);
}
#MainNotebook tab #CloseButton:active,
headerbar button.titlebutton.close:active{
border-color: rgba(0,0,0,.9);
border-color: rgba(0,0,0,.8);
background-image: linear-gradient(to bottom, rgb(215,0,0), rgb(185,0,0) 40%, rgb(150,0,0));
box-shadow: inset 0 1px rgba(242, 242, 242, 0.4);
}
@ -1616,17 +1613,17 @@ headerbar button.titlebutton.close:active{
checkbox {
padding:0;
margin:0;
min-height: 1.16667em;
min-height: 2em;
}
checkbutton,
radiobutton {
padding: 0.41667em 0;
padding: 0;
margin: 0;
min-height: 1.16667em;
min-height: 2em;
}
check,
radio {
border: calc(0.08334em + 0.18px) solid shade(@text-color, .9);
border: calc(0.083334em + 0.18px) solid shade(@text-color, .9);
background-image: none;
background-color: transparent;
margin: 0;
@ -1667,24 +1664,26 @@ frame > checkbutton check{
}
#PartialPaste checkbutton:not(#PartialPasteHeader) {
padding: 0.0834em 0;
min-height: 1.4em;
margin-left: 1.16667em;
}
#PartialPasteHeader {
padding: 0.0834em 0;
min-height: 1.4em;
margin-left: 0.5em;
}
#PrefNotebook checkbutton {
padding: 0;
min-height: 1.16667em;
}
#PrefNotebook radiobutton,
#PrefNotebook stack > box:nth-child(3) checkbutton,
#PrefNotebook stack > box:nth-child(4) checkbutton {
padding: 0.25em 0;
min-height: 2em;
}
#PrefNotebook radiobutton {
min-height: 2em;
}
#MyExpander button + checkbutton:last-child {
margin-left: 0.33333em;
margin-left: 0.33334em;
}
/*** end ***************************************************************************************/
@ -1693,11 +1692,11 @@ frame > checkbutton check{
#MyExpander entry,
entry {
margin: 0;
padding: 0 0.33333em;
padding: 0 0.33334em;
min-height: 1.66667em;
min-width: 0;
border-radius: 0.16667em;
box-shadow: inset 1px 1px rgba(0, 0, 0, 0.08), 0 1px rgba(242 , 242, 242, 0.1);
border-radius: 0.2em;
box-shadow: inset 1px 1px rgba(0, 0, 0, 0.08), 0 1px rgba(242, 242, 242, 0.1);
border: 1px solid @bg-entry-border;
background-color: @bg-scale-entry;
}
@ -1707,29 +1706,29 @@ spinbutton {
padding: 0;
min-height: 1.66667em;
min-width: 0;
border-radius: 0.16667em;
border-radius: 0.2em;
background-color: @bg-scale-entry;
border: 1px solid @bg-entry-border;
box-shadow: inset 1px 1px rgba(0, 0, 0, 0.08), 0 1px rgba(242 , 242, 242, 0.1);
box-shadow: inset 1px 1px rgba(0, 0, 0, 0.08), 0 1px rgba(242, 242, 242, 0.1);
}
#MyExpander spinbutton {
margin: 0.16667em 0;
padding: 0;
min-height: 1.35em;
min-height: 1.33334em;
min-width: 0;
border-top-left-radius: 1.83333em;
border-bottom-left-radius: 1.83333em;
border-top-left-radius: 1.83334em;
border-bottom-left-radius: 1.83334em;
background-color: shade(@bg-grey, 1.33);
border: 1px solid @bg-button-border;
color: @text-tbEntry;
box-shadow: inset 1px 1px rgba(0, 0, 0, .12), 0 1px rgba(255 , 255, 255, 0.12);
box-shadow: inset 1px 1px rgba(0, 0, 0, .12), 0 1px rgba(255, 255, 255, 0.12);
}
#MyExpander button + label + spinbutton {
margin: 0.29em 0; /* Needed for Reset & and Auto button height*/
margin: 0.25em 0; /* Needed for Reset & and Auto button height*/
}
#MyExpander checkbutton + label + spinbutton {
margin: 0.41667em 0; /* Needed for Reset & and Auto checkbox button height*/
margin: 0.33334em 0; /* Needed for Reset & and Auto checkbox button height*/
}
#MyExpander image + spinbutton {
@ -1742,7 +1741,7 @@ spinbutton button {
padding: 0;
margin: 0;
min-height: 0;
min-width: 1.33333em;
min-width: 1.33334em;
background-image: none;
background-color: transparent;
border: none;
@ -1752,7 +1751,7 @@ spinbutton button {
}
#MyExpander spinbutton entry,
spinbutton entry {
padding: 0 0.33333em;
padding: 0 0.33334em;
margin: 0;
min-height: 0;
min-width: 0;
@ -1761,7 +1760,7 @@ spinbutton entry {
background-color: transparent;
}
#MyExpander spinbutton entry {
padding: 0 0.33333em 0 0.83333em;
padding: 0 0.33334em 0 0.83334em;
}
#BatchQueueButtonsMainContainer spinbutton button:hover,
@ -1824,7 +1823,7 @@ entry:focus > selection {
border: none;
padding: 0;
box-shadow: 0 0.25em 0.75em 1px rgba(0, 0, 0, 0.5), 0 0 0 1px @bg-dark-grey;
margin: 0.83333em;
margin: 0.83334em;
}
headerbar {
background-color: shade(@winHeaderbar,1.12);
@ -1833,7 +1832,7 @@ headerbar {
border-bottom: 1px solid @bg-dark-grey;
border-radius: 0.41667em 0.41667em 0 0;
min-height: 2.16667em;
padding: 0.08333em 0.41667em 0;
padding: 0.08334em 0.41667em 0;
margin: 0;
}
messagedialog headerbar {

View File

@ -0,0 +1,881 @@
/*
This file is part of RawTherapee.
Copyright (c) 2016 TooWaBoo (v1.19.4)
Many thanks to the RawTherapee Developer Team for this great piece of software
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/>.
*/
/*** Change me *** rgb(red,green,blue) *** allowed values from 0 to 255 for each color ***/
@define-color accent-color rgb(35,99,166); /*** Highlight/selected color for Tab indicator, List, Dropdown menu, Borders ... ***/
@define-color text-hl-color rgb(210,210,210); /*** Highlight/selected text color ***/
@define-color accent-color2 rgb(35,99,166); /*** Slider, Progressbar, Scrollbar ***/
@define-color accent-color4 rgb(35,99,166); /*** Slider knob ***/
@define-color accent-color3 rgb(35,99,166); /*** Selected thumbnail background color ***/
@define-color text-hl-color3 rgb(210,210,210); /*** Selected thumbnail text color ***/
/*** Change me end ************************************************************************/
@define-color text-color rgb(180,180,180);
@define-color text-hl-color2 rgb(192,192,192);
@define-color text-tbEntry rgb(192,192,192);
@define-color bg-dark-grey rgb(36,36,36);
@define-color bg-grey rgb(70,70,70);
@define-color bg-light-grey rgb(88,88,88);
@define-color border-color rgba(255,255,255,.25);
@define-color bg-list-hover rgba(255,255,255,.065);
@define-color bg-scale-entry rgba(0,0,0,.14);
@define-color bg-button-border rgba(0,0,0,.48);
@define-color bg-button-border-hover rgba(0,0,0,.58);
@define-color bg-entry-border rgba(0,0,0,.40);
@define-color bg-button-hover rgba(0,0,0,.22);
@define-color bg-spin-button-hover rgba(0,0,0,.25);
@define-color bg-entry-IPTC @bg-dark-grey;
@define-color view-grid-border rgb(64,64,64);
* {
color: @text-color;
transition: none;
text-shadow: none;
icon-shadow: none;
box-shadow: none;
outline-style: none; /* removes the ugly dotted focus line */
border-image: none;
-GtkCheckButton-indicator-size: 16;
-GtkCheckMenuItem-indicator-size: 16;
-GtkCheckButton-indicator-spacing: 2;
}
.undershoot {
background-image: none; /* removes the dotted scrollbar line */
}
GtkWindow {
background-color: @bg-light-grey;
}
GtkDialog {
background-color: @bg-grey;
-GtkDialog-content-area-spacing: 7;
-GtkDialog-action-area-border: 0;
-GtkDialog-content-area-border: 8;
}
GtkFontChooser,
GtkColorChooser {
-GtkDialog-action-area-border: 4;
-GtkDialog-content-area-border: 0;
}
.frame {
border: none;
}
#PrefNotebook > .frame {
border: 1px solid rgba(0,0,0,.50);
border-top: none;
}
#BatchQueueButtonsMainContainer GtkFrame {
padding: 4px 4px 4px 10px;
}
/*** Add space between buttons and image area***/
#BeforeAfterContainer GtkFrame {
padding: 2px 0 4px;
}
/*** Add space between before/after image ***/
#BeforeAfterContainer GtkContainer:nth-child(1) > GtkContainer:nth-child(2) GtkFrame {
padding-right: 14px;
}
/*** Menu bubble box ***/
GtkPopover {
background-color: @bg-grey;
border: 1px solid @accent-color;
border-radius: 0;
}
.menu {
background-color: @bg-dark-grey;
border: 1px solid @accent-color;
}
.menu > .menuitem {
padding: 2px 4px;
}
.menu > .menuitem:hover {
background-color: @accent-color;
}
.menu > .menuitem:hover > * > *,
.menu > .menuitem:hover > * {
color: @text-hl-color;
}
GtkNotebook {
padding: 4px;
background-color: @bg-light-grey;
}
GtkDialog GtkNotebook {
padding: 2px 0 0;
}
#PrefNotebook {
padding: 4px 8px;
}
#RightNotebook {
padding: 0 0 0 4px;
}
GtkPaned {
-GtkPaned-handle-size: 4px;
background-color: transparent;
}
.pane-separator {
background-color: @bg-light-grey;
}
GtkDialog .pane-separator {
background-color: @bg-grey;
}
/*** Separator ***/
.separator {
color: @bg-light-grey;
}
GtkDialog .separator {
color: @border-color;
}
#RightNotebook .separator {
color: @bg-dark-grey;
}
/*** Navigator ***/
#Navigator .separator {
color: @view-grid-border;
}
/*** end ***/
/*** Background color image area***/
GtkDrawingArea {
background-color: @bg-grey;
border: 1px solid rgba(0,0,0,.32);
}
/*** Histogram ***/
#HistogramPanel,
#HistogramArea {
background-color: @bg-dark-grey;
border: none;
}
/*** Histogram RGB-Bar***/
#HistogramRGBArea {
background-color: rgb(128,128,128);
border: none;
}
/*** Navigator ***/
#Navigator GtkDrawingArea {
background-color: @bg-dark-grey;
border: 1px solid @bg-dark-grey;
}
#Navigator {
background-color: @bg-dark-grey;
border-top: 156px solid @bg-light-grey;
}
#RightNotebook GtkDrawingArea {
background-color: @bg-dark-grey;
}
/*** Label ***/
.label {
padding: 0 4px;
}
/*** Increase space between labels in navigater ***/
#Navigator .label {
padding: 6px 0 3px;
}
#Navigator GtkTable .label {
padding: 0 0 4px;
}
/***/
GtkDialog .label,
#ToolPanelNotebook .label,
.notebook tab .label {
padding: 0 1px;
}
.button .label {
padding: 0;
}
/*** Add left and right space between frame and labels ***/
.frame > .label,
#ToolPanelNotebook .frame > .label {
padding: 4px;
}
#BatchQueueButtonsMainContainer GtkFrame:nth-child(3) > .label{
padding: 2px 0px 4px;
}
#MyExpanderTitle .label {
padding: 2px 3px;
}
/*** end ***/
.tooltip {
border-radius: 0;
padding: 0;
}
.tooltip.background {
background-color: @bg-dark-grey;
border: 1px solid @accent-color;
}
/*** PartialPaste ***/
#PartialPaste:nth-child(2) {
background-color: @bg-light-grey;
border: 1px solid rgba(0,0,0,.50);
}
#PartialPaste > .frame {
padding: 8px 10px;
}
#PartialPasteHeaderSep {
color: rgb(192,192,192);
}
#PartialPasteHeader .label {
color: rgb(213,213,213);
}
/*** end ***/
/*** Scrollbar ***/
.scrollbar.trough {
background-color: rgba(0,0,0,.38);
background-image: none;
border: none;
}
.scrollbar.slider:active {
background-color: shade(@accent-color2,1.12);
}
/*** end ***/
/*** Scale & Progressbar ***/
.scale {
box-shadow: inset 0 1px rgba(255, 255, 255, 0.1), 0 1px rgba(242, 242, 242, 0.1);
-GtkRange-trough-border: 6;
-GtkScale-slider-length: 15;
-GtkRange-slider-width: 15;
}
.scale.trough,
#ToolPanelNotebook .scale.trough {
background-color: @bg-scale-entry;
border-color: @bg-dark-grey;
box-shadow: inset 0 1px rgba(255, 255, 255, 0.1), 0 1px rgba(242, 242, 242, 0.1);
}
.scale.trough.highlight,
#ToolPanelNotebook .scale.trough.highlight {
box-shadow: inset 0 1px rgba(255, 255, 255, 0.1), 0 1px rgba(242, 242, 242, 0.1);
background-image: none;
background-color: @accent-color2;
border: 1px solid @bg-dark-grey;
color: @text-hl-color2;
}
.scale.slider,
#ToolPanelNotebook .scale.slider {
background-image: linear-gradient(to bottom, shade (@accent-color4,1.15), shade (@accent-color4,.85));
border: 1px solid shade(@bg-dark-grey, 1.25);
box-shadow: none;
}
.scale.fine-tune {
-GtkRange-trough-border: 5;
}
.scale.scale-has-marks-below {
-GtkRange-trough-border: 6;
-GtkScale-slider-length: 6;
-GtkRange-slider-width: 19;
}
.scale.slider.scale-has-marks-below {
border-radius: 0 0 20px 20px;
border: 1px solid @bg-dark-grey;
}
.scale.fine-tune.scale-has-marks-below {
-GtkRange-trough-border: 5;
}
.scale.slider:hover,
#ToolPanelNotebook .scale.slider:hover {
background-image: linear-gradient(to bottom, shade (@accent-color4,1.25), shade (@accent-color4,.95));
}
.scale.slider:active,
#ToolPanelNotebook .scale.slider:active {
background-image: linear-gradient(to bottom, shade (@accent-color4,1.25), shade (@accent-color4,.95));
}
GtkProgressBar {
-GtkProgressBar-min-vertical-bar-width: 8;
-GtkProgressBar-min-horizontal-bar-height: 8;
-GtkProgressBar-yspacing: 4px;
border-radius: 10px;
box-shadow: inset 0 1px rgba(255, 255, 255, 0.1), 0 1px rgba(242, 242, 242, 0.1);
}
.progressbar {
background-image: none;
background-color: @accent-color2;
border-color: @bg-dark-grey;
}
GtkProgressBar.trough {
background-image: none;
background-color: @bg-scale-entry;
}
#MainNotebook > GtkGrid GtkProgressBar {
box-shadow: none;
}
#MainNotebook > GtkGrid GtkProgressBar.trough {
background-image: none;
background-color: @bg-dark-grey;
border-color: @bg-dark-grey;
}
/*** end ***/
/*** Load/Save ***/
GtkFileChooserWidget {
background-color: @bg-grey;
}
GtkFileChooserWidget > GtkBox {
border-bottom-color: @bg-dark-grey;
}
GtkFileChooserWidget GtkBox {
background-color: transparent;
}
GtkFileChooserWidget GtkListBox * {
padding-top: 1px;
padding-bottom: 1px;
}
GtkFileChooserWidget GtkListBox {
background-color: @bg-dark-grey;
}
GtkFileChooserWidget .list-row * {
padding: 1px 4px;
}
GtkFileChooserWidget .list-row:hover {
background-color: @bg-list-hover;
}
GtkFileChooserWidget .list-row:hover * {
color: @text-hl-color2;
}
GtkFileChooserWidget .list-row:selected {
background-color: @accent-color;
}
GtkFileChooserWidget .list-row:selected * {
color: @text-hl-color;
}
/*** end ***/
/*** Tab Bars ***/
.notebook tab, .notebook.header {
background-color: @bg-dark-grey;
border-color: @bg-dark-grey;
}
#MainNotebook tab {
padding: 5px;
}
.notebook tab.top {
border-width: 0 0 5px 0;
}
.notebook tab.left {
border-width: 0 5px 0 0;
}
#RightNotebook tab.left,
#PrefNotebook tab,
GtkDialog tab {
padding: 9px;
}
#ToolPanelNotebook tab {
padding: 10px 4px 7px;
}
#MetaPanelNotebook tab {
padding: 8px 4px;
}
.notebook tab:active {
border-color: @accent-color;
}
/*** end ***/
/*** File Browser ***/
#FileBrowser GtkDrawingArea {
background-color: @bg-grey;
}
#FileBrowser GtkDrawingArea:selected {
background-color: @accent-color3;
color: @text-hl-color3;
}
/*** end ***/
/*** Image ***/
GtkImage {
padding: 0;
}
#MainNotebook > GtkGrid GtkImage {
padding: 1px;
}
#ToolPanelNotebook GtkImage{
padding: 0 4px;
}
#MyExpanderTitle GtkImage{
padding: 0;
}
#ToolPanelNotebook tab GtkImage,
#ToolPanelNotebook .button GtkImage {
padding: 1px 0;
}
GtkDialog .button GtkImage{
padding: 0;
}
GtkFileChooserWidget .button GtkImage{
padding: 0 4px;
}
/*** end ***/
/*** Toolpanel ***/
#ToolPanelNotebook {
background-color: @bg-dark-grey;
padding: 0;
border-top: 4px solid @bg-dark-grey;
}
#ToolPanelNotebook GtkScrolledWindow GtkViewport.frame {
padding: 0 4px;
}
#ToolPanelNotebook .separator {
color: transparent;
}
#ToolPanelNotebook GtkFrame,
#PrefNotebook GtkFrame {
border: 1px solid @border-color;
border-radius: 0;
padding: 5px;
}
#ToolPanelNotebook GtkDrawingArea {
background-color: @bg-dark-grey;
border-color: @bg-light-grey;
color: @text-color;
}
#ToolPanelNotebook GtkDrawingArea {
border-radius: 1px; /* BUG: if 0, scale mini sliders look funny */
}
#ExpanderBox #ExpanderBox,
#ExpanderBox2,
#ExpanderBox3 {
border: 1px solid @border-color;
}
#ExpanderBox,
#ExpanderBox2,
#ExpanderBox3 {
background-color: @bg-grey;
border-radius: 0;
}
#MyExpanderTitle .label {
color: @text-color;
}
#MyExpanderTitle:hover .label {
color: @text-hl-color2;
}
/*** end ***/
/*** View ***/
.view {
background-color: @bg-dark-grey;
border-color: @view-grid-border;
}
#PrefNotebook .view {
background-color: @bg-grey;
}
#MainNotebook .view.cell:nth-child(2) {
padding: 1px 0px 1px 4px;
}
.view row:hover {
background-color: @bg-list-hover;
color: @text-hl-color2;
}
#PrefNotebook .view row:hover {
background-color: @bg-light-grey;
color: @text-hl-color2;
}
.view row:selected {
color: @text-hl-color;
background-color: @accent-color;
}
#PrefNotebook .view row:selected {
color: @text-hl-color;
background-color: @accent-color;
}
/*** end ***/
/*** Metadata ***/
#MetaPanelNotebook {
padding: 8px 11px 0;
}
#MetaPanelNotebook GtkScrolledWindow GtkViewport.frame {
padding: 8px 10px;
}
#MetaPanelNotebook.frame {
background-color: @bg-grey;
border-bottom: none;
border-top: 4px solid @bg-dark-grey;
border-left: 9px solid @bg-dark-grey;
border-right: 9px solid @bg-dark-grey;
}
#MetaPanelNotebook .separator {
color: @border-color;
}
#MetaPanelNotebook.header {
background-color: @bg-dark-grey;
}
#MetaPanelNotebook GtkTreeView {
padding: 1px;
background-color: @bg-grey;
}
#MetaPanelNotebook .frame GtkTreeView {
padding: 0px;
background-color: @bg-entry-IPTC;
}
#MetaPanelNotebook GtkTreeView:hover,
#MetaPanelNotebook .frame GtkTreeView:hover {
background-color: @bg-list-hover;
color: @text-hl-color;
}
#MetaPanelNotebook GtkTreeView:selected,
#MetaPanelNotebook .frame GtkTreeView:selected {
color: @text-hl-color;
background-color: @accent-color;
}
#MetaPanelNotebook GtkTextView {
color: @text-color;
background-color: @bg-entry-IPTC;
padding: 2px 4px;
}
/*** end ***/
/*** Entry ***/
.entry {
background-image: none;
background-color: @bg-scale-entry;
border: 1px solid @bg-entry-border;
border-radius: 0;
padding: 2px 4px;
color: @text-color;
box-shadow: inset 1px 1px rgba(0, 0, 0, 0.08), 0 1px rgba(242 , 242, 242, 0.1);
}
#FileBrowser .entry {
padding: 3px 4px;
}
.entry:focused:selected {
color: @text-hl-color;
background-color: @accent-color;
}
.entry:not(:focused):not(:insensitive) {/*Workaround*/
color: @text-color;
background-color: transparent;
}
.entry:not(:selected):not(:insensitive) {
color: @text-color;
background-color: @bg-scale-entry;
}
#ToolPanelNotebook .entry {
padding: 0 4px 0 8px;
border-radius: 20px 0 0 20px;
background-color: rgba(255,255,255,.12);
border: 1px solid rgba(0,0,0,.46);
color: @text-tbEntry;
box-shadow: inset 1px 1px rgba(0, 0, 0, .12), 0 1px rgba(255 , 255, 255, 0.12);
}
#ToolPanelNotebook .entry:focused:selected {
color: @text-hl-color;
background-color: @accent-color;
}
#ToolPanelNotebook .entry:not(:focused):not(:insensitive) {/*Workaround*/
color: @text-tbEntry;
background-color: transparent;
}
#ToolPanelNotebook .entry:not(:selected):not(:insensitive) {
color: @text-tbEntry;
background-color: rgba(255,255,255,.12);
}
#MetaPanelNotebook .entry {
color: @text-color;
background-color: @bg-entry-IPTC;
border: none;
border-radius: 0;
padding: 2px 4px;
box-shadow: none;
}
#MetaPanelNotebook .entry:focused:selected {
color: @text-hl-color;
background-color: @accent-color;
box-shadow: none;
}
#MetaPanelNotebook .entry:not(:focused):not(:insensitive) {/*Workaround*/
color: @text-color;
background-color: transparent;
box-shadow: none;
}
#MetaPanelNotebook .entry:not(:selected):not(:insensitive) {
color: @text-color;
background-color: @bg-entry-IPTC;
box-shadow: none;
}
/*** end ***/
/*** Buttons ***/
.button {
background-color: transparent;
border: 1px solid @bg-button-border;
border-radius: 0;
padding: 3px 4px;
box-shadow: inset 0 1px rgba(242, 242, 242, 0.1), 0 1px rgba(242, 242, 242, 0.1);
background-image: linear-gradient(to bottom, rgba(0,0,0,.05), rgba(0,0,0,.14) 40%, rgba(0,0,0,.26));
}
.message-dialog .dialog-action-area .button {
padding: 6px;
}
.button.Left + .button:not(.image-button).Right {
border-left: none;
}
GtkComboBox .button {
padding: 4px 3px;
}
#ToolPanelNotebook .button,
GtkDialog .button,
#BatchQueueButtonsMainContainer .button {
padding: 0px 3px;
}
#BatchQueueButtons .button {
padding-top: 6px;
padding-bottom: 6px
}
#BeforeAfterContainer .button {
padding: 2px;
}
/*** Fix: Space between first Retinex Comboboxes ***/
GtkLabel + GtkComboBox + GtkComboBox {
padding-left: 4px;
}
.text-button {
padding: 0 2px 0 0;
}
#PartialPaste .text-button {
padding: 0 8px 0 2px;
-GtkCheckButton-indicator-spacing: 1;
}
#ToolPanelNotebook GtkFrame > .text-button {
padding: 0 3px 0 0;
}
.button.text-button {
padding: 5px 12px;
}
#ToolPanelNotebook .button.text-button,
#PrefNotebook .button.text-button,
GtkFileChooserWidget .button.text-button,
#RightNotebook .button.text-button {
padding: 3px 4px;
}
GtkPopover .button.text-button {
padding: 2px 4px;
}
.spinbutton .button {
background-image: none;
background-color: transparent;
border: none;
border-radius: 0;
padding: 2px;
box-shadow: none;
}
#ToolPanelNotebook .spinbutton .button {
padding: 0;
}
.button:hover {
background-color: rgba(0, 0, 0,.18);
}
#ToolPanelNotebook .spinbutton .button:hover {
background-color: @bg-spin-button-hover;
}
.button:active,
.button:checked {
background-image: linear-gradient(to bottom, rgb(41,41,41), rgb(37,37,37) 40%, rgb(25,25,25));
background-color: transparent;
border-color: black;
}
#MainNotebook > GtkGrid .button {
padding: 2px;
border: 4px solid @bg-dark-grey;
background-color: transparent;
background-image: none;
box-shadow: none;
}
#MainNotebook tab .button {
padding: 1px;
border-top: 4px solid @bg-dark-grey;
border-bottom: 4px solid @bg-dark-grey;
border-left: none;
border-right: none;
background-color: transparent;
background-image: none;
box-shadow: none;
}
#MainNotebook > GtkGrid .button:hover,
#MainNotebook tab .button:hover {
background-color: rgba(255,255,255,.20);
box-shadow: inset 0 1px rgba(255, 255, 255, 0.12);
background-image: linear-gradient(to bottom, rgba(0,0,0,.05), rgba(0,0,0,.12) 40%, rgba(0,0,0,.24));
}
#MainNotebook > GtkGrid .button:active,
#MainNotebook tab .button:active {
background-color: rgba(255,255,255,.27);
box-shadow: inset 0 1px rgba(255, 255, 255, 0.12);
background-image: linear-gradient(to bottom, rgba(0,0,0,.05), rgba(0,0,0,.12) 40%, rgba(0,0,0,.24));
}
.view .button {
background-color: rgb(20,20,20);
padding: 1px 5px 2px;
background-image: none;
border-color: black;
box-shadow: none;
}
.menu .button.bottom,
.menu .button.bottom:insensitive {
background-color: rgb(20,20,20);
border-color: @accent-color;
border-width: 0 1px 1px 1px;
background-image: none;
box-shadow: none;
}
.menu .button.top,
.menu .button.top:insensitive {
background-color: rgb(20,20,20);
border-color: @accent-color;
border-width: 1px 1px 0 1px;
background-image: none;
box-shadow: none;
}
#fullButton,
#histButton {
padding: 5px;
border: none;
background-color: @bg-dark-grey;
background-image: none;
box-shadow: none;
}
/*** end ***/
/*** Check & Radio buttons ***/
.check,
.check row {
-gtk-icon-source: url("images/twb/checkbox-unchecked.png");
}
.check:checked,
.check row:checked {
-gtk-icon-source: url("images/twb/checkbox-checked.png");
}
.check:insensitive,
.check row:insensitive {
-gtk-icon-source: url("images/twb/checkbox-unchecked-disabled.png");
}
.check:checked:insensitive,
.check row:checked:insensitive {
-gtk-icon-source: url("images/twb/checkbox-checked-disabled.png");
}
.check:inconsistent,
.check row:inconsistent {
-gtk-icon-source: url("images/twb/checkbox-inconsistent.png");
}
.check:inconsistent:insensitive,
.check row:inconsistent:insensitive {
-gtk-icon-source: url("images/twb/checkbox-inconsistent-disabled.png");
}
.radio,
.radio row {
-gtk-icon-source: url("images/twb/radio-unchecked.png");
}
.radio:checked,
.radio row:checked {
-gtk-icon-source: url("images/twb/radio-checked.png");
}
.radio:insensitive,
.radio row:insensitive {
-gtk-icon-source: url("images/twb/radio-unchecked-disabled.png");
}
.radio:checked:insensitive,
.radio row:checked:insensitive {
-gtk-icon-source: url("images/twb/radio-checked-disabled.png");
}
.radio:inconsistent,
.radio row:inconsistent {
-gtk-icon-source: url("images/twb/radio-inconsistent.png");
}
.radio:inconsistent:insensitive,
.radio row:inconsistent:insensitive {
-gtk-icon-source: url("images/twb/radio-inconsistent-disabled.png");
}
/*** end ***/
/*** Disabled Items ***/
*:insensitive,
#ToolPanelNotebook *:insensitive {
color: rgb(128,128,128);
box-shadow: none;
}
#ToolPanelNotebook .entry:insensitive {
color: rgb(144,144,144);
background-color: rgba(255,255,255,.06);
box-shadow: none;
}
.button:insensitive {
background-image: none;
background-color: rgba(0,0,0,.10);
border-color: rgba(0,0,0,.30);
box-shadow: none;
}
.spinbutton .button:insensitive {
background-image: none;
background-color: transparent;
border: none;
box-shadow: none;
}
.scale.slider:insensitive,
.scale.trough.highlight:insensitive,
.scale.trough:insensitive,
#ToolPanelNotebook .scale.slider:insensitive,
#ToolPanelNotebook .scale.trough.highlight:insensitive,
#ToolPanelNotebook .scale.trough:insensitive {
background-color: rgb(65,65,65);
box-shadow: none;
background-image: none;
}
/*** end ***/

View File

@ -0,0 +1,124 @@
<?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"
id="svg6018"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="checkbox-checked-disabled.svg"
inkscape:export-filename="/tmp/16.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
<defs
id="defs6020" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="56.0625"
inkscape:cx="8"
inkscape:cy="8"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:showpageshadow="false"
showguides="true"
inkscape:guide-bbox="true"
units="px"
inkscape:snap-bbox="false"
inkscape:snap-midpoints="true"
inkscape:bbox-nodes="false"
inkscape:snap-grids="true"
inkscape:bbox-paths="false"
inkscape:snap-bbox-edge-midpoints="false"
inkscape:snap-bbox-midpoints="false"
inkscape:object-nodes="true"
inkscape:snap-intersection-paths="false"
inkscape:object-paths="false"
inkscape:snap-smooth-nodes="true"
inkscape:snap-object-midpoints="true"
inkscape:snap-others="true"
inkscape:snap-nodes="true">
<sodipodi:guide
position="8,15"
orientation="0,1"
id="guide6035"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="8,1"
orientation="0,1"
id="guide6037"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="1,8"
orientation="1,0"
id="guide6039"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="15,8"
orientation="1,0"
id="guide6041"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<inkscape:grid
type="xygrid"
id="grid6611"
enabled="true"
visible="true"
empspacing="8"
color="#ff0000"
opacity="0.1254902"
originx="0"
dotted="false"
spacingx="0.5"
spacingy="0.5" />
</sodipodi:namedview>
<metadata
id="metadata6023">
<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 />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-1036.3622)">
<path
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:1.2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
d="m 13.5,1043.3622 0,6.5 -12,0 0,-12 0,0 7.5,0"
id="path6609"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccc" />
<path
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:2.194;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-mid:none;enable-background:accumulate"
d="m 3.960076,1041.2107 3.5956705,3.5958 6.6685155,-6.6686"
id="path5910-7"
inkscape:connector-curvature="0"
inkscape:export-filename="/tmp/16.png"
inkscape:export-xdpi="1.4400001"
inkscape:export-ydpi="1.4400001" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

@ -0,0 +1,124 @@
<?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"
id="svg6018"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="checkbox-checked.svg"
inkscape:export-filename="/tmp/16.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
<defs
id="defs6020" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="56.0625"
inkscape:cx="7.9821628"
inkscape:cy="8"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:showpageshadow="false"
showguides="true"
inkscape:guide-bbox="true"
units="px"
inkscape:snap-bbox="false"
inkscape:snap-midpoints="true"
inkscape:bbox-nodes="false"
inkscape:snap-grids="true"
inkscape:bbox-paths="false"
inkscape:snap-bbox-edge-midpoints="false"
inkscape:snap-bbox-midpoints="false"
inkscape:object-nodes="true"
inkscape:snap-intersection-paths="false"
inkscape:object-paths="false"
inkscape:snap-smooth-nodes="true"
inkscape:snap-object-midpoints="true"
inkscape:snap-others="true"
inkscape:snap-nodes="true">
<sodipodi:guide
position="8,15"
orientation="0,1"
id="guide6035"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="8,1"
orientation="0,1"
id="guide6037"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="1,8"
orientation="1,0"
id="guide6039"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="15,8"
orientation="1,0"
id="guide6041"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<inkscape:grid
type="xygrid"
id="grid6611"
enabled="true"
visible="true"
empspacing="8"
color="#ff0000"
opacity="0.1254902"
originx="0"
dotted="false"
spacingx="0.5"
spacingy="0.5" />
</sodipodi:namedview>
<metadata
id="metadata6023">
<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 />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-1036.3622)">
<path
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#b4b4b4;stroke-width:1.2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
d="m 13.5,1043.3622 0,6.5 -12,0 0,-12 0,0 7.5,0"
id="path6609"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccc" />
<path
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#b4b4b4;stroke-width:2.19409847;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-mid:none;enable-background:accumulate"
d="m 3.960076,1041.2107 3.5956705,3.5958 6.6685155,-6.6686"
id="path5910-7"
inkscape:connector-curvature="0"
inkscape:export-filename="/tmp/16.png"
inkscape:export-xdpi="1.4400001"
inkscape:export-ydpi="1.4400001" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

@ -0,0 +1,124 @@
<?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"
id="svg6018"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="checkbox-inconsistent-disabled.svg"
inkscape:export-filename="/tmp/16.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
<defs
id="defs6020" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="56.0625"
inkscape:cx="5.039019"
inkscape:cy="8"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:showpageshadow="false"
showguides="true"
inkscape:guide-bbox="true"
units="px"
inkscape:snap-bbox="false"
inkscape:snap-midpoints="true"
inkscape:bbox-nodes="false"
inkscape:snap-grids="true"
inkscape:bbox-paths="false"
inkscape:snap-bbox-edge-midpoints="false"
inkscape:snap-bbox-midpoints="false"
inkscape:object-nodes="true"
inkscape:snap-intersection-paths="false"
inkscape:object-paths="false"
inkscape:snap-smooth-nodes="true"
inkscape:snap-object-midpoints="true"
inkscape:snap-others="true"
inkscape:snap-nodes="true">
<sodipodi:guide
position="8,15"
orientation="0,1"
id="guide6035"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="8,1"
orientation="0,1"
id="guide6037"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="1,8"
orientation="1,0"
id="guide6039"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="15,8"
orientation="1,0"
id="guide6041"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<inkscape:grid
type="xygrid"
id="grid6611"
enabled="true"
visible="true"
empspacing="8"
color="#ff0000"
opacity="0.1254902"
originx="0"
dotted="false"
spacingx="0.5"
spacingy="0.5" />
</sodipodi:namedview>
<metadata
id="metadata6023">
<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 />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-1036.3622)">
<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;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;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#808080;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;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 5,1041.3622 0,5 5,0 0,-5 z"
id="path5910-7"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" />
<rect
ry="0"
y="1037.8622"
x="1.5"
height="11.999906"
width="11.999984"
id="rect6602"
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:1.2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.6 KiB

View File

@ -0,0 +1,124 @@
<?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"
id="svg6018"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="checkbox-inconsistent.svg"
inkscape:export-filename="/tmp/16.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
<defs
id="defs6020" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="56.0625"
inkscape:cx="5.039019"
inkscape:cy="8"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:showpageshadow="false"
showguides="true"
inkscape:guide-bbox="true"
units="px"
inkscape:snap-bbox="false"
inkscape:snap-midpoints="true"
inkscape:bbox-nodes="false"
inkscape:snap-grids="true"
inkscape:bbox-paths="false"
inkscape:snap-bbox-edge-midpoints="false"
inkscape:snap-bbox-midpoints="false"
inkscape:object-nodes="true"
inkscape:snap-intersection-paths="false"
inkscape:object-paths="false"
inkscape:snap-smooth-nodes="true"
inkscape:snap-object-midpoints="true"
inkscape:snap-others="true"
inkscape:snap-nodes="true">
<sodipodi:guide
position="8,15"
orientation="0,1"
id="guide6035"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="8,1"
orientation="0,1"
id="guide6037"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="1,8"
orientation="1,0"
id="guide6039"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="15,8"
orientation="1,0"
id="guide6041"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<inkscape:grid
type="xygrid"
id="grid6611"
enabled="true"
visible="true"
empspacing="8"
color="#ff0000"
opacity="0.1254902"
originx="0"
dotted="false"
spacingx="0.5"
spacingy="0.5" />
</sodipodi:namedview>
<metadata
id="metadata6023">
<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 />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-1036.3622)">
<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;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;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#b4b4b4;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;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 5,1041.3622 0,5 5,0 0,-5 z"
id="path5910-7"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" />
<rect
ry="0"
y="1037.8622"
x="1.5"
height="11.999906"
width="11.999984"
id="rect6602"
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#b4b4b4;stroke-width:1.2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.6 KiB

View File

@ -0,0 +1,118 @@
<?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"
id="svg6018"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="checkbox-unchecked-disabled.svg"
inkscape:export-filename="/tmp/16.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
<defs
id="defs6020" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="56.0625"
inkscape:cx="5.039019"
inkscape:cy="8"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:showpageshadow="false"
showguides="true"
inkscape:guide-bbox="true"
units="px"
inkscape:snap-bbox="false"
inkscape:snap-midpoints="true"
inkscape:bbox-nodes="false"
inkscape:snap-grids="true"
inkscape:bbox-paths="false"
inkscape:snap-bbox-edge-midpoints="false"
inkscape:snap-bbox-midpoints="false"
inkscape:object-nodes="true"
inkscape:snap-intersection-paths="false"
inkscape:object-paths="false"
inkscape:snap-smooth-nodes="true"
inkscape:snap-object-midpoints="true"
inkscape:snap-others="true"
inkscape:snap-nodes="true">
<sodipodi:guide
position="8,15"
orientation="0,1"
id="guide6035"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="8,1"
orientation="0,1"
id="guide6037"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="1,8"
orientation="1,0"
id="guide6039"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="15,8"
orientation="1,0"
id="guide6041"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<inkscape:grid
type="xygrid"
id="grid6611"
enabled="true"
visible="true"
empspacing="8"
color="#ff0000"
opacity="0.1254902"
originx="0"
dotted="false"
spacingx="0.5"
spacingy="0.5" />
</sodipodi:namedview>
<metadata
id="metadata6023">
<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 />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-1036.3622)">
<rect
ry="0"
y="1037.8622"
x="1.5"
height="11.999906"
width="11.999984"
id="rect6602"
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:1.2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

View File

@ -0,0 +1,118 @@
<?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"
id="svg6018"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="checkbox-unchecked.svg"
inkscape:export-filename="/tmp/16.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
<defs
id="defs6020" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="56.0625"
inkscape:cx="5.039019"
inkscape:cy="8"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:showpageshadow="false"
showguides="true"
inkscape:guide-bbox="true"
units="px"
inkscape:snap-bbox="false"
inkscape:snap-midpoints="true"
inkscape:bbox-nodes="false"
inkscape:snap-grids="true"
inkscape:bbox-paths="false"
inkscape:snap-bbox-edge-midpoints="false"
inkscape:snap-bbox-midpoints="false"
inkscape:object-nodes="true"
inkscape:snap-intersection-paths="false"
inkscape:object-paths="false"
inkscape:snap-smooth-nodes="true"
inkscape:snap-object-midpoints="true"
inkscape:snap-others="true"
inkscape:snap-nodes="true">
<sodipodi:guide
position="8,15"
orientation="0,1"
id="guide6035"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="8,1"
orientation="0,1"
id="guide6037"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="1,8"
orientation="1,0"
id="guide6039"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="15,8"
orientation="1,0"
id="guide6041"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<inkscape:grid
type="xygrid"
id="grid6611"
enabled="true"
visible="true"
empspacing="8"
color="#ff0000"
opacity="0.1254902"
originx="0"
dotted="false"
spacingx="0.5"
spacingy="0.5" />
</sodipodi:namedview>
<metadata
id="metadata6023">
<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 />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-1036.3622)">
<rect
ry="0"
y="1037.8622"
x="1.5"
height="11.999906"
width="11.999984"
id="rect6602"
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#b4b4b4;stroke-width:1.2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

View File

@ -0,0 +1,122 @@
<?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"
id="svg6018"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="radio-checked-disabled.svg"
inkscape:export-filename="/tmp/16.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
<defs
id="defs6020" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="56.0625"
inkscape:cx="8"
inkscape:cy="8"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:showpageshadow="false"
showguides="true"
inkscape:guide-bbox="true"
units="px"
inkscape:snap-bbox="false"
inkscape:snap-midpoints="true"
inkscape:bbox-nodes="false"
inkscape:snap-grids="true"
inkscape:bbox-paths="false"
inkscape:snap-bbox-edge-midpoints="false"
inkscape:snap-bbox-midpoints="false"
inkscape:object-nodes="true"
inkscape:snap-intersection-paths="false"
inkscape:object-paths="false"
inkscape:snap-smooth-nodes="true"
inkscape:snap-object-midpoints="true"
inkscape:snap-others="true"
inkscape:snap-nodes="true">
<sodipodi:guide
position="8,15"
orientation="0,1"
id="guide6035"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="8,1"
orientation="0,1"
id="guide6037"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="1,8"
orientation="1,0"
id="guide6039"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="15,8"
orientation="1,0"
id="guide6041"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<inkscape:grid
type="xygrid"
id="grid6611"
enabled="true"
visible="true"
empspacing="8"
color="#ff0000"
opacity="0.1254902"
originx="0"
dotted="false"
spacingx="0.5"
spacingy="0.5" />
</sodipodi:namedview>
<metadata
id="metadata6023">
<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>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-1036.3622)">
<circle
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
id="path6734"
cx="7.5000086"
cy="1043.8622"
r="5.9999828" />
<circle
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
id="path6736"
r="2.4999826"
cy="1043.8622"
cx="7.5" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@ -0,0 +1,122 @@
<?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"
id="svg6018"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="radio-checked.svg"
inkscape:export-filename="/tmp/16.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
<defs
id="defs6020" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="56.0625"
inkscape:cx="8"
inkscape:cy="8"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:showpageshadow="false"
showguides="true"
inkscape:guide-bbox="true"
units="px"
inkscape:snap-bbox="false"
inkscape:snap-midpoints="true"
inkscape:bbox-nodes="false"
inkscape:snap-grids="true"
inkscape:bbox-paths="false"
inkscape:snap-bbox-edge-midpoints="false"
inkscape:snap-bbox-midpoints="false"
inkscape:object-nodes="true"
inkscape:snap-intersection-paths="false"
inkscape:object-paths="false"
inkscape:snap-smooth-nodes="true"
inkscape:snap-object-midpoints="true"
inkscape:snap-others="true"
inkscape:snap-nodes="true">
<sodipodi:guide
position="8,15"
orientation="0,1"
id="guide6035"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="8,1"
orientation="0,1"
id="guide6037"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="1,8"
orientation="1,0"
id="guide6039"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="15,8"
orientation="1,0"
id="guide6041"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<inkscape:grid
type="xygrid"
id="grid6611"
enabled="true"
visible="true"
empspacing="8"
color="#ff0000"
opacity="0.1254902"
originx="0"
dotted="false"
spacingx="0.5"
spacingy="0.5" />
</sodipodi:namedview>
<metadata
id="metadata6023">
<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 />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-1036.3622)">
<circle
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#b4b4b4;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
id="path6734"
cx="7.5000086"
cy="1043.8622"
r="5.9999828" />
<circle
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#b4b4b4;fill-opacity:1;fill-rule:nonzero;stroke:#b4b4b4;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
id="path6736"
r="2.4999826"
cy="1043.8622"
cx="7.5" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@ -0,0 +1,122 @@
<?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"
id="svg6018"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="radio-inconsistent-disabled.svg"
inkscape:export-filename="/tmp/16.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
<defs
id="defs6020" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="56.0625"
inkscape:cx="8"
inkscape:cy="8"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:showpageshadow="false"
showguides="true"
inkscape:guide-bbox="true"
units="px"
inkscape:snap-bbox="false"
inkscape:snap-midpoints="true"
inkscape:bbox-nodes="false"
inkscape:snap-grids="true"
inkscape:bbox-paths="false"
inkscape:snap-bbox-edge-midpoints="false"
inkscape:snap-bbox-midpoints="false"
inkscape:object-nodes="true"
inkscape:snap-intersection-paths="false"
inkscape:object-paths="false"
inkscape:snap-smooth-nodes="true"
inkscape:snap-object-midpoints="true"
inkscape:snap-others="true"
inkscape:snap-nodes="true">
<sodipodi:guide
position="8,15"
orientation="0,1"
id="guide6035"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="8,1"
orientation="0,1"
id="guide6037"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="1,8"
orientation="1,0"
id="guide6039"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="15,8"
orientation="1,0"
id="guide6041"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<inkscape:grid
type="xygrid"
id="grid6611"
enabled="true"
visible="true"
empspacing="8"
color="#ff0000"
opacity="0.1254902"
originx="0"
dotted="false"
spacingx="0.5"
spacingy="0.5" />
</sodipodi:namedview>
<metadata
id="metadata6023">
<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>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-1036.3622)">
<circle
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
id="path6734"
cx="7.5000086"
cy="1043.8622"
r="5.9999828" />
<circle
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
id="path6736"
r="2.4999826"
cy="1043.8622"
cx="7.5" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@ -0,0 +1,122 @@
<?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"
id="svg6018"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="radio-inconsistent.svg"
inkscape:export-filename="/tmp/16.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
<defs
id="defs6020" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="56.0625"
inkscape:cx="8"
inkscape:cy="8"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:showpageshadow="false"
showguides="true"
inkscape:guide-bbox="true"
units="px"
inkscape:snap-bbox="false"
inkscape:snap-midpoints="true"
inkscape:bbox-nodes="false"
inkscape:snap-grids="true"
inkscape:bbox-paths="false"
inkscape:snap-bbox-edge-midpoints="false"
inkscape:snap-bbox-midpoints="false"
inkscape:object-nodes="true"
inkscape:snap-intersection-paths="false"
inkscape:object-paths="false"
inkscape:snap-smooth-nodes="true"
inkscape:snap-object-midpoints="true"
inkscape:snap-others="true"
inkscape:snap-nodes="true">
<sodipodi:guide
position="8,15"
orientation="0,1"
id="guide6035"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="8,1"
orientation="0,1"
id="guide6037"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="1,8"
orientation="1,0"
id="guide6039"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="15,8"
orientation="1,0"
id="guide6041"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<inkscape:grid
type="xygrid"
id="grid6611"
enabled="true"
visible="true"
empspacing="8"
color="#ff0000"
opacity="0.1254902"
originx="0"
dotted="false"
spacingx="0.5"
spacingy="0.5" />
</sodipodi:namedview>
<metadata
id="metadata6023">
<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 />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-1036.3622)">
<circle
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#b4b4b4;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
id="path6734"
cx="7.5000086"
cy="1043.8622"
r="5.9999828" />
<circle
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#b4b4b4;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
id="path6736"
r="2.4999826"
cy="1043.8622"
cx="7.5" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@ -0,0 +1,116 @@
<?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"
id="svg6018"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="radio-unchecked-disabled.svg"
inkscape:export-filename="/tmp/16.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
<defs
id="defs6020" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="56.0625"
inkscape:cx="8"
inkscape:cy="8"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:showpageshadow="false"
showguides="true"
inkscape:guide-bbox="true"
units="px"
inkscape:snap-bbox="false"
inkscape:snap-midpoints="true"
inkscape:bbox-nodes="false"
inkscape:snap-grids="true"
inkscape:bbox-paths="false"
inkscape:snap-bbox-edge-midpoints="false"
inkscape:snap-bbox-midpoints="false"
inkscape:object-nodes="true"
inkscape:snap-intersection-paths="false"
inkscape:object-paths="false"
inkscape:snap-smooth-nodes="true"
inkscape:snap-object-midpoints="true"
inkscape:snap-others="true"
inkscape:snap-nodes="true">
<sodipodi:guide
position="8,15"
orientation="0,1"
id="guide6035"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="8,1"
orientation="0,1"
id="guide6037"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="1,8"
orientation="1,0"
id="guide6039"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="15,8"
orientation="1,0"
id="guide6041"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<inkscape:grid
type="xygrid"
id="grid6611"
enabled="true"
visible="true"
empspacing="8"
color="#ff0000"
opacity="0.1254902"
originx="0"
dotted="false"
spacingx="0.5"
spacingy="0.5" />
</sodipodi:namedview>
<metadata
id="metadata6023">
<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>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-1036.3622)">
<circle
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
id="path6734"
cx="7.5000086"
cy="1043.8622"
r="5.9999828" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@ -0,0 +1,116 @@
<?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"
id="svg6018"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="radio-unchecked.svg"
inkscape:export-filename="/tmp/16.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
<defs
id="defs6020" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="56.0625"
inkscape:cx="8"
inkscape:cy="8"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:showpageshadow="false"
showguides="true"
inkscape:guide-bbox="true"
units="px"
inkscape:snap-bbox="false"
inkscape:snap-midpoints="true"
inkscape:bbox-nodes="false"
inkscape:snap-grids="true"
inkscape:bbox-paths="false"
inkscape:snap-bbox-edge-midpoints="false"
inkscape:snap-bbox-midpoints="false"
inkscape:object-nodes="true"
inkscape:snap-intersection-paths="false"
inkscape:object-paths="false"
inkscape:snap-smooth-nodes="true"
inkscape:snap-object-midpoints="true"
inkscape:snap-others="true"
inkscape:snap-nodes="true">
<sodipodi:guide
position="8,15"
orientation="0,1"
id="guide6035"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="8,1"
orientation="0,1"
id="guide6037"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="1,8"
orientation="1,0"
id="guide6039"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="15,8"
orientation="1,0"
id="guide6041"
inkscape:label=""
inkscape:color="rgb(0,0,255)" />
<inkscape:grid
type="xygrid"
id="grid6611"
enabled="true"
visible="true"
empspacing="8"
color="#ff0000"
opacity="0.1254902"
originx="0"
dotted="false"
spacingx="0.5"
spacingy="0.5" />
</sodipodi:namedview>
<metadata
id="metadata6023">
<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 />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-1036.3622)">
<circle
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#b4b4b4;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
id="path6734"
cx="7.5000086"
cy="1043.8622"
r="5.9999828" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 378 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 428 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 265 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 295 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 247 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 272 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 524 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 593 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 556 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 631 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 438 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 503 B

View File

@ -29,7 +29,7 @@ set (RTENGINESOURCEFILES colortemp.cc curves.cc flatcurves.cc diagonalcurves.cc
include_directories (BEFORE "${CMAKE_CURRENT_BINARY_DIR}")
add_library (rtengine ${RTENGINESOURCEFILES})
add_dependencies (rtengine AboutFile)
add_dependencies (rtengine UpdateInfo)
#It may be nice to store library version too
IF (BUILD_SHARED_LIBS)

View File

@ -11,6 +11,7 @@
/*RT*/#define DJGPP
#include "opthelper.h"
/*
dcraw.c -- Dave Coffin's raw photo decoder
Copyright 1997-2016 by Dave Coffin, dcoffin a cybercom o net
@ -2011,7 +2012,7 @@ void CLASS hasselblad_correct()
{bhu-1,0},{bhu-1,bwu/2},{bhu-1,bwu-1}};
for (col = 0; col < bw; col++) {
for (i = 0; i < 9; i++) {
ushort dist = (ushort)sqrt(abs(corners[i][0] - row) * abs(corners[i][0] - row) + abs(corners[i][1] - col) * abs(corners[i][1] - col));
ushort dist = (ushort)sqrt(abs((int)(corners[i][0] - row)) * abs((int)(corners[i][0] - row)) + abs((int)(corners[i][1] - col)) * abs((int)(corners[i][1] - col)));
ushort weight = dist > maxdist ? 0 : maxdist - dist;
corners_weight[9*(row*bw+col)+i] = weight;
}
@ -6264,6 +6265,7 @@ void CLASS apply_tiff()
tile_width = tiff_ifd[i].tile_width;
tile_length = tiff_ifd[i].tile_length;
shutter = tiff_ifd[i].shutter;
raw_size = tiff_ifd[i].bytes;
raw = i;
}
}
@ -9016,6 +9018,9 @@ canon_a5:
if (filters == 9)
FORC(36) ((char *)xtrans)[c] =
xtrans_abs[(c/6+top_margin) % 6][(c+left_margin) % 6];
if(filters == 9 && raw_height * raw_width * 2 != raw_size) {
xtransCompressed = true;
}
} else if (!strcmp(model,"KD-400Z")) {
height = 1712;
width = 2312;
@ -9791,20 +9796,22 @@ void CLASS deflate_dng_load_raw() {
}
uLongf dstLen = tile_width * tile_length * 4;
#ifdef _OPENMP
#if defined(_OPENMP) && ZLIB_VER_REVISION == 8
#pragma omp parallel
#endif
{
Bytef * cBuffer = new Bytef[maxCompressed];
Bytef * uBuffer = new Bytef[dstLen];
#ifdef _OPENMP
#if defined(_OPENMP) && ZLIB_VER_REVISION == 8
#pragma omp for collapse(2) nowait
#endif
for (size_t y = 0; y < raw_height; y += tile_length) {
for (size_t x = 0; x < raw_width; x += tile_width) {
size_t t = (y / tile_length) * tilesWide + (x / tile_width);
#if defined(_OPENMP) && ZLIB_VER_REVISION == 8
#pragma omp critical
#endif
{
fseek(ifp, tileOffsets[t], SEEK_SET);
fread(cBuffer, 1, tileBytes[t], ifp);
@ -9863,6 +9870,8 @@ struct tiff_hdr {
char desc[512], make[64], model[64], soft[32], date[20], artist[64];
};
#include "xtranscompressed.cc"
/* RT: Delete from here */
/*RT*/#undef SQR
/*RT*/#undef MAX

View File

@ -89,8 +89,51 @@ protected:
unsigned black, cblack[4102], maximum, mix_green, raw_color, zero_is_bad;
unsigned zero_after_ff, is_raw, dng_version, is_foveon, data_error;
unsigned tile_width, tile_length, gpsdata[32], load_flags;
bool xtransCompressed = false;
struct xtrans_params
{
char *q_table; /* quantization table */
int q_point[5]; /* quantization points */
int max_bits;
int min_value;
int raw_bits;
int total_values;
int maxDiff;
ushort line_width;
};
struct int_pair {
int value1;
int value2;
};
enum _xt_lines
{
_R0=0,_R1,_R2,_R3,_R4,
_G0,_G1,_G2,_G3,_G4,_G5,_G6,_G7,
_B0,_B1,_B2,_B3,_B4,
_ltotal
};
struct xtrans_block {
int cur_bit; // current bit being read (from left to right)
int cur_pos; // current position in a buffer
INT64 cur_buf_offset; // offset of this buffer in a file
unsigned max_read_size; // Amount of data to be read
int cur_buf_size; // buffer size
uchar *cur_buf; // currently read block
IMFILE *input;
struct int_pair grad_even[3][41]; // tables of gradients
struct int_pair grad_odd[3][41];
ushort *linealloc;
ushort *linebuf[_ltotal];
};
int fuji_total_lines, fuji_total_blocks, fuji_block_width, fuji_bits;
ushort raw_height, raw_width, height, width, top_margin, left_margin;
ushort shrink, iheight, iwidth, fuji_width, thumb_width, thumb_height;
unsigned raw_size;
ushort *raw_image;
float * float_raw_image;
ushort white[8][8], curve[0x10000], cr2_slice[3], sraw_mul[4];
@ -226,6 +269,25 @@ void adobe_copy_pixel (unsigned row, unsigned col, ushort **rp);
void lossless_dng_load_raw();
void packed_dng_load_raw();
void deflate_dng_load_raw();
void init_xtrans(struct xtrans_params* info);
void fuji_fill_buffer(struct xtrans_block *info);
void init_xtrans_block(struct xtrans_block* info, const struct xtrans_params *params, INT64 raw_offset, unsigned dsize);
void copy_line_to_xtrans(struct xtrans_block* info, int cur_line, int cur_block, int cur_block_width);
void fuji_zerobits(struct xtrans_block* info, int *count);
void fuji_read_code(struct xtrans_block* info, int *data, int bits_to_read);
int bitDiff(int value1, int value2);
int fuji_decode_sample_even(struct xtrans_block* info, const struct xtrans_params * params, ushort* line_buf, int pos, struct int_pair* grads);
int fuji_decode_sample_odd(struct xtrans_block* info, const struct xtrans_params * params, ushort* line_buf, int pos, struct int_pair* grads);
void fuji_decode_interpolation_even(int line_width, ushort* line_buf, int pos);
void xtrans_extend_generic(ushort *linebuf[_ltotal], int line_width, int start, int end);
void xtrans_extend_red(ushort *linebuf[_ltotal], int line_width);
void xtrans_extend_green(ushort *linebuf[_ltotal], int line_width);
void xtrans_extend_blue(ushort *linebuf[_ltotal], int line_width);
void xtrans_decode_block(struct xtrans_block* info, const struct xtrans_params *params, int cur_line);
void xtrans_decode_strip(const struct xtrans_params* info_common, int cur_block, INT64 raw_offset, unsigned dsize);
void xtrans_compressed_load_raw();
void xtrans_decode_loop(const struct xtrans_params* common_info, int count, INT64* raw_block_offsets, unsigned *block_sizes);
void parse_xtrans_header();
void pentax_load_raw();
void nikon_load_raw();
int nikon_is_compressed();

View File

@ -22,8 +22,18 @@
#include "mytime.h"
#include "refreshmap.h"
#include "rt_math.h"
// "ceil" rounding
#define SKIPS(a,b) ((a) / (b) + ((a) % (b) > 0))
namespace
{
// "ceil" rounding
template<typename T>
constexpr T skips(T a, T b)
{
return a / b + static_cast<bool>(a % b);
}
}
namespace rtengine
{
@ -33,7 +43,7 @@ extern const Settings* settings;
Crop::Crop (ImProcCoordinator* parent, EditDataProvider *editDataProvider, bool isDetailWindow)
: PipetteBuffer(editDataProvider), origCrop(nullptr), laboCrop(nullptr), labnCrop(nullptr),
cropImg(nullptr), cbuf_real(nullptr), cshmap(nullptr), transCrop(nullptr), cieCrop(nullptr), cbuffer(nullptr),
updating(false), newUpdatePending(false), skip(10), padding(0),
updating(false), newUpdatePending(false), skip(10),
cropx(0), cropy(0), cropw(-1), croph(-1),
trafx(0), trafy(0), trafw(-1), trafh(-1),
rqcropx(0), rqcropy(0), rqcropw(-1), rqcroph(-1),
@ -111,6 +121,12 @@ void Crop::setEditSubscriber(EditSubscriber* newSubscriber)
// If oldSubscriber == NULL && newSubscriber != NULL && newSubscriber->getEditingType() == ET_PIPETTE-> the image will be allocated when necessary
}
bool Crop::hasListener()
{
MyMutex::MyLock cropLock(cropMutex);
return cropImageListener;
}
void Crop::update (int todo)
{
MyMutex::MyLock cropLock(cropMutex);
@ -684,7 +700,7 @@ void Crop::update (int todo)
}
if (needstransform)
parent->ipf.transform (baseCrop, transCrop, cropx / skip, cropy / skip, trafx / skip, trafy / skip, SKIPS(parent->fw, skip), SKIPS(parent->fh, skip), parent->getFullWidth(), parent->getFullHeight(),
parent->ipf.transform (baseCrop, transCrop, cropx / skip, cropy / skip, trafx / skip, trafy / skip, skips(parent->fw, skip), skips(parent->fh, skip), parent->getFullWidth(), parent->getFullHeight(),
parent->imgsrc->getMetaData()->getFocalLen(), parent->imgsrc->getMetaData()->getFocalLen35mm(),
parent->imgsrc->getMetaData()->getFocusDist(), parent->imgsrc->getRotateDegree(), false);
else
@ -714,7 +730,7 @@ void Crop::update (int todo)
// blurmap for shadow & highlights
if ((todo & M_BLURMAP) && params.sh.enabled) {
double radius = sqrt (double(SKIPS(parent->fw, skip) * SKIPS(parent->fw, skip) + SKIPS(parent->fh, skip) * SKIPS(parent->fh, skip))) / 2.0;
double radius = sqrt (double(skips(parent->fw, skip) * skips(parent->fw, skip) + skips(parent->fh, skip) * skips(parent->fh, skip))) / 2.0;
double shradius = params.sh.radius;
if (!params.sh.hq) {
@ -1114,11 +1130,11 @@ bool Crop::setCropSizes (int rcx, int rcy, int rcw, int rch, int skip, bool inte
int orW, orH;
parent->imgsrc->getSize (cp, orW, orH);
int cw = SKIPS(bw, skip);
int ch = SKIPS(bh, skip);
int cw = skips(bw, skip);
int ch = skips(bh, skip);
leftBorder = SKIPS(rqx1 - bx1, skip);
upperBorder = SKIPS(rqy1 - by1, skip);
leftBorder = skips(rqx1 - bx1, skip);
upperBorder = skips(rqy1 - by1, skip);
if (settings->verbose) {
printf ("setsizes starts (%d, %d, %d, %d, %d, %d)\n", orW, orH, trafw, trafh, cw, ch);
@ -1286,5 +1302,22 @@ void Crop::fullUpdate ()
parent->updaterThreadStart.unlock ();
}
int Crop::get_skip()
{
MyMutex::MyLock lock(cropMutex);
return skip;
}
int Crop::getLeftBorder()
{
MyMutex::MyLock lock(cropMutex);
return leftBorder;
}
int Crop::getUpperBorder()
{
MyMutex::MyLock lock(cropMutex);
return upperBorder;
}
}

View File

@ -16,8 +16,7 @@
* You should have received a copy of the GNU General Public License
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _CROP_H_
#define _CROP_H_
#pragma once
#include "improccoordinator.h"
#include "rtengine.h"
@ -57,19 +56,18 @@ protected:
bool updating; /// Flag telling if an updater thread is currently processing
bool newUpdatePending; /// Flag telling the updater thread that a new update is pending
int skip;
int padding; /// Minimum space allowed around image in the display area
int cropx, cropy, cropw, croph; /// size of the detail crop image ('skip' taken into account), with border
int trafx, trafy, trafw, trafh; /// the size and position to get from the imagesource that is transformed to the requested crop area
int rqcropx, rqcropy, rqcropw, rqcroph; /// size of the requested detail crop image (the image might be smaller) (without border)
int borderRequested; /// requested extra border size for image processing
const int borderRequested; /// requested extra border size for image processing
int upperBorder, leftBorder; /// extra border size really allocated for image processing
bool cropAllocated;
DetailedCropListener* cropImageListener;
MyMutex cropMutex;
ImProcCoordinator* parent;
bool isDetailWindow;
ImProcCoordinator* const parent;
const bool isDetailWindow;
EditUniqueID getCurrEditID();
bool setCropSizes (int cropX, int cropY, int cropW, int cropH, int skip, bool internal);
void freeAll ();
@ -78,19 +76,8 @@ public:
Crop (ImProcCoordinator* parent, EditDataProvider *editDataProvider, bool isDetailWindow);
virtual ~Crop ();
void mLock ()
{
cropMutex.lock();
}
void mUnlock ()
{
cropMutex.lock();
}
void setEditSubscriber(EditSubscriber* newSubscriber);
bool hasListener ()
{
return cropImageListener;
}
bool hasListener();
void update (int todo);
void setWindow (int cropX, int cropY, int cropW, int cropH, int skip)
{
@ -106,22 +93,8 @@ public:
void setListener (DetailedCropListener* il);
void destroy ();
int get_skip ()
{
return skip;
}
int getPadding ()
{
return padding;
}
int getLeftBorder ()
{
return leftBorder;
}
int getUpperBorder ()
{
return upperBorder;
}
int get_skip();
int getLeftBorder();
int getUpperBorder();
};
}
#endif

View File

@ -1351,7 +1351,7 @@ int ImageIO::saveTIFF (Glib::ustring fname, int bps, bool uncompressed)
}
TIFFSetField (out, TIFFTAG_SOFTWARE, "RawTherapee " VERSION);
TIFFSetField (out, TIFFTAG_SOFTWARE, "RawTherapee " RTVERSION);
TIFFSetField (out, TIFFTAG_IMAGEWIDTH, width);
TIFFSetField (out, TIFFTAG_IMAGELENGTH, height);
TIFFSetField (out, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);

View File

@ -69,7 +69,7 @@
#define ALIGNED64
#define ALIGNED16
#endif
#if !defined(__clang__) && defined _OPENMP
#if defined _OPENMP
#define _RT_NESTED_OPENMP
#endif
#endif

View File

@ -26,7 +26,7 @@
#include "../rtgui/paramsedited.h"
#include "../rtgui/options.h"
#include <locale.h>
#define APPVERSION VERSION
#define APPVERSION RTVERSION
using namespace std;
extern Options options;

View File

@ -435,6 +435,10 @@ int RawImage::loadRaw (bool loadData, bool closeFile, ProgressListener *plistene
return 2;
}
if(xtransCompressed) {
parse_xtrans_header();
}
if (flip == 5) {
this->rotate_deg = 270;
} else if (flip == 3) {

View File

@ -0,0 +1,800 @@
/* -*- C++ -*-
* File: xtranscompressed.cpp
* Copyright (C) 2016 Alexey Danilchenko
*
* Adopted to LibRaw by Alex Tutubalin, lexa@lexa.ru
* LibRaw Fujifilm/compressed decoder
LibRaw is free software; you can redistribute it and/or modify
it under the terms of the one of three licenses as you choose:
1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1
(See file LICENSE.LGPL provided in LibRaw distribution archive for details).
2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0
(See file LICENSE.CDDL provided in LibRaw distribution archive for details).
* Adopted to RawTherapee by Ingo Weyrich
*/
void CLASS init_xtrans (struct xtrans_params* info)
{
int cur_val, i;
char *qt;
if (fuji_block_width % 3) {
derror();
}
info->q_table = (char *) malloc (32768);
merror (info->q_table, "init_xtrans()");
info->line_width = (fuji_block_width * 2) / 3;
info->q_point[0] = 0;
info->q_point[1] = 0x12;
info->q_point[2] = 0x43;
info->q_point[3] = 0x114;
info->q_point[4] = (1 << fuji_bits) - 1;
info->min_value = 0x40;
cur_val = -info->q_point[4];
for (qt = info->q_table; cur_val <= info->q_point[4]; ++qt, ++cur_val) {
if (cur_val <= -info->q_point[3]) {
*qt = -4;
} else if (cur_val <= -info->q_point[2]) {
*qt = -3;
} else if (cur_val <= -info->q_point[1]) {
*qt = -2;
} else if (cur_val < 0) {
*qt = -1;
} else if (cur_val == 0) {
*qt = 0;
} else if (cur_val < info->q_point[1]) {
*qt = 1;
} else if (cur_val < info->q_point[2]) {
*qt = 2;
} else if (cur_val < info->q_point[3]) {
*qt = 3;
} else {
*qt = 4;
}
}
// populting gradients
if (info->q_point[4] == 0x3FFF) {
info->total_values = 0x4000;
info->raw_bits = 14;
info->max_bits = 56;
info->maxDiff = 256;
} else if (info->q_point[4] == 0xFFF) {
info->total_values = 4096;
info->raw_bits = 12;
info->max_bits = 48;
info->maxDiff = 64;
} else {
derror();
}
}
#define XTRANS_BUF_SIZE 0x10000u
void CLASS fuji_fill_buffer (struct xtrans_block *info)
{
if (info->cur_pos >= info->cur_buf_size) {
info->cur_pos = 0;
info->cur_buf_offset += info->cur_buf_size;
#ifdef _OPENMP
#pragma omp critical
#endif
{
fseek (info->input, info->cur_buf_offset, SEEK_SET);
info->cur_buf_size = fread (info->cur_buf, 1, std::min (info->max_read_size, XTRANS_BUF_SIZE), info->input);
}
if (info->cur_buf_size < 1) // nothing read
;//throw LIBRAW_EXCEPTION_IO_EOF;
info->max_read_size -= info->cur_buf_size;
}
}
void CLASS init_xtrans_block (struct xtrans_block* info, const struct xtrans_params *params, INT64 raw_offset, unsigned dsize)
{
info->linealloc = (ushort*)calloc (sizeof (ushort), _ltotal * (params->line_width + 2));
merror (info->linealloc, "init_xtrans_block()");
info->input = ifp;
INT64 fsize = info->input->size;
info->max_read_size = std::min (unsigned (fsize - raw_offset), dsize + 16); // Data size may be incorrect?
info->linebuf[_R0] = info->linealloc;
for (int i = _R1; i <= _B4; i++) {
info->linebuf[i] = info->linebuf[i - 1] + params->line_width + 2;
}
// init buffer
info->cur_buf = (uchar*)malloc (XTRANS_BUF_SIZE);
merror (info->cur_buf, "init_xtrans_block()");
info->cur_bit = 0;
info->cur_pos = 0;
info->cur_buf_offset = raw_offset;
for (int j = 0; j < 3; j++)
for (int i = 0; i < 41; i++) {
info->grad_even[j][i].value1 = params->maxDiff;
info->grad_even[j][i].value2 = 1;
info->grad_odd[j][i].value1 = params->maxDiff;
info->grad_odd[j][i].value2 = 1;
}
info->cur_buf_size = 0;
fuji_fill_buffer (info);
}
void CLASS copy_line_to_xtrans (struct xtrans_block* info, int cur_line, int cur_block, int cur_block_width)
{
ushort *lineBufB[3];
ushort *lineBufG[6];
ushort *lineBufR[3];
unsigned pixel_count;
ushort* line_buf;
int index;
int offset = fuji_block_width * cur_block + 6 * raw_width * cur_line;
ushort* raw_block_data = raw_image + offset;
int row_count = 0;
for (int i = 0; i < 3; i++) {
lineBufR[i] = info->linebuf[_R2 + i] + 1;
lineBufB[i] = info->linebuf[_B2 + i] + 1;
}
for (int i = 0; i < 6; i++) {
lineBufG[i] = info->linebuf[_G2 + i] + 1;
}
while (row_count < 6) {
pixel_count = 0;
while (pixel_count < cur_block_width) {
switch (xtrans_abs[row_count][ (pixel_count % 6)]) {
case 0: // red
line_buf = lineBufR[row_count >> 1];
break;
case 1: // green
line_buf = lineBufG[row_count];
break;
case 2: // blue
line_buf = lineBufB[row_count >> 1];
break;
}
index = (((pixel_count * 2 / 3) & 0x7FFFFFFE) | (pixel_count % 3) & 1) + ((pixel_count % 3) >> 1);
raw_block_data[pixel_count] = line_buf[index];
++pixel_count;
}
++row_count;
raw_block_data += raw_width;
}
}
#define fuji_quant_gradient(i,v1,v2) (9*i->q_table[i->q_point[4]+(v1)] + i->q_table[i->q_point[4]+(v2)])
void CLASS fuji_zerobits (struct xtrans_block* info, int *count)
{
uchar zero = 0;
*count = 0;
while (zero == 0) {
zero = (info->cur_buf[info->cur_pos] >> (7 - info->cur_bit)) & 1;
info->cur_bit++;
info->cur_bit &= 7;
if (!info->cur_bit) {
++info->cur_pos;
fuji_fill_buffer (info);
}
if (zero) {
break;
}
++*count;
}
}
void CLASS fuji_read_code (struct xtrans_block* info, int *data, int bits_to_read)
{
uchar bits_left = bits_to_read;
uchar bits_left_in_byte = 8 - (info->cur_bit & 7);
*data = 0;
if (!bits_to_read) {
return;
}
if (bits_to_read >= bits_left_in_byte) {
do {
*data <<= bits_left_in_byte;
bits_left -= bits_left_in_byte;
*data |= info->cur_buf[info->cur_pos] & ((1 << bits_left_in_byte) - 1);
++info->cur_pos;
fuji_fill_buffer (info);
bits_left_in_byte = 8;
} while (bits_left >= 8);
}
if (!bits_left) {
info->cur_bit = (8 - (bits_left_in_byte & 7)) & 7;
return;
}
*data <<= bits_left;
bits_left_in_byte -= bits_left;
*data |= ((1 << bits_left) - 1) & ((unsigned)info->cur_buf[info->cur_pos] >> bits_left_in_byte);
info->cur_bit = (8 - (bits_left_in_byte & 7)) & 7;
}
int CLASS bitDiff (int value1, int value2)
{
int decBits = 0;
if ( value2 < value1 )
while (decBits <= 12 && (value2 << ++decBits) < value1)
;
return decBits;
}
int CLASS fuji_decode_sample_even (struct xtrans_block* info, const struct xtrans_params * params, ushort* line_buf, int pos, struct int_pair* grads)
{
int interp_val = 0;
int errcnt = 0;
int sample = 0, code = 0;
ushort* line_buf_cur = line_buf + pos;
int Rb = line_buf_cur[-2 - params->line_width];
int Rc = line_buf_cur[-3 - params->line_width];
int Rd = line_buf_cur[-1 - params->line_width];
int Rf = line_buf_cur[-4 - 2 * params->line_width];
int grad, gradient, diffRcRb, diffRfRb, diffRdRb;
grad = fuji_quant_gradient (params, Rb - Rf, Rc - Rb);
gradient = std::abs (grad);
diffRcRb = std::abs (Rc - Rb);
diffRfRb = std::abs (Rf - Rb);
diffRdRb = std::abs (Rd - Rb);
if ( diffRcRb > diffRfRb && diffRcRb > diffRdRb ) {
interp_val = Rf + Rd + 2 * Rb;
} else if ( diffRdRb > diffRcRb && diffRdRb > diffRfRb ) {
interp_val = Rf + Rc + 2 * Rb;
} else {
interp_val = Rd + Rc + 2 * Rb;
}
fuji_zerobits (info, &sample);
if (sample < params->max_bits - params->raw_bits - 1) {
int decBits = bitDiff (grads[gradient].value1, grads[gradient].value2);
fuji_read_code (info, &code, decBits);
code += sample << decBits;
} else {
fuji_read_code (info, &code, params->raw_bits);
code++;
}
if (code < 0 || code >= params->total_values) {
errcnt++;
}
if (code & 1) {
code = -1 - code / 2;
} else {
code /= 2;
}
grads[gradient].value1 += std::abs (code);
if (grads[gradient].value2 == params->min_value ) {
grads[gradient].value1 >>= 1;
grads[gradient].value2 >>= 1;
}
grads[gradient].value2++;
if (grad < 0) {
interp_val = (interp_val >> 2) - code;
} else {
interp_val = (interp_val >> 2) + code;
}
if ( interp_val < 0 ) {
interp_val += params->total_values;
} else if (interp_val > params->q_point[4]) {
interp_val -= params->total_values;
}
if ( interp_val >= 0 ) {
line_buf_cur[0] = std::min (interp_val, params->q_point[4]);
} else {
line_buf_cur[0] = 0;
}
return errcnt;
}
int CLASS fuji_decode_sample_odd (struct xtrans_block* info, const struct xtrans_params * params, ushort* line_buf, int pos, struct int_pair* grads)
{
int interp_val = 0;
int errcnt = 0;
int sample = 0, code = 0;
ushort* line_buf_cur = line_buf + pos;
int Ra = line_buf_cur[-1];
int Rb = line_buf_cur[-2 - params->line_width];
int Rc = line_buf_cur[-3 - params->line_width];
int Rd = line_buf_cur[-1 - params->line_width];
int Rg = line_buf_cur[1];
int grad, gradient;
grad = fuji_quant_gradient (params, Rb - Rc, Rc - Ra);
gradient = std::abs (grad);
if ((Rb > Rc && Rb > Rd) || (Rb < Rc && Rb < Rd)) {
interp_val = (Rg + Ra + 2 * Rb) >> 2;
} else {
interp_val = (Ra + Rg) >> 1;
}
fuji_zerobits (info, &sample);
if (sample < params->max_bits - params->raw_bits - 1) {
int decBits = bitDiff (grads[gradient].value1, grads[gradient].value2);
fuji_read_code (info, &code, decBits);
code += sample << decBits;
} else {
fuji_read_code (info, &code, params->raw_bits);
code++;
}
if (code < 0 || code >= params->total_values) {
errcnt++;
}
if (code & 1) {
code = -1 - code / 2;
} else {
code /= 2;
}
grads[gradient].value1 += std::abs (code);
if (grads[gradient].value2 == params->min_value) {
grads[gradient].value1 >>= 1;
grads[gradient].value2 >>= 1;
}
grads[gradient].value2++;
if (grad < 0) {
interp_val -= code;
} else {
interp_val += code;
}
if ( interp_val < 0 ) {
interp_val += params->total_values;
} else if (interp_val > params->q_point[4]) {
interp_val -= params->total_values;
}
if ( interp_val >= 0 ) {
line_buf_cur[0] = std::min(interp_val, params->q_point[4]);
} else {
line_buf_cur[0] = 0;
}
return errcnt;
}
void CLASS fuji_decode_interpolation_even (int line_width, ushort* line_buf, int pos)
{
ushort* line_buf_cur = line_buf + pos;
int Rb = line_buf_cur[-2 - line_width];
int Rc = line_buf_cur[-3 - line_width];
int Rd = line_buf_cur[-1 - line_width];
int Rf = line_buf_cur[-4 - 2 * line_width];
int diffRcRb = std::abs (Rc - Rb);
int diffRfRb = std::abs (Rf - Rb);
int diffRdRb = std::abs (Rd - Rb);
if ( diffRcRb > diffRfRb && diffRcRb > diffRdRb ) {
*line_buf_cur = (Rf + Rd + 2 * Rb) >> 2;
} else if ( diffRdRb > diffRcRb && diffRdRb > diffRfRb ) {
*line_buf_cur = (Rf + Rc + 2 * Rb) >> 2;
} else {
*line_buf_cur = (Rd + Rc + 2 * Rb) >> 2;
}
}
void CLASS xtrans_extend_generic (ushort *linebuf[_ltotal], int line_width, int start, int end)
{
for (int i = start; i <= end; i++) {
linebuf[i][0] = linebuf[i - 1][1];
linebuf[i][line_width + 1] = linebuf[i - 1][line_width];
}
}
void CLASS xtrans_extend_red (ushort *linebuf[_ltotal], int line_width)
{
xtrans_extend_generic (linebuf, line_width, _R2, _R4);
}
void CLASS xtrans_extend_green (ushort *linebuf[_ltotal], int line_width)
{
xtrans_extend_generic (linebuf, line_width, _G2, _G7);
}
void CLASS xtrans_extend_blue (ushort *linebuf[_ltotal], int line_width)
{
xtrans_extend_generic (linebuf, line_width, _B2, _B4);
}
void CLASS xtrans_decode_block (struct xtrans_block* info, const struct xtrans_params *params, int cur_line)
{
int r_even_pos = 0, r_odd_pos = 1;
int g_even_pos = 0, g_odd_pos = 1;
int b_even_pos = 0, b_odd_pos = 1;
int errcnt = 0;
const int line_width = params->line_width;
while (g_even_pos < line_width || g_odd_pos < line_width) {
if (g_even_pos < line_width) {
fuji_decode_interpolation_even (line_width, info->linebuf[_R2] + 1, r_even_pos);
r_even_pos += 2;
errcnt += fuji_decode_sample_even (info, params, info->linebuf[_G2] + 1, g_even_pos, info->grad_even[0]);
g_even_pos += 2;
}
if (g_even_pos > 8) {
errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_R2] + 1, r_odd_pos, info->grad_odd[0]);
r_odd_pos += 2;
errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G2] + 1, g_odd_pos, info->grad_odd[0]);
g_odd_pos += 2;
}
}
xtrans_extend_red (info->linebuf, line_width);
xtrans_extend_green (info->linebuf, line_width);
g_even_pos = 0, g_odd_pos = 1;
while (g_even_pos < line_width || g_odd_pos < line_width) {
if (g_even_pos < line_width) {
errcnt += fuji_decode_sample_even (info, params, info->linebuf[_G3] + 1, g_even_pos, info->grad_even[1]);
g_even_pos += 2;
fuji_decode_interpolation_even (line_width, info->linebuf[_B2] + 1, b_even_pos);
b_even_pos += 2;
}
if (g_even_pos > 8) {
errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G3] + 1, g_odd_pos, info->grad_odd[1]);
g_odd_pos += 2;
errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_B2] + 1, b_odd_pos, info->grad_odd[1]);
b_odd_pos += 2;
}
}
xtrans_extend_green (info->linebuf, line_width);
xtrans_extend_blue (info->linebuf, line_width);
r_even_pos = 0, r_odd_pos = 1;
g_even_pos = 0, g_odd_pos = 1;
while (g_even_pos < line_width || g_odd_pos < line_width) {
if (g_even_pos < line_width) {
if (r_even_pos & 3) {
errcnt += fuji_decode_sample_even (info, params, info->linebuf[_R3] + 1, r_even_pos, info->grad_even[2]);
} else {
fuji_decode_interpolation_even (line_width, info->linebuf[_R3] + 1, r_even_pos);
}
r_even_pos += 2;
fuji_decode_interpolation_even (line_width, info->linebuf[_G4] + 1, g_even_pos);
g_even_pos += 2;
}
if (g_even_pos > 8) {
errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_R3] + 1, r_odd_pos, info->grad_odd[2]);
r_odd_pos += 2;
errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G4] + 1, g_odd_pos, info->grad_odd[2]);
g_odd_pos += 2;
}
}
xtrans_extend_red (info->linebuf, line_width);
xtrans_extend_green (info->linebuf, line_width);
g_even_pos = 0, g_odd_pos = 1;
b_even_pos = 0, b_odd_pos = 1;
while (g_even_pos < line_width || g_odd_pos < line_width) {
if (g_even_pos < line_width) {
errcnt += fuji_decode_sample_even (info, params, info->linebuf[_G5] + 1, g_even_pos, info->grad_even[0]);
g_even_pos += 2;
if ((b_even_pos & 3) == 2) {
fuji_decode_interpolation_even (line_width, info->linebuf[_B3] + 1, b_even_pos);
} else {
errcnt += fuji_decode_sample_even (info, params, info->linebuf[_B3] + 1, b_even_pos, info->grad_even[0]);
}
b_even_pos += 2;
}
if (g_even_pos > 8) {
errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G5] + 1, g_odd_pos, info->grad_odd[0]);
g_odd_pos += 2;
errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_B3] + 1, b_odd_pos, info->grad_odd[0]);
b_odd_pos += 2;
}
}
xtrans_extend_green (info->linebuf, line_width);
xtrans_extend_blue (info->linebuf, line_width);
r_even_pos = 0, r_odd_pos = 1;
g_even_pos = 0, g_odd_pos = 1;
while (g_even_pos < line_width || g_odd_pos < line_width) {
if (g_even_pos < line_width) {
if ((r_even_pos & 3) == 2) {
fuji_decode_interpolation_even (line_width, info->linebuf[_R4] + 1, r_even_pos);
} else {
errcnt += fuji_decode_sample_even (info, params, info->linebuf[_R4] + 1, r_even_pos, info->grad_even[1]);
}
r_even_pos += 2;
errcnt += fuji_decode_sample_even (info, params, info->linebuf[_G6] + 1, g_even_pos, info->grad_even[1]);
g_even_pos += 2;
}
if (g_even_pos > 8) {
errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_R4] + 1, r_odd_pos, info->grad_odd[1]);
r_odd_pos += 2;
errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G6] + 1, g_odd_pos, info->grad_odd[1]);
g_odd_pos += 2;
}
}
xtrans_extend_red (info->linebuf, line_width);
xtrans_extend_green (info->linebuf, line_width);
g_even_pos = 0, g_odd_pos = 1;
b_even_pos = 0, b_odd_pos = 1;
while (g_even_pos < line_width || g_odd_pos < line_width) {
if (g_even_pos < line_width) {
fuji_decode_interpolation_even (line_width, info->linebuf[_G7] + 1, g_even_pos);
g_even_pos += 2;
if (b_even_pos & 3) {
errcnt += fuji_decode_sample_even (info, params, info->linebuf[_B4] + 1, b_even_pos, info->grad_even[2]);
} else {
fuji_decode_interpolation_even (line_width, info->linebuf[_B4] + 1, b_even_pos);
}
b_even_pos += 2;
}
if (g_even_pos > 8) {
errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_G7] + 1, g_odd_pos, info->grad_odd[2]);
g_odd_pos += 2;
errcnt += fuji_decode_sample_odd (info, params, info->linebuf[_B4] + 1, b_odd_pos, info->grad_odd[2]);
b_odd_pos += 2;
}
}
xtrans_extend_green (info->linebuf, line_width);
xtrans_extend_blue (info->linebuf, line_width);
if (errcnt) {
derror();
}
}
void CLASS xtrans_decode_strip (const struct xtrans_params* info_common, int cur_block, INT64 raw_offset, unsigned dsize)
{
int cur_block_width, cur_line;
unsigned line_size;
struct xtrans_block info;
init_xtrans_block (&info, info_common, raw_offset, dsize);
line_size = sizeof (ushort) * (info_common->line_width + 2);
cur_block_width = fuji_block_width;
if (cur_block + 1 == fuji_total_blocks) {
cur_block_width = raw_width % fuji_block_width;
}
struct i_pair {
int a, b;
};
const i_pair mtable[6] = { {_R0, _R3}, {_R1, _R4}, {_G0, _G6}, {_G1, _G7}, {_B0, _B3}, {_B1, _B4}},
ztable[3] = {{_R2, 3}, {_G2, 6}, {_B2, 3}};
for (cur_line = 0; cur_line < fuji_total_lines; cur_line++) {
xtrans_decode_block (&info, info_common, cur_line);
// copy data from line buffers and advance
for (int i = 0; i < 6; i++) {
memcpy (info.linebuf[mtable[i].a], info.linebuf[mtable[i].b], line_size);
}
copy_line_to_xtrans (&info, cur_line, cur_block, cur_block_width);
for (int i = 0; i < 3; i++) {
memset (info.linebuf[ztable[i].a], 0, ztable[i].b * line_size);
info.linebuf[ztable[i].a][0] = info.linebuf[ztable[i].a - 1][1];
info.linebuf[ztable[i].a][info_common->line_width + 1] = info.linebuf[ztable[i].a - 1][info_common->line_width];
}
}
// release data
free (info.linealloc);
free (info.cur_buf);
}
static unsigned sgetn (int n, uchar *s)
{
unsigned result = 0;
while (n-- > 0) {
result = (result << 8) | (*s++);
}
return result;
}
void CLASS xtrans_compressed_load_raw()
{
struct xtrans_params common_info;
int cur_block;
unsigned line_size, *block_sizes;
INT64 raw_offset, *raw_block_offsets;
//struct xtrans_block info;
init_xtrans (&common_info);
line_size = sizeof (ushort) * (common_info.line_width + 2);
// read block sizes
block_sizes = (unsigned*) malloc (sizeof (unsigned) * fuji_total_blocks);
merror (block_sizes, "xtrans_load_raw()");
raw_block_offsets = (INT64*) malloc (sizeof (INT64) * fuji_total_blocks);
merror (raw_block_offsets, "xtrans_load_raw()");
raw_offset = sizeof (unsigned) * fuji_total_blocks;
if (raw_offset & 0xC) {
raw_offset += 0x10 - (raw_offset & 0xC);
}
raw_offset += data_offset;
fseek (ifp, data_offset, SEEK_SET);
fread (block_sizes, 1, sizeof (unsigned)*fuji_total_blocks, ifp);
raw_block_offsets[0] = raw_offset;
// calculating raw block offsets
for (cur_block = 0; cur_block < fuji_total_blocks; cur_block++) {
unsigned bsize = sgetn (4, (uchar *) (block_sizes + cur_block));
block_sizes[cur_block] = bsize;
}
for (cur_block = 1; cur_block < fuji_total_blocks; cur_block++) {
raw_block_offsets[cur_block] = raw_block_offsets[cur_block - 1] + block_sizes[cur_block - 1] ;
}
xtrans_decode_loop (&common_info, fuji_total_blocks, raw_block_offsets, block_sizes);
free (block_sizes);
free (raw_block_offsets);
free (common_info.q_table);
}
void CLASS xtrans_decode_loop (const struct xtrans_params* common_info, int count, INT64* raw_block_offsets, unsigned *block_sizes)
{
#ifdef _OPENMP
#pragma omp parallel for
#endif
for (int cur_block = 0; cur_block < count ; cur_block++) {
xtrans_decode_strip (common_info, cur_block, raw_block_offsets[cur_block], block_sizes[cur_block]);
}
}
void CLASS parse_xtrans_header()
{
uchar header[16];
ushort signature;
uchar version;
uchar h_raw_type;
uchar h_raw_bits;
ushort h_raw_height;
ushort h_raw_rounded_width;
ushort h_raw_width;
ushort h_block_size;
uchar h_blocks_in_row;
ushort h_total_lines;
fseek (ifp, data_offset, SEEK_SET);
fread (header, 1, sizeof (header), ifp);
signature = sgetn (2, header);
version = header[2];
h_raw_type = header[3];
h_raw_bits = header[4];
h_raw_height = sgetn (2, header + 5);
h_raw_rounded_width = sgetn (2, header + 7);
h_raw_width = sgetn (2, header + 9);
h_block_size = sgetn (2, header + 11);
h_blocks_in_row = header[13];
h_total_lines = sgetn (2, header + 14);
// general validation
if (signature != 0x4953
|| version != 1
|| h_raw_height > 0x3000
|| h_raw_height < 6
|| h_raw_height % 6
|| h_raw_width > 0x3000
|| h_raw_width < 0x300
|| h_raw_width % 24
|| h_raw_rounded_width > 0x3000
|| h_raw_rounded_width < h_block_size
|| h_raw_rounded_width % h_block_size
|| h_raw_rounded_width - h_raw_width >= h_block_size
|| h_block_size != 0x300
|| h_blocks_in_row > 0x10
|| h_blocks_in_row == 0
|| h_blocks_in_row != h_raw_rounded_width / h_block_size
|| h_total_lines > 0x800
|| h_total_lines == 0
|| h_total_lines != h_raw_height / 6
|| (h_raw_bits != 12 && h_raw_bits != 14)
|| h_raw_type != 16) {
xtransCompressed = false;
return;
}
// modify data
fuji_total_lines = h_total_lines;
fuji_total_blocks = h_blocks_in_row;
fuji_block_width = h_block_size;
fuji_bits = h_raw_bits;
raw_width = h_raw_width;
raw_height = h_raw_height;
data_offset += 16;
load_raw = &CLASS xtrans_compressed_load_raw;
}

View File

@ -1,5 +1,5 @@
add_library (rtexif rtexif.cc stdattribs.cc nikonattribs.cc canonattribs.cc pentaxattribs.cc fujiattribs.cc sonyminoltaattribs.cc olympusattribs.cc kodakattribs.cc)
add_dependencies (rtexif AboutFile)
add_dependencies (rtexif UpdateInfo)
IF (WIN32)
set_target_properties (rtexif PROPERTIES COMPILE_FLAGS " -ffast-math -fexpensive-optimizations")

View File

@ -278,7 +278,7 @@ bool TagDirectory::CPBDump (const Glib::ustring &commFName, const Glib::ustring
try {
kf->set_string ("RT General", "CachePath", options.cacheBaseDir);
kf->set_string ("RT General", "AppVersion", VERSION);
kf->set_string ("RT General", "AppVersion", RTVERSION);
kf->set_integer("RT General", "ProcParamsVersion", PPVERSION);
kf->set_string ("RT General", "ImageFileName", imageFName);
kf->set_string ("RT General", "OutputProfileFileName", profileFName);
@ -2797,7 +2797,7 @@ std::vector<Tag*> ExifManager::getDefaultTIFFTags (TagDirectory* forthis)
defTags.push_back (new Tag (forthis, lookupAttrib(ifdAttribs, "XResolution"), 300, RATIONAL));
defTags.push_back (new Tag (forthis, lookupAttrib(ifdAttribs, "YResolution"), 300, RATIONAL));
defTags.push_back (new Tag (forthis, lookupAttrib(ifdAttribs, "ResolutionUnit"), 2, SHORT));
defTags.push_back (new Tag (forthis, lookupAttrib(ifdAttribs, "Software"), "RawTherapee " VERSION));
defTags.push_back (new Tag (forthis, lookupAttrib(ifdAttribs, "Software"), "RawTherapee " RTVERSION));
defTags.push_back (new Tag (forthis, lookupAttrib(ifdAttribs, "Orientation"), 1, SHORT));
defTags.push_back (new Tag (forthis, lookupAttrib(ifdAttribs, "SamplesPerPixel"), 3, SHORT));
defTags.push_back (new Tag (forthis, lookupAttrib(ifdAttribs, "BitsPerSample"), 8, SHORT));

View File

@ -1,7 +1,6 @@
# common source files for both CLI and non-CLI execautables
set (CLISOURCEFILES
paramsedited.cc options.cc multilangmgr.cc pathutils.cc edit.cc threadutils.cc
#cachemanager.cc cacheimagedata.cc
main-cli.cc)
set (NONCLISOURCEFILES
@ -72,8 +71,8 @@ add_executable (rth ${EXTRA_SRC_NONCLI} ${NONCLISOURCEFILES})
add_executable (rth-cli ${EXTRA_SRC_CLI} ${CLISOURCEFILES})
# add dependencies to executables targets
add_dependencies (rth AboutFile)
add_dependencies (rth-cli AboutFile)
add_dependencies (rth UpdateInfo)
add_dependencies (rth-cli UpdateInfo)
# set executables targets properties, i.e. output filename and compile flags
set_target_properties (rth PROPERTIES COMPILE_FLAGS "${CMAKE_CXX_FLAGS}" OUTPUT_NAME rawtherapee)
@ -81,11 +80,12 @@ set_target_properties (rth-cli PROPERTIES COMPILE_FLAGS "${CMAKE_CXX_FLAGS}" OUT
# add linked libraries dependencies to executables targets
target_link_libraries (rth rtengine ${JPEG_LIBRARIES} ${PNG_LIBRARIES} ${ZLIB_LIBRARIES} ${TIFF_LIBRARIES} ${GOBJECT_LIBRARIES} ${GTHREAD_LIBRARIES}
${GLIB2_LIBRARIES} ${GLIBMM_LIBRARIES} ${GTK_LIBRARIES} ${GTKMM_LIBRARIES} ${GIO_LIBRARIES} ${GIOMM_LIBRARIES} ${LCMS_LIBRARIES} ${EXPAT_LIBRARIES}
${FFTW3F_LIBRARIES} ${IPTCDATA_LIBRARIES} ${CANBERRA-GTK_LIBRARIES} ${EXTRA_LIB_RTGUI})
${GLIB2_LIBRARIES} ${GLIBMM_LIBRARIES} ${GTK_LIBRARIES} ${GTKMM_LIBRARIES} ${GIO_LIBRARIES} ${GIOMM_LIBRARIES} ${LCMS_LIBRARIES} ${EXPAT_LIBRARIES}
${FFTW3F_LIBRARIES} ${IPTCDATA_LIBRARIES} ${CANBERRA-GTK_LIBRARIES} ${EXTRA_LIB_RTGUI})
target_link_libraries (rth-cli rtengine ${JPEG_LIBRARIES} ${PNG_LIBRARIES} ${ZLIB_LIBRARIES} ${TIFF_LIBRARIES} ${GOBJECT_LIBRARIES} ${GTHREAD_LIBRARIES}
${GLIB2_LIBRARIES} ${GLIBMM_LIBRARIES} ${CAIROMM_LIBRARIES} ${GIO_LIBRARIES} ${GIOMM_LIBRARIES} ${LCMS_LIBRARIES} ${EXPAT_LIBRARIES}
${FFTW3F_LIBRARIES} ${IPTCDATA_LIBRARIES} ${EXTRA_LIB_RTGUI})
${GLIB2_LIBRARIES} ${GLIBMM_LIBRARIES} ${CAIROMM_LIBRARIES} ${GIO_LIBRARIES} ${GIOMM_LIBRARIES} ${LCMS_LIBRARIES} ${EXPAT_LIBRARIES}
${FFTW3F_LIBRARIES} ${IPTCDATA_LIBRARIES} ${EXTRA_LIB_RTGUI})
# install executables
install (TARGETS rth DESTINATION ${BINDIR})

View File

@ -85,6 +85,8 @@ BatchQueue::BatchQueue (FileCatalog* aFileCatalog) : processing(nullptr), fileCa
BatchQueue::~BatchQueue ()
{
idle_register.destroy();
MYWRITERLOCK(l, entryRW);
// The listener merges parameters with old values, so delete afterwards
@ -937,7 +939,7 @@ void BatchQueue::notifyListener (bool queueEmptied)
}
params->queueEmptied = queueEmptied;
params->queueError = false;
add_idle (bqnotifylistenerUI, params);
idle_register.add(bqnotifylistenerUI, params);
}
}
@ -967,6 +969,6 @@ void BatchQueue::error (Glib::ustring msg)
params->queueEmptied = false;
params->queueError = true;
params->queueErrorMessage = msg;
add_idle (bqnotifylistenerUI, params);
idle_register.add(bqnotifylistenerUI, params);
}
}

View File

@ -36,37 +36,12 @@ public:
};
class FileCatalog;
class BatchQueue : public ThumbBrowserBase,
class BatchQueue final :
public ThumbBrowserBase,
public rtengine::BatchProcessingListener,
public LWButtonListener
{
protected:
int getMaxThumbnailHeight() const;
void saveThumbnailHeight (int height);
int getThumbnailHeight ();
BatchQueueEntry* processing; // holds the currently processed image
FileCatalog* fileCatalog;
int sequence; // holds the current sequence index
Glib::ustring nameTemplate;
MyImageMenuItem* cancel;
MyImageMenuItem* head;
MyImageMenuItem* tail;
Gtk::MenuItem* selall;
Gtk::MenuItem* open;
Glib::RefPtr<Gtk::AccelGroup> pmaccelgroup;
Gtk::Menu pmenu;
BatchQueueListener* listener;
Glib::ustring autoCompleteFileName (const Glib::ustring& fileName, const Glib::ustring& format);
Glib::ustring getTempFilenameForParams( const Glib::ustring &filename );
bool saveBatchQueue ();
void notifyListener (bool queueEmptied);
public:
explicit BatchQueue (FileCatalog* aFileCatalog);
~BatchQueue ();
@ -106,6 +81,34 @@ public:
static Glib::ustring calcAutoFileNameBase (const Glib::ustring& origFileName, int sequence = 0);
static int calcMaxThumbnailHeight();
protected:
int getMaxThumbnailHeight() const;
void saveThumbnailHeight (int height);
int getThumbnailHeight ();
Glib::ustring autoCompleteFileName (const Glib::ustring& fileName, const Glib::ustring& format);
Glib::ustring getTempFilenameForParams( const Glib::ustring &filename );
bool saveBatchQueue ();
void notifyListener (bool queueEmptied);
BatchQueueEntry* processing; // holds the currently processed image
FileCatalog* fileCatalog;
int sequence; // holds the current sequence index
Glib::ustring nameTemplate;
MyImageMenuItem* cancel;
MyImageMenuItem* head;
MyImageMenuItem* tail;
Gtk::MenuItem* selall;
Gtk::MenuItem* open;
Glib::RefPtr<Gtk::AccelGroup> pmaccelgroup;
Gtk::Menu pmenu;
BatchQueueListener* listener;
IdleRegister idle_register;
};
#endif

View File

@ -364,23 +364,25 @@ BlackWhite::BlackWhite (): FoldableToolPanel(this, "blackwhite", M("TP_BWMIX_LAB
}
BlackWhite::~BlackWhite ()
{
idle_register.destroy();
delete luminanceCEG;
delete beforeCurveCEG;
delete afterCurveCEG;
}
int BWChangedUI (void* data)
{
(static_cast<BlackWhite*>(data))->BWComputed_ ();
return 0;
}
void BlackWhite::BWChanged (double redbw, double greenbw, double bluebw)
{
nextredbw = redbw;
nextgreenbw = greenbw;
nextbluebw = bluebw;
add_idle (BWChangedUI, this);
const auto func = [](gpointer data) -> gboolean {
static_cast<BlackWhite*>(data)->BWComputed_();
return FALSE;
};
idle_register.add(func, this);
}
bool BlackWhite::BWComputed_ ()

View File

@ -28,10 +28,64 @@
#include "mycurve.h"
#include "colorprovider.h"
class BlackWhite : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel, public rtengine::AutoBWListener, public CurveListener, public ColorProvider
class BlackWhite final :
public ToolParamBlock,
public AdjusterListener,
public FoldableToolPanel,
public rtengine::AutoBWListener,
public CurveListener,
public ColorProvider
{
public:
BlackWhite ();
~BlackWhite ();
void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr);
void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr);
void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr);
void setBatchMode (bool batchMode);
void autoOpenCurve ();
void setEditProvider (EditDataProvider *provider);
void autoch_toggled ();
void neutral_pressed ();
void updateRGBLabel ();
void adjusterChanged (Adjuster* a, double newval);
void setAdjusterBehavior (bool bwadd, bool bwgadd);
void trimValues (rtengine::procparams::ProcParams* pp);
void enabledcc_toggled ();
void enabledChanged ();
void methodChanged ();
void filterChanged ();
void settingChanged ();
virtual void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller);
void BWChanged (double redbw, double greenbw, double bluebw);
bool BWComputed_ ();
void curveChanged (CurveEditor* ce);
void curveMode1Changed ();
bool curveMode1Changed_ ();
void curveMode1Changed2 ();
bool curveMode1Changed2_ ();
void algoChanged ();
Glib::ustring getSettingString ();
Glib::ustring getFilterString ();
Glib::ustring getalgoString ();
private:
void showLuminance();
void hideLuminance();
void showFilter();
void hideFilter();
void showEnabledCC();
void hideEnabledCC();
void showMixer(int nChannels, bool RGBIsSensitive = true);
void hideMixer();
void showGamma();
void hideGamma();
protected:
FlatCurveEditor* luminanceCurve;
Gtk::HSeparator* luminanceSep;
CurveEditorGroup* luminanceCEG;
@ -85,55 +139,7 @@ protected:
double nextgreenbw;
double nextbluebw;
void showLuminance();
void hideLuminance();
void showFilter();
void hideFilter();
void showEnabledCC();
void hideEnabledCC();
void showMixer(int nChannels, bool RGBIsSensitive = true);
void hideMixer();
void showGamma();
void hideGamma();
public:
BlackWhite ();
~BlackWhite ();
void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr);
void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr);
void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr);
void setBatchMode (bool batchMode);
void autoOpenCurve ();
void setEditProvider (EditDataProvider *provider);
void autoch_toggled ();
void neutral_pressed ();
void updateRGBLabel ();
void adjusterChanged (Adjuster* a, double newval);
void setAdjusterBehavior (bool bwadd, bool bwgadd);
void trimValues (rtengine::procparams::ProcParams* pp);
void enabledcc_toggled ();
void enabledChanged ();
void methodChanged ();
void filterChanged ();
void settingChanged ();
virtual void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller);
void BWChanged (double redbw, double greenbw, double bluebw);
bool BWComputed_ ();
void curveChanged (CurveEditor* ce);
void curveMode1Changed ();
bool curveMode1Changed_ ();
void curveMode1Changed2 ();
bool curveMode1Changed2_ ();
void algoChanged ();
Glib::ustring getSettingString ();
Glib::ustring getFilterString ();
Glib::ustring getalgoString ();
IdleRegister idle_register;
};
#endif

View File

@ -203,7 +203,7 @@ int CacheImageData::save (const Glib::ustring& fname)
} catch (Glib::Error&) {}
keyFile.set_string ("General", "MD5", md5);
keyFile.set_string ("General", "Version", VERSION); // Application's version
keyFile.set_string ("General", "Version", RTVERSION);
keyFile.set_boolean ("General", "Supported", supported);
keyFile.set_integer ("General", "Format", format);
keyFile.set_boolean ("General", "RecentlySaved", recentlySaved);

View File

@ -19,6 +19,7 @@
#include "cachemanager.h"
#include <memory>
#include <iostream>
#include <glib/gstdio.h>
#include <giomm.h>
@ -35,8 +36,8 @@
namespace
{
constexpr auto cacheDirMode = 511;
constexpr auto cacheDirs = { "profiles", "images", "aehistograms", "embprofiles", "data" };
constexpr int cacheDirMode = 0777;
constexpr const char* cacheDirs[] = { "profiles", "images", "aehistograms", "embprofiles", "data" };
}

View File

@ -424,6 +424,8 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel(this, "colorappearance",
ColorAppearance::~ColorAppearance ()
{
idle_register.destroy();
delete curveEditorG;
delete curveEditorG2;
delete curveEditorG3;
@ -1002,15 +1004,17 @@ void ColorAppearance::setDefaults (const ProcParams* defParams, const ParamsEdit
}
}
int autoCamChangedUI (void* data)
{
(static_cast<ColorAppearance*>(data))->autoCamComputed_ ();
return 0;
}
void ColorAppearance::autoCamChanged (double ccam)
{
nextCcam = ccam;
add_idle (autoCamChangedUI, this);
const auto func = [](gpointer data) -> gboolean {
static_cast<ColorAppearance*>(data)->autoCamComputed_();
return FALSE;
};
idle_register.add(func, this);
}
bool ColorAppearance::autoCamComputed_ ()
@ -1023,15 +1027,17 @@ bool ColorAppearance::autoCamComputed_ ()
return false;
}
int adapCamChangedUI (void* data)
{
(static_cast<ColorAppearance*>(data))->adapCamComputed_ ();
return 0;
}
void ColorAppearance::adapCamChanged (double cadap)
{
nextCadap = cadap;
add_idle (adapCamChangedUI, this);
const auto func = [](gpointer data) -> gboolean {
static_cast<ColorAppearance*>(data)->adapCamComputed_();
return FALSE;
};
idle_register.add(func, this);
}
bool ColorAppearance::adapCamComputed_ ()

View File

@ -28,10 +28,61 @@
#include "guiutils.h"
#include "colorprovider.h"
class ColorAppearance : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel, public rtengine::AutoCamListener, public CurveListener, public ColorProvider
class ColorAppearance final :
public ToolParamBlock,
public AdjusterListener,
public FoldableToolPanel,
public rtengine::AutoCamListener,
public CurveListener,
public ColorProvider
{
public:
ColorAppearance ();
~ColorAppearance ();
void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr);
void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr);
void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr);
void setBatchMode (bool batchMode);
void adjusterChanged (Adjuster* a, double newval);
void adjusterAutoToggled (Adjuster* a, bool newval);
// void adjusterAdapToggled (Adjuster* a, bool newval);
void enabledChanged ();
void surroundChanged ();
void wbmodelChanged ();
void algoChanged ();
void surrsource_toggled ();
void gamut_toggled ();
// void badpix_toggled ();
void datacie_toggled ();
void tonecie_toggled ();
// void sharpcie_toggled ();
void autoCamChanged (double ccam);
bool autoCamComputed_ ();
void adapCamChanged (double cadap);
bool adapCamComputed_ ();
void curveChanged (CurveEditor* ce);
void curveMode1Changed ();
bool curveMode1Changed_ ();
void curveMode2Changed ();
bool curveMode2Changed_ ();
void curveMode3Changed ();
bool curveMode3Changed_ ();
void expandCurve (bool isExpanded);
bool isCurveExpanded ();
void autoOpenCurve ();
void setAdjusterBehavior (bool degreeadd, bool adapscenadd, bool adaplumadd, bool badpixsladd, bool jlightadd, bool chromaadd, bool contrastadd, bool rstprotectionadd, bool qbrightadd, bool qcontrastadd, bool schromaadd, bool mchromaadd, bool colorhadd);
void trimValues (rtengine::procparams::ProcParams* pp);
void updateCurveBackgroundHistogram (LUTu & histToneCurve, LUTu & histLCurve, LUTu & histCCurve,/* LUTu & histCLurve, LUTu & histLLCurve,*/ LUTu & histLCAM, LUTu & histCCAM, LUTu & histRed, LUTu & histGreen, LUTu & histBlue, LUTu & histLuma, LUTu & histLRETI);
virtual void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller *caller);
private:
bool bgTTipQuery(int x, int y, bool keyboard_tooltip, const Glib::RefPtr<Gtk::Tooltip>& tooltip);
bool srTTipQuery(int x, int y, bool keyboard_tooltip, const Glib::RefPtr<Gtk::Tooltip>& tooltip);
protected:
Glib::RefPtr<Gtk::Tooltip> bgTTips;
Glib::RefPtr<Gtk::Tooltip> srTTips;
Glib::RefPtr<Gdk::Pixbuf> bgPixbuf;
@ -83,56 +134,10 @@ protected:
bool lastAutoAdapscen;
bool lastsurr;
bool lastgamut;
// bool lastbadpix;
bool lastdatacie;
bool lasttonecie;
// bool lastsharpcie;
bool bgTTipQuery(int x, int y, bool keyboard_tooltip, const Glib::RefPtr<Gtk::Tooltip>& tooltip);
bool srTTipQuery(int x, int y, bool keyboard_tooltip, const Glib::RefPtr<Gtk::Tooltip>& tooltip);
public:
ColorAppearance ();
~ColorAppearance ();
void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr);
void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr);
void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr);
void setBatchMode (bool batchMode);
void adjusterChanged (Adjuster* a, double newval);
void adjusterAutoToggled (Adjuster* a, bool newval);
// void adjusterAdapToggled (Adjuster* a, bool newval);
void enabledChanged ();
void surroundChanged ();
void wbmodelChanged ();
void algoChanged ();
void surrsource_toggled ();
void gamut_toggled ();
// void badpix_toggled ();
void datacie_toggled ();
void tonecie_toggled ();
// void sharpcie_toggled ();
void autoCamChanged (double ccam);
bool autoCamComputed_ ();
void adapCamChanged (double cadap);
bool adapCamComputed_ ();
void curveChanged (CurveEditor* ce);
void curveMode1Changed ();
bool curveMode1Changed_ ();
void curveMode2Changed ();
bool curveMode2Changed_ ();
void curveMode3Changed ();
bool curveMode3Changed_ ();
void expandCurve (bool isExpanded);
bool isCurveExpanded ();
void autoOpenCurve ();
void setAdjusterBehavior (bool degreeadd, bool adapscenadd, bool adaplumadd, bool badpixsladd, bool jlightadd, bool chromaadd, bool contrastadd, bool rstprotectionadd, bool qbrightadd, bool qcontrastadd, bool schromaadd, bool mchromaadd, bool colorhadd);
void trimValues (rtengine::procparams::ProcParams* pp);
void updateCurveBackgroundHistogram (LUTu & histToneCurve, LUTu & histLCurve, LUTu & histCCurve,/* LUTu & histCLurve, LUTu & histLLCurve,*/ LUTu & histLCAM, LUTu & histCCAM, LUTu & histRed, LUTu & histGreen, LUTu & histBlue, LUTu & histLuma, LUTu & histLRETI);
virtual void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller *caller);
IdleRegister idle_register;
};
#endif

View File

@ -324,6 +324,8 @@ ColorToning::ColorToning () : FoldableToolPanel(this, "colortoning", M("TP_COLOR
ColorToning::~ColorToning()
{
idle_register.destroy();
delete colorCurveEditorG;
delete opacityCurveEditorG;
delete clCurveEditorG;
@ -650,19 +652,18 @@ void ColorToning::adjusterChanged (ThresholdAdjuster* a, double newBottom, doubl
Glib::ustring::compose(Glib::ustring(M("TP_COLORTONING_HUE") + ": %1" + "\n" + M("TP_COLORTONING_STRENGTH") + ": %2"), int(newTop), int(newBottom)));
}
int CTChanged_UI (void* data)
{
(static_cast<ColorToning*>(data))->CTComp_ ();
return 0;
}
void ColorToning::autoColorTonChanged(int bwct, int satthres, int satprot)
{
nextbw = bwct;
nextsatth = satthres;
nextsatpr = satprot;
add_idle (CTChanged_UI, this);
const auto func = [](gpointer data) -> gboolean {
static_cast<ColorToning*>(data)->CTComp_();
return FALSE;
};
idle_register.add(func, this);
}
bool ColorToning::CTComp_ ()

View File

@ -13,12 +13,43 @@
#include "thresholdadjuster.h"
#include "colorprovider.h"
class ColorToning : public ToolParamBlock, public FoldableToolPanel, public rtengine::AutoColorTonListener, public CurveListener, public ColorProvider,
public ThresholdAdjusterListener, public AdjusterListener
class ColorToning final :
public ToolParamBlock,
public FoldableToolPanel,
public rtengine::AutoColorTonListener,
public CurveListener,
public ColorProvider,
public ThresholdAdjusterListener,
public AdjusterListener
{
public:
ColorToning ();
~ColorToning();
void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr);
void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr);
void setBatchMode (bool batchMode);
void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr);
void trimValues (rtengine::procparams::ProcParams* pp);
void adjusterChanged (Adjuster* a, double newval);
void adjusterChanged (ThresholdAdjuster* a, double newBottom, double newTop);
void setAdjusterBehavior (bool splitAdd, bool satThresholdAdd, bool satOpacityAdd, bool strprotectAdd, bool balanceAdd);
void neutral_pressed ();
//void neutralCurves_pressed ();
void autoColorTonChanged (int bwct, int satthres, int satprot);
bool CTComp_ ();
protected:
//Gtk::HSeparator* splitSep;
void enabledChanged ();
void curveChanged (CurveEditor* ce);
void autosatChanged ();
void autoOpenCurve ();
void methodChanged ();
void twocolorChanged (bool changedbymethod);
void twoColorChangedByGui ();
void lumamodeChanged ();
void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller);
private:
Gtk::HSeparator* satLimiterSep;
Gtk::HSeparator* colorSep;
CurveEditorGroup* colorCurveEditorG;
@ -57,7 +88,6 @@ protected:
Gtk::Image* irg;
Gtk::Button* neutral;
//Gtk::Button* neutralCurves;
Gtk::HBox* neutrHBox;
Gtk::HBox* chromaHbox;
Gtk::Label* chroLabel;
@ -75,32 +105,7 @@ protected:
bool lastLumamode;
sigc::connection lumamodeConn;
public:
ColorToning ();
~ColorToning();
void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr);
void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr);
void setBatchMode (bool batchMode);
void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr);
void trimValues (rtengine::procparams::ProcParams* pp);
void adjusterChanged (Adjuster* a, double newval);
void adjusterChanged (ThresholdAdjuster* a, double newBottom, double newTop);
void setAdjusterBehavior (bool splitAdd, bool satThresholdAdd, bool satOpacityAdd, bool strprotectAdd, bool balanceAdd);
void neutral_pressed ();
//void neutralCurves_pressed ();
void autoColorTonChanged (int bwct, int satthres, int satprot);
bool CTComp_ ();
void enabledChanged ();
void curveChanged (CurveEditor* ce);
void autosatChanged ();
void autoOpenCurve ();
void methodChanged ();
void twocolorChanged (bool changedbymethod);
void twoColorChangedByGui ();
void lumamodeChanged ();
void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller);
IdleRegister idle_register;
};
#endif

View File

@ -25,6 +25,9 @@ using namespace rtengine::procparams;
extern Options options;
namespace
{
class RefreshSpinHelper
{
@ -35,6 +38,22 @@ public:
: crop(_crop), notify(_notify) {}
};
int refreshSpinsUI (void* data)
{
RefreshSpinHelper* rsh = static_cast<RefreshSpinHelper*>(data);
rsh->crop->refreshSpins (rsh->notify);
delete rsh;
return 0;
}
int notifyListenerUI (void* data)
{
static_cast<Crop*>(data)->notifyListener();
return 0;
}
}
Crop::Crop (): FoldableToolPanel(this, "crop", M("TP_CROP_LABEL"), false, true)
{
@ -252,6 +271,11 @@ Crop::Crop (): FoldableToolPanel(this, "crop", M("TP_CROP_LABEL"), false, true)
show_all ();
}
Crop::~Crop()
{
idle_register.destroy();
}
void Crop::writeOptions ()
{
@ -508,32 +532,18 @@ void Crop::enabledChanged ()
}
}
int notifyListenerUI (void* data)
{
(static_cast<Crop*>(data))->notifyListener ();
return 0;
}
int refreshSpinsUI (void* data)
{
RefreshSpinHelper* rsh = static_cast<RefreshSpinHelper*>(data);
rsh->crop->refreshSpins (rsh->notify);
delete rsh;
return 0;
}
void Crop::hFlipCrop ()
{
nx = maxw - nx - nw;
add_idle (refreshSpinsUI, new RefreshSpinHelper (this, false));
idle_register.add(refreshSpinsUI, new RefreshSpinHelper(this, false));
}
void Crop::vFlipCrop ()
{
ny = maxh - ny - nh;
add_idle (refreshSpinsUI, new RefreshSpinHelper (this, false));
idle_register.add(refreshSpinsUI, new RefreshSpinHelper(this, false));
}
void Crop::rotateCrop (int deg, bool hflip, bool vflip)
@ -573,7 +583,7 @@ void Crop::rotateCrop (int deg, bool hflip, bool vflip)
}
lastRotationDeg = deg;
add_idle (refreshSpinsUI, new RefreshSpinHelper (this, false));
idle_register.add(refreshSpinsUI, new RefreshSpinHelper(this, false));
}
void Crop::positionChanged ()
@ -587,7 +597,7 @@ void Crop::positionChanged ()
int W = nw;
int H = nh;
cropMoved (X, Y, W, H);
add_idle (notifyListenerUI, this);
idle_register.add(notifyListenerUI, this);
}
void Crop::widthChanged ()
@ -600,7 +610,7 @@ void Crop::widthChanged ()
int W = (int)w->get_value ();
int H = nh;
cropWidth2Resized (X, Y, W, H);
add_idle (notifyListenerUI, this);
idle_register.add(notifyListenerUI, this);
}
void Crop::heightChanged ()
@ -613,7 +623,7 @@ void Crop::heightChanged ()
int W = nw;
int H = (int)h->get_value ();
cropHeight2Resized (X, Y, W, H);
add_idle (notifyListenerUI, this);
idle_register.add(notifyListenerUI, this);
}
// Fixed ratio toggle button
@ -665,7 +675,7 @@ void Crop::adjustCropToRatio()
}
// This will save the options
add_idle (refreshSpinsUI, new RefreshSpinHelper (this, true));
idle_register.add(refreshSpinsUI, new RefreshSpinHelper(this, true));
}
void Crop::refreshSize ()
@ -737,28 +747,28 @@ void Crop::setDimensions (int mw, int mh)
refreshSize ();
}
struct setdimparams {
Crop* crop;
int x;
int y;
};
int sizeChangedUI (void* data)
{
setdimparams* params = static_cast<setdimparams*>(data);
params->crop->setDimensions (params->x, params->y);
delete params;
return 0;
}
void Crop::sizeChanged (int x, int y, int ow, int oh)
{
struct Params {
Crop* crop;
int x;
int y;
};
setdimparams* params = new setdimparams;
params->x = x;
params->y = y;
params->crop = this;
add_idle (sizeChangedUI, params);
Params* const params = new Params{
this,
x,
y
};
const auto func = [](gpointer data) -> gboolean {
Params* const params = static_cast<Params*>(data);
params->crop->setDimensions(params->x, params->y);
delete params;
return FALSE;
};
idle_register.add(func, params);
}
bool Crop::refreshSpins (bool notify)
@ -822,7 +832,7 @@ void Crop::cropMoved (int &X, int &Y, int &W, int &H)
nw = W;
nh = H;
add_idle (refreshSpinsUI, new RefreshSpinHelper (this, false));
idle_register.add(refreshSpinsUI, new RefreshSpinHelper(this, false));
// Glib::signal_idle().connect (sigc::mem_fun(*this, &Crop::refreshSpins));
}
@ -866,7 +876,7 @@ void Crop::cropWidth1Resized (int &X, int &Y, int &W, int &H)
nw = W;
nh = H;
add_idle (refreshSpinsUI, new RefreshSpinHelper (this, false));
idle_register.add(refreshSpinsUI, new RefreshSpinHelper(this, false));
}
void Crop::cropWidth2Resized (int &X, int &Y, int &W, int &H)
@ -906,7 +916,7 @@ void Crop::cropWidth2Resized (int &X, int &Y, int &W, int &H)
nw = W;
nh = H;
add_idle (refreshSpinsUI, new RefreshSpinHelper (this, false));
idle_register.add(refreshSpinsUI, new RefreshSpinHelper(this, false));
}
void Crop::cropHeight1Resized (int &X, int &Y, int &W, int &H)
@ -949,7 +959,7 @@ void Crop::cropHeight1Resized (int &X, int &Y, int &W, int &H)
nw = W;
nh = H;
add_idle (refreshSpinsUI, new RefreshSpinHelper (this, false));
idle_register.add(refreshSpinsUI, new RefreshSpinHelper(this, false));
}
void Crop::cropHeight2Resized (int &X, int &Y, int &W, int &H)
@ -989,7 +999,7 @@ void Crop::cropHeight2Resized (int &X, int &Y, int &W, int &H)
nw = W;
nh = H;
add_idle (refreshSpinsUI, new RefreshSpinHelper (this, false));
idle_register.add(refreshSpinsUI, new RefreshSpinHelper(this, false));
}
void Crop::cropTopLeftResized (int &X, int &Y, int &W, int &H)
@ -1031,7 +1041,7 @@ void Crop::cropTopLeftResized (int &X, int &Y, int &W, int &H)
nw = W;
nh = H;
add_idle (refreshSpinsUI, new RefreshSpinHelper (this, false));
idle_register.add(refreshSpinsUI, new RefreshSpinHelper(this, false));
}
void Crop::cropTopRightResized (int &X, int &Y, int &W, int &H)
@ -1071,7 +1081,7 @@ void Crop::cropTopRightResized (int &X, int &Y, int &W, int &H)
nw = W;
nh = H;
add_idle (refreshSpinsUI, new RefreshSpinHelper (this, false));
idle_register.add(refreshSpinsUI, new RefreshSpinHelper(this, false));
}
void Crop::cropBottomLeftResized (int &X, int &Y, int &W, int &H)
@ -1111,7 +1121,7 @@ void Crop::cropBottomLeftResized (int &X, int &Y, int &W, int &H)
nw = W;
nh = H;
add_idle (refreshSpinsUI, new RefreshSpinHelper (this, false));
idle_register.add(refreshSpinsUI, new RefreshSpinHelper(this, false));
}
void Crop::cropBottomRightResized (int &X, int &Y, int &W, int &H)
@ -1148,7 +1158,7 @@ void Crop::cropBottomRightResized (int &X, int &Y, int &W, int &H)
nw = W;
nh = H;
add_idle (refreshSpinsUI, new RefreshSpinHelper (this, false));
idle_register.add(refreshSpinsUI, new RefreshSpinHelper(this, false));
}
void Crop::cropInit (int &x, int &y, int &w, int &h)
@ -1266,13 +1276,12 @@ void Crop::cropResized (int &x, int &y, int& x2, int& y2)
nw = W;
nh = H;
add_idle (refreshSpinsUI, new RefreshSpinHelper (this, false));
idle_register.add(refreshSpinsUI, new RefreshSpinHelper(this, false));
}
void Crop::cropManipReady ()
{
add_idle (notifyListenerUI, this);
idle_register.add(notifyListenerUI, this);
}
double Crop::getRatio ()

View File

@ -33,44 +33,20 @@ public:
virtual void cropSelectRequested() = 0;
};
class CropRatio
{
public:
struct CropRatio {
Glib::ustring label;
double value;
};
class Crop : public ToolParamBlock, public CropGUIListener, public FoldableToolPanel, public rtengine::SizeListener
class Crop final :
public ToolParamBlock,
public CropGUIListener,
public FoldableToolPanel,
public rtengine::SizeListener
{
protected:
Gtk::CheckButton* fixr;
MyComboBoxText* ratio;
MyComboBoxText* orientation;
MyComboBoxText* guide;
Gtk::Button* selectCrop;
CropPanelListener* clistener;
int opt;
MySpinButton* x;
MySpinButton* y;
MySpinButton* w;
MySpinButton* h;
MySpinButton* ppi;
Gtk::Label* sizecm;
Gtk::Label* sizein;
Gtk::VBox* ppibox;
Gtk::VBox* sizebox;
int maxw, maxh;
double nx, ny;
int nw, nh;
int lastRotationDeg;
sigc::connection xconn, yconn, wconn, hconn, fconn, rconn, oconn, gconn;
bool wDirty, hDirty, xDirty, yDirty, lastFixRatio;
void adjustCropToRatio();
std::vector<CropRatio> cropratio;
public:
Crop ();
Crop();
~Crop();
void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr);
void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr);
@ -116,6 +92,34 @@ public:
void hFlipCrop ();
void vFlipCrop ();
void rotateCrop (int deg, bool hflip, bool vflip);
private:
Gtk::CheckButton* fixr;
MyComboBoxText* ratio;
MyComboBoxText* orientation;
MyComboBoxText* guide;
Gtk::Button* selectCrop;
CropPanelListener* clistener;
int opt;
MySpinButton* x;
MySpinButton* y;
MySpinButton* w;
MySpinButton* h;
MySpinButton* ppi;
Gtk::Label* sizecm;
Gtk::Label* sizein;
Gtk::VBox* ppibox;
Gtk::VBox* sizebox;
int maxw, maxh;
double nx, ny;
int nw, nh;
int lastRotationDeg;
sigc::connection xconn, yconn, wconn, hconn, fconn, rconn, oconn, gconn;
bool wDirty, hDirty, xDirty, yDirty, lastFixRatio;
void adjustCropToRatio();
std::vector<CropRatio> cropratio;
IdleRegister idle_register;
};
#endif

View File

@ -38,14 +38,15 @@ CropHandler::CropHandler ()
displayHandler(nullptr)
{
chi = new CropHandlerIdleHelper;
chi->destroyed = false;
chi->pending = 0;
chi->cropHandler = this;
idle_helper = new IdleHelper;
idle_helper->destroyed = false;
idle_helper->pending = 0;
idle_helper->cropHandler = this;
}
CropHandler::~CropHandler ()
{
idle_register.destroy();
if (ipc) {
ipc->delSizeListener (this);
@ -61,10 +62,10 @@ CropHandler::~CropHandler ()
cimg.lock ();
if (chi->pending) {
chi->destroyed = true;
if (idle_helper->pending) {
idle_helper->destroyed = true;
} else {
delete chi;
delete idle_helper;
}
cimg.unlock ();
@ -292,83 +293,6 @@ void CropHandler::getPosition (int& x, int& y)
}
int createpixbufs (void* data)
{
CropHandlerIdleHelper* chi = static_cast<CropHandlerIdleHelper*>(data);
if (chi->destroyed) {
if (chi->pending == 1) {
delete chi;
} else {
chi->pending--;
}
return 0;
}
CropHandler* ch = chi->cropHandler;
ch->cimg.lock ();
ch->cropPixbuf.clear ();
if (!ch->enabled) {
delete [] ch->cropimg;
ch->cropimg = nullptr;
delete [] ch->cropimgtrue;
ch->cropimgtrue = nullptr;
ch->cimg.unlock ();
return 0;
}
if (ch->cropimg) {
if (ch->cix == ch->cropX && ch->ciy == ch->cropY && ch->ciw == ch->cropW && ch->cih == ch->cropH && ch->cis == (ch->zoom >= 1000 ? 1 : ch->zoom)) {
// calculate final image size
int czoom = ch->zoom < 1000 ? 1000 : ch->zoom;
int imw = ch->cropimg_width * czoom / 1000;
int imh = ch->cropimg_height * czoom / 1000;
if (imw > ch->ww) {
imw = ch->ww;
}
if (imh > ch->wh) {
imh = ch->wh;
}
Glib::RefPtr<Gdk::Pixbuf> tmpPixbuf = Gdk::Pixbuf::create_from_data (ch->cropimg, Gdk::COLORSPACE_RGB, false, 8, ch->cropimg_width, 2 * ch->cropimg_height, 3 * ch->cropimg_width);
ch->cropPixbuf = Gdk::Pixbuf::create (Gdk::COLORSPACE_RGB, false, 8, imw, imh);
tmpPixbuf->scale (ch->cropPixbuf, 0, 0, imw, imh, 0, 0, czoom / 1000.0, czoom / 1000.0, Gdk::INTERP_NEAREST);
tmpPixbuf.clear ();
Glib::RefPtr<Gdk::Pixbuf> tmpPixbuftrue = Gdk::Pixbuf::create_from_data (ch->cropimgtrue, Gdk::COLORSPACE_RGB, false, 8, ch->cropimg_width, 2 * ch->cropimg_height, 3 * ch->cropimg_width);
ch->cropPixbuftrue = Gdk::Pixbuf::create (Gdk::COLORSPACE_RGB, false, 8, imw, imh);
tmpPixbuftrue->scale (ch->cropPixbuftrue, 0, 0, imw, imh, 0, 0, czoom / 1000.0, czoom / 1000.0, Gdk::INTERP_NEAREST);
tmpPixbuftrue.clear ();
}
delete [] ch->cropimg;
ch->cropimg = nullptr;
delete [] ch->cropimgtrue;
ch->cropimgtrue = nullptr;
}
ch->cimg.unlock ();
if (ch->displayHandler) {
ch->displayHandler->cropImageUpdated ();
if (ch->initial) {
ch->displayHandler->initialImageArrived ();
ch->initial = false;
}
}
chi->pending--;
return 0;
}
void CropHandler::setDetailedCrop (IImage8* im, IImage8* imtrue, rtengine::procparams::ColorManagementParams cmp,
rtengine::procparams::CropParams cp, int ax, int ay, int aw, int ah, int askip)
{
@ -408,8 +332,84 @@ void CropHandler::setDetailedCrop (IImage8* im, IImage8* imtrue, rtengine::procp
ciw = aw;
cih = ah;
cis = askip;
chi->pending++;
add_idle (createpixbufs, chi);
idle_helper->pending++;
const auto func = [](gpointer data) -> gboolean {
IdleHelper* const idle_helper = static_cast<IdleHelper*>(data);
if (idle_helper->destroyed) {
if (idle_helper->pending == 1) {
delete idle_helper;
} else {
idle_helper->pending--;
}
return FALSE;
}
CropHandler* ch = idle_helper->cropHandler;
ch->cimg.lock ();
ch->cropPixbuf.clear ();
if (!ch->enabled) {
delete [] ch->cropimg;
ch->cropimg = nullptr;
delete [] ch->cropimgtrue;
ch->cropimgtrue = nullptr;
ch->cimg.unlock ();
return FALSE;
}
if (ch->cropimg) {
if (ch->cix == ch->cropX && ch->ciy == ch->cropY && ch->ciw == ch->cropW && ch->cih == ch->cropH && ch->cis == (ch->zoom >= 1000 ? 1 : ch->zoom)) {
// calculate final image size
int czoom = ch->zoom < 1000 ? 1000 : ch->zoom;
int imw = ch->cropimg_width * czoom / 1000;
int imh = ch->cropimg_height * czoom / 1000;
if (imw > ch->ww) {
imw = ch->ww;
}
if (imh > ch->wh) {
imh = ch->wh;
}
Glib::RefPtr<Gdk::Pixbuf> tmpPixbuf = Gdk::Pixbuf::create_from_data (ch->cropimg, Gdk::COLORSPACE_RGB, false, 8, ch->cropimg_width, 2 * ch->cropimg_height, 3 * ch->cropimg_width);
ch->cropPixbuf = Gdk::Pixbuf::create (Gdk::COLORSPACE_RGB, false, 8, imw, imh);
tmpPixbuf->scale (ch->cropPixbuf, 0, 0, imw, imh, 0, 0, czoom / 1000.0, czoom / 1000.0, Gdk::INTERP_NEAREST);
tmpPixbuf.clear ();
Glib::RefPtr<Gdk::Pixbuf> tmpPixbuftrue = Gdk::Pixbuf::create_from_data (ch->cropimgtrue, Gdk::COLORSPACE_RGB, false, 8, ch->cropimg_width, 2 * ch->cropimg_height, 3 * ch->cropimg_width);
ch->cropPixbuftrue = Gdk::Pixbuf::create (Gdk::COLORSPACE_RGB, false, 8, imw, imh);
tmpPixbuftrue->scale (ch->cropPixbuftrue, 0, 0, imw, imh, 0, 0, czoom / 1000.0, czoom / 1000.0, Gdk::INTERP_NEAREST);
tmpPixbuftrue.clear ();
}
delete [] ch->cropimg;
ch->cropimg = nullptr;
delete [] ch->cropimgtrue;
ch->cropimgtrue = nullptr;
}
ch->cimg.unlock ();
if (ch->displayHandler) {
ch->displayHandler->cropImageUpdated ();
if (ch->initial) {
ch->displayHandler->initialImageArrived ();
ch->initial = false;
}
}
idle_helper->pending--;
return FALSE;
};
idle_register.add(func, idle_helper);
}
cimg.unlock ();

View File

@ -36,56 +36,15 @@ public:
virtual void setDisplayPosition (int x, int y) {}
};
class CropHandler;
struct CropHandlerIdleHelper {
CropHandler* cropHandler;
bool destroyed;
int pending;
};
/**
* This class handle the displayed part of the image, ask for the initial data and process it so it can display it.
* Its position on the preview is handled not set by this class but by the CropHandlerListener (i.e. CropWindow) with which it works closely.
*/
class CropHandler : public rtengine::DetailedCropListener, public rtengine::SizeListener
class CropHandler final :
public rtengine::DetailedCropListener,
public rtengine::SizeListener
{
friend int createpixbufs (void* data);
protected:
int zoom; // scale factor (e.g. 5 if 1:5 scale) ; if 1:1 scale and bigger, factor is multiplied by 1000 (i.e. 1000 for 1:1 scale, 2000 for 2:1, etc...)
int ww, wh; // size of the crop's canvas on the screen ; might be bigger than the displayed image, but not smaller
int imx, imy, imw, imh; // this is a copy of the cropwindow's parameters
int cax, cay; // clamped crop anchor's coordinate, i.e. point of the image that coincide to the center of the display area, expressed in image coordinates; cannot be outside the image's bounds; but if cax==cay==-1, designate the center of the image
int cx, cy, cw, ch; // position and size of the requested crop ; position expressed in image coordinates, so cx and cy might be negative and cw and ch higher than the image's 1:1 size
int cropX, cropY, cropW, cropH; // cropPixbuf's displayed area (position and size), i.e. coordinates in 1:1 scale, i.e. cx, cy, cw & ch trimmed to the image's bounds
bool enabled;
unsigned char* cropimg;
unsigned char* cropimgtrue;
int cropimg_width, cropimg_height, cix, ciy, ciw, cih, cis;
bool initial;
bool isLowUpdatePriority;
rtengine::StagedImageProcessor* ipc;
rtengine::DetailedCrop* crop;
CropDisplayHandler* displayHandler;
CropHandlerIdleHelper* chi;
void compDim ();
public:
void update ();
rtengine::procparams::CropParams cropParams;
rtengine::procparams::ColorManagementParams colorParams;
Glib::RefPtr<Gdk::Pixbuf> cropPixbuf;
Glib::RefPtr<Gdk::Pixbuf> cropPixbuftrue;
MyMutex cimg;
CropHandler ();
~CropHandler ();
@ -127,6 +86,46 @@ public:
bool getWindow (int& cwx, int& cwy, int& cww, int& cwh, int& cskip);
// SizeListener interface
void sizeChanged (int w, int h, int ow, int oh);
void update ();
rtengine::procparams::CropParams cropParams;
rtengine::procparams::ColorManagementParams colorParams;
Glib::RefPtr<Gdk::Pixbuf> cropPixbuf;
Glib::RefPtr<Gdk::Pixbuf> cropPixbuftrue;
MyMutex cimg;
private:
struct IdleHelper {
CropHandler* cropHandler;
bool destroyed;
int pending;
};
void compDim ();
int zoom; // scale factor (e.g. 5 if 1:5 scale) ; if 1:1 scale and bigger, factor is multiplied by 1000 (i.e. 1000 for 1:1 scale, 2000 for 2:1, etc...)
int ww, wh; // size of the crop's canvas on the screen ; might be bigger than the displayed image, but not smaller
int imx, imy, imw, imh; // this is a copy of the cropwindow's parameters
int cax, cay; // clamped crop anchor's coordinate, i.e. point of the image that coincide to the center of the display area, expressed in image coordinates; cannot be outside the image's bounds; but if cax==cay==-1, designate the center of the image
int cx, cy, cw, ch; // position and size of the requested crop ; position expressed in image coordinates, so cx and cy might be negative and cw and ch higher than the image's 1:1 size
int cropX, cropY, cropW, cropH; // cropPixbuf's displayed area (position and size), i.e. coordinates in 1:1 scale, i.e. cx, cy, cw & ch trimmed to the image's bounds
bool enabled;
unsigned char* cropimg;
unsigned char* cropimgtrue;
int cropimg_width, cropimg_height, cix, ciy, ciw, cih, cis;
bool initial;
bool isLowUpdatePriority;
rtengine::StagedImageProcessor* ipc;
rtengine::DetailedCrop* crop;
CropDisplayHandler* displayHandler;
IdleHelper* idle_helper;
IdleRegister idle_register;
};
#endif

View File

@ -18,6 +18,7 @@
*/
#include "dirbrowser.h"
#include <iostream>
#include <cstring>
#ifdef WIN32

View File

@ -327,22 +327,24 @@ DirPyrDenoise::DirPyrDenoise () : FoldableToolPanel(this, "dirpyrdenoise", M("TP
DirPyrDenoise::~DirPyrDenoise ()
{
idle_register.destroy();
delete NoiscurveEditorG;
delete CCcurveEditorG;
}
}
int chromaChangedUI (void* data)
{
(static_cast<DirPyrDenoise*>(data))->chromaComputed_ ();
return 0;
}
void DirPyrDenoise::chromaChanged (double autchroma, double autred, double autblue)
{
nextchroma = autchroma;
// printf("CHROM=%f\n",nextchroma);
nextred = autred;
nextblue = autblue;
add_idle(chromaChangedUI, this);
const auto func = [](gpointer data) -> gboolean {
static_cast<DirPyrDenoise*>(data)->chromaComputed_();
return false;
};
idle_register.add(func, this);
}
bool DirPyrDenoise::chromaComputed_ ()
@ -356,12 +358,6 @@ bool DirPyrDenoise::chromaComputed_ ()
updateNoiseLabel ();
return false;
}
int TilePrevChangedUI (void* data)
{
(static_cast<DirPyrDenoise*>(data))->TilePrevComputed_ ();
return 0;
}
void DirPyrDenoise::noiseTilePrev (int tileX, int tileY, int prevX, int prevY, int sizeT, int sizeP)
{
@ -372,10 +368,14 @@ void DirPyrDenoise::noiseTilePrev (int tileX, int tileY, int prevX, int prevY, i
nextsizeT = sizeT;
nextsizeP = sizeP;
add_idle(TilePrevChangedUI, this);
const auto func = [](gpointer data) -> gboolean {
static_cast<DirPyrDenoise*>(data)->TilePrevComputed_();
return false;
};
idle_register.add(func, this);
}
bool DirPyrDenoise::TilePrevComputed_ ()
{
@ -385,6 +385,7 @@ bool DirPyrDenoise::TilePrevComputed_ ()
updatePrevLabel ();
return false;
}
void DirPyrDenoise::updateTileLabel ()
{
if (!batchMode) {
@ -422,19 +423,17 @@ void DirPyrDenoise::updatePrevLabel ()
}
}
int noiseChangedUI (void* data)
{
(static_cast<DirPyrDenoise*>(data))->noiseComputed_ ();
return 0;
}
void DirPyrDenoise::noiseChanged (double nresid, double highresid)
{
nextnresid = nresid;
nexthighresid = highresid;
add_idle(noiseChangedUI, this);
const auto func = [](gpointer data) -> gboolean {
static_cast<DirPyrDenoise*>(data)->noiseComputed_();
return false;
};
idle_register.add(func, this);
}
bool DirPyrDenoise::noiseComputed_ ()

View File

@ -28,10 +28,58 @@
#include "guiutils.h"
#include "options.h"
class DirPyrDenoise : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel, public rtengine::AutoChromaListener, public CurveListener, public ColorProvider
class DirPyrDenoise final :
public ToolParamBlock,
public AdjusterListener,
public FoldableToolPanel,
public rtengine::AutoChromaListener,
public CurveListener,
public ColorProvider
{
public:
DirPyrDenoise ();
~DirPyrDenoise ();
protected:
void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr);
void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr);
void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr);
void setBatchMode (bool batchMode);
void curveChanged (CurveEditor* ce);
void setEditProvider (EditDataProvider *provider);
void autoOpenCurve ();
void adjusterChanged (Adjuster* a, double newval);
void enabledChanged ();
void enhanceChanged ();
void medianChanged ();
void autochromaChanged ();
void chromaChanged (double autchroma, double autred, double autblue);
bool chromaComputed_ ();
void noiseChanged (double nresid, double highresid);
bool noiseComputed_ ();
void noiseTilePrev (int tileX, int tileY, int prevX, int prevY, int sizeT, int sizeP);
bool TilePrevComputed_ ();
// void perform_toggled ();
void updateNoiseLabel ();
void LmethodChanged ();
void CmethodChanged ();
void C2methodChanged ();
void updateTileLabel ();
void updatePrevLabel ();
void dmethodChanged ();
void medmethodChanged ();
void methodmedChanged ();
void rgbmethodChanged ();
void smethodChanged ();
virtual void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller);
void setAdjusterBehavior (bool lumaadd, bool lumdetadd, bool chromaadd, bool chromaredadd, bool chromablueadd, bool gammaadd, bool passesadd);
void trimValues (rtengine::procparams::ProcParams* pp);
Glib::ustring getSettingString ();
private:
CurveEditorGroup* NoiscurveEditorG;
CurveEditorGroup* CCcurveEditorG;
Adjuster* luma;
@ -92,50 +140,7 @@ protected:
int nextsizeT;
int nextsizeP;
public:
DirPyrDenoise ();
~DirPyrDenoise ();
void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr);
void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr);
void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr);
void setBatchMode (bool batchMode);
void curveChanged (CurveEditor* ce);
void setEditProvider (EditDataProvider *provider);
void autoOpenCurve ();
void adjusterChanged (Adjuster* a, double newval);
void enabledChanged ();
void enhanceChanged ();
void medianChanged ();
void autochromaChanged ();
void chromaChanged (double autchroma, double autred, double autblue);
bool chromaComputed_ ();
void noiseChanged (double nresid, double highresid);
bool noiseComputed_ ();
void noiseTilePrev (int tileX, int tileY, int prevX, int prevY, int sizeT, int sizeP);
bool TilePrevComputed_ ();
// void perform_toggled ();
void updateNoiseLabel ();
void LmethodChanged ();
void CmethodChanged ();
void C2methodChanged ();
void updateTileLabel ();
void updatePrevLabel ();
void dmethodChanged ();
void medmethodChanged ();
void methodmedChanged ();
void rgbmethodChanged ();
void smethodChanged ();
virtual void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller);
void setAdjusterBehavior (bool lumaadd, bool lumdetadd, bool chromaadd, bool chromaredadd, bool chromablueadd, bool gammaadd, bool passesadd);
void trimValues (rtengine::procparams::ProcParams* pp);
Glib::ustring getSettingString ();
IdleRegister idle_register;
};
#endif

View File

@ -35,6 +35,44 @@
using namespace rtengine::procparams;
namespace
{
struct spparams {
double val;
Glib::ustring str;
MyProgressBar *pProgress;
Glib::RefPtr<Gtk::CssProvider> cssProvider;
};
int setprogressStrUI ( void *p )
{
spparams *s = static_cast<spparams*> (p);
if ( ! s->str.empty() ) {
s->pProgress->set_text ( M (s->str) );
}
if ( s->val >= 0 ) {
s->pProgress->set_fraction ( s->val );
if (s->cssProvider) {
if ( s->val < 1.0 ) {
s->cssProvider->load_from_data ("ProgressBar { background-color: red }");
} else {
s->cssProvider->load_from_data ("ProgressBar { background-color: grey }");
}
s->pProgress->get_style_context()->set_background (s->pProgress->get_window());
}
}
delete s;
return FALSE;
}
}
class EditorPanel::ColorManagementToolbar
{
private:
@ -683,6 +721,7 @@ EditorPanel::EditorPanel (FilePanel* filePanel)
EditorPanel::~EditorPanel ()
{
idle_register.destroy();
history->setHistoryBeforeLineListener (nullptr);
// the order is important!
@ -1017,46 +1056,12 @@ void EditorPanel::setProgressState (bool inProcessing)
g_idle_add (setProgressStateUIThread, p);
}
struct spparams {
double val;
Glib::ustring str;
MyProgressBar *pProgress;
Glib::RefPtr<Gtk::CssProvider> cssProvider;
};
int setprogressStrUI ( void *p )
{
spparams *s = static_cast<spparams*> (p);
if ( ! s->str.empty() ) {
s->pProgress->set_text ( M (s->str) );
}
if ( s->val >= 0 ) {
s->pProgress->set_fraction ( s->val );
if (s->cssProvider) {
if ( s->val < 1.0 ) {
s->cssProvider->load_from_data ("ProgressBar { background-color: red }");
} else {
s->cssProvider->load_from_data ("ProgressBar { background-color: grey }");
}
s->pProgress->get_style_context()->set_background (s->pProgress->get_window());
}
}
delete s;
return 0;
}
void EditorPanel::setProgress (double p)
{
spparams *s = new spparams;
s->val = p;
s->pProgress = progressLabel;
add_idle (setprogressStrUI, s);
idle_register.add(setprogressStrUI, s);
}
void EditorPanel::setProgressStr (Glib::ustring str)
@ -1065,7 +1070,7 @@ void EditorPanel::setProgressStr (Glib::ustring str)
s->str = str;
s->val = -1;
s->pProgress = progressLabel;
add_idle (setprogressStrUI, s);
idle_register.add(setprogressStrUI, s);
}
// This is only called from the ThreadUI, so within the gtk thread

View File

@ -45,102 +45,17 @@ struct EditorPanelIdleHelper {
};
class RTWindow;
class EditorPanel : public Gtk::VBox,
class EditorPanel final :
public Gtk::VBox,
public PParamsChangeListener,
public rtengine::ProgressListener,
public ThumbnailListener,
public HistoryBeforeLineListener,
public rtengine::HistogramListener
{
private:
Glib::ustring lastSaveAsFileName;
bool realized;
protected:
MyProgressBar *progressLabel;
Gtk::ToggleButton* info;
Gtk::ToggleButton* hidehp;
Gtk::ToggleButton* tbShowHideSidePanels;
Gtk::ToggleButton* tbTopPanel_1;
Gtk::ToggleButton* tbRightPanel_1;
Gtk::ToggleButton* tbBeforeLock;
//bool bAllSidePanelsVisible;
Gtk::ToggleButton* beforeAfter;
Gtk::Paned* hpanedl;
Gtk::Paned* hpanedr;
Gtk::Image *iHistoryShow, *iHistoryHide;
Gtk::Image *iTopPanel_1_Show, *iTopPanel_1_Hide;
Gtk::Image *iRightPanel_1_Show, *iRightPanel_1_Hide;
Gtk::Image *iShowHideSidePanels;
Gtk::Image *iShowHideSidePanels_exit;
Gtk::Image *iBeforeLockON, *iBeforeLockOFF;
Gtk::VBox *leftbox;
Gtk::VBox *vboxright;
Gtk::Button* queueimg;
Gtk::Button* saveimgas;
Gtk::Button* sendtogimp;
Gtk::Button* navSync;
Gtk::Button* navNext;
Gtk::Button* navPrev;
class ColorManagementToolbar;
std::unique_ptr<ColorManagementToolbar> colorMgmtToolBar;
ImageAreaPanel* iareapanel;
PreviewHandler* previewHandler;
PreviewHandler* beforePreviewHandler; // for the before-after view
Navigator* navigator;
ImageAreaPanel* beforeIarea; // for the before-after view
Gtk::VBox* beforeBox;
Gtk::VBox* afterBox;
Gtk::Label* beforeLabel;
Gtk::Label* afterLabel;
Gtk::HBox* beforeAfterBox;
Gtk::HBox* beforeHeaderBox;
Gtk::HBox* afterHeaderBox;
Gtk::Frame* ppframe;
ProfilePanel* profilep;
History* history;
HistogramPanel* histogramPanel;
ToolPanelCoordinator* tpc;
RTWindow* parent;
//SaveAsDialog* saveAsDialog;
BatchToolPanelCoordinator* btpCoordinator;
FilePanel* fPanel;
bool firstProcessingDone;
Thumbnail* openThm; // may get invalid on external delete event
Glib::ustring fname; // must be saved separately
rtengine::InitialImage* isrc;
rtengine::StagedImageProcessor* ipc;
rtengine::StagedImageProcessor* beforeIpc; // for the before-after view
EditorPanelIdleHelper* epih;
void close ();
BatchQueueEntry* createBatchQueueEntry ();
bool idle_imageSaved (ProgressConnector<int> *pc, rtengine::IImage16* img, Glib::ustring fname, SaveFormat sf);
bool idle_saveImage (ProgressConnector<rtengine::IImage16*> *pc, Glib::ustring fname, SaveFormat sf);
bool idle_sendToGimp ( ProgressConnector<rtengine::IImage16*> *pc, Glib::ustring fname);
bool idle_sentToGimp (ProgressConnector<int> *pc, rtengine::IImage16* img, Glib::ustring filename);
int err;
time_t processingStartedTime;
sigc::connection ShowHideSidePanelsconn;
bool isProcessing;
public:
explicit EditorPanel (FilePanel* filePanel = nullptr);
virtual ~EditorPanel ();
~EditorPanel ();
void open (Thumbnail* tmb, rtengine::InitialImage* isrc);
void setAspect ();
@ -214,7 +129,93 @@ public:
void updateTabsUsesIcons (bool useIcons);
void updateHistogramPosition (int oldPosition, int newPosition);
Gtk::Paned *catalogPane;
Gtk::Paned* catalogPane;
private:
void close ();
BatchQueueEntry* createBatchQueueEntry ();
bool idle_imageSaved (ProgressConnector<int> *pc, rtengine::IImage16* img, Glib::ustring fname, SaveFormat sf);
bool idle_saveImage (ProgressConnector<rtengine::IImage16*> *pc, Glib::ustring fname, SaveFormat sf);
bool idle_sendToGimp ( ProgressConnector<rtengine::IImage16*> *pc, Glib::ustring fname);
bool idle_sentToGimp (ProgressConnector<int> *pc, rtengine::IImage16* img, Glib::ustring filename);
Glib::ustring lastSaveAsFileName;
bool realized;
MyProgressBar *progressLabel;
Gtk::ToggleButton* info;
Gtk::ToggleButton* hidehp;
Gtk::ToggleButton* tbShowHideSidePanels;
Gtk::ToggleButton* tbTopPanel_1;
Gtk::ToggleButton* tbRightPanel_1;
Gtk::ToggleButton* tbBeforeLock;
//bool bAllSidePanelsVisible;
Gtk::ToggleButton* beforeAfter;
Gtk::Paned* hpanedl;
Gtk::Paned* hpanedr;
Gtk::Image *iHistoryShow, *iHistoryHide;
Gtk::Image *iTopPanel_1_Show, *iTopPanel_1_Hide;
Gtk::Image *iRightPanel_1_Show, *iRightPanel_1_Hide;
Gtk::Image *iShowHideSidePanels;
Gtk::Image *iShowHideSidePanels_exit;
Gtk::Image *iBeforeLockON, *iBeforeLockOFF;
Gtk::VBox *leftbox;
Gtk::VBox *vboxright;
Gtk::Button* queueimg;
Gtk::Button* saveimgas;
Gtk::Button* sendtogimp;
Gtk::Button* navSync;
Gtk::Button* navNext;
Gtk::Button* navPrev;
class ColorManagementToolbar;
std::unique_ptr<ColorManagementToolbar> colorMgmtToolBar;
ImageAreaPanel* iareapanel;
PreviewHandler* previewHandler;
PreviewHandler* beforePreviewHandler; // for the before-after view
Navigator* navigator;
ImageAreaPanel* beforeIarea; // for the before-after view
Gtk::VBox* beforeBox;
Gtk::VBox* afterBox;
Gtk::Label* beforeLabel;
Gtk::Label* afterLabel;
Gtk::HBox* beforeAfterBox;
Gtk::HBox* beforeHeaderBox;
Gtk::HBox* afterHeaderBox;
Gtk::Frame* ppframe;
ProfilePanel* profilep;
History* history;
HistogramPanel* histogramPanel;
ToolPanelCoordinator* tpc;
RTWindow* parent;
//SaveAsDialog* saveAsDialog;
BatchToolPanelCoordinator* btpCoordinator;
FilePanel* fPanel;
bool firstProcessingDone;
Thumbnail* openThm; // may get invalid on external delete event
Glib::ustring fname; // must be saved separately
rtengine::InitialImage* isrc;
rtengine::StagedImageProcessor* ipc;
rtengine::StagedImageProcessor* beforeIpc; // for the before-after view
EditorPanelIdleHelper* epih;
int err;
time_t processingStartedTime;
sigc::connection ShowHideSidePanelsconn;
bool isProcessing;
IdleRegister idle_register;
};
#endif

View File

@ -585,7 +585,6 @@ void FileBrowser::addEntry (FileBrowserEntry* entry)
void FileBrowser::addEntry_ (FileBrowserEntry* entry)
{
GThreadLock lock; // All GUI acces from idle_add callbacks or separate thread HAVE to be protected
entry->selected = false;
entry->drawable = false;
entry->framed = editedFiles.find (entry->filename) != editedFiles.end();

View File

@ -22,12 +22,6 @@
#include "inspector.h"
#include "placesbrowser.h"
int FilePanelInitUI (void* data)
{
(static_cast<FilePanel*>(data))->init ();
return 0;
}
FilePanel::FilePanel () : parent(nullptr)
{
@ -143,13 +137,21 @@ FilePanel::FilePanel () : parent(nullptr)
fileCatalog->setFileSelectionChangeListener (tpc);
fileCatalog->setFileSelectionListener (this);
add_idle (FilePanelInitUI, this);
const auto func = [](gpointer data) -> gboolean {
static_cast<FilePanel*>(data)->init();
return FALSE;
};
idle_register.add(func, this);
show_all ();
}
FilePanel::~FilePanel ()
{
idle_register.destroy();
rightNotebookSwitchConn.disconnect();
if (inspectorPanel) {

View File

@ -33,38 +33,12 @@
#include "progressconnector.h"
class RTWindow;
class FilePanel : public Gtk::HPaned,
class FilePanel final :
public Gtk::HPaned,
public FileSelectionListener,
public PParamsChangeListener
{
protected:
//DirBrowser* dirBrowser;
PlacesBrowser* placesBrowser;
RecentBrowser* recentBrowser;
// FileCatalog* fileCatalog; // filecatalog is the file browser with the button bar above it
Inspector* inspectorPanel;
Gtk::VPaned* tpcPaned;
BatchToolPanelCoordinator* tpc;
History* history;
//FilterPanel* filterPanel;
RTWindow* parent;
Gtk::Notebook* rightNotebook;
sigc::connection rightNotebookSwitchConn;
struct pendingLoad {
bool complete;
ProgressConnector<rtengine::InitialImage*> *pc;
Thumbnail *thm;
};
MyMutex pendingLoadMutex;
std::vector<struct pendingLoad*> pendingLoads;
int error;
void on_NB_switch_page(Gtk::Widget* page, guint page_num);
public:
FilePanel ();
~FilePanel ();
@ -107,6 +81,32 @@ public:
bool handleShortcutKey (GdkEventKey* event);
void updateTPVScrollbar (bool hide);
void updateTabsUsesIcons (bool useIcons);
private:
void on_NB_switch_page(Gtk::Widget* page, guint page_num);
PlacesBrowser* placesBrowser;
RecentBrowser* recentBrowser;
Inspector* inspectorPanel;
Gtk::VPaned* tpcPaned;
BatchToolPanelCoordinator* tpc;
History* history;
RTWindow* parent;
Gtk::Notebook* rightNotebook;
sigc::connection rightNotebookSwitchConn;
struct pendingLoad {
bool complete;
ProgressConnector<rtengine::InitialImage*> *pc;
Thumbnail *thm;
};
MyMutex pendingLoadMutex;
std::vector<struct pendingLoad*> pendingLoads;
int error;
IdleRegister idle_register;
};
#endif

View File

@ -44,6 +44,53 @@ guint add_idle (GSourceFunc function, gpointer data)
//gtk_main_iteration_do(false);
}
IdleRegister::~IdleRegister()
{
destroy();
}
void IdleRegister::add(GSourceFunc function, gpointer data)
{
struct DataWrapper {
IdleRegister* const self;
GSourceFunc function;
gpointer data;
};
const auto dispatch = [](gpointer data) -> gboolean {
DataWrapper* const data_wrapper = static_cast<DataWrapper*>(data);
if (!data_wrapper->function(data_wrapper->data)) {
data_wrapper->self->mutex.lock();
data_wrapper->self->ids.erase(data_wrapper);
data_wrapper->self->mutex.unlock();
delete data_wrapper;
return FALSE;
}
return TRUE;
};
DataWrapper* const data_wrapper = new DataWrapper{
this,
function,
data
};
mutex.lock();
ids[data_wrapper] = add_idle(dispatch, data_wrapper);
mutex.unlock();
}
void IdleRegister::destroy()
{
mutex.lock();
for (const auto id : ids) {
g_source_remove(id.second);
}
mutex.unlock();
}
/*
gboolean giveMeAGo(void* data) {

View File

@ -19,13 +19,17 @@
#ifndef __GUI_UTILS_
#define __GUI_UTILS_
#include <map>
#include <gtkmm.h>
#include <cairomm/cairomm.h>
#include "../rtengine/rtengine.h"
#include "../rtengine/coord.h"
#include "../rtengine/noncopyable.h"
#include "../rtengine/rtengine.h"
#include "rtimage.h"
#include <sstream>
#include <iostream>
// for convenience...
#include "pathutils.h"
@ -42,6 +46,20 @@ void setExpandAlignProperties(Gtk::Widget *widget, bool hExpand, bool vExpand, e
guint add_idle (GSourceFunc function, gpointer data);
class IdleRegister final :
public rtengine::NonCopyable
{
public:
~IdleRegister();
void add(GSourceFunc function, gpointer data);
void destroy();
private:
std::map<void*, guint> ids;
MyMutex mutex;
};
// TODO: The documentation says gdk_threads_enter and gdk_threads_leave should be replaced
// by g_main_context_invoke(), g_idle_add() and related functions, but this will require more extensive changes.
// We silence those warnings until then so that we notice the others.

View File

@ -86,11 +86,7 @@ Glib::ustring fname_to_utf8 (const char* fname)
}
// This recursive mutex will be used by gdk_threads_enter/leave instead of a simple mutex
#ifdef WIN32
static Glib::RecMutex myGdkRecMutex;
#else
static Glib::Threads::RecMutex myGdkRecMutex;
#endif
static void myGdkLockEnter()
{
@ -187,6 +183,9 @@ int main(int argc, char **argv)
#ifdef WIN32
bool consoleOpened = false;
// suppression of annoying error boxes
SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);
if (argc > 1 || options.rtSettings.verbose) {
if (options.rtSettings.verbose || ( !Glib::file_test (fname_to_utf8 (argv[1]), Glib::FILE_TEST_EXISTS ) && !Glib::file_test (fname_to_utf8 (argv[1]), Glib::FILE_TEST_IS_DIR))) {
bool stdoutRedirectedtoFile = (GetFileType(GetStdHandle(STD_OUTPUT_HANDLE)) == 0x0001);
@ -211,7 +210,7 @@ int main(int argc, char **argv)
SetConsoleCtrlHandler( NULL, true );
// Set title of console
char consoletitle[128];
sprintf(consoletitle, "RawTherapee %s Console", VERSION);
sprintf(consoletitle, "RawTherapee %s Console", RTVERSION);
SetConsoleTitle(consoletitle);
// increase size of screen buffer
COORD c;
@ -237,7 +236,7 @@ int main(int argc, char **argv)
consoleOpened = true;
// printing RT's version in every case, particularly useful for the 'verbose' mode, but also for the batch processing
std::cout << "RawTherapee, version " << VERSION << std::endl;
std::cout << "RawTherapee, version " << RTVERSION << std::endl;
std::cout << "WARNING: closing this window will close RawTherapee!" << std::endl << std::endl;
}
}
@ -260,7 +259,7 @@ int main(int argc, char **argv)
if (argc > 1 || options.rtSettings.verbose) {
// printing RT's version in all case, particularly useful for the 'verbose' mode, but also for the batch processing
std::cout << "RawTherapee, version " << VERSION << std::endl;
std::cout << "RawTherapee, version " << RTVERSION << std::endl;
#ifdef WIN32
std::cout << "WARNING: closing this window will close RawTherapee!" << std::endl << std::endl;
#endif

View File

@ -46,8 +46,7 @@ Glib::ustring Options::rtdir;
Glib::ustring Options::cacheBaseDir;
Options options;
Glib::ustring versionString = VERSION;
Glib::ustring versionSuffixString = VERSION_SUFFIX;
Glib::ustring versionString = RTVERSION;
Glib::ustring paramFileExtension = ".pp3";
Options::Options ()
@ -1454,11 +1453,11 @@ int Options::readFromFile (Glib::ustring fname)
}
if (keyFile.has_key ("Color Management", "PrinterIntent")) {
rtSettings.printerIntent = static_cast<rtengine::RenderingIntent>(keyFile.get_integer("Color Management", "PrinterIntent"));
rtSettings.printerIntent = static_cast<rtengine::RenderingIntent> (keyFile.get_integer ("Color Management", "PrinterIntent"));
}
if (keyFile.has_key ("Color Management", "PrinterBPC")) {
rtSettings.printerBPC = keyFile.get_boolean("Color Management", "PrinterBPC");
rtSettings.printerBPC = keyFile.get_boolean ("Color Management", "PrinterBPC");
}
if (keyFile.has_key ("Color Management", "PrinterProfile")) {
@ -1486,7 +1485,7 @@ int Options::readFromFile (Glib::ustring fname)
}
if (keyFile.has_key ("Color Management", "MonitorBPC")) {
rtSettings.monitorBPC = keyFile.get_boolean("Color Management", "MonitorBPC");
rtSettings.monitorBPC = keyFile.get_boolean ("Color Management", "MonitorBPC");
}
if (keyFile.has_key ("Color Management", "CRI")) {
@ -1825,7 +1824,7 @@ bool Options::safeDirGet (const Glib::KeyFile& keyFile, const Glib::ustring& sec
const Glib::ustring& entryName, Glib::ustring& destination)
{
try {
if (keyFile.has_key (section, entryName) && !keyFile.get_string (section, entryName).empty ()) {
destination = keyFile.get_string (section, entryName);
return true;
@ -1866,7 +1865,7 @@ int Options::saveToFile (Glib::ustring fname)
keyFile.set_string ("General", "Language", language);
keyFile.set_boolean ("General", "LanguageAutoDetect", languageAutoDetect);
keyFile.set_string ("General", "Theme", theme);
keyFile.set_string ("General", "Version", VERSION);
keyFile.set_string ("General", "Version", RTVERSION);
keyFile.set_string ("General", "DarkFramesPath", rtSettings.darkFramesPath);
keyFile.set_string ("General", "FlatFieldsPath", rtSettings.flatFieldsPath);
keyFile.set_boolean ("General", "Verbose", rtSettings.verbose);
@ -2103,41 +2102,41 @@ int Options::saveToFile (Glib::ustring fname)
keyFile.set_double ("Sounds", "LngEditProcDoneSecs", sndLngEditProcDoneSecs);
keyFile.set_boolean ("Fast Export", "fastexport_bypass_sharpening" , fastexport_bypass_sharpening );
keyFile.set_boolean ("Fast Export", "fastexport_bypass_sharpenEdge" , fastexport_bypass_sharpenEdge );
keyFile.set_boolean ("Fast Export", "fastexport_bypass_sharpenMicro" , fastexport_bypass_sharpenMicro );
keyFile.set_boolean ("Fast Export", "fastexport_bypass_sharpening", fastexport_bypass_sharpening );
keyFile.set_boolean ("Fast Export", "fastexport_bypass_sharpenEdge", fastexport_bypass_sharpenEdge );
keyFile.set_boolean ("Fast Export", "fastexport_bypass_sharpenMicro", fastexport_bypass_sharpenMicro );
//keyFile.set_boolean ("Fast Export", "fastexport_bypass_lumaDenoise" , fastexport_bypass_lumaDenoise );
//keyFile.set_boolean ("Fast Export", "fastexport_bypass_colorDenoise" , fastexport_bypass_colorDenoise );
keyFile.set_boolean ("Fast Export", "fastexport_bypass_defringe" , fastexport_bypass_defringe );
keyFile.set_boolean ("Fast Export", "fastexport_bypass_dirpyrDenoise" , fastexport_bypass_dirpyrDenoise );
keyFile.set_boolean ("Fast Export", "fastexport_bypass_sh_hq" , fastexport_bypass_sh_hq );
keyFile.set_boolean ("Fast Export", "fastexport_bypass_dirpyrequalizer" , fastexport_bypass_dirpyrequalizer );
keyFile.set_boolean ("Fast Export", "fastexport_bypass_wavelet" , fastexport_bypass_wavelet );
keyFile.set_string ("Fast Export", "fastexport_raw_bayer_method" , fastexport_raw_bayer_method );
keyFile.set_boolean ("Fast Export", "fastexport_bypass_defringe", fastexport_bypass_defringe );
keyFile.set_boolean ("Fast Export", "fastexport_bypass_dirpyrDenoise", fastexport_bypass_dirpyrDenoise );
keyFile.set_boolean ("Fast Export", "fastexport_bypass_sh_hq", fastexport_bypass_sh_hq );
keyFile.set_boolean ("Fast Export", "fastexport_bypass_dirpyrequalizer", fastexport_bypass_dirpyrequalizer );
keyFile.set_boolean ("Fast Export", "fastexport_bypass_wavelet", fastexport_bypass_wavelet );
keyFile.set_string ("Fast Export", "fastexport_raw_bayer_method", fastexport_raw_bayer_method );
//keyFile.set_boolean ("Fast Export", "fastexport_bypass_bayer_raw_all_enhance" , fastexport_bypass_raw_bayer_all_enhance );
keyFile.set_boolean ("Fast Export", "fastexport_bypass_raw_bayer_dcb_iterations" , fastexport_bypass_raw_bayer_dcb_iterations );
keyFile.set_boolean ("Fast Export", "fastexport_bypass_raw_bayer_dcb_enhance" , fastexport_bypass_raw_bayer_dcb_enhance );
keyFile.set_boolean ("Fast Export", "fastexport_bypass_raw_bayer_dcb_iterations", fastexport_bypass_raw_bayer_dcb_iterations );
keyFile.set_boolean ("Fast Export", "fastexport_bypass_raw_bayer_dcb_enhance", fastexport_bypass_raw_bayer_dcb_enhance );
keyFile.set_boolean ("Fast Export", "fastexport_bypass_raw_bayer_lmmse_iterations", fastexport_bypass_raw_bayer_lmmse_iterations);
keyFile.set_boolean ("Fast Export", "fastexport_bypass_raw_bayer_linenoise" , fastexport_bypass_raw_bayer_linenoise );
keyFile.set_boolean ("Fast Export", "fastexport_bypass_raw_bayer_greenthresh" , fastexport_bypass_raw_bayer_greenthresh );
keyFile.set_string ("Fast Export", "fastexport_raw_xtrans_method" , fastexport_raw_xtrans_method );
keyFile.set_boolean ("Fast Export", "fastexport_bypass_raw_ccSteps" , fastexport_bypass_raw_ccSteps );
keyFile.set_boolean ("Fast Export", "fastexport_bypass_raw_ca" , fastexport_bypass_raw_ca );
keyFile.set_boolean ("Fast Export", "fastexport_bypass_raw_df" , fastexport_bypass_raw_df );
keyFile.set_boolean ("Fast Export", "fastexport_bypass_raw_ff" , fastexport_bypass_raw_ff );
keyFile.set_string ("Fast Export", "fastexport_icm_input" , fastexport_icm_input );
keyFile.set_string ("Fast Export", "fastexport_icm_working" , fastexport_icm_working );
keyFile.set_string ("Fast Export", "fastexport_icm_output" , fastexport_icm_output );
keyFile.set_integer ("Fast Export", "fastexport_icm_output_intent" , fastexport_icm_outputIntent );
keyFile.set_boolean ("Fast Export", "fastexport_icm_output_bpc" , fastexport_icm_outputBPC );
keyFile.set_string ("Fast Export", "fastexport_icm_gamma" , fastexport_icm_gamma );
keyFile.set_boolean ("Fast Export", "fastexport_resize_enabled" , fastexport_resize_enabled );
keyFile.set_double ("Fast Export", "fastexport_resize_scale" , fastexport_resize_scale );
keyFile.set_string ("Fast Export", "fastexport_resize_appliesTo" , fastexport_resize_appliesTo );
keyFile.set_string ("Fast Export", "fastexport_resize_method" , fastexport_resize_method );
keyFile.set_integer ("Fast Export", "fastexport_resize_dataspec" , fastexport_resize_dataspec );
keyFile.set_integer ("Fast Export", "fastexport_resize_width" , fastexport_resize_width );
keyFile.set_integer ("Fast Export", "fastexport_resize_height" , fastexport_resize_height );
keyFile.set_boolean ("Fast Export", "fastexport_bypass_raw_bayer_linenoise", fastexport_bypass_raw_bayer_linenoise );
keyFile.set_boolean ("Fast Export", "fastexport_bypass_raw_bayer_greenthresh", fastexport_bypass_raw_bayer_greenthresh );
keyFile.set_string ("Fast Export", "fastexport_raw_xtrans_method", fastexport_raw_xtrans_method );
keyFile.set_boolean ("Fast Export", "fastexport_bypass_raw_ccSteps", fastexport_bypass_raw_ccSteps );
keyFile.set_boolean ("Fast Export", "fastexport_bypass_raw_ca", fastexport_bypass_raw_ca );
keyFile.set_boolean ("Fast Export", "fastexport_bypass_raw_df", fastexport_bypass_raw_df );
keyFile.set_boolean ("Fast Export", "fastexport_bypass_raw_ff", fastexport_bypass_raw_ff );
keyFile.set_string ("Fast Export", "fastexport_icm_input", fastexport_icm_input );
keyFile.set_string ("Fast Export", "fastexport_icm_working", fastexport_icm_working );
keyFile.set_string ("Fast Export", "fastexport_icm_output", fastexport_icm_output );
keyFile.set_integer ("Fast Export", "fastexport_icm_output_intent", fastexport_icm_outputIntent );
keyFile.set_boolean ("Fast Export", "fastexport_icm_output_bpc", fastexport_icm_outputBPC );
keyFile.set_string ("Fast Export", "fastexport_icm_gamma", fastexport_icm_gamma );
keyFile.set_boolean ("Fast Export", "fastexport_resize_enabled", fastexport_resize_enabled );
keyFile.set_double ("Fast Export", "fastexport_resize_scale", fastexport_resize_scale );
keyFile.set_string ("Fast Export", "fastexport_resize_appliesTo", fastexport_resize_appliesTo );
keyFile.set_string ("Fast Export", "fastexport_resize_method", fastexport_resize_method );
keyFile.set_integer ("Fast Export", "fastexport_resize_dataspec", fastexport_resize_dataspec );
keyFile.set_integer ("Fast Export", "fastexport_resize_width", fastexport_resize_width );
keyFile.set_integer ("Fast Export", "fastexport_resize_height", fastexport_resize_height );
keyFile.set_string ("Dialogs", "LastIccDir", lastIccDir);
keyFile.set_string ("Dialogs", "LastDarkframeDir", lastDarkframeDir);

View File

@ -345,7 +345,6 @@ extern Glib::ustring argv0;
extern Glib::ustring argv1;
extern bool simpleEditor;
extern Glib::ustring versionString;
extern Glib::ustring versionSuffixString;
extern Glib::ustring paramFileExtension;
#endif

View File

@ -118,7 +118,7 @@ Resize::Resize () : FoldableToolPanel(this, "resize", M("TP_RESIZE_LABEL"), fals
Resize::~Resize ()
{
idle_register.destroy();
delete scale;
delete sizeBox;
}
@ -352,68 +352,76 @@ void Resize::sizeChanged (int mw, int mh, int ow, int oh)
void Resize::setDimensions ()
{
const auto func = [](gpointer data) -> gboolean {
Resize* const self = static_cast<Resize*>(data);
int refw, refh;
self->wconn.block(true);
self->hconn.block(true);
self->scale->block(true);
wconn.block (true);
hconn.block (true);
scale->block(true);
int refw, refh;
if (appliesTo->get_active_row_number() == 0 && cropw) {
// Applies to Cropped area
refw = cropw;
refh = croph;
} else {
// Applies to Full image or crop is disabled
refw = maxw;
refh = maxh;
}
GThreadLock lock;
w->set_range (32, 4 * refw);
h->set_range (32, 4 * refh);
double tmpScale;
switch (spec->get_active_row_number()) {
case (0): // Scale mode
w->set_value((double)((int)( (double)(refw) * scale->getValue() + 0.5) ));
h->set_value((double)((int)( (double)(refh) * scale->getValue() + 0.5) ));
break;
case (1): // Width mode
tmpScale = w->get_value() / (double)refw;
scale->setValue (tmpScale);
h->set_value((double)((int)( (double)(refh) * tmpScale + 0.5) ));
break;
case (2): // Height mode
tmpScale = h->get_value() / (double)refh;
scale->setValue (tmpScale);
w->set_value((double)((int)( (double)(refw) * tmpScale + 0.5) ));
break;
case (3): { // Bounding box mode
double wSliderValue = w->get_value();
double hSliderValue = h->get_value();
if ( (wSliderValue / hSliderValue) < ((double)refw / (double)refh)) {
tmpScale = wSliderValue / (double)refw;
if (self->appliesTo->get_active_row_number() == 0 && self->cropw) {
// Applies to Cropped area
refw = self->cropw;
refh = self->croph;
} else {
tmpScale = hSliderValue / (double)refh;
// Applies to Full image or crop is disabled
refw = self->maxw;
refh = self->maxh;
}
scale->setValue (tmpScale);
break;
}
self->w->set_range(32, 4 * refw);
self->h->set_range(32, 4 * refh);
default:
break;
}
switch (self->spec->get_active_row_number()) {
case 0: {
// Scale mode
self->w->set_value(static_cast<double>(static_cast<int>(static_cast<double>(refw) * self->scale->getValue() + 0.5)));
self->h->set_value(static_cast<double>(static_cast<int>(static_cast<double>(refh) * self->scale->getValue() + 0.5)));
break;
}
scale->block(false);
wconn.block (false);
hconn.block (false);
case 1: {
// Width mode
const double tmp_scale = self->w->get_value() / static_cast<double>(refw);
self->scale->setValue(tmp_scale);
self->h->set_value(static_cast<double>(static_cast<int>(static_cast<double>(refh) * tmp_scale + 0.5)));
break;
}
case 2: {
// Height mode
const double tmp_scale = self->h->get_value() / static_cast<double>(refh);
self->scale->setValue(tmp_scale);
self->w->set_value(static_cast<double>(static_cast<int>(static_cast<double>(refw) * tmp_scale + 0.5)));
break;
}
case 3: {
// Bounding box mode
const double tmp_scale =
self->w->get_value() / self->h->get_value() < static_cast<double>(refw) / static_cast<double>(refh)
? self->w->get_value() / static_cast<double>(refw)
: self->h->get_value() / static_cast<double>(refh);
self->scale->setValue(tmp_scale);
break;
}
default: {
break;
}
}
self->scale->block(false);
self->wconn.block(false);
self->hconn.block(false);
return FALSE;
};
idle_register.add(func, this);
}
void Resize::fitBoxScale()

View File

@ -25,25 +25,13 @@
#include "toolpanel.h"
#include "guiutils.h"
class Resize : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel, public rtengine::SizeListener
class Resize final :
public ToolParamBlock,
public AdjusterListener,
public FoldableToolPanel,
public rtengine::SizeListener
{
protected:
Adjuster* scale;
Gtk::VBox* sizeBox;
MyComboBoxText* appliesTo;
MyComboBoxText* method;
MyComboBoxText* spec;
MySpinButton* w;
MySpinButton* h;
int maxw, maxh;
int cropw, croph;
sigc::connection sconn, aconn, wconn, hconn;
bool wDirty, hDirty;
ToolParamBlock* packBox;
public:
Resize ();
~Resize ();
@ -75,6 +63,20 @@ private:
int getComputedHeight ();
void notifyBBox ();
void updateGUI ();
Adjuster* scale;
Gtk::VBox* sizeBox;
MyComboBoxText* appliesTo;
MyComboBoxText* method;
MyComboBoxText* spec;
MySpinButton* w;
MySpinButton* h;
int maxw, maxh;
int cropw, croph;
sigc::connection sconn, aconn, wconn, hconn;
bool wDirty, hDirty;
ToolParamBlock* packBox;
IdleRegister idle_register;
};
#endif

View File

@ -121,10 +121,6 @@ RTWindow::RTWindow ()
#endif
versionStr = "RawTherapee " + versionString;
if (!versionSuffixString.empty()) {
versionStr += " " + versionSuffixString;
}
set_title_decorated("");
set_resizable(true);
set_resize_mode(Gtk::ResizeMode::RESIZE_QUEUE);
@ -309,30 +305,6 @@ RTWindow::~RTWindow()
}
}
void RTWindow::findVerNumbers(int* numbers, Glib::ustring versionStr)
{
numbers[0] = numbers[1] = numbers[2] = numbers[3] = 0;
int n = 0;
for (unsigned int i = 0; i < versionStr.length(); i++) {
char chr = (char)versionStr.at(i);
if (chr >= '0' && chr <= '9') {
numbers[n] *= 10;
numbers[n] += (int)(chr - '0');
} else {
n++;
if (n > 4) {
printf("Error: malformed version string; \"%s\" must follow this format: xx.xx.xx.xx. Admitting it's a developer version...\n", versionStr.c_str());
// Reseting the already found numbers
numbers[0] = numbers[1] = numbers[2] = numbers[3] = 100;
return;
}
}
}
}
void RTWindow::on_realize ()
{
Gtk::Window::on_realize ();
@ -349,38 +321,20 @@ void RTWindow::on_realize ()
// Check if first run of this version, then display the Release Notes text
if (options.version != versionString) {
int prevVerNbr[4];
int currVerNbr[4];
findVerNumbers(prevVerNbr, options.version);
findVerNumbers(currVerNbr, versionString);
// Now we can update the version parameter with the right value
// Update the version parameter with the right value
options.version = versionString;
bool showReleaseNotes = false;
splash = new Splash (*this);
splash->set_transient_for (*this);
splash->signal_delete_event().connect( sigc::mem_fun(*this, &RTWindow::splashClosed) );
// Check if the current version is newer
if (currVerNbr[0] > prevVerNbr[0]) {
showReleaseNotes = true;
} else if (currVerNbr[1] > prevVerNbr[1]) {
showReleaseNotes = true;
} else if (currVerNbr[2] > prevVerNbr[2]) {
showReleaseNotes = true;
}
if (showReleaseNotes) {
// this is a first run!
splash = new Splash (*this);
splash->set_transient_for (*this);
splash->signal_delete_event().connect( sigc::mem_fun(*this, &RTWindow::splashClosed) );
if (splash->hasReleaseNotes()) {
splash->showReleaseNotes();
splash->show ();
} else {
delete splash;
splash = nullptr;
}
if (splash->hasReleaseNotes()) {
splash->showReleaseNotes();
splash->show ();
} else {
delete splash;
splash = nullptr;
}
}
}

View File

@ -26,7 +26,6 @@
extern Glib::ustring creditsPath;
extern Glib::ustring licensePath;
extern Glib::ustring versionString;
extern Glib::ustring versionSuffixString;
SplashImage::SplashImage ()
{
@ -53,10 +52,6 @@ bool SplashImage::on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr)
int w, h;
Glib::ustring versionStr(versionString);
if (!versionSuffixString.empty()) {
versionStr += " " + versionSuffixString;
}
version = create_pango_layout (versionStr);
version->set_text(versionStr);
version->get_pixel_size (w, h);

View File

@ -4,9 +4,7 @@
#ifndef _VERSION_
#define _VERSION_
#define VERSION "${GIT_VERSION}"
#define VERSION_SUFFIX "${VERSION_SUFFIX}"
#define TAGDISTANCE ${GIT_TAGDISTANCE}
#define RTVERSION "${GIT_DESCRIBE}"
#define CACHEFOLDERNAME "RawTherapee${CACHE_NAME_SUFFIX}"
#endif

View File

@ -83,7 +83,7 @@ while getopts "bc:fnp:s:t:uvh?-" opt; do
" -s <string>" \
"Suffix of destination build directory, so that if you have applied a patch, say \"dustremoval-1.patch\", and want to have RawTherapee compiled to a folder whose name ends with \"_dustremoval1\", you would set \"-s dustremoval1\" (the underscore is automated)." "" \
" -t \"<string>\"" \
"Suffix displayed next to the RawTherapee version in the window titlebar. It is recommended that you include the changeset of the newest public commit (the one you would see if you cloned the repository anew) so it is clear which commit you applied the patches to. E.g.:" "-t \": ee72ddbcfd4e + dustremoval-1.patch + mustafa ibrahim\"" "" \
"Suffix displayed next to the RawTherapee version in the window titlebar. It is recommended that you include the commit of the newest public commit (the one you would see if you cloned the repository anew) so it is clear which commit you applied the patches to. E.g.:" "-t \": ee72ddbcfd4e + dustremoval-1.patch + mustafa ibrahim\"" "" \
" -u" \
"Check for an update of buildRT on GitHub." "" \
" -v" \
@ -193,7 +193,7 @@ if [[ ! -d "${repo}" ]]; then
currentBranch="$(git branch | grep "*" | sed -e 's/.* \+//')"
rev="$(git rev-list --all --count)"
node="$(git rev-parse --short HEAD)"
printf "\nRepository state:\n Branch: ${currentBranch}\n RawTherapee-${verLatesttag}.${verLatesttagdistance}\n Changeset: ${rev}:${node}\n Latest tag: ${verLatesttag}\n\n"
printf "\nRepository state:\n Branch: ${currentBranch}\n RawTherapee-${verLatesttag}.${verLatesttagdistance}\n Commit: ${rev}:${node}\n Latest tag: ${verLatesttag}\n\n"
alert "Repository cloned succesfully. What would you like to do next?"
printf "%b" "Repository cloned succesfully.\n" "Press 'q' to quit or any other key to continue... "
read -r -n 1
@ -239,7 +239,7 @@ verLatesttagdistance="$(git describe --tags | sed -e 's/.*-\([0-9]\+\)-.*/\1/')"
currentBranch="$(git branch | grep "*" | sed -e 's/.* \+//')"
rev="$(git rev-list --all --count)"
node="$(git rev-parse --short HEAD)"
printf "\nRepository state:\n Branch: ${currentBranch}\n RawTherapee-${verLatesttag}.${verLatesttagdistance}\n Changeset: ${rev}:${node}\n Latest tag: ${verLatesttag}\n\n"
printf "\nRepository state:\n Branch: ${currentBranch}\n RawTherapee-${verLatesttag}.${verLatesttagdistance}\n Commit: ${rev}:${node}\n Latest tag: ${verLatesttag}\n\n"
#--- Print the menu
branches=()

View File

@ -37,8 +37,8 @@ for rtDir in "${rtDirs[@]}"; do
c=1
pp3name=${pp3%.*}
pp3name=${pp3name#*/}
v+=("$(grep "Changeset:.*" "${rtDir}/AboutThisBuild.txt" | sed "s/Changeset: //")")
printf "%s\n" "Developing images using RawTherapee changeset ${v[$i]} - ${rtDir}"
v+=("$(grep "Commit:.*" "${rtDir}/AboutThisBuild.txt" | sed "s/Commit: //")")
printf "%s\n" "Developing images using RawTherapee commit ${v[$i]} - ${rtDir}"
for img in "${imgs[@]}"; do
printf "%s" "${c}/${#imgs[@]} - "
"${rtDir}rawtherapee" -o "${outDir}${img%.*}_${v[i]}_${pp3%.*}.tif" -p "${pp3}" -t -Y -c "$img" | grep Processing

View File

@ -1,12 +1,76 @@
#!/usr/bin/env bash
gitBranch="`git symbolic-ref --short -q HEAD`"
gitVersion="`git describe --tags --always`"
gitLatesttag="`echo $gitVersion | sed 's/-.*//'`"
gitLatesttagdistance="`echo $gitVersion | sed 's/.*-\(.*\)-g.*/\1/'`"
gitChangeset="`git rev-parse --verify HEAD`"
# This script is called from tools/generateSourceTarball
# It is used to generate a ReleaseInfo.cmake file with commit information which
# enables compilation without needing to have git installed.
echo "set(GIT_BRANCH $gitBranch)
set(GIT_VERSION $gitLatesttag.$gitLatesttagdistance)
set(GIT_CHANGESET $gitChangeset)
set(GIT_TAGDISTANCE $gitLatesttagdistance)" > ReleaseInfo.cmake
rm -f ReleaseInfo.cmake
# Get version description.
# Depending on whether you checked out a branch (dev) or a tag (release),
# "git describe" will return "5.0-gtk2-2-g12345678" or "5.0-gtk2", respectively.
gitDescribe="$(git describe --tags --always)"
# Get branch name.
# Will return empty if you checked out a commit or tag. Empty string handled later.
gitBranch="$(git symbolic-ref --short -q HEAD)"
# Get commit hash.
gitCommit="$(git rev-parse --short --verify HEAD)"
# Get commit date, YYYY-MM-DD.
gitCommitDate="$(git show -s --format=%cd --date=format:%Y-%m-%d)"
# Get number of commits since tagging. This is what gitDescribe uses.
# Works when checking out branch, tag or commit.
gitCommitsSinceTag="$(git rev-list --count HEAD --not $(git tag --merged HEAD))"
# Get number of commits since branching.
# Works when checking out branch, tag or commit.
gitCommitsSinceBranch="$(git rev-list --count HEAD --not --tags)"
if [[ -z $gitDescribe ]]; then
printf '%s\n' "Failed finding commit description, aborting."
exit 1
fi
if [[ -z $gitBranch ]]; then
printf '%s\n' "No branch found. Using commit description as branch name."
gitBranch="$gitDescribe"
fi
if [[ -z $gitCommit ]]; then
printf '%s\n' "Failed finding commit hash, aborting."
exit 1
fi
if [[ -z $gitCommitDate ]]; then
printf '%s\n' "Failed finding commit date, aborting."
exit 1
fi
# 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 [[ -z $gitCommitsSinceTag ]]; then
gitVersionNumericBS="0.0.0"
else
gitVersionNumericBS="${gitDescribe%%-*}" # Remove everything after first hyphen.
gitVersionNumericBS="${gitVersionNumericBS}.${gitCommitsSinceTag}" # Remove everything until after first hyphen: 5.0
fi
cat <<EOF > ReleaseInfo.cmake
set(GIT_DESCRIBE $gitDescribe)
set(GIT_BRANCH $gitBranch)
set(GIT_COMMIT $gitCommit)
set(GIT_COMMIT_DATE $gitCommitDate)
set(GIT_COMMITS_SINCE_TAG $gitCommitsSinceTag)
set(GIT_COMMITS_SINCE_BRANCH $gitCommitsSinceBranch)
set(GIT_VERSION_NUMERIC_BS $gitVersionNumericBS)
EOF
printf '%s\n' "Git checkout information:" \
" Commit description: ${gitDescribe}" \
" Branch: ${gitBranch}" \
" Commit: ${gitCommit}" \
" Commit date: ${gitCommitDate}" \
" Commits since tag: ${gitCommitsSinceTag}" \
" Commits since branch: ${gitCommitsSinceBranch}" \
" Version (unreliable): ${gitVersionNumericBS}" \
""

View File

@ -1,17 +1,24 @@
#!/usr/bin/env bash
# Run from the root of the cloned repository.
# This script is used to generate a source code tarball which includes commit
# metadata so that RawTherapee can be compiled without needing to install git.
# It is meant to be used every time a release is made after creating an
# annotated tag in git.
# It is your job to checkout the tag before running this script.
if [[ ! "$1" ]]; then
printf "%s\n" "Usage: $0 <git tag>" "Example: $0 4.2"
exit
./tools/generateReleaseInfo
ret=$?
if [[ $ret -ne 0 ]]; then
printf '%s\n' "Something went wrong while running tools/generateReleaseInfo" "Aborting."
exit 1
fi
desc="$(grep GIT_DESCRIBE ReleaseInfo.cmake)" # Gets whole string: set(GIT_DESCRIBE 5.0-gtk2-1-g96bf9129)
desc="${desc#*GIT_DESCRIBE }" # Removes front: 5.0-gtk2-1-g96bf9129)
desc="${desc%)}" # Removes back: 5.0-gtk2-1-g96bf9129
git checkout "$1" || exit 0
tools/generateReleaseInfo
mkdir rawtherapee-"$1"
mv ReleaseInfo.cmake rawtherapee-"$1"
#hg archive -X ".hg*" -X "rtgui/config.h" -X "rtgui/version.h" -X "rtdata/rawtherapee.desktop" rawtherapee-"$1".tar
git archive --format=tar "$1" > rawtherapee-"$1".tar
tar --append --file=rawtherapee-"$1".tar rawtherapee-"$1"/ReleaseInfo.cmake
xz -z -9e rawtherapee-"$1".tar
rm -r rawtherapee-"$1"
git checkout
mkdir "rawtherapee-${desc}" || exit 1
mv ReleaseInfo.cmake "rawtherapee-${desc}" || exit 1
git archive --format=tar --prefix="rawtherapee-${desc}/" -o "rawtherapee-${desc}.tar" HEAD || exit 1
tar --append --file="rawtherapee-${desc}.tar" "rawtherapee-${desc}/ReleaseInfo.cmake" || exit 1
xz -z -9e "rawtherapee-${desc}.tar" || exit 1
rm -r "rawtherapee-${desc}"

View File

@ -111,7 +111,7 @@
<key>CFBundleExecutable</key>
<string>rawtherapee</string>
<key>CFBundleGetInfoString</key>
<string>@version@, Copyright © 2004-2010 Gábor Horváth, 2010-2016 RT dev team</string>
<string>@version@, Copyright © 2004-2010 Gábor Horváth, 2010-2017 RawTherapee Development Team</string>
<key>CFBundleIconFile</key>
<string>rawtherapee.icns</string>
<key>CFBundleIdentifier</key>
@ -127,7 +127,7 @@
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>@version@</string>
<string>@shortVersion@</string>
<key>LSExecutableArchitectures</key>
<array>
<string>@arch@</string>
@ -135,7 +135,7 @@
<key>NSHighResolutionCapable</key>
<true/>
<key>NSHumanReadableCopyright</key>
<string>Copyright © 2004-2013 Gábor Horváth</string>
<string>Copyright © 2004-2010 Gábor Horváth, 2010-2017 RawTherapee Development Team</string>
<key>UTExportedTypeDeclarations</key>
<array>
<dict>

View File

@ -33,12 +33,33 @@ fi
# update project version
if test -x "$(which git)" -a -d "${PROJECT_SOURCE_DIR}/.git"; then
# This is what the version ought to look like to be accurate in the git universe:
PROJECT_FULL_VERSION="$(git describe --tags --always | sed 's/-g.*//')_$(git symbolic-ref --short -q HEAD)"
# outputs: 4.2-677-g904467b_master
# but Apple requirements https://goo.gl/eWDQv6 state we should use this:
PROJECT_VERSION="$(git describe --tags --always | sed -e 's/-g.*//' -e 's/-/./')"
# outputs: 4.2.677
### This section is copied from tools/generateReleaseInfo
# Get version description.
# Depending on whether you checked out a branch (dev) or a tag (release),
# "git describe" will return "5.0-gtk2-2-g12345678" or "5.0-gtk2", respectively.
gitDescribe="$(git describe --tags --always)"
# Apple requires a numeric version of the form n.n.n
# https://goo.gl/eWDQv6
# Get number of commits since tagging. This is what gitDescribe uses.
# Works when checking out branch, tag or commit.
gitCommitsSinceTag="$(git rev-list --count HEAD --not $(git tag --merged HEAD))"
# 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 [[ -z $gitCommitsSinceTag ]]; then
gitVersionNumericBS="0.0.0"
else
gitVersionNumericBS="${gitDescribe%%-*}" # Remove everything after first hyphen.
gitVersionNumericBS="${gitVersionNumericBS}.${gitCommitsSinceTag}" # Remove everything until after first hyphen: 5.0
fi
### Copy end.
PROJECT_FULL_VERSION="$gitDescribe"
PROJECT_VERSION="$gitVersionNumericBS"
fi
# if not specify CMAKE_OSX_DEPLOYMENT_TARGET when compiling,
@ -85,7 +106,7 @@ ETC="${MACOS}"/etc
EXECUTABLE="${MACOS}"/rawtherapee
message "Removing old files"
rm -rf "${APP}" ${PROJECT_NAME}_*.dmg
rm -rf "${APP}" "${PROJECT_NAME}_*.dmg"
message "Creating bundle container"
install -d "${RESOURCES}" \
@ -163,7 +184,7 @@ install -m 0755 "${PROJECT_SOURCE_DATA_DIR}"/executable_loader.in "${MACOS}"/raw
cp "${PROJECT_SOURCE_DATA_DIR}"/{rawtherapee,profile}.icns "${RESOURCES}"
cp "${PROJECT_SOURCE_DATA_DIR}"/PkgInfo "${CONTENTS}"
install -m 0644 "${PROJECT_SOURCE_DATA_DIR}"/Info.plist.in "${CONTENTS}"/Info.plist
sed -i "" -e "s|@version@|${PROJECT_VERSION}|
sed -i "" -e "s|@version@|${PROJECT_FULL_VERSION}|
s|@shortVersion@|${PROJECT_VERSION}|
s|@arch@|${arch}|" \
"${CONTENTS}"/Info.plist

View File

@ -1,30 +1,26 @@
; Script initially generated by the Inno Setup Script Wizard
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
; This script has to be used by "INNO Setup" (http://www.jrsoftware.org/) to create a setup executable.
; When the "make install" process ends, you can double click on this file to load it into
; INNO Setup, then execute it to create the archive. It expect to find all the dependency libs
; in the root destination folder (the one of the 'make install' process), and the usual 'lib' directory.
; Please note that all *.dll files will be added, so be carefull on which dll are present in the directory
; before compiling the INNO Setup script.
; Script initially generated by the Inno Setup Script Wizard.
; Documentation: http://www.jrsoftware.org/ishelp/
;
; It also search for and bundles all "rawtherapee*.exe" files, which mean that you can bundle a Release and
; a Debug build at the same time (for conveniency), but official downloads must only contain the Release
; version.
; This script is used by "Inno Setup" (http://www.jrsoftware.org/) to create a
; setup executable. When the "make install" process ends, double-click on this
; file to load it into Inno Setup, then execute it to create the installer. It
; expects to find all the dependency libs in the root destination folder (the
; one from the 'make install' process), and the usual 'lib' directory.
; Note that all *.dll files will be added, so be careful which DLLs are present
; in the folder before running this script.
;
; In all cases, you have to bundle at least one file named "rawtherapee.exe", which INNO Setup will require
; as a default executable to run.
; This script searches for and bundles all "rawtherapee*.exe" files, allowing
; you to bundle a "release" as well as a "debug" version at the same time.
; At least one "rawtherapee.exe" file is required.
;
; This script is configured to check that the operating system's bit depth is the same than the executable file.
; Please note that the ia64 architecture is not supported (is it really necessary?)
; This script is configured to check that the operating system's bit depth is
; the same as that of the executable file.
;
; The IA-64 architecture is not supported.
#define MyAppName "RawTherapee"
#define MyAppVersion "${GIT_VERSION}"
#define MyAppFullVersion "${GIT_VERSION}.${GIT_TAGDISTANCE}"
#define MyAppVersion "${GIT_DESCRIBE}"
#define MyAppVersionNumeric "${GIT_NUMERIC_VERSION_BS}"
#define MyAppPublisher "rawtherapee.com"
#define MyAppURL "http://www.rawtherapee.com/"
#define MyAppExeName "rawtherapee.exe"
@ -39,21 +35,20 @@
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{128459AB-59A7-430A-8BD0-3D8803D50400}
AppId={#MyAppName}{#MyAppVersion}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
VersionInfoVersion={#MyAppFullVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
VersionInfoVersion={#MyAppVersionNumeric}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}-{#MyAppFullVersion}
DefaultGroupName={#MyAppName} {#MyAppFullVersion}
DefaultDirName={pf}\{#MyAppName}\{#MyAppVersion}
DefaultGroupName={#MyAppName}
AllowNoIcons=yes
LicenseFile={#MyBuildBasePath}\LICENSE.txt
OutputDir={#MyBuildBasePath}\..\
OutputBaseFilename={#MyAppName}_{#MySystemName}_{#MyBitDepth}_{#MyAppFullVersion}
OutputBaseFilename={#MyAppName}_{#MyAppVersion}_{#MySystemName}_{#MyBitDepth}
SetupIconFile={#MySourceBasePath}\rtdata\icons\RT.ico
WizardImageFile={#MySourceBasePath}\tools\win\InnoSetup\installerStrip.bmp
WizardImageBackColor=$2A2A2A
@ -79,7 +74,6 @@ Name: "hebrew"; MessagesFile: "compiler:Languages\Hebrew.isl"
Name: "hungarian"; MessagesFile: "compiler:Languages\Hungarian.isl"
Name: "italian"; MessagesFile: "compiler:Languages\Italian.isl"
Name: "japanese"; MessagesFile: "compiler:Languages\Japanese.isl"
Name: "nepali"; MessagesFile: "compiler:Languages\Nepali.islu"
Name: "norwegian"; MessagesFile: "compiler:Languages\Norwegian.isl"
Name: "polish"; MessagesFile: "compiler:Languages\Polish.isl"
Name: "portuguese"; MessagesFile: "compiler:Languages\Portuguese.isl"
@ -97,7 +91,7 @@ Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{
Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked; OnlyBelowVersion: 0,6.1
[Files]
Source: "{#MyBuildBasePath}\rawtherapee.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "{#MyBuildBasePath}\rawtherapee*.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "{#MyBuildBasePath}\camconst.json"; DestDir: "{app}"; Flags: ignoreversion
Source: "{#MyBuildBasePath}\dcpprofiles\*"; DestDir: "{app}\dcpprofiles\"; Flags: ignoreversion recursesubdirs createallsubdirs
;Source: "{#MyBuildBasePath}\etc\*"; DestDir: "{app}\etc\"; Flags: ignoreversion recursesubdirs createallsubdirs
@ -122,11 +116,11 @@ Source: "{#MyBuildBasePath}\fonts\DroidSansMonoSlashed.ttf"; DestDir: "{fonts}";
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
[Icons]
Name: "{group}\{#MyAppName} {#MyAppFullVersion}"; Filename: "{app}\{#MyAppExeName}"
Name: "{group}\{#MyAppName} {#MyAppVersion}"; Filename: "{app}\{#MyAppExeName}"
Name: "{group}\{cm:ProgramOnTheWeb,{#MyAppName}}"; Filename: "{#MyAppURL}"
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\{#MyAppName}{#MyAppFullVersion}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName} {#MyAppFullVersion}"; Filename: "{app}\{#MyAppExeName}"; Tasks: quicklaunchicon
Name: "{commondesktop}\{#MyAppName} {#MyAppVersion}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName} {#MyAppVersion}"; Filename: "{app}\{#MyAppExeName}"; Tasks: quicklaunchicon
[Run]
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent

View File

@ -1,45 +1,40 @@
# Use the 'Debug' build type to have a non optimized, with debugging information, with a console executable
# Use the 'Release' build type to have an optimized, without debugging information, console free executable
# Use the 'RelWithDebInfo' build type to have an optimized, without debugging information, with a console executable
# Use the 'MinSizeRel' build type to have the smallest possible, without debugging information, console free executable
# Use the 'Debug' build type to have a non optimized, with debugging information, with a console executable.
# Use the 'Release' build type to have an optimized, without debugging information, console-free executable.
# Use the 'RelWithDebInfo' build type to have an optimized, without debugging information, with a console executable.
# Use the 'MinSizeRel' build type to have the smallest possible, without debugging information, console-free executable.
#
#set(CMAKE_BUILD_TYPE Release CACHE STRING "Between: None Debug Release RelWithDebInfo MinSizeRel.")
set(CMAKE_INSTALL_PREFIX ./Builds/${CMAKE_BUILD_TYPE} CACHE PATH "Libraries installation path")
set(DATADIR . CACHE PATH "Datas installation path")
set(CMAKE_INSTALL_PREFIX ./Builds/${CMAKE_BUILD_TYPE} CACHE PATH "Library installation path")
set(DATADIR . CACHE PATH "Data installation path")
set(BINDIR . CACHE PATH "Binaries installation path")
set(LIBDIR . CACHE PATH "Libraries installation path")
set(LIBDIR . CACHE PATH "Library installation path")
set(DOCDIR ./doc CACHE PATH "Documentation installation path")
set(CREDITSDIR . CACHE PATH "Credit file installation path")
set(LICENCEDIR . CACHE PATH "Licence file installation path")
set(BUILD_SHARED OFF CACHE BOOL "Should RT generate shared libraries")
set(BUILD_SHARED OFF CACHE BOOL "Should shared libraries be generated")
set(OPTION_OMP ON CACHE BOOL "Use OpenMP to speedup the preview and batch processing")
# set WITH_MYFILE_MMAP to OFF if you experience crash with thumbnail creation (it should be slower, but more reliable)
set(WITH_MYFILE_MMAP ON CACHE BOOL "Use the MMAP mechanism to speedup thumbnail creations")
# set WITH_MYFILE_MMAP to OFF if you experience crashes caused by thumbnail creation (it will be slower but more reliable).
set(WITH_MYFILE_MMAP ON CACHE BOOL "Use the MMAP mechanism to speedup thumbnail creation")
set(CACHE_NAME_SUFFIX "" CACHE STRING "RawTherapee's cache folder suffix (leave empty to use the default suffix, i.e. latesttag)")
set(CACHE_NAME_SUFFIX "" CACHE STRING "RawTherapee's cache folder suffix (leave empty to use default from UpdateIndo.cmake)")
# This line will let you chose the target number, and the associated processor
set(PROC_TARGET_NUMBER 0 CACHE STRING "Target Processor")
# To add a version suffix (text) after the standard version number, e.g. for patched builds
set(VERSION_SUFFIX "" CACHE STRING "For patched builds, use this string to add a version suffix (text); KEEP EMPTY FOR RELEASE BULDS")
# Choose the target processor's number from ProcessorTargets.cmake.
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")
# uncomment the next line and replace labelWithoutQuotes with a string.
#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
# Important: MinGW-w64 users 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-/64-bit builds.
set(CMAKE_CXX_FLAGS "-mwin32 -mthreads" CACHE STRING "Compiler options for C++ source files")
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g2" CACHE STRING "Compiler options for C++ source files and Debug target")
set(CMAKE_CXX_FLAGS_RELEASE "-mwindows -DNDEBUG -O2" CACHE STRING "Compiler options for C++ source files and Release target")
set(CMAKE_CXX_FLAGS_MINSIZEREL "-mwindows -DNDEBUG -Os" CACHE STRING "Compiler options for C++ source files and MinSizeRel target")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g" CACHE STRING "Compiler options for C++ source files and RelWithDebInfo target")
# Uncomment the next line and set the right value to override the default value (special compiling flags for RTEngine)
#set(RTENGINE_CXX_FLAGS "-funroll-loops" CACHE STRING "Special compilation flags for RTEngine")
set(CMAKE_C_FLAGS "-mwin32 -mthreads" CACHE STRING "Compiler options for C source files")
set(CMAKE_C_FLAGS_DEBUG "-O0 -g2" CACHE STRING "Compiler options for C source files and Debug target")
set(CMAKE_C_FLAGS_RELEASE "-mwindows -DNDEBUG -O2" CACHE STRING "Compiler options for C source files and Release target")