blob: 5625534ad9a0896f24f101d4c108cb8d23e9f9e4 [file] [log] [blame]
// 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/jbig2/jbig2module.h"
#include "core/fxcodec/jpeg/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