1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>DevIL: /home/dwoods/DevIL/src-IL/include/il_manip.h Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.5.6 -->
<div class="navigation" id="top">
<div class="tabs">
<ul>
<li><a href="index.html"><span>Main Page</span></a></li>
<li><a href="annotated.html"><span>Data Structures</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<h1>/home/dwoods/DevIL/src-IL/include/il_manip.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">//-----------------------------------------------------------------------------</span>
<a name="l00002"></a>00002 <span class="comment">//</span>
<a name="l00003"></a>00003 <span class="comment">// ImageLib Sources</span>
<a name="l00004"></a>00004 <span class="comment">// Copyright (C) 2001-2002 by Denton Woods</span>
<a name="l00005"></a>00005 <span class="comment">// Last modified: 05/25/2001 <--Y2K Compliant! =]</span>
<a name="l00006"></a>00006 <span class="comment">//</span>
<a name="l00007"></a>00007 <span class="comment">// Filename: src-IL/include/il_manip.h</span>
<a name="l00008"></a>00008 <span class="comment">//</span>
<a name="l00009"></a>00009 <span class="comment">// Description: Image manipulation</span>
<a name="l00010"></a>00010 <span class="comment">//</span>
<a name="l00011"></a>00011 <span class="comment">//-----------------------------------------------------------------------------</span>
<a name="l00012"></a>00012
<a name="l00013"></a>00013 <span class="preprocessor">#ifndef MANIP_H</span>
<a name="l00014"></a>00014 <span class="preprocessor"></span><span class="preprocessor">#define MANIP_H</span>
<a name="l00015"></a>00015 <span class="preprocessor"></span>
<a name="l00016"></a>00016 <span class="preprocessor">#ifdef _cplusplus</span>
<a name="l00017"></a>00017 <span class="preprocessor"></span><span class="keyword">extern</span> <span class="stringliteral">"C"</span> {
<a name="l00018"></a>00018 <span class="preprocessor">#endif</span>
<a name="l00019"></a>00019 <span class="preprocessor"></span>
<a name="l00020"></a>00020 ILboolean ilFlipImage(<span class="keywordtype">void</span>);
<a name="l00021"></a>00021 ILboolean ilMirrorImage(<span class="keywordtype">void</span>); <span class="comment">//@JASON New routine created 03/28/2001</span>
<a name="l00022"></a>00022
<a name="l00023"></a>00023 <span class="comment">//-----------------------------------------------</span>
<a name="l00024"></a>00024 <span class="comment">// Overflow handler for float-to-half conversion;</span>
<a name="l00025"></a>00025 <span class="comment">// generates a hardware floating-point overflow,</span>
<a name="l00026"></a>00026 <span class="comment">// which may be trapped by the operating system.</span>
<a name="l00027"></a>00027 <span class="comment">//-----------------------------------------------</span>
<a name="l00028"></a>00028 <span class="preprocessor">#ifndef NOINLINE</span>
<a name="l00029"></a>00029 <span class="preprocessor"></span>
<a name="l00030"></a>00030 <span class="preprocessor">#if defined(_MSC_VER)</span>
<a name="l00031"></a>00031 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning(push)</span>
<a name="l00032"></a>00032 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning(disable : 4756) // Disables 'named type definition in parentheses' warning</span>
<a name="l00033"></a>00033 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00034"></a>00034 <span class="preprocessor"></span>INLINE ILfloat <span class="comment">/*ILAPIENTRY*/</span> ilFloatToHalfOverflow() {
<a name="l00035"></a>00035 ILfloat f = 1e10;
<a name="l00036"></a>00036 ILint j;
<a name="l00037"></a>00037 <span class="keywordflow">for</span> (j = 0; j < 10; j++)
<a name="l00038"></a>00038 f *= f; <span class="comment">// this will overflow before</span>
<a name="l00039"></a>00039 <span class="comment">// the for loop terminates</span>
<a name="l00040"></a>00040 <span class="keywordflow">return</span> f;
<a name="l00041"></a>00041 }
<a name="l00042"></a>00042 <span class="preprocessor">#if defined(_MSC_VER)</span>
<a name="l00043"></a>00043 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning(pop)</span>
<a name="l00044"></a>00044 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00045"></a>00045 <span class="preprocessor"></span>
<a name="l00046"></a>00046 <span class="comment">//-----------------------------------------------------</span>
<a name="l00047"></a>00047 <span class="comment">// Float-to-half conversion -- general case, including</span>
<a name="l00048"></a>00048 <span class="comment">// zeroes, denormalized numbers and exponent overflows.</span>
<a name="l00049"></a>00049 <span class="comment">//-----------------------------------------------------</span>
<a name="l00050"></a>00050 INLINE ILushort ILAPIENTRY ilFloatToHalf(ILuint i) {
<a name="l00051"></a>00051 <span class="comment">//</span>
<a name="l00052"></a>00052 <span class="comment">// Our floating point number, f, is represented by the bit</span>
<a name="l00053"></a>00053 <span class="comment">// pattern in integer i. Disassemble that bit pattern into</span>
<a name="l00054"></a>00054 <span class="comment">// the sign, s, the exponent, e, and the significand, m.</span>
<a name="l00055"></a>00055 <span class="comment">// Shift s into the position where it will go in in the</span>
<a name="l00056"></a>00056 <span class="comment">// resulting half number.</span>
<a name="l00057"></a>00057 <span class="comment">// Adjust e, accounting for the different exponent bias</span>
<a name="l00058"></a>00058 <span class="comment">// of float and half (127 versus 15).</span>
<a name="l00059"></a>00059 <span class="comment">//</span>
<a name="l00060"></a>00060
<a name="l00061"></a>00061 <span class="keyword">register</span> <span class="keywordtype">int</span> s = (i >> 16) & 0x00008000;
<a name="l00062"></a>00062 <span class="keyword">register</span> <span class="keywordtype">int</span> e = ((i >> 23) & 0x000000ff) - (127 - 15);
<a name="l00063"></a>00063 <span class="keyword">register</span> <span class="keywordtype">int</span> m = i & 0x007fffff;
<a name="l00064"></a>00064
<a name="l00065"></a>00065 <span class="comment">//</span>
<a name="l00066"></a>00066 <span class="comment">// Now reassemble s, e and m into a half:</span>
<a name="l00067"></a>00067 <span class="comment">//</span>
<a name="l00068"></a>00068
<a name="l00069"></a>00069 <span class="keywordflow">if</span> (e <= 0)
<a name="l00070"></a>00070 {
<a name="l00071"></a>00071 <span class="keywordflow">if</span> (e < -10)
<a name="l00072"></a>00072 {
<a name="l00073"></a>00073 <span class="comment">//</span>
<a name="l00074"></a>00074 <span class="comment">// E is less than -10. The absolute value of f is</span>
<a name="l00075"></a>00075 <span class="comment">// less than HALF_MIN (f may be a small normalized</span>
<a name="l00076"></a>00076 <span class="comment">// float, a denormalized float or a zero).</span>
<a name="l00077"></a>00077 <span class="comment">//</span>
<a name="l00078"></a>00078 <span class="comment">// We convert f to a half zero.</span>
<a name="l00079"></a>00079 <span class="comment">//</span>
<a name="l00080"></a>00080
<a name="l00081"></a>00081 <span class="keywordflow">return</span> 0;
<a name="l00082"></a>00082 }
<a name="l00083"></a>00083
<a name="l00084"></a>00084 <span class="comment">//</span>
<a name="l00085"></a>00085 <span class="comment">// E is between -10 and 0. F is a normalized float,</span>
<a name="l00086"></a>00086 <span class="comment">// whose magnitude is less than HALF_NRM_MIN.</span>
<a name="l00087"></a>00087 <span class="comment">//</span>
<a name="l00088"></a>00088 <span class="comment">// We convert f to a denormalized half.</span>
<a name="l00089"></a>00089 <span class="comment">// </span>
<a name="l00090"></a>00090
<a name="l00091"></a>00091 m = (m | 0x00800000) >> (1 - e);
<a name="l00092"></a>00092
<a name="l00093"></a>00093 <span class="comment">//</span>
<a name="l00094"></a>00094 <span class="comment">// Round to nearest, round "0.5" up.</span>
<a name="l00095"></a>00095 <span class="comment">//</span>
<a name="l00096"></a>00096 <span class="comment">// Rounding may cause the significand to overflow and make</span>
<a name="l00097"></a>00097 <span class="comment">// our number normalized. Because of the way a half's bits</span>
<a name="l00098"></a>00098 <span class="comment">// are laid out, we don't have to treat this case separately;</span>
<a name="l00099"></a>00099 <span class="comment">// the code below will handle it correctly.</span>
<a name="l00100"></a>00100 <span class="comment">// </span>
<a name="l00101"></a>00101
<a name="l00102"></a>00102 <span class="keywordflow">if</span> (m & 0x00001000)
<a name="l00103"></a>00103 m += 0x00002000;
<a name="l00104"></a>00104
<a name="l00105"></a>00105 <span class="comment">//</span>
<a name="l00106"></a>00106 <span class="comment">// Assemble the half from s, e (zero) and m.</span>
<a name="l00107"></a>00107 <span class="comment">//</span>
<a name="l00108"></a>00108
<a name="l00109"></a>00109 <span class="keywordflow">return</span> s | (m >> 13);
<a name="l00110"></a>00110 }
<a name="l00111"></a>00111 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (e == 0xff - (127 - 15))
<a name="l00112"></a>00112 {
<a name="l00113"></a>00113 <span class="keywordflow">if</span> (m == 0)
<a name="l00114"></a>00114 {
<a name="l00115"></a>00115 <span class="comment">//</span>
<a name="l00116"></a>00116 <span class="comment">// F is an infinity; convert f to a half</span>
<a name="l00117"></a>00117 <span class="comment">// infinity with the same sign as f.</span>
<a name="l00118"></a>00118 <span class="comment">//</span>
<a name="l00119"></a>00119
<a name="l00120"></a>00120 <span class="keywordflow">return</span> s | 0x7c00;
<a name="l00121"></a>00121 }
<a name="l00122"></a>00122 <span class="keywordflow">else</span>
<a name="l00123"></a>00123 {
<a name="l00124"></a>00124 <span class="comment">//</span>
<a name="l00125"></a>00125 <span class="comment">// F is a NAN; we produce a half NAN that preserves</span>
<a name="l00126"></a>00126 <span class="comment">// the sign bit and the 10 leftmost bits of the</span>
<a name="l00127"></a>00127 <span class="comment">// significand of f, with one exception: If the 10</span>
<a name="l00128"></a>00128 <span class="comment">// leftmost bits are all zero, the NAN would turn </span>
<a name="l00129"></a>00129 <span class="comment">// into an infinity, so we have to set at least one</span>
<a name="l00130"></a>00130 <span class="comment">// bit in the significand.</span>
<a name="l00131"></a>00131 <span class="comment">//</span>
<a name="l00132"></a>00132
<a name="l00133"></a>00133 m >>= 13;
<a name="l00134"></a>00134 <span class="keywordflow">return</span> s | 0x7c00 | m | (m == 0);
<a name="l00135"></a>00135 }
<a name="l00136"></a>00136 }
<a name="l00137"></a>00137 <span class="keywordflow">else</span>
<a name="l00138"></a>00138 {
<a name="l00139"></a>00139 <span class="comment">//</span>
<a name="l00140"></a>00140 <span class="comment">// E is greater than zero. F is a normalized float.</span>
<a name="l00141"></a>00141 <span class="comment">// We try to convert f to a normalized half.</span>
<a name="l00142"></a>00142 <span class="comment">//</span>
<a name="l00143"></a>00143
<a name="l00144"></a>00144 <span class="comment">//</span>
<a name="l00145"></a>00145 <span class="comment">// Round to nearest, round "0.5" up</span>
<a name="l00146"></a>00146 <span class="comment">//</span>
<a name="l00147"></a>00147
<a name="l00148"></a>00148 <span class="keywordflow">if</span> (m & 0x00001000)
<a name="l00149"></a>00149 {
<a name="l00150"></a>00150 m += 0x00002000;
<a name="l00151"></a>00151
<a name="l00152"></a>00152 <span class="keywordflow">if</span> (m & 0x00800000)
<a name="l00153"></a>00153 {
<a name="l00154"></a>00154 m = 0; <span class="comment">// overflow in significand,</span>
<a name="l00155"></a>00155 e += 1; <span class="comment">// adjust exponent</span>
<a name="l00156"></a>00156 }
<a name="l00157"></a>00157 }
<a name="l00158"></a>00158
<a name="l00159"></a>00159 <span class="comment">//</span>
<a name="l00160"></a>00160 <span class="comment">// Handle exponent overflow</span>
<a name="l00161"></a>00161 <span class="comment">//</span>
<a name="l00162"></a>00162
<a name="l00163"></a>00163 <span class="keywordflow">if</span> (e > 30)
<a name="l00164"></a>00164 {
<a name="l00165"></a>00165 ilFloatToHalfOverflow(); <span class="comment">// Cause a hardware floating point overflow;</span>
<a name="l00166"></a>00166 <span class="keywordflow">return</span> s | 0x7c00; <span class="comment">// if this returns, the half becomes an</span>
<a name="l00167"></a>00167 } <span class="comment">// infinity with the same sign as f.</span>
<a name="l00168"></a>00168
<a name="l00169"></a>00169 <span class="comment">//</span>
<a name="l00170"></a>00170 <span class="comment">// Assemble the half from s, e and m.</span>
<a name="l00171"></a>00171 <span class="comment">//</span>
<a name="l00172"></a>00172
<a name="l00173"></a>00173 <span class="keywordflow">return</span> s | (e << 10) | (m >> 13);
<a name="l00174"></a>00174 }
<a name="l00175"></a>00175 }
<a name="l00176"></a>00176
<a name="l00177"></a>00177 <span class="comment">// Taken from OpenEXR</span>
<a name="l00178"></a>00178 INLINE ILuint ILAPIENTRY ilHalfToFloat (ILushort y) {
<a name="l00179"></a>00179
<a name="l00180"></a>00180 <span class="keywordtype">int</span> s = (y >> 15) & 0x00000001;
<a name="l00181"></a>00181 <span class="keywordtype">int</span> e = (y >> 10) & 0x0000001f;
<a name="l00182"></a>00182 <span class="keywordtype">int</span> m = y & 0x000003ff;
<a name="l00183"></a>00183
<a name="l00184"></a>00184 <span class="keywordflow">if</span> (e == 0)
<a name="l00185"></a>00185 {
<a name="l00186"></a>00186 <span class="keywordflow">if</span> (m == 0)
<a name="l00187"></a>00187 {
<a name="l00188"></a>00188 <span class="comment">//</span>
<a name="l00189"></a>00189 <span class="comment">// Plus or minus zero</span>
<a name="l00190"></a>00190 <span class="comment">//</span>
<a name="l00191"></a>00191
<a name="l00192"></a>00192 <span class="keywordflow">return</span> s << 31;
<a name="l00193"></a>00193 }
<a name="l00194"></a>00194 <span class="keywordflow">else</span>
<a name="l00195"></a>00195 {
<a name="l00196"></a>00196 <span class="comment">//</span>
<a name="l00197"></a>00197 <span class="comment">// Denormalized number -- renormalize it</span>
<a name="l00198"></a>00198 <span class="comment">//</span>
<a name="l00199"></a>00199
<a name="l00200"></a>00200 <span class="keywordflow">while</span> (!(m & 0x00000400))
<a name="l00201"></a>00201 {
<a name="l00202"></a>00202 m <<= 1;
<a name="l00203"></a>00203 e -= 1;
<a name="l00204"></a>00204 }
<a name="l00205"></a>00205
<a name="l00206"></a>00206 e += 1;
<a name="l00207"></a>00207 m &= ~0x00000400;
<a name="l00208"></a>00208 }
<a name="l00209"></a>00209 }
<a name="l00210"></a>00210 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (e == 31)
<a name="l00211"></a>00211 {
<a name="l00212"></a>00212 <span class="keywordflow">if</span> (m == 0)
<a name="l00213"></a>00213 {
<a name="l00214"></a>00214 <span class="comment">//</span>
<a name="l00215"></a>00215 <span class="comment">// Positive or negative infinity</span>
<a name="l00216"></a>00216 <span class="comment">//</span>
<a name="l00217"></a>00217
<a name="l00218"></a>00218 <span class="keywordflow">return</span> (s << 31) | 0x7f800000;
<a name="l00219"></a>00219 }
<a name="l00220"></a>00220 <span class="keywordflow">else</span>
<a name="l00221"></a>00221 {
<a name="l00222"></a>00222 <span class="comment">//</span>
<a name="l00223"></a>00223 <span class="comment">// Nan -- preserve sign and significand bits</span>
<a name="l00224"></a>00224 <span class="comment">//</span>
<a name="l00225"></a>00225
<a name="l00226"></a>00226 <span class="keywordflow">return</span> (s << 31) | 0x7f800000 | (m << 13);
<a name="l00227"></a>00227 }
<a name="l00228"></a>00228 }
<a name="l00229"></a>00229
<a name="l00230"></a>00230 <span class="comment">//</span>
<a name="l00231"></a>00231 <span class="comment">// Normalized number</span>
<a name="l00232"></a>00232 <span class="comment">//</span>
<a name="l00233"></a>00233
<a name="l00234"></a>00234 e = e + (127 - 15);
<a name="l00235"></a>00235 m = m << 13;
<a name="l00236"></a>00236
<a name="l00237"></a>00237 <span class="comment">//</span>
<a name="l00238"></a>00238 <span class="comment">// Assemble s, e and m.</span>
<a name="l00239"></a>00239 <span class="comment">//</span>
<a name="l00240"></a>00240
<a name="l00241"></a>00241 <span class="keywordflow">return</span> (s << 31) | (e << 23) | m;
<a name="l00242"></a>00242 }
<a name="l00243"></a>00243 <span class="preprocessor">#endif //NOINLINE</span>
<a name="l00244"></a>00244 <span class="preprocessor"></span>
<a name="l00245"></a>00245 <span class="preprocessor">#ifdef _cplusplus</span>
<a name="l00246"></a>00246 <span class="preprocessor"></span>}
<a name="l00247"></a>00247 <span class="preprocessor">#endif</span>
<a name="l00248"></a>00248 <span class="preprocessor"></span>
<a name="l00249"></a>00249 <span class="preprocessor">#endif//MANIP_H</span>
</pre></div></div>
<hr size="1"><address style="text-align: right;"><small>Generated on Sun Mar 8 20:01:41 2009 for DevIL by
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.6 </small></address>
</body>
</html>
|