| OLD | NEW |
| (Empty) |
| 1 #include "SkPdfPodofoTokenizer.h" | |
| 2 | |
| 3 #include "SkTypes.h" | |
| 4 #include "SkPdfStream_autogen.h" | |
| 5 #include "SkPdfMapper_autogen.h" | |
| 6 | |
| 7 #include "podofo.h" | |
| 8 | |
| 9 // maps to a null doc, if the code asks for it, we should err/crash. | |
| 10 SkPdfMapper gNullMapper(NULL); | |
| 11 | |
| 12 SkPdfPodofoTokenizer::SkPdfPodofoTokenizer(const SkPodofoParsedPDF* parser, PoDo
Fo::PdfContentsTokenizer* tokenizer) | |
| 13 : fMapper(parser->mapper()), fDoc(parser->podofo()), fTokenizer(tokenizer),
fUncompressedStream(NULL), fUncompressedStreamLength(0), fEmpty(false), fHasPutB
ack(false) {} | |
| 14 | |
| 15 SkPdfPodofoTokenizer::SkPdfPodofoTokenizer(const SkPdfObject* objWithStream) : f
Mapper(&gNullMapper), fDoc(NULL), fTokenizer(NULL), fUncompressedStream(NULL), f
UncompressedStreamLength(0), fEmpty(false), fHasPutBack(false) { | |
| 16 fUncompressedStream = NULL; | |
| 17 fUncompressedStreamLength = 0; | |
| 18 | |
| 19 fDoc = NULL; | |
| 20 | |
| 21 SkPdfStream* stream = NULL; | |
| 22 if (objWithStream && | |
| 23 objWithStream->doc()->mapper()->mapStream(objWithStream, &stream) && | |
| 24 stream->GetFilteredCopy(&fUncompressedStream, &fUncompressedStreamLe
ngth) && | |
| 25 fUncompressedStream != NULL && | |
| 26 fUncompressedStreamLength != 0) { | |
| 27 fTokenizer = new PoDoFo::PdfContentsTokenizer(fUncompressedStream, fUnco
mpressedStreamLength); | |
| 28 fDoc = objWithStream->doc()->podofo(); | |
| 29 } else { | |
| 30 fEmpty = true; | |
| 31 } | |
| 32 } | |
| 33 | |
| 34 SkPdfPodofoTokenizer::SkPdfPodofoTokenizer(const char* buffer, int len) : fMappe
r(&gNullMapper), fDoc(NULL), fTokenizer(NULL), fUncompressedStream(NULL), fUncom
pressedStreamLength(0), fEmpty(false), fHasPutBack(false) { | |
| 35 try { | |
| 36 fTokenizer = new PoDoFo::PdfContentsTokenizer(buffer, len); | |
| 37 } catch (PoDoFo::PdfError& e) { | |
| 38 fEmpty = true; | |
| 39 } | |
| 40 } | |
| 41 | |
| 42 SkPdfPodofoTokenizer::~SkPdfPodofoTokenizer() { | |
| 43 free(fUncompressedStream); | |
| 44 } | |
| 45 | |
| 46 bool SkPdfPodofoTokenizer::readTokenCore(PdfToken* token) { | |
| 47 PoDoFo::PdfVariant var; | |
| 48 PoDoFo::EPdfContentsType type; | |
| 49 | |
| 50 token->fKeyword = NULL; | |
| 51 token->fObject = NULL; | |
| 52 | |
| 53 bool ret = fTokenizer->ReadNext(type, token->fKeyword, var); | |
| 54 | |
| 55 if (!ret) return ret; | |
| 56 | |
| 57 switch (type) { | |
| 58 case PoDoFo::ePdfContentsType_Keyword: | |
| 59 token->fType = kKeyword_TokenType; | |
| 60 break; | |
| 61 | |
| 62 case PoDoFo::ePdfContentsType_Variant: { | |
| 63 token->fType = kObject_TokenType; | |
| 64 PoDoFo::PdfObject* obj = new PoDoFo::PdfObject(var); | |
| 65 fMapper->mapObject(obj, &token->fObject); | |
| 66 } | |
| 67 break; | |
| 68 | |
| 69 case PoDoFo::ePdfContentsType_ImageData: | |
| 70 token->fType = kImageData_TokenType; | |
| 71 // TODO(edisonn): inline images seem to work without it | |
| 72 break; | |
| 73 } | |
| 74 #ifdef PDF_TRACE | |
| 75 std::string str; | |
| 76 if (token->fObject) { | |
| 77 token->fObject->podofo()->ToString(str); | |
| 78 } | |
| 79 printf("%s %s\n", token->fType == kKeyword_TokenType ? "Keyword" : token->fT
ype == kObject_TokenType ? "Object" : "ImageData", token->fKeyword ? token->fKey
word : str.c_str()); | |
| 80 #endif | |
| 81 return ret; | |
| 82 } | |
| 83 | |
| 84 void SkPdfPodofoTokenizer::PutBack(PdfToken token) { | |
| 85 SkASSERT(!fHasPutBack); | |
| 86 fHasPutBack = true; | |
| 87 fPutBack = token; | |
| 88 } | |
| 89 | |
| 90 bool SkPdfPodofoTokenizer::readToken(PdfToken* token) { | |
| 91 if (fHasPutBack) { | |
| 92 *token = fPutBack; | |
| 93 fHasPutBack = false; | |
| 94 return true; | |
| 95 } | |
| 96 | |
| 97 if (fEmpty) { | |
| 98 return false; | |
| 99 } | |
| 100 | |
| 101 return readTokenCore(token); | |
| 102 } | |
| OLD | NEW |