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 <algorithm> | 9 #include <algorithm> |
10 | 10 |
| 11 #include "core/fpdfapi/fpdf_page/include/cpdf_form.h" |
| 12 #include "core/fpdfapi/fpdf_page/include/cpdf_page.h" |
11 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h" | 13 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h" |
12 #include "core/fpdfapi/fpdf_parser/include/cpdf_dictionary.h" | 14 #include "core/fpdfapi/fpdf_parser/include/cpdf_dictionary.h" |
13 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h" | 15 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h" |
14 #include "core/fpdfapi/include/cpdf_modulemgr.h" | 16 #include "core/fpdfapi/include/cpdf_modulemgr.h" |
15 #include "core/fpdfapi/ipdf_rendermodule.h" | 17 #include "core/fpdfapi/ipdf_rendermodule.h" |
16 #include "core/include/fpdfapi/fpdf_page.h" | |
17 #include "third_party/base/stl_util.h" | 18 #include "third_party/base/stl_util.h" |
18 | 19 |
19 CPDF_PageObject::CPDF_PageObject() {} | 20 CPDF_PageObject::CPDF_PageObject() {} |
20 | 21 |
21 CPDF_PageObject::~CPDF_PageObject() {} | 22 CPDF_PageObject::~CPDF_PageObject() {} |
22 | 23 |
23 void CPDF_PageObject::CopyData(const CPDF_PageObject* pSrc) { | 24 void CPDF_PageObject::CopyData(const CPDF_PageObject* pSrc) { |
24 CopyStates(*pSrc); | 25 CopyStates(*pSrc); |
25 m_Left = pSrc->m_Left; | 26 m_Left = pSrc->m_Left; |
26 m_Right = pSrc->m_Right; | 27 m_Right = pSrc->m_Right; |
(...skipping 429 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
456 | 457 |
457 void CPDF_FormObject::CalcBoundingBox() { | 458 void CPDF_FormObject::CalcBoundingBox() { |
458 CFX_FloatRect form_rect = m_pForm->CalcBoundingBox(); | 459 CFX_FloatRect form_rect = m_pForm->CalcBoundingBox(); |
459 form_rect.Transform(&m_FormMatrix); | 460 form_rect.Transform(&m_FormMatrix); |
460 m_Left = form_rect.left; | 461 m_Left = form_rect.left; |
461 m_Bottom = form_rect.bottom; | 462 m_Bottom = form_rect.bottom; |
462 m_Right = form_rect.right; | 463 m_Right = form_rect.right; |
463 m_Top = form_rect.top; | 464 m_Top = form_rect.top; |
464 } | 465 } |
465 | 466 |
466 CPDF_PageObject* CPDF_PageObjectList::GetPageObjectByIndex(int index) { | |
467 if (index < 0 || index >= pdfium::CollectionSize<int>(*this)) | |
468 return nullptr; | |
469 return (*this)[index].get(); | |
470 } | |
471 | |
472 CPDF_PageObjectHolder::CPDF_PageObjectHolder() | |
473 : m_pFormDict(nullptr), | |
474 m_pFormStream(nullptr), | |
475 m_pDocument(nullptr), | |
476 m_pPageResources(nullptr), | |
477 m_pResources(nullptr), | |
478 m_Transparency(0), | |
479 m_bBackgroundAlphaNeeded(FALSE), | |
480 m_bHasImageMask(FALSE), | |
481 m_ParseState(CONTENT_NOT_PARSED) {} | |
482 | |
483 void CPDF_PageObjectHolder::ContinueParse(IFX_Pause* pPause) { | |
484 if (!m_pParser) { | |
485 return; | |
486 } | |
487 m_pParser->Continue(pPause); | |
488 if (m_pParser->GetStatus() == CPDF_ContentParser::Done) { | |
489 m_ParseState = CONTENT_PARSED; | |
490 m_pParser.reset(); | |
491 } | |
492 } | |
493 | |
494 void CPDF_PageObjectHolder::Transform(const CFX_Matrix& matrix) { | |
495 for (auto& pObj : m_PageObjectList) | |
496 pObj->Transform(matrix); | |
497 } | |
498 | |
499 CFX_FloatRect CPDF_PageObjectHolder::CalcBoundingBox() const { | |
500 if (m_PageObjectList.empty()) | |
501 return CFX_FloatRect(0, 0, 0, 0); | |
502 | |
503 FX_FLOAT left = 1000000.0f; | |
504 FX_FLOAT right = -1000000.0f; | |
505 FX_FLOAT bottom = 1000000.0f; | |
506 FX_FLOAT top = -1000000.0f; | |
507 for (const auto& pObj : m_PageObjectList) { | |
508 left = std::min(left, pObj->m_Left); | |
509 right = std::max(right, pObj->m_Right); | |
510 bottom = std::min(bottom, pObj->m_Bottom); | |
511 top = std::max(top, pObj->m_Top); | |
512 } | |
513 return CFX_FloatRect(left, bottom, right, top); | |
514 } | |
515 | |
516 void CPDF_PageObjectHolder::LoadTransInfo() { | |
517 if (!m_pFormDict) { | |
518 return; | |
519 } | |
520 CPDF_Dictionary* pGroup = m_pFormDict->GetDictBy("Group"); | |
521 if (!pGroup) { | |
522 return; | |
523 } | |
524 if (pGroup->GetStringBy("S") != "Transparency") { | |
525 return; | |
526 } | |
527 m_Transparency |= PDFTRANS_GROUP; | |
528 if (pGroup->GetIntegerBy("I")) { | |
529 m_Transparency |= PDFTRANS_ISOLATED; | |
530 } | |
531 if (pGroup->GetIntegerBy("K")) { | |
532 m_Transparency |= PDFTRANS_KNOCKOUT; | |
533 } | |
534 } | |
535 | |
536 CPDF_Page::CPDF_Page() : m_pPageRender(nullptr) {} | 467 CPDF_Page::CPDF_Page() : m_pPageRender(nullptr) {} |
537 | 468 |
538 void CPDF_Page::Load(CPDF_Document* pDocument, | 469 void CPDF_Page::Load(CPDF_Document* pDocument, |
539 CPDF_Dictionary* pPageDict, | 470 CPDF_Dictionary* pPageDict, |
540 FX_BOOL bPageCache) { | 471 FX_BOOL bPageCache) { |
541 m_pDocument = (CPDF_Document*)pDocument; | 472 m_pDocument = (CPDF_Document*)pDocument; |
542 m_pFormDict = pPageDict; | 473 m_pFormDict = pPageDict; |
543 if (bPageCache) { | 474 if (bPageCache) { |
544 m_pPageRender = | 475 m_pPageRender = |
545 CPDF_ModuleMgr::Get()->GetRenderModule()->CreatePageCache(this); | 476 CPDF_ModuleMgr::Get()->GetRenderModule()->CreatePageCache(this); |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
643 if (level == 1000) { | 574 if (level == 1000) { |
644 return NULL; | 575 return NULL; |
645 } | 576 } |
646 } | 577 } |
647 } | 578 } |
648 | 579 |
649 CPDF_Object* CPDF_Page::GetPageAttr(const CFX_ByteStringC& name) const { | 580 CPDF_Object* CPDF_Page::GetPageAttr(const CFX_ByteStringC& name) const { |
650 return FPDFAPI_GetPageAttr(m_pFormDict, name); | 581 return FPDFAPI_GetPageAttr(m_pFormDict, name); |
651 } | 582 } |
652 | 583 |
653 CPDF_Form::CPDF_Form(CPDF_Document* pDoc, | |
654 CPDF_Dictionary* pPageResources, | |
655 CPDF_Stream* pFormStream, | |
656 CPDF_Dictionary* pParentResources) { | |
657 m_pDocument = pDoc; | |
658 m_pFormStream = pFormStream; | |
659 m_pFormDict = pFormStream ? pFormStream->GetDict() : NULL; | |
660 m_pResources = m_pFormDict->GetDictBy("Resources"); | |
661 m_pPageResources = pPageResources; | |
662 if (!m_pResources) { | |
663 m_pResources = pParentResources; | |
664 } | |
665 if (!m_pResources) { | |
666 m_pResources = pPageResources; | |
667 } | |
668 m_Transparency = 0; | |
669 LoadTransInfo(); | |
670 } | |
671 | |
672 CPDF_Form::~CPDF_Form() {} | |
673 | |
674 void CPDF_Form::StartParse(CPDF_AllStates* pGraphicStates, | |
675 CFX_Matrix* pParentMatrix, | |
676 CPDF_Type3Char* pType3Char, | |
677 CPDF_ParseOptions* pOptions, | |
678 int level) { | |
679 if (m_ParseState == CONTENT_PARSED || m_ParseState == CONTENT_PARSING) { | |
680 return; | |
681 } | |
682 m_pParser.reset(new CPDF_ContentParser); | |
683 m_pParser->Start(this, pGraphicStates, pParentMatrix, pType3Char, pOptions, | |
684 level); | |
685 m_ParseState = CONTENT_PARSING; | |
686 } | |
687 | |
688 void CPDF_Form::ParseContent(CPDF_AllStates* pGraphicStates, | |
689 CFX_Matrix* pParentMatrix, | |
690 CPDF_Type3Char* pType3Char, | |
691 CPDF_ParseOptions* pOptions, | |
692 int level) { | |
693 StartParse(pGraphicStates, pParentMatrix, pType3Char, pOptions, level); | |
694 ContinueParse(NULL); | |
695 } | |
696 | |
697 CPDF_Form* CPDF_Form::Clone() const { | |
698 CPDF_Form* pCloneForm = | |
699 new CPDF_Form(m_pDocument, m_pPageResources, m_pFormStream, m_pResources); | |
700 for (const auto& pObj : m_PageObjectList) | |
701 pCloneForm->m_PageObjectList.emplace_back(pObj->Clone()); | |
702 | |
703 return pCloneForm; | |
704 } | |
705 | |
706 void CPDF_Page::GetDisplayMatrix(CFX_Matrix& matrix, | 584 void CPDF_Page::GetDisplayMatrix(CFX_Matrix& matrix, |
707 int xPos, | 585 int xPos, |
708 int yPos, | 586 int yPos, |
709 int xSize, | 587 int xSize, |
710 int ySize, | 588 int ySize, |
711 int iRotate) const { | 589 int iRotate) const { |
712 if (m_PageWidth == 0 || m_PageHeight == 0) { | 590 if (m_PageWidth == 0 || m_PageHeight == 0) { |
713 return; | 591 return; |
714 } | 592 } |
715 CFX_Matrix display_matrix; | 593 CFX_Matrix display_matrix; |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
749 y2 = yPos; | 627 y2 = yPos; |
750 break; | 628 break; |
751 } | 629 } |
752 display_matrix.Set( | 630 display_matrix.Set( |
753 ((FX_FLOAT)(x2 - x0)) / m_PageWidth, ((FX_FLOAT)(y2 - y0)) / m_PageWidth, | 631 ((FX_FLOAT)(x2 - x0)) / m_PageWidth, ((FX_FLOAT)(y2 - y0)) / m_PageWidth, |
754 ((FX_FLOAT)(x1 - x0)) / m_PageHeight, | 632 ((FX_FLOAT)(x1 - x0)) / m_PageHeight, |
755 ((FX_FLOAT)(y1 - y0)) / m_PageHeight, (FX_FLOAT)x0, (FX_FLOAT)y0); | 633 ((FX_FLOAT)(y1 - y0)) / m_PageHeight, (FX_FLOAT)x0, (FX_FLOAT)y0); |
756 matrix = m_PageMatrix; | 634 matrix = m_PageMatrix; |
757 matrix.Concat(display_matrix); | 635 matrix.Concat(display_matrix); |
758 } | 636 } |
759 | |
760 CPDF_ParseOptions::CPDF_ParseOptions() { | |
761 m_bTextOnly = FALSE; | |
762 m_bMarkedContent = TRUE; | |
763 m_bSeparateForm = TRUE; | |
764 m_bDecodeInlineImage = FALSE; | |
765 } | |
OLD | NEW |