Home | History | Annotate | Download | only in b_TensorEm
      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/Flt16Vec3D.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_Flt16Vec3D_init( struct bts_Flt16Vec3D* ptrA )
     43 {
     44 	ptrA->xE = 0;
     45 	ptrA->yE = 0;
     46 	ptrA->zE = 0;
     47 	ptrA->bbpE = 0;
     48 }
     49 
     50 /* ------------------------------------------------------------------------- */
     51 
     52 void bts_Flt16Vec3D_exit( struct bts_Flt16Vec3D* ptrA )
     53 {
     54 	ptrA->xE = 0;
     55 	ptrA->yE = 0;
     56 	ptrA->zE = 0;
     57 	ptrA->bbpE = 0;
     58 }
     59 
     60 /* ------------------------------------------------------------------------- */
     61 
     62 /* ========================================================================= */
     63 /*                                                                           */
     64 /* ---- \ghd{ operators } -------------------------------------------------- */
     65 /*                                                                           */
     66 /* ========================================================================= */
     67 
     68 /* ------------------------------------------------------------------------- */
     69 
     70 flag bts_Flt16Vec3D_equal( const struct bts_Flt16Vec3D* ptrA, const struct bts_Flt16Vec3D* srcPtrA )
     71 {
     72 	int32 bbpDiffL = ptrA->bbpE - srcPtrA->bbpE;
     73 	if( bbpDiffL == 0 )
     74 	{
     75 		if( ptrA->xE != srcPtrA->xE ) return FALSE;
     76 		if( ptrA->yE != srcPtrA->yE ) return FALSE;
     77 		if( ptrA->zE != srcPtrA->zE ) return FALSE;
     78 		return TRUE;
     79 	}
     80 
     81 	if( bbpDiffL > 0 )
     82 	{
     83 		int32 xL = ( int32 ) srcPtrA->xE << bbpDiffL;
     84 		int32 yL = ( int32 ) srcPtrA->yE << bbpDiffL;
     85 		int32 zL = ( int32 ) srcPtrA->zE << bbpDiffL;
     86 		if( ptrA->xE != xL ) return FALSE;
     87 		if( ptrA->yE != yL ) return FALSE;
     88 		if( ptrA->zE != zL ) return FALSE;
     89 		return TRUE;
     90 	}
     91 
     92 	if( bbpDiffL < 0 )
     93 	{
     94 		int32 xL = ( int32 ) ptrA->xE << -bbpDiffL;
     95 		int32 yL = ( int32 ) ptrA->yE << -bbpDiffL;
     96 		int32 zL = ( int32 ) ptrA->zE << -bbpDiffL;
     97 		if( xL != srcPtrA->xE ) return FALSE;
     98 		if( yL != srcPtrA->yE ) return FALSE;
     99 		if( zL != srcPtrA->zE ) return FALSE;
    100 		return TRUE;
    101 	}
    102 
    103 	return TRUE;
    104 }
    105 
    106 /* ------------------------------------------------------------------------- */
    107 
    108 /* ========================================================================= */
    109 /*                                                                           */
    110 /* ---- \ghd{ query functions } -------------------------------------------- */
    111 /*                                                                           */
    112 /* ========================================================================= */
    113 
    114 /* ------------------------------------------------------------------------- */
    115 
    116 /* ========================================================================= */
    117 /*                                                                           */
    118 /* ---- \ghd{ modify functions } ------------------------------------------- */
    119 /*                                                                           */
    120 /* ========================================================================= */
    121 
    122 /* ------------------------------------------------------------------------- */
    123 
    124 /* ========================================================================= */
    125 /*                                                                           */
    126 /* ---- \ghd{ I/O } -------------------------------------------------------- */
    127 /*                                                                           */
    128 /* ========================================================================= */
    129 
    130 /* ------------------------------------------------------------------------- */
    131 
    132 uint32 bts_Flt16Vec3D_memSize( struct bbs_Context* cpA,
    133 							   const struct bts_Flt16Vec3D *ptrA )
    134 {
    135 	return bbs_SIZEOF16( *ptrA );
    136 }
    137 
    138 /* ------------------------------------------------------------------------- */
    139 
    140 uint32 bts_Flt16Vec3D_memWrite( struct bbs_Context* cpA,
    141 							    const struct bts_Flt16Vec3D* ptrA,
    142 								uint16* memPtrA )
    143 {
    144 	bbs_ERROR0( "not implemented" );
    145 	return 0;
    146 }
    147 
    148 /* ------------------------------------------------------------------------- */
    149 
    150 uint32 bts_Flt16Vec3D_memRead( struct bbs_Context* cpA,
    151 							   struct bts_Flt16Vec3D* ptrA,
    152 							   const uint16* memPtrA )
    153 {
    154 	if( bbs_Context_error( cpA ) ) return 0;
    155 	bbs_ERROR0( "not implemented" );
    156 	return 0;
    157 }
    158 
    159 /* ------------------------------------------------------------------------- */
    160 
    161 /* ========================================================================= */
    162 /*                                                                           */
    163 /* ---- \ghd{ exec functions } --------------------------------------------- */
    164 /*                                                                           */
    165 /* ========================================================================= */
    166 
    167 /* ------------------------------------------------------------------------- */
    168 
    169 struct bts_Flt16Vec3D bts_Flt16Vec3D_create16( int16 xA, int16 yA, int16 zA, int16 bbpA )
    170 {
    171 	struct bts_Flt16Vec3D vecL;
    172 	vecL.xE = xA;
    173 	vecL.yE = yA;
    174 	vecL.zE = zA;
    175 	vecL.bbpE = bbpA;
    176 	return vecL;
    177 }
    178 
    179 /* ------------------------------------------------------------------------- */
    180 
    181 struct bts_Flt16Vec3D bts_Flt16Vec3D_create32( int32 xA, int32 yA, int32 zA, int32 bbpA )
    182 {
    183 	struct bts_Flt16Vec3D vecL;
    184 	if( ( xA | yA | zA ) == 0 )
    185 	{
    186 		vecL.xE = 0;
    187 		vecL.yE = 0;
    188 		vecL.zE = 0;
    189 		vecL.bbpE = 0;
    190 	}
    191 	else
    192 	{
    193 		int32 shiftL = bts_maxAbsIntLog2Of3( xA, yA, zA ) - 13;
    194 
    195 		if( shiftL > 0 )
    196 		{
    197 			int32 sh1L = shiftL - 1;
    198 			vecL.xE = ( ( xA >> sh1L ) + 1 ) >> 1;
    199 			vecL.yE = ( ( yA >> sh1L ) + 1 ) >> 1;
    200 			vecL.zE = ( ( zA >> sh1L ) + 1 ) >> 1;
    201 		}
    202 		else
    203 		{
    204 			vecL.xE = xA << -shiftL;
    205 			vecL.yE = yA << -shiftL;
    206 			vecL.zE = zA << -shiftL;
    207 		}
    208 		vecL.bbpE = bbpA - shiftL;
    209 	}
    210 	return vecL;
    211 }
    212 
    213 /* ------------------------------------------------------------------------- */
    214 
    215 uint32 bts_Flt16Vec3D_norm2( const struct bts_Flt16Vec3D* ptrA )
    216 {
    217 	return ( int32 ) ptrA->xE * ptrA->xE +
    218 		   ( int32 ) ptrA->yE * ptrA->yE +
    219 		   ( int32 ) ptrA->zE * ptrA->zE;
    220 }
    221 
    222 /* ------------------------------------------------------------------------- */
    223 
    224 uint16 bts_Flt16Vec3D_norm( const struct bts_Flt16Vec3D* ptrA )
    225 {
    226 	return bbs_sqrt32( ( int32 ) ptrA->xE * ptrA->xE +
    227 					   ( int32 ) ptrA->yE * ptrA->yE +
    228 					   ( int32 ) ptrA->zE * ptrA->zE );
    229 }
    230 
    231 /* ------------------------------------------------------------------------- */
    232 
    233 void bts_Flt16Vec3D_normalize( struct bts_Flt16Vec3D* ptrA )
    234 {
    235 	int32 normL = bbs_sqrt32( ( int32 ) ptrA->xE * ptrA->xE +
    236 							  ( int32 ) ptrA->yE * ptrA->yE +
    237 							  ( int32 ) ptrA->zE * ptrA->zE );
    238 
    239 	int32 xL = ( ( int32 ) ptrA->xE << 16 ) / normL;
    240 	int32 yL = ( ( int32 ) ptrA->yE << 16 ) / normL;
    241 	int32 zL = ( ( int32 ) ptrA->zE << 16 ) / normL;
    242 	*ptrA = bts_Flt16Vec3D_create32( xL, yL, zL, 16 );
    243 }
    244 
    245 /* ------------------------------------------------------------------------- */
    246 
    247 struct bts_Flt16Vec3D bts_Flt16Vec3D_normalized( const struct bts_Flt16Vec3D* ptrA )
    248 {
    249 	struct bts_Flt16Vec3D vecL = *ptrA;
    250 	bts_Flt16Vec3D_normalize( &vecL );
    251 	return vecL;
    252 }
    253 
    254 /* ------------------------------------------------------------------------- */
    255 
    256 struct bts_Flt16Vec3D bts_Flt16Vec3D_add( struct bts_Flt16Vec3D vec1A, struct bts_Flt16Vec3D vec2A )
    257 {
    258 	int32 xL, yL, zL, bbpL;
    259 	int32 shiftL = vec1A.bbpE - vec2A.bbpE;
    260 
    261 	if( shiftL > 0 )
    262 	{
    263 		xL = vec1A.xE + ( ( int32 ) vec2A.xE << shiftL );
    264 		yL = vec1A.yE + ( ( int32 ) vec2A.yE << shiftL );
    265 		zL = vec1A.zE + ( ( int32 ) vec2A.zE << shiftL );
    266 		bbpL = vec1A.bbpE;
    267 	}
    268 	else
    269 	{
    270 		xL = ( ( int32 ) vec1A.xE << -shiftL ) + vec2A.xE;
    271 		yL = ( ( int32 ) vec1A.yE << -shiftL ) + vec2A.yE;
    272 		zL = ( ( int32 ) vec1A.zE << -shiftL ) + vec2A.zE;
    273 		bbpL = vec2A.bbpE;
    274 	}
    275 
    276 	return bts_Flt16Vec3D_create32( xL, yL, zL, bbpL );
    277 }
    278 
    279 /* ------------------------------------------------------------------------- */
    280 
    281 struct bts_Flt16Vec3D bts_Flt16Vec3D_sub( struct bts_Flt16Vec3D vec1A, struct bts_Flt16Vec3D vec2A )
    282 {
    283 	int32 xL, yL, zL, bbpL;
    284 	int32 shiftL = vec1A.bbpE - vec2A.bbpE;
    285 
    286 	if( shiftL > 0 )
    287 	{
    288 		xL = vec1A.xE - ( ( int32 ) vec2A.xE << shiftL );
    289 		yL = vec1A.yE - ( ( int32 ) vec2A.yE << shiftL );
    290 		zL = vec1A.zE - ( ( int32 ) vec2A.zE << 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 		zL = ( ( int32 ) vec1A.zE << -shiftL ) - vec2A.zE;
    298 		bbpL = vec2A.bbpE;
    299 	}
    300 
    301 	return bts_Flt16Vec3D_create32( xL, yL, zL, bbpL );
    302 }
    303 
    304 /* ------------------------------------------------------------------------- */
    305 
    306 struct bts_Flt16Vec3D bts_Flt16Vec3D_mul( struct bts_Flt16Vec3D vecA, int16 factorA, int32 bbpFactorA )
    307 {
    308 	int32 xL = ( int32 ) vecA.xE * factorA;
    309 	int32 yL = ( int32 ) vecA.yE * factorA;
    310 	int32 zL = ( int32 ) vecA.zE * factorA;
    311 	return bts_Flt16Vec3D_create32( xL, yL, zL, bbpFactorA + vecA.bbpE );
    312 }
    313 
    314 /* ------------------------------------------------------------------------- */
    315 
    316 /* ========================================================================= */
    317 
    318