Sophie

Sophie

distrib > Mandriva > 10.2 > i586 > media > contrib > by-pkgid > 04e5d8c10ae76748689b4e7f48e0fa33 > files > 272

libogre5-devel-1.0.0-1mdk.i586.rpm

<html>
<head>
<title>OgreBitwise.h Source File - OGRE Documentation</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> 
<link type="text/css" rel="stylesheet" href="style.css">
</head>

<body>
<!-- Generated by Doxygen 1.3.6 -->
<div class="qindex"><a class="qindex" href="index.html">Main&nbsp;Page</a> | <a class="qindex" href="namespaces.html">Namespace List</a> | <a class="qindex" href="hierarchy.html">Class&nbsp;Hierarchy</a> | <a class="qindex" href="classes.html">Alphabetical&nbsp;List</a> | <a class="qindex" href="annotated.html">Class&nbsp;List</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="namespacemembers.html">Namespace&nbsp;Members</a> | <a class="qindex" href="functions.html">Class&nbsp;Members</a> | <a class="qindex" href="globals.html">File&nbsp;Members</a> | <a class="qindex" href="pages.html">Related&nbsp;Pages</a></div>
<h1>OgreBitwise.h</h1><a href="OgreBitwise_8h.html">Go to the documentation of this file.</a><div class="fragment"><pre>00001 <span class="comment">/*</span>
00002 <span class="comment">-----------------------------------------------------------------------------</span>
00003 <span class="comment">This source file is part of OGRE</span>
00004 <span class="comment">    (Object-oriented Graphics Rendering Engine)</span>
00005 <span class="comment">For the latest info, see http://www.ogre3d.org/</span>
00006 <span class="comment"></span>
00007 <span class="comment">Copyright (c) 2000-2005 The OGRE Team</span>
00008 <span class="comment">Also see acknowledgements in Readme.html</span>
00009 <span class="comment"></span>
00010 <span class="comment">This program is free software; you can redistribute it and/or modify it under</span>
00011 <span class="comment">the terms of the GNU Lesser General Public License as published by the Free Software</span>
00012 <span class="comment">Foundation; either version 2 of the License, or (at your option) any later</span>
00013 <span class="comment">version.</span>
00014 <span class="comment"></span>
00015 <span class="comment">This program is distributed in the hope that it will be useful, but WITHOUT</span>
00016 <span class="comment">ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS</span>
00017 <span class="comment">FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.</span>
00018 <span class="comment"></span>
00019 <span class="comment">You should have received a copy of the GNU Lesser General Public License along with</span>
00020 <span class="comment">this program; if not, write to the Free Software Foundation, Inc., 59 Temple</span>
00021 <span class="comment">Place - Suite 330, Boston, MA 02111-1307, USA, or go to</span>
00022 <span class="comment">http://www.gnu.org/copyleft/lesser.txt.</span>
00023 <span class="comment">-----------------------------------------------------------------------------</span>
00024 <span class="comment">*/</span>
00025 <span class="preprocessor">#ifndef _Bitwise_H__</span>
00026 <span class="preprocessor"></span><span class="preprocessor">#define _Bitwise_H__</span>
00027 <span class="preprocessor"></span>
00028 <span class="preprocessor">#include "<a class="code" href="OgrePrerequisites_8h.html">OgrePrerequisites.h</a>"</span>
00029 
00030 <span class="keyword">namespace </span>Ogre {
00031 
<a name="l00034"></a><a class="code" href="classOgre_1_1Bitwise.html">00034</a>     <span class="keyword">class </span><a class="code" href="classOgre_1_1Bitwise.html">Bitwise</a> {
00035     <span class="keyword">public</span>:
00039         <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;
<a name="l00040"></a><a class="code" href="classOgre_1_1Bitwise.html#Ogre_1_1Bitwisee0">00040</a>         <span class="keyword">static</span> <a class="code" href="OgrePlatform_8h.html#a8">FORCEINLINE</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="classOgre_1_1Bitwise.html#Ogre_1_1Bitwisee0">getBitShift</a>(T mask)
00041         {
00042             <span class="keywordflow">if</span> (mask == 0)
00043                 <span class="keywordflow">return</span> 0;
00044 
00045             <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> result = 0;
00046             <span class="keywordflow">while</span> ((mask &amp; 1) == 0) {
00047                 ++result;
00048                 mask &gt;&gt;= 1;
00049             }
00050             <span class="keywordflow">return</span> result;
00051         }
00052 
00058         <span class="keyword">template</span>&lt;<span class="keyword">typename</span> SrcT, <span class="keyword">typename</span> DestT&gt;
<a name="l00059"></a><a class="code" href="classOgre_1_1Bitwise.html#Ogre_1_1Bitwisee1">00059</a>         <span class="keyword">static</span> <span class="keyword">inline</span> DestT <a class="code" href="classOgre_1_1Bitwise.html#Ogre_1_1Bitwisee1">convertBitPattern</a>(SrcT srcValue, SrcT srcBitMask, DestT destBitMask)
00060         {
00061             <span class="comment">// Mask off irrelevant source value bits (if any)</span>
00062             srcValue = srcValue &amp; srcBitMask;
00063 
00064             <span class="comment">// Shift source down to bottom of DWORD</span>
00065             <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> srcBitShift = <a class="code" href="classOgre_1_1Bitwise.html#Ogre_1_1Bitwisee0">getBitShift</a>(srcBitMask);
00066             srcValue &gt;&gt;= srcBitShift;
00067 
00068             <span class="comment">// Get max value possible in source from srcMask</span>
00069             <span class="keyword">const</span> SrcT srcMax = srcBitMask &gt;&gt; srcBitShift;
00070 
00071             <span class="comment">// Get max avaiable in dest</span>
00072             <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> destBitShift = <a class="code" href="classOgre_1_1Bitwise.html#Ogre_1_1Bitwisee0">getBitShift</a>(destBitMask);
00073             <span class="keyword">const</span> DestT destMax = destBitMask &gt;&gt; destBitShift;
00074 
00075             <span class="comment">// Scale source value into destination, and shift back</span>
00076             DestT destValue = (srcValue * destMax) / srcMax;
00077             <span class="keywordflow">return</span> (destValue &lt;&lt; destBitShift);
00078         }
00079 
<a name="l00084"></a><a class="code" href="classOgre_1_1Bitwise.html#Ogre_1_1Bitwisee2">00084</a>         <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="classOgre_1_1Bitwise.html#Ogre_1_1Bitwisee2">fixedToFixed</a>(<a class="code" href="namespaceOgre.html#a412">uint32</a> value, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> n, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> p) 
00085         {
00086             <span class="keywordflow">if</span>(n &gt; p) 
00087             {
00088                 <span class="comment">// Less bits required than available; this is easy</span>
00089                 value &gt;&gt;= n-p;
00090             } 
00091             <span class="keywordflow">else</span> <span class="keywordflow">if</span>(n &lt; p)
00092             {
00093                 <span class="comment">// More bits required than are there, do the fill</span>
00094                 <span class="comment">// Use old fashioned division, probably better than a loop</span>
00095                 <span class="keywordflow">if</span>(value == 0)
00096                         value = 0;
00097                 <span class="keywordflow">else</span> <span class="keywordflow">if</span>(value == (static_cast&lt;unsigned int&gt;(1)&lt;&lt;n)-1)
00098                         value = (1&lt;&lt;p)-1;
00099                 <span class="keywordflow">else</span>    value = value*(1&lt;&lt;p)/((1&lt;&lt;n)-1);
00100             }
00101             <span class="keywordflow">return</span> value;    
00102         }
00103 
<a name="l00108"></a><a class="code" href="classOgre_1_1Bitwise.html#Ogre_1_1Bitwisee3">00108</a>         <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="classOgre_1_1Bitwise.html#Ogre_1_1Bitwisee3">floatToFixed</a>(<span class="keyword">const</span> <span class="keywordtype">float</span> value, <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bits)
00109         {
00110             <span class="keywordflow">if</span>(value &lt;= 0.0f) <span class="keywordflow">return</span> 0;
00111             <span class="keywordflow">else</span> <span class="keywordflow">if</span> (value &gt;= 1.0f) <span class="keywordflow">return</span> (1&lt;&lt;bits)-1;
00112             <span class="keywordflow">else</span> <span class="keywordflow">return</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>)(value * (1&lt;&lt;bits));     
00113         }
00114 
<a name="l00118"></a><a class="code" href="classOgre_1_1Bitwise.html#Ogre_1_1Bitwisee4">00118</a>         <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">float</span> <a class="code" href="classOgre_1_1Bitwise.html#Ogre_1_1Bitwisee4">fixedToFloat</a>(<span class="keywordtype">unsigned</span> value, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bits)
00119         {
00120             <span class="keywordflow">return</span> (<span class="keywordtype">float</span>)value/(<span class="keywordtype">float</span>)((1&lt;&lt;bits)-1);
00121         }
00122 
<a name="l00126"></a><a class="code" href="classOgre_1_1Bitwise.html#Ogre_1_1Bitwisee5">00126</a>         <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classOgre_1_1Bitwise.html#Ogre_1_1Bitwisee5">intWrite</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> *dest, <span class="keyword">const</span> <span class="keywordtype">int</span> n, <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> value)
00127         {
00128             <span class="keywordflow">switch</span>(n) {
00129                 <span class="keywordflow">case</span> 1:
00130                     ((<a class="code" href="namespaceOgre.html#a414">uint8</a>*)dest)[0] = (<a class="code" href="namespaceOgre.html#a414">uint8</a>)value;
00131                     <span class="keywordflow">break</span>;
00132                 <span class="keywordflow">case</span> 2:
00133                     ((<a class="code" href="namespaceOgre.html#a413">uint16</a>*)dest)[0] = (<a class="code" href="namespaceOgre.html#a413">uint16</a>)value;
00134                     <span class="keywordflow">break</span>;
00135                 <span class="keywordflow">case</span> 3:
00136 <span class="preprocessor">#if OGRE_ENDIAN == OGRE_ENDIAN_BIG      </span>
00137 <span class="preprocessor"></span>                    ((<a class="code" href="namespaceOgre.html#a414">uint8</a>*)dest)[0] = (<a class="code" href="namespaceOgre.html#a414">uint8</a>)((value &gt;&gt; 16) &amp; 0xFF);
00138                     ((<a class="code" href="namespaceOgre.html#a414">uint8</a>*)dest)[1] = (<a class="code" href="namespaceOgre.html#a414">uint8</a>)((value &gt;&gt; 8) &amp; 0xFF);
00139                     ((<a class="code" href="namespaceOgre.html#a414">uint8</a>*)dest)[2] = (<a class="code" href="namespaceOgre.html#a414">uint8</a>)(value &amp; 0xFF);
00140 <span class="preprocessor">#else</span>
00141 <span class="preprocessor"></span>                    ((<a class="code" href="namespaceOgre.html#a414">uint8</a>*)dest)[2] = (<a class="code" href="namespaceOgre.html#a414">uint8</a>)((value &gt;&gt; 16) &amp; 0xFF);
00142                     ((<a class="code" href="namespaceOgre.html#a414">uint8</a>*)dest)[1] = (<a class="code" href="namespaceOgre.html#a414">uint8</a>)((value &gt;&gt; 8) &amp; 0xFF);
00143                     ((<a class="code" href="namespaceOgre.html#a414">uint8</a>*)dest)[0] = (<a class="code" href="namespaceOgre.html#a414">uint8</a>)(value &amp; 0xFF);
00144 <span class="preprocessor">#endif</span>
00145 <span class="preprocessor"></span>                    <span class="keywordflow">break</span>;
00146                 <span class="keywordflow">case</span> 4:
00147                     ((<a class="code" href="namespaceOgre.html#a412">uint32</a>*)dest)[0] = (<a class="code" href="namespaceOgre.html#a412">uint32</a>)value;                
00148                     <span class="keywordflow">break</span>;                
00149             }        
00150         }
<a name="l00154"></a><a class="code" href="classOgre_1_1Bitwise.html#Ogre_1_1Bitwisee6">00154</a>         <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="classOgre_1_1Bitwise.html#Ogre_1_1Bitwisee6">intRead</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> *src, <span class="keywordtype">int</span> n) {
00155             <span class="keywordflow">switch</span>(n) {
00156                 <span class="keywordflow">case</span> 1:
00157                     <span class="keywordflow">return</span> ((<a class="code" href="namespaceOgre.html#a414">uint8</a>*)src)[0];
00158                 <span class="keywordflow">case</span> 2:
00159                     <span class="keywordflow">return</span> ((<a class="code" href="namespaceOgre.html#a413">uint16</a>*)src)[0];
00160                 <span class="keywordflow">case</span> 3:
00161 <span class="preprocessor">#if OGRE_ENDIAN == OGRE_ENDIAN_BIG      </span>
00162 <span class="preprocessor"></span>                    <span class="keywordflow">return</span> ((<a class="code" href="namespaceOgre.html#a412">uint32</a>)((<a class="code" href="namespaceOgre.html#a414">uint8</a>*)src)[0]&lt;&lt;16)|
00163                             ((<a class="code" href="namespaceOgre.html#a412">uint32</a>)((<a class="code" href="namespaceOgre.html#a414">uint8</a>*)src)[1]&lt;&lt;8)|
00164                             ((<a class="code" href="namespaceOgre.html#a412">uint32</a>)((<a class="code" href="namespaceOgre.html#a414">uint8</a>*)src)[2]);
00165 <span class="preprocessor">#else</span>
00166 <span class="preprocessor"></span>                    <span class="keywordflow">return</span> ((<a class="code" href="namespaceOgre.html#a412">uint32</a>)((<a class="code" href="namespaceOgre.html#a414">uint8</a>*)src)[0])|
00167                             ((<a class="code" href="namespaceOgre.html#a412">uint32</a>)((<a class="code" href="namespaceOgre.html#a414">uint8</a>*)src)[1]&lt;&lt;8)|
00168                             ((<a class="code" href="namespaceOgre.html#a412">uint32</a>)((<a class="code" href="namespaceOgre.html#a414">uint8</a>*)src)[2]&lt;&lt;16);
00169 <span class="preprocessor">#endif</span>
00170 <span class="preprocessor"></span>                <span class="keywordflow">case</span> 4:
00171                     <span class="keywordflow">return</span> ((<a class="code" href="namespaceOgre.html#a412">uint32</a>*)src)[0];
00172             } 
00173             <span class="keywordflow">return</span> 0; <span class="comment">// ?</span>
00174         }
00175 
<a name="l00179"></a><a class="code" href="classOgre_1_1Bitwise.html#Ogre_1_1Bitwisee7">00179</a>         <span class="keyword">static</span> <span class="keyword">inline</span> <a class="code" href="namespaceOgre.html#a413">uint16</a> <a class="code" href="classOgre_1_1Bitwise.html#Ogre_1_1Bitwisee7">floatToHalf</a>(<span class="keywordtype">float</span> i)
00180         {
00181             <span class="keywordflow">return</span> <a class="code" href="classOgre_1_1Bitwise.html#Ogre_1_1Bitwisee8">floatToHalfI</a>(*reinterpret_cast&lt;uint32*&gt;(&amp;i));
00182         }
<a name="l00185"></a><a class="code" href="classOgre_1_1Bitwise.html#Ogre_1_1Bitwisee8">00185</a>         <span class="keyword">static</span> <span class="keyword">inline</span> <a class="code" href="namespaceOgre.html#a413">uint16</a> <a class="code" href="classOgre_1_1Bitwise.html#Ogre_1_1Bitwisee8">floatToHalfI</a>(<a class="code" href="namespaceOgre.html#a412">uint32</a> i)
00186         {
00187             <span class="keyword">register</span> <span class="keywordtype">int</span> s =  (i &gt;&gt; 16) &amp; 0x00008000;
00188             <span class="keyword">register</span> <span class="keywordtype">int</span> e = ((i &gt;&gt; 23) &amp; 0x000000ff) - (127 - 15);
00189             <span class="keyword">register</span> <span class="keywordtype">int</span> m =   i        &amp; 0x007fffff;
00190         
00191             <span class="keywordflow">if</span> (e &lt;= 0)
00192             {
00193                 <span class="keywordflow">if</span> (e &lt; -10)
00194                 {
00195                     <span class="keywordflow">return</span> 0;
00196                 }
00197                 m = (m | 0x00800000) &gt;&gt; (1 - e);
00198         
00199                 <span class="keywordflow">return</span> s | (m &gt;&gt; 13);
00200             }
00201             <span class="keywordflow">else</span> <span class="keywordflow">if</span> (e == 0xff - (127 - 15))
00202             {
00203                 <span class="keywordflow">if</span> (m == 0) <span class="comment">// Inf</span>
00204                 {
00205                     <span class="keywordflow">return</span> s | 0x7c00;
00206                 } 
00207                 <span class="keywordflow">else</span>    <span class="comment">// NAN</span>
00208                 {
00209                     m &gt;&gt;= 13;
00210                     <span class="keywordflow">return</span> s | 0x7c00 | m | (m == 0);
00211                 }
00212             }
00213             <span class="keywordflow">else</span>
00214             {
00215                 <span class="keywordflow">if</span> (e &gt; 30) <span class="comment">// Overflow</span>
00216                 {
00217                     <span class="keywordflow">return</span> s | 0x7c00;
00218                 }
00219         
00220                 <span class="keywordflow">return</span> s | (e &lt;&lt; 10) | (m &gt;&gt; 13);
00221             }
00222         }
00223         
<a name="l00228"></a><a class="code" href="classOgre_1_1Bitwise.html#Ogre_1_1Bitwisee9">00228</a>         <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">float</span> <a class="code" href="classOgre_1_1Bitwise.html#Ogre_1_1Bitwisee9">halfToFloat</a>(<a class="code" href="namespaceOgre.html#a413">uint16</a> y)
00229         {
00230             <a class="code" href="namespaceOgre.html#a412">uint32</a> r = <a class="code" href="classOgre_1_1Bitwise.html#Ogre_1_1Bitwisee10">halfToFloatI</a>(y);
00231             <span class="keywordflow">return</span> *reinterpret_cast&lt;float*&gt;(&amp;r);
00232         }
<a name="l00236"></a><a class="code" href="classOgre_1_1Bitwise.html#Ogre_1_1Bitwisee10">00236</a>         <span class="keyword">static</span> <span class="keyword">inline</span> <a class="code" href="namespaceOgre.html#a412">uint32</a> <a class="code" href="classOgre_1_1Bitwise.html#Ogre_1_1Bitwisee10">halfToFloatI</a>(<a class="code" href="namespaceOgre.html#a413">uint16</a> y)
00237         {
00238             <span class="keyword">register</span> <span class="keywordtype">int</span> s = (y &gt;&gt; 15) &amp; 0x00000001;
00239             <span class="keyword">register</span> <span class="keywordtype">int</span> e = (y &gt;&gt; 10) &amp; 0x0000001f;
00240             <span class="keyword">register</span> <span class="keywordtype">int</span> m =  y        &amp; 0x000003ff;
00241         
00242             <span class="keywordflow">if</span> (e == 0)
00243             {
00244                 <span class="keywordflow">if</span> (m == 0) <span class="comment">// Plus or minus zero</span>
00245                 {
00246                     <span class="keywordflow">return</span> s &lt;&lt; 31;
00247                 }
00248                 <span class="keywordflow">else</span> <span class="comment">// Denormalized number -- renormalize it</span>
00249                 {
00250                     <span class="keywordflow">while</span> (!(m &amp; 0x00000400))
00251                     {
00252                         m &lt;&lt;= 1;
00253                         e -=  1;
00254                     }
00255         
00256                     e += 1;
00257                     m &amp;= ~0x00000400;
00258                 }
00259             }
00260             <span class="keywordflow">else</span> <span class="keywordflow">if</span> (e == 31)
00261             {
00262                 <span class="keywordflow">if</span> (m == 0) <span class="comment">// Inf</span>
00263                 {
00264                     <span class="keywordflow">return</span> (s &lt;&lt; 31) | 0x7f800000;
00265                 }
00266                 <span class="keywordflow">else</span> <span class="comment">// NaN</span>
00267                 {
00268                     <span class="keywordflow">return</span> (s &lt;&lt; 31) | 0x7f800000 | (m &lt;&lt; 13);
00269                 }
00270             }
00271         
00272             e = e + (127 - 15);
00273             m = m &lt;&lt; 13;
00274         
00275             <span class="keywordflow">return</span> (s &lt;&lt; 31) | (e &lt;&lt; 23) | m;
00276         }
00277          
00278 
00279     };
00280 }
00281 
00282 <span class="preprocessor">#endif</span>
</pre></div><p>
Copyright &copy; 2000-2005 by The OGRE Team<br />
Last modified Wed Feb 23 00:19:02 2005
</p>
</body>
</html>