Merge branch 'dev' into spot-removal-tool
This commit is contained in:
commit
1cf62a2a65
@ -13,7 +13,7 @@
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
30
README.md
30
README.md
@ -1,41 +1,41 @@
|
||||

|
||||

|
||||
|
||||
RawTherapee is a powerful, cross-platform raw photo processing program, released as [libre software](https://en.wikipedia.org/wiki/Free_software) under the [GNU General Public License Version 3](https://opensource.org/licenses/gpl-3.0.html). It is written mostly in C++ using a [GTK+](http://www.gtk.org/) front-end. It uses a patched version of [dcraw](http://www.cybercom.net/~dcoffin/dcraw/) for reading raw files, with an in-house solution which adds the highest quality support for certain camera models unsupported by dcraw and enhances the accuracy of certain raw files already supported by dcraw. It is notable for the advanced control it gives the user over the demosaicing and development process.
|
||||
RawTherapee is a powerful, cross-platform raw photo processing program, released as [libre software](https://en.wikipedia.org/wiki/Free_software) under the [GNU General Public License Version 3](https://opensource.org/licenses/gpl-3.0.html). It is written mostly in C++ using a [GTK+](https://www.gtk.org) front-end. It uses a patched version of [dcraw](https://www.dechifro.org/dcraw/) for reading raw files, with an in-house solution which adds the highest quality support for certain camera models unsupported by dcraw and enhances the accuracy of certain raw files already supported by dcraw. It is notable for the advanced control it gives the user over the demosaicing and development process.
|
||||
|
||||
## Target audience
|
||||
## Target Audience
|
||||
|
||||
RawTherapee is designed for developing raw files from a broad range of digital cameras, as well as [HDR DNG](https://helpx.adobe.com/photoshop/digital-negative.html) files and non-raw image formats ([JPEG](https://en.wikipedia.org/wiki/JPEG), [TIFF](https://en.wikipedia.org/wiki/Tagged_Image_File_Format) and [PNG](https://en.wikipedia.org/wiki/Portable_Network_Graphics)). The target audience ranges from enthusiast newcomers who wish to broaden their understanding of how digital imaging works to semi-professional photographers. Knowledge in color science is not compulsory, but it is recommended that you are eager to learn and ready to read our documentation ([RawPedia](http://rawpedia.rawtherapee.com/)) as well as look up basic concepts which lie outside the scope of RawPedia, such as [color balance](https://en.wikipedia.org/wiki/Color_balance), elsewhere.
|
||||
RawTherapee is designed for developing raw files from a broad range of digital cameras, as well as [HDR DNG](https://helpx.adobe.com/photoshop/digital-negative.html) files and non-raw image formats ([JPEG](https://en.wikipedia.org/wiki/JPEG), [TIFF](https://en.wikipedia.org/wiki/Tagged_Image_File_Format) and [PNG](https://en.wikipedia.org/wiki/Portable_Network_Graphics)). The target audience ranges from enthusiast newcomers who wish to broaden their understanding of how digital imaging works to semi-professional photographers. Knowledge in color science is not compulsory, but it is recommended that you are eager to learn and ready to read our documentation ([RawPedia](https://rawpedia.rawtherapee.com/)) as well as look up basic concepts which lie outside the scope of RawPedia, such as [color balance](https://en.wikipedia.org/wiki/Color_balance), elsewhere.
|
||||
|
||||
Of course, professionals may use RawTherapee too while enjoying complete freedom, but will probably lack some peripheral features such as [Digital Asset Management](https://en.wikipedia.org/wiki/Digital_asset_management), printing, uploading, etc. RawTherapee is not aimed at being an inclusive all-in-one program, and the [open-source community](https://en.wikipedia.org/wiki/Open-source_movement) is sufficiently developed by now to offer all those peripheral features in other specialized software.
|
||||
Professionals may use RawTherapee as well while enjoying complete freedom, but will probably lack some peripheral features such as [Digital Asset Management](https://en.wikipedia.org/wiki/Digital_asset_management), printing, uploading, etc. RawTherapee is not aimed at being an inclusive all-in-one program, and the [open-source community](https://en.wikipedia.org/wiki/Open-source_movement) is sufficiently developed by now to offer all those peripheral features in other specialized software.
|
||||
|
||||
## Links
|
||||
|
||||
Website:
|
||||
http://rawtherapee.com/
|
||||
https://www.rawtherapee.com/
|
||||
|
||||
Forum:
|
||||
https://discuss.pixls.us/c/software/rawtherapee
|
||||
|
||||
Features:
|
||||
http://rawpedia.rawtherapee.com/Features
|
||||
https://rawpedia.rawtherapee.com/Features
|
||||
|
||||
Official documentation:
|
||||
http://rawpedia.rawtherapee.com/
|
||||
Documentation:
|
||||
https://rawpedia.rawtherapee.com/
|
||||
|
||||
Download RawTherapee:
|
||||
http://rawtherapee.com/downloads
|
||||
https://www.rawtherapee.com/downloads
|
||||
|
||||
Download source code tarballs:
|
||||
http://rawtherapee.com/shared/source/
|
||||
https://www.rawtherapee.com/shared/source/
|
||||
|
||||
## Compilation, branches and Git
|
||||
## Compilation, Branches and Git
|
||||
Refer to RawPedia for a detailed explanation of how to get the necessary dependencies and how to compile RawTherapee.
|
||||
|
||||
Linux:
|
||||
http://rawpedia.rawtherapee.com/Linux
|
||||
https://rawpedia.rawtherapee.com/Linux
|
||||
|
||||
Windows:
|
||||
http://rawpedia.rawtherapee.com/Windows
|
||||
https://rawpedia.rawtherapee.com/Windows
|
||||
|
||||
macOS:
|
||||
http://rawpedia.rawtherapee.com/macOS
|
||||
https://rawpedia.rawtherapee.com/macOS
|
||||
|
@ -1,9 +1,9 @@
|
||||
RAWTHERAPEE 5.6-dev RELEASE NOTES
|
||||
RAWTHERAPEE 5.7-dev RELEASE NOTES
|
||||
|
||||
This is a development version of RawTherapee. We update the code almost daily. Every few months, once enough changes have accumulated and the code is stabilized, we make a new official release. Every code change between these releases is known as a "development" version, and this is one of them.
|
||||
|
||||
Start by reading the "Getting Started" article on RawPedia:
|
||||
http://rawpedia.rawtherapee.com/
|
||||
https://rawpedia.rawtherapee.com/
|
||||
|
||||
While we only commit tested and relatively stable code and so the development versions should be fairly stable, you should be aware that:
|
||||
- Development versions only had limited testing, so there may be bugs unknown to us.
|
||||
@ -26,16 +26,20 @@ In order to use RawTherapee efficiently you should know that:
|
||||
- All curves support the Shift and Ctrl keys while dragging a point. Shift+drag makes the point snap to a meaningful axis (top, bottom, diagonal, other), while Ctrl+drag makes your mouse movement super-fine for precise point positioning.
|
||||
- There are many keyboard shortcuts which make working with RawTherapee much faster and give you greater control. Make sure you familiarize yourself with them on RawPedia's "Keyboard Shortcuts" page!
|
||||
|
||||
New features since 5.6:
|
||||
TODO.
|
||||
New features since 5.7:
|
||||
- TODO
|
||||
|
||||
|
||||
|
||||
NEWS RELEVANT TO PACKAGE MAINTAINERS
|
||||
|
||||
New since 5.7:
|
||||
- TODO
|
||||
|
||||
In general:
|
||||
- To get the source code, either clone from git or use the tarball from http://rawtherapee.com/shared/source/ . Do not use the auto-generated GitHub release tarballs.
|
||||
- Requires GTK+ version >=3.16, though >=3.22.24 is recommended. GTK+ versions 3.24.2 - 3.24.6 have an issue with missing combobox menu arrows and are to be avoided.
|
||||
- To get the source code, either clone from git or use the tarball from https://rawtherapee.com/shared/source/ . Do not use the auto-generated GitHub release tarballs.
|
||||
- Requires GTK+ version >=3.16, though >=3.22.24 is recommended.
|
||||
- GTK+ versions 3.24.2 - 3.24.6 have an issue where combobox menu scroll-arrows are missing when the combobox list does not fit vertically on the screen. As a result, users would not be able to scroll in the following comboboxes: Processing Profiles, Film Simulation, and the camera and lens profiles in Profiled Lens Correction.
|
||||
- RawTherapee 5 requires GCC-4.9 or higher, or Clang.
|
||||
- Do not use -ffast-math, it will not make RawTherapee faster but will introduce artifacts.
|
||||
- Use -O3, it will make RawTherapee faster with no known side-effects.
|
||||
@ -52,15 +56,14 @@ See CONTRIBUTING.md
|
||||
|
||||
DOCUMENTATION
|
||||
|
||||
http://rawpedia.rawtherapee.com/
|
||||
http://rawtherapee.com/blog/documentation
|
||||
https://rawpedia.rawtherapee.com/
|
||||
|
||||
|
||||
|
||||
REPORTING BUGS
|
||||
|
||||
If you found a problem, don't keep it to yourself. Read the "How to write useful bug reports" article to get the problem fixed:
|
||||
http://rawpedia.rawtherapee.com/How_to_write_useful_bug_reports
|
||||
https://rawpedia.rawtherapee.com/How_to_write_useful_bug_reports
|
||||
|
||||
|
||||
|
||||
@ -78,8 +81,8 @@ Server: chat.freenode.net
|
||||
Channel: #rawtherapee
|
||||
|
||||
You can use freenode webchat to communicate without installing anything:
|
||||
http://webchat.freenode.net/?randomnick=1&channels=rawtherapee&prompt=1
|
||||
More information here: http://rawpedia.rawtherapee.com/IRC
|
||||
https://webchat.freenode.net/?randomnick=1&channels=rawtherapee&prompt=1
|
||||
More information here: https://rawpedia.rawtherapee.com/IRC
|
||||
|
||||
|
||||
|
||||
|
@ -13,7 +13,7 @@
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
# along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
include(CheckCXXSourceCompiles)
|
||||
|
||||
|
@ -13,7 +13,7 @@
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
# along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
include(CheckCXXSourceCompiles)
|
||||
|
||||
|
@ -31,11 +31,12 @@
|
||||
<project_license>GPL-3.0+</project_license>
|
||||
<url type="bugtracker">https://github.com/Beep6581/RawTherapee/issues/new</url>
|
||||
<url type="donation">https://www.paypal.me/rawtherapee</url>
|
||||
<url type="help">http://rawpedia.rawtherapee.com/</url>
|
||||
<url type="homepage">http://rawtherapee.com/</url>
|
||||
<url type="help">https://rawpedia.rawtherapee.com/</url>
|
||||
<url type="homepage">https://www.rawtherapee.com/</url>
|
||||
<url type="translate">https://discuss.pixls.us/t/localization-how-to-translate-rawtherapee-and-rawpedia/2594</url>
|
||||
<launchable type="desktop-id">rawtherapee.desktop</launchable>
|
||||
<releases>
|
||||
<release version="5.7" date="2019-09-10" type="stable"></release>
|
||||
<release version="5.6" date="2019-04-20" type="stable"></release>
|
||||
<release version="5.6~rc2" date="2019-04-17" type="development"></release>
|
||||
<release version="5.6~rc1" date="2019-04-10" type="development"></release>
|
||||
@ -47,16 +48,20 @@
|
||||
</provides>
|
||||
<screenshots>
|
||||
<screenshot type="default">
|
||||
<caption>Color-correcting a drosera rotundifolia in RawTherapee 5.7.</caption>
|
||||
<image width="1920" height="1080">https://rawtherapee.com/images/screenshots/rt570_1.jpg</image>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<caption>HDR DNG of a misty morning in the countryside</caption>
|
||||
<image width="1920" height="1080">http://rawtherapee.com/images/screenshots/rt540_1.jpg</image>
|
||||
<image width="1920" height="1080">https://rawtherapee.com/images/screenshots/rt540_1.jpg</image>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<caption>Straight-out-of-camera vs RawTherapee</caption>
|
||||
<image width="1920" height="1080">http://rawtherapee.com/images/screenshots/rt540_2.jpg</image>
|
||||
<image width="1920" height="1080">https://rawtherapee.com/images/screenshots/rt540_2.jpg</image>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<caption>RawTherapee using the Auto-Matched Tone Curve tool</caption>
|
||||
<image width="1920" height="1080">http://rawtherapee.com/images/screenshots/rt540_3.jpg</image>
|
||||
<image width="1920" height="1080">https://rawtherapee.com/images/screenshots/rt540_3.jpg</image>
|
||||
</screenshot>
|
||||
</screenshots>
|
||||
<update_contact>contactus@rawtherapee.com</update_contact>
|
||||
|
2
header
2
header
@ -14,5 +14,5 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
@ -15,7 +15,7 @@
|
||||
viewBox="0 0 146.05 91.545836"
|
||||
version="1.1"
|
||||
id="svg783"
|
||||
inkscape:version="0.92.2 2405546, 2018-03-11"
|
||||
inkscape:version="0.92.4 5da689c313, 2019-01-14"
|
||||
sodipodi:docname="splash.svg"
|
||||
inkscape:export-filename="/tmp/splash.png"
|
||||
inkscape:export-xdpi="96"
|
||||
@ -479,8 +479,8 @@
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="0.93979686"
|
||||
inkscape:cx="-66.836581"
|
||||
inkscape:zoom="0.90075514"
|
||||
inkscape:cx="-60.984253"
|
||||
inkscape:cy="136.82017"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
@ -574,7 +574,7 @@
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title>RawTherapee splash screen</dc:title>
|
||||
<dc:date>2019-02-27</dc:date>
|
||||
<dc:date />
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>Maciej Dworak</dc:title>
|
||||
@ -996,7 +996,7 @@
|
||||
id="tspan595"
|
||||
x="283.85016"
|
||||
y="2.2370076"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:49.34799576px;line-height:1.25;font-family:'Eras Bold ITC';-inkscape-font-specification:'Eras Bold ITC Bold';letter-spacing:-7.09514618px">. 6</tspan></text>
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:49.34799576px;line-height:1.25;font-family:'Eras Bold ITC';-inkscape-font-specification:'Eras Bold ITC Bold';letter-spacing:-7.09514618px">. 8</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:'Eras Medium ITC';-inkscape-font-specification:'Eras Medium ITC';letter-spacing:1px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.07075834px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter155);enable-background:new"
|
||||
@ -1048,73 +1048,88 @@
|
||||
id="tspan611"
|
||||
sodipodi:role="line">Raw</tspan></text>
|
||||
<g
|
||||
aria-label=". 6"
|
||||
transform="matrix(0.24127119,0,0.01264448,0.24127122,4.1926296,267.35338)"
|
||||
aria-label=". 7"
|
||||
transform="matrix(0.24127119,0,0.01264448,0.24127122,4.1926291,267.35338)"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'Eras Bold ITC';-inkscape-font-specification:'Eras Bold ITC Bold';letter-spacing:-7.09514618px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter4749);enable-background:new"
|
||||
id="text1152">
|
||||
id="text191">
|
||||
<path
|
||||
d="m 286.21154,2.2370076 q 0.19276,-3.22882392 0.33734,-8.7226438 l 4.96371,0.072287 q 0.79516,0 4.19265,-0.072287 -0.19276,2.6264315 -0.43372,8.7226438 l -4.19265,-0.048191 q -0.45782,0 -4.86733,0.048191 z"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:49.34799576px;line-height:1.25;font-family:'Eras Bold ITC';-inkscape-font-specification:'Eras Bold ITC Bold';letter-spacing:-7.09514618px"
|
||||
id="path1154" />
|
||||
id="path193" />
|
||||
<path
|
||||
d="m 315.05617,-18.750348 q 1.25297,-0.216861 2.38547,-0.216861 2.77101,0 4.96372,1.084306 2.2168,1.084307 3.3493,3.373398 1.1325,2.264996 1.1325,5.0600976 0,1.855369 -0.53011,3.5902595 -0.50601,1.7107947 -1.46984,3.1806325 -0.96382,1.4457421 -2.40957,2.60233572 -1.42164,1.13249798 -3.06015,1.73489048 -1.61441,0.6023925 -3.44569,0.8915409 -1.83127,0.3132441 -3.71073,0.3132441 -4.36133,0 -7.59015,-1.445742 -3.20473,-1.46983778 -4.67457,-3.9998864 -1.44574,-2.5541443 -1.44574,-5.6142983 0,-1.7589862 0.38553,-3.8553121 0.40963,-2.096326 1.75899,-4.98781 1.37345,-2.91558 3.73483,-6.698605 2.38548,-3.783025 4.84324,-6.915466 h 12.337 q -3.66255,4.216747 -4.86733,5.710681 -1.7108,2.144517 -3.22883,4.433609 -1.49393,2.264996 -2.50595,4.216748 -0.98792,1.951751 -1.6867,3.831216 -0.40963,1.108402 -0.60239,2.07223 -0.16867,0.9638283 -0.16867,1.8071778 0,1.132498 0.45782,2.1686131 0.45781,1.0361152 1.37345,1.6385077 0.91564,0.6023925 2.19271,0.6023925 1.20478,0 2.12042,-0.5542011 0.93973,-0.5782968 1.39755,-1.5662206 0.45782,-1.0120194 0.45782,-2.1204216 0,-1.9517518 -1.42165,-2.8432928 -1.39755,-0.891541 -2.7951,-0.891541 -0.43372,0 -1.30116,0.120479 0.5542,-0.891541 2.07223,-3.445686 z"
|
||||
d="m 300.45417,2.2370076 q 1.42165,-2.7228142 2.77101,-5.15648 1.34936,-2.4336658 5.18057,-9.6623766 l 4.26494,-8.096155 q 0.43373,-0.84335 1.44574,-2.867389 -2.12042,-0.02409 -3.25291,-0.02409 -5.03601,0 -10.93945,0.313244 0.24095,-3.204728 0.33734,-7.39738 h 25.90288 l -0.36144,7.614241 -5.75887,11.059927 -3.66255,7.252806 q -1.46984,3.0360583 -3.27701,6.9636576 z"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:49.34799576px;line-height:1.25;font-family:'Eras Bold ITC';-inkscape-font-specification:'Eras Bold ITC Bold';letter-spacing:-7.09514618px"
|
||||
id="path1156" />
|
||||
id="path195" />
|
||||
</g>
|
||||
<g
|
||||
style="fill:#ffffff;enable-background:new"
|
||||
transform="matrix(0.24804687,0,0,0.2480469,-16.632728,273.1232)"
|
||||
id="g188">
|
||||
id="g180">
|
||||
<g
|
||||
aria-label="Development"
|
||||
transform="skewX(3)"
|
||||
style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:sans-serif;text-align:end;letter-spacing:-1.06666672px;word-spacing:0px;text-anchor:end;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.06666672px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
id="text186">
|
||||
id="text178">
|
||||
<path
|
||||
d="m 491.97892,49.720543 q 0.18333,-1.9 0.25,-3.041667 0.1,-1.699999 0.2,-4.399999 0.075,-2.066667 0.075,-2.958333 v -0.975 q 0.975,0.025 1.68333,0.025 0.68333,0 1.79167,-0.03333 1.10833,-0.04167 2.08333,-0.04167 1.11667,0 1.95833,0.133333 0.84167,0.133333 1.56667,0.55 0.73333,0.416667 1.225,1.091666 0.49167,0.675 0.75,1.583334 0.25833,0.9 0.25833,1.858333 0,0.941667 -0.2,1.816667 -0.2,0.866666 -0.55833,1.566666 -0.35833,0.7 -0.84167,1.208333 -0.475,0.5 -1.09166,0.858334 -0.45834,0.266666 -0.925,0.416666 -0.46667,0.15 -1.275,0.241667 -0.9,0.1 -2.04167,0.1 l -3.36667,-0.025 q -0.475,0 -1.54166,0.025 z m 3.6,-2.508333 q 0.45833,0.04167 0.95833,0.04167 0.85,0 1.51667,-0.15 0.66666,-0.15 1.16666,-0.641666 0.50834,-0.491667 0.75,-1.258333 0.24167,-0.775 0.24167,-1.583334 0,-0.991666 -0.35833,-1.666666 -0.35834,-0.683334 -0.95834,-0.95 -0.59166,-0.266667 -1.61666,-0.266667 -0.6,0 -1.41667,0.05 z"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:17.06666565px;line-height:110.00000238%;font-family:'Eras Bold ITC';-inkscape-font-specification:'Eras Bold ITC Bold';text-align:end;letter-spacing:-1.06666672px;text-anchor:end;fill:#ffffff;stroke-width:1.06666672px"
|
||||
id="path190" />
|
||||
d="m 491.97892,49.720543 c 0.35766,-3.779712 0.50216,-7.579331 0.525,-11.374999 3.49046,0.443312 8.13144,-1.363048 10.53958,2.077082 2.06476,3.531904 -0.001,9.387903 -4.57968,9.241667 -2.15889,0.129374 -4.32419,-0.02526 -6.4849,0.05625 z m 3.6,-2.508333 c 5.08666,1.944261 6.57694,-7.524029 1.04583,-6.462496 -1.51765,0.07086 -0.55297,2.611495 -0.92921,3.817997 -0.0389,0.881499 -0.0777,1.762999 -0.11662,2.644499 z"
|
||||
id="path182"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 512.24558,47.203876 q -0.10833,0.5 -0.41666,2.416667 -0.96667,0.191667 -1.625,0.25 -0.65834,0.06667 -1.33334,0.06667 -0.99166,0 -1.825,-0.141667 -0.83333,-0.133333 -1.44166,-0.483333 -0.6,-0.35 -1.00834,-0.866667 -0.40833,-0.525 -0.625,-1.241667 -0.20833,-0.716666 -0.20833,-1.475 0,-1.066666 0.425,-2.083333 0.425,-1.025 1.09167,-1.6 0.675,-0.575 1.55,-0.816666 0.875,-0.241667 1.79166,-0.241667 0.95,0 1.80834,0.225 0.86666,0.216667 1.46666,0.766667 0.6,0.55 0.85,1.241666 0.25834,0.691667 0.25834,1.491667 0,0.475 -0.10834,1.058333 l -5.84166,0.0083 q -0.008,0.133334 -0.008,0.241667 0,0.9 0.64167,1.325 0.64167,0.425 1.56667,0.425 0.55,0 1.25,-0.125 0.70833,-0.133333 1.74166,-0.441667 z m -5.125,-2.699999 h 2.75 q 0.008,-0.141667 0.008,-0.241667 0,-0.433333 -0.15834,-0.741667 -0.15,-0.308333 -0.44166,-0.45 -0.28334,-0.141666 -0.64167,-0.141666 -0.25,0 -0.48333,0.08333 -0.23334,0.075 -0.425,0.233333 -0.18334,0.15 -0.30834,0.35 -0.125,0.2 -0.18333,0.391667 -0.0583,0.183333 -0.11667,0.516667 z"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:17.06666565px;line-height:110.00000238%;font-family:'Eras Bold ITC';-inkscape-font-specification:'Eras Bold ITC Bold';text-align:end;letter-spacing:-1.06666672px;text-anchor:end;fill:#ffffff;stroke-width:1.06666672px"
|
||||
id="path192" />
|
||||
d="m 512.24558,47.203876 c 0.52141,4.243467 -6.54348,3.268808 -8.01041,0.668753 -1.60517,-3.045601 0.78554,-7.314219 4.38541,-6.885416 2.83009,-1.160482 6.54312,4.736022 3.01361,4.785125 -1.52676,0.0022 -3.05351,0.0043 -4.58027,0.0065 -0.10363,2.874436 3.58483,1.929793 5.19166,1.42503 z m -5.125,-2.699999 c 1.63658,0.459668 4.34329,-0.405987 1.51633,-1.575 -0.87243,-0.02294 -1.46212,0.769347 -1.51633,1.575 z"
|
||||
id="path184"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 515.32058,49.720543 -0.88333,-2.733333 -1.99167,-5.775 q 0.95,0.01667 1.76667,0.01667 0.85,0 1.6,-0.01667 0.14167,0.575 0.55833,2.016667 0.41667,1.433333 0.91667,3.416666 l 0.21666,-0.691667 q 0.05,-0.125 0.39167,-1.066666 l 1.325,-3.675 q 0.9,0.01667 1.7,0.01667 0.825,0 1.71667,-0.01667 l -1.15,2.475 -2.14167,4.916666 -0.45833,1.116667 q -0.98334,-0.01667 -1.73334,-0.01667 -0.81666,0 -1.83333,0.01667 z"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:17.06666565px;line-height:110.00000238%;font-family:'Eras Bold ITC';-inkscape-font-specification:'Eras Bold ITC Bold';text-align:end;letter-spacing:-1.06666672px;text-anchor:end;fill:#ffffff;stroke-width:1.06666672px"
|
||||
id="path194" />
|
||||
d="m 515.32058,49.720543 c -0.89608,-2.856903 -1.90527,-5.67603 -2.875,-8.508333 4.00292,-1.488552 4.10167,3.245809 4.90451,5.232714 0.59217,-1.75459 1.25338,-3.486278 1.87049,-5.232714 2.56625,-0.335933 4.13116,-0.124958 2.35362,2.287869 -0.9018,2.070641 -1.83023,4.13055 -2.68695,6.220464 -1.18878,-0.02218 -2.37788,-0.02114 -3.56667,0 z"
|
||||
id="path186"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 530.27891,47.203876 q -0.10833,0.5 -0.41666,2.416667 -0.96667,0.191667 -1.625,0.25 -0.65834,0.06667 -1.33334,0.06667 -0.99166,0 -1.82499,-0.141667 -0.83334,-0.133333 -1.44167,-0.483333 -0.6,-0.35 -1.00833,-0.866667 -0.40834,-0.525 -0.625,-1.241667 -0.20834,-0.716666 -0.20834,-1.475 0,-1.066666 0.425,-2.083333 0.425,-1.025 1.09167,-1.6 0.675,-0.575 1.55,-0.816666 0.875,-0.241667 1.79166,-0.241667 0.95,0 1.80834,0.225 0.86666,0.216667 1.46666,0.766667 0.6,0.55 0.85,1.241666 0.25834,0.691667 0.25834,1.491667 0,0.475 -0.10834,1.058333 l -5.84166,0.0083 q -0.008,0.133334 -0.008,0.241667 0,0.9 0.64166,1.325 0.64167,0.425 1.56667,0.425 0.55,0 1.25,-0.125 0.70833,-0.133333 1.74166,-0.441667 z m -5.12499,-2.699999 h 2.74999 q 0.008,-0.141667 0.008,-0.241667 0,-0.433333 -0.15834,-0.741667 -0.15,-0.308333 -0.44166,-0.45 -0.28334,-0.141666 -0.64167,-0.141666 -0.25,0 -0.48333,0.08333 -0.23334,0.075 -0.425,0.233333 -0.18334,0.15 -0.30834,0.35 -0.125,0.2 -0.18333,0.391667 -0.0583,0.183333 -0.11666,0.516667 z"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:17.06666565px;line-height:110.00000238%;font-family:'Eras Bold ITC';-inkscape-font-specification:'Eras Bold ITC Bold';text-align:end;letter-spacing:-1.06666672px;text-anchor:end;fill:#ffffff;stroke-width:1.06666672px"
|
||||
id="path196" />
|
||||
d="m 530.27891,47.203876 c 0.52141,4.243466 -6.54347,3.268809 -8.01041,0.668753 -1.60517,-3.045602 0.78554,-7.314218 4.38541,-6.885416 2.83009,-1.160482 6.54312,4.736022 3.01361,4.785125 -1.52676,0.0022 -3.05351,0.0043 -4.58027,0.0065 -0.10363,2.874436 3.58479,1.929795 5.19166,1.42503 z m -5.12499,-2.699999 c 1.63658,0.45967 4.34327,-0.405989 1.51632,-1.575 -0.87243,-0.02294 -1.46213,0.769344 -1.51632,1.575 z"
|
||||
id="path188"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 531.04558,49.71221 0.15,-1.791667 0.325,-6.225 0.0917,-3.349999 q 1.15833,0.01667 1.74166,0.01667 0.75834,0 1.675,-0.01667 l -0.19166,2.558333 -0.30834,6.299999 -0.0667,2.516667 q -0.89167,-0.01667 -1.60834,-0.01667 z"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:17.06666565px;line-height:110.00000238%;font-family:'Eras Bold ITC';-inkscape-font-specification:'Eras Bold ITC Bold';text-align:end;letter-spacing:-1.06666672px;text-anchor:end;fill:#ffffff;stroke-width:1.06666672px"
|
||||
id="path198" />
|
||||
d="m 531.04558,49.71221 c 0.30065,-3.781668 0.47414,-7.574189 0.5667,-11.366666 2.51426,-0.447643 4.06213,-0.083 3.225,2.558333 -0.13223,2.938617 -0.32432,5.874975 -0.37504,8.816666 -1.13879,-0.02585 -2.27775,-0.0128 -3.41666,-0.0083 z"
|
||||
id="path190"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 540.25391,40.995543 q 1.03334,0 1.98334,0.316667 0.95833,0.316667 1.61666,0.916667 0.65834,0.591666 0.96667,1.391666 0.31667,0.791667 0.31667,1.708334 0,0.891666 -0.28334,1.699999 -0.275,0.8 -0.94166,1.508334 -0.66667,0.7 -1.7,1.05 -1.025,0.35 -2.175,0.35 -1.05834,0 -2.03334,-0.308334 -0.975,-0.308333 -1.63333,-0.9 -0.65,-0.591666 -0.98333,-1.416666 -0.325,-0.825 -0.325,-1.733334 0,-0.908333 0.31666,-1.733333 0.325,-0.825 1.01667,-1.483333 0.7,-0.658333 1.725,-1.008333 1.025,-0.358334 2.13333,-0.358334 z m -0.0583,2.45 q -0.53333,0 -0.95,0.275 -0.41667,0.275 -0.63333,0.808334 -0.20834,0.525 -0.20834,1.149999 0,0.916667 0.45834,1.408334 0.45833,0.483333 1.15,0.483333 0.525,0 0.94166,-0.275 0.41667,-0.283333 0.625,-0.825 0.21667,-0.55 0.21667,-1.175 0,-0.516666 -0.16667,-0.933333 -0.16666,-0.416667 -0.55,-0.666667 -0.375,-0.25 -0.88333,-0.25 z"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:17.06666565px;line-height:110.00000238%;font-family:'Eras Bold ITC';-inkscape-font-specification:'Eras Bold ITC Bold';text-align:end;letter-spacing:-1.06666672px;text-anchor:end;fill:#ffffff;stroke-width:1.06666672px"
|
||||
id="path200" />
|
||||
d="m 540.25391,40.995543 c 3.01725,-0.298693 5.7229,2.653473 4.72396,5.623958 -1.09074,4.689975 -9.56531,4.40163 -9.89531,-0.591666 -0.42534,-2.962386 2.38271,-5.18724 5.17135,-5.032292 z m -0.0583,2.45 c -4.24412,0.537467 0.25374,7.084332 1.54583,2.45625 0.26905,-1.066587 -0.2405,-2.522332 -1.54583,-2.45625 z"
|
||||
id="path192"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 545.04558,53.620543 q 0.15833,-1.708334 0.26666,-3.408333 0.19167,-2.908334 0.25834,-4.875 0.075,-1.975 0.075,-3.908333 1.69166,-0.258334 2.65,-0.341667 0.95833,-0.09167 1.91666,-0.09167 1.2,0 2.20834,0.25 1.00833,0.25 1.61666,0.883334 0.61667,0.633333 0.925,1.508333 0.30834,0.875 0.30834,1.833333 0,0.875 -0.25,1.7 -0.25,0.816667 -0.76667,1.475 -0.51667,0.658333 -1.19167,0.975 -0.66666,0.316667 -1.49166,0.316667 -0.40834,0 -0.85,-0.08333 -0.43334,-0.075 -0.825,-0.225 -0.39167,-0.15 -0.65834,-0.3 -0.25833,-0.158333 -0.65,-0.45 l -0.0917,2.325 q -0.0583,1.6 -0.0583,2.416667 -0.96666,-0.01667 -1.65833,-0.01667 -0.6,0 -1.73333,0.01667 z m 3.84166,-10.066666 q -0.0667,0.375 -0.0917,0.616666 -0.025,0.233334 -0.05,0.641667 -0.025,0.4 -0.025,0.641666 0,0.683334 0.20833,1.15 0.21667,0.458334 0.59167,0.716667 0.38333,0.25 0.81666,0.25 0.45834,0 0.84167,-0.258333 0.38333,-0.266667 0.60833,-0.791667 0.225,-0.525 0.225,-1.183333 0,-0.891667 -0.475,-1.433333 -0.46666,-0.541667 -1.36666,-0.541667 -0.56667,0 -1.28334,0.191667 z"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:17.06666565px;line-height:110.00000238%;font-family:'Eras Bold ITC';-inkscape-font-specification:'Eras Bold ITC Bold';text-align:end;letter-spacing:-1.06666672px;text-anchor:end;fill:#ffffff;stroke-width:1.06666672px"
|
||||
id="path202" />
|
||||
d="m 545.04558,53.620543 c 0.35496,-4.053817 0.59136,-8.121391 0.6,-12.191666 2.97411,-0.291852 7.40962,-1.515461 9.14322,1.785934 1.76018,3.142194 -1.08502,8.159132 -4.89322,6.414066 -2.7439,-2.317277 -0.35353,3.728125 -1.92448,3.984374 -0.97516,-0.01651 -1.95042,-0.0079 -2.92552,0.0073 z m 3.84166,-10.066666 c -1.84548,2.987641 2.95745,6.020885 3.12496,1.783333 0.15011,-1.803962 -1.73874,-2.3203 -3.12496,-1.783333 z"
|
||||
id="path194"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 555.45391,49.720543 0.23334,-4.016667 0.13333,-3.141666 0.0167,-1.35 q 0.91666,0.01667 1.61666,0.01667 0.79167,0 1.54167,-0.01667 l -0.0583,1.108333 q 0.25833,-0.333333 0.43333,-0.508333 0.18333,-0.183333 0.44167,-0.341667 0.25833,-0.166666 0.53333,-0.258333 0.275,-0.1 0.61667,-0.158333 0.34166,-0.05833 0.71666,-0.05833 0.425,0 0.78334,0.075 0.35833,0.06667 0.61666,0.175 0.25834,0.108334 0.45,0.25 0.19167,0.141667 0.33334,0.325 0.15,0.175 0.34166,0.516667 0.36667,-0.533333 0.775,-0.808333 0.40834,-0.275 0.925,-0.4 0.525,-0.133334 1.075,-0.133334 0.725,0 1.36667,0.208334 0.64167,0.208333 1.05,0.725 0.41667,0.508333 0.41667,1.325 0,0.383333 -0.0583,1.158333 -0.05,0.775 -0.15,2.666666 -0.0917,1.883334 -0.1,2.641667 -0.76666,-0.01667 -1.48333,-0.01667 -0.875,0 -1.83333,0.01667 0.0833,-1.058333 0.16666,-2.65 0.0917,-1.6 0.0917,-2.216666 0,-0.533334 -0.125,-0.791667 -0.125,-0.266667 -0.325,-0.358333 -0.19167,-0.1 -0.425,-0.1 -0.25,0 -0.43333,0.09167 -0.2,0.1 -0.35,0.308334 -0.2,0.275 -0.325,0.691666 -0.1,0.325 -0.15834,0.991667 -0.0583,0.683333 -0.0917,1.8 l -0.0667,2.233333 q -0.89167,-0.01667 -1.60833,-0.01667 -0.73334,0 -1.725,0.01667 0.075,-0.741667 0.175,-2.491667 0.1,-1.75 0.1,-2.341666 0,-0.5 -0.1,-0.75 -0.1,-0.25 -0.28334,-0.4 -0.175,-0.15 -0.475,-0.15 -0.325,0 -0.56666,0.191667 -0.24167,0.191666 -0.41667,0.55 -0.16667,0.358333 -0.24167,0.991666 -0.0667,0.625 -0.125,1.916667 -0.0583,1.291666 -0.075,2.483333 -1.00833,-0.01667 -1.63333,-0.01667 -0.69167,0 -1.71667,0.01667 z"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:17.06666565px;line-height:110.00000238%;font-family:'Eras Bold ITC';-inkscape-font-specification:'Eras Bold ITC Bold';text-align:end;letter-spacing:-1.06666672px;text-anchor:end;fill:#ffffff;stroke-width:1.06666672px"
|
||||
id="path204" />
|
||||
d="m 555.45391,49.720543 c 0.16034,-2.834333 0.35688,-5.66874 0.38337,-8.508333 1.15151,0.2957 3.7136,-0.830715 3.10003,1.108333 1.30955,-2.529937 4.72122,-0.53374 5.64375,-0.452079 3.42124,-2.856178 6.52957,1.306413 5.04717,4.754947 1.14945,2.896676 -2.16476,4.132344 -3.39923,2.534636 0.3676,-1.51179 0.62085,-7.734534 -1.76662,-4.462496 -0.99613,1.534445 1.11226,5.830528 -1.92507,5.00833 -4.04278,1.499834 0.86,-8.028853 -3.29167,-5.374996 -1.40096,2.809083 1.91426,6.388064 -3.79173,5.391658 z"
|
||||
id="path196"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 578.51224,47.203876 q -0.10833,0.5 -0.41666,2.416667 -0.96667,0.191667 -1.625,0.25 -0.65834,0.06667 -1.33334,0.06667 -0.99166,0 -1.825,-0.141667 -0.83333,-0.133333 -1.44166,-0.483333 -0.6,-0.35 -1.00834,-0.866667 -0.40833,-0.525 -0.625,-1.241667 -0.20833,-0.716666 -0.20833,-1.475 0,-1.066666 0.425,-2.083333 0.425,-1.025 1.09167,-1.6 0.675,-0.575 1.55,-0.816666 0.875,-0.241667 1.79166,-0.241667 0.95,0 1.80834,0.225 0.86666,0.216667 1.46666,0.766667 0.6,0.55 0.85,1.241666 0.25834,0.691667 0.25834,1.491667 0,0.475 -0.10834,1.058333 l -5.84166,0.0083 q -0.008,0.133334 -0.008,0.241667 0,0.9 0.64167,1.325 0.64167,0.425 1.56667,0.425 0.55,0 1.25,-0.125 0.70833,-0.133333 1.74166,-0.441667 z m -5.125,-2.699999 h 2.75 q 0.008,-0.141667 0.008,-0.241667 0,-0.433333 -0.15834,-0.741667 -0.15,-0.308333 -0.44166,-0.45 -0.28334,-0.141666 -0.64167,-0.141666 -0.25,0 -0.48333,0.08333 -0.23334,0.075 -0.425,0.233333 -0.18334,0.15 -0.30834,0.35 -0.125,0.2 -0.18333,0.391667 -0.0583,0.183333 -0.11667,0.516667 z"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:17.06666565px;line-height:110.00000238%;font-family:'Eras Bold ITC';-inkscape-font-specification:'Eras Bold ITC Bold';text-align:end;letter-spacing:-1.06666672px;text-anchor:end;fill:#ffffff;stroke-width:1.06666672px"
|
||||
id="path206" />
|
||||
d="m 578.51224,47.203876 c 0.52141,4.243467 -6.54348,3.268808 -8.01041,0.668753 -1.60517,-3.045601 0.78554,-7.314219 4.38541,-6.885416 2.83009,-1.160482 6.54312,4.736022 3.01361,4.785125 -1.52676,0.0022 -3.05351,0.0043 -4.58027,0.0065 -0.10363,2.874436 3.58483,1.929793 5.19166,1.42503 z m -5.125,-2.699999 c 1.63658,0.459668 4.34329,-0.405987 1.51633,-1.575 -0.87243,-0.02294 -1.46212,0.769347 -1.51633,1.575 z"
|
||||
id="path198"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 579.21224,49.720543 q 0.24167,-1.891667 0.36667,-4.175 0.13333,-2.291666 0.15833,-4.333333 1,0.01667 1.725,0.01667 0.84167,0 1.61667,-0.01667 l -0.0833,1.133333 q 0.275,-0.308333 0.475,-0.483333 0.2,-0.183333 0.49166,-0.35 0.3,-0.175 0.63334,-0.283333 0.33333,-0.108334 0.725,-0.166667 0.4,-0.06667 0.83333,-0.06667 0.6,0 1.16667,0.133334 0.575,0.125 0.95833,0.366666 0.38333,0.233334 0.64167,0.591667 0.25833,0.35 0.34166,0.758333 0.0833,0.408334 0.0833,0.841667 0,0.316667 -0.0667,1.366667 l -0.14167,3.016666 q -0.0417,0.891667 -0.0417,1.65 -0.84167,-0.01667 -1.575,-0.01667 -0.99167,0 -1.80834,0.01667 0.075,-0.758333 0.15834,-2.25 0.0833,-1.5 0.0833,-2.108333 0,-0.941667 -0.36667,-1.308333 -0.35833,-0.375 -0.90833,-0.375 -0.48333,0 -0.91667,0.316666 -0.425,0.316667 -0.65833,0.925 -0.23333,0.6 -0.33333,1.983333 -0.0917,1.383334 -0.125,2.816667 -0.83334,-0.01667 -1.625,-0.01667 -0.83334,0 -1.80834,0.01667 z"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:17.06666565px;line-height:110.00000238%;font-family:'Eras Bold ITC';-inkscape-font-specification:'Eras Bold ITC Bold';text-align:end;letter-spacing:-1.06666672px;text-anchor:end;fill:#ffffff;stroke-width:1.06666672px"
|
||||
id="path208" />
|
||||
d="m 579.21224,49.720543 c 0.93465,-2.56639 -0.64881,-7.469587 1.45625,-8.49583 1.0983,0.09576 2.93645,-0.553409 2.32712,1.12083 2.39227,-3.020404 7.77608,-0.814174 6.26354,3.128332 -0.35525,1.853997 0.77815,5.186306 -2.22355,4.231037 -2.77419,0.701084 0.4362,-9.35128 -3.9318,-4.784372 -1.3168,3.048475 1.7868,5.470432 -3.89156,4.800003 z"
|
||||
id="path200"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 596.02891,47.270543 q -0.15,0.7 -0.25833,1.366667 l -0.18334,1.016666 q -0.825,0.183334 -1.29166,0.233334 -0.45834,0.05 -0.89167,0.05 -0.70833,0 -1.25833,-0.125 -0.55,-0.116667 -0.91667,-0.433334 -0.36667,-0.325 -0.5,-0.741666 -0.13333,-0.416667 -0.13333,-0.883334 0,-0.08333 0.008,-0.291666 0.008,-0.216667 0.0583,-0.95 l 0.18334,-2.883333 h -1.3 q 0.0417,-0.575 0.075,-1.516667 l 0.025,-0.775 h 1.38333 q 0.05,-0.383333 0.125,-1.675 l 1.425,-0.291666 q 0.39167,-0.075 1.66667,-0.383334 -0.0583,1.091667 -0.0833,2.35 h 1.9 q -0.0667,1.733333 -0.0667,2.291667 h -1.91667 l -0.1,2.083333 q -0.0167,0.466666 -0.0167,0.6 0,0.4 0.0833,0.666666 0.0917,0.266667 0.30833,0.383334 0.225,0.116666 0.49167,0.116666 0.2,0 0.41666,-0.025 0.21667,-0.03333 0.76667,-0.183333 z"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:17.06666565px;line-height:110.00000238%;font-family:'Eras Bold ITC';-inkscape-font-specification:'Eras Bold ITC Bold';text-align:end;letter-spacing:-1.06666672px;text-anchor:end;fill:#ffffff;stroke-width:1.06666672px"
|
||||
id="path210" />
|
||||
d="m 596.02891,47.270543 c 0.87876,3.579834 -5.40876,3.65248 -5.43333,0.483333 -0.27646,-1.191085 0.79838,-3.603899 -0.17082,-4.124999 -1.63908,0.457718 -1.14045,-3.314326 0.60379,-2.291667 -0.78331,-2.571711 4.86457,-3.264417 3.13337,0 2.1881,-1.157251 2.856,2.651389 0.78214,2.291667 -1.64157,-0.379018 -1.16187,3.704272 -0.0989,3.849999 l 0.41666,-0.025 0.76667,-0.183333 z"
|
||||
id="path202"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
style="fill:#ffffff;enable-background:new"
|
||||
transform="matrix(0.24804687,0,0,0.2480469,-127.75775,273.1232)"
|
||||
id="g220" />
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 95 KiB After Width: | Height: | Size: 89 KiB |
@ -1423,7 +1423,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: <b>-</b>
|
||||
!MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue.
|
||||
!MAIN_MSG_WRITEFAILED;Failed to write\n<b>"%1"</b>\n\nMake sure that the folder exists and that you have write permission to it.
|
||||
!MAIN_TAB_ADVANCED;Advanced
|
||||
!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: <b>Alt-w</b>
|
||||
!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: <b>Alt</b>-<b>a</b>
|
||||
!MAIN_TAB_FAVORITES;Favorites
|
||||
!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: <b>Alt-u</b>
|
||||
!MAIN_TAB_INSPECT; Inspect
|
||||
|
@ -1468,7 +1468,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: <b>-</b>
|
||||
!MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue.
|
||||
!MAIN_MSG_WRITEFAILED;Failed to write\n<b>"%1"</b>\n\nMake sure that the folder exists and that you have write permission to it.
|
||||
!MAIN_TAB_ADVANCED;Advanced
|
||||
!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: <b>Alt-w</b>
|
||||
!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: <b>Alt</b>-<b>a</b>
|
||||
!MAIN_TAB_FAVORITES;Favorites
|
||||
!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: <b>Alt-u</b>
|
||||
!MAIN_TOOLTIP_BACKCOLOR0;Background color of the preview: <b>theme-based</b>\nShortcut: <b>9</b>
|
||||
|
@ -934,7 +934,7 @@ MAIN_MSG_SETPATHFIRST;K použití této funkce musíte nejprve zadat cílovou ce
|
||||
MAIN_MSG_TOOMANYOPENEDITORS;Příliš mnoho otevřených editorů.\nPro pokračování nejprve některý ukončete.
|
||||
MAIN_MSG_WRITEFAILED;Chyba zápisu\n<b>"%1"</b>\n\nUjistěte se, že složka existuje a máte práva do ní zapisovat.
|
||||
MAIN_TAB_ADVANCED;Pokročilé
|
||||
MAIN_TAB_ADVANCED_TOOLTIP;Zkratka: <b>Alt-w</b>
|
||||
MAIN_TAB_ADVANCED_TOOLTIP;Zkratka: <b>Alt</b>-<b>a</b>
|
||||
MAIN_TAB_COLOR;Barvy
|
||||
MAIN_TAB_COLOR_TOOLTIP;Zkratka: <b>Alt-c</b>
|
||||
MAIN_TAB_DETAIL;Detaily
|
||||
|
@ -984,7 +984,7 @@ MAIN_MSG_SETPATHFIRST;Um diese Funktion zu nutzen, müssen Sie zuerst in den Ein
|
||||
MAIN_MSG_TOOMANYOPENEDITORS;Zu viele geöffnete Editorfenster.\nUm fortzufahren, schließen sie bitte ein Editorfenster.
|
||||
MAIN_MSG_WRITEFAILED;Fehler beim Schreiben von\n\n<b>"%1"</b>\n\nStellen Sie sicher, dass das Verzeichnis existiert und dass Sie Schreibrechte besitzen.
|
||||
MAIN_TAB_ADVANCED;Erweitert
|
||||
MAIN_TAB_ADVANCED_TOOLTIP;Taste: <b>Alt</b> + <b>w</b>
|
||||
MAIN_TAB_ADVANCED_TOOLTIP;Taste: <b>Alt</b> + <b>a</b>
|
||||
MAIN_TAB_COLOR;Farbe
|
||||
MAIN_TAB_COLOR_TOOLTIP;Taste: <b>Alt</b> + <b>c</b>
|
||||
MAIN_TAB_DETAIL;Details
|
||||
|
@ -990,7 +990,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh
|
||||
!MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue.
|
||||
!MAIN_MSG_WRITEFAILED;Failed to write\n<b>"%1"</b>\n\nMake sure that the folder exists and that you have write permission to it.
|
||||
!MAIN_TAB_ADVANCED;Advanced
|
||||
!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: <b>Alt-w</b>
|
||||
!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: <b>Alt</b>-<b>a</b>
|
||||
!MAIN_TAB_COLOR_TOOLTIP;Shortcut: <b>Alt-c</b>
|
||||
!MAIN_TAB_DETAIL;Detail
|
||||
!MAIN_TAB_DETAIL_TOOLTIP;Shortcut: <b>Alt-d</b>
|
||||
|
@ -902,7 +902,7 @@
|
||||
!MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue.
|
||||
!MAIN_MSG_WRITEFAILED;Failed to write\n<b>"%1"</b>\n\nMake sure that the folder exists and that you have write permission to it.
|
||||
!MAIN_TAB_ADVANCED;Advanced
|
||||
!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: <b>Alt-w</b>
|
||||
!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: <b>Alt</b>-<b>a</b>
|
||||
!MAIN_TAB_COLOR;Color
|
||||
!MAIN_TAB_COLOR_TOOLTIP;Shortcut: <b>Alt-c</b>
|
||||
!MAIN_TAB_DETAIL;Detail
|
||||
|
@ -954,7 +954,7 @@ MAIN_MSG_SETPATHFIRST;Para poder usar esta función, primero tiene que establece
|
||||
MAIN_MSG_TOOMANYOPENEDITORS;Demasiados editores abiertos.\n<b>Por favor cierre un editor para continuar.</b>
|
||||
MAIN_MSG_WRITEFAILED;Falla al escribir\n\n<b>"%1"</b>\n\nAsegurese de que el folder exista y que usted tenga permiso de escritura sobre él.
|
||||
MAIN_TAB_ADVANCED;Avanzado
|
||||
MAIN_TAB_ADVANCED_TOOLTIP;Tecla de Atajo: <b>Alt-w</b>
|
||||
MAIN_TAB_ADVANCED_TOOLTIP;Tecla de Atajo: <b>Alt</b>-<b>a</b>
|
||||
MAIN_TAB_COLOR;Color
|
||||
MAIN_TAB_COLOR_TOOLTIP;Tecla de Atajo: <b>Alt-C</b>
|
||||
MAIN_TAB_DETAIL;Detalle
|
||||
|
@ -891,7 +891,7 @@ MAIN_MSG_SETPATHFIRST;Vous devez d'abord choisir un dossier cible dans Préfére
|
||||
MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue.
|
||||
MAIN_MSG_WRITEFAILED;Échec de l'enregistrement du fichier\n\n<b>"%1"</b>\n\nAssurez-vous que le dossier existe et qu'il est permis d'y écrire.
|
||||
MAIN_TAB_ADVANCED;Avancé
|
||||
MAIN_TAB_ADVANCED_TOOLTIP;Raccourci: <b>Alt-w</b>
|
||||
MAIN_TAB_ADVANCED_TOOLTIP;Raccourci: <b>Alt</b>-<b>a</b>
|
||||
MAIN_TAB_COLOR;Couleur
|
||||
MAIN_TAB_COLOR_TOOLTIP;Raccourci:<b>Alt-c</b>
|
||||
MAIN_TAB_DETAIL;Détail
|
||||
|
@ -1640,7 +1640,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: <b>-</b>
|
||||
!MAIN_FRAME_PLACES_DEL;Remove
|
||||
!MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue.
|
||||
!MAIN_TAB_ADVANCED;Advanced
|
||||
!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: <b>Alt-w</b>
|
||||
!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: <b>Alt</b>-<b>a</b>
|
||||
!MAIN_TAB_FAVORITES;Favorites
|
||||
!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: <b>Alt-u</b>
|
||||
!MAIN_TAB_INSPECT; Inspect
|
||||
|
@ -933,7 +933,7 @@ MAIN_MSG_SETPATHFIRST;この関数を使用するには、最初に環境設定
|
||||
MAIN_MSG_TOOMANYOPENEDITORS;編集画面が多すぎます\n操作を続けるには何れかの画面を閉じてください
|
||||
MAIN_MSG_WRITEFAILED;書き込みに失敗しました\n\n<b>"%1"</b>\n\nフォルダが在るか書き込み権限を持っているか確認してください
|
||||
MAIN_TAB_ADVANCED;高度な機能
|
||||
MAIN_TAB_ADVANCED_TOOLTIP;ショートカット: <b>Alt-w</b>
|
||||
MAIN_TAB_ADVANCED_TOOLTIP;ショートカット: <b>Alt</b>-<b>a</b>
|
||||
MAIN_TAB_COLOR;カラー
|
||||
MAIN_TAB_COLOR_TOOLTIP;ショートカット: <b>Alt-c</b>
|
||||
MAIN_TAB_DETAIL;CbDL
|
||||
|
@ -13,6 +13,6 @@
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
# along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
|
@ -1357,7 +1357,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés <b>-</b>
|
||||
!MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue.
|
||||
!MAIN_MSG_WRITEFAILED;Failed to write\n<b>"%1"</b>\n\nMake sure that the folder exists and that you have write permission to it.
|
||||
!MAIN_TAB_ADVANCED;Advanced
|
||||
!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: <b>Alt-w</b>
|
||||
!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: <b>Alt</b>-<b>a</b>
|
||||
!MAIN_TAB_FAVORITES;Favorites
|
||||
!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: <b>Alt-u</b>
|
||||
!MAIN_TAB_INSPECT; Inspect
|
||||
|
@ -2111,7 +2111,7 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: <b>-</b>
|
||||
!MAIN_FRAME_PLACES_DEL;Remove
|
||||
!MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue.
|
||||
!MAIN_TAB_ADVANCED;Advanced
|
||||
!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: <b>Alt-w</b>
|
||||
!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: <b>Alt</b>-<b>a</b>
|
||||
!MAIN_TAB_FAVORITES;Favorites
|
||||
!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: <b>Alt-u</b>
|
||||
!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: <b>middle grey</b>\nShortcut: <b>9</b>
|
||||
|
@ -1722,7 +1722,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: <b>-</b>
|
||||
!MAIN_FRAME_PLACES_DEL;Remove
|
||||
!MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue.
|
||||
!MAIN_TAB_ADVANCED;Advanced
|
||||
!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: <b>Alt-w</b>
|
||||
!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: <b>Alt</b>-<b>a</b>
|
||||
!MAIN_TAB_FAVORITES;Favorites
|
||||
!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: <b>Alt-u</b>
|
||||
!MAIN_TAB_INSPECT; Inspect
|
||||
|
@ -889,7 +889,7 @@ MAIN_MSG_SETPATHFIRST;Para usar esta função, primeiro tem de configurar um cam
|
||||
MAIN_MSG_TOOMANYOPENEDITORS;Existem demasiados editores abertos.\nPor favor, feche um editor para continuar.
|
||||
MAIN_MSG_WRITEFAILED;Falha ao gravar\n<b>"%1"</b>\n\nVerifique se a pasta existe e se tem permissão para gravar nela.
|
||||
MAIN_TAB_ADVANCED;Avançado
|
||||
MAIN_TAB_ADVANCED_TOOLTIP;Atalho: <b>Alt-w</b>
|
||||
MAIN_TAB_ADVANCED_TOOLTIP;Atalho: <b>Alt</b>-<b>a</b>
|
||||
MAIN_TAB_COLOR;Cor
|
||||
MAIN_TAB_COLOR_TOOLTIP;Atalho: <b>Alt-c</b>
|
||||
MAIN_TAB_DETAIL;Detalhe
|
||||
|
@ -888,7 +888,7 @@ MAIN_MSG_SETPATHFIRST;Para usar esta função primeiro defina um objetivo em Pre
|
||||
MAIN_MSG_TOOMANYOPENEDITORS;Muitos editores abertos.\nPor favor, feche um editor para continuar.
|
||||
MAIN_MSG_WRITEFAILED;Falha ao escrever\n<b>"%1"</b>\n\nVerifique se a pasta existe e se tens permissão para gravar nela.
|
||||
MAIN_TAB_ADVANCED;Avançado
|
||||
MAIN_TAB_ADVANCED_TOOLTIP;Atalho: <b>Alt-w</b>
|
||||
MAIN_TAB_ADVANCED_TOOLTIP;Atalho: <b>Alt</b>-<b>a</b>
|
||||
MAIN_TAB_COLOR;Cor
|
||||
MAIN_TAB_COLOR_TOOLTIP;Atalho: <b>Alt-c</b>
|
||||
MAIN_TAB_DETAIL;Detalhe
|
||||
|
@ -589,7 +589,7 @@ MAIN_MSG_QOVERWRITE;Вы хотите перезаписать его?
|
||||
MAIN_MSG_SETPATHFIRST;Прежде необходимо установить целевой каталог в настройках\nчтоб использовать эту функцию!
|
||||
MAIN_MSG_WRITEFAILED;Не удалось записать\n\n<b>"%1"</b>.\n\nУбедитесь, что каталог существует и у вас есть права на запись в него.
|
||||
MAIN_TAB_ADVANCED;Дополнительные
|
||||
MAIN_TAB_ADVANCED_TOOLTIP;Горячая клавиша: <b>Alt-W</b>
|
||||
MAIN_TAB_ADVANCED_TOOLTIP;Горячая клавиша: <b>Alt</b>-<b>a</b>
|
||||
MAIN_TAB_COLOR;Цвет
|
||||
MAIN_TAB_COLOR_TOOLTIP;Горячая клавиша: <b>Alt-C</b>
|
||||
MAIN_TAB_DETAIL;Детализация
|
||||
|
@ -1614,7 +1614,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике <b>-</b>
|
||||
!MAIN_FRAME_PLACES_DEL;Remove
|
||||
!MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue.
|
||||
!MAIN_TAB_ADVANCED;Advanced
|
||||
!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: <b>Alt-w</b>
|
||||
!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: <b>Alt</b>-<b>a</b>
|
||||
!MAIN_TAB_FAVORITES;Favorites
|
||||
!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: <b>Alt-u</b>
|
||||
!MAIN_TAB_INSPECT; Inspect
|
||||
|
@ -1963,7 +1963,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: <b>-</b>
|
||||
!MAIN_FRAME_PLACES_DEL;Remove
|
||||
!MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue.
|
||||
!MAIN_TAB_ADVANCED;Advanced
|
||||
!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: <b>Alt-w</b>
|
||||
!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: <b>Alt</b>-<b>a</b>
|
||||
!MAIN_TAB_FAVORITES;Favorites
|
||||
!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: <b>Alt-u</b>
|
||||
!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: <b>middle grey</b>\nShortcut: <b>9</b>
|
||||
|
@ -726,6 +726,7 @@ HISTORY_MSG_490;DRC - Amount
|
||||
HISTORY_MSG_491;White Balance
|
||||
HISTORY_MSG_492;RGB Curves
|
||||
HISTORY_MSG_493;L*a*b* Adjustments
|
||||
HISTORY_MSG_494;Capture Sharpening
|
||||
HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors
|
||||
HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction
|
||||
HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction
|
||||
@ -763,6 +764,12 @@ HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness
|
||||
HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius
|
||||
HISTORY_MSG_METADATA_MODE;Metadata copy mode
|
||||
HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold
|
||||
HISTORY_MSG_PDSHARPEN_CONTRAST;CAS - Contrast threshold
|
||||
HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CAS - Auto threshold
|
||||
HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CAS - Auto radius
|
||||
HISTORY_MSG_PDSHARPEN_GAMMA;CAS - Gamma
|
||||
HISTORY_MSG_PDSHARPEN_ITERATIONS;CAS - Iterations
|
||||
HISTORY_MSG_PDSHARPEN_RADIUS;CAS - Radius
|
||||
HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion
|
||||
HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction
|
||||
HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter
|
||||
@ -773,6 +780,7 @@ HISTORY_MSG_RAW_BORDER;Raw border
|
||||
HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling
|
||||
HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius
|
||||
HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold
|
||||
HISTORY_MSG_SHARPENING_GAMMA;Sharpening - Gamma
|
||||
HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace
|
||||
HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light
|
||||
HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength
|
||||
@ -903,7 +911,7 @@ MAIN_MSG_SETPATHFIRST;You first have to set a target path in Preferences in orde
|
||||
MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue.
|
||||
MAIN_MSG_WRITEFAILED;Failed to write\n<b>"%1"</b>\n\nMake sure that the folder exists and that you have write permission to it.
|
||||
MAIN_TAB_ADVANCED;Advanced
|
||||
MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: <b>Alt-w</b>
|
||||
MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: <b>Alt</b>-<b>a</b>
|
||||
MAIN_TAB_COLOR;Color
|
||||
MAIN_TAB_COLOR_TOOLTIP;Shortcut: <b>Alt-c</b>
|
||||
MAIN_TAB_DETAIL;Detail
|
||||
@ -1794,6 +1802,8 @@ TP_PCVIGNETTE_ROUNDNESS;Roundness
|
||||
TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Roundness:\n0 = rectangle,\n50 = fitted ellipse,\n100 = circle.
|
||||
TP_PCVIGNETTE_STRENGTH;Strength
|
||||
TP_PCVIGNETTE_STRENGTH_TOOLTIP;Filter strength in stops (reached in corners).
|
||||
TP_PDSHARPENING_LABEL;Capture Sharpening
|
||||
TP_PDSHARPENING_AUTORADIUS_TOOLTIP;If the checkbox is checked, RawTherapee calculates a value based on the raw data of the image.
|
||||
TP_PERSPECTIVE_HORIZONTAL;Horizontal
|
||||
TP_PERSPECTIVE_LABEL;Perspective
|
||||
TP_PERSPECTIVE_VERTICAL;Vertical
|
||||
@ -2022,6 +2032,7 @@ TP_SHARPENING_BLUR;Blur radius
|
||||
TP_SHARPENING_CONTRAST;Contrast threshold
|
||||
TP_SHARPENING_EDRADIUS;Radius
|
||||
TP_SHARPENING_EDTOLERANCE;Edge tolerance
|
||||
TP_SHARPENING_GAMMA;Gamma
|
||||
TP_SHARPENING_HALOCONTROL;Halo control
|
||||
TP_SHARPENING_HCAMOUNT;Amount
|
||||
TP_SHARPENING_LABEL;Sharpening
|
||||
|
@ -16,7 +16,7 @@
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/***************************/
|
||||
|
@ -15,7 +15,7 @@
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
* {
|
||||
|
@ -15,7 +15,7 @@
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
|
@ -15,7 +15,7 @@
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
|
@ -15,7 +15,7 @@
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*** Change me *** rgb(red,green,blue) *** allowed values from 0 to 255 for each color ***/
|
||||
|
@ -15,7 +15,7 @@
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*** Change me *** rgb(red,green,blue) *** allowed values from 0 to 255 for each color ***/
|
||||
|
@ -15,7 +15,7 @@
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
|
@ -15,7 +15,7 @@
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
|
@ -15,7 +15,7 @@
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
|
@ -15,7 +15,7 @@
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
|
@ -18,7 +18,7 @@
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
//
|
||||
////////////////////////////////////////////////////////////////
|
||||
|
||||
@ -106,6 +106,10 @@ bool LinEqSolve(int nDim, double* pfMatr, double* pfVect, double* pfSolution)
|
||||
//end of linear equation solver
|
||||
}
|
||||
|
||||
namespace rtengine {
|
||||
extern const Settings* settings;
|
||||
}
|
||||
|
||||
using namespace std;
|
||||
using namespace rtengine;
|
||||
|
||||
@ -701,7 +705,9 @@ float* RawImageSource::CA_correct_RT(
|
||||
blockvar[dir][c] = blocksqave[dir][c] / blockdenom[dir][c] - SQR(blockave[dir][c] / blockdenom[dir][c]);
|
||||
} else {
|
||||
processpasstwo = false;
|
||||
std::cout << "blockdenom vanishes" << std::endl;
|
||||
if (settings->verbose) {
|
||||
std::cout << "blockdenom vanishes" << std::endl;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -801,7 +807,9 @@ float* RawImageSource::CA_correct_RT(
|
||||
numpar = 4;
|
||||
|
||||
if (numblox[1] < 10) {
|
||||
std::cout << "numblox = " << numblox[1] << std::endl;
|
||||
if (settings->verbose) {
|
||||
std::cout << "numblox = " << numblox[1] << std::endl;
|
||||
}
|
||||
processpasstwo = false;
|
||||
}
|
||||
}
|
||||
|
@ -32,6 +32,7 @@ set(CAMCONSTSFILE "camconst.json")
|
||||
set(RTENGINESOURCEFILES
|
||||
badpixels.cc
|
||||
CA_correct_RT.cc
|
||||
capturesharpening.cc
|
||||
EdgePreservingDecomposition.cc
|
||||
FTblockDN.cc
|
||||
PF_correct_RT.cc
|
||||
|
@ -18,7 +18,7 @@
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
//
|
||||
////////////////////////////////////////////////////////////////
|
||||
|
||||
|
@ -15,7 +15,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
|
@ -23,7 +23,7 @@
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
//
|
||||
////////////////////////////////////////////////////////////////
|
||||
|
||||
|
@ -14,7 +14,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Author: reine
|
||||
*/
|
||||
|
@ -14,7 +14,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
//
|
||||
|
@ -14,7 +14,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#ifndef _ALIGNEDBUFFER_
|
||||
#define _ALIGNEDBUFFER_
|
||||
|
@ -22,7 +22,7 @@
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
//
|
||||
////////////////////////////////////////////////////////////////
|
||||
|
||||
|
@ -14,7 +14,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
|
@ -14,7 +14,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "array2D.h"
|
||||
|
@ -14,7 +14,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#ifndef _BILATERAL2_
|
||||
#define _BILATERAL2_
|
||||
|
@ -14,7 +14,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#ifndef _BOXBLUR_H_
|
||||
#define _BOXBLUR_H_
|
||||
|
@ -14,7 +14,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
@ -2250,6 +2250,11 @@ Camera constants:
|
||||
}
|
||||
},
|
||||
|
||||
{ // Quality C, only raw crop
|
||||
"make_model": "Samsung EX2F",
|
||||
"raw_crop": [ 16, 7, -4, -4 ]
|
||||
},
|
||||
|
||||
{ // Quality B, corrections for raw crop vs dcraw9.21, matched to Samsung's default
|
||||
"make_model": "Samsung NX mini",
|
||||
"dcraw_matrix": [ 5222,-1196,-550,-6540,14649,2009,-1666,2819,5657 ], // dng 8.6 d65
|
||||
|
798
rtengine/capturesharpening.cc
Normal file
798
rtengine/capturesharpening.cc
Normal file
@ -0,0 +1,798 @@
|
||||
/*
|
||||
* This file is part of RawTherapee.
|
||||
*
|
||||
* Copyright (c) 2019 Ingo Weyrich (heckflosse67@gmx.de)
|
||||
*
|
||||
* RawTherapee is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* RawTherapee is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include <cmath>
|
||||
#include <iostream>
|
||||
|
||||
#include "rtengine.h"
|
||||
#include "rawimagesource.h"
|
||||
#include "rt_math.h"
|
||||
#include "improcfun.h"
|
||||
#include "procparams.h"
|
||||
#include "color.h"
|
||||
#include "gauss.h"
|
||||
#include "rt_algo.h"
|
||||
//#define BENCHMARK
|
||||
#include "StopWatch.h"
|
||||
#ifdef _OPENMP
|
||||
#include <omp.h>
|
||||
#endif
|
||||
#include "opthelper.h"
|
||||
#include "../rtgui/multilangmgr.h"
|
||||
|
||||
namespace {
|
||||
|
||||
void compute7x7kernel(float sigma, float kernel[7][7]) {
|
||||
|
||||
const double temp = -2.f * rtengine::SQR(sigma);
|
||||
float sum = 0.f;
|
||||
for (int i = -3; i <= 3; ++i) {
|
||||
for (int j = -3; j <= 3; ++j) {
|
||||
if((rtengine::SQR(i) + rtengine::SQR(j)) <= rtengine::SQR(3.0 * 1.15)) {
|
||||
kernel[i + 3][j + 3] = std::exp((rtengine::SQR(i) + rtengine::SQR(j)) / temp);
|
||||
sum += kernel[i + 3][j + 3];
|
||||
} else {
|
||||
kernel[i + 3][j + 3] = 0.f;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < 7; ++i) {
|
||||
for (int j = 0; j < 7; ++j) {
|
||||
kernel[i][j] /= sum;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void compute5x5kernel(float sigma, float kernel[5][5]) {
|
||||
|
||||
const double temp = -2.f * rtengine::SQR(sigma);
|
||||
float sum = 0.f;
|
||||
for (int i = -2; i <= 2; ++i) {
|
||||
for (int j = -2; j <= 2; ++j) {
|
||||
if((rtengine::SQR(i) + rtengine::SQR(j)) <= rtengine::SQR(3.0 * 0.84)) {
|
||||
kernel[i + 2][j + 2] = std::exp((rtengine::SQR(i) + rtengine::SQR(j)) / temp);
|
||||
sum += kernel[i + 2][j + 2];
|
||||
} else {
|
||||
kernel[i + 2][j + 2] = 0.f;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < 5; ++i) {
|
||||
for (int j = 0; j < 5; ++j) {
|
||||
kernel[i][j] /= sum;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void compute3x3kernel(float sigma, float kernel[3][3]) {
|
||||
|
||||
const double temp = -2.f * rtengine::SQR(sigma);
|
||||
float sum = 0.f;
|
||||
for (int i = -1; i <= 1; ++i) {
|
||||
for (int j = -1; j <= 1; ++j) {
|
||||
if((rtengine::SQR(i) + rtengine::SQR(j)) <= rtengine::SQR(3.0 * 0.84)) {
|
||||
kernel[i + 1][j + 1] = std::exp((rtengine::SQR(i) + rtengine::SQR(j)) / temp);
|
||||
sum += kernel[i + 1][j + 1];
|
||||
} else {
|
||||
kernel[i + 1][j + 1] = 0.f;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < 3; ++i) {
|
||||
for (int j = 0; j < 3; ++j) {
|
||||
kernel[i][j] /= sum;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
inline void gauss3x3div (float** RESTRICT src, float** RESTRICT dst, float** RESTRICT divBuffer, const int W, const int H, const float kernel[3][3])
|
||||
{
|
||||
|
||||
const float c11 = kernel[0][0];
|
||||
const float c10 = kernel[0][1];
|
||||
const float c00 = kernel[1][1];
|
||||
|
||||
for (int i = 1; i < H - 1; i++) {
|
||||
dst[i][0] = 1.f;
|
||||
for (int j = 1; j < W - 1; j++) {
|
||||
const float val = c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) +
|
||||
c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) +
|
||||
c00 * src[i][j];
|
||||
dst[i][j] = divBuffer[i][j] / std::max(val, 0.00001f);
|
||||
}
|
||||
dst[i][W - 1] = 1.f;
|
||||
}
|
||||
// first and last row
|
||||
for (int j = 0; j < W; ++j) {
|
||||
dst[0][j] = 1.f;
|
||||
}
|
||||
for (int j = 0; j < W; ++j) {
|
||||
dst[H - 1][j] = 1.f;
|
||||
}
|
||||
}
|
||||
|
||||
inline void gauss5x5div (float** RESTRICT src, float** RESTRICT dst, float** RESTRICT divBuffer, const int W, const int H, const float kernel[5][5])
|
||||
{
|
||||
|
||||
const float c21 = kernel[0][1];
|
||||
const float c20 = kernel[0][2];
|
||||
const float c11 = kernel[1][1];
|
||||
const float c10 = kernel[1][2];
|
||||
const float c00 = kernel[2][2];
|
||||
|
||||
for (int i = 2; i < H - 2; ++i) {
|
||||
dst[i][0] = dst[i][1] = 1.f;
|
||||
// I tried hand written SSE code but gcc vectorizes better
|
||||
for (int j = 2; j < W - 2; ++j) {
|
||||
const float val = c21 * (src[i - 2][j - 1] + src[i - 2][j + 1] + src[i - 1][j - 2] + src[i - 1][j + 2] + src[i + 1][j - 2] + src[i + 1][j + 2] + src[i + 2][j - 1] + src[i + 2][j + 1]) +
|
||||
c20 * (src[i - 2][j] + src[i][j - 2] + src[i][j + 2] + src[i + 2][j]) +
|
||||
c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) +
|
||||
c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) +
|
||||
c00 * src[i][j];
|
||||
|
||||
dst[i][j] = divBuffer[i][j] / std::max(val, 0.00001f);
|
||||
}
|
||||
dst[i][W - 2] = dst[i][W - 1] = 1.f;
|
||||
}
|
||||
|
||||
// first and last rows
|
||||
for (int i = 0; i < 2; ++i) {
|
||||
for (int j = 0; j < W; ++j) {
|
||||
dst[i][j] = 1.f;
|
||||
}
|
||||
}
|
||||
for (int i = H - 2 ; i < H; ++i) {
|
||||
for (int j = 0; j < W; ++j) {
|
||||
dst[i][j] = 1.f;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
inline void gauss7x7div(float** RESTRICT src, float** RESTRICT dst, float** RESTRICT divBuffer, const int W, const int H, const float kernel[7][7])
|
||||
{
|
||||
|
||||
const float c31 = kernel[0][2];
|
||||
const float c30 = kernel[0][3];
|
||||
const float c22 = kernel[1][1];
|
||||
const float c21 = kernel[1][2];
|
||||
const float c20 = kernel[1][3];
|
||||
const float c11 = kernel[2][2];
|
||||
const float c10 = kernel[2][3];
|
||||
const float c00 = kernel[3][3];
|
||||
|
||||
for (int i = 3; i < H - 3; ++i) {
|
||||
dst[i][0] = dst[i][1] = dst[i][2] = 1.f;
|
||||
// I tried hand written SSE code but gcc vectorizes better
|
||||
for (int j = 3; j < W - 3; ++j) {
|
||||
const float val = c31 * (src[i - 3][j - 1] + src[i - 3][j + 1] + src[i - 1][j - 3] + src[i - 1][j + 3] + src[i + 1][j - 3] + src[i + 1][j + 3] + src[i + 3][j - 1] + src[i + 3][j + 1]) +
|
||||
c30 * (src[i - 3][j] + src[i][j - 3] + src[i][j + 3] + src[i + 3][j]) +
|
||||
c22 * (src[i - 2][j - 2] + src[i - 2][j + 2] + src[i + 2][j - 2] + src[i + 2][j + 2]) +
|
||||
c21 * (src[i - 2][j - 1] + src[i - 2][j + 1] * c21 + src[i - 1][j - 2] + src[i - 1][j + 2] + src[i + 1][j - 2] + src[i + 1][j + 2] + src[i + 2][j - 1] + src[i + 2][j + 1]) +
|
||||
c20 * (src[i - 2][j] + src[i][j - 2] + src[i][j + 2] + src[i + 2][j]) +
|
||||
c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) +
|
||||
c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) +
|
||||
c00 * src[i][j];
|
||||
|
||||
dst[i][j] = divBuffer[i][j] / std::max(val, 0.00001f);
|
||||
}
|
||||
dst[i][W - 3] = dst[i][W - 2] = dst[i][W - 1] = 1.f;
|
||||
}
|
||||
|
||||
// first and last rows
|
||||
for (int i = 0; i < 3; ++i) {
|
||||
for (int j = 0; j < W; ++j) {
|
||||
dst[i][j] = 1.f;
|
||||
}
|
||||
}
|
||||
for (int i = H - 3 ; i < H; ++i) {
|
||||
for (int j = 0; j < W; ++j) {
|
||||
dst[i][j] = 1.f;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
inline void gauss3x3mult(float** RESTRICT src, float** RESTRICT dst, const int W, const int H, const float kernel[3][3])
|
||||
{
|
||||
const float c11 = kernel[0][0];
|
||||
const float c10 = kernel[0][1];
|
||||
const float c00 = kernel[1][1];
|
||||
|
||||
for (int i = 1; i < H - 1; i++) {
|
||||
for (int j = 1; j < W - 1; j++) {
|
||||
const float val = c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) +
|
||||
c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) +
|
||||
c00 * src[i][j];
|
||||
dst[i][j] *= val;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
inline void gauss5x5mult (float** RESTRICT src, float** RESTRICT dst, const int W, const int H, const float kernel[5][5])
|
||||
{
|
||||
|
||||
const float c21 = kernel[0][1];
|
||||
const float c20 = kernel[0][2];
|
||||
const float c11 = kernel[1][1];
|
||||
const float c10 = kernel[1][2];
|
||||
const float c00 = kernel[2][2];
|
||||
|
||||
for (int i = 2; i < H - 2; ++i) {
|
||||
// I tried hand written SSE code but gcc vectorizes better
|
||||
for (int j = 2; j < W - 2; ++j) {
|
||||
const float val = c21 * (src[i - 2][j - 1] + src[i - 2][j + 1] + src[i - 1][j - 2] + src[i - 1][j + 2] + src[i + 1][j - 2] + src[i + 1][j + 2] + src[i + 2][j - 1] + src[i + 2][j + 1]) +
|
||||
c20 * (src[i - 2][j] + src[i][j - 2] + src[i][j + 2] + src[i + 2][j]) +
|
||||
c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) +
|
||||
c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) +
|
||||
c00 * src[i][j];
|
||||
|
||||
dst[i][j] *= val;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
inline void gauss7x7mult(float** RESTRICT src, float** RESTRICT dst, const int W, const int H, const float kernel[7][7])
|
||||
{
|
||||
|
||||
const float c31 = kernel[0][2];
|
||||
const float c30 = kernel[0][3];
|
||||
const float c22 = kernel[1][1];
|
||||
const float c21 = kernel[1][2];
|
||||
const float c20 = kernel[1][3];
|
||||
const float c11 = kernel[2][2];
|
||||
const float c10 = kernel[2][3];
|
||||
const float c00 = kernel[3][3];
|
||||
|
||||
for (int i = 3; i < H - 3; ++i) {
|
||||
// I tried hand written SSE code but gcc vectorizes better
|
||||
for (int j = 3; j < W - 3; ++j) {
|
||||
const float val = c31 * (src[i - 3][j - 1] + src[i - 3][j + 1] + src[i - 1][j - 3] + src[i - 1][j + 3] + src[i + 1][j - 3] + src[i + 1][j + 3] + src[i + 3][j - 1] + src[i + 3][j + 1]) +
|
||||
c30 * (src[i - 3][j] + src[i][j - 3] + src[i][j + 3] + src[i + 3][j]) +
|
||||
c22 * (src[i - 2][j - 2] + src[i - 2][j + 2] + src[i + 2][j - 2] + src[i + 2][j + 2]) +
|
||||
c21 * (src[i - 2][j - 1] + src[i - 2][j + 1] * c21 + src[i - 1][j - 2] + src[i - 1][j + 2] + src[i + 1][j - 2] + src[i + 1][j + 2] + src[i + 2][j - 1] + src[i + 2][j + 1]) +
|
||||
c20 * (src[i - 2][j] + src[i][j - 2] + src[i][j + 2] + src[i + 2][j]) +
|
||||
c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) +
|
||||
c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) +
|
||||
c00 * src[i][j];
|
||||
|
||||
dst[i][j] *= val;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void buildClipMaskBayer(const float * const *rawData, int W, int H, float** clipMask, const float whites[2][2])
|
||||
{
|
||||
|
||||
#ifdef _OPENMP
|
||||
#pragma omp parallel for schedule(dynamic, 16)
|
||||
#endif
|
||||
for (int row = 0; row < H; ++row) {
|
||||
for (int col = 0; col < W; ++col) {
|
||||
clipMask[row][col] = 1.f;
|
||||
}
|
||||
}
|
||||
#ifdef _OPENMP
|
||||
#pragma omp parallel for schedule(dynamic, 16)
|
||||
#endif
|
||||
for (int row = 2; row < H - 2; ++row) {
|
||||
float clip0 = whites[row & 1][0];
|
||||
float clip1 = whites[row & 1][1];
|
||||
for (int col = 2; col < W - 2; ++col) {
|
||||
if (rawData[row][col] >= clip0) {
|
||||
clipMask[row - 2][col - 1] = clipMask[row - 2][col] = clipMask[row - 2][col + 1] = 0.f;
|
||||
clipMask[row - 1][col - 2] = clipMask[row - 1][col - 1] = clipMask[row - 1][col] = clipMask[row - 1][col + 1] = clipMask[row - 1][col + 2] = 0.f;
|
||||
clipMask[row][col - 2] = clipMask[row][col - 1] = clipMask[row][col] = clipMask[row][col + 1] = clipMask[row][col + 2] = 0.f;
|
||||
clipMask[row + 1][col - 2] = clipMask[row + 1][col - 1] = clipMask[row + 1][col] = clipMask[row + 1][col + 1] = clipMask[row + 1][col + 2] = 0.f;
|
||||
clipMask[row + 2][col - 1] = clipMask[row + 2][col] = clipMask[row + 2][col + 1] = 0.f;
|
||||
}
|
||||
std::swap(clip0, clip1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void buildClipMaskXtrans(const float * const *rawData, int W, int H, float** clipMask, const float whites[6][6])
|
||||
{
|
||||
|
||||
#ifdef _OPENMP
|
||||
#pragma omp parallel for schedule(dynamic, 16)
|
||||
#endif
|
||||
for (int row = 0; row < H; ++row) {
|
||||
for (int col = 0; col < W; ++col) {
|
||||
clipMask[row][col] = 1.f;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef _OPENMP
|
||||
#pragma omp parallel for schedule(dynamic, 16)
|
||||
#endif
|
||||
for (int row = 2; row < H - 2; ++row) {
|
||||
for (int col = 2; col < W - 2; ++col) {
|
||||
const float clip = whites[row % 6][col % 6];
|
||||
if (rawData[row][col] >= clip) {
|
||||
clipMask[row - 2][col - 1] = clipMask[row - 2][col] = clipMask[row - 2][col + 1] = 0.f;
|
||||
clipMask[row - 1][col - 2] = clipMask[row - 1][col - 1] = clipMask[row - 1][col] = clipMask[row - 1][col + 1] = clipMask[row - 1][col + 2] = 0.f;
|
||||
clipMask[row][col - 2] = clipMask[row][col - 1] = clipMask[row][col] = clipMask[row][col + 1] = clipMask[row][col + 2] = 0.f;
|
||||
clipMask[row + 1][col - 2] = clipMask[row + 1][col - 1] = clipMask[row + 1][col] = clipMask[row + 1][col + 1] = clipMask[row + 1][col + 2] = 0.f;
|
||||
clipMask[row + 2][col - 1] = clipMask[row + 2][col] = clipMask[row + 2][col + 1] = 0.f;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void buildClipMaskMono(const float * const *rawData, int W, int H, float** clipMask, float white)
|
||||
{
|
||||
|
||||
#ifdef _OPENMP
|
||||
#pragma omp parallel for schedule(dynamic, 16)
|
||||
#endif
|
||||
for (int row = 0; row < H; ++row) {
|
||||
for (int col = 0; col < W; ++col) {
|
||||
clipMask[row][col] = 1.f;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef _OPENMP
|
||||
#pragma omp parallel for schedule(dynamic, 16)
|
||||
#endif
|
||||
for (int row = 2; row < H - 2; ++row) {
|
||||
for (int col = 2; col < W - 2; ++col) {
|
||||
if (rawData[row][col] >= white) {
|
||||
clipMask[row - 2][col - 1] = clipMask[row - 2][col] = clipMask[row - 2][col + 1] = 0.f;
|
||||
clipMask[row - 1][col - 2] = clipMask[row - 1][col - 1] = clipMask[row - 1][col] = clipMask[row - 1][col + 1] = clipMask[row - 1][col + 2] = 0.f;
|
||||
clipMask[row][col - 2] = clipMask[row][col - 1] = clipMask[row][col] = clipMask[row][col + 1] = clipMask[row][col + 2] = 0.f;
|
||||
clipMask[row + 1][col - 2] = clipMask[row + 1][col - 1] = clipMask[row + 1][col] = clipMask[row + 1][col + 1] = clipMask[row + 1][col + 2] = 0.f;
|
||||
clipMask[row + 2][col - 1] = clipMask[row + 2][col] = clipMask[row + 2][col + 1] = 0.f;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
float calcRadiusBayer(const float * const *rawData, int W, int H, float lowerLimit, float upperLimit, const unsigned int fc[2])
|
||||
{
|
||||
|
||||
float maxRatio = 1.f;
|
||||
#ifdef _OPENMP
|
||||
#pragma omp parallel for reduction(max:maxRatio) schedule(dynamic, 16)
|
||||
#endif
|
||||
for (int row = 4; row < H - 4; ++row) {
|
||||
for (int col = 5 + (fc[row & 1] & 1); col < W - 4; col += 2) {
|
||||
const float val00 = rawData[row][col];
|
||||
if (val00 > 0.f) {
|
||||
const float val1m1 = rawData[row + 1][col - 1];
|
||||
const float val1p1 = rawData[row + 1][col + 1];
|
||||
const float maxVal0 = std::max(val00, val1m1);
|
||||
if (val1m1 > 0.f && maxVal0 > lowerLimit) {
|
||||
const float minVal = std::min(val00, val1m1);
|
||||
if (UNLIKELY(maxVal0 > maxRatio * minVal)) {
|
||||
bool clipped = false;
|
||||
if (maxVal0 == val00) { // check for influence by clipped green in neighborhood
|
||||
if (rtengine::max(rawData[row - 1][col - 1], rawData[row - 1][col + 1], val1p1) >= upperLimit) {
|
||||
clipped = true;
|
||||
}
|
||||
} else { // check for influence by clipped green in neighborhood
|
||||
if (rtengine::max(rawData[row][col - 2], val00, rawData[row + 2][col - 2], rawData[row + 2][col]) >= upperLimit) {
|
||||
clipped = true;
|
||||
}
|
||||
}
|
||||
if (!clipped) {
|
||||
maxRatio = maxVal0 / minVal;
|
||||
}
|
||||
}
|
||||
}
|
||||
const float maxVal1 = std::max(val00, val1p1);
|
||||
if (val1p1 > 0.f && maxVal1 > lowerLimit) {
|
||||
const float minVal = std::min(val00, val1p1);
|
||||
if (UNLIKELY(maxVal1 > maxRatio * minVal)) {
|
||||
if (maxVal1 == val00) { // check for influence by clipped green in neighborhood
|
||||
if (rtengine::max(rawData[row - 1][col - 1], rawData[row - 1][col + 1], val1p1) >= upperLimit) {
|
||||
continue;
|
||||
}
|
||||
} else { // check for influence by clipped green in neighborhood
|
||||
if (rtengine::max(val00, rawData[row][col + 2], rawData[row + 2][col], rawData[row + 2][col + 2]) >= upperLimit) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
maxRatio = maxVal1 / minVal;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return std::sqrt((1.f / (std::log(1.f / maxRatio) / 2.f)) / -2.f);
|
||||
}
|
||||
|
||||
float calcRadiusXtrans(const float * const *rawData, int W, int H, float lowerLimit, float upperLimit, unsigned int starty, unsigned int startx)
|
||||
{
|
||||
|
||||
float maxRatio = 1.f;
|
||||
#ifdef _OPENMP
|
||||
#pragma omp parallel for reduction(max:maxRatio) schedule(dynamic, 16)
|
||||
#endif
|
||||
for (int row = starty + 3; row < H - 4; row += 3) {
|
||||
for (int col = startx + 3; col < W - 4; col += 3) {
|
||||
const float valtl = rawData[row][col];
|
||||
const float valtr = rawData[row][col + 1];
|
||||
const float valbl = rawData[row + 1][col];
|
||||
const float valbr = rawData[row + 1][col + 1];
|
||||
if (valtl > 1.f) {
|
||||
const float maxValtltr = std::max(valtl, valtr);
|
||||
if (valtr > 1.f && maxValtltr > lowerLimit) {
|
||||
const float minVal = std::min(valtl, valtr);
|
||||
if (UNLIKELY(maxValtltr > maxRatio * minVal)) {
|
||||
bool clipped = false;
|
||||
if (maxValtltr == valtl) { // check for influence by clipped green in neighborhood
|
||||
if (rtengine::max(rawData[row - 1][col - 1], valtr, valbl, valbr) >= upperLimit) {
|
||||
clipped = true;
|
||||
}
|
||||
} else { // check for influence by clipped green in neighborhood
|
||||
if (rtengine::max(rawData[row - 1][col + 2], valtl, valbl, valbr) >= upperLimit) {
|
||||
clipped = true;
|
||||
}
|
||||
}
|
||||
if (!clipped) {
|
||||
maxRatio = maxValtltr / minVal;
|
||||
}
|
||||
}
|
||||
}
|
||||
const float maxValtlbl = std::max(valtl, valbl);
|
||||
if (valbl > 1.f && maxValtlbl > lowerLimit) {
|
||||
const float minVal = std::min(valtl, valbl);
|
||||
if (UNLIKELY(maxValtlbl > maxRatio * minVal)) {
|
||||
bool clipped = false;
|
||||
if (maxValtlbl == valtl) { // check for influence by clipped green in neighborhood
|
||||
if (rtengine::max(rawData[row - 1][col - 1], valtr, valbl, valbr) >= upperLimit) {
|
||||
clipped = true;
|
||||
}
|
||||
} else { // check for influence by clipped green in neighborhood
|
||||
if (rtengine::max(valtl, valtr, rawData[row + 2][col - 1], valbr) >= upperLimit) {
|
||||
clipped = true;
|
||||
}
|
||||
}
|
||||
if (!clipped) {
|
||||
maxRatio = maxValtlbl / minVal;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (valbr > 1.f) {
|
||||
const float maxValblbr = std::max(valbl, valbr);
|
||||
if (valbl > 1.f && maxValblbr > lowerLimit) {
|
||||
const float minVal = std::min(valbl, valbr);
|
||||
if (UNLIKELY(maxValblbr > maxRatio * minVal)) {
|
||||
bool clipped = false;
|
||||
if (maxValblbr == valbr) { // check for influence by clipped green in neighborhood
|
||||
if (rtengine::max(valtl, valtr, valbl, rawData[row + 2][col + 2]) >= upperLimit) {
|
||||
clipped = true;
|
||||
}
|
||||
} else { // check for influence by clipped green in neighborhood
|
||||
if (rtengine::max(valtl, valtr, rawData[row + 2][col - 1], valbr) >= upperLimit) {
|
||||
clipped = true;
|
||||
}
|
||||
}
|
||||
if (!clipped) {
|
||||
maxRatio = maxValblbr / minVal;
|
||||
}
|
||||
}
|
||||
}
|
||||
const float maxValtrbr = std::max(valtr, valbr);
|
||||
if (valtr > 1.f && maxValtrbr > lowerLimit) {
|
||||
const float minVal = std::min(valtr, valbr);
|
||||
if (UNLIKELY(maxValtrbr > maxRatio * minVal)) {
|
||||
if (maxValtrbr == valbr) { // check for influence by clipped green in neighborhood
|
||||
if (rtengine::max(valtl, valtr, valbl, rawData[row + 2][col + 2]) >= upperLimit) {
|
||||
continue;
|
||||
}
|
||||
} else { // check for influence by clipped green in neighborhood
|
||||
if (rtengine::max(rawData[row - 1][col + 2], valtl, valbl, valbr) >= upperLimit) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
maxRatio = maxValtrbr / minVal;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return std::sqrt((1.f / (std::log(1.f / maxRatio))) / -2.f);
|
||||
}
|
||||
void CaptureDeconvSharpening (float** luminance, float** oldLuminance, const float * const * blend, int W, int H, double sigma, int iterations, rtengine::ProgressListener* plistener, double startVal, double endVal)
|
||||
{
|
||||
BENCHFUN
|
||||
const bool is5x5 = (sigma <= 0.84);
|
||||
const bool is3x3 = (sigma < 0.6);
|
||||
float kernel7[7][7];
|
||||
float kernel5[5][5];
|
||||
float kernel3[3][3];
|
||||
if (is3x3) {
|
||||
compute3x3kernel(sigma, kernel3);
|
||||
} else if (is5x5) {
|
||||
compute5x5kernel(sigma, kernel5);
|
||||
} else {
|
||||
compute7x7kernel(sigma, kernel7);
|
||||
}
|
||||
|
||||
constexpr int tileSize = 194;
|
||||
constexpr int border = 3;
|
||||
constexpr int fullTileSize = tileSize + 2 * border;
|
||||
|
||||
double progress = startVal;
|
||||
const double progressStep = (endVal - startVal) * rtengine::SQR(tileSize) / (W * H);
|
||||
#ifdef _OPENMP
|
||||
#pragma omp parallel
|
||||
#endif
|
||||
{
|
||||
int progresscounter = 0;
|
||||
array2D<float> tmpIThr(fullTileSize, fullTileSize);
|
||||
array2D<float> tmpThr(fullTileSize, fullTileSize);
|
||||
array2D<float> lumThr(fullTileSize, fullTileSize);
|
||||
#pragma omp for schedule(dynamic,2) collapse(2)
|
||||
for (int i = border; i < H - border; i+= tileSize) {
|
||||
for(int j = border; j < W - border; j+= tileSize) {
|
||||
const bool endOfCol = (i + tileSize + border) >= H;
|
||||
const bool endOfRow = (j + tileSize + border) >= W;
|
||||
// fill tiles
|
||||
if (endOfRow || endOfCol) {
|
||||
// special handling for small tiles at end of row or column
|
||||
for (int k = 0, ii = endOfCol ? H - fullTileSize : i; k < fullTileSize; ++k, ++ii) {
|
||||
for (int l = 0, jj = endOfRow ? W - fullTileSize : j; l < fullTileSize; ++l, ++jj) {
|
||||
tmpIThr[k][l] = oldLuminance[ii - border][jj - border];
|
||||
lumThr[k][l] = oldLuminance[ii - border][jj - border];
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (int ii = i; ii < i + fullTileSize; ++ii) {
|
||||
for (int jj = j; jj < j + fullTileSize; ++jj) {
|
||||
tmpIThr[ii - i][jj - j] = oldLuminance[ii - border][jj - border];
|
||||
lumThr[ii - i][jj - j] = oldLuminance[ii - border][jj - border];
|
||||
}
|
||||
}
|
||||
}
|
||||
if (is3x3) {
|
||||
for (int k = 0; k < iterations; ++k) {
|
||||
// apply 3x3 gaussian blur and divide luminance by result of gaussian blur
|
||||
gauss3x3div(tmpIThr, tmpThr, lumThr, fullTileSize, fullTileSize, kernel3);
|
||||
gauss3x3mult(tmpThr, tmpIThr, fullTileSize, fullTileSize, kernel3);
|
||||
}
|
||||
} else if (is5x5) {
|
||||
for (int k = 0; k < iterations; ++k) {
|
||||
// apply 5x5 gaussian blur and divide luminance by result of gaussian blur
|
||||
gauss5x5div(tmpIThr, tmpThr, lumThr, fullTileSize, fullTileSize, kernel5);
|
||||
gauss5x5mult(tmpThr, tmpIThr, fullTileSize, fullTileSize, kernel5);
|
||||
}
|
||||
} else {
|
||||
for (int k = 0; k < iterations; ++k) {
|
||||
// apply 7x7 gaussian blur and divide luminance by result of gaussian blur
|
||||
gauss7x7div(tmpIThr, tmpThr, lumThr, fullTileSize, fullTileSize, kernel7);
|
||||
gauss7x7mult(tmpThr, tmpIThr, fullTileSize, fullTileSize, kernel7);
|
||||
}
|
||||
}
|
||||
if (endOfRow || endOfCol) {
|
||||
// special handling for small tiles at end of row or column
|
||||
for (int k = border, ii = endOfCol ? H - fullTileSize - border : i - border; k < fullTileSize - border; ++k) {
|
||||
for (int l = border, jj = endOfRow ? W - fullTileSize - border : j - border; l < fullTileSize - border; ++l) {
|
||||
luminance[ii + k][jj + l] = rtengine::intp(blend[ii + k][jj + l], max(tmpIThr[k][l], 0.0f), luminance[ii + k][jj + l]);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (int ii = border; ii < fullTileSize - border; ++ii) {
|
||||
for (int jj = border; jj < fullTileSize - border; ++jj) {
|
||||
luminance[i + ii - border][j + jj - border] = rtengine::intp(blend[i + ii - border][j + jj - border], max(tmpIThr[ii][jj], 0.0f), luminance[i + ii - border][j + jj - border]);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (plistener) {
|
||||
if (++progresscounter % 16 == 0) {
|
||||
#ifdef _OPENMP
|
||||
#pragma omp critical(csprogress)
|
||||
#endif
|
||||
{
|
||||
progress += 16.0 * progressStep;
|
||||
progress = rtengine::min(progress, endVal);
|
||||
plistener->setProgress(progress);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
namespace rtengine
|
||||
{
|
||||
|
||||
void RawImageSource::captureSharpening(const procparams::CaptureSharpeningParams &sharpeningParams, bool showMask, double &conrastThreshold, double &radius) {
|
||||
|
||||
if (plistener) {
|
||||
plistener->setProgressStr(M("TP_PDSHARPENING_LABEL"));
|
||||
plistener->setProgress(0.0);
|
||||
}
|
||||
BENCHFUN
|
||||
const float xyz_rgb[3][3] = { // XYZ from RGB
|
||||
{ 0.412453, 0.357580, 0.180423 },
|
||||
{ 0.212671, 0.715160, 0.072169 },
|
||||
{ 0.019334, 0.119193, 0.950227 }
|
||||
};
|
||||
|
||||
float contrast = conrastThreshold / 100.f;
|
||||
|
||||
const float clipVal = (ri->get_white(1) - ri->get_cblack(1)) * scale_mul[1];
|
||||
|
||||
array2D<float>& redVals = redCache ? *redCache : red;
|
||||
array2D<float>& greenVals = greenCache ? *greenCache : green;
|
||||
array2D<float>& blueVals = blueCache ? *blueCache : blue;
|
||||
|
||||
array2D<float> clipMask(W, H);
|
||||
constexpr float clipLimit = 0.95f;
|
||||
if (ri->getSensorType() == ST_BAYER) {
|
||||
const float whites[2][2] = {
|
||||
{(ri->get_white(FC(0,0)) - c_black[FC(0,0)]) * scale_mul[FC(0,0)] * clipLimit, (ri->get_white(FC(0,1)) - c_black[FC(0,1)]) * scale_mul[FC(0,1)] * clipLimit},
|
||||
{(ri->get_white(FC(1,0)) - c_black[FC(1,0)]) * scale_mul[FC(1,0)] * clipLimit, (ri->get_white(FC(1,1)) - c_black[FC(1,1)]) * scale_mul[FC(1,1)] * clipLimit}
|
||||
};
|
||||
buildClipMaskBayer(rawData, W, H, clipMask, whites);
|
||||
const unsigned int fc[2] = {FC(0,0), FC(1,0)};
|
||||
if (sharpeningParams.autoRadius) {
|
||||
radius = calcRadiusBayer(rawData, W, H, 1000.f, clipVal, fc);
|
||||
}
|
||||
} else if (ri->getSensorType() == ST_FUJI_XTRANS) {
|
||||
float whites[6][6];
|
||||
for (int i = 0; i < 6; ++i) {
|
||||
for (int j = 0; j < 6; ++j) {
|
||||
const auto color = ri->XTRANSFC(i, j);
|
||||
whites[i][j] = (ri->get_white(color) - c_black[color]) * scale_mul[color] * clipLimit;
|
||||
}
|
||||
}
|
||||
buildClipMaskXtrans(rawData, W, H, clipMask, whites);
|
||||
bool found = false;
|
||||
int i, j;
|
||||
for (i = 6; i < 12 && !found; ++i) {
|
||||
for (j = 6; j < 12 && !found; ++j) {
|
||||
if (ri->XTRANSFC(i, j) == 1) {
|
||||
if (ri->XTRANSFC(i, j - 1) != ri->XTRANSFC(i, j + 1)) {
|
||||
if (ri->XTRANSFC(i - 1, j) != 1) {
|
||||
if (ri->XTRANSFC(i, j - 1) != 1) {
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (sharpeningParams.autoRadius) {
|
||||
radius = calcRadiusXtrans(rawData, W, H, 1000.f, clipVal, i, j);
|
||||
}
|
||||
|
||||
} else if (ri->get_colors() == 1) {
|
||||
buildClipMaskMono(rawData, W, H, clipMask, (ri->get_white(0) - c_black[0]) * scale_mul[0] * clipLimit);
|
||||
if (sharpeningParams.autoRadius) {
|
||||
const unsigned int fc[2] = {0, 0};
|
||||
radius = calcRadiusBayer(rawData, W, H, 1000.f, clipVal, fc);
|
||||
}
|
||||
}
|
||||
|
||||
if (showMask) {
|
||||
array2D<float>& L = blue; // blue will be overridden anyway => we can use its buffer to store L
|
||||
#ifdef _OPENMP
|
||||
#pragma omp parallel for
|
||||
#endif
|
||||
|
||||
for (int i = 0; i < H; ++i) {
|
||||
Color::RGB2L(redVals[i], greenVals[i], blueVals[i], L[i], xyz_rgb, W);
|
||||
}
|
||||
if (plistener) {
|
||||
plistener->setProgress(0.1);
|
||||
}
|
||||
|
||||
array2D<float>& blend = red; // red will be overridden anyway => we can use its buffer to store the blend mask
|
||||
buildBlendMask(L, blend, W, H, contrast, 1.f, sharpeningParams.autoContrast, clipMask);
|
||||
if (plistener) {
|
||||
plistener->setProgress(0.2);
|
||||
}
|
||||
conrastThreshold = contrast * 100.f;
|
||||
#ifdef _OPENMP
|
||||
#pragma omp parallel for
|
||||
#endif
|
||||
for (int i = 0; i < H; ++i) {
|
||||
for (int j = 0; j < W; ++j) {
|
||||
red[i][j] = green[i][j] = blue[i][j] = blend[i][j] * 16384.f;
|
||||
}
|
||||
}
|
||||
if (plistener) {
|
||||
plistener->setProgress(1.0);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
array2D<float>* Lbuffer = nullptr;
|
||||
if (!redCache) {
|
||||
Lbuffer = new array2D<float>(W, H);
|
||||
}
|
||||
|
||||
array2D<float>* YOldbuffer = nullptr;
|
||||
if (!greenCache) {
|
||||
YOldbuffer = new array2D<float>(W, H);
|
||||
}
|
||||
|
||||
array2D<float>* YNewbuffer = nullptr;
|
||||
if (!blueCache) {
|
||||
YNewbuffer = new array2D<float>(W, H);
|
||||
}
|
||||
array2D<float>& L = Lbuffer ? *Lbuffer : red;
|
||||
array2D<float>& YOld = YOldbuffer ? * YOldbuffer : green;
|
||||
array2D<float>& YNew = YNewbuffer ? * YNewbuffer : blue;
|
||||
const float gamma = sharpeningParams.gamma;
|
||||
|
||||
#ifdef _OPENMP
|
||||
#pragma omp parallel for schedule(dynamic, 16)
|
||||
#endif
|
||||
for (int i = 0; i < H; ++i) {
|
||||
Color::RGB2L(redVals[i], greenVals[i], blueVals[i], L[i], xyz_rgb, W);
|
||||
Color::RGB2Y(redVals[i], greenVals[i], blueVals[i], YOld[i], YNew[i], gamma, W);
|
||||
}
|
||||
if (plistener) {
|
||||
plistener->setProgress(0.1);
|
||||
}
|
||||
// calculate contrast based blend factors to reduce sharpening in regions with low contrast
|
||||
array2D<float>& blend = clipMask; // we can share blend and clipMask buffer here
|
||||
buildBlendMask(L, blend, W, H, contrast, 1.f, sharpeningParams.autoContrast, clipMask);
|
||||
if (plistener) {
|
||||
plistener->setProgress(0.2);
|
||||
}
|
||||
conrastThreshold = contrast * 100.f;
|
||||
|
||||
CaptureDeconvSharpening(YNew, YOld, blend, W, H, radius, sharpeningParams.deconviter, plistener, 0.2, 0.9);
|
||||
if (plistener) {
|
||||
plistener->setProgress(0.9);
|
||||
}
|
||||
#ifdef _OPENMP
|
||||
#pragma omp parallel for schedule(dynamic, 16)
|
||||
#endif
|
||||
for (int i = 0; i < H; ++i) {
|
||||
int j = 0;
|
||||
#ifdef __SSE2__
|
||||
const vfloat gammav = F2V(gamma);
|
||||
for (; j < W - 3; j += 4) {
|
||||
const vfloat factor = pow_F(vmaxf(LVFU(YNew[i][j]), ZEROV) / vmaxf(LVFU(YOld[i][j]), F2V(0.00001f)), gammav);
|
||||
STVFU(red[i][j], LVFU(redVals[i][j]) * factor);
|
||||
STVFU(green[i][j], LVFU(greenVals[i][j]) * factor);
|
||||
STVFU(blue[i][j], LVFU(blueVals[i][j]) * factor);
|
||||
}
|
||||
|
||||
#endif
|
||||
for (; j < W; ++j) {
|
||||
const float factor = pow_F(std::max(YNew[i][j], 0.f) / std::max(YOld[i][j], 0.00001f), gamma);
|
||||
red[i][j] = redVals[i][j] * factor;
|
||||
green[i][j] = greenVals[i][j] * factor;
|
||||
blue[i][j] = blueVals[i][j] * factor;
|
||||
}
|
||||
}
|
||||
|
||||
delete Lbuffer;
|
||||
delete YOldbuffer;
|
||||
delete YNewbuffer;
|
||||
if (plistener) {
|
||||
plistener->setProgress(1.0);
|
||||
}
|
||||
}
|
||||
|
||||
} /* namespace */
|
@ -18,7 +18,7 @@
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
//
|
||||
////////////////////////////////////////////////////////////////
|
||||
|
||||
|
@ -14,7 +14,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "ciecam02.h"
|
||||
#include "rtengine.h"
|
||||
|
@ -14,7 +14,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#ifndef _CIECAM02_
|
||||
#define _CIECAM02_
|
||||
|
@ -14,7 +14,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#ifndef _CIEIMAGE_H_
|
||||
#define _CIEIMAGE_H_
|
||||
|
@ -14,7 +14,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "rtengine.h"
|
||||
@ -1835,21 +1835,21 @@ void Color::RGB2L(float *R, float *G, float *B, float *L, const float wp[3][3],
|
||||
{
|
||||
|
||||
#ifdef __SSE2__
|
||||
vfloat minvalfv = F2V(0.f);
|
||||
vfloat maxvalfv = F2V(MAXVALF);
|
||||
const vfloat maxvalfv = F2V(MAXVALF);
|
||||
const vfloat rmv = F2V(wp[1][0]);
|
||||
const vfloat gmv = F2V(wp[1][1]);
|
||||
const vfloat bmv = F2V(wp[1][2]);
|
||||
#endif
|
||||
int i = 0;
|
||||
|
||||
#ifdef __SSE2__
|
||||
for(;i < width - 3; i+=4) {
|
||||
for(; i < width - 3; i+=4) {
|
||||
const vfloat rv = LVFU(R[i]);
|
||||
const vfloat gv = LVFU(G[i]);
|
||||
const vfloat bv = LVFU(B[i]);
|
||||
const vfloat yv = F2V(wp[1][0]) * rv + F2V(wp[1][1]) * gv + F2V(wp[1][2]) * bv;
|
||||
const vfloat yv = rmv * rv + gmv * gv + bmv * bv;
|
||||
|
||||
vmask maxMask = vmaskf_gt(yv, maxvalfv);
|
||||
vmask minMask = vmaskf_lt(yv, minvalfv);
|
||||
if (_mm_movemask_ps((vfloat)vorm(maxMask, minMask))) {
|
||||
if (_mm_movemask_ps((vfloat)vorm(vmaskf_gt(yv, maxvalfv), vmaskf_lt(yv, ZEROV)))) {
|
||||
// take slower code path for all 4 pixels if one of the values is > MAXVALF. Still faster than non SSE2 version
|
||||
for(int k = 0; k < 4; ++k) {
|
||||
float y = yv[k];
|
||||
@ -1860,7 +1860,7 @@ void Color::RGB2L(float *R, float *G, float *B, float *L, const float wp[3][3],
|
||||
}
|
||||
}
|
||||
#endif
|
||||
for(;i < width; ++i) {
|
||||
for(; i < width; ++i) {
|
||||
const float rv = R[i];
|
||||
const float gv = G[i];
|
||||
const float bv = B[i];
|
||||
|
@ -14,7 +14,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
@ -1804,6 +1804,31 @@ public:
|
||||
return (hr);
|
||||
}
|
||||
|
||||
static inline void RGB2Y(const float* R, const float* G, const float* B, float* Y1, float * Y2, float gamma, int W) {
|
||||
gamma = 1.f / gamma;
|
||||
int i = 0;
|
||||
#ifdef __SSE2__
|
||||
const vfloat gammav = F2V(gamma);
|
||||
const vfloat c1v = F2V(0.2627f);
|
||||
const vfloat c2v = F2V(0.6780f);
|
||||
const vfloat c3v = F2V(0.0593f);
|
||||
for (; i < W - 3; i += 4) {
|
||||
const vfloat Rv = vmaxf(LVFU(R[i]), ZEROV);
|
||||
const vfloat Gv = vmaxf(LVFU(G[i]), ZEROV);
|
||||
const vfloat Bv = vmaxf(LVFU(B[i]), ZEROV);
|
||||
vfloat yv = pow_F(c1v * Rv + c2v * Gv + c3v * Bv, gammav);
|
||||
STVFU(Y1[i], yv);
|
||||
STVFU(Y2[i], yv);
|
||||
}
|
||||
#endif
|
||||
for (; i < W; ++i) {
|
||||
const float r = std::max(R[i], 0.f);
|
||||
const float g = std::max(G[i], 0.f);
|
||||
const float b = std::max(B[i], 0.f);
|
||||
Y1[i] = Y2[i] = pow_F(0.2627f * r + 0.6780f * g + 0.0593f * b, gamma);
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -14,7 +14,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "colortemp.h"
|
||||
#include "rtengine.h"
|
||||
|
@ -14,7 +14,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#ifndef _COLORTEMP_
|
||||
#define _COLORTEMP_
|
||||
|
@ -14,7 +14,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "coord.h"
|
||||
|
@ -14,7 +14,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __COORD__
|
||||
|
@ -14,7 +14,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#ifndef __COORD2D__
|
||||
#define __COORD2D__
|
||||
|
@ -12,7 +12,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*
|
||||
* 2010 Ilya Popov <ilia_popov@rambler.ru>
|
||||
* 2012 Emil Martinec <ejmartin@uchicago.edu>
|
||||
|
@ -12,7 +12,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*
|
||||
* 2010 Ilya Popov <ilia_popov@rambler.ru>
|
||||
* 2012 Emil Martinec <ejmartin@uchicago.edu>
|
||||
|
@ -12,7 +12,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*
|
||||
* 2012 Emil Martinec <ejmartin@uchicago.edu>
|
||||
* 2014 Jacques Desmis <jdesmis@gmail.com>
|
||||
|
@ -12,7 +12,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*
|
||||
* 2010 Ilya Popov <ilia_popov@rambler.ru>
|
||||
* 2012 Emil Martinec <ejmartin@uchicago.edu>
|
||||
|
@ -14,7 +14,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
|
@ -14,7 +14,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#ifndef __CURVES_H__
|
||||
#define __CURVES_H__
|
||||
|
@ -14,7 +14,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <iostream>
|
||||
|
@ -14,7 +14,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
@ -14,7 +14,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef DCRAW_H
|
||||
|
@ -15,7 +15,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "curves.h"
|
||||
#include "dcrop.h"
|
||||
|
@ -14,7 +14,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
|
@ -14,7 +14,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include <cmath>
|
||||
#include <cassert>
|
||||
@ -1121,7 +1121,7 @@ void RawImageSource::lmmse_interpolate_omp(int winw, int winh, array2D<float> &r
|
||||
* Contact info: luis.sanz.rodriguez@gmail.com
|
||||
*
|
||||
* This code is distributed under a GNU General Public License, version 3.
|
||||
* Visit <http://www.gnu.org/licenses/> for more information.
|
||||
* Visit <https://www.gnu.org/licenses/> for more information.
|
||||
*
|
||||
***/
|
||||
// Adapted to RawTherapee by Jacques Desmis 3/2013
|
||||
@ -2024,7 +2024,8 @@ void RawImageSource::refinement(int PassCount)
|
||||
|
||||
// Refinement based on EECI demozaicing algorithm by L. Chang and Y.P. Tan
|
||||
// from "Lassus" : Luis Sanz Rodriguez, adapted by Jacques Desmis - JDC - and Oliver Duis for RawTherapee
|
||||
// increases the signal to noise ratio (PSNR) # +1 to +2 dB : tested with Dcraw : eg: Lighthouse + AMaZE : whitout refinement:39.96dB, with refinement:41.86 dB
|
||||
// increases the signal to noise ratio (PSNR) # +1 to +2 dB : tested with Dcraw :
|
||||
// eg: Lighthouse + AMaZE : without refinement:39.96 dB, with refinement:41.86 dB
|
||||
// reduce color artifacts, improves the interpolation
|
||||
// but it's relatively slow
|
||||
//
|
||||
|
@ -14,7 +14,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "dfmanager.h"
|
||||
#include "../rtgui/options.h"
|
||||
|
@ -14,7 +14,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
|
@ -14,7 +14,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include <glib.h>
|
||||
#include <glib/gstdio.h>
|
||||
|
@ -12,7 +12,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*
|
||||
* (C) 2010 Emil Martinec <ejmartin@uchicago.edu>
|
||||
*
|
||||
|
@ -19,7 +19,7 @@
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
//
|
||||
////////////////////////////////////////////////////////////////
|
||||
|
||||
|
@ -14,7 +14,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "../rtengine/dynamicprofile.h"
|
||||
|
@ -14,7 +14,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#ifndef _DYNAMICPROFILE_H_
|
||||
#define _DYNAMICPROFILE_H_
|
||||
|
@ -15,7 +15,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include <cmath>
|
||||
|
||||
|
@ -18,7 +18,7 @@
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
//
|
||||
////////////////////////////////////////////////////////////////
|
||||
|
||||
|
@ -14,7 +14,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "ffmanager.h"
|
||||
#include "../rtgui/options.h"
|
||||
|
@ -14,7 +14,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
|
@ -14,7 +14,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include <cmath>
|
||||
#include <iostream>
|
||||
|
@ -14,7 +14,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include <cmath>
|
||||
|
||||
|
@ -14,7 +14,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "curves.h"
|
||||
#include <cmath>
|
||||
|
@ -15,7 +15,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
|
@ -15,7 +15,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
|
@ -14,17 +14,59 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "gauss.h"
|
||||
#include "rt_math.h"
|
||||
#include <cmath>
|
||||
#include <cstdlib>
|
||||
#include "opthelper.h"
|
||||
#include "boxblur.h"
|
||||
|
||||
namespace
|
||||
{
|
||||
|
||||
void compute7x7kernel(float sigma, float kernel[7][7]) {
|
||||
const double temp = -2.f * rtengine::SQR(sigma);
|
||||
float sum = 0.f;
|
||||
for (int i = -3; i <= 3; ++i) {
|
||||
for (int j = -3; j <= 3; ++j) {
|
||||
if((rtengine::SQR(i) + rtengine::SQR(j)) <= rtengine::SQR(3.0 * 1.15)) {
|
||||
kernel[i + 3][j + 3] = std::exp((rtengine::SQR(i) + rtengine::SQR(j)) / temp);
|
||||
sum += kernel[i + 3][j + 3];
|
||||
} else {
|
||||
kernel[i + 3][j + 3] = 0.f;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < 7; ++i) {
|
||||
for (int j = 0; j < 7; ++j) {
|
||||
kernel[i][j] /= sum;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void compute5x5kernel(float sigma, float kernel[5][5]) {
|
||||
const double temp = -2.f * rtengine::SQR(sigma);
|
||||
float sum = 0.f;
|
||||
for (int i = -2; i <= 2; ++i) {
|
||||
for (int j = -2; j <= 2; ++j) {
|
||||
if((rtengine::SQR(i) + rtengine::SQR(j)) <= rtengine::SQR(3.0 * 0.84)) {
|
||||
kernel[i + 2][j + 2] = std::exp((rtengine::SQR(i) + rtengine::SQR(j)) / temp);
|
||||
sum += kernel[i + 2][j + 2];
|
||||
} else {
|
||||
kernel[i + 2][j + 2] = 0.f;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < 5; ++i) {
|
||||
for (int j = 0; j < 5; ++j) {
|
||||
kernel[i][j] /= sum;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
template<class T> void calculateYvVFactors( const T sigma, T &b1, T &b2, T &b3, T &B, T M[3][3])
|
||||
{
|
||||
// coefficient calculation
|
||||
@ -207,6 +249,174 @@ template<class T> void gauss3x3div (T** RESTRICT src, T** RESTRICT dst, T** REST
|
||||
}
|
||||
}
|
||||
|
||||
template<class T> void gauss7x7div (T** RESTRICT src, T** RESTRICT dst, T** RESTRICT divBuffer, const int W, const int H, float sigma)
|
||||
{
|
||||
|
||||
float kernel[7][7];
|
||||
compute7x7kernel(sigma, kernel);
|
||||
|
||||
const float c31 = kernel[0][2];
|
||||
const float c30 = kernel[0][3];
|
||||
const float c22 = kernel[1][1];
|
||||
const float c21 = kernel[1][2];
|
||||
const float c20 = kernel[1][3];
|
||||
const float c11 = kernel[2][2];
|
||||
const float c10 = kernel[2][3];
|
||||
const float c00 = kernel[3][3];
|
||||
|
||||
#ifdef _OPENMP
|
||||
#pragma omp for schedule(dynamic, 16) nowait
|
||||
#endif
|
||||
|
||||
for (int i = 3; i < H - 3; ++i) {
|
||||
dst[i][0] = dst[i][1] = dst[i][2] = 1.f;
|
||||
// I tried hand written SSE code but gcc vectorizes better
|
||||
for (int j = 3; j < W - 3; ++j) {
|
||||
const float val = c31 * (src[i - 3][j - 1] + src[i - 3][j + 1] + src[i - 1][j - 3] + src[i - 1][j + 3] + src[i + 1][j - 3] + src[i + 1][j + 3] + src[i + 3][j - 1] + src[i + 3][j + 1]) +
|
||||
c30 * (src[i - 3][j] + src[i][j - 3] + src[i][j + 3] + src[i + 3][j]) +
|
||||
c22 * (src[i - 2][j - 2] + src[i - 2][j + 2] + src[i + 2][j - 2] + src[i + 2][j + 2]) +
|
||||
c21 * (src[i - 2][j - 1] + src[i - 2][j + 1] * c21 + src[i - 1][j - 2] + src[i - 1][j + 2] + src[i + 1][j - 2] + src[i + 1][j + 2] + src[i + 2][j - 1] + src[i + 2][j + 1]) +
|
||||
c20 * (src[i - 2][j] + src[i][j - 2] + src[i][j + 2] + src[i + 2][j]) +
|
||||
c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) +
|
||||
c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) +
|
||||
c00 * src[i][j];
|
||||
|
||||
dst[i][j] = divBuffer[i][j] / std::max(val, 0.00001f);
|
||||
}
|
||||
dst[i][W - 3] = dst[i][W - 2] = dst[i][W - 1] = 1.f;
|
||||
}
|
||||
|
||||
// first and last rows
|
||||
#ifdef _OPENMP
|
||||
#pragma omp single
|
||||
#endif
|
||||
{
|
||||
for (int i = 0; i < 3; ++i) {
|
||||
for (int j = 0; j < W; ++j) {
|
||||
dst[i][j] = 1.f;
|
||||
}
|
||||
}
|
||||
for (int i = H - 3 ; i < H; ++i) {
|
||||
for (int j = 0; j < W; ++j) {
|
||||
dst[i][j] = 1.f;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
template<class T> void gauss5x5div (T** RESTRICT src, T** RESTRICT dst, T** RESTRICT divBuffer, const int W, const int H, float sigma)
|
||||
{
|
||||
|
||||
float kernel[5][5];
|
||||
compute5x5kernel(sigma, kernel);
|
||||
|
||||
const float c21 = kernel[0][1];
|
||||
const float c20 = kernel[0][2];
|
||||
const float c11 = kernel[1][1];
|
||||
const float c10 = kernel[1][2];
|
||||
const float c00 = kernel[2][2];
|
||||
|
||||
#ifdef _OPENMP
|
||||
#pragma omp for schedule(dynamic, 16) nowait
|
||||
#endif
|
||||
|
||||
for (int i = 2; i < H - 2; ++i) {
|
||||
dst[i][0] = dst[i][1] = 1.f;
|
||||
// I tried hand written SSE code but gcc vectorizes better
|
||||
for (int j = 2; j < W - 2; ++j) {
|
||||
const float val = c21 * (src[i - 2][j - 1] + src[i - 2][j + 1] + src[i - 1][j - 2] + src[i - 1][j + 2] + src[i + 1][j - 2] + src[i + 1][j + 2] + src[i + 2][j - 1] + src[i + 2][j + 1]) +
|
||||
c20 * (src[i - 2][j] + src[i][j - 2] + src[i][j + 2] + src[i + 2][j]) +
|
||||
c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) +
|
||||
c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) +
|
||||
c00 * src[i][j];
|
||||
|
||||
dst[i][j] = divBuffer[i][j] / std::max(val, 0.00001f);
|
||||
}
|
||||
dst[i][W - 2] = dst[i][W - 1] = 1.f;
|
||||
}
|
||||
|
||||
// first and last rows
|
||||
#ifdef _OPENMP
|
||||
#pragma omp single
|
||||
#endif
|
||||
{
|
||||
for (int i = 0; i < 2; ++i) {
|
||||
for (int j = 0; j < W; ++j) {
|
||||
dst[i][j] = 1.f;
|
||||
}
|
||||
}
|
||||
for (int i = H - 2 ; i < H; ++i) {
|
||||
for (int j = 0; j < W; ++j) {
|
||||
dst[i][j] = 1.f;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
template<class T> void gauss7x7mult (T** RESTRICT src, T** RESTRICT dst, const int W, const int H, float sigma)
|
||||
{
|
||||
|
||||
float kernel[7][7];
|
||||
compute7x7kernel(sigma, kernel);
|
||||
const float c31 = kernel[0][2];
|
||||
const float c30 = kernel[0][3];
|
||||
const float c22 = kernel[1][1];
|
||||
const float c21 = kernel[1][2];
|
||||
const float c20 = kernel[1][3];
|
||||
const float c11 = kernel[2][2];
|
||||
const float c10 = kernel[2][3];
|
||||
const float c00 = kernel[3][3];
|
||||
|
||||
#ifdef _OPENMP
|
||||
#pragma omp for schedule(dynamic, 16)
|
||||
#endif
|
||||
|
||||
for (int i = 3; i < H - 3; ++i) {
|
||||
// I tried hand written SSE code but gcc vectorizes better
|
||||
for (int j = 3; j < W - 3; ++j) {
|
||||
const float val = c31 * (src[i - 3][j - 1] + src[i - 3][j + 1] + src[i - 1][j - 3] + src[i - 1][j + 3] + src[i + 1][j - 3] + src[i + 1][j + 3] + src[i + 3][j - 1] + src[i + 3][j + 1]) +
|
||||
c30 * (src[i - 3][j] + src[i][j - 3] + src[i][j + 3] + src[i + 3][j]) +
|
||||
c22 * (src[i - 2][j - 2] + src[i - 2][j + 2] + src[i + 2][j - 2] + src[i + 2][j + 2]) +
|
||||
c21 * (src[i - 2][j - 1] + src[i - 2][j + 1] * c21 + src[i - 1][j - 2] + src[i - 1][j + 2] + src[i + 1][j - 2] + src[i + 1][j + 2] + src[i + 2][j - 1] + src[i + 2][j + 1]) +
|
||||
c20 * (src[i - 2][j] + src[i][j - 2] + src[i][j + 2] + src[i + 2][j]) +
|
||||
c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) +
|
||||
c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) +
|
||||
c00 * src[i][j];
|
||||
|
||||
dst[i][j] *= val;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
template<class T> void gauss5x5mult (T** RESTRICT src, T** RESTRICT dst, const int W, const int H, float sigma)
|
||||
{
|
||||
|
||||
float kernel[5][5];
|
||||
compute5x5kernel(sigma, kernel);
|
||||
|
||||
const float c21 = kernel[0][1];
|
||||
const float c20 = kernel[0][2];
|
||||
const float c11 = kernel[1][1];
|
||||
const float c10 = kernel[1][2];
|
||||
const float c00 = kernel[2][2];
|
||||
|
||||
#ifdef _OPENMP
|
||||
#pragma omp for schedule(dynamic, 16)
|
||||
#endif
|
||||
|
||||
for (int i = 2; i < H - 2; ++i) {
|
||||
// I tried hand written SSE code but gcc vectorizes better
|
||||
for (int j = 2; j < W - 2; ++j) {
|
||||
const float val = c21 * (src[i - 2][j - 1] + src[i - 2][j + 1] + src[i - 1][j - 2] + src[i - 1][j + 2] + src[i + 1][j - 2] + src[i + 1][j + 2] + src[i + 2][j - 1] + src[i + 2][j + 1]) +
|
||||
c20 * (src[i - 2][j] + src[i][j - 2] + src[i][j + 2] + src[i + 2][j]) +
|
||||
c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) +
|
||||
c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) +
|
||||
c00 * src[i][j];
|
||||
|
||||
dst[i][j] *= val;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// use separated filter if the support window is small and src == dst
|
||||
template<class T> void gaussHorizontal3 (T** src, T** dst, int W, int H, const float c0, const float c1)
|
||||
@ -1143,6 +1353,8 @@ template<class T> void gaussianBlurImpl(T** src, T** dst, const int W, const int
|
||||
{
|
||||
static constexpr auto GAUSS_SKIP = 0.25;
|
||||
static constexpr auto GAUSS_3X3_LIMIT = 0.6;
|
||||
static constexpr auto GAUSS_5X5_LIMIT = 0.84;
|
||||
static constexpr auto GAUSS_7X7_LIMIT = 1.15;
|
||||
static constexpr auto GAUSS_DOUBLE = 25.0;
|
||||
|
||||
if(buffer) {
|
||||
@ -1241,14 +1453,26 @@ template<class T> void gaussianBlurImpl(T** src, T** dst, const int W, const int
|
||||
if (sigma < GAUSS_DOUBLE) {
|
||||
switch (gausstype) {
|
||||
case GAUSS_MULT : {
|
||||
gaussHorizontalSse<T> (src, src, W, H, sigma);
|
||||
gaussVerticalSsemult<T> (src, dst, W, H, sigma);
|
||||
if (sigma <= GAUSS_5X5_LIMIT && src != dst) {
|
||||
gauss5x5mult(src, dst, W, H, sigma);
|
||||
} else if (sigma <= GAUSS_7X7_LIMIT && src != dst) {
|
||||
gauss7x7mult(src, dst, W, H, sigma);
|
||||
} else {
|
||||
gaussHorizontalSse<T> (src, src, W, H, sigma);
|
||||
gaussVerticalSsemult<T> (src, dst, W, H, sigma);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case GAUSS_DIV : {
|
||||
gaussHorizontalSse<T> (src, dst, W, H, sigma);
|
||||
gaussVerticalSsediv<T> (dst, dst, buffer2, W, H, sigma);
|
||||
if (sigma <= GAUSS_5X5_LIMIT && src != dst) {
|
||||
gauss5x5div (src, dst, buffer2, W, H, sigma);
|
||||
} else if (sigma <= GAUSS_7X7_LIMIT && src != dst) {
|
||||
gauss7x7div (src, dst, buffer2, W, H, sigma);
|
||||
} else {
|
||||
gaussHorizontalSse<T> (src, dst, W, H, sigma);
|
||||
gaussVerticalSsediv<T> (dst, dst, buffer2, W, H, sigma);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
@ -1268,14 +1492,26 @@ template<class T> void gaussianBlurImpl(T** src, T** dst, const int W, const int
|
||||
if (sigma < GAUSS_DOUBLE) {
|
||||
switch (gausstype) {
|
||||
case GAUSS_MULT : {
|
||||
gaussHorizontal<T> (src, src, W, H, sigma);
|
||||
gaussVerticalmult<T> (src, dst, W, H, sigma);
|
||||
if (sigma <= GAUSS_5X5_LIMIT && src != dst) {
|
||||
gauss5x5mult(src, dst, W, H, sigma);
|
||||
} else if (sigma <= GAUSS_7X7_LIMIT && src != dst) {
|
||||
gauss7x7mult(src, dst, W, H, sigma);
|
||||
} else {
|
||||
gaussHorizontal<T> (src, src, W, H, sigma);
|
||||
gaussVerticalmult<T> (src, dst, W, H, sigma);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case GAUSS_DIV : {
|
||||
gaussHorizontal<T> (src, dst, W, H, sigma);
|
||||
gaussVerticaldiv<T> (dst, dst, buffer2, W, H, sigma);
|
||||
if (sigma <= GAUSS_5X5_LIMIT && src != dst) {
|
||||
gauss5x5div (src, dst, buffer2, W, H, sigma);
|
||||
} else if (sigma <= GAUSS_7X7_LIMIT && src != dst) {
|
||||
gauss7x7div (src, dst, buffer2, W, H, sigma);
|
||||
} else {
|
||||
gaussHorizontal<T> (src, dst, W, H, sigma);
|
||||
gaussVerticaldiv<T> (dst, dst, buffer2, W, H, sigma);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -14,7 +14,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#ifndef _GAUSS_H_
|
||||
#define _GAUSS_H_
|
||||
|
@ -19,7 +19,7 @@
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
//
|
||||
////////////////////////////////////////////////////////////////
|
||||
|
||||
|
@ -15,7 +15,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
|
@ -15,7 +15,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
@ -20,7 +20,7 @@
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
//
|
||||
////////////////////////////////////////////////////////////////
|
||||
|
||||
|
@ -15,7 +15,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "rawimagesource.h"
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user