diff options
Diffstat (limited to 'core/fxcodec/icc/iccmodule.cpp')
-rw-r--r-- | core/fxcodec/icc/iccmodule.cpp | 150 |
1 files changed, 0 insertions, 150 deletions
diff --git a/core/fxcodec/icc/iccmodule.cpp b/core/fxcodec/icc/iccmodule.cpp deleted file mode 100644 index e9a8cd64d..000000000 --- a/core/fxcodec/icc/iccmodule.cpp +++ /dev/null @@ -1,150 +0,0 @@ -// 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/icc/iccmodule.h" - -#include <algorithm> -#include <memory> -#include <vector> - -#include "third_party/base/ptr_util.h" -#include "third_party/base/stl_util.h" - -namespace fxcodec { - -namespace { - -// For use with std::unique_ptr<cmsHPROFILE>. -struct CmsProfileDeleter { - inline void operator()(cmsHPROFILE p) { cmsCloseProfile(p); } -}; - -using ScopedCmsProfile = std::unique_ptr<void, CmsProfileDeleter>; - -bool Check3Components(cmsColorSpaceSignature cs) { - switch (cs) { - case cmsSigGrayData: - case cmsSigCmykData: - return false; - default: - return true; - } -} - -} // namespace - -CLcmsCmm::CLcmsCmm(cmsHTRANSFORM hTransform, - int srcComponents, - bool bIsLab, - bool bNormal) - : m_hTransform(hTransform), - m_nSrcComponents(srcComponents), - m_bLab(bIsLab), - m_bNormal(bNormal) {} - -CLcmsCmm::~CLcmsCmm() { - cmsDeleteTransform(m_hTransform); -} - -// static -std::unique_ptr<CLcmsCmm> IccModule::CreateTransformSRGB( - pdfium::span<const uint8_t> span) { - ScopedCmsProfile srcProfile(cmsOpenProfileFromMem(span.data(), span.size())); - if (!srcProfile) - return nullptr; - - ScopedCmsProfile dstProfile(cmsCreate_sRGBProfile()); - if (!dstProfile) - return nullptr; - - cmsColorSpaceSignature srcCS = cmsGetColorSpace(srcProfile.get()); - - uint32_t nSrcComponents = cmsChannelsOf(srcCS); - // According to PDF spec, number of components must be 1, 3, or 4. - if (nSrcComponents != 1 && nSrcComponents != 3 && nSrcComponents != 4) - return nullptr; - - int srcFormat; - bool bLab = false; - bool bNormal = false; - if (srcCS == cmsSigLabData) { - 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); - // TODO(thestig): Check to see if lcms2 supports more colorspaces that can - // be considered normal. - bNormal = srcCS == cmsSigGrayData || srcCS == cmsSigRgbData || - srcCS == cmsSigCmykData; - } - cmsColorSpaceSignature dstCS = cmsGetColorSpace(dstProfile.get()); - if (!Check3Components(dstCS)) - return nullptr; - - cmsHTRANSFORM hTransform = nullptr; - const int intent = 0; - switch (dstCS) { - case cmsSigRgbData: - hTransform = cmsCreateTransform(srcProfile.get(), srcFormat, - dstProfile.get(), TYPE_BGR_8, intent, 0); - break; - case cmsSigGrayData: - case cmsSigCmykData: - // Check3Components() already filtered these types. - NOTREACHED(); - break; - default: - break; - } - if (!hTransform) - return nullptr; - - return pdfium::MakeUnique<CLcmsCmm>(hTransform, nSrcComponents, bLab, - bNormal); -} - -// static -void IccModule::Translate(CLcmsCmm* pTransform, - uint32_t nSrcComponents, - const float* pSrcValues, - float* pDestValues) { - if (!pTransform) - return; - - uint8_t output[4]; - // TODO(npm): Currently the CmsDoTransform method is part of LCMS and it will - // apply some member of m_hTransform to the input. We need to go over all the - // places which set transform to verify that only |nSrcComponents| are used. - if (pTransform->IsLab()) { - std::vector<double> inputs(std::max(nSrcComponents, 16u)); - for (uint32_t i = 0; i < nSrcComponents; ++i) - inputs[i] = pSrcValues[i]; - cmsDoTransform(pTransform->transform(), inputs.data(), output, 1); - } else { - std::vector<uint8_t> inputs(std::max(nSrcComponents, 16u)); - for (uint32_t i = 0; i < nSrcComponents; ++i) { - inputs[i] = - pdfium::clamp(static_cast<int>(pSrcValues[i] * 255.0f), 0, 255); - } - cmsDoTransform(pTransform->transform(), inputs.data(), output, 1); - } - pDestValues[0] = output[2] / 255.0f; - pDestValues[1] = output[1] / 255.0f; - pDestValues[2] = output[0] / 255.0f; -} - -// static -void IccModule::TranslateScanline(CLcmsCmm* pTransform, - unsigned char* pDest, - const unsigned char* pSrc, - int32_t pixels) { - if (pTransform) - cmsDoTransform(pTransform->transform(), pSrc, pDest, pixels); -} - -} // namespace fxcodec |