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/Flt16Alt3D.h"
20 #include "b_BasicEm/Math.h"
21 #include "b_BasicEm/Memory.h"
22 #include "b_BasicEm/Functions.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
bts_Flt16Alt3D_init(struct bts_Flt16Alt3D * ptrA)42 void bts_Flt16Alt3D_init( struct bts_Flt16Alt3D* ptrA )
43 {
44 bts_Flt16Mat3D_init( &ptrA->matE );
45 bts_Flt16Vec3D_init( &ptrA->vecE );
46 }
47
48 /* ------------------------------------------------------------------------- */
49
bts_Flt16Alt3D_exit(struct bts_Flt16Alt3D * ptrA)50 void bts_Flt16Alt3D_exit( struct bts_Flt16Alt3D* ptrA )
51 {
52 bts_Flt16Mat3D_exit( &ptrA->matE );
53 bts_Flt16Vec3D_exit( &ptrA->vecE );
54 }
55
56 /* ------------------------------------------------------------------------- */
57
58 /* ========================================================================= */
59 /* */
60 /* ---- \ghd{ operators } -------------------------------------------------- */
61 /* */
62 /* ========================================================================= */
63
64 /* ------------------------------------------------------------------------- */
65
66 /* ========================================================================= */
67 /* */
68 /* ---- \ghd{ query functions } -------------------------------------------- */
69 /* */
70 /* ========================================================================= */
71
72 /* ------------------------------------------------------------------------- */
73
74 /* ========================================================================= */
75 /* */
76 /* ---- \ghd{ modify functions } ------------------------------------------- */
77 /* */
78 /* ========================================================================= */
79
80 /* ------------------------------------------------------------------------- */
81
82 /* ========================================================================= */
83 /* */
84 /* ---- \ghd{ I/O } -------------------------------------------------------- */
85 /* */
86 /* ========================================================================= */
87
88 /* ------------------------------------------------------------------------- */
89
bts_Flt16Alt3D_memSize(struct bbs_Context * cpA,const struct bts_Flt16Alt3D * ptrA)90 uint32 bts_Flt16Alt3D_memSize( struct bbs_Context* cpA,
91 const struct bts_Flt16Alt3D *ptrA )
92 {
93 bbs_ERROR0( "unimplemented function" );
94 return 0;
95 }
96
97 /* ------------------------------------------------------------------------- */
98
bts_Flt16Alt3D_memWrite(struct bbs_Context * cpA,const struct bts_Flt16Alt3D * ptrA,uint16 * memPtrA)99 uint32 bts_Flt16Alt3D_memWrite( struct bbs_Context* cpA,
100 const struct bts_Flt16Alt3D* ptrA,
101 uint16* memPtrA )
102 {
103 bbs_ERROR0( "unimplemented function" );
104 return 0;
105 }
106
107 /* ------------------------------------------------------------------------- */
108
bts_Flt16Alt3D_memRead(struct bbs_Context * cpA,struct bts_Flt16Alt3D * ptrA,const uint16 * memPtrA)109 uint32 bts_Flt16Alt3D_memRead( struct bbs_Context* cpA,
110 struct bts_Flt16Alt3D* ptrA,
111 const uint16* memPtrA )
112 {
113 if( bbs_Context_error( cpA ) ) return 0;
114 bbs_ERROR0( "unimplemented function" );
115 return 0;
116 }
117
118 /* ------------------------------------------------------------------------- */
119
120 /* ========================================================================= */
121 /* */
122 /* ---- \ghd{ exec functions } --------------------------------------------- */
123 /* */
124 /* ========================================================================= */
125
126 /* ------------------------------------------------------------------------- */
127
bts_Flt16Alt3D_createIdentity()128 struct bts_Flt16Alt3D bts_Flt16Alt3D_createIdentity()
129 {
130 struct bts_Flt16Alt3D altL = { { 1, 0, 0,
131 0, 1, 0,
132 0, 0, 1, 0 }, { 0, 0, 0, 0 } };
133 return altL;
134 }
135
136 /* ------------------------------------------------------------------------- */
137
bts_Flt16Alt3D_createScale(int32 scaleA,int32 scaleBbpA,const struct bts_Flt16Vec3D * centerPtrA)138 struct bts_Flt16Alt3D bts_Flt16Alt3D_createScale( int32 scaleA,
139 int32 scaleBbpA,
140 const struct bts_Flt16Vec3D* centerPtrA )
141 {
142 struct bts_Flt16Alt3D altL;
143 altL.matE = bts_Flt16Mat3D_createScale( scaleA, scaleBbpA );
144 altL.vecE = bts_Flt16Vec3D_sub( *centerPtrA, bts_Flt16Mat3D_mapFlt( &altL.matE, centerPtrA ) );
145 return altL;
146 }
147
148 /* ------------------------------------------------------------------------- */
149
bts_Flt16Alt3D_createLinear(const struct bts_Flt16Mat3D * matPtrA,const struct bts_Flt16Vec3D * centerPtrA)150 struct bts_Flt16Alt3D bts_Flt16Alt3D_createLinear( const struct bts_Flt16Mat3D* matPtrA,
151 const struct bts_Flt16Vec3D* centerPtrA )
152 {
153 struct bts_Flt16Alt3D altL;
154 altL.matE = *matPtrA;
155 altL.vecE = bts_Flt16Vec3D_sub( *centerPtrA, bts_Flt16Mat3D_mapFlt( &altL.matE, centerPtrA ) );
156 return altL;
157 }
158
159 /* ------------------------------------------------------------------------- */
160
bts_Flt16Alt3D_create16(int16 xxA,int16 xyA,int16 xzA,int16 yxA,int16 yyA,int16 yzA,int16 zxA,int16 zyA,int16 zzA,int16 matBbpA,int16 xA,int16 yA,int16 zA,int16 vecBbpA)161 struct bts_Flt16Alt3D bts_Flt16Alt3D_create16( int16 xxA, int16 xyA, int16 xzA,
162 int16 yxA, int16 yyA, int16 yzA,
163 int16 zxA, int16 zyA, int16 zzA,
164 int16 matBbpA,
165 int16 xA, int16 yA, int16 zA,
166 int16 vecBbpA )
167 {
168 struct bts_Flt16Alt3D altL;
169 altL.matE = bts_Flt16Mat3D_create16( xxA, xyA, xzA,
170 yxA, yyA, yzA,
171 zxA, zyA, zzA,
172 matBbpA );
173
174 altL.vecE = bts_Flt16Vec3D_create16( xA, yA, zA, vecBbpA );
175 return altL;
176 }
177
178 /* ------------------------------------------------------------------------- */
179
bts_Flt16Alt3D_create32(int32 xxA,int32 xyA,int32 xzA,int32 yxA,int32 yyA,int32 yzA,int32 zxA,int32 zyA,int32 zzA,int16 matBbpA,int32 xA,int32 yA,int32 zA,int16 vecBbpA)180 struct bts_Flt16Alt3D bts_Flt16Alt3D_create32( int32 xxA, int32 xyA, int32 xzA,
181 int32 yxA, int32 yyA, int32 yzA,
182 int32 zxA, int32 zyA, int32 zzA,
183 int16 matBbpA,
184 int32 xA, int32 yA, int32 zA,
185 int16 vecBbpA )
186 {
187 struct bts_Flt16Alt3D altL;
188 altL.matE = bts_Flt16Mat3D_create32( xxA, xyA, xzA,
189 yxA, yyA, yzA,
190 zxA, zyA, zzA,
191 matBbpA );
192
193 altL.vecE = bts_Flt16Vec3D_create32( xA, yA, zA, vecBbpA );
194 return altL;
195 }
196
197 /* ------------------------------------------------------------------------- */
198
bts_Flt16Alt3D_mapFlt(const struct bts_Flt16Alt3D * altPtrA,const struct bts_Flt16Vec3D * vecPtrA)199 struct bts_Flt16Vec3D bts_Flt16Alt3D_mapFlt( const struct bts_Flt16Alt3D* altPtrA,
200 const struct bts_Flt16Vec3D* vecPtrA )
201 {
202 struct bts_Flt16Vec3D vecL = bts_Flt16Mat3D_mapFlt( &altPtrA->matE, vecPtrA );
203 int32 shiftL = altPtrA->vecE.bbpE - vecL.bbpE;
204 if( shiftL > 0 )
205 {
206 int32 sh1L = shiftL - 1;
207 vecL.xE += ( ( altPtrA->vecE.xE >> sh1L ) + 1 ) >> 1;
208 vecL.yE += ( ( altPtrA->vecE.yE >> sh1L ) + 1 ) >> 1;
209 vecL.zE += ( ( altPtrA->vecE.zE >> sh1L ) + 1 ) >> 1;
210 }
211 else
212 {
213 vecL.xE += altPtrA->vecE.xE << -shiftL;
214 vecL.yE += altPtrA->vecE.yE << -shiftL;
215 vecL.zE += altPtrA->vecE.zE << -shiftL;
216 }
217 return vecL;
218 }
219
220 /* ------------------------------------------------------------------------- */
221
bts_Flt16Alt3D_mul(const struct bts_Flt16Alt3D * alt1PtrA,const struct bts_Flt16Alt3D * alt2PtrA)222 struct bts_Flt16Alt3D bts_Flt16Alt3D_mul( const struct bts_Flt16Alt3D* alt1PtrA,
223 const struct bts_Flt16Alt3D* alt2PtrA )
224 {
225 struct bts_Flt16Alt3D altL;
226 altL.vecE = bts_Flt16Alt3D_mapFlt( alt1PtrA, &alt2PtrA->vecE );
227 altL.matE = bts_Flt16Mat3D_mul( &alt1PtrA->matE, &alt2PtrA->matE );
228 return altL;
229 }
230
231 /* ------------------------------------------------------------------------- */
232
233 /** multiplies matrix with matA; returns pointer to resulting matrix */
bts_Flt16Alt3D_mulTo(struct bts_Flt16Alt3D * alt1PtrA,const struct bts_Flt16Alt3D * alt2PtrA)234 struct bts_Flt16Alt3D* bts_Flt16Alt3D_mulTo( struct bts_Flt16Alt3D* alt1PtrA,
235 const struct bts_Flt16Alt3D* alt2PtrA )
236 {
237 *alt1PtrA = bts_Flt16Alt3D_mul( alt1PtrA, alt2PtrA );
238 return alt1PtrA;
239 }
240
241 /* ------------------------------------------------------------------------- */
242
243 /* ========================================================================= */
244
245