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 |