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/Int16Vec2D.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_Int16Vec2D_init( struct bts_Int16Vec2D* ptrA )
43{
44	ptrA->xE = 0;
45	ptrA->yE = 0;
46}
47
48/* ------------------------------------------------------------------------- */
49
50void bts_Int16Vec2D_exit( struct bts_Int16Vec2D* ptrA )
51{
52	ptrA->xE = 0;
53	ptrA->yE = 0;
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_Int16Vec2D_memSize( struct bbs_Context* cpA,
91							   const struct bts_Int16Vec2D *ptrA )
92{
93	return bbs_SIZEOF16( struct bts_Int16Vec2D );
94}
95
96/* ------------------------------------------------------------------------- */
97
98uint32 bts_Int16Vec2D_memWrite( struct bbs_Context* cpA,
99							    const struct bts_Int16Vec2D* ptrA,
100								uint16* memPtrA )
101{
102	memPtrA += bbs_memWrite16( &ptrA->xE, memPtrA );
103	memPtrA += bbs_memWrite16( &ptrA->yE, memPtrA );
104	return bbs_SIZEOF16( *ptrA );
105}
106
107/* ------------------------------------------------------------------------- */
108
109uint32 bts_Int16Vec2D_memRead( struct bbs_Context* cpA,
110							   struct bts_Int16Vec2D* ptrA,
111							   const uint16* memPtrA )
112{
113	if( bbs_Context_error( cpA ) ) return 0;
114	memPtrA += bbs_memRead16( &ptrA->xE, memPtrA );
115	memPtrA += bbs_memRead16( &ptrA->yE, memPtrA );
116	return bbs_SIZEOF16( *ptrA );
117}
118
119/* ------------------------------------------------------------------------- */
120
121/* ========================================================================= */
122/*                                                                           */
123/* ---- \ghd{ exec functions } --------------------------------------------- */
124/*                                                                           */
125/* ========================================================================= */
126
127/* ------------------------------------------------------------------------- */
128
129int32 bts_Int16Vec2D_dotPrd( const struct bts_Int16Vec2D* vec1PtrA,
130							 const struct bts_Int16Vec2D* vec2PtrA )
131{
132	return ( int32 ) vec1PtrA->xE * vec2PtrA->xE + ( int32 ) vec1PtrA->yE * vec2PtrA->yE;
133}
134
135/* ------------------------------------------------------------------------- */
136
137uint32 bts_Int16Vec2D_norm2( const struct bts_Int16Vec2D* ptrA )
138{
139	return ( int32 ) ptrA->xE * ptrA->xE + ( int32 ) ptrA->yE * ptrA->yE;
140}
141
142/* ------------------------------------------------------------------------- */
143
144uint16 bts_Int16Vec2D_norm( const struct bts_Int16Vec2D* ptrA )
145{
146	return bbs_sqrt32( ( int32 ) ptrA->xE * ptrA->xE + ( int32 ) ptrA->yE * ptrA->yE );
147}
148
149/* ------------------------------------------------------------------------- */
150
151void bts_Int16Vec2D_normalize( struct bts_Int16Vec2D* ptrA, int32 bbpA )
152{
153	int32 normL = bbs_sqrt32( ( int32 ) ptrA->xE * ptrA->xE + ( int32 ) ptrA->yE * ptrA->yE );
154	int32 xL = ( ( int32 ) ptrA->xE << 16 ) / normL;
155	int32 yL = ( ( int32 ) ptrA->yE << 16 ) / normL;
156	ptrA->xE = xL >> ( 16 - bbpA );
157	ptrA->yE = yL >> ( 16 - bbpA );
158}
159
160/* ------------------------------------------------------------------------- */
161
162struct bts_Int16Vec2D bts_Int16Vec2D_normalized( const struct bts_Int16Vec2D* ptrA, int32 bbpA )
163{
164	struct bts_Int16Vec2D vecL = *ptrA;
165	bts_Int16Vec2D_normalize( &vecL, bbpA );
166	return vecL;
167}
168
169/* ------------------------------------------------------------------------- */
170
171phase16 bts_Int16Vec2D_angle( const struct bts_Int16Vec2D* vecPtrA )
172{
173	return bbs_phase16( vecPtrA->xE, vecPtrA->yE );
174}
175
176/* ------------------------------------------------------------------------- */
177
178phase16 bts_Int16Vec2D_enclosedAngle( const struct bts_Int16Vec2D* vec1PtrA,
179									  const struct bts_Int16Vec2D* vec2PtrA )
180{
181	int32 xL = ( int32 ) vec1PtrA->xE * vec2PtrA->xE + ( int32 ) vec1PtrA->yE * vec2PtrA->yE;
182	int32 yL = ( int32 ) vec1PtrA->yE * vec2PtrA->xE - ( int32 ) vec1PtrA->xE * vec2PtrA->yE;
183	return bbs_phase16( xL, yL );
184}
185
186/* ------------------------------------------------------------------------- */
187
188/* ========================================================================= */
189
190
191