| 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 <memory> | 9 #include <memory> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 241 m_pCurStates->m_ColorState.Emplace(); | 241 m_pCurStates->m_ColorState.Emplace(); |
| 242 } | 242 } |
| 243 for (size_t i = 0; i < FX_ArraySize(m_Type3Data); ++i) { | 243 for (size_t i = 0; i < FX_ArraySize(m_Type3Data); ++i) { |
| 244 m_Type3Data[i] = 0.0; | 244 m_Type3Data[i] = 0.0; |
| 245 } | 245 } |
| 246 } | 246 } |
| 247 | 247 |
| 248 CPDF_StreamContentParser::~CPDF_StreamContentParser() { | 248 CPDF_StreamContentParser::~CPDF_StreamContentParser() { |
| 249 ClearAllParams(); | 249 ClearAllParams(); |
| 250 FX_Free(m_pPathPoints); | 250 FX_Free(m_pPathPoints); |
| 251 if (m_pLastImageDict) { | 251 delete m_pLastImageDict; |
| 252 m_pLastImageDict->Release(); | 252 delete m_pLastCloneImageDict; |
| 253 } | |
| 254 if (m_pLastCloneImageDict) { | |
| 255 m_pLastCloneImageDict->Release(); | |
| 256 } | |
| 257 } | 253 } |
| 258 | 254 |
| 259 int CPDF_StreamContentParser::GetNextParamPos() { | 255 int CPDF_StreamContentParser::GetNextParamPos() { |
| 260 if (m_ParamCount == PARAM_BUF_SIZE) { | 256 if (m_ParamCount == PARAM_BUF_SIZE) { |
| 261 m_ParamStartPos++; | 257 m_ParamStartPos++; |
| 262 if (m_ParamStartPos == PARAM_BUF_SIZE) { | 258 if (m_ParamStartPos == PARAM_BUF_SIZE) |
| 263 m_ParamStartPos = 0; | 259 m_ParamStartPos = 0; |
| 264 } | 260 |
| 265 if (m_ParamBuf[m_ParamStartPos].m_Type == 0) { | 261 if (m_ParamBuf[m_ParamStartPos].m_Type == 0) |
| 266 if (CPDF_Object* pObject = m_ParamBuf[m_ParamStartPos].m_pObject) | 262 delete m_ParamBuf[m_ParamStartPos].m_pObject; |
| 267 pObject->Release(); | 263 |
| 268 } | |
| 269 return m_ParamStartPos; | 264 return m_ParamStartPos; |
| 270 } | 265 } |
| 271 int index = m_ParamStartPos + m_ParamCount; | 266 int index = m_ParamStartPos + m_ParamCount; |
| 272 if (index >= PARAM_BUF_SIZE) { | 267 if (index >= PARAM_BUF_SIZE) { |
| 273 index -= PARAM_BUF_SIZE; | 268 index -= PARAM_BUF_SIZE; |
| 274 } | 269 } |
| 275 m_ParamCount++; | 270 m_ParamCount++; |
| 276 return index; | 271 return index; |
| 277 } | 272 } |
| 278 | 273 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 305 | 300 |
| 306 void CPDF_StreamContentParser::AddObjectParam(CPDF_Object* pObj) { | 301 void CPDF_StreamContentParser::AddObjectParam(CPDF_Object* pObj) { |
| 307 ContentParam& param = m_ParamBuf[GetNextParamPos()]; | 302 ContentParam& param = m_ParamBuf[GetNextParamPos()]; |
| 308 param.m_Type = ContentParam::OBJECT; | 303 param.m_Type = ContentParam::OBJECT; |
| 309 param.m_pObject = pObj; | 304 param.m_pObject = pObj; |
| 310 } | 305 } |
| 311 | 306 |
| 312 void CPDF_StreamContentParser::ClearAllParams() { | 307 void CPDF_StreamContentParser::ClearAllParams() { |
| 313 uint32_t index = m_ParamStartPos; | 308 uint32_t index = m_ParamStartPos; |
| 314 for (uint32_t i = 0; i < m_ParamCount; i++) { | 309 for (uint32_t i = 0; i < m_ParamCount; i++) { |
| 315 if (m_ParamBuf[index].m_Type == 0) { | 310 if (m_ParamBuf[index].m_Type == 0) |
| 316 if (CPDF_Object* pObject = m_ParamBuf[index].m_pObject) | 311 delete m_ParamBuf[index].m_pObject; |
| 317 pObject->Release(); | 312 |
| 318 } | |
| 319 index++; | 313 index++; |
| 320 if (index == PARAM_BUF_SIZE) { | 314 if (index == PARAM_BUF_SIZE) |
| 321 index = 0; | 315 index = 0; |
| 322 } | |
| 323 } | 316 } |
| 324 m_ParamStartPos = 0; | 317 m_ParamStartPos = 0; |
| 325 m_ParamCount = 0; | 318 m_ParamCount = 0; |
| 326 } | 319 } |
| 327 | 320 |
| 328 CPDF_Object* CPDF_StreamContentParser::GetObject(uint32_t index) { | 321 CPDF_Object* CPDF_StreamContentParser::GetObject(uint32_t index) { |
| 329 if (index >= m_ParamCount) { | 322 if (index >= m_ParamCount) { |
| 330 return nullptr; | 323 return nullptr; |
| 331 } | 324 } |
| 332 int real_index = m_ParamStartPos + m_ParamCount - index - 1; | 325 int real_index = m_ParamStartPos + m_ParamCount - index - 1; |
| (...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 592 FX_FILESIZE savePos = m_pSyntax->GetPos(); | 585 FX_FILESIZE savePos = m_pSyntax->GetPos(); |
| 593 CPDF_Dictionary* pDict = | 586 CPDF_Dictionary* pDict = |
| 594 new CPDF_Dictionary(m_pDocument->GetByteStringPool()); | 587 new CPDF_Dictionary(m_pDocument->GetByteStringPool()); |
| 595 while (1) { | 588 while (1) { |
| 596 CPDF_StreamParser::SyntaxType type = m_pSyntax->ParseNextElement(); | 589 CPDF_StreamParser::SyntaxType type = m_pSyntax->ParseNextElement(); |
| 597 if (type == CPDF_StreamParser::Keyword) { | 590 if (type == CPDF_StreamParser::Keyword) { |
| 598 CFX_ByteString bsKeyword(m_pSyntax->GetWordBuf(), | 591 CFX_ByteString bsKeyword(m_pSyntax->GetWordBuf(), |
| 599 m_pSyntax->GetWordSize()); | 592 m_pSyntax->GetWordSize()); |
| 600 if (bsKeyword != "ID") { | 593 if (bsKeyword != "ID") { |
| 601 m_pSyntax->SetPos(savePos); | 594 m_pSyntax->SetPos(savePos); |
| 602 pDict->Release(); | 595 delete pDict; |
| 603 return; | 596 return; |
| 604 } | 597 } |
| 605 } | 598 } |
| 606 if (type != CPDF_StreamParser::Name) { | 599 if (type != CPDF_StreamParser::Name) { |
| 607 break; | 600 break; |
| 608 } | 601 } |
| 609 CFX_ByteString key((const FX_CHAR*)m_pSyntax->GetWordBuf() + 1, | 602 CFX_ByteString key((const FX_CHAR*)m_pSyntax->GetWordBuf() + 1, |
| 610 m_pSyntax->GetWordSize() - 1); | 603 m_pSyntax->GetWordSize() - 1); |
| 611 std::unique_ptr<CPDF_Object, ReleaseDeleter<CPDF_Object>> pObj( | 604 std::unique_ptr<CPDF_Object> pObj(m_pSyntax->ReadNextObject(false, 0)); |
| 612 m_pSyntax->ReadNextObject(false, 0)); | |
| 613 if (!key.IsEmpty()) { | 605 if (!key.IsEmpty()) { |
| 614 uint32_t dwObjNum = pObj ? pObj->GetObjNum() : 0; | 606 uint32_t dwObjNum = pObj ? pObj->GetObjNum() : 0; |
| 615 if (dwObjNum) | 607 if (dwObjNum) |
| 616 pDict->SetReferenceFor(key, m_pDocument, dwObjNum); | 608 pDict->SetReferenceFor(key, m_pDocument, dwObjNum); |
| 617 else | 609 else |
| 618 pDict->SetFor(key, pObj.release()); | 610 pDict->SetFor(key, pObj.release()); |
| 619 } | 611 } |
| 620 } | 612 } |
| 621 PDF_ReplaceAbbr(pDict); | 613 PDF_ReplaceAbbr(pDict); |
| 622 CPDF_Object* pCSObj = nullptr; | 614 CPDF_Object* pCSObj = nullptr; |
| (...skipping 22 matching lines...) Expand all Loading... |
| 645 } | 637 } |
| 646 if (m_pSyntax->GetWordSize() == 2 && m_pSyntax->GetWordBuf()[0] == 'E' && | 638 if (m_pSyntax->GetWordSize() == 2 && m_pSyntax->GetWordBuf()[0] == 'E' && |
| 647 m_pSyntax->GetWordBuf()[1] == 'I') { | 639 m_pSyntax->GetWordBuf()[1] == 'I') { |
| 648 break; | 640 break; |
| 649 } | 641 } |
| 650 } | 642 } |
| 651 pDict->SetNameFor("Subtype", "Image"); | 643 pDict->SetNameFor("Subtype", "Image"); |
| 652 CPDF_ImageObject* pImgObj = AddImage(pStream, nullptr, true); | 644 CPDF_ImageObject* pImgObj = AddImage(pStream, nullptr, true); |
| 653 if (!pImgObj) { | 645 if (!pImgObj) { |
| 654 if (pStream) { | 646 if (pStream) { |
| 655 pStream->Release(); | 647 delete pStream; |
| 656 } else { | 648 } else { |
| 657 pDict->Release(); | 649 delete pDict; |
| 658 } | 650 } |
| 659 } | 651 } |
| 660 } | 652 } |
| 661 | 653 |
| 662 void CPDF_StreamContentParser::Handle_BeginMarkedContent() { | 654 void CPDF_StreamContentParser::Handle_BeginMarkedContent() { |
| 663 m_CurContentMark.AddMark(GetString(0), nullptr, FALSE); | 655 m_CurContentMark.AddMark(GetString(0), nullptr, FALSE); |
| 664 } | 656 } |
| 665 | 657 |
| 666 void CPDF_StreamContentParser::Handle_BeginText() { | 658 void CPDF_StreamContentParser::Handle_BeginText() { |
| 667 m_pCurStates->m_TextMatrix.Set(1.0f, 0, 0, 1.0f, 0, 0); | 659 m_pCurStates->m_TextMatrix.Set(1.0f, 0, 0, 1.0f, 0, 0); |
| (...skipping 1005 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1673 } else { | 1665 } else { |
| 1674 PDF_ReplaceAbbr(pElement); | 1666 PDF_ReplaceAbbr(pElement); |
| 1675 } | 1667 } |
| 1676 } | 1668 } |
| 1677 break; | 1669 break; |
| 1678 } | 1670 } |
| 1679 default: | 1671 default: |
| 1680 break; | 1672 break; |
| 1681 } | 1673 } |
| 1682 } | 1674 } |
| OLD | NEW |