// 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_ICCMODULE_H_
#define CORE_FXCODEC_CODEC_CCODEC_ICCMODULE_H_

#include "core/fxcodec/include/fx_codec_def.h"
#include "core/fxcrt/include/fx_string.h"
#include "core/fxcrt/include/fx_system.h"

class CFX_BinaryBuf;
class CFX_IccProfileCache;
class CFX_IccTransformCache;
class CFX_PrivateData;
class IFX_FileRead;

class CCodec_IccModule {
 public:
  enum IccCS {
    IccCS_Unknown = 0,
    IccCS_XYZ,
    IccCS_Lab,
    IccCS_Luv,
    IccCS_YCbCr,
    IccCS_Yxy,
    IccCS_Hsv,
    IccCS_Hls,
    IccCS_Gray,
    IccCS_Rgb,
    IccCS_Cmyk,
    IccCS_Cmy
  };

  struct IccParam {
    uint32_t Version;
    IccCS ColorSpace;
    uint32_t dwProfileType;
    uint32_t dwFormat;
    uint8_t* pProfileData;
    uint32_t dwProfileSize;
    double Gamma;
  };

  ~CCodec_IccModule();

  IccCS GetProfileCS(const uint8_t* pProfileData, unsigned int dwProfileSize);
  IccCS GetProfileCS(IFX_FileRead* pFile);
  void* CreateTransform(CCodec_IccModule::IccParam* pInputParam,
                        CCodec_IccModule::IccParam* pOutputParam,
                        CCodec_IccModule::IccParam* pProofParam = nullptr,
                        uint32_t dwIntent = Icc_INTENT_PERCEPTUAL,
                        uint32_t dwFlag = Icc_FLAGS_DEFAULT,
                        uint32_t dwPrfIntent = Icc_INTENT_ABSOLUTE_COLORIMETRIC,
                        uint32_t dwPrfFlag = Icc_FLAGS_SOFTPROOFING);
  void* CreateTransform_sRGB(const uint8_t* pProfileData,
                             uint32_t dwProfileSize,
                             uint32_t& nComponents,
                             int32_t intent = 0,
                             uint32_t dwSrcFormat = Icc_FORMAT_DEFAULT);
  void* CreateTransform_CMYK(const uint8_t* pSrcProfileData,
                             uint32_t dwSrcProfileSize,
                             uint32_t& nSrcComponents,
                             const uint8_t* pDstProfileData,
                             uint32_t dwDstProfileSize,
                             int32_t intent = 0,
                             uint32_t dwSrcFormat = Icc_FORMAT_DEFAULT,
                             uint32_t dwDstFormat = Icc_FORMAT_DEFAULT);
  void DestroyTransform(void* pTransform);
  void Translate(void* pTransform, FX_FLOAT* pSrcValues, FX_FLOAT* pDestValues);
  void TranslateScanline(void* pTransform,
                         uint8_t* pDest,
                         const uint8_t* pSrc,
                         int pixels);
  void SetComponents(uint32_t nComponents) { m_nComponents = nComponents; }

 protected:
  enum Icc_CLASS {
    Icc_CLASS_INPUT = 0,
    Icc_CLASS_OUTPUT,
    Icc_CLASS_PROOF,
    Icc_CLASS_MAX
  };
  void* CreateProfile(CCodec_IccModule::IccParam* pIccParam,
                      Icc_CLASS ic,
                      CFX_BinaryBuf* pTransformKey);

  uint32_t m_nComponents;
  std::map<CFX_ByteString, CFX_IccTransformCache*> m_MapTranform;
  std::map<CFX_ByteString, CFX_IccProfileCache*> m_MapProfile;
};

#endif  // CORE_FXCODEC_CODEC_CCODEC_ICCMODULE_H_
