blob: 8d999005664306e04ab85a0a835ea353f2c1dfe5 [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
dsinclairacd0d592016-04-21 11:06:27 -070020class CFDE_RenderDevice;
npm9ada2d82016-08-10 07:51:38 -070021class CFX_RenderDevice;
dsinclairacd0d592016-04-21 11:06:27 -070022class CFX_TxtBreak;
weilieec3a362016-06-18 06:25:37 -070023struct FX_TXTRUN;
dsinclairacd0d592016-04-21 11:06:27 -070024
Dan Sinclairdff02ce2017-08-14 10:26:59 -040025enum class FDE_TextAlignment : uint8_t {
26 kTopLeft = 0,
27 kCenterLeft,
28 kCenter,
29 kCenterRight
30};
31
32struct FDE_TextStyle {
33 FDE_TextStyle()
34 : single_line_(false), line_wrap_(false), last_line_height_(false) {}
35 ~FDE_TextStyle() {}
36
37 void Reset() {
38 single_line_ = false;
39 line_wrap_ = false;
40 last_line_height_ = false;
41 }
42
43 bool single_line_;
44 bool line_wrap_;
45 bool last_line_height_;
46};
47
dsinclairacd0d592016-04-21 11:06:27 -070048struct FDE_TTOPIECE {
Tom Sepez76da8842017-02-06 15:10:48 -080049 FDE_TTOPIECE();
Tom Sepezc3f74e92017-03-02 11:32:19 -080050 FDE_TTOPIECE(const FDE_TTOPIECE& that);
Tom Sepez76da8842017-02-06 15:10:48 -080051 ~FDE_TTOPIECE();
52
dsinclairacd0d592016-04-21 11:06:27 -070053 int32_t iStartChar;
54 int32_t iChars;
55 uint32_t dwCharStyles;
56 CFX_RectF rtPiece;
57};
dsinclairacd0d592016-04-21 11:06:27 -070058
Dan Sinclair0cb9b8c2017-01-10 16:38:10 -050059class CFDE_TTOLine {
Dan Sinclair1770c022016-03-14 14:14:16 -040060 public:
dsinclairacd0d592016-04-21 11:06:27 -070061 CFDE_TTOLine();
62 CFDE_TTOLine(const CFDE_TTOLine& ttoLine);
Dan Sinclair0cb9b8c2017-01-10 16:38:10 -050063 ~CFDE_TTOLine();
weilieec3a362016-06-18 06:25:37 -070064
Tom Sepezc3f74e92017-03-02 11:32:19 -080065 bool GetNewReload() const { return m_bNewReload; }
66 void SetNewReload(bool reload) { m_bNewReload = reload; }
dsinclairacd0d592016-04-21 11:06:27 -070067 int32_t AddPiece(int32_t index, const FDE_TTOPIECE& ttoPiece);
68 int32_t GetSize() const;
69 FDE_TTOPIECE* GetPtrAt(int32_t index);
70 void RemoveLast(int32_t iCount);
Tom Sepezc3f74e92017-03-02 11:32:19 -080071 void RemoveAll();
dsinclairacd0d592016-04-21 11:06:27 -070072
Tom Sepezc3f74e92017-03-02 11:32:19 -080073 private:
tsepezd19e9122016-11-02 15:43:18 -070074 bool m_bNewReload;
Tom Sepezc3f74e92017-03-02 11:32:19 -080075 std::deque<FDE_TTOPIECE> m_pieces;
dsinclairacd0d592016-04-21 11:06:27 -070076};
dsinclairacd0d592016-04-21 11:06:27 -070077
Dan Sinclair0cb9b8c2017-01-10 16:38:10 -050078class CFDE_TextOut {
dsinclairacd0d592016-04-21 11:06:27 -070079 public:
80 CFDE_TextOut();
Dan Sinclair0cb9b8c2017-01-10 16:38:10 -050081 ~CFDE_TextOut();
dsinclairacd0d592016-04-21 11:06:27 -070082
tsepeze6477992017-01-05 12:57:00 -080083 void SetFont(const CFX_RetainPtr<CFGAS_GEFont>& pFont);
Dan Sinclair05df0752017-03-14 14:43:42 -040084 void SetFontSize(float fFontSize);
dsinclairacd0d592016-04-21 11:06:27 -070085 void SetTextColor(FX_ARGB color);
Dan Sinclairdff02ce2017-08-14 10:26:59 -040086 void SetStyles(const FDE_TextStyle& dwStyles);
Dan Sinclair05df0752017-03-14 14:43:42 -040087 void SetTabWidth(float fTabWidth);
Dan Sinclair812e96c2017-03-13 16:43:37 -040088 void SetParagraphBreakChar(wchar_t wch);
Dan Sinclairdff02ce2017-08-14 10:26:59 -040089 void SetAlignment(FDE_TextAlignment iAlignment);
Dan Sinclair05df0752017-03-14 14:43:42 -040090 void SetLineSpace(float fLineSpace);
Tom Sepezf0799fe2017-03-28 09:31:32 -070091 void SetDIBitmap(const CFX_RetainPtr<CFX_DIBitmap>& pDIB);
dsinclairacd0d592016-04-21 11:06:27 -070092 void SetRenderDevice(CFX_RenderDevice* pDevice);
93 void SetClipRect(const CFX_Rect& rtClip);
94 void SetClipRect(const CFX_RectF& rtClip);
95 void SetMatrix(const CFX_Matrix& matrix);
Dan Sinclair05df0752017-03-14 14:43:42 -040096 void SetLineBreakTolerance(float fTolerance);
dsinclairacd0d592016-04-21 11:06:27 -070097
Dan Sinclair812e96c2017-03-13 16:43:37 -040098 void DrawText(const wchar_t* pwsStr, int32_t iLength, int32_t x, int32_t y);
Dan Sinclair05df0752017-03-14 14:43:42 -040099 void DrawText(const wchar_t* pwsStr, int32_t iLength, float x, float y);
Dan Sinclair812e96c2017-03-13 16:43:37 -0400100 void DrawText(const wchar_t* pwsStr, int32_t iLength, const CFX_Rect& rect);
101 void DrawText(const wchar_t* pwsStr, int32_t iLength, const CFX_RectF& rect);
dsinclairacd0d592016-04-21 11:06:27 -0700102
103 void SetLogicClipRect(const CFX_RectF& rtClip);
Dan Sinclair812e96c2017-03-13 16:43:37 -0400104 void CalcLogicSize(const wchar_t* pwsStr, int32_t iLength, CFX_SizeF& size);
105 void CalcLogicSize(const wchar_t* pwsStr, int32_t iLength, CFX_RectF& rect);
Dan Sinclair05df0752017-03-14 14:43:42 -0400106 void DrawLogicText(const wchar_t* pwsStr, int32_t iLength, float x, float y);
Dan Sinclair812e96c2017-03-13 16:43:37 -0400107 void DrawLogicText(const wchar_t* pwsStr,
dsinclairacd0d592016-04-21 11:06:27 -0700108 int32_t iLength,
109 const CFX_RectF& rect);
110 int32_t GetTotalLines();
111
Dan Sinclairbccf5732017-03-30 14:10:32 -0400112 private:
Dan Sinclair812e96c2017-03-13 16:43:37 -0400113 void CalcTextSize(const wchar_t* pwsStr, int32_t iLength, CFX_RectF& rect);
Dan Sinclairc36fe072017-03-09 16:58:12 -0500114 bool RetrieveLineWidth(CFX_BreakType dwBreakStatus,
Dan Sinclair05df0752017-03-14 14:43:42 -0400115 float& fStartPos,
116 float& fWidth,
117 float& fHeight);
dsinclairacd0d592016-04-21 11:06:27 -0700118 void SetLineWidth(CFX_RectF& rect);
Dan Sinclair812e96c2017-03-13 16:43:37 -0400119 void DrawText(const wchar_t* pwsStr,
dsinclairacd0d592016-04-21 11:06:27 -0700120 int32_t iLength,
121 const CFX_RectF& rect,
122 const CFX_RectF& rtClip);
Dan Sinclair812e96c2017-03-13 16:43:37 -0400123 void LoadText(const wchar_t* pwsStr, int32_t iLength, const CFX_RectF& rect);
dsinclairacd0d592016-04-21 11:06:27 -0700124
125 void Reload(const CFX_RectF& rect);
126 void ReloadLinePiece(CFDE_TTOLine* pLine, const CFX_RectF& rect);
Dan Sinclairc36fe072017-03-09 16:58:12 -0500127 bool RetrievePieces(CFX_BreakType dwBreakStatus,
tsepezd19e9122016-11-02 15:43:18 -0700128 int32_t& iStartChar,
129 int32_t& iPieceWidths,
130 bool bReload,
131 const CFX_RectF& rect);
132 void AppendPiece(const FDE_TTOPIECE& ttoPiece, bool bNeedReload, bool bEnd);
dsinclairacd0d592016-04-21 11:06:27 -0700133 void DoAlignment(const CFX_RectF& rect);
134 void OnDraw(const CFX_RectF& rtClip);
135 int32_t GetDisplayPos(FDE_TTOPIECE* pPiece);
136 int32_t GetCharRects(const FDE_TTOPIECE* pPiece);
137
138 FX_TXTRUN ToTextRun(const FDE_TTOPIECE* pPiece);
dsinclairacd0d592016-04-21 11:06:27 -0700139
weilicddf8252016-08-04 15:43:59 -0700140 std::unique_ptr<CFX_TxtBreak> m_pTxtBreak;
tsepeze6477992017-01-05 12:57:00 -0800141 CFX_RetainPtr<CFGAS_GEFont> m_pFont;
Dan Sinclair05df0752017-03-14 14:43:42 -0400142 float m_fFontSize;
143 float m_fLineSpace;
144 float m_fLinePos;
145 float m_fTolerance;
Dan Sinclairdff02ce2017-08-14 10:26:59 -0400146 FDE_TextAlignment m_iAlignment;
147 FDE_TextStyle m_Styles;
dsinclairacd0d592016-04-21 11:06:27 -0700148 int32_t m_iTxtBkAlignment;
weilicddf8252016-08-04 15:43:59 -0700149 std::vector<int32_t> m_CharWidths;
Dan Sinclair812e96c2017-03-13 16:43:37 -0400150 wchar_t m_wParagraphBkChar;
dsinclairacd0d592016-04-21 11:06:27 -0700151 FX_ARGB m_TxtColor;
dsinclairacd0d592016-04-21 11:06:27 -0700152 uint32_t m_dwTxtBkStyles;
dsinclairacd0d592016-04-21 11:06:27 -0700153 CFX_WideString m_wsText;
154 CFX_RectF m_rtClip;
155 CFX_RectF m_rtLogicClip;
156 CFX_Matrix m_Matrix;
Tom Sepezc3f74e92017-03-02 11:32:19 -0800157 std::deque<CFDE_TTOLine> m_ttoLines;
dsinclairacd0d592016-04-21 11:06:27 -0700158 int32_t m_iCurLine;
159 int32_t m_iCurPiece;
160 int32_t m_iTotalLines;
weilicddf8252016-08-04 15:43:59 -0700161 std::vector<FXTEXT_CHARPOS> m_CharPos;
Tom Sepez36533352017-05-16 15:40:23 -0700162 // NOTE: m_pDefaultRenderDevice must outlive m_pRenderDevice.
163 std::unique_ptr<CFX_DefaultRenderDevice> m_pDefaultRenderDevice;
tsepezf74ad992016-05-11 10:26:05 -0700164 std::unique_ptr<CFDE_RenderDevice> m_pRenderDevice;
tsepez3d328762017-01-24 06:12:34 -0800165 std::vector<CFX_RectF> m_rectArray;
Dan Sinclair1770c022016-03-14 14:14:16 -0400166};
167
Dan Sinclairbccf5732017-03-30 14:10:32 -0400168#endif // XFA_FDE_CFDE_TEXTOUT_H_