QR_Encode.h 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. // QR_Encode.h : CQR_Encode クラス宣言およびインターフェイス定義
  2. // Date 2006/05/17 Ver. 1.22 Psytec Inc.
  3. #ifndef _QR_ENCODE_H
  4. #define _QR_ENCODE_H
  5. #include <string.h>
  6. #include <stdlib.h>
  7. /////////////////////////////////////////////////////////////////////////////
  8. // 定数
  9. // 誤り訂正レベル
  10. #define QR_LEVEL_L 0
  11. #define QR_LEVEL_M 1
  12. #define QR_LEVEL_Q 2
  13. #define QR_LEVEL_H 3
  14. // データモード
  15. #define QR_MODE_NUMERAL 0
  16. #define QR_MODE_ALPHABET 1
  17. #define QR_MODE_8BIT 2
  18. #define QR_MODE_KANJI 3
  19. // バージョン(型番)グループ
  20. #define QR_VRESION_S 0 // 1 ~ 9
  21. #define QR_VRESION_M 1 // 10 ~ 26
  22. #define QR_VRESION_L 2 // 27 ~ 40
  23. #define MAX_ALLCODEWORD 3706 // 総コードワード数最大値
  24. #define MAX_DATACODEWORD 2956 // データコードワード最大値(バージョン40-L)
  25. #define MAX_CODEBLOCK 153 // ブロックデータコードワード数最大値(RSコードワードを含む)
  26. #define MAX_MODULESIZE 177 // 一辺モジュール数最大値
  27. // ビットマップ描画時マージン
  28. #define QR_MARGIN 4
  29. /////////////////////////////////////////////////////////////////////////////
  30. typedef struct tagRS_BLOCKINFO
  31. {
  32. int ncRSBlock; // RSブロック数
  33. int ncAllCodeWord; // ブロック内コードワード数
  34. int ncDataCodeWord; // データコードワード数(コードワード数 - RSコードワード数)
  35. } RS_BLOCKINFO, *LPRS_BLOCKINFO;
  36. /////////////////////////////////////////////////////////////////////////////
  37. // QRコードバージョン(型番)関連情報
  38. typedef struct tagQR_VERSIONINFO
  39. {
  40. int nVersionNo; // バージョン(型番)番号(1~40)
  41. int ncAllCodeWord; // 総コードワード数
  42. // 以下配列添字は誤り訂正率(0 = L, 1 = M, 2 = Q, 3 = H)
  43. int ncDataCodeWord[4]; // データコードワード数(総コードワード数 - RSコードワード数)
  44. int ncAlignPoint; // アライメントパターン座標数
  45. int nAlignPoint[6]; // アライメントパターン中心座標
  46. RS_BLOCKINFO RS_BlockInfo1[4]; // RSブロック情報(1)
  47. RS_BLOCKINFO RS_BlockInfo2[4]; // RSブロック情報(2)
  48. } QR_VERSIONINFO, *LPQR_VERSIONINFO;
  49. typedef unsigned short WORD;
  50. typedef unsigned char BYTE;
  51. typedef BYTE* LPBYTE;
  52. typedef const char* LPCSTR;
  53. #define ZeroMemory(Destination,Length) memset((Destination),0,(Length))
  54. class CQR_Encode
  55. {
  56. // 構築/消滅
  57. public:
  58. CQR_Encode();
  59. ~CQR_Encode();
  60. public:
  61. int m_nLevel; // 誤り訂正レベル
  62. int m_nVersion; // バージョン(型番)
  63. bool m_bAutoExtent; // バージョン(型番)自動拡張指定フラグ
  64. int m_nMaskingNo; // マスキングパターン番号
  65. public:
  66. int m_nSymbleSize;
  67. BYTE m_byModuleData[MAX_MODULESIZE][MAX_MODULESIZE]; // [x][y]
  68. // bit5:機能モジュール(マスキング対象外)フラグ
  69. // bit4:機能モジュール描画データ
  70. // bit1:エンコードデータ
  71. // bit0:マスク後エンコード描画データ
  72. // 20hとの論理和により機能モジュール判定、11hとの論理和により描画(最終的にはbool値化)
  73. private:
  74. int m_ncDataCodeWordBit; // データコードワードビット長
  75. BYTE m_byDataCodeWord[MAX_DATACODEWORD]; // 入力データエンコードエリア
  76. int m_ncDataBlock;
  77. BYTE m_byBlockMode[MAX_DATACODEWORD];
  78. int m_nBlockLength[MAX_DATACODEWORD];
  79. int m_ncAllCodeWord; // 総コードワード数(RS誤り訂正データを含む)
  80. BYTE m_byAllCodeWord[MAX_ALLCODEWORD]; // 総コードワード算出エリア
  81. BYTE m_byRSWork[MAX_CODEBLOCK]; // RSコードワード算出ワーク
  82. // データエンコード関連ファンクション
  83. public:
  84. bool EncodeData(int nLevel, int nVersion, bool bAutoExtent, int nMaskingNo, LPCSTR lpsSource, int ncSource = 0);
  85. private:
  86. int GetEncodeVersion(int nVersion, LPCSTR lpsSource, int ncLength);
  87. bool EncodeSourceData(LPCSTR lpsSource, int ncLength, int nVerGroup);
  88. int GetBitLength(BYTE nMode, int ncData, int nVerGroup);
  89. int SetBitStream(int nIndex, WORD wData, int ncData);
  90. bool IsNumeralData(unsigned char c);
  91. bool IsAlphabetData(unsigned char c);
  92. bool IsKanjiData(unsigned char c1, unsigned char c2);
  93. BYTE AlphabetToBinaly(unsigned char c);
  94. WORD KanjiToBinaly(WORD wc);
  95. void GetRSCodeWord(LPBYTE lpbyRSWork, int ncDataCodeWord, int ncRSCodeWord);
  96. // モジュール配置関連ファンクション
  97. private:
  98. void FormatModule();
  99. void SetFunctionModule();
  100. void SetFinderPattern(int x, int y);
  101. void SetAlignmentPattern(int x, int y);
  102. void SetVersionPattern();
  103. void SetCodeWordPattern();
  104. void SetMaskingPattern(int nPatternNo);
  105. void SetFormatInfoPattern(int nPatternNo);
  106. int CountPenalty();
  107. };
  108. /////////////////////////////////////////////////////////////////////////////
  109. #endif