blob: 360c3051e996bc1e3b35e04e741b406e71eaaad8 [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
Dan Sinclairbccf5732017-03-30 14:10:32 -04007#ifndef XFA_FDE_CFDE_TEXTOUT_H_
8#define XFA_FDE_CFDE_TEXTOUT_H_
Dan Sinclair1770c022016-03-14 14:14:16 -04009
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
Dan Sinclair893822a2017-03-13 15:32:07 -040014#include "core/fxcrt/cfx_char.h"
Dan Sinclaira5085d42017-05-11 16:26:50 -040015#include "core/fxge/cfx_defaultrenderdevice.h"
dsinclair74a34fc2016-09-29 16:41:42 -070016#include "core/fxge/cfx_renderdevice.h"
17#include "core/fxge/fx_dib.h"
npm8f3eb602016-11-11 17:16:23 -080018#include "xfa/fgas/font/cfgas_fontmgr.h"
Dan Sinclair1770c022016-03-14 14:14:16 -040019
20#define FDE_TTOSTYLE_Underline 0x0001
21#define FDE_TTOSTYLE_Strikeout 0x0002
Dan Sinclair1770c022016-03-14 14:14:16 -040022#define FDE_TTOSTYLE_SingleLine 0x0010
Dan Sinclair1770c022016-03-14 14:14:16 -040023#define FDE_TTOSTYLE_HotKey 0x0040
24#define FDE_TTOSTYLE_Ellipsis 0x0080
25#define FDE_TTOSTYLE_LineWrap 0x0100
Dan Sinclair1770c022016-03-14 14:14:16 -040026#define FDE_TTOSTYLE_LastLineHeight 0x1000
27#define FDE_TTOALIGNMENT_TopLeft 0
28#define FDE_TTOALIGNMENT_TopCenter 1
29#define FDE_TTOALIGNMENT_TopRight 2
30#define FDE_TTOALIGNMENT_TopAuto 3
31#define FDE_TTOALIGNMENT_CenterLeft 4
32#define FDE_TTOALIGNMENT_Center 5
33#define FDE_TTOALIGNMENT_CenterRight 6
34#define FDE_TTOALIGNMENT_CenterAuto 7
35#define FDE_TTOALIGNMENT_BottomLeft 8
36#define FDE_TTOALIGNMENT_BottomCenter 9
37#define FDE_TTOALIGNMENT_BottomRight 10
38#define FDE_TTOALIGNMENT_BottomAuto 11
39
Dan Sinclaird9828fd2017-03-30 10:58:49 -040040class CFDE_Pen;
dsinclairacd0d592016-04-21 11:06:27 -070041class CFDE_RenderDevice;
npm9ada2d82016-08-10 07:51:38 -070042class CFX_RenderDevice;
dsinclairacd0d592016-04-21 11:06:27 -070043class CFX_TxtBreak;
weilieec3a362016-06-18 06:25:37 -070044struct FX_TXTRUN;
dsinclairacd0d592016-04-21 11:06:27 -070045
46struct FDE_TTOPIECE {
Tom Sepez76da8842017-02-06 15:10:48 -080047 FDE_TTOPIECE();
Tom Sepezc3f74e92017-03-02 11:32:19 -080048 FDE_TTOPIECE(const FDE_TTOPIECE& that);
Tom Sepez76da8842017-02-06 15:10:48 -080049 ~FDE_TTOPIECE();
50
dsinclairacd0d592016-04-21 11:06:27 -070051 int32_t iStartChar;
52 int32_t iChars;
53 uint32_t dwCharStyles;
54 CFX_RectF rtPiece;
55};
dsinclairacd0d592016-04-21 11:06:27 -070056
Dan Sinclair0cb9b8c2017-01-10 16:38:10 -050057class CFDE_TTOLine {
Dan Sinclair1770c022016-03-14 14:14:16 -040058 public:
dsinclairacd0d592016-04-21 11:06:27 -070059 CFDE_TTOLine();
60 CFDE_TTOLine(const CFDE_TTOLine& ttoLine);
Dan Sinclair0cb9b8c2017-01-10 16:38:10 -050061 ~CFDE_TTOLine();
weilieec3a362016-06-18 06:25:37 -070062
Tom Sepezc3f74e92017-03-02 11:32:19 -080063 bool GetNewReload() const { return m_bNewReload; }
64 void SetNewReload(bool reload) { m_bNewReload = reload; }
dsinclairacd0d592016-04-21 11:06:27 -070065 int32_t AddPiece(int32_t index, const FDE_TTOPIECE& ttoPiece);
66 int32_t GetSize() const;
67 FDE_TTOPIECE* GetPtrAt(int32_t index);
68 void RemoveLast(int32_t iCount);
Tom Sepezc3f74e92017-03-02 11:32:19 -080069 void RemoveAll();
dsinclairacd0d592016-04-21 11:06:27 -070070
Tom Sepezc3f74e92017-03-02 11:32:19 -080071 private:
tsepezd19e9122016-11-02 15:43:18 -070072 bool m_bNewReload;
Tom Sepezc3f74e92017-03-02 11:32:19 -080073 std::deque<FDE_TTOPIECE> m_pieces;
dsinclairacd0d592016-04-21 11:06:27 -070074};
dsinclairacd0d592016-04-21 11:06:27 -070075
Dan Sinclair0cb9b8c2017-01-10 16:38:10 -050076class CFDE_TextOut {
dsinclairacd0d592016-04-21 11:06:27 -070077 public:
78 CFDE_TextOut();
Dan Sinclair0cb9b8c2017-01-10 16:38:10 -050079 ~CFDE_TextOut();
dsinclairacd0d592016-04-21 11:06:27 -070080
tsepeze6477992017-01-05 12:57:00 -080081 void SetFont(const CFX_RetainPtr<CFGAS_GEFont>& pFont);
Dan Sinclair05df0752017-03-14 14:43:42 -040082 void SetFontSize(float fFontSize);
dsinclairacd0d592016-04-21 11:06:27 -070083 void SetTextColor(FX_ARGB color);
84 void SetStyles(uint32_t dwStyles);
Dan Sinclair05df0752017-03-14 14:43:42 -040085 void SetTabWidth(float fTabWidth);
dsinclairacd0d592016-04-21 11:06:27 -070086 void SetEllipsisString(const CFX_WideString& wsEllipsis);
Dan Sinclair812e96c2017-03-13 16:43:37 -040087 void SetParagraphBreakChar(wchar_t wch);
dsinclairacd0d592016-04-21 11:06:27 -070088 void SetAlignment(int32_t iAlignment);
Dan Sinclair05df0752017-03-14 14:43:42 -040089 void SetLineSpace(float fLineSpace);
Tom Sepezf0799fe2017-03-28 09:31:32 -070090 void SetDIBitmap(const CFX_RetainPtr<CFX_DIBitmap>& pDIB);
dsinclairacd0d592016-04-21 11:06:27 -070091 void SetRenderDevice(CFX_RenderDevice* pDevice);
92 void SetClipRect(const CFX_Rect& rtClip);
93 void SetClipRect(const CFX_RectF& rtClip);
94 void SetMatrix(const CFX_Matrix& matrix);
Dan Sinclair05df0752017-03-14 14:43:42 -040095 void SetLineBreakTolerance(float fTolerance);
dsinclairacd0d592016-04-21 11:06:27 -070096
Dan Sinclair812e96c2017-03-13 16:43:37 -040097 void DrawText(const wchar_t* pwsStr, int32_t iLength, int32_t x, int32_t y);
Dan Sinclair05df0752017-03-14 14:43:42 -040098 void DrawText(const wchar_t* pwsStr, int32_t iLength, float x, float y);
Dan Sinclair812e96c2017-03-13 16:43:37 -040099 void DrawText(const wchar_t* pwsStr, int32_t iLength, const CFX_Rect& rect);
100 void DrawText(const wchar_t* pwsStr, int32_t iLength, const CFX_RectF& rect);
dsinclairacd0d592016-04-21 11:06:27 -0700101
102 void SetLogicClipRect(const CFX_RectF& rtClip);
Dan Sinclair812e96c2017-03-13 16:43:37 -0400103 void CalcLogicSize(const wchar_t* pwsStr, int32_t iLength, CFX_SizeF& size);
104 void CalcLogicSize(const wchar_t* pwsStr, int32_t iLength, CFX_RectF& rect);
Dan Sinclair05df0752017-03-14 14:43:42 -0400105 void DrawLogicText(const wchar_t* pwsStr, int32_t iLength, float x, float y);
Dan Sinclair812e96c2017-03-13 16:43:37 -0400106 void DrawLogicText(const wchar_t* pwsStr,
dsinclairacd0d592016-04-21 11:06:27 -0700107 int32_t iLength,
108 const CFX_RectF& rect);
109 int32_t GetTotalLines();
110
Dan Sinclairbccf5732017-03-30 14:10:32 -0400111 private:
Dan Sinclair812e96c2017-03-13 16:43:37 -0400112 void CalcTextSize(const wchar_t* pwsStr, int32_t iLength, CFX_RectF& rect);
Dan Sinclairc36fe072017-03-09 16:58:12 -0500113 bool RetrieveLineWidth(CFX_BreakType dwBreakStatus,
Dan Sinclair05df0752017-03-14 14:43:42 -0400114 float& fStartPos,
115 float& fWidth,
116 float& fHeight);
dsinclairacd0d592016-04-21 11:06:27 -0700117 void SetLineWidth(CFX_RectF& rect);
Dan Sinclair812e96c2017-03-13 16:43:37 -0400118 void DrawText(const wchar_t* pwsStr,
dsinclairacd0d592016-04-21 11:06:27 -0700119 int32_t iLength,
120 const CFX_RectF& rect,
121 const CFX_RectF& rtClip);
Dan Sinclair812e96c2017-03-13 16:43:37 -0400122 void LoadText(const wchar_t* pwsStr, int32_t iLength, const CFX_RectF& rect);
dsinclairacd0d592016-04-21 11:06:27 -0700123 void LoadEllipsis();
124 void ExpandBuffer(int32_t iSize, int32_t iType);
weilicddf8252016-08-04 15:43:59 -0700125 void RetrieveEllPieces(std::vector<int32_t>* pCharWidths);
dsinclairacd0d592016-04-21 11:06:27 -0700126
127 void Reload(const CFX_RectF& rect);
128 void ReloadLinePiece(CFDE_TTOLine* pLine, const CFX_RectF& rect);
Dan Sinclairc36fe072017-03-09 16:58:12 -0500129 bool RetrievePieces(CFX_BreakType dwBreakStatus,
tsepezd19e9122016-11-02 15:43:18 -0700130 int32_t& iStartChar,
131 int32_t& iPieceWidths,
132 bool bReload,
133 const CFX_RectF& rect);
134 void AppendPiece(const FDE_TTOPIECE& ttoPiece, bool bNeedReload, bool bEnd);
dsinclairacd0d592016-04-21 11:06:27 -0700135 void ReplaceWidthEllipsis();
136 void DoAlignment(const CFX_RectF& rect);
137 void OnDraw(const CFX_RectF& rtClip);
138 int32_t GetDisplayPos(FDE_TTOPIECE* pPiece);
139 int32_t GetCharRects(const FDE_TTOPIECE* pPiece);
140
141 FX_TXTRUN ToTextRun(const FDE_TTOPIECE* pPiece);
Tom Sepezc3f74e92017-03-02 11:32:19 -0800142 void DrawLine(const FDE_TTOPIECE* pPiece, CFDE_Pen* pPen);
dsinclairacd0d592016-04-21 11:06:27 -0700143
weilicddf8252016-08-04 15:43:59 -0700144 std::unique_ptr<CFX_TxtBreak> m_pTxtBreak;
tsepeze6477992017-01-05 12:57:00 -0800145 CFX_RetainPtr<CFGAS_GEFont> m_pFont;
Dan Sinclair05df0752017-03-14 14:43:42 -0400146 float m_fFontSize;
147 float m_fLineSpace;
148 float m_fLinePos;
149 float m_fTolerance;
dsinclairacd0d592016-04-21 11:06:27 -0700150 int32_t m_iAlignment;
151 int32_t m_iTxtBkAlignment;
weilicddf8252016-08-04 15:43:59 -0700152 std::vector<int32_t> m_CharWidths;
153 std::vector<int32_t> m_EllCharWidths;
Dan Sinclair812e96c2017-03-13 16:43:37 -0400154 wchar_t m_wParagraphBkChar;
dsinclairacd0d592016-04-21 11:06:27 -0700155 FX_ARGB m_TxtColor;
156 uint32_t m_dwStyles;
157 uint32_t m_dwTxtBkStyles;
158 CFX_WideString m_wsEllipsis;
tsepezd19e9122016-11-02 15:43:18 -0700159 bool m_bElliChanged;
dsinclairacd0d592016-04-21 11:06:27 -0700160 int32_t m_iEllipsisWidth;
161 CFX_WideString m_wsText;
162 CFX_RectF m_rtClip;
163 CFX_RectF m_rtLogicClip;
164 CFX_Matrix m_Matrix;
Tom Sepezc3f74e92017-03-02 11:32:19 -0800165 std::deque<CFDE_TTOLine> m_ttoLines;
dsinclairacd0d592016-04-21 11:06:27 -0700166 int32_t m_iCurLine;
167 int32_t m_iCurPiece;
168 int32_t m_iTotalLines;
weilicddf8252016-08-04 15:43:59 -0700169 std::vector<FXTEXT_CHARPOS> m_CharPos;
tsepezf74ad992016-05-11 10:26:05 -0700170 std::unique_ptr<CFDE_RenderDevice> m_pRenderDevice;
Tom Sepez9c045de2017-03-20 16:50:26 -0700171 std::vector<int32_t> m_HotKeys;
tsepez3d328762017-01-24 06:12:34 -0800172 std::vector<CFX_RectF> m_rectArray;
Dan Sinclair1770c022016-03-14 14:14:16 -0400173};
174
Dan Sinclairbccf5732017-03-30 14:10:32 -0400175#endif // XFA_FDE_CFDE_TEXTOUT_H_