Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
[pdfium.git] / xfa / src / fxbarcode / src / BC_QRDataMask.cpp
1 // Copyright 2014 PDFium Authors. All rights reserved.\r
2 // Use of this source code is governed by a BSD-style license that can be\r
3 // found in the LICENSE file.\r
4 \r
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\r
6 \r
7 #include "barcode.h"\r
8 #include "include/BC_CommonBitMatrix.h"\r
9 #include "include/BC_QRDataMask.h"\r
10 static FX_INT32 N_DATA_MASKS = 0;\r
11 CFX_PtrArray* CBC_QRDataMask::DATA_MASKS = NULL;\r
12 void CBC_QRDataMask::Initialize()\r
13 {\r
14     DATA_MASKS = FX_NEW CFX_PtrArray();\r
15     N_DATA_MASKS = BuildDataMasks();\r
16 }\r
17 void CBC_QRDataMask::Finalize()\r
18 {\r
19     Destroy();\r
20     delete DATA_MASKS;\r
21 }\r
22 void CBC_QRDataMask::Destroy()\r
23 {\r
24     FX_INT32 i;\r
25     for(i = 0; i < N_DATA_MASKS; i++) {\r
26         CBC_QRDataMask* p = (CBC_QRDataMask*)(*DATA_MASKS)[i];\r
27         if (p) {\r
28             delete p;\r
29         }\r
30     }\r
31 }\r
32 void CBC_QRDataMask::UnmaskBitMatirx(CBC_CommonBitMatrix *bits, FX_INT32 dimension)\r
33 {\r
34     for(FX_INT32 i = 0; i < dimension; i++) {\r
35         for(FX_INT32 j = 0; j < dimension; j++) {\r
36             if(IsMasked(i, j)) {\r
37                 bits->Flip(j, i);\r
38             }\r
39         }\r
40     }\r
41 }\r
42 CBC_QRDataMask* CBC_QRDataMask::ForReference(FX_INT32 reference, FX_INT32 &e)\r
43 {\r
44     if(reference < 0 || reference > 7) {\r
45         e = BCExceptionReferenceMustBeBetween0And7;\r
46         BC_EXCEPTION_CHECK_ReturnValue(e, NULL);\r
47     }\r
48     return (CBC_QRDataMask*)(*DATA_MASKS)[reference];\r
49 }\r
50 class DataMask000 : public CBC_QRDataMask\r
51 {\r
52 public:\r
53     FX_BOOL IsMasked(FX_INT32 x, FX_INT32 y)\r
54     {\r
55         return ((x + y) % 2) == 0;\r
56     }\r
57 };\r
58 class DataMask001 : public CBC_QRDataMask\r
59 {\r
60 public:\r
61     FX_BOOL IsMasked(FX_INT32 x, FX_INT32 y)\r
62     {\r
63         return (x % 2) == 0;\r
64     }\r
65 };\r
66 class DataMask010 : public CBC_QRDataMask\r
67 {\r
68 public:\r
69     FX_BOOL IsMasked(FX_INT32 x, FX_INT32 y)\r
70     {\r
71         return y % 3 == 0;\r
72     }\r
73 };\r
74 class DataMask011 : public CBC_QRDataMask\r
75 {\r
76 public:\r
77     FX_BOOL IsMasked(FX_INT32 x, FX_INT32 y)\r
78     {\r
79         return (x + y) % 3 == 0;\r
80     }\r
81 };\r
82 class DataMask100 : public CBC_QRDataMask\r
83 {\r
84 public:\r
85     FX_BOOL IsMasked(FX_INT32 x, FX_INT32 y)\r
86     {\r
87         return (((x >> 1) + (y / 3)) % 2) == 0;\r
88     }\r
89 };\r
90 class DataMask101 : public CBC_QRDataMask\r
91 {\r
92 public:\r
93     FX_BOOL IsMasked(FX_INT32 x, FX_INT32 y)\r
94     {\r
95         size_t temp = x * y;\r
96         return (temp % 2) + (temp % 3) == 0;\r
97     }\r
98 };\r
99 class DataMask110 : public CBC_QRDataMask\r
100 {\r
101 public:\r
102     FX_BOOL IsMasked(FX_INT32 x, FX_INT32 y)\r
103     {\r
104         size_t temp = x * y;\r
105         return (((temp % 2) + (temp % 3)) % 2) == 0;\r
106     }\r
107 };\r
108 class DataMask111 : public CBC_QRDataMask\r
109 {\r
110 public:\r
111     FX_BOOL IsMasked(FX_INT32 x, FX_INT32 y)\r
112     {\r
113         return ((((x + y) % 2) + ((x * y) % 3)) % 2) == 0;\r
114     }\r
115 };\r
116 FX_INT32 CBC_QRDataMask::BuildDataMasks()\r
117 {\r
118     DATA_MASKS->Add(FX_NEW DataMask000);\r
119     DATA_MASKS->Add(FX_NEW DataMask001);\r
120     DATA_MASKS->Add(FX_NEW DataMask010);\r
121     DATA_MASKS->Add(FX_NEW DataMask011);\r
122     DATA_MASKS->Add(FX_NEW DataMask100);\r
123     DATA_MASKS->Add(FX_NEW DataMask101);\r
124     DATA_MASKS->Add(FX_NEW DataMask110);\r
125     DATA_MASKS->Add(FX_NEW DataMask111);\r
126     return DATA_MASKS->GetSize();\r
127 }\r
128 CBC_QRDataMask::CBC_QRDataMask()\r
129 {\r
130 }\r
131 CBC_QRDataMask::~CBC_QRDataMask()\r
132 {\r
133 }\r