16acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*M///////////////////////////////////////////////////////////////////////////////////////
26acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
36acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
46acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
56acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  By downloading, copying, installing or using the software you agree to this license.
66acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  If you do not agree to this license, do not download, install,
76acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  copy or use the software.
86acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
96acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//                        Intel License Agreement
116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//                For Open Source Computer Vision Library
126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Copyright (C) 2000, Intel Corporation, all rights reserved.
146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Third party copyrights are property of their respective owners.
156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Redistribution and use in source and binary forms, with or without modification,
176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// are permitted provided that the following conditions are met:
186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//   * Redistribution's of source code must retain the above copyright notice,
206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     this list of conditions and the following disclaimer.
216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//   * Redistribution's in binary form must reproduce the above copyright notice,
236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     this list of conditions and the following disclaimer in the documentation
246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     and/or other materials provided with the distribution.
256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//   * The name of Intel Corporation may not be used to endorse or promote products
276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     derived from this software without specific prior written permission.
286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// This software is provided by the copyright holders and contributors "as is" and
306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// any express or implied warranties, including, but not limited to, the implied
316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// warranties of merchantability and fitness for a particular purpose are disclaimed.
326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// In no event shall the Intel Corporation or contributors be liable for any direct,
336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// indirect, incidental, special, exemplary, or consequential damages
346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// (including, but not limited to, procurement of substitute goods or services;
356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// loss of use, data, or profits; or business interruption) however caused
366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// and on any theory of liability, whether in contract, strict liability,
376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// or tort (including negligence or otherwise) arising in any way out of
386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// the use of this software, even if advised of the possibility of such damage.
396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//M*/
416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "_cv.h"
436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  ICV_DEF_ACC_FUNC( name, srctype, dsttype, cvtmacro )           \
456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIPCVAPI_IMPL( CvStatus,                                                 \
466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennname,( const srctype *src, int srcstep, dsttype *dst,                   \
476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn       int dststep, CvSize size ), (src, srcstep, dst, dststep, size )) \
486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                       \
506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep /= sizeof(src[0]);                                          \
516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dststep /= sizeof(dst[0]);                                          \
526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src += srcstep, dst += dststep )              \
546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                   \
556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int x;                                                          \
566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( x = 0; x <= size.width - 4; x += 4 )                       \
576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                               \
586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dsttype t0 = dst[x] + cvtmacro(src[x]);                     \
596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dsttype t1 = dst[x + 1] + cvtmacro(src[x + 1]);             \
606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[x] = t0;  dst[x + 1] = t1;                              \
616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t0 = dst[x + 2] + cvtmacro(src[x + 2]);                     \
636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t1 = dst[x + 3] + cvtmacro(src[x + 3]);                     \
646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[x + 2] = t0;  dst[x + 3] = t1;                          \
656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                               \
666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( ; x < size.width; x++ )                                    \
686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[x] += cvtmacro(src[x]);                                 \
696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                   \
706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                                       \
726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_ACC_FUNC( icvAdd_8u32f_C1IR, uchar, float, CV_8TO32F )
766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_ACC_FUNC( icvAdd_32f_C1IR, float, float, CV_NOP )
776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_ACC_FUNC( icvAddSquare_8u32f_C1IR, uchar, float, CV_8TO32F_SQR )
786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_ACC_FUNC( icvAddSquare_32f_C1IR, float, float, CV_SQR )
796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  ICV_DEF_ACCPROD_FUNC( flavor, srctype, dsttype, cvtmacro )         \
826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIPCVAPI_IMPL( CvStatus, icvAddProduct_##flavor##_C1IR,                      \
836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn( const srctype *src1, int step1, const srctype *src2, int step2,           \
846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  dsttype *dst, int dststep, CvSize size ),                                 \
856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn (src1, step1, src2, step2, dst, dststep, size) )                           \
866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                           \
876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step1 /= sizeof(src1[0]);                                               \
886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step2 /= sizeof(src2[0]);                                               \
896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dststep /= sizeof(dst[0]);                                              \
906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src1 += step1, src2 += step2, dst += dststep )    \
926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                       \
936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int x;                                                              \
946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( x = 0; x <= size.width - 4; x += 4 )                           \
956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                                   \
966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dsttype t0 = dst[x] + cvtmacro(src1[x])*cvtmacro(src2[x]);      \
976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dsttype t1 = dst[x+1] + cvtmacro(src1[x+1])*cvtmacro(src2[x+1]);\
986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[x] = t0;  dst[x + 1] = t1;                                  \
996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
1006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t0 = dst[x + 2] + cvtmacro(src1[x + 2])*cvtmacro(src2[x + 2]);  \
1016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t1 = dst[x + 3] + cvtmacro(src1[x + 3])*cvtmacro(src2[x + 3]);  \
1026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[x + 2] = t0;  dst[x + 3] = t1;                              \
1036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                                   \
1046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
1056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( ; x < size.width; x++ )                                        \
1066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[x] += cvtmacro(src1[x])*cvtmacro(src2[x]);                  \
1076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                       \
1086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
1096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                                           \
1106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
1116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_ACCPROD_FUNC( 8u32f, uchar, float, CV_8TO32F )
1146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_ACCPROD_FUNC( 32f, float, float, CV_NOP )
1156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  ICV_DEF_ACCWEIGHT_FUNC( flavor, srctype, dsttype, cvtmacro )   \
1186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIPCVAPI_IMPL( CvStatus, icvAddWeighted_##flavor##_C1IR,                 \
1196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn( const srctype *src, int srcstep, dsttype *dst, int dststep,           \
1206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  CvSize size, dsttype alpha ), (src, srcstep, dst, dststep, size, alpha) )\
1216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                       \
1226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dsttype beta = (dsttype)(1 - alpha);                                \
1236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep /= sizeof(src[0]);                                          \
1246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dststep /= sizeof(dst[0]);                                          \
1256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
1266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src += srcstep, dst += dststep )              \
1276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                   \
1286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int x;                                                          \
1296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( x = 0; x <= size.width - 4; x += 4 )                       \
1306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                               \
1316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dsttype t0 = dst[x]*beta + cvtmacro(src[x])*alpha;          \
1326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dsttype t1 = dst[x+1]*beta + cvtmacro(src[x+1])*alpha;      \
1336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[x] = t0; dst[x + 1] = t1;                               \
1346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
1356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t0 = dst[x + 2]*beta + cvtmacro(src[x + 2])*alpha;          \
1366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t1 = dst[x + 3]*beta + cvtmacro(src[x + 3])*alpha;          \
1376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[x + 2] = t0; dst[x + 3] = t1;                           \
1386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                               \
1396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
1406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( ; x < size.width; x++ )                                    \
1416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[x] = dst[x]*beta + cvtmacro(src[x])*alpha;              \
1426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                   \
1436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
1446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                                       \
1456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
1466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_ACCWEIGHT_FUNC( 8u32f, uchar, float, CV_8TO32F )
1496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_ACCWEIGHT_FUNC( 32f, float, float, CV_NOP )
1506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  ICV_DEF_ACCMASK_FUNC_C1( name, srctype, dsttype, cvtmacro )    \
1536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIPCVAPI_IMPL( CvStatus,                                                 \
1546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennname,( const srctype *src, int srcstep, const uchar* mask, int maskstep,\
1556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn       dsttype *dst, int dststep, CvSize size ),                        \
1566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn       (src, srcstep, mask, maskstep, dst, dststep, size ))             \
1576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                       \
1586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep /= sizeof(src[0]);                                          \
1596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dststep /= sizeof(dst[0]);                                          \
1606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
1616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src += srcstep,                               \
1626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                          dst += dststep, mask += maskstep )            \
1636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                   \
1646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int x;                                                          \
1656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( x = 0; x <= size.width - 2; x += 2 )                       \
1666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                               \
1676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( mask[x] )                                               \
1686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[x] += cvtmacro(src[x]);                             \
1696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( mask[x+1] )                                             \
1706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[x+1] += cvtmacro(src[x+1]);                         \
1716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                               \
1726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
1736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( ; x < size.width; x++ )                                    \
1746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( mask[x] )                                               \
1756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[x] += cvtmacro(src[x]);                             \
1766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                   \
1776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
1786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                                       \
1796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
1806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_ACCMASK_FUNC_C1( icvAdd_8u32f_C1IMR, uchar, float, CV_8TO32F )
1836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_ACCMASK_FUNC_C1( icvAdd_32f_C1IMR, float, float, CV_NOP )
1846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_ACCMASK_FUNC_C1( icvAddSquare_8u32f_C1IMR, uchar, float, CV_8TO32F_SQR )
1856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_ACCMASK_FUNC_C1( icvAddSquare_32f_C1IMR, float, float, CV_SQR )
1866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  ICV_DEF_ACCPRODUCTMASK_FUNC_C1( flavor, srctype, dsttype, cvtmacro )  \
1896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIPCVAPI_IMPL( CvStatus, icvAddProduct_##flavor##_C1IMR,                 \
1906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn( const srctype *src1, int step1, const srctype* src2, int step2,       \
1916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  const uchar* mask, int maskstep, dsttype *dst, int dststep, CvSize size ),\
1926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  (src1, step1, src2, step2, mask, maskstep, dst, dststep, size ))      \
1936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                       \
1946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step1 /= sizeof(src1[0]);                                           \
1956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step2 /= sizeof(src2[0]);                                           \
1966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dststep /= sizeof(dst[0]);                                          \
1976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
1986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src1 += step1, src2 += step2,                 \
1996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                          dst += dststep, mask += maskstep )            \
2006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                   \
2016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int x;                                                          \
2026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( x = 0; x <= size.width - 2; x += 2 )                       \
2036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                               \
2046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( mask[x] )                                               \
2056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[x] += cvtmacro(src1[x])*cvtmacro(src2[x]);          \
2066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( mask[x+1] )                                             \
2076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[x+1] += cvtmacro(src1[x+1])*cvtmacro(src2[x+1]);    \
2086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                               \
2096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
2106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( ; x < size.width; x++ )                                    \
2116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( mask[x] )                                               \
2126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[x] += cvtmacro(src1[x])*cvtmacro(src2[x]);          \
2136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                   \
2146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
2156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                                       \
2166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_ACCPRODUCTMASK_FUNC_C1( 8u32f, uchar, float, CV_8TO32F )
2206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_ACCPRODUCTMASK_FUNC_C1( 32f, float, float, CV_NOP )
2216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  ICV_DEF_ACCWEIGHTMASK_FUNC_C1( flavor, srctype, dsttype, cvtmacro ) \
2236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIPCVAPI_IMPL( CvStatus, icvAddWeighted_##flavor##_C1IMR,                \
2246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn( const srctype *src, int srcstep, const uchar* mask, int maskstep,     \
2256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  dsttype *dst, int dststep, CvSize size, dsttype alpha ),              \
2266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  (src, srcstep, mask, maskstep, dst, dststep, size, alpha ))           \
2276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                       \
2286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dsttype beta = (dsttype)(1 - alpha);                                \
2296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep /= sizeof(src[0]);                                          \
2306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dststep /= sizeof(dst[0]);                                          \
2316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
2326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src += srcstep,                               \
2336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                          dst += dststep, mask += maskstep )            \
2346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                   \
2356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int x;                                                          \
2366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( x = 0; x <= size.width - 2; x += 2 )                       \
2376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                               \
2386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( mask[x] )                                               \
2396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[x] = dst[x]*beta + cvtmacro(src[x])*alpha;          \
2406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( mask[x+1] )                                             \
2416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[x+1] = dst[x+1]*beta + cvtmacro(src[x+1])*alpha;    \
2426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                               \
2436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
2446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( ; x < size.width; x++ )                                    \
2456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( mask[x] )                                               \
2466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[x] = dst[x]*beta + cvtmacro(src[x])*alpha;          \
2476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                   \
2486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
2496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                                       \
2506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_ACCWEIGHTMASK_FUNC_C1( 8u32f, uchar, float, CV_8TO32F )
2536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_ACCWEIGHTMASK_FUNC_C1( 32f, float, float, CV_NOP )
2546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  ICV_DEF_ACCMASK_FUNC_C3( name, srctype, dsttype, cvtmacro )    \
2576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIPCVAPI_IMPL( CvStatus,                                                 \
2586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennname,( const srctype *src, int srcstep, const uchar* mask, int maskstep,\
2596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn       dsttype *dst, int dststep, CvSize size ),                        \
2606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn       (src, srcstep, mask, maskstep, dst, dststep, size ))             \
2616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                       \
2626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep /= sizeof(src[0]);                                          \
2636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dststep /= sizeof(dst[0]);                                          \
2646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
2656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src += srcstep,                               \
2666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                          dst += dststep, mask += maskstep )            \
2676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                   \
2686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int x;                                                          \
2696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( x = 0; x < size.width; x++ )                               \
2706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( mask[x] )                                               \
2716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {                                                           \
2726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dsttype t0, t1, t2;                                     \
2736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                t0 = dst[x*3] + cvtmacro(src[x*3]);                     \
2746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                t1 = dst[x*3+1] + cvtmacro(src[x*3+1]);                 \
2756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                t2 = dst[x*3+2] + cvtmacro(src[x*3+2]);                 \
2766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[x*3] = t0;                                          \
2776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[x*3+1] = t1;                                        \
2786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[x*3+2] = t2;                                        \
2796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                                                           \
2806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                   \
2816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
2826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                                       \
2836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_ACCMASK_FUNC_C3( icvAdd_8u32f_C3IMR, uchar, float, CV_8TO32F )
2876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_ACCMASK_FUNC_C3( icvAdd_32f_C3IMR, float, float, CV_NOP )
2886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_ACCMASK_FUNC_C3( icvAddSquare_8u32f_C3IMR, uchar, float, CV_8TO32F_SQR )
2896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_ACCMASK_FUNC_C3( icvAddSquare_32f_C3IMR, float, float, CV_SQR )
2906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  ICV_DEF_ACCPRODUCTMASK_FUNC_C3( flavor, srctype, dsttype, cvtmacro )  \
2936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIPCVAPI_IMPL( CvStatus, icvAddProduct_##flavor##_C3IMR,                 \
2946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn( const srctype *src1, int step1, const srctype* src2, int step2,       \
2956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  const uchar* mask, int maskstep, dsttype *dst, int dststep, CvSize size ),\
2966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  (src1, step1, src2, step2, mask, maskstep, dst, dststep, size ))      \
2976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                       \
2986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step1 /= sizeof(src1[0]);                                           \
2996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step2 /= sizeof(src2[0]);                                           \
3006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dststep /= sizeof(dst[0]);                                          \
3016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
3026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src1 += step1, src2 += step2,                 \
3036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                          dst += dststep, mask += maskstep )            \
3046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                   \
3056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int x;                                                          \
3066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( x = 0; x < size.width; x++ )                               \
3076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( mask[x] )                                               \
3086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {                                                           \
3096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dsttype t0, t1, t2;                                     \
3106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                t0 = dst[x*3]+cvtmacro(src1[x*3])*cvtmacro(src2[x*3]);  \
3116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                t1 = dst[x*3+1]+cvtmacro(src1[x*3+1])*cvtmacro(src2[x*3+1]);\
3126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                t2 = dst[x*3+2]+cvtmacro(src1[x*3+2])*cvtmacro(src2[x*3+2]);\
3136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[x*3] = t0;                                          \
3146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[x*3+1] = t1;                                        \
3156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[x*3+2] = t2;                                        \
3166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                                                           \
3176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                   \
3186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
3196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                                       \
3206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
3216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_ACCPRODUCTMASK_FUNC_C3( 8u32f, uchar, float, CV_8TO32F )
3246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_ACCPRODUCTMASK_FUNC_C3( 32f, float, float, CV_NOP )
3256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  ICV_DEF_ACCWEIGHTMASK_FUNC_C3( flavor, srctype, dsttype, cvtmacro ) \
3286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIPCVAPI_IMPL( CvStatus, icvAddWeighted_##flavor##_C3IMR,                \
3296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn( const srctype *src, int srcstep, const uchar* mask, int maskstep,     \
3306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  dsttype *dst, int dststep, CvSize size, dsttype alpha ),              \
3316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  (src, srcstep, mask, maskstep, dst, dststep, size, alpha ))           \
3326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                       \
3336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dsttype beta = (dsttype)(1 - alpha);                                \
3346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep /= sizeof(src[0]);                                          \
3356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dststep /= sizeof(dst[0]);                                          \
3366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
3376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src += srcstep,                               \
3386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                          dst += dststep, mask += maskstep )            \
3396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                   \
3406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int x;                                                          \
3416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( x = 0; x < size.width; x++ )                               \
3426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( mask[x] )                                               \
3436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {                                                           \
3446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dsttype t0, t1, t2;                                     \
3456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                t0 = dst[x*3]*beta + cvtmacro(src[x*3])*alpha;          \
3466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                t1 = dst[x*3+1]*beta + cvtmacro(src[x*3+1])*alpha;      \
3476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                t2 = dst[x*3+2]*beta + cvtmacro(src[x*3+2])*alpha;      \
3486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[x*3] = t0;                                          \
3496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[x*3+1] = t1;                                        \
3506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[x*3+2] = t2;                                        \
3516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                                                           \
3526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                   \
3536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
3546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                                       \
3556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
3566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_ACCWEIGHTMASK_FUNC_C3( 8u32f, uchar, float, CV_8TO32F )
3586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_ACCWEIGHTMASK_FUNC_C3( 32f, float, float, CV_NOP )
3596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  ICV_DEF_INIT_ACC_TAB( FUNCNAME )                                           \
3626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic  void  icvInit##FUNCNAME##Table( CvFuncTable* tab, CvBigFuncTable* masktab ) \
3636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                                   \
3646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_8U] = (void*)icv##FUNCNAME##_8u32f_C1IR;                          \
3656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_32F] = (void*)icv##FUNCNAME##_32f_C1IR;                           \
3666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                    \
3676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    masktab->fn_2d[CV_8UC1] = (void*)icv##FUNCNAME##_8u32f_C1IMR;                   \
3686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    masktab->fn_2d[CV_32FC1] = (void*)icv##FUNCNAME##_32f_C1IMR;                    \
3696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                    \
3706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    masktab->fn_2d[CV_8UC3] = (void*)icv##FUNCNAME##_8u32f_C3IMR;                   \
3716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    masktab->fn_2d[CV_32FC3] = (void*)icv##FUNCNAME##_32f_C3IMR;                    \
3726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
3736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INIT_ACC_TAB( Add )
3766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INIT_ACC_TAB( AddSquare )
3776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INIT_ACC_TAB( AddProduct )
3786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INIT_ACC_TAB( AddWeighted )
3796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
3826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvAcc( const void* arr, void* sumarr, const void* maskarr )
3836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
3846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static CvFuncTable acc_tab;
3856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static CvBigFuncTable accmask_tab;
3866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static int inittab = 0;
3876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvAcc" );
3896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
3916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int type, sumdepth;
3936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int mat_step, sum_step, mask_step = 0;
3946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize size;
3956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat stub, *mat = (CvMat*)arr;
3966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat sumstub, *sum = (CvMat*)sumarr;
3976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat maskstub, *mask = (CvMat*)maskarr;
3986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !inittab )
4006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
4016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvInitAddTable( &acc_tab, &accmask_tab );
4026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        inittab = 1;
4036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
4046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT( mat ) || !CV_IS_MAT( sum ))
4066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
4076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int coi1 = 0, coi2 = 0;
4086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( mat = cvGetMat( mat, &stub, &coi1 ));
4096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( sum = cvGetMat( sum, &sumstub, &coi2 ));
4106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( coi1 + coi2 != 0 )
4116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_BadCOI, "" );
4126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
4136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_MAT_DEPTH( sum->type ) != CV_32F )
4156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_BadDepth, "" );
4166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_CNS_EQ( mat, sum ))
4186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnmatchedFormats, "" );
4196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    sumdepth = CV_MAT_DEPTH( sum->type );
4216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( sumdepth != CV_32F && (maskarr != 0 || sumdepth != CV_64F))
4226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_BadDepth, "Bad accumulator type" );
4236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_SIZES_EQ( mat, sum ))
4256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnmatchedSizes, "" );
4266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size = cvGetMatSize( mat );
4286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    type = CV_MAT_TYPE( mat->type );
4296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    mat_step = mat->step;
4316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    sum_step = sum->step;
4326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !mask )
4346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
4356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvFunc2D_2A func=(CvFunc2D_2A)acc_tab.fn_2d[CV_MAT_DEPTH(type)];
4366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !func )
4386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsUnsupportedFormat, "Unsupported type combination" );
4396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size.width *= CV_MAT_CN(type);
4416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_IS_MAT_CONT( mat->type & sum->type ))
4426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
4436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size.width *= size.height;
4446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            mat_step = sum_step = CV_STUB_STEP;
4456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size.height = 1;
4466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
4476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IPPI_CALL( func( mat->data.ptr, mat_step, sum->data.ptr, sum_step, size ));
4496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
4506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
4516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
4526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvFunc2D_3A func = (CvFunc2D_3A)accmask_tab.fn_2d[type];
4536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !func )
4556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsUnsupportedFormat, "" );
4566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( mask = cvGetMat( mask, &maskstub ));
4586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_IS_MASK_ARR( mask ))
4606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsBadMask, "" );
4616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_ARE_SIZES_EQ( mat, mask ))
4636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsUnmatchedSizes, "" );
4646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        mask_step = mask->step;
4666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_IS_MAT_CONT( mat->type & sum->type & mask->type ))
4686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
4696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size.width *= size.height;
4706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            mat_step = sum_step = mask_step = CV_STUB_STEP;
4716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size.height = 1;
4726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
4736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IPPI_CALL( func( mat->data.ptr, mat_step, mask->data.ptr, mask_step,
4756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                         sum->data.ptr, sum_step, size ));
4766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
4776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
4796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
4806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
4836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvSquareAcc( const void* arr, void* sq_sum, const void* maskarr )
4846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
4856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static CvFuncTable acc_tab;
4866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static CvBigFuncTable accmask_tab;
4876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static int inittab = 0;
4886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvSquareAcc" );
4906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
4926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int coi1, coi2;
4946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int type;
4956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int mat_step, sum_step, mask_step = 0;
4966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize size;
4976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat stub, *mat = (CvMat*)arr;
4986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat sumstub, *sum = (CvMat*)sq_sum;
4996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat maskstub, *mask = (CvMat*)maskarr;
5006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !inittab )
5026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
5036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvInitAddSquareTable( &acc_tab, &accmask_tab );
5046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        inittab = 1;
5056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
5066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_CALL( mat = cvGetMat( mat, &stub, &coi1 ));
5086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_CALL( sum = cvGetMat( sum, &sumstub, &coi2 ));
5096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( coi1 != 0 || coi2 != 0 )
5116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_BadCOI, "" );
5126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_CNS_EQ( mat, sum ))
5146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnmatchedFormats, "" );
5156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_MAT_DEPTH( sum->type ) != CV_32F )
5176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_BadDepth, "" );
5186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_SIZES_EQ( mat, sum ))
5206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnmatchedSizes, "" );
5216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size = cvGetMatSize( mat );
5236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    type = CV_MAT_TYPE( mat->type );
5246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    mat_step = mat->step;
5266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    sum_step = sum->step;
5276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !mask )
5296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
5306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvFunc2D_2A func = (CvFunc2D_2A)acc_tab.fn_2d[CV_MAT_DEPTH(type)];
5316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !func )
5336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsUnsupportedFormat, "" );
5346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size.width *= CV_MAT_CN(type);
5366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_IS_MAT_CONT( mat->type & sum->type ))
5386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
5396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size.width *= size.height;
5406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            mat_step = sum_step = CV_STUB_STEP;;
5416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size.height = 1;
5426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
5436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IPPI_CALL( func( mat->data.ptr, mat_step, sum->data.ptr, sum_step, size ));
5456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
5466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
5476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
5486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvFunc2D_3A func = (CvFunc2D_3A)accmask_tab.fn_2d[type];
5496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !func )
5516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsUnsupportedFormat, "" );
5526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( mask = cvGetMat( mask, &maskstub ));
5546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_IS_MASK_ARR( mask ))
5566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsBadMask, "" );
5576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_ARE_SIZES_EQ( mat, mask ))
5596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsUnmatchedSizes, "" );
5606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        mask_step = mask->step;
5626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_IS_MAT_CONT( mat->type & sum->type & mask->type ))
5646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
5656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size.width *= size.height;
5666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            mat_step = sum_step = mask_step = CV_STUB_STEP;
5676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size.height = 1;
5686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
5696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IPPI_CALL( func( mat->data.ptr, mat_step, mask->data.ptr, mask_step,
5716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                         sum->data.ptr, sum_step, size ));
5726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
5736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
5756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
5766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
5796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvMultiplyAcc( const void* arrA, const void* arrB,
5806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn               void* acc, const void* maskarr )
5816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
5826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static CvFuncTable acc_tab;
5836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static CvBigFuncTable accmask_tab;
5846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static int inittab = 0;
5856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvMultiplyAcc" );
5876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
5896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int coi1, coi2, coi3;
5916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int type;
5926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int mat1_step, mat2_step, sum_step, mask_step = 0;
5936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize size;
5946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat stub1, *mat1 = (CvMat*)arrA;
5956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat stub2, *mat2 = (CvMat*)arrB;
5966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat sumstub, *sum = (CvMat*)acc;
5976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat maskstub, *mask = (CvMat*)maskarr;
5986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !inittab )
6006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
6016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvInitAddProductTable( &acc_tab, &accmask_tab );
6026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        inittab = 1;
6036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
6046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_CALL( mat1 = cvGetMat( mat1, &stub1, &coi1 ));
6066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_CALL( mat2 = cvGetMat( mat2, &stub2, &coi2 ));
6076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_CALL( sum = cvGetMat( sum, &sumstub, &coi3 ));
6086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( coi1 != 0 || coi2 != 0 || coi3 != 0 )
6106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_BadCOI, "" );
6116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_CNS_EQ( mat1, mat2 ) || !CV_ARE_CNS_EQ( mat1, sum ))
6136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnmatchedFormats, "" );
6146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_MAT_DEPTH( sum->type ) != CV_32F )
6166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_BadDepth, "" );
6176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_SIZES_EQ( mat1, sum ) || !CV_ARE_SIZES_EQ( mat2, sum ))
6196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnmatchedSizes, "" );
6206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size = cvGetMatSize( mat1 );
6226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    type = CV_MAT_TYPE( mat1->type );
6236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    mat1_step = mat1->step;
6256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    mat2_step = mat2->step;
6266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    sum_step = sum->step;
6276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !mask )
6296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
6306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvFunc2D_3A func = (CvFunc2D_3A)acc_tab.fn_2d[CV_MAT_DEPTH(type)];
6316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !func )
6336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsUnsupportedFormat, "" );
6346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size.width *= CV_MAT_CN(type);
6366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_IS_MAT_CONT( mat1->type & mat2->type & sum->type ))
6386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
6396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size.width *= size.height;
6406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            mat1_step = mat2_step = sum_step = CV_STUB_STEP;
6416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size.height = 1;
6426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
6436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IPPI_CALL( func( mat1->data.ptr, mat1_step, mat2->data.ptr, mat2_step,
6456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                         sum->data.ptr, sum_step, size ));
6466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
6476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
6486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
6496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvFunc2D_4A func = (CvFunc2D_4A)accmask_tab.fn_2d[type];
6506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !func )
6526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsUnsupportedFormat, "" );
6536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( mask = cvGetMat( mask, &maskstub ));
6556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_IS_MASK_ARR( mask ))
6576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsBadMask, "" );
6586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_ARE_SIZES_EQ( mat1, mask ))
6606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsUnmatchedSizes, "" );
6616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        mask_step = mask->step;
6636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_IS_MAT_CONT( mat1->type & mat2->type & sum->type & mask->type ))
6656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
6666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size.width *= size.height;
6676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            mat1_step = mat2_step = sum_step = mask_step = CV_STUB_STEP;
6686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size.height = 1;
6696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
6706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IPPI_CALL( func( mat1->data.ptr, mat1_step, mat2->data.ptr, mat2_step,
6726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                         mask->data.ptr, mask_step,
6736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                         sum->data.ptr, sum_step, size ));
6746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
6756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
6776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
6786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL *CvAddWeightedFunc)( const void* src, int srcstep,
6816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                  void* dst, int dststep,
6826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                  CvSize size, float alpha );
6836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL *CvAddWeightedMaskFunc)( const void* src, int srcstep,
6856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                      void* dst, int dststep,
6866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                      const void* mask, int maskstep,
6876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                      CvSize size, float alpha );
6886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
6906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvRunningAvg( const void* arrY, void* arrU,
6916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn              double alpha, const void* maskarr )
6926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
6936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static CvFuncTable acc_tab;
6946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static CvBigFuncTable accmask_tab;
6956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static int inittab = 0;
6966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvRunningAvg" );
6986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
7006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int coi1, coi2;
7026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int type;
7036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int mat_step, sum_step, mask_step = 0;
7046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize size;
7056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat stub, *mat = (CvMat*)arrY;
7066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat sumstub, *sum = (CvMat*)arrU;
7076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat maskstub, *mask = (CvMat*)maskarr;
7086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !inittab )
7106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
7116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvInitAddWeightedTable( &acc_tab, &accmask_tab );
7126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        inittab = 1;
7136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
7146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_CALL( mat = cvGetMat( mat, &stub, &coi1 ));
7166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_CALL( sum = cvGetMat( sum, &sumstub, &coi2 ));
7176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( coi1 != 0 || coi2 != 0 )
7196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_BadCOI, "" );
7206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_CNS_EQ( mat, sum ))
7226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnmatchedFormats, "" );
7236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_MAT_DEPTH( sum->type ) != CV_32F )
7256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_BadDepth, "" );
7266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_SIZES_EQ( mat, sum ))
7286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnmatchedSizes, "" );
7296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size = cvGetMatSize( mat );
7316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    type = CV_MAT_TYPE( mat->type );
7326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    mat_step = mat->step;
7346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    sum_step = sum->step;
7356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !mask )
7376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
7386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvAddWeightedFunc func = (CvAddWeightedFunc)acc_tab.fn_2d[CV_MAT_DEPTH(type)];
7396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !func )
7416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsUnsupportedFormat, "" );
7426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size.width *= CV_MAT_CN(type);
7446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_IS_MAT_CONT( mat->type & sum->type ))
7456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
7466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size.width *= size.height;
7476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            mat_step = sum_step = CV_STUB_STEP;
7486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size.height = 1;
7496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
7506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IPPI_CALL( func( mat->data.ptr, mat_step,
7526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                         sum->data.ptr, sum_step, size, (float)alpha ));
7536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
7546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
7556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
7566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvAddWeightedMaskFunc func = (CvAddWeightedMaskFunc)accmask_tab.fn_2d[type];
7576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !func )
7596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsUnsupportedFormat, "" );
7606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( mask = cvGetMat( mask, &maskstub ));
7626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_IS_MASK_ARR( mask ))
7646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsBadMask, "" );
7656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_ARE_SIZES_EQ( mat, mask ))
7676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsUnmatchedSizes, "" );
7686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        mask_step = mask->step;
7706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_IS_MAT_CONT( mat->type & sum->type & mask->type ))
7726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
7736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size.width *= size.height;
7746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            mat_step = sum_step = mask_step = CV_STUB_STEP;
7756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size.height = 1;
7766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
7776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IPPI_CALL( func( mat->data.ptr, mat_step, mask->data.ptr, mask_step,
7796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                         sum->data.ptr, sum_step, size, (float)alpha ));
7806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
7816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
7836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
7846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* End of file. */
787