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