#ifndef __RV_MSK_H_INCLUDED_
#define __RV_MSK_H_INCLUDED_

#include <rvb\rvtypes.h> 


#define MSK_API WINAPI
 
    

//mask shape
//RV_MT_NONE创建一个矩阵，里面没有标记点，即全为0。
#define RV_MT_NONE      0
#define RV_MT_LINE      1
#define RV_MT_RECT      2
#define RV_MT_CIRCLE    3
#define RV_MT_CROSS     4
#define RV_MT_TRI_E     50  //to east
#define RV_MT_TRI_S     51  //to south
#define RV_MT_TRI_W     52  //to west
#define RV_MT_TRI_N     53  //to north


#define RV_MT_DEFAULT   RV_MT_RECT



//MASK MERGE TYPE
#define RV_MT_NOT_B      0x11
#define RV_MT_NOT_A      0x12
#define RV_MT_A_AND_B    0x13
#define RV_MT_A_OR_B     0x14
#define RV_MT_A_XOR_B    0x15
#define RV_MT_ONLY_B     0x16





extern "C" RvMask MSK_API   rvCreateMask(int shape, int width, int height);
extern "C" RvMask  MSK_API  rvCreateMaskEx( int width, int height, void* pDataSource, size_t size, int pitch=-1);

extern "C" void MSK_API     rvDestroyMask(RvMask mask);

extern "C" int MSK_API      rmkGetWidth(RvMask mask);
extern "C" int   MSK_API    rmkGetHeight(RvMask mask);
extern "C" int MSK_API       rmkGetPitch(RvMask mask);
extern "C" size_t   MSK_API     rmkGetSize(RvMask mask);//获得mask的数据大小（单位：字节）

extern "C" RvByte* MSK_API  rmkGetMatrix(RvMask mask);
 
extern "C" void   MSK_API   rmkToggle(RvMask mask);
extern "C" void MSK_API     rmkSetZero(RvMask mask);
extern "C" void  MSK_API    rmkSetOne(RvMask mask);

//
extern "C" BOOL  MSK_API    rmkResize(RvMask mask, int width, int height);

//该函数对原来的mask按照新尺寸进行缩放
extern "C" BOOL  MSK_API    rmkResizeE1(RvMask mask, int width, int height, BOOL bKeepShape);



extern "C" BOOL  MSK_API    rmkIsEmpty(RvMask mask);
extern "C" UINT  MSK_API    rmkGetArea(RvMask mask);
 
extern "C" RvPoint MSK_API   rmkGetReferPos(RvMask mask);
extern "C" void   MSK_API    rmkSetReferPos(RvMask mask, int x, int y);
extern "C" void  MSK_API     rmkSetReferPosEx(RvMask mask, RvPoint point);

extern "C" RvMask MSK_API    rmkClone(RvMask mask);

//NOTE: result saved in mask1
extern "C" void  MSK_API   rmkMergeEx(RvMask mask1, RvMask mask2, int x0, int y0, int x1, int y1, int opType);

//NOTE: result saved in mask1
extern "C" void MSK_API    rmkMerge(RvMask mask1, RvMask mask2, int opType);

//不支持虚拟mask缩放
extern "C" BOOL MSK_API    rmkScale(RvMask mask, float ratio);
 


//直接转换成二值图，函数将创建一个新的图象，图像格式为RIT_BIN 。
extern "C" RvImage MSK_API rmkDeriveImage(RvMask mask);
 
//转成图像。imDest可以为二值，灰度，彩色或RGBA图像。
//输出的图像格式与imDest不变。
//图象的大小将与mask一样。
//如果imDest为NULL,输出与rmkDeriveImage一样。
//如果自动扩展，那么模板为非RV_BIN_ZERO的值将自动转成255。
//    RGBA图象仅对ALPHA通道进行操作
extern "C" RvImage MSK_API rmkDeriveImageEx(RvMask mask,  RvImage imDest = NULL,  BOOL bAutoExpand =FALSE);

//根据输入的图像类型，生成一个mask(或增强型)。
//图像格式只能是RIT_BIN或RIT_GRAY.
extern "C" RvMask MSK_API rmkDeriveMask(RvImage image);

//flags:
//    RV_DM_DEFAULT -  忽略颜色，所有大于0非背景，
//    RV_DM_ENHANCED - 增强型MASK. 支持0-255级。生成的值从0-255.否则只能是0-1。
//    RGBA图象仅对ALPHA通道进行操作
#define RV_DM_DEFAULT      1
#define RV_DM_ENHANCED    (1<<1)
extern "C" RvMask MSK_API rmkDeriveMaskEx(RvImage image,  RvColor foreColor, int flags =0 , RvMask dest = NULL );

#endif