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