// QR_Encode.h : CQR_Encode ¥¯¥é¥¹ÐûÑÔ¤ª¤è¤Ó¥¤¥ó¥¿©`¥Õ¥§¥¤¥¹¶¨Áx // Date 2006/05/17 Ver. 1.22 Psytec Inc. #if !defined(AFX_QR_ENCODE_H__AC886DF7_C0AE_4C9F_AC7A_FCDA8CB1DD37__INCLUDED_) #define AFX_QR_ENCODE_H__AC886DF7_C0AE_4C9F_AC7A_FCDA8CB1DD37__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 ///////////////////////////////////////////////////////////////////////////// // ¶¨Êý // ´íÎó¶©Õýˮƽ #define QR_LEVEL_L 0 #define QR_LEVEL_M 1 #define QR_LEVEL_Q 2 #define QR_LEVEL_H 3 // Êý¾Ýģʽ #define QR_MODE_NUMERAL 0 #define QR_MODE_ALPHABET 1 #define QR_MODE_8BIT 2 #define QR_MODE_KANJI 3 // °æ±¾(ÐͺÅ)С×é #define QR_VRESION_S 0 // 1 ¡« 9 #define QR_VRESION_M 1 // 10 ¡« 26 #define QR_VRESION_L 2 // 27 ¡« 40 #define MAX_ALLCODEWORD 3706 // ×ÜcodewordÊý×î´óÖµ #define MAX_DATACODEWORD 2956 // data codeWord×î´óÖµ(°æ±¾40-L) #define MAX_CODEBLOCK 153 // ¿édata code´æ´¢Á¿×î´óÖµ(°üÀ¨RScodeword) #define MAX_MODULESIZE 177 // Ò»±ß×é¼þÊý×î´óÖµ // λͼ»æ»­Ê±£¬×¬Í· #define QR_MARGIN 4 ///////////////////////////////////////////////////////////////////////////// // Reed-Solomon error correction(ÀïµÂ-ËùÂÞÞÀ´íËã·¨) typedef struct tagRS_BLOCKINFO { int ncRSBlock; // RS¿éÊý int ncAllCodeWord; // ¿éÄÚcodewordÊý int ncDataCodeWord; // data code´æ´¢Á¿(codewordÊý- RScodewordÊý) } RS_BLOCKINFO, *LPRS_BLOCKINFO; ///////////////////////////////////////////////////////////////////////////// // QRcode barÔ¼º²(ÐͺÅ)¹ØÁªÐÅÏ¢ typedef struct tagQR_VERSIONINFO { int nVersionNo; // °æ±¾(ÐͺÅ)ºÅÂë(1¡«40); int ncAllCodeWord; // °æ±¾¶ÔÓ¦µÄcodewordÊý; // ÒÔÏÂÅÅÁÐÌí¼Ó×ÖŪ´í¶©ÕýÂÊ(0= L,1= M,2= Q,3= H) int ncDataCodeWord[4]; // data code´æ´¢Á¿(×ÜcodewordÊý- RScodewordÊý) int ncAlignPoint; // alignmentͼÐÎ×ø±êÊý; int nAlignPoint[6]; // alignmentͼÐÎÖÐÐÄ×ø±ê; RS_BLOCKINFO RS_BlockInfo1[4]; // RS¿éÐÅÏ¢(1) RS_BLOCKINFO RS_BlockInfo2[4]; // RS¿éÐÅÏ¢(2) } QR_VERSIONINFO, *LPQR_VERSIONINFO; ///////////////////////////////////////////////////////////////////////////// // CQR_Encode Àà; class CQR_Encode { public: CQR_Encode(); ~CQR_Encode(); public: int m_nLevel; // ´íÎó¶©Õýˮƽ; int m_nVersion; // °æ±¾(ÐͺÅ); BOOL m_bAutoExtent; // °æ±¾(ÐͺÅ)×Ô¶¯À©ÕÅÖ¸¶¨±êÖ¾; int m_nMaskingNo; // ÑÚ±ÎͼÐκÅÂë; public: int m_nSymbleSize; BYTE m_byModuleData[MAX_MODULESIZE][MAX_MODULESIZE]; // [x][y] // bit5¡Ã¹¦ÄÜÄ£¿é£¨Ñڱβ»ÊÊÓ㩱êÖ¾ // bit4¡Ã¹¦ÄÜÄ£¿é»æ»­Êý¾Ý // bit1¡Ã±àÂëÊý¾Ý // bit0¡ÃÃæ¾ßºó±àÂë»æ»­Êý¾Ý ¸ù¾Ý //20h»ò¹¦ÄÜÄ£¿éÅжϣ¬¸ù¾Ý11h»ò»æ»­£¨×îÖÕBOOL¼ÛÖµ»¯£© private: int m_ncDataCodeWordBit; // // data codeWord볤 BYTE m_byDataCodeWord[MAX_DATACODEWORD]; //ÊäÈëÊý¾Ý±àÂëÇøÓò int m_ncDataBlock; BYTE m_byBlockMode[MAX_DATACODEWORD]; int m_nBlockLength[MAX_DATACODEWORD]; int m_ncAllCodeWord; //×ÜcodewordÊý(°üÀ¨RS´íÎó¶©ÕýÊý¾Ý) BYTE m_byAllCodeWord[MAX_ALLCODEWORD]; //×ÜcodewordËã³öÇøÓò BYTE m_byRSWork[MAX_CODEBLOCK]; // RScodewordËã³ö¹¤×÷ // Êý¾Ý±àÂë¹ØÁª»úÄÜ public: BOOL EncodeData(int nLevel, int nVersion, BOOL bAutoExtent, int nMaskingNo, LPCSTR lpsSource, int ncSource = 0); private: int GetEncodeVersion(int nVersion, LPCSTR lpsSource, int ncLength); BOOL EncodeSourceData(LPCSTR lpsSource, int ncLength, int nVerGroup); int GetBitLength(BYTE nMode, int ncData, int nVerGroup); int SetBitStream(int nIndex, WORD wData, int ncData); BOOL IsNumeralData(unsigned char c); BOOL IsAlphabetData(unsigned char c); BOOL IsKanjiData(unsigned char c1, unsigned char c2); BYTE AlphabetToBinaly(unsigned char c); WORD KanjiToBinaly(WORD wc); void GetRSCodeWord(LPBYTE lpbyRSWork, int ncDataCodeWord, int ncRSCodeWord); // ×é¼þÅäÖùØÁª»úÄÜ private: void FormatModule(); void SetFunctionModule(); void SetFinderPattern(int x, int y); void SetAlignmentPattern(int x, int y); void SetVersionPattern(); void SetCodeWordPattern(); void SetMaskingPattern(int nPatternNo); void SetFormatInfoPattern(int nPatternNo); int CountPenalty(); }; ///////////////////////////////////////////////////////////////////////////// #endif // !defined(AFX_QR_ENCODE_H__AC886DF7_C0AE_4C9F_AC7A_FCDA8CB1DD37__INCLUDED_)