Index: core/fpdfdoc/doc_ocg.cpp |
diff --git a/core/fpdfdoc/doc_ocg.cpp b/core/fpdfdoc/doc_ocg.cpp |
index 51e018aea5d127b4bb918f90cd9500c0edd0d0e9..dc49ab0fd792dec8a50773e7e97325c5fdeacdd2 100644 |
--- a/core/fpdfdoc/doc_ocg.cpp |
+++ b/core/fpdfdoc/doc_ocg.cpp |
@@ -10,42 +10,42 @@ |
#include "core/fpdfapi/fpdf_parser/include/cpdf_document.h" |
#include "core/fpdfdoc/include/fpdf_doc.h" |
-static int32_t FPDFDOC_OCG_FindGroup(const CPDF_Object* pObject, |
- const CPDF_Dictionary* pGroupDict) { |
- if (!pObject || !pGroupDict) |
- return -1; |
+namespace { |
- if (const CPDF_Array* pArray = pObject->AsArray()) { |
- for (size_t i = 0; i < pArray->GetCount(); i++) { |
- if (pArray->GetDictAt(i) == pGroupDict) |
- return i; |
- } |
+int32_t FPDFDOC_OCG_FindGroup(const CPDF_Array* pArray, |
+ const CPDF_Dictionary* pGroupDict) { |
+ if (!pArray || !pGroupDict) |
return -1; |
+ |
+ for (size_t i = 0; i < pArray->GetCount(); i++) { |
+ if (pArray->GetDictAt(i) == pGroupDict) |
+ return i; |
} |
- return pObject->GetDict() == pGroupDict ? 0 : -1; |
+ return -1; |
} |
-static FX_BOOL FPDFDOC_OCG_HasIntent(const CPDF_Dictionary* pDict, |
- const CFX_ByteStringC& csElement, |
- const CFX_ByteStringC& csDef = "") { |
+ |
+bool FPDFDOC_OCG_HasIntent(const CPDF_Dictionary* pDict, |
+ const CFX_ByteStringC& csElement, |
+ const CFX_ByteStringC& csDef) { |
CPDF_Object* pIntent = pDict->GetDirectObjectBy("Intent"); |
- if (!pIntent) { |
+ if (!pIntent) |
return csElement == csDef; |
- } |
+ |
CFX_ByteString bsIntent; |
if (CPDF_Array* pArray = pIntent->AsArray()) { |
for (size_t i = 0; i < pArray->GetCount(); i++) { |
bsIntent = pArray->GetStringAt(i); |
if (bsIntent == "All" || bsIntent == csElement) |
- return TRUE; |
+ return true; |
} |
- return FALSE; |
+ return false; |
} |
bsIntent = pIntent->GetString(); |
return bsIntent == "All" || bsIntent == csElement; |
} |
-static CPDF_Dictionary* FPDFDOC_OCG_GetConfig(CPDF_Document* pDoc, |
- const CPDF_Dictionary* pOCGDict) { |
+CPDF_Dictionary* FPDFDOC_OCG_GetConfig(CPDF_Document* pDoc, |
+ const CPDF_Dictionary* pOCGDict) { |
ASSERT(pOCGDict); |
CPDF_Dictionary* pOCProperties = pDoc->GetRoot()->GetDictBy("OCProperties"); |
if (!pOCProperties) |
@@ -60,95 +60,97 @@ static CPDF_Dictionary* FPDFDOC_OCG_GetConfig(CPDF_Document* pDoc, |
CPDF_Dictionary* pConfig = pOCProperties->GetDictBy("D"); |
CPDF_Array* pConfigs = pOCProperties->GetArrayBy("Configs"); |
- if (pConfigs) { |
- CPDF_Dictionary* pFind; |
- for (size_t i = 0; i < pConfigs->GetCount(); i++) { |
- pFind = pConfigs->GetDictAt(i); |
- if (!pFind) { |
- continue; |
- } |
- if (!FPDFDOC_OCG_HasIntent(pFind, "View", "View")) { |
- continue; |
- } |
- pConfig = pFind; |
- break; |
- } |
+ if (!pConfigs) |
+ return pConfig; |
+ |
+ for (size_t i = 0; i < pConfigs->GetCount(); i++) { |
+ CPDF_Dictionary* pFind = pConfigs->GetDictAt(i); |
+ if (pFind && FPDFDOC_OCG_HasIntent(pFind, "View", "View")) |
+ return pFind; |
} |
return pConfig; |
} |
-static CFX_ByteString FPDFDOC_OCG_GetUsageTypeString( |
- CPDF_OCContext::UsageType eType) { |
- CFX_ByteString csState = "View"; |
- if (eType == CPDF_OCContext::Design) { |
- csState = "Design"; |
- } else if (eType == CPDF_OCContext::Print) { |
- csState = "Print"; |
- } else if (eType == CPDF_OCContext::Export) { |
- csState = "Export"; |
+ |
+CFX_ByteString FPDFDOC_OCG_GetUsageTypeString(CPDF_OCContext::UsageType eType) { |
+ CFX_ByteString csState; |
+ switch (eType) { |
+ case CPDF_OCContext::Design: |
+ csState = "Design"; |
+ break; |
+ case CPDF_OCContext::Print: |
+ csState = "Print"; |
+ break; |
+ case CPDF_OCContext::Export: |
+ csState = "Export"; |
+ break; |
+ default: |
+ csState = "View"; |
+ break; |
} |
return csState; |
} |
-CPDF_OCContext::CPDF_OCContext(CPDF_Document* pDoc, UsageType eUsageType) { |
+ |
+} // namespace |
+ |
+CPDF_OCContext::CPDF_OCContext(CPDF_Document* pDoc, UsageType eUsageType) |
+ : m_pDocument(pDoc), m_eUsageType(eUsageType) { |
ASSERT(pDoc); |
- m_pDocument = pDoc; |
- m_eUsageType = eUsageType; |
} |
+ |
CPDF_OCContext::~CPDF_OCContext() { |
- m_OCGStates.clear(); |
} |
-FX_BOOL CPDF_OCContext::LoadOCGStateFromConfig(const CFX_ByteString& csConfig, |
- const CPDF_Dictionary* pOCGDict, |
- FX_BOOL& bValidConfig) const { |
+bool CPDF_OCContext::LoadOCGStateFromConfig( |
+ const CFX_ByteString& csConfig, |
+ const CPDF_Dictionary* pOCGDict) const { |
CPDF_Dictionary* pConfig = FPDFDOC_OCG_GetConfig(m_pDocument, pOCGDict); |
if (!pConfig) |
- return TRUE; |
+ return true; |
- bValidConfig = TRUE; |
- FX_BOOL bState = pConfig->GetStringBy("BaseState", "ON") != "OFF"; |
+ bool bState = pConfig->GetStringBy("BaseState", "ON") != "OFF"; |
CPDF_Array* pArray = pConfig->GetArrayBy("ON"); |
if (pArray) { |
- if (FPDFDOC_OCG_FindGroup(pArray, pOCGDict) >= 0) { |
- bState = TRUE; |
- } |
+ if (FPDFDOC_OCG_FindGroup(pArray, pOCGDict) >= 0) |
+ bState = true; |
} |
pArray = pConfig->GetArrayBy("OFF"); |
if (pArray) { |
- if (FPDFDOC_OCG_FindGroup(pArray, pOCGDict) >= 0) { |
- bState = FALSE; |
- } |
+ if (FPDFDOC_OCG_FindGroup(pArray, pOCGDict) >= 0) |
+ bState = false; |
} |
pArray = pConfig->GetArrayBy("AS"); |
- if (pArray) { |
- CFX_ByteString csFind = csConfig + "State"; |
- for (size_t i = 0; i < pArray->GetCount(); i++) { |
- CPDF_Dictionary* pUsage = pArray->GetDictAt(i); |
- if (!pUsage) { |
- continue; |
- } |
- if (pUsage->GetStringBy("Event", "View") != csConfig) { |
- continue; |
- } |
- CPDF_Array* pOCGs = pUsage->GetArrayBy("OCGs"); |
- if (!pOCGs) { |
- continue; |
- } |
- if (FPDFDOC_OCG_FindGroup(pOCGs, pOCGDict) < 0) { |
- continue; |
- } |
- CPDF_Dictionary* pState = pUsage->GetDictBy(csConfig); |
- if (!pState) { |
- continue; |
- } |
- bState = pState->GetStringBy(csFind) != "OFF"; |
- } |
+ if (!pArray) |
+ return bState; |
+ |
+ CFX_ByteString csFind = csConfig + "State"; |
+ for (size_t i = 0; i < pArray->GetCount(); i++) { |
+ CPDF_Dictionary* pUsage = pArray->GetDictAt(i); |
+ if (!pUsage) |
+ continue; |
+ |
+ if (pUsage->GetStringBy("Event", "View") != csConfig) |
+ continue; |
+ |
+ CPDF_Array* pOCGs = pUsage->GetArrayBy("OCGs"); |
+ if (!pOCGs) |
+ continue; |
+ |
+ if (FPDFDOC_OCG_FindGroup(pOCGs, pOCGDict) < 0) |
+ continue; |
+ |
+ CPDF_Dictionary* pState = pUsage->GetDictBy(csConfig); |
+ if (!pState) |
+ continue; |
+ |
+ bState = pState->GetStringBy(csFind) != "OFF"; |
} |
return bState; |
} |
-FX_BOOL CPDF_OCContext::LoadOCGState(const CPDF_Dictionary* pOCGDict) const { |
- if (!FPDFDOC_OCG_HasIntent(pOCGDict, "View", "View")) { |
- return TRUE; |
- } |
+ |
+bool CPDF_OCContext::LoadOCGState(const CPDF_Dictionary* pOCGDict) const { |
+ if (!FPDFDOC_OCG_HasIntent(pOCGDict, "View", "View")) |
+ return true; |
+ |
CFX_ByteString csState = FPDFDOC_OCG_GetUsageTypeString(m_eUsageType); |
CPDF_Dictionary* pUsage = pOCGDict->GetDictBy("Usage"); |
if (pUsage) { |
@@ -166,128 +168,117 @@ FX_BOOL CPDF_OCContext::LoadOCGState(const CPDF_Dictionary* pOCGDict) const { |
} |
} |
} |
- FX_BOOL bDefValid = FALSE; |
- return LoadOCGStateFromConfig(csState, pOCGDict, bDefValid); |
+ return LoadOCGStateFromConfig(csState, pOCGDict); |
} |
-FX_BOOL CPDF_OCContext::GetOCGVisible(const CPDF_Dictionary* pOCGDict) { |
+bool CPDF_OCContext::GetOCGVisible(const CPDF_Dictionary* pOCGDict) { |
if (!pOCGDict) |
- return FALSE; |
+ return false; |
const auto it = m_OCGStates.find(pOCGDict); |
if (it != m_OCGStates.end()) |
return it->second; |
- FX_BOOL bState = LoadOCGState(pOCGDict); |
+ bool bState = LoadOCGState(pOCGDict); |
m_OCGStates[pOCGDict] = bState; |
return bState; |
} |
-FX_BOOL CPDF_OCContext::CheckObjectVisible(const CPDF_PageObject* pObj) { |
+bool CPDF_OCContext::CheckObjectVisible(const CPDF_PageObject* pObj) { |
const CPDF_ContentMarkData* pData = pObj->m_ContentMark; |
for (int i = 0; i < pData->CountItems(); i++) { |
const CPDF_ContentMarkItem& item = pData->GetItem(i); |
if (item.GetName() == "OC" && |
item.GetParamType() == CPDF_ContentMarkItem::PropertiesDict && |
!CheckOCGVisible(item.GetParam())) { |
- return FALSE; |
+ return false; |
} |
} |
- return TRUE; |
+ return true; |
} |
-FX_BOOL CPDF_OCContext::GetOCGVE(CPDF_Array* pExpression, |
- FX_BOOL bFromConfig, |
- int nLevel) { |
- if (nLevel > 32) { |
- return FALSE; |
- } |
- if (!pExpression) { |
- return FALSE; |
- } |
- CPDF_Object* pOCGObj; |
+bool CPDF_OCContext::GetOCGVE(CPDF_Array* pExpression, int nLevel) { |
+ if (nLevel > 32 || !pExpression) |
+ return false; |
+ |
CFX_ByteString csOperator = pExpression->GetStringAt(0); |
if (csOperator == "Not") { |
- pOCGObj = pExpression->GetDirectObjectAt(1); |
+ CPDF_Object* pOCGObj = pExpression->GetDirectObjectAt(1); |
if (!pOCGObj) |
- return FALSE; |
+ return false; |
if (CPDF_Dictionary* pDict = pOCGObj->AsDictionary()) |
- return !(bFromConfig ? LoadOCGState(pDict) : GetOCGVisible(pDict)); |
+ return !GetOCGVisible(pDict); |
if (CPDF_Array* pArray = pOCGObj->AsArray()) |
- return !GetOCGVE(pArray, bFromConfig, nLevel + 1); |
- return FALSE; |
+ return !GetOCGVE(pArray, nLevel + 1); |
+ return false; |
} |
- if (csOperator == "Or" || csOperator == "And") { |
- FX_BOOL bValue = FALSE; |
- for (size_t i = 1; i < pExpression->GetCount(); i++) { |
- pOCGObj = pExpression->GetDirectObjectAt(1); |
- if (!pOCGObj) { |
- continue; |
- } |
- FX_BOOL bItem = FALSE; |
- if (CPDF_Dictionary* pDict = pOCGObj->AsDictionary()) |
- bItem = bFromConfig ? LoadOCGState(pDict) : GetOCGVisible(pDict); |
- else if (CPDF_Array* pArray = pOCGObj->AsArray()) |
- bItem = GetOCGVE(pArray, bFromConfig, nLevel + 1); |
- |
- if (i == 1) { |
- bValue = bItem; |
+ |
+ if (csOperator != "Or" && csOperator != "And") |
+ return false; |
+ |
+ bool bValue = false; |
+ for (size_t i = 1; i < pExpression->GetCount(); i++) { |
+ CPDF_Object* pOCGObj = pExpression->GetDirectObjectAt(1); |
+ if (!pOCGObj) |
+ continue; |
+ |
+ bool bItem = false; |
+ if (CPDF_Dictionary* pDict = pOCGObj->AsDictionary()) |
+ bItem = GetOCGVisible(pDict); |
+ else if (CPDF_Array* pArray = pOCGObj->AsArray()) |
+ bItem = GetOCGVE(pArray, nLevel + 1); |
+ |
+ if (i == 1) { |
+ bValue = bItem; |
+ } else { |
+ if (csOperator == "Or") { |
+ bValue = bValue || bItem; |
} else { |
- if (csOperator == "Or") { |
- bValue = bValue || bItem; |
- } else { |
- bValue = bValue && bItem; |
- } |
+ bValue = bValue && bItem; |
} |
} |
- return bValue; |
} |
- return FALSE; |
+ return bValue; |
} |
-FX_BOOL CPDF_OCContext::LoadOCMDState(const CPDF_Dictionary* pOCMDDict, |
- FX_BOOL bFromConfig) { |
+ |
+bool CPDF_OCContext::LoadOCMDState(const CPDF_Dictionary* pOCMDDict) { |
CPDF_Array* pVE = pOCMDDict->GetArrayBy("VE"); |
- if (pVE) { |
- return GetOCGVE(pVE, bFromConfig); |
- } |
+ if (pVE) |
+ return GetOCGVE(pVE, 0); |
+ |
CFX_ByteString csP = pOCMDDict->GetStringBy("P", "AnyOn"); |
CPDF_Object* pOCGObj = pOCMDDict->GetDirectObjectBy("OCGs"); |
if (!pOCGObj) |
- return TRUE; |
+ return true; |
+ |
if (const CPDF_Dictionary* pDict = pOCGObj->AsDictionary()) |
- return bFromConfig ? LoadOCGState(pDict) : GetOCGVisible(pDict); |
+ return GetOCGVisible(pDict); |
CPDF_Array* pArray = pOCGObj->AsArray(); |
if (!pArray) |
- return TRUE; |
+ return true; |
- FX_BOOL bState = FALSE; |
- if (csP == "AllOn" || csP == "AllOff") { |
- bState = TRUE; |
- } |
+ bool bState = (csP == "AllOn" || csP == "AllOff"); |
for (size_t i = 0; i < pArray->GetCount(); i++) { |
- FX_BOOL bItem = TRUE; |
+ bool bItem = true; |
CPDF_Dictionary* pItemDict = pArray->GetDictAt(i); |
if (pItemDict) |
- bItem = bFromConfig ? LoadOCGState(pItemDict) : GetOCGVisible(pItemDict); |
+ bItem = GetOCGVisible(pItemDict); |
if ((csP == "AnyOn" && bItem) || (csP == "AnyOff" && !bItem)) |
- return TRUE; |
+ return true; |
if ((csP == "AllOn" && !bItem) || (csP == "AllOff" && bItem)) |
- return FALSE; |
+ return false; |
} |
return bState; |
} |
-FX_BOOL CPDF_OCContext::CheckOCGVisible(const CPDF_Dictionary* pOCGDict) { |
- if (!pOCGDict) { |
- return TRUE; |
- } |
+ |
+bool CPDF_OCContext::CheckOCGVisible(const CPDF_Dictionary* pOCGDict) { |
+ if (!pOCGDict) |
+ return true; |
+ |
CFX_ByteString csType = pOCGDict->GetStringBy("Type", "OCG"); |
- if (csType == "OCG") { |
+ if (csType == "OCG") |
return GetOCGVisible(pOCGDict); |
- } |
- return LoadOCMDState(pOCGDict, FALSE); |
-} |
-void CPDF_OCContext::ResetOCContext() { |
- m_OCGStates.clear(); |
+ return LoadOCMDState(pOCGDict); |
} |