OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "SkPdfNativeDoc.h" | 8 #include "SkPdfNativeDoc.h" |
9 #include "SkPdfNativeTokenizer.h" | 9 #include "SkPdfNativeTokenizer.h" |
10 #include "SkPdfNativeObject.h" | 10 #include "SkPdfNativeObject.h" |
(...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
351 | 351 |
352 void SkPdfNativeDoc::addCrossSectionInfo(int id, int generation, int offset, boo
l isFreed) { | 352 void SkPdfNativeDoc::addCrossSectionInfo(int id, int generation, int offset, boo
l isFreed) { |
353 // TODO(edisonn): security here | 353 // TODO(edisonn): security here |
354 while (fObjects.count() < id + 1) { | 354 while (fObjects.count() < id + 1) { |
355 reset(fObjects.append()); | 355 reset(fObjects.append()); |
356 } | 356 } |
357 | 357 |
358 fObjects[id].fOffset = offset; | 358 fObjects[id].fOffset = offset; |
359 fObjects[id].fObj = NULL; | 359 fObjects[id].fObj = NULL; |
360 fObjects[id].fResolvedReference = NULL; | 360 fObjects[id].fResolvedReference = NULL; |
| 361 fObjects[id].fIsReferenceResolved = false; |
361 } | 362 } |
362 | 363 |
363 SkPdfNativeObject* SkPdfNativeDoc::readObject(int id/*, int expectedGeneration*/
) { | 364 SkPdfNativeObject* SkPdfNativeDoc::readObject(int id/*, int expectedGeneration*/
) { |
364 long startOffset = fObjects[id].fOffset; | 365 long startOffset = fObjects[id].fOffset; |
365 //long endOffset = fObjects[id].fOffsetEnd; | 366 //long endOffset = fObjects[id].fOffsetEnd; |
366 // TODO(edisonn): use hinted endOffset | 367 // TODO(edisonn): use hinted endOffset |
367 // TODO(edisonn): current implementation will result in a lot of memory usag
e | 368 // TODO(edisonn): current implementation will result in a lot of memory usag
e |
368 // to decrease memory usage, we wither need to be smart and know where objec
ts end, and we will | 369 // to decrease memory usage, we wither need to be smart and know where objec
ts end, and we will |
369 // alocate only the chancks needed, or the tokenizer will not make copies, b
ut then it needs to | 370 // alocate only the chancks needed, or the tokenizer will not make copies, b
ut then it needs to |
370 // cache the results so it does not go twice on the same buffer | 371 // cache the results so it does not go twice on the same buffer |
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
539 int id = ref->referenceId(); | 540 int id = ref->referenceId(); |
540 // TODO(edisonn): generation/updates not supported now | 541 // TODO(edisonn): generation/updates not supported now |
541 //int gen = ref->referenceGeneration(); | 542 //int gen = ref->referenceGeneration(); |
542 | 543 |
543 // TODO(edisonn): verify id and gen expected | 544 // TODO(edisonn): verify id and gen expected |
544 if (id < 0 || id >= fObjects.count()) { | 545 if (id < 0 || id >= fObjects.count()) { |
545 // TODO(edisonn): report error/warning | 546 // TODO(edisonn): report error/warning |
546 return NULL; | 547 return NULL; |
547 } | 548 } |
548 | 549 |
549 if (fObjects[id].fResolvedReference != NULL) { | 550 if (fObjects[id].fIsReferenceResolved) { |
550 | 551 |
551 #ifdef PDF_TRACE | 552 #ifdef PDF_TRACE |
552 printf("\nresolve(%s) = %s\n", ref->toString(0).c_str(), fObjects[id
].fResolvedReference->toString(0, ref->toString().size() + 13).c_str()); | 553 printf("\nresolve(%s) = %s\n", ref->toString(0).c_str(), fObjects[id
].fResolvedReference->toString(0, ref->toString().size() + 13).c_str()); |
553 #endif | 554 #endif |
554 | 555 |
| 556 // TODO(edisonn): for known good documents, assert here THAT THE REF
ERENCE IS NOT null |
555 return fObjects[id].fResolvedReference; | 557 return fObjects[id].fResolvedReference; |
556 } | 558 } |
557 | 559 |
| 560 // TODO(edisonn): there are pdfs in the crashing suite that cause a stac
k overflow here unless we check for resolved reference on next line |
| 561 // determine if the pdf is corrupted, or we have a bug here |
| 562 |
| 563 // avoids recursive calls |
| 564 fObjects[id].fIsReferenceResolved = true; |
| 565 |
558 if (fObjects[id].fObj == NULL) { | 566 if (fObjects[id].fObj == NULL) { |
559 fObjects[id].fObj = readObject(id); | 567 fObjects[id].fObj = readObject(id); |
560 } | 568 } |
561 | 569 |
562 if (fObjects[id].fResolvedReference == NULL) { | 570 if (fObjects[id].fResolvedReference == NULL) { |
563 if (!fObjects[id].fObj->isReference()) { | 571 if (!fObjects[id].fObj->isReference()) { |
564 fObjects[id].fResolvedReference = fObjects[id].fObj; | 572 fObjects[id].fResolvedReference = fObjects[id].fObj; |
565 } else { | 573 } else { |
566 fObjects[id].fResolvedReference = resolveReference(fObjects[id].
fObj); | 574 fObjects[id].fResolvedReference = resolveReference(fObjects[id].
fObj); |
567 } | 575 } |
568 } | 576 } |
569 | 577 |
570 #ifdef PDF_TRACE | 578 #ifdef PDF_TRACE |
571 printf("\nresolve(%s) = %s\n", ref->toString(0).c_str(), fObjects[id].fR
esolvedReference->toString(0, ref->toString().size() + 13).c_str()); | 579 printf("\nresolve(%s) = %s\n", ref->toString(0).c_str(), fObjects[id].fR
esolvedReference->toString(0, ref->toString().size() + 13).c_str()); |
572 #endif | 580 #endif |
573 return fObjects[id].fResolvedReference; | 581 return fObjects[id].fResolvedReference; |
574 } | 582 } |
575 | 583 |
576 // TODO(edisonn): fix the mess with const, probably we need to remove it pre
tty much everywhere | 584 // TODO(edisonn): fix the mess with const, probably we need to remove it pre
tty much everywhere |
577 return (SkPdfNativeObject*)ref; | 585 return (SkPdfNativeObject*)ref; |
578 } | 586 } |
579 | 587 |
580 size_t SkPdfNativeDoc::bytesUsed() const { | 588 size_t SkPdfNativeDoc::bytesUsed() const { |
581 return fAllocator->bytesUsed() + | 589 return fAllocator->bytesUsed() + |
582 fContentLength + | 590 fContentLength + |
583 fObjects.count() * sizeof(PublicObjectEntry) + | 591 fObjects.count() * sizeof(PublicObjectEntry) + |
584 fPages.count() * sizeof(SkPdfPageObjectDictionary*) + | 592 fPages.count() * sizeof(SkPdfPageObjectDictionary*) + |
585 sizeof(*this); | 593 sizeof(*this); |
586 } | 594 } |
OLD | NEW |