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 13 CFDE_TxtEdtTextSet::CFDE_TxtEdtTextSet(CFDE_TxtEdtPage* pPage) 14 : m_pPage(pPage) {} 15 16 CFDE_TxtEdtTextSet::~CFDE_TxtEdtTextSet() {} 17 18 FDE_VISUALOBJTYPE CFDE_TxtEdtTextSet::GetType() { 19 return FDE_VISUALOBJ_Text; 20 } 21 22 CFX_RectF CFDE_TxtEdtTextSet::GetRect(const FDE_TEXTEDITPIECE& pPiece) { 23 return pPiece.rtPiece; 24 } 25 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 36 CFX_RetainPtr<CFGAS_GEFont> CFDE_TxtEdtTextSet::GetFont() { 37 return m_pPage->GetEngine()->GetEditParams()->pFont; 38 } 39 40 FX_FLOAT CFDE_TxtEdtTextSet::GetFontSize() { 41 return m_pPage->GetEngine()->GetEditParams()->fFontSize; 42 } 43 44 FX_ARGB CFDE_TxtEdtTextSet::GetFontColor() { 45 return m_pPage->GetEngine()->GetEditParams()->dwFontColor; 46 } 47 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 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