// Copyright 2016 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_CODEC_CCODEC_JPEGMODULE_H_
#define CORE_FXCODEC_CODEC_CCODEC_JPEGMODULE_H_

#include "core/fxcrt/include/fx_system.h"

class CCodec_ScanlineDecoder;
class CFX_DIBSource;
struct FXJPEG_Context;

#ifdef PDF_ENABLE_XFA
class CFX_DIBAttribute;
#endif  // PDF_ENABLE_XFA

class CCodec_JpegModule {
 public:
  CCodec_JpegModule() {}

  CCodec_ScanlineDecoder* CreateDecoder(const uint8_t* src_buf,
                                        uint32_t src_size,
                                        int width,
                                        int height,
                                        int nComps,
                                        FX_BOOL ColorTransform);
  bool LoadInfo(const uint8_t* src_buf,
                uint32_t src_size,
                int* width,
                int* height,
                int* num_components,
                int* bits_per_components,
                bool* color_transform);
  FXJPEG_Context* Start();
  void Finish(FXJPEG_Context* pContext);
  void Input(FXJPEG_Context* pContext,
             const uint8_t* src_buf,
             uint32_t src_size);

#ifndef PDF_ENABLE_XFA
  int ReadHeader(FXJPEG_Context* pContext,
                 int* width,
                 int* height,
                 int* nComps);
#else   // PDF_ENABLE_XFA
  int ReadHeader(FXJPEG_Context* pContext,
                 int* width,
                 int* height,
                 int* nComps,
                 CFX_DIBAttribute* pAttribute);
#endif  // PDF_ENABLE_XFA

  int StartScanline(FXJPEG_Context* pContext, int down_scale);
  FX_BOOL ReadScanline(FXJPEG_Context* pContext, uint8_t* dest_buf);
  uint32_t GetAvailInput(FXJPEG_Context* pContext, uint8_t** avail_buf_ptr);
};

#endif  // CORE_FXCODEC_CODEC_CCODEC_JPEGMODULE_H_
