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 #ifndef bts_CLUSTER2D_EM_H
18 #define bts_CLUSTER2D_EM_H
19 
20 /* ---- includes ----------------------------------------------------------- */
21 
22 #include "b_BasicEm/Context.h"
23 #include "b_BasicEm/MemSeg.h"
24 #include "b_TensorEm/Int16Vec2D.h"
25 #include "b_TensorEm/Flt16Vec2D.h"
26 #include "b_TensorEm/Int16Rect.h"
27 #include "b_TensorEm/Flt16Alt2D.h"
28 #include "b_TensorEm/Functions.h"
29 
30 /* ---- related objects  --------------------------------------------------- */
31 
32 struct bts_RBFMap2D;
33 
34 /* ---- typedefs ----------------------------------------------------------- */
35 
36 /* data format version number */
37 #define bts_CLUSTER2D_VERSION 100
38 
39 /* ---- constants ---------------------------------------------------------- */
40 
41 /* ---- object definition -------------------------------------------------- */
42 
43 /** 2d vector array */
44 struct bts_Cluster2D
45 {
46 
47 	/* ---- private data --------------------------------------------------- */
48 
49 	/* ---- public data ---------------------------------------------------- */
50 
51 	/** pointer to exclusive memory segment used for allocation */
52 	struct bbs_MemSeg* mspE;
53 
54 	/** number of allocated vectors */
55 	uint32 allocatedSizeE;
56 
57 	/** number of vectors */
58 	uint32 sizeE;
59 
60 	/** format of vectors (bbpE always > 0) */
61 	int32 bbpE;
62 
63 	/** array of int16 vectors */
64 	struct bts_Int16Vec2D* vecArrE;
65 
66 };
67 
68 /* ---- associated objects ------------------------------------------------- */
69 
70 /* ---- external functions ------------------------------------------------- */
71 
72 /* ---- \ghd{ constructor/destructor } ------------------------------------- */
73 
74 /** initializes cluster */
75 void bts_Cluster2D_init( struct bbs_Context* cpA,
76 						 struct bts_Cluster2D* ptrA );
77 
78 /** destroys cluster */
79 void bts_Cluster2D_exit( struct bbs_Context* cpA,
80 						 struct bts_Cluster2D* ptrA );
81 
82 /* ---- \ghd{ operators } -------------------------------------------------- */
83 
84 /** copies cluster */
85 void bts_Cluster2D_copy( struct bbs_Context* cpA,
86 						 struct bts_Cluster2D* ptrA,
87 						 const struct bts_Cluster2D* srcPtrA );
88 
89 /** compares cluster */
90 flag bts_Cluster2D_equal( struct bbs_Context* cpA,
91 						  const struct bts_Cluster2D* ptrA,
92 						  const struct bts_Cluster2D* srcPtrA );
93 
94 /* ---- \ghd{ query functions } -------------------------------------------- */
95 
96 /** returns center of gravity */
97 struct bts_Flt16Vec2D bts_Cluster2D_center( struct bbs_Context* cpA,
98 										    const struct bts_Cluster2D* ptrA );
99 
100 /** returns check sum (for debugging purpose) */
101 uint32 bts_Cluster2D_checkSum( struct bbs_Context* cpA,
102 							   const struct bts_Cluster2D* ptrA );
103 
104 /** returns bounding box */
105 struct bts_Int16Rect bts_Cluster2D_boundingBox( struct bbs_Context* cpA,
106 											    const struct bts_Cluster2D* ptrA );
107 
108 /** returns int32 x-coordinate with given bbp at indexed position */
109 int32 bts_Cluster2D_int32X( struct bbs_Context* cpA,
110 						    const struct bts_Cluster2D* ptrA,
111 							uint32 indexA, int32 bbpA );
112 
113 /** returns int32 y-coordinate with given bbp at indexed position */
114 int32 bts_Cluster2D_int32Y( struct bbs_Context* cpA,
115 						    const struct bts_Cluster2D* ptrA,
116 							uint32 indexA,
117 							int32 bbpA );
118 
119 /* ---- \ghd{ modify functions } ------------------------------------------- */
120 
121 /** allocates cluster */
122 void bts_Cluster2D_create( struct bbs_Context* cpA,
123 						   struct bts_Cluster2D* ptrA,
124 						   uint32 sizeA,
125 						   struct bbs_MemSeg* mspA );
126 
127 /** resize cluster (sizeA must be smaller or equal to allocated size)*/
128 void bts_Cluster2D_size( struct bbs_Context* cpA,
129 						 struct bts_Cluster2D* ptrA,
130 						 uint32 sizeA );
131 
132 /** transforms cluster according to alt (function does not change bbp of cluster) */
133 void bts_Cluster2D_transform( struct bbs_Context* cpA,
134 							  struct bts_Cluster2D* ptrA,
135 							  struct bts_Flt16Alt2D altA );
136 
137 /** transforms cluster according to alt and set bbp of output cluster */
138 void bts_Cluster2D_transformBbp( struct bbs_Context* cpA,
139 							     struct bts_Cluster2D* ptrA,
140 							     struct bts_Flt16Alt2D altA,
141 								 uint32 dstBbpA );
142 
143 /** transforms cluster with rbf map (function does not change bbp of cluster) */
144 void bts_Cluster2D_rbfTransform( struct bbs_Context* cpA,
145 								 struct bts_Cluster2D* ptrA,
146 								 const struct bts_RBFMap2D* rbfMapPtrA );
147 
148 /** copies src cluster and simultaneously transforms vectors according to alt using dstBbpA as resulting cluster format */
149 void bts_Cluster2D_copyTransform( struct bbs_Context* cpA,
150 								  struct bts_Cluster2D* ptrA,
151 								  const struct bts_Cluster2D* srcPtrA,
152 								  struct bts_Flt16Alt2D altA,
153 								  uint32 dstBbpA );
154 
155 /* ---- \ghd{ memory I/O } ------------------------------------------------- */
156 
157 /** size in words (16-bit) object needs when written to memory */
158 uint32 bts_Cluster2D_memSize( struct bbs_Context* cpA,
159 							  const struct bts_Cluster2D* ptrA );
160 
161 /** writes object to memory; returns number of words (16-bit) written */
162 uint32 bts_Cluster2D_memWrite( struct bbs_Context* cpA,
163 							   const struct bts_Cluster2D* ptrA,
164 							   uint16* memPtrA );
165 
166 /** reads object from memory; returns number of words (16-bit) read */
167 uint32 bts_Cluster2D_memRead( struct bbs_Context* cpA,
168 							  struct bts_Cluster2D* ptrA,
169 							  const uint16* memPtrA,
170 						      struct bbs_MemSeg* mspA );
171 
172 /* ---- \ghd{ exec functions } --------------------------------------------- */
173 
174 /** Computes the best affine linear transformation from *srcPtrA to *dstPtrA.
175  *  Constrains of trafo are given by altTypeA
176  */
177 struct bts_Flt16Alt2D bts_Cluster2D_alt( struct bbs_Context* cpA,
178 										 const struct bts_Cluster2D* srcPtrA,
179 										 const struct bts_Cluster2D* dstPtrA,
180 										 enum bts_AltType altTypeA );
181 
182 #endif /* bts_CLUSTER2D_EM_H */
183 
184