1 module qrcode.common.mode;
2 import qrcode.common.qrcodeversion;
3 
4 ///Enum representing various modes in which data can be encoded to bits.
5 class Mode
6 {
7     /**#@+
8 	* Mode enumants.
9 	*/
10     enum int TERMINATOR = 0x0;
11     enum int NUMERIC = 0x1;
12     enum int ALPHANUMERIC = 0x2;
13     enum int STRUCTURED_APPEND = 0x3;
14     enum int BYTE = 0x4;
15     enum int ECI = 0x7;
16     enum int KANJI = 0x8;
17     enum int FNC1_FIRST_POSITION = 0x5;
18     enum int FNC1_SECOND_POSITION = 0x9;
19     enum int HANZI = 0xd;
20     /**#@-*/
21 
22     private
23     {
24         int _mode;
25     }
26 
27     this(int m)
28     {
29 
30         this._mode = m;
31     }
32 
33     public @property int mode()
34     {
35         return this._mode;
36     }
37 
38     public @property void mode(int _m)
39     {
40         this._mode = _m;
41     }
42     /**
43 	* Character count bits for each version.
44 	*
45 	* @var array
46 	*/
47     protected static int[][] characterCountBitsForVersions = [
48 TERMINATOR : [0, 0, 0
49     ], NUMERIC : [10, 12, 14], ALPHANUMERIC : [
50         9, 11, 13
51     ], STRUCTURED_APPEND : [0, 0, 0], BYTE : [
52         8, 16, 16
53     ], ECI : [0, 0, 0], KANJI : [
54         8, 10, 12
55     ], FNC1_FIRST_POSITION : [0, 0, 0], FNC1_SECOND_POSITION : [0, 0, 0], HANZI : [8, 10, 12],];
56 
57     /**
58 	* Gets the number of bits used in a specific QR code version.
59 	*
60 	* @param  Version $version
61 	* @return integer
62 	*/
63     public int getCharacterCountBits(QrCodeVersion _version)
64     {
65         int number = _version.VersionNumber;
66         int offset = 0;
67         if (number <= 9)
68         {
69             offset = 0;
70         }
71         else if (number <= 26)
72         {
73             offset = 1;
74         }
75         else
76         {
77             offset = 2;
78         }
79         return characterCountBitsForVersions[this._mode][offset];
80     }
81 }