OLD | NEW |
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include "../../../include/fpdfapi/fpdf_parser.h" | 7 #include "../../../include/fpdfapi/fpdf_parser.h" |
8 #include "../../../include/fxcrt/fx_string.h" | 8 #include "../../../include/fxcrt/fx_string.h" |
9 | 9 |
10 //static | 10 //static |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
153 } | 153 } |
154 return pObj->GetDict(); | 154 return pObj->GetDict(); |
155 } | 155 } |
156 } | 156 } |
157 return NULL; | 157 return NULL; |
158 } | 158 } |
159 CPDF_Array* CPDF_Object::GetArray() const | 159 CPDF_Array* CPDF_Object::GetArray() const |
160 { | 160 { |
161 if (m_Type == PDFOBJ_ARRAY) | 161 if (m_Type == PDFOBJ_ARRAY) |
162 return (CPDF_Array*)this; | 162 return (CPDF_Array*)this; |
163 else | 163 |
164 return NULL; | 164 return NULL; |
165 } | 165 } |
166 void CPDF_Object::SetString(const CFX_ByteString& str) | 166 void CPDF_Object::SetString(const CFX_ByteString& str) |
167 { | 167 { |
168 ASSERT(this != NULL); | 168 ASSERT(this != NULL); |
169 switch (m_Type) { | 169 switch (m_Type) { |
170 case PDFOBJ_BOOLEAN: | 170 case PDFOBJ_BOOLEAN: |
171 ((CPDF_Boolean*)this)->m_bValue = str == FX_BSTRC("true") ? 1 : 0; | 171 ((CPDF_Boolean*)this)->m_bValue = str == FX_BSTRC("true") ? 1 : 0; |
172 return; | 172 return; |
173 case PDFOBJ_NUMBER: | 173 case PDFOBJ_NUMBER: |
174 ((CPDF_Number*)this)->SetString(str); | 174 ((CPDF_Number*)this)->SetString(str); |
(...skipping 19 matching lines...) Expand all Loading... |
194 { | 194 { |
195 if (this == pOther) { | 195 if (this == pOther) { |
196 return TRUE; | 196 return TRUE; |
197 } | 197 } |
198 if (pOther == NULL) { | 198 if (pOther == NULL) { |
199 return FALSE; | 199 return FALSE; |
200 } | 200 } |
201 if (pOther->m_Type != m_Type) { | 201 if (pOther->m_Type != m_Type) { |
202 if (m_Type == PDFOBJ_REFERENCE && GetDirect()) { | 202 if (m_Type == PDFOBJ_REFERENCE && GetDirect()) { |
203 return GetDirect()->IsIdentical(pOther); | 203 return GetDirect()->IsIdentical(pOther); |
204 } else if (pOther->m_Type == PDFOBJ_REFERENCE) { | 204 } |
| 205 if (pOther->m_Type == PDFOBJ_REFERENCE) { |
205 return IsIdentical(pOther->GetDirect()); | 206 return IsIdentical(pOther->GetDirect()); |
206 } | 207 } |
207 return FALSE; | 208 return FALSE; |
208 } | 209 } |
209 switch (m_Type) { | 210 switch (m_Type) { |
210 case PDFOBJ_BOOLEAN: | 211 case PDFOBJ_BOOLEAN: |
211 return (((CPDF_Boolean*)this)->Identical((CPDF_Boolean*)pOther)); | 212 return (((CPDF_Boolean*)this)->Identical((CPDF_Boolean*)pOther)); |
212 case PDFOBJ_NUMBER: | 213 case PDFOBJ_NUMBER: |
213 return (((CPDF_Number*)this)->Identical((CPDF_Number*)pOther)); | 214 return (((CPDF_Number*)this)->Identical((CPDF_Number*)pOther)); |
214 case PDFOBJ_STRING: | 215 case PDFOBJ_STRING: |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
278 return pCopy; | 279 return pCopy; |
279 } | 280 } |
280 case PDFOBJ_NULL: { | 281 case PDFOBJ_NULL: { |
281 return new CPDF_Null; | 282 return new CPDF_Null; |
282 } | 283 } |
283 case PDFOBJ_STREAM: { | 284 case PDFOBJ_STREAM: { |
284 CPDF_Stream* pThis = (CPDF_Stream*)this; | 285 CPDF_Stream* pThis = (CPDF_Stream*)this; |
285 CPDF_StreamAcc acc; | 286 CPDF_StreamAcc acc; |
286 acc.LoadAllData(pThis, TRUE); | 287 acc.LoadAllData(pThis, TRUE); |
287 FX_DWORD streamSize = acc.GetSize(); | 288 FX_DWORD streamSize = acc.GetSize(); |
288 CPDF_Stream* pObj; | 289 CPDF_Dictionary* pDict = pThis->GetDict(); |
289 if (pThis->GetDict()) | 290 if (pDict) |
290 pObj = new CPDF_Stream(acc.DetachData(), streamSize, (CPDF_D
ictionary*)((CPDF_Object*)pThis->GetDict())->CloneInternal(bDirect, visited)); | 291 pDict = (CPDF_Dictionary*)((CPDF_Object*)pDict)->CloneIntern
al(bDirect, visited); |
291 else | 292 return new CPDF_Stream(acc.DetachData(), streamSize, pDict); |
292 pObj = new CPDF_Stream(acc.DetachData(), streamSize, NULL); | |
293 return pObj; | |
294 } | 293 } |
295 case PDFOBJ_REFERENCE: { | 294 case PDFOBJ_REFERENCE: { |
296 CPDF_Reference* pRef = (CPDF_Reference*)this; | 295 CPDF_Reference* pRef = (CPDF_Reference*)this; |
297 FX_DWORD obj_num = pRef->m_RefObjNum; | 296 FX_DWORD obj_num = pRef->m_RefObjNum; |
298 if (bDirect && !visited->GetValueAt((void*)(uintptr_t)obj_num))
{ | 297 if (bDirect && !visited->GetValueAt((void*)(uintptr_t)obj_num))
{ |
299 visited->SetAt((void*)(uintptr_t)obj_num, (void*)1); | 298 visited->SetAt((void*)(uintptr_t)obj_num, (void*)1); |
300 CPDF_Object* ret; | 299 if (!pRef->GetDirect()) |
301 if (pRef->GetDirect()) | 300 return nullptr; |
302 ret = pRef->GetDirect()->CloneInternal(TRUE, visited); | 301 |
303 else | 302 return pRef->GetDirect()->CloneInternal(TRUE, visited); |
304 ret = NULL; | |
305 return ret; | |
306 } else { | |
307 return new CPDF_Reference(pRef->m_pObjList, obj_num); | |
308 } | 303 } |
| 304 return new CPDF_Reference(pRef->m_pObjList, obj_num); |
309 } | 305 } |
310 } | 306 } |
311 return NULL; | 307 return NULL; |
312 } | 308 } |
313 CPDF_Object* CPDF_Object::CloneRef(CPDF_IndirectObjects* pDoc) const | 309 CPDF_Object* CPDF_Object::CloneRef(CPDF_IndirectObjects* pDoc) const |
314 { | 310 { |
315 if (m_ObjNum) { | 311 if (m_ObjNum) { |
316 return new CPDF_Reference(pDoc, m_ObjNum); | 312 return new CPDF_Reference(pDoc, m_ObjNum); |
317 } | 313 } |
318 return Clone(); | 314 return Clone(); |
319 } | 315 } |
320 CFX_WideString CPDF_Object::GetUnicodeText(CFX_CharMap* pCharMap) const | 316 CFX_WideString CPDF_Object::GetUnicodeText(CFX_CharMap* pCharMap) const |
321 { | 317 { |
322 if (m_Type == PDFOBJ_STRING) { | 318 if (m_Type == PDFOBJ_STRING) { |
323 return PDF_DecodeText(((CPDF_String*)this)->m_String, pCharMap); | 319 return PDF_DecodeText(((CPDF_String*)this)->m_String, pCharMap); |
324 } else if (m_Type == PDFOBJ_STREAM) { | 320 } |
| 321 if (m_Type == PDFOBJ_STREAM) { |
325 CPDF_StreamAcc stream; | 322 CPDF_StreamAcc stream; |
326 stream.LoadAllData((CPDF_Stream*)this, FALSE); | 323 stream.LoadAllData((CPDF_Stream*)this, FALSE); |
327 CFX_WideString result = PDF_DecodeText(stream.GetData(), stream.GetSize(
), pCharMap); | 324 CFX_WideString result = PDF_DecodeText(stream.GetData(), stream.GetSize(
), pCharMap); |
328 return result; | 325 return result; |
329 } else if (m_Type == PDFOBJ_NAME) { | 326 } |
| 327 if (m_Type == PDFOBJ_NAME) { |
330 return PDF_DecodeText(((CPDF_Name*)this)->m_Name, pCharMap); | 328 return PDF_DecodeText(((CPDF_Name*)this)->m_Name, pCharMap); |
331 } | 329 } |
332 return CFX_WideString(); | 330 return CFX_WideString(); |
333 } | 331 } |
334 void CPDF_Object::SetUnicodeText(const FX_WCHAR* pUnicodes, int len) | 332 void CPDF_Object::SetUnicodeText(const FX_WCHAR* pUnicodes, int len) |
335 { | 333 { |
336 if (m_Type == PDFOBJ_STRING) { | 334 if (m_Type == PDFOBJ_STRING) { |
337 ((CPDF_String*)this)->m_String = PDF_EncodeText(pUnicodes, len); | 335 ((CPDF_String*)this)->m_String = PDF_EncodeText(pUnicodes, len); |
338 } else if (m_Type == PDFOBJ_STREAM) { | 336 } else if (m_Type == PDFOBJ_STREAM) { |
339 CFX_ByteString result = PDF_EncodeText(pUnicodes, len); | 337 CFX_ByteString result = PDF_EncodeText(pUnicodes, len); |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
420 return NULL; | 418 return NULL; |
421 } | 419 } |
422 return ((CPDF_Object*)m_Objects.GetAt(i))->GetDirect(); | 420 return ((CPDF_Object*)m_Objects.GetAt(i))->GetDirect(); |
423 } | 421 } |
424 CFX_ByteString CPDF_Array::GetString(FX_DWORD i) const | 422 CFX_ByteString CPDF_Array::GetString(FX_DWORD i) const |
425 { | 423 { |
426 if (i < (FX_DWORD)m_Objects.GetSize()) { | 424 if (i < (FX_DWORD)m_Objects.GetSize()) { |
427 CPDF_Object* p = (CPDF_Object*)m_Objects.GetAt(i); | 425 CPDF_Object* p = (CPDF_Object*)m_Objects.GetAt(i); |
428 return p->GetString(); | 426 return p->GetString(); |
429 } | 427 } |
430 else | 428 return CFX_ByteString(); |
431 return CFX_ByteString(); | |
432 } | 429 } |
433 CFX_ByteStringC CPDF_Array::GetConstString(FX_DWORD i) const | 430 CFX_ByteStringC CPDF_Array::GetConstString(FX_DWORD i) const |
434 { | 431 { |
435 if (i < (FX_DWORD)m_Objects.GetSize()) { | 432 if (i < (FX_DWORD)m_Objects.GetSize()) { |
436 CPDF_Object* p = (CPDF_Object*)m_Objects.GetAt(i); | 433 CPDF_Object* p = (CPDF_Object*)m_Objects.GetAt(i); |
437 return p->GetConstString(); | 434 return p->GetConstString(); |
438 } | 435 } |
439 else | 436 return CFX_ByteStringC(); |
440 return CFX_ByteStringC(); | |
441 } | 437 } |
442 int CPDF_Array::GetInteger(FX_DWORD i) const | 438 int CPDF_Array::GetInteger(FX_DWORD i) const |
443 { | 439 { |
444 if (i >= (FX_DWORD)m_Objects.GetSize()) { | 440 if (i >= (FX_DWORD)m_Objects.GetSize()) { |
445 return 0; | 441 return 0; |
446 } | 442 } |
447 CPDF_Object* p = (CPDF_Object*)m_Objects.GetAt(i); | 443 CPDF_Object* p = (CPDF_Object*)m_Objects.GetAt(i); |
448 return p->GetInteger(); | 444 return p->GetInteger(); |
449 } | 445 } |
450 FX_FLOAT CPDF_Array::GetNumber(FX_DWORD i) const | 446 FX_FLOAT CPDF_Array::GetNumber(FX_DWORD i) const |
451 { | 447 { |
452 if (i >= (FX_DWORD)m_Objects.GetSize()) { | 448 if (i >= (FX_DWORD)m_Objects.GetSize()) { |
453 return 0; | 449 return 0; |
454 } | 450 } |
455 CPDF_Object* p = (CPDF_Object*)m_Objects.GetAt(i); | 451 CPDF_Object* p = (CPDF_Object*)m_Objects.GetAt(i); |
456 return p->GetNumber(); | 452 return p->GetNumber(); |
457 } | 453 } |
458 CPDF_Dictionary* CPDF_Array::GetDict(FX_DWORD i) const | 454 CPDF_Dictionary* CPDF_Array::GetDict(FX_DWORD i) const |
459 { | 455 { |
460 CPDF_Object* p = GetElementValue(i); | 456 CPDF_Object* p = GetElementValue(i); |
461 if (p == NULL) { | 457 if (!p) { |
462 return NULL; | 458 return NULL; |
463 } else if (p->GetType() == PDFOBJ_DICTIONARY) { | 459 } |
| 460 if (p->GetType() == PDFOBJ_DICTIONARY) { |
464 return (CPDF_Dictionary*)p; | 461 return (CPDF_Dictionary*)p; |
465 } else if (p->GetType() == PDFOBJ_STREAM) { | 462 } |
| 463 if (p->GetType() == PDFOBJ_STREAM) { |
466 return ((CPDF_Stream*)p)->GetDict(); | 464 return ((CPDF_Stream*)p)->GetDict(); |
467 } | 465 } |
468 return NULL; | 466 return NULL; |
469 } | 467 } |
470 CPDF_Stream* CPDF_Array::GetStream(FX_DWORD i) const | 468 CPDF_Stream* CPDF_Array::GetStream(FX_DWORD i) const |
471 { | 469 { |
472 CPDF_Object* p = GetElementValue(i); | 470 CPDF_Object* p = GetElementValue(i); |
473 if (p == NULL || p->GetType() != PDFOBJ_STREAM) { | 471 if (p == NULL || p->GetType() != PDFOBJ_STREAM) { |
474 return NULL; | 472 return NULL; |
475 } | 473 } |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
597 CPDF_Object* CPDF_Dictionary::GetElementValue(const CFX_ByteStringC& key) const | 595 CPDF_Object* CPDF_Dictionary::GetElementValue(const CFX_ByteStringC& key) const |
598 { | 596 { |
599 CPDF_Object* p = NULL; | 597 CPDF_Object* p = NULL; |
600 m_Map.Lookup(key, (void*&)p); | 598 m_Map.Lookup(key, (void*&)p); |
601 return p ? p->GetDirect() : NULL; | 599 return p ? p->GetDirect() : NULL; |
602 } | 600 } |
603 CFX_ByteString CPDF_Dictionary::GetString(const CFX_ByteStringC& key) const | 601 CFX_ByteString CPDF_Dictionary::GetString(const CFX_ByteStringC& key) const |
604 { | 602 { |
605 CPDF_Object* p = NULL; | 603 CPDF_Object* p = NULL; |
606 m_Map.Lookup(key, (void*&)p); | 604 m_Map.Lookup(key, (void*&)p); |
607 if (p) | 605 if (p) { |
608 return p->GetString(); | 606 return p->GetString(); |
609 else | 607 } |
610 return CFX_ByteString(); | 608 return CFX_ByteString(); |
611 } | 609 } |
612 CFX_ByteStringC CPDF_Dictionary::GetConstString(const CFX_ByteStringC& key) cons
t | 610 CFX_ByteStringC CPDF_Dictionary::GetConstString(const CFX_ByteStringC& key) cons
t |
613 { | 611 { |
614 CPDF_Object* p = NULL; | 612 CPDF_Object* p = NULL; |
615 m_Map.Lookup(key, (void*&)p); | 613 m_Map.Lookup(key, (void*&)p); |
616 if (p) | 614 if (p) { |
617 return p->GetConstString(); | 615 return p->GetConstString(); |
618 else | 616 } |
619 return CFX_ByteStringC(); | 617 return CFX_ByteStringC(); |
620 } | 618 } |
621 CFX_WideString CPDF_Dictionary::GetUnicodeText(const CFX_ByteStringC& key, CFX_C
harMap* pCharMap) const | 619 CFX_WideString CPDF_Dictionary::GetUnicodeText(const CFX_ByteStringC& key, CFX_C
harMap* pCharMap) const |
622 { | 620 { |
623 CPDF_Object* p = NULL; | 621 CPDF_Object* p = NULL; |
624 m_Map.Lookup(key, (void*&)p); | 622 m_Map.Lookup(key, (void*&)p); |
625 if (p) { | 623 if (p) { |
626 if(p->GetType() == PDFOBJ_REFERENCE) { | 624 if(p->GetType() == PDFOBJ_REFERENCE) { |
627 p = ((CPDF_Reference*)p)->GetDirect(); | 625 p = ((CPDF_Reference*)p)->GetDirect(); |
628 if (p) { | 626 if (p) { |
629 return p->GetUnicodeText(pCharMap); | 627 return p->GetUnicodeText(pCharMap); |
(...skipping 10 matching lines...) Expand all Loading... |
640 m_Map.Lookup(key, (void*&)p); | 638 m_Map.Lookup(key, (void*&)p); |
641 if (p) { | 639 if (p) { |
642 return p->GetString(); | 640 return p->GetString(); |
643 } | 641 } |
644 return CFX_ByteString(def); | 642 return CFX_ByteString(def); |
645 } | 643 } |
646 CFX_ByteStringC CPDF_Dictionary::GetConstString(const CFX_ByteStringC& key, cons
t CFX_ByteStringC& def) const | 644 CFX_ByteStringC CPDF_Dictionary::GetConstString(const CFX_ByteStringC& key, cons
t CFX_ByteStringC& def) const |
647 { | 645 { |
648 CPDF_Object* p = NULL; | 646 CPDF_Object* p = NULL; |
649 m_Map.Lookup(key, (void*&)p); | 647 m_Map.Lookup(key, (void*&)p); |
650 if (p) | 648 if (p) { |
651 return p->GetConstString(); | 649 return p->GetConstString(); |
652 else | 650 } |
653 return CFX_ByteStringC(def); | 651 return CFX_ByteStringC(def); |
654 } | 652 } |
655 int CPDF_Dictionary::GetInteger(const CFX_ByteStringC& key) const | 653 int CPDF_Dictionary::GetInteger(const CFX_ByteStringC& key) const |
656 { | 654 { |
657 CPDF_Object* p = NULL; | 655 CPDF_Object* p = NULL; |
658 m_Map.Lookup(key, (void*&)p); | 656 m_Map.Lookup(key, (void*&)p); |
659 if (p) { | 657 if (p) { |
660 return p->GetInteger(); | 658 return p->GetInteger(); |
661 } | 659 } |
662 return 0; | 660 return 0; |
663 } | 661 } |
(...skipping 20 matching lines...) Expand all Loading... |
684 CPDF_Object* p = NULL; | 682 CPDF_Object* p = NULL; |
685 m_Map.Lookup(key, (void*&)p); | 683 m_Map.Lookup(key, (void*&)p); |
686 if (p && p->GetType() == PDFOBJ_BOOLEAN) { | 684 if (p && p->GetType() == PDFOBJ_BOOLEAN) { |
687 return p->GetInteger(); | 685 return p->GetInteger(); |
688 } | 686 } |
689 return bDefault; | 687 return bDefault; |
690 } | 688 } |
691 CPDF_Dictionary* CPDF_Dictionary::GetDict(const CFX_ByteStringC& key) const | 689 CPDF_Dictionary* CPDF_Dictionary::GetDict(const CFX_ByteStringC& key) const |
692 { | 690 { |
693 CPDF_Object* p = GetElementValue(key); | 691 CPDF_Object* p = GetElementValue(key); |
694 if (p == NULL) { | 692 if (!p) { |
695 return NULL; | 693 return nullptr; |
696 } else if (p->GetType() == PDFOBJ_DICTIONARY) { | 694 } |
| 695 if (p->GetType() == PDFOBJ_DICTIONARY) { |
697 return (CPDF_Dictionary*)p; | 696 return (CPDF_Dictionary*)p; |
698 } else if (p->GetType() == PDFOBJ_STREAM) { | 697 } |
| 698 if (p->GetType() == PDFOBJ_STREAM) { |
699 return ((CPDF_Stream*)p)->GetDict(); | 699 return ((CPDF_Stream*)p)->GetDict(); |
700 } | 700 } |
701 return NULL; | 701 return nullptr; |
702 } | 702 } |
703 CPDF_Array* CPDF_Dictionary::GetArray(const CFX_ByteStringC& key) const | 703 CPDF_Array* CPDF_Dictionary::GetArray(const CFX_ByteStringC& key) const |
704 { | 704 { |
705 CPDF_Object* p = GetElementValue(key); | 705 CPDF_Object* p = GetElementValue(key); |
706 if (p == NULL || p->GetType() != PDFOBJ_ARRAY) { | 706 if (p == NULL || p->GetType() != PDFOBJ_ARRAY) { |
707 return NULL; | 707 return NULL; |
708 } | 708 } |
709 return (CPDF_Array*)p; | 709 return (CPDF_Array*)p; |
710 } | 710 } |
711 CPDF_Stream* CPDF_Dictionary::GetStream(const CFX_ByteStringC& key) const | 711 CPDF_Stream* CPDF_Dictionary::GetStream(const CFX_ByteStringC& key) const |
(...skipping 551 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1263 ((CPDF_Object*)value)->Destroy(); | 1263 ((CPDF_Object*)value)->Destroy(); |
1264 m_IndirectObjs.RemoveKey((void*)(uintptr_t)objnum); | 1264 m_IndirectObjs.RemoveKey((void*)(uintptr_t)objnum); |
1265 } | 1265 } |
1266 void CPDF_IndirectObjects::InsertIndirectObject(FX_DWORD objnum, CPDF_Object* pO
bj) | 1266 void CPDF_IndirectObjects::InsertIndirectObject(FX_DWORD objnum, CPDF_Object* pO
bj) |
1267 { | 1267 { |
1268 if (objnum == 0 || pObj == NULL) { | 1268 if (objnum == 0 || pObj == NULL) { |
1269 return; | 1269 return; |
1270 } | 1270 } |
1271 void* value = NULL; | 1271 void* value = NULL; |
1272 if (m_IndirectObjs.Lookup((void*)(uintptr_t)objnum, value)) { | 1272 if (m_IndirectObjs.Lookup((void*)(uintptr_t)objnum, value)) { |
1273 if (value) | 1273 if (value) { |
1274 { | 1274 if (pObj->GetGenNum() <= ((CPDF_Object*)value)->GetGenNum()) { |
1275 if (pObj->GetGenNum() <= ((CPDF_Object*)value)->GetGenNum()) | |
1276 return; | 1275 return; |
1277 else | 1276 } |
1278 ((CPDF_Object*)value)->Destroy(); | 1277 ((CPDF_Object*)value)->Destroy(); |
1279 } | 1278 } |
1280 } | 1279 } |
1281 pObj->m_ObjNum = objnum; | 1280 pObj->m_ObjNum = objnum; |
1282 m_IndirectObjs.SetAt((void*)(uintptr_t)objnum, pObj); | 1281 m_IndirectObjs.SetAt((void*)(uintptr_t)objnum, pObj); |
1283 if (m_LastObjNum < objnum) { | 1282 if (m_LastObjNum < objnum) { |
1284 m_LastObjNum = objnum; | 1283 m_LastObjNum = objnum; |
1285 } | 1284 } |
1286 } | 1285 } |
1287 FX_DWORD CPDF_IndirectObjects::GetLastObjNum() const | 1286 FX_DWORD CPDF_IndirectObjects::GetLastObjNum() const |
1288 { | 1287 { |
1289 return m_LastObjNum; | 1288 return m_LastObjNum; |
1290 } | 1289 } |
OLD | NEW |