16acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*M///////////////////////////////////////////////////////////////////////////////////////
26acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
36acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
46acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
56acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  By downloading, copying, installing or using the software you agree to this license.
66acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  If you do not agree to this license, do not download, install,
76acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  copy or use the software.
86acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
96acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//                        Intel License Agreement
116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//                For Open Source Computer Vision Library
126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Copyright (C) 2000, Intel Corporation, all rights reserved.
146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Third party copyrights are property of their respective owners.
156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Redistribution and use in source and binary forms, with or without modification,
176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// are permitted provided that the following conditions are met:
186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//   * Redistribution's of source code must retain the above copyright notice,
206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     this list of conditions and the following disclaimer.
216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//   * Redistribution's in binary form must reproduce the above copyright notice,
236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     this list of conditions and the following disclaimer in the documentation
246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     and/or other materials provided with the distribution.
256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//   * The name of Intel Corporation may not be used to endorse or promote products
276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     derived from this software without specific prior written permission.
286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// This software is provided by the copyright holders and contributors "as is" and
306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// any express or implied warranties, including, but not limited to, the implied
316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// warranties of merchantability and fitness for a particular purpose are disclaimed.
326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// In no event shall the Intel Corporation or contributors be liable for any direct,
336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// indirect, incidental, special, exemplary, or consequential damages
346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// (including, but not limited to, procurement of substitute goods or services;
356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// loss of use, data, or profits; or business interruption) however caused
366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// and on any theory of liability, whether in contract, strict liability,
376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// or tort (including negligence or otherwise) arising in any way out of
386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// the use of this software, even if advised of the possibility of such damage.
396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//M*/
416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* ////////////////////////////////////////////////////////////////////
436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  CvMat comparison functions: range checking, min, max
456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// */
476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "_cxcore.h"
496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                                      InRange[S]                                        *
526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_IN_RANGE_CASE_C1( worktype, _toggle_macro_ )    \
556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennfor( x = 0; x < size.width; x++ )                               \
566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                               \
576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    worktype a1 = _toggle_macro_(src1[x]),                      \
586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn             a2 = src2[x], a3 = src3[x];                        \
596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dst[x] = (uchar)-(_toggle_macro_(a2) <= a1 &&               \
606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                     a1 < _toggle_macro_(a3));                  \
616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_IN_RANGE_CASE_C2( worktype, _toggle_macro_ )        \
656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennfor( x = 0; x < size.width; x++ )                                   \
666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                   \
676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    worktype a1 = _toggle_macro_(src1[x*2]),                        \
686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn             a2 = src2[x*2], a3 = src3[x*2];                        \
696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int f = _toggle_macro_(a2) <= a1 && a1 < _toggle_macro_(a3);    \
706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    a1 = _toggle_macro_(src1[x*2+1]);                               \
716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    a2 = src2[x*2+1];                                               \
726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    a3 = src3[x*2+1];                                               \
736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    f &= _toggle_macro_(a2) <= a1 && a1 < _toggle_macro_(a3);       \
746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dst[x] = (uchar)-f;                                             \
756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_IN_RANGE_CASE_C3( worktype, _toggle_macro_ )        \
796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennfor( x = 0; x < size.width; x++ )                                   \
806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                   \
816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    worktype a1 = _toggle_macro_(src1[x*3]),                        \
826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn             a2 = src2[x*3], a3 = src3[x*3];                        \
836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int f = _toggle_macro_(a2) <= a1 && a1 < _toggle_macro_(a3);    \
846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    a1 = _toggle_macro_(src1[x*3+1]);                               \
856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    a2 = src2[x*3+1];                                               \
866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    a3 = src3[x*3+1];                                               \
876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    f &= _toggle_macro_(a2) <= a1 && a1 < _toggle_macro_(a3);       \
886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    a1 = _toggle_macro_(src1[x*3+2]);                               \
896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    a2 = src2[x*3+2];                                               \
906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    a3 = src3[x*3+2];                                               \
916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    f &= _toggle_macro_(a2) <= a1 && a1 < _toggle_macro_(a3);       \
926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dst[x] = (uchar)-f;                                             \
936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_IN_RANGE_CASE_C4( worktype, _toggle_macro_ )        \
976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennfor( x = 0; x < size.width; x++ )                                   \
986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                   \
996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    worktype a1 = _toggle_macro_(src1[x*4]),                        \
1006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn             a2 = src2[x*4], a3 = src3[x*4];                        \
1016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int f = _toggle_macro_(a2) <= a1 && a1 < _toggle_macro_(a3);    \
1026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    a1 = _toggle_macro_(src1[x*4+1]);                               \
1036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    a2 = src2[x*4+1];                                               \
1046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    a3 = src3[x*4+1];                                               \
1056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    f &= _toggle_macro_(a2) <= a1 && a1 < _toggle_macro_(a3);       \
1066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    a1 = _toggle_macro_(src1[x*4+2]);                               \
1076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    a2 = src2[x*4+2];                                               \
1086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    a3 = src3[x*4+2];                                               \
1096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    f &= _toggle_macro_(a2) <= a1 && a1 < _toggle_macro_(a3);       \
1106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    a1 = _toggle_macro_(src1[x*4+3]);                               \
1116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    a2 = src2[x*4+3];                                               \
1126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    a3 = src3[x*4+3];                                               \
1136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    f &= _toggle_macro_(a2) <= a1 && a1 < _toggle_macro_(a3);       \
1146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dst[x] = (uchar)-f;                                             \
1156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
1166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_IN_RANGE_FUNC( flavor, arrtype, worktype,           \
1196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                               _toggle_macro_, cn )                 \
1206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL                                          \
1216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvInRange_##flavor##_C##cn##R( const arrtype* src1, int step1,     \
1226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                const arrtype* src2, int step2,     \
1236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                const arrtype* src3, int step3,     \
1246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                uchar* dst, int step, CvSize size ) \
1256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                   \
1266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step1 /= sizeof(src1[0]); step2 /= sizeof(src2[0]);             \
1276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step3 /= sizeof(src3[0]); step /= sizeof(dst[0]);               \
1286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                    \
1296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src1 += step1, src2 += step2,             \
1306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                          src3 += step3, dst += step )              \
1316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                               \
1326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int x;                                                      \
1336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ICV_DEF_IN_RANGE_CASE_C##cn( worktype, _toggle_macro_ )     \
1346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                               \
1356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                    \
1366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                                   \
1376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
1386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_IN_RANGE_CASE_CONST_C1( worktype, _toggle_macro_ )  \
1416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennfor( x = 0; x < size.width; x++ )                                   \
1426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                   \
1436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    worktype a1 = _toggle_macro_(src1[x]);                          \
1446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dst[x] = (uchar)-(scalar[0] <= a1 && a1 < scalar[1]);           \
1456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
1466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_IN_RANGE_CASE_CONST_C2( worktype, _toggle_macro_ )  \
1496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennfor( x = 0; x < size.width; x++ )                                   \
1506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                   \
1516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    worktype a1 = _toggle_macro_(src1[x*2]);                        \
1526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int f = scalar[0] <= a1 && a1 < scalar[2];                      \
1536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    a1 = _toggle_macro_(src1[x*2+1]);                               \
1546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    f &= scalar[1] <= a1 && a1 < scalar[3];                         \
1556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dst[x] = (uchar)-f;                                             \
1566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
1576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_IN_RANGE_CASE_CONST_C3( worktype, _toggle_macro_ )  \
1606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennfor( x = 0; x < size.width; x++ )                                   \
1616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                   \
1626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    worktype a1 = _toggle_macro_(src1[x*3]);                        \
1636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int f = scalar[0] <= a1 && a1 < scalar[3];                      \
1646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    a1 = _toggle_macro_(src1[x*3+1]);                               \
1656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    f &= scalar[1] <= a1 && a1 < scalar[4];                         \
1666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    a1 = _toggle_macro_(src1[x*3+2]);                               \
1676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    f &= scalar[2] <= a1 && a1 < scalar[5];                         \
1686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dst[x] = (uchar)-f;                                             \
1696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
1706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_IN_RANGE_CASE_CONST_C4( worktype, _toggle_macro_ )  \
1736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennfor( x = 0; x < size.width; x++ )                                   \
1746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                   \
1756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    worktype a1 = _toggle_macro_(src1[x*4]);                        \
1766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int f = scalar[0] <= a1 && a1 < scalar[4];                      \
1776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    a1 = _toggle_macro_(src1[x*4+1]);                               \
1786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    f &= scalar[1] <= a1 && a1 < scalar[5];                         \
1796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    a1 = _toggle_macro_(src1[x*4+2]);                               \
1806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    f &= scalar[2] <= a1 && a1 < scalar[6];                         \
1816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    a1 = _toggle_macro_(src1[x*4+3]);                               \
1826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    f &= scalar[3] <= a1 && a1 < scalar[7];                         \
1836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dst[x] = (uchar)-f;                                             \
1846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
1856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_IN_RANGE_CONST_FUNC( flavor, arrtype, worktype,     \
1886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                     _toggle_macro_, cn )           \
1896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL                                          \
1906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvInRangeC_##flavor##_C##cn##R( const arrtype* src1, int step1,    \
1916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                 uchar* dst, int step, CvSize size, \
1926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                 const worktype* scalar )           \
1936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                   \
1946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step1 /= sizeof(src1[0]); step /= sizeof(dst[0]);               \
1956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                    \
1966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src1 += step1, dst += step )              \
1976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                               \
1986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int x;                                                      \
1996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ICV_DEF_IN_RANGE_CASE_CONST_C##cn( worktype, _toggle_macro_)\
2006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                               \
2016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                    \
2026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                                   \
2036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_IN_RANGE_ALL( flavor, arrtype, worktype, _toggle_macro_ )   \
2076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_IN_RANGE_FUNC( flavor, arrtype, worktype, _toggle_macro_, 1 )       \
2086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_IN_RANGE_FUNC( flavor, arrtype, worktype, _toggle_macro_, 2 )       \
2096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_IN_RANGE_FUNC( flavor, arrtype, worktype, _toggle_macro_, 3 )       \
2106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_IN_RANGE_FUNC( flavor, arrtype, worktype, _toggle_macro_, 4 )       \
2116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
2126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_IN_RANGE_CONST_FUNC( flavor, arrtype, worktype, _toggle_macro_, 1 ) \
2136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_IN_RANGE_CONST_FUNC( flavor, arrtype, worktype, _toggle_macro_, 2 ) \
2146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_IN_RANGE_CONST_FUNC( flavor, arrtype, worktype, _toggle_macro_, 3 ) \
2156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_IN_RANGE_CONST_FUNC( flavor, arrtype, worktype, _toggle_macro_, 4 )
2166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_IN_RANGE_ALL( 8u, uchar, int, CV_NOP )
2186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_IN_RANGE_ALL( 16u, ushort, int, CV_NOP )
2196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_IN_RANGE_ALL( 16s, short, int, CV_NOP )
2206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_IN_RANGE_ALL( 32s, int, int, CV_NOP )
2216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_IN_RANGE_ALL( 32f, float, float, CV_NOP )
2226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_IN_RANGE_ALL( 64f, double, double, CV_NOP )
2236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define icvInRange_8s_C1R 0
2256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define icvInRange_8s_C2R 0
2266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define icvInRange_8s_C3R 0
2276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define icvInRange_8s_C4R 0
2286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define icvInRangeC_8s_C1R 0
2306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define icvInRangeC_8s_C2R 0
2316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define icvInRangeC_8s_C3R 0
2326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define icvInRangeC_8s_C4R 0
2336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_DEF_INIT_BIG_FUNC_TAB_2D( InRange, R )
2356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_DEF_INIT_BIG_FUNC_TAB_2D( InRangeC, R )
2366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL * CvInRangeCFunc)( const void* src, int srcstep,
2386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                uchar* dst, int dststep,
2396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                CvSize size, const void* scalar );
2406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*************************************** InRange ****************************************/
2426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
2446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvInRange( const void* srcarr1, const void* srcarr2,
2456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn           const void* srcarr3, void* dstarr )
2466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static CvBigFuncTable inrange_tab;
2486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static int inittab = 0;
2496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvInRange" );
2516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
2536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int type, coi = 0;
2556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int src1_step, src2_step, src3_step, dst_step;
2566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat srcstub1, *src1 = (CvMat*)srcarr1;
2576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat srcstub2, *src2 = (CvMat*)srcarr2;
2586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat srcstub3, *src3 = (CvMat*)srcarr3;
2596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat dststub,  *dst = (CvMat*)dstarr;
2606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize size;
2616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvFunc2D_4A func;
2626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !inittab )
2646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
2656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvInitInRangeRTable( &inrange_tab );
2666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        inittab = 1;
2676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
2686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT(src1) )
2706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
2716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( src1 = cvGetMat( src1, &srcstub1, &coi ));
2726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( coi != 0 )
2736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_BadCOI, "" );
2746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
2756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT(src2) )
2776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
2786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( src2 = cvGetMat( src2, &srcstub2, &coi ));
2796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( coi != 0 )
2806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_BadCOI, "" );
2816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
2826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT(src3) )
2846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
2856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( src3 = cvGetMat( src3, &srcstub3, &coi ));
2866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( coi != 0 )
2876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_BadCOI, "" );
2886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
2896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT(dst) )
2916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
2926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( dst = cvGetMat( dst, &dststub, &coi ));
2936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( coi != 0 )
2946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_BadCOI, "" );
2956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
2966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_TYPES_EQ( src1, src2 ) ||
2986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        !CV_ARE_TYPES_EQ( src1, src3 ) )
2996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR_FROM_CODE( CV_StsUnmatchedFormats );
3006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MASK_ARR( dst ))
3026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnsupportedFormat, "Destination image should be 8uC1 or 8sC1");
3036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_SIZES_EQ( src1, src2 ) ||
3056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        !CV_ARE_SIZES_EQ( src1, src3 ) ||
3066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        !CV_ARE_SIZES_EQ( src1, dst ))
3076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR_FROM_CODE( CV_StsUnmatchedSizes );
3086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    type = CV_MAT_TYPE(src1->type);
3106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size = cvGetMatSize( src1 );
3116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_IS_MAT_CONT( src1->type & src2->type & src3->type & dst->type ))
3136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
3146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size.width *= size.height;
3156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        src1_step = src2_step = src3_step = dst_step = CV_STUB_STEP;
3166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size.height = 1;
3176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
3186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
3196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
3206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        src1_step = src1->step;
3216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        src2_step = src2->step;
3226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        src3_step = src3->step;
3236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dst_step = dst->step;
3246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
3256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_MAT_CN(type) > 4 )
3276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsOutOfRange, "The number of channels must be 1, 2, 3 or 4" );
3286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    func = (CvFunc2D_4A)(inrange_tab.fn_2d[type]);
3306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !func )
3326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnsupportedFormat, "" );
3336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    IPPI_CALL( func( src1->data.ptr, src1_step, src2->data.ptr, src2_step,
3356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                     src3->data.ptr, src3_step, dst->data.ptr, dst_step, size ));
3366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
3386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
3396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/************************************** InRangeS ****************************************/
3426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
3446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvInRangeS( const void* srcarr, CvScalar lower, CvScalar upper, void* dstarr )
3456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
3466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static CvBigFuncTable inrange_tab;
3476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static int inittab = 0;
3486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvInRangeS" );
3506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
3526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int sctype, type, coi = 0;
3546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int src1_step, dst_step;
3556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat srcstub1, *src1 = (CvMat*)srcarr;
3566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat dststub,  *dst = (CvMat*)dstarr;
3576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize size;
3586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvInRangeCFunc func;
3596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double buf[8];
3606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !inittab )
3626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
3636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvInitInRangeCRTable( &inrange_tab );
3646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        inittab = 1;
3656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
3666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT(src1) )
3686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
3696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( src1 = cvGetMat( src1, &srcstub1, &coi ));
3706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( coi != 0 )
3716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_BadCOI, "" );
3726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
3736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT(dst) )
3756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
3766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( dst = cvGetMat( dst, &dststub, &coi ));
3776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( coi != 0 )
3786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_BadCOI, "" );
3796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
3806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MASK_ARR( dst ))
3826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnsupportedFormat, "Destination image should be 8uC1 or 8sC1");
3836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_SIZES_EQ( src1, dst ))
3856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR_FROM_CODE( CV_StsUnmatchedSizes );
3866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    sctype = type = CV_MAT_TYPE(src1->type);
3886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_MAT_DEPTH(sctype) < CV_32S )
3896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        sctype = (type & CV_MAT_CN_MASK) | CV_32SC1;
3906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size = cvGetMatSize( src1 );
3926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_IS_MAT_CONT( src1->type & dst->type ))
3946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
3956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size.width *= size.height;
3966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        src1_step = dst_step = CV_STUB_STEP;
3976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size.height = 1;
3986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
3996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
4006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
4016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        src1_step = src1->step;
4026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dst_step = dst->step;
4036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
4046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_MAT_CN(type) > 4 )
4066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsOutOfRange, "The number of channels must be 1, 2, 3 or 4" );
4076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    func = (CvInRangeCFunc)(inrange_tab.fn_2d[type]);
4096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !func )
4116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnsupportedFormat, "" );
4126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cvScalarToRawData( &lower, buf, sctype, 0 );
4146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cvScalarToRawData( &upper, (char*)buf + CV_ELEM_SIZE(sctype), sctype, 0 );
4156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    IPPI_CALL( func( src1->data.ptr, src1_step, dst->data.ptr,
4176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                     dst_step, size, buf ));
4186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
4206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
4216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
4246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                                         Cmp                                            *
4256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
4266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_CMP_CASE_C1( __op__, _toggle_macro_ )                   \
4286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennfor( x = 0; x <= size.width - 4; x += 4 )                               \
4296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                       \
4306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int f0 = __op__( _toggle_macro_(src1[x]), _toggle_macro_(src2[x])); \
4316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int f1 = __op__( _toggle_macro_(src1[x+1]), _toggle_macro_(src2[x+1])); \
4326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dst[x] = (uchar)-f0;                                                \
4336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dst[x+1] = (uchar)-f1;                                              \
4346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    f0 = __op__( _toggle_macro_(src1[x+2]), _toggle_macro_(src2[x+2])); \
4356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    f1 = __op__( _toggle_macro_(src1[x+3]), _toggle_macro_(src2[x+3])); \
4366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dst[x+2] = (uchar)-f0;                                              \
4376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dst[x+3] = (uchar)-f1;                                              \
4386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}                                                                       \
4396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
4406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennfor( ; x < size.width; x++ )                                            \
4416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                       \
4426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int f0 = __op__( _toggle_macro_(src1[x]), _toggle_macro_(src2[x])); \
4436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dst[x] = (uchar)-f0;                                                \
4446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
4456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_CMP_FUNC( __op__, name, flavor, arrtype,        \
4486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                          worktype, _toggle_macro_ )            \
4496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL                                      \
4506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennicv##name##_##flavor##_C1R( const arrtype* src1, int step1,     \
4516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            const arrtype* src2, int step2,     \
4526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            uchar* dst, int step, CvSize size ) \
4536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                               \
4546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step1 /= sizeof(src1[0]); step2 /= sizeof(src2[0]);         \
4556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step /= sizeof(dst[0]);                                     \
4566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
4576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src1 += step1, src2 += step2,         \
4586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                          dst += step )                         \
4596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                           \
4606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int x;                                                  \
4616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ICV_DEF_CMP_CASE_C1( __op__, _toggle_macro_ )           \
4626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                           \
4636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
4646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                               \
4656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
4666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_CMP_CONST_CASE_C1( __op__, _toggle_macro_ )     \
4696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennfor( x = 0; x <= size.width - 4; x += 4 )                       \
4706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                               \
4716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int f0 = __op__( _toggle_macro_(src1[x]), scalar );         \
4726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int f1 = __op__( _toggle_macro_(src1[x+1]), scalar );       \
4736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dst[x] = (uchar)-f0;                                        \
4746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dst[x+1] = (uchar)-f1;                                      \
4756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    f0 = __op__( _toggle_macro_(src1[x+2]), scalar );           \
4766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    f1 = __op__( _toggle_macro_(src1[x+3]), scalar );           \
4776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dst[x+2] = (uchar)-f0;                                      \
4786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dst[x+3] = (uchar)-f1;                                      \
4796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}                                                               \
4806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
4816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennfor( ; x < size.width; x++ )                                    \
4826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                               \
4836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int f0 = __op__( _toggle_macro_(src1[x]), scalar );         \
4846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dst[x] = (uchar)-f0;                                        \
4856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
4866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_CMP_CONST_FUNC( __op__, name, flavor, arrtype,  \
4896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                worktype, _toggle_macro_)       \
4906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL                                      \
4916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennicv##name##C_##flavor##_C1R( const arrtype* src1, int step1,    \
4926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                             uchar* dst, int step,              \
4936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                             CvSize size, worktype* pScalar )   \
4946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                               \
4956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    worktype scalar = *pScalar;                                 \
4966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step1 /= sizeof(src1[0]); step /= sizeof(dst[0]);           \
4976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
4986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src1 += step1, dst += step )          \
4996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                           \
5006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int x;                                                  \
5016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ICV_DEF_CMP_CONST_CASE_C1( __op__, _toggle_macro_ )     \
5026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                           \
5036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
5046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                               \
5056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
5066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_CMP_ALL( flavor, arrtype, worktype, _toggle_macro_ )            \
5096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_CMP_FUNC( CV_GT, CmpGT, flavor, arrtype, worktype, _toggle_macro_ )     \
5106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_CMP_FUNC( CV_EQ, CmpEQ, flavor, arrtype, worktype, _toggle_macro_ )     \
5116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_CMP_CONST_FUNC( CV_GT, CmpGT, flavor, arrtype, worktype, _toggle_macro_)\
5126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_CMP_CONST_FUNC( CV_GE, CmpGE, flavor, arrtype, worktype, _toggle_macro_)\
5136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_CMP_CONST_FUNC( CV_EQ, CmpEQ, flavor, arrtype, worktype, _toggle_macro_)
5146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_CMP_ALL( 8u, uchar, int, CV_NOP )
5166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_CMP_ALL( 16u, ushort, int, CV_NOP )
5176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_CMP_ALL( 16s, short, int, CV_NOP )
5186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_CMP_ALL( 32s, int, int, CV_NOP )
5196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_CMP_ALL( 32f, float, double, CV_NOP )
5206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_CMP_ALL( 64f, double, double, CV_NOP )
5216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define icvCmpGT_8s_C1R     0
5236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define icvCmpEQ_8s_C1R     0
5246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define icvCmpGTC_8s_C1R    0
5256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define icvCmpGEC_8s_C1R    0
5266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define icvCmpEQC_8s_C1R    0
5276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_DEF_INIT_FUNC_TAB_2D( CmpGT, C1R )
5296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_DEF_INIT_FUNC_TAB_2D( CmpEQ, C1R )
5306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_DEF_INIT_FUNC_TAB_2D( CmpGTC, C1R )
5316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_DEF_INIT_FUNC_TAB_2D( CmpGEC, C1R )
5326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_DEF_INIT_FUNC_TAB_2D( CmpEQC, C1R )
5336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvCompare_8u_C1R_t icvCompare_8u_C1R_p = 0;
5356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvCompare_16s_C1R_t icvCompare_16s_C1R_p = 0;
5366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvCompare_32f_C1R_t icvCompare_32f_C1R_p = 0;
5376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvCompareC_8u_C1R_t icvCompareC_8u_C1R_p = 0;
5396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvCompareC_16s_C1R_t icvCompareC_16s_C1R_p = 0;
5406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvCompareC_32f_C1R_t icvCompareC_32f_C1R_p = 0;
5416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvThreshold_GT_8u_C1R_t icvThreshold_GT_8u_C1R_p = 0;
5436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvThreshold_GT_16s_C1R_t icvThreshold_GT_16s_C1R_p = 0;
5446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvThreshold_GT_32f_C1R_t icvThreshold_GT_32f_C1R_p = 0;
5456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvThreshold_LT_8u_C1R_t icvThreshold_LT_8u_C1R_p = 0;
5476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvThreshold_LT_16s_C1R_t icvThreshold_LT_16s_C1R_p = 0;
5486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvThreshold_LT_32f_C1R_t icvThreshold_LT_32f_C1R_p = 0;
5496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/***************************************** cvCmp ****************************************/
5516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
5536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvCmp( const void* srcarr1, const void* srcarr2,
5546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn       void* dstarr, int cmp_op )
5556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
5566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static CvFuncTable cmp_tab[2];
5576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static int inittab = 0;
5586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvCmp" );
5606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
5626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int type, coi = 0;
5646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int invflag = 0;
5656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvCmpOp ipp_cmp_op;
5666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int src1_step, src2_step, dst_step;
5676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat srcstub1, *src1 = (CvMat*)srcarr1;
5686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat srcstub2, *src2 = (CvMat*)srcarr2;
5696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat dststub,  *dst = (CvMat*)dstarr;
5706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat *temp;
5716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize size;
5726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvFunc2D_3A func;
5736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !inittab )
5756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
5766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvInitCmpGTC1RTable( &cmp_tab[0] );
5776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvInitCmpEQC1RTable( &cmp_tab[1] );
5786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        inittab = 1;
5796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
5806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT(src1) )
5826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
5836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( src1 = cvGetMat( src1, &srcstub1, &coi ));
5846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( coi != 0 )
5856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_BadCOI, "" );
5866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
5876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT(src2) )
5896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
5906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( src2 = cvGetMat( src2, &srcstub2, &coi ));
5916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( coi != 0 )
5926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_BadCOI, "" );
5936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
5946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT(dst) )
5966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
5976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( dst = cvGetMat( dst, &dststub, &coi ));
5986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( coi != 0 )
5996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_BadCOI, "" );
6006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
6016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    switch( cmp_op )
6036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
6046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_CMP_GT:
6056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_CMP_EQ:
6066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        break;
6076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_CMP_GE:
6086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_SWAP( src1, src2, temp );
6096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        invflag = 1;
6106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        break;
6116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_CMP_LT:
6126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_SWAP( src1, src2, temp );
6136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        break;
6146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_CMP_LE:
6156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        invflag = 1;
6166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        break;
6176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_CMP_NE:
6186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cmp_op = CV_CMP_EQ;
6196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        invflag = 1;
6206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        break;
6216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    default:
6226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsBadArg, "Unknown comparison operation" );
6236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
6246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_TYPES_EQ( src1, src2 ) )
6266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR_FROM_CODE( CV_StsUnmatchedFormats );
6276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_MAT_CN( src1->type ) != 1 )
6296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnsupportedFormat, "Input arrays must be single-channel");
6306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MASK_ARR( dst ))
6326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnsupportedFormat, "Destination array should be 8uC1 or 8sC1");
6336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_SIZES_EQ( src1, src2 ) ||
6356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        !CV_ARE_SIZES_EQ( src1, dst ))
6366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR_FROM_CODE( CV_StsUnmatchedSizes );
6376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    type = CV_MAT_TYPE(src1->type);
6396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size = cvGetMatSize( src1 );
6406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_IS_MAT_CONT( src1->type & src2->type & dst->type ))
6426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
6436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size.width *= size.height;
6446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        src1_step = src2_step = dst_step = CV_STUB_STEP;
6456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size.height = 1;
6466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
6476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
6486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
6496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        src1_step = src1->step;
6506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        src2_step = src2->step;
6516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dst_step = dst->step;
6526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
6536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    func = (CvFunc2D_3A)(cmp_tab[cmp_op == CV_CMP_EQ].fn_2d[type]);
6556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !func )
6576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnsupportedFormat, "" );
6586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ipp_cmp_op = cmp_op == CV_CMP_EQ ? cvCmpEq : cvCmpGreater;
6606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( type == CV_8U && icvCompare_8u_C1R_p )
6626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
6636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IPPI_CALL( icvCompare_8u_C1R_p( src1->data.ptr, src1_step, src2->data.ptr,
6646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            src2_step, dst->data.ptr, dst_step, size, ipp_cmp_op ));
6656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
6666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( type == CV_16S && icvCompare_16s_C1R_p )
6676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
6686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IPPI_CALL( icvCompare_16s_C1R_p( src1->data.s, src1_step, src2->data.s,
6696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            src2_step, dst->data.s, dst_step, size, ipp_cmp_op ));
6706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
6716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( type == CV_32F && icvCompare_32f_C1R_p )
6726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
6736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IPPI_CALL( icvCompare_32f_C1R_p( src1->data.fl, src1_step, src2->data.fl,
6746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            src2_step, dst->data.fl, dst_step, size, ipp_cmp_op ));
6756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
6766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
6776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
6786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IPPI_CALL( func( src1->data.ptr, src1_step, src2->data.ptr, src2_step,
6796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                         dst->data.ptr, dst_step, size ));
6806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
6816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( invflag )
6836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IPPI_CALL( icvNot_8u_C1R( dst->data.ptr, dst_step,
6846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                           dst->data.ptr, dst_step, size ));
6856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
6876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
6886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*************************************** cvCmpS *****************************************/
6916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
6936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvCmpS( const void* srcarr, double value, void* dstarr, int cmp_op )
6946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
6956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static CvFuncTable cmps_tab[3];
6966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static int inittab = 0;
6976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvCmpS" );
6996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
7016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int y, type, coi = 0;
7036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int invflag = 0, ipp_cmp_op;
7046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int src1_step, dst_step;
7056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat srcstub1, *src1 = (CvMat*)srcarr;
7066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat dststub,  *dst = (CvMat*)dstarr;
7076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize size;
7086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int ival = 0;
7096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !inittab )
7116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
7126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvInitCmpEQCC1RTable( &cmps_tab[CV_CMP_EQ] );
7136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvInitCmpGTCC1RTable( &cmps_tab[CV_CMP_GT] );
7146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvInitCmpGECC1RTable( &cmps_tab[CV_CMP_GE] );
7156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        inittab = 1;
7166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
7176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT(src1) )
7196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
7206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( src1 = cvGetMat( src1, &srcstub1, &coi ));
7216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( coi != 0 )
7226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_BadCOI, "" );
7236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
7246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT(dst) )
7266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
7276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( dst = cvGetMat( dst, &dststub, &coi ));
7286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( coi != 0 )
7296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_BadCOI, "" );
7306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
7316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    switch( cmp_op )
7336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
7346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_CMP_GT:
7356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_CMP_EQ:
7366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_CMP_GE:
7376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        break;
7386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_CMP_LT:
7396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        invflag = 1;
7406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cmp_op = CV_CMP_GE;
7416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        break;
7426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_CMP_LE:
7436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        invflag = 1;
7446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cmp_op = CV_CMP_GT;
7456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        break;
7466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_CMP_NE:
7476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        invflag = 1;
7486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cmp_op = CV_CMP_EQ;
7496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        break;
7506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    default:
7516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsBadArg, "Unknown comparison operation" );
7526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
7536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MASK_ARR( dst ))
7556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnsupportedFormat, "Destination array should be 8uC1 or 8sC1");
7566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_MAT_CN( src1->type ) != 1 )
7586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnsupportedFormat, "Input array must be single-channel");
7596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_SIZES_EQ( src1, dst ))
7616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR_FROM_CODE( CV_StsUnmatchedSizes );
7626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    type = CV_MAT_TYPE(src1->type);
7646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size = cvGetMatSize( src1 );
7656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_IS_MAT_CONT( src1->type & dst->type ))
7676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
7686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size.width *= size.height;
7696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        src1_step = dst_step = CV_STUB_STEP;
7706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size.height = 1;
7716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
7726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
7736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
7746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        src1_step = src1->step;
7756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dst_step = dst->step;
7766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
7776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_MAT_DEPTH(type) <= CV_32S )
7796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
7806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ival = cvRound(value);
7816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( type == CV_8U || type == CV_16S )
7826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
7836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int minval = type == CV_8U ? 0 : -32768;
7846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int maxval = type == CV_8U ? 255 : 32767;
7856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int fillval = -1;
7866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( ival < minval )
7876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                fillval = cmp_op == CV_CMP_NE || cmp_op == CV_CMP_GE || cmp_op == CV_CMP_GT ? 255 : 0;
7886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else if( ival > maxval )
7896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                fillval = cmp_op == CV_CMP_NE || cmp_op == CV_CMP_LE || cmp_op == CV_CMP_LT ? 255 : 0;
7906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( fillval >= 0 )
7916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
7926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                fillval ^= invflag ? 255 : 0;
7936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                for( y = 0; y < size.height; y++ )
7946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    memset( dst->data.ptr + y*dst_step, fillval, size.width );
7956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                EXIT;
7966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
7976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
7986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
7996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ipp_cmp_op = cmp_op == CV_CMP_EQ ? cvCmpEq :
8016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                 cmp_op == CV_CMP_GE ? cvCmpGreaterEq : cvCmpGreater;
8026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( type == CV_8U && icvCompare_8u_C1R_p )
8036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
8046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IPPI_CALL( icvCompareC_8u_C1R_p( src1->data.ptr, src1_step, (uchar)ival,
8056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                         dst->data.ptr, dst_step, size, ipp_cmp_op ));
8066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
8076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( type == CV_16S && icvCompare_16s_C1R_p )
8086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
8096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IPPI_CALL( icvCompareC_16s_C1R_p( src1->data.s, src1_step, (short)ival,
8106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                          dst->data.s, dst_step, size, ipp_cmp_op ));
8116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
8126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( type == CV_32F && icvCompare_32f_C1R_p )
8136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
8146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IPPI_CALL( icvCompareC_32f_C1R_p( src1->data.fl, src1_step, (float)value,
8156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                          dst->data.fl, dst_step, size, ipp_cmp_op ));
8166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
8176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
8186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
8196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvFunc2D_2A1P func = (CvFunc2D_2A1P)(cmps_tab[cmp_op].fn_2d[type]);
8206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !func )
8216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsUnsupportedFormat, "" );
8226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( type <= CV_32S )
8246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
8256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            IPPI_CALL( func( src1->data.ptr, src1_step, dst->data.ptr,
8266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                             dst_step, size, &ival ));
8276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
8286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
8296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
8306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            IPPI_CALL( func( src1->data.ptr, src1_step, dst->data.ptr,
8316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                             dst_step, size, &value ));
8326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
8336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
8346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( invflag )
8366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IPPI_CALL( icvNot_8u_C1R( dst->data.ptr, dst_step,
8376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                           dst->data.ptr, dst_step, size ));
8386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
8406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
8416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
8446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                                       Min/Max                                          *
8456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
8466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_MINMAX_FUNC( __op__, name, flavor, arrtype, \
8496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                             worktype, _toggle_macro_ )     \
8506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL                                  \
8516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennicv##name##_##flavor##_C1R( const arrtype* src1, int step1, \
8526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    const arrtype* src2, int step2,                         \
8536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    arrtype* dst, int step, CvSize size )                   \
8546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                           \
8556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step1 /= sizeof(src1[0]); step2 /= sizeof(src2[0]);     \
8566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step /= sizeof(dst[0]);                                 \
8576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                            \
8586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src1 += step1,                    \
8596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            src2 += step2, dst += step )                    \
8606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                       \
8616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int x;                                              \
8626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( x = 0; x <= size.width - 4; x += 4 )           \
8636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                   \
8646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            worktype a0 = _toggle_macro_(src1[x]);          \
8656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            worktype b0 = _toggle_macro_(src2[x]);          \
8666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            worktype a1 = _toggle_macro_(src1[x+1]);        \
8676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            worktype b1 = _toggle_macro_(src2[x+1]);        \
8686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            a0 = __op__( a0, b0 );                          \
8696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            a1 = __op__( a1, b1 );                          \
8706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[x] = (arrtype)_toggle_macro_(a0);           \
8716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[x+1] = (arrtype)_toggle_macro_(a1);         \
8726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            a0 = _toggle_macro_(src1[x+2]);                 \
8736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            b0 = _toggle_macro_(src2[x+2]);                 \
8746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            a1 = _toggle_macro_(src1[x+3]);                 \
8756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            b1 = _toggle_macro_(src2[x+3]);                 \
8766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            a0 = __op__( a0, b0 );                          \
8776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            a1 = __op__( a1, b1 );                          \
8786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[x+2] = (arrtype)_toggle_macro_(a0);         \
8796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[x+3] = (arrtype)_toggle_macro_(a1);         \
8806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                   \
8816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                            \
8826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( ; x < size.width; x++ )                        \
8836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                   \
8846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            worktype a0 = _toggle_macro_(src1[x]);          \
8856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            worktype b0 = _toggle_macro_(src2[x]);          \
8866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            a0 = __op__( a0, b0 );                          \
8876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[x] = (arrtype)_toggle_macro_(a0);           \
8886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                   \
8896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                       \
8906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                            \
8916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                           \
8926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
8936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_MINMAX_CONST_FUNC( __op__, name,            \
8966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    flavor, arrtype, worktype, _toggle_macro_)              \
8976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL                                  \
8986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennicv##name##C_##flavor##_C1R( const arrtype* src1, int step1,\
8996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                             arrtype* dst, int step,        \
9006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                             CvSize size, worktype* pScalar)\
9016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                           \
9026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    worktype scalar = _toggle_macro_(*pScalar);             \
9036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step1 /= sizeof(src1[0]); step /= sizeof(dst[0]);       \
9046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                            \
9056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src1 += step1, dst += step )      \
9066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                       \
9076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int x;                                              \
9086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( x = 0; x <= size.width - 4; x += 4 )           \
9096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                   \
9106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            worktype a0 = _toggle_macro_(src1[x]);          \
9116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            worktype a1 = _toggle_macro_(src1[x+1]);        \
9126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            a0 = __op__( a0, scalar );                      \
9136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            a1 = __op__( a1, scalar );                      \
9146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[x] = (arrtype)_toggle_macro_(a0);           \
9156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[x+1] = (arrtype)_toggle_macro_(a1);         \
9166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            a0 = _toggle_macro_(src1[x+2]);                 \
9176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            a1 = _toggle_macro_(src1[x+3]);                 \
9186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            a0 = __op__( a0, scalar );                      \
9196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            a1 = __op__( a1, scalar );                      \
9206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[x+2] = (arrtype)_toggle_macro_(a0);         \
9216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[x+3] = (arrtype)_toggle_macro_(a1);         \
9226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                   \
9236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                            \
9246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( ; x < size.width; x++ )                        \
9256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                   \
9266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            worktype a0 = _toggle_macro_(src1[x]);          \
9276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            a0 = __op__( a0, scalar );                      \
9286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[x] = (arrtype)_toggle_macro_(a0);           \
9296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                   \
9306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                       \
9316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                            \
9326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                           \
9336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
9346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_MINMAX_ALL( flavor, arrtype, worktype,                             \
9376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            _toggle_macro_, _min_op_, _max_op_ )                   \
9386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_MINMAX_FUNC( _min_op_, Min, flavor, arrtype, worktype, _toggle_macro_ )    \
9396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_MINMAX_FUNC( _max_op_, Max, flavor, arrtype, worktype, _toggle_macro_ )    \
9406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_MINMAX_CONST_FUNC(_min_op_, Min, flavor, arrtype, worktype, _toggle_macro_)\
9416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_MINMAX_CONST_FUNC(_max_op_, Max, flavor, arrtype, worktype, _toggle_macro_)
9426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_MINMAX_ALL( 8u, uchar, int, CV_NOP, CV_MIN_8U, CV_MAX_8U )
9446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_MINMAX_ALL( 16u, ushort, int, CV_NOP, CV_IMIN, CV_IMAX )
9456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_MINMAX_ALL( 16s, short, int, CV_NOP, CV_IMIN, CV_IMAX )
9466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_MINMAX_ALL( 32s, int, int, CV_NOP, CV_IMIN, CV_IMAX )
9476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_MINMAX_ALL( 32f, int, int, CV_TOGGLE_FLT, CV_IMIN, CV_IMAX )
9486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_MINMAX_ALL( 64f, double, double, CV_NOP, MIN, MAX )
9496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define icvMin_8s_C1R     0
9516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define icvMax_8s_C1R     0
9526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define icvMinC_8s_C1R    0
9536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define icvMaxC_8s_C1R    0
9546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_DEF_INIT_FUNC_TAB_2D( Min, C1R )
9566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_DEF_INIT_FUNC_TAB_2D( Max, C1R )
9576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_DEF_INIT_FUNC_TAB_2D( MinC, C1R )
9586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_DEF_INIT_FUNC_TAB_2D( MaxC, C1R )
9596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*********************************** cvMin & cvMax **************************************/
9616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic void
9636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvMinMax( const void* srcarr1, const void* srcarr2,
9646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn           void* dstarr, int is_max )
9656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
9666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static CvFuncTable minmax_tab[2];
9676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static int inittab = 0;
9686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "icvMinMax" );
9706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
9726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int type, coi = 0;
9746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int src1_step, src2_step, dst_step;
9756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat srcstub1, *src1 = (CvMat*)srcarr1;
9766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat srcstub2, *src2 = (CvMat*)srcarr2;
9776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat dststub,  *dst = (CvMat*)dstarr;
9786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize size;
9796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvFunc2D_3A func;
9806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !inittab )
9826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
9836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvInitMinC1RTable( &minmax_tab[0] );
9846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvInitMaxC1RTable( &minmax_tab[1] );
9856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        inittab = 1;
9866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
9876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT(src1) )
9896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
9906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( src1 = cvGetMat( src1, &srcstub1, &coi ));
9916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( coi != 0 )
9926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_BadCOI, "" );
9936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
9946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT(src2) )
9966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
9976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( src2 = cvGetMat( src2, &srcstub2, &coi ));
9986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( coi != 0 )
9996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_BadCOI, "" );
10006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
10016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT(dst) )
10036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
10046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( dst = cvGetMat( dst, &dststub, &coi ));
10056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( coi != 0 )
10066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_BadCOI, "" );
10076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
10086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_TYPES_EQ( src1, src2 ) ||
10106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        !CV_ARE_TYPES_EQ( src1, dst ))
10116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR_FROM_CODE( CV_StsUnmatchedFormats );
10126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_MAT_CN( src1->type ) != 1 )
10146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnsupportedFormat, "Input arrays must be single-channel");
10156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_SIZES_EQ( src1, src2 ) ||
10176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        !CV_ARE_SIZES_EQ( src1, dst ))
10186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR_FROM_CODE( CV_StsUnmatchedSizes );
10196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    type = CV_MAT_TYPE(src1->type);
10216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size = cvGetMatSize( src1 );
10226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_IS_MAT_CONT( src1->type & src2->type & dst->type ))
10246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
10256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size.width *= size.height;
10266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        src1_step = src2_step = dst_step = CV_STUB_STEP;
10276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size.height = 1;
10286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
10296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
10306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
10316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        src1_step = src1->step;
10326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        src2_step = src2->step;
10336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dst_step = dst->step;
10346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
10356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    func = (CvFunc2D_3A)(minmax_tab[is_max != 0].fn_2d[type]);
10376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !func )
10396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnsupportedFormat, "" );
10406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    IPPI_CALL( func( src1->data.ptr, src1_step, src2->data.ptr, src2_step,
10426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                     dst->data.ptr, dst_step, size ));
10436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
10456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
10466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
10496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvMin( const void* srcarr1, const void* srcarr2, void* dstarr )
10506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
10516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    icvMinMax( srcarr1, srcarr2, dstarr, 0 );
10526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
10536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
10566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvMax( const void* srcarr1, const void* srcarr2, void* dstarr )
10576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
10586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    icvMinMax( srcarr1, srcarr2, dstarr, 1 );
10596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
10606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/********************************* cvMinS / cvMaxS **************************************/
10636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic void
10656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvMinMaxS( const void* srcarr, double value, void* dstarr, int is_max )
10666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
10676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static CvFuncTable minmaxs_tab[2];
10686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static int inittab = 0;
10696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "icvMinMaxS" );
10716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
10736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int type, coi = 0;
10756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int src1_step, dst_step;
10766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat srcstub1, *src1 = (CvMat*)srcarr;
10776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat dststub,  *dst = (CvMat*)dstarr;
10786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize size;
10796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvFunc2D_2A1P func;
10806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    union
10816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
10826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int i;
10836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        float f;
10846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        double d;
10856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
10866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    buf;
10876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !inittab )
10896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
10906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvInitMinCC1RTable( &minmaxs_tab[0] );
10916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvInitMaxCC1RTable( &minmaxs_tab[1] );
10926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        inittab = 1;
10936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
10946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT(src1) )
10966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
10976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( src1 = cvGetMat( src1, &srcstub1, &coi ));
10986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( coi != 0 )
10996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_BadCOI, "" );
11006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
11016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT(dst) )
11036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
11046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( dst = cvGetMat( dst, &dststub, &coi ));
11056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( coi != 0 )
11066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_BadCOI, "" );
11076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
11086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_TYPES_EQ( src1, dst ))
11106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR_FROM_CODE( CV_StsUnmatchedFormats );
11116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_MAT_CN( src1->type ) != 1 )
11136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnsupportedFormat, "Input array must be single-channel");
11146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_SIZES_EQ( src1, dst ))
11166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR_FROM_CODE( CV_StsUnmatchedSizes );
11176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    type = CV_MAT_TYPE(src1->type);
11196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_MAT_DEPTH(type) <= CV_32S )
11216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
11226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        buf.i = cvRound(value);
11236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_MAT_DEPTH(type) == CV_8U )
11246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            buf.i = CV_CAST_8U(buf.i);
11256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else if( CV_MAT_DEPTH(type) == CV_8S )
11266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            buf.i = CV_CAST_8S(buf.i);
11276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else if( CV_MAT_DEPTH(type) == CV_16U )
11286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            buf.i = CV_CAST_16U(buf.i);
11296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else if( CV_MAT_DEPTH(type) == CV_16S )
11306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            buf.i = CV_CAST_16S(buf.i);
11316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
11326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( CV_MAT_DEPTH(type) == CV_32F )
11336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        buf.f = (float)value;
11346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
11356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        buf.d = value;
11366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size = cvGetMatSize( src1 );
11386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_IS_MAT_CONT( src1->type & dst->type ))
11406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
11416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size.width *= size.height;
11426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        src1_step = dst_step = CV_STUB_STEP;
11436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size.height = 1;
11446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
11456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
11466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
11476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        src1_step = src1->step;
11486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dst_step = dst->step;
11496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
11506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    func = (CvFunc2D_2A1P)(minmaxs_tab[is_max].fn_2d[type]);
11526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !func )
11546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnsupportedFormat, "" );
11556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( is_max )
11576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
11586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( type == CV_8U && icvThreshold_LT_8u_C1R_p )
11596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
11606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            IPPI_CALL( icvThreshold_LT_8u_C1R_p( src1->data.ptr, src1_step, dst->data.ptr,
11616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                 dst_step, size, (uchar)buf.i ));
11626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            EXIT;
11636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
11646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else if( type == CV_16S && icvThreshold_LT_16s_C1R_p )
11656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
11666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            IPPI_CALL( icvThreshold_LT_16s_C1R_p( src1->data.s, src1_step, dst->data.s,
11676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                 dst_step, size, (short)buf.i ));
11686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            EXIT;
11696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
11706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else if( type == CV_32F && icvThreshold_LT_32f_C1R_p )
11716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
11726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            IPPI_CALL( icvThreshold_LT_32f_C1R_p( src1->data.fl, src1_step, dst->data.fl,
11736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                 dst_step, size, buf.f ));
11746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            EXIT;
11756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
11766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
11776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
11786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
11796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( type == CV_8U && icvThreshold_GT_8u_C1R_p )
11806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
11816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            IPPI_CALL( icvThreshold_GT_8u_C1R_p( src1->data.ptr, src1_step, dst->data.ptr,
11826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                 dst_step, size, (uchar)buf.i ));
11836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            EXIT;
11846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
11856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else if( type == CV_16S && icvThreshold_GT_16s_C1R_p )
11866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
11876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            IPPI_CALL( icvThreshold_GT_16s_C1R_p( src1->data.s, src1_step, dst->data.s,
11886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                 dst_step, size, (short)buf.i ));
11896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            EXIT;
11906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
11916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else if( type == CV_32F && icvThreshold_GT_32f_C1R_p )
11926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
11936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            IPPI_CALL( icvThreshold_GT_32f_C1R_p( src1->data.fl, src1_step, dst->data.fl,
11946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                 dst_step, size, buf.f ));
11956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            EXIT;
11966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
11976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
11986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( type == CV_8U && size.width*size.height >= 1024 )
12006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
12016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int i;
12026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        uchar tab[256];
12036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvMat _tab = cvMat( 1, 256, CV_8U, tab );
12046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( is_max )
12066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
12076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( i = 0; i < buf.i; i++ )
12086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                tab[i] = (uchar)buf.i;
12096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( ; i < 256; i++ )
12106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                tab[i] = (uchar)i;
12116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
12126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
12136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
12146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( i = 0; i < buf.i; i++ )
12156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                tab[i] = (uchar)i;
12166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( ; i < 256; i++ )
12176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                tab[i] = (uchar)buf.i;
12186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
12196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cvLUT( src1, dst, &_tab );
12216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        EXIT;
12226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
12236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    IPPI_CALL( func( src1->data.ptr, src1_step, dst->data.ptr,
12256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                     dst_step, size, &buf ));
12266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
12286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
12296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
12326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvMinS( const void* srcarr, double value, void* dstarr )
12336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
12346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    icvMinMaxS( srcarr, value, dstarr, 0 );
12356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
12366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
12396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvMaxS( const void* srcarr, double value, void* dstarr )
12406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
12416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    icvMinMaxS( srcarr, value, dstarr, 1 );
12426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
12436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
12466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                                  Absolute Difference                                   *
12476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
12486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  ICV_DEF_BIN_ABS_DIFF_2D(name, arrtype, temptype, abs_macro, cast_macro)\
12506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIPCVAPI_IMPL( CvStatus,                                 \
12516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennname,( const arrtype* src1, int step1,                  \
12526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn       const arrtype* src2, int step2,                  \
12536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn       arrtype* dst, int step, CvSize size ),           \
12546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn       (src1, step1, src2, step2, dst, step, size))     \
12556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                       \
12566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step1 /= sizeof(src1[0]); step2 /= sizeof(src2[0]); \
12576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step /= sizeof(dst[0]);                             \
12586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                        \
12596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src1 += step1, src2 += step2, \
12606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                          dst += step )                 \
12616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                   \
12626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int i;                                          \
12636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                        \
12646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( i = 0; i <= size.width - 4; i += 4 )       \
12656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                               \
12666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            temptype t0 = src1[i] - src2[i];            \
12676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            temptype t1 = src1[i+1] - src2[i+1];        \
12686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                        \
12696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t0 = (temptype)abs_macro(t0);               \
12706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t1 = (temptype)abs_macro(t1);               \
12716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                        \
12726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i] = cast_macro(t0);                    \
12736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i+1] = cast_macro(t1);                  \
12746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                        \
12756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t0 = src1[i+2] - src2[i+2];                 \
12766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t1 = src1[i+3] - src2[i+3];                 \
12776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                        \
12786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t0 = (temptype)abs_macro(t0);               \
12796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t1 = (temptype)abs_macro(t1);               \
12806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                        \
12816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i+2] = cast_macro(t0);                  \
12826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i+3] = cast_macro(t1);                  \
12836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                               \
12846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                        \
12856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( ; i < size.width; i++ )                    \
12866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                               \
12876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            temptype t0 = src1[i] - src2[i];            \
12886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t0 = (temptype)abs_macro(t0);               \
12896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i] = cast_macro(t0);                    \
12906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                               \
12916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                   \
12926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                        \
12936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                       \
12946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
12956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  ICV_DEF_UN_ABS_DIFF_2D( name, arrtype, temptype, abs_macro, cast_macro)\
12986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL                              \
12996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennname( const arrtype* src0, int step1,                   \
13006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn      arrtype* dst0, int step,                          \
13016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn      CvSize size, const temptype* scalar )             \
13026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                       \
13036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    step1 /= sizeof(src0[0]); step /= sizeof(dst0[0]);  \
13046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                        \
13056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src0 += step1, dst0 += step ) \
13066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                   \
13076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int i, len = size.width;                        \
13086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        const arrtype* src = src0;                      \
13096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        arrtype* dst = dst0;                            \
13106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                        \
13116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( ; (len -= 12) >= 0; dst += 12, src += 12 ) \
13126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                               \
13136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            temptype t0 = src[0] - scalar[0];           \
13146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            temptype t1 = src[1] - scalar[1];           \
13156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                        \
13166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t0 = (temptype)abs_macro(t0);               \
13176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t1 = (temptype)abs_macro(t1);               \
13186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                        \
13196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[0] = cast_macro( t0 );                  \
13206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[1] = cast_macro( t1 );                  \
13216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                        \
13226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t0 = src[2] - scalar[2];                    \
13236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t1 = src[3] - scalar[3];                    \
13246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                        \
13256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t0 = (temptype)abs_macro(t0);               \
13266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t1 = (temptype)abs_macro(t1);               \
13276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                        \
13286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[2] = cast_macro( t0 );                  \
13296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[3] = cast_macro( t1 );                  \
13306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                        \
13316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t0 = src[4] - scalar[4];                    \
13326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t1 = src[5] - scalar[5];                    \
13336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                        \
13346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t0 = (temptype)abs_macro(t0);               \
13356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t1 = (temptype)abs_macro(t1);               \
13366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                        \
13376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[4] = cast_macro( t0 );                  \
13386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[5] = cast_macro( t1 );                  \
13396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                        \
13406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t0 = src[6] - scalar[6];                    \
13416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t1 = src[7] - scalar[7];                    \
13426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                        \
13436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t0 = (temptype)abs_macro(t0);               \
13446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t1 = (temptype)abs_macro(t1);               \
13456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                        \
13466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[6] = cast_macro( t0 );                  \
13476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[7] = cast_macro( t1 );                  \
13486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                        \
13496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t0 = src[8] - scalar[8];                    \
13506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t1 = src[9] - scalar[9];                    \
13516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                        \
13526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t0 = (temptype)abs_macro(t0);               \
13536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t1 = (temptype)abs_macro(t1);               \
13546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                        \
13556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[8] = cast_macro( t0 );                  \
13566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[9] = cast_macro( t1 );                  \
13576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                        \
13586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t0 = src[10] - scalar[10];                  \
13596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t1 = src[11] - scalar[11];                  \
13606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                        \
13616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t0 = (temptype)abs_macro(t0);               \
13626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t1 = (temptype)abs_macro(t1);               \
13636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                        \
13646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[10] = cast_macro( t0 );                 \
13656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[11] = cast_macro( t1 );                 \
13666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                               \
13676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                        \
13686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( (len) += 12, i = 0; i < (len); i++ )       \
13696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                               \
13706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            temptype t0 = src[i] - scalar[i];           \
13716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t0 = (temptype)abs_macro(t0);               \
13726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i] = cast_macro( t0 );                  \
13736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                               \
13746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                   \
13756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                        \
13766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                       \
13776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
13786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  ICV_TO_8U(x)     ((uchar)(x))
13816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  ICV_TO_16U(x)    ((ushort)(x))
13826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_BIN_ABS_DIFF_2D( icvAbsDiff_8u_C1R, uchar, int, CV_IABS, ICV_TO_8U )
13846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_BIN_ABS_DIFF_2D( icvAbsDiff_16u_C1R, ushort, int, CV_IABS, ICV_TO_16U )
13856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_BIN_ABS_DIFF_2D( icvAbsDiff_16s_C1R, short, int, CV_IABS, CV_CAST_16S )
13866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_BIN_ABS_DIFF_2D( icvAbsDiff_32s_C1R, int, int, CV_IABS, CV_CAST_32S )
13876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_BIN_ABS_DIFF_2D( icvAbsDiff_32f_C1R, float, float, fabs, CV_CAST_32F )
13886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_BIN_ABS_DIFF_2D( icvAbsDiff_64f_C1R, double, double, fabs, CV_CAST_64F )
13896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_UN_ABS_DIFF_2D( icvAbsDiffC_8u_CnR, uchar, int, CV_IABS, CV_CAST_8U )
13916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_UN_ABS_DIFF_2D( icvAbsDiffC_16u_CnR, ushort, int, CV_IABS, CV_CAST_16U )
13926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_UN_ABS_DIFF_2D( icvAbsDiffC_16s_CnR, short, int, CV_IABS, CV_CAST_16S )
13936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_UN_ABS_DIFF_2D( icvAbsDiffC_32s_CnR, int, int, CV_IABS, CV_CAST_32S )
13946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_UN_ABS_DIFF_2D( icvAbsDiffC_32f_CnR, float, float, fabs, CV_CAST_32F )
13956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_UN_ABS_DIFF_2D( icvAbsDiffC_64f_CnR, double, double, fabs, CV_CAST_64F )
13966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  ICV_INIT_MINI_FUNC_TAB_2D( FUNCNAME, suffix )          \
13996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic void icvInit##FUNCNAME##Table( CvFuncTable* tab )        \
14006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                               \
14016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_8U] = (void*)icv##FUNCNAME##_8u_##suffix;     \
14026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_16U] = (void*)icv##FUNCNAME##_16u_##suffix;   \
14036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_16S] = (void*)icv##FUNCNAME##_16s_##suffix;   \
14046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_32S] = (void*)icv##FUNCNAME##_32s_##suffix;   \
14056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_32F] = (void*)icv##FUNCNAME##_32f_##suffix;   \
14066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_64F] = (void*)icv##FUNCNAME##_64f_##suffix;   \
14076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
14086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_INIT_MINI_FUNC_TAB_2D( AbsDiff, C1R )
14116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_INIT_MINI_FUNC_TAB_2D( AbsDiffC, CnR )
14126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL  void
14156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvAbsDiff( const void* srcarr1, const void* srcarr2, void* dstarr )
14166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
14176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static CvFuncTable adiff_tab;
14186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static int inittab = 0;
14196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvAbsDiff" );
14216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
14236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int coi1 = 0, coi2 = 0, coi3 = 0;
14256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat srcstub1, *src1 = (CvMat*)srcarr1;
14266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat srcstub2, *src2 = (CvMat*)srcarr2;
14276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat dststub,  *dst = (CvMat*)dstarr;
14286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int src1_step, src2_step, dst_step;
14296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize size;
14306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int type;
14316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !inittab )
14336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
14346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvInitAbsDiffTable( &adiff_tab );
14356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        inittab = 1;
14366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
14376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_CALL( src1 = cvGetMat( src1, &srcstub1, &coi1 ));
14396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_CALL( src2 = cvGetMat( src2, &srcstub2, &coi2 ));
14406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_CALL( dst = cvGetMat( dst, &dststub, &coi3 ));
14416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( coi1 != 0 || coi2 != 0 || coi3 != 0 )
14436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_BadCOI, "" );
14446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_SIZES_EQ( src1, src2 ) )
14466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR_FROM_CODE( CV_StsUnmatchedSizes );
14476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size = cvGetMatSize( src1 );
14496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    type = CV_MAT_TYPE(src1->type);
14506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_SIZES_EQ( src1, dst ))
14526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR_FROM_CODE( CV_StsUnmatchedSizes );
14536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_TYPES_EQ( src1, src2 ))
14556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR_FROM_CODE( CV_StsUnmatchedFormats );
14566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_TYPES_EQ( src1, dst ))
14586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR_FROM_CODE( CV_StsUnmatchedFormats );
14596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size.width *= CV_MAT_CN( type );
14616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    src1_step = src1->step;
14636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    src2_step = src2->step;
14646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dst_step = dst->step;
14656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_IS_MAT_CONT( src1->type & src2->type & dst->type ))
14676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
14686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size.width *= size.height;
14696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size.height = 1;
14706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        src1_step = src2_step = dst_step = CV_STUB_STEP;
14716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
14726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
14746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvFunc2D_3A func = (CvFunc2D_3A)
14756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            (adiff_tab.fn_2d[CV_MAT_DEPTH(type)]);
14766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !func )
14786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsUnsupportedFormat, "" );
14796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IPPI_CALL( func( src1->data.ptr, src1_step, src2->data.ptr, src2_step,
14816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                         dst->data.ptr, dst_step, size ));
14826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
14836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
14856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
14866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
14896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvAbsDiffS( const void* srcarr, void* dstarr, CvScalar scalar )
14906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
14916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static CvFuncTable adiffs_tab;
14926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static int inittab = 0;
14936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvAbsDiffS" );
14956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
14976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int coi1 = 0, coi2 = 0;
14996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int type, sctype;
15006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat srcstub, *src = (CvMat*)srcarr;
15016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat dststub, *dst = (CvMat*)dstarr;
15026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int src_step, dst_step;
15036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double buf[12];
15046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize size;
15056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !inittab )
15076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
15086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvInitAbsDiffCTable( &adiffs_tab );
15096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        inittab = 1;
15106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
15116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_CALL( src = cvGetMat( src, &srcstub, &coi1 ));
15136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_CALL( dst = cvGetMat( dst, &dststub, &coi2 ));
15146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( coi1 != 0 || coi2 != 0 )
15166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_BadCOI, "" );
15176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_TYPES_EQ(src, dst) )
15196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR_FROM_CODE( CV_StsUnmatchedFormats );
15206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_SIZES_EQ(src, dst) )
15226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR_FROM_CODE( CV_StsUnmatchedSizes );
15236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    sctype = type = CV_MAT_TYPE( src->type );
15256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_MAT_DEPTH(type) < CV_32S )
15266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        sctype = (type & CV_MAT_CN_MASK) | CV_32SC1;
15276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size = cvGetMatSize( src );
15296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size.width *= CV_MAT_CN( type );
15306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    src_step = src->step;
15326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dst_step = dst->step;
15336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_IS_MAT_CONT( src->type & dst->type ))
15356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
15366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size.width *= size.height;
15376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size.height = 1;
15386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        src_step = dst_step = CV_STUB_STEP;
15396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
15406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_CALL( cvScalarToRawData( &scalar, buf, sctype, 1 ));
15426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
15446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvFunc2D_2A1P func = (CvFunc2D_2A1P)
15456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            (adiffs_tab.fn_2d[CV_MAT_DEPTH(type)]);
15466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !func )
15486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsUnsupportedFormat, "" );
15496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IPPI_CALL( func( src->data.ptr, src_step, dst->data.ptr,
15516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                         dst_step, size, buf ));
15526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
15536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
15556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
15566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* End of file. */
1558