diff options
-rw-r--r-- | core/fxcrt/xml/cfx_xmltext.h | 7 | ||||
-rw-r--r-- | xfa/fxfa/cxfa_loadercontext.h | 2 | ||||
-rw-r--r-- | xfa/fxfa/cxfa_textlayout.cpp | 41 | ||||
-rw-r--r-- | xfa/fxfa/cxfa_textlayout.h | 6 | ||||
-rw-r--r-- | xfa/fxfa/cxfa_textparser.cpp | 15 | ||||
-rw-r--r-- | xfa/fxfa/cxfa_textparser.h | 18 |
6 files changed, 50 insertions, 39 deletions
diff --git a/core/fxcrt/xml/cfx_xmltext.h b/core/fxcrt/xml/cfx_xmltext.h index f7feae669e..a8a5f12a53 100644 --- a/core/fxcrt/xml/cfx_xmltext.h +++ b/core/fxcrt/xml/cfx_xmltext.h @@ -31,7 +31,7 @@ class CFX_XMLText : public CFX_XMLNode { WideString m_wsText; }; -inline bool IsXMLText(CFX_XMLNode* pNode) { +inline bool IsXMLText(const CFX_XMLNode* pNode) { FX_XMLNODETYPE type = pNode->GetType(); return type == FX_XMLNODE_Text || type == FX_XMLNODE_CharData; } @@ -40,4 +40,9 @@ inline CFX_XMLText* ToXMLText(CFX_XMLNode* pNode) { return pNode && IsXMLText(pNode) ? static_cast<CFX_XMLText*>(pNode) : nullptr; } +inline const CFX_XMLText* ToXMLText(const CFX_XMLNode* pNode) { + return pNode && IsXMLText(pNode) ? static_cast<const CFX_XMLText*>(pNode) + : nullptr; +} + #endif // CORE_FXCRT_XML_CFX_XMLTEXT_H_ diff --git a/xfa/fxfa/cxfa_loadercontext.h b/xfa/fxfa/cxfa_loadercontext.h index ff7c6032a8..a6d8fb0eeb 100644 --- a/xfa/fxfa/cxfa_loadercontext.h +++ b/xfa/fxfa/cxfa_loadercontext.h @@ -30,7 +30,7 @@ class CXFA_LoaderContext { int32_t m_iLines; int32_t m_iTotalLines; uint32_t m_dwFlags; - UnownedPtr<CFX_XMLNode> m_pXMLNode; + UnownedPtr<const CFX_XMLNode> m_pXMLNode; UnownedPtr<CXFA_Node> m_pNode; RetainPtr<CFX_CSSComputedStyle> m_pParentStyle; std::vector<float> m_lineHeights; diff --git a/xfa/fxfa/cxfa_textlayout.cpp b/xfa/fxfa/cxfa_textlayout.cpp index 976988ee32..49cb13a714 100644 --- a/xfa/fxfa/cxfa_textlayout.cpp +++ b/xfa/fxfa/cxfa_textlayout.cpp @@ -167,7 +167,7 @@ void CXFA_TextLayout::InitBreak(float fLineWidth) { void CXFA_TextLayout::InitBreak(CFX_CSSComputedStyle* pStyle, CFX_CSSDisplay eDisplay, float fLineWidth, - CFX_XMLNode* pXMLNode, + const CFX_XMLNode* pXMLNode, CFX_CSSComputedStyle* pParentStyle) { if (!pStyle) { InitBreak(fLineWidth); @@ -457,11 +457,11 @@ bool CXFA_TextLayout::Layout(int32_t iBlock) { if (!pContainerNode) return true; - CFX_XMLNode* pXMLNode = m_pLoader->m_pXMLNode.Get(); + const CFX_XMLNode* pXMLNode = m_pLoader->m_pXMLNode.Get(); if (!pXMLNode) return true; - CFX_XMLNode* pSaveXMLNode = pXMLNode; + const CFX_XMLNode* pSaveXMLNode = pXMLNode; for (; pXMLNode; pXMLNode = pXMLNode->GetNextSibling()) { if (!LoadRichText(pXMLNode, szText.width, &fLinePos, m_pLoader->m_pParentStyle, true, nullptr, true, false, @@ -624,27 +624,28 @@ void CXFA_TextLayout::UpdateAlign(float fHeight, float fBottom) { } } -bool CXFA_TextLayout::Loader(float textWidth, +void CXFA_TextLayout::Loader(float textWidth, float* pLinePos, bool bSavePieces) { GetTextDataNode(); if (!m_pTextDataNode) - return true; - - if (m_bRichText) { - CFX_XMLNode* pXMLContainer = GetXMLContainerNode(); - if (pXMLContainer) { - if (!m_textParser.IsParsed()) - m_textParser.DoParse(pXMLContainer, m_pTextProvider); + return; - auto pRootStyle = m_textParser.CreateRootStyle(m_pTextProvider); - LoadRichText(pXMLContainer, textWidth, pLinePos, pRootStyle, bSavePieces, - nullptr, true, false, 0); - } - } else { + if (!m_bRichText) { LoadText(m_pTextDataNode, textWidth, pLinePos, bSavePieces); + return; } - return true; + + const CFX_XMLNode* pXMLContainer = GetXMLContainerNode(); + if (!pXMLContainer) + return; + + if (!m_textParser.IsParsed()) + m_textParser.DoParse(pXMLContainer, m_pTextProvider); + + auto pRootStyle = m_textParser.CreateRootStyle(m_pTextProvider); + LoadRichText(pXMLContainer, textWidth, pLinePos, pRootStyle, bSavePieces, + nullptr, true, false, 0); } void CXFA_TextLayout::LoadText(CXFA_Node* pNode, @@ -683,7 +684,7 @@ void CXFA_TextLayout::LoadText(CXFA_Node* pNode, } bool CXFA_TextLayout::LoadRichText( - CFX_XMLNode* pXMLNode, + const CFX_XMLNode* pXMLNode, float textWidth, float* pLinePos, const RetainPtr<CFX_CSSComputedStyle>& pParentStyle, @@ -705,7 +706,7 @@ bool CXFA_TextLayout::LoadRichText( if (bEndBreak) { bool bCurOl = false; bool bCurLi = false; - CFX_XMLElement* pElement = nullptr; + const CFX_XMLElement* pElement = nullptr; if (pContext) { if (m_bBlockContinue || (m_pLoader && pXMLNode == m_pLoader->m_pXMLNode)) { @@ -714,7 +715,7 @@ bool CXFA_TextLayout::LoadRichText( if (pXMLNode->GetType() == FX_XMLNODE_Text) { bContentNode = true; } else if (pXMLNode->GetType() == FX_XMLNODE_Element) { - pElement = static_cast<CFX_XMLElement*>(pXMLNode); + pElement = static_cast<const CFX_XMLElement*>(pXMLNode); wsName = pElement->GetLocalTagName(); } if (wsName == L"ol") { diff --git a/xfa/fxfa/cxfa_textlayout.h b/xfa/fxfa/cxfa_textlayout.h index e8c56fd1fc..9baf5ec76d 100644 --- a/xfa/fxfa/cxfa_textlayout.h +++ b/xfa/fxfa/cxfa_textlayout.h @@ -65,14 +65,14 @@ class CXFA_TextLayout { void InitBreak(CFX_CSSComputedStyle* pStyle, CFX_CSSDisplay eDisplay, float fLineWidth, - CFX_XMLNode* pXMLNode, + const CFX_XMLNode* pXMLNode, CFX_CSSComputedStyle* pParentStyle); - bool Loader(float textWidth, float* pLinePos, bool bSavePieces); + void Loader(float textWidth, float* pLinePos, bool bSavePieces); void LoadText(CXFA_Node* pNode, float textWidth, float* pLinePos, bool bSavePieces); - bool LoadRichText(CFX_XMLNode* pXMLNode, + bool LoadRichText(const CFX_XMLNode* pXMLNode, float textWidth, float* pLinePos, const RetainPtr<CFX_CSSComputedStyle>& pParentStyle, diff --git a/xfa/fxfa/cxfa_textparser.cpp b/xfa/fxfa/cxfa_textparser.cpp index 3084783a83..484e862510 100644 --- a/xfa/fxfa/cxfa_textparser.cpp +++ b/xfa/fxfa/cxfa_textparser.cpp @@ -192,7 +192,7 @@ RetainPtr<CFX_CSSComputedStyle> CXFA_TextParser::CreateStyle( } RetainPtr<CFX_CSSComputedStyle> CXFA_TextParser::ComputeStyle( - CFX_XMLNode* pXMLNode, + const CFX_XMLNode* pXMLNode, CFX_CSSComputedStyle* pParentStyle) { auto it = m_mapXMLNodeToParseContext.find(pXMLNode); if (it == m_mapXMLNodeToParseContext.end()) @@ -215,7 +215,7 @@ RetainPtr<CFX_CSSComputedStyle> CXFA_TextParser::ComputeStyle( return pStyle; } -void CXFA_TextParser::DoParse(CFX_XMLNode* pXMLContainer, +void CXFA_TextParser::DoParse(const CFX_XMLNode* pXMLContainer, CXFA_TextProvider* pTextProvider) { if (!pXMLContainer || !pTextProvider || m_bParsed) return; @@ -226,7 +226,7 @@ void CXFA_TextParser::DoParse(CFX_XMLNode* pXMLContainer, ParseRichText(pXMLContainer, pRootStyle.Get()); } -void CXFA_TextParser::ParseRichText(CFX_XMLNode* pXMLNode, +void CXFA_TextParser::ParseRichText(const CFX_XMLNode* pXMLNode, CFX_CSSComputedStyle* pParentStyle) { if (!pXMLNode) return; @@ -285,10 +285,11 @@ bool CXFA_TextParser::TagValidate(const WideString& wsName) const { FX_HashCode_GetW(wsName.AsStringView(), true)); } +// static std::unique_ptr<CXFA_TextParser::TagProvider> CXFA_TextParser::ParseTagInfo( - CFX_XMLNode* pXMLNode) { + const CFX_XMLNode* pXMLNode) { auto tagProvider = pdfium::MakeUnique<TagProvider>(); - CFX_XMLElement* pXMLElement = ToXMLElement(pXMLNode); + const CFX_XMLElement* pXMLElement = ToXMLElement(pXMLNode); if (pXMLElement) { WideString wsName = pXMLElement->GetLocalTagName(); tagProvider->SetTagName(wsName); @@ -377,7 +378,7 @@ float CXFA_TextParser::GetFontSize(CXFA_TextProvider* pTextProvider, int32_t CXFA_TextParser::GetHorScale(CXFA_TextProvider* pTextProvider, CFX_CSSComputedStyle* pStyle, - CFX_XMLNode* pXMLNode) const { + const CFX_XMLNode* pXMLNode) const { if (pStyle) { WideString wsValue; if (pStyle->GetCustomStyle(L"xfa-font-horizontal-scale", wsValue)) @@ -538,7 +539,7 @@ Optional<WideString> CXFA_TextParser::GetEmbeddedObj( } CXFA_TextParseContext* CXFA_TextParser::GetParseContextFromMap( - CFX_XMLNode* pXMLNode) { + const CFX_XMLNode* pXMLNode) { auto it = m_mapXMLNodeToParseContext.find(pXMLNode); return it != m_mapXMLNodeToParseContext.end() ? it->second.get() : nullptr; } diff --git a/xfa/fxfa/cxfa_textparser.h b/xfa/fxfa/cxfa_textparser.h index 70c153bfab..842eba74fa 100644 --- a/xfa/fxfa/cxfa_textparser.h +++ b/xfa/fxfa/cxfa_textparser.h @@ -33,12 +33,13 @@ class CXFA_TextParser { virtual ~CXFA_TextParser(); void Reset(); - void DoParse(CFX_XMLNode* pXMLContainer, CXFA_TextProvider* pTextProvider); + void DoParse(const CFX_XMLNode* pXMLContainer, + CXFA_TextProvider* pTextProvider); RetainPtr<CFX_CSSComputedStyle> CreateRootStyle( CXFA_TextProvider* pTextProvider); RetainPtr<CFX_CSSComputedStyle> ComputeStyle( - CFX_XMLNode* pXMLNode, + const CFX_XMLNode* pXMLNode, CFX_CSSComputedStyle* pParentStyle); bool IsParsed() const { return m_bParsed; } @@ -60,7 +61,7 @@ class CXFA_TextParser { int32_t GetHorScale(CXFA_TextProvider* pTextProvider, CFX_CSSComputedStyle* pStyle, - CFX_XMLNode* pXMLNode) const; + const CFX_XMLNode* pXMLNode) const; int32_t GetVerScale(CXFA_TextProvider* pTextProvider, CFX_CSSComputedStyle* pStyle) const; @@ -82,7 +83,7 @@ class CXFA_TextParser { Optional<WideString> GetEmbeddedObj(const CXFA_TextProvider* pTextProvider, const CFX_XMLNode* pXMLNode); - CXFA_TextParseContext* GetParseContextFromMap(CFX_XMLNode* pXMLNode); + CXFA_TextParseContext* GetParseContextFromMap(const CFX_XMLNode* pXMLNode); protected: bool TagValidate(const WideString& str) const; @@ -112,9 +113,12 @@ class CXFA_TextParser { std::map<WideString, WideString> m_Attributes; }; + // static + std::unique_ptr<TagProvider> ParseTagInfo(const CFX_XMLNode* pXMLNode); + void InitCSSData(CXFA_TextProvider* pTextProvider); - void ParseRichText(CFX_XMLNode* pXMLNode, CFX_CSSComputedStyle* pParentStyle); - std::unique_ptr<TagProvider> ParseTagInfo(CFX_XMLNode* pXMLNode); + void ParseRichText(const CFX_XMLNode* pXMLNode, + CFX_CSSComputedStyle* pParentStyle); std::unique_ptr<CFX_CSSStyleSheet> LoadDefaultSheetStyle(); RetainPtr<CFX_CSSComputedStyle> CreateStyle( CFX_CSSComputedStyle* pParentStyle); @@ -122,7 +126,7 @@ class CXFA_TextParser { bool m_bParsed; bool m_cssInitialized; std::unique_ptr<CFX_CSSStyleSelector> m_pSelector; - std::map<CFX_XMLNode*, std::unique_ptr<CXFA_TextParseContext>> + std::map<const CFX_XMLNode*, std::unique_ptr<CXFA_TextParseContext>> m_mapXMLNodeToParseContext; }; |