| OLD | NEW |
| 1 // Copyright 2016 PDFium Authors. All rights reserved. | 1 // Copyright 2016 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/cpdf_streamcontentparser.h" | 7 #include "core/fpdfapi/page/cpdf_streamcontentparser.h" |
| 8 | 8 |
| 9 #include "core/fpdfapi/font/cpdf_font.h" | 9 #include "core/fpdfapi/font/cpdf_font.h" |
| 10 #include "core/fpdfapi/font/cpdf_type3font.h" | 10 #include "core/fpdfapi/font/cpdf_type3font.h" |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 173 m_pCurStates->m_ColorState.Emplace(); | 173 m_pCurStates->m_ColorState.Emplace(); |
| 174 } | 174 } |
| 175 for (size_t i = 0; i < FX_ArraySize(m_Type3Data); ++i) { | 175 for (size_t i = 0; i < FX_ArraySize(m_Type3Data); ++i) { |
| 176 m_Type3Data[i] = 0.0; | 176 m_Type3Data[i] = 0.0; |
| 177 } | 177 } |
| 178 } | 178 } |
| 179 | 179 |
| 180 CPDF_StreamContentParser::~CPDF_StreamContentParser() { | 180 CPDF_StreamContentParser::~CPDF_StreamContentParser() { |
| 181 ClearAllParams(); | 181 ClearAllParams(); |
| 182 FX_Free(m_pPathPoints); | 182 FX_Free(m_pPathPoints); |
| 183 if (m_pLastImageDict) { | 183 delete m_pLastImageDict; |
| 184 m_pLastImageDict->Release(); | 184 delete m_pLastCloneImageDict; |
| 185 } | |
| 186 if (m_pLastCloneImageDict) { | |
| 187 m_pLastCloneImageDict->Release(); | |
| 188 } | |
| 189 } | 185 } |
| 190 | 186 |
| 191 int CPDF_StreamContentParser::GetNextParamPos() { | 187 int CPDF_StreamContentParser::GetNextParamPos() { |
| 192 if (m_ParamCount == kParamBufSize) { | 188 if (m_ParamCount == kParamBufSize) { |
| 193 m_ParamStartPos++; | 189 m_ParamStartPos++; |
| 194 if (m_ParamStartPos == kParamBufSize) { | 190 if (m_ParamStartPos == kParamBufSize) { |
| 195 m_ParamStartPos = 0; | 191 m_ParamStartPos = 0; |
| 196 } | 192 } |
| 197 if (m_ParamBuf[m_ParamStartPos].m_Type == 0) { | 193 if (m_ParamBuf[m_ParamStartPos].m_Type == 0) |
| 198 if (CPDF_Object* pObject = m_ParamBuf[m_ParamStartPos].m_pObject) | 194 delete m_ParamBuf[m_ParamStartPos].m_pObject; |
| 199 pObject->Release(); | 195 |
| 200 } | |
| 201 return m_ParamStartPos; | 196 return m_ParamStartPos; |
| 202 } | 197 } |
| 203 int index = m_ParamStartPos + m_ParamCount; | 198 int index = m_ParamStartPos + m_ParamCount; |
| 204 if (index >= kParamBufSize) { | 199 if (index >= kParamBufSize) { |
| 205 index -= kParamBufSize; | 200 index -= kParamBufSize; |
| 206 } | 201 } |
| 207 m_ParamCount++; | 202 m_ParamCount++; |
| 208 return index; | 203 return index; |
| 209 } | 204 } |
| 210 | 205 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 237 | 232 |
| 238 void CPDF_StreamContentParser::AddObjectParam(CPDF_Object* pObj) { | 233 void CPDF_StreamContentParser::AddObjectParam(CPDF_Object* pObj) { |
| 239 ContentParam& param = m_ParamBuf[GetNextParamPos()]; | 234 ContentParam& param = m_ParamBuf[GetNextParamPos()]; |
| 240 param.m_Type = ContentParam::OBJECT; | 235 param.m_Type = ContentParam::OBJECT; |
| 241 param.m_pObject = pObj; | 236 param.m_pObject = pObj; |
| 242 } | 237 } |
| 243 | 238 |
| 244 void CPDF_StreamContentParser::ClearAllParams() { | 239 void CPDF_StreamContentParser::ClearAllParams() { |
| 245 uint32_t index = m_ParamStartPos; | 240 uint32_t index = m_ParamStartPos; |
| 246 for (uint32_t i = 0; i < m_ParamCount; i++) { | 241 for (uint32_t i = 0; i < m_ParamCount; i++) { |
| 247 if (m_ParamBuf[index].m_Type == 0) { | 242 if (m_ParamBuf[index].m_Type == 0) |
| 248 if (CPDF_Object* pObject = m_ParamBuf[index].m_pObject) | 243 delete m_ParamBuf[index].m_pObject; |
| 249 pObject->Release(); | 244 |
| 250 } | |
| 251 index++; | 245 index++; |
| 252 if (index == kParamBufSize) { | 246 if (index == kParamBufSize) { |
| 253 index = 0; | 247 index = 0; |
| 254 } | 248 } |
| 255 } | 249 } |
| 256 m_ParamStartPos = 0; | 250 m_ParamStartPos = 0; |
| 257 m_ParamCount = 0; | 251 m_ParamCount = 0; |
| 258 } | 252 } |
| 259 | 253 |
| 260 CPDF_Object* CPDF_StreamContentParser::GetObject(uint32_t index) { | 254 CPDF_Object* CPDF_StreamContentParser::GetObject(uint32_t index) { |
| (...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 524 FX_FILESIZE savePos = m_pSyntax->GetPos(); | 518 FX_FILESIZE savePos = m_pSyntax->GetPos(); |
| 525 CPDF_Dictionary* pDict = | 519 CPDF_Dictionary* pDict = |
| 526 new CPDF_Dictionary(m_pDocument->GetByteStringPool()); | 520 new CPDF_Dictionary(m_pDocument->GetByteStringPool()); |
| 527 while (1) { | 521 while (1) { |
| 528 CPDF_StreamParser::SyntaxType type = m_pSyntax->ParseNextElement(); | 522 CPDF_StreamParser::SyntaxType type = m_pSyntax->ParseNextElement(); |
| 529 if (type == CPDF_StreamParser::Keyword) { | 523 if (type == CPDF_StreamParser::Keyword) { |
| 530 CFX_ByteString bsKeyword(m_pSyntax->GetWordBuf(), | 524 CFX_ByteString bsKeyword(m_pSyntax->GetWordBuf(), |
| 531 m_pSyntax->GetWordSize()); | 525 m_pSyntax->GetWordSize()); |
| 532 if (bsKeyword != "ID") { | 526 if (bsKeyword != "ID") { |
| 533 m_pSyntax->SetPos(savePos); | 527 m_pSyntax->SetPos(savePos); |
| 534 pDict->Release(); | 528 delete pDict; |
| 535 return; | 529 return; |
| 536 } | 530 } |
| 537 } | 531 } |
| 538 if (type != CPDF_StreamParser::Name) { | 532 if (type != CPDF_StreamParser::Name) { |
| 539 break; | 533 break; |
| 540 } | 534 } |
| 541 CFX_ByteString key((const FX_CHAR*)m_pSyntax->GetWordBuf() + 1, | 535 CFX_ByteString key((const FX_CHAR*)m_pSyntax->GetWordBuf() + 1, |
| 542 m_pSyntax->GetWordSize() - 1); | 536 m_pSyntax->GetWordSize() - 1); |
| 543 std::unique_ptr<CPDF_Object, ReleaseDeleter<CPDF_Object>> pObj( | 537 std::unique_ptr<CPDF_Object> pObj(m_pSyntax->ReadNextObject(false, 0)); |
| 544 m_pSyntax->ReadNextObject(false, 0)); | |
| 545 if (!key.IsEmpty()) { | 538 if (!key.IsEmpty()) { |
| 546 uint32_t dwObjNum = pObj ? pObj->GetObjNum() : 0; | 539 uint32_t dwObjNum = pObj ? pObj->GetObjNum() : 0; |
| 547 if (dwObjNum) | 540 if (dwObjNum) |
| 548 pDict->SetReferenceFor(key, m_pDocument, dwObjNum); | 541 pDict->SetReferenceFor(key, m_pDocument, dwObjNum); |
| 549 else | 542 else |
| 550 pDict->SetFor(key, pObj.release()); | 543 pDict->SetFor(key, pObj.release()); |
| 551 } | 544 } |
| 552 } | 545 } |
| 553 PDF_ReplaceAbbr(pDict); | 546 PDF_ReplaceAbbr(pDict); |
| 554 CPDF_Object* pCSObj = nullptr; | 547 CPDF_Object* pCSObj = nullptr; |
| 555 if (pDict->KeyExist("ColorSpace")) { | 548 if (pDict->KeyExist("ColorSpace")) { |
| 556 pCSObj = pDict->GetDirectObjectFor("ColorSpace"); | 549 pCSObj = pDict->GetDirectObjectFor("ColorSpace"); |
| 557 if (pCSObj->IsName()) { | 550 if (pCSObj->IsName()) { |
| 558 CFX_ByteString name = pCSObj->GetString(); | 551 CFX_ByteString name = pCSObj->GetString(); |
| 559 if (name != "DeviceRGB" && name != "DeviceGray" && name != "DeviceCMYK") { | 552 if (name != "DeviceRGB" && name != "DeviceGray" && name != "DeviceCMYK") { |
| 560 pCSObj = FindResourceObj("ColorSpace", name); | 553 pCSObj = FindResourceObj("ColorSpace", name); |
| 561 if (pCSObj && pCSObj->IsInline()) { | 554 if (pCSObj && pCSObj->IsInline()) { |
| 562 pCSObj = pCSObj->Clone(); | 555 pCSObj = pCSObj->Clone(); |
| 563 pDict->SetFor("ColorSpace", pCSObj); | 556 pDict->SetFor("ColorSpace", pCSObj); |
| 564 } | 557 } |
| 565 } | 558 } |
| 566 } | 559 } |
| 567 } | 560 } |
| 568 pDict->SetNameFor("Subtype", "Image"); | 561 pDict->SetNameFor("Subtype", "Image"); |
| 569 UniqueStream pStream(m_pSyntax->ReadInlineStream(m_pDocument, pDict, pCSObj)); | 562 std::unique_ptr<CPDF_Stream> pStream( |
| 563 m_pSyntax->ReadInlineStream(m_pDocument, pDict, pCSObj)); |
| 570 bool bGaveDictAway = !!pStream; | 564 bool bGaveDictAway = !!pStream; |
| 571 while (1) { | 565 while (1) { |
| 572 CPDF_StreamParser::SyntaxType type = m_pSyntax->ParseNextElement(); | 566 CPDF_StreamParser::SyntaxType type = m_pSyntax->ParseNextElement(); |
| 573 if (type == CPDF_StreamParser::EndOfData) { | 567 if (type == CPDF_StreamParser::EndOfData) { |
| 574 break; | 568 break; |
| 575 } | 569 } |
| 576 if (type != CPDF_StreamParser::Keyword) { | 570 if (type != CPDF_StreamParser::Keyword) { |
| 577 continue; | 571 continue; |
| 578 } | 572 } |
| 579 if (m_pSyntax->GetWordSize() == 2 && m_pSyntax->GetWordBuf()[0] == 'E' && | 573 if (m_pSyntax->GetWordSize() == 2 && m_pSyntax->GetWordBuf()[0] == 'E' && |
| 580 m_pSyntax->GetWordBuf()[1] == 'I') { | 574 m_pSyntax->GetWordBuf()[1] == 'I') { |
| 581 break; | 575 break; |
| 582 } | 576 } |
| 583 } | 577 } |
| 584 CPDF_ImageObject* pImgObj = AddImage(std::move(pStream)); | 578 CPDF_ImageObject* pImgObj = AddImage(std::move(pStream)); |
| 585 if (!pImgObj && !bGaveDictAway) | 579 if (!pImgObj && !bGaveDictAway) |
| 586 pDict->Release(); | 580 delete pDict; |
| 587 } | 581 } |
| 588 | 582 |
| 589 void CPDF_StreamContentParser::Handle_BeginMarkedContent() { | 583 void CPDF_StreamContentParser::Handle_BeginMarkedContent() { |
| 590 m_CurContentMark.AddMark(GetString(0), nullptr, false); | 584 m_CurContentMark.AddMark(GetString(0), nullptr, false); |
| 591 } | 585 } |
| 592 | 586 |
| 593 void CPDF_StreamContentParser::Handle_BeginText() { | 587 void CPDF_StreamContentParser::Handle_BeginText() { |
| 594 m_pCurStates->m_TextMatrix.Set(1.0f, 0, 0, 1.0f, 0, 0); | 588 m_pCurStates->m_TextMatrix.Set(1.0f, 0, 0, 1.0f, 0, 0); |
| 595 OnChangeTextMatrix(); | 589 OnChangeTextMatrix(); |
| 596 m_pCurStates->m_TextX = 0; | 590 m_pCurStates->m_TextX = 0; |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 662 if (!pXObject) { | 656 if (!pXObject) { |
| 663 m_bResourceMissing = true; | 657 m_bResourceMissing = true; |
| 664 return; | 658 return; |
| 665 } | 659 } |
| 666 | 660 |
| 667 CFX_ByteString type; | 661 CFX_ByteString type; |
| 668 if (pXObject->GetDict()) | 662 if (pXObject->GetDict()) |
| 669 type = pXObject->GetDict()->GetStringFor("Subtype"); | 663 type = pXObject->GetDict()->GetStringFor("Subtype"); |
| 670 | 664 |
| 671 if (type == "Image") { | 665 if (type == "Image") { |
| 672 CPDF_ImageObject* pObj = | 666 CPDF_ImageObject* pObj = pXObject->IsInline() |
| 673 pXObject->IsInline() | 667 ? AddImage(std::unique_ptr<CPDF_Stream>( |
| 674 ? AddImage(UniqueStream(ToStream(pXObject->Clone()))) | 668 ToStream(pXObject->Clone()))) |
| 675 : AddImage(pXObject->GetObjNum()); | 669 : AddImage(pXObject->GetObjNum()); |
| 676 | 670 |
| 677 m_LastImageName = name; | 671 m_LastImageName = name; |
| 678 m_pLastImage = pObj->GetImage(); | 672 m_pLastImage = pObj->GetImage(); |
| 679 if (!m_pObjectHolder->HasImageMask()) | 673 if (!m_pObjectHolder->HasImageMask()) |
| 680 m_pObjectHolder->SetHasImageMask(m_pLastImage->IsMask()); | 674 m_pObjectHolder->SetHasImageMask(m_pLastImage->IsMask()); |
| 681 } else if (type == "Form") { | 675 } else if (type == "Form") { |
| 682 AddForm(pXObject); | 676 AddForm(pXObject); |
| 683 } | 677 } |
| 684 } | 678 } |
| 685 | 679 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 697 pFormObj->m_pForm->ParseContent(&status, nullptr, nullptr, m_Level + 1); | 691 pFormObj->m_pForm->ParseContent(&status, nullptr, nullptr, m_Level + 1); |
| 698 if (!m_pObjectHolder->BackgroundAlphaNeeded() && | 692 if (!m_pObjectHolder->BackgroundAlphaNeeded() && |
| 699 pFormObj->m_pForm->BackgroundAlphaNeeded()) { | 693 pFormObj->m_pForm->BackgroundAlphaNeeded()) { |
| 700 m_pObjectHolder->SetBackgroundAlphaNeeded(true); | 694 m_pObjectHolder->SetBackgroundAlphaNeeded(true); |
| 701 } | 695 } |
| 702 pFormObj->CalcBoundingBox(); | 696 pFormObj->CalcBoundingBox(); |
| 703 SetGraphicStates(pFormObj.get(), true, true, true); | 697 SetGraphicStates(pFormObj.get(), true, true, true); |
| 704 m_pObjectHolder->GetPageObjectList()->push_back(std::move(pFormObj)); | 698 m_pObjectHolder->GetPageObjectList()->push_back(std::move(pFormObj)); |
| 705 } | 699 } |
| 706 | 700 |
| 707 CPDF_ImageObject* CPDF_StreamContentParser::AddImage(UniqueStream pStream) { | 701 CPDF_ImageObject* CPDF_StreamContentParser::AddImage( |
| 702 std::unique_ptr<CPDF_Stream> pStream) { |
| 708 if (!pStream) | 703 if (!pStream) |
| 709 return nullptr; | 704 return nullptr; |
| 710 | 705 |
| 711 auto pImageObj = pdfium::MakeUnique<CPDF_ImageObject>(); | 706 auto pImageObj = pdfium::MakeUnique<CPDF_ImageObject>(); |
| 712 pImageObj->SetOwnedImage( | 707 pImageObj->SetOwnedImage( |
| 713 pdfium::MakeUnique<CPDF_Image>(m_pDocument, std::move(pStream))); | 708 pdfium::MakeUnique<CPDF_Image>(m_pDocument, std::move(pStream))); |
| 714 return AddImageObject(std::move(pImageObj)); | 709 return AddImageObject(std::move(pImageObj)); |
| 715 } | 710 } |
| 716 | 711 |
| 717 CPDF_ImageObject* CPDF_StreamContentParser::AddImage(uint32_t streamObjNum) { | 712 CPDF_ImageObject* CPDF_StreamContentParser::AddImage(uint32_t streamObjNum) { |
| (...skipping 837 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1555 } | 1550 } |
| 1556 default: | 1551 default: |
| 1557 bProcessed = false; | 1552 bProcessed = false; |
| 1558 } | 1553 } |
| 1559 if (!bProcessed) { | 1554 if (!bProcessed) { |
| 1560 m_pSyntax->SetPos(last_pos); | 1555 m_pSyntax->SetPos(last_pos); |
| 1561 return; | 1556 return; |
| 1562 } | 1557 } |
| 1563 } | 1558 } |
| 1564 } | 1559 } |
| OLD | NEW |