// Copyright 2015 The PDFium Authors
// 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 CORE_FXCODEC_JBIG2_JBIG2_TRDPROC_H_
#define CORE_FXCODEC_JBIG2_JBIG2_TRDPROC_H_

#include <stdint.h>

#include <memory>
#include <vector>

#include "core/fxcodec/jbig2/JBig2_Image.h"
#include "core/fxcrt/unowned_ptr.h"
#include "core/fxcrt/unowned_ptr_exclusion.h"

class CJBig2_ArithDecoder;
class CJBig2_ArithIaidDecoder;
class CJBig2_ArithIntDecoder;
class CJBig2_BitStream;
class CJBig2_HuffmanTable;
class JBig2ArithCtx;
struct JBig2HuffmanCode;

struct JBig2IntDecoderState {
  JBig2IntDecoderState();
  ~JBig2IntDecoderState();

  UnownedPtr<CJBig2_ArithIntDecoder> IADT;
  UnownedPtr<CJBig2_ArithIntDecoder> IAFS;
  UnownedPtr<CJBig2_ArithIntDecoder> IADS;
  UnownedPtr<CJBig2_ArithIntDecoder> IAIT;
  UnownedPtr<CJBig2_ArithIntDecoder> IARI;
  UnownedPtr<CJBig2_ArithIntDecoder> IARDW;
  UnownedPtr<CJBig2_ArithIntDecoder> IARDH;
  UnownedPtr<CJBig2_ArithIntDecoder> IARDX;
  UnownedPtr<CJBig2_ArithIntDecoder> IARDY;
  UnownedPtr<CJBig2_ArithIaidDecoder> IAID;
};

enum JBig2Corner {
  JBIG2_CORNER_BOTTOMLEFT = 0,
  JBIG2_CORNER_TOPLEFT = 1,
  JBIG2_CORNER_BOTTOMRIGHT = 2,
  JBIG2_CORNER_TOPRIGHT = 3
};

class CJBig2_TRDProc {
 public:
  CJBig2_TRDProc();
  ~CJBig2_TRDProc();

  std::unique_ptr<CJBig2_Image> DecodeHuffman(CJBig2_BitStream* pStream,
                                              JBig2ArithCtx* grContext);

  std::unique_ptr<CJBig2_Image> DecodeArith(CJBig2_ArithDecoder* pArithDecoder,
                                            JBig2ArithCtx* grContext,
                                            JBig2IntDecoderState* pIDS);

  bool SBHUFF;
  bool SBREFINE;
  bool SBRTEMPLATE;
  bool TRANSPOSED;
  bool SBDEFPIXEL;
  int8_t SBDSOFFSET;
  uint8_t SBSYMCODELEN;
  uint32_t SBW;
  uint32_t SBH;
  uint32_t SBNUMINSTANCES;
  uint32_t SBSTRIPS;
  uint32_t SBNUMSYMS;
  std::vector<JBig2HuffmanCode> SBSYMCODES;
  UNOWNED_PTR_EXCLUSION CJBig2_Image** SBSYMS;
  JBig2ComposeOp SBCOMBOP;
  JBig2Corner REFCORNER;
  UnownedPtr<const CJBig2_HuffmanTable> SBHUFFFS;
  UnownedPtr<const CJBig2_HuffmanTable> SBHUFFDS;
  UnownedPtr<const CJBig2_HuffmanTable> SBHUFFDT;
  UnownedPtr<const CJBig2_HuffmanTable> SBHUFFRDW;
  UnownedPtr<const CJBig2_HuffmanTable> SBHUFFRDH;
  UnownedPtr<const CJBig2_HuffmanTable> SBHUFFRDX;
  UnownedPtr<const CJBig2_HuffmanTable> SBHUFFRDY;
  UnownedPtr<const CJBig2_HuffmanTable> SBHUFFRSIZE;
  int8_t SBRAT[4];

 private:
  struct ComposeData {
    int32_t x;
    int32_t y;
    uint32_t increment = 0;
  };
  ComposeData GetComposeData(int32_t SI,
                             int32_t TI,
                             uint32_t WI,
                             uint32_t HI) const;
};

#endif  // CORE_FXCODEC_JBIG2_JBIG2_TRDPROC_H_
