#import <Foundation/Foundation.h>
#import <AVFoundation/AVFoundation.h>


/**
	@defgroup SwiftAPI
	@{
*/

/** \~English
	\brief Format of image data.
	\~Russian
	\brief Формат данных изображения.
*/
typedef  NS_ENUM(int32_t, Format){
/** \~English
	\brief Grayscale, 8 bit per pixel.
	\~Russian
	\brief Оттенки серого, 8 бит на пиксел.
*/
    FORMAT_GRAY = 0,

/** \~English
	\brief RGB, 24 bit per pixel, 8 bit per channel.
	\~Russian
	\brief RGB, 24 бита на пиксел, 8 бит на канал.
*/
    FORMAT_RGB = 1,

/** \~English
		\brief BGR, 24 bit per pixel, 8 bit per channel.
		\~Russian
		\brief BGR, 24 бита на пиксел, 8 бит на канал.
	*/
    FORMAT_BGR = 2,

/** \~English
	\brief NV21 format in the YUV color coding system, the standard image format used on the Android camera preview.
	\~Russian
	\brief Формат NV21 в цветовой системе кодирования YUV, стандартный формат изображений,  используемых в превью Android-камер.
*/
    FORMAT_YUV_NV21 = 3,

/** \~English
	\brief NV12 format in the YUV color coding system.
	\~Russian
	\brief Формат NV12 в цветовой системе кодирования YUV.
*/
    FORMAT_YUV_NV12 = 4
};


/** \~English
	\brief Rectangle in an image.
	\~Russian
	\brief Прямоугольник на изображении.
*/
@interface Rectangle : NSObject
{
    int x;
    int y;
    int width;
    int height;
}

/** \~English
	\brief Constructor.
	\~Russian
	\brief Конструктор.
*/
-(nonnull instancetype) init: (int) X : (int) Y : (int) Width : (int) Height;

/** \~English
	\brief X coordinate of the top-left corner.
	\~Russian
	\brief Координата X левого верхнего угла прямоугольника.
*/
@property int x;

/** \~English
	\brief Y coordinate of the top-left corner.
	\~Russian
	\brief Координата Y левого верхнего угла прямоугольника.
*/
@property int y;

/** \~English
	\brief Width of the rectangle.
	\~Russian
	\brief Ширина прямоугольника.
*/
@property int width;

/** \~English
	\brief Height of the rectangle.
	\~Russian
	\brief Высота прямоугольника.
*/
@property int height;

@end



/** \~English
	\brief
	Struct that provides raw image data and optional cropping information.

	\~Russian
	\brief
	Структура, предоставляющая данные изображения в "сыром" формате и опциональную информацию для обрезки.
*/
@interface RawImage : NSObject
{
    void *raw_image;
    int width;
    int height;
    const unsigned char * data;
}

/**
	\~English
	\brief Constructor for an image without cropping.
	\~Russian
	\brief Конструктор для изображения без обрезки.
*/
-(nonnull instancetype) init: (int) width : (int) height : (int) format : (const unsigned char *_Nullable) data;

/**
	\~English
	\brief Constructor for an image in InternalImageBuffer without cropping.
	\~Russian
	\brief Конструктор для изображения в InternalImageBuffer::Ptr без обрезки.
*/
-(nonnull instancetype) init: (void *_Nonnull)image;
-(nonnull instancetype) init;

/**
	\~English
	\brief Constructor for an image from CMSampleBufferRef.
	\~Russian
	\brief Конструктор для изображения из CMSampleBufferRef.
*/
-(nonnull instancetype) init: (CMSampleBufferRef _Nullable)sampleBuffer  : (int) format;

-(void) dealloc;

/**
	\~English
	\brief
		Create RawImage that represents the specified rectangle area of this image.

	\~Russian
	\brief
		Создать RawImage, представляющий указанную прямоугольную область этого изображения.
*/
-(nonnull RawImage*) crop: (Rectangle *_Nonnull) rec;

@property (readonly ,nonnull) void *raw_image;

/**
	\~English
	\brief Image width.
	\~Russian
	\brief Ширина изображения.
*/
@property (readonly) int width;

/**
	\~English
	\brief Image height.
	\~Russian
	\brief Высота изображения.
*/
@property (readonly) int height;

/**
	\~English
	\brief
		Pointer to the image data buffer.
		All pixels must be stored continuously, row by row, without gaps at the end of each row.

	\~Russian
	\brief
		Указатель на данные изображения.
		Все пикселы должны быть сохранены последовательно, строка за строкой, без разрывов.
*/
@property (readonly, nonnull) const unsigned char * data;

@end


/** @} */