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/LocalScanner.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/** allocates arays */
347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_LocalScanner_alloc( struct bbs_Context* cpA,
357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							 struct bbf_LocalScanner* ptrA,
367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							 struct bbs_MemTbl* mtpA )
377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	struct bbs_MemTbl memTblL = *mtpA;
397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	struct bbs_MemSeg* espL = bbs_MemTbl_segPtr( cpA, &memTblL, 0 );
407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	struct bbs_MemSeg* sspL = bbs_MemTbl_sharedSegPtr( cpA, &memTblL, 0 );
417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* filter patch dimension */
437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 proL = ptrA->maxRadiusE;
447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 pwoL = ( proL << 1 ) + 1;
457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* output image size (bit image) */
477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 woL = ptrA->maxImageWidthE;
487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 hoL = ptrA->maxImageHeightE;
497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( ptrA->minScaleExpE > 0 )
517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* allocate working image */
537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bbs_UInt8Arr_create( cpA, &ptrA->workImageBufferE, ( woL >> 1 ) * ( hoL >> 1 ), espL );
547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bbs_UInt8Arr_fill( cpA, &ptrA->workImageBufferE, 0 );
557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* allocate bit image */
587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bim_UInt32Image_create( cpA, &ptrA->bitImageE, woL, ( hoL >> 5 ) + ( ( ( hoL & 0x1F ) != 0 ) ? 1 : 0 ), espL );
597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bim_UInt32Image_setAllPixels( cpA, &ptrA->bitImageE, 0, 0 );
607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* allocate patch buffer */
627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_UInt32Arr_create( cpA, &ptrA->patchBufferE, ptrA->bitImageE.widthE, espL );
637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_UInt32Arr_fill( cpA, &ptrA->patchBufferE, 0 );
647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* allocate table */
667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bim_UInt32Image_create( cpA, &ptrA->satE, woL + pwoL, pwoL + 1, sspL );
677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/** downscales original image by factor 2 */
727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_LocalScanner_downscale0( struct bbs_Context* cpA, struct bbf_LocalScanner* ptrA )
737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 w0L = ptrA->origWidthE;
757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 h0L = ptrA->origHeightE;
767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 w1L = ( w0L - ptrA->xOffE ) >> 1;
787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 h1L = ( h0L - ptrA->yOffE ) >> 1;
797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	const uint8* iArrL = ptrA->origImagePtrE + ptrA->xOffE + ptrA->yOffE * w0L;
817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		  uint8* oArrL = ptrA->workImageBufferE.arrPtrE;
827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 iL, jL;
847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 kL = 0;
857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_UInt8Arr_size( cpA, &ptrA->workImageBufferE, w1L * h1L );
877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->workImagePtrE = ptrA->workImageBufferE.arrPtrE;
887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->workWidthE = w1L;
897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->workHeightE = h1L;
907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	for( jL = 0; jL < h1L; jL++ )
927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		for( iL = 0; iL < w1L; iL++ )
947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 idxL = jL * 2 * w0L + iL * 2;
967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			oArrL[ kL++ ] = ( ( uint32 )iArrL[ idxL           ] +
977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project										iArrL[ idxL + 1       ] +
987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project										iArrL[ idxL + w0L     ] +
997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project										iArrL[ idxL + w0L + 1 ] + 2 ) >> 2;
1007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
1017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
1027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
1037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
1057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/** downscales work image by factor 2 */
1077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_LocalScanner_downscale1( struct bbs_Context* cpA, struct bbf_LocalScanner* ptrA )
1087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
1097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 w0L = ptrA->workWidthE;
1107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 h0L = ptrA->workHeightE;
1117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 w1L = w0L >> 1;
1127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 h1L = h0L >> 1;
1137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project    uint8* arrL = ptrA->workImageBufferE.arrPtrE;
1157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 iL, jL;
1177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 kL = 0;
1187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	for( jL = 0; jL < h1L; jL++ )
1207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
1217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		for( iL = 0; iL < w1L; iL++ )
1227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
1237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 idxL = jL * 2 * w0L + iL * 2;
1247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			arrL[ kL++ ] = ( ( uint32 )arrL[ idxL ] +
1257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project									   arrL[ idxL + 1 ] +
1267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project									   arrL[ idxL + w0L ] +
1277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project									   arrL[ idxL + w0L + 1 ] + 2 ) >> 2;
1287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
1297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
1307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->workWidthE = w1L;
1327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->workHeightE = h1L;
1337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
1347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
1367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/** downscales by factor 2 */
1387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_LocalScanner_downscale( struct bbs_Context* cpA, struct bbf_LocalScanner* ptrA )
1397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
1407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 iL;
1417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( ptrA->scaleExpE > 0 ) bbf_LocalScanner_downscale0( cpA, ptrA );
1427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	for( iL = 1; iL < ptrA->scaleExpE; iL++ ) bbf_LocalScanner_downscale1( cpA, ptrA );
1437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
1447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
1467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/** computes bit image */
1487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_LocalScanner_createBitImage( struct bbs_Context* cpA, struct bbf_LocalScanner* ptrA )
1497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
1507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_DEF_fNameL( "void bbf_LocalScanner_createBitImage( struct bbs_Context* cpA, struct bbf_LocalScanner* ptrA )" )
1517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 iL, jL;
1537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 proL = ptrA->bitParamE.outerRadiusE;
1557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 priL = ptrA->bitParamE.innerRadiusE;
1567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 pwoL = ( proL << 1 ) + 1;
1577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 pwiL = ( priL << 1 ) + 1;
1587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* areas of inner and outer rectangles */
1607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 poAreaL = pwoL * pwoL;
1617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 piAreaL = pwiL * pwiL;
1627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 wL, hL; /* input image size */
1647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 wsL, hsL;
1667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32* satL;
1677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 satSizeL;
1687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 swi1L = 0; /* writing index */
1697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 swi2L = 0; /* writing index */
1707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 sriL = 0;  /* reading index */
1717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 siL[ 8 ];
1727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32  bitMaskL;
1747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32* bitRowL;
1757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( proL <= priL )
1787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
1797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bbs_ERROR1( "%s:\n outer radius <= inner radius", fNameL );
1807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		return;
1817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
1827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* input image size */
1847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	wL = ptrA->workWidthE;
1857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	hL = ptrA->workHeightE;
1867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( wL <= pwoL || hL <= pwoL )
1887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
1897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bbs_ERROR1( "%s:\n image is too small", fNameL );
1907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		return;
1917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
1927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->currentWidthE  = wL;
1947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->currentHeightE = hL;
1957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* reset scan region */
1977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->workScanRegionE = bts_Int16Rect_create( 0, 0, ptrA->currentWidthE, ptrA->currentHeightE );
1987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* initialize bit image */
2007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bim_UInt32Image_size( cpA, &ptrA->bitImageE, wL, ( hL >> 5 ) + ( ( ( hL & 0x1F ) != 0 ) ? 1 : 0 ) );
2017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bim_UInt32Image_setAllPixels( cpA, &ptrA->bitImageE, 0, 0 );
2027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bitMaskL = 1;
2047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bitRowL = ( uint32* )ptrA->bitImageE.arrE.arrPtrE;
2057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* width of table */
2077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	wsL = wL + pwoL;
2087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* height of table */
2107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	hsL = pwoL + 1;
2117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bim_UInt32Image_size( cpA, &ptrA->satE, wsL, hsL );
2137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	satL = ( uint32* )ptrA->satE.arrE.arrPtrE;
2157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	satSizeL = ptrA->satE.arrE.sizeE;
2167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* compute table and bit image */
2187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	for( iL = wsL * ( proL + 1 ); iL > 0; iL-- ) satL[ swi1L++ ] = 0;
2197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	swi2L = swi1L - wsL;
2207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	for( jL = 0; jL < hL + proL; jL++ )
2227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
2237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( jL < hL ) /* rescale area */
2247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
2257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			const uint8* arr0L = &ptrA->workImagePtrE[ jL * wL ];
2267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			uint32 hSumL = 0;
2277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			for( iL = 0; iL <= proL; iL++ ) satL[ swi1L++ ] = 0;
2287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			swi2L += iL;
2297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			for( iL = 0; iL < wL; iL++ )   satL[ swi1L++ ] = ( hSumL += arr0L[ iL ] ) + satL[ swi2L++ ];
2307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			for( iL = 0; iL < proL; iL++ ) satL[ swi1L++ ] =   hSumL                  + satL[ swi2L++ ];
2317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
2327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		else /* image is processed - fill in 0s */
2337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
2347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			for( iL = 0; iL < wsL; iL++ ) satL[ swi1L++ ] = satL[ swi2L++ ];
2357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
2367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		swi1L = ( swi1L < satSizeL ) ? swi1L : 0;
2387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		swi2L = ( swi2L < satSizeL ) ? swi2L : 0;
2397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* fill line in bit image */
2417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( jL >= proL )
2427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
2437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			const uint32* rSatL = satL;
2447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* table coordinate indices for outer rectangle */
2467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			siL[ 0 ] = sriL;
2477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			siL[ 1 ] = siL[ 0 ] + pwoL;
2487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			siL[ 2 ] = siL[ 0 ] + pwoL * wsL;
2497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			siL[ 2 ] -= ( siL[ 2 ] >= satSizeL ) ? satSizeL : 0;
2507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			siL[ 3 ] = siL[ 2 ] + pwoL;
2517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* table coordinate indices for inner rectangle */
2537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			siL[ 4 ] = siL[ 0 ] + ( proL - priL ) * wsL + ( proL - priL );
2547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			siL[ 4 ] -= ( siL[ 4 ] >= satSizeL ) ? satSizeL : 0;
2557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			siL[ 5 ] = siL[ 4 ] + pwiL;
2567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			siL[ 6 ] = siL[ 4 ] + pwiL * wsL;
2577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			siL[ 6 ] -= ( siL[ 6 ] >= satSizeL ) ? satSizeL : 0;
2587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			siL[ 7 ] = siL[ 6 ] + pwiL;
2597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			sriL += wsL;
2607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			if( sriL == satSizeL ) sriL = 0;
2617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			for( iL = 0; iL < wL; iL++ )
2637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
2647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				uint32 oAvgL = ( rSatL[ siL[ 0 ] ] - rSatL[ siL[ 1 ] ] - rSatL[ siL[ 2 ] ] + rSatL[ siL[ 3 ] ] ) * piAreaL;
2657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				uint32 iAvgL = ( rSatL[ siL[ 4 ] ] - rSatL[ siL[ 5 ] ] - rSatL[ siL[ 6 ] ] + rSatL[ siL[ 7 ] ] ) * poAreaL;
2667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				bitRowL[ iL ] |= ( iAvgL > oAvgL ) ? bitMaskL : 0;
2677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				rSatL++;
2687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
2697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			if( ( bitMaskL <<= 1 ) == 0 )
2707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
2717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				bitRowL += wL;
2727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				bitMaskL = 1;
2737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
2747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
2757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
2767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
2777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* -------------------------------------------------------------------------- */
2797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/** inilialize patch buffer */
2817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_LocalScanner_initPatchBuffer( struct bbs_Context* cpA, struct bbf_LocalScanner* ptrA )
2827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
2837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 ybL = ptrA->workScanRegionE.y1E >> 5;
2847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 yoL = ptrA->workScanRegionE.y1E & 0x1F;
2857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 xbL = ptrA->workScanRegionE.x1E;
2867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 wsrWidthL = ptrA->workScanRegionE.x2E - ptrA->workScanRegionE.x1E;
2877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_UInt32Arr_size( cpA, &ptrA->patchBufferE, ptrA->bitImageE.widthE );
2897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( yoL == 0 )
2917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
2927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bbs_memcpy32( ptrA->patchBufferE.arrPtrE + xbL,
2937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			          ptrA->bitImageE.arrE.arrPtrE + ybL * ptrA->bitImageE.widthE + xbL,
2947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					  wsrWidthL );
2957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
2967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	else if( ybL == ( int32 )ptrA->bitImageE.heightE - 1 )
2977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
2987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32* dstL = ptrA->patchBufferE.arrPtrE + xbL;
2997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		const uint32* srcL = ptrA->bitImageE.arrE.arrPtrE + ybL * ptrA->bitImageE.widthE + xbL;
3007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 iL;
3017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		for( iL = 0; iL < wsrWidthL; iL++ ) dstL[ iL ] = srcL[ iL ] >> yoL;
3027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
3037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	else
3047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
3057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32* dstL = ptrA->patchBufferE.arrPtrE + xbL;
3067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		const uint32* src0L = ptrA->bitImageE.arrE.arrPtrE + ybL * ptrA->bitImageE.widthE + xbL;
3077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		const uint32* src1L = src0L + ptrA->bitImageE.widthE;
3087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 iL;
3097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 slL = 32 - yoL;
3107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		for( iL = 0; iL < wsrWidthL; iL++ ) dstL[ iL ] = ( src0L[ iL ] >> yoL ) | ( src1L[ iL ] << slL );
3117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
3127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
3137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
3157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* sets work scan region from original scan region according to scale exponent */
3177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_LocalScanner_setWorkScanRegion( struct bbs_Context* cpA, struct bbf_LocalScanner* ptrA )
3187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
3197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 xMinL = ptrA->origScanRegionE.x1E >> ptrA->scaleExpE;
3207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 yMinL = ptrA->origScanRegionE.y1E >> ptrA->scaleExpE;
3217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 xMaxL = ptrA->origScanRegionE.x2E >> ptrA->scaleExpE;
3227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 yMaxL = ptrA->origScanRegionE.y2E >> ptrA->scaleExpE;
3237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->workScanRegionE.x1E = ( xMinL < 0 ) ? 0 : xMinL;
3247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->workScanRegionE.y1E = ( yMinL < 0 ) ? 0 : yMinL;
3257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->workScanRegionE.x2E = ( xMaxL > ( int32 )ptrA->currentWidthE ) ? ptrA->currentWidthE : xMaxL;
3267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->workScanRegionE.y2E = ( yMaxL > ( int32 )ptrA->currentHeightE ) ? ptrA->currentHeightE : yMaxL;
3277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
3287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
3307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
3327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
3337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ constructor / destructor } ----------------------------------- */
3347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
3357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
3367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
3387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_LocalScanner_init( struct bbs_Context* cpA,
3407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					        struct bbf_LocalScanner* ptrA )
3417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
3427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->xE = 0;
3437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->yE = 0;
3447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->xOffE = 0;
3457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->yOffE = 0;
3467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->currentWidthE = 0;
3477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->currentHeightE = 0;
3487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->workWidthE = 0;
3497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->workHeightE = 0;
3507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->workImagePtrE = NULL;
3517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->origWidthE = 0;
3527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->origHeightE = 0;
3537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->origImagePtrE = NULL;
3547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbf_BitParam_init( cpA, &ptrA->bitParamE );
3557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_UInt8Arr_init( cpA, &ptrA->workImageBufferE );
3567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bim_UInt32Image_init( cpA, &ptrA->satE );
3577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bim_UInt32Image_init( cpA, &ptrA->bitImageE );
3587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_UInt32Arr_init( cpA, &ptrA->patchBufferE );
3597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bts_Int16Rect_init( cpA, &ptrA->origScanRegionE );
3607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bts_Int16Rect_init( cpA, &ptrA->workScanRegionE );
3617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->patchWidthE = 0;
3637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->patchHeightE = 0;
3647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->scaleExpE = 0;
3657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->maxImageWidthE = 0;
3667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->maxImageHeightE = 0;
3677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->minScaleExpE = 0;
3687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->maxRadiusE = 0;
3697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
3707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
3727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_LocalScanner_exit( struct bbs_Context* cpA,
3747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				            struct bbf_LocalScanner* ptrA )
3757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
3767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->xE = 0;
3777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->yE = 0;
3787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->xOffE = 0;
3797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->yOffE = 0;
3807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->currentWidthE = 0;
3817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->currentHeightE = 0;
3827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->workWidthE = 0;
3837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->workHeightE = 0;
3847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->workImagePtrE = NULL;
3857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->origWidthE = 0;
3867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->origHeightE = 0;
3877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->origImagePtrE = NULL;
3887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbf_BitParam_exit( cpA, &ptrA->bitParamE );
3897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_UInt8Arr_exit( cpA, &ptrA->workImageBufferE );
3907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bim_UInt32Image_exit( cpA, &ptrA->satE );
3917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bim_UInt32Image_exit( cpA, &ptrA->bitImageE );
3927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_UInt32Arr_exit( cpA, &ptrA->patchBufferE );
3937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bts_Int16Rect_exit( cpA, &ptrA->origScanRegionE );
3947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bts_Int16Rect_exit( cpA, &ptrA->workScanRegionE );
3957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->patchWidthE = 0;
3977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->patchHeightE = 0;
3987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->scaleExpE = 0;
3997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->maxImageWidthE = 0;
4007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->maxImageHeightE = 0;
4017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->minScaleExpE = 0;
4027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->maxRadiusE = 0;
4037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
4047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
4067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
4087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
4097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ operators } -------------------------------------------------- */
4107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
4117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
4127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
4147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_LocalScanner_copy( struct bbs_Context* cpA,
4167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				            struct bbf_LocalScanner* ptrA,
4177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					        const struct bbf_LocalScanner* srcPtrA )
4187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
4197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_ERROR0( "bbf_LocalScanner_copy:\n Function is not available" );
4207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
4217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
4237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectflag bbf_LocalScanner_equal( struct bbs_Context* cpA,
4257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							 const struct bbf_LocalScanner* ptrA,
4267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							 const struct bbf_LocalScanner* srcPtrA )
4277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
4287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_ERROR0( "bbf_LocalScanner_equal:\n Function is not available" );
4297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return FALSE;
4307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
4317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
4337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
4357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
4367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ query functions } -------------------------------------------- */
4377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
4387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
4397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
4417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bbf_LocalScanner_positions( const struct bbf_LocalScanner* ptrA )
4437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
4447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 wL = ptrA->workScanRegionE.x2E - ptrA->workScanRegionE.x1E - ptrA->patchWidthE;
4457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 hL = ptrA->workScanRegionE.y2E - ptrA->workScanRegionE.y1E - ptrA->patchHeightE;
4467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return ( ( wL < 0 ) ? 0 : wL ) * ( ( hL < 0 ) ? 0 : hL );
4477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
4487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
4507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bbf_LocalScanner_scanIndex( const struct bbf_LocalScanner* ptrA )
4527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
4537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 wL = ptrA->workScanRegionE.x2E - ptrA->workScanRegionE.x1E - ptrA->patchWidthE;
4547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return ( ptrA->yE - ptrA->workScanRegionE.y1E ) * wL + ( ptrA->xE - ptrA->workScanRegionE.x1E );
4557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
4567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
4587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_LocalScanner_pos( const struct bbf_LocalScanner* ptrA, int32* xPtrA, int32* yPtrA )
4607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
4617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	*xPtrA = ( ( ptrA->xE << ptrA->scaleExpE ) + ptrA->xOffE ) << 16;
4627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	*yPtrA = ( ( ptrA->yE << ptrA->scaleExpE ) + ptrA->yOffE ) << 16;
4637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
4647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
4667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_LocalScanner_idxPos( const struct bbf_LocalScanner* ptrA, uint32 scanIndexA, int32* xPtrA, int32* yPtrA )
4687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
4697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 wL = ptrA->workScanRegionE.x2E - ptrA->workScanRegionE.x1E - ptrA->patchWidthE;
4707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 xL = ( scanIndexA % wL ) + ptrA->workScanRegionE.x1E;
4717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 yL = ( scanIndexA / wL ) + ptrA->workScanRegionE.y1E;
4727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	*xPtrA = ( ( xL << ptrA->scaleExpE ) + ptrA->xOffE ) << 16;
4737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	*yPtrA = ( ( yL << ptrA->scaleExpE ) + ptrA->yOffE ) << 16;
4747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
4757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
4777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
4797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
4807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ modify functions } ------------------------------------------- */
4817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
4827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
4837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
4857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_LocalScanner_create( struct bbs_Context* cpA,
4877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							  struct bbf_LocalScanner* ptrA,
4887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							  uint32 patchWidthA,
4897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							  uint32 patchHeightA,
4907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							  uint32 scaleExpA,
4917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							  uint32 maxImageWidthA,
4927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							  uint32 maxImageHeightA,
4937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							  uint32 minScaleExpA,
4947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							  uint32 maxRadiusA,
4957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							  struct bbs_MemTbl* mtpA )
4967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
4977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->patchWidthE = patchWidthA;
4987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->patchHeightE = patchHeightA;
4997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->scaleExpE = scaleExpA;
5007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->maxImageWidthE = maxImageWidthA;
5017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->maxImageHeightE = maxImageHeightA;
5027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->minScaleExpE = minScaleExpA;
5037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->maxRadiusE = maxRadiusA;
5047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbf_LocalScanner_alloc( cpA, ptrA, mtpA );
5057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
5067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
5087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_LocalScanner_bitParam( struct bbs_Context* cpA,
5107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							    struct bbf_LocalScanner* ptrA,
5117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project								const struct bbf_BitParam* bitParamPtrA )
5127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
5137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( !bbf_BitParam_equal( cpA, &ptrA->bitParamE, bitParamPtrA ) )
5147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
5157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bbf_BitParam_copy( cpA, &ptrA->bitParamE, bitParamPtrA );
5167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bbf_LocalScanner_createBitImage( cpA, ptrA );
5177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
5187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbf_LocalScanner_resetScan( cpA, ptrA );
5207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
5217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
5237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_LocalScanner_origScanRegion( struct bbs_Context* cpA,
5257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project									  struct bbf_LocalScanner* ptrA,
5267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project									  const struct bts_Int16Rect* scanRegionPtrA )
5277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
5287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->origScanRegionE = *scanRegionPtrA;
5297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbf_LocalScanner_setWorkScanRegion( cpA, ptrA );
5307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbf_LocalScanner_resetScan( cpA, ptrA );
5317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
5327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
5347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
5367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
5377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ I/O } -------------------------------------------------------- */
5387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
5397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
5407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
5427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bbf_LocalScanner_memSize( struct bbs_Context* cpA,
5447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project								 const struct bbf_LocalScanner* ptrA )
5457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
5467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 memSizeL = bbs_SIZEOF16( uint32 ) +
5477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					  bbs_SIZEOF16( uint32 ); /* version */
5487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memSizeL += bbs_SIZEOF16( ptrA->patchWidthE );
5507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memSizeL += bbs_SIZEOF16( ptrA->patchHeightE );
5517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memSizeL += bbs_SIZEOF16( ptrA->scaleExpE );
5527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memSizeL += bbs_SIZEOF16( ptrA->maxImageWidthE );
5537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memSizeL += bbs_SIZEOF16( ptrA->maxImageHeightE );
5547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memSizeL += bbs_SIZEOF16( ptrA->minScaleExpE );
5557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memSizeL += bbs_SIZEOF16( ptrA->maxRadiusE );
5567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return memSizeL;
5587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
5597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
5617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bbf_LocalScanner_memWrite( struct bbs_Context* cpA,
5637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						     const struct bbf_LocalScanner* ptrA,
5647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						     uint16* memPtrA )
5657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
5667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 memSizeL = bbf_LocalScanner_memSize( cpA, ptrA );
5677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWrite32( &memSizeL, memPtrA );
5687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWriteUInt32( bbf_LOCAL_SCANNER_VERSION, memPtrA );
5697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWrite32( &ptrA->patchWidthE, memPtrA );
5717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWrite32( &ptrA->patchHeightE, memPtrA );
5727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWrite32( &ptrA->scaleExpE, memPtrA );
5737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWrite32( &ptrA->maxImageWidthE, memPtrA );
5747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWrite32( &ptrA->maxImageHeightE, memPtrA );
5757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWrite32( &ptrA->minScaleExpE, memPtrA );
5767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWrite32( &ptrA->maxRadiusE, memPtrA );
5777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return memSizeL;
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_LocalScanner_memRead( struct bbs_Context* cpA,
5837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						    struct bbf_LocalScanner* ptrA,
5847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						    const uint16* memPtrA,
5857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						    struct bbs_MemTbl* mtpA )
5867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
5877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 memSizeL, versionL;
5887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( bbs_Context_error( cpA ) ) return 0;
5907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memRead32( &memSizeL, memPtrA );
5917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memReadVersion32( cpA, &versionL, bbf_LOCAL_SCANNER_VERSION, memPtrA );
5927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memRead32( &ptrA->patchWidthE, memPtrA );
5947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memRead32( &ptrA->patchHeightE, memPtrA );
5957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memRead32( &ptrA->scaleExpE, memPtrA );
5967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memRead32( &ptrA->maxImageWidthE, memPtrA );
5977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memRead32( &ptrA->maxImageHeightE, memPtrA );
5987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memRead32( &ptrA->minScaleExpE, memPtrA );
5997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memRead32( &ptrA->maxRadiusE, memPtrA );
6007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( memSizeL != bbf_LocalScanner_memSize( cpA, ptrA ) )
6027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
6037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bbs_ERR0( bbs_ERR_CORRUPT_DATA, "uint32 bbf_LocalScanner_memRead( struct bem_ScanGradientMove* ptrA, const uint16* memPtrA ):\n"
6047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			        "size mismatch" );
6057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		return 0;
6067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
6077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( bbs_Context_error( cpA ) ) return 0;
6097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* allocate arrays */
6117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbf_LocalScanner_alloc( cpA, ptrA, mtpA );
6127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( bbs_Context_error( cpA ) ) return 0;
6147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return memSizeL;
6167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
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/* ---- \ghd{ exec functions } --------------------------------------------- */
6237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
6247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
6257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
6277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_LocalScanner_resetScan( struct bbs_Context* cpA,
6297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project								 struct bbf_LocalScanner* ptrA )
6307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
6317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->xE = ptrA->workScanRegionE.x1E;
6327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->yE = ptrA->workScanRegionE.y1E;
6337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbf_LocalScanner_initPatchBuffer( cpA, ptrA );
6347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
6357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
6377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_LocalScanner_assign( struct bbs_Context* cpA,
6397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							  struct bbf_LocalScanner* ptrA,
6407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							  const uint8* imagePtrA,
6417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							  uint32 imageWidthA,
6427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							  uint32 imageHeightA,
6437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							  const struct bbf_BitParam* paramPtrA )
6447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
6457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( ptrA->scaleExpE == 0 )
6467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
6477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		ptrA->workImagePtrE = imagePtrA;
6487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		ptrA->workWidthE = imageWidthA;
6497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		ptrA->workHeightE = imageHeightA;
6507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
6517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	else
6527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
6537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		ptrA->origImagePtrE = imagePtrA;
6547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		ptrA->origWidthE = imageWidthA;
6557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		ptrA->origHeightE = imageHeightA;
6567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
6577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->bitParamE = *paramPtrA;
6597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->xOffE = 0;
6607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->yOffE = 0;
6617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->origScanRegionE = bts_Int16Rect_create( 0, 0, imageWidthA, imageHeightA );
6627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbf_LocalScanner_downscale( cpA, ptrA );
6637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbf_LocalScanner_createBitImage( cpA, ptrA );
6647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbf_LocalScanner_resetScan( cpA, ptrA );
6657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
6667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
6687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectconst uint32* bbf_LocalScanner_getPatch( const struct bbf_LocalScanner* ptrA )
6707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
6717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return ptrA->patchBufferE.arrPtrE + ptrA->xE;
6727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
6737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
6757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectflag bbf_LocalScanner_next( struct bbs_Context* cpA, struct bbf_LocalScanner* ptrA )
6777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
6787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( ( ptrA->xE + 1 ) < ptrA->workScanRegionE.x2E - ( int32 )ptrA->patchWidthE )
6797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
6807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		ptrA->xE++;
6817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		return TRUE;
6827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
6837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( ( ptrA->yE + 1 ) >= ptrA->workScanRegionE.y2E - ( int32 )ptrA->patchHeightE ) return FALSE;
6857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->xE = ptrA->workScanRegionE.x1E;
6877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->yE++;
6887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
6907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 offL = ( ptrA->yE & 0x1F );
6917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 rowL = ( ptrA->yE >> 5 ) + ( offL > 0 ? 1 : 0 );
6927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 widthL = ptrA->bitImageE.widthE;
6947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 sizeL = ptrA->workScanRegionE.x2E - ptrA->workScanRegionE.x1E;
6957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32* dstL = ( uint32* )ptrA->patchBufferE.arrPtrE + ptrA->xE;
6967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 iL;
6977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( rowL < ptrA->bitImageE.heightE )
6997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
7007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			uint32* srcL = ptrA->bitImageE.arrE.arrPtrE + rowL * widthL + ptrA->xE;
7017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			if( offL > 0 )
7027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
7037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				uint32 shlL = 32 - offL;
7047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				for( iL = 0; iL < sizeL; iL++ ) dstL[ iL ] = ( dstL[ iL ] >> 1 ) | ( srcL[ iL ] << shlL );
7057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
7067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			else
7077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
7087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				bbs_memcpy32( dstL, srcL, sizeL );
7097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
7107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
7117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		else
7127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
7137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			for( iL = 0; iL < sizeL; iL++ ) dstL[ iL ] >>= 1;
7147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
7157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
7167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return TRUE;
7187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
7197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
7217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_LocalScanner_goToXY( struct bbs_Context* cpA, struct bbf_LocalScanner* ptrA, int32 xA, int32 yA )
7237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
7247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_DEF_fNameL( "void bbf_LocalScanner_goToXY( struct bbs_Context* cpA, struct bbf_LocalScanner* ptrA, int32 xA, int32 yA )" )
7257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( xA < ptrA->workScanRegionE.x1E || xA >= ptrA->workScanRegionE.x2E - ( int32 )ptrA->patchWidthE )
7267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
7277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bbs_ERROR1( "%s:\nxA out of range", fNameL );
7287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		return;
7297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
7307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->xE = xA;
7317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( ptrA->yE == yA ) return;
7327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( yA < ptrA->workScanRegionE.y1E || yA >= ptrA->workScanRegionE.y2E - ( int32 )ptrA->patchHeightE )
7337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
7347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bbs_ERROR1( "%s:\nyA out of range", fNameL );
7357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		return;
7367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
7377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->yE = yA;
7387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
7407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 offL = ( ptrA->yE & 0x1F );
7417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 rowL = ( ptrA->yE >> 5 ) + ( offL > 0 ? 1 : 0 );
7427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 sizeL = ptrA->workScanRegionE.x2E - ptrA->workScanRegionE.x1E;
7447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 imgWidthL = ptrA->bitImageE.widthE;
7457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 imgOffsL = ptrA->workScanRegionE.x1E;
7467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32* dstL = ptrA->patchBufferE.arrPtrE + imgOffsL;
7477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 iL;
7487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( rowL < ptrA->bitImageE.heightE )
7507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
7517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			if( offL > 0 )
7527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
7537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				uint32* src1L = ptrA->bitImageE.arrE.arrPtrE + rowL * imgWidthL + imgOffsL;
7547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				uint32* src0L = src1L - imgWidthL;
7557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				uint32 shlL = 32 - offL;
7567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				for( iL = 0; iL < sizeL; iL++ ) dstL[ iL ] = ( src0L[ iL ] >> offL ) | ( src1L[ iL ] << shlL );
7577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
7587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			else
7597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
7607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				bbs_memcpy32( dstL, ptrA->bitImageE.arrE.arrPtrE + rowL * imgWidthL + imgOffsL, sizeL );
7617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
7627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
7637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		else
7647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
7657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			uint32* srcL = ptrA->bitImageE.arrE.arrPtrE + ( rowL - 1 ) * imgWidthL + imgOffsL;
7667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			for( iL = 0; iL < sizeL; iL++ ) dstL[ iL ] = srcL[ iL ] >> offL;
7677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
7687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
7697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
7707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
7727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_LocalScanner_goToIndex( struct bbs_Context* cpA, struct bbf_LocalScanner* ptrA, uint32 scanIndexA )
7747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
7757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 wL = ptrA->workScanRegionE.x2E - ptrA->workScanRegionE.x1E - ptrA->patchWidthE;
7767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbf_LocalScanner_goToXY( cpA, ptrA,
7777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							 ( scanIndexA % wL ) + ptrA->workScanRegionE.x1E,
7787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							 ( scanIndexA / wL ) + ptrA->workScanRegionE.y1E );
7797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
7807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
7827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectflag bbf_LocalScanner_nextOffset( struct bbs_Context* cpA, struct bbf_LocalScanner* ptrA )
7847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
7857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 maxL = ( 1 << ptrA->scaleExpE );
7867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( ptrA->yOffE == maxL ) return FALSE;
7877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->xOffE++;
7897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( ptrA->xOffE == maxL )
7917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
7927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		ptrA->xOffE = 0;
7937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		ptrA->yOffE++;
7947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( ptrA->yOffE == maxL ) return FALSE;
7957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
7967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbf_LocalScanner_downscale( cpA, ptrA );
7987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbf_LocalScanner_createBitImage( cpA, ptrA );
7997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbf_LocalScanner_setWorkScanRegion( cpA, ptrA );
8007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbf_LocalScanner_resetScan( cpA, ptrA );
8017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
8027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return TRUE;
8037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
8047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
8057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
8067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
8077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
808