Home | History | Annotate | Download | only in qrcode
      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;
     28 void CBC_QRDataMask::Initialize() {
     29   DATA_MASKS = new CFX_PtrArray();
     30   N_DATA_MASKS = BuildDataMasks();
     31 }
     32 void CBC_QRDataMask::Finalize() {
     33   Destroy();
     34   delete DATA_MASKS;
     35 }
     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 }
     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 }
     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:
     64   FX_BOOL IsMasked(int32_t x, int32_t y) { return ((x + y) % 2) == 0; }
     65 };
     66 class DataMask001 : public CBC_QRDataMask {
     67  public:
     68   FX_BOOL IsMasked(int32_t x, int32_t y) { return (x % 2) == 0; }
     69 };
     70 class DataMask010 : public CBC_QRDataMask {
     71  public:
     72   FX_BOOL IsMasked(int32_t x, int32_t y) { return y % 3 == 0; }
     73 };
     74 class DataMask011 : public CBC_QRDataMask {
     75  public:
     76   FX_BOOL IsMasked(int32_t x, int32_t y) { return (x + y) % 3 == 0; }
     77 };
     78 class DataMask100 : public CBC_QRDataMask {
     79  public:
     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:
     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:
     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:
    100   FX_BOOL IsMasked(int32_t x, int32_t y) {
    101     return ((((x + y) % 2) + ((x * y) % 3)) % 2) == 0;
    102   }
    103 };
    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 }
    115 CBC_QRDataMask::CBC_QRDataMask() {}
    116 CBC_QRDataMask::~CBC_QRDataMask() {}
    117