blob: a6503f402216817027a6dd355cea253c14951b36 [file] [log] [blame]
dsinclair65395182016-05-18 11:09:47 -07001// 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"
tsepeze6477992017-01-05 12:57:00 -080011#include "xfa/fgas/font/cfgas_gefont.h"
Dan Sinclair575898e2017-03-13 10:16:05 -040012#include "xfa/fgas/layout/fgas_textbreak.h"
dsinclair65395182016-05-18 11:09:47 -070013
14CFDE_TxtEdtTextSet::CFDE_TxtEdtTextSet(CFDE_TxtEdtPage* pPage)
15 : m_pPage(pPage) {}
16
17CFDE_TxtEdtTextSet::~CFDE_TxtEdtTextSet() {}
18
19FDE_VISUALOBJTYPE CFDE_TxtEdtTextSet::GetType() {
20 return FDE_VISUALOBJ_Text;
21}
22
Tom Sepezc803cbc2017-03-02 12:21:15 -080023CFX_RectF CFDE_TxtEdtTextSet::GetRect(const FDE_TEXTEDITPIECE& pPiece) {
24 return pPiece.rtPiece;
dsinclair65395182016-05-18 11:09:47 -070025}
26
dsinclair705f8292016-06-07 10:10:45 -070027int32_t CFDE_TxtEdtTextSet::GetString(FDE_TEXTEDITPIECE* pPiece,
dsinclair65395182016-05-18 11:09:47 -070028 CFX_WideString& wsText) {
dsinclair65395182016-05-18 11:09:47 -070029 FX_WCHAR* pBuffer = wsText.GetBuffer(pPiece->nCount);
tsepeze6477992017-01-05 12:57:00 -080030 for (int32_t i = 0; i < pPiece->nCount; i++)
dsinclair705f8292016-06-07 10:10:45 -070031 pBuffer[i] = m_pPage->GetChar(pPiece, i);
tsepeze6477992017-01-05 12:57:00 -080032
dsinclair65395182016-05-18 11:09:47 -070033 wsText.ReleaseBuffer(pPiece->nCount);
34 return pPiece->nCount;
35}
36
tsepeze6477992017-01-05 12:57:00 -080037CFX_RetainPtr<CFGAS_GEFont> CFDE_TxtEdtTextSet::GetFont() {
dsinclair65395182016-05-18 11:09:47 -070038 return m_pPage->GetEngine()->GetEditParams()->pFont;
39}
40
dsinclair705f8292016-06-07 10:10:45 -070041FX_FLOAT CFDE_TxtEdtTextSet::GetFontSize() {
dsinclair65395182016-05-18 11:09:47 -070042 return m_pPage->GetEngine()->GetEditParams()->fFontSize;
43}
44
dsinclair705f8292016-06-07 10:10:45 -070045FX_ARGB CFDE_TxtEdtTextSet::GetFontColor() {
dsinclair65395182016-05-18 11:09:47 -070046 return m_pPage->GetEngine()->GetEditParams()->dwFontColor;
47}
48
Tom Sepezc803cbc2017-03-02 12:21:15 -080049int32_t CFDE_TxtEdtTextSet::GetDisplayPos(const FDE_TEXTEDITPIECE& piece,
dsinclair65395182016-05-18 11:09:47 -070050 FXTEXT_CHARPOS* pCharPos,
tsepezd19e9122016-11-02 15:43:18 -070051 bool bCharCode,
dsinclair65395182016-05-18 11:09:47 -070052 CFX_WideString* pWSForms) {
Tom Sepezc803cbc2017-03-02 12:21:15 -080053 int32_t nLength = piece.nCount;
dsinclair65395182016-05-18 11:09:47 -070054 if (nLength < 1)
55 return 0;
56
57 CFDE_TxtEdtEngine* pEngine =
58 static_cast<CFDE_TxtEdtEngine*>(m_pPage->GetEngine());
59 const FDE_TXTEDTPARAMS* pTextParams = pEngine->GetEditParams();
60 CFX_TxtBreak* pBreak = pEngine->GetTextBreak();
61 uint32_t dwLayoutStyle = pBreak->GetLayoutStyles();
62 FX_TXTRUN tr;
63 tr.pAccess = m_pPage;
Tom Sepezc803cbc2017-03-02 12:21:15 -080064 tr.pIdentity = &piece;
dsinclair65395182016-05-18 11:09:47 -070065 tr.iLength = nLength;
66 tr.pFont = pTextParams->pFont;
67 tr.fFontSize = pTextParams->fFontSize;
68 tr.dwStyles = dwLayoutStyle;
Tom Sepezc803cbc2017-03-02 12:21:15 -080069 tr.dwCharStyles = piece.dwCharStyles;
70 tr.pRect = &piece.rtPiece;
dsinclair65395182016-05-18 11:09:47 -070071 tr.wLineBreakChar = pTextParams->wLineBreakChar;
72 return pBreak->GetDisplayPos(&tr, pCharPos, bCharCode, pWSForms);
73}
74
Tom Sepezc803cbc2017-03-02 12:21:15 -080075std::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>();
dsinclair65395182016-05-18 11:09:47 -070080
Lei Zhang375c2762017-03-10 14:37:14 -080081 auto* pEngine = static_cast<CFDE_TxtEdtEngine*>(m_pPage->GetEngine());
dsinclair65395182016-05-18 11:09:47 -070082 const FDE_TXTEDTPARAMS* pTextParams = pEngine->GetEditParams();
83 uint32_t dwLayoutStyle = pEngine->GetTextBreak()->GetLayoutStyles();
84 FX_TXTRUN tr;
85 tr.pAccess = m_pPage;
dsinclair705f8292016-06-07 10:10:45 -070086 tr.pIdentity = pPiece;
Tom Sepezc803cbc2017-03-02 12:21:15 -080087 tr.iLength = pPiece->nCount;
dsinclair65395182016-05-18 11:09:47 -070088 tr.pFont = pTextParams->pFont;
89 tr.fFontSize = pTextParams->fFontSize;
90 tr.dwStyles = dwLayoutStyle;
dsinclair65395182016-05-18 11:09:47 -070091 tr.dwCharStyles = pPiece->dwCharStyles;
Tom Sepezc803cbc2017-03-02 12:21:15 -080092 tr.pRect = &pPiece->rtPiece;
dsinclair65395182016-05-18 11:09:47 -070093 tr.wLineBreakChar = pTextParams->wLineBreakChar;
Tom Sepezc803cbc2017-03-02 12:21:15 -080094 return pEngine->GetTextBreak()->GetCharRects(&tr, bBBox);
dsinclair65395182016-05-18 11:09:47 -070095}