You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
121 lines
3.7 KiB
121 lines
3.7 KiB
// 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_
|