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_BitFeatureEm/Scanner.h"
227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
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/* ---- \ghd{ auxiliary functions } ---------------------------------------- */
287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
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/** multiplies a scale with a 0.32 scale factor */
347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bbf_Scanner_scalePrd( uint32 scaleA, uint32 factorA /*0.32 */ )\
357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return      ( scaleA >> 16     ) * ( factorA >> 16     ) +
377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			( ( ( scaleA & 0x0FFFF ) * ( factorA >> 16     ) ) >> 16 ) +
387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			( ( ( scaleA >> 16     ) * ( factorA & 0x0FFFF ) ) >> 16 );
397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/** allocates arays */
447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_Scanner_alloc( struct bbs_Context* cpA,
457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						struct bbf_Scanner* ptrA,
467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						struct bbs_MemTbl* mtpA,
477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						flag maximizeSharedMemoryA )
487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	struct bbs_MemTbl memTblL = *mtpA;
507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	struct bbs_MemSeg* espL = bbs_MemTbl_segPtr( cpA, &memTblL, 0 );
517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	struct bbs_MemSeg* sspL = bbs_MemTbl_sharedSegPtr( cpA, &memTblL, 0 );
527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	struct bbs_MemSeg* mspL = maximizeSharedMemoryA ? sspL : espL;
537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* filter patch dimension */
557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 proL = ptrA->maxRadiusE;
567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 pwoL = ( proL << 1 ) + 1;
577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* output image size (bit image) */
597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 woL = ptrA->maxImageWidthE;
607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 hoL = ptrA->maxImageHeightE;
617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* extended output image size (bit image) considering borders */
637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 xwoL = woL + ( ptrA->borderWidthE  << 1 );
647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 xhoL = hoL + ( ptrA->borderHeightE << 1 );
657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* allocate working image */
677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_UInt16Arr_create( cpA, &ptrA->workImageE, ( ( woL >> 1 ) + ( woL & 1 ) ) * hoL, mspL );
687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( bbs_Context_error( cpA ) ) return;
697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_UInt16Arr_fill( cpA, &ptrA->workImageE, 0 );
707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* allocate bit image */
727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bim_UInt32Image_create( cpA, &ptrA->bitImageE, xwoL, ( xhoL >> 5 ) + ( ( ( xhoL & 0x1F ) != 0 ) ? 1 : 0 ), mspL );
737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( bbs_Context_error( cpA ) ) return;
747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bim_UInt32Image_setAllPixels( cpA, &ptrA->bitImageE, 0, 0 );
757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* allocate patch buffer */
777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_UInt32Arr_create( cpA, &ptrA->patchBufferE, ptrA->bitImageE.widthE, mspL );
787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( bbs_Context_error( cpA ) ) return;
797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_UInt32Arr_fill( cpA, &ptrA->patchBufferE, 0 );
807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* allocate line buffer */
827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_UInt16Arr_create( cpA, &ptrA->lineBufE, woL + ( woL & 1 ), sspL );
837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* allocate table */
857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bim_UInt32Image_create( cpA, &ptrA->satE, woL + pwoL, pwoL + 1, sspL );
867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* allocate buffers */
887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_UInt32Arr_create( cpA, &ptrA->idxArrE, ptrA->bufferSizeE, mspL );
897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_Int32Arr_create(  cpA, &ptrA->actArrE, ptrA->bufferSizeE, mspL );
907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_Int32Arr_create(  cpA, &ptrA->outArrE, ptrA->bufferSizeE >> 1, espL );
927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/** downscales work image */
977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_Scanner_downscale( struct bbs_Context* cpA, struct bbf_Scanner* ptrA )
987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 w0L = ptrA->workWidthE;
1007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 h0L = ptrA->workHeightE;
1017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 w1L = w0L >> 1;
1027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 h1L = h0L >> 1;
1037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 w20L = ( w0L >> 1 ) + ( w0L & 1 );
1047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint16* arrL = ptrA->workImageE.arrPtrE;
1057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 iL, jL;
1077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 kL = 0;
1087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	for( jL = 0; jL < h1L; jL++ )
1097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
1107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		for( iL = 0; iL < ( w1L >> 1 ); iL++ )
1117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
1127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			uint16 loL, hiL;
1137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			uint32 idxL = jL * 2 * w20L + iL * 2;
1147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			loL = ( ( arrL[ idxL ] & 0x00FF ) + ( arrL[ idxL ] >> 8 ) + ( arrL[ idxL + w20L ] & 0x00FF ) + ( arrL[ idxL + w20L ] >> 8 ) + 2 ) >> 2;
1167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			idxL++;
1177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			hiL = ( ( arrL[ idxL ] & 0x00FF ) + ( arrL[ idxL ] >> 8 ) + ( arrL[ idxL + w20L ] & 0x00FF ) + ( arrL[ idxL + w20L ] >> 8 ) + 2 ) >> 2;
1187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			arrL[ kL ] = loL | ( hiL << 8 );
1207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			kL++;
1217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
1227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( ( w1L & 1 ) != 0 )
1237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
1247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			uint32 idxL = jL * 2 * w20L + iL;
1257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			arrL[ kL++ ] = ( ( arrL[ idxL ] & 0x00FF ) + ( arrL[ idxL ] >> 8 ) + ( arrL[ idxL + w20L ] & 0x00FF ) + ( arrL[ idxL + w20L ] >> 8 ) + 2 ) >> 2;
1267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
1277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
1287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->workWidthE = w1L;
1307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->workHeightE = h1L;
1317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->scaleExpE++;
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/** copies image
1377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * handling for 8 bit images is implemented
1387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * 16 bit image handling for the whole class needs to be added in this function only
1397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project */
1407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_Scanner_copyImage( struct bbs_Context* cpA, struct bbf_Scanner* ptrA, const void* imagePtrA, uint32 imageWidthA, uint32 imageHeightA, const struct bts_Int16Rect* roiPtrA )
1417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
1427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_DEF_fNameL( "void bbf_Scanner_copyImage( struct bbs_Context* cpA, struct bbf_Scanner* ptrA, const struct bim_UInt16ByteImage* imagePtrA, const struct bts_Int16Rect* roiPtrA )" )
1437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( imageWidthA > ptrA->maxImageWidthE || imageHeightA > ptrA->maxImageHeightE )
1457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
1467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bbs_ERROR5( "%s:\n Input image (%ix%i)is too large; Scanner is configured for maximal (%ix%i)",
1477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			fNameL, imageWidthA, imageHeightA, ptrA->maxImageWidthE, ptrA->maxImageHeightE );
1487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		return;
1497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
1507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( roiPtrA == 0 )
1527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
1537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 iL, jL;
1547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		const uint8*  srcL = ( uint8* )imagePtrA;
1557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint16* dstL = ptrA->workImageE.arrPtrE;
1567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		ptrA->workWidthE  = imageWidthA;
1577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		ptrA->workHeightE = imageHeightA;
1587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		for( iL = 0; iL < ptrA->workHeightE; iL++ )
1597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
1607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			for( jL = ptrA->workWidthE >> 1; jL > 0; jL-- )
1617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
1627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				*dstL++ = ( uint16 )srcL[ 0 ] | ( uint16 )srcL[ 1 ] << 8;
1637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				srcL += 2;
1647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
1657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* uneven width */
1677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			if( ptrA->workWidthE & 1 ) *dstL++ = *srcL++;
1687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
1697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
1707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	else
1717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
1727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 iL, jL;
1737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		const uint8* srcL = ( uint8* )imagePtrA + roiPtrA->y1E * imageWidthA + roiPtrA->x1E;
1747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint16* dstL = ptrA->workImageE.arrPtrE;
1757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( roiPtrA->x2E <= roiPtrA->x1E || roiPtrA->y2E <= roiPtrA->y1E )
1777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
1787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			bbs_ERROR1( "%s:\n ROI is invalid or zero", fNameL );
1797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			return;
1807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
1817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( roiPtrA->x1E < 0 || roiPtrA->y1E < 0 || roiPtrA->x2E > ( int32 )imageWidthA || roiPtrA->y2E > ( int32 )imageHeightA )
1827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
1837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			bbs_ERROR1( "%s:\n ROI exceeds image boundary", fNameL );
1847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			return;
1857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
1867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		ptrA->workWidthE  = roiPtrA->x2E - roiPtrA->x1E;
1887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		ptrA->workHeightE = roiPtrA->y2E - roiPtrA->y1E;
1897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		for( iL = 0; iL < ptrA->workHeightE; iL++ )
1907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
1917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			for( jL = ptrA->workWidthE >> 1; jL > 0; jL-- )
1927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
1937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				*dstL++ = ( uint16 )srcL[ 0 ] | ( uint16 )srcL[ 1 ] << 8;
1947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				srcL += 2;
1957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
1967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* uneven width */
1987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			if( ptrA->workWidthE & 1 ) *dstL++ = *srcL++;
1997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			srcL += imageWidthA - ptrA->workWidthE;
2017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
2027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
2037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
2047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
2067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/** creates bit image */
2087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_Scanner_createBitImage( struct bbs_Context* cpA, struct bbf_Scanner* ptrA )
2097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
2107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_DEF_fNameL( "void bbf_Scanner_createBitImage( struct bbs_Context* cpA, struct bbf_Scanner* ptrA )" )
2117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* declarations */
2147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 proL, priL, pwoL, pwiL;
2157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 wiL, wi2L, hiL, woL, hoL, xwoL, xhoL; /* image size specifies */
2167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 stepL;    /* scan step (16.16) */
2177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 bitMaskL; /* current bit mask */
2187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32* bitRowL; /* pointer to bit-row */
2197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 wsL, hsL; /* size of summed area table (ringbuffer) */
2207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 satSizeL;
2217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32* satL;     /* pointer to summed area table */
2227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint16* lBufL;	  /* pointer to line buffer */
2237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 yfL;       /* fixed point y-coordinate (16.16) */
2247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 iL, jL;
2257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 swi1L; /* table writing index */
2277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 swi2L; /* table writing index */
2287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 sriL;  /* table reading index */
2297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 poAreaL, piAreaL; /* areas of inner and outer rectangles */
2317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 siL[ 8 ]; /* table indices */
2327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	proL = ptrA->bitParamE.outerRadiusE;
2357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	priL = ptrA->bitParamE.innerRadiusE;
2367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	pwoL = ( proL << 1 ) + 1;
2377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	pwiL = ( priL << 1 ) + 1;
2387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( ptrA->borderHeightE >= 32 )
2407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
2417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bbs_ERROR1( "%s:\n borderHeightE >= 32", fNameL );
2427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		return;
2437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
2447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( proL <= priL )
2467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
2477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bbs_ERROR1( "%s:\n outer radius <= inner radius", fNameL );
2487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		return;
2497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
2507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* input image size (bit image) */
2527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	wiL = ptrA->workWidthE;
2537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	hiL = ptrA->workHeightE;
2547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	wi2L = ( wiL >> 1 ) + ( wiL & 1 );
2557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* 16.16 */
2577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	stepL = ptrA->scaleE >> ( ptrA->scaleExpE + 4 );
2587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* output image size (bit image) */
2607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	woL = ( wiL << 16 ) / stepL;
2617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	hoL = ( hiL << 16 ) / stepL;
2627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( woL <= pwoL || hoL <= pwoL )
2647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
2657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bbs_ERROR1( "%s:\n scaled image is too small", fNameL );
2667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		return;
2677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
2687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( woL * stepL >= ( wiL << 16 ) ) woL--;
2707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( hoL * stepL >= ( hiL << 16 ) ) hoL--;
2717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* extended output image size (bit image) considering borders */
2737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	xwoL = woL + ( ptrA->borderWidthE  << 1 );
2747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	xhoL = hoL + ( ptrA->borderHeightE << 1 );
2757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->currentWidthE  = xwoL;
2777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->currentHeightE = xhoL;
2787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* initialize bit image */
2807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bim_UInt32Image_size( cpA, &ptrA->bitImageE, xwoL, ( xhoL >> 5 ) + ( ( ( xhoL & 0x1F ) != 0 ) ? 1 : 0 ) );
2817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bim_UInt32Image_setAllPixels( cpA, &ptrA->bitImageE, 0, 0 );
2827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bitMaskL = ( uint32 )1 << ptrA->borderHeightE;
2847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bitRowL = ( uint32* )ptrA->bitImageE.arrE.arrPtrE + ptrA->borderWidthE;
2857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* width of table */
2877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	wsL = woL + pwoL;
2887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* height of table */
2907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	hsL = pwoL + 1;
2917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bim_UInt32Image_size( cpA, &ptrA->satE, wsL, hsL );
2937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	satL = ptrA->satE.arrE.arrPtrE;
2957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	satSizeL = wsL * hsL;
2967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	lBufL = ptrA->lineBufE.arrPtrE;
2987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	yfL = 0; /* fixed point y-coordinate ( 16.16 )*/
3007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	swi1L = 0; /* table writing index */
3027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	swi2L = 0; /* table writing index */
3037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	sriL = 0;  /* table reading index */
3047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* areas of inner and outer rectangles */
3067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	poAreaL = pwoL * pwoL;
3077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	piAreaL = pwiL * pwiL;
3087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* interpolate pixels; compute table and bit image */
3107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	for( iL = wsL * ( proL + 1 ); iL > 0; iL-- ) satL[ swi1L++ ] = 0;
3127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	swi2L = swi1L - wsL;
3137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	for( jL = 0; jL < hoL + proL; jL++ )
3157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
3167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( jL < hoL ) /* rescale area */
3177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
3187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			uint32 ypL = ( yfL >> 16 );
3197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			uint32 yoff1L = yfL & 0x0FFFF;
3207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			uint32 yoff0L = 0x010000 - yoff1L;
3217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			const uint16* arr0L = ptrA->workImageE.arrPtrE + ypL * wi2L;
3227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			const uint16* arr1L = arr0L + wi2L;
3237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			uint32 xfL   = 0; /* fixed point x-coordinate (16.16) */
3267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			uint32 hSumL = 0;
3277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			yfL += stepL;
3297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			for( iL = 0; iL <= proL; iL++ ) satL[ swi1L++ ] = 0;
3317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			swi2L += iL;
3327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* fill line buffer */
3347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			for( iL = 0; iL < wi2L; iL++ )
3357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
3367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				lBufL[ iL * 2     ] = ( ( ( arr0L[ iL ] & 0x0FF ) * yoff0L ) + ( ( arr1L[ iL ] & 0x0FF ) * yoff1L ) ) >> 10;
3377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				lBufL[ iL * 2 + 1 ] = ( ( ( arr0L[ iL ] >> 8    ) * yoff0L ) + ( ( arr1L[ iL ] >> 8    ) * yoff1L ) ) >> 10;
3387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
3397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			for( iL = 0; iL < woL; iL++ )
3417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
3427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				uint32 xpL = ( xfL >> 16 );
3437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				uint32 xoff1L = xfL & 0x0FFFF;
3447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				uint16 pixL = ( lBufL[ xpL ] * ( 0x010000 - xoff1L ) + lBufL[ xpL + 1 ] * xoff1L ) >> 22;
3457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				satL[ swi1L ] = ( hSumL += pixL ) + satL[ swi2L ];
3467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				xfL += stepL;
3477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				swi1L++;
3487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				swi2L++;
3497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
3507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			for( iL = 0; iL < proL; iL++ )
3527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
3537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				satL[ swi1L ] = hSumL + satL[ swi2L ];
3547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				swi1L++;
3557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				swi2L++;
3567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
3577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
3587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		else /* image is processed - fill in 0s */
3597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
3607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			for( iL = 0; iL < wsL; iL++ ) satL[ swi1L++ ] = satL[ swi2L++ ];
3617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
3627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		swi1L = ( swi1L < satSizeL ) ? swi1L : 0;
3647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		swi2L = ( swi2L < satSizeL ) ? swi2L : 0;
3657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* fill line in bit image */
3677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( jL >= proL )
3687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
3697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			const uint32* rSatL = satL;
3707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* table coordinate indices for outer rectangle */
3727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			siL[ 0 ] = sriL;
3737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			siL[ 1 ] = siL[ 0 ] + pwoL;
3747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			siL[ 2 ] = siL[ 0 ] + pwoL * wsL;
3757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			siL[ 2 ] -= ( siL[ 2 ] >= satSizeL ) ? satSizeL : 0;
3767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			siL[ 3 ] = siL[ 2 ] + pwoL;
3777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* table coordinate indices for inner rectangle */
3797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			siL[ 4 ] = siL[ 0 ] + ( proL - priL ) * wsL + ( proL - priL );
3807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			siL[ 4 ] -= ( siL[ 4 ] >= satSizeL ) ? satSizeL : 0;
3817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			siL[ 5 ] = siL[ 4 ] + pwiL;
3827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			siL[ 6 ] = siL[ 4 ] + pwiL * wsL;
3837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			siL[ 6 ] -= ( siL[ 6 ] >= satSizeL ) ? satSizeL : 0;
3847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			siL[ 7 ] = siL[ 6 ] + pwiL;
3857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			sriL += wsL;
3867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			if( sriL == satSizeL ) sriL = 0;
3877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			for( iL = 0; iL < woL; iL++ )
3897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
3907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				uint32 oAvgL = ( rSatL[ siL[ 0 ] ] - rSatL[ siL[ 1 ] ] - rSatL[ siL[ 2 ] ] + rSatL[ siL[ 3 ] ] ) * piAreaL;
3917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				uint32 iAvgL = ( rSatL[ siL[ 4 ] ] - rSatL[ siL[ 5 ] ] - rSatL[ siL[ 6 ] ] + rSatL[ siL[ 7 ] ] ) * poAreaL;
3927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				bitRowL[ iL ] |= ( iAvgL > oAvgL ) ? bitMaskL : 0;
3937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				rSatL++;
3947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
3957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			if( ( bitMaskL <<= 1 ) == 0 )
3967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
3977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				bitRowL += xwoL;
3987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				bitMaskL = 1;
3997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
4007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
4017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
4027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
4037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
4057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/** initialize patch buffer */
4077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_Scanner_initPatchBuffer( struct bbs_Context* cpA, struct bbf_Scanner* ptrA )
4087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
4097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_UInt32Arr_size( cpA, &ptrA->patchBufferE, ptrA->bitImageE.widthE );
4107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_memcpy32( ptrA->patchBufferE.arrPtrE, ptrA->bitImageE.arrE.arrPtrE, ptrA->bitImageE.widthE );
4117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
4127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
4147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
4167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
4177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ constructor / destructor } ----------------------------------- */
4187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
4197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
4207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
4227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_Scanner_init( struct bbs_Context* cpA,
4247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					   struct bbf_Scanner* ptrA )
4257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
4267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->scaleExpE = 0;
4277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->scaleE = 0;
4287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->xE = 0;
4297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->yE = 0;
4307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->effMaxScaleE = 0;
4317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->currentWidthE = 0;
4327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->currentHeightE = 0;
4337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->workWidthE = 0;
4347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->workHeightE = 0;
4357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbf_BitParam_init( cpA, &ptrA->bitParamE );
4367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_UInt16Arr_init( cpA, &ptrA->workImageE );
4377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bim_UInt32Image_init( cpA, &ptrA->satE );
4387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bim_UInt32Image_init( cpA, &ptrA->bitImageE );
4397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_UInt32Arr_init( cpA, &ptrA->patchBufferE );
4407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_UInt16Arr_init( cpA, &ptrA->lineBufE );
4417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_UInt32Arr_init( cpA, &ptrA->idxArrE );
4437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_Int32Arr_init( cpA, &ptrA->actArrE );
4447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_Int32Arr_init( cpA, &ptrA->outArrE );
4457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->outCountE = 0;
4467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->intCountE = 0;
4477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->bufferSizeE = 1024;
4487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->maxImageWidthE = 0;
4507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->maxImageHeightE = 0;
4517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->maxRadiusE = 0;
4527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->patchWidthE = 0;
4537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->patchHeightE = 0;
4547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->minScaleE = 0;
4557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->maxScaleE = 0;
4567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->scaleStepE = 0;
4577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->borderWidthE = 0;
4587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->borderHeightE = 0;
4597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
4607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
4627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_Scanner_exit( struct bbs_Context* cpA,
4647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				       struct bbf_Scanner* ptrA )
4657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
4667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->scaleExpE = 0;
4677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->scaleE = 0;
4687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->xE = 0;
4697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->yE = 0;
4707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->effMaxScaleE = 0;
4717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->currentWidthE = 0;
4727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->currentHeightE = 0;
4737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->workWidthE = 0;
4747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->workHeightE = 0;
4757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbf_BitParam_exit( cpA, &ptrA->bitParamE );
4767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_UInt16Arr_exit( cpA, &ptrA->workImageE );
4777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bim_UInt32Image_exit( cpA, &ptrA->satE );
4787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bim_UInt32Image_exit( cpA, &ptrA->bitImageE );
4797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_UInt32Arr_exit( cpA, &ptrA->patchBufferE );
4807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_UInt16Arr_exit( cpA, &ptrA->lineBufE );
4817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_UInt32Arr_exit( cpA, &ptrA->idxArrE );
4837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_Int32Arr_exit( cpA, &ptrA->actArrE );
4847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_Int32Arr_exit( cpA, &ptrA->outArrE );
4857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->outCountE = 0;
4867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->intCountE = 0;
4877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->bufferSizeE = 1024;
4887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->maxImageWidthE = 0;
4907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->maxImageHeightE = 0;
4917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->maxRadiusE = 0;
4927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->patchWidthE = 0;
4937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->patchHeightE = 0;
4947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->minScaleE = 0;
4957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->maxScaleE = 0;
4967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->scaleStepE = 0;
4977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->borderWidthE = 0;
4987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->borderHeightE = 0;
4997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
5007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
5027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
5047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
5057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ operators } -------------------------------------------------- */
5067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
5077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
5087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
5107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_Scanner_copy( struct bbs_Context* cpA,
5127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				       struct bbf_Scanner* ptrA,
5137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					   const struct bbf_Scanner* srcPtrA )
5147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
5157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->scaleExpE = srcPtrA->scaleExpE;
5167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->scaleE = srcPtrA->scaleE;
5177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->xE = srcPtrA->xE;
5187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->yE = srcPtrA->yE;
5197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->effMaxScaleE = srcPtrA->effMaxScaleE;
5207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->currentWidthE = srcPtrA->currentWidthE;
5217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->currentHeightE = srcPtrA->currentHeightE;
5227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->workWidthE = srcPtrA->workWidthE;
5237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->workHeightE = srcPtrA->workHeightE;
5247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbf_BitParam_copy( cpA, &ptrA->bitParamE, &srcPtrA->bitParamE );
5267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_UInt16Arr_copy( cpA, &ptrA->workImageE, &srcPtrA->workImageE );
5277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bim_UInt32Image_copy( cpA, &ptrA->satE, &srcPtrA->satE );
5287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bim_UInt32Image_copy( cpA, &ptrA->bitImageE, &srcPtrA->bitImageE );
5297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_UInt32Arr_copy( cpA, &ptrA->patchBufferE, &srcPtrA->patchBufferE );
5307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_UInt16Arr_copy( cpA, &ptrA->lineBufE, &srcPtrA->lineBufE );
5317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->maxImageWidthE = srcPtrA->maxImageWidthE;
5337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->maxImageHeightE = srcPtrA->maxImageHeightE;
5347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->maxRadiusE = srcPtrA->maxRadiusE;
5357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->patchWidthE = srcPtrA->patchWidthE;
5367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->patchHeightE = srcPtrA->patchHeightE;
5377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->minScaleE = srcPtrA->minScaleE;
5387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->maxScaleE = srcPtrA->maxScaleE;
5397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->scaleStepE = srcPtrA->scaleStepE;
5407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->borderWidthE = srcPtrA->borderWidthE;
5417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->borderHeightE = srcPtrA->borderHeightE;
5427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
5437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
5457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectflag bbf_Scanner_equal( struct bbs_Context* cpA,
5477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				        const struct bbf_Scanner* ptrA,
5487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						const struct bbf_Scanner* srcPtrA )
5497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
5507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( ptrA->maxImageWidthE != srcPtrA->maxImageWidthE ) return FALSE;
5517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( ptrA->maxImageHeightE != srcPtrA->maxImageHeightE ) return FALSE;
5527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( ptrA->maxRadiusE != srcPtrA->maxRadiusE ) return FALSE;
5537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( ptrA->patchWidthE != srcPtrA->patchWidthE ) return FALSE;
5547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( ptrA->patchHeightE != srcPtrA->patchHeightE ) return FALSE;
5557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( ptrA->minScaleE != srcPtrA->minScaleE ) return FALSE;
5567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( ptrA->maxScaleE != srcPtrA->maxScaleE ) return FALSE;
5577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( ptrA->scaleStepE != srcPtrA->scaleStepE ) return FALSE;
5587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( ptrA->borderWidthE != srcPtrA->borderWidthE ) return FALSE;
5597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( ptrA->borderHeightE != srcPtrA->borderHeightE ) return FALSE;
5607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return TRUE;
5617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
5627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
5647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
5667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
5677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ query functions } -------------------------------------------- */
5687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
5697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
5707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
5727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bbf_Scanner_positions( const struct bbf_Scanner* ptrA )
5747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
5757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 wL = ( int32 )ptrA->currentWidthE - ptrA->patchWidthE;
5767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 hL = ( int32 )ptrA->currentHeightE - ptrA->patchHeightE;
5777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return ( wL >= 0 ? wL : 0 ) * ( hL >= 0 ? hL : 0 );
5787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
5797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
5817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bbf_Scanner_scanIndex( const struct bbf_Scanner* ptrA )
5837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
5847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return ptrA->yE * ptrA->currentWidthE + ptrA->xE;
5857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
5867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
5887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_Scanner_pos( const struct bbf_Scanner* ptrA,
5907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					  int32* xPtrA, int32* yPtrA, uint32* scalePtrA )
5917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
5927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* 16.16 */
5937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	*xPtrA = ( int32 )( ptrA->xE - ptrA->borderWidthE ) * ( int32 )( ptrA->scaleE >> 4 );
5947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* 16.16 */
5967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	*yPtrA = ( int32 )( ptrA->yE - ptrA->borderHeightE ) * ( int32 )( ptrA->scaleE >> 4 );
5977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* 12.20 */
5997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	*scalePtrA = ptrA->scaleE;
6007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
6017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
6037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_Scanner_idxPos( const struct bbf_Scanner* ptrA, uint32 scanIndexA,
6057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					     int32* xPtrA, int32* yPtrA, uint32* scalePtrA )
6067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
6077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 yL = scanIndexA / ptrA->currentWidthE;
6087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 xL = scanIndexA - ( yL * ptrA->currentWidthE );
6097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* 16.16 */
6117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	*xPtrA = ( int32 )( xL - ptrA->borderWidthE  ) * ( int32 )( ptrA->scaleE >> 4 );
6127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* 16.16 */
6147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	*yPtrA = ( int32 )( yL - ptrA->borderHeightE ) * ( int32 )( ptrA->scaleE >> 4 );
6157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	*scalePtrA = ptrA->scaleE;
6177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
6187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
6207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
6227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
6237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ modify functions } ------------------------------------------- */
6247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
6257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
6267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
6287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_Scanner_create( struct bbs_Context* cpA,
6307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						 struct bbf_Scanner* ptrA,
6317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						 flag maximizeSharedMemoryA,
6327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						 uint32 maxImageWidthA,
6337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					 	 uint32 maxImageHeightA,
6347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						 uint32 maxRadiusA,
6357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						 uint32 patchWidthA,
6367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						 uint32 patchHeightA,
6377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						 uint32 minScaleA,
6387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						 uint32 maxScaleA,
6397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						 uint32 scaleStepA,
6407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						 uint32 borderWidthA,
6417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						 uint32 borderHeightA,
6427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						 uint32 bufferSizeA,
6437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						 struct bbs_MemTbl* mtpA )
6447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
6457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->maxImageWidthE = maxImageWidthA;
6467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->maxImageHeightE = maxImageHeightA;
6477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->maxRadiusE = maxRadiusA;
6487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->patchWidthE = patchWidthA;
6497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->patchHeightE = patchHeightA;
6507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->minScaleE = minScaleA;
6517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->maxScaleE = maxScaleA;
6527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->scaleStepE = scaleStepA;
6537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->borderWidthE = borderWidthA;
6547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->borderHeightE = borderHeightA;
6557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->bufferSizeE = bufferSizeA;
6567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbf_Scanner_alloc( cpA, ptrA, mtpA, maximizeSharedMemoryA );
6577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
6587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
6607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_Scanner_bitParam( struct bbs_Context* cpA,
6627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						   struct bbf_Scanner* ptrA,
6637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						   const struct bbf_BitParam* bitParamPtrA )
6647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
6657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( !bbf_BitParam_equal( cpA, &ptrA->bitParamE, bitParamPtrA ) )
6667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
6677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bbf_BitParam_copy( cpA, &ptrA->bitParamE, bitParamPtrA );
6687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bbf_Scanner_createBitImage( cpA, ptrA );
6697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
6707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbf_Scanner_resetScan( cpA, ptrA );
6727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
6737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
6757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
6777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
6787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ I/O } -------------------------------------------------------- */
6797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
6807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
6817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
6837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bbf_Scanner_memSize( struct bbs_Context* cpA,
6857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							const struct bbf_Scanner* ptrA )
6867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
6877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 memSizeL = bbs_SIZEOF16( uint32 ) +
6887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					  bbs_SIZEOF16( uint32 ); /* version */
6897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memSizeL += bbs_SIZEOF16( ptrA->maxImageWidthE );
6907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memSizeL += bbs_SIZEOF16( ptrA->maxImageHeightE );
6917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memSizeL += bbs_SIZEOF16( ptrA->maxRadiusE );
6927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memSizeL += bbs_SIZEOF16( ptrA->patchWidthE );
6937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memSizeL += bbs_SIZEOF16( ptrA->patchHeightE );
6947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memSizeL += bbs_SIZEOF16( ptrA->minScaleE );
6957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memSizeL += bbs_SIZEOF16( ptrA->maxScaleE );
6967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memSizeL += bbs_SIZEOF16( ptrA->scaleStepE );
6977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memSizeL += bbs_SIZEOF16( ptrA->borderWidthE );
6987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memSizeL += bbs_SIZEOF16( ptrA->borderHeightE );
6997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return memSizeL;
7007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
7017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
7037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bbf_Scanner_memWrite( struct bbs_Context* cpA,
7057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						     const struct bbf_Scanner* ptrA,
7067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						     uint16* memPtrA )
7077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
7087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 memSizeL = bbf_Scanner_memSize( cpA, ptrA );
7097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWrite32( &memSizeL, memPtrA );
7107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWriteUInt32( bbf_SCANNER_VERSION, memPtrA );
7117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWrite32( &ptrA->maxImageWidthE, memPtrA );
7127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWrite32( &ptrA->maxImageHeightE, memPtrA );
7137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWrite32( &ptrA->maxRadiusE, memPtrA );
7147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWrite32( &ptrA->patchWidthE, memPtrA );
7157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWrite32( &ptrA->patchHeightE, memPtrA );
7167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWrite32( &ptrA->minScaleE, memPtrA );
7177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWrite32( &ptrA->maxScaleE, memPtrA );
7187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWrite32( &ptrA->scaleStepE, memPtrA );
7197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWrite32( &ptrA->borderWidthE, memPtrA );
7207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWrite32( &ptrA->borderHeightE, memPtrA );
7217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return memSizeL;
7227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
7237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
7257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bbf_Scanner_memRead( struct bbs_Context* cpA,
7277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						    struct bbf_Scanner* ptrA,
7287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						    const uint16* memPtrA,
7297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						    struct bbs_MemTbl* mtpA )
7307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
7317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 memSizeL, versionL;
7327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( bbs_Context_error( cpA ) ) return 0;
7347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memRead32( &memSizeL, memPtrA );
7357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memReadVersion32( cpA, &versionL, bbf_SCANNER_VERSION, memPtrA );
7367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memRead32( &ptrA->maxImageWidthE, memPtrA );
7387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memRead32( &ptrA->maxImageHeightE, memPtrA );
7397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memRead32( &ptrA->maxRadiusE, memPtrA );
7407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memRead32( &ptrA->patchWidthE, memPtrA );
7417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memRead32( &ptrA->patchHeightE, memPtrA );
7427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memRead32( &ptrA->minScaleE, memPtrA );
7437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memRead32( &ptrA->maxScaleE, memPtrA );
7447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memRead32( &ptrA->scaleStepE, memPtrA );
7457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memRead32( &ptrA->borderWidthE, memPtrA );
7467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memRead32( &ptrA->borderHeightE, memPtrA );
7477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( memSizeL != bbf_Scanner_memSize( cpA, ptrA ) )
7497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
7507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bbs_ERR0( bbs_ERR_CORRUPT_DATA, "uint32 bbf_Scanner_memRead( struct bem_ScanGradientMove* ptrA, const uint16* memPtrA ):\n"
7517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			        "size mismatch" );
7527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		return 0;
7537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
7547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( bbs_Context_error( cpA ) ) return 0;
7567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* allocate arrays */
7587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbf_Scanner_alloc( cpA, ptrA, mtpA, FALSE );
7597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( bbs_Context_error( cpA ) ) return 0;
7617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return memSizeL;
7637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
7647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
7667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
7687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
7697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ exec functions } --------------------------------------------- */
7707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
7717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
7727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
7747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_Scanner_resetScan( struct bbs_Context* cpA, struct bbf_Scanner* ptrA )
7767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
7777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->xE = 0;
7787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->yE = 0;
7797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbf_Scanner_initPatchBuffer( cpA, ptrA );
7807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
7817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
7837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_Scanner_assign( struct bbs_Context* cpA, struct bbf_Scanner* ptrA,
7857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					     const void* imagePtrA,
7867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						 uint32 imageWidthA,
7877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						 uint32 imageHeightA,
7887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						 const struct bts_Int16Rect* roiPtrA,
7897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						 const struct bbf_BitParam* paramPtrA )
7907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
7917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* copy image */
7927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbf_Scanner_copyImage( cpA, ptrA, imagePtrA, imageWidthA, imageHeightA, roiPtrA );
7937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->scaleE = ptrA->minScaleE;
7957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbf_BitParam_copy( cpA, &ptrA->bitParamE, paramPtrA );
7967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* compute effective max scale */
7987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
7997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* 16.16 */
8007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 maxHScaleL = ( ptrA->workWidthE << 16 ) / ( ptrA->patchWidthE + 1 );
8017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 maxVScaleL = ( ptrA->workHeightE << 16 ) / ( ptrA->patchHeightE + 1 );
8027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
8037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* 12.20 */
8047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		ptrA->effMaxScaleE = maxHScaleL < maxVScaleL ? ( maxHScaleL << 4 ) : ( maxVScaleL << 4 );
8057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
8067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( ptrA->maxScaleE > 0 ) ptrA->effMaxScaleE = ptrA->effMaxScaleE < ptrA->maxScaleE ? ptrA->effMaxScaleE : ptrA->maxScaleE;
8077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
8087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
8097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->scaleExpE = 0;
8107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
8117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* downscale work image if necessary */
8127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	while( ptrA->scaleE > ( ( uint32 )( 2 << ptrA->scaleExpE ) << 20 ) ) bbf_Scanner_downscale( cpA, ptrA );
8137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
8147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbf_Scanner_createBitImage( cpA, ptrA );
8157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbf_Scanner_resetScan( cpA, ptrA );
8167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
8177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
8187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
8197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
8207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectflag bbf_Scanner_nextScale( struct bbs_Context* cpA, struct bbf_Scanner* ptrA )
8217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
8227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( ptrA->scaleE + bbf_Scanner_scalePrd( ptrA->scaleE, ptrA->scaleStepE ) >= ptrA->effMaxScaleE ) return FALSE;
8237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->scaleE += bbf_Scanner_scalePrd( ptrA->scaleE, ptrA->scaleStepE );
8247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
8257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* downscale work image if necessary */
8267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	while( ptrA->scaleE > ( ( uint32 )( 2 << ptrA->scaleExpE ) << 20 ) ) bbf_Scanner_downscale( cpA, ptrA );
8277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
8287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbf_Scanner_createBitImage( cpA, ptrA );
8297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbf_Scanner_resetScan( cpA, ptrA );
8307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return TRUE;
8317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
8327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
8337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
8347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
8357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectconst uint32* bbf_Scanner_getPatch( const struct bbf_Scanner* ptrA )
8367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
8377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return ptrA->patchBufferE.arrPtrE + ptrA->xE;
8387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
8397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
8407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
8417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
8427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectflag bbf_Scanner_next( struct bbs_Context* cpA, struct bbf_Scanner* ptrA )
8437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
8447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( ( ptrA->xE + 1 ) < ( int32 )( ptrA->currentWidthE - ptrA->patchWidthE ) )
8457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
8467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		ptrA->xE++;
8477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		return TRUE;
8487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
8497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
8507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( ( ptrA->yE + 1 ) >= ( int32 )( ptrA->currentHeightE - ptrA->patchHeightE ) ) return FALSE;
8517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
8527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->xE = 0;
8537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->yE++;
8547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
8557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
8567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 offL = ( ptrA->yE & 0x1F );
8577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 rowL = ( ptrA->yE >> 5 ) + ( offL > 0 ? 1 : 0 );
8587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
8597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 sizeL = ptrA->bitImageE.widthE;
8607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32* dstL = ptrA->patchBufferE.arrPtrE;
8617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 iL;
8627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
8637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( rowL < ptrA->bitImageE.heightE )
8647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
8657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			uint32* srcL = ( uint32* )ptrA->bitImageE.arrE.arrPtrE + rowL * sizeL;
8667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			if( offL > 0 )
8677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
8687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				uint32 shlL = 32 - offL;
8697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				for( iL = 0; iL < sizeL; iL++ ) dstL[ iL ] = ( dstL[ iL ] >> 1 ) | ( srcL[ iL ] << shlL );
8707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
8717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			else
8727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
8737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				bbs_memcpy32( dstL, srcL, sizeL );
8747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
8757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
8767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		else
8777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
8787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			for( iL = 0; iL < sizeL; iL++ ) dstL[ iL ] >>= 1;
8797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
8807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
8817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
8827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return TRUE;
8837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
8847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
8857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
8867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
8877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_Scanner_goToXY( struct bbs_Context* cpA, struct bbf_Scanner* ptrA, int32 xA, int32 yA )
8887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
8897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_DEF_fNameL( "void bbf_Scanner_goToXY( struct bbs_Context* cpA, struct bbf_Scanner* ptrA, int32 xA, int32 yA )" )
8907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
8917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( xA > ( int32 )( ptrA->currentWidthE - ptrA->patchWidthE ) )
8927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
8937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bbs_ERROR1( "%s:\nyA out of range", fNameL );
8947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		return;
8957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
8967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
8977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->xE = xA;
8987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
8997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( ptrA->yE == yA ) return;
9007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
9017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( yA >= ( int32 )( ptrA->currentHeightE - ptrA->patchHeightE ) )
9027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
9037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bbs_ERROR1( "%s:\nyA out of range", fNameL );
9047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		return;
9057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
9067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
9077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( yA == ptrA->yE + 1 )
9087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
9097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 offL, rowL;
9107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 sizeL;
9117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32* dstL;
9127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 iL;
9137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
9147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		ptrA->yE = yA;
9157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		offL = ( ptrA->yE & 0x1F );
9167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		rowL = ( ptrA->yE >> 5 ) + ( offL > 0 ? 1 : 0 );
9177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
9187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		sizeL = ptrA->bitImageE.widthE;
9197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		dstL = ptrA->patchBufferE.arrPtrE;
9207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
9217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( rowL < ptrA->bitImageE.heightE )
9227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
9237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			uint32* srcL = ptrA->bitImageE.arrE.arrPtrE + rowL * sizeL;
9247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			if( offL > 0 )
9257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
9267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				uint32 shlL = 32 - offL;
9277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				for( iL = 0; iL < sizeL; iL++ ) dstL[ iL ] = ( dstL[ iL ] >> 1 ) | ( srcL[ iL ] << shlL );
9287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
9297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			else
9307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
9317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				bbs_memcpy32( dstL, srcL, sizeL );
9327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
9337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
9347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		else
9357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
9367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			for( iL = 0; iL < sizeL; iL++ ) dstL[ iL ] >>= 1;
9377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
9387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
9397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	else
9407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
9417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 offL, rowL;
9427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 sizeL;
9437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32* dstL;
9447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 iL;
9457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
9467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		ptrA->yE = yA;
9477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		offL = ( ptrA->yE & 0x1F );
9487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		rowL = ( ptrA->yE >> 5 ) + ( offL > 0 ? 1 : 0 );
9497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
9507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		sizeL = ptrA->bitImageE.widthE;
9517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		dstL = ptrA->patchBufferE.arrPtrE;
9527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
9537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( rowL < ptrA->bitImageE.heightE )
9547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
9557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			if( offL > 0 )
9567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
9577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				uint32* src1L = ptrA->bitImageE.arrE.arrPtrE + rowL * sizeL;
9587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				uint32* src0L = src1L - sizeL;
9597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				uint32 shlL = 32 - offL;
9607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				for( iL = 0; iL < sizeL; iL++ ) dstL[ iL ] = ( src0L[ iL ] >> offL ) | ( src1L[ iL ] << shlL );
9617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
9627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			else
9637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
9647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				bbs_memcpy32( dstL, ptrA->bitImageE.arrE.arrPtrE + rowL * sizeL, sizeL );
9657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
9667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
9677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		else
9687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
9697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			uint32* srcL = ptrA->bitImageE.arrE.arrPtrE + ( rowL - 1 ) * sizeL;
9707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			for( iL = 0; iL < sizeL; iL++ ) dstL[ iL ] = srcL[ iL ] >> offL;
9717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
9727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
9737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
9747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
9757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
9767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
9777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_Scanner_goToIndex( struct bbs_Context* cpA, struct bbf_Scanner* ptrA, uint32 scanIndexA )
9787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
9797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 yL = scanIndexA / ptrA->currentWidthE;
9807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 xL = scanIndexA - yL * ptrA->currentWidthE;
9817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbf_Scanner_goToXY( cpA, ptrA, xL, yL );
9827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
9837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
9847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
9857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
9867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_Scanner_goToUls( struct bbs_Context* cpA, struct bbf_Scanner* ptrA,
9877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						  int32 xA, int32 yA, uint32 scaleA )
9887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
9897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 xL = ( xA / ( int32 )( ptrA->scaleE >> 4 ) ) + ptrA->borderWidthE;
9907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 yL = ( yA / ( int32 )( ptrA->scaleE >> 4 ) ) + ptrA->borderHeightE;
9917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
9927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( ptrA->scaleE != scaleA )
9937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
9947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bbs_ERROR0( "bbf_Scanner_goToUls:\nScales no not match" );
9957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		return;
9967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
9977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
9987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbf_Scanner_goToXY( cpA, ptrA, xL, yL );
9997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
10007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
10017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
10027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
10037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* resets output positions */
10047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_Scanner_resetOutPos( struct bbs_Context* cpA, struct bbf_Scanner* ptrA )
10057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
10067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->outCountE = 0;
10077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
10087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
10097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
10107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
10117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* resets internal positions */
10127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_Scanner_resetIntPos( struct bbs_Context* cpA, struct bbf_Scanner* ptrA )
10137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
10147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->intCountE = 0;
10157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
10167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
10177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
10187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
10197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* add internal position */
10207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_Scanner_addIntPos( struct bbs_Context* cpA,
10217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							struct bbf_Scanner* ptrA,
10227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							uint32 idxA,
10237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							int32 actA )
10247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
10257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( ptrA->intCountE < ptrA->idxArrE.sizeE )
10267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
10277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project        ptrA->idxArrE.arrPtrE[ ptrA->intCountE ] = idxA;
10287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project        ptrA->actArrE.arrPtrE[ ptrA->intCountE ] = actA;
10297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		ptrA->intCountE++;
10307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
10317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	else
10327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
10337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* When buffer is full then replace lowest confidence-entry with new input
10347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		 * This fallback solution causes soft degradation of performance when the buffer limit is reached.
10357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		 */
10367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 minActL = 0x7FFFFFFF;
10377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 minIdxL = 0;
10387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 iL;
10397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32* actArrL = ptrA->actArrE.arrPtrE;
10407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		for( iL = 0; iL < ptrA->intCountE; iL++ )
10417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
10427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			if( actArrL[ iL ] < minActL )
10437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
10447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				minActL = actArrL[ iL ];
10457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				minIdxL = iL;
10467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
10477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
10487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
10497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( actA > minActL )
10507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
10517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			ptrA->idxArrE.arrPtrE[ minIdxL ] = idxA;
10527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			ptrA->actArrE.arrPtrE[ minIdxL ] = actA;
10537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
10547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
10557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
10567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
10577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
10587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
10597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* add external position */
10607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_Scanner_addOutPos( struct bbs_Context* cpA,
10617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							struct bbf_Scanner* ptrA,
10627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							int32 xA,
10637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							int32 yA,
10647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							uint32 scaleA,
10657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							int32 actA )
10667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
10677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( ( ptrA->outCountE * 4 ) < ptrA->outArrE.sizeE )
10687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
10697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project        ptrA->outArrE.arrPtrE[ ptrA->outCountE * 4 + 0 ] = xA;
10707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project        ptrA->outArrE.arrPtrE[ ptrA->outCountE * 4 + 1 ] = yA;
10717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project        ptrA->outArrE.arrPtrE[ ptrA->outCountE * 4 + 2 ] = scaleA;
10727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project        ptrA->outArrE.arrPtrE[ ptrA->outCountE * 4 + 3 ] = actA;
10737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		ptrA->outCountE++;
10747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
10757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	else
10767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
10777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* When buffer is full then replace lowest confidence-entry with new input
10787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		 * This fallback solution causes soft degradation of performance when the buffer limit is reached.
10797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		 */
10807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 minActL = 0x7FFFFFFF;
10817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 minIdxL = 0;
10827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 iL;
10837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32* outArrL = ptrA->outArrE.arrPtrE;
10847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		for( iL = 0; iL < ptrA->outCountE; iL++ )
10857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
10867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			if( outArrL[ iL * 4 + 3 ] < minActL )
10877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
10887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				minActL = outArrL[ iL * 4 + 3 ];
10897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				minIdxL = iL;
10907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
10917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
10927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
10937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( actA > minActL )
10947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
10957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			ptrA->idxArrE.arrPtrE[ minIdxL * 4 + 0 ] = xA;
10967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			ptrA->idxArrE.arrPtrE[ minIdxL * 4 + 1 ] = yA;
10977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			ptrA->idxArrE.arrPtrE[ minIdxL * 4 + 2 ] = scaleA;
10987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			ptrA->idxArrE.arrPtrE[ minIdxL * 4 + 3 ] = actA;
10997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
11007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
11017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
11027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
11037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
11047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
11057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* remove overlaps */
11067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bbf_Scanner_removeOutOverlaps( struct bbs_Context* cpA,
11077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							          struct bbf_Scanner* ptrA,
11087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project									  uint32 overlapThrA )
11097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
11107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 begIdxL = 0;				   /* begin index */
11117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 endIdxL = ptrA->outCountE;  /* end index */
11127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 iL;
11137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 rw0L = ptrA->patchWidthE;
11147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 rh0L = ptrA->patchHeightE;
11157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32* outArrL = ptrA->outArrE.arrPtrE;
11167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
11177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( overlapThrA >= 0x010000 ) return ptrA->outCountE;
11187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
11197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	while( endIdxL - begIdxL > 1 )
11207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
11217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 x1L, y1L, s1L, a1L;
11227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 r1wL, r1hL;
11237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 r1aL;
11247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
11257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* find maximum activity */
11267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 maxIdxL  = 0;
11277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
11287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
11297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 maxActL = ( int32 )0x80000000;
11307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			for( iL = begIdxL; iL < endIdxL; iL++ )
11317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
11327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				if( outArrL[ iL * 4 + 3 ] > maxActL )
11337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
11347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					maxActL = outArrL[ iL * 4 + 3 ];
11357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					maxIdxL = iL;
11367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
11377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
11387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
11397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
11407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* swap with position 0 */
11417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		x1L = outArrL[ maxIdxL * 4 + 0 ];
11427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		y1L = outArrL[ maxIdxL * 4 + 1 ];
11437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		s1L = outArrL[ maxIdxL * 4 + 2 ];
11447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		a1L = outArrL[ maxIdxL * 4 + 3 ];
11457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
11467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		outArrL[ maxIdxL * 4 + 0 ] = outArrL[ begIdxL * 4 + 0 ];
11477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		outArrL[ maxIdxL * 4 + 1 ] = outArrL[ begIdxL * 4 + 1 ];
11487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		outArrL[ maxIdxL * 4 + 2 ] = outArrL[ begIdxL * 4 + 2 ];
11497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		outArrL[ maxIdxL * 4 + 3 ] = outArrL[ begIdxL * 4 + 3 ];
11507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
11517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		outArrL[ begIdxL * 4 + 0 ] = x1L;
11527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		outArrL[ begIdxL * 4 + 1 ] = y1L;
11537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		outArrL[ begIdxL * 4 + 2 ] = s1L;
11547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		outArrL[ begIdxL * 4 + 3 ] = a1L;
11557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
11567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* rectangle */
11577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		r1wL = ( rw0L * ( s1L >> 12 ) + 128 ) >> 8;
11587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		r1hL = ( rh0L * ( s1L >> 12 ) + 128 ) >> 8;
11597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		r1aL = ( uint32 )r1wL * ( uint32 )r1hL;
11607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
11617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* remove coordinate fractions */
11627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		x1L = ( x1L + ( 1 << 15 ) ) >> 16;
11637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		y1L = ( y1L + ( 1 << 15 ) ) >> 16;
11647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
11657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* compare to other rectangles and remove overlaps */
11667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		for( iL = endIdxL - 1; iL > begIdxL; iL-- )
11677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
11687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32* x2pL = &outArrL[ iL * 4 + 0 ];
11697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32* y2pL = &outArrL[ iL * 4 + 1 ];
11707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32* s2pL = &outArrL[ iL * 4 + 2 ];
11717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32* a2pL = &outArrL[ iL * 4 + 3 ];
11727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
11737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 x2L = ( *x2pL + ( 1 << 15 ) ) >> 16;
11747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 y2L = ( *y2pL + ( 1 << 15 ) ) >> 16;
11757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
11767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* rectangle */
11777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 r2wL = ( rw0L * ( *s2pL >> 12 ) + 128 ) >> 8;
11787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 r2hL = ( rh0L * ( *s2pL >> 12 ) + 128 ) >> 8;
11797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			uint32 r2aL = r2wL * r2hL;
11807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
11817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* intersection */
11827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 rx1L = x1L > x2L ? x1L : x2L;
11837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 rx2L = ( x1L + r1wL ) < ( x2L + r2wL ) ? ( x1L + r1wL ) : ( x2L + r2wL );
11847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 ry1L = y1L > y2L ? y1L : y2L;
11857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 ry2L = ( y1L + r1hL ) < ( y2L + r2hL ) ? ( y1L + r1hL ) : ( y2L + r2hL );
11867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			uint32 riwL;
11877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
11887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			rx2L = ( rx2L > rx1L ) ? rx2L : rx1L;
11897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			ry2L = ( ry2L > ry1L ) ? ry2L : ry1L;
11907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			riwL = ( uint32 )( rx2L - rx1L ) * ( uint32 )( ry2L - ry1L );
11917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
11927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			if( riwL > ( ( ( overlapThrA >> 8 ) * ( r1aL < r2aL ? r1aL : r2aL ) ) >> 8 ) )
11937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
11947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				endIdxL--;
11957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				*x2pL = outArrL[ endIdxL * 4 + 0 ];
11967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				*y2pL = outArrL[ endIdxL * 4 + 1 ];
11977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				*s2pL = outArrL[ endIdxL * 4 + 2 ];
11987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				*a2pL = outArrL[ endIdxL * 4 + 3 ];
11997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
12007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
12017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
12027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		begIdxL++;
12037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
12047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
12057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->outCountE = endIdxL;
12067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
12077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return endIdxL;
12087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
12097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
12107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
12117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
12127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* remove internal overlaps */
12137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bbf_Scanner_removeIntOverlaps( struct bbs_Context* cpA,
12147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project								      struct bbf_Scanner* ptrA,
12157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project									  uint32 overlapThrA )
12167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
12177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project    uint32 begIdxL = 0;		 /* begin index */
12187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project    uint32 endIdxL = ptrA->intCountE;  /* end index */
12197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 iL;
12207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 rw0L   = ptrA->patchWidthE;
12217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 rh0L   = ptrA->patchHeightE;
12227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 minAreaL = ( overlapThrA * rw0L * rh0L ) >> 16;
12237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
12247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32*  actArrL = ptrA->actArrE.arrPtrE;
12257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32* idxArrL = ptrA->idxArrE.arrPtrE;
12267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
12277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( overlapThrA >= 0x010000 ) return ptrA->intCountE;
12287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
12297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	while( endIdxL - begIdxL > 1 )
12307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
12317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* find maximum activity */
12327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 a1L = ( int32 )0x80000000;
12337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 i1L = 0;
12347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 maxIdxL  = 0;
12357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 x1L, y1L;
12367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
12377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		for( iL = begIdxL; iL < endIdxL; iL++ )
12387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
12397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project            if( actArrL[ iL ] > a1L )
12407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
12417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				a1L = actArrL[ iL ];
12427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				maxIdxL = iL;
12437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
12447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
12457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
12467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* swap with position 0 */
12477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		i1L = idxArrL[ maxIdxL ];
12487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		idxArrL[ maxIdxL ] = idxArrL[ begIdxL ];
12497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		actArrL[ maxIdxL ] = actArrL[ begIdxL ];
12507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		idxArrL[ begIdxL ] = i1L;
12517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		actArrL[ begIdxL ] = a1L;
12527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
12537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* upper left coordinates */
12547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		y1L = i1L / ptrA->currentWidthE;
12557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		x1L = i1L - ( y1L * ptrA->currentWidthE );
12567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
12577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* compare to other rectangles and remove overlaps */
12587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		for( iL = endIdxL - 1; iL > begIdxL; iL-- )
12597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
12607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32*  a2pL = &actArrL[ iL ];
12617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			uint32* i2pL = &idxArrL[ iL ];
12627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
12637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 y2L = *i2pL / ptrA->currentWidthE;
12647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 x2L = *i2pL - ( y2L * ptrA->currentWidthE );
12657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
12667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 dxL = rw0L - ( x1L > x2L ? x1L - x2L : x2L - x1L );
12677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 dyL = rh0L - ( y1L > y2L ? y1L - y2L : y2L - y1L );
12687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
12697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			dxL = dxL > 0 ? dxL : 0;
12707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			dyL = dyL > 0 ? dyL : 0;
12717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
12727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			if( dxL * dyL > minAreaL )
12737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
12747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				endIdxL--;
12757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				*a2pL = actArrL[ endIdxL ];
12767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				*i2pL = idxArrL[ endIdxL ];
12777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
12787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
12797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
12807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		begIdxL++;
12817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
12827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
12837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->intCountE = endIdxL;
12847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
12857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return ptrA->intCountE;
12867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
12877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
12887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
12897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
12907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
1291