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/Math.h"
207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#include "b_BasicEm/Functions.h"
217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#include "b_ImageEm/UInt16ByteImage.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/* ========================================================================= */
347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ constructor / destructor } ----------------------------------- */
367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bim_UInt16ByteImage_init( struct bbs_Context* cpA,
427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							   struct bim_UInt16ByteImage* ptrA )
437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_UInt16Arr_init( cpA, &ptrA->arrE );
457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->widthE = 0;
467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->heightE = 0;
477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bim_UInt16ByteImage_exit( struct bbs_Context* cpA,
527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							   struct bim_UInt16ByteImage* ptrA )
537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_UInt16Arr_exit( cpA, &ptrA->arrE );
557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->widthE = 0;
567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->heightE = 0;
577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ operators } -------------------------------------------------- */
647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bim_UInt16ByteImage_copy( struct bbs_Context* cpA,
707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							   struct bim_UInt16ByteImage* ptrA,
717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							   const struct bim_UInt16ByteImage* srcPtrA )
727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#ifdef DEBUG1
747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( ptrA->arrE.sizeE < srcPtrA->arrE.sizeE )
757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bbs_ERROR0( "void bim_UInt16ByteImage_copy( struct bim_UInt16ByteImage*, const struct bim_UInt16ByteImage* ):\n"
777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				   "Unsufficient allocated memory in destination image" );
787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		return;
797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#endif
817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->widthE = srcPtrA->widthE;
827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->heightE = srcPtrA->heightE;
837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_UInt16Arr_copy( cpA, &ptrA->arrE, &srcPtrA->arrE );
847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectflag bim_UInt16ByteImage_equal( struct bbs_Context* cpA,
897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							    const struct bim_UInt16ByteImage* ptrA,
907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project								const struct bim_UInt16ByteImage* srcPtrA )
917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( ptrA->widthE != srcPtrA->widthE ) return FALSE;
937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( ptrA->heightE != srcPtrA->heightE ) return FALSE;
947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return bbs_UInt16Arr_equal( cpA, &ptrA->arrE, &srcPtrA->arrE );
957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
1007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
1017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ query functions } -------------------------------------------- */
1027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
1037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
1047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
1067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bim_UInt16ByteImage_checkSum( struct bbs_Context* cpA,
1087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project									 const struct bim_UInt16ByteImage* ptrA )
1097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
1107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 sumL =0 ;
1117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 iL;
1127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 sizeL = ptrA->arrE.sizeE;
1137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	const uint16* ptrL = ptrA->arrE.arrPtrE;
1147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	for( iL =0; iL < sizeL; iL++ )
1157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
1167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		sumL += *ptrL++;
1177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
1187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return sumL;
1197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
1207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
1227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
1247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
1257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ modify functions } ------------------------------------------- */
1267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
1277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
1287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
1307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bim_UInt16ByteImage_create( struct bbs_Context* cpA,
1327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project								 struct bim_UInt16ByteImage* ptrA,
1337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						         uint32 widthA,
1347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							     uint32 heightA,
1357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 					             struct bbs_MemSeg* mspA )
1367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
1377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( bbs_Context_error( cpA ) ) return;
1387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( widthA & 1 )
1397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
1407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bbs_ERROR0( "bim_UInt16ByteImage_create( .... ): width of image must be even" );
1417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		return;
1427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
1437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( ptrA->arrE.arrPtrE != 0 )
1457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
1467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bim_UInt16ByteImage_size( cpA, ptrA, widthA, heightA );
1477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
1487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	else
1497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
1507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bbs_UInt16Arr_create( cpA, &ptrA->arrE, ( widthA * heightA ) >> 1, mspA );
1517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		ptrA->widthE  = widthA;
1527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		ptrA->heightE = heightA;
1537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
1547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
1557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
1577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bim_UInt16ByteImage_assignExternalImage( struct bbs_Context* cpA,
1597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project											  struct bim_UInt16ByteImage* ptrA,
1607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project											  struct bim_UInt16ByteImage* srcPtrA )
1617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
1627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	struct bbs_MemSeg sharedSegL = bbs_MemSeg_createShared( cpA, srcPtrA->arrE.arrPtrE, ( srcPtrA->widthE * srcPtrA->heightE ) / 2 );
1637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( ptrA->arrE.arrPtrE != 0 )
1657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
1667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bbs_ERROR0( "void bim_UInt16ByteImage_assignExternalImage( ... ): image was already created once" );
1677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		return;
1687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
1697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bim_UInt16ByteImage_create( cpA, ptrA,
1717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					            srcPtrA->widthE,
1727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						        srcPtrA->heightE,
1737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						        &sharedSegL );
1747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
1757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
1777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bim_UInt16ByteImage_size( struct bbs_Context* cpA,
1797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							   struct bim_UInt16ByteImage* ptrA,
1807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							   uint32 widthA, uint32 heightA )
1817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
1827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( widthA & 1 )
1837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
1847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bbs_ERROR0( "bim_UInt16ByteImage_size( .... ): width of image must be even" );
1857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		return;
1867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
1877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( ptrA->arrE.allocatedSizeE < ( ( widthA * heightA ) >> 1 ) )
1897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
1907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bbs_ERROR0( "void bim_UInt16ByteImage_size( struct bim_UInt16ByteImage*, uint32 sizeA ):\n"
1917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				   "Unsufficient allocated memory" );
1927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		return;
1937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
1947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_UInt16Arr_size( cpA, &ptrA->arrE, ( widthA * heightA ) >> 1 );
1957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->widthE  = widthA;
1967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->heightE = heightA;
1977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
1987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
2007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
2027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
2037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ I/O } -------------------------------------------------------- */
2047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
2057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
2067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
2087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bim_UInt16ByteImage_memSize( struct bbs_Context* cpA,
2107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project								    const struct bim_UInt16ByteImage* ptrA )
2117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
2127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return  bbs_SIZEOF16( uint32 )
2137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		  + bbs_SIZEOF16( uint32 ) /* version */
2147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		  + bbs_SIZEOF16( ptrA->widthE )
2157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		  + bbs_SIZEOF16( ptrA->heightE )
2167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		  + bbs_UInt16Arr_memSize( cpA, &ptrA->arrE );
2177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
2187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
2207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bim_UInt16ByteImage_memWrite( struct bbs_Context* cpA,
2227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project									 const struct bim_UInt16ByteImage* ptrA,
2237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project									 uint16* memPtrA )
2247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
2257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 memSizeL = bim_UInt16ByteImage_memSize( cpA, ptrA );
2267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWrite32( &memSizeL, memPtrA );
2277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWriteUInt32( bim_UINT16_IMAGE_VERSION, memPtrA );
2287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWrite32( &ptrA->widthE, memPtrA );
2297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWrite32( &ptrA->heightE, memPtrA );
2307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_UInt16Arr_memWrite( cpA, &ptrA->arrE, memPtrA );
2317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return memSizeL;
2327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
2337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
2357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bim_UInt16ByteImage_memRead( struct bbs_Context* cpA,
2377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project								    struct bim_UInt16ByteImage* ptrA,
2387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							   const uint16* memPtrA,
2397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 					           struct bbs_MemSeg* mspA )
2407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
2417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 memSizeL, versionL, widthL, heightL;
2427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( bbs_Context_error( cpA ) ) return 0;
2437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memRead32( &memSizeL, memPtrA );
2447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memReadVersion32( cpA, &versionL, bim_UINT16_IMAGE_VERSION, memPtrA );
2457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memRead32( &widthL, memPtrA );
2467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memRead32( &heightL, memPtrA );
2477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->widthE  = widthL;
2497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->heightE = heightL;
2507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_UInt16Arr_memRead( cpA, &ptrA->arrE, memPtrA, mspA );
2517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( memSizeL != bim_UInt16ByteImage_memSize( cpA, ptrA ) )
2537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
2547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bbs_ERR0( bbs_ERR_CORRUPT_DATA, "uint32 bim_UInt16ByteImage_memRead( const struct bim_UInt16ByteImage* ptrA, const void* memPtrA ):\n"
2557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project                   "size mismatch" );
2567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		return 0;
2577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
2587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return memSizeL;
2597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
2607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
2627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
2647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
2657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ exec functions } --------------------------------------------- */
2667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
2677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
2687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
2707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bim_UInt16ByteImage_setAllPixels( struct bbs_Context* cpA,
2727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project									   struct bim_UInt16ByteImage* ptrA,
2737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project									   uint16 valueA )
2747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
2757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	long iL;
2767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint16* ptrL = ptrA->arrE.arrPtrE;
2777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint16 fillL = ( valueA & 0x0FF ) | ( ( valueA & 0x0FF ) << 8 );
2787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	for( iL = ptrA->arrE.sizeE; iL > 0; iL-- )
2797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
2807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		*ptrL++ = fillL;
2817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
2827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
2837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
2857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/**
2877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		M-------------------------------------------------------M
2887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		|				|						|				|
2897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		|				|						|				|
2907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		|				|						|				|
2917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		|				|						|				|
2927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		|	region x0y0	|		region x1y0		|	region x2y0	|
2937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		|				|						|				|
2947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		|				|						|				|
2957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		|				|						|				|
2967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		|---------------I-----------------------I---------------|
2977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		|				|						|				|
2987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		|				|						|				|
2997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		|				|						|				|
3007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		|				|						|				|
3017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		|				|						|				|
3027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		|				|						|				|
3037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		|	region x0y1	|		region x1y1		|	region x2y1	|
3047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		|				|						|				|
3057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		|				|						|				|
3067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		|				|						|				|
3077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		|				|						|				|
3087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		|				|						|				|
3097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		|				|						|				|
3107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		|				|						|				|
3117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		|---------------I-----------------------I---------------|
3127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		|				|						|				|
3137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		|				|						|				|
3147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		|				|						|				|
3157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		|				|						|				|
3167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		|	region x0y2	|		region x1y2		|	region x2y2	|
3177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		|				|						|				|
3187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		|				|						|				|
3197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		|				|						|				|
3207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		M-------------------------------------------------------M
3217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project  To see how the code is organized. Refer to the diagram above.
3247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project  Assume the original image after applying the tranzformations(translation, rotation and scaling) is "O"
3257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	(boundaries of the image are shown above bounded by the letter 'O').
3267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project  This image is being Warped to the area "M" (boundaries of this area are bounded by the letter 'M').
3277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project  Refer to the source code below to point to the loop that maps pixels in the particular region.
3297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project*/
3307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/** applies affine linear warping to pixels positions of imageA before copying the into *ptrA */
3327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bim_UInt16ByteImage_warp( struct bbs_Context* cpA,
3337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							   struct bim_UInt16ByteImage* ptrA,
3347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						       const struct bim_UInt16ByteImage* srcPtrA,
3357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						       const struct bts_Flt16Alt2D* altPtrA,
3367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			                   int32 resultWidthA,
3377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			                   int32 resultHeightA )
3387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
3397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	long srcWidthL = srcPtrA->widthE;
3407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	long srcHeightL = srcPtrA->heightE;
3417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	long halfSrcWidthL = srcWidthL >> 1;
3427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	struct bts_Flt16Alt2D invAlt2DL;
3447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint16* dstPtrL;
3467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	const uint16* ulPtrL = srcPtrA->arrE.arrPtrE;
3477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	const uint16* urPtrL = ulPtrL + halfSrcWidthL - 1;
3487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	const uint16* llPtrL = ulPtrL + ( srcHeightL - 1 ) * halfSrcWidthL;
3497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	const uint16* lrPtrL = llPtrL + halfSrcWidthL - 1;
3507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 iL, jL;
3527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 shiftL;
3537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	const uint16 bbpL = 16;
3557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 maxInt32Value8bbpL  = 0x7FFFFFFF;
3567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* The bbp for all these variables is the same as bbpL */
3587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 mxxL;
3597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 mxyL;
3607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 myxL;
3617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 myyL;
3627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 txL;
3647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 tyL;
3657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 xL;
3677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 yL;
3687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bim_UInt16ByteImage_size( cpA, ptrA, resultWidthA, resultHeightA );
3707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	dstPtrL = ptrA->arrE.arrPtrE;
3717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* compute inverse */
3737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	invAlt2DL = bts_Flt16Alt2D_inverted( altPtrA );
3747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( srcWidthL == 0 || srcHeightL == 0 )
3767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
3777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bim_UInt16ByteImage_size( cpA, ptrA, srcWidthL, srcHeightL );
3787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bbs_ERROR2( "Size of output image is %d/%d", srcWidthL, srcHeightL );
3797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		return;
3807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
3817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* align Matrix and Vector to 8 bits bbp */
3837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	shiftL = invAlt2DL.matE.bbpE - bbpL;
3847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( shiftL >= 0 )
3857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
3867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		mxxL = ( int32 )invAlt2DL.matE.xxE >> shiftL;
3877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		mxyL = ( int32 )invAlt2DL.matE.xyE >> shiftL;
3887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		myxL = ( int32 )invAlt2DL.matE.yxE >> shiftL;
3897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		myyL = ( int32 )invAlt2DL.matE.yyE >> shiftL;
3907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
3917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	else
3927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
3937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* Check for overflow since we are left shifting. */
3947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		maxInt32Value8bbpL >>= -shiftL;
3957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( invAlt2DL.matE.xxE > maxInt32Value8bbpL ||
3967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			invAlt2DL.matE.xyE > maxInt32Value8bbpL ||
3977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			invAlt2DL.matE.yxE > maxInt32Value8bbpL ||
3987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			invAlt2DL.matE.yyE > maxInt32Value8bbpL )
3997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
4007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* Overflow error */
4017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			bbs_ERROR5( "The values in the transformation matrix cause overflow during bitshift\n%d, %d,\n%d, %d\n"
4027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						"The maximum allowed value is %d",
4037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						invAlt2DL.matE.xxE >> invAlt2DL.matE.bbpE,
4047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						invAlt2DL.matE.xyE >> invAlt2DL.matE.bbpE,
4057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						invAlt2DL.matE.yxE >> invAlt2DL.matE.bbpE,
4067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						invAlt2DL.matE.yyE >> invAlt2DL.matE.bbpE,
4077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						maxInt32Value8bbpL >> ( bbpL - ( -shiftL ) ) );
4087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			return;
4097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
4107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		mxxL = ( int32 )invAlt2DL.matE.xxE << -shiftL;
4127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		mxyL = ( int32 )invAlt2DL.matE.xyE << -shiftL;
4137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		myxL = ( int32 )invAlt2DL.matE.yxE << -shiftL;
4147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		myyL = ( int32 )invAlt2DL.matE.yyE << -shiftL;
4157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		maxInt32Value8bbpL <<= -shiftL;
4167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
4177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	invAlt2DL.matE.bbpE = bbpL;
4187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	shiftL = invAlt2DL.vecE.bbpE - bbpL;
4207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( shiftL >= 0 )
4217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
4227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		txL  = ( int32 )invAlt2DL.vecE.xE >> shiftL;
4237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		tyL  = ( int32 )invAlt2DL.vecE.yE >> shiftL;
4247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
4257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	else
4267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
4277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* Check for overflow since we are left shifting. */
4287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		maxInt32Value8bbpL >>= -shiftL;
4297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if(	invAlt2DL.vecE.xE  > maxInt32Value8bbpL ||
4307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			invAlt2DL.vecE.yE  > maxInt32Value8bbpL )
4317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
4327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* Overflow error */
4337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			bbs_ERROR3( "The values in the vector cause overflow during bitshift\n%d, %d,\n"
4347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						"The maximum allowed value is %d",
4357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						invAlt2DL.vecE.xE >> invAlt2DL.vecE.bbpE,
4367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						invAlt2DL.vecE.yE >> invAlt2DL.vecE.bbpE,
4377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						maxInt32Value8bbpL >> ( bbpL - ( -shiftL ) ) );
4387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			return;
4397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
4407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		txL  = ( int32 )invAlt2DL.vecE.xE << -shiftL;
4417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		tyL  = ( int32 )invAlt2DL.vecE.yE << -shiftL;
4427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		maxInt32Value8bbpL <<= -shiftL;
4437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
4447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	invAlt2DL.vecE.bbpE = bbpL;
4457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* For each destination pixel find the correspoding source pixel by applying the inverse transformation */
4477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	for( jL = 0; jL < ptrA->heightE; jL++ )
4487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
4497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		xL = txL + mxyL * jL;
4507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		yL = tyL + myyL * jL;
4517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		for( iL = 0; iL < ptrA->widthE; iL++ )
4527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
4537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			const uint16 bbpLby2L = bbpL / 2;
4547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			const int32 oneL = ( int32 )0x00000001 << bbpLby2L;
4557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			const int32 fractionOnlyL = 0xFFFFFFFF >> ( 32 - bbpL );
4567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			uint16 dstPixelL;
4577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* The bbp for all these variables is the same as bbpLby2L */
4597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 f2xL;
4607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 f2yL;
4617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 f1xL;
4627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 f1yL;
4637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* always whole numbers with a bbp of 0 */
4657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 kL, khL;
4667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 lL;
4677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			flag kEvenL;
4697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* The bbpE for these variables is bbpLby2L */
4717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 valL;
4727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* Get the whole numbers only and make the bbp 0. */
4747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			kL = xL >> bbpL;
4757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			lL = yL >> bbpL;
4767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			khL = kL >> 1;
4787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			kEvenL = !( kL & 1 );
4797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* fraction of destination pixel in the next source pixel */
4817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			f2xL = ( xL & fractionOnlyL ) >> bbpLby2L;
4827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			f2yL = ( yL & fractionOnlyL ) >> bbpLby2L;
4837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* fraction of destination pixel in the current source pixel */
4847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			f1xL = oneL - f2xL;
4857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			f1yL = oneL - f2yL;
4867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* increment values for next loop */
4887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			xL += mxxL;
4897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			yL += myxL;
4907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			if( lL < 0 )
4927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
4937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				if( kL < 0 )
4947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
4957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					/* handle all pixels in region x0y0 */
4967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					dstPixelL = *ulPtrL & 0x0FF;
4977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
4987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				else if( kL >= srcWidthL - 1 )
4997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
5007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					/* handle all pixels in region x2y0 */
5017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					dstPixelL = *urPtrL >> 8;
5027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
5037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				else
5047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
5057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					/* handle all pixels in region x1y0 */
5067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					/* The bbp has shifted left by bbpLby2L */
5077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					if( kEvenL )
5087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					{
5097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						uint16 srcL = *( ulPtrL + khL );
5107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						valL = f1xL * ( srcL & 0x00FF )  +  f2xL * ( srcL >> 8 );
5117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					}
5127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					else
5137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					{
5147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						valL =  f1xL * ( *( ulPtrL + khL ) >> 8 ) + f2xL * ( *( ulPtrL + khL + 1 ) & 0x0FF );
5157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					}
5167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					dstPixelL = valL >> bbpLby2L;
5177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
5187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			} /* if( lL < 0 ) */
5197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			else if( lL >= srcHeightL - 1 )
5207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
5217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				if( kL < 0 )
5227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
5237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					/* handle all pixels in region x0y2 */
5247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					dstPixelL = *llPtrL & 0x0FF;
5257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
5267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				else if( kL >= srcWidthL - 1 )
5277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
5287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					/* handle all pixels in region x2y2 */
5297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					dstPixelL = *lrPtrL >> 8;
5307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
5317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				else
5327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
5337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					/* handle all pixels in region x1y2 */
5347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					/* The bbp has shifted left by bbpLby2L */
5357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					if( kEvenL )
5367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					{
5377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						uint16 srcL = *( llPtrL + khL );
5387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						valL = f1xL * ( srcL & 0x00FF ) + f2xL * ( srcL >> 8 );
5397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					}
5407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					else
5417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					{
5427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						valL =  f1xL * ( *( llPtrL + khL ) >> 8 ) + f2xL * ( *( llPtrL + khL + 1 ) & 0x0FF );
5437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					}
5447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					dstPixelL = valL >> bbpLby2L;
5467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
5477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			} /* if( lL >= srcHeightL - 1 ) */
5487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			else
5497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
5507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				const uint16* ptr1L;
5517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				const uint16* ptr2L;
5527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				ptr1L = ulPtrL + lL * halfSrcWidthL;
5547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				/* point to the pixel in the same column */
5557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				ptr2L = ptr1L + halfSrcWidthL;
5567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				if( kL < 0 )
5577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
5587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					/* handle all pixels in region x0y1 */
5597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					valL =  f1yL * ( *ptr1L & 0x0FF ) + f2yL * ( *ptr2L & 0x0FF );
5607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					dstPixelL = valL >> bbpLby2L;
5617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
5627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				else if( kL >= srcWidthL - 1 )
5637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
5647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					/* handle all pixels in region x2y1 */
5657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					valL = f1yL * ( *( ptr1L + halfSrcWidthL - 1 ) >> 8 ) +
5667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						   f2yL * ( *( ptr2L + halfSrcWidthL - 1 ) >> 8 );
5677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					dstPixelL = valL >> bbpLby2L;
5687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
5697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				else
5707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
5717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					/* assuming that bbpL = bbpLby2 * 2 */
5727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					/* The bbp for these variables is bbpL */
5737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					int32 v1L;
5747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					int32 v2L;
5757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					const int32 halfL = ( int32 )0x00000001 << ( bbpL - 1 );
5767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					/* handle all pixels in region x1y1 */
5787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					if( kEvenL )
5797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					{
5807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						#ifdef HW_BIG_ENDIAN
5817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							/* Our images are in byte order for big & little endian  so when using a
5827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project                                                           16bit ptr our bytes will be swapped on big endian hardware shift and mask*/
5837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							v1L = f1xL * ( *( ptr1L + khL ) >> 8 ) + f2xL * ( *( ptr1L + khL ) & 0x0FF );
5847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							v2L = f1xL * ( *( ptr2L + khL ) >> 8 ) + f2xL * ( *( ptr2L + khL ) & 0x0FF );
5857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						#else
5867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							v1L = f1xL * ( *( ptr1L + khL ) & 0x0FF ) + f2xL * ( *( ptr1L + khL ) >> 8 );
5877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							v2L = f1xL * ( *( ptr2L + khL ) & 0x0FF ) + f2xL * ( *( ptr2L + khL ) >> 8 );
5887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						#endif
5897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					}
5907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					else
5917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					{
5927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						#ifdef HW_BIG_ENDIAN
5937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							v1L = f1xL * ( *( ptr1L + khL ) & 0x0FF ) + f2xL * ( *( ptr1L + khL + 1 ) >> 8 );
5947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							v2L = f1xL * ( *( ptr2L + khL ) & 0x0FF ) + f2xL * ( *( ptr2L + khL + 1 ) >> 8 );
5957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						#else
5967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							v1L = f1xL * ( *( ptr1L + khL ) >> 8 ) + f2xL * ( *( ptr1L + khL + 1 ) & 0x0FF );
5977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							v2L = f1xL * ( *( ptr2L + khL ) >> 8 ) + f2xL * ( *( ptr2L + khL + 1 ) & 0x0FF );
5987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						#endif
5997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					}
6007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					/* adding the half to round off the resulting value */
6017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					valL = v1L * f1yL + v2L * f2yL + halfL;
6027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					dstPixelL = valL >> bbpL;
6037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
6047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
6057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			if( iL & 1 )
6077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
6087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				#ifdef HW_BIG_ENDIAN
6097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					*dstPtrL |= dstPixelL & 0x0FF;
6107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				#else
6117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					*dstPtrL |= dstPixelL << 8;
6127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				#endif
6137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				dstPtrL++;
6147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
6157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			else
6167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
6177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				#ifdef HW_BIG_ENDIAN
6187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					*dstPtrL = dstPixelL << 8;
6197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				#else
6207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					*dstPtrL = dstPixelL & 0x0FF;
6217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				#endif
6227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
6237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		} /* iL loop */
6257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	} /* jL loop */
6267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
6287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
6307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#ifndef HW_TMS320C5x /* 16bit architecture excluded */
6327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bim_UInt16ByteImage_warp8( struct bbs_Context* cpA,
6347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							    struct bim_UInt16ByteImage* ptrA,
6357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							    const struct bim_UInt16ByteImage* srcPtrA,
6367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							    const struct bts_Flt16Alt2D* altPtrA,
6377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							    int32 resultWidthA,
6387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							    int32 resultHeightA )
6397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
6407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	long srcWidthL = srcPtrA->widthE;
6417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	long srcHeightL = srcPtrA->heightE;
6427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	struct bts_Flt16Alt2D invAlt2DL;
6447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint8* dstPtrL;
6467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	const uint8* ulPtrL = ( const uint8* )srcPtrA->arrE.arrPtrE;
6477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	const uint8* urPtrL = ulPtrL + srcWidthL - 1;
6487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	const uint8* llPtrL = ulPtrL + ( srcHeightL - 1 ) * srcWidthL;
6497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	const uint8* lrPtrL = llPtrL + srcWidthL - 1;
6507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 iL, jL;
6527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 shiftL;
6537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	const uint16 bbpL = 16;
6557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 maxInt32Value8bbpL  = 0x7FFFFFFF;
6567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* The bbp for all these variables is the same as bbpL */
6587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 mxxL;
6597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 mxyL;
6607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 myxL;
6617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 myyL;
6627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 txL;
6647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 tyL;
6657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 xL;
6677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 yL;
6687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bim_UInt16ByteImage_size( cpA, ptrA, resultWidthA, resultHeightA );
6707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	dstPtrL = ( uint8* )ptrA->arrE.arrPtrE;
6717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* compute inverse */
6737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	invAlt2DL = bts_Flt16Alt2D_inverted( altPtrA );
6747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( srcWidthL == 0 || srcHeightL == 0 )
6767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
6777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bbs_ERROR2( "Size of output image is %d/%d", srcWidthL, srcHeightL );
6787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		return;
6797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
6807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* align Matrix and Vector to 8 bits bbp */
6827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	shiftL = invAlt2DL.matE.bbpE - bbpL;
6837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( shiftL >= 0 )
6847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
6857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		mxxL = ( int32 )invAlt2DL.matE.xxE >> shiftL;
6867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		mxyL = ( int32 )invAlt2DL.matE.xyE >> shiftL;
6877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		myxL = ( int32 )invAlt2DL.matE.yxE >> shiftL;
6887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		myyL = ( int32 )invAlt2DL.matE.yyE >> shiftL;
6897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
6907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	else
6917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
6927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* Check for overflow since we are left shifting. */
6937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		maxInt32Value8bbpL >>= -shiftL;
6947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( invAlt2DL.matE.xxE > maxInt32Value8bbpL ||
6957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			invAlt2DL.matE.xyE > maxInt32Value8bbpL ||
6967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			invAlt2DL.matE.yxE > maxInt32Value8bbpL ||
6977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			invAlt2DL.matE.yyE > maxInt32Value8bbpL )
6987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
6997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* Overflow error */
7007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			bbs_ERROR5( "The values in the transformation matrix cause overflow during bitshift\n%d, %d,\n%d, %d\n"
7017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						"The maximum allowed value is %d",
7027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						( int32 )invAlt2DL.matE.xxE >> invAlt2DL.matE.bbpE,
7037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						( int32 )invAlt2DL.matE.xyE >> invAlt2DL.matE.bbpE,
7047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						( int32 )invAlt2DL.matE.yxE >> invAlt2DL.matE.bbpE,
7057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						( int32 )invAlt2DL.matE.yyE >> invAlt2DL.matE.bbpE,
7067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						maxInt32Value8bbpL >> ( bbpL - ( -shiftL ) ) );
7077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			return;
7087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
7097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		mxxL = ( int32 )invAlt2DL.matE.xxE << -shiftL;
7117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		mxyL = ( int32 )invAlt2DL.matE.xyE << -shiftL;
7127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		myxL = ( int32 )invAlt2DL.matE.yxE << -shiftL;
7137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		myyL = ( int32 )invAlt2DL.matE.yyE << -shiftL;
7147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		maxInt32Value8bbpL <<= -shiftL;
7157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
7167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	invAlt2DL.matE.bbpE = bbpL;
7177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	shiftL = invAlt2DL.vecE.bbpE - bbpL;
7197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( shiftL >= 0 )
7207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
7217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		txL  = ( int32 )invAlt2DL.vecE.xE >> shiftL;
7227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		tyL  = ( int32 )invAlt2DL.vecE.yE >> shiftL;
7237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
7247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	else
7257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
7267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* Check for overflow since we are left shifting. */
7277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		maxInt32Value8bbpL >>= -shiftL;
7287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if(	invAlt2DL.vecE.xE  > maxInt32Value8bbpL ||
7297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			invAlt2DL.vecE.yE  > maxInt32Value8bbpL )
7307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
7317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* Overflow error */
7327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			bbs_ERROR3( "The values in the vector cause overflow during bitshift\n%d, %d,\n"
7337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						"The maximum allowed value is %d",
7347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						invAlt2DL.vecE.xE >> invAlt2DL.vecE.bbpE,
7357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						invAlt2DL.vecE.yE >> invAlt2DL.vecE.bbpE,
7367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						maxInt32Value8bbpL >> ( bbpL - ( -shiftL ) ) );
7377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			return;
7387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
7397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		txL  = ( int32 )invAlt2DL.vecE.xE << -shiftL;
7407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		tyL  = ( int32 )invAlt2DL.vecE.yE << -shiftL;
7417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		maxInt32Value8bbpL <<= -shiftL;
7427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
7437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	invAlt2DL.vecE.bbpE = bbpL;
7447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* For each destination pixel find the correspoding source pixel by applying the inverse transformation */
7467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	for( jL = 0; jL < ptrA->heightE; jL++ )
7477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
7487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		xL = txL + mxyL * jL;
7497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		yL = tyL + myyL * jL;
7507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		for( iL = 0; iL < ptrA->widthE; iL++ )
7517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
7527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			const uint16 bbpLby2L = bbpL / 2;
7537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			const int32 oneL = ( int32 )0x00000001 << bbpLby2L;
7547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			const int32 fractionOnlyL = 0xFFFFFFFF >> ( 32 - bbpL );
7557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* The bbp for all these variables is the same as bbpLby2L */
7577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 f2xL;
7587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 f2yL;
7597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 f1xL;
7607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 f1yL;
7617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* always whole numbers with a bbp of 0 */
7637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 kL;
7647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 lL;
7657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* The bbpE for these variables is bbpLby2L */
7677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 valL;
7687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* Get the whole numbers only and make the bbp 0. */
7707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			kL = xL >> bbpL;
7717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			lL = yL >> bbpL;
7727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* fraction of destination pixel in the next source pixel */
7747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			f2xL = ( xL & fractionOnlyL ) >> bbpLby2L;
7757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			f2yL = ( yL & fractionOnlyL ) >> bbpLby2L;
7767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* fraction of destination pixel in the current source pixel */
7777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			f1xL = oneL - f2xL;
7787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			f1yL = oneL - f2yL;
7797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* increment values for next loop */
7817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			xL += mxxL;
7827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			yL += myxL;
7837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			if( lL < 0 )
7857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
7867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				if( kL < 0 )
7877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
7887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					/* handle all pixels in region x0y0 */
7897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					*dstPtrL++ = *ulPtrL;
7907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
7917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				else if( kL >= srcWidthL - 1 )
7927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
7937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					/* handle all pixels in region x2y0 */
7947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					*dstPtrL++ = *urPtrL;
7957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
7967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				else
7977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
7987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					/* handle all pixels in region x1y0 */
7997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					/* The bbp has shifted left by bbpLby2L */
8007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					valL =  *( ulPtrL + kL ) * f1xL + *( ulPtrL + kL + 1 ) * f2xL;
8017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					*dstPtrL++ = valL >> bbpLby2L;
8027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
8037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			} /* if( lL < 0 ) */
8047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			else if( lL >= srcHeightL - 1 )
8057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
8067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				if( kL < 0 )
8077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
8087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					/* handle all pixels in region x0y2 */
8097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					*dstPtrL++ = *llPtrL;
8107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
8117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				else if( kL >= srcWidthL - 1 )
8127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
8137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					/* handle all pixels in region x2y2 */
8147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					*dstPtrL++ = *lrPtrL;
8157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
8167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				else
8177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
8187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					/* handle all pixels in region x1y2 */
8197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					/* The bbp has shifted left by bbpLby2L */
8207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					valL =   *( llPtrL + kL ) * f1xL + *( llPtrL +  kL + 1 ) * f2xL;
8217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					*dstPtrL++ = valL >> bbpLby2L;
8227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
8237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			} /* if( lL >= srcHeightL - 1 ) */
8247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			else
8257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
8267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				const uint8* ptr1L;
8277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				const uint8* ptr2L;
8287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
8297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				ptr1L = ulPtrL + lL * srcWidthL;
8307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				/* point to the pixel in the same column */
8317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				ptr2L = ptr1L + srcWidthL;
8327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				if( kL < 0 )
8337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
8347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					/* handle all pixels in region x0y1 */
8357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					/* The bbp has shifted left by bbpLby2L */
8367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					valL = *ptr1L * f1yL + *ptr2L * f2yL ;
8377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					*dstPtrL++ = valL >> bbpLby2L;
8387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
8397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				else if( kL >= srcWidthL - 1 )
8407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
8417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					/* handle all pixels in region x2y1 */
8427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					/* The bbp has shifted left by bbpLby2L */
8437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					valL =  *( ptr1L + srcWidthL - 1 ) * f1yL + *( ptr2L  + srcWidthL - 1 ) * f2yL;
8447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					*dstPtrL++ = valL >> bbpLby2L;
8457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
8467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				else
8477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
8487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					/* assuming that bbpL = bbpLby2 * 2 */
8497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					/* The bbp for these variables is bbpLby2L */
8507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					int32 v1L;
8517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					int32 v2L;
8527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					/* The bbp for these variables is bbpL */
8537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					const int32 halfL = ( int32 )0x00000001 << ( bbpL - 1 );
8547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
8557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					/* handle all pixels in region x1y1 */
8567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					/* The bbp has shifted left by bbpLby2L */
8577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					v1L = *( ptr1L + kL ) * f1xL + *( ptr1L + kL + 1 ) * f2xL;
8587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					v2L = *( ptr2L + kL ) * f1xL + *( ptr2L + kL + 1 ) * f2xL;
8597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					/* The bbp has shifted left again by bbpLby2L */
8607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					/* adding the half to round off the resulting value */
8617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					valL = v1L * f1yL + v2L * f2yL + halfL;
8627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					*dstPtrL++ = valL >> bbpL;
8637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
8647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
8657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		} /* iL loop */
8667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	} /* jL loop */
8677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
8687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
8697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
8707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#endif
8717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
8727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
8737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
8747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
8757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
8767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
877