// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
// Original code is licensed as follows:
/*
 * Copyright 2007 ZXing authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
#include "xfa/fxbarcode/qrcode/BC_QRDataMask.h"
#include "xfa/fxbarcode/utils.h"

namespace {

int32_t N_DATA_MASKS = 0;
CFX_ArrayTemplate<CBC_QRDataMask*>* DATA_MASKS = nullptr;

}  // namespace

void CBC_QRDataMask::Initialize() {
  DATA_MASKS = new CFX_ArrayTemplate<CBC_QRDataMask*>();
  N_DATA_MASKS = BuildDataMasks();
}

void CBC_QRDataMask::Finalize() {
  Destroy();
  delete DATA_MASKS;
  DATA_MASKS = nullptr;
}

void CBC_QRDataMask::Destroy() {
  for (int32_t i = 0; i < N_DATA_MASKS; ++i)
    delete (*DATA_MASKS)[i];
}

void CBC_QRDataMask::UnmaskBitMatrix(CBC_CommonBitMatrix* bits,
                                     int32_t dimension) {
  for (int32_t i = 0; i < dimension; i++) {
    for (int32_t j = 0; j < dimension; j++) {
      if (IsMasked(i, j))
        bits->Flip(j, i);
    }
  }
}

CBC_QRDataMask* CBC_QRDataMask::ForReference(int32_t reference, int32_t& e) {
  if (reference < 0 || reference > 7) {
    e = BCExceptionReferenceMustBeBetween0And7;
    BC_EXCEPTION_CHECK_ReturnValue(e, nullptr);
  }
  return (*DATA_MASKS)[reference];
}

class DataMask000 : public CBC_QRDataMask {
 public:
  FX_BOOL IsMasked(int32_t x, int32_t y) { return ((x + y) % 2) == 0; }
};
class DataMask001 : public CBC_QRDataMask {
 public:
  FX_BOOL IsMasked(int32_t x, int32_t y) { return (x % 2) == 0; }
};
class DataMask010 : public CBC_QRDataMask {
 public:
  FX_BOOL IsMasked(int32_t x, int32_t y) { return y % 3 == 0; }
};
class DataMask011 : public CBC_QRDataMask {
 public:
  FX_BOOL IsMasked(int32_t x, int32_t y) { return (x + y) % 3 == 0; }
};
class DataMask100 : public CBC_QRDataMask {
 public:
  FX_BOOL IsMasked(int32_t x, int32_t y) {
    return (((x >> 1) + (y / 3)) % 2) == 0;
  }
};
class DataMask101 : public CBC_QRDataMask {
 public:
  FX_BOOL IsMasked(int32_t x, int32_t y) {
    size_t temp = x * y;
    return (temp % 2) + (temp % 3) == 0;
  }
};
class DataMask110 : public CBC_QRDataMask {
 public:
  FX_BOOL IsMasked(int32_t x, int32_t y) {
    size_t temp = x * y;
    return (((temp % 2) + (temp % 3)) % 2) == 0;
  }
};
class DataMask111 : public CBC_QRDataMask {
 public:
  FX_BOOL IsMasked(int32_t x, int32_t y) {
    return ((((x + y) % 2) + ((x * y) % 3)) % 2) == 0;
  }
};
int32_t CBC_QRDataMask::BuildDataMasks() {
  DATA_MASKS->Add(new DataMask000);
  DATA_MASKS->Add(new DataMask001);
  DATA_MASKS->Add(new DataMask010);
  DATA_MASKS->Add(new DataMask011);
  DATA_MASKS->Add(new DataMask100);
  DATA_MASKS->Add(new DataMask101);
  DATA_MASKS->Add(new DataMask110);
  DATA_MASKS->Add(new DataMask111);
  return DATA_MASKS->GetSize();
}
CBC_QRDataMask::CBC_QRDataMask() {}
CBC_QRDataMask::~CBC_QRDataMask() {}
