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

Side by Side Diff: core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp

Issue 534763002: Check m_nComponents when using JBIG2Decode (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: check m_pDict Created 6 years, 3 months 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 | core/src/fpdfapi/fpdf_render/render_int.h » ('j') | 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 "../../../include/fxge/fx_ge.h" 7 #include "../../../include/fxge/fx_ge.h"
8 #include "../../../include/fxcodec/fx_codec.h" 8 #include "../../../include/fxcodec/fx_codec.h"
9 #include "../../../include/fpdfapi/fpdf_module.h" 9 #include "../../../include/fpdfapi/fpdf_module.h"
10 #include "../../../include/fpdfapi/fpdf_render.h" 10 #include "../../../include/fpdfapi/fpdf_render.h"
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
158 } 158 }
159 } 159 }
160 FX_BOOL CPDF_DIBSource::Load(CPDF_Document* pDoc, const CPDF_Stream* pStream, CP DF_DIBSource** ppMask, 160 FX_BOOL CPDF_DIBSource::Load(CPDF_Document* pDoc, const CPDF_Stream* pStream, CP DF_DIBSource** ppMask,
161 FX_DWORD* pMatteColor, CPDF_Dictionary* pFormResour ces, CPDF_Dictionary* pPageResources, FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_B OOL bLoadMask) 161 FX_DWORD* pMatteColor, CPDF_Dictionary* pFormResour ces, CPDF_Dictionary* pPageResources, FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_B OOL bLoadMask)
162 { 162 {
163 if (pStream == NULL) { 163 if (pStream == NULL) {
164 return FALSE; 164 return FALSE;
165 } 165 }
166 m_pDocument = pDoc; 166 m_pDocument = pDoc;
167 m_pDict = pStream->GetDict(); 167 m_pDict = pStream->GetDict();
168 if (m_pDict == NULL) {
169 return FALSE;
170 }
168 m_pStream = pStream; 171 m_pStream = pStream;
169 m_Width = m_pDict->GetInteger(FX_BSTRC("Width")); 172 m_Width = m_pDict->GetInteger(FX_BSTRC("Width"));
170 m_Height = m_pDict->GetInteger(FX_BSTRC("Height")); 173 m_Height = m_pDict->GetInteger(FX_BSTRC("Height"));
171 if (m_Width <= 0 || m_Height <= 0 || m_Width > 0x01ffff || m_Height > 0x01ff ff) { 174 if (m_Width <= 0 || m_Height <= 0 || m_Width > 0x01ffff || m_Height > 0x01ff ff) {
172 return FALSE; 175 return FALSE;
173 } 176 }
174 m_GroupFamily = GroupFamily; 177 m_GroupFamily = GroupFamily;
175 m_bLoadMask = bLoadMask; 178 m_bLoadMask = bLoadMask;
176 if (!LoadColorInfo(m_pStream->GetObjNum() != 0 ? NULL : pFormResources, pPag eResources)) { 179 if (!LoadColorInfo(m_pStream->GetObjNum() != 0 ? NULL : pFormResources, pPag eResources)) {
177 return FALSE; 180 return FALSE;
178 } 181 }
179
180 if (m_bpc == 0 || m_nComponents == 0) { 182 if (m_bpc == 0 || m_nComponents == 0) {
181 return FALSE; 183 return FALSE;
182 } 184 }
183
184 FX_SAFE_DWORD src_pitch = m_bpc; 185 FX_SAFE_DWORD src_pitch = m_bpc;
185 src_pitch *= m_nComponents; 186 src_pitch *= m_nComponents;
186 src_pitch *= m_Width; 187 src_pitch *= m_Width;
187 src_pitch += 7; 188 src_pitch += 7;
188 src_pitch /= 8; 189 src_pitch /= 8;
189 src_pitch *= m_Height; 190 src_pitch *= m_Height;
190 if (!src_pitch.IsValid()) { 191 if (!src_pitch.IsValid()) {
191 return FALSE; 192 return FALSE;
192 } 193 }
193
194 m_pStreamAcc = FX_NEW CPDF_StreamAcc; 194 m_pStreamAcc = FX_NEW CPDF_StreamAcc;
195 m_pStreamAcc->LoadAllData(pStream, FALSE, src_pitch.ValueOrDie(), TRUE); 195 m_pStreamAcc->LoadAllData(pStream, FALSE, src_pitch.ValueOrDie(), TRUE);
196 if (m_pStreamAcc->GetSize() == 0 || m_pStreamAcc->GetData() == NULL) { 196 if (m_pStreamAcc->GetSize() == 0 || m_pStreamAcc->GetData() == NULL) {
197 return FALSE; 197 return FALSE;
198 } 198 }
199 const CFX_ByteString& decoder = m_pStreamAcc->GetImageDecoder(); 199 const CFX_ByteString& decoder = m_pStreamAcc->GetImageDecoder();
200 if (!decoder.IsEmpty() && decoder == FX_BSTRC("CCITTFaxDecode")) { 200 if (!decoder.IsEmpty() && decoder == FX_BSTRC("CCITTFaxDecode")) {
201 m_bpc = 1; 201 m_bpc = 1;
202 } 202 }
203 if (!CreateDecoder()) { 203 if (!CreateDecoder()) {
204 return FALSE; 204 return FALSE;
205 } 205 }
206 if (m_bImageMask) { 206 if (m_bImageMask) {
207 m_bpp = 1; 207 m_bpp = 1;
208 m_bpc = 1; 208 m_bpc = 1;
209 m_nComponents = 1; 209 m_nComponents = 1;
210 m_AlphaFlag = 1; 210 m_AlphaFlag = 1;
211 } else if (m_bpc * m_nComponents == 1) { 211 } else if (m_bpc * m_nComponents == 1) {
212 m_bpp = 1; 212 m_bpp = 1;
213 } else if (m_bpc * m_nComponents <= 8) { 213 } else if (m_bpc * m_nComponents <= 8) {
214 m_bpp = 8; 214 m_bpp = 8;
215 } else { 215 } else {
216 m_bpp = 24; 216 m_bpp = 24;
217 } 217 }
218
219 FX_SAFE_DWORD pitch = m_Width; 218 FX_SAFE_DWORD pitch = m_Width;
220 pitch *= m_bpp; 219 pitch *= m_bpp;
221 pitch += 31; 220 pitch += 31;
222 pitch /= 8; 221 pitch /= 8;
223 if (!pitch.IsValid()) { 222 if (!pitch.IsValid()) {
224 return FALSE; 223 return FALSE;
225 } 224 }
226
227 m_pLineBuf = FX_Alloc(FX_BYTE, pitch.ValueOrDie()); 225 m_pLineBuf = FX_Alloc(FX_BYTE, pitch.ValueOrDie());
228 if (m_pColorSpace && bStdCS) { 226 if (m_pColorSpace && bStdCS) {
229 m_pColorSpace->EnableStdConversion(TRUE); 227 m_pColorSpace->EnableStdConversion(TRUE);
230 } 228 }
231 LoadPalette(); 229 LoadPalette();
232 if (m_bColorKey) { 230 if (m_bColorKey) {
233 m_bpp = 32; 231 m_bpp = 32;
234 m_AlphaFlag = 2; 232 m_AlphaFlag = 2;
235 pitch = m_Width; 233 pitch = m_Width;
236 pitch *= m_bpp; 234 pitch *= m_bpp;
237 pitch += 31; 235 pitch += 31;
238 pitch /= 8; 236 pitch /= 8;
239 if (!pitch.IsValid()) { 237 if (!pitch.IsValid()) {
240 return FALSE; 238 return FALSE;
241 } 239 }
242
243 m_pMaskedLine = FX_Alloc(FX_BYTE, pitch.ValueOrDie()); 240 m_pMaskedLine = FX_Alloc(FX_BYTE, pitch.ValueOrDie());
244 } 241 }
245 m_Pitch = pitch.ValueOrDie(); 242 m_Pitch = pitch.ValueOrDie();
246 if (ppMask) { 243 if (ppMask) {
247 *ppMask = LoadMask(*pMatteColor); 244 *ppMask = LoadMask(*pMatteColor);
248 } 245 }
249 if (m_pColorSpace && bStdCS) { 246 if (m_pColorSpace && bStdCS) {
250 m_pColorSpace->EnableStdConversion(FALSE); 247 m_pColorSpace->EnableStdConversion(FALSE);
251 } 248 }
252 return TRUE; 249 return TRUE;
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
310 m_Width = m_pDict->GetInteger(FX_BSTRC("Width")); 307 m_Width = m_pDict->GetInteger(FX_BSTRC("Width"));
311 m_Height = m_pDict->GetInteger(FX_BSTRC("Height")); 308 m_Height = m_pDict->GetInteger(FX_BSTRC("Height"));
312 if (m_Width <= 0 || m_Height <= 0 || m_Width > 0x01ffff || m_Height > 0x01ff ff) { 309 if (m_Width <= 0 || m_Height <= 0 || m_Width > 0x01ffff || m_Height > 0x01ff ff) {
313 return 0; 310 return 0;
314 } 311 }
315 m_GroupFamily = GroupFamily; 312 m_GroupFamily = GroupFamily;
316 m_bLoadMask = bLoadMask; 313 m_bLoadMask = bLoadMask;
317 if (!LoadColorInfo(m_pStream->GetObjNum() != 0 ? NULL : pFormResources, pPag eResources)) { 314 if (!LoadColorInfo(m_pStream->GetObjNum() != 0 ? NULL : pFormResources, pPag eResources)) {
318 return 0; 315 return 0;
319 } 316 }
320
321 if (m_bpc == 0 || m_nComponents == 0) { 317 if (m_bpc == 0 || m_nComponents == 0) {
322 return 0; 318 return 0;
323 } 319 }
324
325 FX_SAFE_DWORD src_pitch = m_bpc; 320 FX_SAFE_DWORD src_pitch = m_bpc;
326 src_pitch *= m_nComponents; 321 src_pitch *= m_nComponents;
327 src_pitch *= m_Width; 322 src_pitch *= m_Width;
328 src_pitch += 7; 323 src_pitch += 7;
329 src_pitch /= 8; 324 src_pitch /= 8;
330 src_pitch *= m_Height; 325 src_pitch *= m_Height;
331 if (!src_pitch.IsValid()) { 326 if (!src_pitch.IsValid()) {
332 return 0; 327 return 0;
333 } 328 }
334
335 m_pStreamAcc = FX_NEW CPDF_StreamAcc; 329 m_pStreamAcc = FX_NEW CPDF_StreamAcc;
336 m_pStreamAcc->LoadAllData(pStream, FALSE, src_pitch.ValueOrDie(), TRUE); 330 m_pStreamAcc->LoadAllData(pStream, FALSE, src_pitch.ValueOrDie(), TRUE);
337 if (m_pStreamAcc->GetSize() == 0 || m_pStreamAcc->GetData() == NULL) { 331 if (m_pStreamAcc->GetSize() == 0 || m_pStreamAcc->GetData() == NULL) {
338 return 0; 332 return 0;
339 } 333 }
340 const CFX_ByteString& decoder = m_pStreamAcc->GetImageDecoder(); 334 const CFX_ByteString& decoder = m_pStreamAcc->GetImageDecoder();
341 if (!decoder.IsEmpty() && decoder == FX_BSTRC("CCITTFaxDecode")) {
342 m_bpc = 1;
343 }
344 int ret = CreateDecoder(); 335 int ret = CreateDecoder();
345 if (ret != 1) { 336 if (ret != 1) {
346 if (!ret) { 337 if (!ret) {
347 return ret; 338 return ret;
348 } 339 }
349 if (!ContinueToLoadMask()) { 340 if (!ContinueToLoadMask()) {
350 return 0; 341 return 0;
351 } 342 }
352 if (m_bHasMask) { 343 if (m_bHasMask) {
353 StratLoadMask(); 344 StratLoadMask();
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
444 } 435 }
445 return ret1; 436 return ret1;
446 } else if (m_Status == 2) { 437 } else if (m_Status == 2) {
447 return ContinueLoadMaskDIB(pPause); 438 return ContinueLoadMaskDIB(pPause);
448 } 439 }
449 return 0; 440 return 0;
450 } 441 }
451 FX_BOOL CPDF_DIBSource::LoadColorInfo(CPDF_Dictionary* pFormResources, CPDF_Dict ionary* pPageResources) 442 FX_BOOL CPDF_DIBSource::LoadColorInfo(CPDF_Dictionary* pFormResources, CPDF_Dict ionary* pPageResources)
452 { 443 {
453 m_bpc_orig = m_pDict->GetInteger(FX_BSTRC("BitsPerComponent")); 444 m_bpc_orig = m_pDict->GetInteger(FX_BSTRC("BitsPerComponent"));
454 ValidateBpc();
455 if (m_pDict->GetInteger("ImageMask")) { 445 if (m_pDict->GetInteger("ImageMask")) {
456 m_bImageMask = TRUE; 446 m_bImageMask = TRUE;
457 } 447 }
458 if (m_bImageMask || !m_pDict->KeyExist(FX_BSTRC("ColorSpace"))) { 448 if (m_bImageMask || !m_pDict->KeyExist(FX_BSTRC("ColorSpace"))) {
459 if (!m_bImageMask) { 449 if (!m_bImageMask) {
460 CPDF_Object* pFilter = m_pDict->GetElementValue(FX_BSTRC("Filter")); 450 CPDF_Object* pFilter = m_pDict->GetElementValue(FX_BSTRC("Filter"));
461 if (pFilter) { 451 if (pFilter) {
462 CFX_ByteString filter; 452 CFX_ByteString filter;
463 if (pFilter->GetType() == PDFOBJ_NAME) { 453 if (pFilter->GetType() == PDFOBJ_NAME) {
464 filter = pFilter->GetString(); 454 filter = pFilter->GetString();
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
498 if (m_Family == PDFCS_ICCBASED && pCSObj->GetType() == PDFOBJ_NAME) { 488 if (m_Family == PDFCS_ICCBASED && pCSObj->GetType() == PDFOBJ_NAME) {
499 CFX_ByteString cs = pCSObj->GetString(); 489 CFX_ByteString cs = pCSObj->GetString();
500 if (cs == FX_BSTRC("DeviceGray")) { 490 if (cs == FX_BSTRC("DeviceGray")) {
501 m_nComponents = 1; 491 m_nComponents = 1;
502 } else if (cs == FX_BSTRC("DeviceRGB")) { 492 } else if (cs == FX_BSTRC("DeviceRGB")) {
503 m_nComponents = 3; 493 m_nComponents = 3;
504 } else if (cs == FX_BSTRC("DeviceCMYK")) { 494 } else if (cs == FX_BSTRC("DeviceCMYK")) {
505 m_nComponents = 4; 495 m_nComponents = 4;
506 } 496 }
507 } 497 }
498 ValidateDictParam();
508 m_pCompData = FX_Alloc(DIB_COMP_DATA, m_nComponents); 499 m_pCompData = FX_Alloc(DIB_COMP_DATA, m_nComponents);
509 if (m_bpc == 0) { 500 if (m_bpc == 0) {
510 return TRUE; 501 return TRUE;
511 } 502 }
512 int max_data = (1 << m_bpc) - 1; 503 int max_data = (1 << m_bpc) - 1;
513 CPDF_Array* pDecode = m_pDict->GetArray(FX_BSTRC("Decode")); 504 CPDF_Array* pDecode = m_pDict->GetArray(FX_BSTRC("Decode"));
514 if (pDecode) { 505 if (pDecode) {
515 for (FX_DWORD i = 0; i < m_nComponents; i ++) { 506 for (FX_DWORD i = 0; i < m_nComponents; i ++) {
516 m_pCompData[i].m_DecodeMin = pDecode->GetNumber(i * 2); 507 m_pCompData[i].m_DecodeMin = pDecode->GetNumber(i * 2);
517 FX_FLOAT max = pDecode->GetNumber(i * 2 + 1); 508 FX_FLOAT max = pDecode->GetNumber(i * 2 + 1);
(...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after
908 } 899 }
909 m_pColorSpace->GetRGB(temp_buf, R, G, B); 900 m_pColorSpace->GetRGB(temp_buf, R, G, B);
910 FX_Free(temp_buf); 901 FX_Free(temp_buf);
911 } else { 902 } else {
912 m_pColorSpace->GetRGB(color_value, R, G, B); 903 m_pColorSpace->GetRGB(color_value, R, G, B);
913 } 904 }
914 SetPaletteArgb(i, ArgbEncode(255, FXSYS_round(R * 255), FXSYS_round( G * 255), FXSYS_round(B * 255))); 905 SetPaletteArgb(i, ArgbEncode(255, FXSYS_round(R * 255), FXSYS_round( G * 255), FXSYS_round(B * 255)));
915 } 906 }
916 } 907 }
917 } 908 }
918 void CPDF_DIBSource::ValidateBpc() 909 void CPDF_DIBSource::ValidateDictParam()
919 { 910 {
920 m_bpc = m_bpc_orig; 911 m_bpc = m_bpc_orig;
921 » CPDF_Object * pFilter = m_pDict ? m_pDict->GetElementValue(FX_BSTRC("Fil ter")) : NULL; 912 » CPDF_Object * pFilter = m_pDict->GetElementValue(FX_BSTRC("Filter"));
922 if (pFilter) { 913 if (pFilter) {
923 if (pFilter->GetType() == PDFOBJ_NAME) { 914 if (pFilter->GetType() == PDFOBJ_NAME) {
924 CFX_ByteString filter = pFilter->GetString(); 915 CFX_ByteString filter = pFilter->GetString();
925 if (filter == FX_BSTRC("CCITTFaxDecode") || filter == FX_BSTRC("JBIG 2Decode")) { 916 if (filter == FX_BSTRC("CCITTFaxDecode") || filter == FX_BSTRC("JBIG 2Decode")) {
926 m_bpc = 1; 917 m_bpc = 1;
918 m_nComponents = 1;
927 } 919 }
928 if (filter == FX_BSTRC("RunLengthDecode") || filter == FX_BSTRC("DCT Decode")) { 920 if (filter == FX_BSTRC("RunLengthDecode") || filter == FX_BSTRC("DCT Decode")) {
929 m_bpc = 8; 921 m_bpc = 8;
930 } 922 }
931 } else if (pFilter->GetType() == PDFOBJ_ARRAY) { 923 } else if (pFilter->GetType() == PDFOBJ_ARRAY) {
932 CPDF_Array *pArray = (CPDF_Array *)pFilter; 924 CPDF_Array *pArray = (CPDF_Array *)pFilter;
933 if (pArray->GetString(pArray->GetCount() - 1) == FX_BSTRC("CCITTFacD ecode") || 925 if (pArray->GetString(pArray->GetCount() - 1) == FX_BSTRC("CCITTFacD ecode") ||
934 pArray->GetString(pArray->GetCount() - 1) == FX_BSTRC("JBIG2 Decode")) { 926 pArray->GetString(pArray->GetCount() - 1) == FX_BSTRC("JBIG2 Decode")) {
935 m_bpc = 1; 927 m_bpc = 1;
928 m_nComponents = 1;
936 } 929 }
937 if (pArray->GetString(pArray->GetCount() - 1) == FX_BSTRC("RunLength Decode") || 930 if (pArray->GetString(pArray->GetCount() - 1) == FX_BSTRC("RunLength Decode") ||
938 pArray->GetString(pArray->GetCount() - 1) == FX_BSTRC("DCTDe code")) { 931 pArray->GetString(pArray->GetCount() - 1) == FX_BSTRC("DCTDe code")) {
939 m_bpc = 8; 932 m_bpc = 8;
940 } 933 }
941 } 934 }
942 } 935 }
943 if (m_bpc != 1 && m_bpc != 2 && m_bpc != 4 && m_bpc != 8 && m_bpc != 16) { 936 if (m_bpc != 1 && m_bpc != 2 && m_bpc != 4 && m_bpc != 8 && m_bpc != 16) {
944 m_bpc = 0; 937 m_bpc = 0;
945 } 938 }
(...skipping 606 matching lines...) Expand 10 before | Expand all | Expand 10 after
1552 if (!m_bCached) { 1545 if (!m_bCached) {
1553 if (m_pBitmap) { 1546 if (m_pBitmap) {
1554 delete m_pBitmap; 1547 delete m_pBitmap;
1555 m_pBitmap = NULL; 1548 m_pBitmap = NULL;
1556 } 1549 }
1557 if (m_pMask) { 1550 if (m_pMask) {
1558 delete m_pMask; 1551 delete m_pMask;
1559 } 1552 }
1560 } 1553 }
1561 } 1554 }
OLDNEW
« no previous file with comments | « no previous file | core/src/fpdfapi/fpdf_render/render_int.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698