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 "core/fpdfapi/page/cpdf_textstate.h" 8 9 #include "core/fpdfapi/font/cpdf_font.h" 10 #include "core/fpdfapi/page/cpdf_docpagedata.h" 11 12 CPDF_TextState::CPDF_TextState() = default; 13 14 CPDF_TextState::~CPDF_TextState() = default; 15 Emplace()16void CPDF_TextState::Emplace() { 17 m_Ref.Emplace(); 18 } 19 GetFont() const20RetainPtr<CPDF_Font> CPDF_TextState::GetFont() const { 21 return m_Ref.GetObject()->m_pFont; 22 } 23 SetFont(const RetainPtr<CPDF_Font> & pFont)24void CPDF_TextState::SetFont(const RetainPtr<CPDF_Font>& pFont) { 25 m_Ref.GetPrivateCopy()->SetFont(pFont); 26 } 27 GetFontSize() const28float CPDF_TextState::GetFontSize() const { 29 return m_Ref.GetObject()->m_FontSize; 30 } 31 SetFontSize(float size)32void CPDF_TextState::SetFontSize(float size) { 33 m_Ref.GetPrivateCopy()->m_FontSize = size; 34 } 35 GetMatrix() const36const float* CPDF_TextState::GetMatrix() const { 37 return m_Ref.GetObject()->m_Matrix; 38 } 39 GetMutableMatrix()40float* CPDF_TextState::GetMutableMatrix() { 41 return m_Ref.GetPrivateCopy()->m_Matrix; 42 } 43 GetCharSpace() const44float CPDF_TextState::GetCharSpace() const { 45 return m_Ref.GetObject()->m_CharSpace; 46 } 47 SetCharSpace(float sp)48void CPDF_TextState::SetCharSpace(float sp) { 49 m_Ref.GetPrivateCopy()->m_CharSpace = sp; 50 } 51 GetWordSpace() const52float CPDF_TextState::GetWordSpace() const { 53 return m_Ref.GetObject()->m_WordSpace; 54 } 55 SetWordSpace(float sp)56void CPDF_TextState::SetWordSpace(float sp) { 57 m_Ref.GetPrivateCopy()->m_WordSpace = sp; 58 } 59 GetFontSizeH() const60float CPDF_TextState::GetFontSizeH() const { 61 return m_Ref.GetObject()->GetFontSizeH(); 62 } 63 GetTextMode() const64TextRenderingMode CPDF_TextState::GetTextMode() const { 65 return m_Ref.GetObject()->m_TextMode; 66 } 67 SetTextMode(TextRenderingMode mode)68void CPDF_TextState::SetTextMode(TextRenderingMode mode) { 69 m_Ref.GetPrivateCopy()->m_TextMode = mode; 70 } 71 GetCTM() const72const float* CPDF_TextState::GetCTM() const { 73 return m_Ref.GetObject()->m_CTM; 74 } 75 GetMutableCTM()76float* CPDF_TextState::GetMutableCTM() { 77 return m_Ref.GetPrivateCopy()->m_CTM; 78 } 79 80 CPDF_TextState::TextData::TextData() = default; 81 TextData(const TextData & that)82CPDF_TextState::TextData::TextData(const TextData& that) 83 : m_pFont(that.m_pFont), 84 m_pDocument(that.m_pDocument), 85 m_FontSize(that.m_FontSize), 86 m_CharSpace(that.m_CharSpace), 87 m_WordSpace(that.m_WordSpace), 88 m_TextMode(that.m_TextMode) { 89 for (int i = 0; i < 4; ++i) 90 m_Matrix[i] = that.m_Matrix[i]; 91 92 for (int i = 0; i < 4; ++i) 93 m_CTM[i] = that.m_CTM[i]; 94 95 if (m_pDocument && m_pFont) { 96 auto* pPageData = CPDF_DocPageData::FromDocument(m_pDocument.Get()); 97 m_pFont = pPageData->GetFont(m_pFont->GetFontDict()); 98 } 99 } 100 101 CPDF_TextState::TextData::~TextData() = default; 102 Clone() const103RetainPtr<CPDF_TextState::TextData> CPDF_TextState::TextData::Clone() const { 104 return pdfium::MakeRetain<CPDF_TextState::TextData>(*this); 105 } 106 SetFont(const RetainPtr<CPDF_Font> & pFont)107void CPDF_TextState::TextData::SetFont(const RetainPtr<CPDF_Font>& pFont) { 108 m_pDocument = pFont ? pFont->GetDocument() : nullptr; 109 m_pFont = pFont; 110 } 111 GetFontSizeH() const112float CPDF_TextState::TextData::GetFontSizeH() const { 113 return fabs(FXSYS_sqrt2(m_Matrix[0], m_Matrix[2]) * m_FontSize); 114 } 115 SetTextRenderingModeFromInt(int iMode,TextRenderingMode * mode)116bool SetTextRenderingModeFromInt(int iMode, TextRenderingMode* mode) { 117 if (iMode < 0 || iMode > 7) 118 return false; 119 *mode = static_cast<TextRenderingMode>(iMode); 120 return true; 121 } 122 TextRenderingModeIsClipMode(const TextRenderingMode & mode)123bool TextRenderingModeIsClipMode(const TextRenderingMode& mode) { 124 switch (mode) { 125 case TextRenderingMode::MODE_FILL_CLIP: 126 case TextRenderingMode::MODE_STROKE_CLIP: 127 case TextRenderingMode::MODE_FILL_STROKE_CLIP: 128 case TextRenderingMode::MODE_CLIP: 129 return true; 130 default: 131 return false; 132 } 133 } 134 TextRenderingModeIsStrokeMode(const TextRenderingMode & mode)135bool TextRenderingModeIsStrokeMode(const TextRenderingMode& mode) { 136 switch (mode) { 137 case TextRenderingMode::MODE_STROKE: 138 case TextRenderingMode::MODE_FILL_STROKE: 139 case TextRenderingMode::MODE_STROKE_CLIP: 140 case TextRenderingMode::MODE_FILL_STROKE_CLIP: 141 return true; 142 default: 143 return false; 144 } 145 } 146