blob: 5674c914cd40ed0b1967194f8ce72ceb9399caf8 [file] [log] [blame]
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source of the Rust file `/root/.cargo/registry/src/github.com-1ecc6299db9ec823/image-0.23.14/./src/codecs/jpeg/transform.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>transform.rs - source</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../../SourceSerif4-Regular.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../../FiraSans-Regular.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../../FiraSans-Medium.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../../SourceCodePro-Regular.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../../SourceSerif4-Bold.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../../SourceCodePro-Semibold.ttf.woff2"><link rel="stylesheet" href="../../../../normalize.css"><link rel="stylesheet" href="../../../../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" href="../../../../ayu.css" disabled><link rel="stylesheet" href="../../../../dark.css" disabled><link rel="stylesheet" href="../../../../light.css" id="themeStyle"><script id="default-settings" ></script><script src="../../../../storage.js"></script><script defer src="../../../../source-script.js"></script><script defer src="../../../../source-files.js"></script><script defer src="../../../../main.js"></script><noscript><link rel="stylesheet" href="../../../../noscript.css"></noscript><link rel="alternate icon" type="image/png" href="../../../../favicon-16x16.png"><link rel="alternate icon" type="image/png" href="../../../../favicon-32x32.png"><link rel="icon" type="image/svg+xml" href="../../../../favicon.svg"></head><body class="rustdoc source"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><a class="sidebar-logo" href="../../../../image/index.html"><div class="logo-container"><img class="rust-logo" src="../../../../rust-logo.svg" alt="logo"></div></a></nav><main><div class="width-limiter"><nav class="sub"><a class="sub-logo-container" href="../../../../image/index.html"><img class="rust-logo" src="../../../../rust-logo.svg" alt="logo"></a><form class="search-form"><div class="search-container"><span></span><input class="search-input" name="search" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" title="help" tabindex="-1"><a href="../../../../help.html">?</a></div><div id="settings-menu" tabindex="-1"><a href="../../../../settings.html" title="settings"><img width="22" height="22" alt="Change settings" src="../../../../wheel.svg"></a></div></div></form></nav><section id="main-content" class="content"><div class="example-wrap"><pre class="src-line-numbers"><span id="1">1</span>
<span id="2">2</span>
<span id="3">3</span>
<span id="4">4</span>
<span id="5">5</span>
<span id="6">6</span>
<span id="7">7</span>
<span id="8">8</span>
<span id="9">9</span>
<span id="10">10</span>
<span id="11">11</span>
<span id="12">12</span>
<span id="13">13</span>
<span id="14">14</span>
<span id="15">15</span>
<span id="16">16</span>
<span id="17">17</span>
<span id="18">18</span>
<span id="19">19</span>
<span id="20">20</span>
<span id="21">21</span>
<span id="22">22</span>
<span id="23">23</span>
<span id="24">24</span>
<span id="25">25</span>
<span id="26">26</span>
<span id="27">27</span>
<span id="28">28</span>
<span id="29">29</span>
<span id="30">30</span>
<span id="31">31</span>
<span id="32">32</span>
<span id="33">33</span>
<span id="34">34</span>
<span id="35">35</span>
<span id="36">36</span>
<span id="37">37</span>
<span id="38">38</span>
<span id="39">39</span>
<span id="40">40</span>
<span id="41">41</span>
<span id="42">42</span>
<span id="43">43</span>
<span id="44">44</span>
<span id="45">45</span>
<span id="46">46</span>
<span id="47">47</span>
<span id="48">48</span>
<span id="49">49</span>
<span id="50">50</span>
<span id="51">51</span>
<span id="52">52</span>
<span id="53">53</span>
<span id="54">54</span>
<span id="55">55</span>
<span id="56">56</span>
<span id="57">57</span>
<span id="58">58</span>
<span id="59">59</span>
<span id="60">60</span>
<span id="61">61</span>
<span id="62">62</span>
<span id="63">63</span>
<span id="64">64</span>
<span id="65">65</span>
<span id="66">66</span>
<span id="67">67</span>
<span id="68">68</span>
<span id="69">69</span>
<span id="70">70</span>
<span id="71">71</span>
<span id="72">72</span>
<span id="73">73</span>
<span id="74">74</span>
<span id="75">75</span>
<span id="76">76</span>
<span id="77">77</span>
<span id="78">78</span>
<span id="79">79</span>
<span id="80">80</span>
<span id="81">81</span>
<span id="82">82</span>
<span id="83">83</span>
<span id="84">84</span>
<span id="85">85</span>
<span id="86">86</span>
<span id="87">87</span>
<span id="88">88</span>
<span id="89">89</span>
<span id="90">90</span>
<span id="91">91</span>
<span id="92">92</span>
<span id="93">93</span>
<span id="94">94</span>
<span id="95">95</span>
<span id="96">96</span>
<span id="97">97</span>
<span id="98">98</span>
<span id="99">99</span>
<span id="100">100</span>
<span id="101">101</span>
<span id="102">102</span>
<span id="103">103</span>
<span id="104">104</span>
<span id="105">105</span>
<span id="106">106</span>
<span id="107">107</span>
<span id="108">108</span>
<span id="109">109</span>
<span id="110">110</span>
<span id="111">111</span>
<span id="112">112</span>
<span id="113">113</span>
<span id="114">114</span>
<span id="115">115</span>
<span id="116">116</span>
<span id="117">117</span>
<span id="118">118</span>
<span id="119">119</span>
<span id="120">120</span>
<span id="121">121</span>
<span id="122">122</span>
<span id="123">123</span>
<span id="124">124</span>
<span id="125">125</span>
<span id="126">126</span>
<span id="127">127</span>
<span id="128">128</span>
<span id="129">129</span>
<span id="130">130</span>
<span id="131">131</span>
<span id="132">132</span>
<span id="133">133</span>
<span id="134">134</span>
<span id="135">135</span>
<span id="136">136</span>
<span id="137">137</span>
<span id="138">138</span>
<span id="139">139</span>
<span id="140">140</span>
<span id="141">141</span>
<span id="142">142</span>
<span id="143">143</span>
<span id="144">144</span>
<span id="145">145</span>
<span id="146">146</span>
<span id="147">147</span>
<span id="148">148</span>
<span id="149">149</span>
<span id="150">150</span>
<span id="151">151</span>
<span id="152">152</span>
<span id="153">153</span>
<span id="154">154</span>
<span id="155">155</span>
<span id="156">156</span>
<span id="157">157</span>
<span id="158">158</span>
<span id="159">159</span>
<span id="160">160</span>
<span id="161">161</span>
<span id="162">162</span>
<span id="163">163</span>
<span id="164">164</span>
<span id="165">165</span>
<span id="166">166</span>
<span id="167">167</span>
<span id="168">168</span>
<span id="169">169</span>
<span id="170">170</span>
<span id="171">171</span>
<span id="172">172</span>
<span id="173">173</span>
<span id="174">174</span>
<span id="175">175</span>
<span id="176">176</span>
<span id="177">177</span>
<span id="178">178</span>
<span id="179">179</span>
<span id="180">180</span>
<span id="181">181</span>
<span id="182">182</span>
<span id="183">183</span>
<span id="184">184</span>
<span id="185">185</span>
<span id="186">186</span>
<span id="187">187</span>
<span id="188">188</span>
<span id="189">189</span>
<span id="190">190</span>
<span id="191">191</span>
<span id="192">192</span>
<span id="193">193</span>
<span id="194">194</span>
<span id="195">195</span>
<span id="196">196</span>
</pre><pre class="rust"><code><span class="comment">/*
fdct is a Rust translation of jfdctint.c from the
Independent JPEG Group&#39;s libjpeg version 9a
obtained from http://www.ijg.org/files/jpegsr9a.zip
It comes with the following conditions of distribution and use:
In plain English:
1. We don&#39;t promise that this software works. (But if you find any bugs,
please let us know!)
2. You can use this software for whatever you want. You don&#39;t have to pay us.
3. You may not pretend that you wrote this software. If you use it in a
program, you must acknowledge somewhere in your documentation that
you&#39;ve used the IJG code.
In legalese:
The authors make NO WARRANTY or representation, either express or implied,
with respect to this software, its quality, accuracy, merchantability, or
fitness for a particular purpose. This software is provided &quot;AS IS&quot;, and you,
its user, assume the entire risk as to its quality and accuracy.
This software is copyright (C) 1991-2014, Thomas G. Lane, Guido Vollbeding.
All Rights Reserved except as specified below.
Permission is hereby granted to use, copy, modify, and distribute this
software (or portions thereof) for any purpose, without fee, subject to these
conditions:
(1) If any part of the source code for this software is distributed, then this
README file must be included, with this copyright and no-warranty notice
unaltered; and any additions, deletions, or changes to the original files
must be clearly indicated in accompanying documentation.
(2) If only executable code is distributed, then the accompanying
documentation must state that &quot;this software is based in part on the work of
the Independent JPEG Group&quot;.
(3) Permission for use of this software is granted only if the user accepts
full responsibility for any undesirable consequences; the authors accept
NO LIABILITY for damages of any kind.
These conditions apply to any software derived from or based on the IJG code,
not just to the unmodified library. If you use our work, you ought to
acknowledge us.
Permission is NOT granted for the use of any IJG author&#39;s name or company name
in advertising or publicity relating to this software or products derived from
it. This software may be referred to only as &quot;the Independent JPEG Group&#39;s
software&quot;.
We specifically permit and encourage the use of this software as the basis of
commercial products, provided that all warranty or liability claims are
assumed by the product vendor.
*/
</span><span class="kw">static </span>CONST_BITS: i32 = <span class="number">13</span>;
<span class="kw">static </span>PASS1_BITS: i32 = <span class="number">2</span>;
<span class="kw">static </span>FIX_0_298631336: i32 = <span class="number">2446</span>;
<span class="kw">static </span>FIX_0_390180644: i32 = <span class="number">3196</span>;
<span class="kw">static </span>FIX_0_541196100: i32 = <span class="number">4433</span>;
<span class="kw">static </span>FIX_0_765366865: i32 = <span class="number">6270</span>;
<span class="kw">static </span>FIX_0_899976223: i32 = <span class="number">7373</span>;
<span class="kw">static </span>FIX_1_175875602: i32 = <span class="number">9633</span>;
<span class="kw">static </span>FIX_1_501321110: i32 = <span class="number">12_299</span>;
<span class="kw">static </span>FIX_1_847759065: i32 = <span class="number">15_137</span>;
<span class="kw">static </span>FIX_1_961570560: i32 = <span class="number">16_069</span>;
<span class="kw">static </span>FIX_2_053119869: i32 = <span class="number">16_819</span>;
<span class="kw">static </span>FIX_2_562915447: i32 = <span class="number">20_995</span>;
<span class="kw">static </span>FIX_3_072711026: i32 = <span class="number">25_172</span>;
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>fdct(samples: <span class="kw-2">&amp;</span>[u8; <span class="number">64</span>], coeffs: <span class="kw-2">&amp;mut </span>[i32; <span class="number">64</span>]) {
<span class="comment">// Pass 1: process rows.
// Results are scaled by sqrt(8) compared to a true DCT
// furthermore we scale the results by 2**PASS1_BITS
</span><span class="kw">for </span>y <span class="kw">in </span><span class="number">0usize</span>..<span class="number">8 </span>{
<span class="kw">let </span>y0 = y * <span class="number">8</span>;
<span class="comment">// Even part
</span><span class="kw">let </span>t0 = i32::from(samples[y0]) + i32::from(samples[y0 + <span class="number">7</span>]);
<span class="kw">let </span>t1 = i32::from(samples[y0 + <span class="number">1</span>]) + i32::from(samples[y0 + <span class="number">6</span>]);
<span class="kw">let </span>t2 = i32::from(samples[y0 + <span class="number">2</span>]) + i32::from(samples[y0 + <span class="number">5</span>]);
<span class="kw">let </span>t3 = i32::from(samples[y0 + <span class="number">3</span>]) + i32::from(samples[y0 + <span class="number">4</span>]);
<span class="kw">let </span>t10 = t0 + t3;
<span class="kw">let </span>t12 = t0 - t3;
<span class="kw">let </span>t11 = t1 + t2;
<span class="kw">let </span>t13 = t1 - t2;
<span class="kw">let </span>t0 = i32::from(samples[y0]) - i32::from(samples[y0 + <span class="number">7</span>]);
<span class="kw">let </span>t1 = i32::from(samples[y0 + <span class="number">1</span>]) - i32::from(samples[y0 + <span class="number">6</span>]);
<span class="kw">let </span>t2 = i32::from(samples[y0 + <span class="number">2</span>]) - i32::from(samples[y0 + <span class="number">5</span>]);
<span class="kw">let </span>t3 = i32::from(samples[y0 + <span class="number">3</span>]) - i32::from(samples[y0 + <span class="number">4</span>]);
<span class="comment">// Apply unsigned -&gt; signed conversion
</span>coeffs[y0] = (t10 + t11 - <span class="number">8 </span>* <span class="number">128</span>) &lt;&lt; PASS1_BITS <span class="kw">as </span>usize;
coeffs[y0 + <span class="number">4</span>] = (t10 - t11) &lt;&lt; PASS1_BITS <span class="kw">as </span>usize;
<span class="kw">let </span><span class="kw-2">mut </span>z1 = (t12 + t13) * FIX_0_541196100;
<span class="comment">// Add fudge factor here for final descale
</span>z1 += <span class="number">1 </span>&lt;&lt; (CONST_BITS - PASS1_BITS - <span class="number">1</span>) <span class="kw">as </span>usize;
coeffs[y0 + <span class="number">2</span>] = (z1 + t12 * FIX_0_765366865) &gt;&gt; (CONST_BITS - PASS1_BITS) <span class="kw">as </span>usize;
coeffs[y0 + <span class="number">6</span>] = (z1 - t13 * FIX_1_847759065) &gt;&gt; (CONST_BITS - PASS1_BITS) <span class="kw">as </span>usize;
<span class="comment">// Odd part
</span><span class="kw">let </span>t12 = t0 + t2;
<span class="kw">let </span>t13 = t1 + t3;
<span class="kw">let </span><span class="kw-2">mut </span>z1 = (t12 + t13) * FIX_1_175875602;
<span class="comment">// Add fudge factor here for final descale
</span>z1 += <span class="number">1 </span>&lt;&lt; (CONST_BITS - PASS1_BITS - <span class="number">1</span>) <span class="kw">as </span>usize;
<span class="kw">let </span><span class="kw-2">mut </span>t12 = t12 * (-FIX_0_390180644);
<span class="kw">let </span><span class="kw-2">mut </span>t13 = t13 * (-FIX_1_961570560);
t12 += z1;
t13 += z1;
<span class="kw">let </span>z1 = (t0 + t3) * (-FIX_0_899976223);
<span class="kw">let </span><span class="kw-2">mut </span>t0 = t0 * FIX_1_501321110;
<span class="kw">let </span><span class="kw-2">mut </span>t3 = t3 * FIX_0_298631336;
t0 += z1 + t12;
t3 += z1 + t13;
<span class="kw">let </span>z1 = (t1 + t2) * (-FIX_2_562915447);
<span class="kw">let </span><span class="kw-2">mut </span>t1 = t1 * FIX_3_072711026;
<span class="kw">let </span><span class="kw-2">mut </span>t2 = t2 * FIX_2_053119869;
t1 += z1 + t13;
t2 += z1 + t12;
coeffs[y0 + <span class="number">1</span>] = t0 &gt;&gt; (CONST_BITS - PASS1_BITS) <span class="kw">as </span>usize;
coeffs[y0 + <span class="number">3</span>] = t1 &gt;&gt; (CONST_BITS - PASS1_BITS) <span class="kw">as </span>usize;
coeffs[y0 + <span class="number">5</span>] = t2 &gt;&gt; (CONST_BITS - PASS1_BITS) <span class="kw">as </span>usize;
coeffs[y0 + <span class="number">7</span>] = t3 &gt;&gt; (CONST_BITS - PASS1_BITS) <span class="kw">as </span>usize;
}
<span class="comment">// Pass 2: process columns
// We remove the PASS1_BITS scaling but leave the results scaled up an
// overall factor of 8
</span><span class="kw">for </span>x <span class="kw">in </span>(<span class="number">0usize</span>..<span class="number">8</span>).rev() {
<span class="comment">// Even part
</span><span class="kw">let </span>t0 = coeffs[x] + coeffs[x + <span class="number">8 </span>* <span class="number">7</span>];
<span class="kw">let </span>t1 = coeffs[x + <span class="number">8</span>] + coeffs[x + <span class="number">8 </span>* <span class="number">6</span>];
<span class="kw">let </span>t2 = coeffs[x + <span class="number">8 </span>* <span class="number">2</span>] + coeffs[x + <span class="number">8 </span>* <span class="number">5</span>];
<span class="kw">let </span>t3 = coeffs[x + <span class="number">8 </span>* <span class="number">3</span>] + coeffs[x + <span class="number">8 </span>* <span class="number">4</span>];
<span class="comment">// Add fudge factor here for final descale
</span><span class="kw">let </span>t10 = t0 + t3 + (<span class="number">1 </span>&lt;&lt; (PASS1_BITS - <span class="number">1</span>) <span class="kw">as </span>usize);
<span class="kw">let </span>t12 = t0 - t3;
<span class="kw">let </span>t11 = t1 + t2;
<span class="kw">let </span>t13 = t1 - t2;
<span class="kw">let </span>t0 = coeffs[x] - coeffs[x + <span class="number">8 </span>* <span class="number">7</span>];
<span class="kw">let </span>t1 = coeffs[x + <span class="number">8</span>] - coeffs[x + <span class="number">8 </span>* <span class="number">6</span>];
<span class="kw">let </span>t2 = coeffs[x + <span class="number">8 </span>* <span class="number">2</span>] - coeffs[x + <span class="number">8 </span>* <span class="number">5</span>];
<span class="kw">let </span>t3 = coeffs[x + <span class="number">8 </span>* <span class="number">3</span>] - coeffs[x + <span class="number">8 </span>* <span class="number">4</span>];
coeffs[x] = (t10 + t11) &gt;&gt; PASS1_BITS <span class="kw">as </span>usize;
coeffs[x + <span class="number">8 </span>* <span class="number">4</span>] = (t10 - t11) &gt;&gt; PASS1_BITS <span class="kw">as </span>usize;
<span class="kw">let </span><span class="kw-2">mut </span>z1 = (t12 + t13) * FIX_0_541196100;
<span class="comment">// Add fudge factor here for final descale
</span>z1 += <span class="number">1 </span>&lt;&lt; (CONST_BITS + PASS1_BITS - <span class="number">1</span>) <span class="kw">as </span>usize;
coeffs[x + <span class="number">8 </span>* <span class="number">2</span>] = (z1 + t12 * FIX_0_765366865) &gt;&gt; (CONST_BITS + PASS1_BITS) <span class="kw">as </span>usize;
coeffs[x + <span class="number">8 </span>* <span class="number">6</span>] = (z1 - t13 * FIX_1_847759065) &gt;&gt; (CONST_BITS + PASS1_BITS) <span class="kw">as </span>usize;
<span class="comment">// Odd part
</span><span class="kw">let </span>t12 = t0 + t2;
<span class="kw">let </span>t13 = t1 + t3;
<span class="kw">let </span><span class="kw-2">mut </span>z1 = (t12 + t13) * FIX_1_175875602;
<span class="comment">// Add fudge factor here for final descale
</span>z1 += <span class="number">1 </span>&lt;&lt; (CONST_BITS - PASS1_BITS - <span class="number">1</span>) <span class="kw">as </span>usize;
<span class="kw">let </span><span class="kw-2">mut </span>t12 = t12 * (-FIX_0_390180644);
<span class="kw">let </span><span class="kw-2">mut </span>t13 = t13 * (-FIX_1_961570560);
t12 += z1;
t13 += z1;
<span class="kw">let </span>z1 = (t0 + t3) * (-FIX_0_899976223);
<span class="kw">let </span><span class="kw-2">mut </span>t0 = t0 * FIX_1_501321110;
<span class="kw">let </span><span class="kw-2">mut </span>t3 = t3 * FIX_0_298631336;
t0 += z1 + t12;
t3 += z1 + t13;
<span class="kw">let </span>z1 = (t1 + t2) * (-FIX_2_562915447);
<span class="kw">let </span><span class="kw-2">mut </span>t1 = t1 * FIX_3_072711026;
<span class="kw">let </span><span class="kw-2">mut </span>t2 = t2 * FIX_2_053119869;
t1 += z1 + t13;
t2 += z1 + t12;
coeffs[x + <span class="number">8</span>] = t0 &gt;&gt; (CONST_BITS + PASS1_BITS) <span class="kw">as </span>usize;
coeffs[x + <span class="number">8 </span>* <span class="number">3</span>] = t1 &gt;&gt; (CONST_BITS + PASS1_BITS) <span class="kw">as </span>usize;
coeffs[x + <span class="number">8 </span>* <span class="number">5</span>] = t2 &gt;&gt; (CONST_BITS + PASS1_BITS) <span class="kw">as </span>usize;
coeffs[x + <span class="number">8 </span>* <span class="number">7</span>] = t3 &gt;&gt; (CONST_BITS + PASS1_BITS) <span class="kw">as </span>usize;
}
}
</code></pre></div>
</section></div></main><div id="rustdoc-vars" data-root-path="../../../../" data-current-crate="image" data-themes="ayu,dark,light" data-resource-suffix="" data-rustdoc-version="1.66.0-nightly (5c8bff74b 2022-10-21)" ></div></body></html>