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/* ////////////////////////////////////////////////////////////////////
436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  CvMat basic operations: cvCopy, cvSet
456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// */
476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "_cxcore.h"
496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/////////////////////////////////////////////////////////////////////////////////////////
516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//                                                                                     //
526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//                                  L/L COPY & SET FUNCTIONS                           //
536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//                                                                                     //
546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/////////////////////////////////////////////////////////////////////////////////////////
556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIPCVAPI_IMPL( CvStatus, icvCopy_8u_C1R, ( const uchar* src, int srcstep,
586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                          uchar* dst, int dststep, CvSize size ),
596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                          (src, srcstep, dst, dststep, size) )
606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src += srcstep, dst += dststep )
626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        memcpy( dst, src, size.width );
636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return  CV_OK;
656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL
696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvSet_8u_C1R( uchar* dst, int dst_step, CvSize size,
706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn               const void* scalar, int pix_size )
716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int copy_len = 12*pix_size;
736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uchar* dst_limit = dst + size.width;
746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( size.height-- )
766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        while( dst + copy_len <= dst_limit )
786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            memcpy( dst, scalar, copy_len );
806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst += copy_len;
816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        memcpy( dst, scalar, dst_limit - dst );
846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( size.height )
876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dst = dst_limit - size.width + dst_step;
896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( ; size.height--; dst += dst_step )
916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            memcpy( dst, dst - dst_step, size.width );
926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;
956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/////////////////////////////////////////////////////////////////////////////////////////
996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//                                                                                     //
1006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//                                L/L COPY WITH MASK FUNCTIONS                         //
1016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//                                                                                     //
1026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/////////////////////////////////////////////////////////////////////////////////////////
1036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_COPY_MASK_C1_CASE( type )   \
1066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( i = 0; i <= size.width-2; i += 2 ) \
1076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                       \
1086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( mask[i] )                       \
1096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i] = src[i];                \
1106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( mask[i+1] )                     \
1116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i+1] = src[i+1];            \
1126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                       \
1136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            \
1146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; i < size.width; i++ )            \
1156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                       \
1166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( mask[i] )                       \
1176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i] = src[i];                \
1186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
1196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_COPY_MASK_C3_CASE( type )   \
1216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( i = 0; i < size.width; i++ )       \
1226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( mask[i] )                       \
1236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                   \
1246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            type t0 = src[i*3];             \
1256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            type t1 = src[i*3+1];           \
1266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            type t2 = src[i*3+2];           \
1276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            \
1286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i*3] = t0;                  \
1296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i*3+1] = t1;                \
1306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i*3+2] = t2;                \
1316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
1326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_COPY_MASK_C4_CASE( type )   \
1366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( i = 0; i < size.width; i++ )       \
1376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( mask[i] )                       \
1386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                   \
1396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            type t0 = src[i*4];             \
1406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            type t1 = src[i*4+1];           \
1416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i*4] = t0;                  \
1426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i*4+1] = t1;                \
1436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            \
1446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t0 = src[i*4+2];                \
1456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t1 = src[i*4+3];                \
1466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i*4+2] = t0;                \
1476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i*4+3] = t1;                \
1486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
1496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_COPY_MASK_2D( name, type, cn )              \
1526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIPCVAPI_IMPL( CvStatus,                                     \
1536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennname,( const type* src, int srcstep, type* dst, int dststep,\
1546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn       CvSize size, const uchar* mask, int maskstep ),      \
1556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn       (src, srcstep, dst, dststep, size, mask, maskstep))  \
1566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                           \
1576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep /= sizeof(src[0]); dststep /= sizeof(dst[0]);   \
1586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src += srcstep,                   \
1596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst += dststep, mask += maskstep )              \
1606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                       \
1616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int i;                                              \
1626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ICV_DEF_COPY_MASK_C##cn##_CASE( type )              \
1636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                       \
1646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                            \
1656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return  CV_OK;                                          \
1666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
1676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_SET_MASK_C1_CASE( type )    \
1706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( i = 0; i <= size.width-2; i += 2 ) \
1716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                       \
1726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( mask[i] )                       \
1736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i] = s0;                    \
1746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( mask[i+1] )                     \
1756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i+1] = s0;                  \
1766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                       \
1776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            \
1786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; i < size.width; i++ )            \
1796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                       \
1806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( mask[i] )                       \
1816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i] = s0;                    \
1826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
1836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_SET_MASK_C3_CASE( type )    \
1866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( i = 0; i < size.width; i++ )       \
1876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( mask[i] )                       \
1886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                   \
1896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i*3] = s0;                  \
1906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i*3+1] = s1;                \
1916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i*3+2] = s2;                \
1926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
1936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_SET_MASK_C4_CASE( type )    \
1956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( i = 0; i < size.width; i++ )       \
1966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( mask[i] )                       \
1976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                   \
1986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i*4] = s0;                  \
1996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i*4+1] = s1;                \
2006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i*4+2] = s2;                \
2016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i*4+3] = s3;                \
2026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
2036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_SET_MASK_2D( name, type, cn )       \
2056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIPCVAPI_IMPL( CvStatus,                             \
2066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennname,( type* dst, int dststep,                      \
2076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn       const uchar* mask, int maskstep,             \
2086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn       CvSize size, const type* scalar ),           \
2096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn       (dst, dststep, mask, maskstep, size, scalar))\
2106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                   \
2116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_UN_ENTRY_C##cn( type );                      \
2126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dststep /= sizeof(dst[0]);                      \
2136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                    \
2146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; mask += maskstep,         \
2156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                          dst += dststep )          \
2166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                               \
2176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int i;                                      \
2186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ICV_DEF_SET_MASK_C##cn##_CASE( type )       \
2196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                               \
2206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                    \
2216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                   \
2226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_SET_MASK_2D( icvSet_8u_C1MR, uchar, 1 )
2266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_SET_MASK_2D( icvSet_16s_C1MR, ushort, 1 )
2276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_SET_MASK_2D( icvSet_8u_C3MR, uchar, 3 )
2286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_SET_MASK_2D( icvSet_8u_C4MR, int, 1 )
2296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_SET_MASK_2D( icvSet_16s_C3MR, ushort, 3 )
2306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_SET_MASK_2D( icvSet_16s_C4MR, int64, 1 )
2316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_SET_MASK_2D( icvSet_32f_C3MR, int, 3 )
2326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_SET_MASK_2D( icvSet_32f_C4MR, int, 4 )
2336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_SET_MASK_2D( icvSet_64s_C3MR, int64, 3 )
2346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_SET_MASK_2D( icvSet_64s_C4MR, int64, 4 )
2356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_COPY_MASK_2D( icvCopy_8u_C1MR, uchar, 1 )
2376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_COPY_MASK_2D( icvCopy_16s_C1MR, ushort, 1 )
2386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_COPY_MASK_2D( icvCopy_8u_C3MR, uchar, 3 )
2396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_COPY_MASK_2D( icvCopy_8u_C4MR, int, 1 )
2406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_COPY_MASK_2D( icvCopy_16s_C3MR, ushort, 3 )
2416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_COPY_MASK_2D( icvCopy_16s_C4MR, int64, 1 )
2426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_COPY_MASK_2D( icvCopy_32f_C3MR, int, 3 )
2436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_COPY_MASK_2D( icvCopy_32f_C4MR, int, 4 )
2446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_COPY_MASK_2D( icvCopy_64s_C3MR, int64, 3 )
2456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_COPY_MASK_2D( icvCopy_64s_C4MR, int64, 4 )
2466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_DEF_INIT_COPYSET_TAB_2D( FUNCNAME, FLAG )                \
2486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic void icvInit##FUNCNAME##FLAG##Table( CvBtFuncTable* table )  \
2496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                   \
2506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    table->fn_2d[1]  = (void*)icv##FUNCNAME##_8u_C1##FLAG;          \
2516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    table->fn_2d[2]  = (void*)icv##FUNCNAME##_16s_C1##FLAG;         \
2526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    table->fn_2d[3]  = (void*)icv##FUNCNAME##_8u_C3##FLAG;          \
2536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    table->fn_2d[4]  = (void*)icv##FUNCNAME##_8u_C4##FLAG;          \
2546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    table->fn_2d[6]  = (void*)icv##FUNCNAME##_16s_C3##FLAG;         \
2556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    table->fn_2d[8]  = (void*)icv##FUNCNAME##_16s_C4##FLAG;         \
2566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    table->fn_2d[12] = (void*)icv##FUNCNAME##_32f_C3##FLAG;         \
2576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    table->fn_2d[16] = (void*)icv##FUNCNAME##_32f_C4##FLAG;         \
2586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    table->fn_2d[24] = (void*)icv##FUNCNAME##_64s_C3##FLAG;         \
2596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    table->fn_2d[32] = (void*)icv##FUNCNAME##_64s_C4##FLAG;         \
2606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_DEF_INIT_COPYSET_TAB_2D( Set, MR )
2636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_DEF_INIT_COPYSET_TAB_2D( Copy, MR )
2646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/////////////////////////////////////////////////////////////////////////////////////////
2666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//                                                                                     //
2676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//                                H/L COPY & SET FUNCTIONS                             //
2686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//                                                                                     //
2696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/////////////////////////////////////////////////////////////////////////////////////////
2706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvCopyMaskFunc
2736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvGetCopyMaskFunc( int elem_size )
2746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static CvBtFuncTable copym_tab;
2766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static int inittab = 0;
2776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !inittab )
2796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
2806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvInitCopyMRTable( &copym_tab );
2816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        inittab = 1;
2826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
2836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return (CvCopyMaskFunc)copym_tab.fn_2d[elem_size];
2846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* dst = src */
2886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
2896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvCopy( const void* srcarr, void* dstarr, const void* maskarr )
2906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvCopy" );
2926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
2946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int pix_size;
2966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat srcstub, *src = (CvMat*)srcarr;
2976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat dststub, *dst = (CvMat*)dstarr;
2986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize size;
2996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT(src) || !CV_IS_MAT(dst) )
3016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
3026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_IS_SPARSE_MAT(src) && CV_IS_SPARSE_MAT(dst))
3036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
3046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CvSparseMat* src1 = (CvSparseMat*)src;
3056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CvSparseMat* dst1 = (CvSparseMat*)dst;
3066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CvSparseMatIterator iterator;
3076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CvSparseNode* node;
3086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst1->dims = src1->dims;
3106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            memcpy( dst1->size, src1->size, src1->dims*sizeof(src1->size[0]));
3116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst1->valoffset = src1->valoffset;
3126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst1->idxoffset = src1->idxoffset;
3136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            cvClearSet( dst1->heap );
3146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( src1->heap->active_count >= dst1->hashsize*CV_SPARSE_HASH_RATIO )
3166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
3176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_CALL( cvFree( &dst1->hashtable ));
3186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst1->hashsize = src1->hashsize;
3196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_CALL( dst1->hashtable =
3206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    (void**)cvAlloc( dst1->hashsize*sizeof(dst1->hashtable[0])));
3216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
3226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            memset( dst1->hashtable, 0, dst1->hashsize*sizeof(dst1->hashtable[0]));
3246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( node = cvInitSparseMatIterator( src1, &iterator );
3266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                 node != 0; node = cvGetNextSparseNode( &iterator ))
3276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
3286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CvSparseNode* node_copy = (CvSparseNode*)cvSetNew( dst1->heap );
3296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int tabidx = node->hashval & (dst1->hashsize - 1);
3306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_MEMCPY_AUTO( node_copy, node, dst1->heap->elem_size );
3316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                node_copy->next = (CvSparseNode*)dst1->hashtable[tabidx];
3326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst1->hashtable[tabidx] = node_copy;
3336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
3346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            EXIT;
3356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
3366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else if( CV_IS_MATND(src) || CV_IS_MATND(dst) )
3376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
3386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CvArr* arrs[] = { src, dst };
3396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CvMatND stubs[3];
3406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CvNArrayIterator iterator;
3416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( cvInitNArrayIterator( 2, arrs, maskarr, stubs, &iterator ));
3436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            pix_size = CV_ELEM_SIZE(iterator.hdr[0]->type);
3446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( !maskarr )
3466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
3476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                iterator.size.width *= pix_size;
3486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( iterator.size.width <= CV_MAX_INLINE_MAT_OP_SIZE*(int)sizeof(double))
3496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
3506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    do
3516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    {
3526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        memcpy( iterator.ptr[1], iterator.ptr[0], iterator.size.width );
3536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    }
3546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    while( cvNextNArraySlice( &iterator ));
3556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
3566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                else
3576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
3586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    do
3596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    {
3606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        icvCopy_8u_C1R( iterator.ptr[0], CV_STUB_STEP,
3616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                        iterator.ptr[1], CV_STUB_STEP, iterator.size );
3626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    }
3636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    while( cvNextNArraySlice( &iterator ));
3646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
3656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
3666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
3676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
3686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CvCopyMaskFunc func = icvGetCopyMaskFunc( pix_size );
3696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( !func )
3706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    CV_ERROR( CV_StsUnsupportedFormat, "" );
3716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                do
3736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
3746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    func( iterator.ptr[0], CV_STUB_STEP,
3756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                          iterator.ptr[1], CV_STUB_STEP,
3766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                          iterator.size,
3776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                          iterator.ptr[2], CV_STUB_STEP );
3786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
3796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                while( cvNextNArraySlice( &iterator ));
3806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
3816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            EXIT;
3826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
3836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
3846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
3856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int coi1 = 0, coi2 = 0;
3866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( src = cvGetMat( src, &srcstub, &coi1 ));
3876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( dst = cvGetMat( dst, &dststub, &coi2 ));
3886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( coi1 )
3906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
3916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CvArr* planes[] = { 0, 0, 0, 0 };
3926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( maskarr )
3946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    CV_ERROR( CV_StsBadArg, "COI + mask are not supported" );
3956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                planes[coi1-1] = dst;
3976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_CALL( cvSplit( src, planes[0], planes[1], planes[2], planes[3] ));
3986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                EXIT;
3996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
4006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else if( coi2 )
4016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
4026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CvArr* planes[] = { 0, 0, 0, 0 };
4036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( maskarr )
4056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    CV_ERROR( CV_StsBadArg, "COI + mask are not supported" );
4066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                planes[coi2-1] = src;
4086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_CALL( cvMerge( planes[0], planes[1], planes[2], planes[3], dst ));
4096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                EXIT;
4106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
4116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
4126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
4136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_TYPES_EQ( src, dst ))
4156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR_FROM_CODE( CV_StsUnmatchedFormats );
4166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_SIZES_EQ( src, dst ))
4186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR_FROM_CODE( CV_StsUnmatchedSizes );
4196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size = cvGetMatSize( src );
4216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    pix_size = CV_ELEM_SIZE(src->type);
4226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !maskarr )
4246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
4256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int src_step = src->step, dst_step = dst->step;
4266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size.width *= pix_size;
4276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_IS_MAT_CONT( src->type & dst->type ) && (src_step == dst_step) && (src_step == src->width * pix_size))
4286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
4296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size.width *= size.height;
4306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( size.width <= CV_MAX_INLINE_MAT_OP_SIZE*
4326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                              CV_MAX_INLINE_MAT_OP_SIZE*(int)sizeof(double))
4336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
4346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                memcpy( dst->data.ptr, src->data.ptr, size.width );
4356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                EXIT;
4366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
4376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size.height = 1;
4396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            src_step = dst_step = CV_STUB_STEP;
4406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
4416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( src->data.ptr != dst->data.ptr )
4436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            icvCopy_8u_C1R( src->data.ptr, src_step,
4446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            dst->data.ptr, dst_step, size );
4456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
4466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
4476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
4486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvCopyMaskFunc func = icvGetCopyMaskFunc(pix_size);
4496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvMat maskstub, *mask = (CvMat*)maskarr;
4506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int src_step = src->step;
4516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int dst_step = dst->step;
4526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int mask_step;
4536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_IS_MAT( mask ))
4556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( mask = cvGetMat( mask, &maskstub ));
4566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_IS_MASK_ARR( mask ))
4576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsBadMask, "" );
4586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_ARE_SIZES_EQ( src, mask ))
4606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsUnmatchedSizes, "" );
4616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        mask_step = mask->step;
4636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_IS_MAT_CONT( src->type & dst->type & mask->type ))
4656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
4666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size.width *= size.height;
4676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size.height = 1;
4686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            src_step = dst_step = mask_step = CV_STUB_STEP;
4696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
4706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !func )
4726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsUnsupportedFormat, "" );
4736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IPPI_CALL( func( src->data.ptr, src_step, dst->data.ptr, dst_step,
4756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                         size, mask->data.ptr, mask_step ));
4766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
4776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
4796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
4806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* dst(idx) = value */
4836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
4846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvSet( void* arr, CvScalar value, const void* maskarr )
4856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
4866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static CvBtFuncTable setm_tab;
4876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static int inittab = 0;
4886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvSet" );
4906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
4926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat stub, *mat = (CvMat*)arr;
4946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int pix_size, type;
4956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double buf[12];
4966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int mat_step;
4976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize size;
4986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !value.val[0] && !value.val[1] &&
5006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        !value.val[2] && !value.val[3] && !maskarr )
5016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
5026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cvZero( arr );
5036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        EXIT;
5046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
5056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT(mat))
5076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
5086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_IS_MATND(mat))
5096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
5106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CvMatND nstub;
5116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CvNArrayIterator iterator;
5126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int pix_size1;
5136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( cvInitNArrayIterator( 1, &arr, maskarr, &nstub, &iterator ));
5156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            type = CV_MAT_TYPE(iterator.hdr[0]->type);
5176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            pix_size1 = CV_ELEM_SIZE1(type);
5186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            pix_size = pix_size1*CV_MAT_CN(type);
5196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( cvScalarToRawData( &value, buf, type, maskarr == 0 ));
5216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( !maskarr )
5236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
5246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                iterator.size.width *= pix_size;
5256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                do
5266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
5276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    icvSet_8u_C1R( iterator.ptr[0], CV_STUB_STEP,
5286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                   iterator.size, buf, pix_size1 );
5296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
5306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                while( cvNextNArraySlice( &iterator ));
5316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
5326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
5336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
5346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CvFunc2D_2A1P func = (CvFunc2D_2A1P)(setm_tab.fn_2d[pix_size]);
5356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( !func )
5366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    CV_ERROR( CV_StsUnsupportedFormat, "" );
5376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                do
5396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
5406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    func( iterator.ptr[0], CV_STUB_STEP,
5416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                          iterator.ptr[1], CV_STUB_STEP,
5426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                          iterator.size, buf );
5436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
5446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                while( cvNextNArraySlice( &iterator ));
5456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
5466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            EXIT;
5476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
5486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
5496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
5506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int coi = 0;
5516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( mat = cvGetMat( mat, &stub, &coi ));
5526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( coi != 0 )
5546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_ERROR( CV_BadCOI, "" );
5556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
5566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
5576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    type = CV_MAT_TYPE( mat->type );
5596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    pix_size = CV_ELEM_SIZE(type);
5606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size = cvGetMatSize( mat );
5616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    mat_step = mat->step;
5626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !maskarr )
5646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
5656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_IS_MAT_CONT( mat->type ))
5666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
5676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size.width *= size.height;
5686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( size.width <= (int)(CV_MAX_INLINE_MAT_OP_SIZE*sizeof(double)))
5706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
5716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( type == CV_32FC1 )
5726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
5736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    float* dstdata = (float*)(mat->data.ptr);
5746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    float val = (float)value.val[0];
5756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    do
5776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    {
5786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        dstdata[size.width-1] = val;
5796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    }
5806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    while( --size.width );
5816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    EXIT;
5836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
5846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( type == CV_64FC1 )
5866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
5876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    double* dstdata = (double*)(mat->data.ptr);
5886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    double val = value.val[0];
5896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    do
5916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    {
5926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        dstdata[size.width-1] = val;
5936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    }
5946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    while( --size.width );
5956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    EXIT;
5976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
5986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
5996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            mat_step = CV_STUB_STEP;
6016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size.height = 1;
6026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
6036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size.width *= pix_size;
6056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( cvScalarToRawData( &value, buf, type, 1 ));
6066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IPPI_CALL( icvSet_8u_C1R( mat->data.ptr, mat_step, size, buf,
6086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                  CV_ELEM_SIZE1(type)));
6096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
6106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
6116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
6126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvFunc2D_2A1P func;
6136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvMat maskstub, *mask = (CvMat*)maskarr;
6146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int mask_step;
6156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( mask = cvGetMat( mask, &maskstub ));
6176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_IS_MASK_ARR( mask ))
6196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsBadMask, "" );
6206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !inittab )
6226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
6236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            icvInitSetMRTable( &setm_tab );
6246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            inittab = 1;
6256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
6266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_ARE_SIZES_EQ( mat, mask ))
6286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsUnmatchedSizes, "" );
6296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        mask_step = mask->step;
6316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_IS_MAT_CONT( mat->type & mask->type ))
6336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
6346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size.width *= size.height;
6356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            mat_step = mask_step = CV_STUB_STEP;
6366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size.height = 1;
6376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
6386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        func = (CvFunc2D_2A1P)(setm_tab.fn_2d[pix_size]);
6406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !func )
6416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsUnsupportedFormat, "" );
6426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( cvScalarToRawData( &value, buf, type, 0 ));
6446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IPPI_CALL( func( mat->data.ptr, mat_step, mask->data.ptr,
6466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                         mask_step, size, buf ));
6476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
6486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
6506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
6516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
6546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                                          Clearing                                      *
6556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
6566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvSetByte_8u_C1R_t icvSetByte_8u_C1R_p = 0;
6586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvStatus CV_STDCALL
6606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvSetZero_8u_C1R( uchar* dst, int dststep, CvSize size )
6616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
6626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( size.width + size.height > 256 && icvSetByte_8u_C1R_p )
6636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return icvSetByte_8u_C1R_p( 0, dst, dststep, size );
6646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; dst += dststep )
6666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        memset( dst, 0, size.width );
6676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;
6696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
6706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
6726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvSetZero( CvArr* arr )
6736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
6746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvSetZero" );
6756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
6776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat stub, *mat = (CvMat*)arr;
6796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize size;
6806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int mat_step;
6816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT( mat ))
6836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
6846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_IS_MATND(mat))
6856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
6866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CvMatND nstub;
6876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CvNArrayIterator iterator;
6886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( cvInitNArrayIterator( 1, &arr, 0, &nstub, &iterator ));
6906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            iterator.size.width *= CV_ELEM_SIZE(iterator.hdr[0]->type);
6916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( iterator.size.width <= CV_MAX_INLINE_MAT_OP_SIZE*(int)sizeof(double) )
6936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
6946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                do
6956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
6966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    memset( iterator.ptr[0], 0, iterator.size.width );
6976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
6986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                while( cvNextNArraySlice( &iterator ));
6996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
7006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
7016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
7026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                do
7036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
7046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    icvSetZero_8u_C1R( iterator.ptr[0], CV_STUB_STEP, iterator.size );
7056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
7066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                while( cvNextNArraySlice( &iterator ));
7076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
7086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            EXIT;
7096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
7106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else if( CV_IS_SPARSE_MAT(mat))
7116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
7126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CvSparseMat* mat1 = (CvSparseMat*)mat;
7136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            cvClearSet( mat1->heap );
7146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( mat1->hashtable )
7156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                memset( mat1->hashtable, 0, mat1->hashsize*sizeof(mat1->hashtable[0]));
7166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            EXIT;
7176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
7186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
7196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
7206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int coi = 0;
7216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( mat = cvGetMat( mat, &stub, &coi ));
7226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( coi != 0 )
7236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_ERROR( CV_BadCOI, "coi is not supported" );
7246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
7256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
7266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size = cvGetMatSize( mat );
7286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size.width *= CV_ELEM_SIZE(mat->type);
7296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    mat_step = mat->step;
7306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_IS_MAT_CONT( mat->type ))
7326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
7336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size.width *= size.height;
7346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( size.width <= CV_MAX_INLINE_MAT_OP_SIZE*(int)sizeof(double) )
7366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
7376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            memset( mat->data.ptr, 0, size.width );
7386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            EXIT;
7396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
7406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        mat_step = CV_STUB_STEP;
7426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size.height = 1;
7436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
7446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    IPPI_CALL( icvSetZero_8u_C1R( mat->data.ptr, mat_step, size ));
7466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
7486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
7496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
7526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                                          Flipping                                      *
7536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
7546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_FLIP_HZ_CASE_C1( type ) \
7566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( i = 0; i < (len+1)/2; i++ )    \
7576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                   \
7586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        type t0 = src[i];               \
7596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        type t1 = src[len - i - 1];     \
7606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dst[i] = t1;                    \
7616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dst[len - i - 1] = t0;          \
7626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
7636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_FLIP_HZ_CASE_C3( type ) \
7666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( i = 0; i < (len+1)/2; i++ )    \
7676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                   \
7686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        type t0 = src[i*3];             \
7696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        type t1 = src[(len - i)*3 - 3]; \
7706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dst[i*3] = t1;                  \
7716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dst[(len - i)*3 - 3] = t0;      \
7726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t0 = src[i*3 + 1];              \
7736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t1 = src[(len - i)*3 - 2];      \
7746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dst[i*3 + 1] = t1;              \
7756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dst[(len - i)*3 - 2] = t0;      \
7766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t0 = src[i*3 + 2];              \
7776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t1 = src[(len - i)*3 - 1];      \
7786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dst[i*3 + 2] = t1;              \
7796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dst[(len - i)*3 - 1] = t0;      \
7806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
7816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_FLIP_HZ_CASE_C4( type ) \
7846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( i = 0; i < (len+1)/2; i++ )    \
7856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                   \
7866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        type t0 = src[i*4];             \
7876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        type t1 = src[(len - i)*4 - 4]; \
7886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dst[i*4] = t1;                  \
7896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dst[(len - i)*4 - 4] = t0;      \
7906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t0 = src[i*4 + 1];              \
7916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t1 = src[(len - i)*4 - 3];      \
7926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dst[i*4 + 1] = t1;              \
7936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dst[(len - i)*4 - 3] = t0;      \
7946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t0 = src[i*4 + 2];              \
7956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t1 = src[(len - i)*4 - 2];      \
7966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dst[i*4 + 2] = t1;              \
7976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dst[(len - i)*4 - 2] = t0;      \
7986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t0 = src[i*4 + 3];              \
7996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t1 = src[(len - i)*4 - 1];      \
8006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dst[i*4 + 3] = t1;              \
8016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dst[(len - i)*4 - 1] = t0;      \
8026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
8036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_FLIP_HZ_FUNC( flavor, arrtype, cn )                 \
8066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL                                          \
8076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvFlipHorz_##flavor( const arrtype* src, int srcstep,              \
8086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                      arrtype* dst, int dststep, CvSize size )      \
8096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                   \
8106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i, len = size.width;                                        \
8116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep /= sizeof(src[0]); dststep /= sizeof(dst[0]);           \
8126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                    \
8136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src += srcstep, dst += dststep )          \
8146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                               \
8156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ICV_DEF_FLIP_HZ_CASE_C##cn( arrtype )                       \
8166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                               \
8176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                    \
8186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                                   \
8196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
8206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_FLIP_HZ_FUNC( 8u_C1R, uchar, 1 )
8236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_FLIP_HZ_FUNC( 8u_C2R, ushort, 1 )
8246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_FLIP_HZ_FUNC( 8u_C3R, uchar, 3 )
8256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_FLIP_HZ_FUNC( 16u_C2R, int, 1 )
8266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_FLIP_HZ_FUNC( 16u_C3R, ushort, 3 )
8276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_FLIP_HZ_FUNC( 32s_C2R, int64, 1 )
8286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_FLIP_HZ_FUNC( 32s_C3R, int, 3 )
8296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_FLIP_HZ_FUNC( 64s_C2R, int, 4 )
8306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_FLIP_HZ_FUNC( 64s_C3R, int64, 3 )
8316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_FLIP_HZ_FUNC( 64s_C4R, int64, 4 )
8326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_DEF_INIT_PIXSIZE_TAB_2D( FlipHorz, R )
8346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus
8376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvFlipVert_8u_C1R( const uchar* src, int srcstep,
8386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    uchar* dst, int dststep, CvSize size )
8396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
8406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int y, i;
8416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    const uchar* src1 = src + (size.height - 1)*srcstep;
8426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uchar* dst1 = dst + (size.height - 1)*dststep;
8436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( y = 0; y < (size.height + 1)/2; y++, src += srcstep, src1 -= srcstep,
8456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                              dst += dststep, dst1 -= dststep )
8466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
8476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        i = 0;
8486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( ((size_t)(src)|(size_t)(dst)|(size_t)src1|(size_t)dst1) % sizeof(int) == 0 )
8496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
8506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( ; i <= size.width - 16; i += 16 )
8516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
8526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int t0 = ((int*)(src + i))[0];
8536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int t1 = ((int*)(src1 + i))[0];
8546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                ((int*)(dst + i))[0] = t1;
8566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                ((int*)(dst1 + i))[0] = t0;
8576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                t0 = ((int*)(src + i))[1];
8596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                t1 = ((int*)(src1 + i))[1];
8606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                ((int*)(dst + i))[1] = t1;
8626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                ((int*)(dst1 + i))[1] = t0;
8636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                t0 = ((int*)(src + i))[2];
8656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                t1 = ((int*)(src1 + i))[2];
8666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                ((int*)(dst + i))[2] = t1;
8686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                ((int*)(dst1 + i))[2] = t0;
8696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                t0 = ((int*)(src + i))[3];
8716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                t1 = ((int*)(src1 + i))[3];
8726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                ((int*)(dst + i))[3] = t1;
8746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                ((int*)(dst1 + i))[3] = t0;
8756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
8766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( ; i <= size.width - 4; i += 4 )
8786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
8796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int t0 = ((int*)(src + i))[0];
8806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int t1 = ((int*)(src1 + i))[0];
8816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                ((int*)(dst + i))[0] = t1;
8836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                ((int*)(dst1 + i))[0] = t0;
8846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
8856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
8866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( ; i < size.width; i++ )
8886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
8896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            uchar t0 = src[i];
8906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            uchar t1 = src1[i];
8916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i] = t1;
8936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst1[i] = t0;
8946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
8956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
8966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;
8986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
8996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
9026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvFlip( const CvArr* srcarr, CvArr* dstarr, int flip_mode )
9036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
9046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static CvBtFuncTable tab;
9056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static int inittab = 0;
9066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvFlip" );
9086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
9106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat sstub, *src = (CvMat*)srcarr;
9126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat dstub, *dst = (CvMat*)dstarr;
9136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize size;
9146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvFunc2D_2A func = 0;
9156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int pix_size;
9166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !inittab )
9186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
9196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvInitFlipHorzRTable( &tab );
9206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        inittab = 1;
9216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
9226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT( src ))
9246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
9256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int coi = 0;
9266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( src = cvGetMat( src, &sstub, &coi ));
9276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( coi != 0 )
9286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_BadCOI, "coi is not supported" );
9296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
9306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !dst )
9326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dst = src;
9336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( !CV_IS_MAT( dst ))
9346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
9356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int coi = 0;
9366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( dst = cvGetMat( dst, &dstub, &coi ));
9376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( coi != 0 )
9386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_BadCOI, "coi is not supported" );
9396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
9406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_TYPES_EQ( src, dst ))
9426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnmatchedFormats, "" );
9436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_SIZES_EQ( src, dst ))
9456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnmatchedSizes, "" );
9466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size = cvGetMatSize( src );
9486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    pix_size = CV_ELEM_SIZE( src->type );
9496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( flip_mode == 0 )
9516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
9526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size.width *= pix_size;
9536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IPPI_CALL( icvFlipVert_8u_C1R( src->data.ptr, src->step,
9556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                       dst->data.ptr, dst->step, size ));
9566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
9576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
9586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
9596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int inplace = src->data.ptr == dst->data.ptr;
9606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        uchar* dst_data = dst->data.ptr;
9616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int dst_step = dst->step;
9626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        func = (CvFunc2D_2A)(tab.fn_2d[pix_size]);
9646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !func )
9666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsUnsupportedFormat, "" );
9676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( flip_mode < 0 && !inplace )
9696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
9706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst_data += dst_step * (dst->height - 1);
9716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst_step = -dst_step;
9726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
9736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IPPI_CALL( func( src->data.ptr, src->step, dst_data, dst_step, size ));
9756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( flip_mode < 0 && inplace )
9776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
9786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size.width *= pix_size;
9796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            IPPI_CALL( icvFlipVert_8u_C1R( dst->data.ptr, dst->step,
9806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                           dst->data.ptr, dst->step, size ));
9816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
9826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
9836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
9856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
9866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
9896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvRepeat( const CvArr* srcarr, CvArr* dstarr )
9906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
9916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvRepeat" );
9926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
9946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat sstub, *src = (CvMat*)srcarr;
9966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat dstub, *dst = (CvMat*)dstarr;
9976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize srcsize, dstsize;
9986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int pix_size;
9996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int x, y, k, l;
10006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT( src ))
10026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
10036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int coi = 0;
10046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( src = cvGetMat( src, &sstub, &coi ));
10056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( coi != 0 )
10066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_BadCOI, "coi is not supported" );
10076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
10086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT( dst ))
10106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
10116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int coi = 0;
10126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( dst = cvGetMat( dst, &dstub, &coi ));
10136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( coi != 0 )
10146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_BadCOI, "coi is not supported" );
10156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
10166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_TYPES_EQ( src, dst ))
10186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnmatchedFormats, "" );
10196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcsize = cvGetMatSize( src );
10216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dstsize = cvGetMatSize( dst );
10226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    pix_size = CV_ELEM_SIZE( src->type );
10236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( y = 0, k = 0; y < dstsize.height; y++ )
10256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
10266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( x = 0; x < dstsize.width; x += srcsize.width )
10276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
10286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l = srcsize.width;
10296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( l > dstsize.width - x )
10306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                l = dstsize.width - x;
10316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            memcpy( dst->data.ptr + y*dst->step + x*pix_size,
10326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    src->data.ptr + k*src->step, l*pix_size );
10336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
10346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( ++k == srcsize.height )
10356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            k = 0;
10366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
10376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
10396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
10406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* End of file. */
10426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1043