blob: bb65d28ef4b61fe5b11f26f9d6905a16c8ab385d [file] [log] [blame]
// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
#ifndef XFA_FDE_CFDE_TEXTOUT_H_
#define XFA_FDE_CFDE_TEXTOUT_H_
#include <deque>
#include <memory>
#include <vector>
#include "core/fxge/fx_dib.h"
#include "third_party/base/span.h"
#include "xfa/fde/cfde_data.h"
#include "xfa/fgas/layout/cfx_char.h"
class CFDE_RenderDevice;
class CFGAS_GEFont;
class CFX_RenderDevice;
class CFX_TxtBreak;
class TextCharPos;
struct FDE_TTOPIECE {
FDE_TTOPIECE();
FDE_TTOPIECE(const FDE_TTOPIECE& that);
~FDE_TTOPIECE();
int32_t iStartChar;
int32_t iChars;
uint32_t dwCharStyles;
CFX_RectF rtPiece;
};
class CFDE_TextOut {
public:
static bool DrawString(CFX_RenderDevice* device,
FX_ARGB color,
const RetainPtr<CFGAS_GEFont>& pFont,
pdfium::span<TextCharPos> pCharPos,
float fFontSize,
const CFX_Matrix& matrix);
CFDE_TextOut();
~CFDE_TextOut();
void SetFont(const RetainPtr<CFGAS_GEFont>& pFont);
void SetFontSize(float fFontSize);
void SetTextColor(FX_ARGB color) { m_TxtColor = color; }
void SetStyles(const FDE_TextStyle& dwStyles);
void SetAlignment(FDE_TextAlignment iAlignment);
void SetLineSpace(float fLineSpace);
void SetMatrix(const CFX_Matrix& matrix) { m_Matrix = matrix; }
void SetLineBreakTolerance(float fTolerance);
void CalcLogicSize(WideStringView str, CFX_SizeF* pSize);
void CalcLogicSize(WideStringView str, CFX_RectF* pRect);
void DrawLogicText(CFX_RenderDevice* device,
WideStringView str,
const CFX_RectF& rect);
int32_t GetTotalLines() const { return m_iTotalLines; }
private:
class CFDE_TTOLine {
public:
CFDE_TTOLine();
CFDE_TTOLine(const CFDE_TTOLine& ttoLine);
~CFDE_TTOLine();
bool GetNewReload() const { return m_bNewReload; }
void SetNewReload(bool reload) { m_bNewReload = reload; }
int32_t AddPiece(int32_t index, const FDE_TTOPIECE& ttoPiece);
int32_t GetSize() const;
FDE_TTOPIECE* GetPtrAt(int32_t index);
void RemoveLast(int32_t iCount);
private:
bool m_bNewReload;
std::deque<FDE_TTOPIECE> m_pieces;
};
bool RetrieveLineWidth(CFX_BreakType dwBreakStatus,
float* pStartPos,
float* pWidth,
float* pHeight);
void LoadText(const WideString& str, const CFX_RectF& rect);
void Reload(const CFX_RectF& rect);
void ReloadLinePiece(CFDE_TTOLine* pLine, const CFX_RectF& rect);
bool RetrievePieces(CFX_BreakType dwBreakStatus,
bool bReload,
const CFX_RectF& rect,
int32_t* pStartChar,
int32_t* pPieceWidths);
void AppendPiece(const FDE_TTOPIECE& ttoPiece, bool bNeedReload, bool bEnd);
void DoAlignment(const CFX_RectF& rect);
size_t GetDisplayPos(FDE_TTOPIECE* pPiece);
std::unique_ptr<CFX_TxtBreak> const m_pTxtBreak;
RetainPtr<CFGAS_GEFont> m_pFont;
float m_fFontSize = 12.0f;
float m_fLineSpace = 12.0f;
float m_fLinePos = 0.0f;
float m_fTolerance = 0.0f;
FDE_TextAlignment m_iAlignment = FDE_TextAlignment::kTopLeft;
FDE_TextStyle m_Styles;
std::vector<int32_t> m_CharWidths;
FX_ARGB m_TxtColor = 0xFF000000;
uint32_t m_dwTxtBkStyles = 0;
WideString m_wsText;
CFX_Matrix m_Matrix;
std::deque<CFDE_TTOLine> m_ttoLines;
int32_t m_iCurLine = 0;
int32_t m_iCurPiece = 0;
int32_t m_iTotalLines = 0;
std::vector<TextCharPos> m_CharPos;
};
#endif // XFA_FDE_CFDE_TEXTOUT_H_