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