blob: f2541bb11bf56c210188f33b5ba67e5fb2687a9f [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);
dsinclairacd0d592016-04-21 11:06:27 -070071
Tom Sepezc3f74e92017-03-02 11:32:19 -080072 private:
tsepezd19e9122016-11-02 15:43:18 -070073 bool m_bNewReload;
Tom Sepezc3f74e92017-03-02 11:32:19 -080074 std::deque<FDE_TTOPIECE> m_pieces;
dsinclairacd0d592016-04-21 11:06:27 -070075};
dsinclairacd0d592016-04-21 11:06:27 -070076
Dan Sinclair0cb9b8c2017-01-10 16:38:10 -050077class CFDE_TextOut {
dsinclairacd0d592016-04-21 11:06:27 -070078 public:
79 CFDE_TextOut();
Dan Sinclair0cb9b8c2017-01-10 16:38:10 -050080 ~CFDE_TextOut();
dsinclairacd0d592016-04-21 11:06:27 -070081
tsepeze6477992017-01-05 12:57:00 -080082 void SetFont(const CFX_RetainPtr<CFGAS_GEFont>& pFont);
Dan Sinclair05df0752017-03-14 14:43:42 -040083 void SetFontSize(float fFontSize);
Dan Sinclair54a83902017-08-14 11:08:39 -040084 void SetTextColor(FX_ARGB color) { m_TxtColor = color; }
Dan Sinclairdff02ce2017-08-14 10:26:59 -040085 void SetStyles(const FDE_TextStyle& dwStyles);
Dan Sinclairdff02ce2017-08-14 10:26:59 -040086 void SetAlignment(FDE_TextAlignment iAlignment);
Dan Sinclair05df0752017-03-14 14:43:42 -040087 void SetLineSpace(float fLineSpace);
dsinclairacd0d592016-04-21 11:06:27 -070088 void SetRenderDevice(CFX_RenderDevice* pDevice);
Dan Sinclair54a83902017-08-14 11:08:39 -040089 void SetMatrix(const CFX_Matrix& matrix) { m_Matrix = matrix; }
Dan Sinclair05df0752017-03-14 14:43:42 -040090 void SetLineBreakTolerance(float fTolerance);
dsinclairacd0d592016-04-21 11:06:27 -070091
Dan Sinclair812e96c2017-03-13 16:43:37 -040092 void CalcLogicSize(const wchar_t* pwsStr, int32_t iLength, CFX_SizeF& size);
93 void CalcLogicSize(const wchar_t* pwsStr, int32_t iLength, CFX_RectF& rect);
Dan Sinclair812e96c2017-03-13 16:43:37 -040094 void DrawLogicText(const wchar_t* pwsStr,
dsinclairacd0d592016-04-21 11:06:27 -070095 int32_t iLength,
96 const CFX_RectF& rect);
Dan Sinclair54a83902017-08-14 11:08:39 -040097 int32_t GetTotalLines() const { return m_iTotalLines; }
dsinclairacd0d592016-04-21 11:06:27 -070098
Dan Sinclairbccf5732017-03-30 14:10:32 -040099 private:
Dan Sinclairc36fe072017-03-09 16:58:12 -0500100 bool RetrieveLineWidth(CFX_BreakType dwBreakStatus,
Dan Sinclair05df0752017-03-14 14:43:42 -0400101 float& fStartPos,
102 float& fWidth,
103 float& fHeight);
Dan Sinclair812e96c2017-03-13 16:43:37 -0400104 void LoadText(const wchar_t* pwsStr, int32_t iLength, const CFX_RectF& rect);
dsinclairacd0d592016-04-21 11:06:27 -0700105
106 void Reload(const CFX_RectF& rect);
107 void ReloadLinePiece(CFDE_TTOLine* pLine, const CFX_RectF& rect);
Dan Sinclairc36fe072017-03-09 16:58:12 -0500108 bool RetrievePieces(CFX_BreakType dwBreakStatus,
tsepezd19e9122016-11-02 15:43:18 -0700109 int32_t& iStartChar,
110 int32_t& iPieceWidths,
111 bool bReload,
112 const CFX_RectF& rect);
113 void AppendPiece(const FDE_TTOPIECE& ttoPiece, bool bNeedReload, bool bEnd);
dsinclairacd0d592016-04-21 11:06:27 -0700114 void DoAlignment(const CFX_RectF& rect);
dsinclairacd0d592016-04-21 11:06:27 -0700115 int32_t GetDisplayPos(FDE_TTOPIECE* pPiece);
dsinclairacd0d592016-04-21 11:06:27 -0700116
117 FX_TXTRUN ToTextRun(const FDE_TTOPIECE* pPiece);
dsinclairacd0d592016-04-21 11:06:27 -0700118
weilicddf8252016-08-04 15:43:59 -0700119 std::unique_ptr<CFX_TxtBreak> m_pTxtBreak;
tsepeze6477992017-01-05 12:57:00 -0800120 CFX_RetainPtr<CFGAS_GEFont> m_pFont;
Dan Sinclair05df0752017-03-14 14:43:42 -0400121 float m_fFontSize;
122 float m_fLineSpace;
123 float m_fLinePos;
124 float m_fTolerance;
Dan Sinclairdff02ce2017-08-14 10:26:59 -0400125 FDE_TextAlignment m_iAlignment;
126 FDE_TextStyle m_Styles;
weilicddf8252016-08-04 15:43:59 -0700127 std::vector<int32_t> m_CharWidths;
dsinclairacd0d592016-04-21 11:06:27 -0700128 FX_ARGB m_TxtColor;
dsinclairacd0d592016-04-21 11:06:27 -0700129 uint32_t m_dwTxtBkStyles;
dsinclairacd0d592016-04-21 11:06:27 -0700130 CFX_WideString m_wsText;
dsinclairacd0d592016-04-21 11:06:27 -0700131 CFX_Matrix m_Matrix;
Tom Sepezc3f74e92017-03-02 11:32:19 -0800132 std::deque<CFDE_TTOLine> m_ttoLines;
dsinclairacd0d592016-04-21 11:06:27 -0700133 int32_t m_iCurLine;
134 int32_t m_iCurPiece;
135 int32_t m_iTotalLines;
weilicddf8252016-08-04 15:43:59 -0700136 std::vector<FXTEXT_CHARPOS> m_CharPos;
tsepezf74ad992016-05-11 10:26:05 -0700137 std::unique_ptr<CFDE_RenderDevice> m_pRenderDevice;
Dan Sinclair1770c022016-03-14 14:14:16 -0400138};
139
Dan Sinclairbccf5732017-03-30 14:10:32 -0400140#endif // XFA_FDE_CFDE_TEXTOUT_H_