1e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved. 2e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Use of this source code is governed by a BSD-style license that can be 3e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// found in the LICENSE file. 4ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 5e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 7ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/include/fpdfdoc/fpdf_doc.h" 8ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 9ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic int32_t FPDFDOC_OCG_FindGroup(const CPDF_Object* pObject, 10ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CPDF_Dictionary* pGroupDict) { 11ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pObject || !pGroupDict) 12ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 13ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 14ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (const CPDF_Array* pArray = pObject->AsArray()) { 15ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD dwCount = pArray->GetCount(); 16ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (FX_DWORD i = 0; i < dwCount; i++) { 17ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pArray->GetDict(i) == pGroupDict) 18ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return i; 19e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 20e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return -1; 21ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 22ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pObject->GetDict() == pGroupDict ? 0 : -1; 23e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 24ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic FX_BOOL FPDFDOC_OCG_HasIntent(const CPDF_Dictionary* pDict, 25ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_ByteStringC& csElement, 26ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_ByteStringC& csDef = "") { 27ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* pIntent = pDict->GetElementValue("Intent"); 28ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pIntent) { 29ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return csElement == csDef; 30ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 31ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString bsIntent; 32ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (CPDF_Array* pArray = pIntent->AsArray()) { 33ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD dwCount = pArray->GetCount(); 34ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (FX_DWORD i = 0; i < dwCount; i++) { 35ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bsIntent = pArray->GetString(i); 36ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bsIntent == "All" || bsIntent == csElement) 37ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 38e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 39ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 40ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 41ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bsIntent = pIntent->GetString(); 42ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return bsIntent == "All" || bsIntent == csElement; 43e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 44ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic CPDF_Dictionary* FPDFDOC_OCG_GetConfig(CPDF_Document* pDoc, 45ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CPDF_Dictionary* pOCGDict, 46ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_ByteStringC& bsState) { 47ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(pDoc && pOCGDict); 48ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pOCProperties = pDoc->GetRoot()->GetDict("OCProperties"); 49ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pOCProperties) { 50ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return NULL; 51ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 52ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Array* pOCGs = pOCProperties->GetArray("OCGs"); 53ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pOCGs) { 54ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return NULL; 55ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 56ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (FPDFDOC_OCG_FindGroup(pOCGs, pOCGDict) < 0) { 57ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return NULL; 58ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 59ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pConfig = pOCProperties->GetDict("D"); 60ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Array* pConfigs = pOCProperties->GetArray("Configs"); 61ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pConfigs) { 62ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pFind; 63ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iCount = pConfigs->GetCount(); 64ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int32_t i = 0; i < iCount; i++) { 65ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pFind = pConfigs->GetDict(i); 66ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pFind) { 67ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 68ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 69ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!FPDFDOC_OCG_HasIntent(pFind, "View", "View")) { 70ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 71ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 72ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pConfig = pFind; 73ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 74e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 75ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 76ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pConfig; 77e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 78ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic CFX_ByteString FPDFDOC_OCG_GetUsageTypeString( 79ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_OCContext::UsageType eType) { 80ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString csState = "View"; 81ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (eType == CPDF_OCContext::Design) { 82ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann csState = "Design"; 83ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (eType == CPDF_OCContext::Print) { 84ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann csState = "Print"; 85ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (eType == CPDF_OCContext::Export) { 86ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann csState = "Export"; 87ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 88ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return csState; 89e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 90ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_OCContext::CPDF_OCContext(CPDF_Document* pDoc, UsageType eUsageType) { 91ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(pDoc); 92ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pDocument = pDoc; 93ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_eUsageType = eUsageType; 94e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 95ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_OCContext::~CPDF_OCContext() { 96ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_OCGStates.clear(); 97e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 98ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_OCContext::LoadOCGStateFromConfig(const CFX_ByteStringC& csConfig, 99ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CPDF_Dictionary* pOCGDict, 100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL& bValidConfig) const { 101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pConfig = 102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FPDFDOC_OCG_GetConfig(m_pDocument, pOCGDict, csConfig); 103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pConfig) { 104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bValidConfig = TRUE; 107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bState = pConfig->GetString("BaseState", "ON") != "OFF"; 108ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Array* pArray = pConfig->GetArray("ON"); 109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pArray) { 110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (FPDFDOC_OCG_FindGroup(pArray, pOCGDict) >= 0) { 111ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bState = TRUE; 112e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 113ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 114ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pArray = pConfig->GetArray("OFF"); 115ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pArray) { 116ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (FPDFDOC_OCG_FindGroup(pArray, pOCGDict) >= 0) { 117ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bState = FALSE; 118e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 119ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 120ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pArray = pConfig->GetArray("AS"); 121ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pArray) { 122ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString csFind = csConfig + "State"; 123ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iCount = pArray->GetCount(); 124ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int32_t i = 0; i < iCount; i++) { 125ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pUsage = pArray->GetDict(i); 126ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pUsage) { 127ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 128ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 129ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pUsage->GetString("Event", "View") != csConfig) { 130ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 131ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 132ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Array* pOCGs = pUsage->GetArray("OCGs"); 133ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pOCGs) { 134ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 135ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 136ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (FPDFDOC_OCG_FindGroup(pOCGs, pOCGDict) < 0) { 137ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 138ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 139ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pState = pUsage->GetDict(csConfig); 140ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pState) { 141ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 142ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 143ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bState = pState->GetString(csFind) != "OFF"; 144e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 145ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 146ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return bState; 147e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 148ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_OCContext::LoadOCGState(const CPDF_Dictionary* pOCGDict) const { 149ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!FPDFDOC_OCG_HasIntent(pOCGDict, "View", "View")) { 150ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 151ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 152ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString csState = FPDFDOC_OCG_GetUsageTypeString(m_eUsageType); 153ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pUsage = pOCGDict->GetDict("Usage"); 154ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pUsage) { 155ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pState = pUsage->GetDict(csState); 156ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pState) { 157ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString csFind = csState + "State"; 158ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pState->KeyExist(csFind)) { 159ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pState->GetString(csFind) != "OFF"; 160ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 161e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 162ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (csState != "View") { 163ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pState = pUsage->GetDict("View"); 164ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pState && pState->KeyExist("ViewState")) { 165ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pState->GetString("ViewState") != "OFF"; 166ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 167e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 168ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 169ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bDefValid = FALSE; 170ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return LoadOCGStateFromConfig(csState, pOCGDict, bDefValid); 171e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 172ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 173ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_OCContext::GetOCGVisible(const CPDF_Dictionary* pOCGDict) { 174ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pOCGDict) 175ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 176ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 177ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const auto it = m_OCGStates.find(pOCGDict); 178ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (it != m_OCGStates.end()) 179ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return it->second; 180ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 181ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bState = LoadOCGState(pOCGDict); 182ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_OCGStates[pOCGDict] = bState; 183ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return bState; 184e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 185ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 186ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_OCContext::GetOCGVE(CPDF_Array* pExpression, 187ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bFromConfig, 188ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int nLevel) { 189ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (nLevel > 32) { 190ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 191ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 192ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pExpression) { 193ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 194ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 195ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iCount = pExpression->GetCount(); 196ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* pOCGObj; 197ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString csOperator = pExpression->GetString(0); 198ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (csOperator == "Not") { 199ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pOCGObj = pExpression->GetElementValue(1); 200ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pOCGObj) 201ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 202ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (CPDF_Dictionary* pDict = pOCGObj->AsDictionary()) 203ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return !(bFromConfig ? LoadOCGState(pDict) : GetOCGVisible(pDict)); 204ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (CPDF_Array* pArray = pOCGObj->AsArray()) 205ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return !GetOCGVE(pArray, bFromConfig, nLevel + 1); 206ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 207ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 208ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (csOperator == "Or" || csOperator == "And") { 209ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bValue = FALSE; 210ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int32_t i = 1; i < iCount; i++) { 211ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pOCGObj = pExpression->GetElementValue(1); 212ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pOCGObj) { 213ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 214ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 215ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bItem = FALSE; 216ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (CPDF_Dictionary* pDict = pOCGObj->AsDictionary()) 217ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bItem = bFromConfig ? LoadOCGState(pDict) : GetOCGVisible(pDict); 218ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann else if (CPDF_Array* pArray = pOCGObj->AsArray()) 219ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bItem = GetOCGVE(pArray, bFromConfig, nLevel + 1); 220ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 221ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (i == 1) { 222ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bValue = bItem; 223ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 224ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (csOperator == "Or") { 225ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bValue = bValue || bItem; 226e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 227ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bValue = bValue && bItem; 228e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 229ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 230e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 231ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return bValue; 232ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 233ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 234e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 235ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_OCContext::LoadOCMDState(const CPDF_Dictionary* pOCMDDict, 236ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bFromConfig) { 237ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Array* pVE = pOCMDDict->GetArray("VE"); 238ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pVE) { 239ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return GetOCGVE(pVE, bFromConfig); 240ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 241ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString csP = pOCMDDict->GetString("P", "AnyOn"); 242ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* pOCGObj = pOCMDDict->GetElementValue("OCGs"); 243ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pOCGObj) 244ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 245ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (const CPDF_Dictionary* pDict = pOCGObj->AsDictionary()) 246ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return bFromConfig ? LoadOCGState(pDict) : GetOCGVisible(pDict); 247ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 248ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Array* pArray = pOCGObj->AsArray(); 249ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pArray) 250ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 251ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 252ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bState = FALSE; 253ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (csP == "AllOn" || csP == "AllOff") { 254ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bState = TRUE; 255ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 256ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iCount = pArray->GetCount(); 257ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int32_t i = 0; i < iCount; i++) { 258ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bItem = TRUE; 259ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pItemDict = pArray->GetDict(i); 260ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pItemDict) 261ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bItem = bFromConfig ? LoadOCGState(pItemDict) : GetOCGVisible(pItemDict); 262ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 263ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((csP == "AnyOn" && bItem) || (csP == "AnyOff" && !bItem)) 264ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 265ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((csP == "AllOn" && !bItem) || (csP == "AllOff" && bItem)) 266ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 267ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 268ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return bState; 269e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 270ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_OCContext::CheckOCGVisible(const CPDF_Dictionary* pOCGDict) { 271ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pOCGDict) { 272ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 273ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 274ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString csType = pOCGDict->GetString("Type", "OCG"); 275ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (csType == "OCG") { 276ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return GetOCGVisible(pOCGDict); 277ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 278ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return LoadOCMDState(pOCGDict, FALSE); 279e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 280ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_OCContext::ResetOCContext() { 281ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_OCGStates.clear(); 282e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 283