| OLD | NEW |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | 6 |
| 7 #include "codec_int.h" | 7 #include "codec_int.h" |
| 8 #include "core/include/fxcodec/fx_codec.h" | 8 #include "core/include/fxcodec/fx_codec.h" |
| 9 #include "third_party/lcms2-2.6/include/lcms2.h" | 9 #include "third_party/lcms2-2.6/include/lcms2.h" |
| 10 | 10 |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 95 int32_t nDstComponents, | 95 int32_t nDstComponents, |
| 96 int intent, | 96 int intent, |
| 97 FX_DWORD dwSrcFormat = Icc_FORMAT_DEFAULT, | 97 FX_DWORD dwSrcFormat = Icc_FORMAT_DEFAULT, |
| 98 FX_DWORD dwDstFormat = Icc_FORMAT_DEFAULT) { | 98 FX_DWORD dwDstFormat = Icc_FORMAT_DEFAULT) { |
| 99 cmsHPROFILE srcProfile = NULL; | 99 cmsHPROFILE srcProfile = NULL; |
| 100 cmsHPROFILE dstProfile = NULL; | 100 cmsHPROFILE dstProfile = NULL; |
| 101 cmsHTRANSFORM hTransform = NULL; | 101 cmsHTRANSFORM hTransform = NULL; |
| 102 CLcmsCmm* pCmm = NULL; | 102 CLcmsCmm* pCmm = NULL; |
| 103 nSrcComponents = 0; | 103 nSrcComponents = 0; |
| 104 srcProfile = cmsOpenProfileFromMem((void*)pSrcProfileData, dwSrcProfileSize); | 104 srcProfile = cmsOpenProfileFromMem((void*)pSrcProfileData, dwSrcProfileSize); |
| 105 if (srcProfile == NULL) { | 105 if (!srcProfile) { |
| 106 return NULL; | 106 return NULL; |
| 107 } | 107 } |
| 108 if (pDstProfileData == NULL && dwDstProfileSize == 0 && nDstComponents == 3) { | 108 if (!pDstProfileData && dwDstProfileSize == 0 && nDstComponents == 3) { |
| 109 dstProfile = cmsCreate_sRGBProfile(); | 109 dstProfile = cmsCreate_sRGBProfile(); |
| 110 } else { | 110 } else { |
| 111 dstProfile = | 111 dstProfile = |
| 112 cmsOpenProfileFromMem((void*)pDstProfileData, dwDstProfileSize); | 112 cmsOpenProfileFromMem((void*)pDstProfileData, dwDstProfileSize); |
| 113 } | 113 } |
| 114 if (dstProfile == NULL) { | 114 if (!dstProfile) { |
| 115 cmsCloseProfile(srcProfile); | 115 cmsCloseProfile(srcProfile); |
| 116 return NULL; | 116 return NULL; |
| 117 } | 117 } |
| 118 int srcFormat; | 118 int srcFormat; |
| 119 FX_BOOL bLab = FALSE; | 119 FX_BOOL bLab = FALSE; |
| 120 cmsColorSpaceSignature srcCS = cmsGetColorSpace(srcProfile); | 120 cmsColorSpaceSignature srcCS = cmsGetColorSpace(srcProfile); |
| 121 nSrcComponents = GetCSComponents(srcCS); | 121 nSrcComponents = GetCSComponents(srcCS); |
| 122 if (srcCS == cmsSigLabData) { | 122 if (srcCS == cmsSigLabData) { |
| 123 srcFormat = | 123 srcFormat = |
| 124 COLORSPACE_SH(PT_Lab) | CHANNELS_SH(nSrcComponents) | BYTES_SH(0); | 124 COLORSPACE_SH(PT_Lab) | CHANNELS_SH(nSrcComponents) | BYTES_SH(0); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 146 TYPE_BGR_8, intent, 0); | 146 TYPE_BGR_8, intent, 0); |
| 147 break; | 147 break; |
| 148 case cmsSigCmykData: | 148 case cmsSigCmykData: |
| 149 hTransform = cmsCreateTransform( | 149 hTransform = cmsCreateTransform( |
| 150 srcProfile, srcFormat, dstProfile, | 150 srcProfile, srcFormat, dstProfile, |
| 151 T_DOSWAP(dwDstFormat) ? TYPE_KYMC_8 : TYPE_CMYK_8, intent, 0); | 151 T_DOSWAP(dwDstFormat) ? TYPE_KYMC_8 : TYPE_CMYK_8, intent, 0); |
| 152 break; | 152 break; |
| 153 default: | 153 default: |
| 154 break; | 154 break; |
| 155 } | 155 } |
| 156 if (hTransform == NULL) { | 156 if (!hTransform) { |
| 157 cmsCloseProfile(srcProfile); | 157 cmsCloseProfile(srcProfile); |
| 158 cmsCloseProfile(dstProfile); | 158 cmsCloseProfile(dstProfile); |
| 159 return NULL; | 159 return NULL; |
| 160 } | 160 } |
| 161 pCmm = new CLcmsCmm; | 161 pCmm = new CLcmsCmm; |
| 162 pCmm->m_nSrcComponents = nSrcComponents; | 162 pCmm->m_nSrcComponents = nSrcComponents; |
| 163 pCmm->m_nDstComponents = nDstComponents; | 163 pCmm->m_nDstComponents = nDstComponents; |
| 164 pCmm->m_hTransform = hTransform; | 164 pCmm->m_hTransform = hTransform; |
| 165 pCmm->m_bLab = bLab; | 165 pCmm->m_bLab = bLab; |
| 166 cmsCloseProfile(srcProfile); | 166 cmsCloseProfile(srcProfile); |
| 167 cmsCloseProfile(dstProfile); | 167 cmsCloseProfile(dstProfile); |
| 168 return pCmm; | 168 return pCmm; |
| 169 } | 169 } |
| 170 void* IccLib_CreateTransform_sRGB(const unsigned char* pProfileData, | 170 void* IccLib_CreateTransform_sRGB(const unsigned char* pProfileData, |
| 171 FX_DWORD dwProfileSize, | 171 FX_DWORD dwProfileSize, |
| 172 int32_t& nComponents, | 172 int32_t& nComponents, |
| 173 int32_t intent, | 173 int32_t intent, |
| 174 FX_DWORD dwSrcFormat) { | 174 FX_DWORD dwSrcFormat) { |
| 175 return IccLib_CreateTransform(pProfileData, dwProfileSize, nComponents, NULL, | 175 return IccLib_CreateTransform(pProfileData, dwProfileSize, nComponents, NULL, |
| 176 0, 3, intent, dwSrcFormat); | 176 0, 3, intent, dwSrcFormat); |
| 177 } | 177 } |
| 178 void IccLib_DestroyTransform(void* pTransform) { | 178 void IccLib_DestroyTransform(void* pTransform) { |
| 179 if (pTransform == NULL) { | 179 if (!pTransform) { |
| 180 return; | 180 return; |
| 181 } | 181 } |
| 182 cmsDeleteTransform(((CLcmsCmm*)pTransform)->m_hTransform); | 182 cmsDeleteTransform(((CLcmsCmm*)pTransform)->m_hTransform); |
| 183 delete (CLcmsCmm*)pTransform; | 183 delete (CLcmsCmm*)pTransform; |
| 184 } | 184 } |
| 185 void IccLib_Translate(void* pTransform, | 185 void IccLib_Translate(void* pTransform, |
| 186 FX_DWORD nSrcComponents, | 186 FX_DWORD nSrcComponents, |
| 187 FX_FLOAT* pSrcValues, | 187 FX_FLOAT* pSrcValues, |
| 188 FX_FLOAT* pDestValues) { | 188 FX_FLOAT* pDestValues) { |
| 189 if (pTransform == NULL) { | 189 if (!pTransform) { |
| 190 return; | 190 return; |
| 191 } | 191 } |
| 192 CLcmsCmm* p = (CLcmsCmm*)pTransform; | 192 CLcmsCmm* p = (CLcmsCmm*)pTransform; |
| 193 uint8_t output[4]; | 193 uint8_t output[4]; |
| 194 if (p->m_bLab) { | 194 if (p->m_bLab) { |
| 195 CFX_FixedBufGrow<double, 16> inputs(nSrcComponents); | 195 CFX_FixedBufGrow<double, 16> inputs(nSrcComponents); |
| 196 double* input = inputs; | 196 double* input = inputs; |
| 197 for (FX_DWORD i = 0; i < nSrcComponents; i++) { | 197 for (FX_DWORD i = 0; i < nSrcComponents; i++) { |
| 198 input[i] = pSrcValues[i]; | 198 input[i] = pSrcValues[i]; |
| 199 } | 199 } |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 235 int32_t pixels) { | 235 int32_t pixels) { |
| 236 cmsDoTransform(((CLcmsCmm*)pTransform)->m_hTransform, (void*)pSrc, pDest, | 236 cmsDoTransform(((CLcmsCmm*)pTransform)->m_hTransform, (void*)pSrc, pDest, |
| 237 pixels); | 237 pixels); |
| 238 } | 238 } |
| 239 void* CreateProfile_Gray(double gamma) { | 239 void* CreateProfile_Gray(double gamma) { |
| 240 cmsCIExyY* D50 = (cmsCIExyY*)cmsD50_xyY(); | 240 cmsCIExyY* D50 = (cmsCIExyY*)cmsD50_xyY(); |
| 241 if (!cmsWhitePointFromTemp(D50, 6504)) { | 241 if (!cmsWhitePointFromTemp(D50, 6504)) { |
| 242 return NULL; | 242 return NULL; |
| 243 } | 243 } |
| 244 cmsToneCurve* curve = cmsBuildGamma(NULL, gamma); | 244 cmsToneCurve* curve = cmsBuildGamma(NULL, gamma); |
| 245 if (curve == NULL) { | 245 if (!curve) { |
| 246 return NULL; | 246 return NULL; |
| 247 } | 247 } |
| 248 void* profile = cmsCreateGrayProfile(D50, curve); | 248 void* profile = cmsCreateGrayProfile(D50, curve); |
| 249 cmsFreeToneCurve(curve); | 249 cmsFreeToneCurve(curve); |
| 250 return profile; | 250 return profile; |
| 251 } | 251 } |
| 252 ICodec_IccModule::IccCS GetProfileCSFromHandle(void* pProfile) { | 252 ICodec_IccModule::IccCS GetProfileCSFromHandle(void* pProfile) { |
| 253 if (pProfile == NULL) { | 253 if (!pProfile) { |
| 254 return ICodec_IccModule::IccCS_Unknown; | 254 return ICodec_IccModule::IccCS_Unknown; |
| 255 } | 255 } |
| 256 switch (cmsGetColorSpace(pProfile)) { | 256 switch (cmsGetColorSpace(pProfile)) { |
| 257 case cmsSigXYZData: | 257 case cmsSigXYZData: |
| 258 return ICodec_IccModule::IccCS_XYZ; | 258 return ICodec_IccModule::IccCS_XYZ; |
| 259 case cmsSigLabData: | 259 case cmsSigLabData: |
| 260 return ICodec_IccModule::IccCS_Lab; | 260 return ICodec_IccModule::IccCS_Lab; |
| 261 case cmsSigLuvData: | 261 case cmsSigLuvData: |
| 262 return ICodec_IccModule::IccCS_Luv; | 262 return ICodec_IccModule::IccCS_Luv; |
| 263 case cmsSigYCbCrData: | 263 case cmsSigYCbCrData: |
| (...skipping 15 matching lines...) Expand all Loading... |
| 279 default: | 279 default: |
| 280 return ICodec_IccModule::IccCS_Unknown; | 280 return ICodec_IccModule::IccCS_Unknown; |
| 281 } | 281 } |
| 282 } | 282 } |
| 283 ICodec_IccModule::IccCS CCodec_IccModule::GetProfileCS( | 283 ICodec_IccModule::IccCS CCodec_IccModule::GetProfileCS( |
| 284 const uint8_t* pProfileData, | 284 const uint8_t* pProfileData, |
| 285 FX_DWORD dwProfileSize) { | 285 FX_DWORD dwProfileSize) { |
| 286 ICodec_IccModule::IccCS cs; | 286 ICodec_IccModule::IccCS cs; |
| 287 cmsHPROFILE hProfile = | 287 cmsHPROFILE hProfile = |
| 288 cmsOpenProfileFromMem((void*)pProfileData, dwProfileSize); | 288 cmsOpenProfileFromMem((void*)pProfileData, dwProfileSize); |
| 289 if (hProfile == NULL) { | 289 if (!hProfile) { |
| 290 return IccCS_Unknown; | 290 return IccCS_Unknown; |
| 291 } | 291 } |
| 292 cs = GetProfileCSFromHandle(hProfile); | 292 cs = GetProfileCSFromHandle(hProfile); |
| 293 if (hProfile) { | 293 if (hProfile) { |
| 294 cmsCloseProfile(hProfile); | 294 cmsCloseProfile(hProfile); |
| 295 } | 295 } |
| 296 return cs; | 296 return cs; |
| 297 } | 297 } |
| 298 ICodec_IccModule::IccCS CCodec_IccModule::GetProfileCS(IFX_FileRead* pFile) { | 298 ICodec_IccModule::IccCS CCodec_IccModule::GetProfileCS(IFX_FileRead* pFile) { |
| 299 if (pFile == NULL) { | 299 if (!pFile) { |
| 300 return IccCS_Unknown; | 300 return IccCS_Unknown; |
| 301 } | 301 } |
| 302 ICodec_IccModule::IccCS cs; | 302 ICodec_IccModule::IccCS cs; |
| 303 FX_DWORD dwSize = (FX_DWORD)pFile->GetSize(); | 303 FX_DWORD dwSize = (FX_DWORD)pFile->GetSize(); |
| 304 uint8_t* pBuf = FX_Alloc(uint8_t, dwSize); | 304 uint8_t* pBuf = FX_Alloc(uint8_t, dwSize); |
| 305 pFile->ReadBlock(pBuf, 0, dwSize); | 305 pFile->ReadBlock(pBuf, 0, dwSize); |
| 306 cs = GetProfileCS(pBuf, dwSize); | 306 cs = GetProfileCS(pBuf, dwSize); |
| 307 FX_Free(pBuf); | 307 FX_Free(pBuf); |
| 308 return cs; | 308 return cs; |
| 309 } | 309 } |
| (...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 469 ICodec_IccModule::IccParam* pOutputParam, | 469 ICodec_IccModule::IccParam* pOutputParam, |
| 470 ICodec_IccModule::IccParam* pProofParam, | 470 ICodec_IccModule::IccParam* pProofParam, |
| 471 FX_DWORD dwIntent, | 471 FX_DWORD dwIntent, |
| 472 FX_DWORD dwFlag, | 472 FX_DWORD dwFlag, |
| 473 FX_DWORD dwPrfIntent, | 473 FX_DWORD dwPrfIntent, |
| 474 FX_DWORD dwPrfFlag) { | 474 FX_DWORD dwPrfFlag) { |
| 475 CLcmsCmm* pCmm = NULL; | 475 CLcmsCmm* pCmm = NULL; |
| 476 ASSERT(pInputParam && pOutputParam); | 476 ASSERT(pInputParam && pOutputParam); |
| 477 CFX_ByteStringKey key; | 477 CFX_ByteStringKey key; |
| 478 void* pInputProfile = CreateProfile(pInputParam, Icc_CLASS_INPUT, &key); | 478 void* pInputProfile = CreateProfile(pInputParam, Icc_CLASS_INPUT, &key); |
| 479 if (pInputProfile == NULL) { | 479 if (!pInputProfile) { |
| 480 return NULL; | 480 return NULL; |
| 481 } | 481 } |
| 482 void* pOutputProfile = CreateProfile(pOutputParam, Icc_CLASS_OUTPUT, &key); | 482 void* pOutputProfile = CreateProfile(pOutputParam, Icc_CLASS_OUTPUT, &key); |
| 483 if (pOutputProfile == NULL) { | 483 if (!pOutputProfile) { |
| 484 return NULL; | 484 return NULL; |
| 485 } | 485 } |
| 486 FX_DWORD dwInputProfileType = | 486 FX_DWORD dwInputProfileType = |
| 487 TransferProfileType(pInputProfile, pInputParam->dwFormat); | 487 TransferProfileType(pInputProfile, pInputParam->dwFormat); |
| 488 FX_DWORD dwOutputProfileType = | 488 FX_DWORD dwOutputProfileType = |
| 489 TransferProfileType(pOutputProfile, pOutputParam->dwFormat); | 489 TransferProfileType(pOutputProfile, pOutputParam->dwFormat); |
| 490 if (dwInputProfileType == 0 || dwOutputProfileType == 0) { | 490 if (dwInputProfileType == 0 || dwOutputProfileType == 0) { |
| 491 return NULL; | 491 return NULL; |
| 492 } | 492 } |
| 493 void* pProofProfile = NULL; | 493 void* pProofProfile = NULL; |
| (...skipping 1477 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1971 uint8_t c1 = FXSYS_round(c * 255); | 1971 uint8_t c1 = FXSYS_round(c * 255); |
| 1972 uint8_t m1 = FXSYS_round(m * 255); | 1972 uint8_t m1 = FXSYS_round(m * 255); |
| 1973 uint8_t y1 = FXSYS_round(y * 255); | 1973 uint8_t y1 = FXSYS_round(y * 255); |
| 1974 uint8_t k1 = FXSYS_round(k * 255); | 1974 uint8_t k1 = FXSYS_round(k * 255); |
| 1975 uint8_t r, g, b; | 1975 uint8_t r, g, b; |
| 1976 AdobeCMYK_to_sRGB1(c1, m1, y1, k1, r, g, b); | 1976 AdobeCMYK_to_sRGB1(c1, m1, y1, k1, r, g, b); |
| 1977 R = 1.0f * r / 255; | 1977 R = 1.0f * r / 255; |
| 1978 G = 1.0f * g / 255; | 1978 G = 1.0f * g / 255; |
| 1979 B = 1.0f * b / 255; | 1979 B = 1.0f * b / 255; |
| 1980 } | 1980 } |
| OLD | NEW |