diff options
author | Bo Xu <bo_xu@foxitsoftware.com> | 2014-08-25 10:01:19 -0700 |
---|---|---|
committer | Bo Xu <bo_xu@foxitsoftware.com> | 2014-08-25 10:01:19 -0700 |
commit | be831032f3ef4654e0f645785c6a59b1d06a9ad8 (patch) | |
tree | 800005caf429e2996cc118c32fde32440739a1c1 /core/src/fxcodec | |
parent | c655167ed83f78a38264457e65dd11e653ab981d (diff) | |
download | pdfium-be831032f3ef4654e0f645785c6a59b1d06a9ad8.tar.xz |
Use number of components from ICC profile and alternate color space
BUG=406806
Review URL: https://codereview.chromium.org/493163003
Diffstat (limited to 'core/src/fxcodec')
-rw-r--r-- | core/src/fxcodec/codec/codec_int.h | 6 | ||||
-rw-r--r-- | core/src/fxcodec/codec/fx_codec_icc.cpp | 57 |
2 files changed, 43 insertions, 20 deletions
diff --git a/core/src/fxcodec/codec/codec_int.h b/core/src/fxcodec/codec/codec_int.h index 47f2c8e1fe..1b97036e3d 100644 --- a/core/src/fxcodec/codec/codec_int.h +++ b/core/src/fxcodec/codec/codec_int.h @@ -162,10 +162,10 @@ public: FX_DWORD dwPrfIntent = Icc_INTENT_ABSOLUTE_COLORIMETRIC, FX_DWORD dwPrfFlag = Icc_FLAGS_SOFTPROOFING ); - virtual FX_LPVOID CreateTransform_sRGB(FX_LPCBYTE pProfileData, unsigned int dwProfileSize, int nComponents, int intent = 0, + virtual FX_LPVOID CreateTransform_sRGB(FX_LPCBYTE pProfileData, FX_DWORD dwProfileSize, FX_INT32* nComponents, FX_INT32 intent = 0, FX_DWORD dwSrcFormat = Icc_FORMAT_DEFAULT); - virtual FX_LPVOID CreateTransform_CMYK(FX_LPCBYTE pSrcProfileData, unsigned int dwSrcProfileSize, int nSrcComponents, - FX_LPCBYTE pDstProfileData, unsigned int dwDstProfileSize, int intent = 0, + virtual FX_LPVOID CreateTransform_CMYK(FX_LPCBYTE pSrcProfileData, FX_DWORD dwSrcProfileSize, FX_INT32* nSrcComponents, + FX_LPCBYTE pDstProfileData, FX_DWORD dwDstProfileSize, FX_INT32 intent = 0, FX_DWORD dwSrcFormat = Icc_FORMAT_DEFAULT, FX_DWORD dwDstFormat = Icc_FORMAT_DEFAULT ); diff --git a/core/src/fxcodec/codec/fx_codec_icc.cpp b/core/src/fxcodec/codec/fx_codec_icc.cpp index b10d9c4868..f0ece07c31 100644 --- a/core/src/fxcodec/codec/fx_codec_icc.cpp +++ b/core/src/fxcodec/codec/fx_codec_icc.cpp @@ -7,6 +7,12 @@ #include "../../../include/fxcodec/fx_codec.h" #include "codec_int.h" #include "../lcms2/include/fx_lcms2.h" +#define N_COMPONENT_LAB 3 +#define N_COMPONENT_GRAY 1 +#define N_COMPONENT_RGB 3 +#define N_COMPONENT_CMYK 4 +#define N_COMPONENT_DEFAULT 3 + FX_BOOL MD5ComputeID( FX_LPCVOID buf, FX_DWORD dwSize, FX_BYTE ID[16] ) { return cmsMD5computeIDExt(buf, dwSize, ID); @@ -59,14 +65,35 @@ FX_BOOL CheckComponents(cmsColorSpaceSignature cs, int nComponents, FX_BOOL bDst } return TRUE; } -void* IccLib_CreateTransform(const unsigned char* pSrcProfileData, unsigned int dwSrcProfileSize, int nSrcComponents, - const unsigned char* pDstProfileData, unsigned int dwDstProfileSize, int nDstComponents, +FX_INT32 GetCSComponents(cmsColorSpaceSignature cs) +{ + switch (cs) { + case cmsSigLabData: + return N_COMPONENT_LAB; + break; + case cmsSigGrayData: + return N_COMPONENT_GRAY; + break; + case cmsSigRgbData: + return N_COMPONENT_RGB; + break; + case cmsSigCmykData: + return N_COMPONENT_CMYK; + break; + default: + return N_COMPONENT_DEFAULT; + break; + } +} +void* IccLib_CreateTransform(const unsigned char* pSrcProfileData, FX_DWORD dwSrcProfileSize, FX_INT32* nSrcComponents, + const unsigned char* pDstProfileData, FX_DWORD dwDstProfileSize, FX_INT32 nDstComponents, int intent, FX_DWORD dwSrcFormat = Icc_FORMAT_DEFAULT, FX_DWORD dwDstFormat = Icc_FORMAT_DEFAULT) { cmsHPROFILE srcProfile = NULL; cmsHPROFILE dstProfile = NULL; cmsHTRANSFORM hTransform = NULL; CLcmsCmm* pCmm = NULL; + *nSrcComponents = 0; srcProfile = cmsOpenProfileFromMem((void*)pSrcProfileData, dwSrcProfileSize); if (srcProfile == NULL) { return NULL; @@ -83,16 +110,12 @@ void* IccLib_CreateTransform(const unsigned char* pSrcProfileData, unsigned int int srcFormat; FX_BOOL bLab = FALSE; cmsColorSpaceSignature srcCS = cmsGetColorSpace(srcProfile); - if (!CheckComponents(srcCS, nSrcComponents, FALSE)) { - cmsCloseProfile(srcProfile); - cmsCloseProfile(dstProfile); - return NULL; - } + *nSrcComponents = GetCSComponents(srcCS); if (srcCS == cmsSigLabData) { - srcFormat = COLORSPACE_SH(PT_Lab) | CHANNELS_SH(nSrcComponents) | BYTES_SH(0); + srcFormat = COLORSPACE_SH(PT_Lab) | CHANNELS_SH(*nSrcComponents) | BYTES_SH(0); bLab = TRUE; } else { - srcFormat = COLORSPACE_SH(PT_ANY) | CHANNELS_SH(nSrcComponents) | BYTES_SH(1); + srcFormat = COLORSPACE_SH(PT_ANY) | CHANNELS_SH(*nSrcComponents) | BYTES_SH(1); if (srcCS == cmsSigRgbData && T_DOSWAP(dwSrcFormat)) { srcFormat |= DOSWAP_SH(1); } @@ -127,7 +150,7 @@ void* IccLib_CreateTransform(const unsigned char* pSrcProfileData, unsigned int if (pCmm == NULL) { return NULL; } - pCmm->m_nSrcComponents = nSrcComponents; + pCmm->m_nSrcComponents = *nSrcComponents; pCmm->m_nDstComponents = nDstComponents; pCmm->m_hTransform = hTransform; pCmm->m_bLab = bLab; @@ -135,7 +158,7 @@ void* IccLib_CreateTransform(const unsigned char* pSrcProfileData, unsigned int cmsCloseProfile(dstProfile); return pCmm; } -void* IccLib_CreateTransform_sRGB(const unsigned char* pProfileData, unsigned int dwProfileSize, int nComponents, int intent, FX_DWORD dwSrcFormat) +void* IccLib_CreateTransform_sRGB(const unsigned char* pProfileData, FX_DWORD dwProfileSize, FX_INT32* nComponents, FX_INT32 intent, FX_DWORD dwSrcFormat) { return IccLib_CreateTransform(pProfileData, dwProfileSize, nComponents, NULL, 0, 3, intent, dwSrcFormat); } @@ -192,7 +215,7 @@ void IccLib_Translate(void* pTransform, FX_DWORD nSrcComponents, FX_FLOAT* pSrcV break; } } -void IccLib_TranslateImage(void* pTransform, unsigned char* pDest, const unsigned char* pSrc, int pixels) +void IccLib_TranslateImage(void* pTransform, unsigned char* pDest, const unsigned char* pSrc, FX_INT32 pixels) { cmsDoTransform(((CLcmsCmm*)pTransform)->m_hTransform, (void*)pSrc, pDest, pixels); } @@ -242,7 +265,7 @@ ICodec_IccModule::IccCS GetProfileCSFromHandle(FX_LPVOID pProfile) return ICodec_IccModule::IccCS_Unknown; } } -ICodec_IccModule::IccCS CCodec_IccModule::GetProfileCS(FX_LPCBYTE pProfileData, unsigned int dwProfileSize) +ICodec_IccModule::IccCS CCodec_IccModule::GetProfileCS(FX_LPCBYTE pProfileData, FX_DWORD dwProfileSize) { ICodec_IccModule::IccCS cs; cmsHPROFILE hProfile = cmsOpenProfileFromMem((void*)pProfileData, dwProfileSize); @@ -517,12 +540,12 @@ CCodec_IccModule::~CCodec_IccModule() } } } -void* CCodec_IccModule::CreateTransform_sRGB(FX_LPCBYTE pProfileData, unsigned int dwProfileSize, int nComponents, int intent, FX_DWORD dwSrcFormat) +void* CCodec_IccModule::CreateTransform_sRGB(FX_LPCBYTE pProfileData, FX_DWORD dwProfileSize, FX_INT32* nComponents, FX_INT32 intent, FX_DWORD dwSrcFormat) { return IccLib_CreateTransform_sRGB(pProfileData, dwProfileSize, nComponents, intent, dwSrcFormat); } -void* CCodec_IccModule::CreateTransform_CMYK(FX_LPCBYTE pSrcProfileData, unsigned int dwSrcProfileSize, int nSrcComponents, - FX_LPCBYTE pDstProfileData, unsigned int dwDstProfileSize, int intent, +void* CCodec_IccModule::CreateTransform_CMYK(FX_LPCBYTE pSrcProfileData, FX_DWORD dwSrcProfileSize, FX_INT32* nSrcComponents, + FX_LPCBYTE pDstProfileData, FX_DWORD dwDstProfileSize, FX_INT32 intent, FX_DWORD dwSrcFormat , FX_DWORD dwDstFormat) { return IccLib_CreateTransform(pSrcProfileData, dwSrcProfileSize, nSrcComponents, @@ -536,7 +559,7 @@ void CCodec_IccModule::Translate(void* pTransform, FX_FLOAT* pSrcValues, FX_FLOA { IccLib_Translate(pTransform, m_nComponents, pSrcValues, pDestValues); } -void CCodec_IccModule::TranslateScanline(void* pTransform, FX_LPBYTE pDest, FX_LPCBYTE pSrc, int pixels) +void CCodec_IccModule::TranslateScanline(void* pTransform, FX_LPBYTE pDest, FX_LPCBYTE pSrc, FX_INT32 pixels) { IccLib_TranslateImage(pTransform, pDest, pSrc, pixels); } |