dsinclair | 6539518 | 2016-05-18 11:09:47 -0700 | [diff] [blame] | 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" |
tsepez | e647799 | 2017-01-05 12:57:00 -0800 | [diff] [blame] | 11 | #include "xfa/fgas/font/cfgas_gefont.h" |
Dan Sinclair | 575898e | 2017-03-13 10:16:05 -0400 | [diff] [blame] | 12 | #include "xfa/fgas/layout/fgas_textbreak.h" |
dsinclair | 6539518 | 2016-05-18 11:09:47 -0700 | [diff] [blame] | 13 | |
| 14 | CFDE_TxtEdtTextSet::CFDE_TxtEdtTextSet(CFDE_TxtEdtPage* pPage) |
| 15 | : m_pPage(pPage) {} |
| 16 | |
| 17 | CFDE_TxtEdtTextSet::~CFDE_TxtEdtTextSet() {} |
| 18 | |
| 19 | FDE_VISUALOBJTYPE CFDE_TxtEdtTextSet::GetType() { |
| 20 | return FDE_VISUALOBJ_Text; |
| 21 | } |
| 22 | |
Tom Sepez | c803cbc | 2017-03-02 12:21:15 -0800 | [diff] [blame] | 23 | CFX_RectF CFDE_TxtEdtTextSet::GetRect(const FDE_TEXTEDITPIECE& pPiece) { |
| 24 | return pPiece.rtPiece; |
dsinclair | 6539518 | 2016-05-18 11:09:47 -0700 | [diff] [blame] | 25 | } |
| 26 | |
dsinclair | 705f829 | 2016-06-07 10:10:45 -0700 | [diff] [blame] | 27 | int32_t CFDE_TxtEdtTextSet::GetString(FDE_TEXTEDITPIECE* pPiece, |
dsinclair | 6539518 | 2016-05-18 11:09:47 -0700 | [diff] [blame] | 28 | CFX_WideString& wsText) { |
dsinclair | 6539518 | 2016-05-18 11:09:47 -0700 | [diff] [blame] | 29 | FX_WCHAR* pBuffer = wsText.GetBuffer(pPiece->nCount); |
tsepez | e647799 | 2017-01-05 12:57:00 -0800 | [diff] [blame] | 30 | for (int32_t i = 0; i < pPiece->nCount; i++) |
dsinclair | 705f829 | 2016-06-07 10:10:45 -0700 | [diff] [blame] | 31 | pBuffer[i] = m_pPage->GetChar(pPiece, i); |
tsepez | e647799 | 2017-01-05 12:57:00 -0800 | [diff] [blame] | 32 | |
dsinclair | 6539518 | 2016-05-18 11:09:47 -0700 | [diff] [blame] | 33 | wsText.ReleaseBuffer(pPiece->nCount); |
| 34 | return pPiece->nCount; |
| 35 | } |
| 36 | |
tsepez | e647799 | 2017-01-05 12:57:00 -0800 | [diff] [blame] | 37 | CFX_RetainPtr<CFGAS_GEFont> CFDE_TxtEdtTextSet::GetFont() { |
dsinclair | 6539518 | 2016-05-18 11:09:47 -0700 | [diff] [blame] | 38 | return m_pPage->GetEngine()->GetEditParams()->pFont; |
| 39 | } |
| 40 | |
dsinclair | 705f829 | 2016-06-07 10:10:45 -0700 | [diff] [blame] | 41 | FX_FLOAT CFDE_TxtEdtTextSet::GetFontSize() { |
dsinclair | 6539518 | 2016-05-18 11:09:47 -0700 | [diff] [blame] | 42 | return m_pPage->GetEngine()->GetEditParams()->fFontSize; |
| 43 | } |
| 44 | |
dsinclair | 705f829 | 2016-06-07 10:10:45 -0700 | [diff] [blame] | 45 | FX_ARGB CFDE_TxtEdtTextSet::GetFontColor() { |
dsinclair | 6539518 | 2016-05-18 11:09:47 -0700 | [diff] [blame] | 46 | return m_pPage->GetEngine()->GetEditParams()->dwFontColor; |
| 47 | } |
| 48 | |
Tom Sepez | c803cbc | 2017-03-02 12:21:15 -0800 | [diff] [blame] | 49 | int32_t CFDE_TxtEdtTextSet::GetDisplayPos(const FDE_TEXTEDITPIECE& piece, |
dsinclair | 6539518 | 2016-05-18 11:09:47 -0700 | [diff] [blame] | 50 | FXTEXT_CHARPOS* pCharPos, |
tsepez | d19e912 | 2016-11-02 15:43:18 -0700 | [diff] [blame] | 51 | bool bCharCode, |
dsinclair | 6539518 | 2016-05-18 11:09:47 -0700 | [diff] [blame] | 52 | CFX_WideString* pWSForms) { |
Tom Sepez | c803cbc | 2017-03-02 12:21:15 -0800 | [diff] [blame] | 53 | int32_t nLength = piece.nCount; |
dsinclair | 6539518 | 2016-05-18 11:09:47 -0700 | [diff] [blame] | 54 | 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 Sepez | c803cbc | 2017-03-02 12:21:15 -0800 | [diff] [blame] | 64 | tr.pIdentity = &piece; |
dsinclair | 6539518 | 2016-05-18 11:09:47 -0700 | [diff] [blame] | 65 | tr.iLength = nLength; |
| 66 | tr.pFont = pTextParams->pFont; |
| 67 | tr.fFontSize = pTextParams->fFontSize; |
| 68 | tr.dwStyles = dwLayoutStyle; |
Tom Sepez | c803cbc | 2017-03-02 12:21:15 -0800 | [diff] [blame] | 69 | tr.dwCharStyles = piece.dwCharStyles; |
| 70 | tr.pRect = &piece.rtPiece; |
dsinclair | 6539518 | 2016-05-18 11:09:47 -0700 | [diff] [blame] | 71 | tr.wLineBreakChar = pTextParams->wLineBreakChar; |
| 72 | return pBreak->GetDisplayPos(&tr, pCharPos, bCharCode, pWSForms); |
| 73 | } |
| 74 | |
Tom Sepez | c803cbc | 2017-03-02 12:21:15 -0800 | [diff] [blame] | 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>(); |
dsinclair | 6539518 | 2016-05-18 11:09:47 -0700 | [diff] [blame] | 80 | |
Lei Zhang | 375c276 | 2017-03-10 14:37:14 -0800 | [diff] [blame^] | 81 | auto* pEngine = static_cast<CFDE_TxtEdtEngine*>(m_pPage->GetEngine()); |
dsinclair | 6539518 | 2016-05-18 11:09:47 -0700 | [diff] [blame] | 82 | const FDE_TXTEDTPARAMS* pTextParams = pEngine->GetEditParams(); |
| 83 | uint32_t dwLayoutStyle = pEngine->GetTextBreak()->GetLayoutStyles(); |
| 84 | FX_TXTRUN tr; |
| 85 | tr.pAccess = m_pPage; |
dsinclair | 705f829 | 2016-06-07 10:10:45 -0700 | [diff] [blame] | 86 | tr.pIdentity = pPiece; |
Tom Sepez | c803cbc | 2017-03-02 12:21:15 -0800 | [diff] [blame] | 87 | tr.iLength = pPiece->nCount; |
dsinclair | 6539518 | 2016-05-18 11:09:47 -0700 | [diff] [blame] | 88 | tr.pFont = pTextParams->pFont; |
| 89 | tr.fFontSize = pTextParams->fFontSize; |
| 90 | tr.dwStyles = dwLayoutStyle; |
dsinclair | 6539518 | 2016-05-18 11:09:47 -0700 | [diff] [blame] | 91 | tr.dwCharStyles = pPiece->dwCharStyles; |
Tom Sepez | c803cbc | 2017-03-02 12:21:15 -0800 | [diff] [blame] | 92 | tr.pRect = &pPiece->rtPiece; |
dsinclair | 6539518 | 2016-05-18 11:09:47 -0700 | [diff] [blame] | 93 | tr.wLineBreakChar = pTextParams->wLineBreakChar; |
Tom Sepez | c803cbc | 2017-03-02 12:21:15 -0800 | [diff] [blame] | 94 | return pEngine->GetTextBreak()->GetCharRects(&tr, bBBox); |
dsinclair | 6539518 | 2016-05-18 11:09:47 -0700 | [diff] [blame] | 95 | } |