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