summaryrefslogtreecommitdiff
path: root/core/fxcodec
diff options
context:
space:
mode:
authorLei Zhang <thestig@chromium.org>2018-06-29 18:39:50 +0000
committerChromium commit bot <commit-bot@chromium.org>2018-06-29 18:39:50 +0000
commit2895880fa8354b273b4e2b72e61a5b78d1985fa8 (patch)
tree0df028f2ac4a8548df7817246d13f04326bf6bba /core/fxcodec
parentae82b696f236bc5bd1375532bcf867fcc6aa9126 (diff)
downloadpdfium-2895880fa8354b273b4e2b72e61a5b78d1985fa8.tar.xz
Better determine if ICC colorspaces can be used for blending.
Implement CPDF_ColorSpace::IsNormal() and check it when rendering. While IsNormal() is trivial for most colorspaces, it needs to be implemented separately for ICC colorspaces. This fixes a rendering regression from commit 1c0de38c. BUG=chromium:847346 Change-Id: Iaafed3f8ee40b26ac2cbfbdf2251407f7935311b Reviewed-on: https://pdfium-review.googlesource.com/36571 Reviewed-by: Henrique Nakashima <hnakashima@chromium.org> Commit-Queue: Lei Zhang <thestig@chromium.org>
Diffstat (limited to 'core/fxcodec')
-rw-r--r--core/fxcodec/codec/ccodec_iccmodule.h6
-rw-r--r--core/fxcodec/codec/fx_codec_icc.cpp20
2 files changed, 20 insertions, 6 deletions
diff --git a/core/fxcodec/codec/ccodec_iccmodule.h b/core/fxcodec/codec/ccodec_iccmodule.h
index c304b4bb8e..0d60c3fd4a 100644
--- a/core/fxcodec/codec/ccodec_iccmodule.h
+++ b/core/fxcodec/codec/ccodec_iccmodule.h
@@ -22,12 +22,16 @@
class CLcmsCmm {
public:
- CLcmsCmm(int srcComponents, cmsHTRANSFORM transform, bool isLab);
+ CLcmsCmm(int srcComponents,
+ cmsHTRANSFORM transform,
+ bool isLab,
+ bool bNormal);
~CLcmsCmm();
cmsHTRANSFORM m_hTransform;
int m_nSrcComponents;
bool m_bLab;
+ const bool m_bNormal;
};
class CCodec_IccModule {
diff --git a/core/fxcodec/codec/fx_codec_icc.cpp b/core/fxcodec/codec/fx_codec_icc.cpp
index bd98a6efab..0aaaf98075 100644
--- a/core/fxcodec/codec/fx_codec_icc.cpp
+++ b/core/fxcodec/codec/fx_codec_icc.cpp
@@ -31,10 +31,14 @@ bool Check3Components(cmsColorSpaceSignature cs, bool bDst) {
} // namespace
-CLcmsCmm::CLcmsCmm(int srcComponents, cmsHTRANSFORM hTransform, bool isLab)
+CLcmsCmm::CLcmsCmm(int srcComponents,
+ cmsHTRANSFORM hTransform,
+ bool isLab,
+ bool bNormal)
: m_hTransform(hTransform),
m_nSrcComponents(srcComponents),
- m_bLab(isLab) {}
+ m_bLab(isLab),
+ m_bNormal(bNormal) {}
CLcmsCmm::~CLcmsCmm() {
cmsDeleteTransform(m_hTransform);
@@ -60,8 +64,6 @@ std::unique_ptr<CLcmsCmm> CCodec_IccModule::CreateTransform_sRGB(
cmsCloseProfile(srcProfile);
return nullptr;
}
- int srcFormat;
- bool bLab = false;
cmsColorSpaceSignature srcCS = cmsGetColorSpace(srcProfile);
*nSrcComponents = cmsChannelsOf(srcCS);
@@ -72,6 +74,9 @@ std::unique_ptr<CLcmsCmm> CCodec_IccModule::CreateTransform_sRGB(
return nullptr;
}
+ int srcFormat;
+ bool bLab = false;
+ bool bNormal = false;
if (srcCS == cmsSigLabData) {
srcFormat =
COLORSPACE_SH(PT_Lab) | CHANNELS_SH(*nSrcComponents) | BYTES_SH(0);
@@ -79,6 +84,10 @@ std::unique_ptr<CLcmsCmm> CCodec_IccModule::CreateTransform_sRGB(
} 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);
if (!Check3Components(dstCS, true)) {
@@ -110,7 +119,8 @@ std::unique_ptr<CLcmsCmm> CCodec_IccModule::CreateTransform_sRGB(
cmsCloseProfile(dstProfile);
return nullptr;
}
- auto pCmm = pdfium::MakeUnique<CLcmsCmm>(*nSrcComponents, hTransform, bLab);
+ auto pCmm =
+ pdfium::MakeUnique<CLcmsCmm>(*nSrcComponents, hTransform, bLab, bNormal);
cmsCloseProfile(srcProfile);
cmsCloseProfile(dstProfile);
return pCmm;