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_BasicEm/Math.h" 20 #include "b_TensorEm/IdCluster2D.h" 21 22 /* ------------------------------------------------------------------------- */ 23 24 /* ========================================================================= */ 25 /* */ 26 /* ---- \ghd{ auxiliary functions } ---------------------------------------- */ 27 /* */ 28 /* ========================================================================= */ 29 30 /* ------------------------------------------------------------------------- */ 31 32 /* ========================================================================= */ 33 /* */ 34 /* ---- \ghd{ constructor / destructor } ----------------------------------- */ 35 /* */ 36 /* ========================================================================= */ 37 38 /* ------------------------------------------------------------------------- */ 39 40 void bts_IdCluster2D_init( struct bbs_Context* cpA, 41 struct bts_IdCluster2D* ptrA ) 42 { 43 bts_Cluster2D_init( cpA, &ptrA->clusterE ); 44 bbs_Int16Arr_init( cpA, &ptrA->idArrE ); 45 } 46 47 /* ------------------------------------------------------------------------- */ 48 49 void bts_IdCluster2D_exit( struct bbs_Context* cpA, 50 struct bts_IdCluster2D* ptrA ) 51 { 52 bts_Cluster2D_exit( cpA, &ptrA->clusterE ); 53 bbs_Int16Arr_exit( cpA, &ptrA->idArrE ); 54 } 55 56 /* ------------------------------------------------------------------------- */ 57 58 /* ========================================================================= */ 59 /* */ 60 /* ---- \ghd{ operators } -------------------------------------------------- */ 61 /* */ 62 /* ========================================================================= */ 63 64 /* ------------------------------------------------------------------------- */ 65 66 void bts_IdCluster2D_copy( struct bbs_Context* cpA, 67 struct bts_IdCluster2D* ptrA, 68 const struct bts_IdCluster2D* srcPtrA ) 69 { 70 bts_Cluster2D_copy( cpA, &ptrA->clusterE, &srcPtrA->clusterE ); 71 bbs_Int16Arr_copy( cpA, &ptrA->idArrE, &srcPtrA->idArrE ); 72 } 73 74 /* ------------------------------------------------------------------------- */ 75 76 flag bts_IdCluster2D_equal( struct bbs_Context* cpA, 77 const struct bts_IdCluster2D* ptrA, 78 const struct bts_IdCluster2D* srcPtrA ) 79 { 80 if( !bts_Cluster2D_equal( cpA, &ptrA->clusterE, &srcPtrA->clusterE ) ) return FALSE; 81 if( !bbs_Int16Arr_equal( cpA, &ptrA->idArrE, &srcPtrA->idArrE ) ) return FALSE; 82 return TRUE; 83 } 84 85 /* ------------------------------------------------------------------------- */ 86 87 /* ========================================================================= */ 88 /* */ 89 /* ---- \ghd{ query functions } -------------------------------------------- */ 90 /* */ 91 /* ========================================================================= */ 92 93 /* ------------------------------------------------------------------------- */ 94 95 struct bts_Flt16Vec2D bts_IdCluster2D_center( struct bbs_Context* cpA, 96 const struct bts_IdCluster2D* ptrA ) 97 { 98 return bts_Cluster2D_center( cpA, &ptrA->clusterE ); 99 } 100 101 /* ------------------------------------------------------------------------- */ 102 103 struct bts_Int16Rect bts_IdCluster2D_boundingBox( struct bbs_Context* cpA, 104 const struct bts_IdCluster2D* ptrA ) 105 { 106 return bts_Cluster2D_boundingBox( cpA, &ptrA->clusterE ); 107 } 108 109 /* ------------------------------------------------------------------------- */ 110 111 /* ========================================================================= */ 112 /* */ 113 /* ---- \ghd{ modify functions } ------------------------------------------- */ 114 /* */ 115 /* ========================================================================= */ 116 117 /* ------------------------------------------------------------------------- */ 118 119 void bts_IdCluster2D_create( struct bbs_Context* cpA, 120 struct bts_IdCluster2D* ptrA, 121 uint32 sizeA, 122 struct bbs_MemSeg* mspA ) 123 { 124 if( bbs_Context_error( cpA ) ) return; 125 bts_Cluster2D_create( cpA, &ptrA->clusterE, sizeA, mspA ); 126 bbs_Int16Arr_create( cpA, &ptrA->idArrE, sizeA, mspA ); 127 } 128 129 /* ------------------------------------------------------------------------- */ 130 131 void bts_IdCluster2D_size( struct bbs_Context* cpA, 132 struct bts_IdCluster2D* ptrA, 133 uint32 sizeA ) 134 { 135 bts_Cluster2D_size( cpA, &ptrA->clusterE, sizeA ); 136 bbs_Int16Arr_size( cpA, &ptrA->idArrE, sizeA ); 137 } 138 139 /* ------------------------------------------------------------------------- */ 140 141 void bts_IdCluster2D_transform( struct bbs_Context* cpA, 142 struct bts_IdCluster2D* ptrA, 143 struct bts_Flt16Alt2D altA ) 144 { 145 bts_Cluster2D_transform( cpA, &ptrA->clusterE, altA ); 146 } 147 148 /* ------------------------------------------------------------------------- */ 149 150 void bts_IdCluster2D_copyTransform( struct bbs_Context* cpA, 151 struct bts_IdCluster2D* ptrA, 152 const struct bts_IdCluster2D* srcPtrA, 153 struct bts_Flt16Alt2D altA, 154 uint32 dstBbpA ) 155 { 156 bts_Cluster2D_copyTransform( cpA, &ptrA->clusterE, &srcPtrA->clusterE, altA, dstBbpA ); 157 bbs_Int16Arr_copy( cpA, &ptrA->idArrE, &srcPtrA->idArrE ); 158 } 159 160 /* ------------------------------------------------------------------------- */ 161 162 /* ========================================================================= */ 163 /* */ 164 /* ---- \ghd{ I/O } -------------------------------------------------------- */ 165 /* */ 166 /* ========================================================================= */ 167 168 /* ------------------------------------------------------------------------- */ 169 170 uint32 bts_IdCluster2D_memSize( struct bbs_Context* cpA, 171 const struct bts_IdCluster2D *ptrA ) 172 { 173 return bbs_SIZEOF16( uint32 ) 174 + bbs_SIZEOF16( uint32 ) /* version */ 175 + bts_Cluster2D_memSize( cpA, &ptrA->clusterE ) 176 + bbs_Int16Arr_memSize( cpA, &ptrA->idArrE ); 177 } 178 179 /* ------------------------------------------------------------------------- */ 180 181 uint32 bts_IdCluster2D_memWrite( struct bbs_Context* cpA, 182 const struct bts_IdCluster2D* ptrA, 183 uint16* memPtrA ) 184 { 185 uint32 memSizeL = bts_IdCluster2D_memSize( cpA, ptrA ); 186 memPtrA += bbs_memWrite32( &memSizeL, memPtrA ); 187 memPtrA += bbs_memWriteUInt32( bts_ID_CLUSTER2D_VERSION, memPtrA ); 188 memPtrA += bts_Cluster2D_memWrite( cpA, &ptrA->clusterE, memPtrA ); 189 memPtrA += bbs_Int16Arr_memWrite( cpA, &ptrA->idArrE, memPtrA ); 190 return memSizeL; 191 } 192 193 /* ------------------------------------------------------------------------- */ 194 195 uint32 bts_IdCluster2D_memRead( struct bbs_Context* cpA, 196 struct bts_IdCluster2D* ptrA, 197 const uint16* memPtrA, 198 struct bbs_MemSeg* mspA ) 199 { 200 uint32 memSizeL; 201 uint32 versionL; 202 if( bbs_Context_error( cpA ) ) return 0; 203 memPtrA += bbs_memRead32( &memSizeL, memPtrA ); 204 memPtrA += bbs_memReadVersion32( cpA, &versionL, bts_ID_CLUSTER2D_VERSION, memPtrA ); 205 memPtrA += bts_Cluster2D_memRead( cpA, &ptrA->clusterE, memPtrA, mspA ); 206 memPtrA += bbs_Int16Arr_memRead( cpA, &ptrA->idArrE, memPtrA, mspA ); 207 if( memSizeL != bts_IdCluster2D_memSize( cpA, ptrA ) ) 208 { 209 bbs_ERR0( bbs_ERR_CORRUPT_DATA, "uint32 bts_IdCluster2D_memRead( const struct bts_IdCluster2D* ptrA, const void* memPtrA ):\n" 210 "size mismatch" ); 211 return 0; 212 } 213 return memSizeL; 214 } 215 216 /* ------------------------------------------------------------------------- */ 217 218 /* ========================================================================= */ 219 /* */ 220 /* ---- \ghd{ exec functions } --------------------------------------------- */ 221 /* */ 222 /* ========================================================================= */ 223 224 /* ------------------------------------------------------------------------- */ 225 226 void bts_IdCluster2D_convertToEqivalentClusters( struct bbs_Context* cpA, 227 const struct bts_IdCluster2D* inCluster1PtrA, 228 const struct bts_IdCluster2D* inCluster2PtrA, 229 struct bts_Cluster2D* outCluster1PtrA, 230 struct bts_Cluster2D* outCluster2PtrA ) 231 { 232 uint32 iL, jL; 233 uint32 countL = 0; 234 235 uint32 size1L = inCluster1PtrA->clusterE.sizeE; 236 uint32 size2L = inCluster2PtrA->clusterE.sizeE; 237 238 const int16* idArr1L = inCluster1PtrA->idArrE.arrPtrE; 239 const int16* idArr2L = inCluster2PtrA->idArrE.arrPtrE; 240 241 const struct bts_Int16Vec2D* srcVecArr1E = inCluster1PtrA->clusterE.vecArrE; 242 const struct bts_Int16Vec2D* srcVecArr2E = inCluster2PtrA->clusterE.vecArrE; 243 244 struct bts_Int16Vec2D* dstVecArr1E = outCluster1PtrA->vecArrE; 245 struct bts_Int16Vec2D* dstVecArr2E = outCluster2PtrA->vecArrE; 246 247 uint32 maxOutSizeL = bbs_min( outCluster1PtrA->allocatedSizeE, outCluster2PtrA->allocatedSizeE ); 248 bts_Cluster2D_size( cpA, outCluster1PtrA, maxOutSizeL ); 249 bts_Cluster2D_size( cpA, outCluster2PtrA, maxOutSizeL ); 250 251 for( iL = 0; iL < size1L; iL++ ) 252 { 253 int32 idL = idArr1L[ iL ]; 254 if( idL >= 0 ) 255 { 256 for( jL = 0; jL < size2L; jL++ ) 257 { 258 if( idL == idArr2L[ jL ] ) break; 259 } 260 261 if( jL < size2L ) 262 { 263 if( countL == maxOutSizeL ) 264 { 265 bbs_ERROR0( "void bts_IdCluster2D_convertToEqivalentClusters( .... ):\n" 266 "Destination clusters are insufficiently allocated" ); 267 return; 268 } 269 270 dstVecArr1E[ countL ] = srcVecArr1E[ iL ]; 271 dstVecArr2E[ countL ] = srcVecArr2E[ jL ]; 272 countL++; 273 } 274 } 275 } 276 277 bts_Cluster2D_size( cpA, outCluster1PtrA, countL ); 278 bts_Cluster2D_size( cpA, outCluster2PtrA, countL ); 279 280 outCluster1PtrA->bbpE = inCluster1PtrA->clusterE.bbpE; 281 outCluster2PtrA->bbpE = inCluster2PtrA->clusterE.bbpE; 282 } 283 284 /* ------------------------------------------------------------------------- */ 285 286 struct bts_Flt16Alt2D bts_IdCluster2D_alt( struct bbs_Context* cpA, 287 const struct bts_IdCluster2D* srcPtrA, 288 struct bts_IdCluster2D* dstPtrA, 289 enum bts_AltType altTypeA, 290 struct bts_Cluster2D* tmpPtr1A, /* temporary cluster 1 */ 291 struct bts_Cluster2D* tmpPtr2A ) /* temporary cluster 2 */ 292 { 293 bts_IdCluster2D_convertToEqivalentClusters( cpA, srcPtrA, dstPtrA, tmpPtr1A, tmpPtr2A ); 294 return bts_Cluster2D_alt( cpA, tmpPtr1A, tmpPtr2A, altTypeA ); 295 } 296 297 /* ------------------------------------------------------------------------- */ 298 299 /* ========================================================================= */ 300 301 302