diff --git a/rtdata/images/non-themed/png/empty.png b/rtdata/images/non-themed/png/empty.png new file mode 100644 index 000000000..534ddcb72 Binary files /dev/null and b/rtdata/images/non-themed/png/empty.png differ diff --git a/rtdata/images/themed/png/dark/color-picker-add-hicontrast.png b/rtdata/images/themed/png/dark/color-picker-add-hicontrast.png new file mode 100644 index 000000000..53eaabf60 Binary files /dev/null and b/rtdata/images/themed/png/dark/color-picker-add-hicontrast.png differ diff --git a/rtdata/images/themed/png/dark/color-picker-hicontrast.png b/rtdata/images/themed/png/dark/color-picker-hicontrast.png new file mode 100644 index 000000000..c2592a8b7 Binary files /dev/null and b/rtdata/images/themed/png/dark/color-picker-hicontrast.png differ diff --git a/rtdata/images/themed/png/dark/crosshair.png b/rtdata/images/themed/png/dark/crosshair-hicontrast.png similarity index 100% rename from rtdata/images/themed/png/dark/crosshair.png rename to rtdata/images/themed/png/dark/crosshair-hicontrast.png diff --git a/rtdata/images/themed/png/dark/gamut-plus.png b/rtdata/images/themed/png/dark/gamut-plus.png index 091e38337..a83f5e603 100644 Binary files a/rtdata/images/themed/png/dark/gamut-plus.png and b/rtdata/images/themed/png/dark/gamut-plus.png differ diff --git a/rtdata/images/themed/png/dark/hand-closed.png b/rtdata/images/themed/png/dark/hand-closed-hicontrast.png similarity index 100% rename from rtdata/images/themed/png/dark/hand-closed.png rename to rtdata/images/themed/png/dark/hand-closed-hicontrast.png diff --git a/rtdata/images/themed/png/dark/node-move-x-hicontrast.png b/rtdata/images/themed/png/dark/node-move-x-hicontrast.png new file mode 100644 index 000000000..92a1c49e2 Binary files /dev/null and b/rtdata/images/themed/png/dark/node-move-x-hicontrast.png differ diff --git a/rtdata/images/themed/png/dark/node-move-xy-hicontrast.png b/rtdata/images/themed/png/dark/node-move-xy-hicontrast.png new file mode 100644 index 000000000..3984385af Binary files /dev/null and b/rtdata/images/themed/png/dark/node-move-xy-hicontrast.png differ diff --git a/rtdata/images/themed/png/dark/node-move-y-hicontrast.png b/rtdata/images/themed/png/dark/node-move-y-hicontrast.png new file mode 100644 index 000000000..e2fc55da8 Binary files /dev/null and b/rtdata/images/themed/png/dark/node-move-y-hicontrast.png differ diff --git a/rtdata/images/themed/png/dark/rotate-aroundnode-hicontrast.png b/rtdata/images/themed/png/dark/rotate-aroundnode-hicontrast.png new file mode 100644 index 000000000..d8929ac42 Binary files /dev/null and b/rtdata/images/themed/png/dark/rotate-aroundnode-hicontrast.png differ diff --git a/rtdata/images/themed/png/dark/rotate-aroundnode.png b/rtdata/images/themed/png/dark/rotate-aroundnode.png new file mode 100644 index 000000000..50db200a6 Binary files /dev/null and b/rtdata/images/themed/png/dark/rotate-aroundnode.png differ diff --git a/rtdata/images/themed/png/dark/square-toggle-black-off.png b/rtdata/images/themed/png/dark/square-toggle-black-off-narrow.png similarity index 100% rename from rtdata/images/themed/png/dark/square-toggle-black-off.png rename to rtdata/images/themed/png/dark/square-toggle-black-off-narrow.png diff --git a/rtdata/images/themed/png/dark/square-toggle-black-on.png b/rtdata/images/themed/png/dark/square-toggle-black-on-narrow.png similarity index 100% rename from rtdata/images/themed/png/dark/square-toggle-black-on.png rename to rtdata/images/themed/png/dark/square-toggle-black-on-narrow.png diff --git a/rtdata/images/themed/png/dark/square-toggle-blue-off.png b/rtdata/images/themed/png/dark/square-toggle-blue-off-narrow.png similarity index 100% rename from rtdata/images/themed/png/dark/square-toggle-blue-off.png rename to rtdata/images/themed/png/dark/square-toggle-blue-off-narrow.png diff --git a/rtdata/images/themed/png/dark/square-toggle-blue-on.png b/rtdata/images/themed/png/dark/square-toggle-blue-on-narrow.png similarity index 100% rename from rtdata/images/themed/png/dark/square-toggle-blue-on.png rename to rtdata/images/themed/png/dark/square-toggle-blue-on-narrow.png diff --git a/rtdata/images/themed/png/dark/square-toggle-gray-off.png b/rtdata/images/themed/png/dark/square-toggle-gray-off-narrow.png similarity index 100% rename from rtdata/images/themed/png/dark/square-toggle-gray-off.png rename to rtdata/images/themed/png/dark/square-toggle-gray-off-narrow.png diff --git a/rtdata/images/themed/png/dark/square-toggle-gray-on.png b/rtdata/images/themed/png/dark/square-toggle-gray-on-narrow.png similarity index 100% rename from rtdata/images/themed/png/dark/square-toggle-gray-on.png rename to rtdata/images/themed/png/dark/square-toggle-gray-on-narrow.png diff --git a/rtdata/images/themed/png/dark/square-toggle-green-off.png b/rtdata/images/themed/png/dark/square-toggle-green-off-narrow.png similarity index 100% rename from rtdata/images/themed/png/dark/square-toggle-green-off.png rename to rtdata/images/themed/png/dark/square-toggle-green-off-narrow.png diff --git a/rtdata/images/themed/png/dark/square-toggle-green-on.png b/rtdata/images/themed/png/dark/square-toggle-green-on-narrow.png similarity index 100% rename from rtdata/images/themed/png/dark/square-toggle-green-on.png rename to rtdata/images/themed/png/dark/square-toggle-green-on-narrow.png diff --git a/rtdata/images/themed/png/dark/square-toggle-luminosity-off.png b/rtdata/images/themed/png/dark/square-toggle-luminosity-off-narrow.png similarity index 100% rename from rtdata/images/themed/png/dark/square-toggle-luminosity-off.png rename to rtdata/images/themed/png/dark/square-toggle-luminosity-off-narrow.png diff --git a/rtdata/images/themed/png/dark/square-toggle-luminosity-on.png b/rtdata/images/themed/png/dark/square-toggle-luminosity-on-narrow.png similarity index 100% rename from rtdata/images/themed/png/dark/square-toggle-luminosity-on.png rename to rtdata/images/themed/png/dark/square-toggle-luminosity-on-narrow.png diff --git a/rtdata/images/themed/png/dark/square-toggle-red-off.png b/rtdata/images/themed/png/dark/square-toggle-red-off-narrow.png similarity index 100% rename from rtdata/images/themed/png/dark/square-toggle-red-off.png rename to rtdata/images/themed/png/dark/square-toggle-red-off-narrow.png diff --git a/rtdata/images/themed/png/dark/square-toggle-red-on.png b/rtdata/images/themed/png/dark/square-toggle-red-on-narrow.png similarity index 100% rename from rtdata/images/themed/png/dark/square-toggle-red-on.png rename to rtdata/images/themed/png/dark/square-toggle-red-on-narrow.png diff --git a/rtdata/images/themed/png/dark/square-toggle-theme-off.png b/rtdata/images/themed/png/dark/square-toggle-theme-off-narrow.png similarity index 100% rename from rtdata/images/themed/png/dark/square-toggle-theme-off.png rename to rtdata/images/themed/png/dark/square-toggle-theme-off-narrow.png diff --git a/rtdata/images/themed/png/dark/square-toggle-theme-on.png b/rtdata/images/themed/png/dark/square-toggle-theme-on-narrow.png similarity index 100% rename from rtdata/images/themed/png/dark/square-toggle-theme-on.png rename to rtdata/images/themed/png/dark/square-toggle-theme-on-narrow.png diff --git a/rtdata/images/themed/png/dark/square-toggle-white-off.png b/rtdata/images/themed/png/dark/square-toggle-white-off-narrow.png similarity index 100% rename from rtdata/images/themed/png/dark/square-toggle-white-off.png rename to rtdata/images/themed/png/dark/square-toggle-white-off-narrow.png diff --git a/rtdata/images/themed/png/dark/square-toggle-white-on.png b/rtdata/images/themed/png/dark/square-toggle-white-on-narrow.png similarity index 100% rename from rtdata/images/themed/png/dark/square-toggle-white-on.png rename to rtdata/images/themed/png/dark/square-toggle-white-on-narrow.png diff --git a/rtdata/images/themed/png/dark/star-gold-hollow-narrow.png b/rtdata/images/themed/png/dark/star-gold-hollow-narrow.png new file mode 100644 index 000000000..b0ce704d6 Binary files /dev/null and b/rtdata/images/themed/png/dark/star-gold-hollow-narrow.png differ diff --git a/rtdata/images/themed/png/dark/star-gold-hollow.png b/rtdata/images/themed/png/dark/star-gold-hollow.png new file mode 100644 index 000000000..44bf29d12 Binary files /dev/null and b/rtdata/images/themed/png/dark/star-gold-hollow.png differ diff --git a/rtdata/images/themed/png/dark/star-gold-narrow.png b/rtdata/images/themed/png/dark/star-gold-narrow.png new file mode 100644 index 000000000..32710fb9d Binary files /dev/null and b/rtdata/images/themed/png/dark/star-gold-narrow.png differ diff --git a/rtdata/images/themed/png/dark/star-gold.png b/rtdata/images/themed/png/dark/star-gold.png new file mode 100644 index 000000000..5e3805005 Binary files /dev/null and b/rtdata/images/themed/png/dark/star-gold.png differ diff --git a/rtdata/images/themed/png/dark/star-hollow-narrow.png b/rtdata/images/themed/png/dark/star-hollow-narrow.png new file mode 100644 index 000000000..b9c978350 Binary files /dev/null and b/rtdata/images/themed/png/dark/star-hollow-narrow.png differ diff --git a/rtdata/images/themed/png/dark/star-hollow.png b/rtdata/images/themed/png/dark/star-hollow.png new file mode 100644 index 000000000..dd7015f8a Binary files /dev/null and b/rtdata/images/themed/png/dark/star-hollow.png differ diff --git a/rtdata/images/themed/png/dark/star-narrow.png b/rtdata/images/themed/png/dark/star-narrow.png new file mode 100644 index 000000000..bdcc73bfe Binary files /dev/null and b/rtdata/images/themed/png/dark/star-narrow.png differ diff --git a/rtdata/images/themed/png/dark/star-small.png b/rtdata/images/themed/png/dark/star-small.png index c8f21783c..db895d932 100644 Binary files a/rtdata/images/themed/png/dark/star-small.png and b/rtdata/images/themed/png/dark/star-small.png differ diff --git a/rtdata/images/themed/png/dark/star.png b/rtdata/images/themed/png/dark/star.png new file mode 100644 index 000000000..6dde0fbe3 Binary files /dev/null and b/rtdata/images/themed/png/dark/star.png differ diff --git a/rtdata/images/themed/png/light/color-picker-add-hicontrast.png b/rtdata/images/themed/png/light/color-picker-add-hicontrast.png new file mode 100644 index 000000000..53eaabf60 Binary files /dev/null and b/rtdata/images/themed/png/light/color-picker-add-hicontrast.png differ diff --git a/rtdata/images/themed/png/light/color-picker-hicontrast.png b/rtdata/images/themed/png/light/color-picker-hicontrast.png new file mode 100644 index 000000000..c2592a8b7 Binary files /dev/null and b/rtdata/images/themed/png/light/color-picker-hicontrast.png differ diff --git a/rtdata/images/themed/png/light/crosshair.png b/rtdata/images/themed/png/light/crosshair-hicontrast.png similarity index 100% rename from rtdata/images/themed/png/light/crosshair.png rename to rtdata/images/themed/png/light/crosshair-hicontrast.png diff --git a/rtdata/images/themed/png/light/gamut-plus.png b/rtdata/images/themed/png/light/gamut-plus.png index 43c0c321a..c41e5a39b 100644 Binary files a/rtdata/images/themed/png/light/gamut-plus.png and b/rtdata/images/themed/png/light/gamut-plus.png differ diff --git a/rtdata/images/themed/png/light/hand-closed.png b/rtdata/images/themed/png/light/hand-closed-hicontrast.png similarity index 100% rename from rtdata/images/themed/png/light/hand-closed.png rename to rtdata/images/themed/png/light/hand-closed-hicontrast.png diff --git a/rtdata/images/themed/png/light/node-move-x-hicontrast.png b/rtdata/images/themed/png/light/node-move-x-hicontrast.png new file mode 100644 index 000000000..92a1c49e2 Binary files /dev/null and b/rtdata/images/themed/png/light/node-move-x-hicontrast.png differ diff --git a/rtdata/images/themed/png/light/node-move-xy-hicontrast.png b/rtdata/images/themed/png/light/node-move-xy-hicontrast.png new file mode 100644 index 000000000..3984385af Binary files /dev/null and b/rtdata/images/themed/png/light/node-move-xy-hicontrast.png differ diff --git a/rtdata/images/themed/png/light/node-move-y-hicontrast.png b/rtdata/images/themed/png/light/node-move-y-hicontrast.png new file mode 100644 index 000000000..e2fc55da8 Binary files /dev/null and b/rtdata/images/themed/png/light/node-move-y-hicontrast.png differ diff --git a/rtdata/images/themed/png/light/rotate-aroundnode-hicontrast.png b/rtdata/images/themed/png/light/rotate-aroundnode-hicontrast.png new file mode 100644 index 000000000..d8929ac42 Binary files /dev/null and b/rtdata/images/themed/png/light/rotate-aroundnode-hicontrast.png differ diff --git a/rtdata/images/themed/png/light/rotate-aroundnode.png b/rtdata/images/themed/png/light/rotate-aroundnode.png new file mode 100644 index 000000000..5da406b64 Binary files /dev/null and b/rtdata/images/themed/png/light/rotate-aroundnode.png differ diff --git a/rtdata/images/themed/png/light/square-toggle-black-off.png b/rtdata/images/themed/png/light/square-toggle-black-off-narrow.png similarity index 100% rename from rtdata/images/themed/png/light/square-toggle-black-off.png rename to rtdata/images/themed/png/light/square-toggle-black-off-narrow.png diff --git a/rtdata/images/themed/png/light/square-toggle-black-on.png b/rtdata/images/themed/png/light/square-toggle-black-on-narrow.png similarity index 100% rename from rtdata/images/themed/png/light/square-toggle-black-on.png rename to rtdata/images/themed/png/light/square-toggle-black-on-narrow.png diff --git a/rtdata/images/themed/png/light/square-toggle-blue-off.png b/rtdata/images/themed/png/light/square-toggle-blue-off-narrow.png similarity index 100% rename from rtdata/images/themed/png/light/square-toggle-blue-off.png rename to rtdata/images/themed/png/light/square-toggle-blue-off-narrow.png diff --git a/rtdata/images/themed/png/light/square-toggle-blue-on.png b/rtdata/images/themed/png/light/square-toggle-blue-on-narrow.png similarity index 100% rename from rtdata/images/themed/png/light/square-toggle-blue-on.png rename to rtdata/images/themed/png/light/square-toggle-blue-on-narrow.png diff --git a/rtdata/images/themed/png/light/square-toggle-gray-off.png b/rtdata/images/themed/png/light/square-toggle-gray-off-narrow.png similarity index 100% rename from rtdata/images/themed/png/light/square-toggle-gray-off.png rename to rtdata/images/themed/png/light/square-toggle-gray-off-narrow.png diff --git a/rtdata/images/themed/png/light/square-toggle-gray-on.png b/rtdata/images/themed/png/light/square-toggle-gray-on-narrow.png similarity index 100% rename from rtdata/images/themed/png/light/square-toggle-gray-on.png rename to rtdata/images/themed/png/light/square-toggle-gray-on-narrow.png diff --git a/rtdata/images/themed/png/light/square-toggle-green-off.png b/rtdata/images/themed/png/light/square-toggle-green-off-narrow.png similarity index 100% rename from rtdata/images/themed/png/light/square-toggle-green-off.png rename to rtdata/images/themed/png/light/square-toggle-green-off-narrow.png diff --git a/rtdata/images/themed/png/light/square-toggle-green-on.png b/rtdata/images/themed/png/light/square-toggle-green-on-narrow.png similarity index 100% rename from rtdata/images/themed/png/light/square-toggle-green-on.png rename to rtdata/images/themed/png/light/square-toggle-green-on-narrow.png diff --git a/rtdata/images/themed/png/light/square-toggle-luminosity-off.png b/rtdata/images/themed/png/light/square-toggle-luminosity-off-narrow.png similarity index 100% rename from rtdata/images/themed/png/light/square-toggle-luminosity-off.png rename to rtdata/images/themed/png/light/square-toggle-luminosity-off-narrow.png diff --git a/rtdata/images/themed/png/light/square-toggle-luminosity-on.png b/rtdata/images/themed/png/light/square-toggle-luminosity-on-narrow.png similarity index 100% rename from rtdata/images/themed/png/light/square-toggle-luminosity-on.png rename to rtdata/images/themed/png/light/square-toggle-luminosity-on-narrow.png diff --git a/rtdata/images/themed/png/light/square-toggle-red-off.png b/rtdata/images/themed/png/light/square-toggle-red-off-narrow.png similarity index 100% rename from rtdata/images/themed/png/light/square-toggle-red-off.png rename to rtdata/images/themed/png/light/square-toggle-red-off-narrow.png diff --git a/rtdata/images/themed/png/light/square-toggle-red-on.png b/rtdata/images/themed/png/light/square-toggle-red-on-narrow.png similarity index 100% rename from rtdata/images/themed/png/light/square-toggle-red-on.png rename to rtdata/images/themed/png/light/square-toggle-red-on-narrow.png diff --git a/rtdata/images/themed/png/light/square-toggle-theme-off.png b/rtdata/images/themed/png/light/square-toggle-theme-off-narrow.png similarity index 100% rename from rtdata/images/themed/png/light/square-toggle-theme-off.png rename to rtdata/images/themed/png/light/square-toggle-theme-off-narrow.png diff --git a/rtdata/images/themed/png/light/square-toggle-theme-on.png b/rtdata/images/themed/png/light/square-toggle-theme-on-narrow.png similarity index 100% rename from rtdata/images/themed/png/light/square-toggle-theme-on.png rename to rtdata/images/themed/png/light/square-toggle-theme-on-narrow.png diff --git a/rtdata/images/themed/png/light/square-toggle-white-off.png b/rtdata/images/themed/png/light/square-toggle-white-off-narrow.png similarity index 100% rename from rtdata/images/themed/png/light/square-toggle-white-off.png rename to rtdata/images/themed/png/light/square-toggle-white-off-narrow.png diff --git a/rtdata/images/themed/png/light/square-toggle-white-on.png b/rtdata/images/themed/png/light/square-toggle-white-on-narrow.png similarity index 100% rename from rtdata/images/themed/png/light/square-toggle-white-on.png rename to rtdata/images/themed/png/light/square-toggle-white-on-narrow.png diff --git a/rtdata/images/themed/png/light/star-gold-hollow-narrow.png b/rtdata/images/themed/png/light/star-gold-hollow-narrow.png new file mode 100644 index 000000000..b0ce704d6 Binary files /dev/null and b/rtdata/images/themed/png/light/star-gold-hollow-narrow.png differ diff --git a/rtdata/images/themed/png/light/star-gold-hollow.png b/rtdata/images/themed/png/light/star-gold-hollow.png new file mode 100644 index 000000000..44bf29d12 Binary files /dev/null and b/rtdata/images/themed/png/light/star-gold-hollow.png differ diff --git a/rtdata/images/themed/png/light/star-gold-narrow.png b/rtdata/images/themed/png/light/star-gold-narrow.png new file mode 100644 index 000000000..32710fb9d Binary files /dev/null and b/rtdata/images/themed/png/light/star-gold-narrow.png differ diff --git a/rtdata/images/themed/png/light/star-gold.png b/rtdata/images/themed/png/light/star-gold.png new file mode 100644 index 000000000..5e3805005 Binary files /dev/null and b/rtdata/images/themed/png/light/star-gold.png differ diff --git a/rtdata/images/themed/png/light/star-hollow-narrow.png b/rtdata/images/themed/png/light/star-hollow-narrow.png new file mode 100644 index 000000000..4a15f0ba1 Binary files /dev/null and b/rtdata/images/themed/png/light/star-hollow-narrow.png differ diff --git a/rtdata/images/themed/png/light/star-hollow.png b/rtdata/images/themed/png/light/star-hollow.png new file mode 100644 index 000000000..3e610948d Binary files /dev/null and b/rtdata/images/themed/png/light/star-hollow.png differ diff --git a/rtdata/images/themed/png/light/star-narrow.png b/rtdata/images/themed/png/light/star-narrow.png new file mode 100644 index 000000000..78c8eea8a Binary files /dev/null and b/rtdata/images/themed/png/light/star-narrow.png differ diff --git a/rtdata/images/themed/png/light/star-small.png b/rtdata/images/themed/png/light/star-small.png index 8ff98fa6b..2bb54647a 100644 Binary files a/rtdata/images/themed/png/light/star-small.png and b/rtdata/images/themed/png/light/star-small.png differ diff --git a/rtdata/images/themed/png/light/star.png b/rtdata/images/themed/png/light/star.png new file mode 100644 index 000000000..f29ccfdcd Binary files /dev/null and b/rtdata/images/themed/png/light/star.png differ diff --git a/rtdata/images/themed/svg/color-picker-add-hicontrast.svg b/rtdata/images/themed/svg/color-picker-add-hicontrast.svg new file mode 100644 index 000000000..3d51dd31f --- /dev/null +++ b/rtdata/images/themed/svg/color-picker-add-hicontrast.svg @@ -0,0 +1,142 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/color-picker-hicontrast.svg b/rtdata/images/themed/svg/color-picker-hicontrast.svg new file mode 100644 index 000000000..867f9730b --- /dev/null +++ b/rtdata/images/themed/svg/color-picker-hicontrast.svg @@ -0,0 +1,137 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/crosshair.svg b/rtdata/images/themed/svg/crosshair-hicontrast.svg similarity index 100% rename from rtdata/images/themed/svg/crosshair.svg rename to rtdata/images/themed/svg/crosshair-hicontrast.svg diff --git a/rtdata/images/themed/svg/gamut-plus.svg b/rtdata/images/themed/svg/gamut-plus.svg index 218f3068d..c27796b70 100644 --- a/rtdata/images/themed/svg/gamut-plus.svg +++ b/rtdata/images/themed/svg/gamut-plus.svg @@ -42,7 +42,7 @@ inkscape:snap-bbox="true" inkscape:bbox-nodes="true" inkscape:snap-others="false" - inkscape:object-nodes="true" + inkscape:object-nodes="false" inkscape:snap-grids="true" inkscape:snap-bbox-midpoints="false"> - + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/node-move-xy-hicontrast.svg b/rtdata/images/themed/svg/node-move-xy-hicontrast.svg new file mode 100644 index 000000000..9c3915804 --- /dev/null +++ b/rtdata/images/themed/svg/node-move-xy-hicontrast.svg @@ -0,0 +1,130 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/node-move-y-hicontrast.svg b/rtdata/images/themed/svg/node-move-y-hicontrast.svg new file mode 100644 index 000000000..fe7b285e7 --- /dev/null +++ b/rtdata/images/themed/svg/node-move-y-hicontrast.svg @@ -0,0 +1,120 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/rotate-aroundnode-hicontrast.svg b/rtdata/images/themed/svg/rotate-aroundnode-hicontrast.svg new file mode 100644 index 000000000..fda645c55 --- /dev/null +++ b/rtdata/images/themed/svg/rotate-aroundnode-hicontrast.svg @@ -0,0 +1,118 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/rotate-aroundnode.svg b/rtdata/images/themed/svg/rotate-aroundnode.svg new file mode 100644 index 000000000..67ac406fa --- /dev/null +++ b/rtdata/images/themed/svg/rotate-aroundnode.svg @@ -0,0 +1,136 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/square-toggle-black-off.svg b/rtdata/images/themed/svg/square-toggle-black-off-narrow.svg similarity index 100% rename from rtdata/images/themed/svg/square-toggle-black-off.svg rename to rtdata/images/themed/svg/square-toggle-black-off-narrow.svg diff --git a/rtdata/images/themed/svg/square-toggle-black-on.svg b/rtdata/images/themed/svg/square-toggle-black-on-narrow.svg similarity index 100% rename from rtdata/images/themed/svg/square-toggle-black-on.svg rename to rtdata/images/themed/svg/square-toggle-black-on-narrow.svg diff --git a/rtdata/images/themed/svg/square-toggle-blue-off.svg b/rtdata/images/themed/svg/square-toggle-blue-off-narrow.svg similarity index 100% rename from rtdata/images/themed/svg/square-toggle-blue-off.svg rename to rtdata/images/themed/svg/square-toggle-blue-off-narrow.svg diff --git a/rtdata/images/themed/svg/square-toggle-blue-on.svg b/rtdata/images/themed/svg/square-toggle-blue-on-narrow.svg similarity index 100% rename from rtdata/images/themed/svg/square-toggle-blue-on.svg rename to rtdata/images/themed/svg/square-toggle-blue-on-narrow.svg diff --git a/rtdata/images/themed/svg/square-toggle-gray-off.svg b/rtdata/images/themed/svg/square-toggle-gray-off-narrow.svg similarity index 100% rename from rtdata/images/themed/svg/square-toggle-gray-off.svg rename to rtdata/images/themed/svg/square-toggle-gray-off-narrow.svg diff --git a/rtdata/images/themed/svg/square-toggle-gray-on.svg b/rtdata/images/themed/svg/square-toggle-gray-on-narrow.svg similarity index 100% rename from rtdata/images/themed/svg/square-toggle-gray-on.svg rename to rtdata/images/themed/svg/square-toggle-gray-on-narrow.svg diff --git a/rtdata/images/themed/svg/square-toggle-green-off.svg b/rtdata/images/themed/svg/square-toggle-green-off-narrow.svg similarity index 100% rename from rtdata/images/themed/svg/square-toggle-green-off.svg rename to rtdata/images/themed/svg/square-toggle-green-off-narrow.svg diff --git a/rtdata/images/themed/svg/square-toggle-green-on.svg b/rtdata/images/themed/svg/square-toggle-green-on-narrow.svg similarity index 100% rename from rtdata/images/themed/svg/square-toggle-green-on.svg rename to rtdata/images/themed/svg/square-toggle-green-on-narrow.svg diff --git a/rtdata/images/themed/svg/square-toggle-luminosity-off.svg b/rtdata/images/themed/svg/square-toggle-luminosity-off-narrow.svg similarity index 100% rename from rtdata/images/themed/svg/square-toggle-luminosity-off.svg rename to rtdata/images/themed/svg/square-toggle-luminosity-off-narrow.svg diff --git a/rtdata/images/themed/svg/square-toggle-luminosity-on.svg b/rtdata/images/themed/svg/square-toggle-luminosity-on-narrow.svg similarity index 100% rename from rtdata/images/themed/svg/square-toggle-luminosity-on.svg rename to rtdata/images/themed/svg/square-toggle-luminosity-on-narrow.svg diff --git a/rtdata/images/themed/svg/square-toggle-red-off.svg b/rtdata/images/themed/svg/square-toggle-red-off-narrow.svg similarity index 100% rename from rtdata/images/themed/svg/square-toggle-red-off.svg rename to rtdata/images/themed/svg/square-toggle-red-off-narrow.svg diff --git a/rtdata/images/themed/svg/square-toggle-red-on.svg b/rtdata/images/themed/svg/square-toggle-red-on-narrow.svg similarity index 100% rename from rtdata/images/themed/svg/square-toggle-red-on.svg rename to rtdata/images/themed/svg/square-toggle-red-on-narrow.svg diff --git a/rtdata/images/themed/svg/square-toggle-theme-off.svg b/rtdata/images/themed/svg/square-toggle-theme-off-narrow.svg similarity index 100% rename from rtdata/images/themed/svg/square-toggle-theme-off.svg rename to rtdata/images/themed/svg/square-toggle-theme-off-narrow.svg diff --git a/rtdata/images/themed/svg/square-toggle-theme-on.svg b/rtdata/images/themed/svg/square-toggle-theme-on-narrow.svg similarity index 100% rename from rtdata/images/themed/svg/square-toggle-theme-on.svg rename to rtdata/images/themed/svg/square-toggle-theme-on-narrow.svg diff --git a/rtdata/images/themed/svg/square-toggle-white-off.svg b/rtdata/images/themed/svg/square-toggle-white-off-narrow.svg similarity index 100% rename from rtdata/images/themed/svg/square-toggle-white-off.svg rename to rtdata/images/themed/svg/square-toggle-white-off-narrow.svg diff --git a/rtdata/images/themed/svg/square-toggle-white-on.svg b/rtdata/images/themed/svg/square-toggle-white-on-narrow.svg similarity index 100% rename from rtdata/images/themed/svg/square-toggle-white-on.svg rename to rtdata/images/themed/svg/square-toggle-white-on-narrow.svg diff --git a/rtdata/images/themed/svg/star-gold-hollow-narrow.svg b/rtdata/images/themed/svg/star-gold-hollow-narrow.svg new file mode 100644 index 000000000..82ab83a4a --- /dev/null +++ b/rtdata/images/themed/svg/star-gold-hollow-narrow.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/star-gold-narrow.svg b/rtdata/images/themed/svg/star-gold-narrow.svg new file mode 100644 index 000000000..ee54c8214 --- /dev/null +++ b/rtdata/images/themed/svg/star-gold-narrow.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/star-hollow-narrow.svg b/rtdata/images/themed/svg/star-hollow-narrow.svg new file mode 100644 index 000000000..66b1c233c --- /dev/null +++ b/rtdata/images/themed/svg/star-hollow-narrow.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/star-narrow.svg b/rtdata/images/themed/svg/star-narrow.svg new file mode 100644 index 000000000..90add16d5 --- /dev/null +++ b/rtdata/images/themed/svg/star-narrow.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/star-small.svg b/rtdata/images/themed/svg/star-small.svg index f15d135b8..cd7a9b8ef 100644 --- a/rtdata/images/themed/svg/star-small.svg +++ b/rtdata/images/themed/svg/star-small.svg @@ -26,8 +26,8 @@ borderopacity="1.0" inkscape:pageopacity="0" inkscape:pageshadow="2" - inkscape:zoom="50.625" - inkscape:cx="8" + inkscape:zoom="51.375" + inkscape:cx="8.0194647" inkscape:cy="8" inkscape:document-units="px" inkscape:current-layer="layer1" @@ -109,8 +109,8 @@ transform="translate(0,-8)"> + transform="matrix(0.86350439,-0.28029946,0.28056958,0.86267304,-3.3971484,4.0671624)" + inkscape:transform-center-y="-0.51970384" /> diff --git a/rtdata/images/themed/svg/template-narrow.svg b/rtdata/images/themed/svg/template-narrow.svg new file mode 100644 index 000000000..9a6321317 --- /dev/null +++ b/rtdata/images/themed/svg/template-narrow.svg @@ -0,0 +1,110 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index 4318514f2..e69bd8c57 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -68,6 +68,7 @@ #67 05.07.2018 Erweiterung (TooWaBoo) RT 5.4 #68 05.07.2018 Erweiterung (TooWaBoo) RT 5.4 #69 25.07.2018 Erweiterung (TooWaBoo) RT 5.4 +#70 25.07.2018 Korrekturen (TooWaBoo) RT 5.4 ABOUT_TAB_BUILD;Version ABOUT_TAB_CREDITS;Danksagungen @@ -98,11 +99,11 @@ CURVEEDITOR_NURBS;NURBS-Kurve CURVEEDITOR_PARAMETRIC;Parametrisch CURVEEDITOR_SAVEDLGLABEL;Kurve speichern... CURVEEDITOR_SHADOWS;Schatten -CURVEEDITOR_TOOLTIPCOPY;Kurve in Zwischenablage kopieren -CURVEEDITOR_TOOLTIPLINEAR;Kurve zurücksetzen -CURVEEDITOR_TOOLTIPLOAD;Kurve laden -CURVEEDITOR_TOOLTIPPASTE;Kurve aus Zwischenablage einfügen -CURVEEDITOR_TOOLTIPSAVE;Kurve speichern +CURVEEDITOR_TOOLTIPCOPY;Kurve in Zwischenablage kopieren. +CURVEEDITOR_TOOLTIPLINEAR;Kurve zurücksetzen. +CURVEEDITOR_TOOLTIPLOAD;Kurve laden. +CURVEEDITOR_TOOLTIPPASTE;Kurve aus Zwischenablage einfügen. +CURVEEDITOR_TOOLTIPSAVE;Kurve speichern. CURVEEDITOR_TYPE;Typ: DIRBROWSER_FOLDERS;Ordner DONT_SHOW_AGAIN;Meldung nicht mehr anzeigen. @@ -116,7 +117,7 @@ DYNPROFILEEDITOR_NEW;Neu DYNPROFILEEDITOR_NEW_RULE;Profilregel erstellen DYNPROFILEEDITOR_PROFILE;Profil EDITWINDOW_TITLE;Bildbearbeitung -EDIT_OBJECT_TOOLTIP;Schaltet das Einstellungswerkzeug\nim Vorschaubild ein/aus +EDIT_OBJECT_TOOLTIP;Schaltet das Einstellungswerkzeug\nim Vorschaubild ein/aus. EDIT_PIPETTE_TOOLTIP;Um einen Punkt der Kurve hinzuzufügen, halten Sie die Strg-Taste gedrückt und klicken mit der linke Maustaste auf die gewünschte Stelle in der Vorschau.\nUm den Punkt anzupassen, halten Sie die Strg-Taste gedrückt und klicken Sie mit der linken Maustaste auf den entsprechenden Bereich in der Vorschau. Dann lassen Sie die Strg-Taste los (es sei denn, Sie möchten eine Feineinstellung vornehmen) und bewegen die Maus bei gedrückter linker Maustaste nach oben oder unten, um den Punkt auf der Kurve zu bewegen. EXIFFILTER_APERTURE;Blende EXIFFILTER_CAMERA;Kamera @@ -254,7 +255,7 @@ FILEBROWSER_SHOWCOLORLABEL5HINT;Nur violett markierte Bilder anzeigen\nTaste: d FILEBROWSER_SHOWEDITEDHINT;Nur bearbeitete Bilder anzeigen\nTaste: 7 FILEBROWSER_SHOWEDITEDNOTHINT;Nur unbearbeitete Bilder anzeigen\nTaste: 6 -FILEBROWSER_SHOWEXIFINFO;Bildinformationen ein-/ausblenden\n\nIm Multi-Reitermodus:\nTaste: i\nIm Ein-Reitermodus:\nTaste: Alt + i +FILEBROWSER_SHOWEXIFINFO;Bildinformationen ein-/ausblenden.\n\nIm Multi-Reitermodus:\nTaste: i\nIm Ein-Reitermodus:\nTaste: Alt + i FILEBROWSER_SHOWNOTTRASHHINT;Nur nicht gelöschte Bilder anzeigen FILEBROWSER_SHOWORIGINALHINT;Zeige nur das Originalbild.\n\nWenn mehrere Bilder mit dem gleichen Dateinamen und unterschiedlichen Dateitypen existieren, ist das Originalbild das Bild, welches in der Liste "Dateitypen anzeigen" unter Einstellungen > Dateiverwaltung als erstes gefunden wird. FILEBROWSER_SHOWRANK1HINT;Nur mit 1 Stern bewertete Bilder anzeigen\nTaste: 1 @@ -305,13 +306,14 @@ GENERAL_SLIDER;Regler GENERAL_UNCHANGED;(Unverändert) GENERAL_WARNING;Warnung GIMP_PLUGIN_INFO;Willkommen zum RawTherapee GIMP-Plugin!\nNach den Änderungen bitte das RawTherapee-Fenster schließen.\nDas Bild wird dann automatisch in GIMP importiert. -HISTOGRAM_TOOLTIP_B;Blau-Histogramm ein-/ausblenden -HISTOGRAM_TOOLTIP_BAR;RGB-Anzeigeleiste ein-/ausblenden\n\nZum Fixieren/Lösen der Anzeige muss mit der\nrechten Maustaste ins Bildfenster geklickt werden. -HISTOGRAM_TOOLTIP_CHRO;Chromatizität-Histogramm ein/ausblenden -HISTOGRAM_TOOLTIP_FULL;Skaliertes Histogramm ein/ausschalten -HISTOGRAM_TOOLTIP_G;Grün-Histogramm ein-/ausblenden -HISTOGRAM_TOOLTIP_L;CIELab-Luminanz-Histogramm ein-/ausblenden -HISTOGRAM_TOOLTIP_R;Rot-Histogramm ein-/ausblenden +HISTOGRAM_TOOLTIP_B;Blau-Histogramm ein-/ausblenden. +HISTOGRAM_TOOLTIP_BAR;RGB-Anzeigeleiste ein-/ausblenden. +HISTOGRAM_TOOLTIP_CHRO;Chromatizität-Histogramm ein/ausblenden. +HISTOGRAM_TOOLTIP_FULL;Skaliertes Histogramm ein/ausschalten. +HISTOGRAM_TOOLTIP_MODE;Schaltet zwischen linearer, logarithmischer-linearer und\nlogarithmischer-logarithmischer Skalierung um. +HISTOGRAM_TOOLTIP_G;Grün-Histogramm ein-/ausblenden. +HISTOGRAM_TOOLTIP_L;CIELab-Luminanz-Histogramm ein-/ausblenden. +HISTOGRAM_TOOLTIP_R;Rot-Histogramm ein-/ausblenden. HISTOGRAM_TOOLTIP_RAW;Zwischen normalen Histogrammen und\nRAW-Histogrammen umschalten. HISTORY_CHANGED;Geändert HISTORY_CUSTOMCURVE;Benutzerdefiniert @@ -917,12 +919,12 @@ MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigiert zum nächsten Miniaturbild in der\nDateive MAIN_BUTTON_NAVPREV_TOOLTIP;Navigiert zum vorherigen Miniaturbild in der\nDateiverwaltung oder Filmstreifen bezogen\nauf das ausgewählte Miniaturbild.\nTaste: F3\n\nNavigiert zum vorherigen Miniaturbild in der\nDateiverwaltung oder Filmstreifen bezogen\nauf auf das im Editor geöffnete Bild.\nTaste: Umschalt + F3 MAIN_BUTTON_NAVSYNC_TOOLTIP;Selektiert das Miniaturbild des aktuell geöffneten\nBildes in der Dateiverwaltung und des Filmstreifens.\nEs werden alle aktiven Filter gelöscht.\nTaste: x\n\nWie oben, jedoch ohne Löschung aktiver Filter. Das\nMiniaturbild des geöffneten Bildes wird nicht angezeigt,\nwenn es herausgefiltert wurde.\nTaste: y MAIN_BUTTON_PREFERENCES;Einstellungen -MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Bild zur Warteschlange hinzufügen\nTaste: Strg + b -MAIN_BUTTON_SAVE_TOOLTIP;Bild speichern\nTaste: Strg + s +MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Bild zur Warteschlange hinzufügen.\nTaste: Strg + b +MAIN_BUTTON_SAVE_TOOLTIP;Bild speichern.\nTaste: Strg + s\nProfil (.pp3) speichern.\nTaste: Strg + Umschalt + s MAIN_BUTTON_SENDTOEDITOR;Bild im externen Editor öffnen -MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Bild im externen Editor öffnen\nTaste: Strg + e -MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP;Alle seitlichen Bedienfelder ein-/ausblenden\nTaste: m -MAIN_BUTTON_UNFULLSCREEN;Vollbild beenden\nTaste: F11 +MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Bild im externen Editor öffnen.\nTaste: Strg + e +MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP;Alle seitlichen Bedienfelder ein-/ausblenden.\nTaste: m +MAIN_BUTTON_UNFULLSCREEN;Vollbild beenden.\nTaste: F11 MAIN_FRAME_BATCHQUEUE;Warteschlange MAIN_FRAME_BATCHQUEUE_TOOLTIP;Warteschlange\nTaste: Strg + F3 MAIN_FRAME_EDITOR;Editor @@ -969,26 +971,26 @@ MAIN_TAB_TRANSFORM;Transformieren MAIN_TAB_TRANSFORM_TOOLTIP;Taste: Alt + t MAIN_TAB_WAVELET;Wavelet MAIN_TAB_WAVELET_TOOLTIP;Taste: Alt + w -MAIN_TOOLTIP_BACKCOLOR0;Hintergrundfarbe der Vorschau basierend auf dem: Oberflächendesign\nTaste: 9 +MAIN_TOOLTIP_BACKCOLOR0;Hintergrundfarbe der Vorschau basierend auf dem Oberflächendesign.\nTaste: 9 MAIN_TOOLTIP_BACKCOLOR1;Hintergrundfarbe der Vorschau: Schwarz\nTaste: 9 MAIN_TOOLTIP_BACKCOLOR2;Hintergrundfarbe der Vorschau: Weiß\nTaste: 9 MAIN_TOOLTIP_BACKCOLOR3;Hintergrundfarbe der Vorschau: Mittleres Grau\nTaste: 9 MAIN_TOOLTIP_BEFOREAFTERLOCK;Vorher-Ansicht: Sperren / Entsperren\n\nGesperrt: Friert die Vorher-Ansicht ein, so\ndass sich die Gesamtwirkung mehrerer\nBearbeitungsschritte beurteilen lässt.\n\nEntsperrt: Die Vorher-Ansicht hinkt dem\naktuellen Bild immer einen Bearbeitungs-\nschritt hinterher. -MAIN_TOOLTIP_HIDEHP;Linkes Bedienfeld ein-/ausblenden\nTaste: l -MAIN_TOOLTIP_INDCLIPPEDH;Anzeige zu heller Bereiche ein-/ausschalten\nTaste: < -MAIN_TOOLTIP_INDCLIPPEDS;Anzeige zu dunkler Bereiche ein-/ausschalten\nTaste: > +MAIN_TOOLTIP_HIDEHP;Linkes Bedienfeld ein-/ausblenden.\nTaste: l +MAIN_TOOLTIP_INDCLIPPEDH;Anzeige zu heller Bereiche ein-/ausschalten.\nTaste: < +MAIN_TOOLTIP_INDCLIPPEDS;Anzeige zu dunkler Bereiche ein-/ausschalten.\nTaste: > MAIN_TOOLTIP_PREVIEWB;Vorschau Blau-Kanal\nTaste: b MAIN_TOOLTIP_PREVIEWFOCUSMASK;Vorschau Fokusmaske\nTaste: Umschalt + f\n\nPräziser bei Bildern mit geringer Tiefenschärfe,\nniedrigem Rauschen und bei hoher Vergrößerung. MAIN_TOOLTIP_PREVIEWG;Vorschau Grün-Kanal\nTaste: g MAIN_TOOLTIP_PREVIEWL;Vorschau Helligkeit\nTaste: v\n\n0.299·R + 0.587·G + 0.114·B MAIN_TOOLTIP_PREVIEWR;Vorschau Rot-Kanal\nTaste: r -MAIN_TOOLTIP_PREVIEWSHARPMASK;Schärfungs-Kontroll-Maske ein-/ausschalten\n\nFunktioniert nur bei aktivierter Schärfung\nund Zoom >= 100%. -MAIN_TOOLTIP_QINFO;Bildinformationen ein-/ausblenden\nTaste: i -MAIN_TOOLTIP_SHOWHIDELP1;Linkes Bedienfeld ein-/ausblenden\nTaste: l -MAIN_TOOLTIP_SHOWHIDERP1;Rechtes Bedienfeld ein-/ausblenden\nTaste: Alt + l -MAIN_TOOLTIP_SHOWHIDETP1;Oberes Bedienfeld ein-/ausblenden\nTaste: Umschalt + l +MAIN_TOOLTIP_PREVIEWSHARPMASK;Schärfungs-Kontroll-Maske ein-/ausschalten.\n\nFunktioniert nur bei aktivierter Schärfung\nund Zoom >= 100%. +MAIN_TOOLTIP_QINFO;Bildinformationen ein-/ausblenden.\nTaste: i +MAIN_TOOLTIP_SHOWHIDELP1;Linkes Bedienfeld ein-/ausblenden.\nTaste: l +MAIN_TOOLTIP_SHOWHIDERP1;Rechtes Bedienfeld ein-/ausblenden.\nTaste: Alt + l +MAIN_TOOLTIP_SHOWHIDETP1;Oberes Bedienfeld ein-/ausblenden.\nTaste: Umschalt + l MAIN_TOOLTIP_THRESHOLD;Schwelle -MAIN_TOOLTIP_TOGGLE;Vorher/Nachher-Ansicht ein-/ausschalten\nTaste: Umschalt + b +MAIN_TOOLTIP_TOGGLE;Vorher/Nachher-Ansicht ein-/ausschalten.\nTaste: Umschalt + b MONITOR_PROFILE_SYSTEM;Systemvorgabe NAVIGATOR_B;B: NAVIGATOR_G;G: @@ -1090,7 +1092,7 @@ PREFERENCES_AUTLISMAX;Max.-Durchschnitt aller Kacheln PREFERENCES_AUTLISSTD;Hoch PREFERENCES_AUTLISVLOW;Keine PREFERENCES_AUTLOW;Niedrig -PREFERENCES_AUTOMONPROFILE;Automatisch das für den aktuellen Monitor festgelegte Profil verwenden. +PREFERENCES_AUTOMONPROFILE;Automatisch das für den aktuellen Monitor festgelegte Profil verwenden PREFERENCES_AUTOSAVE_TP_OPEN;Werkzeugstatus vor dem Beenden automatisch speichern PREFERENCES_AUTSTD;Standard PREFERENCES_BATCH_PROCESSING;Stapelverarbeitung @@ -1224,7 +1226,7 @@ PREFERENCES_NAVGUIDEBRUSH;Farbe der Navigationshilfe PREFERENCES_NAVIGATIONFRAME;Navigation PREFERENCES_NOISE;Rauschreduzierung PREFERENCES_OUTDIR;Ausgabeverzeichnis -PREFERENCES_OUTDIRFOLDER;In dieses Verzeichnis speichern +PREFERENCES_OUTDIRFOLDER;In dieses Verzeichnis speichern. PREFERENCES_OUTDIRFOLDERHINT;Alle Dateien im ausgewählten Verzeichnis speichern. PREFERENCES_OUTDIRTEMPLATE;Dynamisches Verzeichnis verwenden PREFERENCES_OUTDIRTEMPLATEHINT;Die folgenden Variablen können verwendet werden:\n%f, %d1, %d2, ..., %p1, %p2, ..., %r, %s1, %s2, ...\n\nDiese Variablen beinhalten bestimmte Teile des Verzeichnispfades, in welchem sich das Bild befindet, oder Attribute des Bildes.\n\nWenn zum Beispiel /home/tom/photos/2010-10-31/dsc0042.nef geöffnet wurde, dann haben die Variablen den folgenden Inhalt:\n%d4 = home\n%d3 = tom\n%d2 = photos\n%d1 = 2010-10-31\n%f = dsc0042\n%p1 = /home/tom/photos/2010-10-31\n%p2 = /home/tom/photos\n%p3 = /home/tom\n%p4 = /home\n\nWenn Sie die Ausgabedatei in dasselbe Verzeichnis wie das Originalbild speichern wollen, dann wählen Sie:\n%p1/%f\n\nWenn Sie die Ausgabedatei in ein Unterverzeichnis mit dem Namen "converted" schreiben wollen, dann wählen Sie:\n%p1/converted/%f\n\nWenn Sie die Ausgabedatei im Verzeichnispfad "/home/tom/photos/converted" speichern wollen, dort jedoch in einem mit dem Namen des Ursprungsverzeichnisses betitelten Unterverzeichnis, dann wählen Sie:\n%p2/converted/%d1/%f\n\nDie Variable %r enthält die Bewertung des Bildes. @@ -1246,10 +1248,10 @@ PREFERENCES_PRINTER;Drucker (Soft-Proofing) PREFERENCES_PROFILEHANDLING;Behandlung der Bearbeitungsprofile PREFERENCES_PROFILELOADPR;Priorität der Profile beim Laden PREFERENCES_PROFILEPRCACHE;Bearbeitungsprofil im Festplatten-Cache -PREFERENCES_PROFILEPRFILE;Bearbeitungsprofil, welches geladener Datei beiliegt (Sidecar) -PREFERENCES_PROFILESAVEBOTH;Verarbeitungsparameter im Festplatten-Cache und zusammen mit der Datei speichern +PREFERENCES_PROFILEPRFILE;Bearbeitungsprofil welches dem geladenen Bild beiliegt (Sidecar) +PREFERENCES_PROFILESAVEBOTH;Verarbeitungsparameter im Festplatten-Cache und zusammen mit dem Bild speichern PREFERENCES_PROFILESAVECACHE;Verarbeitungsparameter im Festplatten-Cache speichern -PREFERENCES_PROFILESAVEINPUT;Verarbeitungsparameter zusammen mit Datei speichern (Sidecar) +PREFERENCES_PROFILESAVEINPUT;Verarbeitungsparameter zusammen mit dem Bild speichern (Sidecar) PREFERENCES_PROFILESAVELOCATION;Speicherort der Profile PREFERENCES_PROFILE_NONE;Kein Farbprofil PREFERENCES_PROPERTY;Eigenschaft @@ -1325,10 +1327,10 @@ PROFILEPANEL_PINTERNAL;Neutral PROFILEPANEL_PLASTSAVED;Zuletzt gespeichert PROFILEPANEL_SAVEDLGLABEL;Bearbeitungsprofil speichern... PROFILEPANEL_SAVEPPASTE;Zu speichernde Parameter -PROFILEPANEL_TOOLTIPCOPY;Profil in Zwischenablage kopieren\n\nStrg-Taste beim Klicken festhalten, um\nzu kopierende Parameter auszuwählen. -PROFILEPANEL_TOOLTIPLOAD;Profil aus Datei laden\n\nStrg-Taste beim Klicken festhalten, um\nzu ladende Parameter auszuwählen. -PROFILEPANEL_TOOLTIPPASTE;Profil aus Zwischenablage einfügen\n\nStrg-Taste beim Klicken festhalten, um\neinzufügende Parameter auszuwählen. -PROFILEPANEL_TOOLTIPSAVE;Profil speichern\n\nStrg-Taste beim Klicken festhalten, um\nzu speichernde Parameter auszuwählen. +PROFILEPANEL_TOOLTIPCOPY;Profil in Zwischenablage kopieren.\n\nStrg-Taste beim Klicken festhalten, um\nzu kopierende Parameter auszuwählen. +PROFILEPANEL_TOOLTIPLOAD;Profil aus Datei laden.\n\nStrg-Taste beim Klicken festhalten, um\nzu ladende Parameter auszuwählen. +PROFILEPANEL_TOOLTIPPASTE;Profil aus Zwischenablage einfügen.\n\nStrg-Taste beim Klicken festhalten, um\neinzufügende Parameter auszuwählen. +PROFILEPANEL_TOOLTIPSAVE;Profil speichern.\n\nStrg-Taste beim Klicken festhalten, um\nzu speichernde Parameter auszuwählen. PROGRESSBAR_LOADING;Lade Bild... PROGRESSBAR_LOADINGTHUMBS;Lade Miniaturbilder... PROGRESSBAR_LOADJPEG;Lade JPEG... @@ -1384,17 +1386,17 @@ THRESHOLDSELECTOR_T;Oben THRESHOLDSELECTOR_TL;Oben-Links THRESHOLDSELECTOR_TR;Oben-Rechts TOOLBAR_TOOLTIP_COLORPICKER;Farbwähler\n\nWenn eingeschaltet:\n- Mit der linken Maustaste können Sie einen Farbwähler setzen.\n- Zum Verschieben, linke Maustaste festhalten.\n- Umschalttaste + Rechts-Klick entfernt alle Farbwähler.\n- Rechts-Klick auf den Farbwählerbutton blendet die Farbwähler ein/aus\n- Rechts-Klick in einen freien Bereich schaltet auf das Hand-Werkzeug zurück. -TOOLBAR_TOOLTIP_CROP;Ausschnitt wählen\nTaste: c\n\nZum Verschieben des Ausschnitts,\nUmschalttaste festhalten. +TOOLBAR_TOOLTIP_CROP;Ausschnitt wählen.\nTaste: c\n\nZum Verschieben des Ausschnitts,\nUmschalttaste festhalten. TOOLBAR_TOOLTIP_HAND;Hand-Werkzeug\nTaste: h TOOLBAR_TOOLTIP_STRAIGHTEN;Ausrichten / Drehen\nTaste: s\n\nRichtet das Bild entlang einer Leitlinie aus. -TOOLBAR_TOOLTIP_WB;Weißabgleich manuell setzen\nTaste: w +TOOLBAR_TOOLTIP_WB;Weißabgleich manuell setzen.\nTaste: w TP_BWMIX_ALGO;OYCPM-Algorithmus TP_BWMIX_ALGO_LI;Linear TP_BWMIX_ALGO_SP;Spezialeffekte -TP_BWMIX_ALGO_TOOLTIP;Linear liefert ein lineares Ergebnis\nSpezialeffekte liefert einen speziellen Effekt durch Mischen von Kanälen. +TP_BWMIX_ALGO_TOOLTIP;Linear liefert ein lineares Ergebnis.\nSpezialeffekte liefert einen speziellen Effekt durch Mischen von Kanälen. TP_BWMIX_AUTOCH;Auto TP_BWMIX_CC_ENABLED;Komplemantärfarbe anpassen -TP_BWMIX_CC_TOOLTIP;Aktiviert die automatische Anpassung der\nKomplementärfarbe im ROYGCBPM-Modus +TP_BWMIX_CC_TOOLTIP;Aktiviert die automatische Anpassung der\nKomplementärfarbe im ROYGCBPM-Modus. TP_BWMIX_CHANNEL;Luminanzequalizer TP_BWMIX_CURVEEDITOR1;“Bevor“-Kurve TP_BWMIX_CURVEEDITOR2;“Danach“-Kurve @@ -1458,36 +1460,36 @@ TP_CHMIXER_GREEN;Grün-Kanal TP_CHMIXER_LABEL;RGB-Kanalmixer TP_CHMIXER_RED;Rot-Kanal TP_CHROMATABERR_LABEL;Chromatische Aberration -TP_COARSETRAF_TOOLTIP_HFLIP;Horizontal spiegeln -TP_COARSETRAF_TOOLTIP_ROTLEFT;Nach links drehen\nTaste: [ -TP_COARSETRAF_TOOLTIP_ROTRIGHT;Nach rechts drehen\nTaste: ] -TP_COARSETRAF_TOOLTIP_VFLIP;Vertikal spiegeln +TP_COARSETRAF_TOOLTIP_HFLIP;Horizontal spiegeln. +TP_COARSETRAF_TOOLTIP_ROTLEFT;Nach links drehen.\nTaste: [ +TP_COARSETRAF_TOOLTIP_ROTRIGHT;Nach rechts drehen.\nTaste: ] +TP_COARSETRAF_TOOLTIP_VFLIP;Vertikal spiegeln. TP_COLORAPP_ADAPTSCENE;Luminanz (cd/m²) -TP_COLORAPP_ADAPTSCENE_TOOLTIP;Absolute Luminanz der Szenenleuchstärket\n(normalerweise 2000cd/m²) +TP_COLORAPP_ADAPTSCENE_TOOLTIP;Absolute Luminanz der Szenenleuchstärket\n(normalerweise 2000cd/m²). TP_COLORAPP_ADAPTVIEWING;Luminanz (cd/m²) -TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Absolute Luminanz der Betrachtungsumgebung\n(normalerweise 16cd/m²) +TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Absolute Luminanz der Betrachtungsumgebung\n(normalerweise 16cd/m²). TP_COLORAPP_ADAP_AUTO_TOOLTIP;Wenn aktiviert (empfohlen), werden die optimalen\nWerte aus den Exif-Daten automatisch berechnet. TP_COLORAPP_ALGO;Algorithmus TP_COLORAPP_ALGO_ALL;Alle TP_COLORAPP_ALGO_JC;Helligkeit + Buntheit (JH) TP_COLORAPP_ALGO_JS;Helligkeit + Sättigung (JS) TP_COLORAPP_ALGO_QM;Helligkeit + Farbigkeit (QM) -TP_COLORAPP_ALGO_TOOLTIP;Auswahl zwischen Parameter-Teilmengen\nund allen Parametern +TP_COLORAPP_ALGO_TOOLTIP;Auswahl zwischen Parameter-Teilmengen\nund allen Parametern. TP_COLORAPP_BADPIXSL;Hot / Bad-Pixelfilter TP_COLORAPP_BADPIXSL_TOOLTIP;Unterdrückt “Hot / Bad“-Pixel\n\n0 = keine Auswirkung\n1 = Mittel\n2 = Gaussian TP_COLORAPP_BRIGHT;Helligkeit (Q) -TP_COLORAPP_BRIGHT_TOOLTIP;Helligkeit in CIECAM02 berücksichtigt die Weißintensität und unterscheidet sich von L*a*b* und RGB-Helligkeit +TP_COLORAPP_BRIGHT_TOOLTIP;Helligkeit in CIECAM02 berücksichtigt die Weißintensität und unterscheidet sich von L*a*b* und RGB-Helligkeit. TP_COLORAPP_CHROMA;Buntheit (H) TP_COLORAPP_CHROMA_M;Farbigkeit (M) -TP_COLORAPP_CHROMA_M_TOOLTIP;Die Farbigkeit in CIECAM02 unterscheidet sich\nvon L*a*b*- und RGB-Farbigkeit +TP_COLORAPP_CHROMA_M_TOOLTIP;Die Farbigkeit in CIECAM02 unterscheidet sich\nvon L*a*b*- und RGB-Farbigkeit. TP_COLORAPP_CHROMA_S;Sättigung (S) -TP_COLORAPP_CHROMA_S_TOOLTIP;Sättigung in CIECAM02 unterscheidet sich\nvon L*a*b* und RGB Sättigung -TP_COLORAPP_CHROMA_TOOLTIP;Buntheit in CIECAM02 unterscheidet sich\nvon L*a*b* und RGB-Buntheit +TP_COLORAPP_CHROMA_S_TOOLTIP;Sättigung in CIECAM02 unterscheidet sich\nvon L*a*b* und RGB Sättigung. +TP_COLORAPP_CHROMA_TOOLTIP;Buntheit in CIECAM02 unterscheidet sich\nvon L*a*b* und RGB-Buntheit. TP_COLORAPP_CIECAT_DEGREE;CAT02 Adaptation TP_COLORAPP_CONTRAST;Kontrast (J) TP_COLORAPP_CONTRAST_Q;Kontrast (Q) -TP_COLORAPP_CONTRAST_Q_TOOLTIP;Kontrast (Q) in CIECAM02 unterscheidet sich\nvom L*a*b*- und RGB-Kontrast -TP_COLORAPP_CONTRAST_TOOLTIP;Kontrast (J) in CIECAM02 unterscheidet sich\nvom L*a*b*- und RGB-Kontrast +TP_COLORAPP_CONTRAST_Q_TOOLTIP;Kontrast (Q) in CIECAM02 unterscheidet sich\nvom L*a*b*- und RGB-Kontrast. +TP_COLORAPP_CONTRAST_TOOLTIP;Kontrast (J) in CIECAM02 unterscheidet sich\nvom L*a*b*- und RGB-Kontrast. TP_COLORAPP_CURVEEDITOR1;Tonwertkurve 1 TP_COLORAPP_CURVEEDITOR1_TOOLTIP;Zeigt das Histogramm von L (L*a*b*) vor CIECAM02.\nWenn "CIECAM02-Ausgabe-Histogramm in Kurven anzeigen" aktiviert ist, wird das Histogramm von J oder Q nach CIECAM02-Anpassungen angezeigt.\n\nJ und Q werden nicht im Haupt-Histogramm angezeigt.\nFür die endgültige Ausgabe verwenden Sie das Haupt-Histogramm. TP_COLORAPP_CURVEEDITOR2;Tonwertkurve 2 @@ -1497,18 +1499,18 @@ TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Korrigiert Buntheit, Sättigung oder Farbigkeit TP_COLORAPP_DATACIE;CIECAM02-Ausgabe-Histogramm in\nKurven anzeigen TP_COLORAPP_DATACIE_TOOLTIP;Wenn aktiviert, zeigen die Histogramme\nder CIECAM02-Kurven die angenäherten\nWerte/Bereiche für J oder Q und C, S oder M\nNACH den CIECAM02-Anpassungen an. Das\nbetrifft nicht das Haupt-Histogramm.\n\nWenn deaktiviert, zeigen die Histogramme\nder CIECAM02-Kurven die L*a*b*-Werte\nVOR den CIECAM02-Anpassungen an. TP_COLORAPP_DEGREE_AUTO_TOOLTIP;Wenn aktiviert (empfohlen), wird ein optimaler\nWert berechnet, der von CAT02 und CIECAM02\nverwendet wird.\nUm den Wert manuell zu setzen, muss die Option\ndeaktiviert sein (Werte über 64 sind empfohlen). -TP_COLORAPP_DEGREE_TOOLTIP;Umfang der “CIE Chromatic Adaptation Transform 2002“ +TP_COLORAPP_DEGREE_TOOLTIP;Umfang der “CIE Chromatic Adaptation Transform 2002“. TP_COLORAPP_FREE;Farbtemperatur + Tönung + CAT02 + [Ausgabe] TP_COLORAPP_GAMUT;Gamutkontrolle (L*a*b*) TP_COLORAPP_GAMUT_TOOLTIP;Gamutkontrolle im L*a*b*-Modus erlauben. TP_COLORAPP_HUE;Farbton (H) -TP_COLORAPP_HUE_TOOLTIP;Farbton (H) - Winkel zwischen 0° und 360° +TP_COLORAPP_HUE_TOOLTIP;Farbton (H) - Winkel zwischen 0° und 360°. TP_COLORAPP_LABEL;CIE Color Appearance Model 2002 TP_COLORAPP_LABEL_CAM02;Bildanpassungen TP_COLORAPP_LABEL_SCENE;Umgebungsbedingungen (Szene) TP_COLORAPP_LABEL_VIEWING;Betrachtungsbedingungen TP_COLORAPP_LIGHT;Helligkeit (J) -TP_COLORAPP_LIGHT_TOOLTIP;Helligkeit in CIECAM02 unterscheidet sich\nvon L*a*b* und RGB Helligkeit +TP_COLORAPP_LIGHT_TOOLTIP;Helligkeit in CIECAM02 unterscheidet sich\nvon L*a*b* und RGB Helligkeit. TP_COLORAPP_MODEL;Weißpunktmodell TP_COLORAPP_MODEL_TOOLTIP;Weißabgleich [RT] + [Ausgabe]:\nRT's Weißabgleich wird für die Szene verwendet,\nCIECAM02 auf D50 gesetzt und der Weißabgleich\ndes Ausgabegerätes kann unter:\nEinstellungen > Farb-Management\neingestellt werden.\n\nWeißabgleich [RT+CAT02] + [Ausgabe]:\nRT's Weißabgleich wird für CAT02 verwendet und\nder Weißabgleich des Ausgabegerätes kann unter\nEinstellungen > Farb-Management\neingestellt werden. TP_COLORAPP_NEUTRAL;Zurücksetzen @@ -1547,7 +1549,7 @@ TP_COLORTONING_BALANCE;Farbausgleich TP_COLORTONING_BY;o C/L TP_COLORTONING_CHROMAC;Deckkraft TP_COLORTONING_COLOR;Farbe -TP_COLORTONING_CURVEEDITOR_CL_TOOLTIP;Buntheitsdeckkraft als Funktion der Luminanz oB = f(L) +TP_COLORTONING_CURVEEDITOR_CL_TOOLTIP;Buntheitsdeckkraft als Funktion der Luminanz oB = f(L). TP_COLORTONING_HIGHLIGHT;Lichter TP_COLORTONING_HUE;Farbton TP_COLORTONING_LAB;L*a*b*-Überlagerung @@ -1577,7 +1579,7 @@ TP_COLORTONING_STRENGTH;Intensität TP_COLORTONING_TWO2;Spezial-Farbe (2 Farben) TP_COLORTONING_TWOALL;Spezial-Farbe TP_COLORTONING_TWOBY;Spezial a* und b* -TP_COLORTONING_TWOCOLOR_TOOLTIP;Standardfarbe:\nLinearer Verlauf, a* = b*.\n\nSpezial-Farbe:\nLinearer Verlauf, a* = b*, aber nicht verbunden\n\nSpezial a* und b*:\nLinearer Verlauf, nicht verbunden, mit unterschiedlichen\nKurven für a* und b*. Bevorzugt für spezielle Effekte.\n\nSpezial-Farbe (2 Farben):\nBesser vorhersehbar +TP_COLORTONING_TWOCOLOR_TOOLTIP;Standardfarbe:\nLinearer Verlauf, a* = b*.\n\nSpezial-Farbe:\nLinearer Verlauf, a* = b*, aber nicht verbunden\n\nSpezial a* und b*:\nLinearer Verlauf, nicht verbunden, mit unterschiedlichen\nKurven für a* und b*. Bevorzugt für spezielle Effekte.\n\nSpezial-Farbe (2 Farben):\nBesser vorhersehbar. TP_COLORTONING_TWOSTD;Standardfarbe TP_CROP_FIXRATIO;Format TP_CROP_GTDIAGONALS;Diagonalregel @@ -1593,7 +1595,7 @@ TP_CROP_GUIDETYPE;Hilfslinien: TP_CROP_H;Höhe TP_CROP_LABEL;Ausschnitt TP_CROP_PPI;PPI= -TP_CROP_SELECTCROP;Ausschnitt wählen +TP_CROP_SELECTCROP;Ausschnitt wählen. TP_CROP_W;Breite TP_CROP_X;x TP_CROP_Y;y @@ -1705,8 +1707,8 @@ TP_EXPOSURE_HISTMATCHING_TOOLTIP;Passt Regler und Kurven (mit Ausnahme der Belic TP_EXPOSURE_LABEL;Belichtung TP_EXPOSURE_SATURATION;Sättigung TP_EXPOSURE_TCMODE_FILMLIKE;Filmähnlich -TP_EXPOSURE_TCMODE_LABEL1;Tonwertkurve 1 Modus -TP_EXPOSURE_TCMODE_LABEL2;Tonwertkurve 2 Modus +TP_EXPOSURE_TCMODE_LABEL1;Tonwertkurve 1: Modus +TP_EXPOSURE_TCMODE_LABEL2;Tonwertkurve 2: Modus TP_EXPOSURE_TCMODE_LUMINANCE;Luminanz TP_EXPOSURE_TCMODE_PERCEPTUAL;Wahrnehmungsabhängig TP_EXPOSURE_TCMODE_SATANDVALBLENDING;Sättigung und Überlagerung @@ -1739,12 +1741,12 @@ TP_GRADIENT_CENTER_X_TOOLTIP;Ankerpunkt der Rotationsachse X:\n-100 = linker Bil TP_GRADIENT_CENTER_Y;Rotationsachse Y TP_GRADIENT_CENTER_Y_TOOLTIP;Ankerpunkt der Rotationsachse Y:\n-100 = oberer Bildrand\n0 = Bildmitte\n+100 = unterer Bildrand TP_GRADIENT_DEGREE;Rotationswinkel -TP_GRADIENT_DEGREE_TOOLTIP;Rotationswinkel in Grad +TP_GRADIENT_DEGREE_TOOLTIP;Rotationswinkel in Grad. TP_GRADIENT_FEATHER;Bereich -TP_GRADIENT_FEATHER_TOOLTIP;Bereich des Verlaufs in Prozent der Bilddiagonalen +TP_GRADIENT_FEATHER_TOOLTIP;Bereich des Verlaufs in Prozent der Bilddiagonalen. TP_GRADIENT_LABEL;Grauverlaufsfilter TP_GRADIENT_STRENGTH;Intensität -TP_GRADIENT_STRENGTH_TOOLTIP;Filterstärke in Blendenstufen +TP_GRADIENT_STRENGTH_TOOLTIP;Filterstärke in Blendenstufen. TP_HLREC_BLEND;Überlagerung TP_HLREC_CIELAB;CIELab-Überlagerung TP_HLREC_COLOR;Farbübertragung @@ -1771,15 +1773,15 @@ TP_ICM_DCPILLUMINANT_INTERPOLATED;Interpoliert TP_ICM_DCPILLUMINANT_TOOLTIP;DCP-Illumination auswählen. Vorgabe ist\nInterpoliert. Die Einstellung ist nur verfügbar\nwenn sie vom Eingangsfarbprofil unterstützt\nwird. TP_ICM_INPUTCAMERA;Kamera-Standard TP_ICM_INPUTCAMERAICC;Kameraspezifisches Profil -TP_ICM_INPUTCAMERAICC_TOOLTIP;Verwendet RawTherapees kameraspezifisches\nDCP/ICC-Eingangsfarbprofil, welches präziser als\neine einfache Matrix ist +TP_ICM_INPUTCAMERAICC_TOOLTIP;Verwendet RawTherapees kameraspezifisches\nDCP/ICC-Eingangsfarbprofil, welches präziser als\neine einfache Matrix ist. TP_ICM_INPUTCAMERA_TOOLTIP;Benutzt eine einfache Farbmatrix von DCRAW,\neine erweiterte RawTherapee-Version oder eine\naus einem DNG. TP_ICM_INPUTCUSTOM;DCP/ICC-Profil -TP_ICM_INPUTCUSTOM_TOOLTIP;Eigenes DCP/ICC-Farbprofil verwenden +TP_ICM_INPUTCUSTOM_TOOLTIP;Eigenes DCP/ICC-Farbprofil verwenden. TP_ICM_INPUTDLGLABEL;DCP/ICC-Profil wählen... TP_ICM_INPUTEMBEDDED;Eingebettetes Profil verwenden -TP_ICM_INPUTEMBEDDED_TOOLTIP;Farbprofil verwenden, das in Nicht-RAW-Bildern\neingebettet ist +TP_ICM_INPUTEMBEDDED_TOOLTIP;Farbprofil verwenden, das in Nicht-RAW-Bildern\neingebettet ist. TP_ICM_INPUTNONE;Kein Profil -TP_ICM_INPUTNONE_TOOLTIP;Kein Eingangsfarbprofil verwenden +TP_ICM_INPUTNONE_TOOLTIP;Kein Eingangsfarbprofil verwenden. TP_ICM_INPUTPROFILE;Eingangsfarbprofil TP_ICM_LABEL;Farbmanagement TP_ICM_NOICM;Kein ICM: sRGB-Ausgabe @@ -1854,24 +1856,24 @@ TP_METADATA_MODE;Kopiermodus TP_METADATA_STRIP;Keine TP_METADATA_TUNNEL;Unveränderte Daten TP_NEUTRAL;Zurücksetzen -TP_NEUTRAL_TIP;Belichtungseinstellungen auf\nneutrale Werte zurücksetzen +TP_NEUTRAL_TIP;Belichtungseinstellungen auf\nneutrale Werte zurücksetzen. TP_PCVIGNETTE_FEATHER;Bereich TP_PCVIGNETTE_FEATHER_TOOLTIP;Bereich:\n0 = nur Bildecken\n50 = halbe Strecke zum Mittelpunkt\n100 = bis zum Mittelpunkt TP_PCVIGNETTE_LABEL;Vignettierungsfilter TP_PCVIGNETTE_ROUNDNESS;Form TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Form:\n0 = Rechteck\n50 = Ellipse\n100 = Kreis TP_PCVIGNETTE_STRENGTH;Intensität -TP_PCVIGNETTE_STRENGTH_TOOLTIP;Filterstärke in Blendenstufen (bezogen auf die Bildecken) +TP_PCVIGNETTE_STRENGTH_TOOLTIP;Filterstärke in Blendenstufen (bezogen auf die Bildecken). TP_PERSPECTIVE_HORIZONTAL;Horizontal TP_PERSPECTIVE_LABEL;Perspektive TP_PERSPECTIVE_VERTICAL;Vertikal TP_PFCURVE_CURVEEDITOR_CH;Farbton TP_PFCURVE_CURVEEDITOR_CH_TOOLTIP;Regelt die Intensität der Farbsaumentfernung\nnach Farben. Je höher die Kurve desto stärker\nist der Effekt. TP_PREPROCESS_DEADPIXFILT;Dead-Pixel-Filter -TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Entfernt tote Pixel +TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Entfernt tote Pixel. TP_PREPROCESS_GREENEQUIL;Grün-Ausgleich TP_PREPROCESS_HOTPIXFILT;Hot-Pixel-Filter -TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Entfernt Hot-Pixel +TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Entfernt Hot-Pixel. TP_PREPROCESS_LABEL;Vorverarbeitung TP_PREPROCESS_LINEDENOISE;Zeilenrauschfilter TP_PREPROCESS_LINEDENOISE_DIRECTION;Richtung @@ -1945,7 +1947,7 @@ TP_RAW_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Gleicht die Helligkeit der Frames an den ak TP_RAW_PIXELSHIFTEXP0;Experimentell TP_RAW_PIXELSHIFTGREEN;Bewegung im Grün-Kanal erkennen TP_RAW_PIXELSHIFTHOLEFILL;Lücken in der Bewegungsmaske erkennen -TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Lücken in der Bewegungsmaske erkennen +TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Lücken in der Bewegungsmaske erkennen. TP_RAW_PIXELSHIFTLMMSE;LMMSE für Bewegungsbereiche verwenden TP_RAW_PIXELSHIFTLMMSE_TOOLTIP;LMMSE anstatt AMaZE für bewegte Bildbereiche verwenden.\nSinnvoll bei High-ISO-Aufnahmen. TP_RAW_PIXELSHIFTMASKTHRESHOLD;3x3 new threshold @@ -2053,7 +2055,7 @@ TP_RETINEX_MEDIAN;Medianfilter TP_RETINEX_METHOD;Methode TP_RETINEX_METHOD_TOOLTIP;Schatten wirkt sich auf dunkle Bereiche aus.\n\nSchatten / Lichter wirkt sich auf dunkle und helle Bereiche aus.\n\nLichter wirkt sich auf helle Bereiche aus.\n\nSpitzlichter wirkt sich auf sehr helle Bereiche aus und reduziert\nMagenta-Falschfarben. TP_RETINEX_MLABEL;Schleierred: Min = %1, Max = %2 -TP_RETINEX_MLABEL_TOOLTIP;Sollte nahe bei Min = 0 und Max = 32768 sein +TP_RETINEX_MLABEL_TOOLTIP;Sollte nahe bei Min = 0 und Max = 32768 sein. TP_RETINEX_NEIGHBOR;Radius TP_RETINEX_NEUTRAL;Zurücksetzen TP_RETINEX_NEUTRAL_TIP;Setzt alle Regler und Kurven\nauf ihre Standardwerte zurück. @@ -2091,7 +2093,7 @@ TP_RGBCURVES_LUMAMODE_TOOLTIP;Der Helligkeitsmodus ändert die Helligkeit TP_RGBCURVES_RED;R TP_ROTATE_DEGREE;Winkel TP_ROTATE_LABEL;Drehen -TP_ROTATE_SELECTLINE;Leitlinie wählen +TP_ROTATE_SELECTLINE;Leitlinie wählen. TP_SAVEDIALOG_OK_TIP;Taste: Strg + Enter TP_SHADOWSHLIGHTS_HIGHLIGHTS;Lichter TP_SHADOWSHLIGHTS_HLTONALW;Tonwertbreite Lichter @@ -2139,7 +2141,7 @@ TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE1;Rot / Violett TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE2;Rot TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE3;Rot / Gelb TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE4;Gelb -TP_VIBRANCE_CURVEEDITOR_SKINTONES_TOOLTIP;Farbton als Funktion des Farbtons H = f(H) +TP_VIBRANCE_CURVEEDITOR_SKINTONES_TOOLTIP;Farbton als Funktion des Farbtons H = f(H). TP_VIBRANCE_LABEL;Dynamik TP_VIBRANCE_PASTELS;Pastelltöne TP_VIBRANCE_PASTSATTOG;Pastell und gesättigte Töne koppeln @@ -2189,7 +2191,7 @@ TP_WAVELET_CHCU;Kurve TP_WAVELET_CHR;Farb-Kontrast-Verknüpfung TP_WAVELET_CHRO;Ebenengrenze Gesättigte/Pastellfarben TP_WAVELET_CHRO_TOOLTIP;Waveletebene (n) die, die Grenze zwischen gesättigten und Pastellfarben bestimmt.\n1-n: Gesättigte Farben\nn-9: Pastellfarben\n\nIst der Wert größer als die vorgegebene Anzahl an Waveletebenen werden diese ignoriert. -TP_WAVELET_CHR_TOOLTIP;Farbton als Funktion des Kontrasts und der Farb-Kontrast-Verknüpfung +TP_WAVELET_CHR_TOOLTIP;Farbton als Funktion des Kontrasts und der Farb-Kontrast-Verknüpfung. TP_WAVELET_CHSL;Regler TP_WAVELET_CHTYPE;Chrominanzmethode TP_WAVELET_COLORT;Deckkraft Rot / Grün @@ -2202,15 +2204,15 @@ TP_WAVELET_CONTR;Gamut TP_WAVELET_CONTRA;Kontrast TP_WAVELET_CONTRAST_MINUS;Kontrast - TP_WAVELET_CONTRAST_PLUS;Kontrast + -TP_WAVELET_CONTRA_TOOLTIP;Ändert den Kontrast des Restbildes +TP_WAVELET_CONTRA_TOOLTIP;Ändert den Kontrast des Restbildes. TP_WAVELET_CTYPE;Chrominanzkontrolle TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Lokaler Kontrast als Funktion des ursprünglichen Kontrasts.\n\nNiedrige Werte: Wenig lokaler Kontrast (Werte zwischen 10 - 20)\n50%: Durchschnittlicher lokaler Kontrast (Werte zwischen 100 - 300)\n66%: Standardabweichung des Lokalen Kontrasts (Werte zwischen 300 - 800)\n100%: Maximaler lokaler Kontrast (Werte zwischen 3000 - 8000)\n TP_WAVELET_CURVEEDITOR_CH;Kontrast = f(H) TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Kontrast als Funktion des Farbtons.\nAchten Sie darauf, dass Sie die Werte beim\nGamut-Farbton nicht überschreiben\n\nDie Kurve hat nur Auswirkung, wenn die Wavelet-\nKontrastregler nicht auf “0“ stehen. TP_WAVELET_CURVEEDITOR_CL;L -TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Wendet eine Kontrasthelligkeitskurve\nam Ende der Waveletverarbeitung an.\n +TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Wendet eine Kontrasthelligkeitskurve\nam Ende der Waveletverarbeitung an. TP_WAVELET_CURVEEDITOR_HH;HH -TP_WAVELET_CURVEEDITOR_HH_TOOLTIP;Farbton als Funktion des Farbtons H = f(H) +TP_WAVELET_CURVEEDITOR_HH_TOOLTIP;Farbton als Funktion des Farbtons H = f(H). TP_WAVELET_DALL;Alle Richtungen TP_WAVELET_DAUB;Kantenperformance TP_WAVELET_DAUB2;D2 - niedrig @@ -2285,7 +2287,7 @@ TP_WAVELET_NPTYPE_TOOLTIP;Dieser Algorithmus verwendet ein Pixel und acht\nseine TP_WAVELET_OPACITY;Deckkraft Blau / Gelb TP_WAVELET_OPACITYW;Kontrastausgleichskurve TP_WAVELET_OPACITYWL;Lokale Kontrastkurve -TP_WAVELET_OPACITYWL_TOOLTIP;Wendet eine lokale Kontrastkurve am\nEnde der Wavelet-Verarbeitung an.\n\nLinks stellt den niedrigsten, rechts den\nhöchsten Kontrast dar.\n +TP_WAVELET_OPACITYWL_TOOLTIP;Wendet eine lokale Kontrastkurve am\nEnde der Wavelet-Verarbeitung an.\n\nLinks stellt den niedrigsten, rechts den\nhöchsten Kontrast dar. TP_WAVELET_PASTEL;Pastellfarben TP_WAVELET_PROC;Verarbeitung TP_WAVELET_RE1;Schärfung verstärken @@ -2374,4 +2376,3 @@ ZOOMPANEL_ZOOMFITCROPSCREEN;Ausschnitt an Bildschirm anpassen\nTaste: f ZOOMPANEL_ZOOMFITSCREEN;An Bildschirm anpassen\nTaste: Alt + f ZOOMPANEL_ZOOMIN;Hineinzoomen\nTaste: + ZOOMPANEL_ZOOMOUT;Herauszoomen\nTaste: - - diff --git a/rtdata/languages/default b/rtdata/languages/default index ba5850675..76fd4480f 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -851,7 +851,7 @@ MAIN_BUTTON_NAVPREV_TOOLTIP;Navigate to the previous image relative to image ope MAIN_BUTTON_NAVSYNC_TOOLTIP;Synchronize the File Browser or Filmstrip with the Editor to reveal the thumbnail of the currently opened image, and clear any active filters.\nShortcut: x\n\nAs above, but without clearing active filters:\nShortcut: y\n(Note that the thumbnail of the opened image will not be shown if filtered out). MAIN_BUTTON_PREFERENCES;Preferences MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Put current image to processing queue.\nShortcut: Ctrl+b -MAIN_BUTTON_SAVE_TOOLTIP;Save current image.\nShortcut: Ctrl+s +MAIN_BUTTON_SAVE_TOOLTIP;Save current image.\nShortcut: Ctrl+s\nSave current profile (.pp3).\nShortcut: Ctrl+Shift+s MAIN_BUTTON_SENDTOEDITOR;Edit image in external editor MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Edit current image in external editor.\nShortcut: Ctrl+e MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP;Show/hide all side panels.\nShortcut: m diff --git a/rtengine/CMakeLists.txt b/rtengine/CMakeLists.txt index 74497d7d0..3cbfed183 100644 --- a/rtengine/CMakeLists.txt +++ b/rtengine/CMakeLists.txt @@ -55,6 +55,7 @@ set(RTENGINESOURCEFILES dirpyr_equalizer.cc dual_demosaic_RT.cc dynamicprofile.cc + eahd_demosaic.cc expo_before_b.cc fast_demo.cc ffmanager.cc diff --git a/rtengine/color.h b/rtengine/color.h index 33c170a69..1e6eef578 100644 --- a/rtengine/color.h +++ b/rtengine/color.h @@ -20,11 +20,13 @@ #pragma once #include +#include #include "rt_math.h" #include "LUT.h" #include "labimage.h" #include "iccmatrices.h" +#include "lcms2.h" #include "sleef.c" #define SAT(a,b,c) ((float)max(a,b,c)-(float)min(a,b,c))/(float)max(a,b,c) diff --git a/rtengine/curves.h b/rtengine/curves.h index 98934f13a..a9f4b4ace 100644 --- a/rtengine/curves.h +++ b/rtengine/curves.h @@ -444,6 +444,7 @@ protected: DiagonalCurveType kind; void spline_cubic_set (); + void catmull_rom_set(); void NURBS_set (); public: diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index b76484df5..da66bd6d8 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -30,7 +30,7 @@ /* dcraw.c -- Dave Coffin's raw photo decoder - Copyright 1997-2016 by Dave Coffin, dcoffin a cybercom o net + Copyright 1997-2018 by Dave Coffin, dcoffin a cybercom o net This is a command-line ANSI C program to convert raw photos from any digital camera on any computer running any operating system. @@ -49,11 +49,11 @@ *If you have not modified dcraw.c in any way, a link to my homepage qualifies as "full source code". - $Revision: 1.477 $ - $Date: 2016/05/10 21:30:43 $ + $Revision: 1.478 $ + $Date: 2018/06/01 20:36:25 $ */ -#define DCRAW_VERSION "9.27" +#define DCRAW_VERSION "9.28" #ifndef _GNU_SOURCE #define _GNU_SOURCE @@ -2432,10 +2432,10 @@ void CLASS packed_load_raw() UINT64 bitbuf=0; bwide = raw_width * tiff_bps / 8; - bwide += bwide & load_flags >> 7; + bwide += bwide & load_flags >> 9; rbits = bwide * 8 - raw_width * tiff_bps; if (load_flags & 1) bwide = bwide * 16 / 15; - bite = 8 + (load_flags & 24); + bite = 8 + (load_flags & 56); half = (raw_height+1) >> 1; for (irow=0; irow < raw_height; irow++) { row = irow; @@ -2453,10 +2453,10 @@ void CLASS packed_load_raw() for (vbits -= tiff_bps; vbits < 0; vbits += bite) { bitbuf <<= bite; for (i=0; i < bite; i+=8) - bitbuf |= (unsigned) (fgetc(ifp) << i); + bitbuf |= ((UINT64) fgetc(ifp) << i); } val = bitbuf << (64-tiff_bps-vbits) >> (64-tiff_bps); - RAW(row,col ^ (load_flags >> 6 & 1)) = val; + RAW(row,col ^ (load_flags >> 6 & 3)) = val; if (load_flags & 1 && (col % 10) == 9 && fgetc(ifp) && row < height+top_margin && col < width+left_margin) derror(); } @@ -4334,7 +4334,7 @@ void CLASS crop_masked_pixels() load_raw == &CLASS sony_load_raw || (load_raw == &CLASS eight_bit_load_raw && strncmp(model,"DC2",3)) || load_raw == &CLASS kodak_262_load_raw || - (load_raw == &CLASS packed_load_raw && (load_flags & 32))) { + (load_raw == &CLASS packed_load_raw && (load_flags & 256))) { sides: mask[0][0] = mask[1][0] = top_margin; mask[0][2] = mask[1][2] = top_margin+height; @@ -5974,14 +5974,13 @@ int CLASS parse_tiff_ifd (int base) case 258: /* BitsPerSample */ case 61443: tiff_ifd[ifd].samples = len & 7; - tiff_ifd[ifd].bps = getint(type); + if ((tiff_ifd[ifd].bps = getint(type)) > 32) + tiff_ifd[ifd].bps = 8; if (tiff_bps < tiff_ifd[ifd].bps) tiff_bps = tiff_ifd[ifd].bps; break; case 61446: raw_height = 0; - if (tiff_ifd[ifd].bps > 12) break; - load_raw = &CLASS packed_load_raw; load_flags = get4() ? 24:80; break; case 259: /* Compression */ @@ -6548,6 +6547,7 @@ void CLASS apply_tiff() case 32767: if (tiff_ifd[raw].bytes == raw_width*raw_height) { tiff_bps = 12; + maximum = 4095; load_raw = &CLASS sony_arw2_load_raw; break; } if (tiff_ifd[raw].bytes*8 != raw_width*raw_height*tiff_bps) { @@ -6563,7 +6563,9 @@ void CLASS apply_tiff() if (!strncmp(make,"OLYMPUS",7) && tiff_ifd[raw].bytes*2 == raw_width*raw_height*3) load_flags = 24; - if (tiff_ifd[raw].bytes*5 == raw_width*raw_height*8) { + if (!strcmp(make,"SONY") && tiff_bps < 14 && + tiff_ifd[raw].bytes == raw_width*raw_height*2) + tiff_bps = 14; if (tiff_ifd[raw].bytes*5 == raw_width*raw_height*8) { load_flags = 81; tiff_bps = 12; } slr: @@ -6577,7 +6579,9 @@ void CLASS apply_tiff() load_raw = &CLASS packed_load_raw; break; } - case 14: load_flags = 0; + case 14: load_raw = &CLASS packed_load_raw; + if (tiff_ifd[raw].bytes*4 == raw_width*raw_height*7) break; + load_flags = 0; case 16: load_raw = &CLASS unpacked_load_raw; if (!strncmp(make,"OLYMPUS",7) && tiff_ifd[raw].bytes*7 > raw_width*raw_height) @@ -6594,6 +6598,9 @@ void CLASS apply_tiff() } // ------------------ } +// if (filters == 9 && tiff_ifd[raw].bytes*8 < raw_width*raw_height*tiff_bps) +// load_raw = &CLASS fuji_xtrans_load_raw; + break; case 6: case 7: case 99: load_raw = &CLASS lossless_jpeg_load_raw; break; @@ -7052,7 +7059,7 @@ void CLASS parse_fuji (int offset) FORC(36) xtrans_abs[0][35-c] = fgetc(ifp) & 3; } else if (tag == 0x2ff0) { FORC4 cam_mul[c ^ 1] = get2(); - } else if (tag == 0xc000) { + } else if (tag == 0xc000 && len > 20000) { c = order; order = 0x4949; while ((tag = get4()) > raw_width); @@ -7378,12 +7385,16 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6188,-1341,-890,-7168,14489,2937,-2640,3228,8483 } }, { "Canon EOS 5DS", 0, 0x3c96, { 6250,-711,-808,-5153,12794,2636,-1249,2198,5610 } }, + { "Canon EOS 5D Mark IV", 0, 0, + { 6446,-366,-864,-4436,12204,2513,-952,2496,6348 } }, { "Canon EOS 5D Mark III", 0, 0x3c80, { 6722,-635,-963,-4287,12460,2028,-908,2162,5668 } }, { "Canon EOS 5D Mark II", 0, 0x3cf0, { 4716,603,-830,-7798,15474,2480,-1496,1937,6651 } }, { "Canon EOS 5D", 0, 0xe6c, { 6347,-479,-972,-8297,15954,2480,-1968,2131,7649 } }, + { "Canon EOS 6D Mark II", 0, 0, + { 6875,-970,-932,-4691,12459,2501,-874,1953,5809 } }, { "Canon EOS 6D", 0, 0x3c82, { 7034,-804,-1014,-4420,12564,2058,-851,1994,5758 } }, { "Canon EOS 7D Mark II", 0, 0x3510, @@ -7406,10 +7417,14 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6719,-994,-925,-4408,12426,2211,-887,2129,6051 } }, { "Canon EOS 70D", 0, 0x3bc7, { 7034,-804,-1014,-4420,12564,2058,-851,1994,5758 } }, + { "Canon EOS 77D", 0, 0, + { 7377,-742,-998,-4235,11981,2549,-673,1918,5538 } }, { "Canon EOS 80D", 0, 0, { 7457,-671,-937,-4849,12495,2643,-1213,2354,5492 } }, { "Canon EOS 100D", 0, 0x350f, { 6602,-841,-939,-4472,12458,2247,-975,2039,6148 } }, + { "Canon EOS 200D", 0, 0, + { 7377,-742,-998,-4235,11981,2549,-673,1918,5538 } }, { "Canon EOS 300D", 0, 0xfa0, { 8197,-2000,-1118,-6714,14335,2592,-2536,3178,8266 } }, { "Canon EOS 350D", 0, 0xfff, @@ -7432,6 +7447,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6362,-823,-847,-4426,12109,2616,-743,1857,5635 } }, { "Canon EOS 760D", 0, 0x350f, { 6362,-823,-847,-4426,12109,2616,-743,1857,5635 } }, + { "Canon EOS 800D", 0, 0, + { 6970,-512,-968,-4425,12161,2553,-739,1982,5601 } }, { "Canon EOS 1000D", 0, 0xe43, { 6771,-1139,-977,-7818,15123,2928,-1244,1437,7533 } }, { "Canon EOS 1100D", 0, 0x3510, @@ -7440,8 +7457,18 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6461,-907,-882,-4300,12184,2378,-819,1944,5931 } }, { "Canon EOS 1300D", 0, 0x3510, { 6939,-1016,-866,-4428,12473,2177,-1175,2178,6162 } }, + { "Canon EOS 1500D", 0, 0, + { 8532,-701,-1167,-4095,11879,2508,-797,2424,7010 } }, + { "Canon EOS 3000D", 0, 0, + { 6939,-1016,-866,-4428,12473,2177,-1175,2178,6162 } }, + { "Canon EOS M6", 0, 0, + { 8532,-701,-1167,-4095,11879,2508,-797,2424,7010 } }, + { "Canon EOS M5", 0, 0, /* also M50 */ + { 8532,-701,-1167,-4095,11879,2508,-797,2424,7010 } }, { "Canon EOS M3", 0, 0, { 6362,-823,-847,-4426,12109,2616,-743,1857,5635 } }, + { "Canon EOS M100", 0, 0, + { 8532,-701,-1167,-4095,11879,2508,-797,2424,7010 } }, { "Canon EOS M10", 0, 0, { 6400,-480,-888,-5294,13416,2047,-1296,2203,6137 } }, { "Canon EOS M", 0, 0, @@ -7486,6 +7513,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 7474,-2301,-567,-4056,11456,2975,-222,716,4181 } }, { "Canon PowerShot G16", 0, 0, { 8020,-2687,-682,-3704,11879,2052,-965,1921,5556 } }, + { "Canon PowerShot G1 X Mark III", 0, 0, + { 8532,-701,-1167,-4095,11879,2508,-797,2424,7010 } }, { "Canon PowerShot G1 X", 0, 0, { 7378,-1255,-1043,-4088,12251,2048,-876,1946,5805 } }, { "Canon PowerShot G1", 0, 0, @@ -7504,6 +7533,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 9877,-3775,-871,-7613,14807,3072,-1448,1305,7485 } }, { "Canon PowerShot G7 X", 0, 0, { 9602,-3823,-937,-2984,11495,1675,-407,1415,5049 } }, + { "Canon PowerShot G9 X Mark II", 0, 0, + { 10056,-4131,-944,-2576,11143,1625,-238,1294,5179 } }, { "Canon PowerShot G9 X", 0, 0, { 9602,-3823,-937,-2984,11495,1675,-407,1415,5049 } }, { "Canon PowerShot G9", 0, 0, @@ -7598,6 +7629,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 10004,-3219,-1201,-7036,15047,2107,-1863,2565,7736 } }, { "Fujifilm F8", 0, 0, { 13690,-5358,-1474,-3369,11600,1998,-132,1554,4395 } }, + { "Fujifilm GFX 50S", 0, 0, + { 11756,-4754,-874,-3056,11045,2305,-381,1457,6006 } }, { "Fujifilm S100FS", 514, 0, { 11521,-4355,-1065,-6524,13767,3058,-1466,1984,6045 } }, { "Fujifilm S1", 0, 0, @@ -7606,9 +7639,9 @@ void CLASS adobe_coeff (const char *make, const char *model) { 10004,-3219,-1201,-7036,15047,2107,-1863,2565,7736 } }, { "Fujifilm S20", 512, 0x3fff, { 11401,-4498,-1312,-5088,12751,2613,-838,1568,5941 } }, - { "Fujifilm S2Pro", 128, 0, + { "Fujifilm S2Pro", 128, 0xf15, { 12492,-4690,-1402,-7033,15423,1647,-1507,2111,7697 } }, - { "Fujifilm S3Pro", 0, 0, + { "Fujifilm S3Pro", 0, 0x3dff, { 11807,-4612,-1294,-8927,16968,1988,-2120,2741,8006 } }, { "Fujifilm S5Pro", 0, 0, { 12300,-5110,-1304,-9117,17143,1998,-1947,2448,8100 } }, @@ -7642,7 +7675,7 @@ void CLASS adobe_coeff (const char *make, const char *model) { 12300,-5110,-1304,-9117,17143,1998,-1947,2448,8100 } }, { "Fujifilm HS10 HS11", 0, 0xf68, { 12440,-3954,-1183,-1123,9674,1708,-83,1614,4086 } }, - { "Fujifilm HS2", 0, 0, + { "Fujifilm HS2", 0, 0xfef, { 13690,-5358,-1474,-3369,11600,1998,-132,1554,4395 } }, { "Fujifilm HS3", 0, 0, { 13690,-5358,-1474,-3369,11600,1998,-132,1554,4395 } }, @@ -7650,6 +7683,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 12085,-4727,-953,-3257,11489,2002,-511,2046,4592 } }, { "Fujifilm F900EXR", 0, 0, { 12085,-4727,-953,-3257,11489,2002,-511,2046,4592 } }, + { "Fujifilm X100F", 0, 0, + { 11434,-4948,-1210,-3746,12042,1903,-666,1479,5235 } }, { "Fujifilm X100S", 0, 0, { 10592,-4262,-1008,-3514,11355,2465,-870,2025,6386 } }, { "Fujifilm X100T", 0, 0, @@ -7668,26 +7703,42 @@ void CLASS adobe_coeff (const char *make, const char *model) { 10413,-3996,-993,-3721,11640,2361,-733,1540,6011 } }, { "Fujifilm X-Pro2", 0, 0, { 11434,-4948,-1210,-3746,12042,1903,-666,1479,5235 } }, + { "Fujifilm X-A10", 0, 0, + { 11540,-4999,-991,-2949,10963,2278,-382,1049,5605 } }, + { "Fujifilm X-A20", 0, 0, + { 11540,-4999,-991,-2949,10963,2278,-382,1049,5605 } }, { "Fujifilm X-A1", 0, 0, { 11086,-4555,-839,-3512,11310,2517,-815,1341,5940 } }, { "Fujifilm X-A2", 0, 0, { 10763,-4560,-917,-3346,11311,2322,-475,1135,5843 } }, + { "Fujifilm X-A3", 0, 0, + { 12407,-5222,-1086,-2971,11116,2120,-294,1029,5284 } }, + { "Fujifilm X-A5", 0, 0, + { 11673,-4760,-1041,-3988,12058,2166,-771,1417,5569 } }, { "Fujifilm X-E1", 0, 0, { 10413,-3996,-993,-3721,11640,2361,-733,1540,6011 } }, { "Fujifilm X-E2S", 0, 0, { 11562,-5118,-961,-3022,11007,2311,-525,1569,6097 } }, { "Fujifilm X-E2", 0, 0, { 8458,-2451,-855,-4597,12447,2407,-1475,2482,6526 } }, + { "Fujifilm X-E3", 0, 0, + { 11434,-4948,-1210,-3746,12042,1903,-666,1479,5235 } }, + { "Fujifilm X-H1", 0, 0, + { 11434,-4948,-1210,-3746,12042,1903,-666,1479,5235 } }, { "Fujifilm X-M1", 0, 0, { 10413,-3996,-993,-3721,11640,2361,-733,1540,6011 } }, { "Fujifilm X-S1", 0, 0, { 13509,-6199,-1254,-4430,12733,1865,-331,1441,5022 } }, { "Fujifilm X-T1", 0, 0, /* also X-T10 */ { 8458,-2451,-855,-4597,12447,2407,-1475,2482,6526 } }, + { "Fujifilm X-T2", 0, 0, /* also X-T20 */ + { 11434,-4948,-1210,-3746,12042,1903,-666,1479,5235 } }, { "Fujifilm XF1", 0, 0, { 13509,-6199,-1254,-4430,12733,1865,-331,1441,5022 } }, { "Fujifilm XQ", 0, 0, /* XQ1 and XQ2 */ { 9252,-2704,-1064,-5893,14265,1717,-1101,2341,4349 } }, + { "GoPro HERO5 Black", 0, 0, + { 10344,-4210,-620,-2315,10625,1948,93,1058,5541 } }, { "Imacon Ixpress", 0, 0, /* DJC */ { 7025,-1415,-704,-5188,13765,1424,-1248,2742,6038 } }, { "Kodak NC2000", 0, 0, @@ -7800,6 +7851,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 7013,-1408,-635,-5268,12902,2640,-1470,2801,7379 } }, { "Nikon D3300", 0, 0, { 6988,-1384,-714,-5631,13410,2447,-1485,2204,7318 } }, + { "Nikon D3400", 0, 0, + { 6988,-1384,-714,-5631,13410,2447,-1485,2204,7318 } }, { "Nikon D300", 0, 0, { 9030,-1992,-715,-8465,16302,2255,-2689,3217,8069 } }, { "Nikon D3X", 0, 0, @@ -7828,6 +7881,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6988,-1384,-714,-5631,13410,2447,-1485,2204,7318 } }, { "Nikon D5500", 0, 0, { 8821,-2938,-785,-4178,12142,2287,-824,1651,6860 } }, + { "Nikon D5600", 0, 0, + { 8821,-2938,-785,-4178,12142,2287,-824,1651,6860 } }, { "Nikon D500", 0, 0, { 8813,-3210,-1036,-4703,12868,2021,-1054,1940,6129 } }, { "Nikon D50", 0, 0, @@ -7846,12 +7901,16 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8322,-3112,-1047,-6367,14342,2179,-988,1638,6394 } }, { "Nikon D7200", 0, 0, { 8322,-3112,-1047,-6367,14342,2179,-988,1638,6394 } }, + { "Nikon D7500", 0, 0, + { 8813,-3210,-1036,-4703,12868,2021,-1054,1940,6129 } }, { "Nikon D750", 0, 0, { 9020,-2890,-715,-4535,12436,2348,-934,1919,7086 } }, { "Nikon D700", 0, 0, { 8139,-2171,-663,-8747,16541,2295,-1925,2008,8093 } }, { "Nikon D70", 0, 0, { 7732,-2422,-789,-8238,15884,2498,-859,783,7330 } }, + { "Nikon D850", 0, 0, + { 10405,-3755,-1270,-5461,13787,1793,-1040,2015,6785 } }, { "Nikon D810", 0, 0, { 9369,-3195,-791,-4488,12430,2301,-893,1796,6872 } }, { "Nikon D800", 0, 0, @@ -7892,6 +7951,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 7971,-2314,-913,-8451,15762,2894,-1442,1520,7610 } }, { "Nikon COOLPIX A", 0, 0, { 8198,-2239,-724,-4871,12389,2798,-1043,2050,7181 } }, + { "Nikon COOLPIX B700", 200, 0, + { 14387,-6014,-1299,-1357,9975,1616,467,1047,4744 } }, { "Nikon COOLPIX P330", 200, 0, { 10321,-3920,-931,-2750,11146,1824,-442,1545,5539 } }, { "Nikon COOLPIX P340", 200, 0, @@ -7990,12 +8051,18 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 } }, { "Olympus E-PL7", 0, 0, { 9197,-3190,-659,-2606,10830,2039,-458,1250,5458 } }, + { "Olympus E-PL8", 0, 0, + { 9197,-3190,-659,-2606,10830,2039,-458,1250,5458 } }, + { "Olympus E-PL9", 0, 0, + { 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 } }, { "Olympus E-PM1", 0, 0, { 7575,-2159,-571,-3722,11341,2725,-1434,2819,6271 } }, { "Olympus E-PM2", 0, 0, { 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 } }, - { "Olympus E-M10", 0, 0, /* also E-M10 Mark II */ + { "Olympus E-M10", 0, 0, /* also E-M10 Mark II & III */ { 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 } }, + { "Olympus E-M1Mark II", 0, 0, + { 9383,-3170,-763,-2457,10702,2020,-384,1236,5552 } }, { "Olympus E-M1", 0, 0, { 7687,-1984,-606,-4327,11928,2721,-1381,2339,6452 } }, { "Olympus E-M5MarkII", 0, 0, @@ -8024,6 +8091,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8360,-2420,-880,-3928,12353,1739,-1381,2416,5173 } }, { "Olympus TG-4", 0, 0, { 11426,-4159,-1126,-2066,10678,1593,-120,1327,4998 } }, + { "Olympus TG-5", 0, 0, + { 10899,-3833,-1082,-2112,10736,1575,-267,1452,5269 } }, { "Olympus XZ-10", 0, 0, { 9777,-3483,-925,-2886,11297,1800,-602,1663,5134 } }, { "Olympus XZ-1", 0, 0, @@ -8059,7 +8128,7 @@ void CLASS adobe_coeff (const char *make, const char *model) { "Pentax K-r", 0, 0, { 9895,-3077,-850,-5304,13035,2521,-883,1768,6936 } }, { "Pentax K-1", 0, 0, - { 8566,-2746,-1201,-3612,12204,1550,-893,1680,6264 } }, + { 8596,-2981,-639,-4202,12046,2431,-685,1424,6122 } }, { "Pentax K-30", 0, 0, { 8710,-2632,-1167,-3995,12301,1881,-981,1719,6535 } }, { "Pentax K-3 II", 0, 0, @@ -8070,37 +8139,45 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8170,-2725,-639,-4440,12017,2744,-771,1465,6599 } }, { "Pentax K-5", 0, 0, { 8713,-2833,-743,-4342,11900,2772,-722,1543,6247 } }, + { "Pentax K-70", 0, 0, + { 8270,-2117,-1299,-4359,12953,1515,-1078,1933,5975 } }, { "Pentax K-7", 0, 0, { 9142,-2947,-678,-8648,16967,1663,-2224,2898,8615 } }, { "Pentax K-S1", 0, 0, { 8512,-3211,-787,-4167,11966,2487,-638,1288,6054 } }, { "Pentax K-S2", 0, 0, { 8662,-3280,-798,-3928,11771,2444,-586,1232,6054 } }, + { "Pentax KP", 0, 0, + { 8617,-3228,-1034,-4674,12821,2044,-803,1577,5728 } }, { "Pentax Q-S1", 0, 0, { 12995,-5593,-1107,-1879,10139,2027,-64,1233,4919 } }, { "Pentax 645D", 0, 0x3e00, { 10646,-3593,-1158,-3329,11699,1831,-667,2874,6287 } }, { "Panasonic DMC-CM1", 15, 0, { 8770,-3194,-820,-2871,11281,1803,-513,1552,4434 } }, + { "Panasonic DC-FZ80", 0, 0, + { 8550,-2908,-842,-3195,11529,1881,-338,1603,4631 } }, { "Panasonic DMC-FZ8", 0, 0xf7f, { 8986,-2755,-802,-6341,13575,3077,-1476,2144,6379 } }, { "Panasonic DMC-FZ18", 0, 0, { 9932,-3060,-935,-5809,13331,2753,-1267,2155,5575 } }, { "Panasonic DMC-FZ28", 15, 0xf96, { 10109,-3488,-993,-5412,12812,2916,-1305,2140,5543 } }, + { "Panasonic DMC-FZ2500", 15, 0, + { 7386,-2443,-743,-3437,11864,1757,-608,1660,4766 } }, { "Panasonic DMC-FZ330", 15, 0, { 8378,-2798,-769,-3068,11410,1877,-538,1792,4623 } }, { "Panasonic DMC-FZ300", 15, 0, { 8378,-2798,-769,-3068,11410,1877,-538,1792,4623 } }, { "Panasonic DMC-FZ30", 0, 0xf94, { 10976,-4029,-1141,-7918,15491,2600,-1670,2071,8246 } }, - { "Panasonic DMC-FZ3", 15, 0, + { "Panasonic DMC-FZ3", 15, 0, /* FZ35, FZ38 */ { 9938,-2780,-890,-4604,12393,2480,-1117,2304,4620 } }, - { "Panasonic DMC-FZ4", 15, 0, + { "Panasonic DMC-FZ4", 15, 0, /* FZ40, FZ45 */ { 13639,-5535,-1371,-1698,9633,2430,316,1152,4108 } }, { "Panasonic DMC-FZ50", 0, 0, { 7906,-2709,-594,-6231,13351,3220,-1922,2631,6537 } }, - { "Panasonic DMC-FZ7", 15, 0, + { "Panasonic DMC-FZ7", 15, 0, /* FZ70, FZ72 */ { 11532,-4324,-1066,-2375,10847,1749,-564,1699,4351 } }, { "Leica V-LUX1", 0, 0, { 7906,-2709,-594,-6231,13351,3220,-1922,2631,6537 } }, @@ -8142,6 +8219,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 10148,-3743,-991,-2837,11366,1659,-701,1893,4899 } }, { "Leica D-LUX 6", 15, 0, { 10148,-3743,-991,-2837,11366,1659,-701,1893,4899 } }, + { "Panasonic DMC-LX9", 15, 0, + { 7790,-2736,-755,-3452,11870,1769,-628,1647,4898 } }, { "Panasonic DMC-FZ1000", 15, 0, { 7830,-2696,-763,-3325,11667,1866,-641,1712,4824 } }, { "Leica V-LUX (Typ 114)", 15, 0, @@ -8174,6 +8253,10 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8294,-2891,-651,-3869,11590,2595,-1183,2267,5352 } }, { "Panasonic DMC-G7", 15, 0xfff, { 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 } }, + { "Panasonic DMC-G8", 15, 0xfff, /* G8, G80, G81, G85 */ + { 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 } }, + { "Panasonic DC-G9", 15, 0xfff, + { 7685,-2375,-634,-3687,11700,2249,-748,1546,5111 } }, { "Panasonic DMC-GF1", 15, 0xf92, { 7888,-1902,-1011,-8106,16085,2099,-2353,2866,7330 } }, { "Panasonic DMC-GF2", 15, 0xfff, @@ -8188,6 +8271,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 } }, { "Panasonic DMC-GF8", 15, 0, { 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 } }, + { "Panasonic DC-GF9", 15, 0, + { 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 } }, { "Panasonic DMC-GH1", 15, 0xf92, { 6299,-1466,-532,-6535,13852,2969,-2331,3112,5984 } }, { "Panasonic DMC-GH2", 15, 0xf95, @@ -8196,6 +8281,10 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6559,-1752,-491,-3672,11407,2586,-962,1875,5130 } }, { "Panasonic DMC-GH4", 15, 0, { 7122,-2108,-512,-3155,11201,2231,-541,1423,5045 } }, + { "Panasonic DC-GH5S", 15, 0, + { 6929,-2355,-708,-4192,12534,1828,-1097,1989,5195 } }, + { "Panasonic DC-GH5", 15, 0, + { 7641,-2336,-605,-3218,11299,2187,-485,1338,5121 } }, { "Panasonic DMC-GM1", 15, 0, { 6770,-1895,-744,-5232,13145,2303,-1664,2691,5703 } }, { "Panasonic DMC-GM5", 15, 0, @@ -8204,24 +8293,26 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6763,-1919,-863,-3868,11515,2684,-1216,2387,5879 } }, { "Panasonic DMC-GX7", 15, 0, { 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 } }, + { "Panasonic DMC-GX85", 15, 0, + { 7771,-3020,-629,-4029,11950,2345,-821,1977,6119 } }, { "Panasonic DMC-GX8", 15, 0, { 7564,-2263,-606,-3148,11239,2177,-540,1435,4853 } }, - { "Panasonic DMC-TZ1", 15, 0, + { "Panasonic DC-GX9", 15, 0, + { 7564,-2263,-606,-3148,11239,2177,-540,1435,4853 } }, + { "Panasonic DMC-ZS100", 15, 0, { 7790,-2736,-755,-3452,11870,1769,-628,1647,4898 } }, - { "Panasonic DMC-ZS1", 15, 0, + { "Panasonic DC-ZS200", 15, 0, { 7790,-2736,-755,-3452,11870,1769,-628,1647,4898 } }, - { "Panasonic DMC-TZ6", 15, 0, + { "Panasonic DMC-ZS40", 15, 0, { 8607,-2822,-808,-3755,11930,2049,-820,2060,5224 } }, - { "Panasonic DMC-ZS4", 15, 0, - { 8607,-2822,-808,-3755,11930,2049,-820,2060,5224 } }, - { "Panasonic DMC-TZ7", 15, 0, + { "Panasonic DMC-ZS50", 15, 0, { 8802,-3135,-789,-3151,11468,1904,-550,1745,4810 } }, - { "Panasonic DMC-ZS5", 15, 0, - { 8802,-3135,-789,-3151,11468,1904,-550,1745,4810 } }, - { "Panasonic DMC-TZ8", 15, 0, + { "Panasonic DMC-TZ82", 15, 0, { 8550,-2908,-842,-3195,11529,1881,-338,1603,4631 } }, { "Panasonic DMC-ZS6", 15, 0, { 8550,-2908,-842,-3195,11529,1881,-338,1603,4631 } }, + { "Panasonic DMC-ZS70", 15, 0, + { 9052,-3117,-883,-3045,11346,1927,-205,1520,4730 } }, { "Leica S (Typ 007)", 0, 0, { 6063,-2234,-231,-5210,13787,1500,-1043,2866,6997 } }, { "Leica X", 0, 0, /* X and X-U, both (Typ 113) */ @@ -8231,7 +8322,15 @@ void CLASS adobe_coeff (const char *make, const char *model) { "Leica M (Typ 262)", 0, 0, { 6653,-1486,-611,-4221,13303,929,-881,2416,7226 } }, { "Leica SL (Typ 601)", 0, 0, - { 11865,-4523,-1441,-5423,14458,935,-1587,2687,4830} }, + { 11865,-4523,-1441,-5423,14458,935,-1587,2687,4830 } }, + { "Leica TL2", 0, 0, + { 5836,-1626,-647,-5384,13326,2261,-1207,2129,5861 } }, + { "Leica TL", 0, 0, + { 5463,-988,-364,-4634,12036,2946,-766,1389,6522 } }, + { "Leica CL", 0, 0, + { 7414,-2393,-840,-5127,13180,2138,-1585,2468,5064 } }, + { "Leica M10", 0, 0, + { 8249,-2849,-620,-5415,14756,565,-957,3074,6517 } }, { "Phase One H 20", 0, 0, /* DJC */ { 1313,1855,-109,-6715,15908,808,-327,1840,6020 } }, { "Phase One H 25", 0, 0, @@ -8302,16 +8401,20 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8512,-2641,-694,-8042,15670,2526,-1821,2117,7414 } }, { "Sony DSC-V3", 0, 0, { 7511,-2571,-692,-7894,15088,3060,-948,1111,8128 } }, - { "Sony DSC-RX100M", 0, 0, /* M2, M3, and M4 */ + { "Sony DSC-RX100M", 0, 0, /* M2, M3, M4, and M5 */ { 6596,-2079,-562,-4782,13016,1933,-970,1581,5181 } }, { "Sony DSC-RX100", 0, 0, { 8651,-2754,-1057,-3464,12207,1373,-568,1398,4434 } }, - { "Sony DSC-RX10", 0, 0, + { "Sony DSC-RX10M4", 0, 0, + { 7699,-2566,-629,-2967,11270,1928,-378,1286,4807 } }, + { "Sony DSC-RX10", 0, 0, /* also RX10M2, RX10M3 */ { 6679,-1825,-745,-5047,13256,1953,-1580,2422,5183 } }, { "Sony DSC-RX1RM2", 0, 0, { 6629,-1900,-483,-4618,12349,2550,-622,1381,6514 } }, { "Sony DSC-RX1", 0, 0, { 6344,-1612,-462,-4863,12477,2681,-865,1786,6899 } }, + { "Sony DSC-RX0", 200, 0, + { 9396,-3507,-843,-2497,11111,1572,-343,1355,5089 } }, { "Sony DSLR-A100", 0, 0xfeb, { 9437,-2811,-774,-8405,16215,2290,-710,596,7181 } }, { "Sony DSLR-A290", 0, 0, @@ -8346,18 +8449,26 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6435,-1903,-536,-4722,12449,2550,-663,1363,6517 } }, { "Sony ILCA-77M2", 0, 0, { 5991,-1732,-443,-4100,11989,2381,-704,1467,5992 } }, - { "Sony ILCE-6300", 0, 0, + { "Sony ILCA-99M2", 0, 0, + { 6660,-1918,-471,-4613,12398,2485,-649,1433,6447 } }, + { "Sony ILCE-6", 0, 0, /* 6300, 6500 */ { 5973,-1695,-419,-3826,11797,2293,-639,1398,5789 } }, { "Sony ILCE-7M2", 0, 0, { 5271,-712,-347,-6153,13653,2763,-1601,2366,7242 } }, + { "Sony ILCE-7M3", 0, 0, + { 7374,-2389,-551,-5435,13162,2519,-1006,1795,6552 } }, { "Sony ILCE-7S", 0, 0, /* also ILCE-7SM2 */ { 5838,-1430,-246,-3497,11477,2297,-748,1885,5778 } }, + { "Sony ILCE-7RM3", 0, 0, + { 6640,-1847,-503,-5238,13010,2474,-993,1673,6527 } }, { "Sony ILCE-7RM2", 0, 0, { 6629,-1900,-483,-4618,12349,2550,-622,1381,6514 } }, { "Sony ILCE-7R", 0, 0, { 4913,-541,-202,-6130,13513,2906,-1564,2151,7183 } }, { "Sony ILCE-7", 0, 0, { 5271,-712,-347,-6153,13653,2763,-1601,2366,7242 } }, + { "Sony ILCE-9", 0, 0, + { 6389,-1703,-378,-4562,12265,2587,-670,1489,6550 } }, { "Sony ILCE", 0, 0, /* 3000, 5000, 5100, 6000, and QX1 */ { 5991,-1456,-455,-4764,12135,2980,-707,1425,6701 } }, { "Sony NEX-5N", 0, 0, @@ -8400,6 +8511,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 5491,-1192,-363,-4951,12342,2948,-911,1722,7192 } }, { "Sony SLT-A99", 0, 0, { 6344,-1612,-462,-4863,12477,2681,-865,1786,6899 } }, + { "YI M1", 0, 0, + { 7712,-2059,-653,-3882,11494,2726,-710,1332,5958 } }, }; double cam_xyz[4][3]; char name[130]; @@ -8582,8 +8695,11 @@ void CLASS identify() { 5712, 3774, 62, 20, 10, 2 }, { 5792, 3804, 158, 51, 0, 0 }, { 5920, 3950, 122, 80, 2, 0 }, + { 6096, 4051, 76, 35, 0, 0 }, { 6096, 4056, 72, 34, 0, 0 }, - { 6288, 4056, 264, 34, 0, 0 }, + { 6288, 4056, 264, 36, 0, 0 }, + { 6384, 4224, 120, 44, 0, 0 }, + { 6880, 4544, 136, 42, 0, 0 }, { 8896, 5920, 160, 64, 0, 0 }, }; static const struct { @@ -8597,7 +8713,10 @@ void CLASS identify() { 0x261, "EOS 50D" }, { 0x281, "EOS-1D Mark IV" }, { 0x287, "EOS 60D" }, { 0x167, "EOS-1DS" }, { 0x325, "EOS 70D" }, + { 0x408, "EOS 77D" }, { 0x331, "EOS M" }, { 0x350, "EOS 80D" }, { 0x328, "EOS-1D X Mark II" }, + { 0x346, "EOS 100D" }, + { 0x417, "EOS 200D" }, { 0x170, "EOS 300D" }, { 0x188, "EOS-1Ds Mark II" }, { 0x176, "EOS 450D" }, { 0x215, "EOS-1Ds Mark III" }, { 0x189, "EOS 350D" }, { 0x324, "EOS-1D C" }, @@ -8608,12 +8727,14 @@ void CLASS identify() { 0x301, "EOS 650D" }, { 0x302, "EOS 6D" }, { 0x326, "EOS 700D" }, { 0x250, "EOS 7D" }, { 0x393, "EOS 750D" }, { 0x289, "EOS 7D Mark II" }, - { 0x347, "EOS 760D" }, + { 0x347, "EOS 760D" }, { 0x406, "EOS 6D Mark II" }, + { 0x405, "EOS 800D" }, { 0x349, "EOS 5D Mark IV" }, { 0x254, "EOS 1000D" }, { 0x288, "EOS 1100D" }, - { 0x327, "EOS 1200D" }, { 0x382, "Canon EOS 5DS" }, - { 0x404, "EOS 1300D" }, { 0x401, "Canon EOS 5DS R" }, - { 0x346, "EOS 100D" }, + { 0x327, "EOS 1200D" }, { 0x382, "EOS 5DS" }, + { 0x404, "EOS 1300D" }, { 0x401, "EOS 5DS R" }, + { 0x422, "EOS 1500D" }, + { 0x432, "EOS 3000D" }, }, sonique[] = { { 0x002, "DSC-R1" }, { 0x100, "DSLR-A100" }, { 0x101, "DSLR-A900" }, { 0x102, "DSLR-A700" }, @@ -8643,7 +8764,30 @@ void CLASS identify() { 0x155, "DSC-RX100M4" },{ 0x156, "DSC-RX10M2" }, { 0x158, "DSC-RX1RM2" }, { 0x15a, "ILCE-QX1" }, { 0x15b, "ILCE-7RM2" }, { 0x15e, "ILCE-7SM2" }, - { 0x161, "ILCA-68" }, { 0x165, "ILCE-6300" }, + { 0x161, "ILCA-68" }, { 0x162, "ILCA-99M2" }, + { 0x163, "DSC-RX10M3" }, { 0x164, "DSC-RX100M5" }, + { 0x165, "ILCE-6300" }, { 0x166, "ILCE-9" }, + { 0x168, "ILCE-6500" }, { 0x16a, "ILCE-7RM3" }, + { 0x16b, "ILCE-7M3" }, { 0x16c, "DSC-RX0" }, + { 0x16d, "DSC-RX10M4" }, + }; + static const char *orig, panalias[][12] = { + "@DC-FZ80", "DC-FZ82", "DC-FZ85", + "@DC-FZ81", "DC-FZ83", + "@DC-GF9", "DC-GX800", "DC-GX850", + "@DC-GF10", "DC-GF90", + "@DC-GX9", "DC-GX7MK3", + "@DC-ZS70", "DC-TZ90", "DC-TZ91", "DC-TZ92", "DC-TZ93", + "@DMC-FZ40", "DMC-FZ45", + "@DMC-FZ2500", "DMC-FZ2000", "DMC-FZH1", + "@DMC-G8", "DMC-G80", "DMC-G81", "DMC-G85", + "@DMC-GX85", "DMC-GX80", "DMC-GX7MK2", + "@DMC-LX9", "DMC-LX10", "DMC-LX15", + "@DMC-ZS40", "DMC-TZ60", "DMC-TZ61", + "@DMC-ZS50", "DMC-TZ70", "DMC-TZ71", + "@DMC-ZS60", "DMC-TZ80", "DMC-TZ81", "DMC-TZ85", + "@DMC-ZS100", "DMC-ZS110", "DMC-TZ100", "DMC-TZ101", "DMC-TZ110", "DMC-TX1", + "@DC-ZS200", "DC-TX2", "DC-TZ200", "DC-TZ202", "DC-TZ220", "DC-ZS220", }; static const struct { unsigned fsize; @@ -8663,25 +8807,24 @@ void CLASS identify() { 15980544,3264,2448, 0, 0, 0, 0, 8,0x61,0,1,"AgfaPhoto","DC-833m" }, { 9631728,2532,1902, 0, 0, 0, 0,96,0x61,0,0,"Alcatel","5035D" }, { 2868726,1384,1036, 0, 0, 0, 0,64,0x49,0,8,"Baumer","TXG14",1078 }, - { 5298000,2400,1766,12,12,44, 2,40,0x94,0,2,"Canon","PowerShot SD300" }, - { 6553440,2664,1968, 4, 4,44, 4,40,0x94,0,2,"Canon","PowerShot A460" }, - { 6573120,2672,1968,12, 8,44, 0,40,0x94,0,2,"Canon","PowerShot A610" }, - { 6653280,2672,1992,10, 6,42, 2,40,0x94,0,2,"Canon","PowerShot A530" }, - { 7710960,2888,2136,44, 8, 4, 0,40,0x94,0,2,"Canon","PowerShot S3 IS" }, - { 9219600,3152,2340,36,12, 4, 0,40,0x94,0,2,"Canon","PowerShot A620" }, - { 9243240,3152,2346,12, 7,44,13,40,0x49,0,2,"Canon","PowerShot A470" }, - { 10341600,3336,2480, 6, 5,32, 3,40,0x94,0,2,"Canon","PowerShot A720 IS" }, - { 10383120,3344,2484,12, 6,44, 6,40,0x94,0,2,"Canon","PowerShot A630" }, - { 12945240,3736,2772,12, 6,52, 6,40,0x94,0,2,"Canon","PowerShot A640" }, - { 15636240,4104,3048,48,12,24,12,40,0x94,0,2,"Canon","PowerShot A650" }, - { 15467760,3720,2772, 6,12,30, 0,40,0x94,0,2,"Canon","PowerShot SX110 IS" }, - { 15534576,3728,2778,12, 9,44, 9,40,0x94,0,2,"Canon","PowerShot SX120 IS" }, - { 18653760,4080,3048,24,12,24,12,40,0x94,0,2,"Canon","PowerShot SX20 IS" }, - { 19131120,4168,3060,92,16, 4, 1,40,0x94,0,2,"Canon","PowerShot SX220 HS" }, - { 21936096,4464,3276,25,10,73,12,40,0x16,0,2,"Canon","PowerShot SX30 IS" }, - { 24724224,4704,3504, 8,16,56, 8,40,0x94,0,2,"Canon","PowerShot A3300 IS" }, - { 30858240,5248,3920, 8,16,56,16,40,0x94,0,2,"Canon","IXUS 160" }, - { 1976352,1632,1211, 0, 2, 0, 1, 0,0x94,0,1,"Casio","QV-2000UX" }, + { 5298000,2400,1766,12,12,44, 2, 8,0x94,0,2,"Canon","PowerShot SD300" }, + { 6553440,2664,1968, 4, 4,44, 4, 8,0x94,0,2,"Canon","PowerShot A460" }, + { 6573120,2672,1968,12, 8,44, 0, 8,0x94,0,2,"Canon","PowerShot A610" }, + { 6653280,2672,1992,10, 6,42, 2, 8,0x94,0,2,"Canon","PowerShot A530" }, + { 7710960,2888,2136,44, 8, 4, 0, 8,0x94,0,2,"Canon","PowerShot S3 IS" }, + { 9219600,3152,2340,36,12, 4, 0, 8,0x94,0,2,"Canon","PowerShot A620" }, + { 9243240,3152,2346,12, 7,44,13, 8,0x49,0,2,"Canon","PowerShot A470" }, + { 10341600,3336,2480, 6, 5,32, 3, 8,0x94,0,2,"Canon","PowerShot A720 IS" }, + { 10383120,3344,2484,12, 6,44, 6, 8,0x94,0,2,"Canon","PowerShot A630" }, + { 12945240,3736,2772,12, 6,52, 6, 8,0x94,0,2,"Canon","PowerShot A640" }, + { 15636240,4104,3048,48,12,24,12, 8,0x94,0,2,"Canon","PowerShot A650" }, + { 15467760,3720,2772, 6,12,30, 0, 8,0x94,0,2,"Canon","PowerShot SX110 IS" }, + { 15534576,3728,2778,12, 9,44, 9, 8,0x94,0,2,"Canon","PowerShot SX120 IS" }, + { 18653760,4080,3048,24,12,24,12, 8,0x94,0,2,"Canon","PowerShot SX20 IS" }, + { 19131120,4168,3060,92,16, 4, 1, 8,0x94,0,2,"Canon","PowerShot SX220 HS" }, + { 21936096,4464,3276,25,10,73,12, 8,0x16,0,2,"Canon","PowerShot SX30 IS" }, + { 24724224,4704,3504, 8,16,56, 8, 8,0x94,0,2,"Canon","PowerShot A3300 IS" }, + { 30858240,5248,3920, 8,16,56,16, 8,0x94,0,2,"Canon","IXUS 160" }, { 1976352,1632,1211, 0, 2, 0, 1, 0,0x94,0,1,"Casio","QV-2000UX" }, { 3217760,2080,1547, 0, 0,10, 1, 0,0x94,0,1,"Casio","QV-3*00EX" }, { 6218368,2585,1924, 0, 0, 9, 0, 0,0x94,0,1,"Casio","QV-5700" }, { 7816704,2867,2181, 0, 0,34,36, 0,0x16,0,1,"Casio","EX-Z60" }, @@ -8753,12 +8896,13 @@ void CLASS identify() { 44390468,4080,5440, 0, 0, 0, 0,33,0x61,0,0,"Sinar","",68 }, { 1409024,1376,1024, 0, 0, 1, 0, 0,0x49,0,0,"Sony","XCD-SX910CR" }, { 2818048,1376,1024, 0, 0, 1, 0,97,0x49,0,0,"Sony","XCD-SX910CR" }, + { 17496000,4320,3240, 0, 0, 0,0,224,0x94,0,0,"Xiro","Xplorer V" }, }; static const char *corp[] = { "AgfaPhoto", "Canon", "Casio", "Epson", "Fujifilm", "Mamiya", "Minolta", "Motorola", "Kodak", "Konica", "Leica", "Nikon", "Nokia", "Olympus", "Ricoh", "Pentax", "Phase One", - "Samsung", "Sigma", "Sinar", "Sony" }; + "Samsung", "Sigma", "Sinar", "Sony", "YI" }; char head[32], *cp; int hlen, flen, fsize, zero_fsize=1, i, c; struct jhead jh; @@ -8793,7 +8937,9 @@ void CLASS identify() for (i=0; i < 0x10000; i++) curve[i] = i; flen = fsize = ifp->size; - /*RT*/ if (fsize<100000 || fsize > 0x7fffffff) { + + // currently fsize is of type signed int which means for files larger than 0x7fffffff byte fsize will be < 0. We need to check for large files if we change the type to unsigned int + /*RT*/ if (fsize<100000) { is_raw = 0; return; } @@ -8853,12 +8999,15 @@ void CLASS identify() if (is_raw == 2 && shot_select) parse_fuji (i); } - load_raw = &CLASS unpacked_load_raw; fseek (ifp, 100+28*(shot_select > 0 && shot_select < is_raw), SEEK_SET); parse_tiff (data_offset = get4()); parse_tiff (thumb_offset+12); /*RT*/ exif_base = thumb_offset+12; apply_tiff(); + if (!load_raw) { + load_raw = &CLASS unpacked_load_raw; + tiff_bps = 14; + } } else if (!memcmp (head,"RIFF",4)) { fseek (ifp, 0, SEEK_SET); parse_riff(); @@ -8957,7 +9106,8 @@ void CLASS identify() case 8: load_raw = &CLASS eight_bit_load_raw; break; case 10: case 12: - load_flags |= 128; + load_flags |= 512; + if (!strcmp(make,"Canon")) load_flags |= 256; load_raw = &CLASS packed_load_raw; break; case 16: order = 0x4949 | 0x404 * (load_flags & 1); @@ -9014,17 +9164,25 @@ void CLASS identify() { height = 2616; width = 3896; } if (height == 3136 && width == 4864) /* Pentax K20D and Samsung GX20 */ { height = 3124; width = 4688; filters = 0x16161616; } - if (width == 4352 && (!strcmp(model,"K-r") || !strcmp(model,"K-x"))) + if (raw_height == 2868 && (!strcmp(model,"K-r") || !strcmp(model,"K-x"))) /*RT*/ { width = 4308; filters = 0x16161616; } - if (width >= 4960 && !strncmp(model,"K-5",3)) - { left_margin = 10; width = 4950; filters = 0x16161616; } - if (width == 4736 && !strcmp(model,"K-7")) + if (raw_height == 3136 && !strcmp(model,"K-7")) { height = 3122; width = 4684; filters = 0x16161616; top_margin = 2; } - if (width == 6080 && !strcmp(model,"K-3")) - { left_margin = 4; width = 6040; } - if (width == 7424 && !strcmp(model,"645D")) - { height = 5502; width = 7328; filters = 0x61616161; top_margin = 29; - left_margin = 48; } + if (raw_height == 3284 && !strncmp(model,"K-5",3)) + { left_margin = 10; width = 4950; filters = 0x16161616; } + if (raw_height == 3300 && !strncmp(model,"K-50",4)) + { height = 3288, width = 4952; left_margin = 0; top_margin = 12; } + if (raw_height == 3664 && !strncmp(model,"K-S",3)) + { width = 5492; left_margin = 0; } + if (raw_height == 4032 && !strcmp(model,"K-3")) + { height = 4032; width = 6040; left_margin = 4; } + if (raw_height == 4060 && !strcmp(model,"KP")) + { height = 4032; width = 6032; left_margin = 52; top_margin = 28; } + if (raw_height == 4950 && !strcmp(model,"K-1")) + { height = 4932; width = 7380; left_margin = 4; top_margin = 18; } + if (raw_height == 5552 && !strcmp(model,"645D")) + { height = 5502; width = 7328; left_margin = 48; top_margin = 29; + filters = 0x61616161; } if (width == 7392 && !strncmp(model,"K-1",3)) { left_margin = 6; width = 7376; if(!dng_version) {top_margin = 18; height -= top_margin; }} if (width == 4832 && !strncmp(model,"K-1",3)) // K-1 APS-C format @@ -9074,6 +9232,10 @@ void CLASS identify() for (i=0; i < sizeof sonique / sizeof *sonique; i++) if (unique_id == sonique[i].id) strcpy (model, sonique[i].model); + for (i=0; i < sizeof panalias / sizeof *panalias; i++) + if (panalias[i][0] == '@') orig = panalias[i]+1; + else if (!strcmp(model,panalias[i])) + adobe_coeff ("Panasonic", orig); if (!strcmp(make,"Nikon")) { if (!load_raw) load_raw = &CLASS packed_load_raw; @@ -9160,7 +9322,7 @@ canon_a5: colors = 4; tiff_bps = 10; load_raw = &CLASS packed_load_raw; - load_flags = 40; + load_flags = 264; } else if (!strcmp(model,"PowerShot Pro90 IS") || !strcmp(model,"PowerShot G1")) { colors = 4; @@ -9172,6 +9334,9 @@ canon_a5: } else if (!strcmp(model,"EOS D2000C")) { filters = 0x61616161; black = curve[200]; + } else if (!strcmp(model,"EOS 80D")) { + top_margin -= 2; + height += 2; } else if (!strcmp(model,"D1")) { cam_mul[0] *= 256/527.0; cam_mul[2] *= 256/317.0; @@ -9226,6 +9391,8 @@ canon_a5: else width -= 8; } else if (!strncmp(model,"D300",4)) { width -= 32; + } else if (!strncmp(model,"COOLPIX B",9)) { + load_flags = 24; } else if (!strncmp(model,"COOLPIX P",9) && raw_width != 4032) { load_flags = 24; filters = 0x94949494; @@ -9298,8 +9465,7 @@ canon_a5: height = 2144; width = 2880; flip = 6; - } else if (load_raw != &CLASS packed_load_raw) - maximum = (is_raw == 2 && shot_select) ? 0x2f00 : 0x3e00; + } if (!strncmp(model,"X-A10",5)) { width = raw_width = 4912; height = raw_height = 3278; @@ -9310,7 +9476,7 @@ canon_a5: top_margin = (raw_height - height) >> 2 << 1; left_margin = (raw_width - width ) >> 2 << 1; if (width == 2848 || width == 3664) filters = 0x16161616; - if (width == 4032 || width == 4952 || width == 6032) left_margin = 0; + if (width == 4032 || width == 4952 || width == 6032 || width == 8280) left_margin = 0; if (width == 3328 && (width -= 66)) left_margin = 34; if (width == 4936) left_margin = 4; if (!strcmp(model,"HS50EXR") || @@ -9372,7 +9538,7 @@ konica_400z: } else if (!strcmp(make,"Samsung") && raw_width == 4704) { height -= top_margin = 8; width -= 2 * (left_margin = 8); - load_flags = 32; + load_flags = 256; } else if (!strcmp(make,"Samsung") && raw_height == 3714) { height -= top_margin = 18; left_margin = raw_width - (width = 5536); @@ -9444,6 +9610,11 @@ konica_400z: top_margin = 4; left_margin = 41; filters = 0x61616161; + } else if (raw_width == 8384) { + height = 6208; + width = 8280; + top_margin = 96; + left_margin = 46; } else if (raw_width == 6542) { // RT, H3D-31, H3DII-31, H4D-31 if (!strcmp(model, "H3D")) strcpy(model, "H3D-31"); if (!strcmp(model, "H4D")) strcpy(model, "H4D-31"); @@ -9586,6 +9757,8 @@ konica_400z: thumb_width = 640; } else if (!strcmp(model,"TG-4")) { width -= 16; + } else if (!strcmp(model,"TG-5")) { + width -= 6; } } else if (!strcmp(model,"N Digital")) { height = 2047; diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 0b5198c3c..2d376044e 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -807,7 +807,7 @@ void Crop::update(int todo) } - if (todo & M_AUTOEXP) { + if (todo & (M_AUTOEXP | M_RGBCURVE)) { if (params.icm.workingTRC == "Custom") { //exec TRC IN free Glib::ustring profile; profile = params.icm.workingProfile; diff --git a/rtengine/demosaic_algos.cc b/rtengine/demosaic_algos.cc index 78b5490b5..c0d0c2a2b 100644 --- a/rtengine/demosaic_algos.cc +++ b/rtengine/demosaic_algos.cc @@ -37,6 +37,7 @@ #include "sleef.c" #include "opthelper.h" #include "median.h" +#define BENCHMARK #include "StopWatch.h" #ifdef _OPENMP #include @@ -46,11 +47,12 @@ using namespace std; namespace rtengine { + +extern const Settings* settings; + #undef ABS -#undef DIST #define ABS(a) ((a)<0?-(a):(a)) -#define DIST(a,b) (ABS(a-b)) #define CLIREF(x) LIM(x,-200000.0f,200000.0f) // avoid overflow : do not act directly on image[] or pix[] #define x1125(a) (a + xdivf(a, 3)) #define x0875(a) (a - xdivf(a, 3)) @@ -58,243 +60,6 @@ namespace rtengine #define x00625(a) xdivf(a, 4) #define x0125(a) xdivf(a, 3) -extern const Settings* settings; -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -void RawImageSource::eahd_demosaic () -{ - if (plistener) { - plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::EAHD))); - plistener->setProgress (0.0); - } - - // prepare cache and constants for cielab conversion - //TODO: revisit after conversion to D50 illuminant - lc00 = (0.412453 * imatrices.rgb_cam[0][0] + 0.357580 * imatrices.rgb_cam[0][1] + 0.180423 * imatrices.rgb_cam[0][2]) ;// / 0.950456; - lc01 = (0.412453 * imatrices.rgb_cam[1][0] + 0.357580 * imatrices.rgb_cam[1][1] + 0.180423 * imatrices.rgb_cam[1][2]) ;// / 0.950456; - lc02 = (0.412453 * imatrices.rgb_cam[2][0] + 0.357580 * imatrices.rgb_cam[2][1] + 0.180423 * imatrices.rgb_cam[2][2]) ;// / 0.950456; - - lc10 = 0.212671 * imatrices.rgb_cam[0][0] + 0.715160 * imatrices.rgb_cam[0][1] + 0.072169 * imatrices.rgb_cam[0][2]; - lc11 = 0.212671 * imatrices.rgb_cam[1][0] + 0.715160 * imatrices.rgb_cam[1][1] + 0.072169 * imatrices.rgb_cam[1][2]; - lc12 = 0.212671 * imatrices.rgb_cam[2][0] + 0.715160 * imatrices.rgb_cam[2][1] + 0.072169 * imatrices.rgb_cam[2][2]; - - lc20 = (0.019334 * imatrices.rgb_cam[0][0] + 0.119193 * imatrices.rgb_cam[0][1] + 0.950227 * imatrices.rgb_cam[0][2]) ;// / 1.088754; - lc21 = (0.019334 * imatrices.rgb_cam[1][0] + 0.119193 * imatrices.rgb_cam[1][1] + 0.950227 * imatrices.rgb_cam[1][2]) ;// / 1.088754; - lc22 = (0.019334 * imatrices.rgb_cam[2][0] + 0.119193 * imatrices.rgb_cam[2][1] + 0.950227 * imatrices.rgb_cam[2][2]) ;// / 1.088754; - - int maxindex = 3 * 65536; //2*65536 3 = avoid crash 3/2013 J.Desmis - cache = new double[maxindex]; - threshold = (int)(0.008856 * MAXVALD); - - for (int i = 0; i < maxindex; i++) { - cache[i] = std::cbrt(double(i) / MAXVALD); - } - - // end of cielab preparation - - JaggedArray - rh (W, 3), gh (W, 4), bh (W, 3), - rv (W, 3), gv (W, 4), bv (W, 3), - lLh (W, 3), lah (W, 3), lbh (W, 3), - lLv (W, 3), lav (W, 3), lbv (W, 3), - homh (W, 3), homv (W, 3); - - // interpolate first two lines - interpolate_row_g (gh[0], gv[0], 0); - interpolate_row_g (gh[1], gv[1], 1); - interpolate_row_g (gh[2], gv[2], 2); - interpolate_row_rb (rh[0], bh[0], nullptr, gh[0], gh[1], 0); - interpolate_row_rb (rv[0], bv[0], nullptr, gv[0], gv[1], 0); - interpolate_row_rb (rh[1], bh[1], gh[0], gh[1], gh[2], 1); - interpolate_row_rb (rv[1], bv[1], gv[0], gv[1], gv[2], 1); - - convert_to_cielab_row (rh[0], gh[0], bh[0], lLh[0], lah[0], lbh[0]); - convert_to_cielab_row (rv[0], gv[0], bv[0], lLv[0], lav[0], lbv[0]); - convert_to_cielab_row (rh[1], gh[1], bh[1], lLh[1], lah[1], lbh[1]); - convert_to_cielab_row (rv[1], gv[1], bv[1], lLv[1], lav[1], lbv[1]); - - for (int j = 0; j < W; j++) { - homh[0][j] = 0; - homv[0][j] = 0; - homh[1][j] = 0; - homv[1][j] = 0; - } - - int dLmaph[9]; - int dLmapv[9]; - int dCamaph[9]; - int dCamapv[9]; - int dCbmaph[9]; - int dCbmapv[9]; - - for (int i = 1; i < H - 1; i++) { - int ix = i % 3; - int imx = (i - 1) % 3; - int ipx = (i + 1) % 3; - - if (i < H - 2) { - interpolate_row_g (gh[(i + 2) % 4], gv[(i + 2) % 4], i + 2); - interpolate_row_rb (rh[(i + 1) % 3], bh[(i + 1) % 3], gh[i % 4], gh[(i + 1) % 4], gh[(i + 2) % 4], i + 1); - interpolate_row_rb (rv[(i + 1) % 3], bv[(i + 1) % 3], gv[i % 4], gv[(i + 1) % 4], gv[(i + 2) % 4], i + 1); - } else { - interpolate_row_rb (rh[(i + 1) % 3], bh[(i + 1) % 3], gh[i % 4], gh[(i + 1) % 4], nullptr, i + 1); - interpolate_row_rb (rv[(i + 1) % 3], bv[(i + 1) % 3], gv[i % 4], gv[(i + 1) % 4], nullptr, i + 1); - } - - convert_to_cielab_row (rh[(i + 1) % 3], gh[(i + 1) % 4], bh[(i + 1) % 3], lLh[(i + 1) % 3], lah[(i + 1) % 3], lbh[(i + 1) % 3]); - convert_to_cielab_row (rv[(i + 1) % 3], gv[(i + 1) % 4], bv[(i + 1) % 3], lLv[(i + 1) % 3], lav[(i + 1) % 3], lbv[(i + 1) % 3]); - - for (int j = 0; j < W; j++) { - homh[ipx][j] = 0; - homv[ipx][j] = 0; - } - - int sh, sv, idx; - - for (int j = 1; j < W - 1; j++) { - int dmi = 0; - - for (int x = -1; x <= 1; x++) { - idx = (i + x) % 3; - - for (int y = -1; y <= 1; y++) { - // compute distance in a, b, and L - if (dmi < 4) { - sh = homh[idx][j + y]; - sv = homv[idx][j + y]; - - if (sh > sv) { // fixate horizontal pixel - dLmaph[dmi] = DIST(lLh[ix][j], lLh[idx][j + y]); - dCamaph[dmi] = DIST(lah[ix][j], lah[idx][j + y]); - dCbmaph[dmi] = DIST(lbh[ix][j], lbh[idx][j + y]); - dLmapv[dmi] = DIST(lLv[ix][j], lLh[idx][j + y]); - dCamapv[dmi] = DIST(lav[ix][j], lah[idx][j + y]); - dCbmapv[dmi] = DIST(lbv[ix][j], lbh[idx][j + y]); - } else if (sh < sv) { - dLmaph[dmi] = DIST(lLh[ix][j], lLv[idx][j + y]); - dCamaph[dmi] = DIST(lah[ix][j], lav[idx][j + y]); - dCbmaph[dmi] = DIST(lbh[ix][j], lbv[idx][j + y]); - dLmapv[dmi] = DIST(lLv[ix][j], lLv[idx][j + y]); - dCamapv[dmi] = DIST(lav[ix][j], lav[idx][j + y]); - dCbmapv[dmi] = DIST(lbv[ix][j], lbv[idx][j + y]); - } else { - dLmaph[dmi] = DIST(lLh[ix][j], lLh[idx][j + y]); - dCamaph[dmi] = DIST(lah[ix][j], lah[idx][j + y]); - dCbmaph[dmi] = DIST(lbh[ix][j], lbh[idx][j + y]); - dLmapv[dmi] = DIST(lLv[ix][j], lLv[idx][j + y]); - dCamapv[dmi] = DIST(lav[ix][j], lav[idx][j + y]); - dCbmapv[dmi] = DIST(lbv[ix][j], lbv[idx][j + y]); - } - } else { - dLmaph[dmi] = DIST(lLh[ix][j], lLh[idx][j + y]); - dCamaph[dmi] = DIST(lah[ix][j], lah[idx][j + y]); - dCbmaph[dmi] = DIST(lbh[ix][j], lbh[idx][j + y]); - dLmapv[dmi] = DIST(lLv[ix][j], lLv[idx][j + y]); - dCamapv[dmi] = DIST(lav[ix][j], lav[idx][j + y]); - dCbmapv[dmi] = DIST(lbv[ix][j], lbv[idx][j + y]); - } - - dmi++; - } - } - - // compute eL & eC - int eL = min(max(dLmaph[3], dLmaph[5]), max(dLmapv[1], dLmapv[7])); - int eCa = min(max(dCamaph[3], dCamaph[5]), max(dCamapv[1], dCamapv[7])); - int eCb = min(max(dCbmaph[3], dCbmaph[5]), max(dCbmapv[1], dCbmapv[7])); - - int wh = 0; - - for (int dmi = 0; dmi < 9; dmi++) - if (dLmaph[dmi] <= eL && dCamaph[dmi] <= eCa && dCbmaph[dmi] <= eCb) { - wh++; - } - - int wv = 0; - - for (int dmi = 0; dmi < 9; dmi++) - if (dLmapv[dmi] <= eL && dCamapv[dmi] <= eCa && dCbmapv[dmi] <= eCb) { - wv++; - } - - homh[imx][j - 1] += wh; - homh[imx][j] += wh; - homh[imx][j + 1] += wh; - homh[ix][j - 1] += wh; - homh[ix][j] += wh; - homh[ix][j + 1] += wh; - homh[ipx][j - 1] += wh; - homh[ipx][j] += wh; - homh[ipx][j + 1] += wh; - - homv[imx][j - 1] += wv; - homv[imx][j] += wv; - homv[imx][j + 1] += wv; - homv[ix][j - 1] += wv; - homv[ix][j] += wv; - homv[ix][j + 1] += wv; - homv[ipx][j - 1] += wv; - homv[ipx][j] += wv; - homv[ipx][j + 1] += wv; - } - -//} - // finalize image - int hc, vc; - - for (int j = 0; j < W; j++) { - if (ri->ISGREEN(i - 1, j)) { - green[i - 1][j] = rawData[i - 1][j]; - } else { - hc = homh[imx][j]; - vc = homv[imx][j]; - - if (hc > vc) { - green[i - 1][j] = gh[(i - 1) % 4][j]; - } else if (hc < vc) { - green[i - 1][j] = gv[(i - 1) % 4][j]; - } else { - green[i - 1][j] = (gh[(i - 1) % 4][j] + gv[(i - 1) % 4][j]) / 2; - } - } - } - - if (!(i % 20) && plistener) { - plistener->setProgress ((double)i / (H - 2)); - } - } - - // finish H-2th and H-1th row, homogenity value is still valailable - int hc, vc; - - for (int i = H - 1; i < H + 1; i++) - for (int j = 0; j < W; j++) { - hc = homh[(i - 1) % 3][j]; - vc = homv[(i - 1) % 3][j]; - - if (hc > vc) { - green[i - 1][j] = gh[(i - 1) % 4][j]; - } else if (hc < vc) { - green[i - 1][j] = gv[(i - 1) % 4][j]; - } else { - green[i - 1][j] = (gh[(i - 1) % 4][j] + gv[(i - 1) % 4][j]) / 2; - } - } - - // Interpolate R and B - for (int i = 0; i < H; i++) { - if (i == 0) { - interpolate_row_rb_mul_pp (rawData, red[i], blue[i], nullptr, green[i], green[i + 1], i, 1.0, 1.0, 1.0, 0, W, 1); - } else if (i == H - 1) { - interpolate_row_rb_mul_pp (rawData, red[i], blue[i], green[i - 1], green[i], nullptr, i, 1.0, 1.0, 1.0, 0, W, 1); - } else { - interpolate_row_rb_mul_pp (rawData, red[i], blue[i], green[i - 1], green[i], green[i + 1], i, 1.0, 1.0, 1.0, 0, W, 1); - } - } -} - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - void RawImageSource::hphd_vertical (float** hpmap, int col_from, int col_to) { float* temp = new float[max(W, H)]; diff --git a/rtengine/diagonalcurves.cc b/rtengine/diagonalcurves.cc index a3b00b165..f478ba719 100644 --- a/rtengine/diagonalcurves.cc +++ b/rtengine/diagonalcurves.cc @@ -86,7 +86,8 @@ DiagonalCurve::DiagonalCurve (const std::vector& p, int poly_pn) if (!identity) { if (kind == DCT_Spline && N > 2) { - spline_cubic_set (); + //spline_cubic_set (); + catmull_rom_set(); } else if (kind == DCT_NURBS && N > 2) { NURBS_set (); fillHash(); @@ -270,6 +271,164 @@ void DiagonalCurve::NURBS_set () fillDyByDx(); } + +/***************************************************************************** + * Catmull Rom Spline + * (https://en.wikipedia.org/wiki/Centripetal_Catmull%E2%80%93Rom_spline) + *****************************************************************************/ + +namespace { + +inline double pow2(double x) +{ + return x*x; +} + + +inline double catmull_rom_tj(double ti, + double xi, double yi, + double xj, double yj) +{ + // see https://github.com/Beep6581/RawTherapee/pull/4701#issuecomment-414054187 + static constexpr double alpha = 0.375; + return pow(sqrt(pow2(xj-xi) + pow2(yj-yi)), alpha) + ti; +} + + +inline void catmull_rom_spline(int n_points, + double p0_x, double p0_y, + double p1_x, double p1_y, + double p2_x, double p2_y, + double p3_x, double p3_y, + std::vector &res_x, + std::vector &res_y) +{ + res_x.reserve(n_points); + res_y.reserve(n_points); + + double t0 = 0; + double t1 = catmull_rom_tj(t0, p0_x, p0_y, p1_x, p1_y); + double t2 = catmull_rom_tj(t1, p1_x, p1_y, p2_x, p2_y); + double t3 = catmull_rom_tj(t2, p2_x, p2_y, p3_x, p3_y); + + double space = (t2-t1) / n_points; + + double t; + int i; + double c, d, A1_x, A1_y, A2_x, A2_y, A3_x, A3_y; + double B1_x, B1_y, B2_x, B2_y, C_x, C_y; + + res_x.push_back(p1_x); + res_y.push_back(p1_y); + + // special case, a segment at 0 or 1 is computed exactly + if (p1_y == p2_y && (p1_y == 0 || p1_y == 1)) { + for (i = 1; i < n_points-1; ++i) { + t = p1_x + space * i; + res_x.push_back(t); + res_y.push_back(p1_y); + } + } else { + for (i = 1; i < n_points-1; ++i) { + t = t1 + space * i; + + c = (t1 - t)/(t1 - t0); + d = (t - t0)/(t1 - t0); + A1_x = c * p0_x + d * p1_x; + A1_y = c * p0_y + d * p1_y; + + c = (t2 - t)/(t2 - t1); + d = (t - t1)/(t2 - t1); + A2_x = c * p1_x + d * p2_x; + A2_y = c * p1_y + d * p2_y; + + c = (t3 - t)/(t3 - t2); + d = (t - t2)/(t3 - t2); + A3_x = c * p2_x + d * p3_x; + A3_y = c * p2_y + d * p3_y; + + c = (t2 - t)/(t2 - t0); + d = (t - t0)/(t2 - t0); + B1_x = c * A1_x + d * A2_x; + B1_y = c * A1_y + d * A2_y; + + c = (t3 - t)/(t3 - t1); + d = (t - t1)/(t3 - t1); + B2_x = c * A2_x + d * A3_x; + B2_y = c * A2_y + d * A3_y; + + c = (t2 - t)/(t2 - t1); + d = (t - t1)/(t2 - t1); + C_x = c * B1_x + d * B2_x; + C_y = c * B1_y + d * B2_y; + + res_x.push_back(C_x); + res_y.push_back(C_y); + } + } + + res_x.push_back(p2_x); + res_y.push_back(p2_y); +} + + +inline void catmull_rom_reflect(double px, double py, double cx, double cy, + double &rx, double &ry) +{ +#if 0 + double dx = px - cx; + double dy = py - cy; + rx = cx - dx; + ry = cy - dy; +#else + // see https://github.com/Beep6581/RawTherapee/pull/4701#issuecomment-414054187 + static constexpr double epsilon = 1e-5; + double dx = px - cx; + double dy = py - cy; + rx = cx - dx * 0.01; + ry = dx > epsilon ? (dy / dx) * (rx - cx) + cy : cy; +#endif +} + + +void catmull_rom_chain(int n_points, int n_cp, double *x, double *y, + std::vector &res_x, std::vector &res_y) +{ + double x_first, y_first; + double x_last, y_last; + catmull_rom_reflect(x[1], y[1], x[0], y[0], x_first, y_first); + catmull_rom_reflect(x[n_cp-2], y[n_cp-2], x[n_cp-1], y[n_cp-1], x_last, y_last); + + int segments = n_cp - 1; + + res_x.reserve(n_points); + res_y.reserve(n_points); + + for (int i = 0; i < segments; ++i) { + int n = max(int(n_points * (x[i+1] - x[i]) + 0.5), 2); + catmull_rom_spline( + n, i == 0 ? x_first : x[i-1], i == 0 ? y_first : y[i-1], + x[i], y[i], x[i+1], y[i+1], + i == segments-1 ? x_last : x[i+2], + i == segments-1 ? y_last : y[i+2], + res_x, res_y); + } +} + +} // namespace + + +void DiagonalCurve::catmull_rom_set() +{ + int n_points = max(ppn * 65, 65000); + poly_x.clear(); + poly_y.clear(); + catmull_rom_chain(n_points, N, x, y, poly_x, poly_y); +} + +/*****************************************************************************/ + + double DiagonalCurve::getVal (double t) const { @@ -300,7 +459,8 @@ double DiagonalCurve::getVal (double t) const } case DCT_Linear : - case DCT_Spline : { + // case DCT_Spline : + { // values under and over the first and last point if (t > x[N - 1]) { return y[N - 1]; @@ -324,20 +484,33 @@ double DiagonalCurve::getVal (double t) const double h = x[k_hi] - x[k_lo]; // linear - if (kind == DCT_Linear) { + // if (kind == DCT_Linear) { return y[k_lo] + (t - x[k_lo]) * ( y[k_hi] - y[k_lo] ) / h; - } - // spline curve - else { // if (kind==Spline) { - double a = (x[k_hi] - t) / h; - double b = (t - x[k_lo]) / h; - double r = a * y[k_lo] + b * y[k_hi] + ((a * a * a - a) * ypp[k_lo] + (b * b * b - b) * ypp[k_hi]) * (h * h) * 0.1666666666666666666666666666666; - return CLIPD(r); - } + // } + // // spline curve + // else { // if (kind==Spline) { + // double a = (x[k_hi] - t) / h; + // double b = (t - x[k_lo]) / h; + // double r = a * y[k_lo] + b * y[k_hi] + ((a * a * a - a) * ypp[k_lo] + (b * b * b - b) * ypp[k_hi]) * (h * h) * 0.1666666666666666666666666666666; + // return CLIPD(r); + // } break; } + case DCT_Spline: { + auto it = std::lower_bound(poly_x.begin(), poly_x.end(), t); + if (it == poly_x.end()) { + return poly_y.back(); + } + auto d = it - poly_x.begin(); + if (it+1 < poly_x.end() && t - *it > *(it+1) - t) { + ++d; + } + return LIM01(*(poly_y.begin() + d)); + break; + } + case DCT_NURBS : { // get the hash table entry by rounding the value (previously multiplied by "hashSize") unsigned short int i = (unsigned short int)(t * hashSize); diff --git a/rtengine/eahd_demosaic.cc b/rtengine/eahd_demosaic.cc new file mode 100644 index 000000000..aef016386 --- /dev/null +++ b/rtengine/eahd_demosaic.cc @@ -0,0 +1,446 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2004-2018 Gabor Horvath and other RawTherapee contributors + * Split out to own compilation unit and made speedup 2018 Ingo Weyrich (heckflosse67@gmx.de) + * + * RawTherapee is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RawTherapee is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RawTherapee. If not, see . + */ +#include + +#include "color.h" +#include "rawimagesource.h" +#include "rawimagesource_i.h" +#include "jaggedarray.h" +#include "rawimage.h" +#include "iccmatrices.h" +#include "rt_math.h" +#include "../rtgui/multilangmgr.h" +#include "procparams.h" +//#define BENCHMARK +#include "StopWatch.h" + +using namespace std; + +namespace rtengine +{ + + +inline void RawImageSource::interpolate_row_g (float* agh, float* agv, int i) +{ + + for (int j = 0; j < W; j++) { + if (ri->ISGREEN(i, j)) { + agh[j] = rawData[i][j]; + agv[j] = rawData[i][j]; + } else { + int gh = 0; + int gv = 0; + + if (j > 1 && j < W - 2) { + gh = (-rawData[i][j - 2] + 2 * rawData[i][j - 1] + 2 * rawData[i][j] + 2 * rawData[i][j + 1] - rawData[i][j + 2]) / 4; + int maxgh = max(rawData[i][j - 1], rawData[i][j + 1]); + int mingh = min(rawData[i][j - 1], rawData[i][j + 1]); + + if (gh > maxgh) { + gh = maxgh; + } else if (gh < mingh) { + gh = mingh; + } + } else if (j == 0) { + gh = rawData[i][1]; + } else if (j == 1) { + gh = (rawData[i][0] + rawData[i][2]) / 2; + } else if (j == W - 1) { + gh = rawData[i][W - 2]; + } else if (j == W - 2) { + gh = (rawData[i][W - 1] + rawData[i][W - 3]) / 2; + } + + if (i > 1 && i < H - 2) { + gv = (-rawData[i - 2][j] + 2 * rawData[i - 1][j] + 2 * rawData[i][j] + 2 * rawData[i + 1][j] - rawData[i + 2][j]) / 4; + int maxgv = max(rawData[i - 1][j], rawData[i + 1][j]); + int mingv = min(rawData[i - 1][j], rawData[i + 1][j]); + + if (gv > maxgv) { + gv = maxgv; + } else if (gv < mingv) { + gv = mingv; + } + } else if (i == 0) { + gv = rawData[1][j]; + } else if (i == 1) { + gv = (rawData[0][j] + rawData[2][j]) / 2; + } else if (i == H - 1) { + gv = rawData[H - 2][j]; + } else if (i == H - 2) { + gv = (rawData[H - 1][j] + rawData[H - 3][j]) / 2; + } + + agh[j] = gh; + agv[j] = gv; + } + } +} + +inline void RawImageSource::interpolate_row_rb (float* ar, float* ab, float* pg, float* cg, float* ng, int i) +{ + const auto getPg = [pg](int index) { + return + pg + ? pg[index] + : 0.f; + }; + + const auto getNg = [ng](int index) { + return + ng + ? ng[index] + : 0.f; + }; + + float *nonGreen1 = ar; + float *nonGreen2 = ab; + + if ((ri->ISBLUE(i, 0) || ri->ISBLUE(i, 1))) { + std::swap(nonGreen1, nonGreen2); + } + int j = FC(i, 0) & 1; + if (j) { + // linear R-G interp. horizontally + float val1; + + val1 = cg[0] + rawData[i][1] - cg[1]; + + nonGreen1[0] = CLIP(val1); + // linear B-G interp. vertically + float val2; + + if (i == 0) { + val2 = getNg(0) + rawData[1][0] - cg[0]; + } else if (i == H - 1) { + val2 = getPg(0) + rawData[H - 2][0] - cg[0]; + } else { + val2 = cg[0] + (rawData[i - 1][0] - getPg(0) + rawData[i + 1][0] - getNg(0)) / 2; + } + + nonGreen2[0] = val2; + } + // RGRGR or GRGRGR line + for (; j < W - 1; j += 2) { + // nonGreen of row is simple + nonGreen1[j] = rawData[i][j]; + // non green of next row: cross interpolation + float nonGreen = 0.f; + int n = 0; + + if (i > 0) { + if (j > 0) { + nonGreen += rawData[i - 1][j - 1] - getPg(j - 1); + n++; + } + nonGreen += rawData[i - 1][j + 1] - getPg(j + 1); + n++; + } + + if (i < H - 1) { + if (j > 0) { + nonGreen += rawData[i + 1][j - 1] - getNg(j - 1); + n++; + } + nonGreen += rawData[i + 1][j + 1] - getNg(j + 1); + n++; + } + + nonGreen2[j] = cg[j] + nonGreen / n; + + // linear R-G interp. horizontally + float val1; + + if (j == W - 2) { + val1 = cg[W - 1] + rawData[i][W - 2] - cg[W - 2]; + } else { + val1 = cg[j + 1] + (rawData[i][j] - cg[j] + rawData[i][j + 2] - cg[j + 2]) / 2; + } + + nonGreen1[j + 1] = CLIP(val1); + // linear B-G interp. vertically + float val2; + + if (i == 0) { + val2 = getNg(j + 1) + rawData[1][j + 1] - cg[j + 1]; + } else if (i == H - 1) { + val2 = getPg(j + 1) + rawData[H - 2][j + 1] - cg[j + 1]; + } else { + val2 = cg[j + 1] + (rawData[i - 1][j + 1] - getPg(j + 1) + rawData[i + 1][j + 1] - getNg(j + 1)) / 2; + } + + nonGreen2[j + 1] = val2; + } + + if(j == W - 1) { + // nonGreen of row is simple + nonGreen1[j] = rawData[i][j]; + // non green of next row: cross interpolation + float nonGreen = 0.f; + int n = 0; + + if (i > 0) { + nonGreen += rawData[i - 1][j - 1] - getPg(j - 1); + n++; + } + + if (i < H - 1) { + nonGreen += rawData[i + 1][j - 1] - getNg(j - 1); + n++; + } + + nonGreen2[j] = cg[j] + nonGreen / n; + } +} + +#define DIST(a,b) (std::fabs(a-b)) + +void RawImageSource::eahd_demosaic () +{ + BENCHFUN + if (plistener) { + plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::EAHD))); + plistener->setProgress (0.0); + } + + // prepare constants for cielab conversion + //TODO: revisit after conversion to D50 illuminant + const float lc00 = (0.412453 * imatrices.rgb_cam[0][0] + 0.357580 * imatrices.rgb_cam[0][1] + 0.180423 * imatrices.rgb_cam[0][2]) ;// / 0.950456; + const float lc01 = (0.412453 * imatrices.rgb_cam[1][0] + 0.357580 * imatrices.rgb_cam[1][1] + 0.180423 * imatrices.rgb_cam[1][2]) ;// / 0.950456; + const float lc02 = (0.412453 * imatrices.rgb_cam[2][0] + 0.357580 * imatrices.rgb_cam[2][1] + 0.180423 * imatrices.rgb_cam[2][2]) ;// / 0.950456; + + const float lc10 = 0.212671 * imatrices.rgb_cam[0][0] + 0.715160 * imatrices.rgb_cam[0][1] + 0.072169 * imatrices.rgb_cam[0][2]; + const float lc11 = 0.212671 * imatrices.rgb_cam[1][0] + 0.715160 * imatrices.rgb_cam[1][1] + 0.072169 * imatrices.rgb_cam[1][2]; + const float lc12 = 0.212671 * imatrices.rgb_cam[2][0] + 0.715160 * imatrices.rgb_cam[2][1] + 0.072169 * imatrices.rgb_cam[2][2]; + + const float lc20 = (0.019334 * imatrices.rgb_cam[0][0] + 0.119193 * imatrices.rgb_cam[0][1] + 0.950227 * imatrices.rgb_cam[0][2]) ;// / 1.088754; + const float lc21 = (0.019334 * imatrices.rgb_cam[1][0] + 0.119193 * imatrices.rgb_cam[1][1] + 0.950227 * imatrices.rgb_cam[1][2]) ;// / 1.088754; + const float lc22 = (0.019334 * imatrices.rgb_cam[2][0] + 0.119193 * imatrices.rgb_cam[2][1] + 0.950227 * imatrices.rgb_cam[2][2]) ;// / 1.088754; + + const float wp[3][3] = {{lc00, lc01, lc02}, {lc10, lc11, lc12}, {lc20, lc21, lc22}}; + + // end of cielab preparation + + JaggedArray + rh (W, 3), gh (W, 4), bh (W, 3), + rv (W, 3), gv (W, 4), bv (W, 3), + lLh (W, 3), lah (W, 3), lbh (W, 3), + lLv (W, 3), lav (W, 3), lbv (W, 3); + JaggedArray homh (W, 3), homv (W, 3); + + // interpolate first two lines + interpolate_row_g (gh[0], gv[0], 0); + interpolate_row_g (gh[1], gv[1], 1); + interpolate_row_g (gh[2], gv[2], 2); + interpolate_row_rb (rh[0], bh[0], nullptr, gh[0], gh[1], 0); + interpolate_row_rb (rv[0], bv[0], nullptr, gv[0], gv[1], 0); + interpolate_row_rb (rh[1], bh[1], gh[0], gh[1], gh[2], 1); + interpolate_row_rb (rv[1], bv[1], gv[0], gv[1], gv[2], 1); + + Color::RGB2Lab(rh[0], gh[0], bh[0], lLh[0], lah[0], lbh[0], wp, W); + Color::RGB2Lab(rv[0], gv[0], bv[0], lLv[0], lav[0], lbv[0], wp, W); + Color::RGB2Lab(rh[1], gh[1], bh[1], lLh[1], lah[1], lbh[1], wp, W); + Color::RGB2Lab(rv[1], gv[1], bv[1], lLv[1], lav[1], lbv[1], wp, W); + + for (int j = 0; j < W; j++) { + homh[0][j] = 0; + homv[0][j] = 0; + homh[1][j] = 0; + homv[1][j] = 0; + } + + float dLmaph[9]; + float dLmapv[9]; + float dCamaph[9]; + float dCamapv[9]; + float dCbmaph[9]; + float dCbmapv[9]; + + for (int i = 1; i < H - 1; i++) { + int mod[3] = {(i-1) % 3, i % 3, (i+1) %3}; + int ix = i % 3; + int imx = (i - 1) % 3; + int ipx = (i + 1) % 3; + + if (i < H - 2) { + interpolate_row_g (gh[(i + 2) % 4], gv[(i + 2) % 4], i + 2); + interpolate_row_rb (rh[(i + 1) % 3], bh[(i + 1) % 3], gh[i % 4], gh[(i + 1) % 4], gh[(i + 2) % 4], i + 1); + interpolate_row_rb (rv[(i + 1) % 3], bv[(i + 1) % 3], gv[i % 4], gv[(i + 1) % 4], gv[(i + 2) % 4], i + 1); + } else { + interpolate_row_rb (rh[(i + 1) % 3], bh[(i + 1) % 3], gh[i % 4], gh[(i + 1) % 4], nullptr, i + 1); + interpolate_row_rb (rv[(i + 1) % 3], bv[(i + 1) % 3], gv[i % 4], gv[(i + 1) % 4], nullptr, i + 1); + } + + Color::RGB2Lab(rh[(i + 1) % 3], gh[(i + 1) % 4], bh[(i + 1) % 3], lLh[(i + 1) % 3], lah[(i + 1) % 3], lbh[(i + 1) % 3], wp, W); + Color::RGB2Lab(rv[(i + 1) % 3], gv[(i + 1) % 4], bv[(i + 1) % 3], lLv[(i + 1) % 3], lav[(i + 1) % 3], lbv[(i + 1) % 3], wp, W); + + for (int j = 0; j < W; j++) { + homh[ipx][j] = 0; + homv[ipx][j] = 0; + } + + for (int j = 1; j < W - 1; j++) { + int dmi = 0; + for (int x = -1; x <= 0; x++) { + int idx = mod[x + 1]; + + for (int y = -1; y <= 1; y++) { + // compute distance in a, b, and L + if (dmi < 4) { + int sh = homh[idx][j + y]; + int sv = homv[idx][j + y]; + + if (sh > sv) { // fixate horizontal pixel + dLmaph[dmi] = DIST(lLh[ix][j], lLh[idx][j + y]); + dCamaph[dmi] = DIST(lah[ix][j], lah[idx][j + y]); + dCbmaph[dmi] = DIST(lbh[ix][j], lbh[idx][j + y]); + dLmapv[dmi] = DIST(lLv[ix][j], lLh[idx][j + y]); + dCamapv[dmi] = DIST(lav[ix][j], lah[idx][j + y]); + dCbmapv[dmi] = DIST(lbv[ix][j], lbh[idx][j + y]); + } else if (sh < sv) { + dLmaph[dmi] = DIST(lLh[ix][j], lLv[idx][j + y]); + dCamaph[dmi] = DIST(lah[ix][j], lav[idx][j + y]); + dCbmaph[dmi] = DIST(lbh[ix][j], lbv[idx][j + y]); + dLmapv[dmi] = DIST(lLv[ix][j], lLv[idx][j + y]); + dCamapv[dmi] = DIST(lav[ix][j], lav[idx][j + y]); + dCbmapv[dmi] = DIST(lbv[ix][j], lbv[idx][j + y]); + } else { + dLmaph[dmi] = DIST(lLh[ix][j], lLh[idx][j + y]); + dCamaph[dmi] = DIST(lah[ix][j], lah[idx][j + y]); + dCbmaph[dmi] = DIST(lbh[ix][j], lbh[idx][j + y]); + dLmapv[dmi] = DIST(lLv[ix][j], lLv[idx][j + y]); + dCamapv[dmi] = DIST(lav[ix][j], lav[idx][j + y]); + dCbmapv[dmi] = DIST(lbv[ix][j], lbv[idx][j + y]); + } + } else { + dLmaph[dmi] = DIST(lLh[ix][j], lLh[idx][j + y]); + dCamaph[dmi] = DIST(lah[ix][j], lah[idx][j + y]); + dCbmaph[dmi] = DIST(lbh[ix][j], lbh[idx][j + y]); + dLmapv[dmi] = DIST(lLv[ix][j], lLv[idx][j + y]); + dCamapv[dmi] = DIST(lav[ix][j], lav[idx][j + y]); + dCbmapv[dmi] = DIST(lbv[ix][j], lbv[idx][j + y]); + } + + dmi++; + } + } + int idx = mod[2]; + + for (int y = -1; y <= 1; y++) { + // compute distance in a, b, and L + dLmaph[dmi] = DIST(lLh[ix][j], lLh[idx][j + y]); + dCamaph[dmi] = DIST(lah[ix][j], lah[idx][j + y]); + dCbmaph[dmi] = DIST(lbh[ix][j], lbh[idx][j + y]); + dLmapv[dmi] = DIST(lLv[ix][j], lLv[idx][j + y]); + dCamapv[dmi] = DIST(lav[ix][j], lav[idx][j + y]); + dCbmapv[dmi] = DIST(lbv[ix][j], lbv[idx][j + y]); + dmi++; + } + + // compute eL & eC + float eL = min(max(dLmaph[3], dLmaph[5]), max(dLmapv[1], dLmapv[7])); + float eCa = min(max(dCamaph[3], dCamaph[5]), max(dCamapv[1], dCamapv[7])); + float eCb = min(max(dCbmaph[3], dCbmaph[5]), max(dCbmapv[1], dCbmapv[7])); + + int wh = 0; + + for (int dmi = 0; dmi < 9; dmi++) { + wh += (dLmaph[dmi] <= eL) * (dCamaph[dmi] <= eCa) * (dCbmaph[dmi] <= eCb); + } + + homh[imx][j - 1] += wh; + homh[imx][j] += wh; + homh[imx][j + 1] += wh; + homh[ix][j - 1] += wh; + homh[ix][j] += wh; + homh[ix][j + 1] += wh; + homh[ipx][j - 1] += wh; + homh[ipx][j] += wh; + homh[ipx][j + 1] += wh; + + int wv = 0; + + for (int dmi = 0; dmi < 9; dmi++) { + wv += (dLmapv[dmi] <= eL) * (dCamapv[dmi] <= eCa) * (dCbmapv[dmi] <= eCb); + } + + homv[imx][j - 1] += wv; + homv[imx][j] += wv; + homv[imx][j + 1] += wv; + homv[ix][j - 1] += wv; + homv[ix][j] += wv; + homv[ix][j + 1] += wv; + homv[ipx][j - 1] += wv; + homv[ipx][j] += wv; + homv[ipx][j + 1] += wv; + } + + // finalize image + for (int j = 0; j < W; j++) { + if (ri->ISGREEN(i - 1, j)) { + green[i - 1][j] = rawData[i - 1][j]; + } else { + int hc = homh[imx][j]; + int vc = homv[imx][j]; + + if (hc > vc) { + green[i - 1][j] = gh[(i - 1) % 4][j]; + } else if (hc < vc) { + green[i - 1][j] = gv[(i - 1) % 4][j]; + } else { + green[i - 1][j] = (gh[(i - 1) % 4][j] + gv[(i - 1) % 4][j]) / 2; + } + } + } + + if (!(i % 20) && plistener) { + plistener->setProgress ((double)i / (H - 2)); + } + } + + // finish H-2th and H-1th row, homogenity value is still valailable + for (int i = H - 1; i < H + 1; i++) + for (int j = 0; j < W; j++) { + int hc = homh[(i - 1) % 3][j]; + int vc = homv[(i - 1) % 3][j]; + + if (hc > vc) { + green[i - 1][j] = gh[(i - 1) % 4][j]; + } else if (hc < vc) { + green[i - 1][j] = gv[(i - 1) % 4][j]; + } else { + green[i - 1][j] = (gh[(i - 1) % 4][j] + gv[(i - 1) % 4][j]) / 2; + } + } + + // Interpolate R and B + #pragma omp parallel for + for (int i = 0; i < H; i++) { + if (i == 0) { + interpolate_row_rb_mul_pp (rawData, red[i], blue[i], nullptr, green[i], green[i + 1], i, 1.0, 1.0, 1.0, 0, W, 1); + } else if (i == H - 1) { + interpolate_row_rb_mul_pp (rawData, red[i], blue[i], green[i - 1], green[i], nullptr, i, 1.0, 1.0, 1.0, 0, W, 1); + } else { + interpolate_row_rb_mul_pp (rawData, red[i], blue[i], green[i - 1], green[i], green[i + 1], i, 1.0, 1.0, 1.0, 0, W, 1); + } + } +} + +} \ No newline at end of file diff --git a/rtengine/histmatching.cc b/rtengine/histmatching.cc index 2dfcc6d3b..b2fe436fd 100644 --- a/rtengine/histmatching.cc +++ b/rtengine/histmatching.cc @@ -97,6 +97,55 @@ int findMatch(int val, const std::vector &cdf, int j) } +class CubicSplineCurve: public DiagonalCurve { +public: + CubicSplineCurve(const std::vector &points): + DiagonalCurve({DCT_Linear}) + { + N = points.size() / 2; + x = new double[N]; + y = new double[N]; + + for (int i = 0; i < N; ++i) { + x[i] = points[2*i]; + y[i] = points[2*i+1]; + } + kind = DCT_Spline; + spline_cubic_set(); + } + + double getVal(double t) const + { + // values under and over the first and last point + if (t > x[N - 1]) { + return y[N - 1]; + } else if (t < x[0]) { + return y[0]; + } + + // do a binary search for the right interval: + unsigned int k_lo = 0, k_hi = N - 1; + + while (k_hi > 1 + k_lo) { + unsigned int k = (k_hi + k_lo) / 2; + + if (x[k] > t) { + k_hi = k; + } else { + k_lo = k; + } + } + + double h = x[k_hi] - x[k_lo]; + + double a = (x[k_hi] - t) / h; + double b = (t - x[k_lo]) / h; + double r = a * y[k_lo] + b * y[k_hi] + ((a * a * a - a) * ypp[k_lo] + (b * b * b - b) * ypp[k_hi]) * (h * h) * 0.1666666666666666666666666666666; + return LIM01(r); + } +}; + + void mappingToCurve(const std::vector &mapping, std::vector &curve) { curve.clear(); @@ -117,8 +166,9 @@ void mappingToCurve(const std::vector &mapping, std::vector &curve) auto coord = [](int v) -> double { return double(v)/255.0; }; auto doit = - [&](int start, int stop, int step, bool addstart) -> void + [&](int start, int stop, int step, bool addstart, int maxdelta=0) -> void { + if (!maxdelta) maxdelta = step * 2; int prev = start; if (addstart && mapping[start] >= 0) { curve.push_back(coord(start)); @@ -131,7 +181,7 @@ void mappingToCurve(const std::vector &mapping, std::vector &curve) } bool change = i > 0 && v != mapping[i-1]; int diff = i - prev; - if ((change && std::abs(diff - step) <= 1) || diff > step * 2) { + if ((change && std::abs(diff - step) <= 1) || diff > maxdelta) { curve.push_back(coord(i)); curve.push_back(coord(v)); prev = i; @@ -152,24 +202,36 @@ void mappingToCurve(const std::vector &mapping, std::vector &curve) int end = mapping.size(); if (idx <= end / 3) { doit(start, idx, idx / 2, true); - doit(idx, end, (end - idx) / 3, false); + step = (end - idx) / 4; + doit(idx, end, step, false, step); } else { doit(start, idx, idx > step ? step : idx / 2, true); - doit(idx, int(mapping.size()), step, idx - step > step / 2 && std::abs(curve[curve.size()-2] - coord(idx)) > 0.01); + doit(idx, end, step, idx - step > step / 2 && std::abs(curve[curve.size()-2] - coord(idx)) > 0.01); } - if (curve.size() > 2 && (1 - curve[curve.size()-2] <= step / (256.0 * 3))) { + if (curve.size() > 2 && (1 - curve[curve.size()-2] <= coord(step) / 3)) { curve.pop_back(); curve.pop_back(); } - + curve.push_back(1.0); curve.push_back(1.0); if (curve.size() < 4) { curve = { DCT_Linear }; // not enough points, fall back to linear } else { - curve.insert(curve.begin(), DCT_Spline); + CubicSplineCurve c(curve); + double gap = 0.05; + double x = 0.0; + curve = { DCT_Spline }; + while (x < 1.0) { + curve.push_back(x); + curve.push_back(c.getVal(x)); + x += gap; + gap *= 1.4; + } + curve.push_back(1.0); + curve.push_back(c.getVal(1.0)); } } @@ -220,7 +282,7 @@ void RawImageSource::getAutoMatchedToneCurve(const ColorManagementParams &cp, st neutral.icm = cp; neutral.raw.bayersensor.method = RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::FAST); neutral.raw.xtranssensor.method = RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::FAST); - neutral.icm.outputProfile = "sRGB"; + neutral.icm.outputProfile = ColorManagementParams::NoICMString; std::unique_ptr source; { diff --git a/rtengine/iimage.h b/rtengine/iimage.h index d09f46a3a..503f7cd44 100644 --- a/rtengine/iimage.h +++ b/rtengine/iimage.h @@ -587,6 +587,14 @@ public: } } + void fill (T value) { + for (int i = 0; i < height; i++) { + for (int j = 0; j < width; j++) { + v(i, j) = value; + } + } + } + }; diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 50cab329d..3e9d7ab8f 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -497,7 +497,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, Crop* cropCall) progress("Exposure curve & CIELAB conversion...", 100 * readyphase / numofphases); - if (todo & M_AUTOEXP) { + if (todo & (M_AUTOEXP | M_RGBCURVE)) { if (params.icm.workingTRC == "Custom") { //exec TRC IN free Glib::ustring profile; profile = params.icm.workingProfile; diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 232533292..945eaf29f 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -4123,21 +4123,9 @@ void ImProcFunctions::luminanceCurve (LabImage* lold, LabImage* lnew, LUTf & cur void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW, LabImage* lold, LabImage* lnew, LUTf & acurve, LUTf & bcurve, LUTf & satcurve, LUTf & lhskcurve, LUTf & clcurve, LUTf & curve, bool utili, bool autili, bool butili, bool ccutili, bool cclutili, bool clcutili, LUTu &histCCurve, LUTu &histLCurve) { - if (!params->labCurve.enabled) { - if (params->blackwhite.enabled && !params->colorToning.enabled) { - for (int i = 0; i < lnew->H; ++i) { - for (int j = 0; j < lnew->W; ++j) { - lnew->a[i][j] = lnew->b[i][j] = 0.f; - } - } - } - return; - } - + int W = lold->W; int H = lold->H; - // lhskcurve.dump("lh_curve"); - //init Flatcurve for C=f(H) PlanarWhateverData* editWhatever = nullptr; EditUniqueID editID = EUID_None; @@ -4163,6 +4151,25 @@ void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW } } + if (!params->labCurve.enabled) { + if (editPipette && (editID == EUID_Lab_LCurve || editID == EUID_Lab_aCurve || editID == EUID_Lab_bCurve || editID == EUID_Lab_LHCurve || editID == EUID_Lab_CHCurve || editID == EUID_Lab_HHCurve || editID == EUID_Lab_CLCurve || editID == EUID_Lab_CCurve || editID == EUID_Lab_LCCurve)) { + // fill pipette buffer with zeros to avoid crashes + editWhatever->fill(0.f); + } + if (params->blackwhite.enabled && !params->colorToning.enabled) { + for (int i = 0; i < lnew->H; ++i) { + for (int j = 0; j < lnew->W; ++j) { + lnew->a[i][j] = lnew->b[i][j] = 0.f; + } + } + } + return; + } + + // lhskcurve.dump("lh_curve"); + //init Flatcurve for C=f(H) + + FlatCurve* chCurve = nullptr;// curve C=f(H) bool chutili = false; diff --git a/rtengine/ipresize.cc b/rtengine/ipresize.cc index f9ff94ef9..b3275b2e4 100644 --- a/rtengine/ipresize.cc +++ b/rtengine/ipresize.cc @@ -373,6 +373,7 @@ float ImProcFunctions::resizeScale (const ProcParams* params, int fw, int fh, in } else { dScale = (double)params->resize.height / (double)refh; } + dScale = (dScale > 1.0 && !params->resize.allowUpscaling) ? 1.0 : dScale; break; diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index e851cce9c..85a02c85e 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -448,17 +448,6 @@ RawImageSource::RawImageSource () , camInitialGain(0.0) , defGain(0.0) , ri(nullptr) - , lc00(0.0) - , lc01(0.0) - , lc02(0.0) - , lc10(0.0) - , lc11(0.0) - , lc12(0.0) - , lc20(0.0) - , lc21(0.0) - , lc22(0.0) - , cache(nullptr) - , threshold(0) , rawData(0, 0) , green(0, 0) , red(0, 0) @@ -491,10 +480,6 @@ RawImageSource::~RawImageSource () flushRGB(); flushRawData(); - if( cache ) { - delete [] cache; - } - if (camProfile) { cmsCloseProfile (camProfile); } @@ -2816,11 +2801,6 @@ void RawImageSource::retinex(const ColorManagementParams& cmp, const RetinexPara void RawImageSource::flushRawData() { - if(cache) { - delete [] cache; - cache = nullptr; - } - if (rawData) { rawData(0, 0); } diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index 53d3e0dc1..95c4dbe22 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -75,11 +75,6 @@ protected: unsigned int currFrame = 0; unsigned int numFrames = 0; - // to accelerate CIELAB conversion: - double lc00, lc01, lc02, lc10, lc11, lc12, lc20, lc21, lc22; - double* cache; - int threshold; - array2D rawData; // holds preprocessed pixel values, rowData[i][j] corresponds to the ith row and jth column array2D *rawDataFrames[4] = {nullptr}; array2D *rawDataBuffer[3] = {nullptr}; @@ -240,9 +235,8 @@ protected: inline void convert_row_to_RGB (float* r, float* g, float* b, const float* const Y, const float* const I, const float* const Q, const int W); inline void convert_to_RGB (float &r, float &g, float &b, const float Y, const float I, const float Q); - inline void convert_to_cielab_row (float* ar, float* ag, float* ab, float* oL, float* oa, float* ob); - inline void interpolate_row_g (float* agh, float* agv, int i); - inline void interpolate_row_rb (float* ar, float* ab, float* pg, float* cg, float* ng, int i); + inline void interpolate_row_g (float* agh, float* agv, int i); + inline void interpolate_row_rb (float* ar, float* ab, float* pg, float* cg, float* ng, int i); inline void interpolate_row_rb_mul_pp (const array2D &rawData, float* ar, float* ab, float* pg, float* cg, float* ng, int i, float r_mul, float g_mul, float b_mul, int x1, int width, int skip); float* CA_correct_RT (const bool autoCA, const double cared, const double cablue, const double caautostrength, array2D &rawData, double *fitParamsTransfer, bool fitParamsIn, bool fitParamsOut, float * buffer, bool freeBuffer); diff --git a/rtengine/rawimagesource_i.h b/rtengine/rawimagesource_i.h index 91d62ecab..b24115e0a 100644 --- a/rtengine/rawimagesource_i.h +++ b/rtengine/rawimagesource_i.h @@ -58,224 +58,6 @@ inline void RawImageSource::convert_to_RGB (float &r, float &g, float &b, const b = Y - 1.105f * I + 1.702f * Q; } -inline void RawImageSource::convert_to_cielab_row (float* ar, float* ag, float* ab, float* oL, float* oa, float* ob) -{ - - for (int j = 0; j < W; j++) { - double r = ar[j]; - double g = ag[j]; - double b = ab[j]; - - double x = lc00 * r + lc01 * g + lc02 * b; - double y = lc10 * r + lc11 * g + lc12 * b; - double z = lc20 * r + lc21 * g + lc22 * b; - - if (y > threshold) { - oL[j] = cache[(int)y]; - } else { - oL[j] = float(903.3 * y / MAXVALD); - } - - oa[j] = float(500.0 * ((x > threshold ? cache[(int)x] : 7.787 * x / MAXVALD + 16.0 / 116.0) - (y > threshold ? cache[(int)y] : 7.787 * y / MAXVALD + 16.0 / 116.0))); - ob[j] = float(200.0 * ((y > threshold ? cache[(int)y] : 7.787 * y / MAXVALD + 16.0 / 116.0) - (z > threshold ? cache[(int)z] : 7.787 * z / MAXVALD + 16.0 / 116.0))); - } -} - -inline void RawImageSource::interpolate_row_g (float* agh, float* agv, int i) -{ - - for (int j = 0; j < W; j++) { - if (ri->ISGREEN(i, j)) { - agh[j] = rawData[i][j]; - agv[j] = rawData[i][j]; - } else { - int gh = 0; - int gv = 0; - - if (j > 1 && j < W - 2) { - gh = (-rawData[i][j - 2] + 2 * rawData[i][j - 1] + 2 * rawData[i][j] + 2 * rawData[i][j + 1] - rawData[i][j + 2]) / 4; - int maxgh = max(rawData[i][j - 1], rawData[i][j + 1]); - int mingh = min(rawData[i][j - 1], rawData[i][j + 1]); - - if (gh > maxgh) { - gh = maxgh; - } else if (gh < mingh) { - gh = mingh; - } - } else if (j == 0) { - gh = rawData[i][1]; - } else if (j == 1) { - gh = (rawData[i][0] + rawData[i][2]) / 2; - } else if (j == W - 1) { - gh = rawData[i][W - 2]; - } else if (j == W - 2) { - gh = (rawData[i][W - 1] + rawData[i][W - 3]) / 2; - } - - if (i > 1 && i < H - 2) { - gv = (-rawData[i - 2][j] + 2 * rawData[i - 1][j] + 2 * rawData[i][j] + 2 * rawData[i + 1][j] - rawData[i + 2][j]) / 4; - int maxgv = max(rawData[i - 1][j], rawData[i + 1][j]); - int mingv = min(rawData[i - 1][j], rawData[i + 1][j]); - - if (gv > maxgv) { - gv = maxgv; - } else if (gv < mingv) { - gv = mingv; - } - } else if (i == 0) { - gv = rawData[1][j]; - } else if (i == 1) { - gv = (rawData[0][j] + rawData[2][j]) / 2; - } else if (i == H - 1) { - gv = rawData[H - 2][j]; - } else if (i == H - 2) { - gv = (rawData[H - 1][j] + rawData[H - 3][j]) / 2; - } - - agh[j] = gh; - agv[j] = gv; - } - } -} - -inline void RawImageSource::interpolate_row_rb (float* ar, float* ab, float* pg, float* cg, float* ng, int i) -{ - const auto getPg = [pg](int index) { - return - pg - ? pg[index] - : 0.f; - }; - - const auto getNg = [ng](int index) { - return - ng - ? ng[index] - : 0.f; - }; - - if ((ri->ISRED(i, 0) || ri->ISRED(i, 1))) { - // RGRGR or GRGRGR line - for (int j = 0; j < W; j++) { - if (ri->ISRED(i, j)) { - // red is simple - ar[j] = rawData[i][j]; - // blue: cross interpolation - int b = 0; - int n = 0; - - if (i > 0 && j > 0) { - b += rawData[i - 1][j - 1] - getPg(j - 1); - n++; - } - - if (i > 0 && j < W - 1) { - b += rawData[i - 1][j + 1] - getPg(j + 1); - n++; - } - - if (i < H - 1 && j > 0) { - b += rawData[i + 1][j - 1] - getNg(j - 1); - n++; - } - - if (i < H - 1 && j < W - 1) { - b += rawData[i + 1][j + 1] - getNg(j + 1); - n++; - } - - b = cg[j] + b / std::max(1, n); - ab[j] = b; - } else { - // linear R-G interp. horizontally - int r; - - if (j == 0) { - r = cg[0] + rawData[i][1] - cg[1]; - } else if (j == W - 1) { - r = cg[W - 1] + rawData[i][W - 2] - cg[W - 2]; - } else { - r = cg[j] + (rawData[i][j - 1] - cg[j - 1] + rawData[i][j + 1] - cg[j + 1]) / 2; - } - - ar[j] = CLIP(r); - // linear B-G interp. vertically - int b; - - if (i == 0) { - b = getNg(j) + rawData[1][j] - cg[j]; - } else if (i == H - 1) { - b = getPg(j) + rawData[H - 2][j] - cg[j]; - } else { - b = cg[j] + (rawData[i - 1][j] - getPg(j) + rawData[i + 1][j] - getNg(j)) / 2; - } - - ab[j] = b; - } - } - } else { - // BGBGB or GBGBGB line - for (int j = 0; j < W; j++) { - if (ri->ISBLUE(i, j)) { - // red is simple - ab[j] = rawData[i][j]; - // blue: cross interpolation - int r = 0; - int n = 0; - - if (i > 0 && j > 0) { - r += rawData[i - 1][j - 1] - getPg(j - 1); - n++; - } - - if (i > 0 && j < W - 1) { - r += rawData[i - 1][j + 1] - getPg(j + 1); - n++; - } - - if (i < H - 1 && j > 0) { - r += rawData[i + 1][j - 1] - getNg(j - 1); - n++; - } - - if (i < H - 1 && j < W - 1) { - r += rawData[i + 1][j + 1] - getNg(j + 1); - n++; - } - - r = cg[j] + r / std::max(n, 1); - - ar[j] = r; - } else { - // linear B-G interp. horizontally - int b; - - if (j == 0) { - b = cg[0] + rawData[i][1] - cg[1]; - } else if (j == W - 1) { - b = cg[W - 1] + rawData[i][W - 2] - cg[W - 2]; - } else { - b = cg[j] + (rawData[i][j - 1] - cg[j - 1] + rawData[i][j + 1] - cg[j + 1]) / 2; - } - - ab[j] = CLIP(b); - // linear R-G interp. vertically - int r; - - if (i == 0) { - r = getNg(j) + rawData[1][j] - cg[j]; - } else if (i == H - 1) { - r = getPg(j) + rawData[H - 2][j] - cg[j]; - } else { - r = cg[j] + (rawData[i - 1][j] - getPg(j) + rawData[i + 1][j] - getNg(j)) / 2; - } - - ar[j] = r; - } - } - } -} - inline void RawImageSource::interpolate_row_rb_mul_pp (const array2D &rawData, float* ar, float* ab, float* pg, float* cg, float* ng, int i, float r_mul, float g_mul, float b_mul, int x1, int width, int skip) { diff --git a/rtengine/settings.h b/rtengine/settings.h index 65a469794..3f5a5d1fe 100644 --- a/rtengine/settings.h +++ b/rtengine/settings.h @@ -30,13 +30,13 @@ class Settings public: Glib::ustring iccDirectory; ///< The directory containing the possible output icc profiles int viewingdevice; // white of output device (D50...D65..) - int viewingdevicegrey; // level of grey output device + int viewingdevicegrey; // level of grey output device int viewinggreySc; // level of grey Scene - int leveldnv; // level of crop denoise - int leveldnti; // size of tiles denoise + int leveldnv; // level of crop denoise + int leveldnti; // size of tiles denoise int leveldnaut; // level of auto denoise int leveldnliss; // level of auto multi zone - int leveldnautsimpl; // STD or EXPERT + int leveldnautsimpl; // STD or EXPERT Glib::ustring printerProfile; ///< ICC profile name used for soft-proofing a printer output RenderingIntent printerIntent; ///< Colorimetric intent used with the above profile @@ -64,7 +64,8 @@ public: bool gamutICC; // no longer used bool gamutLch; - bool HistogramWorking; + bool HistogramWorking; // true: histogram is display the value of the image computed in the Working profile + // false: histogram is display the value of the image computed in the Output profile int amchroma; int protectred; double protectredh; diff --git a/rtgui/crophandler.h b/rtgui/crophandler.h index 17f2ca47d..305d15e2c 100644 --- a/rtgui/crophandler.h +++ b/rtgui/crophandler.h @@ -97,8 +97,8 @@ public: rtengine::procparams::CropParams cropParams; rtengine::procparams::ColorManagementParams colorParams; - Glib::RefPtr cropPixbuf; - Glib::RefPtr cropPixbuftrue; + Glib::RefPtr cropPixbuf; // image displayed on monitor, using the monitor profile (i.e. lab to monitor profile) + Glib::RefPtr cropPixbuftrue; // internal image in output color space for analysis (i.e. lab to either Working profile or Output profile, depending on options.rtSettings.HistogramWorking) MyMutex cimg; diff --git a/rtgui/cropwindow.cc b/rtgui/cropwindow.cc index 1bbaf21a1..ed2031f81 100644 --- a/rtgui/cropwindow.cc +++ b/rtgui/cropwindow.cc @@ -1003,7 +1003,9 @@ void CropWindow::pointerMoved (int bstate, int x, int y) int mx, my; screenCoordToImage (x, y, mx, my); - if (!onArea (CropImage, x, y) || !cropHandler.cropPixbuf) { + MyMutex::MyLock lock(cropHandler.cimg); + + if (!onArea (CropImage, x, y) || !cropHandler.cropPixbuftrue) { cropHandler.getFullImageSize(mx, my); // pmlistener->pointerMoved (false, cropHandler.colorParams.working, mx, my, -1, -1, -1); // if (pmhlistener) pmhlistener->pointerMoved (false, cropHandler.colorParams.working, mx, my, -1, -1, -1); @@ -1019,7 +1021,7 @@ void CropWindow::pointerMoved (int bstate, int x, int y) } } else { - /*MyMutex::MyLock lock(cropHandler.cimg); + /* int vx = x - xpos - imgX; int vy = y - ypos - imgY; @@ -1029,7 +1031,6 @@ void CropWindow::pointerMoved (int bstate, int x, int y) */ - cropHandler.cimg.lock (); int vx = x - xpos - imgX; int vy = y - ypos - imgY; @@ -1041,34 +1042,35 @@ void CropWindow::pointerMoved (int bstate, int x, int y) // guint8* pix = cropHandler.cropPixbuf->get_pixels() + vy*cropHandler.cropPixbuf->get_rowstride() + vx*3; // if (vx < cropHandler.cropPixbuf->get_width() && vy < cropHandler.cropPixbuf->get_height()) // pmlistener->pointerMoved (true, mx, my, pix[0], pix[1], pix[2]); - int imwidth = cropHandler.cropPixbuf->get_width(); - int imheight = cropHandler.cropPixbuf->get_height(); - guint8* pix = cropHandler.cropPixbuf->get_pixels() + vy * cropHandler.cropPixbuf->get_rowstride() + vx * 3; + int imwidth = cropHandler.cropPixbuftrue->get_width(); + int imheight = cropHandler.cropPixbuftrue->get_height(); + guint8* pix = cropHandler.cropPixbuftrue->get_pixels() + vy * cropHandler.cropPixbuftrue->get_rowstride() + vx * 3; int rval = pix[0]; int gval = pix[1]; int bval = pix[2]; + bool isRaw = false; if (vx < imwidth && vy < imheight) { rtengine::StagedImageProcessor* ipc = iarea->getImProcCoordinator(); if(ipc) { procparams::ProcParams params; ipc->getParams(¶ms); - if(params.raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::NONE) || params.raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::NONE)) { + isRaw = params.raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::NONE) || params.raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::NONE); + if(isRaw) { ImageSource *isrc = static_cast(ipc->getInitialImage()); isrc->getRawValues(mx, my, params.coarse.rotate, rval, gval, bval); } } - // pmlistener->pointerMoved (true, cropHandler.colorParams.working, mx, my, pix[0], pix[1], pix[2]); - pmlistener->pointerMoved (true, cropHandler.colorParams.outputProfile, cropHandler.colorParams.workingProfile, mx, my, rval, gval, bval); - if (pmhlistener) - // pmhlistener->pointerMoved (true, cropHandler.colorParams.working, mx, my, pix[0], pix[1], pix[2]); - { - pmhlistener->pointerMoved (true, cropHandler.colorParams.outputProfile, cropHandler.colorParams.workingProfile, mx, my, pix[0], pix[1], pix[2]); + // Updates the Navigator + // TODO: possible double color conversion if rval, gval, bval come from cropHandler.cropPixbuftrue ? see issue #4583 + pmlistener->pointerMoved (true, cropHandler.colorParams.outputProfile, cropHandler.colorParams.workingProfile, mx, my, rval, gval, bval, isRaw); + + if (pmhlistener) { + // Updates the HistogramRGBArea + pmhlistener->pointerMoved (true, cropHandler.colorParams.outputProfile, cropHandler.colorParams.workingProfile, mx, my, rval, gval, bval); } } - - cropHandler.cimg.unlock (); } } } @@ -1375,7 +1377,7 @@ void CropWindow::expose (Cairo::RefPtr cr) break; } } - bool useBgColor = (state == SNormal); + bool useBgColor = (state == SNormal || state == SDragPicker || state == SDeletePicker); if (cropHandler.cropPixbuf) { imgW = cropHandler.cropPixbuf->get_width (); diff --git a/rtgui/cursormanager.cc b/rtgui/cursormanager.cc index d1973dcca..6c280ee8c 100644 --- a/rtgui/cursormanager.cc +++ b/rtgui/cursormanager.cc @@ -51,15 +51,15 @@ void CursorManager::init (Glib::RefPtr mainWindow) cAdd = Gdk::Cursor::create (display, Gdk::PLUS); cWait = Gdk::Cursor::create (display, Gdk::CLOCK); - Glib::RefPtr hand = RTImage::createFromFile ("crosshair.png"); - Glib::RefPtr close_hand = RTImage::createFromFile ("hand-closed.png"); - Glib::RefPtr wbpick = RTImage::createFromFile ("color-picker.png"); - Glib::RefPtr cpick = RTImage::createFromFile ("color-picker-add.png"); + Glib::RefPtr hand = RTImage::createFromFile ("crosshair-hicontrast.png"); + Glib::RefPtr close_hand = RTImage::createFromFile ("hand-closed-hicontrast.png"); + Glib::RefPtr wbpick = RTImage::createFromFile ("color-picker-hicontrast.png"); + Glib::RefPtr cpick = RTImage::createFromFile ("color-picker-add-hicontrast.png"); Glib::RefPtr empty = RTImage::createFromFile ("empty.png"); - Glib::RefPtr move2D = RTImage::createFromFile ("node-move-xy.png"); - Glib::RefPtr move1DH = RTImage::createFromFile ("node-move-x.png"); - Glib::RefPtr move1DV = RTImage::createFromFile ("node-move-y.png"); - Glib::RefPtr moveRotate = RTImage::createFromFile ("move-rotate.png"); + Glib::RefPtr move2D = RTImage::createFromFile ("node-move-xy-hicontrast.png"); + Glib::RefPtr move1DH = RTImage::createFromFile ("node-move-x-hicontrast.png"); + Glib::RefPtr move1DV = RTImage::createFromFile ("node-move-y-hicontrast.png"); + Glib::RefPtr moveRotate = RTImage::createFromFile ("rotate-aroundnode-hicontrast.png"); cHand = hand ? Gdk::Cursor::create (cAdd->get_display(), hand, 12, 12) : Gdk::Cursor::create (cAdd->get_display(), Gdk::HAND2); cClosedHand = close_hand ? Gdk::Cursor::create (cAdd->get_display(), close_hand, 12, 12) : Gdk::Cursor::create (cAdd->get_display(), Gdk::HAND2); diff --git a/rtgui/filethumbnailbuttonset.cc b/rtgui/filethumbnailbuttonset.cc index d32c1c339..556397b7b 100644 --- a/rtgui/filethumbnailbuttonset.cc +++ b/rtgui/filethumbnailbuttonset.cc @@ -42,9 +42,9 @@ FileThumbnailButtonSet::FileThumbnailButtonSet (FileBrowserEntry* myEntry) { if (!iconsLoaded) { - unRankIcon = RTImage::createFromPng ("star-hollow-small.png"); - rankIcon = RTImage::createFromPng ("star-gold-small.png"); - gRankIcon = RTImage::createFromPng ("star-small.png"); + unRankIcon = RTImage::createFromPng ("star-hollow-narrow.png"); + rankIcon = RTImage::createFromPng ("star-gold-narrow.png"); + gRankIcon = RTImage::createFromPng ("star-narrow.png"); trashIcon = RTImage::createFromPng ("trash-small.png"); unTrashIcon = RTImage::createFromPng ("trash-remove-small.png"); processIcon = RTImage::createFromPng ("gears-small.png"); diff --git a/rtgui/lensprofile.cc b/rtgui/lensprofile.cc index df26678d9..a89fdb51e 100644 --- a/rtgui/lensprofile.cc +++ b/rtgui/lensprofile.cc @@ -139,10 +139,10 @@ LensProfilePanel::LensProfilePanel () : lensfunCameras->signal_changed().connect(sigc::mem_fun(*this, &LensProfilePanel::onLensfunCameraChanged)); lensfunLenses->signal_changed().connect(sigc::mem_fun(*this, &LensProfilePanel::onLensfunLensChanged)); - corrOff->signal_toggled().connect(sigc::mem_fun(*this, &LensProfilePanel::onCorrModeChanged)); - corrLensfunAuto->signal_toggled().connect(sigc::mem_fun(*this, &LensProfilePanel::onCorrModeChanged)); - corrLensfunManual->signal_toggled().connect(sigc::mem_fun(*this, &LensProfilePanel::onCorrModeChanged)); - corrLcpFile->signal_toggled().connect(sigc::mem_fun(*this, &LensProfilePanel::onCorrModeChanged)); + corrOff->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &LensProfilePanel::onCorrModeChanged), corrOff)); + corrLensfunAuto->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &LensProfilePanel::onCorrModeChanged), corrLensfunAuto)); + corrLensfunManual->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &LensProfilePanel::onCorrModeChanged), corrLensfunManual)); + corrLcpFile->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &LensProfilePanel::onCorrModeChanged), corrLcpFile)); corrUnchanged->hide(); @@ -499,84 +499,88 @@ void LensProfilePanel::onLensfunLensChanged() } -void LensProfilePanel::onCorrModeChanged() +void LensProfilePanel::onCorrModeChanged(const Gtk::RadioButton *rbChanged) { - Glib::ustring mode; + if (rbChanged->get_active()) { + // because the method gets called for the enabled AND the disabled RadioButton, we do the processing only for the enabled one + Glib::ustring mode; - if (corrOff->get_active()) { - useLensfunChanged = true; - lensfunAutoChanged = true; - lcpFileChanged = true; - - ckbUseDist->set_sensitive(false); - ckbUseVign->set_sensitive(false); - ckbUseCA->set_sensitive(false); - - mode = M("GENERAL_NONE"); - } else if (corrLensfunAuto->get_active()) { - useLensfunChanged = true; - lensfunAutoChanged = true; - lcpFileChanged = true; - useDistChanged = true; - useVignChanged = true; + if (rbChanged == corrOff) { + useLensfunChanged = true; + lensfunAutoChanged = true; + lcpFileChanged = true; - ckbUseDist->set_sensitive(true); - ckbUseVign->set_sensitive(true); - ckbUseCA->set_sensitive(false); + ckbUseDist->set_sensitive(false); + ckbUseVign->set_sensitive(false); + ckbUseCA->set_sensitive(false); - if (metadata) { - bool b = disableListener(); - const LFDatabase *db = LFDatabase::getInstance(); - LFCamera c = db->findCamera(metadata->getMake(), metadata->getModel()); - LFLens l = db->findLens(c, metadata->getLens()); - setLensfunCamera(c.getMake(), c.getModel()); - setLensfunLens(l.getLens()); - if (b) { - enableListener(); + mode = M("GENERAL_NONE"); + } else if (rbChanged == corrLensfunAuto) { + useLensfunChanged = true; + lensfunAutoChanged = true; + lcpFileChanged = true; + useDistChanged = true; + useVignChanged = true; + + ckbUseDist->set_sensitive(true); + ckbUseVign->set_sensitive(true); + ckbUseCA->set_sensitive(false); + + if (metadata) { + bool b = disableListener(); + const LFDatabase *db = LFDatabase::getInstance(); + LFCamera c = db->findCamera(metadata->getMake(), metadata->getModel()); + LFLens l = db->findLens(c, metadata->getLens()); + setLensfunCamera(c.getMake(), c.getModel()); + setLensfunLens(l.getLens()); + if (b) { + enableListener(); + } } + + mode = M("LENSPROFILE_CORRECTION_AUTOMATCH"); + } else if (rbChanged == corrLensfunManual) { + useLensfunChanged = true; + lensfunAutoChanged = true; + lcpFileChanged = true; + useDistChanged = true; + useVignChanged = true; + + ckbUseDist->set_sensitive(true); + ckbUseVign->set_sensitive(true); + ckbUseCA->set_sensitive(false); + + mode = M("LENSPROFILE_CORRECTION_MANUAL"); + } else if (rbChanged == corrLcpFile) { + useLensfunChanged = true; + lensfunAutoChanged = true; + lcpFileChanged = true; + useDistChanged = true; + useVignChanged = true; + + updateDisabled(true); + + mode = M("LENSPROFILE_CORRECTION_LCPFILE"); + } else if (rbChanged == corrUnchanged) { + useLensfunChanged = false; + lensfunAutoChanged = false; + lcpFileChanged = false; + lensfunCameraChanged = false; + lensfunLensChanged = false; + + ckbUseDist->set_sensitive(true); + ckbUseVign->set_sensitive(true); + ckbUseCA->set_sensitive(true); + + mode = M("GENERAL_UNCHANGED"); } - mode = M("LENSPROFILE_CORRECTION_AUTOMATCH"); - } else if (corrLensfunManual->get_active()) { - useLensfunChanged = true; - lensfunAutoChanged = true; - lcpFileChanged = true; - useDistChanged = true; - useVignChanged = true; + lcModeChanged = true; + updateLensfunWarning(); - ckbUseDist->set_sensitive(true); - ckbUseVign->set_sensitive(true); - ckbUseCA->set_sensitive(false); - - mode = M("LENSPROFILE_CORRECTION_MANUAL"); - } else if (corrLcpFile->get_active()) { - useLensfunChanged = true; - lensfunAutoChanged = true; - lcpFileChanged = true; - useDistChanged = true; - useVignChanged = true; - - updateDisabled(true); - - mode = M("LENSPROFILE_CORRECTION_LCPFILE"); - } else if (corrUnchanged->get_active()) { - useLensfunChanged = false; - lensfunAutoChanged = false; - lcpFileChanged = false; - lensfunCameraChanged = false; - lensfunLensChanged = false; - - ckbUseDist->set_sensitive(true); - ckbUseVign->set_sensitive(true); - ckbUseCA->set_sensitive(true); - - mode = M("GENERAL_UNCHANGED"); - } - lcModeChanged = true; - updateLensfunWarning(); - - if (listener) { - listener->panelChanged(EvLensCorrMode, mode); + if (listener) { + listener->panelChanged(EvLensCorrMode, mode); + } } } diff --git a/rtgui/lensprofile.h b/rtgui/lensprofile.h index e70515470..8c814e6fc 100644 --- a/rtgui/lensprofile.h +++ b/rtgui/lensprofile.h @@ -105,7 +105,7 @@ public: void onLensfunCameraChanged(); void onLensfunLensChanged(); - void onCorrModeChanged(); + void onCorrModeChanged(const Gtk::RadioButton *rbChanged); }; #endif diff --git a/rtgui/navigator.cc b/rtgui/navigator.cc index e34a909df..732b9f323 100644 --- a/rtgui/navigator.cc +++ b/rtgui/navigator.cc @@ -224,24 +224,30 @@ void Navigator::setInvalid (int fullWidth, int fullHeight) LAB_L->set_text (M("NAVIGATOR_NA")); } -void Navigator::getRGBText (int r, int g, int b, Glib::ustring &sR, Glib::ustring &sG, Glib::ustring &sB) +void Navigator::getRGBText (int r, int g, int b, Glib::ustring &sR, Glib::ustring &sG, Glib::ustring &sB, bool isRaw) { - switch (currentRGBUnit) { - case (Options::NavigatorUnit::R0_1): - sR = Glib::ustring::format(std::fixed, std::setprecision(4), r / 255.f); - sG = Glib::ustring::format(std::fixed, std::setprecision(4), g / 255.f); - sB = Glib::ustring::format(std::fixed, std::setprecision(4), b / 255.f); - break; - case (Options::NavigatorUnit::R0_255): + if (isRaw) { sR = Glib::ustring::format(std::fixed, std::setprecision(0), r); sG = Glib::ustring::format(std::fixed, std::setprecision(0), g); sB = Glib::ustring::format(std::fixed, std::setprecision(0), b); - break; - case (Options::NavigatorUnit::PERCENT): - default: - sR = Glib::ustring::format(std::fixed, std::setprecision(1), r * 100.f / 255.f) + Glib::ustring("%"); - sG = Glib::ustring::format(std::fixed, std::setprecision(1), g * 100.f / 255.f) + Glib::ustring("%"); - sB = Glib::ustring::format(std::fixed, std::setprecision(1), b * 100.f / 255.f) + Glib::ustring("%"); + } else { + switch (currentRGBUnit) { + case (Options::NavigatorUnit::R0_1): + sR = Glib::ustring::format(std::fixed, std::setprecision(4), r / 255.f); + sG = Glib::ustring::format(std::fixed, std::setprecision(4), g / 255.f); + sB = Glib::ustring::format(std::fixed, std::setprecision(4), b / 255.f); + break; + case (Options::NavigatorUnit::R0_255): + sR = Glib::ustring::format(std::fixed, std::setprecision(0), r); + sG = Glib::ustring::format(std::fixed, std::setprecision(0), g); + sB = Glib::ustring::format(std::fixed, std::setprecision(0), b); + break; + case (Options::NavigatorUnit::PERCENT): + default: + sR = Glib::ustring::format(std::fixed, std::setprecision(1), r * 100.f / 255.f) + Glib::ustring("%"); + sG = Glib::ustring::format(std::fixed, std::setprecision(1), g * 100.f / 255.f) + Glib::ustring("%"); + sB = Glib::ustring::format(std::fixed, std::setprecision(1), b * 100.f / 255.f) + Glib::ustring("%"); + } } } @@ -274,34 +280,42 @@ void Navigator::getLABText (float l, float a, float b, Glib::ustring &sL, Glib:: } // if !validPos then x/y contain the full image size -void Navigator::pointerMoved (bool validPos, Glib::ustring profile, Glib::ustring profileW, int x, int y, int r, int g, int b) +void Navigator::pointerMoved (bool validPos, const Glib::ustring &profile, const Glib::ustring &profileW, int x, int y, int r, int g, int b, bool isRaw) { if (!validPos) { setInvalid (x, y); } else { Glib::ustring s1, s2, s3; - float h, s, v; - float LAB_a, LAB_b, LAB_l; position->set_text (Glib::ustring::compose ("x: %1, y: %2", x, y)); - getRGBText (r, g, b, s1, s2, s3); + getRGBText (r, g, b, s1, s2, s3, isRaw); R->set_text (s1); G->set_text (s2); B->set_text (s3); + if (isRaw) { + H->set_text ("--"); + S->set_text ("--"); + V->set_text ("--"); + LAB_L->set_text ("--"); + LAB_A->set_text ("--"); + LAB_B->set_text ("--"); + } else { + float h, s, v; + float LAB_a, LAB_b, LAB_l; + Color::rgb2hsv01(r / 255.f, g / 255.f, b / 255.f, h, s, v); + getHSVText (h, s, v, s1, s2, s3); + H->set_text (s1); + S->set_text (s2); + V->set_text (s3); - Color::rgb2hsv01(r / 255.f, g / 255.f, b / 255.f, h, s, v); - getHSVText (h, s, v, s1, s2, s3); - H->set_text (s1); - S->set_text (s2); - V->set_text (s3); - - Color::rgb2lab01(profile, profileW, r / 255.f, g / 255.f, b / 255.f, LAB_l, LAB_a, LAB_b, options.rtSettings.HistogramWorking); // TODO: Really sure this function works? - getLABText (LAB_l, LAB_a, LAB_b, s1, s2, s3); - LAB_L->set_text (s1); - LAB_A->set_text (s2); - LAB_B->set_text (s3); + Color::rgb2lab01(profile, profileW, r / 255.f, g / 255.f, b / 255.f, LAB_l, LAB_a, LAB_b, options.rtSettings.HistogramWorking); // TODO: Really sure this function works? + getLABText (LAB_l, LAB_a, LAB_b, s1, s2, s3); + LAB_L->set_text (s1); + LAB_A->set_text (s2); + LAB_B->set_text (s3); + } } } diff --git a/rtgui/navigator.h b/rtgui/navigator.h index 6108e2809..e7689b7c2 100644 --- a/rtgui/navigator.h +++ b/rtgui/navigator.h @@ -55,10 +55,10 @@ public: // pointermotionlistener interface // void pointerMoved (bool validPos, int x, int y, int r, int g, int b); - void pointerMoved (bool validPos, Glib::ustring profile, Glib::ustring profileW, int x, int y, int r, int g, int b); + void pointerMoved (bool validPos, const Glib::ustring &profile, const Glib::ustring &profileW, int x, int y, int r, int g, int b, bool raw = false); void setInvalid (int fullWidth = -1, int fullHeight = -1); - void getRGBText (int r, int g, int b, Glib::ustring &sR, Glib::ustring &sG, Glib::ustring &sB); + void getRGBText (int r, int g, int b, Glib::ustring &sR, Glib::ustring &sG, Glib::ustring &sB, bool isRaw = false); void getHSVText (float h, float s, float v, Glib::ustring &sH, Glib::ustring &sS, Glib::ustring &sV); void getLABText (float l, float a, float b, Glib::ustring &sL, Glib::ustring &sA, Glib::ustring &sB); diff --git a/rtgui/pointermotionlistener.h b/rtgui/pointermotionlistener.h index 5600a0838..c090d5114 100644 --- a/rtgui/pointermotionlistener.h +++ b/rtgui/pointermotionlistener.h @@ -27,8 +27,8 @@ protected: public: virtual ~PointerMotionListener() {} - virtual void pointerMoved (bool validPos, Glib::ustring profile, Glib::ustring profileW, int x, int y, int r, int g, int b) {} - virtual void getRGBText (int r, int g, int b, Glib::ustring &sR, Glib::ustring &sG, Glib::ustring &sB) { sR = "--"; sG = "--"; sB = "--"; } + virtual void pointerMoved (bool validPos, const Glib::ustring &profile, const Glib::ustring &profileW, int x, int y, int r, int g, int b, bool isRaw = false) {} + virtual void getRGBText (int r, int g, int b, Glib::ustring &sR, Glib::ustring &sG, Glib::ustring &sB, bool isRaw = false) { sR = "--"; sG = "--"; sB = "--"; } virtual void getHSVText (float h, float s, float v, Glib::ustring &sH, Glib::ustring &sS, Glib::ustring &sV) { sH = "--"; sS = "--"; sV = "--"; } virtual void getLABText (float l, float a, float b, Glib::ustring &sL, Glib::ustring &sA, Glib::ustring &sB) { sL = "--"; sA = "--"; sB = "--"; } diff --git a/rtgui/previewmodepanel.cc b/rtgui/previewmodepanel.cc index 4b821f298..086f6ab17 100644 --- a/rtgui/previewmodepanel.cc +++ b/rtgui/previewmodepanel.cc @@ -24,23 +24,23 @@ PreviewModePanel::PreviewModePanel (ImageArea* ia) : imageArea(ia) { - iR = new RTImage ("square-toggle-red-on.png"); - iG = new RTImage ("square-toggle-green-on.png"); - iB = new RTImage ("square-toggle-blue-on.png"); - iL = new RTImage ("square-toggle-luminosity-on.png"); - iBC0 = new RTImage ("square-toggle-theme-on.png"); - iBC1 = new RTImage ("square-toggle-black-on.png"); - iBC2 = new RTImage ("square-toggle-white-on.png"); - iBC3 = new RTImage ("square-toggle-gray-on.png"); + iR = new RTImage ("square-toggle-red-on-narrow.png"); + iG = new RTImage ("square-toggle-green-on-narrow.png"); + iB = new RTImage ("square-toggle-blue-on-narrow.png"); + iL = new RTImage ("square-toggle-luminosity-on-narrow.png"); + iBC0 = new RTImage ("square-toggle-theme-on-narrow.png"); + iBC1 = new RTImage ("square-toggle-black-on-narrow.png"); + iBC2 = new RTImage ("square-toggle-white-on-narrow.png"); + iBC3 = new RTImage ("square-toggle-gray-on-narrow.png"); - igR = new RTImage ("square-toggle-red-off.png"); - igG = new RTImage ("square-toggle-green-off.png"); - igB = new RTImage ("square-toggle-blue-off.png"); - igL = new RTImage ("square-toggle-luminosity-off.png"); - igBC0 = new RTImage ("square-toggle-theme-off.png"); - igBC1 = new RTImage ("square-toggle-black-off.png"); - igBC2 = new RTImage ("square-toggle-white-off.png"); - igBC3 = new RTImage ("square-toggle-gray-off.png"); + igR = new RTImage ("square-toggle-red-off-narrow.png"); + igG = new RTImage ("square-toggle-green-off-narrow.png"); + igB = new RTImage ("square-toggle-blue-off-narrow.png"); + igL = new RTImage ("square-toggle-luminosity-off-narrow.png"); + igBC0 = new RTImage ("square-toggle-theme-off-narrow.png"); + igBC1 = new RTImage ("square-toggle-black-off-narrow.png"); + igBC2 = new RTImage ("square-toggle-white-off-narrow.png"); + igBC3 = new RTImage ("square-toggle-gray-off-narrow.png"); backColor0 = Gtk::manage (new Gtk::ToggleButton ()); backColor0->get_style_context()->add_class("narrowbutton");