116 lines
2.6 KiB
C++
116 lines
2.6 KiB
C++
// 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
|