16acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*M///////////////////////////////////////////////////////////////////////////////////////
26acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
36acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
46acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
56acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  By downloading, copying, installing or using the software you agree to this license.
66acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  If you do not agree to this license, do not download, install,
76acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  copy or use the software.
86acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
96acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//                        Intel License Agreement
116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//                For Open Source Computer Vision Library
126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Copyright (C) 2000, Intel Corporation, all rights reserved.
146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Third party copyrights are property of their respective owners.
156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Redistribution and use in source and binary forms, with or without modification,
176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// are permitted provided that the following conditions are met:
186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//   * Redistribution's of source code must retain the above copyright notice,
206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     this list of conditions and the following disclaimer.
216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//   * Redistribution's in binary form must reproduce the above copyright notice,
236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     this list of conditions and the following disclaimer in the documentation
246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     and/or other materials provided with the distribution.
256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//   * The name of Intel Corporation may not be used to endorse or promote products
276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     derived from this software without specific prior written permission.
286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// This software is provided by the copyright holders and contributors "as is" and
306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// any express or implied warranties, including, but not limited to, the implied
316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// warranties of merchantability and fitness for a particular purpose are disclaimed.
326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// In no event shall the Intel Corporation or contributors be liable for any direct,
336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// indirect, incidental, special, exemplary, or consequential damages
346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// (including, but not limited to, procurement of substitute goods or services;
356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// loss of use, data, or profits; or business interruption) however caused
366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// and on any theory of liability, whether in contract, strict liability,
376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// or tort (including negligence or otherwise) arising in any way out of
386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// the use of this software, even if advised of the possibility of such damage.
396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//M*/
416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "_cxcore.h"
436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                                         N o r m                                        *
466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_NORM_CASE( _op_,                \
496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    _update_op_, worktype, len )            \
506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            \
516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; x <= (len) - 4; x += 4 )         \
526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                       \
536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        worktype t0 = (src)[x];             \
546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        worktype t1 = (src)[x+1];           \
556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t0 = _op_(t0);                      \
566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t1 = _op_(t1);                      \
576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        norm = _update_op_( norm, t0 );     \
586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        norm = _update_op_( norm, t1 );     \
596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            \
606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t0 = (src)[x+2];                    \
616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t1 = (src)[x+3];                    \
626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t0 = _op_(t0);                      \
636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t1 = _op_(t1);                      \
646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        norm = _update_op_( norm, t0 );     \
656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        norm = _update_op_( norm, t1 );     \
666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                       \
676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            \
686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; x < (len); x++ )                 \
696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                       \
706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        worktype t0 = (src)[x];             \
716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t0 = (worktype)_op_(t0);            \
726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        norm = _update_op_( norm, t0 );     \
736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_NORM_COI_CASE( _op_,            \
776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    _update_op_, worktype, len, cn )        \
786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            \
796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; x < (len); x++ )                 \
806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                       \
816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        worktype t0 = (src)[x*(cn)];        \
826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t0 = (worktype)_op_(t0);            \
836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        norm = _update_op_( norm, t0 );     \
846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_NORM_DIFF_CASE( _op_,           \
886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    _update_op_, worktype, len )            \
896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            \
906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; x <= (len) - 4; x += 4 )         \
916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                       \
926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        worktype t0 = (src1)[x] - (src2)[x];\
936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        worktype t1 = (src1)[x+1]-(src2)[x+1];\
946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            \
956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t0 = _op_(t0);                      \
966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t1 = _op_(t1);                      \
976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            \
986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        norm = _update_op_( norm, t0 );     \
996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        norm = _update_op_( norm, t1 );     \
1006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            \
1016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t0 = (src1)[x+2] - (src2)[x+2];     \
1026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t1 = (src1)[x+3] - (src2)[x+3];     \
1036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            \
1046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t0 = _op_(t0);                      \
1056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t1 = _op_(t1);                      \
1066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            \
1076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        norm = _update_op_( norm, t0 );     \
1086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        norm = _update_op_( norm, t1 );     \
1096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                       \
1106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            \
1116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; x < (len); x++ )                 \
1126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                       \
1136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        worktype t0 = (src1)[x] - (src2)[x];\
1146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t0 = (worktype)_op_(t0);            \
1156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        norm = _update_op_( norm, t0 );     \
1166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
1176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_NORM_DIFF_COI_CASE( _op_, _update_op_, worktype, len, cn ) \
1206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; x < (len); x++ )                                     \
1216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                           \
1226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        worktype t0 = (src1)[x*(cn)] - (src2)[x*(cn)];          \
1236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t0 = (worktype)_op_(t0);                                \
1246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        norm = _update_op_( norm, t0 );                         \
1256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
1266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*
1296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 	The algorithm and its multiple variations below
1306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    below accumulates the norm by blocks of size "block_size".
1316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    Each block may span across multiple lines and it is
1326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    not necessary aligned by row boundaries. Within a block
1336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    the norm is accumulated to intermediate light-weight
1346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    type (worktype). It really makes sense for 8u, 16s, 16u types
1356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    and L1 & L2 norms, where worktype==int and normtype==int64.
1366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    In other cases a simpler algorithm is used
1376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*/
1386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  ICV_DEF_NORM_NOHINT_BLOCK_FUNC_2D( name, _op_, _update_op_, \
1396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    post_func, arrtype, normtype, worktype, block_size )        \
1406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIPCVAPI_IMPL( CvStatus, name, ( const arrtype* src, int step,   \
1416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize size, double* _norm ), (src, step, size, _norm) )    \
1426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                               \
1436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int remaining = block_size;                                 \
1446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    normtype total_norm = 0;                                    \
1456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    worktype norm = 0;                                          \
1466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step /= sizeof(src[0]);                                     \
1476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
1486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src += step )                         \
1496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                           \
1506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int x = 0;                                              \
1516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        while( x < size.width )                                 \
1526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                       \
1536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int limit = MIN( remaining, size.width - x );       \
1546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            remaining -= limit;                                 \
1556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            limit += x;                                         \
1566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            ICV_NORM_CASE( _op_, _update_op_, worktype, limit );\
1576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( remaining == 0 )                                \
1586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {                                                   \
1596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                remaining = block_size;                         \
1606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                total_norm += (normtype)norm;                   \
1616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                norm = 0;                                       \
1626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                                                   \
1636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                       \
1646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                           \
1656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
1666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    total_norm += (normtype)norm;                               \
1676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    *_norm = post_func((double)total_norm);                     \
1686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                               \
1696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
1706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  ICV_DEF_NORM_NOHINT_FUNC_2D( name, _op_, _update_op_,  \
1736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    post_func, arrtype, normtype, worktype, block_size )        \
1746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIPCVAPI_IMPL( CvStatus, name, ( const arrtype* src, int step,   \
1756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize size, double* _norm ), (src, step, size, _norm) )    \
1766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                               \
1776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    normtype norm = 0;                                          \
1786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step /= sizeof(src[0]);                                     \
1796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
1806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src += step )                         \
1816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                           \
1826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int x = 0;                                              \
1836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ICV_NORM_CASE(_op_, _update_op_, worktype, size.width); \
1846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                           \
1856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
1866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    *_norm = post_func((double)norm);                           \
1876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                               \
1886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
1896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*
1926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   In IPP only 32f flavors of norm functions are with hint.
1936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   For float worktype==normtype==double, thus the block algorithm,
1946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   described above, is not necessary.
1956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn */
1966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  ICV_DEF_NORM_HINT_FUNC_2D( name, _op_, _update_op_,    \
1976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    post_func, arrtype, normtype, worktype, block_size )        \
1986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIPCVAPI_IMPL( CvStatus, name, ( const arrtype* src, int step,   \
1996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize size, double* _norm, CvHintAlgorithm /*hint*/ ),     \
2006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (src, step, size, _norm, cvAlgHintAccurate) )               \
2016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                               \
2026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    normtype norm = 0;                                          \
2036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step /= sizeof(src[0]);                                     \
2046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
2056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src += step )                         \
2066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                           \
2076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int x = 0;                                              \
2086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ICV_NORM_CASE(_op_, _update_op_, worktype, size.width); \
2096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                           \
2106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
2116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    *_norm = post_func((double)norm);                           \
2126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                               \
2136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  ICV_DEF_NORM_NOHINT_BLOCK_FUNC_2D_COI( name, _op_,     \
2176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    _update_op_, post_func, arrtype,                            \
2186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    normtype, worktype, block_size )                            \
2196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL name( const arrtype* src, int step,  \
2206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CvSize size, int cn, int coi, double* _norm )   \
2216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                               \
2226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int remaining = block_size;                                 \
2236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    normtype total_norm = 0;                                    \
2246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    worktype norm = 0;                                          \
2256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step /= sizeof(src[0]);                                     \
2266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    src += coi - 1;                                             \
2276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
2286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src += step )                         \
2296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                           \
2306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int x = 0;                                              \
2316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        while( x < size.width )                                 \
2326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                       \
2336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int limit = MIN( remaining, size.width - x );       \
2346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            remaining -= limit;                                 \
2356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            limit += x;                                         \
2366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            ICV_NORM_COI_CASE( _op_, _update_op_,               \
2376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                               worktype, limit, cn );           \
2386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( remaining == 0 )                                \
2396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {                                                   \
2406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                remaining = block_size;                         \
2416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                total_norm += (normtype)norm;                   \
2426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                norm = 0;                                       \
2436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                                                   \
2446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                       \
2456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                           \
2466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
2476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    total_norm += (normtype)norm;                               \
2486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    *_norm = post_func((double)total_norm);                     \
2496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                               \
2506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  ICV_DEF_NORM_NOHINT_FUNC_2D_COI( name, _op_,           \
2546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    _update_op_, post_func,                                     \
2556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    arrtype, normtype, worktype, block_size )                   \
2566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL name( const arrtype* src, int step,  \
2576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CvSize size, int cn, int coi, double* _norm )   \
2586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                               \
2596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    normtype norm = 0;                                          \
2606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step /= sizeof(src[0]);                                     \
2616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    src += coi - 1;                                             \
2626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
2636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src += step )                         \
2646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                           \
2656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int x = 0;                                              \
2666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ICV_NORM_COI_CASE( _op_, _update_op_,                   \
2676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                           worktype, size.width, cn );          \
2686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                           \
2696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
2706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    *_norm = post_func((double)norm);                           \
2716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                               \
2726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  ICV_DEF_NORM_DIFF_NOHINT_BLOCK_FUNC_2D( name, _op_,    \
2766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    _update_op_, post_func, arrtype,                            \
2776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    normtype, worktype, block_size )                            \
2786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIPCVAPI_IMPL( CvStatus, name,( const arrtype* src1, int step1,  \
2796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    const arrtype* src2, int step2, CvSize size, double* _norm),\
2806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   (src1, step1, src2, step2, size, _norm))                     \
2816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                               \
2826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int remaining = block_size;                                 \
2836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    normtype total_norm = 0;                                    \
2846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    worktype norm = 0;                                          \
2856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step1 /= sizeof(src1[0]);                                   \
2866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step2 /= sizeof(src2[0]);                                   \
2876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
2886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src1 += step1, src2 += step2 )        \
2896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                           \
2906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int x = 0;                                              \
2916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        while( x < size.width )                                 \
2926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                       \
2936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int limit = MIN( remaining, size.width - x );       \
2946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            remaining -= limit;                                 \
2956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            limit += x;                                         \
2966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            ICV_NORM_DIFF_CASE( _op_, _update_op_,              \
2976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                worktype, limit );              \
2986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( remaining == 0 )                                \
2996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {                                                   \
3006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                remaining = block_size;                         \
3016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                total_norm += (normtype)norm;                   \
3026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                norm = 0;                                       \
3036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                                                   \
3046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                       \
3056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                           \
3066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
3076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    total_norm += (normtype)norm;                               \
3086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    *_norm = post_func((double)total_norm);                     \
3096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                               \
3106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
3116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  ICV_DEF_NORM_DIFF_NOHINT_FUNC_2D( name, _op_,          \
3146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    _update_op_, post_func,                                     \
3156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    arrtype, normtype, worktype, block_size )                   \
3166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIPCVAPI_IMPL( CvStatus, name,( const arrtype* src1, int step1,  \
3176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    const arrtype* src2, int step2, CvSize size, double* _norm),\
3186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ( src1, step1, src2, step2, size, _norm ))                  \
3196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                               \
3206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    normtype norm = 0;                                          \
3216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step1 /= sizeof(src1[0]);                                   \
3226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step2 /= sizeof(src2[0]);                                   \
3236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
3246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src1 += step1, src2 += step2 )        \
3256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                           \
3266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int x = 0;                                              \
3276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ICV_NORM_DIFF_CASE( _op_, _update_op_,                  \
3286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            worktype, size.width );             \
3296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                           \
3306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
3316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    *_norm = post_func((double)norm);                           \
3326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                               \
3336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
3346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  ICV_DEF_NORM_DIFF_HINT_FUNC_2D( name, _op_,            \
3376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    _update_op_, post_func,                                     \
3386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    arrtype, normtype, worktype, block_size )                   \
3396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIPCVAPI_IMPL( CvStatus, name,( const arrtype* src1, int step1,  \
3406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    const arrtype* src2, int step2, CvSize size, double* _norm, \
3416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvHintAlgorithm /*hint*/ ),                                 \
3426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (src1, step1, src2, step2, size, _norm, cvAlgHintAccurate ))\
3436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                               \
3446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    normtype norm = 0;                                          \
3456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step1 /= sizeof(src1[0]);                                   \
3466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step2 /= sizeof(src2[0]);                                   \
3476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
3486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src1 += step1, src2 += step2 )        \
3496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                           \
3506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int x = 0;                                              \
3516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ICV_NORM_DIFF_CASE( _op_, _update_op_,                  \
3526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            worktype, size.width );             \
3536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                           \
3546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
3556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    *_norm = post_func((double)norm);                           \
3566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                               \
3576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
3586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  ICV_DEF_NORM_DIFF_NOHINT_BLOCK_FUNC_2D_COI( name, _op_,\
3616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    _update_op_, post_func, arrtype,                            \
3626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    normtype, worktype, block_size )                            \
3636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL name( const arrtype* src1, int step1,\
3646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    const arrtype* src2, int step2, CvSize size,                \
3656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int cn, int coi, double* _norm )                            \
3666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                               \
3676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int remaining = block_size;                                 \
3686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    normtype total_norm = 0;                                    \
3696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    worktype norm = 0;                                          \
3706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step1 /= sizeof(src1[0]);                                   \
3716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step2 /= sizeof(src2[0]);                                   \
3726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    src1 += coi - 1;                                            \
3736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    src2 += coi - 1;                                            \
3746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
3756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src1 += step1, src2 += step2 )        \
3766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                           \
3776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int x = 0;                                              \
3786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        while( x < size.width )                                 \
3796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                       \
3806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int limit = MIN( remaining, size.width - x );       \
3816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            remaining -= limit;                                 \
3826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            limit += x;                                         \
3836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            ICV_NORM_DIFF_COI_CASE( _op_, _update_op_,          \
3846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                    worktype, limit, cn );      \
3856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( remaining == 0 )                                \
3866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {                                                   \
3876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                remaining = block_size;                         \
3886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                total_norm += (normtype)norm;                   \
3896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                norm = 0;                                       \
3906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                                                   \
3916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                       \
3926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                           \
3936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
3946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    total_norm += (normtype)norm;                               \
3956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    *_norm = post_func((double)total_norm);                     \
3966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                               \
3976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
3986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  ICV_DEF_NORM_DIFF_NOHINT_FUNC_2D_COI( name, _op_,      \
4016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    _update_op_, post_func,                                     \
4026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    arrtype, normtype, worktype, block_size )                   \
4036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL name( const arrtype* src1, int step1,\
4046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    const arrtype* src2, int step2, CvSize size,                \
4056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int cn, int coi, double* _norm )                            \
4066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                               \
4076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    normtype norm = 0;                                          \
4086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step1 /= sizeof(src1[0]);                                   \
4096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step2 /= sizeof(src2[0]);                                   \
4106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    src1 += coi - 1;                                            \
4116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    src2 += coi - 1;                                            \
4126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
4136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src1 += step1, src2 += step2 )        \
4146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                           \
4156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int x = 0;                                              \
4166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ICV_NORM_DIFF_COI_CASE( _op_, _update_op_,              \
4176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                worktype, size.width, cn );     \
4186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                           \
4196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
4206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    *_norm = post_func((double)norm);                           \
4216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                               \
4226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
4236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
4266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                             N o r m   with    M A S K                                  *
4276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
4286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_NORM_MASK_CASE( _op_,               \
4306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        _update_op_, worktype, len )            \
4316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                               \
4326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; x <= (len) - 2; x += 2 )             \
4336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                           \
4346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        worktype t0;                            \
4356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( mask[x] )                           \
4366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                       \
4376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t0 = (src)[x];                      \
4386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t0 = _op_(t0);                      \
4396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            norm = _update_op_( norm, t0 );     \
4406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                       \
4416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( mask[x+1] )                         \
4426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                       \
4436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t0 = (src)[x+1];                    \
4446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t0 = _op_(t0);                      \
4456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            norm = _update_op_( norm, t0 );     \
4466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                       \
4476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                           \
4486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                \
4496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; x < (len); x++ )                     \
4506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( mask[x] )                           \
4516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                       \
4526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            worktype t0 = (src)[x];             \
4536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t0 = _op_(t0);                      \
4546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            norm = _update_op_( norm, t0 );     \
4556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                       \
4566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
4576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_NORM_DIFF_MASK_CASE( _op_, _update_op_, worktype, len ) \
4606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                               \
4616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; x <= (len) - 2; x += 2 )             \
4626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                           \
4636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        worktype t0;                            \
4646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( mask[x] )                           \
4656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                       \
4666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t0 = (src1)[x] - (src2)[x];         \
4676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t0 = _op_(t0);                      \
4686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            norm = _update_op_( norm, t0 );     \
4696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                       \
4706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( mask[x+1] )                         \
4716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                       \
4726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t0 = (src1)[x+1] - (src2)[x+1];     \
4736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t0 = _op_(t0);                      \
4746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            norm = _update_op_( norm, t0 );     \
4756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                       \
4766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                           \
4776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                \
4786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; x < (len); x++ )                     \
4796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( mask[x] )                           \
4806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                       \
4816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            worktype t0 = (src1)[x] - (src2)[x];\
4826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t0 = _op_(t0);                      \
4836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            norm = _update_op_( norm, t0 );     \
4846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                       \
4856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
4866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_NORM_MASK_COI_CASE( _op_, _update_op_, worktype, len, cn ) \
4896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                               \
4906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; x < (len); x++ )                     \
4916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( mask[x] )                           \
4926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                       \
4936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            worktype t0 = (src)[x*(cn)];        \
4946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t0 = _op_(t0);                      \
4956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            norm = _update_op_( norm, t0 );     \
4966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                       \
4976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
4986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_NORM_DIFF_MASK_COI_CASE( _op_, _update_op_, worktype, len, cn )\
5016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                               \
5026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; x < (len); x++ )                     \
5036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( mask[x] )                           \
5046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                       \
5056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            worktype t0 = (src1)[x*(cn)] - (src2)[x*(cn)];  \
5066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t0 = _op_(t0);                      \
5076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            norm = _update_op_( norm, t0 );     \
5086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                       \
5096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
5106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  ICV_DEF_NORM_MASK_NOHINT_BLOCK_FUNC_2D( name, _op_,    \
5136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    _update_op_, post_func, arrtype,                            \
5146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    normtype, worktype, block_size )                            \
5156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIPCVAPI_IMPL( CvStatus, name, ( const arrtype* src, int step,   \
5166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    const uchar* mask, int maskstep, CvSize size, double* _norm ),\
5176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (src, step, mask, maskstep, size, _norm) )                  \
5186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                               \
5196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int remaining = block_size;                                 \
5206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    normtype total_norm = 0;                                    \
5216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    worktype norm = 0;                                          \
5226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step /= sizeof(src[0]);                                     \
5236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
5246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src += step, mask += maskstep )       \
5256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                           \
5266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int x = 0;                                              \
5276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        while( x < size.width )                                 \
5286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                       \
5296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int limit = MIN( remaining, size.width - x );       \
5306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            remaining -= limit;                                 \
5316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            limit += x;                                         \
5326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            ICV_NORM_MASK_CASE( _op_, _update_op_,              \
5336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                worktype, limit );              \
5346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( remaining == 0 )                                \
5356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {                                                   \
5366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                remaining = block_size;                         \
5376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                total_norm += (normtype)norm;                   \
5386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                norm = 0;                                       \
5396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                                                   \
5406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                       \
5416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                           \
5426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
5436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    total_norm += (normtype)norm;                               \
5446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    *_norm = post_func((double)total_norm);                     \
5456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                               \
5466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
5476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  ICV_DEF_NORM_MASK_NOHINT_FUNC_2D( name, _op_, _update_op_,\
5506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    post_func, arrtype, normtype, worktype, block_size )        \
5516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIPCVAPI_IMPL( CvStatus, name, ( const arrtype* src, int step,   \
5526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    const uchar* mask, int maskstep, CvSize size, double* _norm ),\
5536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (src, step, mask, maskstep, size, _norm) )                  \
5546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                               \
5556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    normtype norm = 0;                                          \
5566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step /= sizeof(src[0]);                                     \
5576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
5586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src += step, mask += maskstep )       \
5596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                           \
5606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int x = 0;                                              \
5616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ICV_NORM_MASK_CASE( _op_, _update_op_,                  \
5626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            worktype, size.width );             \
5636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                           \
5646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
5656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    *_norm = post_func((double)norm);                           \
5666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                               \
5676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
5686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  ICV_DEF_NORM_MASK_NOHINT_BLOCK_FUNC_2D_COI( name, _op_,\
5716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                _update_op_, post_func, arrtype,                \
5726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                normtype, worktype, block_size )                \
5736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL name( const arrtype* src, int step,  \
5746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    const uchar* mask, int maskstep, CvSize size,               \
5756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int cn, int coi, double* _norm )                            \
5766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                               \
5776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int remaining = block_size;                                 \
5786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    normtype total_norm = 0;                                    \
5796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    worktype norm = 0;                                          \
5806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step /= sizeof(src[0]);                                     \
5816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    src += coi - 1;                                             \
5826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
5836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src += step, mask += maskstep )       \
5846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                           \
5856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int x = 0;                                              \
5866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        while( x < size.width )                                 \
5876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                       \
5886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int limit = MIN( remaining, size.width - x );       \
5896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            remaining -= limit;                                 \
5906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            limit += x;                                         \
5916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            ICV_NORM_MASK_COI_CASE( _op_, _update_op_,          \
5926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                    worktype, limit, cn );      \
5936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( remaining == 0 )                                \
5946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {                                                   \
5956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                remaining = block_size;                         \
5966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                total_norm += (normtype)norm;                   \
5976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                norm = 0;                                       \
5986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                                                   \
5996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                       \
6006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                           \
6016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
6026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    total_norm += (normtype)norm;                               \
6036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    *_norm = post_func((double)total_norm);                     \
6046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                               \
6056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
6066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  ICV_DEF_NORM_MASK_NOHINT_FUNC_2D_COI( name, _op_,      \
6096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    _update_op_, post_func,                                     \
6106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    arrtype, normtype, worktype, block_size )                   \
6116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL name( const arrtype* src, int step,  \
6126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    const uchar* mask, int maskstep, CvSize size,               \
6136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int cn, int coi, double* _norm )                            \
6146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                               \
6156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    normtype norm = 0;                                          \
6166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step /= sizeof(src[0]);                                     \
6176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    src += coi - 1;                                             \
6186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
6196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src += step, mask += maskstep )       \
6206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                           \
6216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int x = 0;                                              \
6226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ICV_NORM_MASK_COI_CASE( _op_, _update_op_,              \
6236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                worktype, size.width, cn );     \
6246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                           \
6256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
6266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    *_norm = post_func((double)norm);                           \
6276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                               \
6286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
6296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  ICV_DEF_NORM_DIFF_MASK_NOHINT_BLOCK_FUNC_2D( name,     \
6336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    _op_, _update_op_, post_func, arrtype,                      \
6346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    normtype, worktype, block_size )                            \
6356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIPCVAPI_IMPL( CvStatus, name,( const arrtype* src1, int step1,  \
6366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    const arrtype* src2, int step2, const uchar* mask,          \
6376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int maskstep, CvSize size, double* _norm ),                 \
6386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (src1, step1, src2, step2, mask, maskstep, size, _norm ))   \
6396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                               \
6406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int remaining = block_size;                                 \
6416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    normtype total_norm = 0;                                    \
6426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    worktype norm = 0;                                          \
6436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step1 /= sizeof(src1[0]);                                   \
6446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step2 /= sizeof(src2[0]);                                   \
6456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
6466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src1 += step1, src2 += step2,         \
6476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                          mask += maskstep )                    \
6486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                           \
6496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int x = 0;                                              \
6506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        while( x < size.width )                                 \
6516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                       \
6526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int limit = MIN( remaining, size.width - x );       \
6536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            remaining -= limit;                                 \
6546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            limit += x;                                         \
6556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            ICV_NORM_DIFF_MASK_CASE( _op_, _update_op_,         \
6566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                     worktype, limit );         \
6576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( remaining == 0 )                                \
6586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {                                                   \
6596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                remaining = block_size;                         \
6606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                total_norm += (normtype)norm;                   \
6616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                norm = 0;                                       \
6626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                                                   \
6636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                       \
6646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                           \
6656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
6666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    total_norm += (normtype)norm;                               \
6676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    *_norm = post_func((double)total_norm);                     \
6686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                               \
6696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
6706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  ICV_DEF_NORM_DIFF_MASK_NOHINT_FUNC_2D( name, _op_,     \
6736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    _update_op_, post_func,                                     \
6746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    arrtype, normtype, worktype, block_size )                   \
6756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIPCVAPI_IMPL( CvStatus, name,( const arrtype* src1, int step1,  \
6766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    const arrtype* src2, int step2, const uchar* mask,          \
6776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int maskstep, CvSize size, double* _norm ),                 \
6786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (src1, step1, src2, step2, mask, maskstep, size, _norm ))   \
6796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                               \
6806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    normtype norm = 0;                                          \
6816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step1 /= sizeof(src1[0]);                                   \
6826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step2 /= sizeof(src2[0]);                                   \
6836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
6846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src1 += step1, src2 += step2,         \
6856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                          mask += maskstep )                    \
6866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                           \
6876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int x = 0;                                              \
6886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ICV_NORM_DIFF_MASK_CASE( _op_, _update_op_,             \
6896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                 worktype, size.width );        \
6906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                           \
6916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
6926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    *_norm = post_func((double)norm);                           \
6936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                               \
6946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
6956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  ICV_DEF_NORM_DIFF_MASK_NOHINT_BLOCK_FUNC_2D_COI( name, \
6986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    _op_, _update_op_, post_func, arrtype,                      \
6996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    normtype, worktype, block_size )                            \
7006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL name( const arrtype* src1, int step1,\
7016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    const arrtype* src2, int step2, const uchar* mask,          \
7026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int maskstep, CvSize size, int cn, int coi, double* _norm ) \
7036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                               \
7046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int remaining = block_size;                                 \
7056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    normtype total_norm = 0;                                    \
7066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    worktype norm = 0;                                          \
7076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step1 /= sizeof(src1[0]);                                   \
7086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step2 /= sizeof(src2[0]);                                   \
7096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    src1 += coi - 1;                                            \
7106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    src2 += coi - 1;                                            \
7116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
7126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src1 += step1, src2 += step2,         \
7136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                          mask += maskstep )                    \
7146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                           \
7156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int x = 0;                                              \
7166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        while( x < size.width )                                 \
7176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                       \
7186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int limit = MIN( remaining, size.width - x );       \
7196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            remaining -= limit;                                 \
7206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            limit += x;                                         \
7216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            ICV_NORM_DIFF_MASK_COI_CASE( _op_, _update_op_,     \
7226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                    worktype, limit, cn );      \
7236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( remaining == 0 )                                \
7246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {                                                   \
7256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                remaining = block_size;                         \
7266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                total_norm += (normtype)norm;                   \
7276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                norm = 0;                                       \
7286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                                                   \
7296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                       \
7306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                           \
7316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
7326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    total_norm += (normtype)norm;                               \
7336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    *_norm = post_func((double)total_norm);                     \
7346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                               \
7356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
7366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  ICV_DEF_NORM_DIFF_MASK_NOHINT_FUNC_2D_COI( name, _op_, \
7396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    _update_op_, post_func,                                     \
7406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    arrtype, normtype, worktype, block_size )                   \
7416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL name( const arrtype* src1, int step1,\
7426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    const arrtype* src2, int step2, const uchar* mask,          \
7436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int maskstep, CvSize size, int cn, int coi, double* _norm ) \
7446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                               \
7456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    normtype norm = 0;                                          \
7466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step1 /= sizeof(src1[0]);                                   \
7476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step2 /= sizeof(src2[0]);                                   \
7486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    src1 += coi - 1;                                            \
7496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    src2 += coi - 1;                                            \
7506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
7516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src1 += step1, src2 += step2,         \
7526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                          mask += maskstep )                    \
7536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                           \
7546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int x = 0;                                              \
7556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ICV_NORM_DIFF_MASK_COI_CASE( _op_, _update_op_,         \
7566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                     worktype, size.width, cn );\
7576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                           \
7586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
7596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    *_norm = post_func((double)norm);                           \
7606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                               \
7616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
7626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//////////////////////////////////// The macros expanded /////////////////////////////////
7656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_NORM_FUNC_ALL_C(flavor, _abs_, _abs_diff_, arrtype, worktype)\
7686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
7696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_NORM_NOHINT_FUNC_2D( icvNorm_Inf_##flavor##_C1R,                    \
7706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    _abs_, MAX, CV_NOP, arrtype, worktype, worktype, 0 )                    \
7716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
7726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_NORM_NOHINT_FUNC_2D_COI( icvNorm_Inf_##flavor##_CnCR,               \
7736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    _abs_, MAX, CV_NOP, arrtype, worktype, worktype, 0 )                    \
7746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
7756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_NORM_DIFF_NOHINT_FUNC_2D( icvNormDiff_Inf_##flavor##_C1R,           \
7766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    _abs_diff_, MAX, CV_NOP, arrtype, worktype, worktype, 0 )               \
7776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
7786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_NORM_DIFF_NOHINT_FUNC_2D_COI( icvNormDiff_Inf_##flavor##_CnCR,      \
7796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    _abs_diff_, MAX, CV_NOP, arrtype, worktype, worktype, 0 )               \
7806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
7816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_NORM_MASK_NOHINT_FUNC_2D( icvNorm_Inf_##flavor##_C1MR,              \
7826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    _abs_, MAX, CV_NOP, arrtype, worktype, worktype, 0 )                    \
7836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
7846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_NORM_MASK_NOHINT_FUNC_2D_COI( icvNorm_Inf_##flavor##_CnCMR,         \
7856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    _abs_, MAX, CV_NOP, arrtype, worktype, worktype, 0 )                    \
7866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
7876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_NORM_DIFF_MASK_NOHINT_FUNC_2D( icvNormDiff_Inf_##flavor##_C1MR,     \
7886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    _abs_diff_, MAX, CV_NOP, arrtype, worktype, worktype, 0 )               \
7896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
7906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_NORM_DIFF_MASK_NOHINT_FUNC_2D_COI( icvNormDiff_Inf_##flavor##_CnCMR,\
7916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    _abs_diff_, MAX, CV_NOP, arrtype, worktype, worktype, 0 )
7926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_NORM_FUNC_ALL_C( 8u, CV_NOP, CV_IABS, uchar, int )
7956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_NORM_FUNC_ALL_C( 16u, CV_NOP, CV_IABS, ushort, int )
7966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_NORM_FUNC_ALL_C( 16s, CV_IABS, CV_IABS, short, int )
7976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// there is no protection from overflow
7986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// (otherwise we had to do everything in int64's or double's)
7996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_NORM_FUNC_ALL_C( 32s, CV_IABS, CV_IABS, int, int )
8006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_NORM_FUNC_ALL_C( 32f, fabs, fabs, float, double )
8016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_NORM_FUNC_ALL_C( 64f, fabs, fabs, double, double )
8026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_NORM_FUNC_ALL_L1( flavor, _abs_, _abs_diff_, hintp_func, nohint_func,\
8046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                  arrtype, normtype, worktype, block_size )         \
8056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                    \
8066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_NORM_##hintp_func##_FUNC_2D( icvNorm_L1_##flavor##_C1R,                     \
8076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    _abs_, CV_ADD, CV_NOP, arrtype, normtype, worktype, block_size )                \
8086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                    \
8096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_NORM_##nohint_func##_FUNC_2D_COI( icvNorm_L1_##flavor##_CnCR,               \
8106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    _abs_, CV_ADD, CV_NOP, arrtype, normtype, worktype, block_size )                \
8116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                    \
8126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_NORM_DIFF_##hintp_func##_FUNC_2D( icvNormDiff_L1_##flavor##_C1R,            \
8136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    _abs_diff_, CV_ADD, CV_NOP, arrtype, normtype, worktype, block_size )           \
8146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                    \
8156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_NORM_DIFF_##nohint_func##_FUNC_2D_COI( icvNormDiff_L1_##flavor##_CnCR,      \
8166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    _abs_diff_, CV_ADD, CV_NOP, arrtype, normtype, worktype, block_size )           \
8176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                    \
8186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_NORM_MASK_##nohint_func##_FUNC_2D( icvNorm_L1_##flavor##_C1MR,              \
8196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    _abs_, CV_ADD, CV_NOP, arrtype, normtype, worktype, block_size )                \
8206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                    \
8216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_NORM_MASK_##nohint_func##_FUNC_2D_COI( icvNorm_L1_##flavor##_CnCMR,         \
8226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    _abs_, CV_ADD, CV_NOP, arrtype, normtype, worktype, block_size )                \
8236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                    \
8246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_NORM_DIFF_MASK_##nohint_func##_FUNC_2D( icvNormDiff_L1_##flavor##_C1MR,     \
8256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    _abs_diff_, CV_ADD, CV_NOP, arrtype, normtype, worktype, block_size )           \
8266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                    \
8276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_NORM_DIFF_MASK_##nohint_func##_FUNC_2D_COI( icvNormDiff_L1_##flavor##_CnCMR,\
8286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    _abs_diff_, CV_ADD, CV_NOP, arrtype, normtype, worktype, block_size )
8296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_NORM_FUNC_ALL_L1( 8u, CV_NOP, CV_IABS, NOHINT_BLOCK, NOHINT_BLOCK,
8326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                          uchar, int64, int, 1 << 23 )
8336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_NORM_FUNC_ALL_L1( 16u, CV_NOP, CV_IABS, NOHINT_BLOCK, NOHINT_BLOCK,
8346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                          ushort, int64, int, 1 << 15 )
8356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_NORM_FUNC_ALL_L1( 16s, CV_IABS, CV_IABS, NOHINT_BLOCK, NOHINT_BLOCK,
8366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                          short, int64, int, 1 << 15 )
8376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// there is no protection from overflow on abs() stage.
8386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// (otherwise we had to do everything in int64's or double's)
8396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_NORM_FUNC_ALL_L1( 32s, fabs, fabs, NOHINT, NOHINT,
8406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                          int, double, double, INT_MAX )
8416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_NORM_FUNC_ALL_L1( 32f, fabs, fabs, HINT, NOHINT,
8426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                          float, double, double, INT_MAX )
8436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_NORM_FUNC_ALL_L1( 64f, fabs, fabs, NOHINT, NOHINT,
8446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                          double, double, double, INT_MAX )
8456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_NORM_FUNC_ALL_L2( flavor, hintp_func, nohint_func, arrtype,         \
8486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                  normtype, worktype, block_size, sqr_macro )       \
8496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                    \
8506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_NORM_##hintp_func##_FUNC_2D( icvNorm_L2_##flavor##_C1R,                     \
8516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    sqr_macro, CV_ADD, sqrt, arrtype, normtype, worktype, block_size )              \
8526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                    \
8536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_NORM_##nohint_func##_FUNC_2D_COI( icvNorm_L2_##flavor##_CnCR,               \
8546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    sqr_macro, CV_ADD, sqrt, arrtype, normtype, worktype, block_size )              \
8556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                    \
8566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_NORM_DIFF_##hintp_func##_FUNC_2D( icvNormDiff_L2_##flavor##_C1R,            \
8576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    sqr_macro, CV_ADD, sqrt, arrtype, normtype, worktype, block_size )              \
8586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                    \
8596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_NORM_DIFF_##nohint_func##_FUNC_2D_COI( icvNormDiff_L2_##flavor##_CnCR,      \
8606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    sqr_macro, CV_ADD, sqrt, arrtype, normtype, worktype, block_size )              \
8616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                    \
8626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_NORM_MASK_##nohint_func##_FUNC_2D( icvNorm_L2_##flavor##_C1MR,              \
8636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    sqr_macro, CV_ADD, sqrt, arrtype, normtype, worktype, block_size )              \
8646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                    \
8656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_NORM_MASK_##nohint_func##_FUNC_2D_COI( icvNorm_L2_##flavor##_CnCMR,         \
8666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    sqr_macro, CV_ADD, sqrt, arrtype, normtype, worktype, block_size )              \
8676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                    \
8686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_NORM_DIFF_MASK_##nohint_func##_FUNC_2D( icvNormDiff_L2_##flavor##_C1MR,     \
8696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    sqr_macro, CV_ADD, sqrt, arrtype, normtype, worktype, block_size )              \
8706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                    \
8716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_NORM_DIFF_MASK_##nohint_func##_FUNC_2D_COI( icvNormDiff_L2_##flavor##_CnCMR,\
8726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    sqr_macro, CV_ADD, sqrt, arrtype, normtype, worktype, block_size )
8736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_NORM_FUNC_ALL_L2( 8u, NOHINT_BLOCK, NOHINT_BLOCK, uchar,
8766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                          int64, int, 1 << 15, CV_SQR_8U )
8776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_NORM_FUNC_ALL_L2( 16u, NOHINT, NOHINT, ushort,
8786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                          double, double, INT_MAX, CV_SQR )
8796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_NORM_FUNC_ALL_L2( 16s, NOHINT, NOHINT, short,
8806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                          double, double, INT_MAX, CV_SQR )
8816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// there is no protection from overflow on abs() stage.
8826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// (otherwise we had to do everything in int64's or double's)
8836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_NORM_FUNC_ALL_L2( 32s, NOHINT, NOHINT, int,
8846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                          double, double, INT_MAX, CV_SQR )
8856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_NORM_FUNC_ALL_L2( 32f, HINT, NOHINT, float,
8866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                          double, double, INT_MAX, CV_SQR )
8876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_NORM_FUNC_ALL_L2( 64f, NOHINT, NOHINT, double,
8886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                          double, double, INT_MAX, CV_SQR )
8896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_INIT_NORM_TAB_2D( FUNCNAME, FLAG )              \
8926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic void icvInit##FUNCNAME##FLAG##Table( CvFuncTable* tab )  \
8936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                               \
8946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_8U] = (void*)icv##FUNCNAME##_8u_##FLAG;       \
8956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_8S] = 0;                                      \
8966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_16U] = (void*)icv##FUNCNAME##_16u_##FLAG;     \
8976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_16S] = (void*)icv##FUNCNAME##_16s_##FLAG;     \
8986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_32S] = (void*)icv##FUNCNAME##_32s_##FLAG;     \
8996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_32F] = (void*)icv##FUNCNAME##_32f_##FLAG;     \
9006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_64F] = (void*)icv##FUNCNAME##_64f_##FLAG;     \
9016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
9026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INIT_NORM_TAB_2D( Norm_Inf, C1R )
9046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INIT_NORM_TAB_2D( Norm_L1, C1R )
9056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INIT_NORM_TAB_2D( Norm_L2, C1R )
9066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INIT_NORM_TAB_2D( NormDiff_Inf, C1R )
9076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INIT_NORM_TAB_2D( NormDiff_L1, C1R )
9086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INIT_NORM_TAB_2D( NormDiff_L2, C1R )
9096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INIT_NORM_TAB_2D( Norm_Inf, CnCR )
9116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INIT_NORM_TAB_2D( Norm_L1, CnCR )
9126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INIT_NORM_TAB_2D( Norm_L2, CnCR )
9136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INIT_NORM_TAB_2D( NormDiff_Inf, CnCR )
9146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INIT_NORM_TAB_2D( NormDiff_L1, CnCR )
9156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INIT_NORM_TAB_2D( NormDiff_L2, CnCR )
9166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INIT_NORM_TAB_2D( Norm_Inf, C1MR )
9186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INIT_NORM_TAB_2D( Norm_L1, C1MR )
9196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INIT_NORM_TAB_2D( Norm_L2, C1MR )
9206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INIT_NORM_TAB_2D( NormDiff_Inf, C1MR )
9216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INIT_NORM_TAB_2D( NormDiff_L1, C1MR )
9226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INIT_NORM_TAB_2D( NormDiff_L2, C1MR )
9236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INIT_NORM_TAB_2D( Norm_Inf, CnCMR )
9256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INIT_NORM_TAB_2D( Norm_L1, CnCMR )
9266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INIT_NORM_TAB_2D( Norm_L2, CnCMR )
9276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INIT_NORM_TAB_2D( NormDiff_Inf, CnCMR )
9286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INIT_NORM_TAB_2D( NormDiff_L1, CnCMR )
9296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INIT_NORM_TAB_2D( NormDiff_L2, CnCMR )
9306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic void icvInitNormTabs( CvFuncTable* norm_tab, CvFuncTable* normmask_tab )
9336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
9346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    icvInitNorm_InfC1RTable( &norm_tab[0] );
9356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    icvInitNorm_L1C1RTable( &norm_tab[1] );
9366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    icvInitNorm_L2C1RTable( &norm_tab[2] );
9376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    icvInitNormDiff_InfC1RTable( &norm_tab[3] );
9386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    icvInitNormDiff_L1C1RTable( &norm_tab[4] );
9396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    icvInitNormDiff_L2C1RTable( &norm_tab[5] );
9406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    icvInitNorm_InfCnCRTable( &norm_tab[6] );
9426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    icvInitNorm_L1CnCRTable( &norm_tab[7] );
9436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    icvInitNorm_L2CnCRTable( &norm_tab[8] );
9446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    icvInitNormDiff_InfCnCRTable( &norm_tab[9] );
9456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    icvInitNormDiff_L1CnCRTable( &norm_tab[10] );
9466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    icvInitNormDiff_L2CnCRTable( &norm_tab[11] );
9476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    icvInitNorm_InfC1MRTable( &normmask_tab[0] );
9496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    icvInitNorm_L1C1MRTable( &normmask_tab[1] );
9506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    icvInitNorm_L2C1MRTable( &normmask_tab[2] );
9516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    icvInitNormDiff_InfC1MRTable( &normmask_tab[3] );
9526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    icvInitNormDiff_L1C1MRTable( &normmask_tab[4] );
9536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    icvInitNormDiff_L2C1MRTable( &normmask_tab[5] );
9546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    icvInitNorm_InfCnCMRTable( &normmask_tab[6] );
9566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    icvInitNorm_L1CnCMRTable( &normmask_tab[7] );
9576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    icvInitNorm_L2CnCMRTable( &normmask_tab[8] );
9586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    icvInitNormDiff_InfCnCMRTable( &normmask_tab[9] );
9596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    icvInitNormDiff_L1CnCMRTable( &normmask_tab[10] );
9606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    icvInitNormDiff_L2CnCMRTable( &normmask_tab[11] );
9616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
9626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL  double
9656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvNorm( const void* imgA, const void* imgB, int normType, const void* mask )
9666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
9676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static CvFuncTable norm_tab[12];
9686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static CvFuncTable normmask_tab[12];
9696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static int inittab = 0;
9706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double  norm = 0, norm_diff = 0;
9726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME("cvNorm");
9746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
9766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int type, depth, cn, is_relative;
9786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize size;
9796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat stub1, *mat1 = (CvMat*)imgB;
9806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat stub2, *mat2 = (CvMat*)imgA;
9816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int mat2_flag = CV_MAT_CONT_FLAG;
9826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int mat1_step, mat2_step, mask_step = 0;
9836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int coi = 0, coi2 = 0;
9846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !mat1 )
9866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
9876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        mat1 = mat2;
9886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        mat2 = 0;
9896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
9906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    is_relative = mat2 && (normType & CV_RELATIVE);
9926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    normType &= ~CV_RELATIVE;
9936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    switch( normType )
9956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
9966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_C:
9976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_L1:
9986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_L2:
9996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_DIFF_C:
10006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_DIFF_L1:
10016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_DIFF_L2:
10026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        normType = (normType & 7) >> 1;
10036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        break;
10046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    default:
10056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsBadFlag, "" );
10066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
10076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* light variant */
10096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_IS_MAT(mat1) && (!mat2 || CV_IS_MAT(mat2)) && !mask )
10106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
10116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( mat2 )
10126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
10136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( !CV_ARE_TYPES_EQ( mat1, mat2 ))
10146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_ERROR( CV_StsUnmatchedFormats, "" );
10156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( !CV_ARE_SIZES_EQ( mat1, mat2 ))
10176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_ERROR( CV_StsUnmatchedSizes, "" );
10186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            mat2_flag = mat2->type;
10206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
10216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size = cvGetMatSize( mat1 );
10236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        type = CV_MAT_TYPE(mat1->type);
10246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        depth = CV_MAT_DEPTH(type);
10256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cn = CV_MAT_CN(type);
10266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_IS_MAT_CONT( mat1->type & mat2_flag ))
10286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
10296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size.width *= size.height;
10306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( size.width <= CV_MAX_INLINE_MAT_OP_SIZE && normType == 2 /* CV_L2 */ )
10326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
10336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( depth == CV_32F )
10346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
10356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    const float* src1data = mat1->data.fl;
10366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    int size0 = size.width *= cn;
10376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    if( !mat2 || is_relative )
10396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    {
10406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        do
10416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        {
10426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            double t = src1data[size.width-1];
10436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            norm += t*t;
10446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        }
10456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        while( --size.width );
10466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    }
10476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    if( mat2 )
10496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    {
10506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        const float* src2data = mat2->data.fl;
10516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        size.width = size0;
10526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        do
10546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        {
10556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            double t = src1data[size.width-1] - src2data[size.width-1];
10566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            norm_diff += t*t;
10576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        }
10586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        while( --size.width );
10596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        if( is_relative )
10616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            norm = norm_diff/(norm + DBL_EPSILON);
10626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        else
10636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            norm = norm_diff;
10646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    }
10656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    norm = sqrt(norm);
10666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    EXIT;
10676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
10686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( depth == CV_64F )
10706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
10716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    const double* src1data = mat1->data.db;
10726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    int size0 = size.width *= cn;
10736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    if( !mat2 || is_relative )
10756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    {
10766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        do
10776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        {
10786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            double t = src1data[size.width-1];
10796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            norm += t*t;
10806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        }
10816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        while( --size.width );
10826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    }
10836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    if( mat2 )
10856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    {
10866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        const double* src2data = mat2->data.db;
10876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        size.width = size0;
10886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        do
10906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        {
10916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            double t = src1data[size.width-1] - src2data[size.width-1];
10926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            norm_diff += t*t;
10936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        }
10946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        while( --size.width );
10956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        if( is_relative )
10976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            norm = norm_diff/(norm + DBL_EPSILON);
10986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        else
10996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            norm = norm_diff;
11006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    }
11016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    norm = sqrt(norm);
11026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    EXIT;
11036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
11046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
11056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size.height = 1;
11066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            mat1_step = mat2_step = CV_STUB_STEP;
11076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
11086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
11096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
11106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            mat1_step = mat1->step;
11116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            mat2_step = mat2 ? mat2->step : 0;
11126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
11136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
11146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( !CV_IS_MATND(mat1) && !CV_IS_MATND(mat2) )
11156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
11166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( mat1 = cvGetMat( mat1, &stub1, &coi ));
11176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( mat2 )
11196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
11206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( mat2 = cvGetMat( mat2, &stub2, &coi2 ));
11216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( !CV_ARE_TYPES_EQ( mat1, mat2 ))
11236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_ERROR( CV_StsUnmatchedFormats, "" );
11246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( !CV_ARE_SIZES_EQ( mat1, mat2 ))
11266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_ERROR( CV_StsUnmatchedSizes, "" );
11276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( coi != coi2 && CV_MAT_CN( mat1->type ) > 1 )
11296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_ERROR( CV_BadCOI, "" );
11306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            mat2_flag = mat2->type;
11326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
11336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size = cvGetMatSize( mat1 );
11356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        type = CV_MAT_TYPE(mat1->type);
11366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        depth = CV_MAT_DEPTH(type);
11376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cn = CV_MAT_CN(type);
11386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        mat1_step = mat1->step;
11396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        mat2_step = mat2 ? mat2->step : 0;
11406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !mask && CV_IS_MAT_CONT( mat1->type & mat2_flag ))
11426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
11436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size.width *= size.height;
11446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size.height = 1;
11456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            mat1_step = mat2_step = CV_STUB_STEP;
11466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
11476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
11486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
11496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
11506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvArr* arrs[] = { mat1, mat2 };
11516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvMatND stubs[2];
11526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvNArrayIterator iterator;
11536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int pass_hint;
11546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !inittab )
11566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
11576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            icvInitNormTabs( norm_tab, normmask_tab );
11586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            inittab = 1;
11596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
11606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( mask )
11626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsBadMask,
11636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            "This operation on multi-dimensional arrays does not support mask" );
11646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( cvInitNArrayIterator( 1 + (mat2 != 0), arrs, 0, stubs, &iterator ));
11666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        type = CV_MAT_TYPE(iterator.hdr[0]->type);
11686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        depth = CV_MAT_DEPTH(type);
11696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        iterator.size.width *= CV_MAT_CN(type);
11706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        pass_hint = normType != 0 && (depth == CV_32F);
11726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !mat2 || is_relative )
11746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
11756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( !pass_hint )
11766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
11776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CvFunc2D_1A1P func;
11786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_GET_FUNC_PTR( func, (CvFunc2D_1A1P)norm_tab[normType].fn_2d[depth]);
11806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                do
11826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
11836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    double temp = 0;
11846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    IPPI_CALL( func( iterator.ptr[0], CV_STUB_STEP,
11856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                     iterator.size, &temp ));
11866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    norm += temp;
11876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
11886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                while( cvNextNArraySlice( &iterator ));
11896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
11906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
11916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
11926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CvFunc2D_1A1P1I func;
11936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_GET_FUNC_PTR( func, (CvFunc2D_1A1P1I)norm_tab[normType].fn_2d[depth]);
11956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                do
11976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
11986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    double temp = 0;
11996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    IPPI_CALL( func( iterator.ptr[0], CV_STUB_STEP,
12006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                     iterator.size, &temp, cvAlgHintAccurate ));
12016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    norm += temp;
12026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
12036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                while( cvNextNArraySlice( &iterator ));
12046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
12056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
12066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( mat2 )
12086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
12096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( !pass_hint )
12106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
12116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CvFunc2D_2A1P func;
12126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_GET_FUNC_PTR( func, (CvFunc2D_2A1P)norm_tab[3 + normType].fn_2d[depth]);
12136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                do
12156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
12166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    double temp = 0;
12176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    IPPI_CALL( func( iterator.ptr[0], CV_STUB_STEP,
12186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                     iterator.ptr[1], CV_STUB_STEP,
12196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                     iterator.size, &temp ));
12206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    norm_diff += temp;
12216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
12226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                while( cvNextNArraySlice( &iterator ));
12236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
12246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
12256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
12266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CvFunc2D_2A1P1I func;
12276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_GET_FUNC_PTR( func, (CvFunc2D_2A1P1I)norm_tab[3 + normType].fn_2d[depth]);
12286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                do
12306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
12316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    double temp = 0;
12326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    IPPI_CALL( func( iterator.ptr[0], CV_STUB_STEP,
12336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                     iterator.ptr[1], CV_STUB_STEP,
12346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                     iterator.size, &temp, cvAlgHintAccurate ));
12356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    norm_diff += temp;
12366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
12376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                while( cvNextNArraySlice( &iterator ));
12386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
12396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( is_relative )
12416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                norm = norm_diff/(norm + DBL_EPSILON);
12426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
12436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                norm = norm_diff;
12446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
12456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        EXIT;
12466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
12476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !inittab )
12496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
12506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvInitNormTabs( norm_tab, normmask_tab );
12516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        inittab = 1;
12526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
12536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !mask )
12556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
12566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( cn == 1 || coi == 0 )
12576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
12586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int pass_hint = depth == CV_32F && normType != 0;
12596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size.width *= cn;
12606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( !mat2 || is_relative )
12626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
12636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( !pass_hint )
12646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
12656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    CvFunc2D_1A1P func;
12666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    CV_GET_FUNC_PTR( func, (CvFunc2D_1A1P)norm_tab[normType].fn_2d[depth]);
12676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    IPPI_CALL( func( mat1->data.ptr, mat1_step, size, &norm ));
12696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
12706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                else
12716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
12726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    CvFunc2D_1A1P1I func;
12736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    CV_GET_FUNC_PTR( func, (CvFunc2D_1A1P1I)norm_tab[normType].fn_2d[depth]);
12746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    IPPI_CALL( func( mat1->data.ptr, mat1_step, size, &norm, cvAlgHintAccurate ));
12766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
12776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
12786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( mat2 )
12806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
12816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( !pass_hint )
12826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
12836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    CvFunc2D_2A1P func;
12846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    CV_GET_FUNC_PTR( func, (CvFunc2D_2A1P)norm_tab[3 + normType].fn_2d[depth]);
12856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    IPPI_CALL( func( mat1->data.ptr, mat1_step, mat2->data.ptr, mat2_step,
12876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                     size, &norm_diff ));
12886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
12896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                else
12906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
12916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    CvFunc2D_2A1P1I func;
12926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    CV_GET_FUNC_PTR( func, (CvFunc2D_2A1P1I)norm_tab[3 + normType].fn_2d[depth]);
12936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    IPPI_CALL( func( mat1->data.ptr, mat1_step, mat2->data.ptr, mat2_step,
12956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                     size, &norm_diff, cvAlgHintAccurate ));
12966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
12976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( is_relative )
12996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    norm = norm_diff/(norm + DBL_EPSILON);
13006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                else
13016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    norm = norm_diff;
13026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
13036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
13046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
13056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
13066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( !mat2 || is_relative )
13076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
13086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CvFunc2DnC_1A1P func;
13096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_GET_FUNC_PTR( func, (CvFunc2DnC_1A1P)norm_tab[6 + normType].fn_2d[depth]);
13106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                IPPI_CALL( func( mat1->data.ptr, mat1_step, size, cn, coi, &norm ));
13126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
13136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( mat2 )
13156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
13166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CvFunc2DnC_2A1P func;
13176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_GET_FUNC_PTR( func, (CvFunc2DnC_2A1P)norm_tab[9 + normType].fn_2d[depth]);
13186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                IPPI_CALL( func( mat1->data.ptr, mat1_step, mat2->data.ptr, mat2_step,
13206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                 size, cn, coi, &norm_diff ));
13216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( is_relative )
13236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    norm = norm_diff/(norm + DBL_EPSILON);
13246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                else
13256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    norm = norm_diff;
13266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
13276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
13286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
13296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
13306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
13316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvMat maskstub, *matmask = (CvMat*)mask;
13326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_MAT_CN(type) > 1 && coi == 0 )
13346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsBadArg, "" );
13356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( matmask = cvGetMat( matmask, &maskstub ));
13376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_IS_MASK_ARR( matmask ))
13396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsBadMask, "" );
13406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_ARE_SIZES_EQ( mat1, matmask ))
13426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsUnmatchedSizes, "" );
13436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        mask_step = matmask->step;
13456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_IS_MAT_CONT( mat1->type & mat2_flag & matmask->type ))
13476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
13486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size.width *= size.height;
13496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size.height = 1;
13506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            mat1_step = mat2_step = mask_step = CV_STUB_STEP;
13516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
13526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_MAT_CN(type) == 1 || coi == 0 )
13546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
13556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( !mat2 || is_relative )
13566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
13576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CvFunc2D_2A1P func;
13586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_GET_FUNC_PTR( func,
13596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    (CvFunc2D_2A1P)normmask_tab[normType].fn_2d[depth]);
13606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                IPPI_CALL( func( mat1->data.ptr, mat1_step,
13626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                 matmask->data.ptr, mask_step, size, &norm ));
13636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
13646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( mat2 )
13666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
13676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CvFunc2D_3A1P func;
13686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_GET_FUNC_PTR( func,
13696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    (CvFunc2D_3A1P)normmask_tab[3 + normType].fn_2d[depth]);
13706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                IPPI_CALL( func( mat1->data.ptr, mat1_step, mat2->data.ptr, mat2_step,
13726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                 matmask->data.ptr, mask_step, size, &norm_diff ));
13736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( is_relative )
13756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    norm = norm_diff/(norm + DBL_EPSILON);
13766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                else
13776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    norm = norm_diff;
13786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
13796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
13806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
13816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
13826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( !mat2 || is_relative )
13836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
13846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CvFunc2DnC_2A1P func;
13856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_GET_FUNC_PTR( func,
13866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    (CvFunc2DnC_2A1P)normmask_tab[6 + normType].fn_2d[depth]);
13876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                IPPI_CALL( func( mat1->data.ptr, mat1_step,
13896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                 matmask->data.ptr, mask_step,
13906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                 size, cn, coi, &norm ));
13916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
13926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( mat2 )
13946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
13956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CvFunc2DnC_3A1P func;
13966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_GET_FUNC_PTR( func,
13976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    (CvFunc2DnC_3A1P)normmask_tab[9 + normType].fn_2d[depth]);
13986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                IPPI_CALL( func( mat1->data.ptr, mat1_step,
14006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                 mat2->data.ptr, mat2_step,
14016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                 matmask->data.ptr, mask_step,
14026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                 size, cn, coi, &norm_diff ));
14036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( is_relative )
14056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    norm = norm_diff/(norm + DBL_EPSILON);
14066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                else
14076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    norm = norm_diff;
14086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
14096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
14106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
14116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
14136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return norm;
14156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
14166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* End of file. */
1418