diff options
Diffstat (limited to 'core/fpdfapi')
-rw-r--r-- | core/fpdfapi/fpdf_page/cpdf_graphicstates.h | 2 | ||||
-rw-r--r-- | core/fpdfapi/fpdf_page/cpdf_textstate.cpp | 99 | ||||
-rw-r--r-- | core/fpdfapi/fpdf_page/cpdf_textstate.h | 53 | ||||
-rw-r--r-- | core/fpdfapi/fpdf_page/cpdf_textstatedata.cpp | 100 | ||||
-rw-r--r-- | core/fpdfapi/fpdf_page/include/cpdf_textstate.h | 91 | ||||
-rw-r--r-- | core/fpdfapi/fpdf_page/include/cpdf_textstatedata.h | 53 |
6 files changed, 190 insertions, 208 deletions
diff --git a/core/fpdfapi/fpdf_page/cpdf_graphicstates.h b/core/fpdfapi/fpdf_page/cpdf_graphicstates.h index fb404ffb72..5059f3c5a4 100644 --- a/core/fpdfapi/fpdf_page/cpdf_graphicstates.h +++ b/core/fpdfapi/fpdf_page/cpdf_graphicstates.h @@ -8,9 +8,9 @@ #define CORE_FPDFAPI_FPDF_PAGE_CPDF_GRAPHICSTATES_H_ #include "core/fpdfapi/fpdf_page/cpdf_colorstate.h" -#include "core/fpdfapi/fpdf_page/cpdf_textstate.h" #include "core/fpdfapi/fpdf_page/include/cpdf_clippath.h" #include "core/fpdfapi/fpdf_page/include/cpdf_generalstate.h" +#include "core/fpdfapi/fpdf_page/include/cpdf_textstate.h" #include "core/fxge/include/cfx_graphstate.h" class CPDF_GraphicStates { diff --git a/core/fpdfapi/fpdf_page/cpdf_textstate.cpp b/core/fpdfapi/fpdf_page/cpdf_textstate.cpp index feb70aeecc..4967cca4e8 100644 --- a/core/fpdfapi/fpdf_page/cpdf_textstate.cpp +++ b/core/fpdfapi/fpdf_page/cpdf_textstate.cpp @@ -4,7 +4,7 @@ // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -#include "core/fpdfapi/fpdf_page/cpdf_textstate.h" +#include "core/fpdfapi/fpdf_page/include/cpdf_textstate.h" #include "core/fpdfapi/fpdf_font/include/cpdf_font.h" #include "core/fpdfapi/fpdf_page/pageint.h" @@ -88,3 +88,100 @@ const FX_FLOAT* CPDF_TextState::GetCTM() const { FX_FLOAT* CPDF_TextState::GetMutableCTM() { return m_Ref.GetPrivateCopy()->m_CTM; } + +CPDF_TextState::TextData::TextData() + : m_pFont(nullptr), + m_pDocument(nullptr), + m_FontSize(1.0f), + m_CharSpace(0), + m_WordSpace(0), + m_TextMode(TextRenderingMode::MODE_FILL) { + m_Matrix[0] = m_Matrix[3] = 1.0f; + m_Matrix[1] = m_Matrix[2] = 0; + m_CTM[0] = m_CTM[3] = 1.0f; + m_CTM[1] = m_CTM[2] = 0; +} + +CPDF_TextState::TextData::TextData(const TextData& that) + : m_pFont(that.m_pFont), + m_pDocument(that.m_pDocument), + m_FontSize(that.m_FontSize), + m_CharSpace(that.m_CharSpace), + m_WordSpace(that.m_WordSpace), + m_TextMode(that.m_TextMode) { + for (int i = 0; i < 4; ++i) + m_Matrix[i] = that.m_Matrix[i]; + + for (int i = 0; i < 4; ++i) + m_CTM[i] = that.m_CTM[i]; + + if (m_pDocument && m_pFont) { + m_pFont = + m_pDocument->GetPageData()->GetFont(m_pFont->GetFontDict(), FALSE); + } +} + +CPDF_TextState::TextData::~TextData() { + if (m_pDocument && m_pFont) { + CPDF_DocPageData* pPageData = m_pDocument->GetPageData(); + if (pPageData && !pPageData->IsForceClear()) + pPageData->ReleaseFont(m_pFont->GetFontDict()); + } +} + +void CPDF_TextState::TextData::SetFont(CPDF_Font* pFont) { + CPDF_Document* pDoc = m_pDocument; + CPDF_DocPageData* pPageData = pDoc ? pDoc->GetPageData() : nullptr; + if (pPageData && m_pFont && !pPageData->IsForceClear()) + pPageData->ReleaseFont(m_pFont->GetFontDict()); + + m_pDocument = pFont ? pFont->m_pDocument : nullptr; + m_pFont = pFont; +} + +FX_FLOAT CPDF_TextState::TextData::GetFontSizeV() const { + return FXSYS_fabs(FXSYS_sqrt2(m_Matrix[1], m_Matrix[3]) * m_FontSize); +} + +FX_FLOAT CPDF_TextState::TextData::GetFontSizeH() const { + return FXSYS_fabs(FXSYS_sqrt2(m_Matrix[0], m_Matrix[2]) * m_FontSize); +} + +FX_FLOAT CPDF_TextState::TextData::GetBaselineAngle() const { + return FXSYS_atan2(m_Matrix[2], m_Matrix[0]); +} + +FX_FLOAT CPDF_TextState::TextData::GetShearAngle() const { + return GetBaselineAngle() + FXSYS_atan2(m_Matrix[1], m_Matrix[3]); +} + +bool SetTextRenderingModeFromInt(int iMode, TextRenderingMode* mode) { + if (iMode < 0 || iMode > 7) + return false; + *mode = static_cast<TextRenderingMode>(iMode); + return true; +} + +bool TextRenderingModeIsClipMode(const TextRenderingMode& mode) { + switch (mode) { + case TextRenderingMode::MODE_FILL_CLIP: + case TextRenderingMode::MODE_STROKE_CLIP: + case TextRenderingMode::MODE_FILL_STROKE_CLIP: + case TextRenderingMode::MODE_CLIP: + return true; + default: + return false; + } +} + +bool TextRenderingModeIsStrokeMode(const TextRenderingMode& mode) { + switch (mode) { + case TextRenderingMode::MODE_STROKE: + case TextRenderingMode::MODE_FILL_STROKE: + case TextRenderingMode::MODE_STROKE_CLIP: + case TextRenderingMode::MODE_FILL_STROKE_CLIP: + return true; + default: + return false; + } +} diff --git a/core/fpdfapi/fpdf_page/cpdf_textstate.h b/core/fpdfapi/fpdf_page/cpdf_textstate.h deleted file mode 100644 index 87f0b5cef4..0000000000 --- a/core/fpdfapi/fpdf_page/cpdf_textstate.h +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2016 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef CORE_FPDFAPI_FPDF_PAGE_CPDF_TEXTSTATE_H_ -#define CORE_FPDFAPI_FPDF_PAGE_CPDF_TEXTSTATE_H_ - -#include "core/fpdfapi/fpdf_page/include/cpdf_textstatedata.h" -#include "core/fxcrt/include/cfx_count_ref.h" -#include "core/fxcrt/include/fx_basic.h" - -class CPDF_Font; - -class CPDF_TextState { - public: - CPDF_TextState(); - ~CPDF_TextState(); - - void Emplace(); - - CPDF_Font* GetFont() const; - void SetFont(CPDF_Font* pFont); - - FX_FLOAT GetFontSize() const; - void SetFontSize(FX_FLOAT size); - - const FX_FLOAT* GetMatrix() const; - FX_FLOAT* GetMutableMatrix(); - - FX_FLOAT GetCharSpace() const; - void SetCharSpace(FX_FLOAT sp); - - FX_FLOAT GetWordSpace() const; - void SetWordSpace(FX_FLOAT sp); - - FX_FLOAT GetFontSizeV() const; - FX_FLOAT GetFontSizeH() const; - FX_FLOAT GetBaselineAngle() const; - FX_FLOAT GetShearAngle() const; - - TextRenderingMode GetTextMode() const; - void SetTextMode(TextRenderingMode mode); - - const FX_FLOAT* GetCTM() const; - FX_FLOAT* GetMutableCTM(); - - private: - CFX_CountRef<CPDF_TextStateData> m_Ref; -}; - -#endif // CORE_FPDFAPI_FPDF_PAGE_CPDF_TEXTSTATE_H_ diff --git a/core/fpdfapi/fpdf_page/cpdf_textstatedata.cpp b/core/fpdfapi/fpdf_page/cpdf_textstatedata.cpp deleted file mode 100644 index 17c33a012c..0000000000 --- a/core/fpdfapi/fpdf_page/cpdf_textstatedata.cpp +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright 2016 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "core/fpdfapi/fpdf_page/include/cpdf_textstatedata.h" - -#include "core/fpdfapi/fpdf_font/include/cpdf_font.h" -#include "core/fpdfapi/fpdf_page/pageint.h" -#include "core/fpdfapi/fpdf_parser/include/cpdf_document.h" - -bool SetTextRenderingModeFromInt(int iMode, TextRenderingMode* mode) { - if (iMode < 0 || iMode > 7) - return false; - *mode = static_cast<TextRenderingMode>(iMode); - return true; -} - -bool TextRenderingModeIsClipMode(const TextRenderingMode& mode) { - switch (mode) { - case TextRenderingMode::MODE_FILL_CLIP: - case TextRenderingMode::MODE_STROKE_CLIP: - case TextRenderingMode::MODE_FILL_STROKE_CLIP: - case TextRenderingMode::MODE_CLIP: - return true; - default: - return false; - } -} - -bool TextRenderingModeIsStrokeMode(const TextRenderingMode& mode) { - switch (mode) { - case TextRenderingMode::MODE_STROKE: - case TextRenderingMode::MODE_FILL_STROKE: - case TextRenderingMode::MODE_STROKE_CLIP: - case TextRenderingMode::MODE_FILL_STROKE_CLIP: - return true; - default: - return false; - } -} - -CPDF_TextStateData::CPDF_TextStateData() - : m_pFont(nullptr), - m_pDocument(nullptr), - m_FontSize(1.0f), - m_CharSpace(0), - m_WordSpace(0), - m_TextMode(TextRenderingMode::MODE_FILL) { - m_Matrix[0] = m_Matrix[3] = 1.0f; - m_Matrix[1] = m_Matrix[2] = 0; - m_CTM[0] = m_CTM[3] = 1.0f; - m_CTM[1] = m_CTM[2] = 0; -} - -CPDF_TextStateData::CPDF_TextStateData(const CPDF_TextStateData& src) { - if (this == &src) - return; - - FXSYS_memcpy(this, &src, sizeof(CPDF_TextStateData)); - if (m_pDocument && m_pFont) { - m_pFont = - m_pDocument->GetPageData()->GetFont(m_pFont->GetFontDict(), FALSE); - } -} - -CPDF_TextStateData::~CPDF_TextStateData() { - if (m_pDocument && m_pFont) { - CPDF_DocPageData* pPageData = m_pDocument->GetPageData(); - if (pPageData && !pPageData->IsForceClear()) - pPageData->ReleaseFont(m_pFont->GetFontDict()); - } -} - -void CPDF_TextStateData::SetFont(CPDF_Font* pFont) { - CPDF_Document* pDoc = m_pDocument; - CPDF_DocPageData* pPageData = pDoc ? pDoc->GetPageData() : nullptr; - if (pPageData && m_pFont && !pPageData->IsForceClear()) - pPageData->ReleaseFont(m_pFont->GetFontDict()); - - m_pDocument = pFont ? pFont->m_pDocument : nullptr; - m_pFont = pFont; -} - -FX_FLOAT CPDF_TextStateData::GetFontSizeV() const { - return FXSYS_fabs(FXSYS_sqrt2(m_Matrix[1], m_Matrix[3]) * m_FontSize); -} - -FX_FLOAT CPDF_TextStateData::GetFontSizeH() const { - return FXSYS_fabs(FXSYS_sqrt2(m_Matrix[0], m_Matrix[2]) * m_FontSize); -} - -FX_FLOAT CPDF_TextStateData::GetBaselineAngle() const { - return FXSYS_atan2(m_Matrix[2], m_Matrix[0]); -} - -FX_FLOAT CPDF_TextStateData::GetShearAngle() const { - return GetBaselineAngle() + FXSYS_atan2(m_Matrix[1], m_Matrix[3]); -} diff --git a/core/fpdfapi/fpdf_page/include/cpdf_textstate.h b/core/fpdfapi/fpdf_page/include/cpdf_textstate.h new file mode 100644 index 0000000000..b457026bc8 --- /dev/null +++ b/core/fpdfapi/fpdf_page/include/cpdf_textstate.h @@ -0,0 +1,91 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_FPDF_PAGE_INCLUDE_CPDF_TEXTSTATE_H_ +#define CORE_FPDFAPI_FPDF_PAGE_INCLUDE_CPDF_TEXTSTATE_H_ + +#include "core/fxcrt/include/cfx_count_ref.h" +#include "core/fxcrt/include/fx_basic.h" + +class CPDF_Document; +class CPDF_Font; + +// See PDF Reference 1.7, page 402, table 5.3. +enum class TextRenderingMode { + MODE_FILL = 0, + MODE_STROKE = 1, + MODE_FILL_STROKE = 2, + MODE_INVISIBLE = 3, + MODE_FILL_CLIP = 4, + MODE_STROKE_CLIP = 5, + MODE_FILL_STROKE_CLIP = 6, + MODE_CLIP = 7, +}; + +class CPDF_TextState { + public: + CPDF_TextState(); + ~CPDF_TextState(); + + void Emplace(); + + CPDF_Font* GetFont() const; + void SetFont(CPDF_Font* pFont); + + FX_FLOAT GetFontSize() const; + void SetFontSize(FX_FLOAT size); + + const FX_FLOAT* GetMatrix() const; + FX_FLOAT* GetMutableMatrix(); + + FX_FLOAT GetCharSpace() const; + void SetCharSpace(FX_FLOAT sp); + + FX_FLOAT GetWordSpace() const; + void SetWordSpace(FX_FLOAT sp); + + FX_FLOAT GetFontSizeV() const; + FX_FLOAT GetFontSizeH() const; + FX_FLOAT GetBaselineAngle() const; + FX_FLOAT GetShearAngle() const; + + TextRenderingMode GetTextMode() const; + void SetTextMode(TextRenderingMode mode); + + const FX_FLOAT* GetCTM() const; + FX_FLOAT* GetMutableCTM(); + + private: + class TextData { + public: + TextData(); + TextData(const TextData& src); + ~TextData(); + + void SetFont(CPDF_Font* pFont); + FX_FLOAT GetFontSizeV() const; + FX_FLOAT GetFontSizeH() const; + FX_FLOAT GetBaselineAngle() const; + FX_FLOAT GetShearAngle() const; + + CPDF_Font* m_pFont; + CPDF_Document* m_pDocument; + FX_FLOAT m_FontSize; + FX_FLOAT m_CharSpace; + FX_FLOAT m_WordSpace; + TextRenderingMode m_TextMode; + FX_FLOAT m_Matrix[4]; + FX_FLOAT m_CTM[4]; + }; + + CFX_CountRef<TextData> m_Ref; +}; + +bool SetTextRenderingModeFromInt(int iMode, TextRenderingMode* mode); +bool TextRenderingModeIsClipMode(const TextRenderingMode& mode); +bool TextRenderingModeIsStrokeMode(const TextRenderingMode& mode); + +#endif // CORE_FPDFAPI_FPDF_PAGE_INCLUDE_CPDF_TEXTSTATE_H_ diff --git a/core/fpdfapi/fpdf_page/include/cpdf_textstatedata.h b/core/fpdfapi/fpdf_page/include/cpdf_textstatedata.h deleted file mode 100644 index f3d669690c..0000000000 --- a/core/fpdfapi/fpdf_page/include/cpdf_textstatedata.h +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2016 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef CORE_FPDFAPI_FPDF_PAGE_INCLUDE_CPDF_TEXTSTATEDATA_H_ -#define CORE_FPDFAPI_FPDF_PAGE_INCLUDE_CPDF_TEXTSTATEDATA_H_ - -#include "core/fxcrt/include/fx_system.h" - -class CPDF_Font; -class CPDF_Document; - -// See PDF Reference 1.7, page 402, table 5.3. -enum class TextRenderingMode { - MODE_FILL = 0, - MODE_STROKE = 1, - MODE_FILL_STROKE = 2, - MODE_INVISIBLE = 3, - MODE_FILL_CLIP = 4, - MODE_STROKE_CLIP = 5, - MODE_FILL_STROKE_CLIP = 6, - MODE_CLIP = 7, -}; - -bool SetTextRenderingModeFromInt(int iMode, TextRenderingMode* mode); -bool TextRenderingModeIsClipMode(const TextRenderingMode& mode); -bool TextRenderingModeIsStrokeMode(const TextRenderingMode& mode); - -class CPDF_TextStateData { - public: - CPDF_TextStateData(); - CPDF_TextStateData(const CPDF_TextStateData& src); - ~CPDF_TextStateData(); - - void SetFont(CPDF_Font* pFont); - FX_FLOAT GetFontSizeV() const; - FX_FLOAT GetFontSizeH() const; - FX_FLOAT GetBaselineAngle() const; - FX_FLOAT GetShearAngle() const; - - CPDF_Font* m_pFont; - CPDF_Document* m_pDocument; - FX_FLOAT m_FontSize; - FX_FLOAT m_CharSpace; - FX_FLOAT m_WordSpace; - TextRenderingMode m_TextMode; - FX_FLOAT m_Matrix[4]; - FX_FLOAT m_CTM[4]; -}; - -#endif // CORE_FPDFAPI_FPDF_PAGE_INCLUDE_CPDF_TEXTSTATEDATA_H_ |