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
42void bts_Flt16Alt3D_init( struct bts_Flt16Alt3D* ptrA )
43{
44	bts_Flt16Mat3D_init( &ptrA->matE );
45	bts_Flt16Vec3D_init( &ptrA->vecE );
46}
47
48/* ------------------------------------------------------------------------- */
49
50void 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
90uint32 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
99uint32 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
109uint32 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
128struct 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
138struct 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
150struct 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
161struct 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
180struct 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
199struct 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
222struct 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 */
234struct 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