16acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*M/////////////////////////////////////////////////////////////////////////////////////// 26acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 36acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. 46acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 56acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// By downloading, copying, installing or using the software you agree to this license. 66acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// If you do not agree to this license, do not download, install, 76acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// copy or use the software. 86acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 96acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Intel License Agreement 116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// For Open Source Computer Vision Library 126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Copyright (C) 2000, Intel Corporation, all rights reserved. 146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Third party copyrights are property of their respective owners. 156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Redistribution and use in source and binary forms, with or without modification, 176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// are permitted provided that the following conditions are met: 186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// * Redistribution's of source code must retain the above copyright notice, 206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// this list of conditions and the following disclaimer. 216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// * Redistribution's in binary form must reproduce the above copyright notice, 236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// this list of conditions and the following disclaimer in the documentation 246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// and/or other materials provided with the distribution. 256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// * The name of Intel Corporation may not be used to endorse or promote products 276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// derived from this software without specific prior written permission. 286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// This software is provided by the copyright holders and contributors "as is" and 306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// any express or implied warranties, including, but not limited to, the implied 316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// warranties of merchantability and fitness for a particular purpose are disclaimed. 326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// In no event shall the Intel Corporation or contributors be liable for any direct, 336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// indirect, incidental, special, exemplary, or consequential damages 346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// (including, but not limited to, procurement of substitute goods or services; 356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// loss of use, data, or profits; or business interruption) however caused 366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// and on any theory of liability, whether in contract, strict liability, 376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// or tort (including negligence or otherwise) arising in any way out of 386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// the use of this software, even if advised of the possibility of such damage. 396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//M*/ 416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "_cxcore.h" 436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\ 456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn* Splitting/extracting array channels * 466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/ 476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_PX2PL2PX_ENTRY_C2( arrtype_ptr, ptr ) \ 496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn arrtype_ptr plane0 = ptr[0]; \ 506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn arrtype_ptr plane1 = ptr[1]; 516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_PX2PL2PX_ENTRY_C3( arrtype_ptr, ptr ) \ 536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn arrtype_ptr plane0 = ptr[0]; \ 546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn arrtype_ptr plane1 = ptr[1]; \ 556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn arrtype_ptr plane2 = ptr[2]; 566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_PX2PL2PX_ENTRY_C4( arrtype_ptr, ptr ) \ 586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn arrtype_ptr plane0 = ptr[0]; \ 596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn arrtype_ptr plane1 = ptr[1]; \ 606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn arrtype_ptr plane2 = ptr[2]; \ 616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn arrtype_ptr plane3 = ptr[3]; 626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_PX2PL_C2( arrtype, len ) \ 656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ \ 666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int j; \ 676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( j = 0; j < (len); j++, (src) += 2 ) \ 696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn arrtype t0 = (src)[0]; \ 716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn arrtype t1 = (src)[1]; \ 726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn plane0[j] = t0; \ 746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn plane1[j] = t1; \ 756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn plane0 += dststep; \ 776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn plane1 += dststep; \ 786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_PX2PL_C3( arrtype, len ) \ 826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ \ 836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int j; \ 846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( j = 0; j < (len); j++, (src) += 3 ) \ 866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn arrtype t0 = (src)[0]; \ 886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn arrtype t1 = (src)[1]; \ 896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn arrtype t2 = (src)[2]; \ 906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn plane0[j] = t0; \ 926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn plane1[j] = t1; \ 936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn plane2[j] = t2; \ 946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn plane0 += dststep; \ 966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn plane1 += dststep; \ 976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn plane2 += dststep; \ 986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_PX2PL_C4( arrtype, len ) \ 1026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ \ 1036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int j; \ 1046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 1056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( j = 0; j < (len); j++, (src) += 4 ) \ 1066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 1076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn arrtype t0 = (src)[0]; \ 1086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn arrtype t1 = (src)[1]; \ 1096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 1106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn plane0[j] = t0; \ 1116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn plane1[j] = t1; \ 1126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 1136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn t0 = (src)[2]; \ 1146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn t1 = (src)[3]; \ 1156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 1166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn plane2[j] = t0; \ 1176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn plane3[j] = t1; \ 1186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 1196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn plane0 += dststep; \ 1206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn plane1 += dststep; \ 1216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn plane2 += dststep; \ 1226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn plane3 += dststep; \ 1236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 1246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_PX2PL_COI( arrtype, len, cn ) \ 1276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ \ 1286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int j; \ 1296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 1306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( j = 0; j <= (len) - 4; j += 4, (src) += 4*(cn))\ 1316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 1326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn arrtype t0 = (src)[0]; \ 1336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn arrtype t1 = (src)[(cn)]; \ 1346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 1356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn (dst)[j] = t0; \ 1366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn (dst)[j+1] = t1; \ 1376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 1386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn t0 = (src)[(cn)*2]; \ 1396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn t1 = (src)[(cn)*3]; \ 1406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 1416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn (dst)[j+2] = t0; \ 1426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn (dst)[j+3] = t1; \ 1436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 1446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 1456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( ; j < (len); j++, (src) += (cn)) \ 1466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 1476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn (dst)[j] = (src)[0]; \ 1486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 1496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 1506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_COPY_PX2PL_FUNC_2D( arrtype, flavor, \ 1536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cn, entry_macro ) \ 1546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIPCVAPI_IMPL( CvStatus, icvCopy_##flavor##_C##cn##P##cn##R,\ 1556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn( const arrtype* src, int srcstep, \ 1566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn arrtype** dst, int dststep, CvSize size ), \ 1576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn (src, srcstep, dst, dststep, size)) \ 1586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ \ 1596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn entry_macro(arrtype*, dst); \ 1606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn srcstep /= sizeof(src[0]); \ 1616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dststep /= sizeof(dst[0][0]); \ 1626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 1636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( ; size.height--; src += srcstep ) \ 1646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 1656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ICV_DEF_PX2PL_C##cn( arrtype, size.width ); \ 1666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn src -= size.width*(cn); \ 1676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 1686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 1696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return CV_OK; \ 1706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 1716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_COPY_PX2PL_FUNC_2D_COI( arrtype, flavor )\ 1746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIPCVAPI_IMPL( CvStatus, icvCopy_##flavor##_CnC1CR, \ 1756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn( const arrtype* src, int srcstep, arrtype* dst, int dststep,\ 1766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSize size, int cn, int coi ), \ 1776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn (src, srcstep, dst, dststep, size, cn, coi)) \ 1786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ \ 1796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn src += coi - 1; \ 1806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn srcstep /= sizeof(src[0]); \ 1816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dststep /= sizeof(dst[0]); \ 1826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 1836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( ; size.height--; src += srcstep, dst += dststep )\ 1846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 1856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ICV_DEF_PX2PL_COI( arrtype, size.width, cn ); \ 1866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn src -= size.width*(cn); \ 1876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 1886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 1896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return CV_OK; \ 1906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 1916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_COPY_PX2PL_FUNC_2D( uchar, 8u, 2, ICV_DEF_PX2PL2PX_ENTRY_C2 ) 1946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_COPY_PX2PL_FUNC_2D( uchar, 8u, 3, ICV_DEF_PX2PL2PX_ENTRY_C3 ) 1956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_COPY_PX2PL_FUNC_2D( uchar, 8u, 4, ICV_DEF_PX2PL2PX_ENTRY_C4 ) 1966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_COPY_PX2PL_FUNC_2D( ushort, 16s, 2, ICV_DEF_PX2PL2PX_ENTRY_C2 ) 1976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_COPY_PX2PL_FUNC_2D( ushort, 16s, 3, ICV_DEF_PX2PL2PX_ENTRY_C3 ) 1986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_COPY_PX2PL_FUNC_2D( ushort, 16s, 4, ICV_DEF_PX2PL2PX_ENTRY_C4 ) 1996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_COPY_PX2PL_FUNC_2D( int, 32f, 2, ICV_DEF_PX2PL2PX_ENTRY_C2 ) 2006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_COPY_PX2PL_FUNC_2D( int, 32f, 3, ICV_DEF_PX2PL2PX_ENTRY_C3 ) 2016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_COPY_PX2PL_FUNC_2D( int, 32f, 4, ICV_DEF_PX2PL2PX_ENTRY_C4 ) 2026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_COPY_PX2PL_FUNC_2D( int64, 64f, 2, ICV_DEF_PX2PL2PX_ENTRY_C2 ) 2036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_COPY_PX2PL_FUNC_2D( int64, 64f, 3, ICV_DEF_PX2PL2PX_ENTRY_C3 ) 2046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_COPY_PX2PL_FUNC_2D( int64, 64f, 4, ICV_DEF_PX2PL2PX_ENTRY_C4 ) 2056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_COPY_PX2PL_FUNC_2D_COI( uchar, 8u ) 2086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_COPY_PX2PL_FUNC_2D_COI( ushort, 16s ) 2096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_COPY_PX2PL_FUNC_2D_COI( int, 32f ) 2106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_COPY_PX2PL_FUNC_2D_COI( int64, 64f ) 2116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\ 2146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn* Merging/inserting array channels * 2156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/ 2166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_PL2PX_C2( arrtype, len ) \ 2196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ \ 2206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int j; \ 2216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 2226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( j = 0; j < (len); j++, (dst) += 2 )\ 2236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 2246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn arrtype t0 = plane0[j]; \ 2256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn arrtype t1 = plane1[j]; \ 2266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 2276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[0] = t0; \ 2286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[1] = t1; \ 2296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 2306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn plane0 += srcstep; \ 2316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn plane1 += srcstep; \ 2326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 2336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_PL2PX_C3( arrtype, len ) \ 2366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ \ 2376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int j; \ 2386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 2396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( j = 0; j < (len); j++, (dst) += 3 )\ 2406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 2416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn arrtype t0 = plane0[j]; \ 2426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn arrtype t1 = plane1[j]; \ 2436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn arrtype t2 = plane2[j]; \ 2446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 2456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[0] = t0; \ 2466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[1] = t1; \ 2476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[2] = t2; \ 2486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 2496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn plane0 += srcstep; \ 2506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn plane1 += srcstep; \ 2516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn plane2 += srcstep; \ 2526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 2536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_PL2PX_C4( arrtype, len ) \ 2566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ \ 2576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int j; \ 2586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 2596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( j = 0; j < (len); j++, (dst) += 4 )\ 2606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 2616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn arrtype t0 = plane0[j]; \ 2626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn arrtype t1 = plane1[j]; \ 2636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 2646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[0] = t0; \ 2656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[1] = t1; \ 2666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 2676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn t0 = plane2[j]; \ 2686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn t1 = plane3[j]; \ 2696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 2706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[2] = t0; \ 2716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[3] = t1; \ 2726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 2736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn plane0 += srcstep; \ 2746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn plane1 += srcstep; \ 2756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn plane2 += srcstep; \ 2766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn plane3 += srcstep; \ 2776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 2786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_PL2PX_COI( arrtype, len, cn ) \ 2816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ \ 2826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int j; \ 2836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 2846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( j = 0; j <= (len) - 4; j += 4, (dst) += 4*(cn))\ 2856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 2866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn arrtype t0 = (src)[j]; \ 2876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn arrtype t1 = (src)[j+1]; \ 2886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 2896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn (dst)[0] = t0; \ 2906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn (dst)[(cn)] = t1; \ 2916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 2926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn t0 = (src)[j+2]; \ 2936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn t1 = (src)[j+3]; \ 2946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 2956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn (dst)[(cn)*2] = t0; \ 2966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn (dst)[(cn)*3] = t1; \ 2976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 2986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 2996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( ; j < (len); j++, (dst) += (cn)) \ 3006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 3016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn (dst)[0] = (src)[j]; \ 3026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 3036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 3046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_COPY_PL2PX_FUNC_2D( arrtype, flavor, cn, entry_macro ) \ 3076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIPCVAPI_IMPL( CvStatus, icvCopy_##flavor##_P##cn##C##cn##R, \ 3086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn( const arrtype** src, int srcstep, \ 3096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn arrtype* dst, int dststep, CvSize size ), \ 3106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn (src, srcstep, dst, dststep, size)) \ 3116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ \ 3126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn entry_macro(const arrtype*, src); \ 3136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn srcstep /= sizeof(src[0][0]); \ 3146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dststep /= sizeof(dst[0]); \ 3156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 3166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( ; size.height--; dst += dststep ) \ 3176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 3186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ICV_DEF_PL2PX_C##cn( arrtype, size.width ); \ 3196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst -= size.width*(cn); \ 3206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 3216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 3226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return CV_OK; \ 3236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 3246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_COPY_PL2PX_FUNC_2D_COI( arrtype, flavor ) \ 3276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIPCVAPI_IMPL( CvStatus, icvCopy_##flavor##_C1CnCR, \ 3286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn( const arrtype* src, int srcstep, \ 3296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn arrtype* dst, int dststep, \ 3306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSize size, int cn, int coi ), \ 3316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn (src, srcstep, dst, dststep, size, cn, coi)) \ 3326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ \ 3336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst += coi - 1; \ 3346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn srcstep /= sizeof(src[0]); dststep /= sizeof(dst[0]); \ 3356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 3366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( ; size.height--; src += srcstep, dst += dststep ) \ 3376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 3386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ICV_DEF_PL2PX_COI( arrtype, size.width, cn ); \ 3396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst -= size.width*(cn); \ 3406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 3416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 3426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return CV_OK; \ 3436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 3446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_COPY_PL2PX_FUNC_2D( uchar, 8u, 2, ICV_DEF_PX2PL2PX_ENTRY_C2 ) 3476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_COPY_PL2PX_FUNC_2D( uchar, 8u, 3, ICV_DEF_PX2PL2PX_ENTRY_C3 ) 3486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_COPY_PL2PX_FUNC_2D( uchar, 8u, 4, ICV_DEF_PX2PL2PX_ENTRY_C4 ) 3496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_COPY_PL2PX_FUNC_2D( ushort, 16s, 2, ICV_DEF_PX2PL2PX_ENTRY_C2 ) 3506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_COPY_PL2PX_FUNC_2D( ushort, 16s, 3, ICV_DEF_PX2PL2PX_ENTRY_C3 ) 3516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_COPY_PL2PX_FUNC_2D( ushort, 16s, 4, ICV_DEF_PX2PL2PX_ENTRY_C4 ) 3526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_COPY_PL2PX_FUNC_2D( int, 32f, 2, ICV_DEF_PX2PL2PX_ENTRY_C2 ) 3536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_COPY_PL2PX_FUNC_2D( int, 32f, 3, ICV_DEF_PX2PL2PX_ENTRY_C3 ) 3546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_COPY_PL2PX_FUNC_2D( int, 32f, 4, ICV_DEF_PX2PL2PX_ENTRY_C4 ) 3556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_COPY_PL2PX_FUNC_2D( int64, 64f, 2, ICV_DEF_PX2PL2PX_ENTRY_C2 ) 3566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_COPY_PL2PX_FUNC_2D( int64, 64f, 3, ICV_DEF_PX2PL2PX_ENTRY_C3 ) 3576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_COPY_PL2PX_FUNC_2D( int64, 64f, 4, ICV_DEF_PX2PL2PX_ENTRY_C4 ) 3586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_COPY_PL2PX_FUNC_2D_COI( uchar, 8u ) 3606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_COPY_PL2PX_FUNC_2D_COI( ushort, 16s ) 3616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_COPY_PL2PX_FUNC_2D_COI( int, 32f ) 3626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_COPY_PL2PX_FUNC_2D_COI( int64, 64f ) 3636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_PXPLPX_TAB( name, FROM, TO ) \ 3666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic void \ 3676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennname( CvBigFuncTable* tab ) \ 3686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ \ 3696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn tab->fn_2d[CV_8UC2] = (void*)icvCopy##_8u_##FROM##2##TO##2R; \ 3706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn tab->fn_2d[CV_8UC3] = (void*)icvCopy##_8u_##FROM##3##TO##3R; \ 3716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn tab->fn_2d[CV_8UC4] = (void*)icvCopy##_8u_##FROM##4##TO##4R; \ 3726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 3736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn tab->fn_2d[CV_8SC2] = (void*)icvCopy##_8u_##FROM##2##TO##2R; \ 3746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn tab->fn_2d[CV_8SC3] = (void*)icvCopy##_8u_##FROM##3##TO##3R; \ 3756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn tab->fn_2d[CV_8SC4] = (void*)icvCopy##_8u_##FROM##4##TO##4R; \ 3766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 3776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn tab->fn_2d[CV_16UC2] = (void*)icvCopy##_16s_##FROM##2##TO##2R; \ 3786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn tab->fn_2d[CV_16UC3] = (void*)icvCopy##_16s_##FROM##3##TO##3R; \ 3796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn tab->fn_2d[CV_16UC4] = (void*)icvCopy##_16s_##FROM##4##TO##4R; \ 3806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 3816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn tab->fn_2d[CV_16SC2] = (void*)icvCopy##_16s_##FROM##2##TO##2R; \ 3826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn tab->fn_2d[CV_16SC3] = (void*)icvCopy##_16s_##FROM##3##TO##3R; \ 3836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn tab->fn_2d[CV_16SC4] = (void*)icvCopy##_16s_##FROM##4##TO##4R; \ 3846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 3856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn tab->fn_2d[CV_32SC2] = (void*)icvCopy##_32f_##FROM##2##TO##2R; \ 3866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn tab->fn_2d[CV_32SC3] = (void*)icvCopy##_32f_##FROM##3##TO##3R; \ 3876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn tab->fn_2d[CV_32SC4] = (void*)icvCopy##_32f_##FROM##4##TO##4R; \ 3886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 3896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn tab->fn_2d[CV_32FC2] = (void*)icvCopy##_32f_##FROM##2##TO##2R; \ 3906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn tab->fn_2d[CV_32FC3] = (void*)icvCopy##_32f_##FROM##3##TO##3R; \ 3916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn tab->fn_2d[CV_32FC4] = (void*)icvCopy##_32f_##FROM##4##TO##4R; \ 3926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 3936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn tab->fn_2d[CV_64FC2] = (void*)icvCopy##_64f_##FROM##2##TO##2R; \ 3946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn tab->fn_2d[CV_64FC3] = (void*)icvCopy##_64f_##FROM##3##TO##3R; \ 3956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn tab->fn_2d[CV_64FC4] = (void*)icvCopy##_64f_##FROM##4##TO##4R; \ 3966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 3976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_PXPLCOI_TAB( name, FROM, TO ) \ 4016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic void \ 4026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennname( CvFuncTable* tab ) \ 4036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ \ 4046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn tab->fn_2d[CV_8U] = (void*)icvCopy##_8u_##FROM##TO##CR; \ 4056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn tab->fn_2d[CV_8S] = (void*)icvCopy##_8u_##FROM##TO##CR; \ 4066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn tab->fn_2d[CV_16U] = (void*)icvCopy##_16s_##FROM##TO##CR; \ 4076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn tab->fn_2d[CV_16S] = (void*)icvCopy##_16s_##FROM##TO##CR; \ 4086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn tab->fn_2d[CV_32S] = (void*)icvCopy##_32f_##FROM##TO##CR; \ 4096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn tab->fn_2d[CV_32F] = (void*)icvCopy##_32f_##FROM##TO##CR; \ 4106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn tab->fn_2d[CV_64F] = (void*)icvCopy##_64f_##FROM##TO##CR; \ 4116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 4126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_PXPLPX_TAB( icvInitSplitRTable, C, P ) 4156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_PXPLCOI_TAB( icvInitSplitRCoiTable, Cn, C1 ) 4166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_PXPLPX_TAB( icvInitCvtPlaneToPixRTable, P, C ) 4176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_PXPLCOI_TAB( icvInitCvtPlaneToPixRCoiTable, C1, Cn ) 4186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL *CvSplitFunc)( const void* src, int srcstep, 4206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void** dst, int dststep, CvSize size); 4216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL *CvExtractPlaneFunc)( const void* src, int srcstep, 4236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void* dst, int dststep, 4246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSize size, int cn, int coi ); 4256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL *CvMergeFunc)( const void** src, int srcstep, 4276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void* dst, int dststep, CvSize size); 4286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL *CvInsertPlaneFunc)( const void* src, int srcstep, 4306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void* dst, int dststep, 4316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSize size, int cn, int coi ); 4326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void 4346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvSplit( const void* srcarr, void* dstarr0, void* dstarr1, void* dstarr2, void* dstarr3 ) 4356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 4366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn static CvBigFuncTable pxpl_tab; 4376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn static CvFuncTable pxplcoi_tab; 4386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn static int inittab = 0; 4396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_FUNCNAME( "cvSplit" ); 4416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn __BEGIN__; 4436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvMat stub[5], *dst[4], *src = (CvMat*)srcarr; 4456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSize size; 4466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void* dstptr[4] = { 0, 0, 0, 0 }; 4476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int type, cn, coi = 0; 4486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int i, nzplanes = 0, nzidx = -1; 4496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int cont_flag; 4506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int src_step, dst_step = 0; 4516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !inittab ) 4536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 4546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvInitSplitRTable( &pxpl_tab ); 4556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvInitSplitRCoiTable( &pxplcoi_tab ); 4566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn inittab = 1; 4576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 4586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[0] = (CvMat*)dstarr0; 4606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[1] = (CvMat*)dstarr1; 4616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[2] = (CvMat*)dstarr2; 4626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[3] = (CvMat*)dstarr3; 4636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( src = cvGetMat( src, stub + 4, &coi )); 4656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn //if( coi != 0 ) 4676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn // CV_ERROR( CV_BadCOI, "" ); 4686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn type = CV_MAT_TYPE( src->type ); 4706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cn = CV_MAT_CN( type ); 4716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cont_flag = src->type; 4736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( cn == 1 ) 4756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_BadNumChannels, "" ); 4766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i < 4; i++ ) 4786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 4796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( dst[i] ) 4806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 4816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn nzplanes++; 4826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn nzidx = i; 4836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( dst[i] = cvGetMat( dst[i], stub + i )); 4846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( CV_MAT_CN( dst[i]->type ) != 1 ) 4856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_BadNumChannels, "" ); 4866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !CV_ARE_DEPTHS_EQ( dst[i], src )) 4876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_StsUnmatchedFormats, "" ); 4886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !CV_ARE_SIZES_EQ( dst[i], src )) 4896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_StsUnmatchedSizes, "" ); 4906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( nzplanes > i && i > 0 && dst[i]->step != dst[i-1]->step ) 4916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_BadStep, "" ); 4926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst_step = dst[i]->step; 4936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dstptr[nzplanes-1] = dst[i]->data.ptr; 4946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cont_flag &= dst[i]->type; 4966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 4976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 4986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn src_step = src->step; 5006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn size = cvGetMatSize( src ); 5016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( CV_IS_MAT_CONT( cont_flag )) 5036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 5046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn size.width *= size.height; 5056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn src_step = dst_step = CV_STUB_STEP; 5066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn size.height = 1; 5086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 5096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( nzplanes == cn ) 5116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 5126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSplitFunc func = (CvSplitFunc)pxpl_tab.fn_2d[type]; 5136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !func ) 5156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_StsUnsupportedFormat, "" ); 5166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn IPPI_CALL( func( src->data.ptr, src_step, dstptr, dst_step, size )); 5186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 5196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else if( nzplanes == 1 ) 5206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 5216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvExtractPlaneFunc func = (CvExtractPlaneFunc)pxplcoi_tab.fn_2d[CV_MAT_DEPTH(type)]; 5226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !func ) 5246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_StsUnsupportedFormat, "" ); 5256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn IPPI_CALL( func( src->data.ptr, src_step, 5276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[nzidx]->data.ptr, dst_step, 5286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn size, cn, nzidx + 1 )); 5296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 5306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 5316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 5326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_StsBadArg, 5336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn "Either all output planes or only one output plane should be non zero" ); 5346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 5356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn __END__; 5376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 5386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void 5426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvMerge( const void* srcarr0, const void* srcarr1, const void* srcarr2, 5436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn const void* srcarr3, void* dstarr ) 5446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 5456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn static CvBigFuncTable plpx_tab; 5466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn static CvFuncTable plpxcoi_tab; 5476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn static int inittab = 0; 5486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_FUNCNAME( "cvMerge" ); 5506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn __BEGIN__; 5526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int src_step = 0, dst_step; 5546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvMat stub[5], *src[4], *dst = (CvMat*)dstarr; 5556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSize size; 5566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn const void* srcptr[4] = { 0, 0, 0, 0 }; 5576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int type, cn, coi = 0; 5586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int i, nzplanes = 0, nzidx = -1; 5596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int cont_flag; 5606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !inittab ) 5626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 5636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvInitCvtPlaneToPixRTable( &plpx_tab ); 5646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvInitCvtPlaneToPixRCoiTable( &plpxcoi_tab ); 5656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn inittab = 1; 5666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 5676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn src[0] = (CvMat*)srcarr0; 5696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn src[1] = (CvMat*)srcarr1; 5706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn src[2] = (CvMat*)srcarr2; 5716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn src[3] = (CvMat*)srcarr3; 5726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( dst = cvGetMat( dst, stub + 4, &coi )); 5746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn type = CV_MAT_TYPE( dst->type ); 5766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cn = CV_MAT_CN( type ); 5776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cont_flag = dst->type; 5796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( cn == 1 ) 5816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_BadNumChannels, "" ); 5826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i < 4; i++ ) 5846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 5856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( src[i] ) 5866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 5876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn nzplanes++; 5886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn nzidx = i; 5896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( src[i] = cvGetMat( src[i], stub + i )); 5906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( CV_MAT_CN( src[i]->type ) != 1 ) 5916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_BadNumChannels, "" ); 5926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !CV_ARE_DEPTHS_EQ( src[i], dst )) 5936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_StsUnmatchedFormats, "" ); 5946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !CV_ARE_SIZES_EQ( src[i], dst )) 5956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_StsUnmatchedSizes, "" ); 5966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( nzplanes > i && i > 0 && src[i]->step != src[i-1]->step ) 5976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_BadStep, "" ); 5986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn src_step = src[i]->step; 5996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn srcptr[nzplanes-1] = (const void*)(src[i]->data.ptr); 6006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 6016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cont_flag &= src[i]->type; 6026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 6036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 6046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 6056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn size = cvGetMatSize( dst ); 6066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst_step = dst->step; 6076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 6086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( CV_IS_MAT_CONT( cont_flag )) 6096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 6106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn size.width *= size.height; 6116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn src_step = dst_step = CV_STUB_STEP; 6126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn size.height = 1; 6136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 6146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 6156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( nzplanes == cn ) 6166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 6176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvMergeFunc func = (CvMergeFunc)plpx_tab.fn_2d[type]; 6186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 6196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !func ) 6206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_StsUnsupportedFormat, "" ); 6216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 6226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn IPPI_CALL( func( srcptr, src_step, dst->data.ptr, dst_step, size )); 6236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 6246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else if( nzplanes == 1 ) 6256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 6266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvInsertPlaneFunc func = (CvInsertPlaneFunc)plpxcoi_tab.fn_2d[CV_MAT_DEPTH(type)]; 6276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 6286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !func ) 6296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_StsUnsupportedFormat, "" ); 6306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 6316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn IPPI_CALL( func( src[nzidx]->data.ptr, src_step, 6326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst->data.ptr, dst_step, 6336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn size, cn, nzidx + 1 )); 6346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 6356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 6366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 6376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_StsBadArg, 6386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn "Either all input planes or only one input plane should be non zero" ); 6396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 6406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 6416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn __END__; 6426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 6436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 6446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 6456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\ 6466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn* Generalized split/merge: mixing channels * 6476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/ 6486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 6496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_MIX_CH_FUNC_2D( arrtype, flavor ) \ 6506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL \ 6516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvMixChannels_##flavor( const arrtype** src, int* sdelta0, \ 6526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int* sdelta1, arrtype** dst, \ 6536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int* ddelta0, int* ddelta1, \ 6546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int n, CvSize size ) \ 6556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ \ 6566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int i, k; \ 6576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int block_size0 = n == 1 ? size.width : 1024; \ 6586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 6596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( ; size.height--; ) \ 6606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 6616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int remaining = size.width; \ 6626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( ; remaining > 0; ) \ 6636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 6646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int block_size = MIN( remaining, block_size0 ); \ 6656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( k = 0; k < n; k++ ) \ 6666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 6676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn const arrtype* s = src[k]; \ 6686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn arrtype* d = dst[k]; \ 6696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int ds = sdelta1[k], dd = ddelta1[k]; \ 6706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( s ) \ 6716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 6726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i <= block_size - 2; i += 2, \ 6736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn s += ds*2, d += dd*2 ) \ 6746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 6756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn arrtype t0 = s[0], t1 = s[ds]; \ 6766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn d[0] = t0; d[dd] = t1; \ 6776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 6786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( i < block_size ) \ 6796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn d[0] = s[0], s += ds, d += dd; \ 6806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn src[k] = s; \ 6816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 6826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else \ 6836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 6846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i=0; i <= block_size-2; i+=2, d+=dd*2 )\ 6856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn d[0] = d[dd] = 0; \ 6866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( i < block_size ) \ 6876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn d[0] = 0, d += dd; \ 6886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 6896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[k] = d; \ 6906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 6916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn remaining -= block_size; \ 6926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 6936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( k = 0; k < n; k++ ) \ 6946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn src[k] += sdelta0[k], dst[k] += ddelta0[k]; \ 6956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 6966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 6976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return CV_OK; \ 6986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 6996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 7006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 7016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_MIX_CH_FUNC_2D( uchar, 8u ) 7026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_MIX_CH_FUNC_2D( ushort, 16u ) 7036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_MIX_CH_FUNC_2D( int, 32s ) 7046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_MIX_CH_FUNC_2D( int64, 64s ) 7056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 7066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic void 7076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvInitMixChannelsTab( CvFuncTable* tab ) 7086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 7096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn tab->fn_2d[CV_8U] = (void*)icvMixChannels_8u; 7106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn tab->fn_2d[CV_8S] = (void*)icvMixChannels_8u; 7116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn tab->fn_2d[CV_16U] = (void*)icvMixChannels_16u; 7126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn tab->fn_2d[CV_16S] = (void*)icvMixChannels_16u; 7136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn tab->fn_2d[CV_32S] = (void*)icvMixChannels_32s; 7146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn tab->fn_2d[CV_32F] = (void*)icvMixChannels_32s; 7156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn tab->fn_2d[CV_64F] = (void*)icvMixChannels_64s; 7166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 7176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 7186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL * CvMixChannelsFunc)( const void** src, int* sdelta0, 7196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int* sdelta1, void** dst, int* ddelta0, int* ddelta1, int n, CvSize size ); 7206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 7216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void 7226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvMixChannels( const CvArr** src, int src_count, 7236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvArr** dst, int dst_count, 7246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn const int* from_to, int pair_count ) 7256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 7266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn static CvFuncTable mixcn_tab; 7276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn static int inittab = 0; 7286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn uchar* buffer = 0; 7296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int heap_alloc = 0; 7306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 7316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_FUNCNAME( "cvMixChannels" ); 7326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 7336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn __BEGIN__; 7346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 7356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSize size = {0,0}; 7366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int depth = -1, elem_size = 1; 7376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int *sdelta0 = 0, *sdelta1 = 0, *ddelta0 = 0, *ddelta1 = 0; 7386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn uchar **sptr = 0, **dptr = 0; 7396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn uchar **src0 = 0, **dst0 = 0; 7406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int* src_cn = 0, *dst_cn = 0; 7416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int* src_step = 0, *dst_step = 0; 7426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int buf_size, i, k; 7436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int cont_flag = CV_MAT_CONT_FLAG; 7446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvMixChannelsFunc func; 7456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 7466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !inittab ) 7476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 7486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvInitMixChannelsTab( &mixcn_tab ); 7496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn inittab = 1; 7506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 7516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 7526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn src_count = MAX( src_count, 0 ); 7536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 7546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !src && src_count > 0 ) 7556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_StsNullPtr, "The input array of arrays is NULL" ); 7566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 7576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !dst ) 7586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_StsNullPtr, "The output array of arrays is NULL" ); 7596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 7606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( dst_count <= 0 || pair_count <= 0 ) 7616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_StsOutOfRange, 7626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn "The number of output arrays and the number of copied channels must be positive" ); 7636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 7646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !from_to ) 7656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_StsNullPtr, "The array of copied channel indices is NULL" ); 7666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 7676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn buf_size = (src_count + dst_count + 2)* 7686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn (sizeof(src0[0]) + sizeof(src_cn[0]) + sizeof(src_step[0])) + 7696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn pair_count*2*(sizeof(sptr[0]) + sizeof(sdelta0[0]) + sizeof(sdelta1[0])); 7706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 7716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( buf_size > CV_MAX_LOCAL_SIZE ) 7726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 7736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( buffer = (uchar*)cvAlloc( buf_size ) ); 7746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn heap_alloc = 1; 7756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 7766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 7776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn buffer = (uchar*)cvStackAlloc( buf_size ); 7786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 7796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn src0 = (uchar**)buffer; 7806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst0 = src0 + src_count; 7816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn src_cn = (int*)(dst0 + dst_count); 7826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst_cn = src_cn + src_count + 1; 7836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn src_step = dst_cn + dst_count + 1; 7846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst_step = src_step + src_count; 7856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 7866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn sptr = (uchar**)cvAlignPtr( dst_step + dst_count, (int)sizeof(void*) ); 7876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dptr = sptr + pair_count; 7886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn sdelta0 = (int*)(dptr + pair_count); 7896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn sdelta1 = sdelta0 + pair_count; 7906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ddelta0 = sdelta1 + pair_count; 7916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ddelta1 = ddelta0 + pair_count; 7926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 7936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn src_cn[0] = dst_cn[0] = 0; 7946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 7956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( k = 0; k < 2; k++ ) 7966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 7976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i < (k == 0 ? src_count : dst_count); i++ ) 7986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 7996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvMat stub, *mat = (CvMat*)(k == 0 ? src[i] : dst[i]); 8006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int cn; 8016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 8026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !CV_IS_MAT(mat) ) 8036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( mat = cvGetMat( mat, &stub )); 8046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 8056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( depth < 0 ) 8066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 8076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn depth = CV_MAT_DEPTH(mat->type); 8086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn elem_size = CV_ELEM_SIZE1(depth); 8096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn size = cvGetMatSize(mat); 8106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 8116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 8126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( CV_MAT_DEPTH(mat->type) != depth ) 8136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_StsUnmatchedFormats, "All the arrays must have the same bit depth" ); 8146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 8156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( mat->cols != size.width || mat->rows != size.height ) 8166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_StsUnmatchedSizes, "All the arrays must have the same size" ); 8176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 8186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( k == 0 ) 8196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 8206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn src0[i] = mat->data.ptr; 8216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cn = CV_MAT_CN(mat->type); 8226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn src_cn[i+1] = src_cn[i] + cn; 8236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn src_step[i] = mat->step / elem_size - size.width * cn; 8246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 8256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 8266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 8276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst0[i] = mat->data.ptr; 8286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cn = CV_MAT_CN(mat->type); 8296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst_cn[i+1] = dst_cn[i] + cn; 8306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst_step[i] = mat->step / elem_size - size.width * cn; 8316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 8326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 8336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cont_flag &= mat->type; 8346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 8356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 8366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 8376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( cont_flag ) 8386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 8396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn size.width *= size.height; 8406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn size.height = 1; 8416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 8426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 8436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i < pair_count; i++ ) 8446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 8456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( k = 0; k < 2; k++ ) 8466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 8476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int cn = from_to[i*2 + k]; 8486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn const int* cn_arr = k == 0 ? src_cn : dst_cn; 8496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int a = 0, b = k == 0 ? src_count-1 : dst_count-1; 8506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 8516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( cn < 0 || cn >= cn_arr[b+1] ) 8526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 8536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( k == 0 && cn < 0 ) 8546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 8556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn sptr[i] = 0; 8566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn sdelta0[i] = sdelta1[i] = 0; 8576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn continue; 8586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 8596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 8606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 8616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn char err_str[100]; 8626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn sprintf( err_str, "channel index #%d in the array of pairs is negative " 8636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn "or exceeds the total number of channels in all the %s arrays", i*2+k, 8646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn k == 0 ? "input" : "output" ); 8656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_StsOutOfRange, err_str ); 8666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 8676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 8686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 8696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( ; cn >= cn_arr[a+1]; a++ ) 8706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ; 8716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 8726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( k == 0 ) 8736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 8746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn sptr[i] = src0[a] + (cn - cn_arr[a])*elem_size; 8756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn sdelta1[i] = cn_arr[a+1] - cn_arr[a]; 8766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn sdelta0[i] = src_step[a]; 8776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 8786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 8796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 8806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dptr[i] = dst0[a] + (cn - cn_arr[a])*elem_size; 8816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ddelta1[i] = cn_arr[a+1] - cn_arr[a]; 8826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ddelta0[i] = dst_step[a]; 8836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 8846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 8856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 8866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 8876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn func = (CvMixChannelsFunc)mixcn_tab.fn_2d[depth]; 8886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !func ) 8896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_StsUnsupportedFormat, "The data type is not supported by the function" ); 8906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 8916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn IPPI_CALL( func( (const void**)sptr, sdelta0, sdelta1, (void**)dptr, 8926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ddelta0, ddelta1, pair_count, size )); 8936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 8946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn __END__; 8956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 8966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( buffer && heap_alloc ) 8976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvFree( &buffer ); 8986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 8996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 9006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 9016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\ 9026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn* cvConvertScaleAbs * 9036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/ 9046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 9056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_CVT_SCALE_ABS_CASE( srctype, worktype, \ 9066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn scale_macro, abs_macro, cast_macro, a, b ) \ 9076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 9086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ \ 9096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn const srctype* _src = (const srctype*)src; \ 9106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn srcstep /= sizeof(_src[0]); /*dststep /= sizeof(_dst[0]);*/ \ 9116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 9126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( ; size.height--; _src += srcstep, dst += dststep ) \ 9136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 9146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int i; \ 9156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 9166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i <= size.width - 4; i += 4 ) \ 9176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 9186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn worktype t0 = scale_macro((a)*_src[i] + (b)); \ 9196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn worktype t1 = scale_macro((a)*_src[i+1] + (b)); \ 9206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 9216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn t0 = (worktype)abs_macro(t0); \ 9226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn t1 = (worktype)abs_macro(t1); \ 9236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 9246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[i] = cast_macro(t0); \ 9256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[i+1] = cast_macro(t1); \ 9266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 9276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn t0 = scale_macro((a)*_src[i+2] + (b)); \ 9286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn t1 = scale_macro((a)*_src[i+3] + (b)); \ 9296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 9306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn t0 = (worktype)abs_macro(t0); \ 9316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn t1 = (worktype)abs_macro(t1); \ 9326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 9336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[i+2] = cast_macro(t0); \ 9346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[i+3] = cast_macro(t1); \ 9356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 9366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 9376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( ; i < size.width; i++ ) \ 9386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 9396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn worktype t0 = scale_macro((a)*_src[i] + (b)); \ 9406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn t0 = (worktype)abs_macro(t0); \ 9416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[i] = cast_macro(t0); \ 9426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 9436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 9446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 9456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 9466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 9476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_FIX_SHIFT 15 9486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_SCALE(x) (((x) + (1 << (ICV_FIX_SHIFT-1))) >> ICV_FIX_SHIFT) 9496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 9506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL 9516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvCvtScaleAbsTo_8u_C1R( const uchar* src, int srcstep, 9526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn uchar* dst, int dststep, 9536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSize size, double scale, double shift, 9546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int param ) 9556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 9566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int srctype = param; 9576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int srcdepth = CV_MAT_DEPTH(srctype); 9586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 9596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn size.width *= CV_MAT_CN(srctype); 9606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 9616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn switch( srcdepth ) 9626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 9636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn case CV_8S: 9646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn case CV_8U: 9656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 9666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn uchar lut[256]; 9676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int i; 9686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double val = shift; 9696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 9706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i < 128; i++, val += scale ) 9716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 9726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int t = cvRound(fabs(val)); 9736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn lut[i] = CV_CAST_8U(t); 9746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 9756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 9766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( srcdepth == CV_8S ) 9776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn val = -val; 9786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 9796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( ; i < 256; i++, val += scale ) 9806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 9816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int t = cvRound(fabs(val)); 9826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn lut[i] = CV_CAST_8U(t); 9836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 9846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 9856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvLUT_Transform8u_8u_C1R( src, srcstep, dst, 9866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dststep, size, lut ); 9876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 9886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn break; 9896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn case CV_16U: 9906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( fabs( scale ) <= 1. && fabs(shift) < DBL_EPSILON ) 9916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 9926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int iscale = cvRound(scale*(1 << ICV_FIX_SHIFT)); 9936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 9946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( iscale == ICV_FIX_SHIFT ) 9956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 9966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ICV_DEF_CVT_SCALE_ABS_CASE( ushort, int, CV_NOP, CV_IABS, 9976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CAST_8U, 1, 0 ); 9986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 9996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 10006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 10016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ICV_DEF_CVT_SCALE_ABS_CASE( ushort, int, ICV_SCALE, CV_IABS, 10026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CAST_8U, iscale, 0 ); 10036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 10046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 10056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 10066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 10076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ICV_DEF_CVT_SCALE_ABS_CASE( ushort, int, cvRound, CV_IABS, 10086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CAST_8U, scale, shift ); 10096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 10106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn break; 10116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn case CV_16S: 10126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( fabs( scale ) <= 1. && 10136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn fabs( shift ) <= (INT_MAX*0.5)/(1 << ICV_FIX_SHIFT)) 10146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 10156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int iscale = cvRound(scale*(1 << ICV_FIX_SHIFT)); 10166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int ishift = cvRound(shift*(1 << ICV_FIX_SHIFT)); 10176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 10186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( iscale == ICV_FIX_SHIFT && ishift == 0 ) 10196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 10206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ICV_DEF_CVT_SCALE_ABS_CASE( short, int, CV_NOP, CV_IABS, 10216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CAST_8U, 1, 0 ); 10226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 10236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 10246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 10256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ICV_DEF_CVT_SCALE_ABS_CASE( short, int, ICV_SCALE, CV_IABS, 10266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CAST_8U, iscale, ishift ); 10276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 10286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 10296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 10306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 10316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ICV_DEF_CVT_SCALE_ABS_CASE( short, int, cvRound, CV_IABS, 10326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CAST_8U, scale, shift ); 10336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 10346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn break; 10356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn case CV_32S: 10366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ICV_DEF_CVT_SCALE_ABS_CASE( int, int, cvRound, CV_IABS, 10376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CAST_8U, scale, shift ); 10386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn break; 10396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn case CV_32F: 10406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ICV_DEF_CVT_SCALE_ABS_CASE( float, int, cvRound, CV_IABS, 10416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CAST_8U, scale, shift ); 10426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn break; 10436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn case CV_64F: 10446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ICV_DEF_CVT_SCALE_ABS_CASE( double, int, cvRound, CV_IABS, 10456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CAST_8U, scale, shift ); 10466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn break; 10476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn default: 10486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn assert(0); 10496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return CV_BADFLAG_ERR; 10506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 10516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 10526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return CV_OK; 10536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 10546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 10556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 10566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void 10576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvConvertScaleAbs( const void* srcarr, void* dstarr, 10586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double scale, double shift ) 10596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 10606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_FUNCNAME( "cvConvertScaleAbs" ); 10616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 10626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn __BEGIN__; 10636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 10646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int coi1 = 0, coi2 = 0; 10656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvMat srcstub, *src = (CvMat*)srcarr; 10666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvMat dststub, *dst = (CvMat*)dstarr; 10676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSize size; 10686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int src_step, dst_step; 10696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 10706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( src = cvGetMat( src, &srcstub, &coi1 )); 10716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( dst = cvGetMat( dst, &dststub, &coi2 )); 10726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 10736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( coi1 != 0 || coi2 != 0 ) 10746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_BadCOI, "" ); 10756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 10766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !CV_ARE_SIZES_EQ( src, dst )) 10776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_StsUnmatchedSizes, "" ); 10786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 10796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !CV_ARE_CNS_EQ( src, dst )) 10806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_StsUnmatchedFormats, "" ); 10816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 10826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( CV_MAT_DEPTH( dst->type ) != CV_8U ) 10836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_StsUnsupportedFormat, "" ); 10846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 10856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn size = cvGetMatSize( src ); 10866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn src_step = src->step; 10876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst_step = dst->step; 10886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 10896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( CV_IS_MAT_CONT( src->type & dst->type )) 10906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 10916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn size.width *= size.height; 10926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn src_step = dst_step = CV_STUB_STEP; 10936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn size.height = 1; 10946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 10956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 10966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn IPPI_CALL( icvCvtScaleAbsTo_8u_C1R( src->data.ptr, src_step, 10976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn (uchar*)(dst->data.ptr), dst_step, 10986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn size, scale, shift, CV_MAT_TYPE(src->type))); 10996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn __END__; 11006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 11016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 11026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\ 11036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn* cvConvertScale * 11046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/ 11056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 11066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_CVT_SCALE_CASE( srctype, worktype, \ 11076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn scale_macro, cast_macro, a, b ) \ 11086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 11096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ \ 11106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn const srctype* _src = (const srctype*)src; \ 11116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn srcstep /= sizeof(_src[0]); \ 11126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 11136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( ; size.height--; _src += srcstep, dst += dststep ) \ 11146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 11156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i <= size.width - 4; i += 4 ) \ 11166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 11176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn worktype t0 = scale_macro((a)*_src[i]+(b)); \ 11186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn worktype t1 = scale_macro((a)*_src[i+1]+(b)); \ 11196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 11206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[i] = cast_macro(t0); \ 11216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[i+1] = cast_macro(t1); \ 11226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 11236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn t0 = scale_macro((a)*_src[i+2] + (b)); \ 11246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn t1 = scale_macro((a)*_src[i+3] + (b)); \ 11256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 11266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[i+2] = cast_macro(t0); \ 11276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[i+3] = cast_macro(t1); \ 11286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 11296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 11306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( ; i < size.width; i++ ) \ 11316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 11326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn worktype t0 = scale_macro((a)*_src[i] + (b)); \ 11336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[i] = cast_macro(t0); \ 11346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 11356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 11366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 11376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 11386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 11396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_CVT_SCALE_FUNC_INT( flavor, dsttype, cast_macro ) \ 11406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL \ 11416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvCvtScaleTo_##flavor##_C1R( const uchar* src, int srcstep, \ 11426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dsttype* dst, int dststep, CvSize size, \ 11436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double scale, double shift, int param ) \ 11446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ \ 11456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int i, srctype = param; \ 11466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dsttype lut[256]; \ 11476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dststep /= sizeof(dst[0]); \ 11486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 11496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn switch( CV_MAT_DEPTH(srctype) ) \ 11506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 11516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn case CV_8U: \ 11526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( size.width*size.height >= 256 ) \ 11536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 11546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double val = shift; \ 11556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i < 256; i++, val += scale ) \ 11566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 11576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int t = cvRound(val); \ 11586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn lut[i] = cast_macro(t); \ 11596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 11606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 11616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvLUT_Transform8u_##flavor##_C1R( src, srcstep, dst, \ 11626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dststep*sizeof(dst[0]), size, lut ); \ 11636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 11646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else if( fabs( scale ) <= 128. && \ 11656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn fabs( shift ) <= (INT_MAX*0.5)/(1 << ICV_FIX_SHIFT)) \ 11666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 11676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int iscale = cvRound(scale*(1 << ICV_FIX_SHIFT)); \ 11686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int ishift = cvRound(shift*(1 << ICV_FIX_SHIFT)); \ 11696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 11706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ICV_DEF_CVT_SCALE_CASE( uchar, int, ICV_SCALE, \ 11716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cast_macro, iscale, ishift ); \ 11726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 11736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else \ 11746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 11756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ICV_DEF_CVT_SCALE_CASE( uchar, int, cvRound, \ 11766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cast_macro, scale, shift ); \ 11776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 11786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn break; \ 11796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn case CV_8S: \ 11806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( size.width*size.height >= 256 ) \ 11816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 11826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i < 256; i++ ) \ 11836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 11846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int t = cvRound( (schar)i*scale + shift ); \ 11856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn lut[i] = cast_macro(t); \ 11866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 11876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 11886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvLUT_Transform8u_##flavor##_C1R( src, srcstep, dst, \ 11896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dststep*sizeof(dst[0]), size, lut ); \ 11906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 11916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else if( fabs( scale ) <= 128. && \ 11926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn fabs( shift ) <= (INT_MAX*0.5)/(1 << ICV_FIX_SHIFT)) \ 11936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 11946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int iscale = cvRound(scale*(1 << ICV_FIX_SHIFT)); \ 11956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int ishift = cvRound(shift*(1 << ICV_FIX_SHIFT)); \ 11966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 11976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ICV_DEF_CVT_SCALE_CASE( schar, int, ICV_SCALE, \ 11986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cast_macro, iscale, ishift ); \ 11996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 12006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else \ 12016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 12026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ICV_DEF_CVT_SCALE_CASE( schar, int, cvRound, \ 12036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cast_macro, scale, shift ); \ 12046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 12056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn break; \ 12066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn case CV_16U: \ 12076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( fabs( scale ) <= 1. && fabs(shift) < DBL_EPSILON ) \ 12086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 12096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int iscale = cvRound(scale*(1 << ICV_FIX_SHIFT)); \ 12106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 12116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ICV_DEF_CVT_SCALE_CASE( ushort, int, ICV_SCALE, \ 12126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cast_macro, iscale, 0 ); \ 12136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 12146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else \ 12156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 12166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ICV_DEF_CVT_SCALE_CASE( ushort, int, cvRound, \ 12176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cast_macro, scale, shift ); \ 12186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 12196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn break; \ 12206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn case CV_16S: \ 12216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( fabs( scale ) <= 1. && \ 12226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn fabs( shift ) <= (INT_MAX*0.5)/(1 << ICV_FIX_SHIFT)) \ 12236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 12246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int iscale = cvRound(scale*(1 << ICV_FIX_SHIFT)); \ 12256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int ishift = cvRound(shift*(1 << ICV_FIX_SHIFT)); \ 12266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 12276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ICV_DEF_CVT_SCALE_CASE( short, int, ICV_SCALE, \ 12286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cast_macro, iscale, ishift ); \ 12296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 12306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else \ 12316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 12326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ICV_DEF_CVT_SCALE_CASE( short, int, cvRound, \ 12336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cast_macro, scale, shift ); \ 12346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 12356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn break; \ 12366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn case CV_32S: \ 12376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ICV_DEF_CVT_SCALE_CASE( int, int, cvRound, \ 12386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cast_macro, scale, shift ); \ 12396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn break; \ 12406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn case CV_32F: \ 12416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ICV_DEF_CVT_SCALE_CASE( float, int, cvRound, \ 12426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cast_macro, scale, shift ); \ 12436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn break; \ 12446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn case CV_64F: \ 12456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ICV_DEF_CVT_SCALE_CASE( double, int, cvRound, \ 12466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cast_macro, scale, shift ); \ 12476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn break; \ 12486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn default: \ 12496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn assert(0); \ 12506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return CV_BADFLAG_ERR; \ 12516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 12526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 12536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return CV_OK; \ 12546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 12556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 12566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 12576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_CVT_SCALE_FUNC_FLT( flavor, dsttype, cast_macro ) \ 12586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL \ 12596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvCvtScaleTo_##flavor##_C1R( const uchar* src, int srcstep, \ 12606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dsttype* dst, int dststep, CvSize size, \ 12616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double scale, double shift, int param ) \ 12626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ \ 12636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int i, srctype = param; \ 12646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dsttype lut[256]; \ 12656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dststep /= sizeof(dst[0]); \ 12666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 12676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn switch( CV_MAT_DEPTH(srctype) ) \ 12686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 12696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn case CV_8U: \ 12706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( size.width*size.height >= 256 ) \ 12716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 12726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double val = shift; \ 12736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i < 256; i++, val += scale ) \ 12746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn lut[i] = (dsttype)val; \ 12756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 12766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvLUT_Transform8u_##flavor##_C1R( src, srcstep, dst, \ 12776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dststep*sizeof(dst[0]), size, lut ); \ 12786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 12796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else \ 12806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 12816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ICV_DEF_CVT_SCALE_CASE( uchar, double, CV_NOP, \ 12826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cast_macro, scale, shift ); \ 12836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 12846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn break; \ 12856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn case CV_8S: \ 12866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( size.width*size.height >= 256 ) \ 12876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 12886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i < 256; i++ ) \ 12896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn lut[i] = (dsttype)((schar)i*scale + shift); \ 12906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 12916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvLUT_Transform8u_##flavor##_C1R( src, srcstep, dst, \ 12926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dststep*sizeof(dst[0]), size, lut ); \ 12936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 12946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else \ 12956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 12966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ICV_DEF_CVT_SCALE_CASE( schar, double, CV_NOP, \ 12976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cast_macro, scale, shift ); \ 12986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 12996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn break; \ 13006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn case CV_16U: \ 13016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ICV_DEF_CVT_SCALE_CASE( ushort, double, CV_NOP, \ 13026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cast_macro, scale, shift ); \ 13036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn break; \ 13046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn case CV_16S: \ 13056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ICV_DEF_CVT_SCALE_CASE( short, double, CV_NOP, \ 13066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cast_macro, scale, shift ); \ 13076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn break; \ 13086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn case CV_32S: \ 13096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ICV_DEF_CVT_SCALE_CASE( int, double, CV_NOP, \ 13106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cast_macro, scale, shift ); \ 13116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn break; \ 13126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn case CV_32F: \ 13136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ICV_DEF_CVT_SCALE_CASE( float, double, CV_NOP, \ 13146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cast_macro, scale, shift ); \ 13156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn break; \ 13166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn case CV_64F: \ 13176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ICV_DEF_CVT_SCALE_CASE( double, double, CV_NOP, \ 13186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cast_macro, scale, shift ); \ 13196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn break; \ 13206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn default: \ 13216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn assert(0); \ 13226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return CV_BADFLAG_ERR; \ 13236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 13246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 13256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return CV_OK; \ 13266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 13276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 13286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 13296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_CVT_SCALE_FUNC_INT( 8u, uchar, CV_CAST_8U ) 13306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_CVT_SCALE_FUNC_INT( 8s, schar, CV_CAST_8S ) 13316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_CVT_SCALE_FUNC_INT( 16s, short, CV_CAST_16S ) 13326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_CVT_SCALE_FUNC_INT( 16u, ushort, CV_CAST_16U ) 13336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_CVT_SCALE_FUNC_INT( 32s, int, CV_CAST_32S ) 13346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 13356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_CVT_SCALE_FUNC_FLT( 32f, float, CV_CAST_32F ) 13366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_CVT_SCALE_FUNC_FLT( 64f, double, CV_CAST_64F ) 13376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 13386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_DEF_INIT_FUNC_TAB_2D( CvtScaleTo, C1R ) 13396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 13406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 13416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\ 13426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn* Conversion w/o scaling macros * 13436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/ 13446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 13456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_CVT_CASE_2D( srctype, worktype, \ 13466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cast_macro1, cast_macro2 ) \ 13476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ \ 13486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn const srctype* _src = (const srctype*)src; \ 13496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn srcstep /= sizeof(_src[0]); \ 13506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 13516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( ; size.height--; _src += srcstep, dst += dststep ) \ 13526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 13536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int i; \ 13546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 13556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i <= size.width - 4; i += 4 ) \ 13566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 13576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn worktype t0 = cast_macro1(_src[i]); \ 13586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn worktype t1 = cast_macro1(_src[i+1]); \ 13596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 13606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[i] = cast_macro2(t0); \ 13616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[i+1] = cast_macro2(t1); \ 13626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 13636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn t0 = cast_macro1(_src[i+2]); \ 13646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn t1 = cast_macro1(_src[i+3]); \ 13656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 13666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[i+2] = cast_macro2(t0); \ 13676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[i+3] = cast_macro2(t1); \ 13686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 13696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 13706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( ; i < size.width; i++ ) \ 13716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 13726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn worktype t0 = cast_macro1(_src[i]); \ 13736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[i] = cast_macro2(t0); \ 13746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 13756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 13766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 13776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 13786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 13796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_CVT_FUNC_2D( flavor, dsttype, worktype, cast_macro2, \ 13806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn srcdepth1, srctype1, cast_macro11, \ 13816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn srcdepth2, srctype2, cast_macro12, \ 13826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn srcdepth3, srctype3, cast_macro13, \ 13836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn srcdepth4, srctype4, cast_macro14, \ 13846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn srcdepth5, srctype5, cast_macro15, \ 13856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn srcdepth6, srctype6, cast_macro16 ) \ 13866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL \ 13876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvCvtTo_##flavor##_C1R( const uchar* src, int srcstep, \ 13886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dsttype* dst, int dststep, \ 13896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSize size, int param ) \ 13906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ \ 13916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int srctype = param; \ 13926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dststep /= sizeof(dst[0]); \ 13936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 13946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn switch( CV_MAT_DEPTH(srctype) ) \ 13956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { \ 13966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn case srcdepth1: \ 13976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ICV_DEF_CVT_CASE_2D( srctype1, worktype, \ 13986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cast_macro11, cast_macro2 ); \ 13996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn break; \ 14006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn case srcdepth2: \ 14016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ICV_DEF_CVT_CASE_2D( srctype2, worktype, \ 14026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cast_macro12, cast_macro2 ); \ 14036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn break; \ 14046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn case srcdepth3: \ 14056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ICV_DEF_CVT_CASE_2D( srctype3, worktype, \ 14066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cast_macro13, cast_macro2 ); \ 14076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn break; \ 14086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn case srcdepth4: \ 14096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ICV_DEF_CVT_CASE_2D( srctype4, worktype, \ 14106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cast_macro14, cast_macro2 ); \ 14116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn break; \ 14126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn case srcdepth5: \ 14136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ICV_DEF_CVT_CASE_2D( srctype5, worktype, \ 14146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cast_macro15, cast_macro2 ); \ 14156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn break; \ 14166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn case srcdepth6: \ 14176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ICV_DEF_CVT_CASE_2D( srctype6, worktype, \ 14186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cast_macro16, cast_macro2 ); \ 14196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn break; \ 14206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } \ 14216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn \ 14226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return CV_OK; \ 14236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 14246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 14256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 14266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_CVT_FUNC_2D( 8u, uchar, int, CV_CAST_8U, 14276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_8S, schar, CV_NOP, 14286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_16U, ushort, CV_NOP, 14296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_16S, short, CV_NOP, 14306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_32S, int, CV_NOP, 14316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_32F, float, cvRound, 14326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_64F, double, cvRound ) 14336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 14346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_CVT_FUNC_2D( 8s, schar, int, CV_CAST_8S, 14356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_8U, uchar, CV_NOP, 14366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_16U, ushort, CV_NOP, 14376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_16S, short, CV_NOP, 14386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_32S, int, CV_NOP, 14396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_32F, float, cvRound, 14406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_64F, double, cvRound ) 14416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 14426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_CVT_FUNC_2D( 16u, ushort, int, CV_CAST_16U, 14436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_8U, uchar, CV_NOP, 14446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_8S, schar, CV_NOP, 14456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_16S, short, CV_NOP, 14466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_32S, int, CV_NOP, 14476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_32F, float, cvRound, 14486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_64F, double, cvRound ) 14496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 14506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_CVT_FUNC_2D( 16s, short, int, CV_CAST_16S, 14516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_8U, uchar, CV_NOP, 14526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_8S, schar, CV_NOP, 14536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_16U, ushort, CV_NOP, 14546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_32S, int, CV_NOP, 14556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_32F, float, cvRound, 14566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_64F, double, cvRound ) 14576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 14586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_CVT_FUNC_2D( 32s, int, int, CV_NOP, 14596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_8U, uchar, CV_NOP, 14606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_8S, schar, CV_NOP, 14616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_16U, ushort, CV_NOP, 14626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_16S, short, CV_NOP, 14636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_32F, float, cvRound, 14646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_64F, double, cvRound ) 14656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 14666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_CVT_FUNC_2D( 32f, float, float, CV_NOP, 14676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_8U, uchar, CV_8TO32F, 14686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_8S, schar, CV_8TO32F, 14696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_16U, ushort, CV_NOP, 14706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_16S, short, CV_NOP, 14716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_32S, int, CV_CAST_32F, 14726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_64F, double, CV_CAST_32F ) 14736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 14746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_CVT_FUNC_2D( 64f, double, double, CV_NOP, 14756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_8U, uchar, CV_8TO32F, 14766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_8S, schar, CV_8TO32F, 14776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_16U, ushort, CV_NOP, 14786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_16S, short, CV_NOP, 14796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_32S, int, CV_NOP, 14806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_32F, float, CV_NOP ) 14816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 14826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_DEF_INIT_FUNC_TAB_2D( CvtTo, C1R ) 14836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 14846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 14856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL *CvCvtFunc)( const void* src, int srcstep, 14866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void* dst, int dststep, CvSize size, 14876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int param ); 14886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 14896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL *CvCvtScaleFunc)( const void* src, int srcstep, 14906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void* dst, int dststep, CvSize size, 14916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double scale, double shift, 14926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int param ); 14936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 14946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void 14956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvConvertScale( const void* srcarr, void* dstarr, 14966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double scale, double shift ) 14976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 14986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn static CvFuncTable cvt_tab, cvtscale_tab; 14996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn static int inittab = 0; 15006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 15016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_FUNCNAME( "cvConvertScale" ); 15026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 15036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn __BEGIN__; 15046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 15056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int type; 15066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int is_nd = 0; 15076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvMat srcstub, *src = (CvMat*)srcarr; 15086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvMat dststub, *dst = (CvMat*)dstarr; 15096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSize size; 15106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int src_step, dst_step; 15116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int no_scale = scale == 1 && shift == 0; 15126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 15136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !CV_IS_MAT(src) ) 15146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 15156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( CV_IS_MATND(src) ) 15166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn is_nd = 1; 15176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 15186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 15196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int coi = 0; 15206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( src = cvGetMat( src, &srcstub, &coi )); 15216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 15226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( coi != 0 ) 15236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_BadCOI, "" ); 15246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 15256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 15266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 15276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !CV_IS_MAT(dst) ) 15286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 15296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( CV_IS_MATND(dst) ) 15306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn is_nd = 1; 15316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 15326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 15336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int coi = 0; 15346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( dst = cvGetMat( dst, &dststub, &coi )); 15356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 15366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( coi != 0 ) 15376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_BadCOI, "" ); 15386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 15396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 15406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 15416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( is_nd ) 15426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 15436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvArr* arrs[] = { src, dst }; 15446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvMatND stubs[2]; 15456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvNArrayIterator iterator; 15466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int dsttype; 15476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 15486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( cvInitNArrayIterator( 2, arrs, 0, stubs, &iterator, CV_NO_DEPTH_CHECK )); 15496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 15506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn type = iterator.hdr[0]->type; 15516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dsttype = iterator.hdr[1]->type; 15526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn iterator.size.width *= CV_MAT_CN(type); 15536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 15546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !inittab ) 15556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 15566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvInitCvtToC1RTable( &cvt_tab ); 15576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvInitCvtScaleToC1RTable( &cvtscale_tab ); 15586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn inittab = 1; 15596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 15606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 15616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( no_scale ) 15626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 15636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvCvtFunc func = (CvCvtFunc)(cvt_tab.fn_2d[CV_MAT_DEPTH(dsttype)]); 15646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !func ) 15656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_StsUnsupportedFormat, "" ); 15666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 15676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn do 15686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 15696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn IPPI_CALL( func( iterator.ptr[0], CV_STUB_STEP, 15706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn iterator.ptr[1], CV_STUB_STEP, 15716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn iterator.size, type )); 15726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 15736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn while( cvNextNArraySlice( &iterator )); 15746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 15756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 15766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 15776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvCvtScaleFunc func = 15786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn (CvCvtScaleFunc)(cvtscale_tab.fn_2d[CV_MAT_DEPTH(dsttype)]); 15796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !func ) 15806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_StsUnsupportedFormat, "" ); 15816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 15826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn do 15836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 15846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn IPPI_CALL( func( iterator.ptr[0], CV_STUB_STEP, 15856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn iterator.ptr[1], CV_STUB_STEP, 15866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn iterator.size, scale, shift, type )); 15876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 15886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn while( cvNextNArraySlice( &iterator )); 15896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 15906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn EXIT; 15916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 15926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 15936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( no_scale && CV_ARE_TYPES_EQ( src, dst ) ) 15946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 15956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( src != dst ) 15966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvCopy( src, dst ); 15976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn EXIT; 15986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 15996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 16006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !CV_ARE_SIZES_EQ( src, dst )) 16016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_StsUnmatchedSizes, "" ); 16026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 16036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn size = cvGetMatSize( src ); 16046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn type = CV_MAT_TYPE(src->type); 16056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn src_step = src->step; 16066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst_step = dst->step; 16076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 16086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( CV_IS_MAT_CONT( src->type & dst->type )) 16096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 16106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn size.width *= size.height; 16116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn src_step = dst_step = CV_STUB_STEP; 16126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn size.height = 1; 16136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 16146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 16156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn size.width *= CV_MAT_CN( type ); 16166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 16176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( CV_ARE_TYPES_EQ( src, dst ) && size.height == 1 && 16186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn size.width <= CV_MAX_INLINE_MAT_OP_SIZE ) 16196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 16206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( CV_MAT_DEPTH(type) == CV_32F ) 16216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 16226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn const float* srcdata = (const float*)(src->data.ptr); 16236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn float* dstdata = (float*)(dst->data.ptr); 16246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 16256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn do 16266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 16276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dstdata[size.width - 1] = (float)(srcdata[size.width-1]*scale + shift); 16286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 16296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn while( --size.width ); 16306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 16316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn EXIT; 16326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 16336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 16346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( CV_MAT_DEPTH(type) == CV_64F ) 16356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 16366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn const double* srcdata = (const double*)(src->data.ptr); 16376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double* dstdata = (double*)(dst->data.ptr); 16386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 16396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn do 16406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 16416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dstdata[size.width - 1] = srcdata[size.width-1]*scale + shift; 16426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 16436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn while( --size.width ); 16446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 16456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn EXIT; 16466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 16476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 16486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 16496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !inittab ) 16506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 16516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvInitCvtToC1RTable( &cvt_tab ); 16526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvInitCvtScaleToC1RTable( &cvtscale_tab ); 16536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn inittab = 1; 16546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 16556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 16566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !CV_ARE_CNS_EQ( src, dst )) 16576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_StsUnmatchedFormats, "" ); 16586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 16596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( no_scale ) 16606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 16616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvCvtFunc func = (CvCvtFunc)(cvt_tab.fn_2d[CV_MAT_DEPTH(dst->type)]); 16626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 16636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !func ) 16646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_StsUnsupportedFormat, "" ); 16656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 16666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn IPPI_CALL( func( src->data.ptr, src_step, 16676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst->data.ptr, dst_step, size, type )); 16686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 16696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 16706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 16716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvCvtScaleFunc func = (CvCvtScaleFunc) 16726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn (cvtscale_tab.fn_2d[CV_MAT_DEPTH(dst->type)]); 16736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 16746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !func ) 16756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_StsUnsupportedFormat, "" ); 16766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 16776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn IPPI_CALL( func( src->data.ptr, src_step, 16786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst->data.ptr, dst_step, size, 16796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn scale, shift, type )); 16806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 16816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 16826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn __END__; 16836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 16846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 16856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/********************* helper functions for converting 32f<->64f ************************/ 16866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 16876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIPCVAPI_IMPL( CvStatus, icvCvt_32f64f, 16886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ( const float* src, double* dst, int len ), (src, dst, len) ) 16896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 16906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int i; 16916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i <= len - 4; i += 4 ) 16926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 16936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double t0 = src[i]; 16946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double t1 = src[i+1]; 16956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 16966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[i] = t0; 16976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[i+1] = t1; 16986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 16996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn t0 = src[i+2]; 17006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn t1 = src[i+3]; 17016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 17026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[i+2] = t0; 17036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[i+3] = t1; 17046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 17056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 17066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( ; i < len; i++ ) 17076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[i] = src[i]; 17086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 17096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return CV_OK; 17106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 17116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 17126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 17136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIPCVAPI_IMPL( CvStatus, icvCvt_64f32f, 17146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ( const double* src, float* dst, int len ), (src, dst, len) ) 17156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 17166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int i = 0; 17176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( ; i <= len - 4; i += 4 ) 17186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 17196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double t0 = src[i]; 17206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double t1 = src[i+1]; 17216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 17226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[i] = (float)t0; 17236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[i+1] = (float)t1; 17246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 17256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn t0 = src[i+2]; 17266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn t1 = src[i+3]; 17276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 17286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[i+2] = (float)t0; 17296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[i+3] = (float)t1; 17306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 17316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 17326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( ; i < len; i++ ) 17336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[i] = (float)src[i]; 17346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 17356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return CV_OK; 17366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 17376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 17386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 17396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvStatus CV_STDCALL icvScale_32f( const float* src, float* dst, int len, float a, float b ) 17406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 17416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int i; 17426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i <= len - 4; i += 4 ) 17436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 17446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double t0 = src[i]*a + b; 17456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double t1 = src[i+1]*a + b; 17466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 17476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[i] = (float)t0; 17486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[i+1] = (float)t1; 17496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 17506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn t0 = src[i+2]*a + b; 17516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn t1 = src[i+3]*a + b; 17526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 17536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[i+2] = (float)t0; 17546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[i+3] = (float)t1; 17556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 17566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 17576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( ; i < len; i++ ) 17586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[i] = (float)(src[i]*a + b); 17596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 17606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return CV_OK; 17616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 17626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 17636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 17646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvStatus CV_STDCALL icvScale_64f( const double* src, double* dst, int len, double a, double b ) 17656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 17666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int i; 17676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i <= len - 4; i += 4 ) 17686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 17696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double t0 = src[i]*a + b; 17706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double t1 = src[i+1]*a + b; 17716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 17726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[i] = t0; 17736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[i+1] = t1; 17746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 17756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn t0 = src[i+2]*a + b; 17766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn t1 = src[i+3]*a + b; 17776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 17786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[i+2] = t0; 17796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[i+3] = t1; 17806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 17816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 17826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( ; i < len; i++ ) 17836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[i] = src[i]*a + b; 17846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 17856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return CV_OK; 17866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 17876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 17886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* End of file. */ 1789