blob: 04d656776e631c864f16296f583d429b8c9e6508 [file] [log] [blame]
Dan Sinclair1770c022016-03-14 14:14:16 -04001// Copyright 2014 PDFium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7#ifndef XFA_FDE_TTO_FDE_TEXTOUT_H_
8#define XFA_FDE_TTO_FDE_TEXTOUT_H_
9
Tom Sepezc3f74e92017-03-02 11:32:19 -080010#include <deque>
tsepezf74ad992016-05-11 10:26:05 -070011#include <memory>
weilicddf8252016-08-04 15:43:59 -070012#include <vector>
tsepezf74ad992016-05-11 10:26:05 -070013
dsinclair74a34fc2016-09-29 16:41:42 -070014#include "core/fxge/cfx_fxgedevice.h"
15#include "core/fxge/cfx_renderdevice.h"
16#include "core/fxge/fx_dib.h"
dsinclairacd0d592016-04-21 11:06:27 -070017#include "xfa/fde/fde_object.h"
18#include "xfa/fgas/crt/fgas_utils.h"
npm8f3eb602016-11-11 17:16:23 -080019#include "xfa/fgas/font/cfgas_fontmgr.h"
Dan Sinclair1770c022016-03-14 14:14:16 -040020
21#define FDE_TTOSTYLE_Underline 0x0001
22#define FDE_TTOSTYLE_Strikeout 0x0002
23#define FDE_TTOSTYLE_VerticalLayout 0x0004
24#define FDE_TTOSTYLE_SingleLine 0x0010
25#define FDE_TTOSTYLE_ExpandTab 0x0020
26#define FDE_TTOSTYLE_HotKey 0x0040
27#define FDE_TTOSTYLE_Ellipsis 0x0080
28#define FDE_TTOSTYLE_LineWrap 0x0100
29#define FDE_TTOSTYLE_ArabicShapes 0x0200
Dan Sinclair1770c022016-03-14 14:14:16 -040030#define FDE_TTOSTYLE_ArabicContext 0x0800
31#define FDE_TTOSTYLE_LastLineHeight 0x1000
32#define FDE_TTOALIGNMENT_TopLeft 0
33#define FDE_TTOALIGNMENT_TopCenter 1
34#define FDE_TTOALIGNMENT_TopRight 2
35#define FDE_TTOALIGNMENT_TopAuto 3
36#define FDE_TTOALIGNMENT_CenterLeft 4
37#define FDE_TTOALIGNMENT_Center 5
38#define FDE_TTOALIGNMENT_CenterRight 6
39#define FDE_TTOALIGNMENT_CenterAuto 7
40#define FDE_TTOALIGNMENT_BottomLeft 8
41#define FDE_TTOALIGNMENT_BottomCenter 9
42#define FDE_TTOALIGNMENT_BottomRight 10
43#define FDE_TTOALIGNMENT_BottomAuto 11
44
dsinclairacd0d592016-04-21 11:06:27 -070045class CFDE_RenderDevice;
npm9ada2d82016-08-10 07:51:38 -070046class CFX_RenderDevice;
dsinclairacd0d592016-04-21 11:06:27 -070047class CFX_TxtBreak;
weilieec3a362016-06-18 06:25:37 -070048struct FX_TXTRUN;
dsinclairacd0d592016-04-21 11:06:27 -070049
50struct FDE_TTOPIECE {
Tom Sepez76da8842017-02-06 15:10:48 -080051 FDE_TTOPIECE();
Tom Sepezc3f74e92017-03-02 11:32:19 -080052 FDE_TTOPIECE(const FDE_TTOPIECE& that);
Tom Sepez76da8842017-02-06 15:10:48 -080053 ~FDE_TTOPIECE();
54
dsinclairacd0d592016-04-21 11:06:27 -070055 int32_t iStartChar;
56 int32_t iChars;
57 uint32_t dwCharStyles;
58 CFX_RectF rtPiece;
59};
dsinclairacd0d592016-04-21 11:06:27 -070060
Dan Sinclair0cb9b8c2017-01-10 16:38:10 -050061class CFDE_TTOLine {
Dan Sinclair1770c022016-03-14 14:14:16 -040062 public:
dsinclairacd0d592016-04-21 11:06:27 -070063 CFDE_TTOLine();
64 CFDE_TTOLine(const CFDE_TTOLine& ttoLine);
Dan Sinclair0cb9b8c2017-01-10 16:38:10 -050065 ~CFDE_TTOLine();
weilieec3a362016-06-18 06:25:37 -070066
Tom Sepezc3f74e92017-03-02 11:32:19 -080067 bool GetNewReload() const { return m_bNewReload; }
68 void SetNewReload(bool reload) { m_bNewReload = reload; }
dsinclairacd0d592016-04-21 11:06:27 -070069 int32_t AddPiece(int32_t index, const FDE_TTOPIECE& ttoPiece);
70 int32_t GetSize() const;
71 FDE_TTOPIECE* GetPtrAt(int32_t index);
72 void RemoveLast(int32_t iCount);
Tom Sepezc3f74e92017-03-02 11:32:19 -080073 void RemoveAll();
dsinclairacd0d592016-04-21 11:06:27 -070074
Tom Sepezc3f74e92017-03-02 11:32:19 -080075 private:
tsepezd19e9122016-11-02 15:43:18 -070076 bool m_bNewReload;
Tom Sepezc3f74e92017-03-02 11:32:19 -080077 std::deque<FDE_TTOPIECE> m_pieces;
dsinclairacd0d592016-04-21 11:06:27 -070078};
dsinclairacd0d592016-04-21 11:06:27 -070079
Dan Sinclair0cb9b8c2017-01-10 16:38:10 -050080class CFDE_TextOut {
dsinclairacd0d592016-04-21 11:06:27 -070081 public:
82 CFDE_TextOut();
Dan Sinclair0cb9b8c2017-01-10 16:38:10 -050083 ~CFDE_TextOut();
dsinclairacd0d592016-04-21 11:06:27 -070084
tsepeze6477992017-01-05 12:57:00 -080085 void SetFont(const CFX_RetainPtr<CFGAS_GEFont>& pFont);
dsinclairacd0d592016-04-21 11:06:27 -070086 void SetFontSize(FX_FLOAT fFontSize);
87 void SetTextColor(FX_ARGB color);
88 void SetStyles(uint32_t dwStyles);
89 void SetTabWidth(FX_FLOAT fTabWidth);
90 void SetEllipsisString(const CFX_WideString& wsEllipsis);
91 void SetParagraphBreakChar(FX_WCHAR wch);
92 void SetAlignment(int32_t iAlignment);
93 void SetLineSpace(FX_FLOAT fLineSpace);
94 void SetDIBitmap(CFX_DIBitmap* pDIB);
95 void SetRenderDevice(CFX_RenderDevice* pDevice);
96 void SetClipRect(const CFX_Rect& rtClip);
97 void SetClipRect(const CFX_RectF& rtClip);
98 void SetMatrix(const CFX_Matrix& matrix);
99 void SetLineBreakTolerance(FX_FLOAT fTolerance);
dsinclairacd0d592016-04-21 11:06:27 -0700100
101 void DrawText(const FX_WCHAR* pwsStr, int32_t iLength, int32_t x, int32_t y);
102 void DrawText(const FX_WCHAR* pwsStr,
103 int32_t iLength,
104 FX_FLOAT x,
105 FX_FLOAT y);
106 void DrawText(const FX_WCHAR* pwsStr, int32_t iLength, const CFX_Rect& rect);
107 void DrawText(const FX_WCHAR* pwsStr, int32_t iLength, const CFX_RectF& rect);
108
109 void SetLogicClipRect(const CFX_RectF& rtClip);
110 void CalcLogicSize(const FX_WCHAR* pwsStr, int32_t iLength, CFX_SizeF& size);
111 void CalcLogicSize(const FX_WCHAR* pwsStr, int32_t iLength, CFX_RectF& rect);
112 void DrawLogicText(const FX_WCHAR* pwsStr,
113 int32_t iLength,
114 FX_FLOAT x,
115 FX_FLOAT y);
116 void DrawLogicText(const FX_WCHAR* pwsStr,
117 int32_t iLength,
118 const CFX_RectF& rect);
119 int32_t GetTotalLines();
120
121 protected:
122 void CalcTextSize(const FX_WCHAR* pwsStr, int32_t iLength, CFX_RectF& rect);
tsepezd19e9122016-11-02 15:43:18 -0700123 bool RetrieveLineWidth(uint32_t dwBreakStatus,
124 FX_FLOAT& fStartPos,
125 FX_FLOAT& fWidth,
126 FX_FLOAT& fHeight);
dsinclairacd0d592016-04-21 11:06:27 -0700127 void SetLineWidth(CFX_RectF& rect);
128 void DrawText(const FX_WCHAR* pwsStr,
129 int32_t iLength,
130 const CFX_RectF& rect,
131 const CFX_RectF& rtClip);
132 void LoadText(const FX_WCHAR* pwsStr, int32_t iLength, const CFX_RectF& rect);
133 void LoadEllipsis();
134 void ExpandBuffer(int32_t iSize, int32_t iType);
weilicddf8252016-08-04 15:43:59 -0700135 void RetrieveEllPieces(std::vector<int32_t>* pCharWidths);
dsinclairacd0d592016-04-21 11:06:27 -0700136
137 void Reload(const CFX_RectF& rect);
138 void ReloadLinePiece(CFDE_TTOLine* pLine, const CFX_RectF& rect);
tsepezd19e9122016-11-02 15:43:18 -0700139 bool RetriecePieces(uint32_t dwBreakStatus,
140 int32_t& iStartChar,
141 int32_t& iPieceWidths,
142 bool bReload,
143 const CFX_RectF& rect);
144 void AppendPiece(const FDE_TTOPIECE& ttoPiece, bool bNeedReload, bool bEnd);
dsinclairacd0d592016-04-21 11:06:27 -0700145 void ReplaceWidthEllipsis();
146 void DoAlignment(const CFX_RectF& rect);
147 void OnDraw(const CFX_RectF& rtClip);
148 int32_t GetDisplayPos(FDE_TTOPIECE* pPiece);
149 int32_t GetCharRects(const FDE_TTOPIECE* pPiece);
150
151 FX_TXTRUN ToTextRun(const FDE_TTOPIECE* pPiece);
Tom Sepezc3f74e92017-03-02 11:32:19 -0800152 void DrawLine(const FDE_TTOPIECE* pPiece, CFDE_Pen* pPen);
dsinclairacd0d592016-04-21 11:06:27 -0700153
weilicddf8252016-08-04 15:43:59 -0700154 std::unique_ptr<CFX_TxtBreak> m_pTxtBreak;
tsepeze6477992017-01-05 12:57:00 -0800155 CFX_RetainPtr<CFGAS_GEFont> m_pFont;
dsinclairacd0d592016-04-21 11:06:27 -0700156 FX_FLOAT m_fFontSize;
157 FX_FLOAT m_fLineSpace;
158 FX_FLOAT m_fLinePos;
159 FX_FLOAT m_fTolerance;
160 int32_t m_iAlignment;
161 int32_t m_iTxtBkAlignment;
weilicddf8252016-08-04 15:43:59 -0700162 std::vector<int32_t> m_CharWidths;
163 std::vector<int32_t> m_EllCharWidths;
dsinclairacd0d592016-04-21 11:06:27 -0700164 FX_WCHAR m_wParagraphBkChar;
165 FX_ARGB m_TxtColor;
166 uint32_t m_dwStyles;
167 uint32_t m_dwTxtBkStyles;
168 CFX_WideString m_wsEllipsis;
tsepezd19e9122016-11-02 15:43:18 -0700169 bool m_bElliChanged;
dsinclairacd0d592016-04-21 11:06:27 -0700170 int32_t m_iEllipsisWidth;
171 CFX_WideString m_wsText;
172 CFX_RectF m_rtClip;
173 CFX_RectF m_rtLogicClip;
174 CFX_Matrix m_Matrix;
Tom Sepezc3f74e92017-03-02 11:32:19 -0800175 std::deque<CFDE_TTOLine> m_ttoLines;
dsinclairacd0d592016-04-21 11:06:27 -0700176 int32_t m_iCurLine;
177 int32_t m_iCurPiece;
178 int32_t m_iTotalLines;
weilicddf8252016-08-04 15:43:59 -0700179 std::vector<FXTEXT_CHARPOS> m_CharPos;
tsepezf74ad992016-05-11 10:26:05 -0700180 std::unique_ptr<CFDE_RenderDevice> m_pRenderDevice;
tsepez82aa3962017-01-20 12:59:50 -0800181 CFX_ArrayTemplate<int32_t> m_hotKeys;
tsepez3d328762017-01-24 06:12:34 -0800182 std::vector<CFX_RectF> m_rectArray;
Dan Sinclair1770c022016-03-14 14:14:16 -0400183};
184
185#endif // XFA_FDE_TTO_FDE_TEXTOUT_H_