// Copyright 2018 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 CORE_FXCODEC_BMP_CFX_BMPDECOMPRESSOR_H_
#define CORE_FXCODEC_BMP_CFX_BMPDECOMPRESSOR_H_

#include <setjmp.h>

#include <vector>

#include "core/fxcodec/bmp/fx_bmp.h"
#include "core/fxcodec/codec/cfx_codec_memory.h"
#include "third_party/base/span.h"

class CFX_BmpContext;

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

  void Error();
  int32_t DecodeImage();
  int32_t ReadHeader();
  void SetInputBuffer(RetainPtr<CFX_CodecMemory> codec_memory);
  FX_FILESIZE GetAvailInput() const;

  jmp_buf jmpbuf_;
  CFX_BmpContext* context_ptr_;
  std::vector<uint8_t> out_row_buffer_;
  std::vector<uint32_t> palette_;
  uint32_t header_offset_;
  uint32_t width_;
  uint32_t height_;
  uint32_t compress_flag_;
  int32_t components_;
  size_t src_row_bytes_;
  size_t out_row_bytes_;
  uint16_t bit_counts_;
  uint32_t color_used_;
  bool imgTB_flag_;
  int32_t pal_num_;
  int32_t pal_type_;
  uint32_t data_size_;
  uint32_t img_data_offset_;
  uint32_t img_ifh_size_;
  size_t row_num_;
  size_t col_num_;
  int32_t dpi_x_;
  int32_t dpi_y_;
  uint32_t mask_red_;
  uint32_t mask_green_;
  uint32_t mask_blue_;
  int32_t decode_status_;

 private:
  bool GetDataPosition(uint32_t cur_pos);
  void ReadScanline(uint32_t row_num, const std::vector<uint8_t>& row_buf);
  int32_t DecodeRGB();
  int32_t DecodeRLE8();
  int32_t DecodeRLE4();
  bool ReadData(uint8_t* destination, uint32_t size);
  void SaveDecodingStatus(int32_t status);
  bool ValidateColorIndex(uint8_t val);
  bool ValidateFlag() const;
  void SetHeight(int32_t signed_height);

  RetainPtr<CFX_CodecMemory> input_buffer_;
};

#endif  // CORE_FXCODEC_BMP_CFX_BMPDECOMPRESSOR_H_
