<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> <meta name="generator" content="Doxygen 1.8.15"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>lensfun: lenstool.cpp</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript" src="dynsections.js"></script> <script type="text/x-mathjax-config"> MathJax.Hub.Config({ extensions: ["tex2jax.js"], jax: ["input/TeX","output/HTML-CSS"], }); MathJax.Hub.Config({ messageStyle: "none" }); </script><script type="text/javascript" async="async" src="http://lensfun.sourceforge.net/mathjax/MathJax.js"></script> <link href="doxygen.css" rel="stylesheet" type="text/css" /> </head> <body> <div id="top"><!-- do not remove this div, it is closed by doxygen! --> <div id="titlearea"> <table cellspacing="0" cellpadding="0"> <tbody> <tr style="height: 56px;"> <td id="projectalign" style="padding-left: 0.5em;"> <div id="projectname">lensfun  <span id="projectnumber">0.3.2.0</span> </div> </td> </tr> </tbody> </table> </div> <!-- end header part --> <!-- Generated by Doxygen 1.8.15 --> <script type="text/javascript" src="menudata.js"></script> <script type="text/javascript" src="menu.js"></script> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ $(function() { initMenu('',false,false,'search.php','Search'); }); /* @license-end */</script> <div id="main-nav"></div> </div><!-- top --> <div class="header"> <div class="headertitle"> <div class="title">lenstool.cpp</div> </div> </div><!--header--> <div class="contents"> <p>Library testbed. This program can access most library functionality.</p> <div class="fragment"><div class="line"><span class="comment">/*</span></div><div class="line"><span class="comment"> Test for library image modificator object.</span></div><div class="line"><span class="comment">*/</span></div><div class="line"></div><div class="line"></div><div class="line"><span class="preprocessor">#include <glib.h></span></div><div class="line"><span class="preprocessor">#include <locale.h></span></div><div class="line"><span class="preprocessor">#include <getopt.h></span></div><div class="line"><span class="preprocessor">#include <stdio.h></span></div><div class="line"><span class="preprocessor">#include <stdlib.h></span></div><div class="line"><span class="preprocessor">#include <string.h></span></div><div class="line"><span class="preprocessor">#include <time.h></span></div><div class="line"><span class="preprocessor">#include <ctype.h></span></div><div class="line"><span class="preprocessor">#include "<a class="code" href="lensfun_8h.html">lensfun.h</a>"</span></div><div class="line"><span class="preprocessor">#include "image.h"</span></div><div class="line"><span class="preprocessor">#include "auxfun.h"</span></div><div class="line"></div><div class="line"><span class="comment">/* Define this to apply stage 1 & 3 corrections in one step,</span></div><div class="line"><span class="comment"> see main comment to the lfModifier class */</span></div><div class="line"><span class="preprocessor">#define COMBINE_13</span></div><div class="line"></div><div class="line"><span class="preprocessor">#if defined(_MSC_VER)</span></div><div class="line"><span class="preprocessor">#define strcasecmp _stricmp</span></div><div class="line"><span class="preprocessor">#define snprintf _snprintf</span></div><div class="line"><span class="preprocessor">#define strtof (float)strtod</span></div><div class="line"><span class="preprocessor">#endif </span></div><div class="line"></div><div class="line"></div><div class="line"><span class="keyword">static</span> <span class="keyword">struct</span></div><div class="line">{</div><div class="line"> <span class="keyword">const</span> <span class="keywordtype">char</span> *Program;</div><div class="line"> <span class="keyword">const</span> <span class="keywordtype">char</span> *Input;</div><div class="line"> <span class="keyword">const</span> <span class="keywordtype">char</span> *Output;</div><div class="line"> <span class="keywordtype">int</span> ModifyFlags;</div><div class="line"> <span class="keywordtype">bool</span> Inverse;</div><div class="line"> <span class="keyword">const</span> <span class="keywordtype">char</span> *Lens;</div><div class="line"> <span class="keyword">const</span> <span class="keywordtype">char</span> *Camera;</div><div class="line"> <span class="keywordtype">float</span> Scale;</div><div class="line"> <span class="keywordtype">float</span> Crop;</div><div class="line"> <span class="keywordtype">float</span> Focal;</div><div class="line"> <span class="keywordtype">float</span> Aperture;</div><div class="line"> <span class="keywordtype">float</span> Distance;</div><div class="line"> Image::InterpolationMethod Interpolation;</div><div class="line"> <a class="code" href="group__Lens.html#gac853bb55ada6a58f12a68f6a1974f764">lfLensType</a> TargetGeom;</div><div class="line"> <span class="keywordtype">bool</span> Verbose;</div><div class="line">} opts =</div><div class="line">{</div><div class="line"> NULL,</div><div class="line"> NULL,</div><div class="line"> <span class="stringliteral">"output.png"</span>,</div><div class="line"> 0,</div><div class="line"> <span class="keyword">false</span>,</div><div class="line"> NULL,</div><div class="line"> NULL,</div><div class="line"> 1.0f,</div><div class="line"> 0,</div><div class="line"> 0,</div><div class="line"> 0,</div><div class="line"> 1.0f,</div><div class="line"> Image::I_LANCZOS,</div><div class="line"> <a name="a0"></a><a class="code" href="group__Lens.html#ggac853bb55ada6a58f12a68f6a1974f764a896c9ca88c7fe141ea77a4b343ba54ff">LF_RECTILINEAR</a>,</div><div class="line"> <span class="keyword">false</span></div><div class="line">};</div><div class="line"></div><div class="line"></div><div class="line"><span class="keyword">static</span> <span class="keywordtype">void</span> DisplayVersion ()</div><div class="line">{</div><div class="line"> g_print (<span class="stringliteral">"Lenstool reference implementation for Lensfun version %d.%d.%d\n"</span>,</div><div class="line"> <a name="a1"></a><a class="code" href="group__Auxiliary.html#ga87f344eef72d0022dc6127a2dbb8e315">LF_VERSION_MAJOR</a>, <a name="a2"></a><a class="code" href="group__Auxiliary.html#gae5ffedbf31cb567fea19f22f3b832736">LF_VERSION_MINOR</a>, <a name="a3"></a><a class="code" href="group__Auxiliary.html#ga68545712fa14d528824de0a504a65fb0">LF_VERSION_MICRO</a>);</div><div class="line"> g_print (<span class="stringliteral">"Copyright (C) 2007 Andrew Zabolotny\n\n"</span>);</div><div class="line"> g_print (<span class="stringliteral">"For distribution rules and conditions of use see the file\n"</span>);</div><div class="line"> g_print (<span class="stringliteral">"COPYING which is part of the distribution.\n"</span>);</div><div class="line">}</div><div class="line"></div><div class="line"><span class="keyword">static</span> <span class="keywordtype">void</span> DisplayUsage ()</div><div class="line">{</div><div class="line"> DisplayVersion ();</div><div class="line"> g_print (<span class="stringliteral">"\nCommand-line options:\n\n"</span>);</div><div class="line"> g_print (<span class="stringliteral">" -d --distortion Apply lens distortion\n"</span>);</div><div class="line"> g_print (<span class="stringliteral">" -g# --geometry=# Convert image geometry to given (one of:\n"</span>);</div><div class="line"> g_print (<span class="stringliteral">" rectilinear,fisheye,panoramic,equirectangular,\n"</span>);</div><div class="line"> g_print (<span class="stringliteral">" orthographic, stereographic, equisolid, thoby)\n"</span>);</div><div class="line"> g_print (<span class="stringliteral">" -t --tca Apply lens chromatic aberrations\n"</span>);</div><div class="line"> g_print (<span class="stringliteral">" -v --vignetting Apply lens vignetting\n"</span>);</div><div class="line"> g_print (<span class="stringliteral">" -a --all Apply all possible corrections (tca, vign, dist)\n"</span>);</div><div class="line"> g_print (<span class="stringliteral">" -i --inverse Inverse correction of the image (e.g. simulate\n"</span>);</div><div class="line"> g_print (<span class="stringliteral">" lens distortions instead of correcting them)\n"</span>);</div><div class="line"> g_print (<span class="stringliteral">"\n"</span>);</div><div class="line"> g_print (<span class="stringliteral">" -C# --camera=# Camera name\n"</span>);</div><div class="line"> g_print (<span class="stringliteral">" -c# --crop=# Set camera crop factor in case the camera is not given\n"</span>);</div><div class="line"> g_print (<span class="stringliteral">"\n"</span>);</div><div class="line"> g_print (<span class="stringliteral">" -L# --lens=# Lens name to search for in the database\n"</span>);</div><div class="line"> g_print (<span class="stringliteral">" -F# --focal=# Set focal length at which image has been taken\n"</span>);</div><div class="line"> g_print (<span class="stringliteral">" -A# --aperture=# Set aperture at which image has been taken\n"</span>);</div><div class="line"> g_print (<span class="stringliteral">" -D# --distance=# Set subject distance at which image has been taken\n"</span>);</div><div class="line"> g_print (<span class="stringliteral">"\n"</span>);</div><div class="line"> g_print (<span class="stringliteral">" -s# --scale=# Apply additional scale on the image\n"</span>);</div><div class="line"> g_print (<span class="stringliteral">" -I# --interpol=# Choose interpolation algorithm (n[earest], b[ilinear], l[anczos])\n"</span>);</div><div class="line"> g_print (<span class="stringliteral">"\n"</span>);</div><div class="line"> g_print (<span class="stringliteral">" -o# --output=# Set file name for output image\n"</span>);</div><div class="line"> g_print (<span class="stringliteral">" --verbose Verbose output\n"</span>);</div><div class="line"> g_print (<span class="stringliteral">" --version Display program version and exit\n"</span>);</div><div class="line"> g_print (<span class="stringliteral">" -h --help Display this help text\n"</span>);</div><div class="line">}</div><div class="line"></div><div class="line"><span class="keyword">static</span> <span class="keywordtype">bool</span> ParseParameters(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> **argv)</div><div class="line">{</div><div class="line"> <span class="keyword">static</span> <span class="keyword">struct </span>option long_options[] = {</div><div class="line"> {<span class="stringliteral">"output"</span>, required_argument, NULL, <span class="charliteral">'o'</span>},</div><div class="line"> {<span class="stringliteral">"distortion"</span>, no_argument, NULL, <span class="charliteral">'d'</span>},</div><div class="line"> {<span class="stringliteral">"geometry"</span>, optional_argument, NULL, <span class="charliteral">'g'</span>},</div><div class="line"> {<span class="stringliteral">"tca"</span>, no_argument, NULL, <span class="charliteral">'t'</span>},</div><div class="line"> {<span class="stringliteral">"vignetting"</span>, no_argument, NULL, <span class="charliteral">'v'</span>},</div><div class="line"> {<span class="stringliteral">"all"</span>, no_argument, NULL, <span class="charliteral">'a'</span>},</div><div class="line"> {<span class="stringliteral">"inverse"</span>, no_argument, NULL, <span class="charliteral">'i'</span>},</div><div class="line"> {<span class="stringliteral">"scale"</span>, required_argument, NULL, <span class="charliteral">'S'</span>},</div><div class="line"> {<span class="stringliteral">"lens"</span>, required_argument, NULL, <span class="charliteral">'L'</span>},</div><div class="line"> {<span class="stringliteral">"camera"</span>, required_argument, NULL, <span class="charliteral">'C'</span>},</div><div class="line"> {<span class="stringliteral">"crop"</span>, required_argument, NULL, <span class="charliteral">'c'</span>},</div><div class="line"> {<span class="stringliteral">"focal"</span>, required_argument, NULL, <span class="charliteral">'F'</span>},</div><div class="line"> {<span class="stringliteral">"aperture"</span>, required_argument, NULL, <span class="charliteral">'A'</span>},</div><div class="line"> {<span class="stringliteral">"distance"</span>, required_argument, NULL, <span class="charliteral">'D'</span>},</div><div class="line"> {<span class="stringliteral">"interpol"</span>, required_argument, NULL, <span class="charliteral">'I'</span>},</div><div class="line"> {<span class="stringliteral">"help"</span>, no_argument, NULL, <span class="charliteral">'h'</span>},</div><div class="line"> {<span class="stringliteral">"version"</span>, no_argument, NULL, 4},</div><div class="line"> {<span class="stringliteral">"verbose"</span>, no_argument, NULL, 5},</div><div class="line"> {0, 0, 0, 0}</div><div class="line"> };</div><div class="line"></div><div class="line"> opts.Program = argv [0];</div><div class="line"></div><div class="line"> <span class="keywordtype">int</span> c;</div><div class="line"> <span class="keywordflow">while</span> ((c = getopt_long (argc, argv, <span class="stringliteral">"o:dg::tvaiS:L:C:c:F:A:D:I:h"</span>, long_options, NULL)) != EOF) {</div><div class="line"> <span class="keywordflow">switch</span> (c) {</div><div class="line"> <span class="keywordflow">case</span> <span class="charliteral">'o'</span>:</div><div class="line"> opts.Output = optarg;</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> <span class="keywordflow">case</span> <span class="charliteral">'d'</span>:</div><div class="line"> opts.ModifyFlags |= <a name="a4"></a><a class="code" href="group__Correction.html#ggadf764cbdea00d65edcd07bb9953ad2b7a7be69c9a6c86737de2ed4e5bff238086">LF_MODIFY_DISTORTION</a>;</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> <span class="keywordflow">case</span> <span class="charliteral">'g'</span>:</div><div class="line"> opts.ModifyFlags |= <a name="a5"></a><a class="code" href="group__Correction.html#ggadf764cbdea00d65edcd07bb9953ad2b7a6fa0d1e43f6dbde8c395be838b89ad52">LF_MODIFY_GEOMETRY</a>;</div><div class="line"> <span class="keywordflow">if</span> (optarg) {</div><div class="line"> <span class="keywordflow">if</span> (!strcasecmp (optarg, <span class="stringliteral">"rectilinear"</span>))</div><div class="line"> opts.TargetGeom = <a class="code" href="group__Lens.html#ggac853bb55ada6a58f12a68f6a1974f764a896c9ca88c7fe141ea77a4b343ba54ff">LF_RECTILINEAR</a>;</div><div class="line"> <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!strcasecmp (optarg, <span class="stringliteral">"fisheye"</span>))</div><div class="line"> opts.TargetGeom = <a name="a6"></a><a class="code" href="group__Lens.html#ggac853bb55ada6a58f12a68f6a1974f764a29abd55274cc313ab6ce6f8120420bcb">LF_FISHEYE</a>;</div><div class="line"> <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!strcasecmp (optarg, <span class="stringliteral">"panoramic"</span>))</div><div class="line"> opts.TargetGeom = <a name="a7"></a><a class="code" href="group__Lens.html#ggac853bb55ada6a58f12a68f6a1974f764ae4c7779e02e8c3eab93a50df9785e4c8">LF_PANORAMIC</a>;</div><div class="line"> <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!strcasecmp (optarg, <span class="stringliteral">"equirectangular"</span>))</div><div class="line"> opts.TargetGeom = <a name="a8"></a><a class="code" href="group__Lens.html#ggac853bb55ada6a58f12a68f6a1974f764a6c605dede2a9afa068e314674832514c">LF_EQUIRECTANGULAR</a>;</div><div class="line"> <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!strcasecmp (optarg, <span class="stringliteral">"orthographic"</span>))</div><div class="line"> opts.TargetGeom = <a name="a9"></a><a class="code" href="group__Lens.html#ggac853bb55ada6a58f12a68f6a1974f764a5f2caa8d093345897664f71c501c4027">LF_FISHEYE_ORTHOGRAPHIC</a>;</div><div class="line"> <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!strcasecmp (optarg, <span class="stringliteral">"stereographic"</span>))</div><div class="line"> opts.TargetGeom = <a name="a10"></a><a class="code" href="group__Lens.html#ggac853bb55ada6a58f12a68f6a1974f764ab68a1366d1533790a71a5b624f5a9e94">LF_FISHEYE_STEREOGRAPHIC</a>;</div><div class="line"> <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!strcasecmp (optarg, <span class="stringliteral">"equisolid"</span>))</div><div class="line"> opts.TargetGeom = <a name="a11"></a><a class="code" href="group__Lens.html#ggac853bb55ada6a58f12a68f6a1974f764a302f26de47547b8eed83608c3f0e1e4b">LF_FISHEYE_EQUISOLID</a>;</div><div class="line"> <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!strcasecmp (optarg, <span class="stringliteral">"thoby"</span>))</div><div class="line"> opts.TargetGeom = <a name="a12"></a><a class="code" href="group__Lens.html#ggac853bb55ada6a58f12a68f6a1974f764a34abf74f5f675b1be30a931c3dfbcedb">LF_FISHEYE_THOBY</a>;</div><div class="line"> <span class="keywordflow">else</span> {</div><div class="line"> DisplayUsage();</div><div class="line"> g_print (<span class="stringliteral">"\nTarget lens geometry must be one of 'rectilinear', 'fisheye', 'panoramic', 'equirectangular'\n'orthographic', 'stereographic', 'equisolid', 'thoby'\n"</span>);</div><div class="line"> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"> }</div><div class="line"> }</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> <span class="keywordflow">case</span> <span class="charliteral">'t'</span>:</div><div class="line"> opts.ModifyFlags |= <a name="a13"></a><a class="code" href="group__Correction.html#ggadf764cbdea00d65edcd07bb9953ad2b7a2d151b0e170f0caff31885677d787846">LF_MODIFY_TCA</a>;</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> <span class="keywordflow">case</span> <span class="charliteral">'v'</span>:</div><div class="line"> opts.ModifyFlags |= <a name="a14"></a><a class="code" href="group__Correction.html#ggadf764cbdea00d65edcd07bb9953ad2b7a6aded8676e2e6da6abe62709d63ee1da">LF_MODIFY_VIGNETTING</a>;</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> <span class="keywordflow">case</span> <span class="charliteral">'a'</span>:</div><div class="line"> opts.ModifyFlags |= <a class="code" href="group__Correction.html#ggadf764cbdea00d65edcd07bb9953ad2b7a6aded8676e2e6da6abe62709d63ee1da">LF_MODIFY_VIGNETTING</a>;</div><div class="line"> opts.ModifyFlags |= <a class="code" href="group__Correction.html#ggadf764cbdea00d65edcd07bb9953ad2b7a2d151b0e170f0caff31885677d787846">LF_MODIFY_TCA</a>;</div><div class="line"> opts.ModifyFlags |= <a class="code" href="group__Correction.html#ggadf764cbdea00d65edcd07bb9953ad2b7a7be69c9a6c86737de2ed4e5bff238086">LF_MODIFY_DISTORTION</a>;</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> <span class="keywordflow">case</span> <span class="charliteral">'i'</span>:</div><div class="line"> opts.Inverse = <span class="keyword">true</span>;</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> <span class="keywordflow">case</span> <span class="charliteral">'S'</span>:</div><div class="line"> opts.ModifyFlags |= <a name="a15"></a><a class="code" href="group__Correction.html#ggadf764cbdea00d65edcd07bb9953ad2b7abf173cd4cb15a0c242bd32a5ff840982">LF_MODIFY_SCALE</a>;</div><div class="line"> opts.Scale = _atof (optarg);</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> <span class="keywordflow">case</span><span class="charliteral">'L'</span>:</div><div class="line"> opts.Lens = optarg;</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> <span class="keywordflow">case</span><span class="charliteral">'C'</span>:</div><div class="line"> opts.Camera = optarg;</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> <span class="keywordflow">case</span> <span class="charliteral">'c'</span>:</div><div class="line"> opts.Crop = _atof (optarg);</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> <span class="keywordflow">case</span> <span class="charliteral">'F'</span>:</div><div class="line"> opts.Focal = _atof (optarg);</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> <span class="keywordflow">case</span> <span class="charliteral">'A'</span>:</div><div class="line"> opts.Aperture = _atof (optarg);</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> <span class="keywordflow">case</span> <span class="charliteral">'D'</span>:</div><div class="line"> opts.Distance = _atof (optarg);</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> <span class="keywordflow">case</span> <span class="charliteral">'I'</span>:</div><div class="line"> <span class="keywordflow">if</span> (smartstreq (optarg, <span class="stringliteral">"nearest"</span>))</div><div class="line"> opts.Interpolation = Image::I_NEAREST;</div><div class="line"> <span class="keywordflow">else</span> <span class="keywordflow">if</span> (smartstreq (optarg, <span class="stringliteral">"bilinear"</span>))</div><div class="line"> opts.Interpolation = Image::I_BILINEAR;</div><div class="line"> <span class="keywordflow">else</span> <span class="keywordflow">if</span> (smartstreq (optarg, <span class="stringliteral">"lanczos"</span>))</div><div class="line"> opts.Interpolation = Image::I_LANCZOS;</div><div class="line"> <span class="keywordflow">else</span> {</div><div class="line"> DisplayUsage();</div><div class="line"> g_print (<span class="stringliteral">"\nUnknown interpolation method `%s'\n"</span>, optarg);</div><div class="line"> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"> }</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> <span class="keywordflow">case</span> <span class="charliteral">'h'</span>:</div><div class="line"> DisplayUsage ();</div><div class="line"> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"> <span class="keywordflow">case</span> 4:</div><div class="line"> DisplayVersion ();</div><div class="line"> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"> <span class="keywordflow">case</span> 5:</div><div class="line"> opts.Verbose = <span class="keyword">true</span>;</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> <span class="keywordflow">default</span>:</div><div class="line"> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> (optind <= argc)</div><div class="line"> opts.Input = argv [optind];</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> (!opts.Lens && !opts.Camera) {</div><div class="line"> DisplayUsage();</div><div class="line"> g_print (<span class="stringliteral">"\nAt least a lens or camera name is required to perform a database lookup!\n"</span>);</div><div class="line"> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> (!opts.Lens && opts.Input) {</div><div class="line"> DisplayUsage();</div><div class="line"> g_print (<span class="stringliteral">"\nNo lens information (-L) supplied to process specified input image!\n"</span>);</div><div class="line"> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line">}</div><div class="line"></div><div class="line"></div><div class="line"><span class="keyword">static</span> Image *ApplyModifier (<span class="keywordtype">int</span> modflags, <span class="keywordtype">bool</span> reverse, Image *img,</div><div class="line"> <span class="keyword">const</span> <a name="_a16"></a><a class="code" href="structlfModifier.html">lfModifier</a> *mod)</div><div class="line">{</div><div class="line"> <span class="comment">// Create a new image where we will copy the modified image</span></div><div class="line"> Image *newimg = <span class="keyword">new</span> Image ();</div><div class="line"> <span class="comment">// Output image always equals input image size, although</span></div><div class="line"> <span class="comment">// this is not a requirement of the library, it's just a</span></div><div class="line"> <span class="comment">// limitation of the testbed.</span></div><div class="line"> newimg->Resize (img->width, img->height);</div><div class="line"></div><div class="line"><span class="preprocessor">#ifdef COMBINE_13</span></div><div class="line"> <span class="keywordtype">int</span> lwidth = img->width * 2 * 3;</div><div class="line"><span class="preprocessor">#else</span></div><div class="line"> <span class="keywordtype">int</span> lwidth = img->width * 2;</div><div class="line"> <span class="keywordflow">if</span> (modflags & <a class="code" href="group__Correction.html#ggadf764cbdea00d65edcd07bb9953ad2b7a2d151b0e170f0caff31885677d787846">LF_MODIFY_TCA</a>)</div><div class="line"> lwidth *= 3;</div><div class="line"><span class="preprocessor">#endif</span></div><div class="line"> <span class="keywordtype">float</span> *pos = <span class="keyword">new</span> <span class="keywordtype">float</span> [lwidth];</div><div class="line"></div><div class="line"> <span class="keywordtype">int</span> step_start = reverse ? 2 : 0;</div><div class="line"> <span class="keywordtype">int</span> step_delta = reverse ? -1 : +1;</div><div class="line"> <span class="keywordtype">int</span> step_finish = reverse ? -1 : 3;</div><div class="line"></div><div class="line"> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> step = step_start; step != step_finish; step += step_delta)</div><div class="line"> {</div><div class="line"> RGBpixel *dst = newimg->image;</div><div class="line"> <span class="keywordtype">char</span> *imgdata = (<span class="keywordtype">char</span> *)img->image;</div><div class="line"> <span class="keywordtype">bool</span> ok = <span class="keyword">true</span>;</div><div class="line"></div><div class="line"> img->InitInterpolation (opts.Interpolation);</div><div class="line"></div><div class="line"> <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> y = 0; ok && y < img->height; y++)</div><div class="line"> <span class="keywordflow">switch</span> (step)</div><div class="line"> {</div><div class="line"><span class="preprocessor">#ifdef COMBINE_13</span></div><div class="line"> <span class="keywordflow">case</span> 0:</div><div class="line"> ok = <span class="keyword">false</span>;</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"></div><div class="line"> <span class="keywordflow">case</span> 2:</div><div class="line"> <span class="comment">/* TCA and geometry correction */</span></div><div class="line"> ok = mod-><a name="a17"></a><a class="code" href="structlfModifier.html#a6726fa1203f35f0850ae18719a759d92">ApplySubpixelGeometryDistortion</a> (0.0, y, img->width, 1, pos);</div><div class="line"><span class="preprocessor">#else</span></div><div class="line"> <span class="keywordflow">case</span> 0:</div><div class="line"> <span class="comment">/* TCA correction */</span></div><div class="line"> ok = mod-><a name="a18"></a><a class="code" href="structlfModifier.html#aa08d14d032746c06603fb6410ad5ecd6">ApplySubpixelDistortion</a> (0.0, y, img->width, 1, pos);</div><div class="line"><span class="preprocessor">#endif</span></div><div class="line"> <span class="keywordflow">if</span> (ok)</div><div class="line"> {</div><div class="line"> <span class="keywordtype">float</span> *src = pos;</div><div class="line"> <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> x = 0; x < img->width; x++)</div><div class="line"> {</div><div class="line"> dst->red = img->GetR (src [0], src [1]);</div><div class="line"> dst->green = img->GetG (src [2], src [3]);</div><div class="line"> dst->blue = img->GetB (src [4], src [5]);</div><div class="line"> src += 2 * 3;</div><div class="line"> dst++;</div><div class="line"> }</div><div class="line"> }</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"></div><div class="line"> <span class="keywordflow">case</span> 1:</div><div class="line"> <span class="comment">/* Colour correction: vignetting */</span></div><div class="line"> ok = mod-><a name="a19"></a><a class="code" href="structlfModifier.html#a6ea5562a78c04946fc945237d318c669">ApplyColorModification</a> (imgdata, 0.0, y, img->width, 1,</div><div class="line"> <a name="a20"></a><a class="code" href="group__Correction.html#gae3340956c99189894a5efbf2991d8039">LF_CR_4</a> (RED, GREEN, BLUE, UNKNOWN), 0);</div><div class="line"> imgdata += img->width * 4;</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"></div><div class="line"><span class="preprocessor">#ifndef COMBINE_13</span></div><div class="line"> <span class="keywordflow">case</span> 2:</div><div class="line"> <span class="comment">/* Distortion and geometry correction, scaling */</span></div><div class="line"> ok = mod-><a name="a21"></a><a class="code" href="structlfModifier.html#a7739fa851629890b9daa04fef9979ab9">ApplyGeometryDistortion</a> (0.0, y, newimg->width, 1, pos);</div><div class="line"> <span class="keywordflow">if</span> (ok)</div><div class="line"> {</div><div class="line"> <span class="keywordtype">float</span> *src = pos;</div><div class="line"> <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> x = 0; x < img->width; x++)</div><div class="line"> {</div><div class="line"> img->Get (*dst, src [0], src [1]);</div><div class="line"> src += 2;</div><div class="line"> dst++;</div><div class="line"> }</div><div class="line"> }</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"><span class="preprocessor">#endif</span></div><div class="line"> }</div><div class="line"> <span class="comment">// After TCA and distortion steps switch img and newimg.</span></div><div class="line"> <span class="comment">// This is crucial since newimg is now the input image</span></div><div class="line"> <span class="comment">// to the next stage.</span></div><div class="line"> <span class="keywordflow">if</span> (ok && (step == 0 || step == 2))</div><div class="line"> {</div><div class="line"> Image *tmp = newimg;</div><div class="line"> newimg = img;</div><div class="line"> img = tmp;</div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keyword">delete</span> [] pos;</div><div class="line"> <span class="keyword">delete</span> newimg;</div><div class="line"> <span class="keywordflow">return</span> img;</div><div class="line">}</div><div class="line"></div><div class="line"></div><div class="line"></div><div class="line"><span class="keywordtype">int</span> main (<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> **argv)</div><div class="line">{</div><div class="line"> setlocale (LC_ALL, <span class="stringliteral">""</span>);</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> (!ParseParameters(argc, argv))</div><div class="line"> <span class="keywordflow">return</span> -1;</div><div class="line"></div><div class="line"> <span class="comment">// load database</span></div><div class="line"> <a name="_a22"></a><a class="code" href="structlfDatabase.html">lfDatabase</a> *ldb = <span class="keyword">new</span> <a class="code" href="structlfDatabase.html">lfDatabase</a> ();</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> (ldb-><a name="a23"></a><a class="code" href="structlfDatabase.html#ac688c19eb77c64aa6f2be002f8e31e72">Load</a> () != <a name="a24"></a><a class="code" href="group__Auxiliary.html#ggaf84c98d42624e1181549de773ac49ad7a6419ef83b513591890978b83dd296765">LF_NO_ERROR</a>) {</div><div class="line"> <span class="keyword">delete</span> ldb;</div><div class="line"> g_print (<span class="stringliteral">"\rERROR: Database could not be loaded\n"</span>);</div><div class="line"> <span class="keywordflow">return</span> -1;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// try to find camera in the database</span></div><div class="line"> <span class="keyword">const</span> <a name="_a25"></a><a class="code" href="structlfCamera.html">lfCamera</a> *cam = NULL;</div><div class="line"> <span class="keywordflow">if</span> (opts.Camera) {</div><div class="line"> <span class="keyword">const</span> <a class="code" href="structlfCamera.html">lfCamera</a> ** cameras = ldb-><a name="a26"></a><a class="code" href="structlfDatabase.html#aafba4d1ea4b18614892cd755d7e212c2">FindCamerasExt</a>(NULL, opts.Camera);</div><div class="line"> <span class="keywordflow">if</span> (cameras)</div><div class="line"> cam = cameras[0];</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> g_print (<span class="stringliteral">"Cannot find a camera matching `%s' in database\n"</span>, opts.Camera);</div><div class="line"> <a name="a27"></a><a class="code" href="group__Auxiliary.html#ga675c7ad6ae2c3b98e46a60f3deda317b">lf_free</a> (cameras);</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// try to find a matching lens in the database</span></div><div class="line"> <span class="keyword">const</span> <a name="_a28"></a><a class="code" href="structlfLens.html">lfLens</a> *lens = NULL;</div><div class="line"> <span class="keywordflow">if</span> (opts.Lens) {</div><div class="line"> <span class="keyword">const</span> <a class="code" href="structlfLens.html">lfLens</a> **lenses = ldb-><a name="a29"></a><a class="code" href="structlfDatabase.html#a3cfbcf0233c39ec4cbdf89386f0ecb40">FindLenses</a> (cam, NULL, opts.Lens);</div><div class="line"> <span class="keywordflow">if</span> (lenses)</div><div class="line"> lens = lenses [0];</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> g_print (<span class="stringliteral">"Cannot find a lens matching `%s' in database\n"</span>, opts.Lens);</div><div class="line"> <a class="code" href="group__Auxiliary.html#ga675c7ad6ae2c3b98e46a60f3deda317b">lf_free</a> (lenses);</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// print camera and lens information if in verbose mode or if no input file is specified</span></div><div class="line"> <span class="keywordflow">if</span> (opts.Verbose || !opts.Input) {</div><div class="line"> <span class="keywordflow">if</span> (cam && lens) {</div><div class="line"> g_print(<span class="stringliteral">"Matching lens and camera combination found in the database:\n"</span>);</div><div class="line"> PrintCamera(cam, ldb);</div><div class="line"> PrintLens(lens, ldb);</div><div class="line"> } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!cam && lens) {</div><div class="line"> g_print(<span class="stringliteral">"Matching lens found in the database:\n"</span>);</div><div class="line"> PrintLens(lens, ldb);</div><div class="line"> } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!lens && cam) {</div><div class="line"> g_print(<span class="stringliteral">"Matching camera found in the database:\n"</span>);</div><div class="line"> PrintCamera(cam, ldb);</div><div class="line"> }</div><div class="line"> } <span class="keywordflow">else</span> {</div><div class="line"> <span class="keywordflow">if</span> (cam && lens) {</div><div class="line"> g_print(<span class="stringliteral">"= Selecting %s / %s\n"</span>, cam-><a name="a30"></a><a class="code" href="structlfCamera.html#a24aab9e53248a0cbab26971c31ea49d8">Model</a>, lens-><a name="a31"></a><a class="code" href="structlfLens.html#a071ad3a45712b2cdbf9eedf8996aa298">Model</a>);</div><div class="line"> } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!cam && lens) {</div><div class="line"> g_print(<span class="stringliteral">"= Selecting %s\n"</span>, lens-><a class="code" href="structlfLens.html#a071ad3a45712b2cdbf9eedf8996aa298">Model</a>);</div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// nothing to process, so lets quit here</span></div><div class="line"> <span class="keywordflow">if</span> (!opts.Input) {</div><div class="line"> <span class="keyword">delete</span> ldb;</div><div class="line"> <span class="keywordflow">return</span> 0;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// assume standard values if parameters are not specified</span></div><div class="line"> <span class="keywordflow">if</span> (cam)</div><div class="line"> opts.Crop = cam-><a name="a32"></a><a class="code" href="structlfCamera.html#af48074e34b4444b32bfe50f626aa3c21">CropFactor</a>;</div><div class="line"> <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!opts.Crop)</div><div class="line"> opts.Crop = lens-><a name="a33"></a><a class="code" href="structlfLens.html#a2f9b563c3cd56c635761b7d4109ca7b3">CropFactor</a>; </div><div class="line"> <span class="keywordflow">if</span> (!opts.Focal)</div><div class="line"> opts.Focal = lens-><a name="a34"></a><a class="code" href="structlfLens.html#a6928a9fed201b940e8a8f0205a6663c1">MinFocal</a>;</div><div class="line"> <span class="keywordflow">if</span> (!opts.Aperture)</div><div class="line"> opts.Aperture = lens-><a name="a35"></a><a class="code" href="structlfLens.html#a8cac58535976392db8542b8a3c76f6c0">MinAperture</a>;</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> (opts.Verbose) {</div><div class="line"> g_print(<span class="stringliteral">"\nProcessing parameters:\n"</span></div><div class="line"> <span class="stringliteral">" |- Image crop factor: %g\n"</span></div><div class="line"> <span class="stringliteral">" |- Focal length: %gmm\n"</span></div><div class="line"> <span class="stringliteral">" |- Aperture: f/%g\n"</span></div><div class="line"> <span class="stringliteral">" |- Distance: %gm\n\n"</span>,</div><div class="line"> opts.Crop, opts.Focal, opts.Aperture, opts.Distance);</div><div class="line"> } <span class="keywordflow">else</span> {</div><div class="line"> g_print(<span class="stringliteral">"= Processing parameters: Crop %g, Focal %gmm, Aperture f/%g, Distance: %gm\n"</span>,</div><div class="line"> opts.Crop, opts.Focal, opts.Aperture, opts.Distance);</div><div class="line"> }</div><div class="line"></div><div class="line"> Image *img = <span class="keyword">new</span> Image ();</div><div class="line"> g_print (<span class="stringliteral">"~ Loading `%s' ... "</span>, opts.Input);</div><div class="line"> <span class="keywordflow">if</span> (!img->Open (opts.Input)) {</div><div class="line"> g_print (<span class="stringliteral">"\rERROR: failed to open file `%s'\n"</span>, opts.Input);</div><div class="line"> <span class="keyword">delete</span> img;</div><div class="line"> <span class="keyword">delete</span> ldb;</div><div class="line"> <span class="keywordflow">return</span> -1;</div><div class="line"> }</div><div class="line"> <span class="keywordflow">if</span> (!img->LoadPNG ()) {</div><div class="line"> g_print (<span class="stringliteral">"\rERROR: failed to parse PNG data from file `%s'\n"</span>, opts.Input);</div><div class="line"> <span class="keyword">delete</span> img;</div><div class="line"> <span class="keyword">delete</span> ldb;</div><div class="line"> <span class="keywordflow">return</span> -1;</div><div class="line"> }</div><div class="line"> g_print (<span class="stringliteral">"done.\n~ Image size [%ux%u].\n"</span>, img->width, img->height);</div><div class="line"></div><div class="line"> <a class="code" href="structlfModifier.html">lfModifier</a> *mod = <span class="keyword">new</span> <a class="code" href="structlfModifier.html">lfModifier</a> (lens, opts.Crop, img->width, img->height);</div><div class="line"> <span class="keywordflow">if</span> (!mod) {</div><div class="line"> g_print (<span class="stringliteral">"\rWarning: failed to create modifier\n"</span>);</div><div class="line"> <span class="keyword">delete</span> img;</div><div class="line"> <span class="keyword">delete</span> ldb;</div><div class="line"> <span class="keywordflow">return</span> -1;</div><div class="line"> }</div><div class="line"> <span class="keywordtype">int</span> modflags = mod-><a name="a36"></a><a class="code" href="structlfModifier.html#a15fc45849ffb7f7f0f815025d4994ccd">Initialize</a> (</div><div class="line"> lens, <a name="a37"></a><a class="code" href="group__Correction.html#ggaff4770bc2656179dcfe2da40a25f8148a95ee1ddd11467921c63bedad9ab5f673">LF_PF_U8</a>, opts.Focal,</div><div class="line"> opts.Aperture, opts.Distance, opts.Scale, opts.TargetGeom,</div><div class="line"> opts.ModifyFlags, opts.Inverse);</div><div class="line"></div><div class="line"> g_print(<span class="stringliteral">"~ Selected modifications: "</span>);</div><div class="line"> <span class="keywordflow">if</span> (modflags & <a class="code" href="group__Correction.html#ggadf764cbdea00d65edcd07bb9953ad2b7a2d151b0e170f0caff31885677d787846">LF_MODIFY_TCA</a>)</div><div class="line"> g_print (<span class="stringliteral">"[tca]"</span>);</div><div class="line"> <span class="keywordflow">if</span> (modflags & <a class="code" href="group__Correction.html#ggadf764cbdea00d65edcd07bb9953ad2b7a6aded8676e2e6da6abe62709d63ee1da">LF_MODIFY_VIGNETTING</a>)</div><div class="line"> g_print (<span class="stringliteral">"[vign]"</span>);</div><div class="line"> <span class="keywordflow">if</span> (modflags & <a class="code" href="group__Correction.html#ggadf764cbdea00d65edcd07bb9953ad2b7a7be69c9a6c86737de2ed4e5bff238086">LF_MODIFY_DISTORTION</a>)</div><div class="line"> g_print (<span class="stringliteral">"[dist]"</span>);</div><div class="line"> <span class="keywordflow">if</span> (modflags & <a class="code" href="group__Correction.html#ggadf764cbdea00d65edcd07bb9953ad2b7a6fa0d1e43f6dbde8c395be838b89ad52">LF_MODIFY_GEOMETRY</a>)</div><div class="line"> g_print (<span class="stringliteral">"[geom]"</span>);</div><div class="line"> <span class="keywordflow">if</span> (opts.Scale != 1.0)</div><div class="line"> g_print (<span class="stringliteral">"[scale]"</span>);</div><div class="line"> <span class="keywordflow">if</span> (modflags==0)</div><div class="line"> g_print (<span class="stringliteral">"[NOTHING]"</span>);</div><div class="line"> g_print (<span class="stringliteral">"\n"</span>);</div><div class="line"></div><div class="line"> g_print(<span class="stringliteral">"~ Run processing chain... "</span>);</div><div class="line"></div><div class="line"> clock_t st;</div><div class="line"> clock_t xt = clock ();</div><div class="line"> <span class="keywordflow">while</span> (xt == (st = clock ()))</div><div class="line"> ;</div><div class="line"></div><div class="line"> img = ApplyModifier (modflags, opts.Inverse, img, mod);</div><div class="line"></div><div class="line"> clock_t et = clock ();</div><div class="line"> g_print (<span class="stringliteral">"done (%.3g secs)\n"</span>, <span class="keywordtype">double</span> (et - st) / CLOCKS_PER_SEC);</div><div class="line"></div><div class="line"> <span class="keyword">delete</span> mod;</div><div class="line"></div><div class="line"> g_print (<span class="stringliteral">"~ Save output as `%s'..."</span>, opts.Output);</div><div class="line"> <span class="keywordtype">bool</span> ok = img->SavePNG (opts.Output);</div><div class="line"></div><div class="line"> <span class="keyword">delete</span> img;</div><div class="line"> <span class="keyword">delete</span> ldb;</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> (ok) {</div><div class="line"> g_print (<span class="stringliteral">" done\n"</span>);</div><div class="line"> <span class="keywordflow">return</span> 0;</div><div class="line"> } <span class="keywordflow">else</span> {</div><div class="line"> g_print (<span class="stringliteral">" FAILED\n"</span>);</div><div class="line"> <span class="keywordflow">return</span> -1;</div><div class="line"> }</div><div class="line"></div><div class="line">}</div></div><!-- fragment --> </div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> Generated on Thu Oct 3 2019 15:07:50 for lensfun by  <a href="http://www.doxygen.org/index.html"> <img class="footer" src="doxygen.png" alt="doxygen"/> </a> 1.8.15 </small></address> </body> </html>