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()16 void CPDF_TextState::Emplace() {
17   m_Ref.Emplace();
18 }
19 
GetFont() const20 RetainPtr<CPDF_Font> CPDF_TextState::GetFont() const {
21   return m_Ref.GetObject()->m_pFont;
22 }
23 
SetFont(const RetainPtr<CPDF_Font> & pFont)24 void CPDF_TextState::SetFont(const RetainPtr<CPDF_Font>& pFont) {
25   m_Ref.GetPrivateCopy()->SetFont(pFont);
26 }
27 
GetFontSize() const28 float CPDF_TextState::GetFontSize() const {
29   return m_Ref.GetObject()->m_FontSize;
30 }
31 
SetFontSize(float size)32 void CPDF_TextState::SetFontSize(float size) {
33   m_Ref.GetPrivateCopy()->m_FontSize = size;
34 }
35 
GetMatrix() const36 const float* CPDF_TextState::GetMatrix() const {
37   return m_Ref.GetObject()->m_Matrix;
38 }
39 
GetMutableMatrix()40 float* CPDF_TextState::GetMutableMatrix() {
41   return m_Ref.GetPrivateCopy()->m_Matrix;
42 }
43 
GetCharSpace() const44 float CPDF_TextState::GetCharSpace() const {
45   return m_Ref.GetObject()->m_CharSpace;
46 }
47 
SetCharSpace(float sp)48 void CPDF_TextState::SetCharSpace(float sp) {
49   m_Ref.GetPrivateCopy()->m_CharSpace = sp;
50 }
51 
GetWordSpace() const52 float CPDF_TextState::GetWordSpace() const {
53   return m_Ref.GetObject()->m_WordSpace;
54 }
55 
SetWordSpace(float sp)56 void CPDF_TextState::SetWordSpace(float sp) {
57   m_Ref.GetPrivateCopy()->m_WordSpace = sp;
58 }
59 
GetFontSizeH() const60 float CPDF_TextState::GetFontSizeH() const {
61   return m_Ref.GetObject()->GetFontSizeH();
62 }
63 
GetTextMode() const64 TextRenderingMode CPDF_TextState::GetTextMode() const {
65   return m_Ref.GetObject()->m_TextMode;
66 }
67 
SetTextMode(TextRenderingMode mode)68 void CPDF_TextState::SetTextMode(TextRenderingMode mode) {
69   m_Ref.GetPrivateCopy()->m_TextMode = mode;
70 }
71 
GetCTM() const72 const float* CPDF_TextState::GetCTM() const {
73   return m_Ref.GetObject()->m_CTM;
74 }
75 
GetMutableCTM()76 float* CPDF_TextState::GetMutableCTM() {
77   return m_Ref.GetPrivateCopy()->m_CTM;
78 }
79 
80 CPDF_TextState::TextData::TextData() = default;
81 
TextData(const TextData & that)82 CPDF_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() const103 RetainPtr<CPDF_TextState::TextData> CPDF_TextState::TextData::Clone() const {
104   return pdfium::MakeRetain<CPDF_TextState::TextData>(*this);
105 }
106 
SetFont(const RetainPtr<CPDF_Font> & pFont)107 void CPDF_TextState::TextData::SetFont(const RetainPtr<CPDF_Font>& pFont) {
108   m_pDocument = pFont ? pFont->GetDocument() : nullptr;
109   m_pFont = pFont;
110 }
111 
GetFontSizeH() const112 float 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)116 bool 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)123 bool 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)135 bool 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