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