/*M///////////////////////////////////////////////////////////////////////////////////////
//
//  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
//
//  By downloading, copying, installing or using the software you agree to this license.
//  If you do not agree to this license, do not download, install,
//  copy or use the software.
//
//
//                        Intel License Agreement
//                For Open Source Computer Vision Library
//
// Copyright (C) 2000, Intel Corporation, all rights reserved.
// Third party copyrights are property of their respective owners.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
//   * Redistribution's of source code must retain the above copyright notice,
//     this list of conditions and the following disclaimer.
//
//   * Redistribution's in binary form must reproduce the above copyright notice,
//     this list of conditions and the following disclaimer in the documentation
//     and/or other materials provided with the distribution.
//
//   * The name of Intel Corporation may not be used to endorse or promote products
//     derived from this software without specific prior written permission.
//
// This software is provided by the copyright holders and contributors "as is" and
// any express or implied warranties, including, but not limited to, the implied
// warranties of merchantability and fitness for a particular purpose are disclaimed.
// In no event shall the Intel Corporation or contributors be liable for any direct,
// indirect, incidental, special, exemplary, or consequential damages
// (including, but not limited to, procurement of substitute goods or services;
// loss of use, data, or profits; or business interruption) however caused
// and on any theory of liability, whether in contract, strict liability,
// or tort (including negligence or otherwise) arising in any way out of
// the use of this software, even if advised of the possibility of such damage.
//
//M*/

#ifndef __OPENCV_HIGHGUI_H__
#define __OPENCV_HIGHGUI_H__

#include "opencv2/core/core_c.h"
#if defined WIN32 || defined _WIN32 || defined WIN64 || defined _WIN64
   	#include <windows.h>
	#undef min
	#undef max
#endif

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/****************************************************************************************\
*                                  Basic GUI functions                                   *
\****************************************************************************************/

/* this function is used to set some external parameters in case of X Window */
CVAPI(int) cvInitSystem( int argc, char** argv );

CVAPI(int) cvStartWindowThread();

enum { CV_WINDOW_AUTOSIZE = 1 };

/* create window */
CVAPI(int) cvNamedWindow( const char* name, int flags CV_DEFAULT(CV_WINDOW_AUTOSIZE) );

// ---------  YV ---------
enum
{
	CV_WND_PROP_FULLSCREEN = 0,
	CV_WND_PROP_AUTOSIZE   = 1,
	CV_WINDOW_NORMAL       = 0,
	CV_WINDOW_FULLSCREEN   = 1
};

/* Set and Get Property of the window */
CVAPI(void) cvSetWindowProperty(const char* name, int prop_id, double prop_value);
CVAPI(double) cvGetWindowProperty(const char* name, int prop_id);

/* display image within window (highgui windows remember their content) */
CVAPI(void) cvShowImage( const char* name, const CvArr* image );

/* resize/move window */
CVAPI(void) cvResizeWindow( const char* name, int width, int height );
CVAPI(void) cvMoveWindow( const char* name, int x, int y );


/* destroy window and all the trackers associated with it */
CVAPI(void) cvDestroyWindow( const char* name );

CVAPI(void) cvDestroyAllWindows(void);

/* get native window handle (HWND in case of Win32 and Widget in case of X Window) */
CVAPI(void*) cvGetWindowHandle( const char* name );

/* get name of highgui window given its native handle */
CVAPI(const char*) cvGetWindowName( void* window_handle );


typedef void (CV_CDECL *CvTrackbarCallback)(int pos);

/* create trackbar and display it on top of given window, set callback */
CVAPI(int) cvCreateTrackbar( const char* trackbar_name, const char* window_name,
                             int* value, int count, CvTrackbarCallback on_change);

typedef void (CV_CDECL *CvTrackbarCallback2)(int pos, void* userdata);

CVAPI(int) cvCreateTrackbar2( const char* trackbar_name, const char* window_name,
                              int* value, int count, CvTrackbarCallback2 on_change,
                              void* userdata CV_DEFAULT(0));

/* retrieve or set trackbar position */
CVAPI(int) cvGetTrackbarPos( const char* trackbar_name, const char* window_name );
CVAPI(void) cvSetTrackbarPos( const char* trackbar_name, const char* window_name, int pos );

enum
{
	CV_EVENT_MOUSEMOVE      =0,
	CV_EVENT_LBUTTONDOWN    =1,
	CV_EVENT_RBUTTONDOWN    =2,
	CV_EVENT_MBUTTONDOWN    =3,
	CV_EVENT_LBUTTONUP      =4,
	CV_EVENT_RBUTTONUP      =5,
	CV_EVENT_MBUTTONUP      =6,
	CV_EVENT_LBUTTONDBLCLK  =7,
	CV_EVENT_RBUTTONDBLCLK  =8,
	CV_EVENT_MBUTTONDBLCLK  =9
};

enum
{
	CV_EVENT_FLAG_LBUTTON   =1,
	CV_EVENT_FLAG_RBUTTON   =2,
	CV_EVENT_FLAG_MBUTTON   =4,
	CV_EVENT_FLAG_CTRLKEY   =8,
	CV_EVENT_FLAG_SHIFTKEY  =16,
	CV_EVENT_FLAG_ALTKEY    =32
};

typedef void (CV_CDECL *CvMouseCallback )(int event, int x, int y, int flags, void* param);

/* assign callback for mouse events */
CVAPI(void) cvSetMouseCallback( const char* window_name, CvMouseCallback on_mouse,
                                void* param CV_DEFAULT(NULL));

enum
{
/* 8bit, color or not */
	CV_LOAD_IMAGE_UNCHANGED  =-1,
/* 8bit, gray */
	CV_LOAD_IMAGE_GRAYSCALE  =0,
/* ?, color */
	CV_LOAD_IMAGE_COLOR      =1,
/* any depth, ? */
	CV_LOAD_IMAGE_ANYDEPTH   =2,
/* ?, any color */
	CV_LOAD_IMAGE_ANYCOLOR   =4
};

/* load image from file
  iscolor can be a combination of above flags where CV_LOAD_IMAGE_UNCHANGED
  overrides the other flags
  using CV_LOAD_IMAGE_ANYCOLOR alone is equivalent to CV_LOAD_IMAGE_UNCHANGED
  unless CV_LOAD_IMAGE_ANYDEPTH is specified images are converted to 8bit
*/
CVAPI(IplImage*) cvLoadImage( const char* filename, int iscolor CV_DEFAULT(CV_LOAD_IMAGE_COLOR));
CVAPI(CvMat*) cvLoadImageM( const char* filename, int iscolor CV_DEFAULT(CV_LOAD_IMAGE_COLOR));

enum
{
	CV_IMWRITE_JPEG_QUALITY =1,
	CV_IMWRITE_PNG_COMPRESSION =16,
	CV_IMWRITE_PXM_BINARY =32
};

/* save image to file */
CVAPI(int) cvSaveImage( const char* filename, const CvArr* image,
                        const int* params CV_DEFAULT(0) );

/* decode image stored in the buffer */
CVAPI(IplImage*) cvDecodeImage( const CvMat* buf, int iscolor CV_DEFAULT(CV_LOAD_IMAGE_COLOR));
CVAPI(CvMat*) cvDecodeImageM( const CvMat* buf, int iscolor CV_DEFAULT(CV_LOAD_IMAGE_COLOR));

/* encode image and store the result as a byte vector (single-row 8uC1 matrix) */
CVAPI(CvMat*) cvEncodeImage( const char* ext, const CvArr* image,
                             const int* params CV_DEFAULT(0) );

enum
{
	CV_CVTIMG_FLIP      =1,
	CV_CVTIMG_SWAP_RB   =2
};

/* utility function: convert one image to another with optional vertical flip */
CVAPI(void) cvConvertImage( const CvArr* src, CvArr* dst, int flags CV_DEFAULT(0));

/* wait for key event infinitely (delay<=0) or for "delay" milliseconds */
CVAPI(int) cvWaitKey(int delay CV_DEFAULT(0));


/****************************************************************************************\
*                         Working with Video Files and Cameras                           *
\****************************************************************************************/

/* "black box" capture structure */
typedef struct CvCapture CvCapture;

/* start capturing frames from video file */
CVAPI(CvCapture*) cvCreateFileCapture( const char* filename );

enum
{
	CV_CAP_ANY      =0,     // autodetect

	CV_CAP_MIL      =100,   // MIL proprietary drivers

	CV_CAP_VFW      =200,   // platform native
	CV_CAP_V4L      =200,
	CV_CAP_V4L2     =200,

	CV_CAP_FIREWARE =300,   // IEEE 1394 drivers
	CV_CAP_FIREWIRE =300,
	CV_CAP_IEEE1394 =300,
	CV_CAP_DC1394   =300,
	CV_CAP_CMU1394  =300,

	CV_CAP_STEREO   =400,   // TYZX proprietary drivers
	CV_CAP_TYZX     =400,
	CV_TYZX_LEFT    =400,
	CV_TYZX_RIGHT   =401,
	CV_TYZX_COLOR   =402,
	CV_TYZX_Z       =403,

	CV_CAP_QT       =500,   // QuickTime

	CV_CAP_UNICAP   =600,   // Unicap drivers

	CV_CAP_DSHOW    =700,   // DirectShow (via videoInput)

	CV_CAP_PVAPI    =800   // PvAPI, Prosilica GigE SDK
};

/* start capturing frames from camera: index = camera_index + domain_offset (CV_CAP_*) */
CVAPI(CvCapture*) cvCreateCameraCapture( int index );

/* grab a frame, return 1 on success, 0 on fail.
  this function is thought to be fast               */
CVAPI(int) cvGrabFrame( CvCapture* capture );

/* get the frame grabbed with cvGrabFrame(..)
  This function may apply some frame processing like
  frame decompression, flipping etc.
  !!!DO NOT RELEASE or MODIFY the retrieved frame!!! */
CVAPI(IplImage*) cvRetrieveFrame( CvCapture* capture, int streamIdx CV_DEFAULT(0) );

/* Just a combination of cvGrabFrame and cvRetrieveFrame
   !!!DO NOT RELEASE or MODIFY the retrieved frame!!!      */
CVAPI(IplImage*) cvQueryFrame( CvCapture* capture );

/* stop capturing/reading and free resources */
CVAPI(void) cvReleaseCapture( CvCapture** capture );

enum
{
	CV_CAP_PROP_POS_MSEC       =0,
	CV_CAP_PROP_POS_FRAMES     =1,
	CV_CAP_PROP_POS_AVI_RATIO  =2,
	CV_CAP_PROP_FRAME_WIDTH    =3,
	CV_CAP_PROP_FRAME_HEIGHT   =4,
	CV_CAP_PROP_FPS            =5,
	CV_CAP_PROP_FOURCC         =6,
	CV_CAP_PROP_FRAME_COUNT    =7,
	CV_CAP_PROP_FORMAT         =8,
	CV_CAP_PROP_MODE           =9,
	CV_CAP_PROP_BRIGHTNESS    =10,
	CV_CAP_PROP_CONTRAST      =11,
	CV_CAP_PROP_SATURATION    =12,
	CV_CAP_PROP_HUE           =13,
	CV_CAP_PROP_GAIN          =14,
	CV_CAP_PROP_EXPOSURE      =15,
	CV_CAP_PROP_CONVERT_RGB   =16,
	CV_CAP_PROP_WHITE_BALANCE =17,
	CV_CAP_PROP_RECTIFICATION =18
};

/* retrieve or set capture properties */
CVAPI(double) cvGetCaptureProperty( CvCapture* capture, int property_id );
CVAPI(int)    cvSetCaptureProperty( CvCapture* capture, int property_id, double value );

// Return the type of the capturer (eg, CV_CAP_V4W, CV_CAP_UNICAP), which is unknown if created with CV_CAP_ANY
CVAPI(int)    cvGetCaptureDomain( CvCapture* capture);  

/* "black box" video file writer structure */
typedef struct CvVideoWriter CvVideoWriter;

CV_INLINE int CV_FOURCC(char c1, char c2, char c3, char c4)
{
	return (c1 & 255) + ((c2 & 255) << 8) + ((c3 &255) << 16) + ((c4 & 255) << 24);
}

#define CV_FOURCC_PROMPT -1  /* Open Codec Selection Dialog (Windows only) */
#define CV_FOURCC_DEFAULT CV_FOURCC('I', 'Y', 'U', 'V') /* Use default codec for specified filename (Linux only) */

/* initialize video file writer */
CVAPI(CvVideoWriter*) cvCreateVideoWriter( const char* filename, int fourcc,
                                           double fps, CvSize frame_size,
                                           int is_color CV_DEFAULT(1));

//CVAPI(CvVideoWriter*) cvCreateImageSequenceWriter( const char* filename,
//                                                   int is_color CV_DEFAULT(1));

/* write frame to video file */
CVAPI(int) cvWriteFrame( CvVideoWriter* writer, const IplImage* image );

/* close video file writer */
CVAPI(void) cvReleaseVideoWriter( CvVideoWriter** writer );

/****************************************************************************************\
*                              Obsolete functions/synonyms                               *
\****************************************************************************************/

#define cvCaptureFromFile cvCreateFileCapture
#define cvCaptureFromCAM cvCreateCameraCapture
#define cvCaptureFromAVI cvCaptureFromFile
#define cvCreateAVIWriter cvCreateVideoWriter
#define cvWriteToAVI cvWriteFrame
#define cvAddSearchPath(path)
#define cvvInitSystem cvInitSystem
#define cvvNamedWindow cvNamedWindow
#define cvvShowImage cvShowImage
#define cvvResizeWindow cvResizeWindow
#define cvvDestroyWindow cvDestroyWindow
#define cvvCreateTrackbar cvCreateTrackbar
#define cvvLoadImage(name) cvLoadImage((name),1)
#define cvvSaveImage cvSaveImage
#define cvvAddSearchPath cvAddSearchPath
#define cvvWaitKey(name) cvWaitKey(0)
#define cvvWaitKeyEx(name,delay) cvWaitKey(delay)
#define cvvConvertImage cvConvertImage
#define HG_AUTOSIZE CV_WINDOW_AUTOSIZE
#define set_preprocess_func cvSetPreprocessFuncWin32
#define set_postprocess_func cvSetPostprocessFuncWin32

#if defined WIN32 || defined _WIN32

typedef int (CV_CDECL * CvWin32WindowCallback)(HWND, UINT, WPARAM, LPARAM, int*);
CVAPI(void) cvSetPreprocessFuncWin32( CvWin32WindowCallback on_preprocess );
CVAPI(void) cvSetPostprocessFuncWin32( CvWin32WindowCallback on_postprocess );

#endif

#ifdef __cplusplus
}
#endif

#endif
