1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 // Original code is licensed as follows:
7 /*
8 * Copyright 2007 ZXing authors
9 *
10 * Licensed under the Apache License, Version 2.0 (the "License");
11 * you may not use this file except in compliance with the License.
12 * You may obtain a copy of the License at
13 *
14 * http://www.apache.org/licenses/LICENSE-2.0
15 *
16 * Unless required by applicable law or agreed to in writing, software
17 * distributed under the License is distributed on an "AS IS" BASIS,
18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19 * See the License for the specific language governing permissions and
20 * limitations under the License.
21 */
22
23 #include "xfa/src/fxbarcode/barcode.h"
24 #include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h"
25 #include "BC_QRDataMask.h"
26 static int32_t N_DATA_MASKS = 0;
27 CFX_PtrArray* CBC_QRDataMask::DATA_MASKS = NULL;
Initialize()28 void CBC_QRDataMask::Initialize() {
29 DATA_MASKS = new CFX_PtrArray();
30 N_DATA_MASKS = BuildDataMasks();
31 }
Finalize()32 void CBC_QRDataMask::Finalize() {
33 Destroy();
34 delete DATA_MASKS;
35 }
Destroy()36 void CBC_QRDataMask::Destroy() {
37 int32_t i;
38 for (i = 0; i < N_DATA_MASKS; i++) {
39 CBC_QRDataMask* p = (CBC_QRDataMask*)(*DATA_MASKS)[i];
40 if (p) {
41 delete p;
42 }
43 }
44 }
UnmaskBitMatirx(CBC_CommonBitMatrix * bits,int32_t dimension)45 void CBC_QRDataMask::UnmaskBitMatirx(CBC_CommonBitMatrix* bits,
46 int32_t dimension) {
47 for (int32_t i = 0; i < dimension; i++) {
48 for (int32_t j = 0; j < dimension; j++) {
49 if (IsMasked(i, j)) {
50 bits->Flip(j, i);
51 }
52 }
53 }
54 }
ForReference(int32_t reference,int32_t & e)55 CBC_QRDataMask* CBC_QRDataMask::ForReference(int32_t reference, int32_t& e) {
56 if (reference < 0 || reference > 7) {
57 e = BCExceptionReferenceMustBeBetween0And7;
58 BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
59 }
60 return (CBC_QRDataMask*)(*DATA_MASKS)[reference];
61 }
62 class DataMask000 : public CBC_QRDataMask {
63 public:
IsMasked(int32_t x,int32_t y)64 FX_BOOL IsMasked(int32_t x, int32_t y) { return ((x + y) % 2) == 0; }
65 };
66 class DataMask001 : public CBC_QRDataMask {
67 public:
IsMasked(int32_t x,int32_t y)68 FX_BOOL IsMasked(int32_t x, int32_t y) { return (x % 2) == 0; }
69 };
70 class DataMask010 : public CBC_QRDataMask {
71 public:
IsMasked(int32_t x,int32_t y)72 FX_BOOL IsMasked(int32_t x, int32_t y) { return y % 3 == 0; }
73 };
74 class DataMask011 : public CBC_QRDataMask {
75 public:
IsMasked(int32_t x,int32_t y)76 FX_BOOL IsMasked(int32_t x, int32_t y) { return (x + y) % 3 == 0; }
77 };
78 class DataMask100 : public CBC_QRDataMask {
79 public:
IsMasked(int32_t x,int32_t y)80 FX_BOOL IsMasked(int32_t x, int32_t y) {
81 return (((x >> 1) + (y / 3)) % 2) == 0;
82 }
83 };
84 class DataMask101 : public CBC_QRDataMask {
85 public:
IsMasked(int32_t x,int32_t y)86 FX_BOOL IsMasked(int32_t x, int32_t y) {
87 size_t temp = x * y;
88 return (temp % 2) + (temp % 3) == 0;
89 }
90 };
91 class DataMask110 : public CBC_QRDataMask {
92 public:
IsMasked(int32_t x,int32_t y)93 FX_BOOL IsMasked(int32_t x, int32_t y) {
94 size_t temp = x * y;
95 return (((temp % 2) + (temp % 3)) % 2) == 0;
96 }
97 };
98 class DataMask111 : public CBC_QRDataMask {
99 public:
IsMasked(int32_t x,int32_t y)100 FX_BOOL IsMasked(int32_t x, int32_t y) {
101 return ((((x + y) % 2) + ((x * y) % 3)) % 2) == 0;
102 }
103 };
BuildDataMasks()104 int32_t CBC_QRDataMask::BuildDataMasks() {
105 DATA_MASKS->Add(new DataMask000);
106 DATA_MASKS->Add(new DataMask001);
107 DATA_MASKS->Add(new DataMask010);
108 DATA_MASKS->Add(new DataMask011);
109 DATA_MASKS->Add(new DataMask100);
110 DATA_MASKS->Add(new DataMask101);
111 DATA_MASKS->Add(new DataMask110);
112 DATA_MASKS->Add(new DataMask111);
113 return DATA_MASKS->GetSize();
114 }
CBC_QRDataMask()115 CBC_QRDataMask::CBC_QRDataMask() {}
~CBC_QRDataMask()116 CBC_QRDataMask::~CBC_QRDataMask() {}
117