| OLD | NEW |
| 1 // Copyright 2016 PDFium Authors. All rights reserved. | 1 // Copyright 2016 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | 6 |
| 7 #include "core/fpdfdoc/include/cpdf_occontext.h" | 7 #include "core/fpdfdoc/include/cpdf_occontext.h" |
| 8 | 8 |
| 9 #include "core/fpdfapi/fpdf_page/include/cpdf_pageobject.h" | 9 #include "core/fpdfapi/fpdf_page/include/cpdf_pageobject.h" |
| 10 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h" | 10 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h" |
| 11 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h" | 11 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h" |
| 12 | 12 |
| 13 namespace { | 13 namespace { |
| 14 | 14 |
| 15 int32_t FindGroup(const CPDF_Array* pArray, const CPDF_Dictionary* pGroupDict) { | 15 int32_t FindGroup(const CPDF_Array* pArray, const CPDF_Dictionary* pGroupDict) { |
| 16 if (!pArray || !pGroupDict) | 16 if (!pArray || !pGroupDict) |
| 17 return -1; | 17 return -1; |
| 18 | 18 |
| 19 for (size_t i = 0; i < pArray->GetCount(); i++) { | 19 for (size_t i = 0; i < pArray->GetCount(); i++) { |
| 20 if (pArray->GetDictAt(i) == pGroupDict) | 20 if (pArray->GetDictAt(i) == pGroupDict) |
| 21 return i; | 21 return i; |
| 22 } | 22 } |
| 23 return -1; | 23 return -1; |
| 24 } | 24 } |
| 25 | 25 |
| 26 bool HasIntent(const CPDF_Dictionary* pDict, | 26 bool HasIntent(const CPDF_Dictionary* pDict, |
| 27 const CFX_ByteStringC& csElement, | 27 const CFX_ByteStringC& csElement, |
| 28 const CFX_ByteStringC& csDef) { | 28 const CFX_ByteStringC& csDef) { |
| 29 CPDF_Object* pIntent = pDict->GetDirectObjectBy("Intent"); | 29 CPDF_Object* pIntent = pDict->GetDirectObjectFor("Intent"); |
| 30 if (!pIntent) | 30 if (!pIntent) |
| 31 return csElement == csDef; | 31 return csElement == csDef; |
| 32 | 32 |
| 33 CFX_ByteString bsIntent; | 33 CFX_ByteString bsIntent; |
| 34 if (CPDF_Array* pArray = pIntent->AsArray()) { | 34 if (CPDF_Array* pArray = pIntent->AsArray()) { |
| 35 for (size_t i = 0; i < pArray->GetCount(); i++) { | 35 for (size_t i = 0; i < pArray->GetCount(); i++) { |
| 36 bsIntent = pArray->GetStringAt(i); | 36 bsIntent = pArray->GetStringAt(i); |
| 37 if (bsIntent == "All" || bsIntent == csElement) | 37 if (bsIntent == "All" || bsIntent == csElement) |
| 38 return true; | 38 return true; |
| 39 } | 39 } |
| 40 return false; | 40 return false; |
| 41 } | 41 } |
| 42 bsIntent = pIntent->GetString(); | 42 bsIntent = pIntent->GetString(); |
| 43 return bsIntent == "All" || bsIntent == csElement; | 43 return bsIntent == "All" || bsIntent == csElement; |
| 44 } | 44 } |
| 45 | 45 |
| 46 CPDF_Dictionary* GetConfig(CPDF_Document* pDoc, | 46 CPDF_Dictionary* GetConfig(CPDF_Document* pDoc, |
| 47 const CPDF_Dictionary* pOCGDict) { | 47 const CPDF_Dictionary* pOCGDict) { |
| 48 ASSERT(pOCGDict); | 48 ASSERT(pOCGDict); |
| 49 CPDF_Dictionary* pOCProperties = pDoc->GetRoot()->GetDictBy("OCProperties"); | 49 CPDF_Dictionary* pOCProperties = pDoc->GetRoot()->GetDictFor("OCProperties"); |
| 50 if (!pOCProperties) | 50 if (!pOCProperties) |
| 51 return nullptr; | 51 return nullptr; |
| 52 | 52 |
| 53 CPDF_Array* pOCGs = pOCProperties->GetArrayBy("OCGs"); | 53 CPDF_Array* pOCGs = pOCProperties->GetArrayFor("OCGs"); |
| 54 if (!pOCGs) | 54 if (!pOCGs) |
| 55 return nullptr; | 55 return nullptr; |
| 56 | 56 |
| 57 if (FindGroup(pOCGs, pOCGDict) < 0) | 57 if (FindGroup(pOCGs, pOCGDict) < 0) |
| 58 return nullptr; | 58 return nullptr; |
| 59 | 59 |
| 60 CPDF_Dictionary* pConfig = pOCProperties->GetDictBy("D"); | 60 CPDF_Dictionary* pConfig = pOCProperties->GetDictFor("D"); |
| 61 CPDF_Array* pConfigs = pOCProperties->GetArrayBy("Configs"); | 61 CPDF_Array* pConfigs = pOCProperties->GetArrayFor("Configs"); |
| 62 if (!pConfigs) | 62 if (!pConfigs) |
| 63 return pConfig; | 63 return pConfig; |
| 64 | 64 |
| 65 for (size_t i = 0; i < pConfigs->GetCount(); i++) { | 65 for (size_t i = 0; i < pConfigs->GetCount(); i++) { |
| 66 CPDF_Dictionary* pFind = pConfigs->GetDictAt(i); | 66 CPDF_Dictionary* pFind = pConfigs->GetDictAt(i); |
| 67 if (pFind && HasIntent(pFind, "View", "View")) | 67 if (pFind && HasIntent(pFind, "View", "View")) |
| 68 return pFind; | 68 return pFind; |
| 69 } | 69 } |
| 70 return pConfig; | 70 return pConfig; |
| 71 } | 71 } |
| (...skipping 26 matching lines...) Expand all Loading... |
| 98 | 98 |
| 99 CPDF_OCContext::~CPDF_OCContext() {} | 99 CPDF_OCContext::~CPDF_OCContext() {} |
| 100 | 100 |
| 101 bool CPDF_OCContext::LoadOCGStateFromConfig( | 101 bool CPDF_OCContext::LoadOCGStateFromConfig( |
| 102 const CFX_ByteString& csConfig, | 102 const CFX_ByteString& csConfig, |
| 103 const CPDF_Dictionary* pOCGDict) const { | 103 const CPDF_Dictionary* pOCGDict) const { |
| 104 CPDF_Dictionary* pConfig = GetConfig(m_pDocument, pOCGDict); | 104 CPDF_Dictionary* pConfig = GetConfig(m_pDocument, pOCGDict); |
| 105 if (!pConfig) | 105 if (!pConfig) |
| 106 return true; | 106 return true; |
| 107 | 107 |
| 108 bool bState = pConfig->GetStringBy("BaseState", "ON") != "OFF"; | 108 bool bState = pConfig->GetStringFor("BaseState", "ON") != "OFF"; |
| 109 CPDF_Array* pArray = pConfig->GetArrayBy("ON"); | 109 CPDF_Array* pArray = pConfig->GetArrayFor("ON"); |
| 110 if (pArray) { | 110 if (pArray) { |
| 111 if (FindGroup(pArray, pOCGDict) >= 0) | 111 if (FindGroup(pArray, pOCGDict) >= 0) |
| 112 bState = true; | 112 bState = true; |
| 113 } | 113 } |
| 114 pArray = pConfig->GetArrayBy("OFF"); | 114 pArray = pConfig->GetArrayFor("OFF"); |
| 115 if (pArray) { | 115 if (pArray) { |
| 116 if (FindGroup(pArray, pOCGDict) >= 0) | 116 if (FindGroup(pArray, pOCGDict) >= 0) |
| 117 bState = false; | 117 bState = false; |
| 118 } | 118 } |
| 119 pArray = pConfig->GetArrayBy("AS"); | 119 pArray = pConfig->GetArrayFor("AS"); |
| 120 if (!pArray) | 120 if (!pArray) |
| 121 return bState; | 121 return bState; |
| 122 | 122 |
| 123 CFX_ByteString csFind = csConfig + "State"; | 123 CFX_ByteString csFind = csConfig + "State"; |
| 124 for (size_t i = 0; i < pArray->GetCount(); i++) { | 124 for (size_t i = 0; i < pArray->GetCount(); i++) { |
| 125 CPDF_Dictionary* pUsage = pArray->GetDictAt(i); | 125 CPDF_Dictionary* pUsage = pArray->GetDictAt(i); |
| 126 if (!pUsage) | 126 if (!pUsage) |
| 127 continue; | 127 continue; |
| 128 | 128 |
| 129 if (pUsage->GetStringBy("Event", "View") != csConfig) | 129 if (pUsage->GetStringFor("Event", "View") != csConfig) |
| 130 continue; | 130 continue; |
| 131 | 131 |
| 132 CPDF_Array* pOCGs = pUsage->GetArrayBy("OCGs"); | 132 CPDF_Array* pOCGs = pUsage->GetArrayFor("OCGs"); |
| 133 if (!pOCGs) | 133 if (!pOCGs) |
| 134 continue; | 134 continue; |
| 135 | 135 |
| 136 if (FindGroup(pOCGs, pOCGDict) < 0) | 136 if (FindGroup(pOCGs, pOCGDict) < 0) |
| 137 continue; | 137 continue; |
| 138 | 138 |
| 139 CPDF_Dictionary* pState = pUsage->GetDictBy(csConfig); | 139 CPDF_Dictionary* pState = pUsage->GetDictFor(csConfig); |
| 140 if (!pState) | 140 if (!pState) |
| 141 continue; | 141 continue; |
| 142 | 142 |
| 143 bState = pState->GetStringBy(csFind) != "OFF"; | 143 bState = pState->GetStringFor(csFind) != "OFF"; |
| 144 } | 144 } |
| 145 return bState; | 145 return bState; |
| 146 } | 146 } |
| 147 | 147 |
| 148 bool CPDF_OCContext::LoadOCGState(const CPDF_Dictionary* pOCGDict) const { | 148 bool CPDF_OCContext::LoadOCGState(const CPDF_Dictionary* pOCGDict) const { |
| 149 if (!HasIntent(pOCGDict, "View", "View")) | 149 if (!HasIntent(pOCGDict, "View", "View")) |
| 150 return true; | 150 return true; |
| 151 | 151 |
| 152 CFX_ByteString csState = GetUsageTypeString(m_eUsageType); | 152 CFX_ByteString csState = GetUsageTypeString(m_eUsageType); |
| 153 CPDF_Dictionary* pUsage = pOCGDict->GetDictBy("Usage"); | 153 CPDF_Dictionary* pUsage = pOCGDict->GetDictFor("Usage"); |
| 154 if (pUsage) { | 154 if (pUsage) { |
| 155 CPDF_Dictionary* pState = pUsage->GetDictBy(csState); | 155 CPDF_Dictionary* pState = pUsage->GetDictFor(csState); |
| 156 if (pState) { | 156 if (pState) { |
| 157 CFX_ByteString csFind = csState + "State"; | 157 CFX_ByteString csFind = csState + "State"; |
| 158 if (pState->KeyExist(csFind)) | 158 if (pState->KeyExist(csFind)) |
| 159 return pState->GetStringBy(csFind) != "OFF"; | 159 return pState->GetStringFor(csFind) != "OFF"; |
| 160 } | 160 } |
| 161 if (csState != "View") { | 161 if (csState != "View") { |
| 162 pState = pUsage->GetDictBy("View"); | 162 pState = pUsage->GetDictFor("View"); |
| 163 if (pState && pState->KeyExist("ViewState")) | 163 if (pState && pState->KeyExist("ViewState")) |
| 164 return pState->GetStringBy("ViewState") != "OFF"; | 164 return pState->GetStringFor("ViewState") != "OFF"; |
| 165 } | 165 } |
| 166 } | 166 } |
| 167 return LoadOCGStateFromConfig(csState, pOCGDict); | 167 return LoadOCGStateFromConfig(csState, pOCGDict); |
| 168 } | 168 } |
| 169 | 169 |
| 170 bool CPDF_OCContext::GetOCGVisible(const CPDF_Dictionary* pOCGDict) { | 170 bool CPDF_OCContext::GetOCGVisible(const CPDF_Dictionary* pOCGDict) { |
| 171 if (!pOCGDict) | 171 if (!pOCGDict) |
| 172 return false; | 172 return false; |
| 173 | 173 |
| 174 const auto it = m_OCGStates.find(pOCGDict); | 174 const auto it = m_OCGStates.find(pOCGDict); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 230 bValue = bValue || bItem; | 230 bValue = bValue || bItem; |
| 231 } else { | 231 } else { |
| 232 bValue = bValue && bItem; | 232 bValue = bValue && bItem; |
| 233 } | 233 } |
| 234 } | 234 } |
| 235 } | 235 } |
| 236 return bValue; | 236 return bValue; |
| 237 } | 237 } |
| 238 | 238 |
| 239 bool CPDF_OCContext::LoadOCMDState(const CPDF_Dictionary* pOCMDDict) { | 239 bool CPDF_OCContext::LoadOCMDState(const CPDF_Dictionary* pOCMDDict) { |
| 240 CPDF_Array* pVE = pOCMDDict->GetArrayBy("VE"); | 240 CPDF_Array* pVE = pOCMDDict->GetArrayFor("VE"); |
| 241 if (pVE) | 241 if (pVE) |
| 242 return GetOCGVE(pVE, 0); | 242 return GetOCGVE(pVE, 0); |
| 243 | 243 |
| 244 CFX_ByteString csP = pOCMDDict->GetStringBy("P", "AnyOn"); | 244 CFX_ByteString csP = pOCMDDict->GetStringFor("P", "AnyOn"); |
| 245 CPDF_Object* pOCGObj = pOCMDDict->GetDirectObjectBy("OCGs"); | 245 CPDF_Object* pOCGObj = pOCMDDict->GetDirectObjectFor("OCGs"); |
| 246 if (!pOCGObj) | 246 if (!pOCGObj) |
| 247 return true; | 247 return true; |
| 248 | 248 |
| 249 if (const CPDF_Dictionary* pDict = pOCGObj->AsDictionary()) | 249 if (const CPDF_Dictionary* pDict = pOCGObj->AsDictionary()) |
| 250 return GetOCGVisible(pDict); | 250 return GetOCGVisible(pDict); |
| 251 | 251 |
| 252 CPDF_Array* pArray = pOCGObj->AsArray(); | 252 CPDF_Array* pArray = pOCGObj->AsArray(); |
| 253 if (!pArray) | 253 if (!pArray) |
| 254 return true; | 254 return true; |
| 255 | 255 |
| 256 bool bState = (csP == "AllOn" || csP == "AllOff"); | 256 bool bState = (csP == "AllOn" || csP == "AllOff"); |
| 257 for (size_t i = 0; i < pArray->GetCount(); i++) { | 257 for (size_t i = 0; i < pArray->GetCount(); i++) { |
| 258 bool bItem = true; | 258 bool bItem = true; |
| 259 CPDF_Dictionary* pItemDict = pArray->GetDictAt(i); | 259 CPDF_Dictionary* pItemDict = pArray->GetDictAt(i); |
| 260 if (pItemDict) | 260 if (pItemDict) |
| 261 bItem = GetOCGVisible(pItemDict); | 261 bItem = GetOCGVisible(pItemDict); |
| 262 | 262 |
| 263 if ((csP == "AnyOn" && bItem) || (csP == "AnyOff" && !bItem)) | 263 if ((csP == "AnyOn" && bItem) || (csP == "AnyOff" && !bItem)) |
| 264 return true; | 264 return true; |
| 265 if ((csP == "AllOn" && !bItem) || (csP == "AllOff" && bItem)) | 265 if ((csP == "AllOn" && !bItem) || (csP == "AllOff" && bItem)) |
| 266 return false; | 266 return false; |
| 267 } | 267 } |
| 268 return bState; | 268 return bState; |
| 269 } | 269 } |
| 270 | 270 |
| 271 bool CPDF_OCContext::CheckOCGVisible(const CPDF_Dictionary* pOCGDict) { | 271 bool CPDF_OCContext::CheckOCGVisible(const CPDF_Dictionary* pOCGDict) { |
| 272 if (!pOCGDict) | 272 if (!pOCGDict) |
| 273 return true; | 273 return true; |
| 274 | 274 |
| 275 CFX_ByteString csType = pOCGDict->GetStringBy("Type", "OCG"); | 275 CFX_ByteString csType = pOCGDict->GetStringFor("Type", "OCG"); |
| 276 if (csType == "OCG") | 276 if (csType == "OCG") |
| 277 return GetOCGVisible(pOCGDict); | 277 return GetOCGVisible(pOCGDict); |
| 278 return LoadOCMDState(pOCGDict); | 278 return LoadOCMDState(pOCGDict); |
| 279 } | 279 } |
| OLD | NEW |