OLD | NEW |
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/fpdfapi/page/pageint.h" | 7 #include "core/fpdfapi/page/pageint.h" |
8 | 8 |
9 #include <limits.h> | 9 #include <limits.h> |
10 | 10 |
11 #include <algorithm> | 11 #include <algorithm> |
12 #include <memory> | 12 #include <memory> |
13 #include <utility> | 13 #include <utility> |
14 #include <vector> | 14 #include <vector> |
15 | 15 |
16 #include "core/fpdfapi/page/cpdf_psengine.h" | 16 #include "core/fpdfapi/page/cpdf_psengine.h" |
17 #include "core/fpdfapi/parser/cpdf_array.h" | 17 #include "core/fpdfapi/parser/cpdf_array.h" |
18 #include "core/fpdfapi/parser/cpdf_dictionary.h" | 18 #include "core/fpdfapi/parser/cpdf_dictionary.h" |
19 #include "core/fpdfapi/parser/cpdf_simple_parser.h" | 19 #include "core/fpdfapi/parser/cpdf_simple_parser.h" |
20 #include "core/fpdfapi/parser/cpdf_stream.h" | 20 #include "core/fpdfapi/parser/cpdf_stream.h" |
21 #include "core/fpdfapi/parser/cpdf_stream_acc.h" | 21 #include "core/fpdfapi/parser/cpdf_stream_acc.h" |
22 #include "core/fxcrt/fx_safe_types.h" | 22 #include "core/fxcrt/fx_safe_types.h" |
| 23 #include "third_party/base/ptr_util.h" |
23 | 24 |
24 namespace { | 25 namespace { |
25 | 26 |
26 struct PDF_PSOpName { | 27 struct PDF_PSOpName { |
27 const FX_CHAR* name; | 28 const FX_CHAR* name; |
28 PDF_PSOP op; | 29 PDF_PSOP op; |
29 }; | 30 }; |
30 | 31 |
31 const PDF_PSOpName kPsOpNames[] = { | 32 const PDF_PSOpName kPsOpNames[] = { |
32 {"add", PSOP_ADD}, {"sub", PSOP_SUB}, | 33 {"add", PSOP_ADD}, {"sub", PSOP_SUB}, |
(...skipping 455 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
488 | 489 |
489 CPDF_Dictionary* pDict = pStream->GetDict(); | 490 CPDF_Dictionary* pDict = pStream->GetDict(); |
490 CPDF_Array* pSize = pDict->GetArrayFor("Size"); | 491 CPDF_Array* pSize = pDict->GetArrayFor("Size"); |
491 CPDF_Array* pEncode = pDict->GetArrayFor("Encode"); | 492 CPDF_Array* pEncode = pDict->GetArrayFor("Encode"); |
492 CPDF_Array* pDecode = pDict->GetArrayFor("Decode"); | 493 CPDF_Array* pDecode = pDict->GetArrayFor("Decode"); |
493 m_nBitsPerSample = pDict->GetIntegerFor("BitsPerSample"); | 494 m_nBitsPerSample = pDict->GetIntegerFor("BitsPerSample"); |
494 if (!IsValidBitsPerSample(m_nBitsPerSample)) | 495 if (!IsValidBitsPerSample(m_nBitsPerSample)) |
495 return false; | 496 return false; |
496 | 497 |
497 m_SampleMax = 0xffffffff >> (32 - m_nBitsPerSample); | 498 m_SampleMax = 0xffffffff >> (32 - m_nBitsPerSample); |
498 m_pSampleStream.reset(new CPDF_StreamAcc); | 499 m_pSampleStream = pdfium::MakeUnique<CPDF_StreamAcc>(); |
499 m_pSampleStream->LoadAllData(pStream, false); | 500 m_pSampleStream->LoadAllData(pStream, false); |
500 FX_SAFE_UINT32 nTotalSampleBits = 1; | 501 FX_SAFE_UINT32 nTotalSampleBits = 1; |
501 m_EncodeInfo.resize(m_nInputs); | 502 m_EncodeInfo.resize(m_nInputs); |
502 for (uint32_t i = 0; i < m_nInputs; i++) { | 503 for (uint32_t i = 0; i < m_nInputs; i++) { |
503 m_EncodeInfo[i].sizes = pSize ? pSize->GetIntegerAt(i) : 0; | 504 m_EncodeInfo[i].sizes = pSize ? pSize->GetIntegerAt(i) : 0; |
504 if (!pSize && i == 0) | 505 if (!pSize && i == 0) |
505 m_EncodeInfo[i].sizes = pDict->GetIntegerFor("Size"); | 506 m_EncodeInfo[i].sizes = pDict->GetIntegerFor("Size"); |
506 nTotalSampleBits *= m_EncodeInfo[i].sizes; | 507 nTotalSampleBits *= m_EncodeInfo[i].sizes; |
507 if (pEncode) { | 508 if (pEncode) { |
508 m_EncodeInfo[i].encode_min = pEncode->GetFloatAt(i * 2); | 509 m_EncodeInfo[i].encode_min = pEncode->GetFloatAt(i * 2); |
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
735 return pFunc; | 736 return pFunc; |
736 | 737 |
737 int iType = -1; | 738 int iType = -1; |
738 if (CPDF_Stream* pStream = pFuncObj->AsStream()) | 739 if (CPDF_Stream* pStream = pFuncObj->AsStream()) |
739 iType = pStream->GetDict()->GetIntegerFor("FunctionType"); | 740 iType = pStream->GetDict()->GetIntegerFor("FunctionType"); |
740 else if (CPDF_Dictionary* pDict = pFuncObj->AsDictionary()) | 741 else if (CPDF_Dictionary* pDict = pFuncObj->AsDictionary()) |
741 iType = pDict->GetIntegerFor("FunctionType"); | 742 iType = pDict->GetIntegerFor("FunctionType"); |
742 | 743 |
743 Type type = IntegerToFunctionType(iType); | 744 Type type = IntegerToFunctionType(iType); |
744 if (type == Type::kType0Sampled) | 745 if (type == Type::kType0Sampled) |
745 pFunc.reset(new CPDF_SampledFunc()); | 746 pFunc = pdfium::MakeUnique<CPDF_SampledFunc>(); |
746 else if (type == Type::kType2ExpotentialInterpolation) | 747 else if (type == Type::kType2ExpotentialInterpolation) |
747 pFunc.reset(new CPDF_ExpIntFunc()); | 748 pFunc = pdfium::MakeUnique<CPDF_ExpIntFunc>(); |
748 else if (type == Type::kType3Stitching) | 749 else if (type == Type::kType3Stitching) |
749 pFunc.reset(new CPDF_StitchFunc()); | 750 pFunc = pdfium::MakeUnique<CPDF_StitchFunc>(); |
750 else if (type == Type::kType4PostScript) | 751 else if (type == Type::kType4PostScript) |
751 pFunc.reset(new CPDF_PSFunc()); | 752 pFunc = pdfium::MakeUnique<CPDF_PSFunc>(); |
752 | 753 |
753 if (!pFunc || !pFunc->Init(pFuncObj)) | 754 if (!pFunc || !pFunc->Init(pFuncObj)) |
754 return nullptr; | 755 return nullptr; |
755 | 756 |
756 return pFunc; | 757 return pFunc; |
757 } | 758 } |
758 | 759 |
759 // static | 760 // static |
760 CPDF_Function::Type CPDF_Function::IntegerToFunctionType(int iType) { | 761 CPDF_Function::Type CPDF_Function::IntegerToFunctionType(int iType) { |
761 switch (iType) { | 762 switch (iType) { |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
850 return m_Type == Type::kType2ExpotentialInterpolation | 851 return m_Type == Type::kType2ExpotentialInterpolation |
851 ? static_cast<const CPDF_ExpIntFunc*>(this) | 852 ? static_cast<const CPDF_ExpIntFunc*>(this) |
852 : nullptr; | 853 : nullptr; |
853 } | 854 } |
854 | 855 |
855 const CPDF_StitchFunc* CPDF_Function::ToStitchFunc() const { | 856 const CPDF_StitchFunc* CPDF_Function::ToStitchFunc() const { |
856 return m_Type == Type::kType3Stitching | 857 return m_Type == Type::kType3Stitching |
857 ? static_cast<const CPDF_StitchFunc*>(this) | 858 ? static_cast<const CPDF_StitchFunc*>(this) |
858 : nullptr; | 859 : nullptr; |
859 } | 860 } |
OLD | NEW |