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_ImageEm/Functions.h"
207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- related objects  --------------------------------------------------- */
227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- typedefs ----------------------------------------------------------- */
247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- constants ---------------------------------------------------------- */
267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ external functions } ----------------------------------------- */
327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/** downscale by factor 2 (dstPtrA and srcPtrA may be identical) */
387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bim_downscaleBy2( uint8*       dstPtrA,
397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					   const uint8* srcPtrA,
407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					   uint32 srcWidthA,
417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					   uint32 effWidthA,
427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					   uint32 effHeightA )
437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 wsL = srcWidthA;
457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 w0L = effWidthA;
467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 h0L = effHeightA;
477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 w1L = w0L >> 1;
487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 h1L = h0L >> 1;
497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	const uint8* srcL = srcPtrA;
517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint8* dstL = dstPtrA;
527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 iL, jL;
547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	for( jL = 0; jL < h1L; jL++ )
557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		for( iL = 0; iL < w1L; iL++ )
577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			*dstL = ( ( uint32 )srcL[ 0 ] + srcL[ 1 ] + srcL[ wsL ] + srcL[ wsL + 1 ] + 2 ) >> 2;
597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			dstL++;
607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			srcL += 2;
617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		srcL += ( wsL - w1L ) * 2;
637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bim_filterWarpInterpolation( struct bbs_Context* cpA,
697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project								  uint8* dstImagePtrA,
707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project								  const uint8* srcImagePtrA,
717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project								  uint32 srcImageWidthA,
727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project								  uint32 srcImageHeightA,
737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							      const struct bts_Int16Vec2D* offsPtrA,
747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project								  const struct bts_Flt16Alt2D* altPtrA,
757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project								  uint32 dstWidthA,
767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project								  uint32 dstHeightA,
777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project								  struct bbs_UInt8Arr* bufPtrA,
787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project								  uint32 scaleThresholdA )
797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_DEF_fNameL( "bim_filterWarpInterpolation" )
817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 w0L = srcImageWidthA;
837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 h0L = srcImageHeightA;
847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	const uint8* srcL = srcImagePtrA;
867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint8* dstL = dstImagePtrA;
877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 w1L = w0L;
897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 h1L = h0L;
907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* 16.16 */
927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 scaleThrL = scaleThresholdA;
937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	struct bts_Flt16Alt2D invAltL;
947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* matrix variables */
967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 mxxL, mxyL, myxL, myyL, txL, tyL;
977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	flag downScaledL = FALSE;
997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	flag boundsOkL = TRUE;
1007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( w0L == 0 || h0L == 0 || bts_Flt16Mat2D_det( &altPtrA->matE ) == 0 )
1027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
1037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 iL;
1047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		for( iL = 0; iL < dstWidthA * dstHeightA; iL++ ) dstImagePtrA[ iL ] = 0;
1057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		return;
1067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
1077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* compute inverse ALT */
1097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	invAltL = bts_Flt16Alt2D_inverted( altPtrA );
1107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* fixed point ALT 16.16 */
1127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( invAltL.matE.bbpE <= 16 )
1137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
1147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 shlL = 16 - invAltL.matE.bbpE;
1157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		mxxL = invAltL.matE.xxE << shlL;
1167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		mxyL = invAltL.matE.xyE << shlL;
1177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		myxL = invAltL.matE.yxE << shlL;
1187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		myyL = invAltL.matE.yyE << shlL;
1197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
1207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	else
1217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
1227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 shrL = invAltL.matE.bbpE - 16;
1237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		mxxL = ( ( invAltL.matE.xxE >> ( shrL - 1 ) ) + 1 ) >> 1;
1247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		mxyL = ( ( invAltL.matE.xyE >> ( shrL - 1 ) ) + 1 ) >> 1;
1257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		myxL = ( ( invAltL.matE.yxE >> ( shrL - 1 ) ) + 1 ) >> 1;
1267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		myyL = ( ( invAltL.matE.yyE >> ( shrL - 1 ) ) + 1 ) >> 1;
1277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
1287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( invAltL.vecE.bbpE <= 16 )
1307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
1317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 shlL = 16 - invAltL.vecE.bbpE;
1327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		txL = invAltL.vecE.xE << shlL;
1337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		tyL = invAltL.vecE.yE << shlL;
1347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
1357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	else
1367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
1377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 shrL = invAltL.vecE.bbpE - 16;
1387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		txL = ( ( invAltL.vecE.xE >> ( shrL - 1 ) ) + 1 ) >> 1;
1397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		tyL = ( ( invAltL.vecE.yE >> ( shrL - 1 ) ) + 1 ) >> 1;
1407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
1417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* add offset */
1437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	txL += ( int32 )offsPtrA->xE << 16;
1447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	tyL += ( int32 )offsPtrA->yE << 16;
1457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( scaleThresholdA > 0 )
1477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
1487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* compute downscale exponent */
1497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 axxL = ( mxxL >= 0 ) ? mxxL : -mxxL;
1507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 axyL = ( mxyL >= 0 ) ? mxyL : -mxyL;
1517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 ayxL = ( myxL >= 0 ) ? myxL : -myxL;
1527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 ayyL = ( myyL >= 0 ) ? myyL : -myyL;
1537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 a1L = ( axxL > ayxL ) ? axxL : ayxL;
1557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 a2L = ( axyL > ayyL ) ? axyL : ayyL;
1567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 invScaleL = ( a1L < a2L ) ? a1L : a2L;
1587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 scaleExpL = 0;
1597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		while( ( invScaleL >> scaleExpL ) > scaleThrL ) scaleExpL++;
1607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		while( ( scaleExpL > 0 ) && ( w0L >> scaleExpL ) < 2 ) scaleExpL--;
1617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		while( ( scaleExpL > 0 ) && ( h0L >> scaleExpL ) < 2 ) scaleExpL--;
1627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* downscale image */
1647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( scaleExpL > 0 )
1657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
1667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* down sampling is limited to the effective area of the original image */
1677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* compute effective area by mapping all corners of the dst rectangle */
1697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 xMinL = 0x7FFFFFFF;
1707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 yMinL = 0x7FFFFFFF;
1717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 xMaxL = 0x80000000;
1727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 yMaxL = 0x80000000;
1737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			uint32 wEffL, hEffL;
1747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
1767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				int32 xL, yL;
1777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				xL = txL;
1787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				yL = tyL;
1797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				xMinL = xL < xMinL ? xL : xMinL;
1807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				yMinL = yL < yMinL ? yL : yMinL;
1817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				xMaxL = xL > xMaxL ? xL : xMaxL;
1827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				yMaxL = yL > yMaxL ? yL : yMaxL;
1837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				xL = txL + mxxL * ( int32 )dstWidthA + mxyL * ( int32 )dstHeightA;
1847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				yL = tyL + myxL * ( int32 )dstWidthA + myyL * ( int32 )dstHeightA;
1857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				xMinL = xL < xMinL ? xL : xMinL;
1867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				yMinL = yL < yMinL ? yL : yMinL;
1877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				xMaxL = xL > xMaxL ? xL : xMaxL;
1887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				yMaxL = yL > yMaxL ? yL : yMaxL;
1897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				xL = txL + mxyL * ( int32 )dstHeightA;
1907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				yL = tyL + myyL * ( int32 )dstHeightA;
1917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				xMinL = xL < xMinL ? xL : xMinL;
1927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				yMinL = yL < yMinL ? yL : yMinL;
1937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				xMaxL = xL > xMaxL ? xL : xMaxL;
1947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				yMaxL = yL > yMaxL ? yL : yMaxL;
1957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				xL = txL + mxxL * ( int32 )dstWidthA;
1967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				yL = tyL + myxL * ( int32 )dstWidthA;
1977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				xMinL = xL < xMinL ? xL : xMinL;
1987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				yMinL = yL < yMinL ? yL : yMinL;
1997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				xMaxL = xL > xMaxL ? xL : xMaxL;
2007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				yMaxL = yL > yMaxL ? yL : yMaxL;
2017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
2027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			xMaxL = ( xMaxL >> 16 ) + 2;
2047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			yMaxL = ( yMaxL >> 16 ) + 2;
2057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			xMinL >>= 16;
2067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			yMinL >>= 16;
2077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* ensre effective area stays within original frame */
2097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			xMinL = 0 > xMinL ? 0 : xMinL;
2107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			yMinL = 0 > yMinL ? 0 : yMinL;
2117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			xMinL = ( int32 )w0L < xMinL ? w0L : xMinL;
2127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			yMinL = ( int32 )h0L < yMinL ? h0L : yMinL;
2137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			xMaxL = 0 > xMaxL ? 0 : xMaxL;
2147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			yMaxL = 0 > yMaxL ? 0 : yMaxL;
2157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			xMaxL = ( int32 )w0L < xMaxL ? w0L : xMaxL;
2167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			yMaxL = ( int32 )h0L < yMaxL ? h0L : yMaxL;
2177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			wEffL = xMaxL - xMinL;
2197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			hEffL = yMaxL - yMinL;
2207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* ensure downscaling does not reduce image to 0 */
2227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			while( ( scaleExpL > 0 ) && ( wEffL >> scaleExpL ) < 2 ) scaleExpL--;
2237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			while( ( scaleExpL > 0 ) && ( hEffL >> scaleExpL ) < 2 ) scaleExpL--;
2247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* downscale */
2267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			if( scaleExpL > 0 )
2277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
2287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				uint32 iL;
2297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				w1L = wEffL >> 1;
2307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				h1L = hEffL >> 1;
2317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				if( bufPtrA == NULL ) bbs_ERROR1( "%s:\nPreallocated buffer is needed", fNameL );
2327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				bbs_UInt8Arr_size( cpA, bufPtrA, w1L * h1L );
2337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				bim_downscaleBy2( bufPtrA->arrPtrE, srcL + yMinL * w0L + xMinL, w0L, wEffL, hEffL );
2347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				for( iL = 1; iL < scaleExpL; iL++ )
2357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
2367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					bim_downscaleBy2( bufPtrA->arrPtrE, bufPtrA->arrPtrE, w1L, w1L, h1L );
2377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					w1L >>= 1;
2387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					h1L >>= 1;
2397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
2407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				/* adjust inverted cordinates */
2427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				txL -= ( xMinL << 16 );
2437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				tyL -= ( yMinL << 16 );
2447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				mxxL >>= scaleExpL;
2457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				mxyL >>= scaleExpL;
2467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				myxL >>= scaleExpL;
2477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				myyL >>= scaleExpL;
2487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				txL >>= scaleExpL;
2497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				tyL >>= scaleExpL;
2507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				srcL = bufPtrA->arrPtrE;
2517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
2527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			downScaledL = TRUE;
2547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
2557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
2567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* if not downscaled and src and dst images are identcal then copy srcImage into buffer */
2587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( !downScaledL && dstImagePtrA == srcImagePtrA )
2597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
2607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 iL;
2617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 srcSizeL = srcImageWidthA * srcImageHeightA;
2627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( bufPtrA == NULL ) bbs_ERROR1( "%s:\nPreallocated buffer is needed", fNameL );
2637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bbs_UInt8Arr_size( cpA, bufPtrA, srcSizeL );
2647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		for( iL = 0; iL < srcSizeL; iL++ ) bufPtrA->arrPtrE[ iL ] = srcImagePtrA[ iL ];
2657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		srcL = bufPtrA->arrPtrE;
2667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
2677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* compute destination image */
2697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* bounds check (dst image fully inside src image? -> fast algorithm) */
2717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
2727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 xL, yL;
2737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 wbL = w1L - 1;
2747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 hbL = h1L - 1;
2757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		xL = txL >> 16;
2777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		yL = tyL >> 16;
2787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		boundsOkL = boundsOkL && ( xL >= 0 && xL < wbL && yL >= 0 && yL < hbL );
2797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		xL = ( txL + mxxL * ( int32 )( dstWidthA - 1 ) ) >> 16;
2817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		yL = ( tyL + myxL * ( int32 )( dstWidthA - 1 ) ) >> 16;
2827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		boundsOkL = boundsOkL && ( xL >= 0 && xL < wbL && yL >= 0 && yL < hbL );
2837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		xL = ( txL + mxyL * ( int32 )( dstHeightA - 1 ) ) >> 16;
2857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		yL = ( tyL + myyL * ( int32 )( dstHeightA - 1 ) ) >> 16;
2867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		boundsOkL = boundsOkL && ( xL >= 0 && xL < wbL && yL >= 0 && yL < hbL );
2877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		xL = ( txL + mxyL * ( int32 )( dstHeightA - 1 ) + mxxL * ( int32 )( dstWidthA - 1 ) ) >> 16;
2897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		yL = ( tyL + myyL * ( int32 )( dstHeightA - 1 ) + myxL * ( int32 )( dstWidthA - 1 ) ) >> 16;
2907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		boundsOkL = boundsOkL && ( xL >= 0 && xL < wbL && yL >= 0 && yL < hbL );
2917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
2927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( boundsOkL )
2947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
2957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 iL, jL;
2967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		for( jL = 0; jL < ( int32 )dstHeightA; jL++ )
2977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
2987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* 16.16 */
2997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 xL = txL + mxyL * jL;
3007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 yL = tyL + myyL * jL;
3017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			for( iL = 0; iL < ( int32 )dstWidthA; iL++ )
3027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
3037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				int32 x0L = xL >> 16;
3047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				int32 y0L = yL >> 16;
3057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				uint32 xf2L = xL & 0x0FFFF;
3067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				uint32 yf2L = yL & 0x0FFFF;
3077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				uint32 xf1L = 0x10000 - xf2L;
3087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				uint32 yf1L = 0x10000 - yf2L;
3097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				xL += mxxL;
3117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				yL += myxL;
3127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
3147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					uint32 idxL = y0L * w1L + x0L;
3157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					uint32 v1L = ( ( uint32 )srcL[ idxL       ] * xf1L + ( uint32 )srcL[ idxL + 1       ] * xf2L + 0x0800 ) >> 12;
3167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					uint32 v2L = ( ( uint32 )srcL[ idxL + w1L ] * xf1L + ( uint32 )srcL[ idxL + w1L + 1 ] * xf2L + 0x0800 ) >> 12;
3177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					*dstL++ = ( v1L * yf1L + v2L * yf2L + 0x080000 ) >> 20;
3187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
3197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
3207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
3217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
3227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	else
3237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
3247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 iL, jL;
3257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		for( jL = 0; jL < ( int32 )dstHeightA; jL++ )
3267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
3277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* 16.16 */
3287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 xL = txL + mxyL * jL;
3297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 yL = tyL + myyL * jL;
3307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			for( iL = 0; iL < ( int32 )dstWidthA; iL++ )
3317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
3327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				int32 x0L = xL >> 16;
3337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				int32 y0L = yL >> 16;
3347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				uint32 xf2L = xL & 0x0FFFF;
3357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				uint32 yf2L = yL & 0x0FFFF;
3367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				uint32 xf1L = 0x10000 - xf2L;
3377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				uint32 yf1L = 0x10000 - yf2L;
3387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				xL += mxxL;
3407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				yL += myxL;
3417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				if( y0L < 0 )
3437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
3447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					if( x0L < 0 )
3457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					{
3467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						*dstL++ = srcL[ 0 ];
3477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					}
3487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					else if( x0L >= ( int32 )w1L - 1 )
3497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					{
3507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						*dstL++ = srcL[ w1L - 1 ];
3517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					}
3527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					else
3537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					{
3547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						*dstL++ = ( ( uint32 )srcL[ x0L ] * xf1L + ( uint32 )srcL[ x0L + 1 ] * xf2L + 0x08000 ) >> 16;
3557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					}
3567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
3577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				else if( y0L >= ( int32 )h1L - 1 )
3587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
3597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					if( x0L < 0 )
3607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					{
3617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						*dstL++ = srcL[ ( h1L - 1 ) * w1L ];
3627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					}
3637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					else if( x0L >= ( int32 )w1L - 1 )
3647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					{
3657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						*dstL++ = srcL[ ( h1L * w1L ) - 1 ];
3667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					}
3677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					else
3687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					{
3697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						uint32 idxL = ( h1L - 1 ) * w1L + x0L;
3707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						*dstL++ = ( ( uint32 )srcL[ idxL ] * xf1L + ( uint32 )srcL[ idxL + 1 ] * xf2L + 0x08000 ) >> 16;
3717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					}
3727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
3737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				else
3747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
3757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					if( x0L < 0 )
3767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					{
3777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						uint32 idxL = y0L * w1L;
3787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						*dstL++ = ( ( uint32 )srcL[ idxL ] * yf1L + ( uint32 )srcL[ idxL + w1L ] * yf2L + 0x08000 ) >> 16;
3797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					}
3807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					else if( x0L >= ( int32 )w1L - 1 )
3817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					{
3827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						uint32 idxL = ( y0L + 1 ) * w1L - 1;
3837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						*dstL++ = ( ( uint32 )srcL[ idxL ] * yf1L + ( uint32 )srcL[ idxL + w1L ] * yf2L + 0x08000 ) >> 16;
3847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					}
3857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					else
3867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					{
3877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						uint32 idxL = y0L * w1L + x0L;
3887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						uint32 v1L = ( ( uint32 )srcL[ idxL       ] * xf1L + ( uint32 )srcL[ idxL + 1       ] * xf2L + 0x0800 ) >> 12;
3897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						uint32 v2L = ( ( uint32 )srcL[ idxL + w1L ] * xf1L + ( uint32 )srcL[ idxL + w1L + 1 ] * xf2L + 0x0800 ) >> 12;
3907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						*dstL++ = ( v1L * yf1L + v2L * yf2L + 0x080000 ) >> 20;
3917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					}
3927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
3937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
3947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
3957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
3967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
3977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
3997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bim_filterWarpPixelReplication( struct bbs_Context* cpA,
4017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project								     uint8* dstImagePtrA,
4027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project								     const uint8* srcImagePtrA,
4037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project								     uint32 srcImageWidthA,
4047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project								     uint32 srcImageHeightA,
4057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project								     const struct bts_Int16Vec2D* offsPtrA,
4067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project								     const struct bts_Flt16Alt2D* altPtrA,
4077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project								     uint32 dstWidthA,
4087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project								     uint32 dstHeightA,
4097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project								     struct bbs_UInt8Arr* bufPtrA,
4107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project								     uint32 scaleThresholdA )
4117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
4127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_DEF_fNameL( "bim_filterWarpPixelReplication" )
4137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 w0L = srcImageWidthA;
4157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 h0L = srcImageHeightA;
4167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	const uint8* srcL = srcImagePtrA;
4187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint8* dstL = dstImagePtrA;
4197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 w1L = w0L;
4217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 h1L = h0L;
4227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* 16.16 */
4247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 scaleThrL = scaleThresholdA;
4257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	struct bts_Flt16Alt2D invAltL;
4267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* matrix variables */
4287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 mxxL, mxyL, myxL, myyL, txL, tyL;
4297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	flag downScaledL = FALSE;
4317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	flag boundsOkL = TRUE;
4327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( w0L == 0 || h0L == 0 || bts_Flt16Mat2D_det( &altPtrA->matE ) == 0 )
4347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
4357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 iL;
4367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		for( iL = 0; iL < dstWidthA * dstHeightA; iL++ ) dstImagePtrA[ iL ] = 0;
4377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		return;
4387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
4397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* compute inverse ALT */
4417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	invAltL = bts_Flt16Alt2D_inverted( altPtrA );
4427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* fixed point ALT 16.16 */
4447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( invAltL.matE.bbpE <= 16 )
4457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
4467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 shlL = 16 - invAltL.matE.bbpE;
4477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		mxxL = invAltL.matE.xxE << shlL;
4487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		mxyL = invAltL.matE.xyE << shlL;
4497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		myxL = invAltL.matE.yxE << shlL;
4507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		myyL = invAltL.matE.yyE << shlL;
4517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
4527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	else
4537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
4547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 shrL = invAltL.matE.bbpE - 16;
4557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		mxxL = ( ( invAltL.matE.xxE >> ( shrL - 1 ) ) + 1 ) >> 1;
4567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		mxyL = ( ( invAltL.matE.xyE >> ( shrL - 1 ) ) + 1 ) >> 1;
4577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		myxL = ( ( invAltL.matE.yxE >> ( shrL - 1 ) ) + 1 ) >> 1;
4587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		myyL = ( ( invAltL.matE.yyE >> ( shrL - 1 ) ) + 1 ) >> 1;
4597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
4607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( invAltL.vecE.bbpE <= 16 )
4627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
4637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 shlL = 16 - invAltL.vecE.bbpE;
4647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		txL = invAltL.vecE.xE << shlL;
4657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		tyL = invAltL.vecE.yE << shlL;
4667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
4677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	else
4687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
4697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 shrL = invAltL.vecE.bbpE - 16;
4707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		txL = ( ( invAltL.vecE.xE >> ( shrL - 1 ) ) + 1 ) >> 1;
4717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		tyL = ( ( invAltL.vecE.yE >> ( shrL - 1 ) ) + 1 ) >> 1;
4727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
4737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* add offset */
4757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	txL += ( int32 )offsPtrA->xE << 16;
4767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	tyL += ( int32 )offsPtrA->yE << 16;
4777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( scaleThresholdA > 0 )
4797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
4807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* compute downscale exponent */
4817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 axxL = ( mxxL >= 0 ) ? mxxL : -mxxL;
4827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 axyL = ( mxyL >= 0 ) ? mxyL : -mxyL;
4837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 ayxL = ( myxL >= 0 ) ? myxL : -myxL;
4847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 ayyL = ( myyL >= 0 ) ? myyL : -myyL;
4857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 a1L = ( axxL > ayxL ) ? axxL : ayxL;
4877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 a2L = ( axyL > ayyL ) ? axyL : ayyL;
4887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 invScaleL = ( a1L < a2L ) ? a1L : a2L;
4907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 scaleExpL = 0;
4917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		while( ( invScaleL >> scaleExpL ) > scaleThrL ) scaleExpL++;
4927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		while( ( scaleExpL > 0 ) && ( w0L >> scaleExpL ) < 2 ) scaleExpL--;
4937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		while( ( scaleExpL > 0 ) && ( h0L >> scaleExpL ) < 2 ) scaleExpL--;
4947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* downscale image */
4967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( scaleExpL > 0 )
4977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
4987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* down sampling is limited to the effective area of the original image */
4997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* compute effective area by mapping all corners of the dst rectangle */
5017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 xMinL = 0x7FFFFFFF;
5027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 yMinL = 0x7FFFFFFF;
5037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 xMaxL = 0x80000000;
5047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 yMaxL = 0x80000000;
5057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			uint32 wEffL, hEffL;
5067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
5087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				int32 xL, yL;
5097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				xL = txL;
5107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				yL = tyL;
5117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				xMinL = xL < xMinL ? xL : xMinL;
5127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				yMinL = yL < yMinL ? yL : yMinL;
5137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				xMaxL = xL > xMaxL ? xL : xMaxL;
5147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				yMaxL = yL > yMaxL ? yL : yMaxL;
5157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				xL = txL + mxxL * ( int32 )dstWidthA + mxyL * ( int32 )dstHeightA;
5167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				yL = tyL + myxL * ( int32 )dstWidthA + myyL * ( int32 )dstHeightA;
5177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				xMinL = xL < xMinL ? xL : xMinL;
5187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				yMinL = yL < yMinL ? yL : yMinL;
5197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				xMaxL = xL > xMaxL ? xL : xMaxL;
5207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				yMaxL = yL > yMaxL ? yL : yMaxL;
5217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				xL = txL + mxyL * ( int32 )dstHeightA;
5227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				yL = tyL + myyL * ( int32 )dstHeightA;
5237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				xMinL = xL < xMinL ? xL : xMinL;
5247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				yMinL = yL < yMinL ? yL : yMinL;
5257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				xMaxL = xL > xMaxL ? xL : xMaxL;
5267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				yMaxL = yL > yMaxL ? yL : yMaxL;
5277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				xL = txL + mxxL * ( int32 )dstWidthA;
5287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				yL = tyL + myxL * ( int32 )dstWidthA;
5297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				xMinL = xL < xMinL ? xL : xMinL;
5307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				yMinL = yL < yMinL ? yL : yMinL;
5317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				xMaxL = xL > xMaxL ? xL : xMaxL;
5327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				yMaxL = yL > yMaxL ? yL : yMaxL;
5337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
5347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			xMaxL = ( xMaxL >> 16 ) + 2;
5367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			yMaxL = ( yMaxL >> 16 ) + 2;
5377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			xMinL >>= 16;
5387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			yMinL >>= 16;
5397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* ensre effective area stays within original frame */
5417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			xMinL = 0 > xMinL ? 0 : xMinL;
5427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			yMinL = 0 > yMinL ? 0 : yMinL;
5437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			xMinL = ( int32 )w0L < xMinL ? w0L : xMinL;
5447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			yMinL = ( int32 )h0L < yMinL ? h0L : yMinL;
5457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			xMaxL = 0 > xMaxL ? 0 : xMaxL;
5467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			yMaxL = 0 > yMaxL ? 0 : yMaxL;
5477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			xMaxL = ( int32 )w0L < xMaxL ? w0L : xMaxL;
5487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			yMaxL = ( int32 )h0L < yMaxL ? h0L : yMaxL;
5497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			wEffL = xMaxL - xMinL;
5517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			hEffL = yMaxL - yMinL;
5527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* ensure downscaling does not reduce image to 0 */
5547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			while( ( scaleExpL > 0 ) && ( wEffL >> scaleExpL ) < 2 ) scaleExpL--;
5557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			while( ( scaleExpL > 0 ) && ( hEffL >> scaleExpL ) < 2 ) scaleExpL--;
5567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* downscale */
5587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			if( scaleExpL > 0 )
5597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
5607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				uint32 iL;
5617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				w1L = wEffL >> 1;
5627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				h1L = hEffL >> 1;
5637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				if( bufPtrA == NULL ) bbs_ERROR1( "%s:\nPreallocated buffer is needed", fNameL );
5647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				bbs_UInt8Arr_size( cpA, bufPtrA, w1L * h1L );
5657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				bim_downscaleBy2( bufPtrA->arrPtrE, srcL + yMinL * w0L + xMinL, w0L, wEffL, hEffL );
5667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				for( iL = 1; iL < scaleExpL; iL++ )
5677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
5687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					bim_downscaleBy2( bufPtrA->arrPtrE, bufPtrA->arrPtrE, w1L, w1L, h1L );
5697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					w1L >>= 1;
5707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					h1L >>= 1;
5717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
5727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				/* adjust inverted cordinates */
5747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				txL -= ( xMinL << 16 );
5757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				tyL -= ( yMinL << 16 );
5767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				mxxL >>= scaleExpL;
5777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				mxyL >>= scaleExpL;
5787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				myxL >>= scaleExpL;
5797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				myyL >>= scaleExpL;
5807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				txL >>= scaleExpL;
5817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				tyL >>= scaleExpL;
5827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				srcL = bufPtrA->arrPtrE;
5837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
5847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			downScaledL = TRUE;
5867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
5877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
5887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* if not downscaled and src and dst images are identcal then copy srcImage into buffer */
5907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( !downScaledL && dstImagePtrA == srcImagePtrA )
5917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
5927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 iL;
5937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 srcSizeL = srcImageWidthA * srcImageHeightA;
5947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( bufPtrA == NULL ) bbs_ERROR1( "%s:\nPreallocated buffer is needed", fNameL );
5957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bbs_UInt8Arr_size( cpA, bufPtrA, srcSizeL );
5967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		for( iL = 0; iL < srcSizeL; iL++ ) bufPtrA->arrPtrE[ iL ] = srcImagePtrA[ iL ];
5977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		srcL = bufPtrA->arrPtrE;
5987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
5997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* compute destination image */
6017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* bounds check (dst image fully inside src image? -> fast algorithm) */
6037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
6047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 xL, yL;
6057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 wbL = w1L - 1;
6067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 hbL = h1L - 1;
6077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		xL = txL >> 16;
6097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		yL = tyL >> 16;
6107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		boundsOkL = boundsOkL && ( xL >= 0 && xL < wbL && yL >= 0 && yL < hbL );
6117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		xL = ( txL + mxxL * ( int32 )( dstWidthA - 1 ) ) >> 16;
6137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		yL = ( tyL + myxL * ( int32 )( dstWidthA - 1 ) ) >> 16;
6147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		boundsOkL = boundsOkL && ( xL >= 0 && xL < wbL && yL >= 0 && yL < hbL );
6157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		xL = ( txL + mxyL * ( int32 )( dstHeightA - 1 ) ) >> 16;
6177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		yL = ( tyL + myyL * ( int32 )( dstHeightA - 1 ) ) >> 16;
6187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		boundsOkL = boundsOkL && ( xL >= 0 && xL < wbL && yL >= 0 && yL < hbL );
6197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		xL = ( txL + mxyL * ( int32 )( dstHeightA - 1 ) + mxxL * ( int32 )( dstWidthA - 1 ) ) >> 16;
6217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		yL = ( tyL + myyL * ( int32 )( dstHeightA - 1 ) + myxL * ( int32 )( dstWidthA - 1 ) ) >> 16;
6227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		boundsOkL = boundsOkL && ( xL >= 0 && xL < wbL && yL >= 0 && yL < hbL );
6237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
6247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( boundsOkL )
6267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
6277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 iL, jL;
6287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		for( jL = 0; jL < ( int32 )dstHeightA; jL++ )
6297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
6307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* 16.16 */
6317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 xL = txL + mxyL * jL;
6327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 yL = tyL + myyL * jL;
6337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			for( iL = 0; iL < ( int32 )dstWidthA; iL++ )
6347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
6357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				/* nearest whole position */
6367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				*dstL++ = srcL[ ( ( ( yL >> 15 ) + 1 ) >> 1 ) * w1L + ( ( ( xL >> 15 ) + 1 ) >> 1 ) ];
6377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				xL += mxxL;
6387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				yL += myxL;
6397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
6407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
6417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
6427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	else
6437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
6447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 iL, jL;
6457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		for( jL = 0; jL < ( int32 )dstHeightA; jL++ )
6467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
6477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* 16.16 */
6487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 xL = txL + mxyL * jL;
6497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 yL = tyL + myyL * jL;
6507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			for( iL = 0; iL < ( int32 )dstWidthA; iL++ )
6517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
6527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				/* nearest whole position */
6537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				int32 x0L = ( ( xL >> 15 ) + 1 ) >> 1;
6547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				int32 y0L = ( ( yL >> 15 ) + 1 ) >> 1;
6557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				xL += mxxL;
6567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				yL += myxL;
6577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				if( y0L < 0 )
6597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
6607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					if( x0L < 0 )
6617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					{
6627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						*dstL++ = srcL[ 0 ];
6637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					}
6647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					else if( x0L >= ( int32 )w1L - 1 )
6657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					{
6667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						*dstL++ = srcL[ w1L - 1 ];
6677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					}
6687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					else
6697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					{
6707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						*dstL++ = srcL[ x0L ];
6717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					}
6727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
6737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				else if( y0L >= ( int32 )h1L - 1 )
6747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
6757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					if( x0L < 0 )
6767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					{
6777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						*dstL++ = srcL[ ( h1L - 1 ) * w1L ];
6787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					}
6797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					else if( x0L >= ( int32 )w1L - 1 )
6807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					{
6817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						*dstL++ = srcL[ ( h1L * w1L ) - 1 ];
6827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					}
6837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					else
6847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					{
6857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						*dstL++ = srcL[ ( h1L - 1 ) * w1L + x0L ];
6867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					}
6877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
6887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				else
6897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
6907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					if( x0L < 0 )
6917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					{
6927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						*dstL++ = srcL[ y0L * w1L ];
6937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					}
6947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					else if( x0L >= ( int32 )w1L - 1 )
6957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					{
6967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						*dstL++ = srcL[ ( y0L + 1 ) * w1L - 1 ];
6977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					}
6987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					else
6997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					{
7007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						*dstL++ = srcL[ y0L * w1L + x0L ];
7017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					}
7027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
7037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
7047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
7057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
7067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
7077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
7097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bim_filterWarp( struct bbs_Context* cpA,
7117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					 uint8* dstImagePtrA,
7127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					 const uint8* srcImagePtrA,
7137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					 uint32 srcImageWidthA,
7147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					 uint32 srcImageHeightA,
7157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				     const struct bts_Int16Vec2D* offsPtrA,
7167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					 const struct bts_Flt16Alt2D* altPtrA,
7177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					 uint32 dstWidthA,
7187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					 uint32 dstHeightA,
7197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					 struct bbs_UInt8Arr* bufPtrA,
7207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					 uint32 scaleThresholdA,
7217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					 flag interpolateA )
7227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
7237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( interpolateA )
7247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
7257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bim_filterWarpInterpolation( cpA, dstImagePtrA, srcImagePtrA, srcImageWidthA, srcImageHeightA, offsPtrA, altPtrA, dstWidthA, dstHeightA, bufPtrA, scaleThresholdA );
7267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
7277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	else
7287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
7297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bim_filterWarpPixelReplication( cpA, dstImagePtrA, srcImagePtrA, srcImageWidthA, srcImageHeightA, offsPtrA, altPtrA, dstWidthA, dstHeightA, bufPtrA, scaleThresholdA );
7307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
7317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
7327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
7347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
735