FX_BOOL CPDF_OCContext::GetOCGVE(CPDF_Array* pExpression, FX_BOOL bFromConfig, int nLevel) { if (nLevel > 32) { return FALSE; } if (pExpression == NULL) { return FALSE; } int32_t iCount = pExpression->GetCount(); CPDF_Object* pOCGObj; CFX_ByteString csOperator = pExpression->GetString(0); if (csOperator == FX_BSTRC("Not")) { pOCGObj = pExpression->GetElementValue(1); if (pOCGObj == NULL) { return FALSE; } if (pOCGObj->GetType() == PDFOBJ_DICTIONARY) { return !(bFromConfig ? LoadOCGState((CPDF_Dictionary*)pOCGObj) : GetOCGVisible((CPDF_Dictionary*)pOCGObj)); } if (pOCGObj->GetType() == PDFOBJ_ARRAY) { return !GetOCGVE((CPDF_Array*)pOCGObj, bFromConfig, nLevel + 1); } return FALSE; } if (csOperator == FX_BSTRC("Or") || csOperator == FX_BSTRC("And")) { FX_BOOL bValue = FALSE; for (int32_t i = 1; i < iCount; i++) { pOCGObj = pExpression->GetElementValue(1); if (pOCGObj == NULL) { continue; } FX_BOOL bItem = FALSE; if (pOCGObj->GetType() == PDFOBJ_DICTIONARY) { bItem = bFromConfig ? LoadOCGState((CPDF_Dictionary*)pOCGObj) : GetOCGVisible((CPDF_Dictionary*)pOCGObj); } else if (pOCGObj->GetType() == PDFOBJ_ARRAY) { bItem = GetOCGVE((CPDF_Array*)pOCGObj, bFromConfig, nLevel + 1); } if (i == 1) { bValue = bItem; } else { if (csOperator == FX_BSTRC("Or")) { bValue = bValue || bItem; } else { bValue = bValue && bItem; } } } return bValue; } return FALSE; }
FX_BOOL CPDF_OCContext::GetOCGVE(CPDF_Array* pExpression, FX_BOOL bFromConfig, int nLevel) { if (nLevel > 32) { return FALSE; } if (!pExpression) { return FALSE; } int32_t iCount = pExpression->GetCount(); CPDF_Object* pOCGObj; CFX_ByteString csOperator = pExpression->GetStringAt(0); if (csOperator == "Not") { pOCGObj = pExpression->GetElementValue(1); if (!pOCGObj) return FALSE; if (CPDF_Dictionary* pDict = pOCGObj->AsDictionary()) return !(bFromConfig ? LoadOCGState(pDict) : GetOCGVisible(pDict)); if (CPDF_Array* pArray = pOCGObj->AsArray()) return !GetOCGVE(pArray, bFromConfig, nLevel + 1); return FALSE; } if (csOperator == "Or" || csOperator == "And") { FX_BOOL bValue = FALSE; for (int32_t i = 1; i < iCount; i++) { pOCGObj = pExpression->GetElementValue(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; } else { if (csOperator == "Or") { bValue = bValue || bItem; } else { bValue = bValue && bItem; } } } return bValue; } return FALSE; }
FX_BOOL CPDF_OCContext::LoadOCMDState(const CPDF_Dictionary* pOCMDDict, FX_BOOL bFromConfig) { CPDF_Array* pVE = pOCMDDict->GetArrayBy("VE"); if (pVE) { return GetOCGVE(pVE, bFromConfig); } CFX_ByteString csP = pOCMDDict->GetStringBy("P", "AnyOn"); CPDF_Object* pOCGObj = pOCMDDict->GetElementValue("OCGs"); if (!pOCGObj) return TRUE; if (const CPDF_Dictionary* pDict = pOCGObj->AsDictionary()) return bFromConfig ? LoadOCGState(pDict) : GetOCGVisible(pDict); CPDF_Array* pArray = pOCGObj->AsArray(); if (!pArray) return TRUE; FX_BOOL bState = FALSE; if (csP == "AllOn" || csP == "AllOff") { bState = TRUE; } int32_t iCount = pArray->GetCount(); for (int32_t i = 0; i < iCount; i++) { FX_BOOL bItem = TRUE; CPDF_Dictionary* pItemDict = pArray->GetDictAt(i); if (pItemDict) bItem = bFromConfig ? LoadOCGState(pItemDict) : GetOCGVisible(pItemDict); if ((csP == "AnyOn" && bItem) || (csP == "AnyOff" && !bItem)) return TRUE; if ((csP == "AllOn" && !bItem) || (csP == "AllOff" && bItem)) return FALSE; } return bState; }
bool CPDF_OCContext::GetOCGVE(const CPDF_Array* pExpression, int nLevel) const { if (nLevel > 32 || !pExpression) return false; ByteString csOperator = pExpression->GetStringAt(0); if (csOperator == "Not") { const CPDF_Object* pOCGObj = pExpression->GetDirectObjectAt(1); if (!pOCGObj) return false; if (const CPDF_Dictionary* pDict = pOCGObj->AsDictionary()) return !GetOCGVisible(pDict); if (const CPDF_Array* pArray = pOCGObj->AsArray()) return !GetOCGVE(pArray, nLevel + 1); return false; } if (csOperator != "Or" && csOperator != "And") return false; bool bValue = false; for (size_t i = 1; i < pExpression->size(); i++) { const CPDF_Object* pOCGObj = pExpression->GetDirectObjectAt(1); if (!pOCGObj) continue; bool bItem = false; if (const CPDF_Dictionary* pDict = pOCGObj->AsDictionary()) bItem = GetOCGVisible(pDict); else if (const CPDF_Array* pArray = pOCGObj->AsArray()) bItem = GetOCGVE(pArray, nLevel + 1); if (i == 1) { bValue = bItem; } else { if (csOperator == "Or") { bValue = bValue || bItem; } else { bValue = bValue && bItem; } } } return bValue; }
FX_BOOL CPDF_OCContext::LoadOCMDState(const CPDF_Dictionary* pOCMDDict, FX_BOOL bFromConfig) { FXSYS_assert(pOCMDDict != NULL); CPDF_Array* pVE = pOCMDDict->GetArray(FX_BSTRC("VE")); if (pVE != NULL) { return GetOCGVE(pVE, bFromConfig); } CFX_ByteString csP = pOCMDDict->GetString(FX_BSTRC("P"), FX_BSTRC("AnyOn")); CPDF_Object* pOCGObj = pOCMDDict->GetElementValue(FX_BSTRC("OCGs")); if (pOCGObj == NULL) { return TRUE; } if (pOCGObj->GetType() == PDFOBJ_DICTIONARY) { return bFromConfig ? LoadOCGState((CPDF_Dictionary*)pOCGObj) : GetOCGVisible((CPDF_Dictionary*)pOCGObj); } if (pOCGObj->GetType() != PDFOBJ_ARRAY) { return TRUE; } FX_BOOL bState = FALSE; if (csP == FX_BSTRC("AllOn") || csP == FX_BSTRC("AllOff")) { bState = TRUE; } int32_t iCount = ((CPDF_Array*)pOCGObj)->GetCount(); for (int32_t i = 0; i < iCount; i++) { FX_BOOL bItem = TRUE; CPDF_Dictionary* pItemDict = ((CPDF_Array*)pOCGObj)->GetDict(i); if (pItemDict) { bItem = bFromConfig ? LoadOCGState(pItemDict) : GetOCGVisible(pItemDict); } if (csP == FX_BSTRC("AnyOn") && bItem) { return TRUE; } if (csP == FX_BSTRC("AnyOff") && !bItem) { return TRUE; } if (csP == FX_BSTRC("AllOn") && !bItem) { return FALSE; } if (csP == FX_BSTRC("AllOff") && bItem) { return FALSE; } } return bState; }
bool CPDF_OCContext::LoadOCMDState(const CPDF_Dictionary* pOCMDDict) const { const CPDF_Array* pVE = pOCMDDict->GetArrayFor("VE"); if (pVE) return GetOCGVE(pVE, 0); ByteString csP = pOCMDDict->GetStringFor("P", "AnyOn"); const CPDF_Object* pOCGObj = pOCMDDict->GetDirectObjectFor("OCGs"); if (!pOCGObj) return true; if (const CPDF_Dictionary* pDict = pOCGObj->AsDictionary()) return GetOCGVisible(pDict); const CPDF_Array* pArray = pOCGObj->AsArray(); if (!pArray) return true; bool bState = (csP == "AllOn" || csP == "AllOff"); // At least one entry of OCGs needs to be a valid dictionary for it to be // considered present. See "OCGs" in table 4.49 in the PDF 1.7 spec. bool bValidEntrySeen = false; for (size_t i = 0; i < pArray->size(); i++) { bool bItem = true; const CPDF_Dictionary* pItemDict = pArray->GetDictAt(i); if (!pItemDict) continue; bValidEntrySeen = true; bItem = GetOCGVisible(pItemDict); if ((csP == "AnyOn" && bItem) || (csP == "AnyOff" && !bItem)) return true; if ((csP == "AllOn" && !bItem) || (csP == "AllOff" && bItem)) return false; } return !bValidEntrySeen || bState; }