// 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

#ifndef XFA_FXBARCODE_DATAMATRIX_BC_DATAMATRIXDECODEDBITSTREAMPARSER_H_
#define XFA_FXBARCODE_DATAMATRIX_BC_DATAMATRIXDECODEDBITSTREAMPARSER_H_
class CBC_CommonDecoderResult;
class CBC_CommonBitSource;
class CBC_DataMatrixDecodedBitStreamParser {
 public:
  CBC_DataMatrixDecodedBitStreamParser();
  virtual ~CBC_DataMatrixDecodedBitStreamParser();
  static CBC_CommonDecoderResult* Decode(CFX_ByteArray& bytes, int32_t& e);

 private:
  static int32_t DecodeAsciiSegment(CBC_CommonBitSource* bits,
                                    CFX_ByteString& result,
                                    CFX_ByteString& resultTrailer,
                                    int32_t& e);
  static void DecodeC40Segment(CBC_CommonBitSource* bits,
                               CFX_ByteString& result,
                               int32_t& e);
  static void DecodeTextSegment(CBC_CommonBitSource* bits,
                                CFX_ByteString& result,
                                int32_t& e);
  static void DecodeAnsiX12Segment(CBC_CommonBitSource* bits,
                                   CFX_ByteString& result,
                                   int32_t& e);
  static void ParseTwoBytes(int32_t firstByte,
                            int32_t secondByte,
                            CFX_Int32Array& result);
  static void DecodeEdifactSegment(CBC_CommonBitSource* bits,
                                   CFX_ByteString& result,
                                   int32_t& e);
  static void DecodeBase256Segment(CBC_CommonBitSource* bits,
                                   CFX_ByteString& result,
                                   CFX_Int32Array& byteSegments,
                                   int32_t& e);
  static uint8_t Unrandomize255State(int32_t randomizedBase256Codeword,
                                     int32_t base256CodewordPosition);

  static const FX_CHAR C40_BASIC_SET_CHARS[];
  static const FX_CHAR C40_SHIFT2_SET_CHARS[];

  static const FX_CHAR TEXT_BASIC_SET_CHARS[];
  static const FX_CHAR TEXT_SHIFT3_SET_CHARS[];
  static const int32_t PAD_ENCODE;
  static const int32_t ASCII_ENCODE;
  static const int32_t C40_ENCODE;
  static const int32_t TEXT_ENCODE;
  static const int32_t ANSIX12_ENCODE;
  static const int32_t EDIFACT_ENCODE;
  static const int32_t BASE256_ENCODE;
};

#endif  // XFA_FXBARCODE_DATAMATRIX_BC_DATAMATRIXDECODEDBITSTREAMPARSER_H_
