blob: f69c0a87172ce1bf2165b5c9c9ab874a3d339a37 [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;
23
Dan Sinclairdff02ce2017-08-14 10:26:59 -040024enum class FDE_TextAlignment : uint8_t {
25 kTopLeft = 0,
26 kCenterLeft,
27 kCenter,
28 kCenterRight
29};
30
31struct FDE_TextStyle {
32 FDE_TextStyle()
33 : single_line_(false), line_wrap_(false), last_line_height_(false) {}
34 ~FDE_TextStyle() {}
35
36 void Reset() {
37 single_line_ = false;
38 line_wrap_ = false;
39 last_line_height_ = false;
40 }
41
42 bool single_line_;
43 bool line_wrap_;
44 bool last_line_height_;
45};
46
dsinclairacd0d592016-04-21 11:06:27 -070047struct FDE_TTOPIECE {
Tom Sepez76da8842017-02-06 15:10:48 -080048 FDE_TTOPIECE();
Tom Sepezc3f74e92017-03-02 11:32:19 -080049 FDE_TTOPIECE(const FDE_TTOPIECE& that);
Tom Sepez76da8842017-02-06 15:10:48 -080050 ~FDE_TTOPIECE();
51
dsinclairacd0d592016-04-21 11:06:27 -070052 int32_t iStartChar;
53 int32_t iChars;
54 uint32_t dwCharStyles;
55 CFX_RectF rtPiece;
56};
dsinclairacd0d592016-04-21 11:06:27 -070057
Dan Sinclair0cb9b8c2017-01-10 16:38:10 -050058class CFDE_TTOLine {
Dan Sinclair1770c022016-03-14 14:14:16 -040059 public:
dsinclairacd0d592016-04-21 11:06:27 -070060 CFDE_TTOLine();
61 CFDE_TTOLine(const CFDE_TTOLine& ttoLine);
Dan Sinclair0cb9b8c2017-01-10 16:38:10 -050062 ~CFDE_TTOLine();
weilieec3a362016-06-18 06:25:37 -070063
Tom Sepezc3f74e92017-03-02 11:32:19 -080064 bool GetNewReload() const { return m_bNewReload; }
65 void SetNewReload(bool reload) { m_bNewReload = reload; }
dsinclairacd0d592016-04-21 11:06:27 -070066 int32_t AddPiece(int32_t index, const FDE_TTOPIECE& ttoPiece);
67 int32_t GetSize() const;
68 FDE_TTOPIECE* GetPtrAt(int32_t index);
69 void RemoveLast(int32_t iCount);
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:
Dan Sinclair73b492a2017-08-14 17:23:25 -040078 static bool DrawString(CFX_RenderDevice* device,
79 FX_ARGB color,
Dan Sinclair0b950422017-09-21 15:49:49 -040080 const RetainPtr<CFGAS_GEFont>& pFont,
Dan Sinclair8c6dc952017-08-21 09:50:55 -040081 FXTEXT_CHARPOS* pCharPos,
Dan Sinclair73b492a2017-08-14 17:23:25 -040082 int32_t iCount,
83 float fFontSize,
84 const CFX_Matrix* pMatrix);
85
dsinclairacd0d592016-04-21 11:06:27 -070086 CFDE_TextOut();
Dan Sinclair0cb9b8c2017-01-10 16:38:10 -050087 ~CFDE_TextOut();
dsinclairacd0d592016-04-21 11:06:27 -070088
Dan Sinclair0b950422017-09-21 15:49:49 -040089 void SetFont(const RetainPtr<CFGAS_GEFont>& pFont);
Dan Sinclair05df0752017-03-14 14:43:42 -040090 void SetFontSize(float fFontSize);
Dan Sinclair54a83902017-08-14 11:08:39 -040091 void SetTextColor(FX_ARGB color) { m_TxtColor = color; }
Dan Sinclairdff02ce2017-08-14 10:26:59 -040092 void SetStyles(const FDE_TextStyle& dwStyles);
Dan Sinclairdff02ce2017-08-14 10:26:59 -040093 void SetAlignment(FDE_TextAlignment iAlignment);
Dan Sinclair05df0752017-03-14 14:43:42 -040094 void SetLineSpace(float fLineSpace);
Dan Sinclair54a83902017-08-14 11:08:39 -040095 void SetMatrix(const CFX_Matrix& matrix) { m_Matrix = matrix; }
Dan Sinclair05df0752017-03-14 14:43:42 -040096 void SetLineBreakTolerance(float fTolerance);
dsinclairacd0d592016-04-21 11:06:27 -070097
Ryan Harrison275e2602017-09-18 14:23:18 -040098 void CalcLogicSize(const WideString& str, CFX_SizeF& size);
99 void CalcLogicSize(const WideString& str, CFX_RectF& rect);
Dan Sinclair73b492a2017-08-14 17:23:25 -0400100 void DrawLogicText(CFX_RenderDevice* device,
Ryan Harrison275e2602017-09-18 14:23:18 -0400101 const WideStringView& str,
dsinclairacd0d592016-04-21 11:06:27 -0700102 const CFX_RectF& rect);
Dan Sinclair54a83902017-08-14 11:08:39 -0400103 int32_t GetTotalLines() const { return m_iTotalLines; }
dsinclairacd0d592016-04-21 11:06:27 -0700104
Dan Sinclairbccf5732017-03-30 14:10:32 -0400105 private:
Dan Sinclairc36fe072017-03-09 16:58:12 -0500106 bool RetrieveLineWidth(CFX_BreakType dwBreakStatus,
Dan Sinclair05df0752017-03-14 14:43:42 -0400107 float& fStartPos,
108 float& fWidth,
109 float& fHeight);
Ryan Harrison275e2602017-09-18 14:23:18 -0400110 void LoadText(const WideString& str, const CFX_RectF& rect);
dsinclairacd0d592016-04-21 11:06:27 -0700111
112 void Reload(const CFX_RectF& rect);
113 void ReloadLinePiece(CFDE_TTOLine* pLine, const CFX_RectF& rect);
Dan Sinclairc36fe072017-03-09 16:58:12 -0500114 bool RetrievePieces(CFX_BreakType dwBreakStatus,
tsepezd19e9122016-11-02 15:43:18 -0700115 int32_t& iStartChar,
116 int32_t& iPieceWidths,
117 bool bReload,
118 const CFX_RectF& rect);
119 void AppendPiece(const FDE_TTOPIECE& ttoPiece, bool bNeedReload, bool bEnd);
dsinclairacd0d592016-04-21 11:06:27 -0700120 void DoAlignment(const CFX_RectF& rect);
dsinclairacd0d592016-04-21 11:06:27 -0700121 int32_t GetDisplayPos(FDE_TTOPIECE* pPiece);
dsinclairacd0d592016-04-21 11:06:27 -0700122
weilicddf8252016-08-04 15:43:59 -0700123 std::unique_ptr<CFX_TxtBreak> m_pTxtBreak;
Dan Sinclair0b950422017-09-21 15:49:49 -0400124 RetainPtr<CFGAS_GEFont> m_pFont;
Dan Sinclair05df0752017-03-14 14:43:42 -0400125 float m_fFontSize;
126 float m_fLineSpace;
127 float m_fLinePos;
128 float m_fTolerance;
Dan Sinclairdff02ce2017-08-14 10:26:59 -0400129 FDE_TextAlignment m_iAlignment;
130 FDE_TextStyle m_Styles;
weilicddf8252016-08-04 15:43:59 -0700131 std::vector<int32_t> m_CharWidths;
dsinclairacd0d592016-04-21 11:06:27 -0700132 FX_ARGB m_TxtColor;
dsinclairacd0d592016-04-21 11:06:27 -0700133 uint32_t m_dwTxtBkStyles;
Ryan Harrison275e2602017-09-18 14:23:18 -0400134 WideString m_wsText;
dsinclairacd0d592016-04-21 11:06:27 -0700135 CFX_Matrix m_Matrix;
Tom Sepezc3f74e92017-03-02 11:32:19 -0800136 std::deque<CFDE_TTOLine> m_ttoLines;
dsinclairacd0d592016-04-21 11:06:27 -0700137 int32_t m_iCurLine;
138 int32_t m_iCurPiece;
139 int32_t m_iTotalLines;
weilicddf8252016-08-04 15:43:59 -0700140 std::vector<FXTEXT_CHARPOS> m_CharPos;
Dan Sinclair1770c022016-03-14 14:14:16 -0400141};
142
Dan Sinclairbccf5732017-03-30 14:10:32 -0400143#endif // XFA_FDE_CFDE_TEXTOUT_H_