17f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*
27f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
37f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *
47f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
57f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * you may not use this file except in compliance with the License.
67f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * You may obtain a copy of the License at
77f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *
87f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
97f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *
107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * See the License for the specific language governing permissions and
147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * limitations under the License.
157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project */
167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- includes ----------------------------------------------------------- */
187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#include "b_BasicEm/Functions.h"
207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#include "b_BasicEm/Math.h"
217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#include "b_ImageEm/Functions.h"
227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#include "b_BitFeatureEm/LocalScanDetector.h"
237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ auxiliary functions } ---------------------------------------- */
297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/** applies PCA mapping
357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *  Input and output clusters may be identical
367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project */
377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_LocalScanDetector_pcaMap( struct bbs_Context* cpA,
387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project								   const struct bbf_LocalScanDetector* ptrA,
397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project								   const struct bts_IdCluster2D* inClusterPtrA,
407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project								   struct bts_IdCluster2D* outClusterPtrA )
417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_DEF_fNameL( "bbf_LocalScanDetector_pcaMap" )
437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	struct bts_Cluster2D* tmpCl1PtrL  = ( struct bts_Cluster2D* )&ptrA->tmpCluster1E;
457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	struct bts_Cluster2D* tmpCl2PtrL  = ( struct bts_Cluster2D* )&ptrA->tmpCluster2E;
467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	struct bts_RBFMap2D*  rbfPtrL     = ( struct bts_RBFMap2D* )&ptrA->rbfMapE;
477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	struct bts_Flt16Alt2D altL;
487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 outBbpL = inClusterPtrA->clusterE.bbpE;
497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 iL, jL;
507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* setup two equivalent clusters holding the essential (alt-free) moves to be handled by PCA */
527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bts_IdCluster2D_convertToEqivalentClusters( cpA,
537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project												inClusterPtrA,
547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project												&ptrA->pcaClusterE,
557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project												tmpCl1PtrL,
567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project												tmpCl2PtrL );
577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	altL = bts_Cluster2D_alt( cpA, tmpCl1PtrL, tmpCl2PtrL, bts_ALT_RIGID );
597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bts_Cluster2D_transform( cpA, tmpCl1PtrL, altL );
607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bts_RBFMap2D_compute( cpA, rbfPtrL, tmpCl2PtrL, tmpCl1PtrL );
617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bts_RBFMap2D_mapCluster( cpA, rbfPtrL, &ptrA->pcaClusterE.clusterE, tmpCl1PtrL, 6/* ! */ );
627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* PCA projection: cluster1 -> cluster1 */
647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* mat elements: 8.8 */
667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		const int16* matPtrL = ptrA->pcaMatE.arrPtrE;
677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* same bbp as pca cluster */
697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		const int16* avgPtrL = ptrA->pcaAvgE.arrPtrE;
707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		struct bts_Int16Vec2D* vecArrL = tmpCl1PtrL->vecArrE;
727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* projected vector */
747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 prjVecL[ bpi_LOCAL_SCAN_DETECTOR_MAX_PCA_DIM ];
757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* width of matrix */
777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint16 matWidthL = tmpCl1PtrL->sizeE * 2;
787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( ptrA->pcaDimSubSpaceE > bpi_LOCAL_SCAN_DETECTOR_MAX_PCA_DIM )
807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			bbs_ERROR1( "%s:\nbpi_RF_LANDMARKER_MAX_PCA_DIM exceeded", fNameL );
827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			return;
837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* forward trafo */
867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		for( iL = 0; iL < ptrA->pcaDimSubSpaceE; iL++ )
877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 sumL = 0;
897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			avgPtrL = ptrA->pcaAvgE.arrPtrE;
907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			for( jL = 0; jL < tmpCl1PtrL->sizeE; jL++ )
917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				sumL += matPtrL[ 0 ] * ( vecArrL[ jL ].xE - avgPtrL[ 0 ] );
937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				sumL += matPtrL[ 1 ] * ( vecArrL[ jL ].yE - avgPtrL[ 1 ] );
947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				avgPtrL += 2;
957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				matPtrL += 2;
967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			prjVecL[ iL ] = ( sumL + 128 ) >> 8;
987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		matPtrL = ptrA->pcaMatE.arrPtrE;
1017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		avgPtrL = ptrA->pcaAvgE.arrPtrE;
1027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		vecArrL = tmpCl1PtrL->vecArrE;
1037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* backward trafo */
1057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		for( jL = 0; jL < tmpCl1PtrL->sizeE; jL++ )
1067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
1077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 sumL = 0;
1087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			for( iL = 0; iL < ptrA->pcaDimSubSpaceE; iL++ )
1097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
1107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				sumL += matPtrL[ iL * matWidthL + 0 ] * prjVecL[ iL ];
1117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
1127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			vecArrL[ jL ].xE = ( ( sumL + 128 ) >> 8 ) + avgPtrL[ 0 ];
1147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			sumL = 0;
1167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			for( iL = 0; iL < ptrA->pcaDimSubSpaceE; iL++ )
1177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
1187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				sumL += matPtrL[ iL * matWidthL + 1 ] * prjVecL[ iL ];
1197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
1207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			vecArrL[ jL ].yE = ( ( sumL + 128 ) >> 8 ) + avgPtrL[ 1 ];
1227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			matPtrL += 2;
1247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			avgPtrL += 2;
1257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
1267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
1277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* ALT backtransformation */
1297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bts_IdCluster2D_copy( cpA, outClusterPtrA, &ptrA->pcaClusterE );
1307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bts_Cluster2D_copyTransform( cpA, &outClusterPtrA->clusterE, tmpCl1PtrL, bts_Flt16Alt2D_inverted( &altL ), outBbpL );
1317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
1327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
1347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
1367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
1377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ constructor / destructor } ----------------------------------- */
1387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
1397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
1407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
1427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_LocalScanDetector_init( struct bbs_Context* cpA,
1447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							     struct bbf_LocalScanDetector* ptrA )
1457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
1467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_memset16( ptrA->ftrPtrArrE, 0, bbs_SIZEOF16( ptrA->ftrPtrArrE ) );
1477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bts_RBFMap2D_init( cpA, &ptrA->rbfMapE );
1487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bts_Cluster2D_init( cpA, &ptrA->tmpCluster1E );
1497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bts_Cluster2D_init( cpA, &ptrA->tmpCluster2E );
1507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bts_Cluster2D_init( cpA, &ptrA->tmpCluster3E );
1517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bts_Cluster2D_init( cpA, &ptrA->tmpCluster4E );
1527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbf_LocalScanner_init( cpA, &ptrA->scannerE );
1537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_Int32Arr_init( cpA, &ptrA->actArrE );
1547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_Int16Arr_init( cpA, &ptrA->idxArrE );
1557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_UInt8Arr_init( cpA, &ptrA->workImageBufE );
1567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->maxImageWidthE = 0;
1577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->maxImageHeightE = 0;
1587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->patchWidthE = 0;
1607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->patchHeightE = 0;
1617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->scanWidthE = 0;
1627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->scanHeightE = 0;
1637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->scaleExpE = 0;
1647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->interpolatedWarpingE = TRUE;
1657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->warpScaleThresholdE = 0;
1667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bts_IdCluster2D_init( cpA, &ptrA->refClusterE );
1677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bts_Cluster2D_init( cpA, &ptrA->scanClusterE );
1687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_UInt16Arr_init( cpA, &ptrA->ftrDataArrE );
1697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbf_BitParam_init( cpA, &ptrA->bitParamE );
1707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->outlierDistanceE = 0;
1717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bts_IdCluster2D_init( cpA, &ptrA->pcaClusterE );
1727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_Int16Arr_init( cpA, &ptrA->pcaAvgE );
1737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_Int16Arr_init( cpA, &ptrA->pcaMatE );
1747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->pcaDimSubSpaceE = 0;
1757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->maxImageWidthE = 0;
1767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->maxImageHeightE = 0;
1777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
1787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
1807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_LocalScanDetector_exit( struct bbs_Context* cpA,
1827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							     struct bbf_LocalScanDetector* ptrA )
1837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
1847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint16 iL;
1857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	for( iL = 0; iL < ptrA->scanClusterE.sizeE; iL++ ) bbf_featureExit( cpA, ptrA->ftrPtrArrE[ iL ] );
1867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_memset16( ptrA->ftrPtrArrE, 0, bbs_SIZEOF16( ptrA->ftrPtrArrE ) );
1877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bts_RBFMap2D_exit( cpA, &ptrA->rbfMapE );
1897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bts_Cluster2D_exit( cpA, &ptrA->tmpCluster1E );
1907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bts_Cluster2D_exit( cpA, &ptrA->tmpCluster2E );
1917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bts_Cluster2D_exit( cpA, &ptrA->tmpCluster3E );
1927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bts_Cluster2D_exit( cpA, &ptrA->tmpCluster4E );
1937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbf_LocalScanner_exit( cpA, &ptrA->scannerE );
1947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_Int32Arr_exit( cpA, &ptrA->actArrE );
1957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_Int16Arr_exit( cpA, &ptrA->idxArrE );
1967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_UInt8Arr_exit( cpA, &ptrA->workImageBufE );
1977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->maxImageWidthE = 0;
1987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->maxImageHeightE = 0;
1997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->patchWidthE = 0;
2017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->patchHeightE = 0;
2027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->scanWidthE = 0;
2037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->scanHeightE = 0;
2047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->scaleExpE = 0;
2057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->interpolatedWarpingE = TRUE;
2067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->warpScaleThresholdE = 0;
2077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bts_IdCluster2D_exit( cpA, &ptrA->refClusterE );
2087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bts_Cluster2D_exit( cpA, &ptrA->scanClusterE );
2097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_UInt16Arr_exit( cpA, &ptrA->ftrDataArrE );
2107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbf_BitParam_exit( cpA, &ptrA->bitParamE );
2117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->outlierDistanceE = 0;
2127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bts_IdCluster2D_exit( cpA, &ptrA->pcaClusterE );
2137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_Int16Arr_exit( cpA, &ptrA->pcaAvgE );
2147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_Int16Arr_exit( cpA, &ptrA->pcaMatE );
2157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->pcaDimSubSpaceE = 0;
2167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->maxImageWidthE = 0;
2177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->maxImageHeightE = 0;
2187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
2197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
2217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
2237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
2247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ operators } -------------------------------------------------- */
2257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
2267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
2277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
2297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_LocalScanDetector_copy( struct bbs_Context* cpA,
2317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						    struct bbf_LocalScanDetector* ptrA,
2327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						    const struct bbf_LocalScanDetector* srcPtrA )
2337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
2347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_ERROR0( "bbf_LocalScanDetector_copy:\n Function is not available" );
2357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
2367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
2387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectflag bbf_LocalScanDetector_equal( struct bbs_Context* cpA,
2407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						     const struct bbf_LocalScanDetector* ptrA,
2417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						     const struct bbf_LocalScanDetector* srcPtrA )
2427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
2437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_ERROR0( "bbf_LocalScanDetector_equal:\n Function is not available" );
2447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return TRUE;
2457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
2467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
2487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
2507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
2517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ query functions } -------------------------------------------- */
2527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
2537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
2547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
2567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
2587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
2597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ modify functions } ------------------------------------------- */
2607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
2617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
2627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
2647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
2667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
2677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ I/O } -------------------------------------------------------- */
2687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
2697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
2707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
2727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bbf_LocalScanDetector_memSize( struct bbs_Context* cpA,
2747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project								      const struct bbf_LocalScanDetector* ptrA )
2757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
2767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 iL;
2777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 memSizeL = bbs_SIZEOF16( uint32 ) +
2787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					  bbs_SIZEOF16( uint32 ); /* version */
2797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memSizeL += bbs_SIZEOF16( ptrA->patchWidthE );
2817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memSizeL += bbs_SIZEOF16( ptrA->patchHeightE );
2827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memSizeL += bbs_SIZEOF16( ptrA->scanWidthE );
2837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memSizeL += bbs_SIZEOF16( ptrA->scanHeightE );
2847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memSizeL += bbs_SIZEOF16( ptrA->scaleExpE );
2857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memSizeL += bbs_SIZEOF16( ptrA->interpolatedWarpingE );
2867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memSizeL += bbs_SIZEOF16( ptrA->warpScaleThresholdE );
2877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memSizeL += bts_IdCluster2D_memSize( cpA, &ptrA->refClusterE );
2887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memSizeL += bts_Cluster2D_memSize( cpA, &ptrA->scanClusterE );
2897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memSizeL += bbf_BitParam_memSize( cpA, &ptrA->bitParamE );
2907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memSizeL += bbs_SIZEOF16( ptrA->outlierDistanceE );
2917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memSizeL += bts_IdCluster2D_memSize( cpA, &ptrA->pcaClusterE );
2927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memSizeL += bbs_Int16Arr_memSize( cpA, &ptrA->pcaAvgE );
2937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memSizeL += bbs_Int16Arr_memSize( cpA, &ptrA->pcaMatE );
2947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memSizeL += bbs_SIZEOF16( ptrA->pcaDimSubSpaceE );
2957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memSizeL += bbs_SIZEOF16( ptrA->maxImageWidthE );
2967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memSizeL += bbs_SIZEOF16( ptrA->maxImageHeightE );
2977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	for( iL = 0; iL < ptrA->scanClusterE.sizeE; iL++ ) memSizeL += bbf_featureMemSize( cpA, ptrA->ftrPtrArrE[ iL ] );
2987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return memSizeL;
3007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
3017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
3037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bbf_LocalScanDetector_memWrite( struct bbs_Context* cpA,
3057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project									   const struct bbf_LocalScanDetector* ptrA,
3067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project									   uint16* memPtrA )
3077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
3087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 iL;
3097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 memSizeL = bbf_LocalScanDetector_memSize( cpA, ptrA );
3107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWrite32( &memSizeL, memPtrA );
3117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWriteUInt32( bbf_LOCAL_SCAN_DETECTOR_VERSION, memPtrA );
3127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWrite32( &ptrA->patchWidthE, memPtrA );
3147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWrite32( &ptrA->patchHeightE, memPtrA );
3157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWrite32( &ptrA->scanWidthE, memPtrA );
3167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWrite32( &ptrA->scanHeightE, memPtrA );
3177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWrite32( &ptrA->scaleExpE, memPtrA );
3187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWrite32( &ptrA->interpolatedWarpingE, memPtrA );
3197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWrite32( &ptrA->warpScaleThresholdE, memPtrA );
3207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bts_IdCluster2D_memWrite( cpA, &ptrA->refClusterE, memPtrA );
3217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bts_Cluster2D_memWrite( cpA, &ptrA->scanClusterE, memPtrA );
3227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbf_BitParam_memWrite( cpA, &ptrA->bitParamE, memPtrA );
3237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWrite32( &ptrA->outlierDistanceE, memPtrA );
3247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bts_IdCluster2D_memWrite( cpA, &ptrA->pcaClusterE, memPtrA );
3257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_Int16Arr_memWrite( cpA, &ptrA->pcaAvgE, memPtrA );
3267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_Int16Arr_memWrite( cpA, &ptrA->pcaMatE, memPtrA );
3277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWrite32( &ptrA->pcaDimSubSpaceE, memPtrA );
3287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWrite32( &ptrA->maxImageWidthE, memPtrA );
3297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWrite32( &ptrA->maxImageHeightE, memPtrA );
3307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	for( iL = 0; iL < ptrA->scanClusterE.sizeE; iL++ ) memPtrA += bbf_featureMemWrite( cpA, ptrA->ftrPtrArrE[ iL ], memPtrA );
3327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return memSizeL;
3347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
3357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
3377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bbf_LocalScanDetector_memRead( struct bbs_Context* cpA,
3397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project									  struct bbf_LocalScanDetector* ptrA,
3407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project									  const uint16* memPtrA,
3417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project									  struct bbs_MemTbl* mtpA )
3427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
3437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 iL;
3447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 memSizeL, versionL;
3457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	struct bbs_MemTbl memTblL = *mtpA;
3467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	struct bbs_MemSeg* espL = bbs_MemTbl_segPtr( cpA, &memTblL, 0 );
3477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	struct bbs_MemSeg* sspL = bbs_MemTbl_sharedSegPtr( cpA, &memTblL, 0 );
3487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( bbs_Context_error( cpA ) ) return 0;
3497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memRead32( &memSizeL, memPtrA );
3517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memReadVersion32( cpA, &versionL, bbf_LOCAL_SCAN_DETECTOR_VERSION, memPtrA );
3527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memRead32( &ptrA->patchWidthE, memPtrA );
3557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memRead32( &ptrA->patchHeightE, memPtrA );
3567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memRead32( &ptrA->scanWidthE, memPtrA );
3577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memRead32( &ptrA->scanHeightE, memPtrA );
3587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memRead32( &ptrA->scaleExpE, memPtrA );
3597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memRead32( &ptrA->interpolatedWarpingE, memPtrA );
3607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memRead32( &ptrA->warpScaleThresholdE, memPtrA );
3617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bts_IdCluster2D_memRead( cpA, &ptrA->refClusterE, memPtrA, espL );
3627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bts_Cluster2D_memRead( cpA, &ptrA->scanClusterE, memPtrA, espL );
3637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbf_BitParam_memRead( cpA, &ptrA->bitParamE, memPtrA );
3647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memRead32( &ptrA->outlierDistanceE, memPtrA );
3657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bts_IdCluster2D_memRead( cpA, &ptrA->pcaClusterE, memPtrA, espL );
3667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_Int16Arr_memRead( cpA, &ptrA->pcaAvgE, memPtrA, espL );
3677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_Int16Arr_memRead( cpA, &ptrA->pcaMatE, memPtrA, espL );
3687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memRead32( &ptrA->pcaDimSubSpaceE, memPtrA );
3697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memRead32( &ptrA->maxImageWidthE, memPtrA );
3707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memRead32( &ptrA->maxImageHeightE, memPtrA );
3717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* check features & allocate data buffer */
3737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
3747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		const uint16* memPtrL = memPtrA;
3757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 dataSizeL = 0;
3767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		for( iL = 0; iL < ptrA->scanClusterE.sizeE; iL++ )
3777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
3787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			enum bbf_FeatureType typeL = ( enum bbf_FeatureType )bbs_memPeek32( memPtrL + 4 );
3797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			dataSizeL += bbf_featureSizeOf16( cpA, typeL );
3807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			memPtrL += bbs_memPeek32( memPtrL );
3817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
3827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bbs_UInt16Arr_create( cpA, &ptrA->ftrDataArrE, dataSizeL, espL );
3837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
3847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* load features & initialize pointers */
3867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
3877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint16* dataPtrL = ptrA->ftrDataArrE.arrPtrE;
3887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		for( iL = 0; iL < ptrA->scanClusterE.sizeE; iL++ )
3897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
3907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			enum bbf_FeatureType typeL = ( enum bbf_FeatureType )bbs_memPeek32( memPtrA + 4 );
3917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			ptrA->ftrPtrArrE[ iL ] = ( struct bbf_Feature* )dataPtrL;
3927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			bbf_featureInit( cpA, ptrA->ftrPtrArrE[ iL ], typeL );
3937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			memPtrA += bbf_featureMemRead( cpA, ptrA->ftrPtrArrE[ iL ], memPtrA, &memTblL );
3947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			dataPtrL += bbf_featureSizeOf16( cpA, typeL );
3957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
3967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
3977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( memSizeL != bbf_LocalScanDetector_memSize( cpA, ptrA ) )
3997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
4007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bbs_ERR0( bbs_ERR_CORRUPT_DATA, "uint32 bbf_LocalScanDetector_memRead( struct bem_ScanGradientMove* ptrA, const uint16* memPtrA ):\n"
4017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			        "size mismatch" );
4027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		return 0;
4037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
4047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( ptrA->maxImageWidthE * ptrA->maxImageHeightE == 0 )
4067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
4077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bbs_ERR0( bbs_ERR_CORRUPT_DATA, "uint32 bbf_LocalScanDetector_memRead( struct bem_ScanGradientMove* ptrA, const uint16* memPtrA ):\n"
4087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project								        "maximum image width/height not set" );
4097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		return 0;
4107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
4117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* initialize internal data */
4137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* ought to be placed on shared memory later */
4157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bts_RBFMap2D_create( cpA, &ptrA->rbfMapE, bpi_LOCAL_SCAN_DETECTOR_MAX_CLUSTER_SIZE, sspL );
4167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->rbfMapE.RBFTypeE = bts_RBF_LINEAR;
4177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->rbfMapE.altTypeE = bts_ALT_RIGID;
4187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bts_Cluster2D_create( cpA, &ptrA->tmpCluster1E, bpi_LOCAL_SCAN_DETECTOR_MAX_CLUSTER_SIZE, sspL );
4207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bts_Cluster2D_create( cpA, &ptrA->tmpCluster2E, bpi_LOCAL_SCAN_DETECTOR_MAX_CLUSTER_SIZE, sspL );
4217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bts_Cluster2D_create( cpA, &ptrA->tmpCluster3E, bpi_LOCAL_SCAN_DETECTOR_MAX_CLUSTER_SIZE, sspL );
4227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bts_Cluster2D_create( cpA, &ptrA->tmpCluster4E, bpi_LOCAL_SCAN_DETECTOR_MAX_CLUSTER_SIZE, sspL );
4237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_Int32Arr_create( cpA, &ptrA->actArrE, bpi_LOCAL_SCAN_DETECTOR_MAX_CLUSTER_SIZE, sspL );
4257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_Int16Arr_create( cpA, &ptrA->idxArrE, bpi_LOCAL_SCAN_DETECTOR_MAX_CLUSTER_SIZE, sspL );
4267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* working image memory */
4287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* ought to be placed on shared memory later */
4297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_UInt8Arr_create( cpA, &ptrA->workImageBufE, ptrA->maxImageWidthE * ptrA->maxImageHeightE, sspL );
4307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* initialize local scanner (be aware of shared memory usage when moving this create function) */
4327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbf_LocalScanner_create( cpA, &ptrA->scannerE,
4337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							 ptrA->patchWidthE,
4347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							 ptrA->patchHeightE,
4357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							 ptrA->scaleExpE,
4367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							 ptrA->maxImageWidthE,
4377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							 ptrA->maxImageHeightE,
4387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							 ptrA->scaleExpE,
4397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							 ptrA->bitParamE.outerRadiusE,
4407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							 &memTblL );
4417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return memSizeL;
4437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
4447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
4467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
4487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
4497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ exec functions } --------------------------------------------- */
4507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
4517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
4527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
4547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectint32 bbf_LocalScanDetector_process( struct bbs_Context* cpA,
4567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project									 const struct bbf_LocalScanDetector* ptrA,
4577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project                                     uint8* imagePtrA,
4587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project									 uint32 imageWidthA,
4597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project									 uint32 imageHeightA,
4607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project									 const struct bts_Int16Vec2D*  offsPtrA,
4617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project									 const struct bts_IdCluster2D* inClusterPtrA,
4627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project									 struct bts_IdCluster2D* outClusterPtrA )
4637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
4647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_DEF_fNameL( "bbf_LocalScanDetector_process" )
4657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 pw0L = ptrA->patchWidthE;
4677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 ph0L = ptrA->patchHeightE;
4687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 pw1L = pw0L << ptrA->scaleExpE;
4697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 ph1L = ph0L << ptrA->scaleExpE;
4707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	struct bts_Cluster2D* wrkClPtrL  = ( struct bts_Cluster2D* )&ptrA->tmpCluster1E;
4727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	struct bts_Cluster2D* refClPtrL  = ( struct bts_Cluster2D* )&ptrA->tmpCluster2E;
4737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	struct bts_Cluster2D* dstClPtrL  = ( struct bts_Cluster2D* )&ptrA->tmpCluster3E;
4747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	struct bts_Cluster2D* tmpClPtrL  = ( struct bts_Cluster2D* )&ptrA->tmpCluster4E;
4757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	struct bts_RBFMap2D*  rbfPtrL    = ( struct bts_RBFMap2D* )&ptrA->rbfMapE;
4767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	struct bbf_LocalScanner* scnPtrL = ( struct bbf_LocalScanner* )&ptrA->scannerE;
4777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32* actArrL = ( int32* )ptrA->actArrE.arrPtrE;
4797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int16* idxArrL = ( int16* )ptrA->idxArrE.arrPtrE;
4807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 workImageWidthL, workImageHeightL;
4827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	struct bts_Flt16Alt2D altL;
4847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 confidenceL;
4867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 iL;
4877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 sizeL = ptrA->scanClusterE.sizeE;
4887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( sizeL > bpi_LOCAL_SCAN_DETECTOR_MAX_CLUSTER_SIZE )
4907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
4917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bbs_ERROR1( "%s:\nScan cluster size exceeds bpi_LOCAL_SCAN_DETECTOR_MAX_CLUSTER_SIZE", fNameL );
4927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		return 0;
4937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
4947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* compute equivalent clusters (matching ids) from input and reference cluster */
4967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bts_IdCluster2D_convertToEqivalentClusters( cpA, inClusterPtrA, &ptrA->refClusterE, wrkClPtrL, refClPtrL );
4977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* altL: orig image -> normalized image */
4997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	altL = bts_Cluster2D_alt( cpA, wrkClPtrL, refClPtrL, bts_ALT_RIGID );
5007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* transorm work cluster to normalized image */
5027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bts_Cluster2D_transformBbp( cpA, wrkClPtrL, altL, 6 );
5037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* map: ref cluster -> work cluster */
5057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bts_RBFMap2D_compute( cpA, rbfPtrL, refClPtrL, wrkClPtrL );
5067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* copy: scanClusterE -> work cluster */
5087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bts_Cluster2D_copy( cpA, wrkClPtrL, &ptrA->scanClusterE );
5097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* copy: refClusterE -> ref cluster */
5117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bts_Cluster2D_copy( cpA, refClPtrL, &ptrA->refClusterE.clusterE );
5127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* apply map to work cluster */
5147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bts_Cluster2D_rbfTransform( cpA, wrkClPtrL, rbfPtrL );
5157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* apply map to ref cluster */
5177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bts_Cluster2D_rbfTransform( cpA, refClPtrL, rbfPtrL );
5187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
5207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* analyze boundaries; get exact dimensions of working image */
5217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 workBorderWL = ( ( ptrA->scanWidthE  + pw1L + 1 ) >> 1 ) + 1; /* add a pixel to ensure full search area */
5227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 workBorderHL = ( ( ptrA->scanHeightE + ph1L + 1 ) >> 1 ) + 1; /* add a pixel to ensure full search area */
5237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		struct bts_Int16Rect workAreaL = bts_Cluster2D_boundingBox( cpA, wrkClPtrL );
5247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		workAreaL.x1E = workAreaL.x1E >> wrkClPtrL->bbpE;
5257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		workAreaL.y1E = workAreaL.y1E >> wrkClPtrL->bbpE;
5267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		workAreaL.x2E = workAreaL.x2E >> wrkClPtrL->bbpE;
5277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		workAreaL.y2E = workAreaL.y2E >> wrkClPtrL->bbpE;
5287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		workAreaL.x1E -= workBorderWL;
5297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		workAreaL.y1E -= workBorderHL;
5307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		workAreaL.x2E += workBorderWL;
5317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		workAreaL.y2E += workBorderHL;
5327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		workImageWidthL  = workAreaL.x2E - workAreaL.x1E;
5347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		workImageHeightL = workAreaL.y2E - workAreaL.y1E;
5357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* truncate if necessary (should not occur in normal operation) */
5377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		workImageWidthL = workImageWidthL > ptrA->maxImageWidthE ? ptrA->maxImageWidthE : workImageWidthL;
5387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		workImageHeightL = workImageHeightL > ptrA->maxImageHeightE ? ptrA->maxImageHeightE : workImageHeightL;
5397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* adjust ALT */
5417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		altL.vecE.xE -= workAreaL.x1E << altL.vecE.bbpE;
5427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		altL.vecE.yE -= workAreaL.y1E << altL.vecE.bbpE;
5437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* adjust work cluster */
5457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		for( iL = 0; iL < wrkClPtrL->sizeE; iL++ )
5467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
5477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			wrkClPtrL->vecArrE[ iL ].xE -= workAreaL.x1E << wrkClPtrL->bbpE;
5487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			wrkClPtrL->vecArrE[ iL ].yE -= workAreaL.y1E << wrkClPtrL->bbpE;
5497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
5507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* adjust ref cluster */
5527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		for( iL = 0; iL < wrkClPtrL->sizeE; iL++ )
5537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
5547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			refClPtrL->vecArrE[ iL ].xE -= workAreaL.x1E << refClPtrL->bbpE;
5557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			refClPtrL->vecArrE[ iL ].yE -= workAreaL.y1E << refClPtrL->bbpE;
5567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
5577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* transform image */
5597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bim_filterWarp( cpA,
5607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					    ptrA->workImageBufE.arrPtrE,
5617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						imagePtrA, imageWidthA, imageHeightA,
5627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						offsPtrA,
5637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						&altL,
5647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						workImageWidthL, workImageHeightL,
5657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						NULL,
5667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						ptrA->warpScaleThresholdE,
5677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						ptrA->interpolatedWarpingE );
5687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
5707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* scan over all positions of work cluster; target positions are stored in *dstClPtrL*/
5727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
5737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 regionWHL = ( ptrA->scanWidthE  + pw1L + 1 ) >> 1;
5747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 regionHHL = ( ptrA->scanHeightE + ph1L + 1 ) >> 1;
5757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		struct bts_Int16Vec2D* srcVecArrL = wrkClPtrL->vecArrE;
5767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		struct bts_Int16Vec2D* dstVecArrL = dstClPtrL->vecArrE;
5777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 vecBbpL = wrkClPtrL->bbpE;
5787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bts_Cluster2D_size( cpA, dstClPtrL, sizeL );
5797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		dstClPtrL->bbpE = vecBbpL;
5807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* initialize scanner */
5827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		scnPtrL->patchWidthE = ptrA->patchWidthE;
5837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		scnPtrL->patchHeightE = ptrA->patchWidthE;
5847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		scnPtrL->scaleExpE = ptrA->scaleExpE;
5857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bbf_LocalScanner_assign( cpA, scnPtrL, ptrA->workImageBufE.arrPtrE, workImageWidthL, workImageHeightL, &ptrA->bitParamE );
5877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bbs_memset32( actArrL, 0x80000000, sizeL );
5897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		do
5917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
5927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			for( iL = 0; iL < sizeL; iL++ )
5937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
5947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				int32 bestActL = 0x80000000;
5957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				uint32 bestIdxL = 0;
5967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				struct bbf_Feature* ftrPtrL = ptrA->ftrPtrArrE[ iL ];
5977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				/* set scan region */
5997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
6007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					int32 x0L = ( ( wrkClPtrL->vecArrE[ iL ].xE >> ( wrkClPtrL->bbpE - 1 ) ) + 1 ) >> 1;
6017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					int32 y0L = ( ( wrkClPtrL->vecArrE[ iL ].yE >> ( wrkClPtrL->bbpE - 1 ) ) + 1 ) >> 1;
6027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					struct bts_Int16Rect scanRegionL = bts_Int16Rect_create( x0L - regionWHL, y0L - regionHHL, x0L + regionWHL, y0L + regionHHL );
6037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					bbf_LocalScanner_origScanRegion( cpA, scnPtrL, &scanRegionL );
6047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
6057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				do
6077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
6087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					int32 actL = ftrPtrL->vpActivityE( ftrPtrL, bbf_LocalScanner_getPatch( scnPtrL ) );
6097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					if( actL > bestActL )
6117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					{
6127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						bestActL = actL;
6137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						bestIdxL = bbf_LocalScanner_scanIndex( scnPtrL );
6147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					}
6157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
6167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				while( bbf_LocalScanner_next( cpA, scnPtrL ) );
6177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
6197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					int32 xL, yL; /* 16.16 */
6207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					bbf_LocalScanner_idxPos( scnPtrL, bestIdxL, &xL, &yL );
6217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					xL += pw1L << 15;
6227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					yL += ph1L << 15;
6237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					if( bestActL > actArrL[ iL ] )
6247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					{
6257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						dstVecArrL[ iL ].xE = ( ( xL >> ( 15 - vecBbpL ) ) + 1 ) >> 1;
6267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						dstVecArrL[ iL ].yE = ( ( yL >> ( 15 - vecBbpL ) ) + 1 ) >> 1;
6277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						actArrL[ iL ] = bestActL;
6287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					}
6297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
6307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
6317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
6327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		while( bbf_LocalScanner_nextOffset( cpA, scnPtrL ) );
6337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* outlier analysis: outliers are disabled by setting their similarity to -1 */
6357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( ptrA->outlierDistanceE > 0 )
6367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
6377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* altL: work cluster -> ref cluster */
6387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			struct bts_Flt16Alt2D localAltL = bts_Cluster2D_alt( cpA, wrkClPtrL, dstClPtrL, bts_ALT_RIGID );
6397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* squared distance 16.16 */
6417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			uint32 dist2L = ( ptrA->outlierDistanceE >> 8 ) * ( ptrA->outlierDistanceE >> 8 );
6427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* analyze deviations */
6447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			for( iL = 0; iL < sizeL; iL++ )
6457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
6467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				struct bts_Flt16Vec2D vecL = bts_Flt16Vec2D_create32( srcVecArrL[ iL ].xE, srcVecArrL[ iL ].yE, vecBbpL );
6477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				uint32 dev2L; /* squared deviation 16.16 */
6487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				vecL = bts_Flt16Alt2D_mapFlt( &localAltL, &vecL );
6497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				vecL = bts_Flt16Vec2D_sub( vecL, bts_Flt16Vec2D_create32( dstVecArrL[ iL ].xE, dstVecArrL[ iL ].yE, vecBbpL ) );
6507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				dev2L = bbs_convertU32( bts_Flt16Vec2D_norm2( &vecL ), vecL.bbpE << 1, 16 );
6517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				if( dev2L > dist2L ) actArrL[ iL ] = 0xF0000000;
6527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
6537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
6547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* remove undetected positions but keep at least 1/2 best positions */
6567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
6577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			flag sortedL;
6587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* bubble sort (no speed issue in this case) */
6607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			for( iL = 0; iL < sizeL; iL++ ) idxArrL[ iL ] = iL;
6617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			do
6637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
6647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				sortedL = TRUE;
6657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				for( iL = 1; iL < sizeL; iL++ )
6667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
6677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					if( actArrL[ idxArrL[ iL - 1 ] ] < actArrL[ idxArrL[ iL ] ] )
6687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					{
6697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						int16 tmpL = idxArrL[ iL - 1 ];
6707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						idxArrL[ iL - 1 ] = idxArrL[ iL ];
6717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						idxArrL[ iL ] = tmpL;
6727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						sortedL = FALSE;
6737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					}
6747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
6757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
6767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			while( !sortedL );
6777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6784822232d5ca3f9d0e4f4326ebee5fb1c8bebcf0fColin Cross			for( iL = ( sizeL >> 1 ); iL < sizeL && actArrL[ idxArrL[ iL ] ] >= 0; iL++ )
6794822232d5ca3f9d0e4f4326ebee5fb1c8bebcf0fColin Cross				;
6807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
6827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				uint32 subSizeL = iL;
6837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				/* reorder clusters */
6857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				bts_Cluster2D_size( cpA, tmpClPtrL, subSizeL );
6867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
6877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					struct bts_Int16Vec2D* tmpVecArrL = tmpClPtrL->vecArrE;
6887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					for( iL = 0; iL < subSizeL; iL++ ) tmpVecArrL[ iL ] = srcVecArrL[ idxArrL[ iL ] ];
6897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					for( iL = 0; iL < subSizeL; iL++ ) srcVecArrL[ iL ] = tmpVecArrL[ iL ];
6907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					for( iL = 0; iL < subSizeL; iL++ ) tmpVecArrL[ iL ] = dstVecArrL[ idxArrL[ iL ] ];
6917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					for( iL = 0; iL < subSizeL; iL++ ) dstVecArrL[ iL ] = tmpVecArrL[ iL ];
6927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
6937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				bts_Cluster2D_size( cpA, wrkClPtrL, subSizeL );
6947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				bts_Cluster2D_size( cpA, dstClPtrL, subSizeL );
6957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
6967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
6977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* compute confidence */
6997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
7007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int16* idxArrL = ptrA->idxArrE.arrPtrE;
7017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32* actArrL = ptrA->actArrE.arrPtrE;
7027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 actSumL = 0; /* .20 */
7037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			for( iL = 0; iL < sizeL; iL++ )
7047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
7057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				float actL = ( actArrL[ idxArrL[ iL ] ] + 128 ) >> 8;
7067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				if( actL < 0 ) break;
7077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				actSumL += actL;
7087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
7097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* actSumL = average positive activity */
7117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			actSumL = ( iL > 0 ) ? actSumL / iL : 0;
7127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			confidenceL = ( ( ( int32 )iL << 20 ) - ( ( ( int32 )1 << 20 ) - actSumL ) ) / sizeL;
7147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* adjust to 4.28 */
7167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			confidenceL <<= 8;
7177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
7187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
7207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* map: wrkCluster -> dstCluster */
7227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bts_RBFMap2D_compute( cpA, rbfPtrL, wrkClPtrL, dstClPtrL );
7237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* apply map to ref cluster */
7257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bts_Cluster2D_rbfTransform( cpA, refClPtrL, rbfPtrL );
7267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* copy ref cluster to outCluster */
7287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bts_Cluster2D_copy( cpA, &outClusterPtrA->clusterE, refClPtrL );
7297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_Int16Arr_copy( cpA, &outClusterPtrA->idArrE, &ptrA->refClusterE.idArrE );
7307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* PCA Mapping */
7327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( ptrA->pcaDimSubSpaceE > 0 )
7337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
7347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bbf_LocalScanDetector_pcaMap( cpA, ptrA, outClusterPtrA, outClusterPtrA );
7357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
7367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* backtransform out cluster to original image */
7387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bts_Cluster2D_transformBbp( cpA, &outClusterPtrA->clusterE, bts_Flt16Alt2D_inverted( &altL ), inClusterPtrA->clusterE.bbpE );
7397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return confidenceL;
7417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
7427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
7447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
7467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
747