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

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

Issue 1507043004: Cleanup CPDF_DIBSource::LoadColorInfo() and ValidateDictParam(). (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: rebase Created 5 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 | « core/src/fpdfapi/fpdf_page/pageint.h ('k') | 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 "render_int.h" 7 #include "render_int.h"
8 8
9 #include <vector> 9 #include <vector>
10 10
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
52 52
53 FX_SAFE_DWORD CalculatePitch32(int bpp, int width) { 53 FX_SAFE_DWORD CalculatePitch32(int bpp, int width) {
54 FX_SAFE_DWORD pitch = bpp; 54 FX_SAFE_DWORD pitch = bpp;
55 pitch *= width; 55 pitch *= width;
56 pitch += 31; 56 pitch += 31;
57 pitch /= 32; // quantized to number of 32-bit words. 57 pitch /= 32; // quantized to number of 32-bit words.
58 pitch *= 4; // and then back to bytes, (not just /8 in one step). 58 pitch *= 4; // and then back to bytes, (not just /8 in one step).
59 return pitch; 59 return pitch;
60 } 60 }
61 61
62 bool IsAllowedBPCValue(int bpc) {
63 return bpc == 1 || bpc == 2 || bpc == 4 || bpc == 8 || bpc == 16;
64 }
65
62 // Wrapper class to use with nonstd::unique_ptr for CJPX_Decoder. 66 // Wrapper class to use with nonstd::unique_ptr for CJPX_Decoder.
63 class JpxBitMapContext { 67 class JpxBitMapContext {
64 public: 68 public:
65 explicit JpxBitMapContext(ICodec_JpxModule* jpx_module) 69 explicit JpxBitMapContext(ICodec_JpxModule* jpx_module)
66 : jpx_module_(jpx_module), decoder_(nullptr) {} 70 : jpx_module_(jpx_module), decoder_(nullptr) {}
67 71
68 ~JpxBitMapContext() { 72 ~JpxBitMapContext() {
69 jpx_module_->DestroyDecoder(decoder_); 73 jpx_module_->DestroyDecoder(decoder_);
70 } 74 }
71 75
(...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after
458 if (m_pColorSpace && m_bStdCS) { 462 if (m_pColorSpace && m_bStdCS) {
459 m_pColorSpace->EnableStdConversion(FALSE); 463 m_pColorSpace->EnableStdConversion(FALSE);
460 } 464 }
461 return ret1; 465 return ret1;
462 } 466 }
463 if (m_Status == 2) { 467 if (m_Status == 2) {
464 return ContinueLoadMaskDIB(pPause); 468 return ContinueLoadMaskDIB(pPause);
465 } 469 }
466 return 0; 470 return 0;
467 } 471 }
468 FX_BOOL CPDF_DIBSource::LoadColorInfo(CPDF_Dictionary* pFormResources, 472
469 CPDF_Dictionary* pPageResources) { 473 bool CPDF_DIBSource::LoadColorInfo(const CPDF_Dictionary* pFormResources,
470 m_bpc_orig = m_pDict->GetInteger(FX_BSTRC("BitsPerComponent")); 474 const CPDF_Dictionary* pPageResources) {
471 if (m_pDict->GetInteger("ImageMask")) { 475 m_bpc_orig = m_pDict->GetInteger("BitsPerComponent");
476 if (m_pDict->GetInteger("ImageMask"))
472 m_bImageMask = TRUE; 477 m_bImageMask = TRUE;
473 } 478
474 if (m_bImageMask || !m_pDict->KeyExist(FX_BSTRC("ColorSpace"))) { 479 if (m_bImageMask || !m_pDict->KeyExist("ColorSpace")) {
475 if (!m_bImageMask) { 480 if (!m_bImageMask) {
476 CPDF_Object* pFilter = m_pDict->GetElementValue(FX_BSTRC("Filter")); 481 CPDF_Object* pFilter = m_pDict->GetElementValue("Filter");
477 if (pFilter) { 482 if (pFilter) {
478 CFX_ByteString filter; 483 CFX_ByteString filter;
479 if (pFilter->IsName()) { 484 if (pFilter->IsName()) {
480 filter = pFilter->GetString(); 485 filter = pFilter->GetString();
481 if (filter == FX_BSTRC("JPXDecode")) {
482 m_bDoBpcCheck = FALSE;
483 return TRUE;
484 }
485 } else if (CPDF_Array* pArray = pFilter->AsArray()) { 486 } else if (CPDF_Array* pArray = pFilter->AsArray()) {
486 if (pArray->GetString(pArray->GetCount() - 1) == 487 filter = pArray->GetString(pArray->GetCount() - 1);
487 FX_BSTRC("JPXDecode")) { 488 }
488 m_bDoBpcCheck = FALSE; 489
489 return TRUE; 490 if (filter == FX_BSTRC("JPXDecode")) {
490 } 491 m_bDoBpcCheck = FALSE;
492 return true;
491 } 493 }
492 } 494 }
493 } 495 }
494 m_bImageMask = TRUE; 496 m_bImageMask = TRUE;
495 m_bpc = m_nComponents = 1; 497 m_bpc = m_nComponents = 1;
496 CPDF_Array* pDecode = m_pDict->GetArray(FX_BSTRC("Decode")); 498 CPDF_Array* pDecode = m_pDict->GetArray("Decode");
497 m_bDefaultDecode = pDecode == NULL || pDecode->GetInteger(0) == 0; 499 m_bDefaultDecode = !pDecode || !pDecode->GetInteger(0);
498 return TRUE; 500 return true;
499 } 501 }
500 CPDF_Object* pCSObj = m_pDict->GetElementValue(FX_BSTRC("ColorSpace")); 502
501 if (pCSObj == NULL) { 503 CPDF_Object* pCSObj = m_pDict->GetElementValue("ColorSpace");
502 return FALSE; 504 if (!pCSObj)
503 } 505 return false;
506
504 CPDF_DocPageData* pDocPageData = m_pDocument->GetPageData(); 507 CPDF_DocPageData* pDocPageData = m_pDocument->GetPageData();
505 if (pFormResources) { 508 if (pFormResources)
506 m_pColorSpace = pDocPageData->GetColorSpace(pCSObj, pFormResources); 509 m_pColorSpace = pDocPageData->GetColorSpace(pCSObj, pFormResources);
507 } 510 if (!m_pColorSpace)
508 if (m_pColorSpace == NULL) {
509 m_pColorSpace = pDocPageData->GetColorSpace(pCSObj, pPageResources); 511 m_pColorSpace = pDocPageData->GetColorSpace(pCSObj, pPageResources);
510 } 512 if (!m_pColorSpace)
511 if (m_pColorSpace == NULL) { 513 return false;
512 return FALSE; 514
513 }
514 m_Family = m_pColorSpace->GetFamily(); 515 m_Family = m_pColorSpace->GetFamily();
515 m_nComponents = m_pColorSpace->CountComponents(); 516 m_nComponents = m_pColorSpace->CountComponents();
516 if (m_Family == PDFCS_ICCBASED && pCSObj->IsName()) { 517 if (m_Family == PDFCS_ICCBASED && pCSObj->IsName()) {
517 CFX_ByteString cs = pCSObj->GetString(); 518 CFX_ByteString cs = pCSObj->GetString();
518 if (cs == FX_BSTRC("DeviceGray")) { 519 if (cs == "DeviceGray") {
519 m_nComponents = 1; 520 m_nComponents = 1;
520 } else if (cs == FX_BSTRC("DeviceRGB")) { 521 } else if (cs == "DeviceRGB") {
521 m_nComponents = 3; 522 m_nComponents = 3;
522 } else if (cs == FX_BSTRC("DeviceCMYK")) { 523 } else if (cs == "DeviceCMYK") {
523 m_nComponents = 4; 524 m_nComponents = 4;
524 } 525 }
525 } 526 }
526 ValidateDictParam(); 527 ValidateDictParam();
527 m_pCompData = GetDecodeAndMaskArray(m_bDefaultDecode, m_bColorKey); 528 m_pCompData = GetDecodeAndMaskArray(m_bDefaultDecode, m_bColorKey);
528 if (m_pCompData == NULL) { 529 return !!m_pCompData;
529 return FALSE;
530 }
531 return TRUE;
532 } 530 }
531
533 DIB_COMP_DATA* CPDF_DIBSource::GetDecodeAndMaskArray(FX_BOOL& bDefaultDecode, 532 DIB_COMP_DATA* CPDF_DIBSource::GetDecodeAndMaskArray(FX_BOOL& bDefaultDecode,
534 FX_BOOL& bColorKey) { 533 FX_BOOL& bColorKey) {
535 if (m_pColorSpace == NULL) { 534 if (m_pColorSpace == NULL) {
536 return NULL; 535 return NULL;
537 } 536 }
538 DIB_COMP_DATA* pCompData = FX_Alloc(DIB_COMP_DATA, m_nComponents); 537 DIB_COMP_DATA* pCompData = FX_Alloc(DIB_COMP_DATA, m_nComponents);
539 int max_data = (1 << m_bpc) - 1; 538 int max_data = (1 << m_bpc) - 1;
540 CPDF_Array* pDecode = m_pDict->GetArray(FX_BSTRC("Decode")); 539 CPDF_Array* pDecode = m_pDict->GetArray(FX_BSTRC("Decode"));
541 if (pDecode) { 540 if (pDecode) {
542 for (FX_DWORD i = 0; i < m_nComponents; i++) { 541 for (FX_DWORD i = 0; i < m_nComponents; i++) {
(...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after
917 m_pColorSpace->GetRGB(temp_buf, R, G, B); 916 m_pColorSpace->GetRGB(temp_buf, R, G, B);
918 FX_Free(temp_buf); 917 FX_Free(temp_buf);
919 } else { 918 } else {
920 m_pColorSpace->GetRGB(color_value, R, G, B); 919 m_pColorSpace->GetRGB(color_value, R, G, B);
921 } 920 }
922 SetPaletteArgb(i, ArgbEncode(255, FXSYS_round(R * 255), 921 SetPaletteArgb(i, ArgbEncode(255, FXSYS_round(R * 255),
923 FXSYS_round(G * 255), FXSYS_round(B * 255))); 922 FXSYS_round(G * 255), FXSYS_round(B * 255)));
924 } 923 }
925 } 924 }
926 } 925 }
926
927 void CPDF_DIBSource::ValidateDictParam() { 927 void CPDF_DIBSource::ValidateDictParam() {
928 m_bpc = m_bpc_orig; 928 m_bpc = m_bpc_orig;
929 CPDF_Object* pFilter = m_pDict->GetElementValue(FX_BSTRC("Filter")); 929 CPDF_Object* pFilter = m_pDict->GetElementValue("Filter");
930 if (pFilter) { 930 if (pFilter) {
931 if (pFilter->IsName()) { 931 if (pFilter->IsName()) {
932 CFX_ByteString filter = pFilter->GetString(); 932 CFX_ByteString filter = pFilter->GetString();
933 if (filter == FX_BSTRC("CCITTFaxDecode") || 933 if (filter == "CCITTFaxDecode" || filter == "JBIG2Decode") {
934 filter == FX_BSTRC("JBIG2Decode")) {
935 m_bpc = 1; 934 m_bpc = 1;
936 m_nComponents = 1; 935 m_nComponents = 1;
937 } 936 } else if (filter == "RunLengthDecode") {
938 if (filter == FX_BSTRC("RunLengthDecode")) {
939 if (m_bpc != 1) { 937 if (m_bpc != 1) {
940 m_bpc = 8; 938 m_bpc = 8;
941 } 939 }
942 } else if (filter == FX_BSTRC("DCTDecode")) { 940 } else if (filter == "DCTDecode") {
943 m_bpc = 8; 941 m_bpc = 8;
944 } 942 }
945 } else if (CPDF_Array* pArray = pFilter->AsArray()) { 943 } else if (CPDF_Array* pArray = pFilter->AsArray()) {
946 if (pArray->GetString(pArray->GetCount() - 1) == 944 CFX_ByteString filter = pArray->GetString(pArray->GetCount() - 1);
947 FX_BSTRC("CCITTFaxDecode") || 945 if (filter == "CCITTFaxDecode" || filter == "JBIG2Decode") {
948 pArray->GetString(pArray->GetCount() - 1) ==
949 FX_BSTRC("JBIG2Decode")) {
950 m_bpc = 1; 946 m_bpc = 1;
951 m_nComponents = 1; 947 m_nComponents = 1;
952 } 948 } else if (filter == "DCTDecode") {
953 if (pArray->GetString(pArray->GetCount() - 1) == FX_BSTRC("DCTDecode")) { 949 // Previously, filter == "RunLengthDecode" was checked in the "if"
954 // Previously, pArray->GetString(pArray->GetCount() - 1) == 950 // statement as well, but too many documents don't conform to it.
955 // FX_BSTRC("RunLengthDecode") was checked in the "if" statement as
956 // well,
957 // but too many documents don't conform to it.
958 m_bpc = 8; 951 m_bpc = 8;
959 } 952 }
960 } 953 }
961 } 954 }
962 if (m_bpc != 1 && m_bpc != 2 && m_bpc != 4 && m_bpc != 8 && m_bpc != 16) { 955
956 if (!IsAllowedBPCValue(m_bpc))
963 m_bpc = 0; 957 m_bpc = 0;
964 }
965 } 958 }
959
966 #define NORMALCOLOR_MAX(color, max) \ 960 #define NORMALCOLOR_MAX(color, max) \
967 (color) > (max) ? (max) : (color) < 0 ? 0 : (color); 961 (color) > (max) ? (max) : (color) < 0 ? 0 : (color);
968 void CPDF_DIBSource::TranslateScanline24bpp(uint8_t* dest_scan, 962 void CPDF_DIBSource::TranslateScanline24bpp(uint8_t* dest_scan,
969 const uint8_t* src_scan) const { 963 const uint8_t* src_scan) const {
970 if (m_bpc == 0) { 964 if (m_bpc == 0) {
971 return; 965 return;
972 } 966 }
973 int max_data = (1 << m_bpc) - 1; 967 int max_data = (1 << m_bpc) - 1;
974 if (m_bDefaultDecode) { 968 if (m_bDefaultDecode) {
975 if (m_Family == PDFCS_DEVICERGB || m_Family == PDFCS_CALRGB) { 969 if (m_Family == PDFCS_DEVICERGB || m_Family == PDFCS_CALRGB) {
(...skipping 674 matching lines...) Expand 10 before | Expand all | Expand 10 after
1650 } 1644 }
1651 FX_BOOL CPDF_ImageLoader::Continue(void* LoadHandle, IFX_Pause* pPause) { 1645 FX_BOOL CPDF_ImageLoader::Continue(void* LoadHandle, IFX_Pause* pPause) {
1652 return ((CPDF_ProgressiveImageLoaderHandle*)LoadHandle)->Continue(pPause); 1646 return ((CPDF_ProgressiveImageLoaderHandle*)LoadHandle)->Continue(pPause);
1653 } 1647 }
1654 CPDF_ImageLoader::~CPDF_ImageLoader() { 1648 CPDF_ImageLoader::~CPDF_ImageLoader() {
1655 if (!m_bCached) { 1649 if (!m_bCached) {
1656 delete m_pBitmap; 1650 delete m_pBitmap;
1657 delete m_pMask; 1651 delete m_pMask;
1658 } 1652 }
1659 } 1653 }
OLDNEW
« no previous file with comments | « core/src/fpdfapi/fpdf_page/pageint.h ('k') | core/src/fpdfapi/fpdf_render/render_int.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698