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_allstates.h" 84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <algorithm> 104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/page/cpdf_pageobjectholder.h" 124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/page/cpdf_streamcontentparser.h" 134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_array.h" 144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_dictionary.h" 154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxge/cfx_graphstatedata.h" 16d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "third_party/base/stl_util.h" 174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. MoltmannCPDF_AllStates::CPDF_AllStates() 1933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann : m_TextLeading(0), m_TextRise(0), m_TextHorzScale(1.0f) {} 204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_AllStates::~CPDF_AllStates() {} 224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_AllStates::Copy(const CPDF_AllStates& src) { 244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CopyStates(src); 254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_TextMatrix = src.m_TextMatrix; 264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_ParentMatrix = src.m_ParentMatrix; 274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_CTM = src.m_CTM; 2833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann m_TextPos = src.m_TextPos; 2933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann m_TextLinePos = src.m_TextLinePos; 304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_TextLeading = src.m_TextLeading; 314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_TextRise = src.m_TextRise; 324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_TextHorzScale = src.m_TextHorzScale; 334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 35d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CPDF_AllStates::SetLineDash(CPDF_Array* pArray, float phase, float scale) { 364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_GraphState.SetLineDash(pArray, phase, scale); 374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_AllStates::ProcessExtGS(CPDF_Dictionary* pGS, 404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_StreamContentParser* pParser) { 414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (const auto& it : *pGS) { 42d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteString& key_str = it.first; 434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Object* pElement = it.second.get(); 444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Object* pObject = pElement ? pElement->GetDirect() : nullptr; 454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pObject) 464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t key = key_str.GetID(); 494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann switch (key) { 504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case FXBSTR_ID('L', 'W', 0, 0): 514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_GraphState.SetLineWidth(pObject->GetNumber()); 524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case FXBSTR_ID('L', 'C', 0, 0): 544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_GraphState.SetLineCap( 554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann static_cast<CFX_GraphStateData::LineCap>(pObject->GetInteger())); 564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case FXBSTR_ID('L', 'J', 0, 0): 584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_GraphState.SetLineJoin( 594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann static_cast<CFX_GraphStateData::LineJoin>(pObject->GetInteger())); 604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case FXBSTR_ID('M', 'L', 0, 0): 624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_GraphState.SetMiterLimit(pObject->GetNumber()); 634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case FXBSTR_ID('D', 0, 0, 0): { 654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Array* pDash = pObject->AsArray(); 664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pDash) 674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Array* pArray = pDash->GetArrayAt(0); 704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pArray) 714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann SetLineDash(pArray, pDash->GetNumberAt(1), 1.0f); 744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case FXBSTR_ID('R', 'I', 0, 0): 774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_GeneralState.SetRenderIntent(pObject->GetString()); 784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case FXBSTR_ID('F', 'o', 'n', 't'): { 804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Array* pFont = pObject->AsArray(); 814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pFont) 824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_TextState.SetFontSize(pFont->GetNumberAt(1)); 854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_TextState.SetFont(pParser->FindFont(pFont->GetStringAt(0))); 864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case FXBSTR_ID('T', 'R', 0, 0): 894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pGS->KeyExist("TR2")) { 904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case FXBSTR_ID('T', 'R', '2', 0): 934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_GeneralState.SetTR(pObject && !pObject->IsName() ? pObject : nullptr); 944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case FXBSTR_ID('B', 'M', 0, 0): { 964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Array* pArray = pObject->AsArray(); 974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_GeneralState.SetBlendMode(pArray ? pArray->GetStringAt(0) 984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann : pObject->GetString()); 994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_GeneralState.GetBlendType() > FXDIB_BLEND_MULTIPLY) 1004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pParser->GetPageObjectHolder()->SetBackgroundAlphaNeeded(true); 1014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 1024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case FXBSTR_ID('S', 'M', 'a', 's'): 1044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ToDictionary(pObject)) { 1054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_GeneralState.SetSoftMask(pObject); 1064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_GeneralState.SetSMaskMatrix(pParser->GetCurStates()->m_CTM); 1074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 1084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_GeneralState.SetSoftMask(nullptr); 1094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 1114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case FXBSTR_ID('C', 'A', 0, 0): 112d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_GeneralState.SetStrokeAlpha( 113d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pdfium::clamp(pObject->GetNumber(), 0.0f, 1.0f)); 1144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 1154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case FXBSTR_ID('c', 'a', 0, 0): 116d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_GeneralState.SetFillAlpha( 117d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pdfium::clamp(pObject->GetNumber(), 0.0f, 1.0f)); 1184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 1194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case FXBSTR_ID('O', 'P', 0, 0): 1204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_GeneralState.SetStrokeOP(!!pObject->GetInteger()); 1214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pGS->KeyExist("op")) 1224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_GeneralState.SetFillOP(!!pObject->GetInteger()); 1234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 1244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case FXBSTR_ID('o', 'p', 0, 0): 1254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_GeneralState.SetFillOP(!!pObject->GetInteger()); 1264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 1274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case FXBSTR_ID('O', 'P', 'M', 0): 1284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_GeneralState.SetOPMode(pObject->GetInteger()); 1294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 1304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case FXBSTR_ID('B', 'G', 0, 0): 1314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pGS->KeyExist("BG2")) { 1324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 1334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case FXBSTR_ID('B', 'G', '2', 0): 1354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_GeneralState.SetBG(pObject); 1364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 1374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case FXBSTR_ID('U', 'C', 'R', 0): 1384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pGS->KeyExist("UCR2")) { 1394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 1404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case FXBSTR_ID('U', 'C', 'R', '2'): 1424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_GeneralState.SetUCR(pObject); 1434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 1444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case FXBSTR_ID('H', 'T', 0, 0): 1454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_GeneralState.SetHT(pObject); 1464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 1474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case FXBSTR_ID('F', 'L', 0, 0): 1484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_GeneralState.SetFlatness(pObject->GetNumber()); 1494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 1504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case FXBSTR_ID('S', 'M', 0, 0): 1514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_GeneralState.SetSmoothness(pObject->GetNumber()); 1524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 1534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case FXBSTR_ID('S', 'A', 0, 0): 1544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_GeneralState.SetStrokeAdjust(!!pObject->GetInteger()); 1554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 1564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case FXBSTR_ID('A', 'I', 'S', 0): 1574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_GeneralState.SetAlphaSource(!!pObject->GetInteger()); 1584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 1594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case FXBSTR_ID('T', 'K', 0, 0): 1604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_GeneralState.SetTextKnockout(!!pObject->GetInteger()); 1614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 1624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_GeneralState.SetMatrix(m_CTM); 1654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 166