forked from kenjinote/QR-Code
-
Notifications
You must be signed in to change notification settings - Fork 0
/
QR_Encode.h
140 lines (105 loc) · 4.25 KB
/
QR_Encode.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
// QR_Encode.h : CQR_Encode クラス宣言およびインターフェイス定義
// Date 2005/01/11 Ver. 1.13 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 // 総コードワード数最大値
#define MAX_DATACODEWORD 2956 // データコードワード最大値(バージョン40-L)
#define MAX_CODEBLOCK 123 // ブロックデータコードワード数最大値
#define MAX_MODULESIZE 177 // 一辺モジュール数最大値
// ビットマップ描画時マージン
#define QR_MARGIN 0 // 4
/////////////////////////////////////////////////////////////////////////////
typedef struct tagRS_BLOCKINFO
{
int ncRSBlock; // RSブロック数
int ncAllCodeWord; // ブロック内コードワード数
int ncDataCodeWord; // データコードワード数(コードワード数 - RSコードワード数)
} RS_BLOCKINFO, *LPRS_BLOCKINFO;
/////////////////////////////////////////////////////////////////////////////
// QRコードバージョン(型番)関連情報
typedef struct tagQR_VERSIONINFO
{
int nVersionNo; // バージョン(型番)番号(1~40)
int ncAllCodeWord; // 総コードワード数
// 以下配列添字は誤り訂正率(0 = L, 1 = M, 2 = Q, 3 = H)
int ncDataCodeWord[4]; // データコードワード数(総コードワード数 - RSコードワード数)
int ncAlignPoint; // アライメントパターン座標数
int nAlignPoint[6]; // アライメントパターン中心座標
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; // データコードワードビット長
BYTE m_byDataCodeWord[MAX_DATACODEWORD]; // 入力データエンコードエリア
int m_ncAllCodeWord; // 総コードワード数(RS誤り訂正データを含む)
BYTE m_byAllCodeWord[MAX_ALLCODEWORD]; // 総コードワード算出エリア
BYTE m_byRSWork[MAX_CODEBLOCK + 1]; // RSコードワード算出ワーク
// データエンコード関連ファンクション
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 nVersionGroup);
int SetBitStream(int nIndex, WORD wData, int ncData);
int GetInitDataMode(LPCSTR lpsSource, int ncLength, int nVersionGroup);
int GetContinueCount(LPCSTR lpsSource, int ncLength, int nDataMode);
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_)