// 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_CommonBitSource.h"

CBC_CommonBitSource::CBC_CommonBitSource(CFX_ByteArray* bytes) {
  m_bytes.Copy((*bytes));
  m_bitOffset = 0;
  m_byteOffset = 0;
}
CBC_CommonBitSource::~CBC_CommonBitSource() {}
int32_t CBC_CommonBitSource::ReadBits(int32_t numBits, int32_t& e) {
  if (numBits < 1 || numBits > 32) {
    e = BCExceptionIllegalArgument;
    return 0;
  }
  int32_t result = 0;
  if (m_bitOffset > 0) {
    int32_t bitsLeft = 8 - m_bitOffset;
    int32_t toRead = numBits < bitsLeft ? numBits : bitsLeft;
    int32_t bitsToNotRead = bitsLeft - toRead;
    int32_t mask = (0xff >> (8 - toRead)) << bitsToNotRead;
    result = (m_bytes[m_byteOffset] & mask) >> bitsToNotRead;
    numBits -= toRead;
    m_bitOffset += toRead;
    if (m_bitOffset == 8) {
      m_bitOffset = 0;
      m_byteOffset++;
    }
  }
  if (numBits > 0) {
    while (numBits >= 8) {
      result = (result << 8) | (m_bytes[m_byteOffset] & 0xff);
      m_byteOffset++;
      numBits -= 8;
    }
    if (numBits > 0) {
      int32_t bitsToNotRead = 8 - numBits;
      int32_t mask = (0xff >> bitsToNotRead) << bitsToNotRead;
      result = (result << numBits) |
               ((m_bytes[m_byteOffset] & mask) >> bitsToNotRead);
      m_bitOffset += numBits;
    }
  }
  return result;
}
int32_t CBC_CommonBitSource::Available() {
  return 8 * (m_bytes.GetSize() - m_byteOffset) - m_bitOffset;
}
int32_t CBC_CommonBitSource::getByteOffset() {
  return m_byteOffset;
}
