
#if !defined(__RV_BARCODE_READER_H_INCLUDED_)
#define      __RV_BARCODE_READER_H_INCLUDED_



#include "bcr.h"



//#define RV_UC_BARCODE_READER     (RV_UC_CALI_CURVE + 15)//
//#define   RV_UC_BARCODE_SCANNER     (RV_UC_BARCODE_READER + 1)


class BCR_API CBarcode: public CAreaCal
{	
public:
	CBarcode();
	virtual ~CBarcode();

	enum
	{
		BC_UNKNOWN     =      -1,
		BC_PARTIAL     =      1,  /**< intermediate status */
		BC_EAN8        =      8,  /**< EAN-8 */
		BC_UPCE        =      9,  /**< UPC-E */
		BC_ISBN10      =     10,  /**< ISBN-10 (from EAN-13). @since 0.4 */
		BC_UPCA        =     12,  /**< UPC-A */
		BC_EAN13       =     13,  /**< EAN-13 */
		BC_ISBN13      =     14,  /**< ISBN-13 (from EAN-13). @since 0.4 */
		BC_I25         =     25,  /**< Interleaved 2 of 5. @since 0.4 */
		BC_CODE39      =     39,  /**< Code 39. @since 0.4 */
		BC_PDF417      =     57,  /**< PDF417. @since 0.6 (当前版本并不支持)*/ 
		BC_QRCODE      =     64,  /**< QR Code. @since 0.10 */
		BC_CODE128     =    128,  /**< Code 128 */
		BC_DATAMATRIX  =    200,  /*DataMatrix*/
	};

	//显示类型
	enum
	{
		BC_DEFAULT=0,
		BC_MARKED,
	//	BC_IMAGE,  
	//	BC_TEXT,
	};

	//条码图背景
	enum{
		BC_BKG_IGNORE =0, //不处理
		BC_BKG_SIMPLE,    //简单处理
		BC_BKG_COMPLEX,   //处理各种情况。
	};


	virtual BOOL   Serialize(HANDLE device, BOOL bIn ) ;
	virtual CUCObj* Clone(  CUCObj *twin) ;

    virtual void Show(CDelegate* pDelegate,int mode, BOOL bForce);

	 
	virtual void  SetDisplayStyle(int style);

	//返回编码的个数
	virtual int  Read();
	//仅定位不识别
	int  Locate();

	//定位条码
	virtual int  Locate(RvImage image, RvBox2D* pBoxArr, int size);

	//获取读取结果
	int         GetReadingCount();
	const TCHAR* GetReadingAt(int index);
	
	//获得条码矩形坐标，矩形坐标数量共4个，可能实旋转的顶点，
	//坐标以caliber的左上角为原点。
	//注意：指针外部程序不能修改和释放。每次检测以后，该指针可能发生变化。
	const RvPoint* GetVertexes(int index);

	//获得编码类型
	int  GetEncoder(int index);

	//条码定位的力度，范围为0-1。如果小于等于0，表示自动控制力度
	//void SetLocateForce(float val);
	//float GetLocateForce(){return m_nLocateForce ;};

public:
	//BOOL  m_bComplexBackground;  //是否有复杂的背景图。
	int   m_nBackgroundType;     //0. 常规 1. 复杂背景
	int   m_nWidthLower, m_nWidthUpper;   //宽
	int   m_nHeightLower, m_nHeightUpper; //高

	int   m_nMaxCount ;       //最多条码数
	BOOL  m_bBlackBarcode;    // 是否为黑码白底。
	float m_nLocateForce;     //保留
	BOOL  m_bHasDirtyPieces;  //条码周围是否有杂物
	BOOL  m_bDarkLighting;    //保留

public:
	virtual void UpdateShape(CDelegate* pDelegate, HGPD hGpd, BOOL bMove)  ;
	 
    

protected:
	void ClearCluster();
	int  FindBarcode(RvImage image, RvImage target, int nBarLimit);
	RV_HANDLE DrawBoxes(HGDC dc, RV_HANDLE hStroke/*, BOOL bDrawText*/);

	//int Read2D();
	//int ReadAny();

	void Process(RvImage image, int backType);

	void DrawMarked(CDelegate* pDelegate, int mode, BOOL bForce);
	//void DrawRoi(CDelegate* pDelegate, int mode, BOOL bForce);
	//void DrawResult(CDelegate* pDelegate, int mode, BOOL bForce);



protected:
	//RvCluster m_clsResult;
	RvSequence m_seqResult;
	  
	
};

 

 


#endif