Update to 2.0.0 tree from current Fremantle build
[opencv] / cxcore / src / cxconvert.cpp
diff --git a/cxcore/src/cxconvert.cpp b/cxcore/src/cxconvert.cpp
deleted file mode 100644 (file)
index 1c29f0e..0000000
+++ /dev/null
@@ -1,1788 +0,0 @@
-/*M///////////////////////////////////////////////////////////////////////////////////////
-//
-//  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
-//
-//  By downloading, copying, installing or using the software you agree to this license.
-//  If you do not agree to this license, do not download, install,
-//  copy or use the software.
-//
-//
-//                        Intel License Agreement
-//                For Open Source Computer Vision Library
-//
-// Copyright (C) 2000, Intel Corporation, all rights reserved.
-// Third party copyrights are property of their respective owners.
-//
-// Redistribution and use in source and binary forms, with or without modification,
-// are permitted provided that the following conditions are met:
-//
-//   * Redistribution's of source code must retain the above copyright notice,
-//     this list of conditions and the following disclaimer.
-//
-//   * Redistribution's in binary form must reproduce the above copyright notice,
-//     this list of conditions and the following disclaimer in the documentation
-//     and/or other materials provided with the distribution.
-//
-//   * The name of Intel Corporation may not be used to endorse or promote products
-//     derived from this software without specific prior written permission.
-//
-// This software is provided by the copyright holders and contributors "as is" and
-// any express or implied warranties, including, but not limited to, the implied
-// warranties of merchantability and fitness for a particular purpose are disclaimed.
-// In no event shall the Intel Corporation or contributors be liable for any direct,
-// indirect, incidental, special, exemplary, or consequential damages
-// (including, but not limited to, procurement of substitute goods or services;
-// loss of use, data, or profits; or business interruption) however caused
-// and on any theory of liability, whether in contract, strict liability,
-// or tort (including negligence or otherwise) arising in any way out of
-// the use of this software, even if advised of the possibility of such damage.
-//
-//M*/
-
-#include "_cxcore.h"
-
-/****************************************************************************************\
-*                            Splitting/extracting array channels                         *
-\****************************************************************************************/
-
-#define  ICV_DEF_PX2PL2PX_ENTRY_C2( arrtype_ptr, ptr )  \
-    arrtype_ptr plane0 = ptr[0];                        \
-    arrtype_ptr plane1 = ptr[1];
-
-#define  ICV_DEF_PX2PL2PX_ENTRY_C3( arrtype_ptr, ptr )  \
-    arrtype_ptr plane0 = ptr[0];                        \
-    arrtype_ptr plane1 = ptr[1];                        \
-    arrtype_ptr plane2 = ptr[2];
-
-#define  ICV_DEF_PX2PL2PX_ENTRY_C4( arrtype_ptr, ptr )  \
-    arrtype_ptr plane0 = ptr[0];                        \
-    arrtype_ptr plane1 = ptr[1];                        \
-    arrtype_ptr plane2 = ptr[2];                        \
-    arrtype_ptr plane3 = ptr[3];
-
-
-#define  ICV_DEF_PX2PL_C2( arrtype, len )           \
-{                                                   \
-    int j;                                          \
-                                                    \
-    for( j = 0; j < (len); j++, (src) += 2 )        \
-    {                                               \
-        arrtype t0 = (src)[0];                      \
-        arrtype t1 = (src)[1];                      \
-                                                    \
-        plane0[j] = t0;                             \
-        plane1[j] = t1;                             \
-    }                                               \
-    plane0 += dststep;                              \
-    plane1 += dststep;                              \
-}
-
-
-#define  ICV_DEF_PX2PL_C3( arrtype, len )           \
-{                                                   \
-    int j;                                          \
-                                                    \
-    for( j = 0; j < (len); j++, (src) += 3 )        \
-    {                                               \
-        arrtype t0 = (src)[0];                      \
-        arrtype t1 = (src)[1];                      \
-        arrtype t2 = (src)[2];                      \
-                                                    \
-        plane0[j] = t0;                             \
-        plane1[j] = t1;                             \
-        plane2[j] = t2;                             \
-    }                                               \
-    plane0 += dststep;                              \
-    plane1 += dststep;                              \
-    plane2 += dststep;                              \
-}
-
-
-#define  ICV_DEF_PX2PL_C4( arrtype, len )           \
-{                                                   \
-    int j;                                          \
-                                                    \
-    for( j = 0; j < (len); j++, (src) += 4 )        \
-    {                                               \
-        arrtype t0 = (src)[0];                      \
-        arrtype t1 = (src)[1];                      \
-                                                    \
-        plane0[j] = t0;                             \
-        plane1[j] = t1;                             \
-                                                    \
-        t0 = (src)[2];                              \
-        t1 = (src)[3];                              \
-                                                    \
-        plane2[j] = t0;                             \
-        plane3[j] = t1;                             \
-    }                                               \
-    plane0 += dststep;                              \
-    plane1 += dststep;                              \
-    plane2 += dststep;                              \
-    plane3 += dststep;                              \
-}
-
-
-#define  ICV_DEF_PX2PL_COI( arrtype, len, cn )      \
-{                                                   \
-    int j;                                          \
-                                                    \
-    for( j = 0; j <= (len) - 4; j += 4, (src) += 4*(cn))\
-    {                                               \
-        arrtype t0 = (src)[0];                      \
-        arrtype t1 = (src)[(cn)];                   \
-                                                    \
-        (dst)[j] = t0;                              \
-        (dst)[j+1] = t1;                            \
-                                                    \
-        t0 = (src)[(cn)*2];                         \
-        t1 = (src)[(cn)*3];                         \
-                                                    \
-        (dst)[j+2] = t0;                            \
-        (dst)[j+3] = t1;                            \
-    }                                               \
-                                                    \
-    for( ; j < (len); j++, (src) += (cn))           \
-    {                                               \
-        (dst)[j] = (src)[0];                        \
-    }                                               \
-}
-
-
-#define  ICV_DEF_COPY_PX2PL_FUNC_2D( arrtype, flavor,   \
-                                     cn, entry_macro )  \
-IPCVAPI_IMPL( CvStatus, icvCopy_##flavor##_C##cn##P##cn##R,\
-( const arrtype* src, int srcstep,                      \
-  arrtype** dst, int dststep, CvSize size ),            \
-  (src, srcstep, dst, dststep, size))                   \
-{                                                       \
-    entry_macro(arrtype*, dst);                         \
-    srcstep /= sizeof(src[0]);                          \
-    dststep /= sizeof(dst[0][0]);                       \
-                                                        \
-    for( ; size.height--; src += srcstep )              \
-    {                                                   \
-        ICV_DEF_PX2PL_C##cn( arrtype, size.width );     \
-        src -= size.width*(cn);                         \
-    }                                                   \
-                                                        \
-    return CV_OK;                                       \
-}
-
-
-#define  ICV_DEF_COPY_PX2PL_FUNC_2D_COI( arrtype, flavor )\
-IPCVAPI_IMPL( CvStatus, icvCopy_##flavor##_CnC1CR,      \
-( const arrtype* src, int srcstep, arrtype* dst, int dststep,\
-  CvSize size, int cn, int coi ),                       \
-  (src, srcstep, dst, dststep, size, cn, coi))          \
-{                                                       \
-    src += coi - 1;                                     \
-    srcstep /= sizeof(src[0]);                          \
-    dststep /= sizeof(dst[0]);                          \
-                                                        \
-    for( ; size.height--; src += srcstep, dst += dststep )\
-    {                                                   \
-        ICV_DEF_PX2PL_COI( arrtype, size.width, cn );   \
-        src -= size.width*(cn);                         \
-    }                                                   \
-                                                        \
-    return CV_OK;                                       \
-}
-
-
-ICV_DEF_COPY_PX2PL_FUNC_2D( uchar, 8u, 2, ICV_DEF_PX2PL2PX_ENTRY_C2 )
-ICV_DEF_COPY_PX2PL_FUNC_2D( uchar, 8u, 3, ICV_DEF_PX2PL2PX_ENTRY_C3 )
-ICV_DEF_COPY_PX2PL_FUNC_2D( uchar, 8u, 4, ICV_DEF_PX2PL2PX_ENTRY_C4 )
-ICV_DEF_COPY_PX2PL_FUNC_2D( ushort, 16s, 2, ICV_DEF_PX2PL2PX_ENTRY_C2 )
-ICV_DEF_COPY_PX2PL_FUNC_2D( ushort, 16s, 3, ICV_DEF_PX2PL2PX_ENTRY_C3 )
-ICV_DEF_COPY_PX2PL_FUNC_2D( ushort, 16s, 4, ICV_DEF_PX2PL2PX_ENTRY_C4 )
-ICV_DEF_COPY_PX2PL_FUNC_2D( int, 32f, 2, ICV_DEF_PX2PL2PX_ENTRY_C2 )
-ICV_DEF_COPY_PX2PL_FUNC_2D( int, 32f, 3, ICV_DEF_PX2PL2PX_ENTRY_C3 )
-ICV_DEF_COPY_PX2PL_FUNC_2D( int, 32f, 4, ICV_DEF_PX2PL2PX_ENTRY_C4 )
-ICV_DEF_COPY_PX2PL_FUNC_2D( int64, 64f, 2, ICV_DEF_PX2PL2PX_ENTRY_C2 )
-ICV_DEF_COPY_PX2PL_FUNC_2D( int64, 64f, 3, ICV_DEF_PX2PL2PX_ENTRY_C3 )
-ICV_DEF_COPY_PX2PL_FUNC_2D( int64, 64f, 4, ICV_DEF_PX2PL2PX_ENTRY_C4 )
-
-
-ICV_DEF_COPY_PX2PL_FUNC_2D_COI( uchar, 8u )
-ICV_DEF_COPY_PX2PL_FUNC_2D_COI( ushort, 16s )
-ICV_DEF_COPY_PX2PL_FUNC_2D_COI( int, 32f )
-ICV_DEF_COPY_PX2PL_FUNC_2D_COI( int64, 64f )
-
-
-/****************************************************************************************\
-*                            Merging/inserting array channels                            *
-\****************************************************************************************/
-
-
-#define  ICV_DEF_PL2PX_C2( arrtype, len )   \
-{                                           \
-    int j;                                  \
-                                            \
-    for( j = 0; j < (len); j++, (dst) += 2 )\
-    {                                       \
-        arrtype t0 = plane0[j];             \
-        arrtype t1 = plane1[j];             \
-                                            \
-        dst[0] = t0;                        \
-        dst[1] = t1;                        \
-    }                                       \
-    plane0 += srcstep;                      \
-    plane1 += srcstep;                      \
-}
-
-
-#define  ICV_DEF_PL2PX_C3( arrtype, len )   \
-{                                           \
-    int j;                                  \
-                                            \
-    for( j = 0; j < (len); j++, (dst) += 3 )\
-    {                                       \
-        arrtype t0 = plane0[j];             \
-        arrtype t1 = plane1[j];             \
-        arrtype t2 = plane2[j];             \
-                                            \
-        dst[0] = t0;                        \
-        dst[1] = t1;                        \
-        dst[2] = t2;                        \
-    }                                       \
-    plane0 += srcstep;                      \
-    plane1 += srcstep;                      \
-    plane2 += srcstep;                      \
-}
-
-
-#define  ICV_DEF_PL2PX_C4( arrtype, len )   \
-{                                           \
-    int j;                                  \
-                                            \
-    for( j = 0; j < (len); j++, (dst) += 4 )\
-    {                                       \
-        arrtype t0 = plane0[j];             \
-        arrtype t1 = plane1[j];             \
-                                            \
-        dst[0] = t0;                        \
-        dst[1] = t1;                        \
-                                            \
-        t0 = plane2[j];                     \
-        t1 = plane3[j];                     \
-                                            \
-        dst[2] = t0;                        \
-        dst[3] = t1;                        \
-    }                                       \
-    plane0 += srcstep;                      \
-    plane1 += srcstep;                      \
-    plane2 += srcstep;                      \
-    plane3 += srcstep;                      \
-}
-
-
-#define  ICV_DEF_PL2PX_COI( arrtype, len, cn )          \
-{                                                       \
-    int j;                                              \
-                                                        \
-    for( j = 0; j <= (len) - 4; j += 4, (dst) += 4*(cn))\
-    {                                                   \
-        arrtype t0 = (src)[j];                          \
-        arrtype t1 = (src)[j+1];                        \
-                                                        \
-        (dst)[0] = t0;                                  \
-        (dst)[(cn)] = t1;                               \
-                                                        \
-        t0 = (src)[j+2];                                \
-        t1 = (src)[j+3];                                \
-                                                        \
-        (dst)[(cn)*2] = t0;                             \
-        (dst)[(cn)*3] = t1;                             \
-    }                                                   \
-                                                        \
-    for( ; j < (len); j++, (dst) += (cn))               \
-    {                                                   \
-        (dst)[0] = (src)[j];                            \
-    }                                                   \
-}
-
-
-#define  ICV_DEF_COPY_PL2PX_FUNC_2D( arrtype, flavor, cn, entry_macro ) \
-IPCVAPI_IMPL( CvStatus, icvCopy_##flavor##_P##cn##C##cn##R, \
-( const arrtype** src, int srcstep,                         \
-  arrtype* dst, int dststep, CvSize size ),                 \
-  (src, srcstep, dst, dststep, size))                       \
-{                                                           \
-    entry_macro(const arrtype*, src);                       \
-    srcstep /= sizeof(src[0][0]);                           \
-    dststep /= sizeof(dst[0]);                              \
-                                                            \
-    for( ; size.height--; dst += dststep )                  \
-    {                                                       \
-        ICV_DEF_PL2PX_C##cn( arrtype, size.width );         \
-        dst -= size.width*(cn);                             \
-    }                                                       \
-                                                            \
-    return CV_OK;                                           \
-}
-
-
-#define  ICV_DEF_COPY_PL2PX_FUNC_2D_COI( arrtype, flavor )  \
-IPCVAPI_IMPL( CvStatus, icvCopy_##flavor##_C1CnCR,          \
-( const arrtype* src, int srcstep,                          \
-  arrtype* dst, int dststep,                                \
-  CvSize size, int cn, int coi ),                           \
-  (src, srcstep, dst, dststep, size, cn, coi))              \
-{                                                           \
-    dst += coi - 1;                                         \
-    srcstep /= sizeof(src[0]); dststep /= sizeof(dst[0]);   \
-                                                            \
-    for( ; size.height--; src += srcstep, dst += dststep )  \
-    {                                                       \
-        ICV_DEF_PL2PX_COI( arrtype, size.width, cn );       \
-        dst -= size.width*(cn);                             \
-    }                                                       \
-                                                            \
-    return CV_OK;                                           \
-}
-
-
-ICV_DEF_COPY_PL2PX_FUNC_2D( uchar, 8u, 2, ICV_DEF_PX2PL2PX_ENTRY_C2 )
-ICV_DEF_COPY_PL2PX_FUNC_2D( uchar, 8u, 3, ICV_DEF_PX2PL2PX_ENTRY_C3 )
-ICV_DEF_COPY_PL2PX_FUNC_2D( uchar, 8u, 4, ICV_DEF_PX2PL2PX_ENTRY_C4 )
-ICV_DEF_COPY_PL2PX_FUNC_2D( ushort, 16s, 2, ICV_DEF_PX2PL2PX_ENTRY_C2 )
-ICV_DEF_COPY_PL2PX_FUNC_2D( ushort, 16s, 3, ICV_DEF_PX2PL2PX_ENTRY_C3 )
-ICV_DEF_COPY_PL2PX_FUNC_2D( ushort, 16s, 4, ICV_DEF_PX2PL2PX_ENTRY_C4 )
-ICV_DEF_COPY_PL2PX_FUNC_2D( int, 32f, 2, ICV_DEF_PX2PL2PX_ENTRY_C2 )
-ICV_DEF_COPY_PL2PX_FUNC_2D( int, 32f, 3, ICV_DEF_PX2PL2PX_ENTRY_C3 )
-ICV_DEF_COPY_PL2PX_FUNC_2D( int, 32f, 4, ICV_DEF_PX2PL2PX_ENTRY_C4 )
-ICV_DEF_COPY_PL2PX_FUNC_2D( int64, 64f, 2, ICV_DEF_PX2PL2PX_ENTRY_C2 )
-ICV_DEF_COPY_PL2PX_FUNC_2D( int64, 64f, 3, ICV_DEF_PX2PL2PX_ENTRY_C3 )
-ICV_DEF_COPY_PL2PX_FUNC_2D( int64, 64f, 4, ICV_DEF_PX2PL2PX_ENTRY_C4 )
-
-ICV_DEF_COPY_PL2PX_FUNC_2D_COI( uchar, 8u )
-ICV_DEF_COPY_PL2PX_FUNC_2D_COI( ushort, 16s )
-ICV_DEF_COPY_PL2PX_FUNC_2D_COI( int, 32f )
-ICV_DEF_COPY_PL2PX_FUNC_2D_COI( int64, 64f )
-
-
-#define  ICV_DEF_PXPLPX_TAB( name, FROM, TO )                           \
-static void                                                             \
-name( CvBigFuncTable* tab )                                             \
-{                                                                       \
-    tab->fn_2d[CV_8UC2] = (void*)icvCopy##_8u_##FROM##2##TO##2R;        \
-    tab->fn_2d[CV_8UC3] = (void*)icvCopy##_8u_##FROM##3##TO##3R;        \
-    tab->fn_2d[CV_8UC4] = (void*)icvCopy##_8u_##FROM##4##TO##4R;        \
-                                                                        \
-    tab->fn_2d[CV_8SC2] = (void*)icvCopy##_8u_##FROM##2##TO##2R;        \
-    tab->fn_2d[CV_8SC3] = (void*)icvCopy##_8u_##FROM##3##TO##3R;        \
-    tab->fn_2d[CV_8SC4] = (void*)icvCopy##_8u_##FROM##4##TO##4R;        \
-                                                                        \
-    tab->fn_2d[CV_16UC2] = (void*)icvCopy##_16s_##FROM##2##TO##2R;      \
-    tab->fn_2d[CV_16UC3] = (void*)icvCopy##_16s_##FROM##3##TO##3R;      \
-    tab->fn_2d[CV_16UC4] = (void*)icvCopy##_16s_##FROM##4##TO##4R;      \
-                                                                        \
-    tab->fn_2d[CV_16SC2] = (void*)icvCopy##_16s_##FROM##2##TO##2R;      \
-    tab->fn_2d[CV_16SC3] = (void*)icvCopy##_16s_##FROM##3##TO##3R;      \
-    tab->fn_2d[CV_16SC4] = (void*)icvCopy##_16s_##FROM##4##TO##4R;      \
-                                                                        \
-    tab->fn_2d[CV_32SC2] = (void*)icvCopy##_32f_##FROM##2##TO##2R;      \
-    tab->fn_2d[CV_32SC3] = (void*)icvCopy##_32f_##FROM##3##TO##3R;      \
-    tab->fn_2d[CV_32SC4] = (void*)icvCopy##_32f_##FROM##4##TO##4R;      \
-                                                                        \
-    tab->fn_2d[CV_32FC2] = (void*)icvCopy##_32f_##FROM##2##TO##2R;      \
-    tab->fn_2d[CV_32FC3] = (void*)icvCopy##_32f_##FROM##3##TO##3R;      \
-    tab->fn_2d[CV_32FC4] = (void*)icvCopy##_32f_##FROM##4##TO##4R;      \
-                                                                        \
-    tab->fn_2d[CV_64FC2] = (void*)icvCopy##_64f_##FROM##2##TO##2R;      \
-    tab->fn_2d[CV_64FC3] = (void*)icvCopy##_64f_##FROM##3##TO##3R;      \
-    tab->fn_2d[CV_64FC4] = (void*)icvCopy##_64f_##FROM##4##TO##4R;      \
-}
-
-
-
-#define  ICV_DEF_PXPLCOI_TAB( name, FROM, TO )                          \
-static void                                                             \
-name( CvFuncTable* tab )                                                \
-{                                                                       \
-    tab->fn_2d[CV_8U] = (void*)icvCopy##_8u_##FROM##TO##CR;             \
-    tab->fn_2d[CV_8S] = (void*)icvCopy##_8u_##FROM##TO##CR;             \
-    tab->fn_2d[CV_16U] = (void*)icvCopy##_16s_##FROM##TO##CR;           \
-    tab->fn_2d[CV_16S] = (void*)icvCopy##_16s_##FROM##TO##CR;           \
-    tab->fn_2d[CV_32S] = (void*)icvCopy##_32f_##FROM##TO##CR;           \
-    tab->fn_2d[CV_32F] = (void*)icvCopy##_32f_##FROM##TO##CR;           \
-    tab->fn_2d[CV_64F] = (void*)icvCopy##_64f_##FROM##TO##CR;           \
-}
-
-
-ICV_DEF_PXPLPX_TAB( icvInitSplitRTable, C, P )
-ICV_DEF_PXPLCOI_TAB( icvInitSplitRCoiTable, Cn, C1 )
-ICV_DEF_PXPLPX_TAB( icvInitCvtPlaneToPixRTable, P, C )
-ICV_DEF_PXPLCOI_TAB( icvInitCvtPlaneToPixRCoiTable, C1, Cn )
-
-typedef CvStatus (CV_STDCALL *CvSplitFunc)( const void* src, int srcstep,
-                                                    void** dst, int dststep, CvSize size);
-
-typedef CvStatus (CV_STDCALL *CvExtractPlaneFunc)( const void* src, int srcstep,
-                                                   void* dst, int dststep,
-                                                   CvSize size, int cn, int coi );
-
-typedef CvStatus (CV_STDCALL *CvMergeFunc)( const void** src, int srcstep,
-                                                    void* dst, int dststep, CvSize size);
-
-typedef CvStatus (CV_STDCALL *CvInsertPlaneFunc)( const void* src, int srcstep,
-                                                  void* dst, int dststep,
-                                                  CvSize size, int cn, int coi );
-
-CV_IMPL void
-cvSplit( const void* srcarr, void* dstarr0, void* dstarr1, void* dstarr2, void* dstarr3 )
-{
-    static CvBigFuncTable  pxpl_tab;
-    static CvFuncTable  pxplcoi_tab;
-    static int inittab = 0;
-
-    CV_FUNCNAME( "cvSplit" );
-
-    __BEGIN__;
-
-    CvMat stub[5], *dst[4], *src = (CvMat*)srcarr;
-    CvSize size;
-    void* dstptr[4] = { 0, 0, 0, 0 };
-    int type, cn, coi = 0;
-    int i, nzplanes = 0, nzidx = -1;
-    int cont_flag;
-    int src_step, dst_step = 0;
-
-    if( !inittab )
-    {
-        icvInitSplitRTable( &pxpl_tab );
-        icvInitSplitRCoiTable( &pxplcoi_tab );
-        inittab = 1;
-    }
-
-    dst[0] = (CvMat*)dstarr0;
-    dst[1] = (CvMat*)dstarr1;
-    dst[2] = (CvMat*)dstarr2;
-    dst[3] = (CvMat*)dstarr3;
-
-    CV_CALL( src = cvGetMat( src, stub + 4, &coi ));
-
-    //if( coi != 0 )
-    //    CV_ERROR( CV_BadCOI, "" );
-
-    type = CV_MAT_TYPE( src->type );
-    cn = CV_MAT_CN( type );
-
-    cont_flag = src->type;
-
-    if( cn == 1 )
-        CV_ERROR( CV_BadNumChannels, "" );
-
-    for( i = 0; i < 4; i++ )
-    {
-        if( dst[i] )
-        {
-            nzplanes++;
-            nzidx = i;
-            CV_CALL( dst[i] = cvGetMat( dst[i], stub + i ));
-            if( CV_MAT_CN( dst[i]->type ) != 1 )
-                CV_ERROR( CV_BadNumChannels, "" );
-            if( !CV_ARE_DEPTHS_EQ( dst[i], src ))
-                CV_ERROR( CV_StsUnmatchedFormats, "" );
-            if( !CV_ARE_SIZES_EQ( dst[i], src ))
-                CV_ERROR( CV_StsUnmatchedSizes, "" );
-            if( nzplanes > i && i > 0 && dst[i]->step != dst[i-1]->step )
-                CV_ERROR( CV_BadStep, "" );
-            dst_step = dst[i]->step;
-            dstptr[nzplanes-1] = dst[i]->data.ptr;
-
-            cont_flag &= dst[i]->type;
-        }
-    }
-
-    src_step = src->step;
-    size = cvGetMatSize( src );
-
-    if( CV_IS_MAT_CONT( cont_flag ))
-    {
-        size.width *= size.height;
-        src_step = dst_step = CV_STUB_STEP;
-
-        size.height = 1;
-    }
-
-    if( nzplanes == cn )
-    {
-        CvSplitFunc func = (CvSplitFunc)pxpl_tab.fn_2d[type];
-
-        if( !func )
-            CV_ERROR( CV_StsUnsupportedFormat, "" );
-
-        IPPI_CALL( func( src->data.ptr, src_step, dstptr, dst_step, size ));
-    }
-    else if( nzplanes == 1 )
-    {
-        CvExtractPlaneFunc func = (CvExtractPlaneFunc)pxplcoi_tab.fn_2d[CV_MAT_DEPTH(type)];
-
-        if( !func )
-            CV_ERROR( CV_StsUnsupportedFormat, "" );
-
-        IPPI_CALL( func( src->data.ptr, src_step,
-                         dst[nzidx]->data.ptr, dst_step,
-                         size, cn, nzidx + 1 ));
-    }
-    else
-    {
-        CV_ERROR( CV_StsBadArg,
-            "Either all output planes or only one output plane should be non zero" );
-    }
-
-    __END__;
-}
-
-
-
-CV_IMPL void
-cvMerge( const void* srcarr0, const void* srcarr1, const void* srcarr2,
-         const void* srcarr3, void* dstarr )
-{
-    static CvBigFuncTable plpx_tab;
-    static CvFuncTable plpxcoi_tab;
-    static int inittab = 0;
-
-    CV_FUNCNAME( "cvMerge" );
-
-    __BEGIN__;
-
-    int src_step = 0, dst_step;
-    CvMat stub[5], *src[4], *dst = (CvMat*)dstarr;
-    CvSize size;
-    const void* srcptr[4] = { 0, 0, 0, 0 };
-    int type, cn, coi = 0;
-    int i, nzplanes = 0, nzidx = -1;
-    int cont_flag;
-
-    if( !inittab )
-    {
-        icvInitCvtPlaneToPixRTable( &plpx_tab );
-        icvInitCvtPlaneToPixRCoiTable( &plpxcoi_tab );
-        inittab = 1;
-    }
-
-    src[0] = (CvMat*)srcarr0;
-    src[1] = (CvMat*)srcarr1;
-    src[2] = (CvMat*)srcarr2;
-    src[3] = (CvMat*)srcarr3;
-
-    CV_CALL( dst = cvGetMat( dst, stub + 4, &coi ));
-
-    type = CV_MAT_TYPE( dst->type );
-    cn = CV_MAT_CN( type );
-
-    cont_flag = dst->type;
-
-    if( cn == 1 )
-        CV_ERROR( CV_BadNumChannels, "" );
-
-    for( i = 0; i < 4; i++ )
-    {
-        if( src[i] )
-        {
-            nzplanes++;
-            nzidx = i;
-            CV_CALL( src[i] = cvGetMat( src[i], stub + i ));
-            if( CV_MAT_CN( src[i]->type ) != 1 )
-                CV_ERROR( CV_BadNumChannels, "" );
-            if( !CV_ARE_DEPTHS_EQ( src[i], dst ))
-                CV_ERROR( CV_StsUnmatchedFormats, "" );
-            if( !CV_ARE_SIZES_EQ( src[i], dst ))
-                CV_ERROR( CV_StsUnmatchedSizes, "" );
-            if( nzplanes > i && i > 0 && src[i]->step != src[i-1]->step )
-                CV_ERROR( CV_BadStep, "" );
-            src_step = src[i]->step;
-            srcptr[nzplanes-1] = (const void*)(src[i]->data.ptr);
-
-            cont_flag &= src[i]->type;
-        }
-    }
-
-    size = cvGetMatSize( dst );
-    dst_step = dst->step;
-
-    if( CV_IS_MAT_CONT( cont_flag ))
-    {
-        size.width *= size.height;
-        src_step = dst_step = CV_STUB_STEP;
-        size.height = 1;
-    }
-
-    if( nzplanes == cn )
-    {
-        CvMergeFunc func = (CvMergeFunc)plpx_tab.fn_2d[type];
-
-        if( !func )
-            CV_ERROR( CV_StsUnsupportedFormat, "" );
-
-        IPPI_CALL( func( srcptr, src_step, dst->data.ptr, dst_step, size ));
-    }
-    else if( nzplanes == 1 )
-    {
-        CvInsertPlaneFunc func = (CvInsertPlaneFunc)plpxcoi_tab.fn_2d[CV_MAT_DEPTH(type)];
-
-        if( !func )
-            CV_ERROR( CV_StsUnsupportedFormat, "" );
-
-        IPPI_CALL( func( src[nzidx]->data.ptr, src_step,
-                         dst->data.ptr, dst_step,
-                         size, cn, nzidx + 1 ));
-    }
-    else
-    {
-        CV_ERROR( CV_StsBadArg,
-            "Either all input planes or only one input plane should be non zero" );
-    }
-
-    __END__;
-}
-
-
-/****************************************************************************************\
-*                       Generalized split/merge: mixing channels                         *
-\****************************************************************************************/
-
-#define  ICV_DEF_MIX_CH_FUNC_2D( arrtype, flavor )              \
-static CvStatus CV_STDCALL                                      \
-icvMixChannels_##flavor( const arrtype** src, int* sdelta0,     \
-                         int* sdelta1, arrtype** dst,           \
-                         int* ddelta0, int* ddelta1,            \
-                         int n, CvSize size )                   \
-{                                                               \
-    int i, k;                                                   \
-    int block_size0 = n == 1 ? size.width : 1024;               \
-                                                                \
-    for( ; size.height--; )                                     \
-    {                                                           \
-        int remaining = size.width;                             \
-        for( ; remaining > 0; )                                 \
-        {                                                       \
-            int block_size = MIN( remaining, block_size0 );     \
-            for( k = 0; k < n; k++ )                            \
-            {                                                   \
-                const arrtype* s = src[k];                      \
-                arrtype* d = dst[k];                            \
-                int ds = sdelta1[k], dd = ddelta1[k];           \
-                if( s )                                         \
-                {                                               \
-                    for( i = 0; i <= block_size - 2; i += 2,    \
-                                        s += ds*2, d += dd*2 )  \
-                    {                                           \
-                        arrtype t0 = s[0], t1 = s[ds];          \
-                        d[0] = t0; d[dd] = t1;                  \
-                    }                                           \
-                    if( i < block_size )                        \
-                        d[0] = s[0], s += ds, d += dd;          \
-                    src[k] = s;                                 \
-                }                                               \
-                else                                            \
-                {                                               \
-                    for( i=0; i <= block_size-2; i+=2, d+=dd*2 )\
-                        d[0] = d[dd] = 0;                       \
-                    if( i < block_size )                        \
-                        d[0] = 0, d += dd;                      \
-                }                                               \
-                dst[k] = d;                                     \
-            }                                                   \
-            remaining -= block_size;                            \
-        }                                                       \
-        for( k = 0; k < n; k++ )                                \
-            src[k] += sdelta0[k], dst[k] += ddelta0[k];         \
-    }                                                           \
-                                                                \
-    return CV_OK;                                               \
-}
-
-
-ICV_DEF_MIX_CH_FUNC_2D( uchar, 8u )
-ICV_DEF_MIX_CH_FUNC_2D( ushort, 16u )
-ICV_DEF_MIX_CH_FUNC_2D( int, 32s )
-ICV_DEF_MIX_CH_FUNC_2D( int64, 64s )
-
-static void
-icvInitMixChannelsTab( CvFuncTable* tab )
-{
-    tab->fn_2d[CV_8U] = (void*)icvMixChannels_8u;
-    tab->fn_2d[CV_8S] = (void*)icvMixChannels_8u;
-    tab->fn_2d[CV_16U] = (void*)icvMixChannels_16u;
-    tab->fn_2d[CV_16S] = (void*)icvMixChannels_16u;
-    tab->fn_2d[CV_32S] = (void*)icvMixChannels_32s;
-    tab->fn_2d[CV_32F] = (void*)icvMixChannels_32s;
-    tab->fn_2d[CV_64F] = (void*)icvMixChannels_64s;
-}
-
-typedef CvStatus (CV_STDCALL * CvMixChannelsFunc)( const void** src, int* sdelta0,
-        int* sdelta1, void** dst, int* ddelta0, int* ddelta1, int n, CvSize size );
-
-CV_IMPL void
-cvMixChannels( const CvArr** src, int src_count,
-               CvArr** dst, int dst_count,
-               const int* from_to, int pair_count )
-{
-    static CvFuncTable mixcn_tab;
-    static int inittab = 0;
-    uchar* buffer = 0;
-    int heap_alloc = 0;
-
-    CV_FUNCNAME( "cvMixChannels" );
-
-    __BEGIN__;
-
-    CvSize size = {0,0};
-    int depth = -1, elem_size = 1;
-    int *sdelta0 = 0, *sdelta1 = 0, *ddelta0 = 0, *ddelta1 = 0;
-    uchar **sptr = 0, **dptr = 0;
-    uchar **src0 = 0, **dst0 = 0;
-    int* src_cn = 0, *dst_cn = 0;
-    int* src_step = 0, *dst_step = 0;
-    int buf_size, i, k;
-    int cont_flag = CV_MAT_CONT_FLAG;
-    CvMixChannelsFunc func;
-
-    if( !inittab )
-    {
-        icvInitMixChannelsTab( &mixcn_tab );
-        inittab = 1;
-    }
-
-    src_count = MAX( src_count, 0 );
-
-    if( !src && src_count > 0 )
-        CV_ERROR( CV_StsNullPtr, "The input array of arrays is NULL" );
-
-    if( !dst )
-        CV_ERROR( CV_StsNullPtr, "The output array of arrays is NULL" );
-
-    if( dst_count <= 0 || pair_count <= 0 )
-        CV_ERROR( CV_StsOutOfRange,
-        "The number of output arrays and the number of copied channels must be positive" );
-
-    if( !from_to )
-        CV_ERROR( CV_StsNullPtr, "The array of copied channel indices is NULL" );
-
-    buf_size = (src_count + dst_count + 2)*
-        (sizeof(src0[0]) + sizeof(src_cn[0]) + sizeof(src_step[0])) +
-        pair_count*2*(sizeof(sptr[0]) + sizeof(sdelta0[0]) + sizeof(sdelta1[0]));
-
-    if( buf_size > CV_MAX_LOCAL_SIZE )
-    {
-        CV_CALL( buffer = (uchar*)cvAlloc( buf_size ) );
-        heap_alloc = 1;
-    }
-    else
-        buffer = (uchar*)cvStackAlloc( buf_size );
-
-    src0 = (uchar**)buffer;
-    dst0 = src0 + src_count;
-    src_cn = (int*)(dst0 + dst_count);
-    dst_cn = src_cn + src_count + 1;
-    src_step = dst_cn + dst_count + 1;
-    dst_step = src_step + src_count;
-
-    sptr = (uchar**)cvAlignPtr( dst_step + dst_count, (int)sizeof(void*) );
-    dptr = sptr + pair_count;
-    sdelta0 = (int*)(dptr + pair_count);
-    sdelta1 = sdelta0 + pair_count;
-    ddelta0 = sdelta1 + pair_count;
-    ddelta1 = ddelta0 + pair_count;
-
-    src_cn[0] = dst_cn[0] = 0;
-
-    for( k = 0; k < 2; k++ )
-    {
-        for( i = 0; i < (k == 0 ? src_count : dst_count); i++ )
-        {
-            CvMat stub, *mat = (CvMat*)(k == 0 ? src[i] : dst[i]);
-            int cn;
-
-            if( !CV_IS_MAT(mat) )
-                CV_CALL( mat = cvGetMat( mat, &stub ));
-
-            if( depth < 0 )
-            {
-                depth = CV_MAT_DEPTH(mat->type);
-                elem_size = CV_ELEM_SIZE1(depth);
-                size = cvGetMatSize(mat);
-            }
-
-            if( CV_MAT_DEPTH(mat->type) != depth )
-                CV_ERROR( CV_StsUnmatchedFormats, "All the arrays must have the same bit depth" );
-
-            if( mat->cols != size.width || mat->rows != size.height )
-                CV_ERROR( CV_StsUnmatchedSizes, "All the arrays must have the same size" );
-
-            if( k == 0 )
-            {
-                src0[i] = mat->data.ptr;
-                cn = CV_MAT_CN(mat->type);
-                src_cn[i+1] = src_cn[i] + cn;
-                src_step[i] = mat->step / elem_size - size.width * cn;
-            }
-            else
-            {
-                dst0[i] = mat->data.ptr;
-                cn = CV_MAT_CN(mat->type);
-                dst_cn[i+1] = dst_cn[i] + cn;
-                dst_step[i] = mat->step / elem_size - size.width * cn;
-            }
-
-            cont_flag &= mat->type;
-        }
-    }
-
-    if( cont_flag )
-    {
-        size.width *= size.height;
-        size.height = 1;
-    }
-
-    for( i = 0; i < pair_count; i++ )
-    {
-        for( k = 0; k < 2; k++ )
-        {
-            int cn = from_to[i*2 + k];
-            const int* cn_arr = k == 0 ? src_cn : dst_cn;
-            int a = 0, b = k == 0 ? src_count-1 : dst_count-1;
-
-            if( cn < 0 || cn >= cn_arr[b+1] )
-            {
-                if( k == 0 && cn < 0 )
-                {
-                    sptr[i] = 0;
-                    sdelta0[i] = sdelta1[i] = 0;
-                    continue;
-                }
-                else
-                {
-                    char err_str[100];
-                    sprintf( err_str, "channel index #%d in the array of pairs is negative "
-                        "or exceeds the total number of channels in all the %s arrays", i*2+k,
-                        k == 0 ? "input" : "output" );
-                    CV_ERROR( CV_StsOutOfRange, err_str );
-                }
-            }
-
-            for( ; cn >= cn_arr[a+1]; a++ )
-                ;
-
-            if( k == 0 )
-            {
-                sptr[i] = src0[a] + (cn - cn_arr[a])*elem_size;
-                sdelta1[i] = cn_arr[a+1] - cn_arr[a];
-                sdelta0[i] = src_step[a];
-            }
-            else
-            {
-                dptr[i] = dst0[a] + (cn - cn_arr[a])*elem_size;
-                ddelta1[i] = cn_arr[a+1] - cn_arr[a];
-                ddelta0[i] = dst_step[a];
-            }
-        }
-    }
-
-    func = (CvMixChannelsFunc)mixcn_tab.fn_2d[depth];
-    if( !func )
-        CV_ERROR( CV_StsUnsupportedFormat, "The data type is not supported by the function" );
-
-    IPPI_CALL( func( (const void**)sptr, sdelta0, sdelta1, (void**)dptr,
-                     ddelta0, ddelta1, pair_count, size ));
-
-    __END__;
-
-    if( buffer && heap_alloc )
-        cvFree( &buffer );
-}
-
-
-/****************************************************************************************\
-*                                   cvConvertScaleAbs                                    *
-\****************************************************************************************/
-
-#define ICV_DEF_CVT_SCALE_ABS_CASE( srctype, worktype,                  \
-            scale_macro, abs_macro, cast_macro, a, b )                  \
-                                                                        \
-{                                                                       \
-    const srctype* _src = (const srctype*)src;                          \
-    srcstep /= sizeof(_src[0]); /*dststep /= sizeof(_dst[0]);*/         \
-                                                                        \
-    for( ; size.height--; _src += srcstep, dst += dststep )             \
-    {                                                                   \
-        int i;                                                          \
-                                                                        \
-        for( i = 0; i <= size.width - 4; i += 4 )                       \
-        {                                                               \
-            worktype t0 = scale_macro((a)*_src[i] + (b));               \
-            worktype t1 = scale_macro((a)*_src[i+1] + (b));             \
-                                                                        \
-            t0 = (worktype)abs_macro(t0);                               \
-            t1 = (worktype)abs_macro(t1);                               \
-                                                                        \
-            dst[i] = cast_macro(t0);                                    \
-            dst[i+1] = cast_macro(t1);                                  \
-                                                                        \
-            t0 = scale_macro((a)*_src[i+2] + (b));                      \
-            t1 = scale_macro((a)*_src[i+3] + (b));                      \
-                                                                        \
-            t0 = (worktype)abs_macro(t0);                               \
-            t1 = (worktype)abs_macro(t1);                               \
-                                                                        \
-            dst[i+2] = cast_macro(t0);                                  \
-            dst[i+3] = cast_macro(t1);                                  \
-        }                                                               \
-                                                                        \
-        for( ; i < size.width; i++ )                                    \
-        {                                                               \
-            worktype t0 = scale_macro((a)*_src[i] + (b));               \
-            t0 = (worktype)abs_macro(t0);                               \
-            dst[i] = cast_macro(t0);                                    \
-        }                                                               \
-    }                                                                   \
-}
-
-
-#define ICV_FIX_SHIFT  15
-#define ICV_SCALE(x)   (((x) + (1 << (ICV_FIX_SHIFT-1))) >> ICV_FIX_SHIFT)
-
-static CvStatus CV_STDCALL
-icvCvtScaleAbsTo_8u_C1R( const uchar* src, int srcstep,
-                         uchar* dst, int dststep,
-                         CvSize size, double scale, double shift,
-                         int param )
-{
-    int srctype = param;
-    int srcdepth = CV_MAT_DEPTH(srctype);
-
-    size.width *= CV_MAT_CN(srctype);
-
-    switch( srcdepth )
-    {
-    case  CV_8S:
-    case  CV_8U:
-        {
-        uchar lut[256];
-        int i;
-        double val = shift;
-
-        for( i = 0; i < 128; i++, val += scale )
-        {
-            int t = cvRound(fabs(val));
-            lut[i] = CV_CAST_8U(t);
-        }
-
-        if( srcdepth == CV_8S )
-            val = -val;
-
-        for( ; i < 256; i++, val += scale )
-        {
-            int t = cvRound(fabs(val));
-            lut[i] = CV_CAST_8U(t);
-        }
-
-        icvLUT_Transform8u_8u_C1R( src, srcstep, dst,
-                                   dststep, size, lut );
-        }
-        break;
-    case  CV_16U:
-        if( fabs( scale ) <= 1. && fabs(shift) < DBL_EPSILON )
-        {
-            int iscale = cvRound(scale*(1 << ICV_FIX_SHIFT));
-
-            if( iscale == ICV_FIX_SHIFT )
-            {
-                ICV_DEF_CVT_SCALE_ABS_CASE( ushort, int, CV_NOP, CV_IABS,
-                                            CV_CAST_8U, 1, 0 );
-            }
-            else
-            {
-                ICV_DEF_CVT_SCALE_ABS_CASE( ushort, int, ICV_SCALE, CV_IABS,
-                                            CV_CAST_8U, iscale, 0 );
-            }
-        }
-        else
-        {
-            ICV_DEF_CVT_SCALE_ABS_CASE( ushort, int, cvRound, CV_IABS,
-                                        CV_CAST_8U, scale, shift );
-        }
-        break;
-    case  CV_16S:
-        if( fabs( scale ) <= 1. &&
-            fabs( shift ) <= (INT_MAX*0.5)/(1 << ICV_FIX_SHIFT))
-        {
-            int iscale = cvRound(scale*(1 << ICV_FIX_SHIFT));
-            int ishift = cvRound(shift*(1 << ICV_FIX_SHIFT));
-
-            if( iscale == ICV_FIX_SHIFT && ishift == 0 )
-            {
-                ICV_DEF_CVT_SCALE_ABS_CASE( short, int, CV_NOP, CV_IABS,
-                                            CV_CAST_8U, 1, 0 );
-            }
-            else
-            {
-                ICV_DEF_CVT_SCALE_ABS_CASE( short, int, ICV_SCALE, CV_IABS,
-                                            CV_CAST_8U, iscale, ishift );
-            }
-        }
-        else
-        {
-            ICV_DEF_CVT_SCALE_ABS_CASE( short, int, cvRound, CV_IABS,
-                                        CV_CAST_8U, scale, shift );
-        }
-        break;
-    case  CV_32S:
-        ICV_DEF_CVT_SCALE_ABS_CASE( int, int, cvRound, CV_IABS,
-                                    CV_CAST_8U, scale, shift );
-        break;
-    case  CV_32F:
-        ICV_DEF_CVT_SCALE_ABS_CASE( float, int, cvRound, CV_IABS,
-                                    CV_CAST_8U, scale, shift );
-        break;
-    case  CV_64F:
-        ICV_DEF_CVT_SCALE_ABS_CASE( double, int, cvRound, CV_IABS,
-                                    CV_CAST_8U, scale, shift );
-        break;
-    default:
-        assert(0);
-        return CV_BADFLAG_ERR;
-    }
-
-    return  CV_OK;
-}
-
-
-CV_IMPL void
-cvConvertScaleAbs( const void* srcarr, void* dstarr,
-                   double scale, double shift )
-{
-    CV_FUNCNAME( "cvConvertScaleAbs" );
-
-    __BEGIN__;
-
-    int coi1 = 0, coi2 = 0;
-    CvMat  srcstub, *src = (CvMat*)srcarr;
-    CvMat  dststub, *dst = (CvMat*)dstarr;
-    CvSize size;
-    int src_step, dst_step;
-
-    CV_CALL( src = cvGetMat( src, &srcstub, &coi1 ));
-    CV_CALL( dst = cvGetMat( dst, &dststub, &coi2 ));
-
-    if( coi1 != 0 || coi2 != 0 )
-        CV_ERROR( CV_BadCOI, "" );
-
-    if( !CV_ARE_SIZES_EQ( src, dst ))
-        CV_ERROR( CV_StsUnmatchedSizes, "" );
-
-    if( !CV_ARE_CNS_EQ( src, dst ))
-        CV_ERROR( CV_StsUnmatchedFormats, "" );
-
-    if( CV_MAT_DEPTH( dst->type ) != CV_8U )
-        CV_ERROR( CV_StsUnsupportedFormat, "" );
-
-    size = cvGetMatSize( src );
-    src_step = src->step;
-    dst_step = dst->step;
-
-    if( CV_IS_MAT_CONT( src->type & dst->type ))
-    {
-        size.width *= size.height;
-        src_step = dst_step = CV_STUB_STEP;
-        size.height = 1;
-    }
-
-    IPPI_CALL( icvCvtScaleAbsTo_8u_C1R( src->data.ptr, src_step,
-                             (uchar*)(dst->data.ptr), dst_step,
-                             size, scale, shift, CV_MAT_TYPE(src->type)));
-    __END__;
-}
-
-/****************************************************************************************\
-*                                      cvConvertScale                                    *
-\****************************************************************************************/
-
-#define ICV_DEF_CVT_SCALE_CASE( srctype, worktype,          \
-                            scale_macro, cast_macro, a, b ) \
-                                                            \
-{                                                           \
-    const srctype* _src = (const srctype*)src;              \
-    srcstep /= sizeof(_src[0]);                             \
-                                                            \
-    for( ; size.height--; _src += srcstep, dst += dststep ) \
-    {                                                       \
-        for( i = 0; i <= size.width - 4; i += 4 )           \
-        {                                                   \
-            worktype t0 = scale_macro((a)*_src[i]+(b));     \
-            worktype t1 = scale_macro((a)*_src[i+1]+(b));   \
-                                                            \
-            dst[i] = cast_macro(t0);                        \
-            dst[i+1] = cast_macro(t1);                      \
-                                                            \
-            t0 = scale_macro((a)*_src[i+2] + (b));          \
-            t1 = scale_macro((a)*_src[i+3] + (b));          \
-                                                            \
-            dst[i+2] = cast_macro(t0);                      \
-            dst[i+3] = cast_macro(t1);                      \
-        }                                                   \
-                                                            \
-        for( ; i < size.width; i++ )                        \
-        {                                                   \
-            worktype t0 = scale_macro((a)*_src[i] + (b));   \
-            dst[i] = cast_macro(t0);                        \
-        }                                                   \
-    }                                                       \
-}
-
-
-#define  ICV_DEF_CVT_SCALE_FUNC_INT( flavor, dsttype, cast_macro )      \
-static  CvStatus  CV_STDCALL                                            \
-icvCvtScaleTo_##flavor##_C1R( const uchar* src, int srcstep,            \
-                              dsttype* dst, int dststep, CvSize size,   \
-                              double scale, double shift, int param )   \
-{                                                                       \
-    int i, srctype = param;                                             \
-    dsttype lut[256];                                                   \
-    dststep /= sizeof(dst[0]);                                          \
-                                                                        \
-    switch( CV_MAT_DEPTH(srctype) )                                     \
-    {                                                                   \
-    case  CV_8U:                                                        \
-        if( size.width*size.height >= 256 )                             \
-        {                                                               \
-            double val = shift;                                         \
-            for( i = 0; i < 256; i++, val += scale )                    \
-            {                                                           \
-                int t = cvRound(val);                                   \
-                lut[i] = cast_macro(t);                                 \
-            }                                                           \
-                                                                        \
-            icvLUT_Transform8u_##flavor##_C1R( src, srcstep, dst,       \
-                                dststep*sizeof(dst[0]), size, lut );    \
-        }                                                               \
-        else if( fabs( scale ) <= 128. &&                               \
-                 fabs( shift ) <= (INT_MAX*0.5)/(1 << ICV_FIX_SHIFT))   \
-        {                                                               \
-            int iscale = cvRound(scale*(1 << ICV_FIX_SHIFT));           \
-            int ishift = cvRound(shift*(1 << ICV_FIX_SHIFT));           \
-                                                                        \
-            ICV_DEF_CVT_SCALE_CASE( uchar, int, ICV_SCALE,              \
-                                    cast_macro, iscale, ishift );       \
-        }                                                               \
-        else                                                            \
-        {                                                               \
-            ICV_DEF_CVT_SCALE_CASE( uchar, int, cvRound,                \
-                                    cast_macro, scale, shift );         \
-        }                                                               \
-        break;                                                          \
-    case  CV_8S:                                                        \
-        if( size.width*size.height >= 256 )                             \
-        {                                                               \
-            for( i = 0; i < 256; i++ )                                  \
-            {                                                           \
-                int t = cvRound( (schar)i*scale + shift );              \
-                lut[i] = cast_macro(t);                                 \
-            }                                                           \
-                                                                        \
-            icvLUT_Transform8u_##flavor##_C1R( src, srcstep, dst,       \
-                                dststep*sizeof(dst[0]), size, lut );    \
-        }                                                               \
-        else if( fabs( scale ) <= 128. &&                               \
-                 fabs( shift ) <= (INT_MAX*0.5)/(1 << ICV_FIX_SHIFT))   \
-        {                                                               \
-            int iscale = cvRound(scale*(1 << ICV_FIX_SHIFT));           \
-            int ishift = cvRound(shift*(1 << ICV_FIX_SHIFT));           \
-                                                                        \
-            ICV_DEF_CVT_SCALE_CASE( schar, int, ICV_SCALE,              \
-                                    cast_macro, iscale, ishift );       \
-        }                                                               \
-        else                                                            \
-        {                                                               \
-            ICV_DEF_CVT_SCALE_CASE( schar, int, cvRound,                \
-                                    cast_macro, scale, shift );         \
-        }                                                               \
-        break;                                                          \
-    case  CV_16U:                                                       \
-        if( fabs( scale ) <= 1. && fabs(shift) < DBL_EPSILON )          \
-        {                                                               \
-            int iscale = cvRound(scale*(1 << ICV_FIX_SHIFT));           \
-                                                                        \
-            ICV_DEF_CVT_SCALE_CASE( ushort, int, ICV_SCALE,             \
-                                    cast_macro, iscale, 0 );            \
-        }                                                               \
-        else                                                            \
-        {                                                               \
-            ICV_DEF_CVT_SCALE_CASE( ushort, int, cvRound,               \
-                                    cast_macro, scale, shift );         \
-        }                                                               \
-        break;                                                          \
-    case  CV_16S:                                                       \
-        if( fabs( scale ) <= 1. &&                                      \
-            fabs( shift ) <= (INT_MAX*0.5)/(1 << ICV_FIX_SHIFT))        \
-        {                                                               \
-            int iscale = cvRound(scale*(1 << ICV_FIX_SHIFT));           \
-            int ishift = cvRound(shift*(1 << ICV_FIX_SHIFT));           \
-                                                                        \
-            ICV_DEF_CVT_SCALE_CASE( short, int, ICV_SCALE,              \
-                                    cast_macro, iscale, ishift );       \
-        }                                                               \
-        else                                                            \
-        {                                                               \
-            ICV_DEF_CVT_SCALE_CASE( short, int, cvRound,                \
-                                    cast_macro, scale, shift );         \
-        }                                                               \
-        break;                                                          \
-    case  CV_32S:                                                       \
-        ICV_DEF_CVT_SCALE_CASE( int, int, cvRound,                      \
-                                cast_macro, scale, shift );             \
-        break;                                                          \
-    case  CV_32F:                                                       \
-        ICV_DEF_CVT_SCALE_CASE( float, int, cvRound,                    \
-                                cast_macro, scale, shift );             \
-        break;                                                          \
-    case  CV_64F:                                                       \
-        ICV_DEF_CVT_SCALE_CASE( double, int, cvRound,                   \
-                                cast_macro, scale, shift );             \
-        break;                                                          \
-    default:                                                            \
-        assert(0);                                                      \
-        return CV_BADFLAG_ERR;                                          \
-    }                                                                   \
-                                                                        \
-    return  CV_OK;                                                      \
-}
-
-
-#define  ICV_DEF_CVT_SCALE_FUNC_FLT( flavor, dsttype, cast_macro )      \
-static  CvStatus  CV_STDCALL                                            \
-icvCvtScaleTo_##flavor##_C1R( const uchar* src, int srcstep,            \
-                              dsttype* dst, int dststep, CvSize size,   \
-                              double scale, double shift, int param )   \
-{                                                                       \
-    int i, srctype = param;                                             \
-    dsttype lut[256];                                                   \
-    dststep /= sizeof(dst[0]);                                          \
-                                                                        \
-    switch( CV_MAT_DEPTH(srctype) )                                     \
-    {                                                                   \
-    case  CV_8U:                                                        \
-        if( size.width*size.height >= 256 )                             \
-        {                                                               \
-            double val = shift;                                         \
-            for( i = 0; i < 256; i++, val += scale )                    \
-                lut[i] = (dsttype)val;                                  \
-                                                                        \
-            icvLUT_Transform8u_##flavor##_C1R( src, srcstep, dst,       \
-                                dststep*sizeof(dst[0]), size, lut );    \
-        }                                                               \
-        else                                                            \
-        {                                                               \
-            ICV_DEF_CVT_SCALE_CASE( uchar, double, CV_NOP,              \
-                                    cast_macro, scale, shift );         \
-        }                                                               \
-        break;                                                          \
-    case  CV_8S:                                                        \
-        if( size.width*size.height >= 256 )                             \
-        {                                                               \
-            for( i = 0; i < 256; i++ )                                  \
-                lut[i] = (dsttype)((schar)i*scale + shift);             \
-                                                                        \
-            icvLUT_Transform8u_##flavor##_C1R( src, srcstep, dst,       \
-                                dststep*sizeof(dst[0]), size, lut );    \
-        }                                                               \
-        else                                                            \
-        {                                                               \
-            ICV_DEF_CVT_SCALE_CASE( schar, double, CV_NOP,              \
-                                    cast_macro, scale, shift );         \
-        }                                                               \
-        break;                                                          \
-    case  CV_16U:                                                       \
-        ICV_DEF_CVT_SCALE_CASE( ushort, double, CV_NOP,                 \
-                                cast_macro, scale, shift );             \
-        break;                                                          \
-    case  CV_16S:                                                       \
-        ICV_DEF_CVT_SCALE_CASE( short, double, CV_NOP,                  \
-                                cast_macro, scale, shift );             \
-        break;                                                          \
-    case  CV_32S:                                                       \
-        ICV_DEF_CVT_SCALE_CASE( int, double, CV_NOP,                    \
-                                cast_macro, scale, shift );             \
-        break;                                                          \
-    case  CV_32F:                                                       \
-        ICV_DEF_CVT_SCALE_CASE( float, double, CV_NOP,                  \
-                                cast_macro, scale, shift );             \
-        break;                                                          \
-    case  CV_64F:                                                       \
-        ICV_DEF_CVT_SCALE_CASE( double, double, CV_NOP,                 \
-                                cast_macro, scale, shift );             \
-        break;                                                          \
-    default:                                                            \
-        assert(0);                                                      \
-        return CV_BADFLAG_ERR;                                          \
-    }                                                                   \
-                                                                        \
-    return  CV_OK;                                                      \
-}
-
-
-ICV_DEF_CVT_SCALE_FUNC_INT( 8u, uchar, CV_CAST_8U )
-ICV_DEF_CVT_SCALE_FUNC_INT( 8s, schar, CV_CAST_8S )
-ICV_DEF_CVT_SCALE_FUNC_INT( 16s, short, CV_CAST_16S )
-ICV_DEF_CVT_SCALE_FUNC_INT( 16u, ushort, CV_CAST_16U )
-ICV_DEF_CVT_SCALE_FUNC_INT( 32s, int, CV_CAST_32S )
-
-ICV_DEF_CVT_SCALE_FUNC_FLT( 32f, float, CV_CAST_32F )
-ICV_DEF_CVT_SCALE_FUNC_FLT( 64f, double, CV_CAST_64F )
-
-CV_DEF_INIT_FUNC_TAB_2D( CvtScaleTo, C1R )
-
-
-/****************************************************************************************\
-*                             Conversion w/o scaling macros                              *
-\****************************************************************************************/
-
-#define ICV_DEF_CVT_CASE_2D( srctype, worktype,             \
-                             cast_macro1, cast_macro2 )     \
-{                                                           \
-    const srctype* _src = (const srctype*)src;              \
-    srcstep /= sizeof(_src[0]);                             \
-                                                            \
-    for( ; size.height--; _src += srcstep, dst += dststep ) \
-    {                                                       \
-        int i;                                              \
-                                                            \
-        for( i = 0; i <= size.width - 4; i += 4 )           \
-        {                                                   \
-            worktype t0 = cast_macro1(_src[i]);             \
-            worktype t1 = cast_macro1(_src[i+1]);           \
-                                                            \
-            dst[i] = cast_macro2(t0);                       \
-            dst[i+1] = cast_macro2(t1);                     \
-                                                            \
-            t0 = cast_macro1(_src[i+2]);                    \
-            t1 = cast_macro1(_src[i+3]);                    \
-                                                            \
-            dst[i+2] = cast_macro2(t0);                     \
-            dst[i+3] = cast_macro2(t1);                     \
-        }                                                   \
-                                                            \
-        for( ; i < size.width; i++ )                        \
-        {                                                   \
-            worktype t0 = cast_macro1(_src[i]);             \
-            dst[i] = cast_macro2(t0);                       \
-        }                                                   \
-    }                                                       \
-}
-
-
-#define ICV_DEF_CVT_FUNC_2D( flavor, dsttype, worktype, cast_macro2,    \
-                             srcdepth1, srctype1, cast_macro11,         \
-                             srcdepth2, srctype2, cast_macro12,         \
-                             srcdepth3, srctype3, cast_macro13,         \
-                             srcdepth4, srctype4, cast_macro14,         \
-                             srcdepth5, srctype5, cast_macro15,         \
-                             srcdepth6, srctype6, cast_macro16 )        \
-static CvStatus CV_STDCALL                                              \
-icvCvtTo_##flavor##_C1R( const uchar* src, int srcstep,                 \
-                         dsttype* dst, int dststep,                     \
-                         CvSize size, int param )                       \
-{                                                                       \
-    int srctype = param;                                                \
-    dststep /= sizeof(dst[0]);                                          \
-                                                                        \
-    switch( CV_MAT_DEPTH(srctype) )                                     \
-    {                                                                   \
-    case srcdepth1:                                                     \
-        ICV_DEF_CVT_CASE_2D( srctype1, worktype,                        \
-                             cast_macro11, cast_macro2 );               \
-        break;                                                          \
-    case srcdepth2:                                                     \
-        ICV_DEF_CVT_CASE_2D( srctype2, worktype,                        \
-                             cast_macro12, cast_macro2 );               \
-        break;                                                          \
-    case srcdepth3:                                                     \
-        ICV_DEF_CVT_CASE_2D( srctype3, worktype,                        \
-                             cast_macro13, cast_macro2 );               \
-        break;                                                          \
-    case srcdepth4:                                                     \
-        ICV_DEF_CVT_CASE_2D( srctype4, worktype,                        \
-                             cast_macro14, cast_macro2 );               \
-        break;                                                          \
-    case srcdepth5:                                                     \
-        ICV_DEF_CVT_CASE_2D( srctype5, worktype,                        \
-                             cast_macro15, cast_macro2 );               \
-        break;                                                          \
-    case srcdepth6:                                                     \
-        ICV_DEF_CVT_CASE_2D( srctype6, worktype,                        \
-                             cast_macro16, cast_macro2 );               \
-        break;                                                          \
-    }                                                                   \
-                                                                        \
-    return  CV_OK;                                                      \
-}
-
-
-ICV_DEF_CVT_FUNC_2D( 8u, uchar, int, CV_CAST_8U,
-                     CV_8S,  schar,  CV_NOP,
-                     CV_16U, ushort, CV_NOP,
-                     CV_16S, short,  CV_NOP,
-                     CV_32S, int,    CV_NOP,
-                     CV_32F, float,  cvRound,
-                     CV_64F, double, cvRound )
-
-ICV_DEF_CVT_FUNC_2D( 8s, schar, int, CV_CAST_8S,
-                     CV_8U,  uchar,  CV_NOP,
-                     CV_16U, ushort, CV_NOP,
-                     CV_16S, short,  CV_NOP,
-                     CV_32S, int,    CV_NOP,
-                     CV_32F, float,  cvRound,
-                     CV_64F, double, cvRound )
-
-ICV_DEF_CVT_FUNC_2D( 16u, ushort, int, CV_CAST_16U,
-                     CV_8U,  uchar,  CV_NOP,
-                     CV_8S,  schar,  CV_NOP,
-                     CV_16S, short,  CV_NOP,
-                     CV_32S, int,    CV_NOP,
-                     CV_32F, float,  cvRound,
-                     CV_64F, double, cvRound )
-
-ICV_DEF_CVT_FUNC_2D( 16s, short, int, CV_CAST_16S,
-                     CV_8U,  uchar,  CV_NOP,
-                     CV_8S,  schar,  CV_NOP,
-                     CV_16U, ushort, CV_NOP,
-                     CV_32S, int,    CV_NOP,
-                     CV_32F, float,  cvRound,
-                     CV_64F, double, cvRound )
-
-ICV_DEF_CVT_FUNC_2D( 32s, int, int, CV_NOP,
-                     CV_8U,  uchar,  CV_NOP,
-                     CV_8S,  schar,  CV_NOP,
-                     CV_16U, ushort, CV_NOP,
-                     CV_16S, short,  CV_NOP,
-                     CV_32F, float,  cvRound,
-                     CV_64F, double, cvRound )
-
-ICV_DEF_CVT_FUNC_2D( 32f, float, float, CV_NOP,
-                     CV_8U,  uchar,  CV_8TO32F,
-                     CV_8S,  schar,  CV_8TO32F,
-                     CV_16U, ushort, CV_NOP,
-                     CV_16S, short,  CV_NOP,
-                     CV_32S, int,    CV_CAST_32F,
-                     CV_64F, double, CV_CAST_32F )
-
-ICV_DEF_CVT_FUNC_2D( 64f, double, double, CV_NOP,
-                     CV_8U,  uchar,  CV_8TO32F,
-                     CV_8S,  schar,  CV_8TO32F,
-                     CV_16U, ushort, CV_NOP,
-                     CV_16S, short,  CV_NOP,
-                     CV_32S, int,    CV_NOP,
-                     CV_32F, float,  CV_NOP )
-
-CV_DEF_INIT_FUNC_TAB_2D( CvtTo, C1R )
-
-
-typedef  CvStatus (CV_STDCALL *CvCvtFunc)( const void* src, int srcstep,
-                                           void* dst, int dststep, CvSize size,
-                                           int param );
-
-typedef  CvStatus (CV_STDCALL *CvCvtScaleFunc)( const void* src, int srcstep,
-                                             void* dst, int dststep, CvSize size,
-                                             double scale, double shift,
-                                             int param );
-
-CV_IMPL void
-cvConvertScale( const void* srcarr, void* dstarr,
-                double scale, double shift )
-{
-    static CvFuncTable cvt_tab, cvtscale_tab;
-    static int inittab = 0;
-
-    CV_FUNCNAME( "cvConvertScale" );
-
-    __BEGIN__;
-
-    int type;
-    int is_nd = 0;
-    CvMat  srcstub, *src = (CvMat*)srcarr;
-    CvMat  dststub, *dst = (CvMat*)dstarr;
-    CvSize size;
-    int src_step, dst_step;
-    int no_scale = scale == 1 && shift == 0;
-
-    if( !CV_IS_MAT(src) )
-    {
-        if( CV_IS_MATND(src) )
-            is_nd = 1;
-        else
-        {
-            int coi = 0;
-            CV_CALL( src = cvGetMat( src, &srcstub, &coi ));
-
-            if( coi != 0 )
-                CV_ERROR( CV_BadCOI, "" );
-        }
-    }
-
-    if( !CV_IS_MAT(dst) )
-    {
-        if( CV_IS_MATND(dst) )
-            is_nd = 1;
-        else
-        {
-            int coi = 0;
-            CV_CALL( dst = cvGetMat( dst, &dststub, &coi ));
-
-            if( coi != 0 )
-                CV_ERROR( CV_BadCOI, "" );
-        }
-    }
-
-    if( is_nd )
-    {
-        CvArr* arrs[] = { src, dst };
-        CvMatND stubs[2];
-        CvNArrayIterator iterator;
-        int dsttype;
-
-        CV_CALL( cvInitNArrayIterator( 2, arrs, 0, stubs, &iterator, CV_NO_DEPTH_CHECK ));
-
-        type = iterator.hdr[0]->type;
-        dsttype = iterator.hdr[1]->type;
-        iterator.size.width *= CV_MAT_CN(type);
-
-        if( !inittab )
-        {
-            icvInitCvtToC1RTable( &cvt_tab );
-            icvInitCvtScaleToC1RTable( &cvtscale_tab );
-            inittab = 1;
-        }
-
-        if( no_scale )
-        {
-            CvCvtFunc func = (CvCvtFunc)(cvt_tab.fn_2d[CV_MAT_DEPTH(dsttype)]);
-            if( !func )
-                CV_ERROR( CV_StsUnsupportedFormat, "" );
-
-            do
-            {
-                IPPI_CALL( func( iterator.ptr[0], CV_STUB_STEP,
-                                 iterator.ptr[1], CV_STUB_STEP,
-                                 iterator.size, type ));
-            }
-            while( cvNextNArraySlice( &iterator ));
-        }
-        else
-        {
-            CvCvtScaleFunc func =
-                (CvCvtScaleFunc)(cvtscale_tab.fn_2d[CV_MAT_DEPTH(dsttype)]);
-            if( !func )
-                CV_ERROR( CV_StsUnsupportedFormat, "" );
-
-            do
-            {
-                IPPI_CALL( func( iterator.ptr[0], CV_STUB_STEP,
-                                 iterator.ptr[1], CV_STUB_STEP,
-                                 iterator.size, scale, shift, type ));
-            }
-            while( cvNextNArraySlice( &iterator ));
-        }
-        EXIT;
-    }
-
-    if( no_scale && CV_ARE_TYPES_EQ( src, dst ) )
-    {
-        if( src != dst )
-          cvCopy( src, dst );
-        EXIT;
-    }
-
-    if( !CV_ARE_SIZES_EQ( src, dst ))
-        CV_ERROR( CV_StsUnmatchedSizes, "" );
-
-    size = cvGetMatSize( src );
-    type = CV_MAT_TYPE(src->type);
-    src_step = src->step;
-    dst_step = dst->step;
-
-    if( CV_IS_MAT_CONT( src->type & dst->type ))
-    {
-        size.width *= size.height;
-        src_step = dst_step = CV_STUB_STEP;
-        size.height = 1;
-    }
-
-    size.width *= CV_MAT_CN( type );
-
-    if( CV_ARE_TYPES_EQ( src, dst ) && size.height == 1 &&
-        size.width <= CV_MAX_INLINE_MAT_OP_SIZE )
-    {
-        if( CV_MAT_DEPTH(type) == CV_32F )
-        {
-            const float* srcdata = (const float*)(src->data.ptr);
-            float* dstdata = (float*)(dst->data.ptr);
-
-            do
-            {
-                dstdata[size.width - 1] = (float)(srcdata[size.width-1]*scale + shift);
-            }
-            while( --size.width );
-
-            EXIT;
-        }
-
-        if( CV_MAT_DEPTH(type) == CV_64F )
-        {
-            const double* srcdata = (const double*)(src->data.ptr);
-            double* dstdata = (double*)(dst->data.ptr);
-
-            do
-            {
-                dstdata[size.width - 1] = srcdata[size.width-1]*scale + shift;
-            }
-            while( --size.width );
-
-            EXIT;
-        }
-    }
-
-    if( !inittab )
-    {
-        icvInitCvtToC1RTable( &cvt_tab );
-        icvInitCvtScaleToC1RTable( &cvtscale_tab );
-        inittab = 1;
-    }
-
-    if( !CV_ARE_CNS_EQ( src, dst ))
-        CV_ERROR( CV_StsUnmatchedFormats, "" );
-
-    if( no_scale )
-    {
-        CvCvtFunc func = (CvCvtFunc)(cvt_tab.fn_2d[CV_MAT_DEPTH(dst->type)]);
-
-        if( !func )
-            CV_ERROR( CV_StsUnsupportedFormat, "" );
-
-        IPPI_CALL( func( src->data.ptr, src_step,
-                   dst->data.ptr, dst_step, size, type ));
-    }
-    else
-    {
-        CvCvtScaleFunc func = (CvCvtScaleFunc)
-            (cvtscale_tab.fn_2d[CV_MAT_DEPTH(dst->type)]);
-
-        if( !func )
-            CV_ERROR( CV_StsUnsupportedFormat, "" );
-
-        IPPI_CALL( func( src->data.ptr, src_step,
-                   dst->data.ptr, dst_step, size,
-                   scale, shift, type ));
-    }
-
-    __END__;
-}
-
-/********************* helper functions for converting 32f<->64f ************************/
-
-IPCVAPI_IMPL( CvStatus, icvCvt_32f64f,
-    ( const float* src, double* dst, int len ), (src, dst, len) )
-{
-    int i;
-    for( i = 0; i <= len - 4; i += 4 )
-    {
-        double t0 = src[i];
-        double t1 = src[i+1];
-
-        dst[i] = t0;
-        dst[i+1] = t1;
-
-        t0 = src[i+2];
-        t1 = src[i+3];
-
-        dst[i+2] = t0;
-        dst[i+3] = t1;
-    }
-
-    for( ; i < len; i++ )
-        dst[i] = src[i];
-
-    return CV_OK;
-}
-
-
-IPCVAPI_IMPL( CvStatus, icvCvt_64f32f,
-    ( const double* src, float* dst, int len ), (src, dst, len) )
-{
-    int i = 0;
-    for( ; i <= len - 4; i += 4 )
-    {
-        double t0 = src[i];
-        double t1 = src[i+1];
-
-        dst[i] = (float)t0;
-        dst[i+1] = (float)t1;
-
-        t0 = src[i+2];
-        t1 = src[i+3];
-
-        dst[i+2] = (float)t0;
-        dst[i+3] = (float)t1;
-    }
-
-    for( ; i < len; i++ )
-        dst[i] = (float)src[i];
-
-    return CV_OK;
-}
-
-
-CvStatus CV_STDCALL icvScale_32f( const float* src, float* dst, int len, float a, float b )
-{
-    int i;
-    for( i = 0; i <= len - 4; i += 4 )
-    {
-        double t0 = src[i]*a + b;
-        double t1 = src[i+1]*a + b;
-
-        dst[i] = (float)t0;
-        dst[i+1] = (float)t1;
-
-        t0 = src[i+2]*a + b;
-        t1 = src[i+3]*a + b;
-
-        dst[i+2] = (float)t0;
-        dst[i+3] = (float)t1;
-    }
-
-    for( ; i < len; i++ )
-        dst[i] = (float)(src[i]*a + b);
-
-    return CV_OK;
-}
-
-
-CvStatus CV_STDCALL icvScale_64f( const double* src, double* dst, int len, double a, double b )
-{
-    int i;
-    for( i = 0; i <= len - 4; i += 4 )
-    {
-        double t0 = src[i]*a + b;
-        double t1 = src[i+1]*a + b;
-
-        dst[i] = t0;
-        dst[i+1] = t1;
-
-        t0 = src[i+2]*a + b;
-        t1 = src[i+3]*a + b;
-
-        dst[i+2] = t0;
-        dst[i+3] = t1;
-    }
-
-    for( ; i < len; i++ )
-        dst[i] = src[i]*a + b;
-
-    return CV_OK;
-}
-
-/* End of file. */