1e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved. 2e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Use of this source code is governed by a BSD-style license that can be 3e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// found in the LICENSE file. 4e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 5e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 7ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/include/fpdfapi/fpdf_objects.h" 8e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 9ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include <algorithm> 10ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 11ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/include/fpdfapi/fpdf_parser.h" 12ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/include/fxcrt/fx_string.h" 13ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "third_party/base/stl_util.h" 14ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 15ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannnamespace { 16ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 17ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannconst FX_DWORD kBlockSize = 1024; 18ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 19ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} // namespace 20ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 21ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// static 22e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovint CPDF_Object::s_nCurRefDepth = 0; 23e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 24ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Object::Release() { 25ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_ObjNum) { 26ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 27ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 28ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Destroy(); 29ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 30ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Object::Destroy() { 31ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann switch (m_Type) { 32ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PDFOBJ_STRING: 33ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann delete AsString(); 34ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 35ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PDFOBJ_NAME: 36ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann delete AsName(); 37ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 38ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PDFOBJ_ARRAY: 39ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann delete AsArray(); 40ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 41ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PDFOBJ_DICTIONARY: 42ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann delete AsDictionary(); 43ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 44ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PDFOBJ_STREAM: 45ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann delete AsStream(); 46ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 47ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann default: 48ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann delete this; 49ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 50ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 51ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_ByteString CPDF_Object::GetString() const { 52ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann switch (m_Type) { 53ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PDFOBJ_BOOLEAN: 54ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return AsBoolean()->m_bValue ? "true" : "false"; 55ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PDFOBJ_NUMBER: 56ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return AsNumber()->GetString(); 57ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PDFOBJ_STRING: 58ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return AsString()->m_String; 59ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PDFOBJ_NAME: 60ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return AsName()->m_Name; 61ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PDFOBJ_REFERENCE: { 62ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CPDF_Reference* pRef = AsReference(); 63ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pRef->m_pObjList) 64ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 65ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 66ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* pObj = 67ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pRef->m_pObjList->GetIndirectObject(pRef->GetRefObjNum(), nullptr); 68ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pObj ? pObj->GetString() : CFX_ByteString(); 69ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 70ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 71ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return CFX_ByteString(); 72ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 73ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_ByteStringC CPDF_Object::GetConstString() const { 74ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann switch (m_Type) { 75ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PDFOBJ_STRING: { 76ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString str = AsString()->m_String; 77ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return CFX_ByteStringC((const uint8_t*)str, str.GetLength()); 78ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 79ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PDFOBJ_NAME: { 80ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString name = AsName()->m_Name; 81ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return CFX_ByteStringC((const uint8_t*)name, name.GetLength()); 82ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 83ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PDFOBJ_REFERENCE: { 84ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CPDF_Reference* pRef = AsReference(); 85ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pRef->m_pObjList) 86ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 87ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 88ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* pObj = 89ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pRef->m_pObjList->GetIndirectObject(pRef->GetRefObjNum(), nullptr); 90ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pObj ? pObj->GetConstString() : CFX_ByteStringC(); 91e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 92ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 93ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return CFX_ByteStringC(); 94e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 95ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 96ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_FLOAT CPDF_Object::GetNumber() const { 97ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann switch (m_Type) { 98ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PDFOBJ_NUMBER: 99ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return AsNumber()->GetNumber(); 100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PDFOBJ_REFERENCE: { 101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CPDF_Reference* pRef = AsReference(); 102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pRef->m_pObjList) 103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* pObj = 106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pRef->m_pObjList->GetIndirectObject(pRef->GetRefObjNum(), nullptr); 107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pObj ? pObj->GetNumber() : 0; 108e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 111e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 112ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 113ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_FLOAT CPDF_Object::GetNumber16() const { 114ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return GetNumber(); 115e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 116ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 117ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CPDF_Object::GetInteger() const { 118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_AutoRestorer<int> restorer(&s_nCurRefDepth); 119ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (++s_nCurRefDepth > kObjectRefMaxDepth) 120e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return 0; 121ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 122ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann switch (m_Type) { 123ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PDFOBJ_BOOLEAN: 124ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return AsBoolean()->m_bValue; 125ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PDFOBJ_NUMBER: 126ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return AsNumber()->GetInteger(); 127ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PDFOBJ_REFERENCE: { 128ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CPDF_Reference* pRef = AsReference(); 129ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PARSE_CONTEXT context; 130ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_memset(&context, 0, sizeof(PARSE_CONTEXT)); 131ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pRef->m_pObjList) 132e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return 0; 133ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 134ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* pObj = 135ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pRef->m_pObjList->GetIndirectObject(pRef->GetRefObjNum(), &context); 136ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pObj ? pObj->GetInteger() : 0; 137e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 138ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 139ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 140e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 141ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 142ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Dictionary* CPDF_Object::GetDict() const { 143ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann switch (m_Type) { 144ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PDFOBJ_DICTIONARY: 145ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann // The method should be made non-const if we want to not be const. 146ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann // See bug #234. 147ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return const_cast<CPDF_Dictionary*>(AsDictionary()); 148ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PDFOBJ_STREAM: 149ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return AsStream()->GetDict(); 150ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PDFOBJ_REFERENCE: { 151ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CPDF_Reference* pRef = AsReference(); 152ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_IndirectObjectHolder* pIndirect = pRef->GetObjList(); 153ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pIndirect) 154ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return nullptr; 155ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* pObj = 156ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pIndirect->GetIndirectObject(pRef->GetRefObjNum(), nullptr); 157ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pObj || (pObj == this)) 158ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return nullptr; 159ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pObj->GetDict(); 160ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 161ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann default: 162ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return nullptr; 163ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 164e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 165ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 166ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Array* CPDF_Object::GetArray() const { 167ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann // The method should be made non-const if we want to not be const. 168ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann // See bug #234. 169ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return const_cast<CPDF_Array*>(AsArray()); 170e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 171ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 172ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Object::SetString(const CFX_ByteString& str) { 173ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann switch (m_Type) { 174ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PDFOBJ_BOOLEAN: 175ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann AsBoolean()->m_bValue = (str == "true"); 176ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 177ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PDFOBJ_NUMBER: 178ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann AsNumber()->SetString(str); 179ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 180ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PDFOBJ_STRING: 181ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann AsString()->m_String = str; 182ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 183ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PDFOBJ_NAME: 184ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann AsName()->m_Name = str; 185ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 186ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 187ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ASSERT(FALSE); 188ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 189ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CPDF_Object::GetDirectType() const { 190ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CPDF_Reference* pRef = AsReference(); 191ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pRef) 192ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_Type; 193ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pRef->m_pObjList->GetIndirectType(pRef->GetRefObjNum()); 194ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 195ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_Object::IsIdentical(CPDF_Object* pOther) const { 196ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (this == pOther) 197ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 198ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pOther) 199e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 200ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pOther->m_Type != m_Type) { 201ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (IsReference() && GetDirect()) 202ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return GetDirect()->IsIdentical(pOther); 203ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pOther->IsReference()) 204ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return IsIdentical(pOther->GetDirect()); 205ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 206ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 207ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann switch (m_Type) { 208ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PDFOBJ_BOOLEAN: 209ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return AsBoolean()->Identical(pOther->AsBoolean()); 210ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PDFOBJ_NUMBER: 211ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return AsNumber()->Identical(pOther->AsNumber()); 212ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PDFOBJ_STRING: 213ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return AsString()->Identical(pOther->AsString()); 214ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PDFOBJ_NAME: 215ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return AsName()->Identical(pOther->AsName()); 216ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PDFOBJ_ARRAY: 217ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return AsArray()->Identical(pOther->AsArray()); 218ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PDFOBJ_DICTIONARY: 219ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return AsDictionary()->Identical(pOther->AsDictionary()); 220ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PDFOBJ_NULL: 221ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 222ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PDFOBJ_STREAM: 223ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return AsStream()->Identical(pOther->AsStream()); 224ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PDFOBJ_REFERENCE: 225ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return AsReference()->Identical(pOther->AsReference()); 226ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 227ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 228e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 229e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 230ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Object* CPDF_Object::GetDirect() const { 231ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CPDF_Reference* pRef = AsReference(); 232ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pRef) 233ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return const_cast<CPDF_Object*>(this); 234ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pRef->m_pObjList) 235ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return nullptr; 236ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pRef->m_pObjList->GetIndirectObject(pRef->GetRefObjNum(), nullptr); 237e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 238e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 239ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Object* CPDF_Object::Clone(FX_BOOL bDirect) const { 240ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann std::set<FX_DWORD> visited; 241ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return CloneInternal(bDirect, &visited); 242ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 243ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Object* CPDF_Object::CloneInternal(FX_BOOL bDirect, 244ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann std::set<FX_DWORD>* visited) const { 245ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann switch (m_Type) { 246ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PDFOBJ_BOOLEAN: 247ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return new CPDF_Boolean(AsBoolean()->m_bValue); 248ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PDFOBJ_NUMBER: { 249ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CPDF_Number* pThis = AsNumber(); 250ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return new CPDF_Number(pThis->m_bInteger ? pThis->m_Integer 251ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann : pThis->m_Float); 252ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 253ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PDFOBJ_STRING: { 254ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CPDF_String* pString = AsString(); 255ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return new CPDF_String(pString->m_String, pString->IsHex()); 256ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 257ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PDFOBJ_NAME: 258ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return new CPDF_Name(AsName()->m_Name); 259ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PDFOBJ_ARRAY: { 260ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Array* pCopy = new CPDF_Array(); 261ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CPDF_Array* pThis = AsArray(); 262ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int n = pThis->GetCount(); 263ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < n; i++) { 264ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* value = pThis->m_Objects.GetAt(i); 265ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pCopy->m_Objects.Add(value->CloneInternal(bDirect, visited)); 266ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 267ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pCopy; 268ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 269ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PDFOBJ_DICTIONARY: { 270ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pCopy = new CPDF_Dictionary(); 271ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CPDF_Dictionary* pThis = AsDictionary(); 272ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (const auto& it : *pThis) { 273ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pCopy->m_Map.insert(std::make_pair( 274ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann it.first, it.second->CloneInternal(bDirect, visited))); 275ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 276ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pCopy; 277ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 278ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PDFOBJ_NULL: { 279ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return new CPDF_Null; 280ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 281ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PDFOBJ_STREAM: { 282ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CPDF_Stream* pThis = AsStream(); 283ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_StreamAcc acc; 284ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann acc.LoadAllData(pThis, TRUE); 285ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD streamSize = acc.GetSize(); 286ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pDict = pThis->GetDict(); 287ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pDict) { 288ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDict = ToDictionary(pDict->CloneInternal(bDirect, visited)); 289ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 290ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return new CPDF_Stream(acc.DetachData(), streamSize, pDict); 291ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 292ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case PDFOBJ_REFERENCE: { 293ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CPDF_Reference* pRef = AsReference(); 294ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD obj_num = pRef->GetRefObjNum(); 295ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bDirect && !pdfium::ContainsKey(*visited, obj_num)) { 296ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann visited->insert(obj_num); 297ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann auto* pDirect = pRef->GetDirect(); 298ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pDirect ? pDirect->CloneInternal(TRUE, visited) : nullptr; 299ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 300ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return new CPDF_Reference(pRef->m_pObjList, obj_num); 301ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 302ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 303ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return NULL; 304ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 305ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Object* CPDF_Object::CloneRef(CPDF_IndirectObjectHolder* pDoc) const { 306ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_ObjNum) { 307ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return new CPDF_Reference(pDoc, m_ObjNum); 308ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 309ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return Clone(); 310ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 311ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_WideString CPDF_Object::GetUnicodeText(CFX_CharMap* pCharMap) const { 312ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (const CPDF_String* pString = AsString()) 313ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return PDF_DecodeText(pString->m_String, pCharMap); 314e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 315ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (const CPDF_Stream* pStream = AsStream()) { 316ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_StreamAcc stream; 317ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann stream.LoadAllData(pStream, FALSE); 318ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_WideString result = 319ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PDF_DecodeText(stream.GetData(), stream.GetSize(), pCharMap); 320ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return result; 321ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 322ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (const CPDF_Name* pName = AsName()) 323ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return PDF_DecodeText(pName->m_Name, pCharMap); 324ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return CFX_WideString(); 325ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 326ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Object::SetUnicodeText(const FX_WCHAR* pUnicodes, int len) { 327ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (CPDF_String* pString = AsString()) { 328ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pString->m_String = PDF_EncodeText(pUnicodes, len); 329ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (CPDF_Stream* pStream = AsStream()) { 330ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString result = PDF_EncodeText(pUnicodes, len); 331ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pStream->SetData((uint8_t*)result.c_str(), result.GetLength(), FALSE, 332ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FALSE); 333ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 334e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 335e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 336ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Array* CPDF_Object::AsArray() { 337ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return IsArray() ? static_cast<CPDF_Array*>(this) : nullptr; 338e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 339e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 340ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannconst CPDF_Array* CPDF_Object::AsArray() const { 341ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return IsArray() ? static_cast<const CPDF_Array*>(this) : nullptr; 342e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 343ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 344ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Boolean* CPDF_Object::AsBoolean() { 345ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return IsBoolean() ? static_cast<CPDF_Boolean*>(this) : nullptr; 346e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 347ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 348ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannconst CPDF_Boolean* CPDF_Object::AsBoolean() const { 349ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return IsBoolean() ? static_cast<const CPDF_Boolean*>(this) : nullptr; 350e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 351ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 352ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Dictionary* CPDF_Object::AsDictionary() { 353ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return IsDictionary() ? static_cast<CPDF_Dictionary*>(this) : nullptr; 354e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 355ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 356ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannconst CPDF_Dictionary* CPDF_Object::AsDictionary() const { 357ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return IsDictionary() ? static_cast<const CPDF_Dictionary*>(this) : nullptr; 358e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 359ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 360ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Name* CPDF_Object::AsName() { 361ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return IsName() ? static_cast<CPDF_Name*>(this) : nullptr; 362e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 363ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 364ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannconst CPDF_Name* CPDF_Object::AsName() const { 365ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return IsName() ? static_cast<const CPDF_Name*>(this) : nullptr; 366e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 367ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 368ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Number* CPDF_Object::AsNumber() { 369ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return IsNumber() ? static_cast<CPDF_Number*>(this) : nullptr; 370e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 371ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 372ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannconst CPDF_Number* CPDF_Object::AsNumber() const { 373ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return IsNumber() ? static_cast<const CPDF_Number*>(this) : nullptr; 374e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 375ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 376ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Reference* CPDF_Object::AsReference() { 377ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return IsReference() ? static_cast<CPDF_Reference*>(this) : nullptr; 378e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 379ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 380ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannconst CPDF_Reference* CPDF_Object::AsReference() const { 381ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return IsReference() ? static_cast<const CPDF_Reference*>(this) : nullptr; 382e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 383ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 384ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Stream* CPDF_Object::AsStream() { 385ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return IsStream() ? static_cast<CPDF_Stream*>(this) : nullptr; 386e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 387ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 388ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannconst CPDF_Stream* CPDF_Object::AsStream() const { 389ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return IsStream() ? static_cast<const CPDF_Stream*>(this) : nullptr; 390e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 391ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 392ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_String* CPDF_Object::AsString() { 393ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return IsString() ? static_cast<CPDF_String*>(this) : nullptr; 394e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 395ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 396ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannconst CPDF_String* CPDF_Object::AsString() const { 397ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return IsString() ? static_cast<const CPDF_String*>(this) : nullptr; 398e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 399ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 400ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Number::CPDF_Number(int value) 401ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann : CPDF_Object(PDFOBJ_NUMBER), m_bInteger(TRUE), m_Integer(value) {} 402ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 403ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Number::CPDF_Number(FX_FLOAT value) 404ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann : CPDF_Object(PDFOBJ_NUMBER), m_bInteger(FALSE), m_Float(value) {} 405ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 406ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Number::CPDF_Number(const CFX_ByteStringC& str) 407ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann : CPDF_Object(PDFOBJ_NUMBER) { 408ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_atonum(str, m_bInteger, &m_Integer); 409e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 410ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 411ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Number::SetString(const CFX_ByteStringC& str) { 412ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_atonum(str, m_bInteger, &m_Integer); 413ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 414ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_Number::Identical(CPDF_Number* pOther) const { 415ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_bInteger == pOther->m_bInteger && m_Integer == pOther->m_Integer; 416ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 417ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_ByteString CPDF_Number::GetString() const { 418ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_bInteger ? CFX_ByteString::FormatInteger(m_Integer, FXFORMAT_SIGNED) 419ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann : CFX_ByteString::FormatFloat(m_Float); 420ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 421ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Number::SetNumber(FX_FLOAT value) { 422ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_bInteger = FALSE; 423ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Float = value; 424ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 425ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_String::CPDF_String(const CFX_WideString& str) 426ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann : CPDF_Object(PDFOBJ_STRING), m_bHex(FALSE) { 427ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_String = PDF_EncodeText(str); 428ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 429ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Array::~CPDF_Array() { 430ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int size = m_Objects.GetSize(); 431ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object** pList = m_Objects.GetData(); 432ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < size; i++) { 433ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pList[i]) 434ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pList[i]->Release(); 435ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 436ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 437ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_FloatRect CPDF_Array::GetRect() { 438ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_FloatRect rect; 439ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!IsArray() || m_Objects.GetSize() != 4) 440ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return rect; 441ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 442ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann rect.left = GetNumber(0); 443ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann rect.bottom = GetNumber(1); 444ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann rect.right = GetNumber(2); 445ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann rect.top = GetNumber(3); 446ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return rect; 447ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 448ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_Matrix CPDF_Array::GetMatrix() { 449ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_Matrix matrix; 450ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!IsArray() || m_Objects.GetSize() != 6) 451ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return matrix; 452ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 453ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann matrix.Set(GetNumber(0), GetNumber(1), GetNumber(2), GetNumber(3), 454ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann GetNumber(4), GetNumber(5)); 455ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return matrix; 456ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 457ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Object* CPDF_Array::GetElement(FX_DWORD i) const { 458ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (i >= (FX_DWORD)m_Objects.GetSize()) 459ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return nullptr; 460ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_Objects.GetAt(i); 461ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 462ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Object* CPDF_Array::GetElementValue(FX_DWORD i) const { 463ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (i >= (FX_DWORD)m_Objects.GetSize()) 464ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return nullptr; 465ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_Objects.GetAt(i)->GetDirect(); 466ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 467ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_ByteString CPDF_Array::GetString(FX_DWORD i) const { 468ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (i >= (FX_DWORD)m_Objects.GetSize()) 469ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return CFX_ByteString(); 470ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_Objects.GetAt(i)->GetString(); 471e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 472ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_ByteStringC CPDF_Array::GetConstString(FX_DWORD i) const { 473ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (i >= (FX_DWORD)m_Objects.GetSize()) 474ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return CFX_ByteStringC(); 475ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_Objects.GetAt(i)->GetConstString(); 476e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 477ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CPDF_Array::GetInteger(FX_DWORD i) const { 478ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (i >= (FX_DWORD)m_Objects.GetSize()) 479e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return 0; 480ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_Objects.GetAt(i)->GetInteger(); 481e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 482ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_FLOAT CPDF_Array::GetNumber(FX_DWORD i) const { 483ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (i >= (FX_DWORD)m_Objects.GetSize()) 484e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return 0; 485ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_Objects.GetAt(i)->GetNumber(); 486e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 487ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Dictionary* CPDF_Array::GetDict(FX_DWORD i) const { 488ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* p = GetElementValue(i); 489ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!p) 490e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return NULL; 491ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (CPDF_Dictionary* pDict = p->AsDictionary()) 492ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pDict; 493ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (CPDF_Stream* pStream = p->AsStream()) 494ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pStream->GetDict(); 495ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return NULL; 496e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 497ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Stream* CPDF_Array::GetStream(FX_DWORD i) const { 498ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return ToStream(GetElementValue(i)); 499e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 500ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Array* CPDF_Array::GetArray(FX_DWORD i) const { 501ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return ToArray(GetElementValue(i)); 502e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 503ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Array::RemoveAt(FX_DWORD i, int nCount) { 504ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (i >= (FX_DWORD)m_Objects.GetSize()) 505ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 506ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 507ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (nCount <= 0 || nCount > m_Objects.GetSize() - i) 508ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 509ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 510ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int j = 0; j < nCount; ++j) { 511ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (CPDF_Object* p = m_Objects.GetAt(i + j)) 512ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann p->Release(); 513ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 514ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Objects.RemoveAt(i, nCount); 515ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 516ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Array::SetAt(FX_DWORD i, 517ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* pObj, 518ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_IndirectObjectHolder* pObjs) { 519ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ASSERT(IsArray()); 520ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ASSERT(i < (FX_DWORD)m_Objects.GetSize()); 521ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (i >= (FX_DWORD)m_Objects.GetSize()) 522ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 523ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (CPDF_Object* pOld = m_Objects.GetAt(i)) 524ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pOld->Release(); 525ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pObj->GetObjNum()) { 526ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ASSERT(pObjs); 527ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pObj = new CPDF_Reference(pObjs, pObj->GetObjNum()); 528ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 529ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Objects.SetAt(i, pObj); 530ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 531ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Array::InsertAt(FX_DWORD index, 532ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* pObj, 533ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_IndirectObjectHolder* pObjs) { 534ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pObj->GetObjNum()) { 535ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ASSERT(pObjs); 536ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pObj = new CPDF_Reference(pObjs, pObj->GetObjNum()); 537ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 538ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Objects.InsertAt(index, pObj); 539ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 540ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Array::Add(CPDF_Object* pObj, CPDF_IndirectObjectHolder* pObjs) { 541ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pObj->GetObjNum()) { 542ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ASSERT(pObjs); 543ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pObj = new CPDF_Reference(pObjs, pObj->GetObjNum()); 544ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 545ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Objects.Add(pObj); 546ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 547ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Array::AddName(const CFX_ByteString& str) { 548ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ASSERT(IsArray()); 549ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Add(new CPDF_Name(str)); 550ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 551ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Array::AddString(const CFX_ByteString& str) { 552ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ASSERT(IsArray()); 553ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Add(new CPDF_String(str, FALSE)); 554ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 555ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Array::AddInteger(int i) { 556ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ASSERT(IsArray()); 557ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Add(new CPDF_Number(i)); 558ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 559ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Array::AddNumber(FX_FLOAT f) { 560ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ASSERT(IsArray()); 561ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Number* pNumber = new CPDF_Number; 562ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pNumber->SetNumber(f); 563ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Add(pNumber); 564ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 565ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Array::AddReference(CPDF_IndirectObjectHolder* pDoc, 566ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD objnum) { 567ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ASSERT(IsArray()); 568ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Add(new CPDF_Reference(pDoc, objnum)); 569ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 570ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_Array::Identical(CPDF_Array* pOther) const { 571ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_Objects.GetSize() != pOther->m_Objects.GetSize()) { 572ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 573ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 574ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < m_Objects.GetSize(); i++) { 575ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_Objects[i]->IsIdentical(pOther->m_Objects[i])) 576ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 577ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 578ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 579ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 580ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Dictionary::~CPDF_Dictionary() { 581ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (const auto& it : m_Map) { 582ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann it.second->Release(); 583ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 584ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 585ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Object* CPDF_Dictionary::GetElement(const CFX_ByteStringC& key) const { 586ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann auto it = m_Map.find(key); 587ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (it == m_Map.end()) 588ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return nullptr; 589ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return it->second; 590ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 591ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Object* CPDF_Dictionary::GetElementValue( 592ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_ByteStringC& key) const { 593ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* p = GetElement(key); 594ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return p ? p->GetDirect() : nullptr; 595ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 596ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_ByteString CPDF_Dictionary::GetString(const CFX_ByteStringC& key) const { 597ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* p = GetElement(key); 598ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (p) { 599ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return p->GetString(); 600ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 601ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return CFX_ByteString(); 602ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 603ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_ByteStringC CPDF_Dictionary::GetConstString( 604ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_ByteStringC& key) const { 605ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* p = GetElement(key); 606ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (p) { 607ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return p->GetConstString(); 608ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 609ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return CFX_ByteStringC(); 610ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 611ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_WideString CPDF_Dictionary::GetUnicodeText(const CFX_ByteStringC& key, 612ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_CharMap* pCharMap) const { 613ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* p = GetElement(key); 614ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (CPDF_Reference* pRef = ToReference(p)) 615ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann p = pRef->GetDirect(); 616ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return p ? p->GetUnicodeText(pCharMap) : CFX_WideString(); 617ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 618ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_ByteString CPDF_Dictionary::GetString(const CFX_ByteStringC& key, 619ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_ByteStringC& def) const { 620ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* p = GetElement(key); 621ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (p) { 622ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return p->GetString(); 623ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 624ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return CFX_ByteString(def); 625ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 626ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_ByteStringC CPDF_Dictionary::GetConstString( 627ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_ByteStringC& key, 628ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_ByteStringC& def) const { 629ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* p = GetElement(key); 630ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (p) { 631ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return p->GetConstString(); 632ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 633ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return CFX_ByteStringC(def); 634ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 635ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CPDF_Dictionary::GetInteger(const CFX_ByteStringC& key) const { 636ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* p = GetElement(key); 637ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (p) { 638ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return p->GetInteger(); 639ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 640ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 641e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 642ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CPDF_Dictionary::GetInteger(const CFX_ByteStringC& key, int def) const { 643ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* p = GetElement(key); 644ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (p) { 645ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return p->GetInteger(); 646ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 647ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return def; 648e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 649ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_FLOAT CPDF_Dictionary::GetNumber(const CFX_ByteStringC& key) const { 650ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* p = GetElement(key); 651ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (p) { 652ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return p->GetNumber(); 653ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 654ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 655e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 656ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_Dictionary::GetBoolean(const CFX_ByteStringC& key, 657ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bDefault) const { 658ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* p = GetElement(key); 659ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (ToBoolean(p)) 660ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return p->GetInteger(); 661ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return bDefault; 662ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 663ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Dictionary* CPDF_Dictionary::GetDict(const CFX_ByteStringC& key) const { 664ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* p = GetElementValue(key); 665ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!p) 666ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return nullptr; 667ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (CPDF_Dictionary* pDict = p->AsDictionary()) 668ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pDict; 669ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (CPDF_Stream* pStream = p->AsStream()) 670ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pStream->GetDict(); 671ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return nullptr; 672ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 673ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Array* CPDF_Dictionary::GetArray(const CFX_ByteStringC& key) const { 674ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return ToArray(GetElementValue(key)); 675ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 676ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Stream* CPDF_Dictionary::GetStream(const CFX_ByteStringC& key) const { 677ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return ToStream(GetElementValue(key)); 678ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 679ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_FloatRect CPDF_Dictionary::GetRect(const CFX_ByteStringC& key) const { 680ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_FloatRect rect; 681ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Array* pArray = GetArray(key); 682ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pArray) 683ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann rect = pArray->GetRect(); 684ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return rect; 685ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 686ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_Matrix CPDF_Dictionary::GetMatrix(const CFX_ByteStringC& key) const { 687ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_Matrix matrix; 688ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Array* pArray = GetArray(key); 689ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pArray) 690ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann matrix = pArray->GetMatrix(); 691ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return matrix; 692ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 693ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_Dictionary::KeyExist(const CFX_ByteStringC& key) const { 694ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pdfium::ContainsKey(m_Map, key); 695ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 696ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 697ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Dictionary::SetAt(const CFX_ByteStringC& key, CPDF_Object* pObj) { 698ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ASSERT(IsDictionary()); 699ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann // Avoid 2 constructions of CFX_ByteString. 700ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString key_bytestring = key; 701ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann auto it = m_Map.find(key_bytestring); 702ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (it == m_Map.end()) { 703ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pObj) { 704ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Map.insert(std::make_pair(key_bytestring, pObj)); 705e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 706ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 707ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 708ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 709ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (it->second == pObj) 710ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 711ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann it->second->Release(); 712ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 713ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pObj) 714ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann it->second = pObj; 715ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann else 716ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Map.erase(it); 717ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 718ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Dictionary::RemoveAt(const CFX_ByteStringC& key) { 719ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ASSERT(m_Type == PDFOBJ_DICTIONARY); 720ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann auto it = m_Map.find(key); 721ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (it == m_Map.end()) 722ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 723ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 724ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann it->second->Release(); 725ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Map.erase(it); 726ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 727ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Dictionary::ReplaceKey(const CFX_ByteStringC& oldkey, 728ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_ByteStringC& newkey) { 729ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ASSERT(m_Type == PDFOBJ_DICTIONARY); 730ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann auto old_it = m_Map.find(oldkey); 731ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (old_it == m_Map.end()) 732ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 733ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 734ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann // Avoid 2 constructions of CFX_ByteString. 735ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString newkey_bytestring = newkey; 736ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann auto new_it = m_Map.find(newkey_bytestring); 737ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (new_it == old_it) 738ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 739ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 740ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (new_it != m_Map.end()) { 741ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann new_it->second->Release(); 742ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann new_it->second = old_it->second; 743ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 744ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Map.insert(std::make_pair(newkey_bytestring, old_it->second)); 745ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 746ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Map.erase(old_it); 747ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 748ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_Dictionary::Identical(CPDF_Dictionary* pOther) const { 749ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pOther) { 750ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 751ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 752ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_Map.size() != pOther->m_Map.size()) { 753ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 754ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 755ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (const auto& it : m_Map) { 756ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_ByteString& key = it.first; 757ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!it.second->IsIdentical(pOther->GetElement(key))) 758ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 759ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 760ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 761ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 762ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Dictionary::SetAtInteger(const CFX_ByteStringC& key, int i) { 763ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann SetAt(key, new CPDF_Number(i)); 764ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 765ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Dictionary::SetAtName(const CFX_ByteStringC& key, 766ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_ByteString& name) { 767ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann SetAt(key, new CPDF_Name(name)); 768ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 769ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Dictionary::SetAtString(const CFX_ByteStringC& key, 770ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_ByteString& str) { 771ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann SetAt(key, new CPDF_String(str, FALSE)); 772ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 773ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Dictionary::SetAtReference(const CFX_ByteStringC& key, 774ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_IndirectObjectHolder* pDoc, 775ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD objnum) { 776ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann SetAt(key, new CPDF_Reference(pDoc, objnum)); 777ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 778ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Dictionary::AddReference(const CFX_ByteStringC& key, 779ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_IndirectObjectHolder* pDoc, 780ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD objnum) { 781ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann SetAt(key, new CPDF_Reference(pDoc, objnum)); 782ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 783ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Dictionary::SetAtNumber(const CFX_ByteStringC& key, FX_FLOAT f) { 784ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Number* pNumber = new CPDF_Number; 785ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pNumber->SetNumber(f); 786ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann SetAt(key, pNumber); 787ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 788ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Dictionary::SetAtBoolean(const CFX_ByteStringC& key, FX_BOOL bValue) { 789ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann SetAt(key, new CPDF_Boolean(bValue)); 790ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 791ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Dictionary::SetAtRect(const CFX_ByteStringC& key, 792ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_FloatRect& rect) { 793ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Array* pArray = new CPDF_Array; 794ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pArray->AddNumber(rect.left); 795ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pArray->AddNumber(rect.bottom); 796ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pArray->AddNumber(rect.right); 797ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pArray->AddNumber(rect.top); 798ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann SetAt(key, pArray); 799ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 800ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Dictionary::SetAtMatrix(const CFX_ByteStringC& key, 801ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_Matrix& matrix) { 802ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Array* pArray = new CPDF_Array; 803ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pArray->AddNumber16(matrix.a); 804ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pArray->AddNumber16(matrix.b); 805ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pArray->AddNumber16(matrix.c); 806ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pArray->AddNumber16(matrix.d); 807ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pArray->AddNumber(matrix.e); 808ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pArray->AddNumber(matrix.f); 809ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann SetAt(key, pArray); 810ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 811ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Stream::CPDF_Stream(uint8_t* pData, FX_DWORD size, CPDF_Dictionary* pDict) 812ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann : CPDF_Object(PDFOBJ_STREAM), 813ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pDict(pDict), 814ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_dwSize(size), 815ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_GenNum(kMemoryBasedGenNum), 816ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pDataBuf(pData) {} 817ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 818ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Stream::~CPDF_Stream() { 819ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (IsMemoryBased()) 820ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_Free(m_pDataBuf); 821ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 822ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pDict) 823ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pDict->Release(); 824e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 825ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 826ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Stream::InitStreamInternal(CPDF_Dictionary* pDict) { 827ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pDict) { 828ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pDict) 829ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pDict->Release(); 830e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_pDict = pDict; 831ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 832ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (IsMemoryBased()) 833ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_Free(m_pDataBuf); 834ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 835ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_GenNum = 0; 836ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pFile = nullptr; 837e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 838ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 839ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Stream::InitStream(uint8_t* pData, 840ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD size, 841ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pDict) { 842ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann InitStreamInternal(pDict); 843ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_GenNum = kMemoryBasedGenNum; 844ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pDataBuf = FX_Alloc(uint8_t, size); 845ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pData) { 846ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_memcpy(m_pDataBuf, pData, size); 847ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 848ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_dwSize = size; 849ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pDict) { 850ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pDict->SetAtInteger("Length", size); 851ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 852ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 853ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Stream::SetData(const uint8_t* pData, 854ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD size, 855ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bCompressed, 856ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bKeepBuf) { 857ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (IsMemoryBased()) 858ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_Free(m_pDataBuf); 859ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_GenNum = kMemoryBasedGenNum; 860ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 861ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bKeepBuf) { 862ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pDataBuf = (uint8_t*)pData; 863ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 864ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pDataBuf = FX_Alloc(uint8_t, size); 865e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pData) { 866ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_memcpy(m_pDataBuf, pData, size); 867ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 868ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 869ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_dwSize = size; 870ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_pDict) 871ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pDict = new CPDF_Dictionary; 872ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pDict->SetAtInteger("Length", size); 873ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!bCompressed) { 874ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pDict->RemoveAt("Filter"); 875ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pDict->RemoveAt("DecodeParms"); 876ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 877ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 878ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_Stream::ReadRawData(FX_FILESIZE offset, 879ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann uint8_t* buf, 880ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD size) const { 881ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!IsMemoryBased() && m_pFile) 882ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_pFile->ReadBlock(buf, offset, size); 883ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 884ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pDataBuf) 885ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_memcpy(buf, m_pDataBuf + offset, size); 886ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 887ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 888ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Stream::InitStreamFromFile(IFX_FileRead* pFile, 889ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pDict) { 890ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann InitStreamInternal(pDict); 891ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pFile = pFile; 892ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_dwSize = (FX_DWORD)pFile->GetSize(); 893ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pDict) { 894ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pDict->SetAtInteger("Length", m_dwSize); 895ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 896e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 897e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 898ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_Stream::Identical(CPDF_Stream* pOther) const { 899ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_pDict) 900ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return !pOther->m_pDict; 901ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 902ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_pDict->Identical(pOther->m_pDict)) 903ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 904ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 905ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_dwSize != pOther->m_dwSize) 906ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 907ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 908ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!IsMemoryBased() && !pOther->IsMemoryBased()) { 909ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pFile == pOther->m_pFile && !m_pFile) 910ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 911ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 912ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_pFile || !pOther->m_pFile) 913ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 914ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 915ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann uint8_t srcBuf[kBlockSize]; 916ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann uint8_t destBuf[kBlockSize]; 917ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD size = m_dwSize; 918ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pFile == pOther->m_pFile) 919ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 920ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 921ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD offset = 0; 922ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (size > 0) { 923ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD actualSize = std::min(size, kBlockSize); 924ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pFile->ReadBlock(srcBuf, offset, actualSize); 925ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pOther->m_pFile->ReadBlock(destBuf, offset, actualSize); 926ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (FXSYS_memcmp(srcBuf, destBuf, actualSize) != 0) 927e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 928ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 929ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann size -= actualSize; 930ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann offset += actualSize; 931e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 932ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 933ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 934ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 935ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!IsMemoryBased() || !pOther->IsMemoryBased()) { 936ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann IFX_FileRead* pFile = nullptr; 937ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann uint8_t* pBuf = nullptr; 938ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pOther->IsMemoryBased()) { 939ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pFile = pOther->m_pFile; 940ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pBuf = m_pDataBuf; 941ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (!IsMemoryBased()) { 942ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pFile = m_pFile; 943ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pBuf = pOther->m_pDataBuf; 944ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 945ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pBuf) 946ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 947ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 948ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann uint8_t srcBuf[kBlockSize]; 949ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD size = m_dwSize; 950ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD offset = 0; 951ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (size > 0) { 952ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD actualSize = std::min(size, kBlockSize); 953ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pFile->ReadBlock(srcBuf, offset, actualSize); 954ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (FXSYS_memcmp(srcBuf, pBuf, actualSize) != 0) 955e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 956ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 957ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pBuf += actualSize; 958ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann size -= actualSize; 959ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann offset += actualSize; 960e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 961ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 962ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 963ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FXSYS_memcmp(m_pDataBuf, pOther->m_pDataBuf, m_dwSize) == 0; 964e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 965ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 966ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_StreamAcc::CPDF_StreamAcc() { 967ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_bNewBuf = FALSE; 968ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pData = NULL; 969ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_dwSize = 0; 970ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pImageParam = NULL; 971ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStream = NULL; 972ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pSrcData = NULL; 973ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 974ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamAcc::LoadAllData(const CPDF_Stream* pStream, 975ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bRawAccess, 976ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD estimated_size, 977ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bImageAcc) { 978ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pStream) 979ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 980ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 981ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStream = pStream; 982ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pStream->IsMemoryBased() && 983ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann (!pStream->GetDict()->KeyExist("Filter") || bRawAccess)) { 984ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_dwSize = pStream->m_dwSize; 985ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pData = (uint8_t*)pStream->m_pDataBuf; 986ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 987ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 988ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann uint8_t* pSrcData; 989ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD dwSrcSize = pStream->m_dwSize; 990ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (dwSrcSize == 0) 991ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 992ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 993ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pStream->IsMemoryBased()) { 994ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pSrcData = m_pSrcData = FX_Alloc(uint8_t, dwSrcSize); 995ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pStream->ReadRawData(0, pSrcData, dwSrcSize)) 996ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 997ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 998ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pSrcData = pStream->m_pDataBuf; 999ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1000ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann uint8_t* pDecryptedData = pSrcData; 1001ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD dwDecryptedSize = dwSrcSize; 1002ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pStream->GetDict()->KeyExist("Filter") || bRawAccess) { 1003ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pData = pDecryptedData; 1004ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_dwSize = dwDecryptedSize; 1005ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 1006ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bRet = PDF_DataDecode( 1007ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDecryptedData, dwDecryptedSize, m_pStream->GetDict(), m_pData, 1008ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_dwSize, m_ImageDecoder, m_pImageParam, estimated_size, bImageAcc); 1009ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!bRet) { 1010ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pData = pDecryptedData; 1011ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_dwSize = dwDecryptedSize; 1012ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1013ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1014ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pSrcData != pStream->m_pDataBuf && pSrcData != m_pData) { 1015ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_Free(pSrcData); 1016ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1017ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pDecryptedData != pSrcData && pDecryptedData != m_pData) { 1018ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_Free(pDecryptedData); 1019ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1020ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pSrcData = NULL; 1021ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_bNewBuf = m_pData != pStream->m_pDataBuf; 1022ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 1023ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_StreamAcc::~CPDF_StreamAcc() { 1024ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_bNewBuf) { 1025ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_Free(m_pData); 1026ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1027ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_Free(m_pSrcData); 1028ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 1029ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannconst uint8_t* CPDF_StreamAcc::GetData() const { 1030ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_bNewBuf) { 1031ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_pData; 1032ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1033ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_pStream) { 1034ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return NULL; 1035ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1036ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_pStream->m_pDataBuf; 1037ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 1038ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_DWORD CPDF_StreamAcc::GetSize() const { 1039ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_bNewBuf) { 1040ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_dwSize; 1041ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1042ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_pStream) { 1043ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 1044ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1045ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_pStream->m_dwSize; 1046e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1047ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannuint8_t* CPDF_StreamAcc::DetachData() { 1048ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_bNewBuf) { 1049ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann uint8_t* p = m_pData; 1050ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pData = NULL; 1051ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_dwSize = 0; 1052e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return p; 1053ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1054ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann uint8_t* p = FX_Alloc(uint8_t, m_dwSize); 1055ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_memcpy(p, m_pData, m_dwSize); 1056ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return p; 1057ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 1058ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Reference::SetRef(CPDF_IndirectObjectHolder* pDoc, FX_DWORD objnum) { 1059ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pObjList = pDoc; 1060ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_RefObjNum = objnum; 1061ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 1062ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_IndirectObjectHolder::CPDF_IndirectObjectHolder(CPDF_Parser* pParser) 1063ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann : m_pParser(pParser), m_LastObjNum(0) { 1064ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pParser) 1065ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_LastObjNum = m_pParser->GetLastObjNum(); 1066ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 1067ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_IndirectObjectHolder::~CPDF_IndirectObjectHolder() { 1068ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (const auto& pair : m_IndirectObjs) { 1069ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pair.second->Destroy(); 1070ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1071ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 1072ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Object* CPDF_IndirectObjectHolder::GetIndirectObject( 1073ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD objnum, 1074ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PARSE_CONTEXT* pContext) { 1075ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (objnum == 0) 1076ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return nullptr; 1077ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 1078ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann auto it = m_IndirectObjs.find(objnum); 1079ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (it != m_IndirectObjs.end()) 1080ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return it->second->GetObjNum() != -1 ? it->second : nullptr; 1081ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 1082ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_pParser) 1083ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return nullptr; 1084ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 1085ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* pObj = m_pParser->ParseIndirectObject(this, objnum, pContext); 1086ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pObj) 1087ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return nullptr; 1088ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 1089ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pObj->m_ObjNum = objnum; 1090ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_LastObjNum = std::max(m_LastObjNum, objnum); 1091ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_IndirectObjs[objnum]) 1092ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_IndirectObjs[objnum]->Destroy(); 1093ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 1094ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_IndirectObjs[objnum] = pObj; 1095ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pObj; 1096e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1097ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CPDF_IndirectObjectHolder::GetIndirectType(FX_DWORD objnum) { 1098ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann auto it = m_IndirectObjs.find(objnum); 1099ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (it != m_IndirectObjs.end()) 1100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return it->second->GetType(); 1101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 1102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_pParser) 1103e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return 0; 1104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 1105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PARSE_CONTEXT context; 1106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_memset(&context, 0, sizeof(PARSE_CONTEXT)); 1107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann context.m_Flags = PDFPARSE_TYPEONLY; 1108ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return (int)(uintptr_t)m_pParser->ParseIndirectObject(this, objnum, &context); 1109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 1110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_DWORD CPDF_IndirectObjectHolder::AddIndirectObject(CPDF_Object* pObj) { 1111ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pObj->m_ObjNum) { 1112ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pObj->m_ObjNum; 1113ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1114ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_LastObjNum++; 1115ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_IndirectObjs[m_LastObjNum] = pObj; 1116ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pObj->m_ObjNum = m_LastObjNum; 1117ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_LastObjNum; 1118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 1119ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_IndirectObjectHolder::ReleaseIndirectObject(FX_DWORD objnum) { 1120ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann auto it = m_IndirectObjs.find(objnum); 1121ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (it == m_IndirectObjs.end() || it->second->GetObjNum() == -1) 1122ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 1123ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann it->second->Destroy(); 1124ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_IndirectObjs.erase(it); 1125ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 1126ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_IndirectObjectHolder::InsertIndirectObject(FX_DWORD objnum, 1127ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* pObj) { 1128ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!objnum || !pObj) 1129ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 1130ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann auto it = m_IndirectObjs.find(objnum); 1131ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (it != m_IndirectObjs.end()) { 1132ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pObj->GetGenNum() <= it->second->GetGenNum()) { 1133ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pObj->Destroy(); 1134ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 1135ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1136ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann it->second->Destroy(); 1137ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1138ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pObj->m_ObjNum = objnum; 1139ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_IndirectObjs[objnum] = pObj; 1140ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_LastObjNum = std::max(m_LastObjNum, objnum); 1141ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 1142e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1143