| OLD | NEW |
| 1 // Copyright 2017 PDFium Authors. All rights reserved. | 1 // Copyright 2017 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 "xfa/fxfa/app/cxfa_textlayout.h" | 7 #include "xfa/fxfa/app/cxfa_textlayout.h" |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <utility> |
| 10 | 11 |
| 11 #include "third_party/base/ptr_util.h" | 12 #include "third_party/base/ptr_util.h" |
| 12 #include "third_party/base/stl_util.h" | 13 #include "third_party/base/stl_util.h" |
| 13 #include "xfa/fde/cfde_path.h" | 14 #include "xfa/fde/cfde_path.h" |
| 14 #include "xfa/fde/fde_gedevice.h" | 15 #include "xfa/fde/fde_gedevice.h" |
| 15 #include "xfa/fde/fde_object.h" | 16 #include "xfa/fde/fde_object.h" |
| 16 #include "xfa/fde/xml/fde_xml_imp.h" | 17 #include "xfa/fde/xml/fde_xml_imp.h" |
| 17 #include "xfa/fxfa/app/cxfa_linkuserdata.h" | 18 #include "xfa/fxfa/app/cxfa_linkuserdata.h" |
| 18 #include "xfa/fxfa/app/cxfa_loadercontext.h" | 19 #include "xfa/fxfa/app/cxfa_loadercontext.h" |
| 19 #include "xfa/fxfa/app/cxfa_pieceline.h" | 20 #include "xfa/fxfa/app/cxfa_pieceline.h" |
| (...skipping 18 matching lines...) Expand all Loading... |
| 38 m_bBlockContinue(true) { | 39 m_bBlockContinue(true) { |
| 39 ASSERT(m_pTextProvider); | 40 ASSERT(m_pTextProvider); |
| 40 } | 41 } |
| 41 | 42 |
| 42 CXFA_TextLayout::~CXFA_TextLayout() { | 43 CXFA_TextLayout::~CXFA_TextLayout() { |
| 43 m_textParser.Reset(); | 44 m_textParser.Reset(); |
| 44 Unload(); | 45 Unload(); |
| 45 } | 46 } |
| 46 | 47 |
| 47 void CXFA_TextLayout::Unload() { | 48 void CXFA_TextLayout::Unload() { |
| 48 for (int32_t i = 0; i < m_pieceLines.GetSize(); i++) { | 49 m_pieceLines.clear(); |
| 49 CXFA_PieceLine* pLine = m_pieceLines.GetAt(i); | |
| 50 for (int32_t i = 0; i < pLine->m_textPieces.GetSize(); i++) { | |
| 51 XFA_TextPiece* pPiece = pLine->m_textPieces.GetAt(i); | |
| 52 // Release text and widths in a text piece. | |
| 53 delete pPiece->pszText; | |
| 54 delete pPiece->pWidths; | |
| 55 // Release text piece. | |
| 56 delete pPiece; | |
| 57 } | |
| 58 pLine->m_textPieces.RemoveAll(); | |
| 59 // Release line. | |
| 60 delete pLine; | |
| 61 } | |
| 62 m_pieceLines.RemoveAll(); | |
| 63 m_pBreak.reset(); | 50 m_pBreak.reset(); |
| 64 } | 51 } |
| 65 | 52 |
| 66 const CFX_ArrayTemplate<CXFA_PieceLine*>* CXFA_TextLayout::GetPieceLines() { | |
| 67 return &m_pieceLines; | |
| 68 } | |
| 69 | |
| 70 void CXFA_TextLayout::GetTextDataNode() { | 53 void CXFA_TextLayout::GetTextDataNode() { |
| 71 if (!m_pTextProvider) | 54 if (!m_pTextProvider) |
| 72 return; | 55 return; |
| 73 | 56 |
| 74 CXFA_Node* pNode = m_pTextProvider->GetTextNode(m_bRichText); | 57 CXFA_Node* pNode = m_pTextProvider->GetTextNode(m_bRichText); |
| 75 if (pNode && m_bRichText) | 58 if (pNode && m_bRichText) |
| 76 m_textParser.Reset(); | 59 m_textParser.Reset(); |
| 77 | 60 |
| 78 m_pTextDataNode = pNode; | 61 m_pTextDataNode = pNode; |
| 79 } | 62 } |
| (...skipping 502 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 582 if (!pFxDevice) | 565 if (!pFxDevice) |
| 583 return false; | 566 return false; |
| 584 | 567 |
| 585 std::unique_ptr<CFDE_RenderDevice> pDevice( | 568 std::unique_ptr<CFDE_RenderDevice> pDevice( |
| 586 new CFDE_RenderDevice(pFxDevice, false)); | 569 new CFDE_RenderDevice(pFxDevice, false)); |
| 587 pDevice->SaveState(); | 570 pDevice->SaveState(); |
| 588 pDevice->SetClipRect(rtClip); | 571 pDevice->SetClipRect(rtClip); |
| 589 | 572 |
| 590 auto pSolidBrush = pdfium::MakeUnique<CFDE_Brush>(); | 573 auto pSolidBrush = pdfium::MakeUnique<CFDE_Brush>(); |
| 591 auto pPen = pdfium::MakeUnique<CFDE_Pen>(); | 574 auto pPen = pdfium::MakeUnique<CFDE_Pen>(); |
| 592 if (m_pieceLines.GetSize() == 0) { | 575 if (m_pieceLines.empty()) { |
| 593 int32_t iBlockCount = CountBlocks(); | 576 int32_t iBlockCount = CountBlocks(); |
| 594 for (int32_t i = 0; i < iBlockCount; i++) | 577 for (int32_t i = 0; i < iBlockCount; i++) |
| 595 Layout(i); | 578 Layout(i); |
| 596 } | 579 } |
| 597 | 580 |
| 598 FXTEXT_CHARPOS* pCharPos = nullptr; | 581 FXTEXT_CHARPOS* pCharPos = nullptr; |
| 599 int32_t iCharCount = 0; | 582 int32_t iCharCount = 0; |
| 600 int32_t iLineStart = 0; | 583 int32_t iLineStart = 0; |
| 601 int32_t iPieceLines = m_pieceLines.GetSize(); | 584 int32_t iPieceLines = pdfium::CollectionSize<int32_t>(m_pieceLines); |
| 602 int32_t iCount = m_Blocks.GetSize(); | 585 int32_t iCount = m_Blocks.GetSize(); |
| 603 if (iCount > 0) { | 586 if (iCount > 0) { |
| 604 iBlock *= 2; | 587 iBlock *= 2; |
| 605 if (iBlock < iCount) { | 588 if (iBlock < iCount) { |
| 606 iLineStart = m_Blocks.ElementAt(iBlock); | 589 iLineStart = m_Blocks.ElementAt(iBlock); |
| 607 iPieceLines = m_Blocks.ElementAt(iBlock + 1); | 590 iPieceLines = m_Blocks.ElementAt(iBlock + 1); |
| 608 } else { | 591 } else { |
| 609 iPieceLines = 0; | 592 iPieceLines = 0; |
| 610 } | 593 } |
| 611 } | 594 } |
| 612 | 595 |
| 613 for (int32_t i = 0; i < iPieceLines; i++) { | 596 for (int32_t i = 0; i < iPieceLines; i++) { |
| 614 if (i + iLineStart >= m_pieceLines.GetSize()) | 597 if (i + iLineStart >= pdfium::CollectionSize<int32_t>(m_pieceLines)) |
| 615 break; | 598 break; |
| 616 | 599 |
| 617 CXFA_PieceLine* pPieceLine = m_pieceLines.GetAt(i + iLineStart); | 600 CXFA_PieceLine* pPieceLine = m_pieceLines[i + iLineStart].get(); |
| 618 int32_t iPieces = pPieceLine->m_textPieces.GetSize(); | 601 int32_t iPieces = pdfium::CollectionSize<int32_t>(pPieceLine->m_textPieces); |
| 619 int32_t j = 0; | 602 int32_t j = 0; |
| 620 for (j = 0; j < iPieces; j++) { | 603 for (j = 0; j < iPieces; j++) { |
| 621 const XFA_TextPiece* pPiece = pPieceLine->m_textPieces.GetAt(j); | 604 const XFA_TextPiece* pPiece = pPieceLine->m_textPieces[j].get(); |
| 622 int32_t iChars = pPiece->iChars; | 605 int32_t iChars = pPiece->iChars; |
| 623 if (iCharCount < iChars) { | 606 if (iCharCount < iChars) { |
| 624 FX_Free(pCharPos); | 607 FX_Free(pCharPos); |
| 625 pCharPos = FX_Alloc(FXTEXT_CHARPOS, iChars); | 608 pCharPos = FX_Alloc(FXTEXT_CHARPOS, iChars); |
| 626 iCharCount = iChars; | 609 iCharCount = iChars; |
| 627 } | 610 } |
| 628 FXSYS_memset(pCharPos, 0, iCharCount * sizeof(FXTEXT_CHARPOS)); | 611 FXSYS_memset(pCharPos, 0, iCharCount * sizeof(FXTEXT_CHARPOS)); |
| 629 RenderString(pDevice.get(), pSolidBrush.get(), pPieceLine, j, pCharPos, | 612 RenderString(pDevice.get(), pSolidBrush.get(), pPieceLine, j, pCharPos, |
| 630 tmDoc2Device); | 613 tmDoc2Device); |
| 631 } | 614 } |
| (...skipping 15 matching lines...) Expand all Loading... |
| 647 switch (m_textParser.GetVAlign(m_pTextProvider)) { | 630 switch (m_textParser.GetVAlign(m_pTextProvider)) { |
| 648 case XFA_ATTRIBUTEENUM_Middle: | 631 case XFA_ATTRIBUTEENUM_Middle: |
| 649 fHeight /= 2.0f; | 632 fHeight /= 2.0f; |
| 650 break; | 633 break; |
| 651 case XFA_ATTRIBUTEENUM_Bottom: | 634 case XFA_ATTRIBUTEENUM_Bottom: |
| 652 break; | 635 break; |
| 653 default: | 636 default: |
| 654 return; | 637 return; |
| 655 } | 638 } |
| 656 | 639 |
| 657 int32_t iCount = m_pieceLines.GetSize(); | 640 for (const auto& pPieceLine : m_pieceLines) { |
| 658 for (int32_t i = 0; i < iCount; i++) { | 641 for (const auto& pPiece : pPieceLine->m_textPieces) |
| 659 CXFA_PieceLine* pPieceLine = m_pieceLines.GetAt(i); | 642 pPiece->rtPiece.top += fHeight; |
| 660 int32_t iPieces = pPieceLine->m_textPieces.GetSize(); | |
| 661 for (int32_t j = 0; j < iPieces; j++) { | |
| 662 XFA_TextPiece* pPiece = pPieceLine->m_textPieces.GetAt(j); | |
| 663 CFX_RectF& rect = pPiece->rtPiece; | |
| 664 rect.top += fHeight; | |
| 665 } | |
| 666 } | 643 } |
| 667 } | 644 } |
| 668 | 645 |
| 669 bool CXFA_TextLayout::Loader(const CFX_SizeF& szText, | 646 bool CXFA_TextLayout::Loader(const CFX_SizeF& szText, |
| 670 FX_FLOAT& fLinePos, | 647 FX_FLOAT& fLinePos, |
| 671 bool bSavePieces) { | 648 bool bSavePieces) { |
| 672 GetTextDataNode(); | 649 GetTextDataNode(); |
| 673 if (!m_pTextDataNode) | 650 if (!m_pTextDataNode) |
| 674 return true; | 651 return true; |
| 675 | 652 |
| (...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1001 AppendTextLine(dwStatus, fLinePos, bSavePieces, true); | 978 AppendTextLine(dwStatus, fLinePos, bSavePieces, true); |
| 1002 } | 979 } |
| 1003 | 980 |
| 1004 void CXFA_TextLayout::DoTabstops(IFDE_CSSComputedStyle* pStyle, | 981 void CXFA_TextLayout::DoTabstops(IFDE_CSSComputedStyle* pStyle, |
| 1005 CXFA_PieceLine* pPieceLine) { | 982 CXFA_PieceLine* pPieceLine) { |
| 1006 if (!m_pTabstopContext || m_pTabstopContext->m_iTabCount == 0) | 983 if (!m_pTabstopContext || m_pTabstopContext->m_iTabCount == 0) |
| 1007 return; | 984 return; |
| 1008 if (!pStyle || !pPieceLine) | 985 if (!pStyle || !pPieceLine) |
| 1009 return; | 986 return; |
| 1010 | 987 |
| 1011 int32_t iPieces = pPieceLine->m_textPieces.GetSize(); | 988 int32_t iPieces = pdfium::CollectionSize<int32_t>(pPieceLine->m_textPieces); |
| 1012 if (iPieces == 0) | 989 if (iPieces == 0) |
| 1013 return; | 990 return; |
| 1014 | 991 |
| 1015 XFA_TextPiece* pPiece = pPieceLine->m_textPieces.GetAt(iPieces - 1); | 992 XFA_TextPiece* pPiece = pPieceLine->m_textPieces[iPieces - 1].get(); |
| 1016 int32_t& iTabstopsIndex = m_pTabstopContext->m_iTabIndex; | 993 int32_t& iTabstopsIndex = m_pTabstopContext->m_iTabIndex; |
| 1017 int32_t iCount = m_textParser.CountTabs(pStyle); | 994 int32_t iCount = m_textParser.CountTabs(pStyle); |
| 1018 if (iTabstopsIndex > m_pTabstopContext->m_iTabCount - 1) | 995 if (iTabstopsIndex > m_pTabstopContext->m_iTabCount - 1) |
| 1019 return; | 996 return; |
| 1020 | 997 |
| 1021 if (iCount > 0) { | 998 if (iCount > 0) { |
| 1022 iTabstopsIndex++; | 999 iTabstopsIndex++; |
| 1023 m_pTabstopContext->m_bTabstops = true; | 1000 m_pTabstopContext->m_bTabstops = true; |
| 1024 FX_FLOAT fRight = 0; | 1001 FX_FLOAT fRight = 0; |
| 1025 if (iPieces > 1) { | 1002 if (iPieces > 1) { |
| 1026 XFA_TextPiece* p = pPieceLine->m_textPieces.GetAt(iPieces - 2); | 1003 XFA_TextPiece* p = pPieceLine->m_textPieces[iPieces - 2].get(); |
| 1027 fRight = p->rtPiece.right(); | 1004 fRight = p->rtPiece.right(); |
| 1028 } | 1005 } |
| 1029 m_pTabstopContext->m_fTabWidth = | 1006 m_pTabstopContext->m_fTabWidth = |
| 1030 pPiece->rtPiece.width + pPiece->rtPiece.left - fRight; | 1007 pPiece->rtPiece.width + pPiece->rtPiece.left - fRight; |
| 1031 } else if (iTabstopsIndex > -1) { | 1008 } else if (iTabstopsIndex > -1) { |
| 1032 FX_FLOAT fLeft = 0; | 1009 FX_FLOAT fLeft = 0; |
| 1033 if (m_pTabstopContext->m_bTabstops) { | 1010 if (m_pTabstopContext->m_bTabstops) { |
| 1034 XFA_TABSTOPS* pTabstops = | 1011 XFA_TABSTOPS* pTabstops = |
| 1035 m_pTabstopContext->m_tabstops.GetDataPtr(iTabstopsIndex); | 1012 m_pTabstopContext->m_tabstops.GetDataPtr(iTabstopsIndex); |
| 1036 uint32_t dwAlign = pTabstops->dwAlign; | 1013 uint32_t dwAlign = pTabstops->dwAlign; |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1060 void CXFA_TextLayout::AppendTextLine(uint32_t dwStatus, | 1037 void CXFA_TextLayout::AppendTextLine(uint32_t dwStatus, |
| 1061 FX_FLOAT& fLinePos, | 1038 FX_FLOAT& fLinePos, |
| 1062 bool bSavePieces, | 1039 bool bSavePieces, |
| 1063 bool bEndBreak) { | 1040 bool bEndBreak) { |
| 1064 int32_t iPieces = m_pBreak->CountBreakPieces(); | 1041 int32_t iPieces = m_pBreak->CountBreakPieces(); |
| 1065 if (iPieces < 1) | 1042 if (iPieces < 1) |
| 1066 return; | 1043 return; |
| 1067 | 1044 |
| 1068 IFDE_CSSComputedStyle* pStyle = nullptr; | 1045 IFDE_CSSComputedStyle* pStyle = nullptr; |
| 1069 if (bSavePieces) { | 1046 if (bSavePieces) { |
| 1070 CXFA_PieceLine* pPieceLine = new CXFA_PieceLine; | 1047 auto pNew = pdfium::MakeUnique<CXFA_PieceLine>(); |
| 1071 m_pieceLines.Add(pPieceLine); | 1048 CXFA_PieceLine* pPieceLine = pNew.get(); |
| 1049 m_pieceLines.push_back(std::move(pNew)); |
| 1072 if (m_pTabstopContext) | 1050 if (m_pTabstopContext) |
| 1073 m_pTabstopContext->Reset(); | 1051 m_pTabstopContext->Reset(); |
| 1074 | 1052 |
| 1075 FX_FLOAT fLineStep = 0, fBaseLine = 0; | 1053 FX_FLOAT fLineStep = 0, fBaseLine = 0; |
| 1076 int32_t i = 0; | 1054 int32_t i = 0; |
| 1077 for (i = 0; i < iPieces; i++) { | 1055 for (i = 0; i < iPieces; i++) { |
| 1078 const CFX_RTFPiece* pPiece = m_pBreak->GetBreakPiece(i); | 1056 const CFX_RTFPiece* pPiece = m_pBreak->GetBreakPiece(i); |
| 1079 CXFA_TextUserData* pUserData = (CXFA_TextUserData*)pPiece->m_pUserData; | 1057 CXFA_TextUserData* pUserData = (CXFA_TextUserData*)pPiece->m_pUserData; |
| 1080 if (pUserData) | 1058 if (pUserData) |
| 1081 pStyle = pUserData->m_pStyle; | 1059 pStyle = pUserData->m_pStyle; |
| 1082 FX_FLOAT fVerScale = pPiece->m_iVerticalScale / 100.0f; | 1060 FX_FLOAT fVerScale = pPiece->m_iVerticalScale / 100.0f; |
| 1083 | 1061 |
| 1084 XFA_TextPiece* pTP = new XFA_TextPiece(); | 1062 auto pTP = pdfium::MakeUnique<XFA_TextPiece>(); |
| 1085 pTP->pszText = | 1063 pTP->pszText = FX_Alloc(FX_WCHAR, pPiece->m_iChars); |
| 1086 (FX_WCHAR*)FX_Alloc(uint8_t, pPiece->m_iChars * sizeof(FX_WCHAR)); | 1064 pTP->pWidths = FX_Alloc(int32_t, pPiece->m_iChars); |
| 1087 pTP->pWidths = | |
| 1088 (int32_t*)FX_Alloc(uint8_t, pPiece->m_iChars * sizeof(int32_t)); | |
| 1089 pTP->iChars = pPiece->m_iChars; | 1065 pTP->iChars = pPiece->m_iChars; |
| 1090 pPiece->GetString(pTP->pszText); | 1066 pPiece->GetString(pTP->pszText); |
| 1091 pPiece->GetWidths(pTP->pWidths); | 1067 pPiece->GetWidths(pTP->pWidths); |
| 1092 pTP->iBidiLevel = pPiece->m_iBidiLevel; | 1068 pTP->iBidiLevel = pPiece->m_iBidiLevel; |
| 1093 pTP->iHorScale = pPiece->m_iHorizontalScale; | 1069 pTP->iHorScale = pPiece->m_iHorizontalScale; |
| 1094 pTP->iVerScale = pPiece->m_iVerticalScale; | 1070 pTP->iVerScale = pPiece->m_iVerticalScale; |
| 1095 m_textParser.GetUnderline(m_pTextProvider, pStyle, pTP->iUnderline, | 1071 m_textParser.GetUnderline(m_pTextProvider, pStyle, pTP->iUnderline, |
| 1096 pTP->iPeriod); | 1072 pTP->iPeriod); |
| 1097 m_textParser.GetLinethrough(m_pTextProvider, pStyle, pTP->iLineThrough); | 1073 m_textParser.GetLinethrough(m_pTextProvider, pStyle, pTP->iLineThrough); |
| 1098 pTP->dwColor = m_textParser.GetColor(m_pTextProvider, pStyle); | 1074 pTP->dwColor = m_textParser.GetColor(m_pTextProvider, pStyle); |
| 1099 pTP->pFont = m_textParser.GetFont(m_pTextProvider, pStyle); | 1075 pTP->pFont = m_textParser.GetFont(m_pTextProvider, pStyle); |
| 1100 pTP->fFontSize = m_textParser.GetFontSize(m_pTextProvider, pStyle); | 1076 pTP->fFontSize = m_textParser.GetFontSize(m_pTextProvider, pStyle); |
| 1101 pTP->rtPiece.left = pPiece->m_iStartPos / 20000.0f; | 1077 pTP->rtPiece.left = pPiece->m_iStartPos / 20000.0f; |
| 1102 pTP->rtPiece.width = pPiece->m_iWidth / 20000.0f; | 1078 pTP->rtPiece.width = pPiece->m_iWidth / 20000.0f; |
| 1103 pTP->rtPiece.height = (FX_FLOAT)pPiece->m_iFontSize * fVerScale / 20.0f; | 1079 pTP->rtPiece.height = (FX_FLOAT)pPiece->m_iFontSize * fVerScale / 20.0f; |
| 1104 FX_FLOAT fBaseLineTemp = | 1080 FX_FLOAT fBaseLineTemp = |
| 1105 m_textParser.GetBaseline(m_pTextProvider, pStyle); | 1081 m_textParser.GetBaseline(m_pTextProvider, pStyle); |
| 1106 pTP->rtPiece.top = fBaseLineTemp; | 1082 pTP->rtPiece.top = fBaseLineTemp; |
| 1107 pPieceLine->m_textPieces.Add(pTP); | |
| 1108 | 1083 |
| 1109 FX_FLOAT fLineHeight = m_textParser.GetLineHeight( | 1084 FX_FLOAT fLineHeight = m_textParser.GetLineHeight( |
| 1110 m_pTextProvider, pStyle, m_iLines == 0, fVerScale); | 1085 m_pTextProvider, pStyle, m_iLines == 0, fVerScale); |
| 1111 if (fBaseLineTemp > 0) { | 1086 if (fBaseLineTemp > 0) { |
| 1112 FX_FLOAT fLineHeightTmp = fBaseLineTemp + pTP->rtPiece.height; | 1087 FX_FLOAT fLineHeightTmp = fBaseLineTemp + pTP->rtPiece.height; |
| 1113 if (fLineHeight < fLineHeightTmp) | 1088 if (fLineHeight < fLineHeightTmp) |
| 1114 fLineHeight = fLineHeightTmp; | 1089 fLineHeight = fLineHeightTmp; |
| 1115 else | 1090 else |
| 1116 fBaseLineTemp = 0; | 1091 fBaseLineTemp = 0; |
| 1117 } else if (fBaseLine < -fBaseLineTemp) { | 1092 } else if (fBaseLine < -fBaseLineTemp) { |
| 1118 fBaseLine = -fBaseLineTemp; | 1093 fBaseLine = -fBaseLineTemp; |
| 1119 } | 1094 } |
| 1120 fLineStep = std::max(fLineStep, fLineHeight); | 1095 fLineStep = std::max(fLineStep, fLineHeight); |
| 1121 if (pUserData && pUserData->m_pLinkData) { | 1096 if (pUserData && pUserData->m_pLinkData) { |
| 1122 pUserData->m_pLinkData->Retain(); | 1097 pUserData->m_pLinkData->Retain(); |
| 1123 pTP->pLinkData = pUserData->m_pLinkData; | 1098 pTP->pLinkData = pUserData->m_pLinkData; |
| 1124 } else { | 1099 } else { |
| 1125 pTP->pLinkData = nullptr; | 1100 pTP->pLinkData = nullptr; |
| 1126 } | 1101 } |
| 1102 pPieceLine->m_textPieces.push_back(std::move(pTP)); |
| 1127 DoTabstops(pStyle, pPieceLine); | 1103 DoTabstops(pStyle, pPieceLine); |
| 1128 } | 1104 } |
| 1129 for (i = 0; i < iPieces; i++) { | 1105 for (const auto& pTP : pPieceLine->m_textPieces) { |
| 1130 XFA_TextPiece* pTP = pPieceLine->m_textPieces.GetAt(i); | |
| 1131 FX_FLOAT& fTop = pTP->rtPiece.top; | 1106 FX_FLOAT& fTop = pTP->rtPiece.top; |
| 1132 FX_FLOAT fBaseLineTemp = fTop; | 1107 FX_FLOAT fBaseLineTemp = fTop; |
| 1133 fTop = fLinePos + fLineStep - pTP->rtPiece.height - fBaseLineTemp; | 1108 fTop = fLinePos + fLineStep - pTP->rtPiece.height - fBaseLineTemp; |
| 1134 fTop = std::max(0.0f, fTop); | 1109 fTop = std::max(0.0f, fTop); |
| 1135 } | 1110 } |
| 1136 fLinePos += fLineStep + fBaseLine; | 1111 fLinePos += fLineStep + fBaseLine; |
| 1137 } else { | 1112 } else { |
| 1138 FX_FLOAT fLineStep = 0; | 1113 FX_FLOAT fLineStep = 0; |
| 1139 FX_FLOAT fLineWidth = 0; | 1114 FX_FLOAT fLineWidth = 0; |
| 1140 for (int32_t i = 0; i < iPieces; i++) { | 1115 for (int32_t i = 0; i < iPieces; i++) { |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1204 } | 1179 } |
| 1205 m_iLines++; | 1180 m_iLines++; |
| 1206 } | 1181 } |
| 1207 | 1182 |
| 1208 void CXFA_TextLayout::RenderString(CFDE_RenderDevice* pDevice, | 1183 void CXFA_TextLayout::RenderString(CFDE_RenderDevice* pDevice, |
| 1209 CFDE_Brush* pBrush, | 1184 CFDE_Brush* pBrush, |
| 1210 CXFA_PieceLine* pPieceLine, | 1185 CXFA_PieceLine* pPieceLine, |
| 1211 int32_t iPiece, | 1186 int32_t iPiece, |
| 1212 FXTEXT_CHARPOS* pCharPos, | 1187 FXTEXT_CHARPOS* pCharPos, |
| 1213 const CFX_Matrix& tmDoc2Device) { | 1188 const CFX_Matrix& tmDoc2Device) { |
| 1214 const XFA_TextPiece* pPiece = pPieceLine->m_textPieces.GetAt(iPiece); | 1189 const XFA_TextPiece* pPiece = pPieceLine->m_textPieces[iPiece].get(); |
| 1215 int32_t iCount = GetDisplayPos(pPiece, pCharPos); | 1190 int32_t iCount = GetDisplayPos(pPiece, pCharPos); |
| 1216 if (iCount > 0) { | 1191 if (iCount > 0) { |
| 1217 pBrush->SetColor(pPiece->dwColor); | 1192 pBrush->SetColor(pPiece->dwColor); |
| 1218 pDevice->DrawString(pBrush, pPiece->pFont, pCharPos, iCount, | 1193 pDevice->DrawString(pBrush, pPiece->pFont, pCharPos, iCount, |
| 1219 pPiece->fFontSize, &tmDoc2Device); | 1194 pPiece->fFontSize, &tmDoc2Device); |
| 1220 } | 1195 } |
| 1221 pPieceLine->m_charCounts.Add(iCount); | 1196 pPieceLine->m_charCounts.Add(iCount); |
| 1222 } | 1197 } |
| 1223 | 1198 |
| 1224 void CXFA_TextLayout::RenderPath(CFDE_RenderDevice* pDevice, | 1199 void CXFA_TextLayout::RenderPath(CFDE_RenderDevice* pDevice, |
| 1225 CFDE_Pen* pPen, | 1200 CFDE_Pen* pPen, |
| 1226 CXFA_PieceLine* pPieceLine, | 1201 CXFA_PieceLine* pPieceLine, |
| 1227 int32_t iPiece, | 1202 int32_t iPiece, |
| 1228 FXTEXT_CHARPOS* pCharPos, | 1203 FXTEXT_CHARPOS* pCharPos, |
| 1229 const CFX_Matrix& tmDoc2Device) { | 1204 const CFX_Matrix& tmDoc2Device) { |
| 1230 XFA_TextPiece* pPiece = pPieceLine->m_textPieces.GetAt(iPiece); | 1205 XFA_TextPiece* pPiece = pPieceLine->m_textPieces[iPiece].get(); |
| 1231 bool bNoUnderline = pPiece->iUnderline < 1 || pPiece->iUnderline > 2; | 1206 bool bNoUnderline = pPiece->iUnderline < 1 || pPiece->iUnderline > 2; |
| 1232 bool bNoLineThrough = pPiece->iLineThrough < 1 || pPiece->iLineThrough > 2; | 1207 bool bNoLineThrough = pPiece->iLineThrough < 1 || pPiece->iLineThrough > 2; |
| 1233 if (bNoUnderline && bNoLineThrough) | 1208 if (bNoUnderline && bNoLineThrough) |
| 1234 return; | 1209 return; |
| 1235 | 1210 |
| 1236 pPen->SetColor(pPiece->dwColor); | 1211 pPen->SetColor(pPiece->dwColor); |
| 1237 std::unique_ptr<CFDE_Path> pPath(new CFDE_Path); | 1212 std::unique_ptr<CFDE_Path> pPath(new CFDE_Path); |
| 1238 int32_t iChars = GetDisplayPos(pPiece, pCharPos); | 1213 int32_t iChars = GetDisplayPos(pPiece, pCharPos); |
| 1239 if (iChars > 0) { | 1214 if (iChars > 0) { |
| 1240 CFX_PointF pt1, pt2; | 1215 CFX_PointF pt1, pt2; |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1280 while (iPiecePrev > 0) { | 1255 while (iPiecePrev > 0) { |
| 1281 iPiecePrev--; | 1256 iPiecePrev--; |
| 1282 iCharsTmp = pPieceLine->m_charCounts.GetAt(iPiecePrev); | 1257 iCharsTmp = pPieceLine->m_charCounts.GetAt(iPiecePrev); |
| 1283 if (iCharsTmp > 0) | 1258 if (iCharsTmp > 0) |
| 1284 break; | 1259 break; |
| 1285 } | 1260 } |
| 1286 if (iCharsTmp == 0) | 1261 if (iCharsTmp == 0) |
| 1287 return; | 1262 return; |
| 1288 | 1263 |
| 1289 iCharsTmp = 0; | 1264 iCharsTmp = 0; |
| 1290 int32_t iPieces = pPieceLine->m_textPieces.GetSize(); | 1265 int32_t iPieces = pdfium::CollectionSize<int32_t>(pPieceLine->m_textPieces); |
| 1291 while (iPieceNext < iPieces - 1) { | 1266 while (iPieceNext < iPieces - 1) { |
| 1292 iPieceNext++; | 1267 iPieceNext++; |
| 1293 iCharsTmp = pPieceLine->m_charCounts.GetAt(iPieceNext); | 1268 iCharsTmp = pPieceLine->m_charCounts.GetAt(iPieceNext); |
| 1294 if (iCharsTmp > 0) | 1269 if (iCharsTmp > 0) |
| 1295 break; | 1270 break; |
| 1296 } | 1271 } |
| 1297 if (iCharsTmp == 0) | 1272 if (iCharsTmp == 0) |
| 1298 return; | 1273 return; |
| 1299 | 1274 |
| 1300 FX_FLOAT fOrgX = 0.0f; | 1275 FX_FLOAT fOrgX = 0.0f; |
| 1301 FX_FLOAT fEndX = 0.0f; | 1276 FX_FLOAT fEndX = 0.0f; |
| 1302 pPiece = pPieceLine->m_textPieces.GetAt(iPiecePrev); | 1277 pPiece = pPieceLine->m_textPieces[iPiecePrev].get(); |
| 1303 iChars = GetDisplayPos(pPiece, pCharPos); | 1278 iChars = GetDisplayPos(pPiece, pCharPos); |
| 1304 if (iChars < 1) | 1279 if (iChars < 1) |
| 1305 return; | 1280 return; |
| 1306 | 1281 |
| 1307 fOrgX = pCharPos[iChars - 1].m_OriginX + | 1282 fOrgX = pCharPos[iChars - 1].m_OriginX + |
| 1308 pCharPos[iChars - 1].m_FontCharWidth * pPiece->fFontSize / 1000.0f; | 1283 pCharPos[iChars - 1].m_FontCharWidth * pPiece->fFontSize / 1000.0f; |
| 1309 pPiece = pPieceLine->m_textPieces.GetAt(iPieceNext); | 1284 pPiece = pPieceLine->m_textPieces[iPieceNext].get(); |
| 1310 iChars = GetDisplayPos(pPiece, pCharPos); | 1285 iChars = GetDisplayPos(pPiece, pCharPos); |
| 1311 if (iChars < 1) | 1286 if (iChars < 1) |
| 1312 return; | 1287 return; |
| 1313 | 1288 |
| 1314 fEndX = pCharPos[0].m_OriginX; | 1289 fEndX = pCharPos[0].m_OriginX; |
| 1315 CFX_PointF pt1, pt2; | 1290 CFX_PointF pt1, pt2; |
| 1316 pt1.x = fOrgX, pt2.x = fEndX; | 1291 pt1.x = fOrgX, pt2.x = fEndX; |
| 1317 FX_FLOAT fEndY = pCharPos[0].m_OriginY + 1.05f; | 1292 FX_FLOAT fEndY = pCharPos[0].m_OriginY + 1.05f; |
| 1318 for (int32_t i = 0; i < pPiece->iUnderline; i++) { | 1293 for (int32_t i = 0; i < pPiece->iUnderline; i++) { |
| 1319 pt1.y = pt2.y = fEndY; | 1294 pt1.y = pt2.y = fEndY; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1330 pDevice->DrawPath(pPen, 1, pPath.get(), &tmDoc2Device); | 1305 pDevice->DrawPath(pPen, 1, pPath.get(), &tmDoc2Device); |
| 1331 } | 1306 } |
| 1332 | 1307 |
| 1333 int32_t CXFA_TextLayout::GetDisplayPos(const XFA_TextPiece* pPiece, | 1308 int32_t CXFA_TextLayout::GetDisplayPos(const XFA_TextPiece* pPiece, |
| 1334 FXTEXT_CHARPOS* pCharPos, | 1309 FXTEXT_CHARPOS* pCharPos, |
| 1335 bool bCharCode) { | 1310 bool bCharCode) { |
| 1336 if (!pPiece) | 1311 if (!pPiece) |
| 1337 return 0; | 1312 return 0; |
| 1338 | 1313 |
| 1339 FX_RTFTEXTOBJ tr; | 1314 FX_RTFTEXTOBJ tr; |
| 1340 if (!ToRun(pPiece, tr)) | 1315 if (!ToRun(pPiece, &tr)) |
| 1341 return 0; | 1316 return 0; |
| 1342 return m_pBreak->GetDisplayPos(&tr, pCharPos, bCharCode); | 1317 return m_pBreak->GetDisplayPos(&tr, pCharPos, bCharCode); |
| 1343 } | 1318 } |
| 1344 | 1319 |
| 1345 bool CXFA_TextLayout::ToRun(const XFA_TextPiece* pPiece, FX_RTFTEXTOBJ& tr) { | 1320 bool CXFA_TextLayout::ToRun(const XFA_TextPiece* pPiece, FX_RTFTEXTOBJ* tr) { |
| 1346 int32_t iLength = pPiece->iChars; | 1321 int32_t iLength = pPiece->iChars; |
| 1347 if (iLength < 1) | 1322 if (iLength < 1) |
| 1348 return false; | 1323 return false; |
| 1349 | 1324 |
| 1350 tr.pStr = pPiece->pszText; | 1325 tr->pStr = pPiece->pszText; |
| 1351 tr.pFont = pPiece->pFont; | 1326 tr->pFont = pPiece->pFont; |
| 1352 tr.pRect = &pPiece->rtPiece; | 1327 tr->pRect = &pPiece->rtPiece; |
| 1353 tr.pWidths = pPiece->pWidths; | 1328 tr->pWidths = pPiece->pWidths; |
| 1354 tr.iLength = iLength; | 1329 tr->iLength = iLength; |
| 1355 tr.fFontSize = pPiece->fFontSize; | 1330 tr->fFontSize = pPiece->fFontSize; |
| 1356 tr.iBidiLevel = pPiece->iBidiLevel; | 1331 tr->iBidiLevel = pPiece->iBidiLevel; |
| 1357 tr.iCharRotation = 0; | 1332 tr->iCharRotation = 0; |
| 1358 tr.wLineBreakChar = L'\n'; | 1333 tr->wLineBreakChar = L'\n'; |
| 1359 tr.iVerticalScale = pPiece->iVerScale; | 1334 tr->iVerticalScale = pPiece->iVerScale; |
| 1360 tr.dwLayoutStyles = FX_RTFLAYOUTSTYLE_ExpandTab; | 1335 tr->dwLayoutStyles = FX_RTFLAYOUTSTYLE_ExpandTab; |
| 1361 tr.iHorizontalScale = pPiece->iHorScale; | 1336 tr->iHorizontalScale = pPiece->iHorScale; |
| 1362 return true; | 1337 return true; |
| 1363 } | 1338 } |
| OLD | NEW |