1 // Copyright 2016 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
7 #include "xfa/fde/cfde_txtedttextset.h"
8
9 #include "xfa/fde/cfde_txtedtengine.h"
10 #include "xfa/fde/cfde_txtedtpage.h"
11 #include "xfa/fgas/font/cfgas_gefont.h"
12
CFDE_TxtEdtTextSet(CFDE_TxtEdtPage * pPage)13 CFDE_TxtEdtTextSet::CFDE_TxtEdtTextSet(CFDE_TxtEdtPage* pPage)
14 : m_pPage(pPage) {}
15
~CFDE_TxtEdtTextSet()16 CFDE_TxtEdtTextSet::~CFDE_TxtEdtTextSet() {}
17
GetType()18 FDE_VISUALOBJTYPE CFDE_TxtEdtTextSet::GetType() {
19 return FDE_VISUALOBJ_Text;
20 }
21
GetRect(const FDE_TEXTEDITPIECE & pPiece)22 CFX_RectF CFDE_TxtEdtTextSet::GetRect(const FDE_TEXTEDITPIECE& pPiece) {
23 return pPiece.rtPiece;
24 }
25
GetString(FDE_TEXTEDITPIECE * pPiece,CFX_WideString & wsText)26 int32_t CFDE_TxtEdtTextSet::GetString(FDE_TEXTEDITPIECE* pPiece,
27 CFX_WideString& wsText) {
28 FX_WCHAR* pBuffer = wsText.GetBuffer(pPiece->nCount);
29 for (int32_t i = 0; i < pPiece->nCount; i++)
30 pBuffer[i] = m_pPage->GetChar(pPiece, i);
31
32 wsText.ReleaseBuffer(pPiece->nCount);
33 return pPiece->nCount;
34 }
35
GetFont()36 CFX_RetainPtr<CFGAS_GEFont> CFDE_TxtEdtTextSet::GetFont() {
37 return m_pPage->GetEngine()->GetEditParams()->pFont;
38 }
39
GetFontSize()40 FX_FLOAT CFDE_TxtEdtTextSet::GetFontSize() {
41 return m_pPage->GetEngine()->GetEditParams()->fFontSize;
42 }
43
GetFontColor()44 FX_ARGB CFDE_TxtEdtTextSet::GetFontColor() {
45 return m_pPage->GetEngine()->GetEditParams()->dwFontColor;
46 }
47
GetDisplayPos(const FDE_TEXTEDITPIECE & piece,FXTEXT_CHARPOS * pCharPos,bool bCharCode,CFX_WideString * pWSForms)48 int32_t CFDE_TxtEdtTextSet::GetDisplayPos(const FDE_TEXTEDITPIECE& piece,
49 FXTEXT_CHARPOS* pCharPos,
50 bool bCharCode,
51 CFX_WideString* pWSForms) {
52 int32_t nLength = piece.nCount;
53 if (nLength < 1)
54 return 0;
55
56 CFDE_TxtEdtEngine* pEngine =
57 static_cast<CFDE_TxtEdtEngine*>(m_pPage->GetEngine());
58 const FDE_TXTEDTPARAMS* pTextParams = pEngine->GetEditParams();
59 CFX_TxtBreak* pBreak = pEngine->GetTextBreak();
60 uint32_t dwLayoutStyle = pBreak->GetLayoutStyles();
61 FX_TXTRUN tr;
62 tr.pAccess = m_pPage;
63 tr.pIdentity = &piece;
64 tr.iLength = nLength;
65 tr.pFont = pTextParams->pFont;
66 tr.fFontSize = pTextParams->fFontSize;
67 tr.dwStyles = dwLayoutStyle;
68 tr.iCharRotation = pTextParams->nCharRotation;
69 tr.dwCharStyles = piece.dwCharStyles;
70 tr.pRect = &piece.rtPiece;
71 tr.wLineBreakChar = pTextParams->wLineBreakChar;
72 return pBreak->GetDisplayPos(&tr, pCharPos, bCharCode, pWSForms);
73 }
74
GetCharRects(const FDE_TEXTEDITPIECE * pPiece,bool bBBox)75 std::vector<CFX_RectF> CFDE_TxtEdtTextSet::GetCharRects(
76 const FDE_TEXTEDITPIECE* pPiece,
77 bool bBBox) {
78 if (!pPiece || pPiece->nCount < 1)
79 return std::vector<CFX_RectF>();
80
81 auto pEngine = static_cast<CFDE_TxtEdtEngine*>(m_pPage->GetEngine());
82 const FDE_TXTEDTPARAMS* pTextParams = pEngine->GetEditParams();
83 uint32_t dwLayoutStyle = pEngine->GetTextBreak()->GetLayoutStyles();
84 FX_TXTRUN tr;
85 tr.pAccess = m_pPage;
86 tr.pIdentity = pPiece;
87 tr.iLength = pPiece->nCount;
88 tr.pFont = pTextParams->pFont;
89 tr.fFontSize = pTextParams->fFontSize;
90 tr.dwStyles = dwLayoutStyle;
91 tr.iCharRotation = pTextParams->nCharRotation;
92 tr.dwCharStyles = pPiece->dwCharStyles;
93 tr.pRect = &pPiece->rtPiece;
94 tr.wLineBreakChar = pTextParams->wLineBreakChar;
95 return pEngine->GetTextBreak()->GetCharRects(&tr, bBBox);
96 }
97