Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(679)

Side by Side Diff: core/fxcodec/codec/fx_codec_icc.cpp

Issue 2535663005: M55: pdfium: Fix inconsistent number of color components of ICC profile (Closed)
Patch Set: Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "core/fxcodec/codec/codec_int.h" 7 #include "core/fxcodec/codec/codec_int.h"
8 #include "core/fxcodec/fx_codec.h" 8 #include "core/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
11 const uint32_t N_COMPONENT_LAB = 3;
12 const uint32_t N_COMPONENT_GRAY = 1;
13 const uint32_t N_COMPONENT_RGB = 3;
14 const uint32_t N_COMPONENT_CMYK = 4;
15 const uint32_t N_COMPONENT_DEFAULT = 3;
16
17 struct CLcmsCmm { 11 struct CLcmsCmm {
18 cmsHTRANSFORM m_hTransform; 12 cmsHTRANSFORM m_hTransform;
19 int m_nSrcComponents; 13 int m_nSrcComponents;
20 int m_nDstComponents; 14 int m_nDstComponents;
21 FX_BOOL m_bLab; 15 FX_BOOL m_bLab;
22 }; 16 };
23 FX_BOOL CheckComponents(cmsColorSpaceSignature cs, 17 FX_BOOL CheckComponents(cmsColorSpaceSignature cs,
24 int nComponents, 18 int nComponents,
25 FX_BOOL bDst) { 19 FX_BOOL bDst) {
26 if (nComponents <= 0 || nComponents > 15) { 20 if (nComponents <= 0 || nComponents > 15) {
(...skipping 25 matching lines...) Expand all
52 break; 46 break;
53 default: 47 default:
54 if (nComponents != 3) { 48 if (nComponents != 3) {
55 return FALSE; 49 return FALSE;
56 } 50 }
57 break; 51 break;
58 } 52 }
59 return TRUE; 53 return TRUE;
60 } 54 }
61 55
62 uint32_t GetCSComponents(cmsColorSpaceSignature cs) {
63 uint32_t components;
64 switch (cs) {
65 case cmsSigLabData:
66 components = N_COMPONENT_LAB;
67 break;
68 case cmsSigGrayData:
69 components = N_COMPONENT_GRAY;
70 break;
71 case cmsSigRgbData:
72 components = N_COMPONENT_RGB;
73 break;
74 case cmsSigCmykData:
75 components = N_COMPONENT_CMYK;
76 break;
77 default:
78 components = N_COMPONENT_DEFAULT;
79 break;
80 }
81 return components;
82 }
83
84 void* IccLib_CreateTransform(const unsigned char* pSrcProfileData, 56 void* IccLib_CreateTransform(const unsigned char* pSrcProfileData,
85 uint32_t dwSrcProfileSize, 57 uint32_t dwSrcProfileSize,
86 uint32_t& nSrcComponents, 58 uint32_t& nSrcComponents,
87 const unsigned char* pDstProfileData, 59 const unsigned char* pDstProfileData,
88 uint32_t dwDstProfileSize, 60 uint32_t dwDstProfileSize,
89 int32_t nDstComponents, 61 int32_t nDstComponents,
90 int intent, 62 int intent,
91 uint32_t dwSrcFormat = Icc_FORMAT_DEFAULT, 63 uint32_t dwSrcFormat = Icc_FORMAT_DEFAULT,
92 uint32_t dwDstFormat = Icc_FORMAT_DEFAULT) { 64 uint32_t dwDstFormat = Icc_FORMAT_DEFAULT) {
93 nSrcComponents = 0; 65 nSrcComponents = 0;
94 cmsHPROFILE srcProfile = 66 cmsHPROFILE srcProfile =
95 cmsOpenProfileFromMem((void*)pSrcProfileData, dwSrcProfileSize); 67 cmsOpenProfileFromMem((void*)pSrcProfileData, dwSrcProfileSize);
96 if (!srcProfile) 68 if (!srcProfile)
97 return nullptr; 69 return nullptr;
98 70
99 cmsHPROFILE dstProfile; 71 cmsHPROFILE dstProfile;
100 if (!pDstProfileData && dwDstProfileSize == 0 && nDstComponents == 3) { 72 if (!pDstProfileData && dwDstProfileSize == 0 && nDstComponents == 3) {
101 dstProfile = cmsCreate_sRGBProfile(); 73 dstProfile = cmsCreate_sRGBProfile();
102 } else { 74 } else {
103 dstProfile = 75 dstProfile =
104 cmsOpenProfileFromMem((void*)pDstProfileData, dwDstProfileSize); 76 cmsOpenProfileFromMem((void*)pDstProfileData, dwDstProfileSize);
105 } 77 }
106 if (!dstProfile) { 78 if (!dstProfile) {
107 cmsCloseProfile(srcProfile); 79 cmsCloseProfile(srcProfile);
108 return nullptr; 80 return nullptr;
109 } 81 }
110 int srcFormat; 82 int srcFormat;
111 FX_BOOL bLab = FALSE; 83 FX_BOOL bLab = FALSE;
112 cmsColorSpaceSignature srcCS = cmsGetColorSpace(srcProfile); 84 cmsColorSpaceSignature srcCS = cmsGetColorSpace(srcProfile);
113 nSrcComponents = GetCSComponents(srcCS); 85
86 nSrcComponents = cmsChannelsOf(srcCS);
87 // According to PDF spec, number of components must be 1, 3, or 4.
88 if (nSrcComponents != 1 && nSrcComponents != 3 && nSrcComponents != 4) {
89 cmsCloseProfile(srcProfile);
90 cmsCloseProfile(dstProfile);
91 return nullptr;
92 }
93
114 if (srcCS == cmsSigLabData) { 94 if (srcCS == cmsSigLabData) {
115 srcFormat = 95 srcFormat =
116 COLORSPACE_SH(PT_Lab) | CHANNELS_SH(nSrcComponents) | BYTES_SH(0); 96 COLORSPACE_SH(PT_Lab) | CHANNELS_SH(nSrcComponents) | BYTES_SH(0);
117 bLab = TRUE; 97 bLab = TRUE;
118 } else { 98 } else {
119 srcFormat = 99 srcFormat =
120 COLORSPACE_SH(PT_ANY) | CHANNELS_SH(nSrcComponents) | BYTES_SH(1); 100 COLORSPACE_SH(PT_ANY) | CHANNELS_SH(nSrcComponents) | BYTES_SH(1);
121 if (srcCS == cmsSigRgbData && T_DOSWAP(dwSrcFormat)) { 101 if (srcCS == cmsSigRgbData && T_DOSWAP(dwSrcFormat)) {
122 srcFormat |= DOSWAP_SH(1); 102 srcFormat |= DOSWAP_SH(1);
123 } 103 }
(...skipping 1557 matching lines...) Expand 10 before | Expand all | Expand 10 after
1681 ASSERT(k1 == FXSYS_round(k * 255)); 1661 ASSERT(k1 == FXSYS_round(k * 255));
1682 1662
1683 uint8_t r, g, b; 1663 uint8_t r, g, b;
1684 AdobeCMYK_to_sRGB1(c1, m1, y1, k1, r, g, b); 1664 AdobeCMYK_to_sRGB1(c1, m1, y1, k1, r, g, b);
1685 // Multiply by a constant rather than dividing because division is much 1665 // Multiply by a constant rather than dividing because division is much
1686 // more expensive. 1666 // more expensive.
1687 R = r * (1.0f / 255); 1667 R = r * (1.0f / 255);
1688 G = g * (1.0f / 255); 1668 G = g * (1.0f / 255);
1689 B = b * (1.0f / 255); 1669 B = b * (1.0f / 255);
1690 } 1670 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698