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/fpdf_page/pageint.h" | 7 #include "core/fpdfapi/fpdf_page/pageint.h" |
8 | 8 |
9 #include <limits.h> | 9 #include <limits.h> |
10 | 10 |
(...skipping 23 matching lines...) Expand all Loading... |
34 #include "core/fxge/include/cfx_renderdevice.h" | 34 #include "core/fxge/include/cfx_renderdevice.h" |
35 | 35 |
36 namespace { | 36 namespace { |
37 | 37 |
38 const uint32_t kMaxNestedArrayLevel = 512; | 38 const uint32_t kMaxNestedArrayLevel = 512; |
39 const uint32_t kMaxWordBuffer = 256; | 39 const uint32_t kMaxWordBuffer = 256; |
40 const FX_STRSIZE kMaxStringLength = 32767; | 40 const FX_STRSIZE kMaxStringLength = 32767; |
41 | 41 |
42 } // namespace | 42 } // namespace |
43 | 43 |
44 CPDF_StreamParser::CPDF_StreamParser(const uint8_t* pData, uint32_t dwSize) { | 44 CPDF_StreamParser::CPDF_StreamParser(const uint8_t* pData, uint32_t dwSize) |
45 m_pBuf = pData; | 45 : m_pBuf(pData), |
46 m_Size = dwSize; | 46 m_Size(dwSize), |
47 m_Pos = 0; | 47 m_Pos(0), |
48 m_pLastObj = nullptr; | 48 m_pLastObj(nullptr), |
49 } | 49 m_pPool(nullptr) {} |
| 50 |
| 51 CPDF_StreamParser::CPDF_StreamParser( |
| 52 const uint8_t* pData, |
| 53 uint32_t dwSize, |
| 54 const CFX_WeakPtr<CFX_ByteStringPool>& pPool) |
| 55 : m_pBuf(pData), |
| 56 m_Size(dwSize), |
| 57 m_Pos(0), |
| 58 m_pLastObj(nullptr), |
| 59 m_pPool(pPool) {} |
50 | 60 |
51 CPDF_StreamParser::~CPDF_StreamParser() { | 61 CPDF_StreamParser::~CPDF_StreamParser() { |
52 if (m_pLastObj) { | 62 if (m_pLastObj) { |
53 m_pLastObj->Release(); | 63 m_pLastObj->Release(); |
54 } | 64 } |
55 } | 65 } |
56 | 66 |
57 uint32_t DecodeAllScanlines(CCodec_ScanlineDecoder* pDecoder, | 67 uint32_t DecodeAllScanlines(CCodec_ScanlineDecoder* pDecoder, |
58 uint8_t*& dest_buf, | 68 uint8_t*& dest_buf, |
59 uint32_t& dest_size) { | 69 uint32_t& dest_size) { |
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
329 if (!m_WordSize) | 339 if (!m_WordSize) |
330 return nullptr; | 340 return nullptr; |
331 | 341 |
332 if (bIsNumber) { | 342 if (bIsNumber) { |
333 m_WordBuffer[m_WordSize] = 0; | 343 m_WordBuffer[m_WordSize] = 0; |
334 return new CPDF_Number(CFX_ByteStringC(m_WordBuffer, m_WordSize)); | 344 return new CPDF_Number(CFX_ByteStringC(m_WordBuffer, m_WordSize)); |
335 } | 345 } |
336 | 346 |
337 int first_char = m_WordBuffer[0]; | 347 int first_char = m_WordBuffer[0]; |
338 if (first_char == '/') { | 348 if (first_char == '/') { |
339 return new CPDF_Name( | 349 CFX_ByteString name = |
340 PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1))); | 350 PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1)); |
| 351 return new CPDF_Name(m_pPool ? m_pPool->Intern(name) : name); |
341 } | 352 } |
342 | 353 |
343 if (first_char == '(') | 354 if (first_char == '(') { |
344 return new CPDF_String(ReadString(), FALSE); | 355 CFX_ByteString str = ReadString(); |
| 356 return new CPDF_String(m_pPool ? m_pPool->Intern(str) : str, FALSE); |
| 357 } |
345 | 358 |
346 if (first_char == '<') { | 359 if (first_char == '<') { |
347 if (m_WordSize == 1) | 360 if (m_WordSize == 1) |
348 return new CPDF_String(ReadHexString(), TRUE); | 361 return new CPDF_String(ReadHexString(), TRUE); |
349 | 362 |
350 CPDF_Dictionary* pDict = new CPDF_Dictionary; | 363 CPDF_Dictionary* pDict = new CPDF_Dictionary(m_pPool); |
351 while (1) { | 364 while (1) { |
352 GetNextWord(bIsNumber); | 365 GetNextWord(bIsNumber); |
353 if (m_WordSize == 2 && m_WordBuffer[0] == '>') | 366 if (m_WordSize == 2 && m_WordBuffer[0] == '>') |
354 break; | 367 break; |
355 | 368 |
356 if (!m_WordSize || m_WordBuffer[0] != '/') { | 369 if (!m_WordSize || m_WordBuffer[0] != '/') { |
357 pDict->Release(); | 370 pDict->Release(); |
358 return nullptr; | 371 return nullptr; |
359 } | 372 } |
360 | 373 |
(...skipping 456 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
817 } | 830 } |
818 m_Status = Done; | 831 m_Status = Done; |
819 return; | 832 return; |
820 } | 833 } |
821 steps++; | 834 steps++; |
822 if (pPause && pPause->NeedToPauseNow()) { | 835 if (pPause && pPause->NeedToPauseNow()) { |
823 break; | 836 break; |
824 } | 837 } |
825 } | 838 } |
826 } | 839 } |
OLD | NEW |