1 /* 2 * Copyright (C) 2008 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 /* ---- includes ----------------------------------------------------------- */ 18 19 #include "b_TensorEm/Flt16Vec2D.h" 20 #include "b_TensorEm/Functions.h" 21 #include "b_BasicEm/Math.h" 22 #include "b_BasicEm/Memory.h" 23 24 /* ------------------------------------------------------------------------- */ 25 26 /* ========================================================================= */ 27 /* */ 28 /* ---- \ghd{ auxiliary functions } ---------------------------------------- */ 29 /* */ 30 /* ========================================================================= */ 31 32 /* ------------------------------------------------------------------------- */ 33 34 /* ========================================================================= */ 35 /* */ 36 /* ---- \ghd{ constructor / destructor } ----------------------------------- */ 37 /* */ 38 /* ========================================================================= */ 39 40 /* ------------------------------------------------------------------------- */ 41 42 void bts_Flt16Vec2D_init( struct bts_Flt16Vec2D* ptrA ) 43 { 44 ptrA->xE = 0; 45 ptrA->yE = 0; 46 ptrA->bbpE = 0; 47 } 48 49 /* ------------------------------------------------------------------------- */ 50 51 void bts_Flt16Vec2D_exit( struct bts_Flt16Vec2D* ptrA ) 52 { 53 ptrA->xE = 0; 54 ptrA->yE = 0; 55 ptrA->bbpE = 0; 56 } 57 58 /* ------------------------------------------------------------------------- */ 59 60 /* ========================================================================= */ 61 /* */ 62 /* ---- \ghd{ operators } -------------------------------------------------- */ 63 /* */ 64 /* ========================================================================= */ 65 66 /* ------------------------------------------------------------------------- */ 67 68 void bts_Flt16Vec2D_copy( struct bts_Flt16Vec2D* ptrA, const struct bts_Flt16Vec2D* srcPtrA ) 69 { 70 ptrA->bbpE = srcPtrA->bbpE; 71 ptrA->xE = srcPtrA->xE; 72 ptrA->yE = srcPtrA->yE; 73 } 74 75 /* ------------------------------------------------------------------------- */ 76 77 flag bts_Flt16Vec2D_equal( const struct bts_Flt16Vec2D* ptrA, const struct bts_Flt16Vec2D* srcPtrA ) 78 { 79 int32 bbpDiffL = ptrA->bbpE - srcPtrA->bbpE; 80 if( bbpDiffL == 0 ) 81 { 82 if( ptrA->xE != srcPtrA->xE ) return FALSE; 83 if( ptrA->yE != srcPtrA->yE ) return FALSE; 84 return TRUE; 85 } 86 87 if( bbpDiffL > 0 ) 88 { 89 int32 xL = ( int32 ) srcPtrA->xE << bbpDiffL; 90 int32 yL = ( int32 ) srcPtrA->yE << bbpDiffL; 91 if( ptrA->xE != xL ) return FALSE; 92 if( ptrA->yE != yL ) return FALSE; 93 /* check if bits were lost by the shifting */ 94 if( srcPtrA->xE != ( xL >> bbpDiffL ) ) return FALSE; 95 if( srcPtrA->yE != ( yL >> bbpDiffL ) ) return FALSE; 96 return TRUE; 97 } 98 99 if( bbpDiffL < 0 ) 100 { 101 int32 xL = ( int32 ) ptrA->xE << -bbpDiffL; 102 int32 yL = ( int32 ) ptrA->yE << -bbpDiffL; 103 if( xL != srcPtrA->xE ) return FALSE; 104 if( yL != srcPtrA->yE ) return FALSE; 105 /* check if bits were lost by the shifting */ 106 if( ptrA->xE != ( xL >> -bbpDiffL ) ) return FALSE; 107 if( ptrA->yE != ( yL >> -bbpDiffL ) ) return FALSE; 108 return TRUE; 109 } 110 111 return TRUE; 112 } 113 114 /* ------------------------------------------------------------------------- */ 115 116 /* ========================================================================= */ 117 /* */ 118 /* ---- \ghd{ query functions } -------------------------------------------- */ 119 /* */ 120 /* ========================================================================= */ 121 122 /* ------------------------------------------------------------------------- */ 123 124 /* ========================================================================= */ 125 /* */ 126 /* ---- \ghd{ modify functions } ------------------------------------------- */ 127 /* */ 128 /* ========================================================================= */ 129 130 /* ------------------------------------------------------------------------- */ 131 132 /* ========================================================================= */ 133 /* */ 134 /* ---- \ghd{ I/O } -------------------------------------------------------- */ 135 /* */ 136 /* ========================================================================= */ 137 138 /* ------------------------------------------------------------------------- */ 139 140 /* ========================================================================= */ 141 /* */ 142 /* ---- \ghd{ exec functions } --------------------------------------------- */ 143 /* */ 144 /* ========================================================================= */ 145 146 /* ------------------------------------------------------------------------- */ 147 148 struct bts_Flt16Vec2D bts_Flt16Vec2D_create16( int16 xA, int16 yA, int16 bbpA ) 149 { 150 struct bts_Flt16Vec2D vecL; 151 vecL.xE = xA; 152 vecL.yE = yA; 153 vecL.bbpE = bbpA; 154 return vecL; 155 } 156 157 /* ------------------------------------------------------------------------- */ 158 159 struct bts_Flt16Vec2D bts_Flt16Vec2D_createVec16( struct bts_Int16Vec2D vecA, int16 bbpA ) 160 { 161 struct bts_Flt16Vec2D vecL; 162 vecL.xE = vecA.xE; 163 vecL.yE = vecA.yE; 164 vecL.bbpE = bbpA; 165 return vecL; 166 } 167 168 /* ------------------------------------------------------------------------- */ 169 170 struct bts_Flt16Vec2D bts_Flt16Vec2D_create32( int32 xA, int32 yA, int32 bbpA ) 171 { 172 struct bts_Flt16Vec2D vecL; 173 if( ( xA | yA ) == 0 ) 174 { 175 vecL.xE = 0; 176 vecL.yE = 0; 177 vecL.bbpE = 0; 178 } 179 else 180 { 181 int32 shiftL = bts_maxAbsIntLog2Of2( xA, yA ) - 13; 182 183 if( shiftL > 0 ) 184 { 185 int32 sh1L = shiftL - 1; 186 vecL.xE = ( ( xA >> sh1L ) + 1 ) >> 1; 187 vecL.yE = ( ( yA >> sh1L ) + 1 ) >> 1; 188 } 189 else 190 { 191 vecL.xE = xA << -shiftL; 192 vecL.yE = yA << -shiftL; 193 } 194 vecL.bbpE = bbpA - shiftL; 195 } 196 return vecL; 197 } 198 199 /* ------------------------------------------------------------------------- */ 200 201 int32 bts_Flt16Vec2D_dotPrd( const struct bts_Flt16Vec2D* vec1PtrA, 202 const struct bts_Flt16Vec2D* vec2PtrA ) 203 { 204 return ( int32 ) vec1PtrA->xE * vec2PtrA->xE + ( int32 ) vec1PtrA->yE * vec2PtrA->yE; 205 } 206 207 /* ------------------------------------------------------------------------- */ 208 209 uint32 bts_Flt16Vec2D_norm2( const struct bts_Flt16Vec2D* ptrA ) 210 { 211 return ( int32 ) ptrA->xE * ptrA->xE + ( int32 ) ptrA->yE * ptrA->yE; 212 } 213 214 /* ------------------------------------------------------------------------- */ 215 216 uint16 bts_Flt16Vec2D_norm( const struct bts_Flt16Vec2D* ptrA ) 217 { 218 return bbs_sqrt32( ( int32 ) ptrA->xE * ptrA->xE + ( int32 ) ptrA->yE * ptrA->yE ); 219 } 220 221 /* ------------------------------------------------------------------------- */ 222 223 void bts_Flt16Vec2D_normalize( struct bts_Flt16Vec2D* ptrA ) 224 { 225 int32 normL = bbs_sqrt32( ( int32 ) ptrA->xE * ptrA->xE + ( int32 ) ptrA->yE * ptrA->yE ); 226 int32 xL = ( ( int32 ) ptrA->xE << 16 ) / normL; 227 int32 yL = ( ( int32 ) ptrA->yE << 16 ) / normL; 228 *ptrA = bts_Flt16Vec2D_create32( xL, yL, 16 ); 229 } 230 231 /* ------------------------------------------------------------------------- */ 232 233 struct bts_Flt16Vec2D bts_Flt16Vec2D_normalized( const struct bts_Flt16Vec2D* ptrA ) 234 { 235 struct bts_Flt16Vec2D vecL = *ptrA; 236 bts_Flt16Vec2D_normalize( &vecL ); 237 return vecL; 238 } 239 240 /* ------------------------------------------------------------------------- */ 241 242 phase16 bts_Flt16Vec2D_angle( const struct bts_Flt16Vec2D* vecPtrA ) 243 { 244 return bbs_phase16( vecPtrA->xE, vecPtrA->yE ); 245 } 246 247 /* ------------------------------------------------------------------------- */ 248 249 phase16 bts_Flt16Vec2D_enclosedAngle( const struct bts_Flt16Vec2D* vec1PtrA, 250 const struct bts_Flt16Vec2D* vec2PtrA ) 251 { 252 int32 xL = ( int32 ) vec1PtrA->xE * vec2PtrA->xE + ( int32 ) vec1PtrA->yE * vec2PtrA->yE; 253 int32 yL = ( int32 ) vec1PtrA->yE * vec2PtrA->xE - ( int32 ) vec1PtrA->xE * vec2PtrA->yE; 254 return bbs_phase16( xL, yL ); 255 } 256 257 /* ------------------------------------------------------------------------- */ 258 259 struct bts_Flt16Vec2D bts_Flt16Vec2D_add( struct bts_Flt16Vec2D vec1A, struct bts_Flt16Vec2D vec2A ) 260 { 261 int32 xL, yL, bbpL; 262 int32 shiftL = vec1A.bbpE - vec2A.bbpE; 263 264 if( shiftL > 0 ) 265 { 266 xL = ( ( int32 ) vec2A.xE << shiftL ) + vec1A.xE; 267 yL = ( ( int32 ) vec2A.yE << shiftL ) + vec1A.yE; 268 bbpL = vec1A.bbpE; 269 } 270 else 271 { 272 xL = ( ( int32 ) vec1A.xE << -shiftL ) + vec2A.xE; 273 yL = ( ( int32 ) vec1A.yE << -shiftL ) + vec2A.yE; 274 bbpL = vec2A.bbpE; 275 } 276 277 return bts_Flt16Vec2D_create32( xL, yL, bbpL ); 278 } 279 280 /* ------------------------------------------------------------------------- */ 281 282 struct bts_Flt16Vec2D bts_Flt16Vec2D_sub( struct bts_Flt16Vec2D vec1A, struct bts_Flt16Vec2D vec2A ) 283 { 284 int32 xL, yL, bbpL; 285 int32 shiftL = vec1A.bbpE - vec2A.bbpE; 286 287 if( shiftL > 0 ) 288 { 289 xL = ( int32 ) vec1A.xE - ( ( int32 ) vec2A.xE << shiftL ); 290 yL = ( int32 ) vec1A.yE - ( ( int32 ) vec2A.yE << shiftL ); 291 bbpL = vec1A.bbpE; 292 } 293 else 294 { 295 xL = ( ( int32 ) vec1A.xE << -shiftL ) - vec2A.xE; 296 yL = ( ( int32 ) vec1A.yE << -shiftL ) - vec2A.yE; 297 bbpL = vec2A.bbpE; 298 } 299 300 return bts_Flt16Vec2D_create32( xL, yL, bbpL ); 301 } 302 303 /* ------------------------------------------------------------------------- */ 304 305 struct bts_Flt16Vec2D bts_Flt16Vec2D_mul( struct bts_Flt16Vec2D vecA, int16 factorA, int32 bbpFactorA ) 306 { 307 int32 xL = ( int32 ) vecA.xE * factorA; 308 int32 yL = ( int32 ) vecA.yE * factorA; 309 return bts_Flt16Vec2D_create32( xL, yL, bbpFactorA + vecA.bbpE ); 310 } 311 312 /* ------------------------------------------------------------------------- */ 313 314 struct bts_Int16Vec2D bts_Flt16Vec2D_int16Vec2D( struct bts_Flt16Vec2D vecA, int32 dstBbpA ) 315 { 316 struct bts_Int16Vec2D vecL; 317 int32 shiftL = vecA.bbpE - dstBbpA; 318 319 if( shiftL > 0 ) 320 { 321 vecL.xE = ( ( vecA.xE >> ( shiftL - 1 ) ) + 1 ) >> 1; 322 vecL.yE = ( ( vecA.yE >> ( shiftL - 1 ) ) + 1 ) >> 1; 323 } 324 else 325 { 326 vecL.xE = vecA.xE << ( -shiftL ); 327 vecL.yE = vecA.yE << ( -shiftL ); 328 } 329 330 return vecL; 331 } 332 333 /* ========================================================================= */ 334 335 336