| OLD | NEW |
| 1 | 1 |
| 2 #include "SkPdfNativeTokenizer.h" | 2 #include "SkPdfNativeTokenizer.h" |
| 3 #include "SkPdfObject.h" | 3 #include "SkPdfObject.h" |
| 4 #include "SkPdfConfig.h" | 4 #include "SkPdfConfig.h" |
| 5 | 5 |
| 6 #include "SkPdfStreamCommonDictionary_autogen.h" | 6 #include "SkPdfStreamCommonDictionary_autogen.h" |
| 7 | 7 |
| 8 static unsigned char* skipPdfWhiteSpaces(unsigned char* start, unsigned char* en
d) { | 8 static unsigned char* skipPdfWhiteSpaces(unsigned char* start, unsigned char* en
d) { |
| 9 while (start < end && isPdfWhiteSpace(*start)) { | 9 while (start < end && isPdfWhiteSpace(*start)) { |
| 10 if (*start == kComment_PdfDelimiter) { | 10 if (*start == kComment_PdfDelimiter) { |
| (...skipping 638 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 649 | 649 |
| 650 SkPdfObject* SkPdfAllocator::allocBlock() { | 650 SkPdfObject* SkPdfAllocator::allocBlock() { |
| 651 return new SkPdfObject[BUFFER_SIZE]; | 651 return new SkPdfObject[BUFFER_SIZE]; |
| 652 } | 652 } |
| 653 | 653 |
| 654 SkPdfAllocator::~SkPdfAllocator() { | 654 SkPdfAllocator::~SkPdfAllocator() { |
| 655 for (int i = 0 ; i < fHandles.count(); i++) { | 655 for (int i = 0 ; i < fHandles.count(); i++) { |
| 656 free(fHandles[i]); | 656 free(fHandles[i]); |
| 657 } | 657 } |
| 658 for (int i = 0 ; i < fHistory.count(); i++) { | 658 for (int i = 0 ; i < fHistory.count(); i++) { |
| 659 for (int j = 0 ; j < BUFFER_SIZE; j++) { |
| 660 fHistory[i][j].reset(); |
| 661 } |
| 659 delete[] fHistory[i]; | 662 delete[] fHistory[i]; |
| 660 } | 663 } |
| 664 for (int j = 0 ; j < BUFFER_SIZE; j++) { |
| 665 fCurrent[j].reset(); |
| 666 } |
| 661 delete[] fCurrent; | 667 delete[] fCurrent; |
| 662 } | 668 } |
| 663 | 669 |
| 664 SkPdfObject* SkPdfAllocator::allocObject() { | 670 SkPdfObject* SkPdfAllocator::allocObject() { |
| 665 if (fCurrentUsed >= BUFFER_SIZE) { | 671 if (fCurrentUsed >= BUFFER_SIZE) { |
| 666 fHistory.push(fCurrent); | 672 fHistory.push(fCurrent); |
| 667 fCurrent = allocBlock(); | 673 fCurrent = allocBlock(); |
| 668 fCurrentUsed = 0; | 674 fCurrentUsed = 0; |
| 669 } | 675 } |
| 670 | |
| 671 fCurrentUsed++; | 676 fCurrentUsed++; |
| 672 return &fCurrent[fCurrentUsed - 1]; | 677 return &fCurrent[fCurrentUsed - 1]; |
| 673 } | 678 } |
| 674 | 679 |
| 675 // TODO(edisonn): perf: do no copy the buffers, but use them, and mark cache the
result, so there is no need of a second pass | 680 // TODO(edisonn): perf: do no copy the buffers, but use them, and mark cache the
result, so there is no need of a second pass |
| 676 SkPdfNativeTokenizer::SkPdfNativeTokenizer(SkPdfObject* objWithStream, const SkP
dfMapper* mapper, SkPdfAllocator* allocator) : fMapper(mapper), fAllocator(alloc
ator), fUncompressedStream(NULL), fUncompressedStreamEnd(NULL), fEmpty(false), f
HasPutBack(false) { | 681 SkPdfNativeTokenizer::SkPdfNativeTokenizer(SkPdfObject* objWithStream, const SkP
dfMapper* mapper, SkPdfAllocator* allocator) : fMapper(mapper), fAllocator(alloc
ator), fUncompressedStream(NULL), fUncompressedStreamEnd(NULL), fEmpty(false), f
HasPutBack(false) { |
| 677 unsigned char* buffer = NULL; | 682 unsigned char* buffer = NULL; |
| 678 size_t len = 0; | 683 size_t len = 0; |
| 679 objWithStream->GetFilteredStreamRef(&buffer, &len, fAllocator); | 684 objWithStream->GetFilteredStreamRef(&buffer, &len, fAllocator); |
| 685 // TODO(edisonn): hack, find end of object |
| 686 // char* endobj = strstr((char*)buffer, "endobj"); |
| 687 // if (endobj) { |
| 688 // len = endobj - (char*)buffer + strlen("endobj"); |
| 689 // } |
| 680 fUncompressedStreamStart = fUncompressedStream = (unsigned char*)fAllocator-
>alloc(len); | 690 fUncompressedStreamStart = fUncompressedStream = (unsigned char*)fAllocator-
>alloc(len); |
| 681 fUncompressedStreamEnd = fUncompressedStream + len; | 691 fUncompressedStreamEnd = fUncompressedStream + len; |
| 682 memcpy(fUncompressedStream, buffer, len);} | 692 memcpy(fUncompressedStream, buffer, len); |
| 693 } |
| 683 | 694 |
| 684 SkPdfNativeTokenizer::SkPdfNativeTokenizer(unsigned char* buffer, int len, const
SkPdfMapper* mapper, SkPdfAllocator* allocator) : fMapper(mapper), fAllocator(a
llocator), fEmpty(false), fHasPutBack(false) { | 695 SkPdfNativeTokenizer::SkPdfNativeTokenizer(unsigned char* buffer, int len, const
SkPdfMapper* mapper, SkPdfAllocator* allocator) : fMapper(mapper), fAllocator(a
llocator), fEmpty(false), fHasPutBack(false) { |
| 696 // TODO(edisonn): hack, find end of object |
| 697 // char* endobj = strstr((char*)buffer, "endobj"); |
| 698 // if (endobj) { |
| 699 // len = endobj - (char*)buffer + strlen("endobj"); |
| 700 // } |
| 685 fUncompressedStreamStart = fUncompressedStream = (unsigned char*)fAllocator-
>alloc(len); | 701 fUncompressedStreamStart = fUncompressedStream = (unsigned char*)fAllocator-
>alloc(len); |
| 686 fUncompressedStreamEnd = fUncompressedStream + len; | 702 fUncompressedStreamEnd = fUncompressedStream + len; |
| 687 memcpy(fUncompressedStream, buffer, len); | 703 memcpy(fUncompressedStream, buffer, len); |
| 688 } | 704 } |
| 689 | 705 |
| 690 SkPdfNativeTokenizer::~SkPdfNativeTokenizer() { | 706 SkPdfNativeTokenizer::~SkPdfNativeTokenizer() { |
| 691 // free the unparsed stream, we don't need it. | |
| 692 // the parsed one is locked as it contains the strings and keywords referenc
ed in objects | |
| 693 if (fUncompressedStream) { | |
| 694 void* dummy = realloc(fUncompressedStreamStart, fUncompressedStream - fU
ncompressedStreamStart); | |
| 695 //SkASSERT(dummy == fUncompressedStreamStart); | |
| 696 fUncompressedStreamStart = (unsigned char*)dummy; // suppress compiler
warning | |
| 697 } else { | |
| 698 SkASSERT(false); | |
| 699 } | |
| 700 } | 707 } |
| 701 | 708 |
| 702 bool SkPdfNativeTokenizer::readTokenCore(PdfToken* token) { | 709 bool SkPdfNativeTokenizer::readTokenCore(PdfToken* token) { |
| 703 token->fKeyword = NULL; | 710 token->fKeyword = NULL; |
| 704 token->fObject = NULL; | 711 token->fObject = NULL; |
| 705 | 712 |
| 706 fUncompressedStream = skipPdfWhiteSpaces(fUncompressedStream, fUncompressedS
treamEnd); | 713 fUncompressedStream = skipPdfWhiteSpaces(fUncompressedStream, fUncompressedS
treamEnd); |
| 707 if (fUncompressedStream >= fUncompressedStreamEnd) { | 714 if (fUncompressedStream >= fUncompressedStreamEnd) { |
| 708 return false; | 715 return false; |
| 709 } | 716 } |
| 710 | 717 |
| 711 SkPdfObject obj; | 718 SkPdfObject obj; |
| 712 fUncompressedStream = nextObject(fUncompressedStream, fUncompressedStreamEnd
, &obj, fAllocator); | 719 fUncompressedStream = nextObject(fUncompressedStream, fUncompressedStreamEnd
, &obj, fAllocator); |
| 713 | 720 |
| 714 // If it is a keyword, we will only get the pointer of the string | 721 // If it is a keyword, we will only get the pointer of the string |
| 715 if (obj.type() == SkPdfObject::kKeyword_PdfObjectType) { | 722 if (obj.type() == SkPdfObject::kKeyword_PdfObjectType) { |
| 716 token->fKeyword = obj.c_str(); | 723 token->fKeyword = obj.c_str(); |
| 717 token->fKeywordLength = obj.len(); | 724 token->fKeywordLength = obj.len(); |
| 718 token->fType = kKeyword_TokenType; | 725 token->fType = kKeyword_TokenType; |
| 719 } else { | 726 } else { |
| 720 SkPdfObject* pobj = fAllocator->allocObject(); | 727 SkPdfObject* pobj = fAllocator->allocObject(); |
| 721 *pobj = obj; | 728 *pobj = obj; |
| 722 token->fObject = pobj; | 729 token->fObject = pobj; |
| 723 token->fType = kObject_TokenType; | 730 token->fType = kObject_TokenType; |
| 724 } | 731 } |
| 725 | 732 |
| 726 #ifdef PDF_TRACE | 733 #ifdef PDF_TRACE |
| 727 static int read_op = 0; | 734 static int read_op = 0; |
| 728 read_op++; | 735 read_op++; |
| 729 if (182749 == read_op) { | 736 if (548 == read_op) { |
| 730 printf("break;\n"); | 737 printf("break;\n"); |
| 731 } | 738 } |
| 732 printf("%i READ %s %s\n", read_op, token->fType == kKeyword_TokenType ? "Key
word" : "Object", token->fKeyword ? std::string(token->fKeyword, token->fKeyword
Length).c_str() : token->fObject->toString().c_str()); | 739 printf("%i READ %s %s\n", read_op, token->fType == kKeyword_TokenType ? "Key
word" : "Object", token->fKeyword ? std::string(token->fKeyword, token->fKeyword
Length).c_str() : token->fObject->toString().c_str()); |
| 733 #endif | 740 #endif |
| 734 | 741 |
| 735 return true; | 742 return true; |
| 736 } | 743 } |
| 737 | 744 |
| 738 void SkPdfNativeTokenizer::PutBack(PdfToken token) { | 745 void SkPdfNativeTokenizer::PutBack(PdfToken token) { |
| 739 SkASSERT(!fHasPutBack); | 746 SkASSERT(!fHasPutBack); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 756 | 763 |
| 757 if (fEmpty) { | 764 if (fEmpty) { |
| 758 #ifdef PDF_TRACE | 765 #ifdef PDF_TRACE |
| 759 printf("EMPTY TOKENIZER\n"); | 766 printf("EMPTY TOKENIZER\n"); |
| 760 #endif | 767 #endif |
| 761 return false; | 768 return false; |
| 762 } | 769 } |
| 763 | 770 |
| 764 return readTokenCore(token); | 771 return readTokenCore(token); |
| 765 } | 772 } |
| 773 |
| OLD | NEW |