• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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