| Index: core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp
|
| diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp
|
| index dfe94932da242a50729bb628e9140ccf62a19ce2..2bf529accde8b31e9facb2c611e4ed60cd41862d 100644
|
| --- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp
|
| +++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp
|
| @@ -48,16 +48,13 @@ CFX_ByteString CPDF_Object::GetString() const {
|
| case PDFOBJ_NAME:
|
| return AsName()->m_Name;
|
| case PDFOBJ_REFERENCE: {
|
| - CPDF_Reference* pRef = (CPDF_Reference*)(void*)this;
|
| - if (pRef->m_pObjList == NULL) {
|
| + const CPDF_Reference* pRef = AsReference();
|
| + if (!pRef->m_pObjList)
|
| break;
|
| - }
|
| +
|
| CPDF_Object* pObj =
|
| pRef->m_pObjList->GetIndirectObject(pRef->GetRefObjNum());
|
| - if (pObj == NULL) {
|
| - return CFX_ByteString();
|
| - }
|
| - return pObj->GetString();
|
| + return pObj ? pObj->GetString() : CFX_ByteString();
|
| }
|
| }
|
| return CFX_ByteString();
|
| @@ -73,16 +70,13 @@ CFX_ByteStringC CPDF_Object::GetConstString() const {
|
| return CFX_ByteStringC((const uint8_t*)name, name.GetLength());
|
| }
|
| case PDFOBJ_REFERENCE: {
|
| - CPDF_Reference* pRef = (CPDF_Reference*)(void*)this;
|
| - if (pRef->m_pObjList == NULL) {
|
| + const CPDF_Reference* pRef = AsReference();
|
| + if (!pRef->m_pObjList)
|
| break;
|
| - }
|
| +
|
| CPDF_Object* pObj =
|
| pRef->m_pObjList->GetIndirectObject(pRef->GetRefObjNum());
|
| - if (pObj == NULL) {
|
| - return CFX_ByteStringC();
|
| - }
|
| - return pObj->GetConstString();
|
| + return pObj ? pObj->GetConstString() : CFX_ByteStringC();
|
| }
|
| }
|
| return CFX_ByteStringC();
|
| @@ -92,16 +86,13 @@ FX_FLOAT CPDF_Object::GetNumber() const {
|
| case PDFOBJ_NUMBER:
|
| return AsNumber()->GetNumber();
|
| case PDFOBJ_REFERENCE: {
|
| - CPDF_Reference* pRef = (CPDF_Reference*)(void*)this;
|
| - if (pRef->m_pObjList == NULL) {
|
| + const CPDF_Reference* pRef = AsReference();
|
| + if (!pRef->m_pObjList)
|
| break;
|
| - }
|
| +
|
| CPDF_Object* pObj =
|
| pRef->m_pObjList->GetIndirectObject(pRef->GetRefObjNum());
|
| - if (pObj == NULL) {
|
| - return 0;
|
| - }
|
| - return pObj->GetNumber();
|
| + return pObj ? pObj->GetNumber() : 0;
|
| }
|
| }
|
| return 0;
|
| @@ -120,18 +111,15 @@ int CPDF_Object::GetInteger() const {
|
| case PDFOBJ_NUMBER:
|
| return AsNumber()->GetInteger();
|
| case PDFOBJ_REFERENCE: {
|
| - CPDF_Reference* pRef = (CPDF_Reference*)(void*)this;
|
| + const CPDF_Reference* pRef = AsReference();
|
| PARSE_CONTEXT context;
|
| FXSYS_memset(&context, 0, sizeof(PARSE_CONTEXT));
|
| - if (pRef->m_pObjList == NULL) {
|
| + if (!pRef->m_pObjList)
|
| return 0;
|
| - }
|
| +
|
| CPDF_Object* pObj =
|
| pRef->m_pObjList->GetIndirectObject(pRef->GetRefObjNum(), &context);
|
| - if (pObj == NULL) {
|
| - return 0;
|
| - }
|
| - return pObj->GetInteger();
|
| + return pObj ? pObj->GetInteger() : 0;
|
| }
|
| }
|
| return 0;
|
| @@ -146,7 +134,7 @@ CPDF_Dictionary* CPDF_Object::GetDict() const {
|
| case PDFOBJ_STREAM:
|
| return AsStream()->GetDict();
|
| case PDFOBJ_REFERENCE: {
|
| - CPDF_Reference* pRef = (CPDF_Reference*)this;
|
| + const CPDF_Reference* pRef = AsReference();
|
| CPDF_IndirectObjects* pIndirect = pRef->GetObjList();
|
| if (!pIndirect)
|
| return nullptr;
|
| @@ -184,26 +172,21 @@ void CPDF_Object::SetString(const CFX_ByteString& str) {
|
| ASSERT(FALSE);
|
| }
|
| int CPDF_Object::GetDirectType() const {
|
| - if (m_Type != PDFOBJ_REFERENCE) {
|
| + const CPDF_Reference* pRef = AsReference();
|
| + if (!pRef)
|
| return m_Type;
|
| - }
|
| - CPDF_Reference* pRef = (CPDF_Reference*)this;
|
| return pRef->m_pObjList->GetIndirectType(pRef->GetRefObjNum());
|
| }
|
| FX_BOOL CPDF_Object::IsIdentical(CPDF_Object* pOther) const {
|
| - if (this == pOther) {
|
| + if (this == pOther)
|
| return TRUE;
|
| - }
|
| - if (pOther == NULL) {
|
| + if (!pOther)
|
| return FALSE;
|
| - }
|
| if (pOther->m_Type != m_Type) {
|
| - if (m_Type == PDFOBJ_REFERENCE && GetDirect()) {
|
| + if (IsReference() && GetDirect())
|
| return GetDirect()->IsIdentical(pOther);
|
| - }
|
| - if (pOther->m_Type == PDFOBJ_REFERENCE) {
|
| + if (pOther->IsReference())
|
| return IsIdentical(pOther->GetDirect());
|
| - }
|
| return FALSE;
|
| }
|
| switch (m_Type) {
|
| @@ -224,18 +207,16 @@ FX_BOOL CPDF_Object::IsIdentical(CPDF_Object* pOther) const {
|
| case PDFOBJ_STREAM:
|
| return AsStream()->Identical(pOther->AsStream());
|
| case PDFOBJ_REFERENCE:
|
| - return (((CPDF_Reference*)this)->Identical((CPDF_Reference*)pOther));
|
| + return AsReference()->Identical(pOther->AsReference());
|
| }
|
| return FALSE;
|
| }
|
| CPDF_Object* CPDF_Object::GetDirect() const {
|
| - if (m_Type != PDFOBJ_REFERENCE) {
|
| - return (CPDF_Object*)this;
|
| - }
|
| - CPDF_Reference* pRef = (CPDF_Reference*)(void*)this;
|
| - if (pRef->m_pObjList == NULL) {
|
| - return NULL;
|
| - }
|
| + const CPDF_Reference* pRef = AsReference();
|
| + if (!pRef)
|
| + return const_cast<CPDF_Object*>(this);
|
| + if (!pRef->m_pObjList)
|
| + return nullptr;
|
| return pRef->m_pObjList->GetIndirectObject(pRef->GetRefObjNum());
|
| }
|
| CPDF_Object* CPDF_Object::Clone(FX_BOOL bDirect) const {
|
| @@ -295,7 +276,7 @@ CPDF_Object* CPDF_Object::CloneInternal(FX_BOOL bDirect,
|
| return new CPDF_Stream(acc.DetachData(), streamSize, pDict);
|
| }
|
| case PDFOBJ_REFERENCE: {
|
| - CPDF_Reference* pRef = (CPDF_Reference*)this;
|
| + const CPDF_Reference* pRef = AsReference();
|
| FX_DWORD obj_num = pRef->GetRefObjNum();
|
| if (bDirect && !visited->GetValueAt((void*)(uintptr_t)obj_num)) {
|
| visited->SetAt((void*)(uintptr_t)obj_num, (void*)1);
|
| @@ -380,6 +361,14 @@ const CPDF_Number* CPDF_Object::AsNumber() const {
|
| return IsNumber() ? static_cast<const CPDF_Number*>(this) : nullptr;
|
| }
|
|
|
| +CPDF_Reference* CPDF_Object::AsReference() {
|
| + return IsReference() ? static_cast<CPDF_Reference*>(this) : nullptr;
|
| +}
|
| +
|
| +const CPDF_Reference* CPDF_Object::AsReference() const {
|
| + return IsReference() ? static_cast<const CPDF_Reference*>(this) : nullptr;
|
| +}
|
| +
|
| CPDF_Stream* CPDF_Object::AsStream() {
|
| return IsStream() ? static_cast<CPDF_Stream*>(this) : nullptr;
|
| }
|
| @@ -639,17 +628,9 @@ CFX_WideString CPDF_Dictionary::GetUnicodeText(const CFX_ByteStringC& key,
|
| CFX_CharMap* pCharMap) const {
|
| CPDF_Object* p = NULL;
|
| m_Map.Lookup(key, (void*&)p);
|
| - if (p) {
|
| - if (p->GetType() == PDFOBJ_REFERENCE) {
|
| - p = ((CPDF_Reference*)p)->GetDirect();
|
| - if (p) {
|
| - return p->GetUnicodeText(pCharMap);
|
| - }
|
| - } else {
|
| - return p->GetUnicodeText(pCharMap);
|
| - }
|
| - }
|
| - return CFX_WideString();
|
| + if (CPDF_Reference* pRef = ToReference(p))
|
| + p = pRef->GetDirect();
|
| + return p ? p->GetUnicodeText(pCharMap) : CFX_WideString();
|
| }
|
| CFX_ByteString CPDF_Dictionary::GetString(const CFX_ByteStringC& key,
|
| const CFX_ByteStringC& def) const {
|
| @@ -721,17 +702,15 @@ CPDF_Stream* CPDF_Dictionary::GetStream(const CFX_ByteStringC& key) const {
|
| CFX_FloatRect CPDF_Dictionary::GetRect(const CFX_ByteStringC& key) const {
|
| CFX_FloatRect rect;
|
| CPDF_Array* pArray = GetArray(key);
|
| - if (pArray) {
|
| + if (pArray)
|
| rect = pArray->GetRect();
|
| - }
|
| return rect;
|
| }
|
| CFX_AffineMatrix CPDF_Dictionary::GetMatrix(const CFX_ByteStringC& key) const {
|
| CFX_AffineMatrix matrix;
|
| CPDF_Array* pArray = GetArray(key);
|
| - if (pArray) {
|
| + if (pArray)
|
| matrix = pArray->GetMatrix();
|
| - }
|
| return matrix;
|
| }
|
| FX_BOOL CPDF_Dictionary::KeyExist(const CFX_ByteStringC& key) const {
|
|
|