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 "pageint.h" | 7 #include "pageint.h" |
8 | 8 |
9 #include "core/include/fpdfapi/fpdf_module.h" | 9 #include "core/include/fpdfapi/fpdf_module.h" |
10 #include "core/include/fpdfapi/fpdf_page.h" | 10 #include "core/include/fpdfapi/fpdf_page.h" |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
58 ((CPDF_TextObject*)this)->RecalcPositionData(); | 58 ((CPDF_TextObject*)this)->RecalcPositionData(); |
59 break; | 59 break; |
60 case PDFPAGE_PATH: | 60 case PDFPAGE_PATH: |
61 ((CPDF_PathObject*)this)->CalcBoundingBox(); | 61 ((CPDF_PathObject*)this)->CalcBoundingBox(); |
62 break; | 62 break; |
63 case PDFPAGE_SHADING: | 63 case PDFPAGE_SHADING: |
64 ((CPDF_ShadingObject*)this)->CalcBoundingBox(); | 64 ((CPDF_ShadingObject*)this)->CalcBoundingBox(); |
65 break; | 65 break; |
66 } | 66 } |
67 } | 67 } |
68 void CPDF_PageObject::TransformClipPath(CFX_AffineMatrix& matrix) { | 68 void CPDF_PageObject::TransformClipPath(CFX_Matrix& matrix) { |
69 if (m_ClipPath.IsNull()) { | 69 if (m_ClipPath.IsNull()) { |
70 return; | 70 return; |
71 } | 71 } |
72 m_ClipPath.GetModify(); | 72 m_ClipPath.GetModify(); |
73 m_ClipPath.Transform(matrix); | 73 m_ClipPath.Transform(matrix); |
74 } | 74 } |
75 void CPDF_PageObject::TransformGeneralState(CFX_AffineMatrix& matrix) { | 75 void CPDF_PageObject::TransformGeneralState(CFX_Matrix& matrix) { |
76 if (m_GeneralState.IsNull()) { | 76 if (m_GeneralState.IsNull()) { |
77 return; | 77 return; |
78 } | 78 } |
79 CPDF_GeneralStateData* pGS = m_GeneralState.GetModify(); | 79 CPDF_GeneralStateData* pGS = m_GeneralState.GetModify(); |
80 pGS->m_Matrix.Concat(matrix); | 80 pGS->m_Matrix.Concat(matrix); |
81 } | 81 } |
82 FX_RECT CPDF_PageObject::GetBBox(const CFX_AffineMatrix* pMatrix) const { | 82 FX_RECT CPDF_PageObject::GetBBox(const CFX_Matrix* pMatrix) const { |
83 CFX_FloatRect rect(m_Left, m_Bottom, m_Right, m_Top); | 83 CFX_FloatRect rect(m_Left, m_Bottom, m_Right, m_Top); |
84 if (pMatrix) { | 84 if (pMatrix) { |
85 pMatrix->TransformRect(rect); | 85 pMatrix->TransformRect(rect); |
86 } | 86 } |
87 return rect.GetOutterRect(); | 87 return rect.GetOutterRect(); |
88 } | 88 } |
89 | 89 |
90 CPDF_TextObject::CPDF_TextObject() | 90 CPDF_TextObject::CPDF_TextObject() |
91 : m_PosX(0), | 91 : m_PosX(0), |
92 m_PosY(0), | 92 m_PosY(0), |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
202 for (int i = 0; i < m_nChars - 1; ++i) { | 202 for (int i = 0; i < m_nChars - 1; ++i) { |
203 m_pCharPos[i] = pSrcObj->m_pCharPos[i]; | 203 m_pCharPos[i] = pSrcObj->m_pCharPos[i]; |
204 } | 204 } |
205 } else { | 205 } else { |
206 m_pCharCodes = pSrcObj->m_pCharCodes; | 206 m_pCharCodes = pSrcObj->m_pCharCodes; |
207 } | 207 } |
208 m_PosX = pSrcObj->m_PosX; | 208 m_PosX = pSrcObj->m_PosX; |
209 m_PosY = pSrcObj->m_PosY; | 209 m_PosY = pSrcObj->m_PosY; |
210 } | 210 } |
211 | 211 |
212 void CPDF_TextObject::GetTextMatrix(CFX_AffineMatrix* pMatrix) const { | 212 void CPDF_TextObject::GetTextMatrix(CFX_Matrix* pMatrix) const { |
213 FX_FLOAT* pTextMatrix = m_TextState.GetMatrix(); | 213 FX_FLOAT* pTextMatrix = m_TextState.GetMatrix(); |
214 pMatrix->Set(pTextMatrix[0], pTextMatrix[2], pTextMatrix[1], pTextMatrix[3], | 214 pMatrix->Set(pTextMatrix[0], pTextMatrix[2], pTextMatrix[1], pTextMatrix[3], |
215 m_PosX, m_PosY); | 215 m_PosX, m_PosY); |
216 } | 216 } |
217 | 217 |
218 void CPDF_TextObject::SetSegments(const CFX_ByteString* pStrs, | 218 void CPDF_TextObject::SetSegments(const CFX_ByteString* pStrs, |
219 FX_FLOAT* pKerning, | 219 FX_FLOAT* pKerning, |
220 int nsegs) { | 220 int nsegs) { |
221 if (m_nChars > 1) { | 221 if (m_nChars > 1) { |
222 FX_Free(m_pCharCodes); | 222 FX_Free(m_pCharCodes); |
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
502 } else { | 502 } else { |
503 if (pTextAdvanceX) { | 503 if (pTextAdvanceX) { |
504 *pTextAdvanceX = FXSYS_Mul(curpos, horz_scale); | 504 *pTextAdvanceX = FXSYS_Mul(curpos, horz_scale); |
505 } | 505 } |
506 if (pTextAdvanceY) { | 506 if (pTextAdvanceY) { |
507 *pTextAdvanceY = 0; | 507 *pTextAdvanceY = 0; |
508 } | 508 } |
509 min_y = min_y * fontsize / 1000; | 509 min_y = min_y * fontsize / 1000; |
510 max_y = max_y * fontsize / 1000; | 510 max_y = max_y * fontsize / 1000; |
511 } | 511 } |
512 CFX_AffineMatrix matrix; | 512 CFX_Matrix matrix; |
513 GetTextMatrix(&matrix); | 513 GetTextMatrix(&matrix); |
514 m_Left = min_x; | 514 m_Left = min_x; |
515 m_Right = max_x; | 515 m_Right = max_x; |
516 m_Bottom = min_y; | 516 m_Bottom = min_y; |
517 m_Top = max_y; | 517 m_Top = max_y; |
518 matrix.TransformRect(m_Left, m_Right, m_Top, m_Bottom); | 518 matrix.TransformRect(m_Left, m_Right, m_Top, m_Bottom); |
519 int textmode = m_TextState.GetObject()->m_TextMode; | 519 int textmode = m_TextState.GetObject()->m_TextMode; |
520 if (textmode == 1 || textmode == 2 || textmode == 5 || textmode == 6) { | 520 if (textmode == 1 || textmode == 2 || textmode == 5 || textmode == 6) { |
521 FX_FLOAT half_width = m_GraphState.GetObject()->m_LineWidth / 2; | 521 FX_FLOAT half_width = m_GraphState.GetObject()->m_LineWidth / 2; |
522 m_Left -= half_width; | 522 m_Left -= half_width; |
(...skipping 23 matching lines...) Expand all Loading... |
546 FX_WORD CID = pCIDFont->CIDFromCharCode(charcode); | 546 FX_WORD CID = pCIDFont->CIDFromCharCode(charcode); |
547 charwidth = pCIDFont->GetVertWidth(CID) * fontsize / 1000; | 547 charwidth = pCIDFont->GetVertWidth(CID) * fontsize / 1000; |
548 } else { | 548 } else { |
549 charwidth = pFont->GetCharWidthF(charcode) * fontsize / 1000; | 549 charwidth = pFont->GetCharWidthF(charcode) * fontsize / 1000; |
550 } | 550 } |
551 pPosArray[index] = pPosArray[index - 1] + charwidth; | 551 pPosArray[index] = pPosArray[index - 1] + charwidth; |
552 index++; | 552 index++; |
553 } | 553 } |
554 } | 554 } |
555 | 555 |
556 void CPDF_TextObject::Transform(const CFX_AffineMatrix& matrix) { | 556 void CPDF_TextObject::Transform(const CFX_Matrix& matrix) { |
557 m_TextState.GetModify(); | 557 m_TextState.GetModify(); |
558 CFX_AffineMatrix text_matrix; | 558 CFX_Matrix text_matrix; |
559 GetTextMatrix(&text_matrix); | 559 GetTextMatrix(&text_matrix); |
560 text_matrix.Concat(matrix); | 560 text_matrix.Concat(matrix); |
561 FX_FLOAT* pTextMatrix = m_TextState.GetMatrix(); | 561 FX_FLOAT* pTextMatrix = m_TextState.GetMatrix(); |
562 pTextMatrix[0] = text_matrix.GetA(); | 562 pTextMatrix[0] = text_matrix.GetA(); |
563 pTextMatrix[1] = text_matrix.GetC(); | 563 pTextMatrix[1] = text_matrix.GetC(); |
564 pTextMatrix[2] = text_matrix.GetB(); | 564 pTextMatrix[2] = text_matrix.GetB(); |
565 pTextMatrix[3] = text_matrix.GetD(); | 565 pTextMatrix[3] = text_matrix.GetD(); |
566 m_PosX = text_matrix.GetE(); | 566 m_PosX = text_matrix.GetE(); |
567 m_PosY = text_matrix.GetF(); | 567 m_PosY = text_matrix.GetF(); |
568 CalcPositionData(nullptr, nullptr, 0); | 568 CalcPositionData(nullptr, nullptr, 0); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
616 CPDF_ShadingObject* pSrcObj = (CPDF_ShadingObject*)pSrc; | 616 CPDF_ShadingObject* pSrcObj = (CPDF_ShadingObject*)pSrc; |
617 m_pShading = pSrcObj->m_pShading; | 617 m_pShading = pSrcObj->m_pShading; |
618 if (m_pShading && m_pShading->m_pDocument) { | 618 if (m_pShading && m_pShading->m_pDocument) { |
619 CPDF_DocPageData* pDocPageData = m_pShading->m_pDocument->GetPageData(); | 619 CPDF_DocPageData* pDocPageData = m_pShading->m_pDocument->GetPageData(); |
620 m_pShading = (CPDF_ShadingPattern*)pDocPageData->GetPattern( | 620 m_pShading = (CPDF_ShadingPattern*)pDocPageData->GetPattern( |
621 m_pShading->m_pShadingObj, m_pShading->m_bShadingObj, | 621 m_pShading->m_pShadingObj, m_pShading->m_bShadingObj, |
622 &m_pShading->m_ParentMatrix); | 622 &m_pShading->m_ParentMatrix); |
623 } | 623 } |
624 m_Matrix = pSrcObj->m_Matrix; | 624 m_Matrix = pSrcObj->m_Matrix; |
625 } | 625 } |
626 void CPDF_ShadingObject::Transform(const CFX_AffineMatrix& matrix) { | 626 void CPDF_ShadingObject::Transform(const CFX_Matrix& matrix) { |
627 if (!m_ClipPath.IsNull()) { | 627 if (!m_ClipPath.IsNull()) { |
628 m_ClipPath.GetModify(); | 628 m_ClipPath.GetModify(); |
629 m_ClipPath.Transform(matrix); | 629 m_ClipPath.Transform(matrix); |
630 } | 630 } |
631 m_Matrix.Concat(matrix); | 631 m_Matrix.Concat(matrix); |
632 if (!m_ClipPath.IsNull()) { | 632 if (!m_ClipPath.IsNull()) { |
633 CalcBoundingBox(); | 633 CalcBoundingBox(); |
634 } else { | 634 } else { |
635 matrix.TransformRect(m_Left, m_Right, m_Top, m_Bottom); | 635 matrix.TransformRect(m_Left, m_Right, m_Top, m_Bottom); |
636 } | 636 } |
637 } | 637 } |
638 void CPDF_ShadingObject::CalcBoundingBox() { | 638 void CPDF_ShadingObject::CalcBoundingBox() { |
639 if (m_ClipPath.IsNull()) { | 639 if (m_ClipPath.IsNull()) { |
640 return; | 640 return; |
641 } | 641 } |
642 CFX_FloatRect rect = m_ClipPath.GetClipBox(); | 642 CFX_FloatRect rect = m_ClipPath.GetClipBox(); |
643 m_Left = rect.left; | 643 m_Left = rect.left; |
644 m_Bottom = rect.bottom; | 644 m_Bottom = rect.bottom; |
645 m_Right = rect.right; | 645 m_Right = rect.right; |
646 m_Top = rect.top; | 646 m_Top = rect.top; |
647 } | 647 } |
648 CPDF_FormObject::~CPDF_FormObject() { | 648 CPDF_FormObject::~CPDF_FormObject() { |
649 delete m_pForm; | 649 delete m_pForm; |
650 } | 650 } |
651 void CPDF_FormObject::Transform(const CFX_AffineMatrix& matrix) { | 651 void CPDF_FormObject::Transform(const CFX_Matrix& matrix) { |
652 m_FormMatrix.Concat(matrix); | 652 m_FormMatrix.Concat(matrix); |
653 CalcBoundingBox(); | 653 CalcBoundingBox(); |
654 } | 654 } |
655 void CPDF_FormObject::CopyData(const CPDF_PageObject* pSrc) { | 655 void CPDF_FormObject::CopyData(const CPDF_PageObject* pSrc) { |
656 const CPDF_FormObject* pSrcObj = (const CPDF_FormObject*)pSrc; | 656 const CPDF_FormObject* pSrcObj = (const CPDF_FormObject*)pSrc; |
657 delete m_pForm; | 657 delete m_pForm; |
658 m_pForm = pSrcObj->m_pForm->Clone(); | 658 m_pForm = pSrcObj->m_pForm->Clone(); |
659 m_FormMatrix = pSrcObj->m_FormMatrix; | 659 m_FormMatrix = pSrcObj->m_FormMatrix; |
660 } | 660 } |
661 void CPDF_FormObject::CalcBoundingBox() { | 661 void CPDF_FormObject::CalcBoundingBox() { |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
718 } | 718 } |
719 return -1; | 719 return -1; |
720 } | 720 } |
721 CPDF_PageObject* CPDF_PageObjects::GetObjectByIndex(int index) const { | 721 CPDF_PageObject* CPDF_PageObjects::GetObjectByIndex(int index) const { |
722 FX_POSITION pos = m_ObjectList.FindIndex(index); | 722 FX_POSITION pos = m_ObjectList.FindIndex(index); |
723 if (pos == NULL) { | 723 if (pos == NULL) { |
724 return NULL; | 724 return NULL; |
725 } | 725 } |
726 return (CPDF_PageObject*)m_ObjectList.GetAt(pos); | 726 return (CPDF_PageObject*)m_ObjectList.GetAt(pos); |
727 } | 727 } |
728 void CPDF_PageObjects::Transform(const CFX_AffineMatrix& matrix) { | 728 void CPDF_PageObjects::Transform(const CFX_Matrix& matrix) { |
729 FX_POSITION pos = m_ObjectList.GetHeadPosition(); | 729 FX_POSITION pos = m_ObjectList.GetHeadPosition(); |
730 while (pos) { | 730 while (pos) { |
731 CPDF_PageObject* pObj = (CPDF_PageObject*)m_ObjectList.GetNext(pos); | 731 CPDF_PageObject* pObj = (CPDF_PageObject*)m_ObjectList.GetNext(pos); |
732 pObj->Transform(matrix); | 732 pObj->Transform(matrix); |
733 } | 733 } |
734 } | 734 } |
735 CFX_FloatRect CPDF_PageObjects::CalcBoundingBox() const { | 735 CFX_FloatRect CPDF_PageObjects::CalcBoundingBox() const { |
736 if (m_ObjectList.GetCount() == 0) { | 736 if (m_ObjectList.GetCount() == 0) { |
737 return CFX_FloatRect(0, 0, 0, 0); | 737 return CFX_FloatRect(0, 0, 0, 0); |
738 } | 738 } |
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
916 m_pResources = pParentResources; | 916 m_pResources = pParentResources; |
917 } | 917 } |
918 if (m_pResources == NULL) { | 918 if (m_pResources == NULL) { |
919 m_pResources = pPageResources; | 919 m_pResources = pPageResources; |
920 } | 920 } |
921 m_Transparency = 0; | 921 m_Transparency = 0; |
922 LoadTransInfo(); | 922 LoadTransInfo(); |
923 } | 923 } |
924 CPDF_Form::~CPDF_Form() {} | 924 CPDF_Form::~CPDF_Form() {} |
925 void CPDF_Form::StartParse(CPDF_AllStates* pGraphicStates, | 925 void CPDF_Form::StartParse(CPDF_AllStates* pGraphicStates, |
926 CFX_AffineMatrix* pParentMatrix, | 926 CFX_Matrix* pParentMatrix, |
927 CPDF_Type3Char* pType3Char, | 927 CPDF_Type3Char* pType3Char, |
928 CPDF_ParseOptions* pOptions, | 928 CPDF_ParseOptions* pOptions, |
929 int level) { | 929 int level) { |
930 if (m_ParseState == CONTENT_PARSED || m_ParseState == CONTENT_PARSING) { | 930 if (m_ParseState == CONTENT_PARSED || m_ParseState == CONTENT_PARSING) { |
931 return; | 931 return; |
932 } | 932 } |
933 m_pParser = new CPDF_ContentParser; | 933 m_pParser = new CPDF_ContentParser; |
934 m_pParser->Start(this, pGraphicStates, pParentMatrix, pType3Char, pOptions, | 934 m_pParser->Start(this, pGraphicStates, pParentMatrix, pType3Char, pOptions, |
935 level); | 935 level); |
936 m_ParseState = CONTENT_PARSING; | 936 m_ParseState = CONTENT_PARSING; |
937 } | 937 } |
938 void CPDF_Form::ParseContent(CPDF_AllStates* pGraphicStates, | 938 void CPDF_Form::ParseContent(CPDF_AllStates* pGraphicStates, |
939 CFX_AffineMatrix* pParentMatrix, | 939 CFX_Matrix* pParentMatrix, |
940 CPDF_Type3Char* pType3Char, | 940 CPDF_Type3Char* pType3Char, |
941 CPDF_ParseOptions* pOptions, | 941 CPDF_ParseOptions* pOptions, |
942 int level) { | 942 int level) { |
943 StartParse(pGraphicStates, pParentMatrix, pType3Char, pOptions, level); | 943 StartParse(pGraphicStates, pParentMatrix, pType3Char, pOptions, level); |
944 ContinueParse(NULL); | 944 ContinueParse(NULL); |
945 } | 945 } |
946 CPDF_Form* CPDF_Form::Clone() const { | 946 CPDF_Form* CPDF_Form::Clone() const { |
947 CPDF_Form* pClone = | 947 CPDF_Form* pClone = |
948 new CPDF_Form(m_pDocument, m_pPageResources, m_pFormStream, m_pResources); | 948 new CPDF_Form(m_pDocument, m_pPageResources, m_pFormStream, m_pResources); |
949 FX_POSITION pos = m_ObjectList.GetHeadPosition(); | 949 FX_POSITION pos = m_ObjectList.GetHeadPosition(); |
950 while (pos) { | 950 while (pos) { |
951 CPDF_PageObject* pObj = (CPDF_PageObject*)m_ObjectList.GetNext(pos); | 951 CPDF_PageObject* pObj = (CPDF_PageObject*)m_ObjectList.GetNext(pos); |
952 pClone->m_ObjectList.AddTail(pObj->Clone()); | 952 pClone->m_ObjectList.AddTail(pObj->Clone()); |
953 } | 953 } |
954 return pClone; | 954 return pClone; |
955 } | 955 } |
956 void CPDF_Page::GetDisplayMatrix(CFX_AffineMatrix& matrix, | 956 void CPDF_Page::GetDisplayMatrix(CFX_Matrix& matrix, |
957 int xPos, | 957 int xPos, |
958 int yPos, | 958 int yPos, |
959 int xSize, | 959 int xSize, |
960 int ySize, | 960 int ySize, |
961 int iRotate) const { | 961 int iRotate) const { |
962 if (m_PageWidth == 0 || m_PageHeight == 0) { | 962 if (m_PageWidth == 0 || m_PageHeight == 0) { |
963 return; | 963 return; |
964 } | 964 } |
965 CFX_AffineMatrix display_matrix; | 965 CFX_Matrix display_matrix; |
966 int x0, y0, x1, y1, x2, y2; | 966 int x0, y0, x1, y1, x2, y2; |
967 iRotate %= 4; | 967 iRotate %= 4; |
968 switch (iRotate) { | 968 switch (iRotate) { |
969 case 0: | 969 case 0: |
970 x0 = xPos; | 970 x0 = xPos; |
971 y0 = yPos + ySize; | 971 y0 = yPos + ySize; |
972 x1 = xPos; | 972 x1 = xPos; |
973 y1 = yPos; | 973 y1 = yPos; |
974 x2 = xPos + xSize; | 974 x2 = xPos + xSize; |
975 y2 = yPos + ySize; | 975 y2 = yPos + ySize; |
(...skipping 30 matching lines...) Expand all Loading... |
1006 (FX_FLOAT)y0); | 1006 (FX_FLOAT)y0); |
1007 matrix = m_PageMatrix; | 1007 matrix = m_PageMatrix; |
1008 matrix.Concat(display_matrix); | 1008 matrix.Concat(display_matrix); |
1009 } | 1009 } |
1010 CPDF_ParseOptions::CPDF_ParseOptions() { | 1010 CPDF_ParseOptions::CPDF_ParseOptions() { |
1011 m_bTextOnly = FALSE; | 1011 m_bTextOnly = FALSE; |
1012 m_bMarkedContent = TRUE; | 1012 m_bMarkedContent = TRUE; |
1013 m_bSeparateForm = TRUE; | 1013 m_bSeparateForm = TRUE; |
1014 m_bDecodeInlineImage = FALSE; | 1014 m_bDecodeInlineImage = FALSE; |
1015 } | 1015 } |
OLD | NEW |