| 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 |