14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Copyright 2016 PDFium Authors. All rights reserved.
24d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be
34d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// found in the LICENSE file.
44d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
54d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
64d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/page/cpdf_textstate.h"
84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/font/cpdf_font.h"
104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/page/cpdf_docpagedata.h"
114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_document.h"
124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_TextState::CPDF_TextState() {}
144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_TextState::~CPDF_TextState() {}
154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_TextState::Emplace() {
174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_Ref.Emplace();
184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_Font* CPDF_TextState::GetFont() const {
214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return m_Ref.GetObject()->m_pFont;
224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_TextState::SetFont(CPDF_Font* pFont) {
254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_Ref.GetPrivateCopy()->SetFont(pFont);
264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_FLOAT CPDF_TextState::GetFontSize() const {
294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return m_Ref.GetObject()->m_FontSize;
304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_TextState::SetFontSize(FX_FLOAT size) {
334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_Ref.GetPrivateCopy()->m_FontSize = size;
344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst FX_FLOAT* CPDF_TextState::GetMatrix() const {
374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return m_Ref.GetObject()->m_Matrix;
384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_FLOAT* CPDF_TextState::GetMutableMatrix() {
414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return m_Ref.GetPrivateCopy()->m_Matrix;
424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_FLOAT CPDF_TextState::GetCharSpace() const {
454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return m_Ref.GetObject()->m_CharSpace;
464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_TextState::SetCharSpace(FX_FLOAT sp) {
494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_Ref.GetPrivateCopy()->m_CharSpace = sp;
504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_FLOAT CPDF_TextState::GetWordSpace() const {
534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return m_Ref.GetObject()->m_WordSpace;
544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_TextState::SetWordSpace(FX_FLOAT sp) {
574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_Ref.GetPrivateCopy()->m_WordSpace = sp;
584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_FLOAT CPDF_TextState::GetFontSizeV() const {
614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return m_Ref.GetObject()->GetFontSizeV();
624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_FLOAT CPDF_TextState::GetFontSizeH() const {
654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return m_Ref.GetObject()->GetFontSizeH();
664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_FLOAT CPDF_TextState::GetBaselineAngle() const {
694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return m_Ref.GetObject()->GetBaselineAngle();
704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_FLOAT CPDF_TextState::GetShearAngle() const {
734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return m_Ref.GetObject()->GetShearAngle();
744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannTextRenderingMode CPDF_TextState::GetTextMode() const {
774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return m_Ref.GetObject()->m_TextMode;
784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_TextState::SetTextMode(TextRenderingMode mode) {
814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_Ref.GetPrivateCopy()->m_TextMode = mode;
824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst FX_FLOAT* CPDF_TextState::GetCTM() const {
854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return m_Ref.GetObject()->m_CTM;
864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_FLOAT* CPDF_TextState::GetMutableCTM() {
894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return m_Ref.GetPrivateCopy()->m_CTM;
904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_TextState::TextData::TextData()
934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    : m_pFont(nullptr),
944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pDocument(nullptr),
954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_FontSize(1.0f),
964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_CharSpace(0),
974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_WordSpace(0),
984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_TextMode(TextRenderingMode::MODE_FILL) {
994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_Matrix[0] = m_Matrix[3] = 1.0f;
1004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_Matrix[1] = m_Matrix[2] = 0;
1014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_CTM[0] = m_CTM[3] = 1.0f;
1024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_CTM[1] = m_CTM[2] = 0;
1034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_TextState::TextData::TextData(const TextData& that)
1064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    : m_pFont(that.m_pFont),
1074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pDocument(that.m_pDocument),
1084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_FontSize(that.m_FontSize),
1094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_CharSpace(that.m_CharSpace),
1104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_WordSpace(that.m_WordSpace),
1114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_TextMode(that.m_TextMode) {
1124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (int i = 0; i < 4; ++i)
1134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_Matrix[i] = that.m_Matrix[i];
1144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (int i = 0; i < 4; ++i)
1164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_CTM[i] = that.m_CTM[i];
1174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_pDocument && m_pFont) {
1194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pFont = m_pDocument->GetPageData()->GetFont(m_pFont->GetFontDict());
1204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_TextState::TextData::~TextData() {
1244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_pDocument && m_pFont) {
1254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_DocPageData* pPageData = m_pDocument->GetPageData();
1264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (pPageData && !pPageData->IsForceClear())
1274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      pPageData->ReleaseFont(m_pFont->GetFontDict());
1284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_TextState::TextData::SetFont(CPDF_Font* pFont) {
1324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Document* pDoc = m_pDocument;
1334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_DocPageData* pPageData = pDoc ? pDoc->GetPageData() : nullptr;
1344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pPageData && m_pFont && !pPageData->IsForceClear())
1354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pPageData->ReleaseFont(m_pFont->GetFontDict());
1364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pDocument = pFont ? pFont->m_pDocument : nullptr;
1384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pFont = pFont;
1394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_FLOAT CPDF_TextState::TextData::GetFontSizeV() const {
1424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return FXSYS_fabs(FXSYS_sqrt2(m_Matrix[1], m_Matrix[3]) * m_FontSize);
1434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_FLOAT CPDF_TextState::TextData::GetFontSizeH() const {
1464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return FXSYS_fabs(FXSYS_sqrt2(m_Matrix[0], m_Matrix[2]) * m_FontSize);
1474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_FLOAT CPDF_TextState::TextData::GetBaselineAngle() const {
1504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return FXSYS_atan2(m_Matrix[2], m_Matrix[0]);
1514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_FLOAT CPDF_TextState::TextData::GetShearAngle() const {
1544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return GetBaselineAngle() + FXSYS_atan2(m_Matrix[1], m_Matrix[3]);
1554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool SetTextRenderingModeFromInt(int iMode, TextRenderingMode* mode) {
1584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (iMode < 0 || iMode > 7)
1594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
1604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  *mode = static_cast<TextRenderingMode>(iMode);
1614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
1624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool TextRenderingModeIsClipMode(const TextRenderingMode& mode) {
1654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  switch (mode) {
1664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case TextRenderingMode::MODE_FILL_CLIP:
1674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case TextRenderingMode::MODE_STROKE_CLIP:
1684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case TextRenderingMode::MODE_FILL_STROKE_CLIP:
1694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case TextRenderingMode::MODE_CLIP:
1704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return true;
1714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    default:
1724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return false;
1734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool TextRenderingModeIsStrokeMode(const TextRenderingMode& mode) {
1774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  switch (mode) {
1784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case TextRenderingMode::MODE_STROKE:
1794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case TextRenderingMode::MODE_FILL_STROKE:
1804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case TextRenderingMode::MODE_STROKE_CLIP:
1814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case TextRenderingMode::MODE_FILL_STROKE_CLIP:
1824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return true;
1834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    default:
1844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return false;
1854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
187