summaryrefslogtreecommitdiff
path: root/core/fxcodec
diff options
context:
space:
mode:
Diffstat (limited to 'core/fxcodec')
-rw-r--r--core/fxcodec/codec/ccodec_iccmodule.h34
-rw-r--r--core/fxcodec/codec/fx_codec_icc.cpp200
2 files changed, 84 insertions, 150 deletions
diff --git a/core/fxcodec/codec/ccodec_iccmodule.h b/core/fxcodec/codec/ccodec_iccmodule.h
index 08878acc98..e775475249 100644
--- a/core/fxcodec/codec/ccodec_iccmodule.h
+++ b/core/fxcodec/codec/ccodec_iccmodule.h
@@ -7,23 +7,41 @@
#ifndef CORE_FXCODEC_CODEC_CCODEC_ICCMODULE_H_
#define CORE_FXCODEC_CODEC_CCODEC_ICCMODULE_H_
+#include <memory>
+
#include "core/fxcodec/fx_codec_def.h"
#include "core/fxcrt/fx_string.h"
#include "core/fxcrt/fx_system.h"
+#include "third_party/base/ptr_util.h"
+
+#if defined(USE_SYSTEM_LCMS2)
+#include <lcms2.h>
+#else
+#include "third_party/lcms2-2.6/include/lcms2.h"
+#endif
+
+class CLcmsCmm {
+ public:
+ CLcmsCmm(int srcComponents, cmsHTRANSFORM transform, bool isLab);
+ ~CLcmsCmm();
+
+ cmsHTRANSFORM m_hTransform;
+ int m_nSrcComponents;
+ bool m_bLab;
+};
class CCodec_IccModule {
public:
CCodec_IccModule();
~CCodec_IccModule();
- void* CreateTransform_sRGB(const uint8_t* pProfileData,
- uint32_t dwProfileSize,
- uint32_t& nComponents,
- int32_t intent = 0,
- uint32_t dwSrcFormat = Icc_FORMAT_DEFAULT);
- void DestroyTransform(void* pTransform);
- void Translate(void* pTransform, const float* pSrcValues, float* pDestValues);
- void TranslateScanline(void* pTransform,
+ std::unique_ptr<CLcmsCmm> CreateTransform_sRGB(const uint8_t* pProfileData,
+ uint32_t dwProfileSize,
+ uint32_t* nComponents);
+ void Translate(CLcmsCmm* pTransform,
+ const float* pSrcValues,
+ float* pDestValues);
+ void TranslateScanline(CLcmsCmm* pTransform,
uint8_t* pDest,
const uint8_t* pSrc,
int pixels);
diff --git a/core/fxcodec/codec/fx_codec_icc.cpp b/core/fxcodec/codec/fx_codec_icc.cpp
index ee562f0e92..3c08843544 100644
--- a/core/fxcodec/codec/fx_codec_icc.cpp
+++ b/core/fxcodec/codec/fx_codec_icc.cpp
@@ -4,6 +4,8 @@
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+#include <memory>
+
#include "core/fxcodec/codec/codec_int.h"
#include "core/fxcodec/fx_codec.h"
@@ -13,70 +15,51 @@
#include "third_party/lcms2-2.6/include/lcms2.h"
#endif
-struct CLcmsCmm {
- cmsHTRANSFORM m_hTransform;
- int m_nSrcComponents;
- int m_nDstComponents;
- bool m_bLab;
-};
-bool CheckComponents(cmsColorSpaceSignature cs, int nComponents, bool bDst) {
- if (nComponents <= 0 || nComponents > 15) {
- return false;
- }
+namespace {
+
+bool Check3Components(cmsColorSpaceSignature cs, bool bDst) {
switch (cs) {
- case cmsSigLabData:
- if (nComponents < 3) {
- return false;
- }
- break;
case cmsSigGrayData:
- if (bDst && nComponents != 1) {
- return false;
- }
- if (!bDst && nComponents > 2) {
- return false;
- }
- break;
- case cmsSigRgbData:
- if (bDst && nComponents != 3) {
- return false;
- }
- break;
+ return false;
case cmsSigCmykData:
- if (bDst && nComponents != 4) {
+ if (bDst)
return false;
- }
break;
+ case cmsSigLabData:
+ case cmsSigRgbData:
default:
- if (nComponents != 3) {
- return false;
- }
break;
}
return true;
}
-void* IccLib_CreateTransform(const unsigned char* pSrcProfileData,
- uint32_t dwSrcProfileSize,
- uint32_t& nSrcComponents,
- const unsigned char* pDstProfileData,
- uint32_t dwDstProfileSize,
- int32_t nDstComponents,
- int intent,
- uint32_t dwSrcFormat = Icc_FORMAT_DEFAULT,
- uint32_t dwDstFormat = Icc_FORMAT_DEFAULT) {
- nSrcComponents = 0;
+} // namespace
+
+CLcmsCmm::CLcmsCmm(int srcComponents, cmsHTRANSFORM hTransform, bool isLab)
+ : m_hTransform(hTransform),
+ m_nSrcComponents(srcComponents),
+ m_bLab(isLab) {}
+
+CLcmsCmm::~CLcmsCmm() {
+ cmsDeleteTransform(m_hTransform);
+}
+
+CCodec_IccModule::CCodec_IccModule() : m_nComponents(0) {}
+
+CCodec_IccModule::~CCodec_IccModule() {}
+
+std::unique_ptr<CLcmsCmm> CCodec_IccModule::CreateTransform_sRGB(
+ const unsigned char* pSrcProfileData,
+ uint32_t dwSrcProfileSize,
+ uint32_t* nSrcComponents) {
+ *nSrcComponents = 0;
cmsHPROFILE srcProfile =
cmsOpenProfileFromMem(pSrcProfileData, dwSrcProfileSize);
if (!srcProfile)
return nullptr;
cmsHPROFILE dstProfile;
- if (!pDstProfileData && dwDstProfileSize == 0 && nDstComponents == 3) {
- dstProfile = cmsCreate_sRGBProfile();
- } else {
- dstProfile = cmsOpenProfileFromMem(pDstProfileData, dwDstProfileSize);
- }
+ dstProfile = cmsCreate_sRGBProfile();
if (!dstProfile) {
cmsCloseProfile(srcProfile);
return nullptr;
@@ -85,9 +68,9 @@ void* IccLib_CreateTransform(const unsigned char* pSrcProfileData,
bool bLab = false;
cmsColorSpaceSignature srcCS = cmsGetColorSpace(srcProfile);
- nSrcComponents = cmsChannelsOf(srcCS);
+ *nSrcComponents = cmsChannelsOf(srcCS);
// According to PDF spec, number of components must be 1, 3, or 4.
- if (nSrcComponents != 1 && nSrcComponents != 3 && nSrcComponents != 4) {
+ if (*nSrcComponents != 1 && *nSrcComponents != 3 && *nSrcComponents != 4) {
cmsCloseProfile(srcProfile);
cmsCloseProfile(dstProfile);
return nullptr;
@@ -95,23 +78,24 @@ void* IccLib_CreateTransform(const unsigned char* pSrcProfileData,
if (srcCS == cmsSigLabData) {
srcFormat =
- COLORSPACE_SH(PT_Lab) | CHANNELS_SH(nSrcComponents) | BYTES_SH(0);
+ COLORSPACE_SH(PT_Lab) | CHANNELS_SH(*nSrcComponents) | BYTES_SH(0);
bLab = true;
} else {
srcFormat =
- COLORSPACE_SH(PT_ANY) | CHANNELS_SH(nSrcComponents) | BYTES_SH(1);
- if (srcCS == cmsSigRgbData && T_DOSWAP(dwSrcFormat)) {
+ COLORSPACE_SH(PT_ANY) | CHANNELS_SH(*nSrcComponents) | BYTES_SH(1);
+ if (srcCS == cmsSigRgbData && T_DOSWAP(Icc_FORMAT_DEFAULT)) {
srcFormat |= DOSWAP_SH(1);
}
}
cmsColorSpaceSignature dstCS = cmsGetColorSpace(dstProfile);
- if (!CheckComponents(dstCS, nDstComponents, true)) {
+ if (!Check3Components(dstCS, true)) {
cmsCloseProfile(srcProfile);
cmsCloseProfile(dstProfile);
return nullptr;
}
cmsHTRANSFORM hTransform = nullptr;
+ int intent = 0;
switch (dstCS) {
case cmsSigGrayData:
hTransform = cmsCreateTransform(srcProfile, srcFormat, dstProfile,
@@ -124,7 +108,7 @@ void* IccLib_CreateTransform(const unsigned char* pSrcProfileData,
case cmsSigCmykData:
hTransform = cmsCreateTransform(
srcProfile, srcFormat, dstProfile,
- T_DOSWAP(dwDstFormat) ? TYPE_KYMC_8 : TYPE_CMYK_8, intent, 0);
+ T_DOSWAP(Icc_FORMAT_DEFAULT) ? TYPE_KYMC_8 : TYPE_CMYK_8, intent, 0);
break;
default:
break;
@@ -134,114 +118,46 @@ void* IccLib_CreateTransform(const unsigned char* pSrcProfileData,
cmsCloseProfile(dstProfile);
return nullptr;
}
- CLcmsCmm* pCmm = new CLcmsCmm;
- pCmm->m_nSrcComponents = nSrcComponents;
- pCmm->m_nDstComponents = nDstComponents;
- pCmm->m_hTransform = hTransform;
- pCmm->m_bLab = bLab;
+ auto pCmm = pdfium::MakeUnique<CLcmsCmm>(*nSrcComponents, hTransform, bLab);
cmsCloseProfile(srcProfile);
cmsCloseProfile(dstProfile);
return pCmm;
}
-void* IccLib_CreateTransform_sRGB(const unsigned char* pProfileData,
- uint32_t dwProfileSize,
- uint32_t& nComponents,
- int32_t intent,
- uint32_t dwSrcFormat) {
- return IccLib_CreateTransform(pProfileData, dwProfileSize, nComponents,
- nullptr, 0, 3, intent, dwSrcFormat);
-}
-void IccLib_DestroyTransform(void* pTransform) {
- if (!pTransform) {
- return;
- }
- cmsDeleteTransform(((CLcmsCmm*)pTransform)->m_hTransform);
- delete (CLcmsCmm*)pTransform;
-}
-void IccLib_Translate(void* pTransform,
- uint32_t nSrcComponents,
- const float* pSrcValues,
- float* pDestValues) {
+void CCodec_IccModule::Translate(CLcmsCmm* pTransform,
+ const float* pSrcValues,
+ float* pDestValues) {
if (!pTransform)
return;
- CLcmsCmm* p = (CLcmsCmm*)pTransform;
+ uint32_t nSrcComponents = m_nComponents;
uint8_t output[4];
- if (p->m_bLab) {
+ if (pTransform->m_bLab) {
CFX_FixedBufGrow<double, 16> inputs(nSrcComponents);
double* input = inputs;
- for (uint32_t i = 0; i < nSrcComponents; i++)
+ for (uint32_t i = 0; i < nSrcComponents; ++i)
input[i] = pSrcValues[i];
- cmsDoTransform(p->m_hTransform, input, output, 1);
+ cmsDoTransform(pTransform->m_hTransform, input, output, 1);
} else {
CFX_FixedBufGrow<uint8_t, 16> inputs(nSrcComponents);
uint8_t* input = inputs;
- for (uint32_t i = 0; i < nSrcComponents; i++) {
- if (pSrcValues[i] > 1.0f)
- input[i] = 255;
- else if (pSrcValues[i] < 0)
- input[i] = 0;
- else
- input[i] = static_cast<int>(pSrcValues[i] * 255.0f);
+ for (uint32_t i = 0; i < nSrcComponents; ++i) {
+ input[i] =
+ pdfium::clamp(static_cast<int>(pSrcValues[i] * 255.0f), 0, 255);
}
- cmsDoTransform(p->m_hTransform, input, output, 1);
+ cmsDoTransform(pTransform->m_hTransform, input, output, 1);
}
- switch (p->m_nDstComponents) {
- case 1:
- pDestValues[0] = output[0] / 255.0f;
- break;
- case 3:
- pDestValues[0] = output[2] / 255.0f;
- pDestValues[1] = output[1] / 255.0f;
- pDestValues[2] = output[0] / 255.0f;
- break;
- case 4:
- pDestValues[0] = output[0] / 255.0f;
- pDestValues[1] = output[1] / 255.0f;
- pDestValues[2] = output[2] / 255.0f;
- pDestValues[3] = output[3] / 255.0f;
- break;
- }
-}
-
-void IccLib_TranslateImage(void* pTransform,
- unsigned char* pDest,
- const unsigned char* pSrc,
- int32_t pixels) {
- if (!pTransform)
- return;
- cmsDoTransform(((CLcmsCmm*)pTransform)->m_hTransform, pSrc, pDest, pixels);
-}
-
-CCodec_IccModule::CCodec_IccModule() : m_nComponents(0) {}
-
-CCodec_IccModule::~CCodec_IccModule() {
-}
-void* CCodec_IccModule::CreateTransform_sRGB(const uint8_t* pProfileData,
- uint32_t dwProfileSize,
- uint32_t& nComponents,
- int32_t intent,
- uint32_t dwSrcFormat) {
- return IccLib_CreateTransform_sRGB(pProfileData, dwProfileSize, nComponents,
- intent, dwSrcFormat);
-}
-
-void CCodec_IccModule::DestroyTransform(void* pTransform) {
- IccLib_DestroyTransform(pTransform);
-}
-
-void CCodec_IccModule::Translate(void* pTransform,
- const float* pSrcValues,
- float* pDestValues) {
- IccLib_Translate(pTransform, m_nComponents, pSrcValues, pDestValues);
+ pDestValues[0] = output[2] / 255.0f;
+ pDestValues[1] = output[1] / 255.0f;
+ pDestValues[2] = output[0] / 255.0f;
}
-void CCodec_IccModule::TranslateScanline(void* pTransform,
- uint8_t* pDest,
- const uint8_t* pSrc,
+void CCodec_IccModule::TranslateScanline(CLcmsCmm* pTransform,
+ unsigned char* pDest,
+ const unsigned char* pSrc,
int32_t pixels) {
- IccLib_TranslateImage(pTransform, pDest, pSrc, pixels);
+ if (pTransform)
+ cmsDoTransform(pTransform->m_hTransform, pSrc, pDest, pixels);
}
const uint8_t g_CMYKSamples[81 * 81 * 3] = {