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