static CPDF_Dictionary* FindAttrDict(CPDF_Object* pAttrs, const CFX_ByteStringC& owner, FX_FLOAT nLevel = 0.0F) { if (nLevel > nMaxRecursion) return nullptr; if (!pAttrs) return nullptr; CPDF_Dictionary* pDict = nullptr; if (pAttrs->IsDictionary()) { pDict = pAttrs->AsDictionary(); } else if (CPDF_Stream* pStream = pAttrs->AsStream()) { pDict = pStream->GetDict(); } else if (CPDF_Array* pArray = pAttrs->AsArray()) { for (uint32_t i = 0; i < pArray->GetCount(); i++) { CPDF_Object* pElement = pArray->GetDirectObjectAt(i); pDict = FindAttrDict(pElement, owner, nLevel + 1); if (pDict) return pDict; } } if (pDict && pDict->GetStringBy("O") == owner) return pDict; return nullptr; }
static CPDF_Dictionary* FindAttrDict(CPDF_Object* pAttrs, FX_BSTR owner, FX_FLOAT nLevel = 0.0F) { if (nLevel > nMaxRecursion) { return NULL; } if (pAttrs == NULL) { return NULL; } CPDF_Dictionary* pDict = NULL; if (pAttrs->GetType() == PDFOBJ_DICTIONARY) { pDict = (CPDF_Dictionary*)pAttrs; } else if (pAttrs->GetType() == PDFOBJ_STREAM) { pDict = ((CPDF_Stream*)pAttrs)->GetDict(); } else if (pAttrs->GetType() == PDFOBJ_ARRAY) { CPDF_Array* pArray = (CPDF_Array*)pAttrs; for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) { CPDF_Object* pElement = pArray->GetElementValue(i); pDict = FindAttrDict(pElement, owner, nLevel + 1); if (pDict) { return pDict; } } } if (pDict && pDict->GetString(FX_BSTRC("O")) == owner) { return pDict; } return NULL; }
CPDF_Object* CPDF_StructElementImpl::GetAttr(FX_BSTR owner, FX_BSTR name, FX_BOOL bInheritable, FX_FLOAT fLevel) { if (fLevel > nMaxRecursion) { return NULL; } if (bInheritable) { CPDF_Object* pAttr = GetAttr(owner, name, FALSE); if (pAttr) { return pAttr; } if (m_pParent == NULL) { return NULL; } return m_pParent->GetAttr(owner, name, TRUE, fLevel + 1); } CPDF_Object* pA = m_pDict->GetElementValue(FX_BSTRC("A")); if (pA) { CPDF_Dictionary* pAttrDict = FindAttrDict(pA, owner); if (pAttrDict) { CPDF_Object* pAttr = pAttrDict->GetElementValue(name); if (pAttr) { return pAttr; } } } CPDF_Object* pC = m_pDict->GetElementValue(FX_BSTRC("C")); if (pC == NULL) { return NULL; } CPDF_Dictionary* pClassMap = m_pTree->m_pTreeRoot->GetDict(FX_BSTRC("ClassMap")); if (pClassMap == NULL) { return NULL; } if (pC->GetType() == PDFOBJ_ARRAY) { CPDF_Array* pArray = (CPDF_Array*)pC; for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) { CFX_ByteString class_name = pArray->GetString(i); CPDF_Dictionary* pClassDict = pClassMap->GetDict(class_name); if (pClassDict && pClassDict->GetString(FX_BSTRC("O")) == owner) { return pClassDict->GetElementValue(name); } } return NULL; } CFX_ByteString class_name = pC->GetString(); CPDF_Dictionary* pClassDict = pClassMap->GetDict(class_name); if (pClassDict && pClassDict->GetString(FX_BSTRC("O")) == owner) { return pClassDict->GetElementValue(name); } return NULL; }
CPDF_Object* CPDF_StructElementImpl::GetAttr(const CFX_ByteStringC& owner, const CFX_ByteStringC& name, FX_BOOL bInheritable, FX_FLOAT fLevel) { if (fLevel > nMaxRecursion) { return nullptr; } if (bInheritable) { CPDF_Object* pAttr = GetAttr(owner, name, FALSE); if (pAttr) { return pAttr; } if (!m_pParent) { return nullptr; } return m_pParent->GetAttr(owner, name, TRUE, fLevel + 1); } CPDF_Object* pA = m_pDict->GetDirectObjectBy("A"); if (pA) { CPDF_Dictionary* pAttrDict = FindAttrDict(pA, owner); if (pAttrDict) { CPDF_Object* pAttr = pAttrDict->GetDirectObjectBy(CFX_ByteString(name)); if (pAttr) { return pAttr; } } } CPDF_Object* pC = m_pDict->GetDirectObjectBy("C"); if (!pC) return nullptr; CPDF_Dictionary* pClassMap = m_pTree->m_pTreeRoot->GetDictBy("ClassMap"); if (!pClassMap) return nullptr; if (CPDF_Array* pArray = pC->AsArray()) { for (uint32_t i = 0; i < pArray->GetCount(); i++) { CFX_ByteString class_name = pArray->GetStringAt(i); CPDF_Dictionary* pClassDict = pClassMap->GetDictBy(class_name); if (pClassDict && pClassDict->GetStringBy("O") == owner) return pClassDict->GetDirectObjectBy(CFX_ByteString(name)); } return nullptr; } CFX_ByteString class_name = pC->GetString(); CPDF_Dictionary* pClassDict = pClassMap->GetDictBy(class_name); if (pClassDict && pClassDict->GetStringBy("O") == owner) return pClassDict->GetDirectObjectBy(CFX_ByteString(name)); return nullptr; }