| Index: xfa/src/fxfa/src/app/xfa_textlayout.h
|
| diff --git a/xfa/src/fxfa/src/app/xfa_textlayout.h b/xfa/src/fxfa/src/app/xfa_textlayout.h
|
| index b47b37359afe0c9563947235a0abb836de6aba30..0078ec74bbfbff3f8dcdecdd1291f1bb5b59dca6 100644
|
| --- a/xfa/src/fxfa/src/app/xfa_textlayout.h
|
| +++ b/xfa/src/fxfa/src/app/xfa_textlayout.h
|
| @@ -1,406 +1,406 @@
|
| -// Copyright 2014 PDFium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
|
| -
|
| -#ifndef _FXFA_TEXTLAYOUT_H
|
| -#define _FXFA_TEXTLAYOUT_H
|
| -#define XFA_LOADERCNTXTFLG_FILTERSPACE 0x001
|
| -class CXFA_TextTabstopsContext;
|
| -class IXFA_TextProvider {
|
| - public:
|
| - virtual ~IXFA_TextProvider() {}
|
| - virtual CXFA_Node* GetTextNode(FX_BOOL& bRichText) = 0;
|
| - virtual CXFA_Para GetParaNode() = 0;
|
| - virtual CXFA_Font GetFontNode() = 0;
|
| - virtual FX_BOOL IsCheckButtonAndAutoWidth() = 0;
|
| - virtual CXFA_FFDoc* GetDocNode() = 0;
|
| - virtual FX_BOOL GetEmbbedObj(FX_BOOL bURI,
|
| - FX_BOOL bRaw,
|
| - const CFX_WideString& wsAttr,
|
| - CFX_WideString& wsValue) = 0;
|
| -};
|
| -class CXFA_CSSTagProvider : public IFDE_CSSTagProvider {
|
| - public:
|
| - CXFA_CSSTagProvider() : m_bTagAviliable(FALSE), m_bContent(FALSE) {}
|
| - virtual ~CXFA_CSSTagProvider();
|
| - virtual CFX_WideStringC GetTagName() { return m_wsTagName; }
|
| - virtual FX_POSITION GetFirstAttribute() {
|
| - return m_Attributes.GetStartPosition();
|
| - }
|
| - virtual void GetNextAttribute(FX_POSITION& pos,
|
| - CFX_WideStringC& wsAttr,
|
| - CFX_WideStringC& wsValue);
|
| - void SetTagNameObj(const CFX_WideString& wsName) { m_wsTagName = wsName; }
|
| - void SetAttribute(const CFX_WideString& wsAttr,
|
| - const CFX_WideString& wsValue);
|
| - FX_BOOL m_bTagAviliable;
|
| - FX_BOOL m_bContent;
|
| -
|
| - protected:
|
| - CFX_WideString m_wsTagName;
|
| - CFX_MapPtrToPtr m_Attributes;
|
| -};
|
| -class CXFA_TextParseContext : public CFX_Target {
|
| - public:
|
| - CXFA_TextParseContext()
|
| - : m_pParentStyle(nullptr),
|
| - m_ppMatchedDecls(nullptr),
|
| - m_dwMatchedDecls(0),
|
| - m_eDisplay(FDE_CSSDISPLAY_None) {}
|
| - ~CXFA_TextParseContext() {
|
| - if (m_pParentStyle)
|
| - m_pParentStyle->Release();
|
| - FX_Free(m_ppMatchedDecls);
|
| - }
|
| - void SetDisplay(FDE_CSSDISPLAY eDisplay) { m_eDisplay = eDisplay; }
|
| - FDE_CSSDISPLAY GetDisplay() const { return m_eDisplay; }
|
| - void SetDecls(const IFDE_CSSDeclaration** ppDeclArray, int32_t iDeclCount);
|
| - const IFDE_CSSDeclaration** GetDecls() {
|
| - return (const IFDE_CSSDeclaration**)m_ppMatchedDecls;
|
| - }
|
| - FX_DWORD CountDecls() const { return m_dwMatchedDecls; }
|
| - IFDE_CSSComputedStyle* m_pParentStyle;
|
| -
|
| - protected:
|
| - IFDE_CSSDeclaration** m_ppMatchedDecls;
|
| - FX_DWORD m_dwMatchedDecls : 28;
|
| - FDE_CSSDISPLAY m_eDisplay : 4;
|
| -};
|
| -class CXFA_TextParser {
|
| - public:
|
| - CXFA_TextParser() : m_pAllocator(NULL), m_pSelector(NULL), m_pUASheet(NULL) {}
|
| - virtual ~CXFA_TextParser();
|
| - void Reset();
|
| - void DoParse(IFDE_XMLNode* pXMLContainer, IXFA_TextProvider* pTextProvider);
|
| - IFDE_CSSComputedStyle* CreateRootStyle(IXFA_TextProvider* pTextProvider);
|
| - IFDE_CSSComputedStyle* ComputeStyle(IFDE_XMLNode* pXMLNode,
|
| - IFDE_CSSComputedStyle* pParentStyle);
|
| - FX_BOOL IsParsed() const { return m_pAllocator != NULL; }
|
| -
|
| - int32_t GetVAlgin(IXFA_TextProvider* pTextProvider) const;
|
| - FX_FLOAT GetTabInterval(IFDE_CSSComputedStyle* pStyle) const;
|
| - int32_t CountTabs(IFDE_CSSComputedStyle* pStyle) const;
|
| - FX_BOOL IsSpaceRun(IFDE_CSSComputedStyle* pStyle) const;
|
| - FX_BOOL GetTabstops(IFDE_CSSComputedStyle* pStyle,
|
| - CXFA_TextTabstopsContext* pTabstopContext);
|
| - IFX_Font* GetFont(IXFA_TextProvider* pTextProvider,
|
| - IFDE_CSSComputedStyle* pStyle) const;
|
| - FX_FLOAT GetFontSize(IXFA_TextProvider* pTextProvider,
|
| - IFDE_CSSComputedStyle* pStyle) const;
|
| - int32_t GetHorScale(IXFA_TextProvider* pTextProvider,
|
| - IFDE_CSSComputedStyle* pStyle,
|
| - IFDE_XMLNode* pXMLNode) const;
|
| - int32_t GetVerScale(IXFA_TextProvider* pTextProvider,
|
| - IFDE_CSSComputedStyle* pStyle) const;
|
| - void GetUnderline(IXFA_TextProvider* pTextProvider,
|
| - IFDE_CSSComputedStyle* pStyle,
|
| - int32_t& iUnderline,
|
| - int32_t& iPeriod) const;
|
| - void GetLinethrough(IXFA_TextProvider* pTextProvider,
|
| - IFDE_CSSComputedStyle* pStyle,
|
| - int32_t& iLinethrough) const;
|
| - FX_ARGB GetColor(IXFA_TextProvider* pTextProvider,
|
| - IFDE_CSSComputedStyle* pStyle) const;
|
| - FX_FLOAT GetBaseline(IXFA_TextProvider* pTextProvider,
|
| - IFDE_CSSComputedStyle* pStyle) const;
|
| - FX_FLOAT GetLineHeight(IXFA_TextProvider* pTextProvider,
|
| - IFDE_CSSComputedStyle* pStyle,
|
| - FX_BOOL bFirst,
|
| - FX_FLOAT fVerScale) const;
|
| - FX_BOOL GetEmbbedObj(IXFA_TextProvider* pTextProvider,
|
| - IFDE_XMLNode* pXMLNode,
|
| - CFX_WideString& wsValue);
|
| - CXFA_TextParseContext* GetParseContextFromMap(IFDE_XMLNode* pXMLNode);
|
| -
|
| - private:
|
| - void InitCSSData(IXFA_TextProvider* pTextProvider);
|
| - void ParseRichText(IFDE_XMLNode* pXMLNode,
|
| - IFDE_CSSComputedStyle* pParentStyle);
|
| - void ParseTagInfo(IFDE_XMLNode* pXMLNode, CXFA_CSSTagProvider& tagProvider);
|
| - IFDE_CSSStyleSheet* LoadDefaultSheetStyle();
|
| - IFDE_CSSComputedStyle* CreateStyle(IFDE_CSSComputedStyle* pParentStyle);
|
| - IFX_MEMAllocator* m_pAllocator;
|
| - IFDE_CSSStyleSelector* m_pSelector;
|
| - IFDE_CSSStyleSheet* m_pUASheet;
|
| - CFX_MapPtrTemplate<IFDE_XMLNode*, CXFA_TextParseContext*>
|
| - m_mapXMLNodeToParseContext;
|
| -};
|
| -class CXFA_LoaderContext {
|
| - public:
|
| - CXFA_LoaderContext()
|
| - : m_bSaveLineHeight(FALSE),
|
| - m_fWidth(0),
|
| - m_fHeight(0),
|
| - m_fLastPos(0),
|
| - m_fStartLineOffset(0),
|
| - m_iChar(0),
|
| - m_iTotalLines(-1),
|
| - m_pXMLNode(NULL),
|
| - m_pNode(NULL),
|
| - m_pParentStyle(NULL),
|
| - m_dwFlags(0) {}
|
| - FX_BOOL m_bSaveLineHeight;
|
| - FX_FLOAT m_fWidth;
|
| - FX_FLOAT m_fHeight;
|
| - FX_FLOAT m_fLastPos;
|
| - FX_FLOAT m_fStartLineOffset;
|
| - int32_t m_iChar;
|
| - int32_t m_iLines;
|
| - int32_t m_iTotalLines;
|
| - IFDE_XMLNode* m_pXMLNode;
|
| - CXFA_Node* m_pNode;
|
| - IFDE_CSSComputedStyle* m_pParentStyle;
|
| - CFX_ArrayTemplate<FX_FLOAT> m_lineHeights;
|
| - FX_DWORD m_dwFlags;
|
| - CFX_FloatArray m_BlocksHeight;
|
| -};
|
| -class CXFA_LinkUserData : public IFX_Unknown, public CFX_Target {
|
| - public:
|
| - CXFA_LinkUserData(IFX_MEMAllocator* pAllocator, FX_WCHAR* pszText)
|
| - : m_pAllocator(pAllocator), m_dwRefCount(1) {
|
| - m_pszURLContent = pszText;
|
| - }
|
| - ~CXFA_LinkUserData() {}
|
| - virtual FX_DWORD Release() {
|
| - FX_DWORD dwRefCount = --m_dwRefCount;
|
| - if (dwRefCount <= 0) {
|
| - FDE_DeleteWith(CXFA_LinkUserData, m_pAllocator, this);
|
| - }
|
| - return dwRefCount;
|
| - }
|
| - virtual FX_DWORD AddRef() { return ++m_dwRefCount; }
|
| -
|
| - public:
|
| - const FX_WCHAR* GetLinkURL() { return m_pszURLContent; };
|
| -
|
| - protected:
|
| - IFX_MEMAllocator* m_pAllocator;
|
| - FX_DWORD m_dwRefCount;
|
| - CFX_WideString m_pszURLContent;
|
| -};
|
| -class CXFA_TextUserData : public IFX_Unknown, public CFX_Target {
|
| - public:
|
| - CXFA_TextUserData(IFX_MEMAllocator* pAllocator, IFDE_CSSComputedStyle* pStyle)
|
| - : m_pStyle(pStyle),
|
| - m_pLinkData(nullptr),
|
| - m_pAllocator(pAllocator),
|
| - m_dwRefCount(0) {
|
| - FXSYS_assert(m_pAllocator);
|
| - if (m_pStyle)
|
| - m_pStyle->AddRef();
|
| - }
|
| - CXFA_TextUserData(IFX_MEMAllocator* pAllocator,
|
| - IFDE_CSSComputedStyle* pStyle,
|
| - CXFA_LinkUserData* pLinkData)
|
| - : m_pStyle(pStyle),
|
| - m_pLinkData(pLinkData),
|
| - m_pAllocator(pAllocator),
|
| - m_dwRefCount(0) {
|
| - FXSYS_assert(m_pAllocator);
|
| - if (m_pStyle)
|
| - m_pStyle->AddRef();
|
| - }
|
| - ~CXFA_TextUserData() {
|
| - if (m_pStyle)
|
| - m_pStyle->Release();
|
| - if (m_pLinkData)
|
| - m_pLinkData->Release();
|
| - }
|
| - virtual FX_DWORD Release() {
|
| - FX_DWORD dwRefCount = --m_dwRefCount;
|
| - if (dwRefCount == 0) {
|
| - FDE_DeleteWith(CXFA_TextUserData, m_pAllocator, this);
|
| - }
|
| - return dwRefCount;
|
| - }
|
| - virtual FX_DWORD AddRef() { return ++m_dwRefCount; }
|
| -
|
| - IFDE_CSSComputedStyle* m_pStyle;
|
| - CXFA_LinkUserData* m_pLinkData;
|
| -
|
| - protected:
|
| - IFX_MEMAllocator* m_pAllocator;
|
| - FX_DWORD m_dwRefCount;
|
| -};
|
| -typedef struct _XFA_TEXTPIECE : public CFX_Target {
|
| - FX_WCHAR* pszText;
|
| - int32_t iChars;
|
| - int32_t* pWidths;
|
| - int32_t iHorScale;
|
| - int32_t iVerScale;
|
| - int32_t iBidiLevel;
|
| - int32_t iUnderline;
|
| - int32_t iPeriod;
|
| - int32_t iLineThrough;
|
| - IFX_Font* pFont;
|
| - FX_ARGB dwColor;
|
| - FX_FLOAT fFontSize;
|
| - CFX_RectF rtPiece;
|
| - CXFA_LinkUserData* pLinkData;
|
| -
|
| - _XFA_TEXTPIECE() : pszText(NULL), pFont(NULL), pLinkData(NULL) {
|
| - pszText = NULL;
|
| - }
|
| - ~_XFA_TEXTPIECE() {
|
| - pszText = NULL;
|
| - if (NULL != pLinkData) {
|
| - pLinkData->Release();
|
| - pLinkData = NULL;
|
| - }
|
| - }
|
| -} XFA_TEXTPIECE, *XFA_LPTEXTPIECE;
|
| -typedef XFA_TEXTPIECE const* XFA_LPCTEXTPIECE;
|
| -typedef CFX_ArrayTemplate<XFA_LPTEXTPIECE> CXFA_PieceArray;
|
| -class CXFA_PieceLine : public CFX_Target {
|
| - public:
|
| - CXFA_PieceLine() {}
|
| - CXFA_PieceArray m_textPieces;
|
| - CFX_Int32Array m_charCounts;
|
| -};
|
| -typedef CFX_ArrayTemplate<CXFA_PieceLine*> CXFA_PieceLineArray;
|
| -struct XFA_TABSTOPS {
|
| - FX_DWORD dwAlign;
|
| - FX_FLOAT fTabstops;
|
| -};
|
| -class CXFA_TextTabstopsContext {
|
| - public:
|
| - CXFA_TextTabstopsContext()
|
| - : m_iTabCount(0),
|
| - m_iTabIndex(-1),
|
| - m_bTabstops(FALSE),
|
| - m_fTabWidth(0),
|
| - m_fLeft(0) {}
|
| - void Append(FX_DWORD dwAlign, FX_FLOAT fTabstops) {
|
| - int32_t i = 0;
|
| - for (i = 0; i < m_iTabCount; i++) {
|
| - XFA_TABSTOPS* pTabstop = m_tabstops.GetDataPtr(i);
|
| - if (fTabstops < pTabstop->fTabstops) {
|
| - break;
|
| - }
|
| - }
|
| - m_tabstops.InsertSpaceAt(i, 1);
|
| - XFA_TABSTOPS tabstop;
|
| - tabstop.dwAlign = dwAlign;
|
| - tabstop.fTabstops = fTabstops;
|
| - m_tabstops.SetAt(i, tabstop);
|
| - m_iTabCount++;
|
| - }
|
| - void RemoveAll() {
|
| - m_tabstops.RemoveAll();
|
| - m_iTabCount = 0;
|
| - }
|
| - void Reset() {
|
| - m_iTabIndex = -1;
|
| - m_bTabstops = FALSE;
|
| - m_fTabWidth = 0;
|
| - m_fLeft = 0;
|
| - }
|
| - CFX_ArrayTemplate<XFA_TABSTOPS> m_tabstops;
|
| - int32_t m_iTabCount;
|
| - int32_t m_iTabIndex;
|
| - FX_BOOL m_bTabstops;
|
| - FX_FLOAT m_fTabWidth;
|
| - FX_FLOAT m_fLeft;
|
| -};
|
| -class CXFA_TextLayout {
|
| - public:
|
| - CXFA_TextLayout(IXFA_TextProvider* pTextProvider);
|
| - virtual ~CXFA_TextLayout();
|
| - int32_t GetText(CFX_WideString& wsText);
|
| - FX_FLOAT GetLayoutHeight();
|
| - FX_FLOAT StartLayout(FX_FLOAT fWidth = -1);
|
| - FX_BOOL DoLayout(int32_t iBlockIndex,
|
| - FX_FLOAT& fCalcHeight,
|
| - FX_FLOAT fContentAreaHeight = -1,
|
| - FX_FLOAT fTextHeight = -1);
|
| -
|
| - FX_BOOL CalcSize(const CFX_SizeF& minSize,
|
| - const CFX_SizeF& maxSize,
|
| - CFX_SizeF& defaultSize);
|
| - FX_BOOL Layout(const CFX_SizeF& size, FX_FLOAT* fHeight = NULL);
|
| - void ItemBlocks(const CFX_RectF& rtText, int32_t iBlockIndex);
|
| - FX_BOOL DrawString(CFX_RenderDevice* pFxDevice,
|
| - const CFX_Matrix& tmDoc2Device,
|
| - const CFX_RectF& rtClip,
|
| - int32_t iBlock = 0);
|
| - FX_BOOL IsLoaded() const { return m_pieceLines.GetSize() > 0; }
|
| - void Unload();
|
| - const CXFA_PieceLineArray* GetPieceLines();
|
| -
|
| - FX_BOOL m_bHasBlock;
|
| - CFX_Int32Array m_Blocks;
|
| -
|
| - private:
|
| - void GetTextDataNode();
|
| - IFDE_XMLNode* GetXMLContainerNode();
|
| - IFX_RTFBreak* CreateBreak(FX_BOOL bDefault);
|
| - void InitBreak(FX_FLOAT fLineWidth);
|
| - void InitBreak(IFDE_CSSComputedStyle* pStyle,
|
| - FDE_CSSDISPLAY eDisplay,
|
| - FX_FLOAT fLineWidth,
|
| - IFDE_XMLNode* pXMLNode,
|
| - IFDE_CSSComputedStyle* pParentStyle = NULL);
|
| - FX_BOOL Loader(const CFX_SizeF& szText,
|
| - FX_FLOAT& fLinePos,
|
| - FX_BOOL bSavePieces = TRUE);
|
| - void LoadText(CXFA_Node* pNode,
|
| - const CFX_SizeF& szText,
|
| - FX_FLOAT& fLinePos,
|
| - FX_BOOL bSavePieces);
|
| - FX_BOOL LoadRichText(IFDE_XMLNode* pXMLNode,
|
| - const CFX_SizeF& szText,
|
| - FX_FLOAT& fLinePos,
|
| - IFDE_CSSComputedStyle* pParentStyle,
|
| - FX_BOOL bSavePieces,
|
| - CXFA_LinkUserData* pLinkData = NULL,
|
| - FX_BOOL bEndBreak = TRUE,
|
| - FX_BOOL bIsOl = FALSE,
|
| - int32_t iLiCount = 0);
|
| - FX_BOOL AppendChar(const CFX_WideString& wsText,
|
| - FX_FLOAT& fLinePos,
|
| - FX_FLOAT fSpaceAbove,
|
| - FX_BOOL bSavePieces);
|
| - void AppendTextLine(FX_DWORD dwStatus,
|
| - FX_FLOAT& fLinePos,
|
| - FX_BOOL bSavePieces,
|
| - FX_BOOL bEndBreak = FALSE);
|
| - void EndBreak(FX_DWORD dwStatus, FX_FLOAT& fLinePos, FX_BOOL bDefault);
|
| - FX_BOOL IsEnd(FX_BOOL bSavePieces);
|
| - void ProcessText(CFX_WideString& wsText);
|
| - void UpdateAlign(FX_FLOAT fHeight, FX_FLOAT fBottom);
|
| - void RenderString(IFDE_RenderDevice* pDevice,
|
| - IFDE_SolidBrush* pBrush,
|
| - CXFA_PieceLine* pPieceLine,
|
| - int32_t iPiece,
|
| - FXTEXT_CHARPOS* pCharPos,
|
| - const CFX_Matrix& tmDoc2Device);
|
| - void RenderPath(IFDE_RenderDevice* pDevice,
|
| - IFDE_Pen* pPen,
|
| - CXFA_PieceLine* pPieceLine,
|
| - int32_t iPiece,
|
| - FXTEXT_CHARPOS* pCharPos,
|
| - const CFX_Matrix& tmDoc2Device);
|
| - int32_t GetDisplayPos(XFA_LPCTEXTPIECE pPiece,
|
| - FXTEXT_CHARPOS* pCharPos,
|
| - FX_BOOL bCharCode = FALSE);
|
| - FX_BOOL ToRun(XFA_LPCTEXTPIECE pPiece, FX_RTFTEXTOBJ& tr);
|
| - void DoTabstops(IFDE_CSSComputedStyle* pStyle, CXFA_PieceLine* pPieceLine);
|
| - FX_BOOL Layout(int32_t iBlock);
|
| - int32_t CountBlocks() const;
|
| -
|
| - IXFA_TextProvider* m_pTextProvider;
|
| - CXFA_Node* m_pTextDataNode;
|
| - FX_BOOL m_bRichText;
|
| - IFX_MEMAllocator* m_pAllocator;
|
| - IFX_RTFBreak* m_pBreak;
|
| - CXFA_LoaderContext* m_pLoader;
|
| - int32_t m_iLines;
|
| - FX_FLOAT m_fMaxWidth;
|
| - CXFA_TextParser m_textParser;
|
| - CXFA_PieceLineArray m_pieceLines;
|
| - CXFA_TextTabstopsContext* m_pTabstopContext;
|
| - FX_BOOL m_bBlockContinue;
|
| -};
|
| -#endif
|
| +// Copyright 2014 PDFium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
|
| +
|
| +#ifndef _FXFA_TEXTLAYOUT_H
|
| +#define _FXFA_TEXTLAYOUT_H
|
| +#define XFA_LOADERCNTXTFLG_FILTERSPACE 0x001
|
| +class CXFA_TextTabstopsContext;
|
| +class IXFA_TextProvider {
|
| + public:
|
| + virtual ~IXFA_TextProvider() {}
|
| + virtual CXFA_Node* GetTextNode(FX_BOOL& bRichText) = 0;
|
| + virtual CXFA_Para GetParaNode() = 0;
|
| + virtual CXFA_Font GetFontNode() = 0;
|
| + virtual FX_BOOL IsCheckButtonAndAutoWidth() = 0;
|
| + virtual CXFA_FFDoc* GetDocNode() = 0;
|
| + virtual FX_BOOL GetEmbbedObj(FX_BOOL bURI,
|
| + FX_BOOL bRaw,
|
| + const CFX_WideString& wsAttr,
|
| + CFX_WideString& wsValue) = 0;
|
| +};
|
| +class CXFA_CSSTagProvider : public IFDE_CSSTagProvider {
|
| + public:
|
| + CXFA_CSSTagProvider() : m_bTagAviliable(FALSE), m_bContent(FALSE) {}
|
| + virtual ~CXFA_CSSTagProvider();
|
| + virtual CFX_WideStringC GetTagName() { return m_wsTagName; }
|
| + virtual FX_POSITION GetFirstAttribute() {
|
| + return m_Attributes.GetStartPosition();
|
| + }
|
| + virtual void GetNextAttribute(FX_POSITION& pos,
|
| + CFX_WideStringC& wsAttr,
|
| + CFX_WideStringC& wsValue);
|
| + void SetTagNameObj(const CFX_WideString& wsName) { m_wsTagName = wsName; }
|
| + void SetAttribute(const CFX_WideString& wsAttr,
|
| + const CFX_WideString& wsValue);
|
| + FX_BOOL m_bTagAviliable;
|
| + FX_BOOL m_bContent;
|
| +
|
| + protected:
|
| + CFX_WideString m_wsTagName;
|
| + CFX_MapPtrToPtr m_Attributes;
|
| +};
|
| +class CXFA_TextParseContext : public CFX_Target {
|
| + public:
|
| + CXFA_TextParseContext()
|
| + : m_pParentStyle(nullptr),
|
| + m_ppMatchedDecls(nullptr),
|
| + m_dwMatchedDecls(0),
|
| + m_eDisplay(FDE_CSSDISPLAY_None) {}
|
| + ~CXFA_TextParseContext() {
|
| + if (m_pParentStyle)
|
| + m_pParentStyle->Release();
|
| + FX_Free(m_ppMatchedDecls);
|
| + }
|
| + void SetDisplay(FDE_CSSDISPLAY eDisplay) { m_eDisplay = eDisplay; }
|
| + FDE_CSSDISPLAY GetDisplay() const { return m_eDisplay; }
|
| + void SetDecls(const IFDE_CSSDeclaration** ppDeclArray, int32_t iDeclCount);
|
| + const IFDE_CSSDeclaration** GetDecls() {
|
| + return (const IFDE_CSSDeclaration**)m_ppMatchedDecls;
|
| + }
|
| + FX_DWORD CountDecls() const { return m_dwMatchedDecls; }
|
| + IFDE_CSSComputedStyle* m_pParentStyle;
|
| +
|
| + protected:
|
| + IFDE_CSSDeclaration** m_ppMatchedDecls;
|
| + FX_DWORD m_dwMatchedDecls : 28;
|
| + FDE_CSSDISPLAY m_eDisplay : 4;
|
| +};
|
| +class CXFA_TextParser {
|
| + public:
|
| + CXFA_TextParser() : m_pAllocator(NULL), m_pSelector(NULL), m_pUASheet(NULL) {}
|
| + virtual ~CXFA_TextParser();
|
| + void Reset();
|
| + void DoParse(IFDE_XMLNode* pXMLContainer, IXFA_TextProvider* pTextProvider);
|
| + IFDE_CSSComputedStyle* CreateRootStyle(IXFA_TextProvider* pTextProvider);
|
| + IFDE_CSSComputedStyle* ComputeStyle(IFDE_XMLNode* pXMLNode,
|
| + IFDE_CSSComputedStyle* pParentStyle);
|
| + FX_BOOL IsParsed() const { return m_pAllocator != NULL; }
|
| +
|
| + int32_t GetVAlgin(IXFA_TextProvider* pTextProvider) const;
|
| + FX_FLOAT GetTabInterval(IFDE_CSSComputedStyle* pStyle) const;
|
| + int32_t CountTabs(IFDE_CSSComputedStyle* pStyle) const;
|
| + FX_BOOL IsSpaceRun(IFDE_CSSComputedStyle* pStyle) const;
|
| + FX_BOOL GetTabstops(IFDE_CSSComputedStyle* pStyle,
|
| + CXFA_TextTabstopsContext* pTabstopContext);
|
| + IFX_Font* GetFont(IXFA_TextProvider* pTextProvider,
|
| + IFDE_CSSComputedStyle* pStyle) const;
|
| + FX_FLOAT GetFontSize(IXFA_TextProvider* pTextProvider,
|
| + IFDE_CSSComputedStyle* pStyle) const;
|
| + int32_t GetHorScale(IXFA_TextProvider* pTextProvider,
|
| + IFDE_CSSComputedStyle* pStyle,
|
| + IFDE_XMLNode* pXMLNode) const;
|
| + int32_t GetVerScale(IXFA_TextProvider* pTextProvider,
|
| + IFDE_CSSComputedStyle* pStyle) const;
|
| + void GetUnderline(IXFA_TextProvider* pTextProvider,
|
| + IFDE_CSSComputedStyle* pStyle,
|
| + int32_t& iUnderline,
|
| + int32_t& iPeriod) const;
|
| + void GetLinethrough(IXFA_TextProvider* pTextProvider,
|
| + IFDE_CSSComputedStyle* pStyle,
|
| + int32_t& iLinethrough) const;
|
| + FX_ARGB GetColor(IXFA_TextProvider* pTextProvider,
|
| + IFDE_CSSComputedStyle* pStyle) const;
|
| + FX_FLOAT GetBaseline(IXFA_TextProvider* pTextProvider,
|
| + IFDE_CSSComputedStyle* pStyle) const;
|
| + FX_FLOAT GetLineHeight(IXFA_TextProvider* pTextProvider,
|
| + IFDE_CSSComputedStyle* pStyle,
|
| + FX_BOOL bFirst,
|
| + FX_FLOAT fVerScale) const;
|
| + FX_BOOL GetEmbbedObj(IXFA_TextProvider* pTextProvider,
|
| + IFDE_XMLNode* pXMLNode,
|
| + CFX_WideString& wsValue);
|
| + CXFA_TextParseContext* GetParseContextFromMap(IFDE_XMLNode* pXMLNode);
|
| +
|
| + private:
|
| + void InitCSSData(IXFA_TextProvider* pTextProvider);
|
| + void ParseRichText(IFDE_XMLNode* pXMLNode,
|
| + IFDE_CSSComputedStyle* pParentStyle);
|
| + void ParseTagInfo(IFDE_XMLNode* pXMLNode, CXFA_CSSTagProvider& tagProvider);
|
| + IFDE_CSSStyleSheet* LoadDefaultSheetStyle();
|
| + IFDE_CSSComputedStyle* CreateStyle(IFDE_CSSComputedStyle* pParentStyle);
|
| + IFX_MEMAllocator* m_pAllocator;
|
| + IFDE_CSSStyleSelector* m_pSelector;
|
| + IFDE_CSSStyleSheet* m_pUASheet;
|
| + CFX_MapPtrTemplate<IFDE_XMLNode*, CXFA_TextParseContext*>
|
| + m_mapXMLNodeToParseContext;
|
| +};
|
| +class CXFA_LoaderContext {
|
| + public:
|
| + CXFA_LoaderContext()
|
| + : m_bSaveLineHeight(FALSE),
|
| + m_fWidth(0),
|
| + m_fHeight(0),
|
| + m_fLastPos(0),
|
| + m_fStartLineOffset(0),
|
| + m_iChar(0),
|
| + m_iTotalLines(-1),
|
| + m_pXMLNode(NULL),
|
| + m_pNode(NULL),
|
| + m_pParentStyle(NULL),
|
| + m_dwFlags(0) {}
|
| + FX_BOOL m_bSaveLineHeight;
|
| + FX_FLOAT m_fWidth;
|
| + FX_FLOAT m_fHeight;
|
| + FX_FLOAT m_fLastPos;
|
| + FX_FLOAT m_fStartLineOffset;
|
| + int32_t m_iChar;
|
| + int32_t m_iLines;
|
| + int32_t m_iTotalLines;
|
| + IFDE_XMLNode* m_pXMLNode;
|
| + CXFA_Node* m_pNode;
|
| + IFDE_CSSComputedStyle* m_pParentStyle;
|
| + CFX_ArrayTemplate<FX_FLOAT> m_lineHeights;
|
| + FX_DWORD m_dwFlags;
|
| + CFX_FloatArray m_BlocksHeight;
|
| +};
|
| +class CXFA_LinkUserData : public IFX_Unknown, public CFX_Target {
|
| + public:
|
| + CXFA_LinkUserData(IFX_MEMAllocator* pAllocator, FX_WCHAR* pszText)
|
| + : m_pAllocator(pAllocator), m_dwRefCount(1) {
|
| + m_pszURLContent = pszText;
|
| + }
|
| + ~CXFA_LinkUserData() {}
|
| + virtual FX_DWORD Release() {
|
| + FX_DWORD dwRefCount = --m_dwRefCount;
|
| + if (dwRefCount <= 0) {
|
| + FDE_DeleteWith(CXFA_LinkUserData, m_pAllocator, this);
|
| + }
|
| + return dwRefCount;
|
| + }
|
| + virtual FX_DWORD AddRef() { return ++m_dwRefCount; }
|
| +
|
| + public:
|
| + const FX_WCHAR* GetLinkURL() { return m_pszURLContent; };
|
| +
|
| + protected:
|
| + IFX_MEMAllocator* m_pAllocator;
|
| + FX_DWORD m_dwRefCount;
|
| + CFX_WideString m_pszURLContent;
|
| +};
|
| +class CXFA_TextUserData : public IFX_Unknown, public CFX_Target {
|
| + public:
|
| + CXFA_TextUserData(IFX_MEMAllocator* pAllocator, IFDE_CSSComputedStyle* pStyle)
|
| + : m_pStyle(pStyle),
|
| + m_pLinkData(nullptr),
|
| + m_pAllocator(pAllocator),
|
| + m_dwRefCount(0) {
|
| + FXSYS_assert(m_pAllocator);
|
| + if (m_pStyle)
|
| + m_pStyle->AddRef();
|
| + }
|
| + CXFA_TextUserData(IFX_MEMAllocator* pAllocator,
|
| + IFDE_CSSComputedStyle* pStyle,
|
| + CXFA_LinkUserData* pLinkData)
|
| + : m_pStyle(pStyle),
|
| + m_pLinkData(pLinkData),
|
| + m_pAllocator(pAllocator),
|
| + m_dwRefCount(0) {
|
| + FXSYS_assert(m_pAllocator);
|
| + if (m_pStyle)
|
| + m_pStyle->AddRef();
|
| + }
|
| + ~CXFA_TextUserData() {
|
| + if (m_pStyle)
|
| + m_pStyle->Release();
|
| + if (m_pLinkData)
|
| + m_pLinkData->Release();
|
| + }
|
| + virtual FX_DWORD Release() {
|
| + FX_DWORD dwRefCount = --m_dwRefCount;
|
| + if (dwRefCount == 0) {
|
| + FDE_DeleteWith(CXFA_TextUserData, m_pAllocator, this);
|
| + }
|
| + return dwRefCount;
|
| + }
|
| + virtual FX_DWORD AddRef() { return ++m_dwRefCount; }
|
| +
|
| + IFDE_CSSComputedStyle* m_pStyle;
|
| + CXFA_LinkUserData* m_pLinkData;
|
| +
|
| + protected:
|
| + IFX_MEMAllocator* m_pAllocator;
|
| + FX_DWORD m_dwRefCount;
|
| +};
|
| +typedef struct _XFA_TEXTPIECE : public CFX_Target {
|
| + FX_WCHAR* pszText;
|
| + int32_t iChars;
|
| + int32_t* pWidths;
|
| + int32_t iHorScale;
|
| + int32_t iVerScale;
|
| + int32_t iBidiLevel;
|
| + int32_t iUnderline;
|
| + int32_t iPeriod;
|
| + int32_t iLineThrough;
|
| + IFX_Font* pFont;
|
| + FX_ARGB dwColor;
|
| + FX_FLOAT fFontSize;
|
| + CFX_RectF rtPiece;
|
| + CXFA_LinkUserData* pLinkData;
|
| +
|
| + _XFA_TEXTPIECE() : pszText(NULL), pFont(NULL), pLinkData(NULL) {
|
| + pszText = NULL;
|
| + }
|
| + ~_XFA_TEXTPIECE() {
|
| + pszText = NULL;
|
| + if (NULL != pLinkData) {
|
| + pLinkData->Release();
|
| + pLinkData = NULL;
|
| + }
|
| + }
|
| +} XFA_TEXTPIECE, *XFA_LPTEXTPIECE;
|
| +typedef XFA_TEXTPIECE const* XFA_LPCTEXTPIECE;
|
| +typedef CFX_ArrayTemplate<XFA_LPTEXTPIECE> CXFA_PieceArray;
|
| +class CXFA_PieceLine : public CFX_Target {
|
| + public:
|
| + CXFA_PieceLine() {}
|
| + CXFA_PieceArray m_textPieces;
|
| + CFX_Int32Array m_charCounts;
|
| +};
|
| +typedef CFX_ArrayTemplate<CXFA_PieceLine*> CXFA_PieceLineArray;
|
| +struct XFA_TABSTOPS {
|
| + FX_DWORD dwAlign;
|
| + FX_FLOAT fTabstops;
|
| +};
|
| +class CXFA_TextTabstopsContext {
|
| + public:
|
| + CXFA_TextTabstopsContext()
|
| + : m_iTabCount(0),
|
| + m_iTabIndex(-1),
|
| + m_bTabstops(FALSE),
|
| + m_fTabWidth(0),
|
| + m_fLeft(0) {}
|
| + void Append(FX_DWORD dwAlign, FX_FLOAT fTabstops) {
|
| + int32_t i = 0;
|
| + for (i = 0; i < m_iTabCount; i++) {
|
| + XFA_TABSTOPS* pTabstop = m_tabstops.GetDataPtr(i);
|
| + if (fTabstops < pTabstop->fTabstops) {
|
| + break;
|
| + }
|
| + }
|
| + m_tabstops.InsertSpaceAt(i, 1);
|
| + XFA_TABSTOPS tabstop;
|
| + tabstop.dwAlign = dwAlign;
|
| + tabstop.fTabstops = fTabstops;
|
| + m_tabstops.SetAt(i, tabstop);
|
| + m_iTabCount++;
|
| + }
|
| + void RemoveAll() {
|
| + m_tabstops.RemoveAll();
|
| + m_iTabCount = 0;
|
| + }
|
| + void Reset() {
|
| + m_iTabIndex = -1;
|
| + m_bTabstops = FALSE;
|
| + m_fTabWidth = 0;
|
| + m_fLeft = 0;
|
| + }
|
| + CFX_ArrayTemplate<XFA_TABSTOPS> m_tabstops;
|
| + int32_t m_iTabCount;
|
| + int32_t m_iTabIndex;
|
| + FX_BOOL m_bTabstops;
|
| + FX_FLOAT m_fTabWidth;
|
| + FX_FLOAT m_fLeft;
|
| +};
|
| +class CXFA_TextLayout {
|
| + public:
|
| + CXFA_TextLayout(IXFA_TextProvider* pTextProvider);
|
| + virtual ~CXFA_TextLayout();
|
| + int32_t GetText(CFX_WideString& wsText);
|
| + FX_FLOAT GetLayoutHeight();
|
| + FX_FLOAT StartLayout(FX_FLOAT fWidth = -1);
|
| + FX_BOOL DoLayout(int32_t iBlockIndex,
|
| + FX_FLOAT& fCalcHeight,
|
| + FX_FLOAT fContentAreaHeight = -1,
|
| + FX_FLOAT fTextHeight = -1);
|
| +
|
| + FX_BOOL CalcSize(const CFX_SizeF& minSize,
|
| + const CFX_SizeF& maxSize,
|
| + CFX_SizeF& defaultSize);
|
| + FX_BOOL Layout(const CFX_SizeF& size, FX_FLOAT* fHeight = NULL);
|
| + void ItemBlocks(const CFX_RectF& rtText, int32_t iBlockIndex);
|
| + FX_BOOL DrawString(CFX_RenderDevice* pFxDevice,
|
| + const CFX_Matrix& tmDoc2Device,
|
| + const CFX_RectF& rtClip,
|
| + int32_t iBlock = 0);
|
| + FX_BOOL IsLoaded() const { return m_pieceLines.GetSize() > 0; }
|
| + void Unload();
|
| + const CXFA_PieceLineArray* GetPieceLines();
|
| +
|
| + FX_BOOL m_bHasBlock;
|
| + CFX_Int32Array m_Blocks;
|
| +
|
| + private:
|
| + void GetTextDataNode();
|
| + IFDE_XMLNode* GetXMLContainerNode();
|
| + IFX_RTFBreak* CreateBreak(FX_BOOL bDefault);
|
| + void InitBreak(FX_FLOAT fLineWidth);
|
| + void InitBreak(IFDE_CSSComputedStyle* pStyle,
|
| + FDE_CSSDISPLAY eDisplay,
|
| + FX_FLOAT fLineWidth,
|
| + IFDE_XMLNode* pXMLNode,
|
| + IFDE_CSSComputedStyle* pParentStyle = NULL);
|
| + FX_BOOL Loader(const CFX_SizeF& szText,
|
| + FX_FLOAT& fLinePos,
|
| + FX_BOOL bSavePieces = TRUE);
|
| + void LoadText(CXFA_Node* pNode,
|
| + const CFX_SizeF& szText,
|
| + FX_FLOAT& fLinePos,
|
| + FX_BOOL bSavePieces);
|
| + FX_BOOL LoadRichText(IFDE_XMLNode* pXMLNode,
|
| + const CFX_SizeF& szText,
|
| + FX_FLOAT& fLinePos,
|
| + IFDE_CSSComputedStyle* pParentStyle,
|
| + FX_BOOL bSavePieces,
|
| + CXFA_LinkUserData* pLinkData = NULL,
|
| + FX_BOOL bEndBreak = TRUE,
|
| + FX_BOOL bIsOl = FALSE,
|
| + int32_t iLiCount = 0);
|
| + FX_BOOL AppendChar(const CFX_WideString& wsText,
|
| + FX_FLOAT& fLinePos,
|
| + FX_FLOAT fSpaceAbove,
|
| + FX_BOOL bSavePieces);
|
| + void AppendTextLine(FX_DWORD dwStatus,
|
| + FX_FLOAT& fLinePos,
|
| + FX_BOOL bSavePieces,
|
| + FX_BOOL bEndBreak = FALSE);
|
| + void EndBreak(FX_DWORD dwStatus, FX_FLOAT& fLinePos, FX_BOOL bDefault);
|
| + FX_BOOL IsEnd(FX_BOOL bSavePieces);
|
| + void ProcessText(CFX_WideString& wsText);
|
| + void UpdateAlign(FX_FLOAT fHeight, FX_FLOAT fBottom);
|
| + void RenderString(IFDE_RenderDevice* pDevice,
|
| + IFDE_SolidBrush* pBrush,
|
| + CXFA_PieceLine* pPieceLine,
|
| + int32_t iPiece,
|
| + FXTEXT_CHARPOS* pCharPos,
|
| + const CFX_Matrix& tmDoc2Device);
|
| + void RenderPath(IFDE_RenderDevice* pDevice,
|
| + IFDE_Pen* pPen,
|
| + CXFA_PieceLine* pPieceLine,
|
| + int32_t iPiece,
|
| + FXTEXT_CHARPOS* pCharPos,
|
| + const CFX_Matrix& tmDoc2Device);
|
| + int32_t GetDisplayPos(XFA_LPCTEXTPIECE pPiece,
|
| + FXTEXT_CHARPOS* pCharPos,
|
| + FX_BOOL bCharCode = FALSE);
|
| + FX_BOOL ToRun(XFA_LPCTEXTPIECE pPiece, FX_RTFTEXTOBJ& tr);
|
| + void DoTabstops(IFDE_CSSComputedStyle* pStyle, CXFA_PieceLine* pPieceLine);
|
| + FX_BOOL Layout(int32_t iBlock);
|
| + int32_t CountBlocks() const;
|
| +
|
| + IXFA_TextProvider* m_pTextProvider;
|
| + CXFA_Node* m_pTextDataNode;
|
| + FX_BOOL m_bRichText;
|
| + IFX_MEMAllocator* m_pAllocator;
|
| + IFX_RTFBreak* m_pBreak;
|
| + CXFA_LoaderContext* m_pLoader;
|
| + int32_t m_iLines;
|
| + FX_FLOAT m_fMaxWidth;
|
| + CXFA_TextParser m_textParser;
|
| + CXFA_PieceLineArray m_pieceLines;
|
| + CXFA_TextTabstopsContext* m_pTabstopContext;
|
| + FX_BOOL m_bBlockContinue;
|
| +};
|
| +#endif
|
|
|