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

#include "core/fxcodec/fx_codec.h"

#include <algorithm>
#include <cmath>
#include <memory>
#include <utility>

#include "core/fxcodec/codec/codec_int.h"
#include "core/fxcodec/codec/jbig2module.h"
#include "core/fxcodec/codec/jpegmodule.h"
#include "core/fxcrt/fx_extension.h"
#include "core/fxcrt/fx_safe_types.h"
#include "third_party/base/logging.h"
#include "third_party/base/ptr_util.h"

namespace fxcodec {

namespace {

ModuleMgr* g_ModuleMgr = nullptr;

}  // namespace

// static
void ModuleMgr::Create() {
  ASSERT(!g_ModuleMgr);
  g_ModuleMgr = new ModuleMgr();
}

// static
void ModuleMgr::Destroy() {
  ASSERT(g_ModuleMgr);
  delete g_ModuleMgr;
  g_ModuleMgr = nullptr;
}

// static
ModuleMgr* ModuleMgr::GetInstance() {
  ASSERT(g_ModuleMgr);
  return g_ModuleMgr;
}

ModuleMgr::ModuleMgr()
    : m_pJpegModule(pdfium::MakeUnique<JpegModule>()),
      m_pJbig2Module(pdfium::MakeUnique<Jbig2Module>()) {
#ifdef PDF_ENABLE_XFA_BMP
  SetBmpModule(pdfium::MakeUnique<BmpModule>());
#endif

#ifdef PDF_ENABLE_XFA_GIF
  SetGifModule(pdfium::MakeUnique<GifModule>());
#endif

#ifdef PDF_ENABLE_XFA_PNG
  SetPngModule(pdfium::MakeUnique<PngModule>());
#endif

#ifdef PDF_ENABLE_XFA_TIFF
  SetTiffModule(pdfium::MakeUnique<TiffModule>());
#endif
}

ModuleMgr::~ModuleMgr() = default;

#ifdef PDF_ENABLE_XFA
CFX_DIBAttribute::CFX_DIBAttribute() = default;

CFX_DIBAttribute::~CFX_DIBAttribute() {
  for (const auto& pair : m_Exif)
    FX_Free(pair.second);
}
#endif  // PDF_ENABLE_XFA

void ReverseRGB(uint8_t* pDestBuf, const uint8_t* pSrcBuf, int pixels) {
  if (pDestBuf == pSrcBuf) {
    for (int i = 0; i < pixels; i++) {
      uint8_t temp = pDestBuf[2];
      pDestBuf[2] = pDestBuf[0];
      pDestBuf[0] = temp;
      pDestBuf += 3;
    }
  } else {
    for (int i = 0; i < pixels; i++) {
      *pDestBuf++ = pSrcBuf[2];
      *pDestBuf++ = pSrcBuf[1];
      *pDestBuf++ = pSrcBuf[0];
      pSrcBuf += 3;
    }
  }
}

FX_SAFE_UINT32 CalculatePitch8(uint32_t bpc, uint32_t components, int width) {
  FX_SAFE_UINT32 pitch = bpc;
  pitch *= components;
  pitch *= width;
  pitch += 7;
  pitch /= 8;
  return pitch;
}

FX_SAFE_UINT32 CalculatePitch32(int bpp, int width) {
  FX_SAFE_UINT32 pitch = bpp;
  pitch *= width;
  pitch += 31;
  pitch /= 32;  // quantized to number of 32-bit words.
  pitch *= 4;   // and then back to bytes, (not just /8 in one step).
  return pitch;
}

}  // namespace fxcodec
