Index: experimental/PdfViewer/pdfparser/podofo/SkPdfPodofoTokenizer.cpp |
=================================================================== |
--- experimental/PdfViewer/pdfparser/podofo/SkPdfPodofoTokenizer.cpp (revision 0) |
+++ experimental/PdfViewer/pdfparser/podofo/SkPdfPodofoTokenizer.cpp (revision 0) |
@@ -0,0 +1,102 @@ |
+#include "SkPdfPodofoTokenizer.h" |
+ |
+#include "SkTypes.h" |
+#include "SkPdfStream_autogen.h" |
+#include "SkPdfMapper_autogen.h" |
+ |
+#include "podofo.h" |
+ |
+// maps to a null doc, if the code asks for it, we should err/crash. |
+SkPdfMapper gNullMapper(NULL); |
+ |
+SkPdfPodofoTokenizer::SkPdfPodofoTokenizer(const SkPodofoParsedPDF* parser, PoDoFo::PdfContentsTokenizer* tokenizer) |
+ : fMapper(parser->mapper()), fDoc(parser->podofo()), fTokenizer(tokenizer), fUncompressedStream(NULL), fUncompressedStreamLength(0), fEmpty(false), fHasPutBack(false) {} |
+ |
+SkPdfPodofoTokenizer::SkPdfPodofoTokenizer(const SkPdfObject* objWithStream) : fMapper(&gNullMapper), fDoc(NULL), fTokenizer(NULL), fUncompressedStream(NULL), fUncompressedStreamLength(0), fEmpty(false), fHasPutBack(false) { |
+ fUncompressedStream = NULL; |
+ fUncompressedStreamLength = 0; |
+ |
+ fDoc = NULL; |
+ |
+ SkPdfStream* stream = NULL; |
+ if (objWithStream && |
+ objWithStream->doc()->mapper()->mapStream(objWithStream, &stream) && |
+ stream->GetFilteredCopy(&fUncompressedStream, &fUncompressedStreamLength) && |
+ fUncompressedStream != NULL && |
+ fUncompressedStreamLength != 0) { |
+ fTokenizer = new PoDoFo::PdfContentsTokenizer(fUncompressedStream, fUncompressedStreamLength); |
+ fDoc = objWithStream->doc()->podofo(); |
+ } else { |
+ fEmpty = true; |
+ } |
+} |
+ |
+SkPdfPodofoTokenizer::SkPdfPodofoTokenizer(const char* buffer, int len) : fMapper(&gNullMapper), fDoc(NULL), fTokenizer(NULL), fUncompressedStream(NULL), fUncompressedStreamLength(0), fEmpty(false), fHasPutBack(false) { |
+ try { |
+ fTokenizer = new PoDoFo::PdfContentsTokenizer(buffer, len); |
+ } catch (PoDoFo::PdfError& e) { |
+ fEmpty = true; |
+ } |
+} |
+ |
+SkPdfPodofoTokenizer::~SkPdfPodofoTokenizer() { |
+ free(fUncompressedStream); |
+} |
+ |
+bool SkPdfPodofoTokenizer::readTokenCore(PdfToken* token) { |
+ PoDoFo::PdfVariant var; |
+ PoDoFo::EPdfContentsType type; |
+ |
+ token->fKeyword = NULL; |
+ token->fObject = NULL; |
+ |
+ bool ret = fTokenizer->ReadNext(type, token->fKeyword, var); |
+ |
+ if (!ret) return ret; |
+ |
+ switch (type) { |
+ case PoDoFo::ePdfContentsType_Keyword: |
+ token->fType = kKeyword_TokenType; |
+ break; |
+ |
+ case PoDoFo::ePdfContentsType_Variant: { |
+ token->fType = kObject_TokenType; |
+ PoDoFo::PdfObject* obj = new PoDoFo::PdfObject(var); |
+ fMapper->mapObject(obj, &token->fObject); |
+ } |
+ break; |
+ |
+ case PoDoFo::ePdfContentsType_ImageData: |
+ token->fType = kImageData_TokenType; |
+ // TODO(edisonn): inline images seem to work without it |
+ break; |
+ } |
+#ifdef PDF_TRACE |
+ std::string str; |
+ if (token->fObject) { |
+ token->fObject->podofo()->ToString(str); |
+ } |
+ printf("%s %s\n", token->fType == kKeyword_TokenType ? "Keyword" : token->fType == kObject_TokenType ? "Object" : "ImageData", token->fKeyword ? token->fKeyword : str.c_str()); |
+#endif |
+ return ret; |
+} |
+ |
+void SkPdfPodofoTokenizer::PutBack(PdfToken token) { |
+ SkASSERT(!fHasPutBack); |
+ fHasPutBack = true; |
+ fPutBack = token; |
+} |
+ |
+bool SkPdfPodofoTokenizer::readToken(PdfToken* token) { |
+ if (fHasPutBack) { |
+ *token = fPutBack; |
+ fHasPutBack = false; |
+ return true; |
+ } |
+ |
+ if (fEmpty) { |
+ return false; |
+ } |
+ |
+ return readTokenCore(token); |
+} |