13ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
23ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * Copyright (C) 2008 The Android Open Source Project
33ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *
43ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * Licensed under the Apache License, Version 2.0 (the "License");
53ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * you may not use this file except in compliance with the License.
63ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * You may obtain a copy of the License at
73ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *
83ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *      http://www.apache.org/licenses/LICENSE-2.0
93ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *
103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * Unless required by applicable law or agreed to in writing, software
113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * distributed under the License is distributed on an "AS IS" BASIS,
123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * See the License for the specific language governing permissions and
143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * limitations under the License.
153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */
163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* ---- includes ----------------------------------------------------------- */
18de984cdc3631106b1cbbb8d3972b76a0fc27e8e8cristy
193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "b_BasicEm/Functions.h"
203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "b_BasicEm/Math.h"
213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "b_BitFeatureEm/ScanDetector.h"
227ce65e7125a4e1df1a274ce373c537a9df9c16cdCristy
233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* ------------------------------------------------------------------------- */
243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* ========================================================================= */
263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*                                                                           */
273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* ---- \ghd{ auxiliary functions } ---------------------------------------- */
283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*                                                                           */
293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* ========================================================================= */
303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* ------------------------------------------------------------------------- */
323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* ========================================================================= */
343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*                                                                           */
353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* ---- \ghd{ constructor / destructor } ----------------------------------- */
363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*                                                                           */
373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* ========================================================================= */
383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* ------------------------------------------------------------------------- */
403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
413ed852eea50f9d4cd633efb8c2b054b8e33c253cristyvoid bbf_ScanDetector_init( struct bbs_Context* cpA,
423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy						    struct bbf_ScanDetector* ptrA )
433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy	uint32 iL;
454c08aed51c5899665ade97263692328eea4af106cristy
4699dc036190f292a67801dc4b141898bf18c96b36cristy	ptrA->minScaleE = 0;
474c08aed51c5899665ade97263692328eea4af106cristy	ptrA->maxScaleE = 0;
487d4aa38318c20a4309d855f45e3744c9f300f697cristy	ptrA->maxImageWidthE = 0;
494c08aed51c5899665ade97263692328eea4af106cristy	ptrA->maxImageHeightE = 0;
504c08aed51c5899665ade97263692328eea4af106cristy	bbf_Scanner_init( cpA, &ptrA->scannerE );
514c08aed51c5899665ade97263692328eea4af106cristy
524c08aed51c5899665ade97263692328eea4af106cristy	ptrA->patchWidthE = 0;
534c08aed51c5899665ade97263692328eea4af106cristy	ptrA->patchHeightE = 0;
544c08aed51c5899665ade97263692328eea4af106cristy	ptrA->minDefScaleE = 0;
554c08aed51c5899665ade97263692328eea4af106cristy	ptrA->maxDefScaleE = 0;
564c08aed51c5899665ade97263692328eea4af106cristy	ptrA->scaleStepE = 0;
571042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy	ptrA->overlapThrE = 0;
584c08aed51c5899665ade97263692328eea4af106cristy	ptrA->borderWidthE = 0;
5999dc036190f292a67801dc4b141898bf18c96b36cristy	ptrA->borderHeightE = 0;
604c08aed51c5899665ade97263692328eea4af106cristy	ptrA->featuresE = 0;
614c08aed51c5899665ade97263692328eea4af106cristy	for( iL = 0; iL < bbf_SCAN_DETECTOR_MAX_FEATURES; iL++ ) bbf_BitParam_init( cpA, &ptrA->bitParamArrE[ iL ] );
62ac245f8a51ea65b085d751c41d8ca4b426bdfe5bcristy	for( iL = 0; iL < bbf_SCAN_DETECTOR_MAX_FEATURES; iL++ ) bbf_Sequence_init( cpA, &ptrA->featureArrE[ iL ] );
6334b78eacf3bef963cade67c70f5f12785b9fe702cristy	bts_IdCluster2D_init( cpA, &ptrA->refClusterE );
644c08aed51c5899665ade97263692328eea4af106cristy	ptrA->refDistanceE = 10;
653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
6656ed31cc763800a9fb1f0df96104c354b40d2cbccristy
673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* ------------------------------------------------------------------------- */
6847b022b2592e21e468c453ad44f550b62f77b2cbcristy
6947b022b2592e21e468c453ad44f550b62f77b2cbcristyvoid bbf_ScanDetector_exit( struct bbs_Context* cpA,
7047b022b2592e21e468c453ad44f550b62f77b2cbcristy						    struct bbf_ScanDetector* ptrA )
7156ed31cc763800a9fb1f0df96104c354b40d2cbccristy{
7247b022b2592e21e468c453ad44f550b62f77b2cbcristy	uint32 iL;
7347b022b2592e21e468c453ad44f550b62f77b2cbcristy
744da3ba3eedd349b48f5c8bbb9f15faee04f6e09fcristy	ptrA->minScaleE = 0;
7547b022b2592e21e468c453ad44f550b62f77b2cbcristy	ptrA->maxScaleE = 0;
7647b022b2592e21e468c453ad44f550b62f77b2cbcristy	ptrA->maxImageWidthE = 0;
7756ed31cc763800a9fb1f0df96104c354b40d2cbccristy	ptrA->maxImageHeightE = 0;
7856ed31cc763800a9fb1f0df96104c354b40d2cbccristy	bbf_Scanner_exit( cpA, &ptrA->scannerE );
7947b022b2592e21e468c453ad44f550b62f77b2cbcristy
8047b022b2592e21e468c453ad44f550b62f77b2cbcristy	ptrA->patchWidthE = 0;
8147b022b2592e21e468c453ad44f550b62f77b2cbcristy	ptrA->patchHeightE = 0;
823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy	ptrA->minDefScaleE = 0;
833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy	ptrA->maxDefScaleE = 0;
843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy	ptrA->scaleStepE = 0;
853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy	ptrA->overlapThrE = 0;
863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy	ptrA->borderWidthE = 0;
873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy	ptrA->borderHeightE = 0;
883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy	ptrA->featuresE = 0;
89d3090f92b8f346df0a8191d5aa3f9d14be5a32d5cristy	for( iL = 0; iL < bbf_SCAN_DETECTOR_MAX_FEATURES; iL++ ) bbf_BitParam_exit( cpA, &ptrA->bitParamArrE[ iL ] );
903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy	for( iL = 0; iL < bbf_SCAN_DETECTOR_MAX_FEATURES; iL++ ) bbf_Sequence_exit( cpA, &ptrA->featureArrE[ iL ] );
913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy	bts_IdCluster2D_exit( cpA, &ptrA->refClusterE );
923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy	ptrA->refDistanceE = 0;
933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
95bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy/* ------------------------------------------------------------------------- */
963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* ========================================================================= */
983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*                                                                           */
99bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy/* ---- \ghd{ operators } -------------------------------------------------- */
1003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*                                                                           */
1013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* ========================================================================= */
1023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* ------------------------------------------------------------------------- */
1043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1053ed852eea50f9d4cd633efb8c2b054b8e33c253cristyvoid bbf_ScanDetector_copy( struct bbs_Context* cpA,
1063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy						    struct bbf_ScanDetector* ptrA,
107790190d9d1e6f011220d0003ce5b51063f0ab417cristy						    const struct bbf_ScanDetector* srcPtrA )
108790190d9d1e6f011220d0003ce5b51063f0ab417cristy{
109790190d9d1e6f011220d0003ce5b51063f0ab417cristy	bbs_ERROR0( "bbf_ScanDetector_copy:\n Function is not available" );
110790190d9d1e6f011220d0003ce5b51063f0ab417cristy}
111790190d9d1e6f011220d0003ce5b51063f0ab417cristy
112790190d9d1e6f011220d0003ce5b51063f0ab417cristy/* ------------------------------------------------------------------------- */
113790190d9d1e6f011220d0003ce5b51063f0ab417cristy
114790190d9d1e6f011220d0003ce5b51063f0ab417cristyflag bbf_ScanDetector_equal( struct bbs_Context* cpA,
115790190d9d1e6f011220d0003ce5b51063f0ab417cristy						     const struct bbf_ScanDetector* ptrA,
116790190d9d1e6f011220d0003ce5b51063f0ab417cristy						     const struct bbf_ScanDetector* srcPtrA )
117790190d9d1e6f011220d0003ce5b51063f0ab417cristy{
1184167f3a934b7c75a501ac7b4f1ceaf3e1bb192fdcristy	bbs_ERROR0( "bbf_ScanDetector_equal:\n Function is not available" );
1194167f3a934b7c75a501ac7b4f1ceaf3e1bb192fdcristy	return TRUE;
120790190d9d1e6f011220d0003ce5b51063f0ab417cristy}
121790190d9d1e6f011220d0003ce5b51063f0ab417cristy
122790190d9d1e6f011220d0003ce5b51063f0ab417cristy/* ------------------------------------------------------------------------- */
123790190d9d1e6f011220d0003ce5b51063f0ab417cristy
124790190d9d1e6f011220d0003ce5b51063f0ab417cristy/* ========================================================================= */
1252e035cd272c0993d28f757f4a913070170095939Cristy/*                                                                           */
126790190d9d1e6f011220d0003ce5b51063f0ab417cristy/* ---- \ghd{ query functions } -------------------------------------------- */
127790190d9d1e6f011220d0003ce5b51063f0ab417cristy/*                                                                           */
128790190d9d1e6f011220d0003ce5b51063f0ab417cristy/* ========================================================================= */
129790190d9d1e6f011220d0003ce5b51063f0ab417cristy
130220c4d505bfb9cf557e8ec1616d7cdc0596379b8cristy/* ------------------------------------------------------------------------- */
131220c4d505bfb9cf557e8ec1616d7cdc0596379b8cristy
132790190d9d1e6f011220d0003ce5b51063f0ab417cristy/* ========================================================================= */
133790190d9d1e6f011220d0003ce5b51063f0ab417cristy/*                                                                           */
134790190d9d1e6f011220d0003ce5b51063f0ab417cristy/* ---- \ghd{ modify functions } ------------------------------------------- */
135790190d9d1e6f011220d0003ce5b51063f0ab417cristy/*                                                                           */
1361042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy/* ========================================================================= */
1371042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy
1381042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy/* ------------------------------------------------------------------------- */
1391042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy
1401042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy/* ========================================================================= */
1411042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy/*                                                                           */
1421042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy/* ---- \ghd{ I/O } -------------------------------------------------------- */
14334b78eacf3bef963cade67c70f5f12785b9fe702cristy/*                                                                           */
14434b78eacf3bef963cade67c70f5f12785b9fe702cristy/* ========================================================================= */
14534b78eacf3bef963cade67c70f5f12785b9fe702cristy
1461042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy/* ------------------------------------------------------------------------- */
1471042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy
1481042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristyuint32 bbf_ScanDetector_memSize( struct bbs_Context* cpA,
1491042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy							     const struct bbf_ScanDetector* ptrA )
1501042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy{
151790190d9d1e6f011220d0003ce5b51063f0ab417cristy	uint32 iL;
15234b78eacf3bef963cade67c70f5f12785b9fe702cristy	uint32 memSizeL = bbs_SIZEOF16( uint32 ) +
15334b78eacf3bef963cade67c70f5f12785b9fe702cristy					  bbs_SIZEOF16( uint32 ); /* version */
15434b78eacf3bef963cade67c70f5f12785b9fe702cristy
155790190d9d1e6f011220d0003ce5b51063f0ab417cristy	memSizeL += bbs_SIZEOF16( ptrA->patchWidthE );
1561042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy	memSizeL += bbs_SIZEOF16( ptrA->patchHeightE );
1571042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy	memSizeL += bbs_SIZEOF16( ptrA->minDefScaleE );
15834919ed07da683cc334cd74e3c9d9c29c8b79b98cristy	memSizeL += bbs_SIZEOF16( ptrA->maxDefScaleE );
15934919ed07da683cc334cd74e3c9d9c29c8b79b98cristy	memSizeL += bbs_SIZEOF16( ptrA->scaleStepE );
160790190d9d1e6f011220d0003ce5b51063f0ab417cristy	memSizeL += bbs_SIZEOF16( ptrA->overlapThrE );
161790190d9d1e6f011220d0003ce5b51063f0ab417cristy	memSizeL += bbs_SIZEOF16( ptrA->borderWidthE );
162790190d9d1e6f011220d0003ce5b51063f0ab417cristy	memSizeL += bbs_SIZEOF16( ptrA->borderHeightE );
163790190d9d1e6f011220d0003ce5b51063f0ab417cristy	memSizeL += bbs_SIZEOF16( ptrA->featuresE );
164790190d9d1e6f011220d0003ce5b51063f0ab417cristy	for( iL = 0; iL < ptrA->featuresE; iL++ ) memSizeL += bbf_BitParam_memSize( cpA, &ptrA->bitParamArrE[ iL ] );
165790190d9d1e6f011220d0003ce5b51063f0ab417cristy	for( iL = 0; iL < ptrA->featuresE; iL++ ) memSizeL += bbf_Sequence_memSize( cpA, &ptrA->featureArrE[ iL ] );
166790190d9d1e6f011220d0003ce5b51063f0ab417cristy	memSizeL += bts_IdCluster2D_memSize( cpA, &ptrA->refClusterE );
167790190d9d1e6f011220d0003ce5b51063f0ab417cristy	memSizeL += bbs_SIZEOF16( ptrA->refDistanceE );
168790190d9d1e6f011220d0003ce5b51063f0ab417cristy
169790190d9d1e6f011220d0003ce5b51063f0ab417cristy	return memSizeL;
170790190d9d1e6f011220d0003ce5b51063f0ab417cristy}
171e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy
172790190d9d1e6f011220d0003ce5b51063f0ab417cristy/* ------------------------------------------------------------------------- */
173790190d9d1e6f011220d0003ce5b51063f0ab417cristy
174790190d9d1e6f011220d0003ce5b51063f0ab417cristyuint32 bbf_ScanDetector_memWrite( struct bbs_Context* cpA,
175e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy							      const struct bbf_ScanDetector* ptrA,
1761042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy								  uint16* memPtrA )
1771042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy{
1781042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy	uint32 iL;
1791042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy	uint32 memSizeL = bbf_ScanDetector_memSize( cpA, ptrA );
1801042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy	memPtrA += bbs_memWrite32( &memSizeL, memPtrA );
1811042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy	memPtrA += bbs_memWriteUInt32( bbf_SCAN_DETECTOR_VERSION, memPtrA );
18234919ed07da683cc334cd74e3c9d9c29c8b79b98cristy
18334919ed07da683cc334cd74e3c9d9c29c8b79b98cristy	memPtrA += bbs_memWrite32( &ptrA->patchWidthE, memPtrA );
1841042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy	memPtrA += bbs_memWrite32( &ptrA->patchHeightE, memPtrA );
18534919ed07da683cc334cd74e3c9d9c29c8b79b98cristy	memPtrA += bbs_memWrite32( &ptrA->minDefScaleE, memPtrA );
18634919ed07da683cc334cd74e3c9d9c29c8b79b98cristy	memPtrA += bbs_memWrite32( &ptrA->maxDefScaleE, memPtrA );
18734919ed07da683cc334cd74e3c9d9c29c8b79b98cristy	memPtrA += bbs_memWrite32( &ptrA->scaleStepE, memPtrA );
18834919ed07da683cc334cd74e3c9d9c29c8b79b98cristy	memPtrA += bbs_memWrite32( &ptrA->overlapThrE, memPtrA );
18934919ed07da683cc334cd74e3c9d9c29c8b79b98cristy	memPtrA += bbs_memWrite32( &ptrA->borderWidthE, memPtrA );
1902e035cd272c0993d28f757f4a913070170095939Cristy	memPtrA += bbs_memWrite32( &ptrA->borderHeightE, memPtrA );
19134919ed07da683cc334cd74e3c9d9c29c8b79b98cristy	memPtrA += bbs_memWrite32( &ptrA->featuresE, memPtrA );
19234919ed07da683cc334cd74e3c9d9c29c8b79b98cristy	for( iL = 0; iL < ptrA->featuresE; iL++ ) memPtrA += bbf_BitParam_memWrite( cpA, &ptrA->bitParamArrE[ iL ], memPtrA );
19334919ed07da683cc334cd74e3c9d9c29c8b79b98cristy	for( iL = 0; iL < ptrA->featuresE; iL++ ) memPtrA += bbf_Sequence_memWrite( cpA, &ptrA->featureArrE[ iL ], memPtrA );
19434919ed07da683cc334cd74e3c9d9c29c8b79b98cristy	memPtrA += bts_IdCluster2D_memWrite( cpA, &ptrA->refClusterE, memPtrA );
19534919ed07da683cc334cd74e3c9d9c29c8b79b98cristy	memPtrA += bbs_memWrite32( &ptrA->refDistanceE, memPtrA );
19634919ed07da683cc334cd74e3c9d9c29c8b79b98cristy
19734919ed07da683cc334cd74e3c9d9c29c8b79b98cristy	return memSizeL;
19834919ed07da683cc334cd74e3c9d9c29c8b79b98cristy}
199dc6589cac93cf46a2d9d7ee71c48df8c215f398fcristy
2001042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy/* ------------------------------------------------------------------------- */
2011042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy
2021042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristyuint32 bbf_ScanDetector_memRead( struct bbs_Context* cpA,
20334b78eacf3bef963cade67c70f5f12785b9fe702cristy							     struct bbf_ScanDetector* ptrA,
20434b78eacf3bef963cade67c70f5f12785b9fe702cristy							     const uint16* memPtrA,
20534b78eacf3bef963cade67c70f5f12785b9fe702cristy							     struct bbs_MemTbl* mtpA )
20634b78eacf3bef963cade67c70f5f12785b9fe702cristy{
2071042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy	bbs_DEF_fNameL( "bbf_ScanDetector_memRead" )
2081042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy
2098dc6a07d751896a7c400a6d888a5964c538fad2dcristy	/* debugging hint: set this flag to FALSE when you suspect a shared memory conflict */
2108dc6a07d751896a7c400a6d888a5964c538fad2dcristy	const flag maximizeSharedMemoryL = TRUE;
2118dc6a07d751896a7c400a6d888a5964c538fad2dcristy
2128dc6a07d751896a7c400a6d888a5964c538fad2dcristy	uint32 iL;
2131042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy	uint32 memSizeL, versionL;
2141042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy	struct bbs_MemTbl memTblL = *mtpA;
2151042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy	struct bbs_MemSeg* espL = bbs_MemTbl_segPtr( cpA, &memTblL, 0 );
2161042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy	if( bbs_Context_error( cpA ) ) return 0;
2171042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy
2181042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy	memPtrA += bbs_memRead32( &memSizeL, memPtrA );
2191042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy	memPtrA += bbs_memReadVersion32( cpA, &versionL, bbf_SCAN_DETECTOR_VERSION, memPtrA );
2201042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy
2211042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy	memPtrA += bbs_memRead32( &ptrA->patchWidthE, memPtrA );
2221042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy	memPtrA += bbs_memRead32( &ptrA->patchHeightE, memPtrA );
2231042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy	memPtrA += bbs_memRead32( &ptrA->minDefScaleE, memPtrA );
2241042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy	memPtrA += bbs_memRead32( &ptrA->maxDefScaleE, memPtrA );
2251042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy	memPtrA += bbs_memRead32( &ptrA->scaleStepE, memPtrA );
2261042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy	memPtrA += bbs_memRead32( &ptrA->overlapThrE, memPtrA );
2271042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy	memPtrA += bbs_memRead32( &ptrA->borderWidthE, memPtrA );
2284167f3a934b7c75a501ac7b4f1ceaf3e1bb192fdcristy	memPtrA += bbs_memRead32( &ptrA->borderHeightE, memPtrA );
2294167f3a934b7c75a501ac7b4f1ceaf3e1bb192fdcristy	memPtrA += bbs_memRead32( &ptrA->featuresE, memPtrA );
2301042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy	for( iL = 0; iL < ptrA->featuresE; iL++ ) memPtrA += bbf_BitParam_memRead( cpA, &ptrA->bitParamArrE[ iL ], memPtrA );
2311042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy	for( iL = 0; iL < ptrA->featuresE; iL++ ) memPtrA += bbf_Sequence_memRead( cpA, &ptrA->featureArrE[ iL ], memPtrA, &memTblL );
2321042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy	memPtrA += bts_IdCluster2D_memRead( cpA, &ptrA->refClusterE, memPtrA, espL );
2331042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy	memPtrA += bbs_memRead32( &ptrA->refDistanceE, memPtrA );
23405d2ff7ebf21f659f5b11e45afb294e152f4330cdirk/*
23505d2ff7ebf21f659f5b11e45afb294e152f4330cdirk	if( memSizeL != bbf_ScanDetector_memSize( cpA, ptrA ) )
23605d2ff7ebf21f659f5b11e45afb294e152f4330cdirk	{
23705d2ff7ebf21f659f5b11e45afb294e152f4330cdirk		bbs_ERR0( bbs_ERR_CORRUPT_DATA, "uint32 bbf_ScanDetector_memRead( struct bem_ScanGradientMove* ptrA, const uint16* memPtrA ):\n"
2381042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy			        "size mismatch" );
2391042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy		return 0;
24005d2ff7ebf21f659f5b11e45afb294e152f4330cdirk	}
24105d2ff7ebf21f659f5b11e45afb294e152f4330cdirk*/
2421042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy
2431042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy	ptrA->minScaleE = ptrA->minDefScaleE;
2441042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy	ptrA->maxScaleE = ptrA->maxDefScaleE;
2451042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy
24634919ed07da683cc334cd74e3c9d9c29c8b79b98cristy	/* initialize scanner; be aware of shared memory settings(!) */
24734919ed07da683cc334cd74e3c9d9c29c8b79b98cristy	{
2484167f3a934b7c75a501ac7b4f1ceaf3e1bb192fdcristy		uint32 maxImageSizeL = ptrA->maxImageWidthE * ptrA->maxImageHeightE;
2494167f3a934b7c75a501ac7b4f1ceaf3e1bb192fdcristy
2504167f3a934b7c75a501ac7b4f1ceaf3e1bb192fdcristy		/* estimate of maximal possible faces in image */
2514167f3a934b7c75a501ac7b4f1ceaf3e1bb192fdcristy		uint32 maxFacesL = maxImageSizeL / ( 768 << 1 );
2524167f3a934b7c75a501ac7b4f1ceaf3e1bb192fdcristy
2534167f3a934b7c75a501ac7b4f1ceaf3e1bb192fdcristy		uint32 maxRadiusL = 0;
2541042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy
2551042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy		if( maxImageSizeL == 0 )
2561042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy		{
2571042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy			bbs_ERROR1( "%s:\nMaximum image size was not defined (size variables must be set before calling _memRead)", fNameL );
2581042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy			return memSizeL;
2591042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy		}
2601042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy
2611042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy		for( iL = 0; iL < ptrA->featuresE; iL++ )
2621042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy		{
2639f654472e80883bb7c4ec299036733e0e23570d7cristy			maxRadiusL = maxRadiusL > ptrA->bitParamArrE[ iL ].outerRadiusE ? maxRadiusL : ptrA->bitParamArrE[ iL ].outerRadiusE;
2649f654472e80883bb7c4ec299036733e0e23570d7cristy		}
2659f654472e80883bb7c4ec299036733e0e23570d7cristy
2669f654472e80883bb7c4ec299036733e0e23570d7cristy		if( maxFacesL < 1 ) maxFacesL = 1;
2679f654472e80883bb7c4ec299036733e0e23570d7cristy
268220c4d505bfb9cf557e8ec1616d7cdc0596379b8cristy		bbf_Scanner_create( cpA, &ptrA->scannerE,
2699f654472e80883bb7c4ec299036733e0e23570d7cristy							maximizeSharedMemoryL,
27019f7886e4423cd5ce3eef31092942f55ba770983cristy							ptrA->maxImageWidthE,
27119f7886e4423cd5ce3eef31092942f55ba770983cristy							ptrA->maxImageHeightE,
27219f7886e4423cd5ce3eef31092942f55ba770983cristy							maxRadiusL,
27319f7886e4423cd5ce3eef31092942f55ba770983cristy							ptrA->patchWidthE,
27419f7886e4423cd5ce3eef31092942f55ba770983cristy							ptrA->patchHeightE,
27519f7886e4423cd5ce3eef31092942f55ba770983cristy							ptrA->minScaleE,
2769f654472e80883bb7c4ec299036733e0e23570d7cristy							ptrA->maxScaleE,
2779f654472e80883bb7c4ec299036733e0e23570d7cristy							ptrA->scaleStepE,
2789f654472e80883bb7c4ec299036733e0e23570d7cristy							ptrA->borderWidthE,
2799f654472e80883bb7c4ec299036733e0e23570d7cristy							ptrA->borderHeightE,
2809f654472e80883bb7c4ec299036733e0e23570d7cristy							maxFacesL * 20,  /* bufferSizeA */
2819f654472e80883bb7c4ec299036733e0e23570d7cristy							&memTblL );
2829f654472e80883bb7c4ec299036733e0e23570d7cristy	}
2839f654472e80883bb7c4ec299036733e0e23570d7cristy
2849f654472e80883bb7c4ec299036733e0e23570d7cristy	return memSizeL;
2859f654472e80883bb7c4ec299036733e0e23570d7cristy}
2869f654472e80883bb7c4ec299036733e0e23570d7cristy
2879f654472e80883bb7c4ec299036733e0e23570d7cristy/* ------------------------------------------------------------------------- */
28834b78eacf3bef963cade67c70f5f12785b9fe702cristy
2899f654472e80883bb7c4ec299036733e0e23570d7cristy/* ========================================================================= */
290857c8a100c50bd902586a902c27fccab271dce1dcristy/*                                                                           */
2919f654472e80883bb7c4ec299036733e0e23570d7cristy/* ---- \ghd{ exec functions } --------------------------------------------- */
2929f654472e80883bb7c4ec299036733e0e23570d7cristy/*                                                                           */
293f46941ca310386db5b9939840c884c6f8a5c7189cristy/* ========================================================================= */
294f46941ca310386db5b9939840c884c6f8a5c7189cristy
2958526a9763e0671ebad481fd00679fb857ce8d84acristy/* ------------------------------------------------------------------------- */
2964ab069406391dd3d34359d17a6ab7333f7200729cristy
297f46941ca310386db5b9939840c884c6f8a5c7189cristyuint32 bbf_ScanDetector_process( struct bbs_Context* cpA,
298f46941ca310386db5b9939840c884c6f8a5c7189cristy							     struct bbf_ScanDetector* ptrA,
2999f654472e80883bb7c4ec299036733e0e23570d7cristy							     const void* imagePtrA,
3009f654472e80883bb7c4ec299036733e0e23570d7cristy								 uint32 imageWidthA,
30115b07b3f81434e5cee2ed16d51ec3f504949d992cristy								 uint32 imageHeightA,
30215b07b3f81434e5cee2ed16d51ec3f504949d992cristy								 const struct bts_Int16Rect* roiPtrA,
303f46941ca310386db5b9939840c884c6f8a5c7189cristy								 int32** outArrPtrPtrA )
304f46941ca310386db5b9939840c884c6f8a5c7189cristy{
305f46941ca310386db5b9939840c884c6f8a5c7189cristy	/* best global values (used when no positives could be found) */
306f46941ca310386db5b9939840c884c6f8a5c7189cristy	int32 bestGlobalActL = ( int32 )0x80000000;
3074ab069406391dd3d34359d17a6ab7333f7200729cristy	int32 bestGlobalXL = 0;
3084ab069406391dd3d34359d17a6ab7333f7200729cristy	int32 bestGlobalYL = 0;
3099f654472e80883bb7c4ec299036733e0e23570d7cristy	uint32 bestGlobalScaleL = 0;
3109f654472e80883bb7c4ec299036733e0e23570d7cristy
31119f7886e4423cd5ce3eef31092942f55ba770983cristy	struct bbf_Scanner* scannerPtrL = &ptrA->scannerE;
31219f7886e4423cd5ce3eef31092942f55ba770983cristy
31319f7886e4423cd5ce3eef31092942f55ba770983cristy	scannerPtrL->minScaleE = ptrA->minScaleE;
31419f7886e4423cd5ce3eef31092942f55ba770983cristy	scannerPtrL->maxScaleE = ptrA->maxScaleE;
31519f7886e4423cd5ce3eef31092942f55ba770983cristy
31619f7886e4423cd5ce3eef31092942f55ba770983cristy	*outArrPtrPtrA = NULL;
3179f654472e80883bb7c4ec299036733e0e23570d7cristy
3189f654472e80883bb7c4ec299036733e0e23570d7cristy	if( bbs_Context_error( cpA ) ) return 0;
3194167f3a934b7c75a501ac7b4f1ceaf3e1bb192fdcristy	if( ptrA->featuresE == 0 )
3204167f3a934b7c75a501ac7b4f1ceaf3e1bb192fdcristy	{
3214167f3a934b7c75a501ac7b4f1ceaf3e1bb192fdcristy		bbs_ERROR0( "bbf_ScanDetector_process: detector has no features" );
3224167f3a934b7c75a501ac7b4f1ceaf3e1bb192fdcristy		return 0;
3234167f3a934b7c75a501ac7b4f1ceaf3e1bb192fdcristy	}
3244167f3a934b7c75a501ac7b4f1ceaf3e1bb192fdcristy
3251042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy	if( imageWidthA > ptrA->maxImageWidthE || imageHeightA > ptrA->maxImageHeightE )
3261042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy	{
3271042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy		bbs_ERROR0( "bbf_ScanDetector_process: images size exceeds preallocated size" );
3281042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy		return 0;
3291042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy	}
3301042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy
3311042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy	/* resets output positions */
3321042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy	bbf_Scanner_resetOutPos( cpA, scannerPtrL );
3331042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy
3341042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy	/* assign image to scanner - reset scanner */
3351042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy	bbf_Scanner_assign( cpA, scannerPtrL, imagePtrA, imageWidthA, imageHeightA, roiPtrA, &ptrA->bitParamArrE[ 0 ] );
3361042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy
3371042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy	while( bbf_Scanner_positions( scannerPtrL ) > 0 )
3381042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy	{
3391042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy		int32 bestActL = ( int32 )0x80000000;
3401042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy		uint32 bestIdxL = 0;
3411042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy		uint32 bestLvlL = 0;
3421042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy		uint32 iL;
3431042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy
3441042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy		const struct bbf_Feature* featurePtrL = ( const struct bbf_Feature* )&ptrA->featureArrE[ 0 ];
3451042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy		const struct bbf_BitParam* paramPtrL = &ptrA->bitParamArrE[ 0 ];
3461042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy		bbf_Scanner_bitParam( cpA, scannerPtrL, paramPtrL );
3471042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy
3481042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy		/* resets internal positions */
3491042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy		bbf_Scanner_resetIntPos( cpA, scannerPtrL );
3501042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy
3511042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy		do
3521042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy		{
353790190d9d1e6f011220d0003ce5b51063f0ab417cristy			int32 actL = featurePtrL->vpActivityE( featurePtrL, bbf_Scanner_getPatch( scannerPtrL ) );
354790190d9d1e6f011220d0003ce5b51063f0ab417cristy			if( actL > 0 )
355790190d9d1e6f011220d0003ce5b51063f0ab417cristy			{
356790190d9d1e6f011220d0003ce5b51063f0ab417cristy				bbf_Scanner_addIntPos( cpA, scannerPtrL, bbf_Scanner_scanIndex( scannerPtrL ), actL );
357790190d9d1e6f011220d0003ce5b51063f0ab417cristy			}
358790190d9d1e6f011220d0003ce5b51063f0ab417cristy
3593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy			if( actL > bestActL )
3603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy			{
3613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy				bestActL = actL;
3623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy				bestIdxL = bbf_Scanner_scanIndex( scannerPtrL );
3633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy			}
3643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy		}
3653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy		while( bbf_Scanner_next( cpA, scannerPtrL ) );
3663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy		for( iL = 1; iL < ptrA->featuresE; iL++ )
3683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy		{
3693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy			const struct bbf_Feature* featurePtrL = ( const struct bbf_Feature* )&ptrA->featureArrE[ iL ];
3703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy			const struct bbf_BitParam* paramPtrL = &ptrA->bitParamArrE[ iL ];
3713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy			uint32* idxArrL = scannerPtrL->idxArrE.arrPtrE;
3723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy			int32* actArrL = scannerPtrL->actArrE.arrPtrE;
3733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy			uint32 kL = 0;
3753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy			uint32 jL;
3763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy			if( scannerPtrL->intCountE == 0 ) break;
3783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy			bestActL = ( int32 )0x80000000;
3793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy			bbf_Scanner_bitParam( cpA, scannerPtrL, paramPtrL );
3803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy			for( jL = 0; jL < scannerPtrL->intCountE; jL++ )
3823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy			{
3833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy				int32 actL;
3843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy				bbf_Scanner_goToIndex( cpA, scannerPtrL, idxArrL[ jL ] );
3853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy				actL = featurePtrL->vpActivityE( featurePtrL, bbf_Scanner_getPatch( scannerPtrL ) );
3863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy				if( actL > 0 )
3873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy				{
388c4ea4a479c90f81168aa2b99e7680c7b0459d415cristy					idxArrL[ kL ] = idxArrL[ jL ];
389699ae5b6cbee363e53f58e0fedd414f282d07eddcristy					actArrL[ kL ] = ( actArrL[ jL ] + actL ) >> 1;
3903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy					kL++;
3913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy				}
392699ae5b6cbee363e53f58e0fedd414f282d07eddcristy
3933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy				if( actL > bestActL )
3947d4aa38318c20a4309d855f45e3744c9f300f697cristy				{
395699ae5b6cbee363e53f58e0fedd414f282d07eddcristy					bestActL = actL;
3967d4aa38318c20a4309d855f45e3744c9f300f697cristy					bestIdxL = idxArrL[ jL ];
397c4ea4a479c90f81168aa2b99e7680c7b0459d415cristy					bestLvlL = iL;
398c4ea4a479c90f81168aa2b99e7680c7b0459d415cristy				}
399c4ea4a479c90f81168aa2b99e7680c7b0459d415cristy			}
400c4ea4a479c90f81168aa2b99e7680c7b0459d415cristy
401bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy			scannerPtrL->intCountE = kL;
4023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy		}
4033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy		if( scannerPtrL->intCountE == 0 )
4053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy		{
4063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy			int32 xL, yL;
4072da0535a82cc655e5a48deac466bd6fcef1f4924cristy			uint32 scaleL;
4083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4092e035cd272c0993d28f757f4a913070170095939Cristy			/* 8.24 */
410699ae5b6cbee363e53f58e0fedd414f282d07eddcristy			int32 actL = ( bestActL >> 4 ) + ( ( ( int32 )( bestLvlL + 1 - ptrA->featuresE ) << 24 ) / ( int32 )ptrA->featuresE );
4113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
412699ae5b6cbee363e53f58e0fedd414f282d07eddcristy			/* 4.28 */
4133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy			actL <<= 4;
414bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy
4153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy			bbf_Scanner_idxPos( scannerPtrL, bestIdxL, &xL, &yL, &scaleL );
4163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
417bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy			if( actL > bestGlobalActL )
4183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy			{
419bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            	bestGlobalActL = actL;
4203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy				bestGlobalXL = xL;
421bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy				bestGlobalYL = yL;
4223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy				bestGlobalScaleL = scaleL;
4233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy			}
424bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy		}
4253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy		else
426bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy		{
4273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy			/* remove overlaps for current scale */
428699ae5b6cbee363e53f58e0fedd414f282d07eddcristy			bbf_Scanner_removeIntOverlaps( cpA, scannerPtrL, ptrA->overlapThrE );
429c4ea4a479c90f81168aa2b99e7680c7b0459d415cristy
4303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy			for( iL = 0; iL < scannerPtrL->intCountE; iL++ )
431699ae5b6cbee363e53f58e0fedd414f282d07eddcristy			{
432699ae5b6cbee363e53f58e0fedd414f282d07eddcristy				int32 xL, yL;
433699ae5b6cbee363e53f58e0fedd414f282d07eddcristy				uint32 scaleL;
4343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy				uint32* idxArrL = scannerPtrL->idxArrE.arrPtrE;
4353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy				int32* actArrL = scannerPtrL->actArrE.arrPtrE;
4363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
437bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy				int32 actL = actArrL[ iL ];
438699ae5b6cbee363e53f58e0fedd414f282d07eddcristy				bbf_Scanner_idxPos( scannerPtrL, idxArrL[ iL ], &xL, &yL, &scaleL );
4393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy				/* add external position */
4413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy				bbf_Scanner_addOutPos( cpA, scannerPtrL, xL, yL, scaleL, actL );
4423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy			}
443bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy
4443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy			/* remove overlapping positions */
4453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy			bbf_Scanner_removeOutOverlaps( cpA, scannerPtrL, ptrA->overlapThrE );
446c4ea4a479c90f81168aa2b99e7680c7b0459d415cristy
447c4ea4a479c90f81168aa2b99e7680c7b0459d415cristy		}
448c4ea4a479c90f81168aa2b99e7680c7b0459d415cristy
449c4ea4a479c90f81168aa2b99e7680c7b0459d415cristy		if( !bbf_Scanner_nextScale( cpA, scannerPtrL ) ) break;
4503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy	}
4513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
4523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy	{
4532e035cd272c0993d28f757f4a913070170095939Cristy		uint32 iL;
454699ae5b6cbee363e53f58e0fedd414f282d07eddcristy		printf( "\n-----------------------------------------------" );
455699ae5b6cbee363e53f58e0fedd414f282d07eddcristy		for( iL = 0; iL < scannerPtrL->outCountE; iL++ )
4563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy		{
4573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy			printf( "\n%02i: %6.1f %6.1f %6.2f %6.3f",
458bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy					iL,
4596831e2f47f00e8b78275319e4aec01d120a3876fCristy					( float )scannerPtrL->outArrE.arrPtrE[ iL * 4 + 0 ] / ( 1L << 16 ),
4603d04ed7ddc7a93c09476e84cc64412687bf5261acristy					( float )scannerPtrL->outArrE.arrPtrE[ iL * 4 + 1 ] / ( 1L << 16 ),
461bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy					( float )scannerPtrL->outArrE.arrPtrE[ iL * 4 + 2 ] / ( 1L << 20 ),
4626831e2f47f00e8b78275319e4aec01d120a3876fCristy					( float )scannerPtrL->outArrE.arrPtrE[ iL * 4 + 3 ] / ( 1L << 28 ) );
4639b1d6c756cb32746846b038ccb0439db540ba509cristy
4643d04ed7ddc7a93c09476e84cc64412687bf5261acristy		}
465bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy	}
4666831e2f47f00e8b78275319e4aec01d120a3876fCristy*/
4673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy	*outArrPtrPtrA = scannerPtrL->outArrE.arrPtrE;
4693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy	if( scannerPtrL->outCountE == 0 )
470c4ea4a479c90f81168aa2b99e7680c7b0459d415cristy	{
471699ae5b6cbee363e53f58e0fedd414f282d07eddcristy		/* no positive activities found: store best negative activity */
4723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy		bbf_Scanner_addOutPos( cpA, scannerPtrL, bestGlobalXL, bestGlobalYL, bestGlobalScaleL, bestGlobalActL );
473bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy		return 0;
4743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy	}
4753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy	else
4769d314ff2c17a77996c05413c2013880387e50f0ecristy	{
4779d314ff2c17a77996c05413c2013880387e50f0ecristy		return scannerPtrL->outCountE;
4789d314ff2c17a77996c05413c2013880387e50f0ecristy	}
479bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy}
480bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy
481699ae5b6cbee363e53f58e0fedd414f282d07eddcristy/* ------------------------------------------------------------------------- */
4823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* ========================================================================= */
4843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy