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 arithmetic operations: +, - ...
456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// */
476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "_cxcore.h"
496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                      Arithmetic operations (+, -) without mask                         *
526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_BIN_ARI_OP_CASE( __op__, worktype, cast_macro, len )\
556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                   \
566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i;                                                          \
576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                    \
586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( i = 0; i <= (len) - 4; i += 4 )                            \
596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                               \
606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        worktype t0 = __op__((src1)[i], (src2)[i]);                 \
616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        worktype t1 = __op__((src1)[i+1], (src2)[i+1]);             \
626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                    \
636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        (dst)[i] = cast_macro( t0 );                                \
646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        (dst)[i+1] = cast_macro( t1 );                              \
656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                    \
666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t0 = __op__((src1)[i+2],(src2)[i+2]);                       \
676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t1 = __op__((src1)[i+3],(src2)[i+3]);                       \
686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                    \
696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        (dst)[i+2] = cast_macro( t0 );                              \
706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        (dst)[i+3] = cast_macro( t1 );                              \
716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                               \
726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                    \
736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; i < (len); i++ )                                         \
746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                               \
756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        worktype t0 = __op__((src1)[i],(src2)[i]);                  \
766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        (dst)[i] = cast_macro( t0 );                                \
776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                               \
786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_BIN_ARI_OP_2D( __op__, name, type, worktype, cast_macro )   \
816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIPCVAPI_IMPL( CvStatus, name,                                               \
826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ( const type* src1, int step1, const type* src2, int step2,             \
836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn      type* dst, int step, CvSize size ),                                   \
846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn      (src1, step1, src2, step2, dst, step, size) )                         \
856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                           \
866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step1/=sizeof(src1[0]); step2/=sizeof(src2[0]); step/=sizeof(dst[0]);   \
876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( size.width == 1 )                                                   \
896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                       \
906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( ; size.height--; src1 += step1, src2 += step2, dst += step )   \
916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                                   \
926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            worktype t0 = __op__((src1)[0],(src2)[0]);                      \
936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            (dst)[0] = cast_macro( t0 );                                    \
946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                                   \
956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                       \
966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else                                                                    \
976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                       \
986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( ; size.height--; src1 += step1, src2 += step2, dst += step )   \
996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                                   \
1006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            ICV_DEF_BIN_ARI_OP_CASE( __op__, worktype,                      \
1016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                     cast_macro, size.width );              \
1026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                                   \
1036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                       \
1046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
1056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                                           \
1066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
1076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_BIN_ARI_OP_2D_SFS(__op__, name, type, worktype, cast_macro) \
1106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIPCVAPI_IMPL( CvStatus, name,                                               \
1116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ( const type* src1, int step1, const type* src2, int step2,             \
1126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn      type* dst, int step, CvSize size, int /*scalefactor*/ ),              \
1136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn      (src1, step1, src2, step2, dst, step, size, 0) )                      \
1146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                           \
1156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step1/=sizeof(src1[0]); step2/=sizeof(src2[0]); step/=sizeof(dst[0]);   \
1166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
1176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( size.width == 1 )                                                   \
1186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                       \
1196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( ; size.height--; src1 += step1, src2 += step2, dst += step )   \
1206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                                   \
1216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            worktype t0 = __op__((src1)[0],(src2)[0]);                      \
1226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            (dst)[0] = cast_macro( t0 );                                    \
1236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                                   \
1246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                       \
1256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else                                                                    \
1266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                       \
1276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( ; size.height--; src1 += step1, src2 += step2, dst += step )   \
1286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                                   \
1296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            ICV_DEF_BIN_ARI_OP_CASE( __op__, worktype,                      \
1306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                     cast_macro, size.width );              \
1316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                                   \
1326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                       \
1336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
1346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                                           \
1356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
1366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_UN_ARI_OP_CASE( __op__, worktype, cast_macro,               \
1396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                src, scalar, dst, len )                     \
1406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                           \
1416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i;                                                                  \
1426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
1436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; ((len) -= 12) >= 0; (dst) += 12, (src) += 12 )                   \
1446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                       \
1456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        worktype t0 = __op__((scalar)[0], (src)[0]);                        \
1466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        worktype t1 = __op__((scalar)[1], (src)[1]);                        \
1476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
1486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        (dst)[0] = cast_macro( t0 );                                        \
1496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        (dst)[1] = cast_macro( t1 );                                        \
1506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
1516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t0 = __op__((scalar)[2], (src)[2]);                                 \
1526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t1 = __op__((scalar)[3], (src)[3]);                                 \
1536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
1546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        (dst)[2] = cast_macro( t0 );                                        \
1556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        (dst)[3] = cast_macro( t1 );                                        \
1566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
1576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t0 = __op__((scalar)[4], (src)[4]);                                 \
1586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t1 = __op__((scalar)[5], (src)[5]);                                 \
1596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
1606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        (dst)[4] = cast_macro( t0 );                                        \
1616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        (dst)[5] = cast_macro( t1 );                                        \
1626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
1636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t0 = __op__((scalar)[6], (src)[6]);                                 \
1646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t1 = __op__((scalar)[7], (src)[7]);                                 \
1656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
1666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        (dst)[6] = cast_macro( t0 );                                        \
1676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        (dst)[7] = cast_macro( t1 );                                        \
1686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
1696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t0 = __op__((scalar)[8], (src)[8]);                                 \
1706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t1 = __op__((scalar)[9], (src)[9]);                                 \
1716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
1726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        (dst)[8] = cast_macro( t0 );                                        \
1736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        (dst)[9] = cast_macro( t1 );                                        \
1746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
1756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t0 = __op__((scalar)[10], (src)[10]);                               \
1766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t1 = __op__((scalar)[11], (src)[11]);                               \
1776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
1786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        (dst)[10] = cast_macro( t0 );                                       \
1796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        (dst)[11] = cast_macro( t1 );                                       \
1806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                       \
1816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
1826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( (len) += 12, i = 0; i < (len); i++ )                               \
1836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                       \
1846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        worktype t0 = __op__((scalar)[i],(src)[i]);                         \
1856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        (dst)[i] = cast_macro( t0 );                                        \
1866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                       \
1876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
1886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_UN_ARI_OP_2D( __op__, name, type, worktype, cast_macro )    \
1916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL name                                             \
1926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ( const type* src, int step1, type* dst, int step,                      \
1936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn      CvSize size, const worktype* scalar )                                 \
1946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                           \
1956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step1 /= sizeof(src[0]); step /= sizeof(dst[0]);                        \
1966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
1976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( size.width == 1 )                                                   \
1986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                       \
1996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( ; size.height--; src += step1, dst += step )                   \
2006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                                   \
2016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            worktype t0 = __op__(*(scalar),*(src));                         \
2026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            *(dst) = cast_macro( t0 );                                      \
2036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                                   \
2046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                       \
2056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else                                                                    \
2066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                       \
2076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( ; size.height--; src += step1, dst += step )                   \
2086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                                   \
2096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            const type *tsrc = src;                                         \
2106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            type *tdst = dst;                                               \
2116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int width = size.width;                                         \
2126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
2136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            ICV_DEF_UN_ARI_OP_CASE( __op__, worktype, cast_macro,           \
2146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                    tsrc, scalar, tdst, width );            \
2156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                                   \
2166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                       \
2176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
2186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                                           \
2196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_BIN_ARI_ALL( __op__, name, cast_8u )                                \
2236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_BIN_ARI_OP_2D_SFS( __op__, icv##name##_8u_C1R, uchar, int, cast_8u )        \
2246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_BIN_ARI_OP_2D_SFS( __op__, icv##name##_16u_C1R, ushort, int, CV_CAST_16U )  \
2256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_BIN_ARI_OP_2D_SFS( __op__, icv##name##_16s_C1R, short, int, CV_CAST_16S )   \
2266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_BIN_ARI_OP_2D( __op__, icv##name##_32s_C1R, int, int, CV_CAST_32S )         \
2276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_BIN_ARI_OP_2D( __op__, icv##name##_32f_C1R, float, float, CV_CAST_32F )     \
2286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_BIN_ARI_OP_2D( __op__, icv##name##_64f_C1R, double, double, CV_CAST_64F )
2296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_UN_ARI_ALL( __op__, name )                                          \
2316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_UN_ARI_OP_2D( __op__, icv##name##_8u_C1R, uchar, int, CV_CAST_8U )          \
2326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_UN_ARI_OP_2D( __op__, icv##name##_16u_C1R, ushort, int, CV_CAST_16U )       \
2336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_UN_ARI_OP_2D( __op__, icv##name##_16s_C1R, short, int, CV_CAST_16S )        \
2346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_UN_ARI_OP_2D( __op__, icv##name##_32s_C1R, int, int, CV_CAST_32S )          \
2356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_UN_ARI_OP_2D( __op__, icv##name##_32f_C1R, float, float, CV_CAST_32F )      \
2366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_UN_ARI_OP_2D( __op__, icv##name##_64f_C1R, double, double, CV_CAST_64F )
2376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#undef CV_SUB_R
2396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SUB_R(a,b) ((b) - (a))
2406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_BIN_ARI_ALL( CV_ADD, Add, CV_FAST_CAST_8U )
2426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_BIN_ARI_ALL( CV_SUB_R, Sub, CV_FAST_CAST_8U )
2436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_UN_ARI_ALL( CV_ADD, AddC )
2456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_UN_ARI_ALL( CV_SUB, SubRC )
2466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_INIT_ARITHM_FUNC_TAB( FUNCNAME, FLAG )          \
2486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic  void  icvInit##FUNCNAME##FLAG##Table( CvFuncTable* tab )\
2496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                               \
2506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_8U] = (void*)icv##FUNCNAME##_8u_##FLAG;       \
2516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_8S] = 0;                                      \
2526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_16U] = (void*)icv##FUNCNAME##_16u_##FLAG;     \
2536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_16S] = (void*)icv##FUNCNAME##_16s_##FLAG;     \
2546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_32S] = (void*)icv##FUNCNAME##_32s_##FLAG;     \
2556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_32F] = (void*)icv##FUNCNAME##_32f_##FLAG;     \
2566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_64F] = (void*)icv##FUNCNAME##_64f_##FLAG;     \
2576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INIT_ARITHM_FUNC_TAB( Sub, C1R )
2606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INIT_ARITHM_FUNC_TAB( SubRC, C1R )
2616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INIT_ARITHM_FUNC_TAB( Add, C1R )
2626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INIT_ARITHM_FUNC_TAB( AddC, C1R )
2636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
2656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                       External Functions for Arithmetic Operations                     *
2666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
2676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*************************************** S U B ******************************************/
2696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
2716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvSub( const void* srcarr1, const void* srcarr2,
2726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn       void* dstarr, const void* maskarr )
2736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static CvFuncTable sub_tab;
2756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static int inittab = 0;
2766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int local_alloc = 1;
2776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uchar* buffer = 0;
2786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvSub" );
2806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
2826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    const CvArr* tmp;
2846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int y, dy, type, depth, cn, cont_flag = 0;
2856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int src1_step, src2_step, dst_step, tdst_step, mask_step;
2866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat srcstub1, srcstub2, *src1, *src2;
2876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat dststub,  *dst = (CvMat*)dstarr;
2886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat maskstub, *mask = (CvMat*)maskarr;
2896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat dstbuf, *tdst;
2906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvFunc2D_3A func;
2916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvFunc2D_3A1I func_sfs;
2926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvCopyMaskFunc copym_func;
2936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize size, tsize;
2946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_SWAP( srcarr1, srcarr2, tmp ); // to comply with IPP
2966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    src1 = (CvMat*)srcarr1;
2976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    src2 = (CvMat*)srcarr2;
2986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT(src1) || !CV_IS_MAT(src2) || !CV_IS_MAT(dst))
3006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
3016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_IS_MATND(src1) || CV_IS_MATND(src2) || CV_IS_MATND(dst))
3026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
3036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CvArr* arrs[] = { src1, src2, dst };
3046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CvMatND stubs[3];
3056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CvNArrayIterator iterator;
3066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( maskarr )
3086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_ERROR( CV_StsBadMask,
3096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                "This operation on multi-dimensional arrays does not support mask" );
3106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( cvInitNArrayIterator( 3, arrs, 0, stubs, &iterator ));
3126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            type = iterator.hdr[0]->type;
3146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            iterator.size.width *= CV_MAT_CN(type);
3156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( !inittab )
3176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
3186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                icvInitSubC1RTable( &sub_tab );
3196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                inittab = 1;
3206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
3216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            depth = CV_MAT_DEPTH(type);
3236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( depth <= CV_16S )
3246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
3256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                func_sfs = (CvFunc2D_3A1I)(sub_tab.fn_2d[depth]);
3266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( !func_sfs )
3276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    CV_ERROR( CV_StsUnsupportedFormat, "" );
3286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                do
3306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
3316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    IPPI_CALL( func_sfs( iterator.ptr[0], CV_STUB_STEP,
3326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                         iterator.ptr[1], CV_STUB_STEP,
3336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                         iterator.ptr[2], CV_STUB_STEP,
3346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                         iterator.size, 0 ));
3356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
3366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                while( cvNextNArraySlice( &iterator ));
3376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
3386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
3396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
3406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                func = (CvFunc2D_3A)(sub_tab.fn_2d[depth]);
3416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( !func )
3426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    CV_ERROR( CV_StsUnsupportedFormat, "" );
3436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                do
3456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
3466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    IPPI_CALL( func( iterator.ptr[0], CV_STUB_STEP,
3476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                     iterator.ptr[1], CV_STUB_STEP,
3486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                     iterator.ptr[2], CV_STUB_STEP,
3496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                     iterator.size ));
3506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
3516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                while( cvNextNArraySlice( &iterator ));
3526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
3536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            EXIT;
3546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
3556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
3566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
3576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int coi1 = 0, coi2 = 0, coi3 = 0;
3586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( src1 = cvGetMat( src1, &srcstub1, &coi1 ));
3606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( src2 = cvGetMat( src2, &srcstub2, &coi2 ));
3616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( dst = cvGetMat( dst, &dststub, &coi3 ));
3626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( coi1 + coi2 + coi3 != 0 )
3636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_ERROR( CV_BadCOI, "" );
3646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
3656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
3666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_TYPES_EQ( src1, src2 ) || !CV_ARE_TYPES_EQ( src1, dst ))
3686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR_FROM_CODE( CV_StsUnmatchedFormats );
3696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_SIZES_EQ( src1, src2 ) || !CV_ARE_SIZES_EQ( src1, dst ))
3716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR_FROM_CODE( CV_StsUnmatchedSizes );
3726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    type = CV_MAT_TYPE(src1->type);
3746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size = cvGetMatSize( src1 );
3756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    depth = CV_MAT_DEPTH(type);
3766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cn = CV_MAT_CN(type);
3776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !mask )
3796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
3806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_IS_MAT_CONT( src1->type & src2->type & dst->type ))
3816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
3826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int len = size.width*size.height*cn;
3836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( len <= CV_MAX_INLINE_MAT_OP_SIZE*CV_MAX_INLINE_MAT_OP_SIZE )
3856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
3866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( depth == CV_32F )
3876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
3886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    const float* src1data = (const float*)(src1->data.ptr);
3896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    const float* src2data = (const float*)(src2->data.ptr);
3906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    float* dstdata = (float*)(dst->data.ptr);
3916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    do
3936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    {
3946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        dstdata[len-1] = (float)(src2data[len-1] - src1data[len-1]);
3956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    }
3966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    while( --len );
3976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    EXIT;
3996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
4006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( depth == CV_64F )
4026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
4036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    const double* src1data = (const double*)(src1->data.ptr);
4046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    const double* src2data = (const double*)(src2->data.ptr);
4056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    double* dstdata = (double*)(dst->data.ptr);
4066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    do
4086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    {
4096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        dstdata[len-1] = src2data[len-1] - src1data[len-1];
4106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    }
4116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    while( --len );
4126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    EXIT;
4146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
4156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
4166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            cont_flag = 1;
4176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
4186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dy = size.height;
4206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        copym_func = 0;
4216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        tdst = dst;
4226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
4236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
4246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
4256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int buf_size, elem_size;
4266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_IS_MAT(mask) )
4286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( mask = cvGetMat( mask, &maskstub ));
4296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_IS_MASK_ARR(mask))
4316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsBadMask, "" );
4326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_ARE_SIZES_EQ( mask, dst ))
4346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsUnmatchedSizes, "" );
4356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cont_flag = CV_IS_MAT_CONT( src1->type & src2->type & dst->type & mask->type );
4376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        elem_size = CV_ELEM_SIZE(type);
4386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dy = CV_MAX_LOCAL_SIZE/(elem_size*size.height);
4406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dy = MAX(dy,1);
4416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dy = MIN(dy,size.height);
4426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dstbuf = cvMat( dy, size.width, type );
4436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !cont_flag )
4446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dstbuf.step = cvAlign( dstbuf.step, 8 );
4456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        buf_size = dstbuf.step ? dstbuf.step*dy : size.width*elem_size;
4466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( buf_size > CV_MAX_LOCAL_SIZE )
4476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
4486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( buffer = (uchar*)cvAlloc( buf_size ));
4496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            local_alloc = 0;
4506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
4516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
4526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            buffer = (uchar*)cvStackAlloc( buf_size );
4536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dstbuf.data.ptr = buffer;
4546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        tdst = &dstbuf;
4556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        copym_func = icvGetCopyMaskFunc( elem_size );
4576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
4586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !inittab )
4606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
4616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvInitSubC1RTable( &sub_tab );
4626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        inittab = 1;
4636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
4646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( depth <= CV_16S )
4666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
4676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        func = 0;
4686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        func_sfs = (CvFunc2D_3A1I)(sub_tab.fn_2d[depth]);
4696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !func_sfs )
4706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsUnsupportedFormat, "" );
4716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
4726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
4736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
4746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        func_sfs = 0;
4756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        func = (CvFunc2D_3A)(sub_tab.fn_2d[depth]);
4766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !func )
4776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsUnsupportedFormat, "" );
4786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
4796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    src1_step = src1->step;
4816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    src2_step = src2->step;
4826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dst_step = dst->step;
4836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tdst_step = tdst->step;
4846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    mask_step = mask ? mask->step : 0;
4856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( y = 0; y < size.height; y += dy )
4876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
4886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        tsize.width = size.width;
4896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        tsize.height = dy;
4906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( y + dy > size.height )
4916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            tsize.height = size.height - y;
4926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( cont_flag || tsize.height == 1 )
4936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
4946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            tsize.width *= tsize.height;
4956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            tsize.height = 1;
4966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            src1_step = src2_step = tdst_step = dst_step = mask_step = CV_STUB_STEP;
4976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
4986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IPPI_CALL( depth <= CV_16S ?
5006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            func_sfs( src1->data.ptr + y*src1->step, src1_step,
5016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                      src2->data.ptr + y*src2->step, src2_step,
5026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                      tdst->data.ptr, tdst_step,
5036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                      cvSize( tsize.width*cn, tsize.height ), 0 ) :
5046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            func( src1->data.ptr + y*src1->step, src1_step,
5056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                  src2->data.ptr + y*src2->step, src2_step,
5066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                  tdst->data.ptr, tdst_step,
5076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                  cvSize( tsize.width*cn, tsize.height )));
5086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( mask )
5106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
5116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            IPPI_CALL( copym_func( tdst->data.ptr, tdst_step, dst->data.ptr + y*dst->step,
5126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                   dst_step, tsize, mask->data.ptr + y*mask->step, mask_step ));
5136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
5146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
5156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
5176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !local_alloc )
5196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cvFree( &buffer );
5206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
5216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
5246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvSubRS( const void* srcarr, CvScalar scalar, void* dstarr, const void* maskarr )
5256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
5266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static CvFuncTable subr_tab;
5276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static int inittab = 0;
5286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int local_alloc = 1;
5296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uchar* buffer = 0;
5306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvSubRS" );
5326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
5346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int sctype, y, dy, type, depth, cn, coi = 0, cont_flag = 0;
5366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int src_step, dst_step, tdst_step, mask_step;
5376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat srcstub, *src = (CvMat*)srcarr;
5386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat dststub, *dst = (CvMat*)dstarr;
5396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat maskstub, *mask = (CvMat*)maskarr;
5406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat dstbuf, *tdst;
5416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvFunc2D_2A1P func;
5426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvCopyMaskFunc copym_func;
5436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double buf[12];
5446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int is_nd = 0;
5456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize size, tsize;
5466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !inittab )
5486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
5496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvInitSubRCC1RTable( &subr_tab );
5506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        inittab = 1;
5516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
5526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT(src) )
5546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
5556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_IS_MATND(src) )
5566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            is_nd = 1;
5576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
5586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
5596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( src = cvGetMat( src, &srcstub, &coi ));
5606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( coi != 0 )
5616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_ERROR( CV_BadCOI, "" );
5626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
5636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
5646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT(dst) )
5666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
5676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_IS_MATND(dst) )
5686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            is_nd = 1;
5696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
5706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
5716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( dst = cvGetMat( dst, &dststub, &coi ));
5726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( coi != 0 )
5736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_ERROR( CV_BadCOI, "" );
5746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
5756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
5766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( is_nd )
5786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
5796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvArr* arrs[] = { src, dst };
5806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvMatND stubs[2];
5816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvNArrayIterator iterator;
5826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( maskarr )
5846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsBadMask,
5856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            "This operation on multi-dimensional arrays does not support mask" );
5866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( cvInitNArrayIterator( 2, arrs, 0, stubs, &iterator ));
5886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        sctype = type = CV_MAT_TYPE(iterator.hdr[0]->type);
5906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_MAT_DEPTH(sctype) < CV_32S )
5916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            sctype = (type & CV_MAT_CN_MASK) | CV_32SC1;
5926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        iterator.size.width *= CV_MAT_CN(type);
5936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        func = (CvFunc2D_2A1P)(subr_tab.fn_2d[CV_MAT_DEPTH(type)]);
5956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !func )
5966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsUnsupportedFormat, "" );
5976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( cvScalarToRawData( &scalar, buf, sctype, 1 ));
5996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        do
6016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
6026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            IPPI_CALL( func( iterator.ptr[0], CV_STUB_STEP,
6036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                             iterator.ptr[1], CV_STUB_STEP,
6046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                             iterator.size, buf ));
6056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
6066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        while( cvNextNArraySlice( &iterator ));
6076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        EXIT;
6086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
6096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_TYPES_EQ( src, dst ))
6116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR_FROM_CODE( CV_StsUnmatchedFormats );
6126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_SIZES_EQ( src, dst ))
6146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR_FROM_CODE( CV_StsUnmatchedSizes );
6156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    sctype = type = CV_MAT_TYPE(src->type);
6176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    depth = CV_MAT_DEPTH(type);
6186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cn = CV_MAT_CN(type);
6196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( depth < CV_32S )
6206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        sctype = (type & CV_MAT_CN_MASK) | CV_32SC1;
6216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size = cvGetMatSize( src );
6236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !maskarr )
6256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
6266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_IS_MAT_CONT( src->type & dst->type ))
6276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
6286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( size.width <= CV_MAX_INLINE_MAT_OP_SIZE )
6296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
6306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int len = size.width * size.height;
6316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( type == CV_32FC1 )
6336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
6346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    const float* srcdata = (const float*)(src->data.ptr);
6356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    float* dstdata = (float*)(dst->data.ptr);
6366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    do
6386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    {
6396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        dstdata[len-1] = (float)(scalar.val[0] - srcdata[len-1]);
6406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    }
6416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    while( --len );
6426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    EXIT;
6446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
6456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( type == CV_64FC1 )
6476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
6486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    const double* srcdata = (const double*)(src->data.ptr);
6496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    double* dstdata = (double*)(dst->data.ptr);
6506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    do
6526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    {
6536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        dstdata[len-1] = scalar.val[0] - srcdata[len-1];
6546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    }
6556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    while( --len );
6566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    EXIT;
6586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
6596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
6606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            cont_flag = 1;
6616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
6626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dy = size.height;
6646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        copym_func = 0;
6656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        tdst = dst;
6666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
6676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
6686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
6696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int buf_size, elem_size;
6706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_IS_MAT(mask) )
6726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( mask = cvGetMat( mask, &maskstub ));
6736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_IS_MASK_ARR(mask))
6756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsBadMask, "" );
6766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_ARE_SIZES_EQ( mask, dst ))
6786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsUnmatchedSizes, "" );
6796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cont_flag = CV_IS_MAT_CONT( src->type & dst->type & mask->type );
6816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        elem_size = CV_ELEM_SIZE(type);
6826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dy = CV_MAX_LOCAL_SIZE/(elem_size*size.height);
6846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dy = MAX(dy,1);
6856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dy = MIN(dy,size.height);
6866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dstbuf = cvMat( dy, size.width, type );
6876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !cont_flag )
6886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dstbuf.step = cvAlign( dstbuf.step, 8 );
6896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        buf_size = dstbuf.step ? dstbuf.step*dy : size.width*elem_size;
6906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( buf_size > CV_MAX_LOCAL_SIZE )
6916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
6926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( buffer = (uchar*)cvAlloc( buf_size ));
6936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            local_alloc = 0;
6946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
6956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
6966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            buffer = (uchar*)cvStackAlloc( buf_size );
6976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dstbuf.data.ptr = buffer;
6986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        tdst = &dstbuf;
6996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        copym_func = icvGetCopyMaskFunc( elem_size );
7016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
7026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    func = (CvFunc2D_2A1P)(subr_tab.fn_2d[depth]);
7046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !func )
7056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnsupportedFormat, "" );
7066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    src_step = src->step;
7086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dst_step = dst->step;
7096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tdst_step = tdst->step;
7106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    mask_step = mask ? mask->step : 0;
7116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_CALL( cvScalarToRawData( &scalar, buf, sctype, 1 ));
7136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( y = 0; y < size.height; y += dy )
7156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
7166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        tsize.width = size.width;
7176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        tsize.height = dy;
7186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( y + dy > size.height )
7196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            tsize.height = size.height - y;
7206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( cont_flag || tsize.height == 1 )
7216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
7226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            tsize.width *= tsize.height;
7236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            tsize.height = 1;
7246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            src_step = tdst_step = dst_step = mask_step = CV_STUB_STEP;
7256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
7266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IPPI_CALL( func( src->data.ptr + y*src->step, src_step,
7286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                         tdst->data.ptr, tdst_step,
7296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                         cvSize( tsize.width*cn, tsize.height ), buf ));
7306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( mask )
7316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
7326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            IPPI_CALL( copym_func( tdst->data.ptr, tdst_step, dst->data.ptr + y*dst->step,
7336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                   dst_step, tsize, mask->data.ptr + y*mask->step, mask_step ));
7346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
7356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
7366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
7386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !local_alloc )
7406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cvFree( &buffer );
7416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
7426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/******************************* A D D ********************************/
7456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
7476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvAdd( const void* srcarr1, const void* srcarr2,
7486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn       void* dstarr, const void* maskarr )
7496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
7506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static CvFuncTable add_tab;
7516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static int inittab = 0;
7526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int local_alloc = 1;
7536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uchar* buffer = 0;
7546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvAdd" );
7566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
7586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int y, dy, type, depth, cn, cont_flag = 0;
7606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int src1_step, src2_step, dst_step, tdst_step, mask_step;
7616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat srcstub1, *src1 = (CvMat*)srcarr1;
7626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat srcstub2, *src2 = (CvMat*)srcarr2;
7636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat dststub,  *dst = (CvMat*)dstarr;
7646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat maskstub, *mask = (CvMat*)maskarr;
7656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat dstbuf, *tdst;
7666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvFunc2D_3A func;
7676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvFunc2D_3A1I func_sfs;
7686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvCopyMaskFunc copym_func;
7696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize size, tsize;
7706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT(src1) || !CV_IS_MAT(src2) || !CV_IS_MAT(dst))
7726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
7736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_IS_MATND(src1) || CV_IS_MATND(src2) || CV_IS_MATND(dst))
7746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
7756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CvArr* arrs[] = { src1, src2, dst };
7766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CvMatND stubs[3];
7776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CvNArrayIterator iterator;
7786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( maskarr )
7806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_ERROR( CV_StsBadMask,
7816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                "This operation on multi-dimensional arrays does not support mask" );
7826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( cvInitNArrayIterator( 3, arrs, 0, stubs, &iterator ));
7846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            type = iterator.hdr[0]->type;
7866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            iterator.size.width *= CV_MAT_CN(type);
7876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( !inittab )
7896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
7906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                icvInitAddC1RTable( &add_tab );
7916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                inittab = 1;
7926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
7936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            depth = CV_MAT_DEPTH(type);
7956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( depth <= CV_16S )
7966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
7976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                func_sfs = (CvFunc2D_3A1I)(add_tab.fn_2d[depth]);
7986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( !func_sfs )
7996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    CV_ERROR( CV_StsUnsupportedFormat, "" );
8006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                do
8026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
8036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    IPPI_CALL( func_sfs( iterator.ptr[0], CV_STUB_STEP,
8046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                         iterator.ptr[1], CV_STUB_STEP,
8056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                         iterator.ptr[2], CV_STUB_STEP,
8066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                         iterator.size, 0 ));
8076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
8086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                while( cvNextNArraySlice( &iterator ));
8096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
8106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
8116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
8126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                func = (CvFunc2D_3A)(add_tab.fn_2d[depth]);
8136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( !func )
8146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    CV_ERROR( CV_StsUnsupportedFormat, "" );
8156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                do
8176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
8186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    IPPI_CALL( func( iterator.ptr[0], CV_STUB_STEP,
8196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                     iterator.ptr[1], CV_STUB_STEP,
8206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                     iterator.ptr[2], CV_STUB_STEP,
8216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                     iterator.size ));
8226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
8236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                while( cvNextNArraySlice( &iterator ));
8246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
8256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            EXIT;
8266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
8276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
8286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
8296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int coi1 = 0, coi2 = 0, coi3 = 0;
8306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( src1 = cvGetMat( src1, &srcstub1, &coi1 ));
8326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( src2 = cvGetMat( src2, &srcstub2, &coi2 ));
8336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( dst = cvGetMat( dst, &dststub, &coi3 ));
8346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( coi1 + coi2 + coi3 != 0 )
8356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_ERROR( CV_BadCOI, "" );
8366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
8376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
8386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_TYPES_EQ( src1, src2 ) || !CV_ARE_TYPES_EQ( src1, dst ))
8406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR_FROM_CODE( CV_StsUnmatchedFormats );
8416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_SIZES_EQ( src1, src2 ) || !CV_ARE_SIZES_EQ( src1, dst ))
8436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR_FROM_CODE( CV_StsUnmatchedSizes );
8446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    type = CV_MAT_TYPE(src1->type);
8466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size = cvGetMatSize( src1 );
8476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    depth = CV_MAT_DEPTH(type);
8486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cn = CV_MAT_CN(type);
8496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !mask )
8516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
8526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_IS_MAT_CONT( src1->type & src2->type & dst->type ))
8536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
8546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int len = size.width*size.height*cn;
8556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( len <= CV_MAX_INLINE_MAT_OP_SIZE*CV_MAX_INLINE_MAT_OP_SIZE )
8576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
8586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( depth == CV_32F )
8596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
8606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    const float* src1data = (const float*)(src1->data.ptr);
8616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    const float* src2data = (const float*)(src2->data.ptr);
8626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    float* dstdata = (float*)(dst->data.ptr);
8636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    do
8656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    {
8666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        dstdata[len-1] = (float)(src1data[len-1] + src2data[len-1]);
8676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    }
8686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    while( --len );
8696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    EXIT;
8716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
8726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( depth == CV_64F )
8746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
8756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    const double* src1data = (const double*)(src1->data.ptr);
8766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    const double* src2data = (const double*)(src2->data.ptr);
8776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    double* dstdata = (double*)(dst->data.ptr);
8786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    do
8806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    {
8816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        dstdata[len-1] = src1data[len-1] + src2data[len-1];
8826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    }
8836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    while( --len );
8846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    EXIT;
8866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
8876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
8886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            cont_flag = 1;
8896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
8906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dy = size.height;
8926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        copym_func = 0;
8936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        tdst = dst;
8946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
8956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
8966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
8976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int buf_size, elem_size;
8986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_IS_MAT(mask) )
9006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( mask = cvGetMat( mask, &maskstub ));
9016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_IS_MASK_ARR(mask))
9036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsBadMask, "" );
9046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_ARE_SIZES_EQ( mask, dst ))
9066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsUnmatchedSizes, "" );
9076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cont_flag = CV_IS_MAT_CONT( src1->type & src2->type & dst->type & mask->type );
9096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        elem_size = CV_ELEM_SIZE(type);
9106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dy = CV_MAX_LOCAL_SIZE/(elem_size*size.height);
9126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dy = MAX(dy,1);
9136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dy = MIN(dy,size.height);
9146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dstbuf = cvMat( dy, size.width, type );
9156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !cont_flag )
9166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dstbuf.step = cvAlign( dstbuf.step, 8 );
9176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        buf_size = dstbuf.step ? dstbuf.step*dy : size.width*elem_size;
9186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( buf_size > CV_MAX_LOCAL_SIZE )
9196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
9206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( buffer = (uchar*)cvAlloc( buf_size ));
9216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            local_alloc = 0;
9226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
9236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
9246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            buffer = (uchar*)cvStackAlloc( buf_size );
9256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dstbuf.data.ptr = buffer;
9266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        tdst = &dstbuf;
9276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        copym_func = icvGetCopyMaskFunc( elem_size );
9296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
9306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !inittab )
9326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
9336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvInitAddC1RTable( &add_tab );
9346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        inittab = 1;
9356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
9366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( depth <= CV_16S )
9386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
9396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        func = 0;
9406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        func_sfs = (CvFunc2D_3A1I)(add_tab.fn_2d[depth]);
9416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !func_sfs )
9426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsUnsupportedFormat, "" );
9436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
9446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
9456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
9466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        func_sfs = 0;
9476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        func = (CvFunc2D_3A)(add_tab.fn_2d[depth]);
9486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !func )
9496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsUnsupportedFormat, "" );
9506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
9516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    src1_step = src1->step;
9536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    src2_step = src2->step;
9546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dst_step = dst->step;
9556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tdst_step = tdst->step;
9566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    mask_step = mask ? mask->step : 0;
9576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( y = 0; y < size.height; y += dy )
9596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
9606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        tsize.width = size.width;
9616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        tsize.height = dy;
9626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( y + dy > size.height )
9636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            tsize.height = size.height - y;
9646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( cont_flag || tsize.height == 1 )
9656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
9666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            tsize.width *= tsize.height;
9676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            tsize.height = 1;
9686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            src1_step = src2_step = tdst_step = dst_step = mask_step = CV_STUB_STEP;
9696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
9706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IPPI_CALL( depth <= CV_16S ?
9726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            func_sfs( src1->data.ptr + y*src1->step, src1_step,
9736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                      src2->data.ptr + y*src2->step, src2_step,
9746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                      tdst->data.ptr, tdst_step,
9756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                      cvSize( tsize.width*cn, tsize.height ), 0 ) :
9766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            func( src1->data.ptr + y*src1->step, src1_step,
9776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                  src2->data.ptr + y*src2->step, src2_step,
9786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                  tdst->data.ptr, tdst_step,
9796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                  cvSize( tsize.width*cn, tsize.height )));
9806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( mask )
9826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
9836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            IPPI_CALL( copym_func( tdst->data.ptr, tdst_step, dst->data.ptr + y*dst->step,
9846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                   dst_step, tsize, mask->data.ptr + y*mask->step, mask_step ));
9856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
9866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
9876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
9896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !local_alloc )
9916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cvFree( &buffer );
9926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
9936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
9966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvAddS( const void* srcarr, CvScalar scalar, void* dstarr, const void* maskarr )
9976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
9986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static CvFuncTable add_tab;
9996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static int inittab = 0;
10006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int local_alloc = 1;
10016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uchar* buffer = 0;
10026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvAddS" );
10046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
10066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int sctype, y, dy, type, depth, cn, coi = 0, cont_flag = 0;
10086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int src_step, dst_step, tdst_step, mask_step;
10096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat srcstub, *src = (CvMat*)srcarr;
10106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat dststub, *dst = (CvMat*)dstarr;
10116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat maskstub, *mask = (CvMat*)maskarr;
10126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat dstbuf, *tdst;
10136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvFunc2D_2A1P func;
10146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvCopyMaskFunc copym_func;
10156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double buf[12];
10166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int is_nd = 0;
10176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize size, tsize;
10186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !inittab )
10206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
10216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvInitAddCC1RTable( &add_tab );
10226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        inittab = 1;
10236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
10246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT(src) )
10266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
10276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_IS_MATND(src) )
10286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            is_nd = 1;
10296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
10306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
10316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( src = cvGetMat( src, &srcstub, &coi ));
10326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( coi != 0 )
10336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_ERROR( CV_BadCOI, "" );
10346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
10356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
10366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT(dst) )
10386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
10396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_IS_MATND(dst) )
10406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            is_nd = 1;
10416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
10426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
10436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( dst = cvGetMat( dst, &dststub, &coi ));
10446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( coi != 0 )
10456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_ERROR( CV_BadCOI, "" );
10466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
10476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
10486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( is_nd )
10506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
10516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvArr* arrs[] = { src, dst };
10526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvMatND stubs[2];
10536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvNArrayIterator iterator;
10546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( maskarr )
10566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsBadMask,
10576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            "This operation on multi-dimensional arrays does not support mask" );
10586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( cvInitNArrayIterator( 2, arrs, 0, stubs, &iterator ));
10606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        sctype = type = CV_MAT_TYPE(iterator.hdr[0]->type);
10626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_MAT_DEPTH(sctype) < CV_32S )
10636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            sctype = (type & CV_MAT_CN_MASK) | CV_32SC1;
10646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        iterator.size.width *= CV_MAT_CN(type);
10656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        func = (CvFunc2D_2A1P)(add_tab.fn_2d[CV_MAT_DEPTH(type)]);
10676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !func )
10686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsUnsupportedFormat, "" );
10696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( cvScalarToRawData( &scalar, buf, sctype, 1 ));
10716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        do
10736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
10746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            IPPI_CALL( func( iterator.ptr[0], CV_STUB_STEP,
10756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                             iterator.ptr[1], CV_STUB_STEP,
10766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                             iterator.size, buf ));
10776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
10786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        while( cvNextNArraySlice( &iterator ));
10796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        EXIT;
10806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
10816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_TYPES_EQ( src, dst ))
10836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR_FROM_CODE( CV_StsUnmatchedFormats );
10846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_SIZES_EQ( src, dst ))
10866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR_FROM_CODE( CV_StsUnmatchedSizes );
10876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    sctype = type = CV_MAT_TYPE(src->type);
10896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    depth = CV_MAT_DEPTH(type);
10906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cn = CV_MAT_CN(type);
10916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( depth < CV_32S )
10926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        sctype = (type & CV_MAT_CN_MASK) | CV_32SC1;
10936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size = cvGetMatSize( src );
10956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !maskarr )
10976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
10986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_IS_MAT_CONT( src->type & dst->type ))
10996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
11006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( size.width <= CV_MAX_INLINE_MAT_OP_SIZE )
11016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
11026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int len = size.width * size.height;
11036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( type == CV_32FC1 )
11056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
11066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    const float* srcdata = (const float*)(src->data.ptr);
11076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    float* dstdata = (float*)(dst->data.ptr);
11086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    do
11106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    {
11116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        dstdata[len-1] = (float)(scalar.val[0] + srcdata[len-1]);
11126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    }
11136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    while( --len );
11146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    EXIT;
11166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
11176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( type == CV_64FC1 )
11196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
11206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    const double* srcdata = (const double*)(src->data.ptr);
11216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    double* dstdata = (double*)(dst->data.ptr);
11226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    do
11246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    {
11256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        dstdata[len-1] = scalar.val[0] + srcdata[len-1];
11266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    }
11276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    while( --len );
11286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    EXIT;
11306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
11316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
11326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            cont_flag = 1;
11336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
11346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dy = size.height;
11366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        copym_func = 0;
11376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        tdst = dst;
11386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
11396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
11406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
11416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int buf_size, elem_size;
11426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_IS_MAT(mask) )
11446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( mask = cvGetMat( mask, &maskstub ));
11456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_IS_MASK_ARR(mask))
11476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsBadMask, "" );
11486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_ARE_SIZES_EQ( mask, dst ))
11506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsUnmatchedSizes, "" );
11516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cont_flag = CV_IS_MAT_CONT( src->type & dst->type & mask->type );
11536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        elem_size = CV_ELEM_SIZE(type);
11546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dy = CV_MAX_LOCAL_SIZE/(elem_size*size.height);
11566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dy = MAX(dy,1);
11576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dy = MIN(dy,size.height);
11586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dstbuf = cvMat( dy, size.width, type );
11596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !cont_flag )
11606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dstbuf.step = cvAlign( dstbuf.step, 8 );
11616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        buf_size = dstbuf.step ? dstbuf.step*dy : size.width*elem_size;
11626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( buf_size > CV_MAX_LOCAL_SIZE )
11636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
11646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( buffer = (uchar*)cvAlloc( buf_size ));
11656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            local_alloc = 0;
11666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
11676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
11686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            buffer = (uchar*)cvStackAlloc( buf_size );
11696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dstbuf.data.ptr = buffer;
11706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        tdst = &dstbuf;
11716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        copym_func = icvGetCopyMaskFunc( elem_size );
11736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
11746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    func = (CvFunc2D_2A1P)(add_tab.fn_2d[depth]);
11766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !func )
11776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnsupportedFormat, "" );
11786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    src_step = src->step;
11806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dst_step = dst->step;
11816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tdst_step = tdst->step;
11826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    mask_step = mask ? mask->step : 0;
11836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_CALL( cvScalarToRawData( &scalar, buf, sctype, 1 ));
11856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( y = 0; y < size.height; y += dy )
11876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
11886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        tsize.width = size.width;
11896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        tsize.height = dy;
11906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( y + dy > size.height )
11916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            tsize.height = size.height - y;
11926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( cont_flag || tsize.height == 1 )
11936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
11946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            tsize.width *= tsize.height;
11956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            tsize.height = 1;
11966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            src_step = tdst_step = dst_step = mask_step = CV_STUB_STEP;
11976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
11986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IPPI_CALL( func( src->data.ptr + y*src->step, src_step,
12006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                         tdst->data.ptr, tdst_step,
12016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                         cvSize( tsize.width*cn, tsize.height ), buf ));
12026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( mask )
12036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
12046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            IPPI_CALL( copym_func( tdst->data.ptr, tdst_step, dst->data.ptr + y*dst->step,
12056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                   dst_step, tsize, mask->data.ptr + y*mask->step, mask_step ));
12066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
12076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
12086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
12106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !local_alloc )
12126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cvFree( &buffer );
12136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
12146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/***************************************** M U L ****************************************/
12176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_MUL_OP_CASE( flavor, arrtype, worktype, _cast_macro1_,                  \
12196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                             _cast_macro2_, _cvt_macro_ )                               \
12206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL                                                              \
12216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    icvMul_##flavor##_C1R( const arrtype* src1, int step1,                              \
12226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                           const arrtype* src2, int step2,                              \
12236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                           arrtype* dst, int step,                                      \
12246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                           CvSize size, double scale )                                  \
12256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                                       \
12266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step1 /= sizeof(src1[0]); step2 /= sizeof(src2[0]); step /= sizeof(dst[0]);         \
12276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                        \
12286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( fabs(scale - 1.) < DBL_EPSILON )                                                \
12296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                                   \
12306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( ; size.height--; src1+=step1, src2+=step2, dst+=step )                     \
12316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                                               \
12326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int i;                                                                      \
12336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( i = 0; i <= size.width - 4; i += 4 )                                   \
12346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {                                                                           \
12356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                worktype t0 = src1[i] * src2[i];                                        \
12366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                worktype t1 = src1[i+1] * src2[i+1];                                    \
12376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                        \
12386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[i] = _cast_macro2_(t0);                                             \
12396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[i+1] = _cast_macro2_(t1);                                           \
12406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                        \
12416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                t0 = src1[i+2] * src2[i+2];                                             \
12426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                t1 = src1[i+3] * src2[i+3];                                             \
12436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                        \
12446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[i+2] = _cast_macro2_(t0);                                           \
12456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[i+3] = _cast_macro2_(t1);                                           \
12466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                                                                           \
12476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                        \
12486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( ; i < size.width; i++ )                                                \
12496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {                                                                           \
12506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                worktype t0 = src1[i] * src2[i];                                        \
12516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[i] = _cast_macro2_(t0);                                             \
12526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                                                                           \
12536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                                               \
12546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                                   \
12556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else                                                                                \
12566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                                   \
12576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( ; size.height--; src1+=step1, src2+=step2, dst+=step )                     \
12586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                                               \
12596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int i;                                                                      \
12606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( i = 0; i <= size.width - 4; i += 4 )                                   \
12616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {                                                                           \
12626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                double ft0 = scale*_cvt_macro_(src1[i])*_cvt_macro_(src2[i]);           \
12636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                double ft1 = scale*_cvt_macro_(src1[i+1])*_cvt_macro_(src2[i+1]);       \
12646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                worktype t0 = _cast_macro1_(ft0);                                       \
12656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                worktype t1 = _cast_macro1_(ft1);                                       \
12666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                        \
12676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[i] = _cast_macro2_(t0);                                             \
12686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[i+1] = _cast_macro2_(t1);                                           \
12696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                        \
12706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                ft0 = scale*_cvt_macro_(src1[i+2])*_cvt_macro_(src2[i+2]);              \
12716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                ft1 = scale*_cvt_macro_(src1[i+3])*_cvt_macro_(src2[i+3]);              \
12726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                t0 = _cast_macro1_(ft0);                                                \
12736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                t1 = _cast_macro1_(ft1);                                                \
12746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                        \
12756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[i+2] = _cast_macro2_(t0);                                           \
12766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[i+3] = _cast_macro2_(t1);                                           \
12776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                                                                           \
12786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                        \
12796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( ; i < size.width; i++ )                                                \
12806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {                                                                           \
12816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                worktype t0;                                                            \
12826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                t0 = _cast_macro1_(scale*_cvt_macro_(src1[i])*_cvt_macro_(src2[i]));    \
12836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[i] = _cast_macro2_(t0);                                             \
12846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                                                                           \
12856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                                               \
12866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                                   \
12876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                        \
12886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                                                       \
12896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
12906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_MUL_OP_CASE( 8u, uchar, int, cvRound, CV_CAST_8U, CV_8TO32F )
12936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_MUL_OP_CASE( 16u, ushort, int, cvRound, CV_CAST_16U, CV_NOP )
12946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_MUL_OP_CASE( 16s, short, int, cvRound, CV_CAST_16S, CV_NOP )
12956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_MUL_OP_CASE( 32s, int, int, cvRound, CV_CAST_32S, CV_NOP )
12966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_MUL_OP_CASE( 32f, float, double, CV_NOP, CV_CAST_32F, CV_NOP )
12976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_MUL_OP_CASE( 64f, double, double, CV_NOP, CV_CAST_64F, CV_NOP )
12986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INIT_ARITHM_FUNC_TAB( Mul, C1R )
13016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL * CvScaledElWiseFunc)( const void* src1, int step1,
13046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                    const void* src2, int step2,
13056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                    void* dst, int step,
13066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                    CvSize size, double scale );
13076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
13096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvMul( const void* srcarr1, const void* srcarr2, void* dstarr, double scale )
13106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
13116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static CvFuncTable mul_tab;
13126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static int inittab = 0;
13136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvMul" );
13156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
13176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int type, depth, coi = 0;
13196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int src1_step, src2_step, dst_step;
13206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int is_nd = 0;
13216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat srcstub1, *src1 = (CvMat*)srcarr1;
13226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat srcstub2, *src2 = (CvMat*)srcarr2;
13236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat dststub,  *dst = (CvMat*)dstarr;
13246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize size;
13256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvScaledElWiseFunc func;
13266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !inittab )
13286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
13296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvInitMulC1RTable( &mul_tab );
13306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        inittab = 1;
13316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
13326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT(src1) )
13346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
13356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_IS_MATND(src1) )
13366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            is_nd = 1;
13376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
13386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
13396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( src1 = cvGetMat( src1, &srcstub1, &coi ));
13406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( coi != 0 )
13416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_ERROR( CV_BadCOI, "" );
13426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
13436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
13446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT(src2) )
13466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
13476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_IS_MATND(src2) )
13486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            is_nd = 1;
13496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
13506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
13516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( src2 = cvGetMat( src2, &srcstub2, &coi ));
13526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( coi != 0 )
13536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_ERROR( CV_BadCOI, "" );
13546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
13556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
13566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT(dst) )
13586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
13596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_IS_MATND(dst) )
13606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            is_nd = 1;
13616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
13626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
13636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( dst = cvGetMat( dst, &dststub, &coi ));
13646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( coi != 0 )
13656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_ERROR( CV_BadCOI, "" );
13666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
13676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
13686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( is_nd )
13706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
13716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvArr* arrs[] = { src1, src2, dst };
13726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvMatND stubs[3];
13736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvNArrayIterator iterator;
13746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( cvInitNArrayIterator( 3, arrs, 0, stubs, &iterator ));
13766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        type = iterator.hdr[0]->type;
13786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        iterator.size.width *= CV_MAT_CN(type);
13796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        func = (CvScaledElWiseFunc)(mul_tab.fn_2d[CV_MAT_DEPTH(type)]);
13816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !func )
13826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsUnsupportedFormat, "" );
13836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        do
13856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
13866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            IPPI_CALL( func( iterator.ptr[0], CV_STUB_STEP,
13876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                             iterator.ptr[1], CV_STUB_STEP,
13886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                             iterator.ptr[2], CV_STUB_STEP,
13896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                             iterator.size, scale ));
13906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
13916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        while( cvNextNArraySlice( &iterator ));
13926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        EXIT;
13936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
13946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_TYPES_EQ( src1, src2 ) || !CV_ARE_TYPES_EQ( src1, dst ))
13966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR_FROM_CODE( CV_StsUnmatchedFormats );
13976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_SIZES_EQ( src1, src2 ) || !CV_ARE_SIZES_EQ( src1, dst ))
13996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR_FROM_CODE( CV_StsUnmatchedSizes );
14006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    type = CV_MAT_TYPE(src1->type);
14026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size = cvGetMatSize( src1 );
14036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    depth = CV_MAT_DEPTH(type);
14056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size.width *= CV_MAT_CN( type );
14066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_IS_MAT_CONT( src1->type & src2->type & dst->type ))
14086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
14096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size.width *= size.height;
14106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( size.width <= CV_MAX_INLINE_MAT_OP_SIZE && scale == 1 )
14126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
14136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( depth == CV_32F )
14146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
14156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                const float* src1data = (const float*)(src1->data.ptr);
14166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                const float* src2data = (const float*)(src2->data.ptr);
14176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                float* dstdata = (float*)(dst->data.ptr);
14186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                do
14206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
14216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    dstdata[size.width-1] = (float)
14226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        (src1data[size.width-1] * src2data[size.width-1]);
14236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
14246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                while( --size.width );
14256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                EXIT;
14276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
14286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( depth == CV_64F )
14306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
14316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                const double* src1data = (const double*)(src1->data.ptr);
14326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                const double* src2data = (const double*)(src2->data.ptr);
14336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                double* dstdata = (double*)(dst->data.ptr);
14346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                do
14366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
14376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    dstdata[size.width-1] =
14386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        src1data[size.width-1] * src2data[size.width-1];
14396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
14406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                while( --size.width );
14416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                EXIT;
14436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
14446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
14456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        src1_step = src2_step = dst_step = CV_STUB_STEP;
14476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size.height = 1;
14486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
14496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
14506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
14516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        src1_step = src1->step;
14526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        src2_step = src2->step;
14536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dst_step = dst->step;
14546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
14556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    func = (CvScaledElWiseFunc)(mul_tab.fn_2d[CV_MAT_DEPTH(type)]);
14576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !func )
14596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnsupportedFormat, "" );
14606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    IPPI_CALL( func( src1->data.ptr, src1_step, src2->data.ptr, src2_step,
14626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                     dst->data.ptr, dst_step, size, scale ));
14636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
14656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
14666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/***************************************** D I V ****************************************/
14696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_DIV_OP_CASE( flavor, arrtype, worktype, checktype, _start_row_macro_,   \
14716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    _cast_macro1_, _cast_macro2_, _cvt_macro_, _check_macro_, isrc )                    \
14726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                        \
14736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL                                                              \
14746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvDiv_##flavor##_C1R( const arrtype* src1, int step1,                                  \
14756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                       const arrtype* src2, int step2,                                  \
14766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                       arrtype* dst, int step,                                          \
14776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                       CvSize size, double scale )                                      \
14786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                                       \
14796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step1 /= sizeof(src1[0]); step2 /= sizeof(src2[0]); step /= sizeof(dst[0]);         \
14806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                        \
14816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src1+=step1, src2+=step2, dst+=step )                         \
14826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                                   \
14836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        _start_row_macro_(checktype, src2);                                             \
14846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( i = 0; i <= size.width - 4; i += 4 )                                       \
14856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                                               \
14866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( _check_macro_(isrc[i]) && _check_macro_(isrc[i+1]) &&                   \
14876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                _check_macro_(isrc[i+2]) && _check_macro_(isrc[i+3]))                   \
14886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {                                                                           \
14896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                double a = (double)_cvt_macro_(src2[i]) * _cvt_macro_(src2[i+1]);       \
14906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                double b = (double)_cvt_macro_(src2[i+2]) * _cvt_macro_(src2[i+3]);     \
14916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                double d = scale/(a * b);                                               \
14926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                        \
14936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                b *= d;                                                                 \
14946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                a *= d;                                                                 \
14956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                        \
14966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                worktype z0 = _cast_macro1_(src2[i+1] * _cvt_macro_(src1[i]) * b);      \
14976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                worktype z1 = _cast_macro1_(src2[i] * _cvt_macro_(src1[i+1]) * b);      \
14986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                worktype z2 = _cast_macro1_(src2[i+3] * _cvt_macro_(src1[i+2]) * a);    \
14996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                worktype z3 = _cast_macro1_(src2[i+2] * _cvt_macro_(src1[i+3]) * a);    \
15006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                        \
15016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[i] = _cast_macro2_(z0);                                             \
15026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[i+1] = _cast_macro2_(z1);                                           \
15036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[i+2] = _cast_macro2_(z2);                                           \
15046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[i+3] = _cast_macro2_(z3);                                           \
15056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                                                                           \
15066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else                                                                        \
15076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {                                                                           \
15086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                worktype z0 = _check_macro_(isrc[i]) ?                                  \
15096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                   _cast_macro1_(_cvt_macro_(src1[i])*scale/_cvt_macro_(src2[i])) : 0;  \
15106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                worktype z1 = _check_macro_(isrc[i+1]) ?                                \
15116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                   _cast_macro1_(_cvt_macro_(src1[i+1])*scale/_cvt_macro_(src2[i+1])):0;\
15126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                worktype z2 = _check_macro_(isrc[i+2]) ?                                \
15136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                   _cast_macro1_(_cvt_macro_(src1[i+2])*scale/_cvt_macro_(src2[i+2])):0;\
15146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                worktype z3 = _check_macro_(isrc[i+3]) ?                                \
15156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                   _cast_macro1_(_cvt_macro_(src1[i+3])*scale/_cvt_macro_(src2[i+3])):0;\
15166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                        \
15176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[i] = _cast_macro2_(z0);                                             \
15186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[i+1] = _cast_macro2_(z1);                                           \
15196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[i+2] = _cast_macro2_(z2);                                           \
15206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[i+3] = _cast_macro2_(z3);                                           \
15216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                                                                           \
15226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                                               \
15236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                        \
15246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( ; i < size.width; i++ )                                                    \
15256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                                               \
15266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            worktype z0 = _check_macro_(isrc[i]) ?                                      \
15276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                _cast_macro1_(_cvt_macro_(src1[i])*scale/_cvt_macro_(src2[i])) : 0;     \
15286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i] = _cast_macro2_(z0);                                                 \
15296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                                               \
15306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                                   \
15316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                        \
15326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                                                       \
15336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
15346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_RECIP_OP_CASE( flavor, arrtype, worktype, checktype,            \
15376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    _start_row_macro_, _cast_macro1_, _cast_macro2_,                            \
15386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    _cvt_macro_, _check_macro_, isrc )                                          \
15396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                \
15406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL                                                      \
15416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvRecip_##flavor##_C1R( const arrtype* src, int step1,                         \
15426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                         arrtype* dst, int step,                                \
15436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                         CvSize size, double scale )                            \
15446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                               \
15456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step1 /= sizeof(src[0]); step /= sizeof(dst[0]);                            \
15466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                \
15476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src+=step1, dst+=step )                               \
15486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                           \
15496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        _start_row_macro_(checktype, src);                                      \
15506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( i = 0; i <= size.width - 4; i += 4 )                               \
15516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                                       \
15526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( _check_macro_(isrc[i]) && _check_macro_(isrc[i+1]) &&           \
15536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                _check_macro_(isrc[i+2]) && _check_macro_(isrc[i+3]))           \
15546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {                                                                   \
15556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                double a = (double)_cvt_macro_(src[i]) * _cvt_macro_(src[i+1]); \
15566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                double b = (double)_cvt_macro_(src[i+2]) * _cvt_macro_(src[i+3]);\
15576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                double d = scale/(a * b);                                       \
15586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                \
15596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                b *= d;                                                         \
15606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                a *= d;                                                         \
15616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                \
15626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                worktype z0 = _cast_macro1_(src[i+1] * b);                      \
15636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                worktype z1 = _cast_macro1_(src[i] * b);                        \
15646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                worktype z2 = _cast_macro1_(src[i+3] * a);                      \
15656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                worktype z3 = _cast_macro1_(src[i+2] * a);                      \
15666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                \
15676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[i] = _cast_macro2_(z0);                                     \
15686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[i+1] = _cast_macro2_(z1);                                   \
15696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[i+2] = _cast_macro2_(z2);                                   \
15706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[i+3] = _cast_macro2_(z3);                                   \
15716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                                                                   \
15726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else                                                                \
15736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {                                                                   \
15746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                worktype z0 = _check_macro_(isrc[i]) ?                          \
15756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                   _cast_macro1_(scale/_cvt_macro_(src[i])) : 0;                \
15766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                worktype z1 = _check_macro_(isrc[i+1]) ?                        \
15776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                   _cast_macro1_(scale/_cvt_macro_(src[i+1])):0;                \
15786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                worktype z2 = _check_macro_(isrc[i+2]) ?                        \
15796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                   _cast_macro1_(scale/_cvt_macro_(src[i+2])):0;                \
15806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                worktype z3 = _check_macro_(isrc[i+3]) ?                        \
15816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                   _cast_macro1_(scale/_cvt_macro_(src[i+3])):0;                \
15826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                \
15836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[i] = _cast_macro2_(z0);                                     \
15846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[i+1] = _cast_macro2_(z1);                                   \
15856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[i+2] = _cast_macro2_(z2);                                   \
15866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[i+3] = _cast_macro2_(z3);                                   \
15876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                                                                   \
15886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                                       \
15896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                \
15906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( ; i < size.width; i++ )                                            \
15916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                                       \
15926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            worktype z0 = _check_macro_(isrc[i]) ?                              \
15936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                _cast_macro1_(scale/_cvt_macro_(src[i])) : 0;                   \
15946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i] = _cast_macro2_(z0);                                         \
15956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                                       \
15966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                           \
15976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                \
15986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                                               \
15996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
16006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define div_start_row_int(checktype, divisor) \
16036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i
16046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define div_start_row_flt(checktype, divisor) \
16066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    const checktype* isrc = (const checktype*)divisor; int i
16076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define div_check_zero_flt(x)  (((x) & 0x7fffffff) != 0)
16096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define div_check_zero_dbl(x)  (((x) & CV_BIG_INT(0x7fffffffffffffff)) != 0)
16106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if defined WIN64 && defined EM64T && defined _MSC_VER && !defined CV_ICC
16126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#pragma optimize("",off)
16136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
16146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_DIV_OP_CASE( 8u, uchar, int, uchar, div_start_row_int,
16166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                     cvRound, CV_CAST_8U, CV_8TO32F, CV_NONZERO, src2 )
16176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if defined WIN64 && defined EM64T && defined _MSC_VER && !defined CV_ICC
16196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#pragma optimize("",on)
16206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
16216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_DIV_OP_CASE( 16u, ushort, int, ushort, div_start_row_int,
16246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                     cvRound, CV_CAST_16U, CV_CAST_64F, CV_NONZERO, src2 )
16256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_DIV_OP_CASE( 16s, short, int, short, div_start_row_int,
16266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                     cvRound, CV_CAST_16S, CV_NOP, CV_NONZERO, src2 )
16276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_DIV_OP_CASE( 32s, int, int, int, div_start_row_int,
16286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                     cvRound, CV_CAST_32S, CV_CAST_64F, CV_NONZERO, src2 )
16296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_DIV_OP_CASE( 32f, float, double, int, div_start_row_flt,
16306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                     CV_NOP, CV_CAST_32F, CV_NOP, div_check_zero_flt, isrc )
16316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_DIV_OP_CASE( 64f, double, double, int64, div_start_row_flt,
16326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                     CV_NOP, CV_CAST_64F, CV_NOP, div_check_zero_dbl, isrc )
16336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_RECIP_OP_CASE( 8u, uchar, int, uchar, div_start_row_int,
16356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                       cvRound, CV_CAST_8U, CV_8TO32F, CV_NONZERO, src )
16366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_RECIP_OP_CASE( 16u, ushort, int, ushort, div_start_row_int,
16376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                       cvRound, CV_CAST_16U, CV_CAST_64F, CV_NONZERO, src )
16386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_RECIP_OP_CASE( 16s, short, int, short, div_start_row_int,
16396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                       cvRound, CV_CAST_16S, CV_NOP, CV_NONZERO, src )
16406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_RECIP_OP_CASE( 32s, int, int, int, div_start_row_int,
16416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                       cvRound, CV_CAST_32S, CV_CAST_64F, CV_NONZERO, src )
16426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_RECIP_OP_CASE( 32f, float, double, int, div_start_row_flt,
16436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                       CV_NOP, CV_CAST_32F, CV_NOP, div_check_zero_flt, isrc  )
16446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_RECIP_OP_CASE( 64f, double, double, int64, div_start_row_flt,
16456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                       CV_NOP, CV_CAST_64F, CV_NOP, div_check_zero_dbl, isrc )
16466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INIT_ARITHM_FUNC_TAB( Div, C1R )
16486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INIT_ARITHM_FUNC_TAB( Recip, C1R )
16496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL * CvRecipFunc)( const void* src, int step1,
16516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                             void* dst, int step,
16526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                             CvSize size, double scale );
16536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
16556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvDiv( const void* srcarr1, const void* srcarr2, void* dstarr, double scale )
16566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
16576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static CvFuncTable div_tab;
16586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static CvFuncTable recip_tab;
16596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static int inittab = 0;
16606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvDiv" );
16626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
16646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int type, coi = 0;
16666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int is_nd = 0;
16676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int src1_step, src2_step, dst_step;
16686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int src1_cont_flag = CV_MAT_CONT_FLAG;
16696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat srcstub1, *src1 = (CvMat*)srcarr1;
16706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat srcstub2, *src2 = (CvMat*)srcarr2;
16716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat dststub,  *dst = (CvMat*)dstarr;
16726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize size;
16736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !inittab )
16756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
16766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvInitDivC1RTable( &div_tab );
16776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvInitRecipC1RTable( &recip_tab );
16786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        inittab = 1;
16796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
16806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT(src2) )
16826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
16836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_IS_MATND(src2))
16846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            is_nd = 1;
16856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
16866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
16876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( src2 = cvGetMat( src2, &srcstub2, &coi ));
16886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( coi != 0 )
16896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_ERROR( CV_BadCOI, "" );
16906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
16916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
16926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( src1 )
16946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
16956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_IS_MATND(src1))
16966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            is_nd = 1;
16976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
16986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
16996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( !CV_IS_MAT(src1) )
17006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
17016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_CALL( src1 = cvGetMat( src1, &srcstub1, &coi ));
17026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( coi != 0 )
17036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    CV_ERROR( CV_BadCOI, "" );
17046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
17056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( !CV_ARE_TYPES_EQ( src1, src2 ))
17076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_ERROR_FROM_CODE( CV_StsUnmatchedFormats );
17086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( !CV_ARE_SIZES_EQ( src1, src2 ))
17106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_ERROR_FROM_CODE( CV_StsUnmatchedSizes );
17116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            src1_cont_flag = src1->type;
17126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
17136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
17146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT(dst) )
17166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
17176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_IS_MATND(dst))
17186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            is_nd = 1;
17196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
17206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
17216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( dst = cvGetMat( dst, &dststub, &coi ));
17226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( coi != 0 )
17236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_ERROR( CV_BadCOI, "" );
17246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
17256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
17266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( is_nd )
17286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
17296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvArr* arrs[] = { dst, src2, src1 };
17306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvMatND stubs[3];
17316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvNArrayIterator iterator;
17326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( cvInitNArrayIterator( 2 + (src1 != 0), arrs, 0, stubs, &iterator ));
17346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        type = iterator.hdr[0]->type;
17366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        iterator.size.width *= CV_MAT_CN(type);
17376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( src1 )
17396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
17406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CvScaledElWiseFunc func =
17416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                (CvScaledElWiseFunc)(div_tab.fn_2d[CV_MAT_DEPTH(type)]);
17426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( !func )
17436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_ERROR( CV_StsUnsupportedFormat, "" );
17446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            do
17466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
17476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                IPPI_CALL( func( iterator.ptr[2], CV_STUB_STEP,
17486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                 iterator.ptr[1], CV_STUB_STEP,
17496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                 iterator.ptr[0], CV_STUB_STEP,
17506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                 iterator.size, scale ));
17516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
17526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            while( cvNextNArraySlice( &iterator ));
17536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
17546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
17556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
17566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CvRecipFunc func = (CvRecipFunc)(recip_tab.fn_2d[CV_MAT_DEPTH(type)]);
17576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( !func )
17596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_ERROR( CV_StsUnsupportedFormat, "" );
17606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            do
17626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
17636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                IPPI_CALL( func( iterator.ptr[1], CV_STUB_STEP,
17646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                 iterator.ptr[0], CV_STUB_STEP,
17656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                 iterator.size, scale ));
17666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
17676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            while( cvNextNArraySlice( &iterator ));
17686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
17696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        EXIT;
17706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
17716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_TYPES_EQ( src2, dst ))
17736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR_FROM_CODE( CV_StsUnmatchedFormats );
17746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_SIZES_EQ( src2, dst ))
17766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR_FROM_CODE( CV_StsUnmatchedSizes );
17776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    type = CV_MAT_TYPE(src2->type);
17796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size = cvGetMatSize( src2 );
17806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size.width *= CV_MAT_CN( type );
17816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_IS_MAT_CONT( src1_cont_flag & src2->type & dst->type ))
17836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
17846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size.width *= size.height;
17856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        src1_step = src2_step = dst_step = CV_STUB_STEP;
17866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size.height = 1;
17876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
17886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
17896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
17906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        src1_step = src1 ? src1->step : 0;
17916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        src2_step = src2->step;
17926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dst_step = dst->step;
17936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
17946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( src1 )
17966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
17976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvScaledElWiseFunc func = (CvScaledElWiseFunc)(div_tab.fn_2d[CV_MAT_DEPTH(type)]);
17986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !func )
18006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsUnsupportedFormat, "" );
18016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IPPI_CALL( func( src1->data.ptr, src1_step, src2->data.ptr, src2_step,
18036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                         dst->data.ptr, dst_step, size, scale ));
18046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
18056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
18066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
18076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvRecipFunc func = (CvRecipFunc)(recip_tab.fn_2d[CV_MAT_DEPTH(type)]);
18086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !func )
18106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsUnsupportedFormat, "" );
18116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IPPI_CALL( func( src2->data.ptr, src2_step,
18136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                         dst->data.ptr, dst_step, size, scale ));
18146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
18156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
18176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
18186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/******************************* A D D   W E I G T E D ******************************/
18206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_ADD_WEIGHTED_OP(flavor, arrtype, worktype, load_macro,          \
18226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                     cast_macro1, cast_macro2)                  \
18236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL                                                      \
18246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvAddWeighted_##flavor##_C1R( const arrtype* src1, int step1, double alpha,    \
18256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                               const arrtype* src2, int step2, double beta,     \
18266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                               double gamma, arrtype* dst, int step, CvSize size )\
18276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                               \
18286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step1 /= sizeof(src1[0]); step2 /= sizeof(src2[0]); step /= sizeof(dst[0]); \
18296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                \
18306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src1 += step1, src2 += step2, dst += step )           \
18316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                           \
18326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int i;                                                                  \
18336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                \
18346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( i = 0; i <= size.width - 4; i += 4 )                               \
18356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                                       \
18366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            worktype t0 = cast_macro1(load_macro((src1)[i])*alpha +             \
18376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                      load_macro((src2)[i])*beta + gamma);      \
18386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            worktype t1 = cast_macro1(load_macro((src1)[i+1])*alpha +           \
18396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                      load_macro((src2)[i+1])*beta + gamma);    \
18406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                \
18416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            (dst)[i] = cast_macro2( t0 );                                       \
18426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            (dst)[i+1] = cast_macro2( t1 );                                     \
18436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                \
18446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t0 = cast_macro1(load_macro((src1)[i+2])*alpha +                    \
18456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                             load_macro((src2)[i+2])*beta + gamma);             \
18466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t1 = cast_macro1(load_macro((src1)[i+3])*alpha +                    \
18476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                             load_macro((src2)[i+3])*beta + gamma);             \
18486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                \
18496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            (dst)[i+2] = cast_macro2( t0 );                                     \
18506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            (dst)[i+3] = cast_macro2( t1 );                                     \
18516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                                       \
18526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                \
18536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( ; i < size.width; i++ )                                            \
18546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                                       \
18556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            worktype t0 = cast_macro1(load_macro((src1)[i])*alpha +             \
18566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                      load_macro((src2)[i])*beta + gamma);      \
18576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            (dst)[i] = cast_macro2( t0 );                                       \
18586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                                       \
18596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                           \
18606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                \
18616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                                               \
18626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
18636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#undef shift
18666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define shift 14
18676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic  CvStatus CV_STDCALL
18696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvAddWeighted_8u_fast_C1R( const uchar* src1, int step1, double alpha,
18706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            const uchar* src2, int step2, double beta,
18716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            double gamma, uchar* dst, int step, CvSize size )
18726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
18736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int tab1[256], tab2[256];
18746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double t = 0;
18756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int j, t0, t1, t2, t3;
18766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    alpha *= 1 << shift;
18786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    gamma = gamma*(1 << shift) + (1 << (shift - 1));
18796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    beta *= 1 << shift;
18806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( j = 0; j < 256; j++ )
18826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
18836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        tab1[j] = cvRound(t);
18846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        tab2[j] = cvRound(gamma);
18856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t += alpha;
18866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        gamma += beta;
18876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
18886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    t0 = (tab1[0] + tab2[0]) >> shift;
18906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    t1 = (tab1[0] + tab2[255]) >> shift;
18916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    t2 = (tab1[255] + tab2[0]) >> shift;
18926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    t3 = (tab1[255] + tab2[255]) >> shift;
18936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( (unsigned)(t0+256) < 768 && (unsigned)(t1+256) < 768 &&
18956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        (unsigned)(t2+256) < 768 && (unsigned)(t3+256) < 768 )
18966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
18976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        // use faster table-based convertion back to 8u
18986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( ; size.height--; src1 += step1, src2 += step2, dst += step )
18996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
19006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int i;
19016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( i = 0; i <= size.width - 4; i += 4 )
19036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
19046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                t0 = CV_FAST_CAST_8U((tab1[src1[i]] + tab2[src2[i]]) >> shift);
19056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                t1 = CV_FAST_CAST_8U((tab1[src1[i+1]] + tab2[src2[i+1]]) >> shift);
19066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[i] = (uchar)t0;
19086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[i+1] = (uchar)t1;
19096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                t0 = CV_FAST_CAST_8U((tab1[src1[i+2]] + tab2[src2[i+2]]) >> shift);
19116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                t1 = CV_FAST_CAST_8U((tab1[src1[i+3]] + tab2[src2[i+3]]) >> shift);
19126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[i+2] = (uchar)t0;
19146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[i+3] = (uchar)t1;
19156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
19166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( ; i < size.width; i++ )
19186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
19196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                t0 = CV_FAST_CAST_8U((tab1[src1[i]] + tab2[src2[i]]) >> shift);
19206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[i] = (uchar)t0;
19216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
19226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
19236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
19246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
19256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
19266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        // use universal macro for convertion back to 8u
19276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( ; size.height--; src1 += step1, src2 += step2, dst += step )
19286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
19296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int i;
19306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( i = 0; i <= size.width - 4; i += 4 )
19326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
19336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                t0 = (tab1[src1[i]] + tab2[src2[i]]) >> shift;
19346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                t1 = (tab1[src1[i+1]] + tab2[src2[i+1]]) >> shift;
19356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[i] = CV_CAST_8U( t0 );
19376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[i+1] = CV_CAST_8U( t1 );
19386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                t0 = (tab1[src1[i+2]] + tab2[src2[i+2]]) >> shift;
19406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                t1 = (tab1[src1[i+3]] + tab2[src2[i+3]]) >> shift;
19416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[i+2] = CV_CAST_8U( t0 );
19436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[i+3] = CV_CAST_8U( t1 );
19446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
19456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( ; i < size.width; i++ )
19476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
19486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                t0 = (tab1[src1[i]] + tab2[src2[i]]) >> shift;
19496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[i] = CV_CAST_8U( t0 );
19506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
19516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
19526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
19536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;
19556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
19566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_ADD_WEIGHTED_OP( 8u, uchar, int, CV_8TO32F, cvRound, CV_CAST_8U )
19596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_ADD_WEIGHTED_OP( 16u, ushort, int, CV_NOP, cvRound, CV_CAST_16U )
19606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_ADD_WEIGHTED_OP( 16s, short, int, CV_NOP, cvRound, CV_CAST_16S )
19616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_ADD_WEIGHTED_OP( 32s, int, int, CV_NOP, cvRound, CV_CAST_32S )
19626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_ADD_WEIGHTED_OP( 32f, float, double, CV_NOP, CV_NOP, CV_CAST_32F )
19636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_ADD_WEIGHTED_OP( 64f, double, double, CV_NOP, CV_NOP, CV_CAST_64F )
19646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INIT_ARITHM_FUNC_TAB( AddWeighted, C1R )
19676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL *CvAddWeightedFunc)( const void* src1, int step1, double alpha,
19696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                  const void* src2, int step2, double beta,
19706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                  double gamma, void* dst,
19716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                  int step, CvSize size );
19726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
19746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvAddWeighted( const CvArr* srcAarr, double alpha,
19756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn               const CvArr* srcBarr, double beta,
19766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn               double gamma, CvArr* dstarr )
19776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
19786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static CvFuncTable addw_tab;
19796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static int inittab = 0;
19806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvAddWeighted" );
19826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
19846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat  srcA_stub, *srcA = (CvMat*)srcAarr;
19866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat  srcB_stub, *srcB = (CvMat*)srcBarr;
19876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat  dst_stub, *dst = (CvMat*)dstarr;
19886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int  coi1, coi2, coi;
19896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int  srcA_step, srcB_step, dst_step;
19906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int  type;
19916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvAddWeightedFunc func;
19926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize size;
19936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !inittab )
19956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
19966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvInitAddWeightedC1RTable( &addw_tab );
19976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        inittab = 1;
19986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
19996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_CALL( srcA = cvGetMat( srcA, &srcA_stub, &coi1 ));
20016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_CALL( srcB = cvGetMat( srcB, &srcB_stub, &coi2 ));
20026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_CALL( dst = cvGetMat( dst, &dst_stub, &coi ));
20036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( coi1 || coi2 || coi )
20056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_BadCOI, "COI must not be set" );
20066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_TYPES_EQ( srcA, srcB ) ||
20086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        !CV_ARE_TYPES_EQ( srcA, dst ))
20096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnmatchedFormats,
20106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        "All input/output arrays should have the same type");
20116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_SIZES_EQ( srcA, srcB ) ||
20136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        !CV_ARE_SIZES_EQ( srcA, dst ))
20146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnmatchedSizes,
20156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        "All input/output arrays should have the same sizes");
20166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size = cvGetMatSize( srcA );
20186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    type = CV_MAT_TYPE( srcA->type );
20196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size.width *= CV_MAT_CN( type );
20206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcA_step = srcA->step;
20216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcB_step = srcB->step;
20226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dst_step = dst->step;
20236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_IS_MAT_CONT( type & srcB->type & dst->type ))
20256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
20266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size.width *= size.height;
20276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size.height = 1;
20286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        srcA_step = srcB_step = dst_step = CV_AUTOSTEP;
20296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
20306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( type == CV_8UC1 && size.width * size.height >= 1024 &&
20326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        fabs(alpha) < 256 && fabs(beta) < 256 && fabs(gamma) < 256*256 )
20336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
20346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        func = (CvAddWeightedFunc)icvAddWeighted_8u_fast_C1R;
20356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
20366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
20376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
20386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        func = (CvAddWeightedFunc)addw_tab.fn_2d[CV_MAT_DEPTH(type)];
20396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !func )
20406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsUnsupportedFormat, "This array type is not supported" );
20416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
20426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    IPPI_CALL( func( srcA->data.ptr, srcA_step, alpha, srcB->data.ptr, srcB_step,
20446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                     beta, gamma, dst->data.ptr, dst_step, size ));
20456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
20476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
20486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* End of file. */
2051