| 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 "xfa/fxfa/app/xfa_textlayout.h" | 7 #include "xfa/fxfa/app/xfa_textlayout.h" |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 | 10 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 26 int32_t iDeclCount) { | 26 int32_t iDeclCount) { |
| 27 if (iDeclCount <= 0 || !ppDeclArray) | 27 if (iDeclCount <= 0 || !ppDeclArray) |
| 28 return; | 28 return; |
| 29 | 29 |
| 30 m_dwMatchedDecls = iDeclCount; | 30 m_dwMatchedDecls = iDeclCount; |
| 31 m_ppMatchedDecls = FX_Alloc(CFDE_CSSDeclaration*, iDeclCount); | 31 m_ppMatchedDecls = FX_Alloc(CFDE_CSSDeclaration*, iDeclCount); |
| 32 FXSYS_memcpy(m_ppMatchedDecls, ppDeclArray, | 32 FXSYS_memcpy(m_ppMatchedDecls, ppDeclArray, |
| 33 iDeclCount * sizeof(CFDE_CSSDeclaration*)); | 33 iDeclCount * sizeof(CFDE_CSSDeclaration*)); |
| 34 } | 34 } |
| 35 | 35 |
| 36 CXFA_TextParser::CXFA_TextParser() : m_pAllocator(NULL), m_pUASheet(NULL) {} | 36 CXFA_TextParser::CXFA_TextParser() : m_pUASheet(nullptr) {} |
| 37 | 37 |
| 38 CXFA_TextParser::~CXFA_TextParser() { | 38 CXFA_TextParser::~CXFA_TextParser() { |
| 39 if (m_pUASheet) | 39 if (m_pUASheet) |
| 40 m_pUASheet->Release(); | 40 m_pUASheet->Release(); |
| 41 | 41 |
| 42 delete m_pAllocator; | |
| 43 FX_POSITION ps = m_mapXMLNodeToParseContext.GetStartPosition(); | 42 FX_POSITION ps = m_mapXMLNodeToParseContext.GetStartPosition(); |
| 44 while (ps) { | 43 while (ps) { |
| 45 CFDE_XMLNode* pXMLNode; | 44 CFDE_XMLNode* pXMLNode; |
| 46 CXFA_TextParseContext* pParseContext; | 45 CXFA_TextParseContext* pParseContext; |
| 47 m_mapXMLNodeToParseContext.GetNextAssoc(ps, pXMLNode, pParseContext); | 46 m_mapXMLNodeToParseContext.GetNextAssoc(ps, pXMLNode, pParseContext); |
| 48 if (pParseContext) | 47 if (pParseContext) |
| 49 FXTARGET_DeleteWith(CXFA_TextParseContext, m_pAllocator, pParseContext); | 48 FXTARGET_DeleteWith(CXFA_TextParseContext, m_pAllocator.get(), |
| 49 pParseContext); |
| 50 } | 50 } |
| 51 m_mapXMLNodeToParseContext.RemoveAll(); | 51 m_mapXMLNodeToParseContext.RemoveAll(); |
| 52 } | 52 } |
| 53 void CXFA_TextParser::Reset() { | 53 void CXFA_TextParser::Reset() { |
| 54 FX_POSITION ps = m_mapXMLNodeToParseContext.GetStartPosition(); | 54 FX_POSITION ps = m_mapXMLNodeToParseContext.GetStartPosition(); |
| 55 while (ps) { | 55 while (ps) { |
| 56 CFDE_XMLNode* pXMLNode; | 56 CFDE_XMLNode* pXMLNode; |
| 57 CXFA_TextParseContext* pParseContext; | 57 CXFA_TextParseContext* pParseContext; |
| 58 m_mapXMLNodeToParseContext.GetNextAssoc(ps, pXMLNode, pParseContext); | 58 m_mapXMLNodeToParseContext.GetNextAssoc(ps, pXMLNode, pParseContext); |
| 59 if (pParseContext) | 59 if (pParseContext) |
| 60 FXTARGET_DeleteWith(CXFA_TextParseContext, m_pAllocator, pParseContext); | 60 FXTARGET_DeleteWith(CXFA_TextParseContext, m_pAllocator.get(), |
| 61 pParseContext); |
| 61 } | 62 } |
| 62 m_mapXMLNodeToParseContext.RemoveAll(); | 63 m_mapXMLNodeToParseContext.RemoveAll(); |
| 63 delete m_pAllocator; | 64 m_pAllocator.reset(); |
| 64 m_pAllocator = nullptr; | |
| 65 } | 65 } |
| 66 void CXFA_TextParser::InitCSSData(CXFA_TextProvider* pTextProvider) { | 66 void CXFA_TextParser::InitCSSData(CXFA_TextProvider* pTextProvider) { |
| 67 if (!pTextProvider) | 67 if (!pTextProvider) |
| 68 return; | 68 return; |
| 69 | 69 |
| 70 if (!m_pSelector) { | 70 if (!m_pSelector) { |
| 71 CXFA_FFDoc* pDoc = pTextProvider->GetDocNode(); | 71 CXFA_FFDoc* pDoc = pTextProvider->GetDocNode(); |
| 72 IFX_FontMgr* pFontMgr = pDoc->GetApp()->GetFDEFontMgr(); | 72 IFX_FontMgr* pFontMgr = pDoc->GetApp()->GetFDEFontMgr(); |
| 73 ASSERT(pFontMgr); | 73 ASSERT(pFontMgr); |
| 74 m_pSelector.reset(new CFDE_CSSStyleSelector); | 74 m_pSelector.reset(new CFDE_CSSStyleSelector); |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 204 m_pSelector->ComputeStyle(&tagProvider, pContext->GetDecls(), | 204 m_pSelector->ComputeStyle(&tagProvider, pContext->GetDecls(), |
| 205 pContext->CountDecls(), pStyle); | 205 pContext->CountDecls(), pStyle); |
| 206 pCSSAccel->OnLeaveTag(&tagProvider); | 206 pCSSAccel->OnLeaveTag(&tagProvider); |
| 207 return pStyle; | 207 return pStyle; |
| 208 } | 208 } |
| 209 void CXFA_TextParser::DoParse(CFDE_XMLNode* pXMLContainer, | 209 void CXFA_TextParser::DoParse(CFDE_XMLNode* pXMLContainer, |
| 210 CXFA_TextProvider* pTextProvider) { | 210 CXFA_TextProvider* pTextProvider) { |
| 211 if (pXMLContainer == NULL || pTextProvider == NULL || m_pAllocator) { | 211 if (pXMLContainer == NULL || pTextProvider == NULL || m_pAllocator) { |
| 212 return; | 212 return; |
| 213 } | 213 } |
| 214 m_pAllocator = IFX_MemoryAllocator::Create(FX_ALLOCTYPE_Fixed, 32, | 214 m_pAllocator.reset(IFX_MemoryAllocator::Create(FX_ALLOCTYPE_Fixed, 32, |
| 215 sizeof(CXFA_CSSTagProvider)); | 215 sizeof(CXFA_CSSTagProvider))); |
| 216 InitCSSData(pTextProvider); | 216 InitCSSData(pTextProvider); |
| 217 IFDE_CSSComputedStyle* pRootStyle = CreateRootStyle(pTextProvider); | 217 IFDE_CSSComputedStyle* pRootStyle = CreateRootStyle(pTextProvider); |
| 218 ParseRichText(pXMLContainer, pRootStyle); | 218 ParseRichText(pXMLContainer, pRootStyle); |
| 219 pRootStyle->Release(); | 219 pRootStyle->Release(); |
| 220 } | 220 } |
| 221 void CXFA_TextParser::ParseRichText(CFDE_XMLNode* pXMLNode, | 221 void CXFA_TextParser::ParseRichText(CFDE_XMLNode* pXMLNode, |
| 222 IFDE_CSSComputedStyle* pParentStyle) { | 222 IFDE_CSSComputedStyle* pParentStyle) { |
| 223 if (!pXMLNode) | 223 if (!pXMLNode) |
| 224 return; | 224 return; |
| 225 | 225 |
| 226 CXFA_CSSTagProvider tagProvider; | 226 CXFA_CSSTagProvider tagProvider; |
| 227 ParseTagInfo(pXMLNode, tagProvider); | 227 ParseTagInfo(pXMLNode, tagProvider); |
| 228 if (!tagProvider.m_bTagAvailable) | 228 if (!tagProvider.m_bTagAvailable) |
| 229 return; | 229 return; |
| 230 | 230 |
| 231 IFDE_CSSComputedStyle* pNewStyle = NULL; | 231 IFDE_CSSComputedStyle* pNewStyle = NULL; |
| 232 if ((tagProvider.GetTagName() != FX_WSTRC(L"body")) || | 232 if ((tagProvider.GetTagName() != FX_WSTRC(L"body")) || |
| 233 (tagProvider.GetTagName() != FX_WSTRC(L"html"))) { | 233 (tagProvider.GetTagName() != FX_WSTRC(L"html"))) { |
| 234 CXFA_TextParseContext* pTextContext = | 234 CXFA_TextParseContext* pTextContext = |
| 235 FXTARGET_NewWith(m_pAllocator) CXFA_TextParseContext; | 235 FXTARGET_NewWith(m_pAllocator.get()) CXFA_TextParseContext; |
| 236 FDE_CSSDISPLAY eDisplay = FDE_CSSDISPLAY_Inline; | 236 FDE_CSSDISPLAY eDisplay = FDE_CSSDISPLAY_Inline; |
| 237 if (!tagProvider.m_bContent) { | 237 if (!tagProvider.m_bContent) { |
| 238 pNewStyle = CreateStyle(pParentStyle); | 238 pNewStyle = CreateStyle(pParentStyle); |
| 239 CFDE_CSSAccelerator* pCSSAccel = m_pSelector->InitAccelerator(); | 239 CFDE_CSSAccelerator* pCSSAccel = m_pSelector->InitAccelerator(); |
| 240 pCSSAccel->OnEnterTag(&tagProvider); | 240 pCSSAccel->OnEnterTag(&tagProvider); |
| 241 CFDE_CSSDeclarationArray DeclArray; | 241 CFDE_CSSDeclarationArray DeclArray; |
| 242 int32_t iMatchedDecls = | 242 int32_t iMatchedDecls = |
| 243 m_pSelector->MatchDeclarations(&tagProvider, DeclArray); | 243 m_pSelector->MatchDeclarations(&tagProvider, DeclArray); |
| 244 const CFDE_CSSDeclaration** ppMatchDecls = | 244 const CFDE_CSSDeclaration** ppMatchDecls = |
| 245 const_cast<const CFDE_CSSDeclaration**>(DeclArray.GetData()); | 245 const_cast<const CFDE_CSSDeclaration**>(DeclArray.GetData()); |
| (...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 657 m_pBreak(nullptr), | 657 m_pBreak(nullptr), |
| 658 m_pLoader(nullptr), | 658 m_pLoader(nullptr), |
| 659 m_iLines(0), | 659 m_iLines(0), |
| 660 m_fMaxWidth(0), | 660 m_fMaxWidth(0), |
| 661 m_pTabstopContext(nullptr), | 661 m_pTabstopContext(nullptr), |
| 662 m_bBlockContinue(TRUE) { | 662 m_bBlockContinue(TRUE) { |
| 663 ASSERT(m_pTextProvider); | 663 ASSERT(m_pTextProvider); |
| 664 } | 664 } |
| 665 CXFA_TextLayout::~CXFA_TextLayout() { | 665 CXFA_TextLayout::~CXFA_TextLayout() { |
| 666 m_textParser.Reset(); | 666 m_textParser.Reset(); |
| 667 delete m_pLoader; | |
| 668 delete m_pTabstopContext; | |
| 669 Unload(); | 667 Unload(); |
| 670 } | 668 } |
| 671 void CXFA_TextLayout::Unload() { | 669 void CXFA_TextLayout::Unload() { |
| 672 int32_t iCount = m_pieceLines.GetSize(); | 670 int32_t iCount = m_pieceLines.GetSize(); |
| 673 for (int32_t i = 0; i < iCount; i++) { | 671 for (int32_t i = 0; i < iCount; i++) { |
| 674 CXFA_PieceLine* pLine = m_pieceLines.GetAt(i); | 672 CXFA_PieceLine* pLine = m_pieceLines.GetAt(i); |
| 675 FXTARGET_DeleteWith(CXFA_PieceLine, m_pAllocator, pLine); | 673 FXTARGET_DeleteWith(CXFA_PieceLine, m_pAllocator.get(), pLine); |
| 676 } | 674 } |
| 677 m_pieceLines.RemoveAll(); | 675 m_pieceLines.RemoveAll(); |
| 678 if (m_pBreak) { | 676 m_pBreak.reset(); |
| 679 m_pBreak->Release(); | 677 m_pAllocator.reset(); |
| 680 m_pBreak = NULL; | |
| 681 } | |
| 682 delete m_pAllocator; | |
| 683 m_pAllocator = nullptr; | |
| 684 } | 678 } |
| 685 const CXFA_PieceLineArray* CXFA_TextLayout::GetPieceLines() { | 679 const CXFA_PieceLineArray* CXFA_TextLayout::GetPieceLines() { |
| 686 return &m_pieceLines; | 680 return &m_pieceLines; |
| 687 } | 681 } |
| 688 void CXFA_TextLayout::GetTextDataNode() { | 682 void CXFA_TextLayout::GetTextDataNode() { |
| 689 if (m_pTextProvider == NULL) { | 683 if (m_pTextProvider == NULL) { |
| 690 return; | 684 return; |
| 691 } | 685 } |
| 692 CXFA_Node* pNode = m_pTextProvider->GetTextNode(m_bRichText); | 686 CXFA_Node* pNode = m_pTextProvider->GetTextNode(m_bRichText); |
| 693 if (pNode && m_bRichText) { | 687 if (pNode && m_bRichText) { |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 844 pStyle->GetBoundaryStyles()->SetMarginWidth(pNewRect); | 838 pStyle->GetBoundaryStyles()->SetMarginWidth(pNewRect); |
| 845 } | 839 } |
| 846 } | 840 } |
| 847 m_pBreak->SetLineBoundary(fStart, fLineWidth); | 841 m_pBreak->SetLineBoundary(fStart, fLineWidth); |
| 848 FX_FLOAT fIndent = pParaStyle->GetTextIndent().GetValue(); | 842 FX_FLOAT fIndent = pParaStyle->GetTextIndent().GetValue(); |
| 849 if (fIndent > 0) { | 843 if (fIndent > 0) { |
| 850 fStart += fIndent; | 844 fStart += fIndent; |
| 851 } | 845 } |
| 852 m_pBreak->SetLineStartPos(fStart); | 846 m_pBreak->SetLineStartPos(fStart); |
| 853 m_pBreak->SetTabWidth(m_textParser.GetTabInterval(pStyle)); | 847 m_pBreak->SetTabWidth(m_textParser.GetTabInterval(pStyle)); |
| 854 if (m_pTabstopContext == NULL) { | 848 if (!m_pTabstopContext) |
| 855 m_pTabstopContext = new CXFA_TextTabstopsContext; | 849 m_pTabstopContext.reset(new CXFA_TextTabstopsContext); |
| 856 } | 850 m_textParser.GetTabstops(pStyle, m_pTabstopContext.get()); |
| 857 m_textParser.GetTabstops(pStyle, m_pTabstopContext); | |
| 858 for (int32_t i = 0; i < m_pTabstopContext->m_iTabCount; i++) { | 851 for (int32_t i = 0; i < m_pTabstopContext->m_iTabCount; i++) { |
| 859 XFA_TABSTOPS* pTab = m_pTabstopContext->m_tabstops.GetDataPtr(i); | 852 XFA_TABSTOPS* pTab = m_pTabstopContext->m_tabstops.GetDataPtr(i); |
| 860 m_pBreak->AddPositionedTab(pTab->fTabstops); | 853 m_pBreak->AddPositionedTab(pTab->fTabstops); |
| 861 } | 854 } |
| 862 } | 855 } |
| 863 FX_FLOAT fFontSize = m_textParser.GetFontSize(m_pTextProvider, pStyle); | 856 FX_FLOAT fFontSize = m_textParser.GetFontSize(m_pTextProvider, pStyle); |
| 864 m_pBreak->SetFontSize(fFontSize); | 857 m_pBreak->SetFontSize(fFontSize); |
| 865 m_pBreak->SetLineBreakTolerance(fFontSize * 0.2f); | 858 m_pBreak->SetLineBreakTolerance(fFontSize * 0.2f); |
| 866 m_pBreak->SetFont(m_textParser.GetFont(m_pTextProvider, pStyle)); | 859 m_pBreak->SetFont(m_textParser.GetFont(m_pTextProvider, pStyle)); |
| 867 m_pBreak->SetHorizontalScale( | 860 m_pBreak->SetHorizontalScale( |
| (...skipping 27 matching lines...) Expand all Loading... |
| 895 FX_FLOAT fHeight = m_pLoader->m_fHeight; | 888 FX_FLOAT fHeight = m_pLoader->m_fHeight; |
| 896 if (fHeight < 0.1f) { | 889 if (fHeight < 0.1f) { |
| 897 fHeight = 0; | 890 fHeight = 0; |
| 898 for (int32_t i = 0; i < iCount; i++) { | 891 for (int32_t i = 0; i < iCount; i++) { |
| 899 fHeight += m_pLoader->m_lineHeights.ElementAt(i); | 892 fHeight += m_pLoader->m_lineHeights.ElementAt(i); |
| 900 } | 893 } |
| 901 } | 894 } |
| 902 return fHeight; | 895 return fHeight; |
| 903 } | 896 } |
| 904 FX_FLOAT CXFA_TextLayout::StartLayout(FX_FLOAT fWidth) { | 897 FX_FLOAT CXFA_TextLayout::StartLayout(FX_FLOAT fWidth) { |
| 905 if (m_pLoader == NULL) { | 898 if (!m_pLoader) |
| 906 m_pLoader = new CXFA_LoaderContext; | 899 m_pLoader.reset(new CXFA_LoaderContext); |
| 907 } | 900 |
| 908 if (fWidth < 0 || (m_pLoader->m_fWidth > -1 && | 901 if (fWidth < 0 || (m_pLoader->m_fWidth > -1 && |
| 909 FXSYS_fabs(fWidth - m_pLoader->m_fWidth) > 0)) { | 902 FXSYS_fabs(fWidth - m_pLoader->m_fWidth) > 0)) { |
| 910 m_pLoader->m_lineHeights.RemoveAll(); | 903 m_pLoader->m_lineHeights.RemoveAll(); |
| 911 m_Blocks.RemoveAll(); | 904 m_Blocks.RemoveAll(); |
| 912 Unload(); | 905 Unload(); |
| 913 m_pLoader->m_fStartLineOffset = 0; | 906 m_pLoader->m_fStartLineOffset = 0; |
| 914 } | 907 } |
| 915 m_pLoader->m_fWidth = fWidth; | 908 m_pLoader->m_fWidth = fWidth; |
| 916 if (fWidth < 0) { | 909 if (fWidth < 0) { |
| 917 CFX_SizeF szMax; | 910 CFX_SizeF szMax; |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1006 } | 999 } |
| 1007 int32_t CXFA_TextLayout::CountBlocks() const { | 1000 int32_t CXFA_TextLayout::CountBlocks() const { |
| 1008 int32_t iCount = m_Blocks.GetSize() / 2; | 1001 int32_t iCount = m_Blocks.GetSize() / 2; |
| 1009 return iCount > 0 ? iCount : 1; | 1002 return iCount > 0 ? iCount : 1; |
| 1010 } | 1003 } |
| 1011 | 1004 |
| 1012 FX_BOOL CXFA_TextLayout::CalcSize(const CFX_SizeF& minSize, | 1005 FX_BOOL CXFA_TextLayout::CalcSize(const CFX_SizeF& minSize, |
| 1013 const CFX_SizeF& maxSize, | 1006 const CFX_SizeF& maxSize, |
| 1014 CFX_SizeF& defaultSize) { | 1007 CFX_SizeF& defaultSize) { |
| 1015 defaultSize.x = maxSize.x; | 1008 defaultSize.x = maxSize.x; |
| 1016 if (defaultSize.x < 1) { | 1009 if (defaultSize.x < 1) |
| 1017 defaultSize.x = 0xFFFF; | 1010 defaultSize.x = 0xFFFF; |
| 1018 } | |
| 1019 if (m_pBreak) | |
| 1020 m_pBreak->Release(); | |
| 1021 | 1011 |
| 1022 m_pBreak = CreateBreak(FALSE); | 1012 m_pBreak.reset(CreateBreak(FALSE)); |
| 1023 FX_FLOAT fLinePos = 0; | 1013 FX_FLOAT fLinePos = 0; |
| 1024 m_iLines = 0; | 1014 m_iLines = 0; |
| 1025 m_fMaxWidth = 0; | 1015 m_fMaxWidth = 0; |
| 1026 Loader(defaultSize, fLinePos, FALSE); | 1016 Loader(defaultSize, fLinePos, FALSE); |
| 1027 if (fLinePos < 0.1f) { | 1017 if (fLinePos < 0.1f) |
| 1028 fLinePos = m_textParser.GetFontSize(m_pTextProvider, NULL); | 1018 fLinePos = m_textParser.GetFontSize(m_pTextProvider, NULL); |
| 1029 } | 1019 |
| 1030 delete m_pTabstopContext; | 1020 m_pTabstopContext.reset(); |
| 1031 m_pTabstopContext = nullptr; | |
| 1032 defaultSize = CFX_SizeF(m_fMaxWidth, fLinePos); | 1021 defaultSize = CFX_SizeF(m_fMaxWidth, fLinePos); |
| 1033 return TRUE; | 1022 return TRUE; |
| 1034 } | 1023 } |
| 1035 | 1024 |
| 1036 FX_BOOL CXFA_TextLayout::Layout(const CFX_SizeF& size, FX_FLOAT* fHeight) { | 1025 FX_BOOL CXFA_TextLayout::Layout(const CFX_SizeF& size, FX_FLOAT* fHeight) { |
| 1037 if (size.x < 1) { | 1026 if (size.x < 1) |
| 1038 return FALSE; | 1027 return FALSE; |
| 1039 } | 1028 |
| 1040 Unload(); | 1029 Unload(); |
| 1041 m_pBreak = CreateBreak(TRUE); | 1030 m_pBreak.reset(CreateBreak(TRUE)); |
| 1042 if (m_pLoader) { | 1031 if (m_pLoader) { |
| 1043 m_pLoader->m_iTotalLines = -1; | 1032 m_pLoader->m_iTotalLines = -1; |
| 1044 m_pLoader->m_iChar = 0; | 1033 m_pLoader->m_iChar = 0; |
| 1045 } | 1034 } |
| 1046 m_iLines = 0; | 1035 m_iLines = 0; |
| 1047 FX_FLOAT fLinePos = 0; | 1036 FX_FLOAT fLinePos = 0; |
| 1048 Loader(size, fLinePos, TRUE); | 1037 Loader(size, fLinePos, TRUE); |
| 1049 UpdateAlign(size.y, fLinePos); | 1038 UpdateAlign(size.y, fLinePos); |
| 1050 delete m_pTabstopContext; | 1039 m_pTabstopContext.reset(); |
| 1051 m_pTabstopContext = nullptr; | |
| 1052 if (fHeight) | 1040 if (fHeight) |
| 1053 *fHeight = fLinePos; | 1041 *fHeight = fLinePos; |
| 1054 return TRUE; | 1042 return TRUE; |
| 1055 } | 1043 } |
| 1056 | 1044 |
| 1057 FX_BOOL CXFA_TextLayout::Layout(int32_t iBlock) { | 1045 FX_BOOL CXFA_TextLayout::Layout(int32_t iBlock) { |
| 1058 if (m_pLoader == NULL || iBlock < 0 || iBlock >= CountBlocks()) { | 1046 if (m_pLoader == NULL || iBlock < 0 || iBlock >= CountBlocks()) { |
| 1059 return FALSE; | 1047 return FALSE; |
| 1060 } | 1048 } |
| 1061 if (m_pLoader->m_fWidth < 1) { | 1049 if (m_pLoader->m_fWidth < 1) { |
| 1062 return FALSE; | 1050 return FALSE; |
| 1063 } | 1051 } |
| 1064 m_pLoader->m_iTotalLines = -1; | 1052 m_pLoader->m_iTotalLines = -1; |
| 1065 m_iLines = 0; | 1053 m_iLines = 0; |
| 1066 FX_FLOAT fLinePos = 0; | 1054 FX_FLOAT fLinePos = 0; |
| 1067 CXFA_Node* pNode = NULL; | 1055 CXFA_Node* pNode = NULL; |
| 1068 CFX_SizeF szText(m_pLoader->m_fWidth, m_pLoader->m_fHeight); | 1056 CFX_SizeF szText(m_pLoader->m_fWidth, m_pLoader->m_fHeight); |
| 1069 int32_t iCount = m_Blocks.GetSize(); | 1057 int32_t iCount = m_Blocks.GetSize(); |
| 1070 int32_t iBlocksHeightCount = m_pLoader->m_BlocksHeight.GetSize(); | 1058 int32_t iBlocksHeightCount = m_pLoader->m_BlocksHeight.GetSize(); |
| 1071 iBlocksHeightCount /= 2; | 1059 iBlocksHeightCount /= 2; |
| 1072 if (iBlock < iBlocksHeightCount) { | 1060 if (iBlock < iBlocksHeightCount) { |
| 1073 return TRUE; | 1061 return TRUE; |
| 1074 } | 1062 } |
| 1075 if (iBlock == iBlocksHeightCount) { | 1063 if (iBlock == iBlocksHeightCount) { |
| 1076 Unload(); | 1064 Unload(); |
| 1077 m_pBreak = CreateBreak(TRUE); | 1065 m_pBreak.reset(CreateBreak(TRUE)); |
| 1078 fLinePos = m_pLoader->m_fStartLineOffset; | 1066 fLinePos = m_pLoader->m_fStartLineOffset; |
| 1079 for (int32_t i = 0; i < iBlocksHeightCount; i++) { | 1067 for (int32_t i = 0; i < iBlocksHeightCount; i++) { |
| 1080 fLinePos -= m_pLoader->m_BlocksHeight.ElementAt(i * 2 + 1); | 1068 fLinePos -= m_pLoader->m_BlocksHeight.ElementAt(i * 2 + 1); |
| 1081 } | 1069 } |
| 1082 m_pLoader->m_iChar = 0; | 1070 m_pLoader->m_iChar = 0; |
| 1083 if (iCount > 1) { | 1071 if (iCount > 1) { |
| 1084 m_pLoader->m_iTotalLines = m_Blocks.ElementAt(iBlock * 2 + 1); | 1072 m_pLoader->m_iTotalLines = m_Blocks.ElementAt(iBlock * 2 + 1); |
| 1085 } | 1073 } |
| 1086 Loader(szText, fLinePos, TRUE); | 1074 Loader(szText, fLinePos, TRUE); |
| 1087 if (iCount == 0 && m_pLoader->m_fStartLineOffset < 0.1f) { | 1075 if (iCount == 0 && m_pLoader->m_fStartLineOffset < 0.1f) { |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1138 } | 1126 } |
| 1139 } else { | 1127 } else { |
| 1140 pNode = m_pLoader->m_pNode; | 1128 pNode = m_pLoader->m_pNode; |
| 1141 if (pNode == NULL) { | 1129 if (pNode == NULL) { |
| 1142 return TRUE; | 1130 return TRUE; |
| 1143 } | 1131 } |
| 1144 LoadText(pNode, szText, fLinePos, TRUE); | 1132 LoadText(pNode, szText, fLinePos, TRUE); |
| 1145 } | 1133 } |
| 1146 } | 1134 } |
| 1147 if (iBlock == iCount) { | 1135 if (iBlock == iCount) { |
| 1148 delete m_pTabstopContext; | 1136 m_pTabstopContext.reset(); |
| 1149 m_pTabstopContext = nullptr; | 1137 m_pLoader.reset(); |
| 1150 delete m_pLoader; | |
| 1151 m_pLoader = nullptr; | |
| 1152 } | 1138 } |
| 1153 return TRUE; | 1139 return TRUE; |
| 1154 } | 1140 } |
| 1155 void CXFA_TextLayout::ItemBlocks(const CFX_RectF& rtText, int32_t iBlockIndex) { | 1141 void CXFA_TextLayout::ItemBlocks(const CFX_RectF& rtText, int32_t iBlockIndex) { |
| 1156 if (!m_pLoader) { | 1142 if (!m_pLoader) { |
| 1157 return; | 1143 return; |
| 1158 } | 1144 } |
| 1159 int32_t iCountHeight = m_pLoader->m_lineHeights.GetSize(); | 1145 int32_t iCountHeight = m_pLoader->m_lineHeights.GetSize(); |
| 1160 if (iCountHeight == 0) { | 1146 if (iCountHeight == 0) { |
| 1161 return; | 1147 return; |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1276 for (int32_t j = 0; j < iPieces; j++) { | 1262 for (int32_t j = 0; j < iPieces; j++) { |
| 1277 XFA_TextPiece* pPiece = pPieceLine->m_textPieces.GetAt(j); | 1263 XFA_TextPiece* pPiece = pPieceLine->m_textPieces.GetAt(j); |
| 1278 CFX_RectF& rect = pPiece->rtPiece; | 1264 CFX_RectF& rect = pPiece->rtPiece; |
| 1279 rect.top += fHeight; | 1265 rect.top += fHeight; |
| 1280 } | 1266 } |
| 1281 } | 1267 } |
| 1282 } | 1268 } |
| 1283 FX_BOOL CXFA_TextLayout::Loader(const CFX_SizeF& szText, | 1269 FX_BOOL CXFA_TextLayout::Loader(const CFX_SizeF& szText, |
| 1284 FX_FLOAT& fLinePos, | 1270 FX_FLOAT& fLinePos, |
| 1285 FX_BOOL bSavePieces) { | 1271 FX_BOOL bSavePieces) { |
| 1286 if (!m_pAllocator) | 1272 if (!m_pAllocator) { |
| 1287 m_pAllocator = IFX_MemoryAllocator::Create(FX_ALLOCTYPE_Static, 256, 0); | 1273 m_pAllocator.reset( |
| 1274 IFX_MemoryAllocator::Create(FX_ALLOCTYPE_Static, 256, 0)); |
| 1275 } |
| 1276 GetTextDataNode(); |
| 1277 if (!m_pTextDataNode) |
| 1278 return TRUE; |
| 1288 | 1279 |
| 1289 GetTextDataNode(); | |
| 1290 if (m_pTextDataNode == NULL) { | |
| 1291 return TRUE; | |
| 1292 } | |
| 1293 if (m_bRichText) { | 1280 if (m_bRichText) { |
| 1294 CFDE_XMLNode* pXMLContainer = GetXMLContainerNode(); | 1281 CFDE_XMLNode* pXMLContainer = GetXMLContainerNode(); |
| 1295 if (pXMLContainer) { | 1282 if (pXMLContainer) { |
| 1296 if (!m_textParser.IsParsed()) { | 1283 if (!m_textParser.IsParsed()) { |
| 1297 m_textParser.DoParse(pXMLContainer, m_pTextProvider); | 1284 m_textParser.DoParse(pXMLContainer, m_pTextProvider); |
| 1298 } | 1285 } |
| 1299 IFDE_CSSComputedStyle* pRootStyle = | 1286 IFDE_CSSComputedStyle* pRootStyle = |
| 1300 m_textParser.CreateRootStyle(m_pTextProvider); | 1287 m_textParser.CreateRootStyle(m_pTextProvider); |
| 1301 LoadRichText(pXMLContainer, szText, fLinePos, pRootStyle, bSavePieces); | 1288 LoadRichText(pXMLContainer, szText, fLinePos, pRootStyle, bSavePieces); |
| 1302 pRootStyle->Release(); | 1289 pRootStyle->Release(); |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1396 if (pRect) { | 1383 if (pRect) { |
| 1397 fLinePos += pRect->top.GetValue(); | 1384 fLinePos += pRect->top.GetValue(); |
| 1398 fSpaceBelow = pRect->bottom.GetValue(); | 1385 fSpaceBelow = pRect->bottom.GetValue(); |
| 1399 } | 1386 } |
| 1400 } | 1387 } |
| 1401 if (wsName == FX_WSTRC(L"a")) { | 1388 if (wsName == FX_WSTRC(L"a")) { |
| 1402 CFX_WideString wsLinkContent; | 1389 CFX_WideString wsLinkContent; |
| 1403 ASSERT(pElement); | 1390 ASSERT(pElement); |
| 1404 pElement->GetString(L"href", wsLinkContent); | 1391 pElement->GetString(L"href", wsLinkContent); |
| 1405 if (!wsLinkContent.IsEmpty()) { | 1392 if (!wsLinkContent.IsEmpty()) { |
| 1406 pLinkData = FXTARGET_NewWith(m_pAllocator) CXFA_LinkUserData( | 1393 pLinkData = FXTARGET_NewWith(m_pAllocator.get()) CXFA_LinkUserData( |
| 1407 m_pAllocator, | 1394 m_pAllocator.get(), |
| 1408 wsLinkContent.GetBuffer(wsLinkContent.GetLength())); | 1395 wsLinkContent.GetBuffer(wsLinkContent.GetLength())); |
| 1409 wsLinkContent.ReleaseBuffer(wsLinkContent.GetLength()); | 1396 wsLinkContent.ReleaseBuffer(wsLinkContent.GetLength()); |
| 1410 } | 1397 } |
| 1411 } | 1398 } |
| 1412 int32_t iTabCount = | 1399 int32_t iTabCount = |
| 1413 m_textParser.CountTabs(bContentNode ? pParentStyle : pStyle); | 1400 m_textParser.CountTabs(bContentNode ? pParentStyle : pStyle); |
| 1414 FX_BOOL bSpaceRun = | 1401 FX_BOOL bSpaceRun = |
| 1415 m_textParser.IsSpaceRun(bContentNode ? pParentStyle : pStyle); | 1402 m_textParser.IsSpaceRun(bContentNode ? pParentStyle : pStyle); |
| 1416 CFX_WideString wsText; | 1403 CFX_WideString wsText; |
| 1417 if (bContentNode && iTabCount == 0) { | 1404 if (bContentNode && iTabCount == 0) { |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1452 m_pLoader->m_dwFlags |= XFA_LOADERCNTXTFLG_FILTERSPACE; | 1439 m_pLoader->m_dwFlags |= XFA_LOADERCNTXTFLG_FILTERSPACE; |
| 1453 } else if (wsText.GetLength() != 0) { | 1440 } else if (wsText.GetLength() != 0) { |
| 1454 m_pLoader->m_dwFlags &= ~XFA_LOADERCNTXTFLG_FILTERSPACE; | 1441 m_pLoader->m_dwFlags &= ~XFA_LOADERCNTXTFLG_FILTERSPACE; |
| 1455 } | 1442 } |
| 1456 } | 1443 } |
| 1457 if (wsText.GetLength() > 0) { | 1444 if (wsText.GetLength() > 0) { |
| 1458 if (m_pLoader == NULL || m_pLoader->m_iChar == 0) { | 1445 if (m_pLoader == NULL || m_pLoader->m_iChar == 0) { |
| 1459 if (pLinkData) { | 1446 if (pLinkData) { |
| 1460 pLinkData->AddRef(); | 1447 pLinkData->AddRef(); |
| 1461 } | 1448 } |
| 1462 CXFA_TextUserData* pUserData = FXTARGET_NewWith(m_pAllocator) | 1449 CXFA_TextUserData* pUserData = FXTARGET_NewWith(m_pAllocator.get()) |
| 1463 CXFA_TextUserData(m_pAllocator, | 1450 CXFA_TextUserData(m_pAllocator.get(), |
| 1464 bContentNode ? pParentStyle : pStyle, | 1451 bContentNode ? pParentStyle : pStyle, |
| 1465 pLinkData); | 1452 pLinkData); |
| 1466 m_pBreak->SetUserData(pUserData); | 1453 m_pBreak->SetUserData(pUserData); |
| 1467 } | 1454 } |
| 1468 if (AppendChar(wsText, fLinePos, 0, bSavePieces)) { | 1455 if (AppendChar(wsText, fLinePos, 0, bSavePieces)) { |
| 1469 if (m_pLoader) { | 1456 if (m_pLoader) { |
| 1470 m_pLoader->m_dwFlags &= ~XFA_LOADERCNTXTFLG_FILTERSPACE; | 1457 m_pLoader->m_dwFlags &= ~XFA_LOADERCNTXTFLG_FILTERSPACE; |
| 1471 } | 1458 } |
| 1472 if (IsEnd(bSavePieces)) { | 1459 if (IsEnd(bSavePieces)) { |
| 1473 if (m_pLoader && m_pLoader->m_iTotalLines > -1) { | 1460 if (m_pLoader && m_pLoader->m_iTotalLines > -1) { |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1676 void CXFA_TextLayout::AppendTextLine(uint32_t dwStatus, | 1663 void CXFA_TextLayout::AppendTextLine(uint32_t dwStatus, |
| 1677 FX_FLOAT& fLinePos, | 1664 FX_FLOAT& fLinePos, |
| 1678 FX_BOOL bSavePieces, | 1665 FX_BOOL bSavePieces, |
| 1679 FX_BOOL bEndBreak) { | 1666 FX_BOOL bEndBreak) { |
| 1680 int32_t iPieces = m_pBreak->CountBreakPieces(); | 1667 int32_t iPieces = m_pBreak->CountBreakPieces(); |
| 1681 if (iPieces < 1) { | 1668 if (iPieces < 1) { |
| 1682 return; | 1669 return; |
| 1683 } | 1670 } |
| 1684 IFDE_CSSComputedStyle* pStyle = NULL; | 1671 IFDE_CSSComputedStyle* pStyle = NULL; |
| 1685 if (bSavePieces) { | 1672 if (bSavePieces) { |
| 1686 CXFA_PieceLine* pPieceLine = FXTARGET_NewWith(m_pAllocator) CXFA_PieceLine; | 1673 CXFA_PieceLine* pPieceLine = |
| 1674 FXTARGET_NewWith(m_pAllocator.get()) CXFA_PieceLine; |
| 1687 m_pieceLines.Add(pPieceLine); | 1675 m_pieceLines.Add(pPieceLine); |
| 1688 if (m_pTabstopContext) { | 1676 if (m_pTabstopContext) { |
| 1689 m_pTabstopContext->Reset(); | 1677 m_pTabstopContext->Reset(); |
| 1690 } | 1678 } |
| 1691 FX_FLOAT fLineStep = 0, fBaseLine = 0; | 1679 FX_FLOAT fLineStep = 0, fBaseLine = 0; |
| 1692 int32_t i = 0; | 1680 int32_t i = 0; |
| 1693 for (i = 0; i < iPieces; i++) { | 1681 for (i = 0; i < iPieces; i++) { |
| 1694 const CFX_RTFPiece* pPiece = m_pBreak->GetBreakPiece(i); | 1682 const CFX_RTFPiece* pPiece = m_pBreak->GetBreakPiece(i); |
| 1695 CXFA_TextUserData* pUserData = (CXFA_TextUserData*)pPiece->m_pUserData; | 1683 CXFA_TextUserData* pUserData = (CXFA_TextUserData*)pPiece->m_pUserData; |
| 1696 if (pUserData) | 1684 if (pUserData) |
| 1697 pStyle = pUserData->m_pStyle; | 1685 pStyle = pUserData->m_pStyle; |
| 1698 FX_FLOAT fVerScale = pPiece->m_iVerticalScale / 100.0f; | 1686 FX_FLOAT fVerScale = pPiece->m_iVerticalScale / 100.0f; |
| 1699 XFA_TextPiece* pTP = FXTARGET_NewWith(m_pAllocator) XFA_TextPiece(); | 1687 XFA_TextPiece* pTP = FXTARGET_NewWith(m_pAllocator.get()) XFA_TextPiece(); |
| 1700 pTP->pszText = | 1688 pTP->pszText = |
| 1701 (FX_WCHAR*)m_pAllocator->Alloc(pPiece->m_iChars * sizeof(FX_WCHAR)); | 1689 (FX_WCHAR*)m_pAllocator->Alloc(pPiece->m_iChars * sizeof(FX_WCHAR)); |
| 1702 pTP->pWidths = | 1690 pTP->pWidths = |
| 1703 (int32_t*)m_pAllocator->Alloc(pPiece->m_iChars * sizeof(int32_t)); | 1691 (int32_t*)m_pAllocator->Alloc(pPiece->m_iChars * sizeof(int32_t)); |
| 1704 pTP->iChars = pPiece->m_iChars; | 1692 pTP->iChars = pPiece->m_iChars; |
| 1705 pPiece->GetString(pTP->pszText); | 1693 pPiece->GetString(pTP->pszText); |
| 1706 pPiece->GetWidths(pTP->pWidths); | 1694 pPiece->GetWidths(pTP->pWidths); |
| 1707 pTP->iBidiLevel = pPiece->m_iBidiLevel; | 1695 pTP->iBidiLevel = pPiece->m_iBidiLevel; |
| 1708 pTP->iHorScale = pPiece->m_iHorizontalScale; | 1696 pTP->iHorScale = pPiece->m_iHorizontalScale; |
| 1709 pTP->iVerScale = pPiece->m_iVerticalScale; | 1697 pTP->iVerScale = pPiece->m_iVerticalScale; |
| (...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1970 tr.iLength = iLength; | 1958 tr.iLength = iLength; |
| 1971 tr.fFontSize = pPiece->fFontSize; | 1959 tr.fFontSize = pPiece->fFontSize; |
| 1972 tr.iBidiLevel = pPiece->iBidiLevel; | 1960 tr.iBidiLevel = pPiece->iBidiLevel; |
| 1973 tr.iCharRotation = 0; | 1961 tr.iCharRotation = 0; |
| 1974 tr.wLineBreakChar = L'\n'; | 1962 tr.wLineBreakChar = L'\n'; |
| 1975 tr.iVerticalScale = pPiece->iVerScale; | 1963 tr.iVerticalScale = pPiece->iVerScale; |
| 1976 tr.dwLayoutStyles = FX_RTFLAYOUTSTYLE_ExpandTab; | 1964 tr.dwLayoutStyles = FX_RTFLAYOUTSTYLE_ExpandTab; |
| 1977 tr.iHorizontalScale = pPiece->iHorScale; | 1965 tr.iHorizontalScale = pPiece->iHorScale; |
| 1978 return TRUE; | 1966 return TRUE; |
| 1979 } | 1967 } |
| OLD | NEW |