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#ifndef _CXCORE_INTERNAL_H_
436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define _CXCORE_INTERNAL_H_
446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if defined _MSC_VER && _MSC_VER >= 1200
466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* disable warnings related to inline functions */
476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #pragma warning( disable: 4711 4710 4514 )
486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef unsigned long ulong;
516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#ifdef __BORLANDC__
536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #define     WIN32
546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #define     CV_DLL
556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #undef      _CV_ALWAYS_PROFILE_
566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #define     _CV_ALWAYS_NO_PROFILE_
576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "cxcore.h"
606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "cxmisc.h"
616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "_cxipp.h"
626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include <math.h>
636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include <assert.h>
646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include <string.h>
656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include <stdlib.h>
666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include <stdio.h>
676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include <limits.h>
686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include <float.h>
696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// -128.f ... 255.f
716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennextern const float icv8x32fTab[];
726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_8TO32F(x)  icv8x32fTab[(x)+128]
736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennextern const ushort icv8x16uSqrTab[];
756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SQR_8U(x)  icv8x16uSqrTab[(x)+255]
766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennextern const char* icvHersheyGlyphs[];
786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennextern const signed char icvDepthToType[];
806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define icvIplToCvDepth( depth ) \
826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    icvDepthToType[(((depth) & 255) >> 2) + ((depth) < 0)]
836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennextern const uchar icvSaturate8u[];
856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_FAST_CAST_8U(t)   (assert(-256 <= (t) && (t) <= 512), icvSaturate8u[(t)+256])
866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_MIN_8U(a,b)       ((a) - CV_FAST_CAST_8U((a) - (b)))
876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_MAX_8U(a,b)       ((a) + CV_FAST_CAST_8U((b) - (a)))
886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvFunc2D_3A1I CvArithmBinMaskFunc2D;
906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvFunc2D_2A1P1I CvArithmUniMaskFunc2D;
916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                                   Complex arithmetics                                  *
956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstruct CvComplex32f;
986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstruct CvComplex64f;
996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstruct CvComplex32f
1016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
1026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float re, im;
1036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvComplex32f() {}
1056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvComplex32f( float _re, float _im=0 ) : re(_re), im(_im) {}
1066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    explicit CvComplex32f( const CvComplex64f& v );
1076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    //CvComplex32f( const CvComplex32f& v ) : re(v.re), im(v.im) {}
1086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    //CvComplex32f& operator = (const CvComplex32f& v ) { re = v.re; im = v.im; return *this; }
1096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    operator CvComplex64f() const;
1106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};
1116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstruct CvComplex64f
1136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
1146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double re, im;
1156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvComplex64f() {}
1176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvComplex64f( double _re, double _im=0 ) : re(_re), im(_im) {}
1186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    explicit CvComplex64f( const CvComplex32f& v );
1196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    //CvComplex64f( const CvComplex64f& v ) : re(v.re), im(v.im) {}
1206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    //CvComplex64f& operator = (const CvComplex64f& v ) { re = v.re; im = v.im; return *this; }
1216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    operator CvComplex32f() const;
1226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};
1236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline CvComplex32f::CvComplex32f( const CvComplex64f& v ) : re((float)v.re), im((float)v.im) {}
1256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline CvComplex64f::CvComplex64f( const CvComplex32f& v ) : re(v.re), im(v.im) {}
1266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline CvComplex32f operator + (CvComplex32f a, CvComplex32f b)
1286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
1296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CvComplex32f( a.re + b.re, a.im + b.im );
1306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
1316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline CvComplex32f& operator += (CvComplex32f& a, CvComplex32f b)
1336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
1346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    a.re += b.re;
1356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    a.im += b.im;
1366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return a;
1376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
1386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline CvComplex32f operator - (CvComplex32f a, CvComplex32f b)
1406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
1416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CvComplex32f( a.re - b.re, a.im - b.im );
1426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
1436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline CvComplex32f& operator -= (CvComplex32f& a, CvComplex32f b)
1456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
1466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    a.re -= b.re;
1476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    a.im -= b.im;
1486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return a;
1496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
1506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline CvComplex32f operator - (CvComplex32f a)
1526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
1536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CvComplex32f( -a.re, -a.im );
1546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
1556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline CvComplex32f operator * (CvComplex32f a, CvComplex32f b)
1576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
1586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CvComplex32f( a.re*b.re - a.im*b.im, a.re*b.im + a.im*b.re );
1596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
1606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline double abs(CvComplex32f a)
1626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
1636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return sqrt( (double)a.re*a.re + (double)a.im*a.im );
1646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
1656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline CvComplex32f conj(CvComplex32f a)
1676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
1686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CvComplex32f( a.re, -a.im );
1696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
1706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline CvComplex32f operator / (CvComplex32f a, CvComplex32f b)
1736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
1746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double t = 1./((double)b.re*b.re + (double)b.im*b.im);
1756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CvComplex32f( (float)((a.re*b.re + a.im*b.im)*t),
1766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                         (float)((-a.re*b.im + a.im*b.re)*t) );
1776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
1786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline CvComplex32f operator * (double a, CvComplex32f b)
1806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
1816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CvComplex32f( (float)(a*b.re), (float)(a*b.im) );
1826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
1836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline CvComplex32f operator * (CvComplex32f a, double b)
1856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
1866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CvComplex32f( (float)(a.re*b), (float)(a.im*b) );
1876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
1886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline CvComplex32f::operator CvComplex64f() const
1906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
1916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CvComplex64f(re,im);
1926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
1936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline CvComplex64f operator + (CvComplex64f a, CvComplex64f b)
1966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
1976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CvComplex64f( a.re + b.re, a.im + b.im );
1986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
1996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline CvComplex64f& operator += (CvComplex64f& a, CvComplex64f b)
2016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    a.re += b.re;
2036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    a.im += b.im;
2046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return a;
2056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline CvComplex64f operator - (CvComplex64f a, CvComplex64f b)
2086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CvComplex64f( a.re - b.re, a.im - b.im );
2106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline CvComplex64f& operator -= (CvComplex64f& a, CvComplex64f b)
2136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    a.re -= b.re;
2156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    a.im -= b.im;
2166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return a;
2176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline CvComplex64f operator - (CvComplex64f a)
2206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CvComplex64f( -a.re, -a.im );
2226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline CvComplex64f operator * (CvComplex64f a, CvComplex64f b)
2256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CvComplex64f( a.re*b.re - a.im*b.im, a.re*b.im + a.im*b.re );
2276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline double abs(CvComplex64f a)
2306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return sqrt( (double)a.re*a.re + (double)a.im*a.im );
2326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline CvComplex64f operator / (CvComplex64f a, CvComplex64f b)
2356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double t = 1./((double)b.re*b.re + (double)b.im*b.im);
2376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CvComplex64f( (a.re*b.re + a.im*b.im)*t,
2386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                         (-a.re*b.im + a.im*b.re)*t );
2396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline CvComplex64f operator * (double a, CvComplex64f b)
2426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CvComplex64f( a*b.re, a*b.im );
2446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline CvComplex64f operator * (CvComplex64f a, double b)
2476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CvComplex64f( a.re*b, a.im*b );
2496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline CvComplex64f::operator CvComplex32f() const
2526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CvComplex32f((float)re,(float)im);
2546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline CvComplex64f conj(CvComplex64f a)
2576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CvComplex64f( a.re, -a.im );
2596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline CvComplex64f operator + (CvComplex64f a, CvComplex32f b)
2626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CvComplex64f( a.re + b.re, a.im + b.im );
2646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline CvComplex64f operator + (CvComplex32f a, CvComplex64f b)
2676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CvComplex64f( a.re + b.re, a.im + b.im );
2696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline CvComplex64f operator - (CvComplex64f a, CvComplex32f b)
2726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CvComplex64f( a.re - b.re, a.im - b.im );
2746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline CvComplex64f operator - (CvComplex32f a, CvComplex64f b)
2776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CvComplex64f( a.re - b.re, a.im - b.im );
2796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline CvComplex64f operator * (CvComplex64f a, CvComplex32f b)
2826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CvComplex64f( a.re*b.re - a.im*b.im, a.re*b.im + a.im*b.re );
2846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renninline CvComplex64f operator * (CvComplex32f a, CvComplex64f b)
2876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CvComplex64f( a.re*b.re - a.im*b.im, a.re*b.im + a.im*b.re );
2896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL * CvCopyMaskFunc)(const void* src, int src_step,
2936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                               void* dst, int dst_step, CvSize size,
2946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                               const void* mask, int mask_step);
2956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvCopyMaskFunc icvGetCopyMaskFunc( int elem_size );
2976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvStatus CV_STDCALL icvSetZero_8u_C1R( uchar* dst, int dststep, CvSize size );
2996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvStatus CV_STDCALL icvScale_32f( const float* src, float* dst, int len, float a, float b );
3016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvStatus CV_STDCALL icvScale_64f( const double* src, double* dst, int len, double a, double b );
3026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvStatus CV_STDCALL icvLUT_Transform8u_8u_C1R( const uchar* src, int srcstep, uchar* dst,
3046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                               int dststep, CvSize size, const uchar* lut );
3056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvStatus CV_STDCALL icvLUT_Transform8u_16u_C1R( const uchar* src, int srcstep, ushort* dst,
3066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                int dststep, CvSize size, const ushort* lut );
3076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvStatus CV_STDCALL icvLUT_Transform8u_32s_C1R( const uchar* src, int srcstep, int* dst,
3086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                int dststep, CvSize size, const int* lut );
3096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvStatus CV_STDCALL icvLUT_Transform8u_64f_C1R( const uchar* src, int srcstep, double* dst,
3106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                int dststep, CvSize size, const double* lut );
3116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvStatus CV_STDCALL icvLUT_Transform8u_8u_C2R( const uchar* src, int srcstep, uchar* dst,
3136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                               int dststep, CvSize size, const uchar* lut );
3146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvStatus CV_STDCALL icvLUT_Transform8u_8u_C3R( const uchar* src, int srcstep, uchar* dst,
3156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                               int dststep, CvSize size, const uchar* lut );
3166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvStatus CV_STDCALL icvLUT_Transform8u_8u_C4R( const uchar* src, int srcstep, uchar* dst,
3176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                               int dststep, CvSize size, const uchar* lut );
3186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL * CvLUT_TransformFunc)( const void* src, int srcstep, void* dst,
3206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                     int dststep, CvSize size, const void* lut );
3216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE CvStatus
3236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvLUT_Transform8u_8s_C1R( const uchar* src, int srcstep, schar* dst,
3246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            int dststep, CvSize size, const schar* lut )
3256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
3266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return icvLUT_Transform8u_8u_C1R( src, srcstep, (uchar*)dst,
3276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                      dststep, size, (const uchar*)lut );
3286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
3296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE CvStatus
3316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvLUT_Transform8u_16s_C1R( const uchar* src, int srcstep, short* dst,
3326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            int dststep, CvSize size, const short* lut )
3336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
3346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return icvLUT_Transform8u_16u_C1R( src, srcstep, (ushort*)dst,
3356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                       dststep, size, (const ushort*)lut );
3366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
3376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE CvStatus
3396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvLUT_Transform8u_32f_C1R( const uchar* src, int srcstep, float* dst,
3406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            int dststep, CvSize size, const float* lut )
3416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
3426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return icvLUT_Transform8u_32s_C1R( src, srcstep, (int*)dst,
3436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                       dststep, size, (const int*)lut );
3446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
3456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif /*_CXCORE_INTERNAL_H_*/
347