summaryrefslogtreecommitdiff
path: root/xfa/src/fdp/src/tto/fde_textout.h
blob: 38bc8ebcec736eacef330c47071b72cd57dc7afa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// 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 _FDE_TEXTOUT_IMP
#define _FDE_TEXTOUT_IMP
struct FDE_TTOPIECE {
public:
    int32_t	iStartChar;
    int32_t	iChars;
    FX_DWORD	dwCharStyles;
    CFX_RectF	rtPiece;
};
typedef FDE_TTOPIECE * FDE_LPTTOPIECE;
typedef CFX_MassArrayTemplate<FDE_TTOPIECE> CFDE_TTOPieceArray;
class CFDE_TTOLine : public CFX_Target
{
public:
    CFDE_TTOLine();
    CFDE_TTOLine(const CFDE_TTOLine &ttoLine);
    ~CFDE_TTOLine();
    int32_t		AddPiece(int32_t index, const FDE_TTOPIECE &ttoPiece);
    int32_t		GetSize() const;
    FDE_LPTTOPIECE	GetPtrAt(int32_t index);
    void			RemoveLast(int32_t iCount);
    void			RemoveAll(FX_BOOL bLeaveMemory);
    FX_BOOL			m_bNewReload;
    CFDE_TTOPieceArray m_pieces;
protected:
    int32_t		m_iPieceCount;
};
typedef CFX_ObjectMassArrayTemplate<CFDE_TTOLine> CFDE_TTOLineArray;
class CFDE_TextOut : public IFDE_TextOut, public CFX_Target
{
public:
    CFDE_TextOut();
    ~CFDE_TextOut();
    virtual	void		Release()
    {
        FDE_Delete this;
    }
    virtual void		SetFont(IFX_Font *pFont);
    virtual void		SetFontSize(FX_FLOAT fFontSize);
    virtual void		SetTextColor(FX_ARGB color);
    virtual void		SetStyles(FX_DWORD dwStyles);
    virtual void		SetTabWidth(FX_FLOAT fTabWidth);
    virtual void		SetEllipsisString(const CFX_WideString &wsEllipsis);
    virtual void		SetParagraphBreakChar(FX_WCHAR wch);
    virtual void		SetAlignment(int32_t iAlignment);
    virtual void		SetLineSpace(FX_FLOAT fLineSpace);
    virtual void		SetDIBitmap(CFX_DIBitmap *pDIB);
    virtual void		SetRenderDevice(CFX_RenderDevice *pDevice);
    virtual void		SetClipRect(const CFX_Rect &rtClip);
    virtual void		SetClipRect(const CFX_RectF &rtClip);
    virtual void		SetMatrix(const CFX_Matrix &matrix);
    virtual void		SetLineBreakTolerance(FX_FLOAT fTolerance);
    virtual void		CalcSize(FX_LPCWSTR pwsStr, int32_t iLength, CFX_Size &size);
    virtual void		CalcSize(FX_LPCWSTR pwsStr, int32_t iLength, CFX_SizeF &size);
    virtual void		CalcSize(FX_LPCWSTR pwsStr, int32_t iLength, CFX_Rect &rect);
    virtual void		CalcSize(FX_LPCWSTR pwsStr, int32_t iLength, CFX_RectF &rect);

    virtual void		DrawText(FX_LPCWSTR pwsStr, int32_t iLength, int32_t x, int32_t y);
    virtual void		DrawText(FX_LPCWSTR pwsStr, int32_t iLength, FX_FLOAT x, FX_FLOAT y);
    virtual void		DrawText(FX_LPCWSTR pwsStr, int32_t iLength, const CFX_Rect &rect);
    virtual void		DrawText(FX_LPCWSTR pwsStr, int32_t iLength, const CFX_RectF &rect);

    virtual void		SetLogicClipRect(const CFX_RectF &rtClip);
    virtual void		CalcLogicSize(FX_LPCWSTR pwsStr, int32_t iLength, CFX_SizeF &size);
    virtual void		CalcLogicSize(FX_LPCWSTR pwsStr, int32_t iLength, CFX_RectF &rect);
    virtual void		DrawLogicText(FX_LPCWSTR pwsStr, int32_t iLength, FX_FLOAT x, FX_FLOAT y);
    virtual void		DrawLogicText(FX_LPCWSTR pwsStr, int32_t iLength, const CFX_RectF &rect);
    virtual int32_t	GetTotalLines();
protected:
    void				CalcTextSize(FX_LPCWSTR pwsStr, int32_t iLength, CFX_RectF &rect);
    FX_BOOL				RetrieveLineWidth(FX_DWORD dwBreakStatus, FX_FLOAT &fStartPos, FX_FLOAT &fWidth, FX_FLOAT &fHeight);
    void				SetLineWidth(CFX_RectF &rect);
    void				DrawText(FX_LPCWSTR pwsStr, int32_t iLength, const CFX_RectF &rect, const CFX_RectF &rtClip);
    void				LoadText(FX_LPCWSTR pwsStr, int32_t iLength, const CFX_RectF &rect);
    void				LoadEllipsis();
    void				ExpandBuffer(int32_t iSize, int32_t iType);
    void				RetrieveEllPieces(int32_t *&pCharWidths);

    void				Reload(const CFX_RectF &rect);
    void				ReloadLinePiece(CFDE_TTOLine *pLine, const CFX_RectF &rect);
    FX_BOOL				RetriecePieces(FX_DWORD dwBreakStatus, int32_t &iStartChar, int32_t &iPieceWidths, FX_BOOL bReload, const CFX_RectF &rect);
    void				AppendPiece(const FDE_TTOPIECE &ttoPiece, FX_BOOL bNeedReload, FX_BOOL bEnd);
    void				ReplaceWidthEllipsis();
    void				DoAlignment(const CFX_RectF &rect);
    void				OnDraw(const CFX_RectF &rtClip);
    int32_t			GetDisplayPos(FDE_LPTTOPIECE pPiece);
    int32_t			GetCharRects(FDE_LPTTOPIECE pPiece);

    void				ToTextRun(const FDE_LPTTOPIECE pPiece, FX_TXTRUN &tr);
    void				DrawLine(const FDE_LPTTOPIECE pPiece, IFDE_Pen *&pPen);

    IFX_TxtBreak		*m_pTxtBreak;
    IFX_Font			*m_pFont;
    FX_FLOAT			m_fFontSize;
    FX_FLOAT			m_fLineSpace;
    FX_FLOAT			m_fLinePos;
    FX_FLOAT			m_fTolerance;

    int32_t			m_iAlignment;
    int32_t			m_iTxtBkAlignment;
    int32_t			*m_pCharWidths;
    int32_t			m_iChars;
    int32_t			*m_pEllCharWidths;
    int32_t			m_iEllChars;
    FX_WCHAR			m_wParagraphBkChar;
    FX_ARGB				m_TxtColor;
    FX_DWORD			m_dwStyles;
    FX_DWORD			m_dwTxtBkStyles;
    CFX_WideString		m_wsEllipsis;
    FX_BOOL				m_bElliChanged;
    int32_t			m_iEllipsisWidth;
    CFX_WideString		m_wsText;
    CFX_RectF			m_rtClip;
    CFX_RectF			m_rtLogicClip;
    CFX_Matrix			m_Matrix;
    CFDE_TTOLineArray	m_ttoLines;
    int32_t			m_iCurLine;
    int32_t			m_iCurPiece;
    int32_t			m_iTotalLines;
    FXTEXT_CHARPOS		*m_pCharPos;
    int32_t			m_iCharPosSize;
    IFDE_RenderDevice	*m_pRenderDevice;
    CFX_Int32Array		m_hotKeys;
    CFX_RectFArray		m_rectArray;
};
#endif