Index: experimental/PdfViewer/pdfparser/native/SkPdfNativeTokenizer.h |
=================================================================== |
--- experimental/PdfViewer/pdfparser/native/SkPdfNativeTokenizer.h (revision 11729) |
+++ experimental/PdfViewer/pdfparser/native/SkPdfNativeTokenizer.h (working copy) |
@@ -8,16 +8,21 @@ |
#ifndef SkPdfNativeTokenizer_DEFINED |
#define SkPdfNativeTokenizer_DEFINED |
+#include <math.h> |
+#include <string.h> |
+ |
#include "SkPdfConfig.h" |
- |
#include "SkTDArray.h" |
#include "SkTDict.h" |
-#include <math.h> |
-#include <string.h> |
+// All these constants are defined by the PDF 1.4 Spec. |
+ |
class SkPdfDictionary; |
class SkPdfImageDictionary; |
+class SkPdfNativeDoc; |
+class SkPdfNativeObject; |
+ |
// White Spaces |
#define kNUL_PdfWhiteSpace '\x00' |
#define kHT_PdfWhiteSpace '\x09' |
@@ -49,7 +54,12 @@ |
// 4) vector (e.f. T type[256] .. return type[ch] ... |
// 5) manually build the expression with least number of operators, e.g. for consecutive |
// chars, we can use an binary equal ignoring last bit |
-#define isPdfWhiteSpace(ch) (((ch)==kNUL_PdfWhiteSpace)||((ch)==kHT_PdfWhiteSpace)||((ch)==kLF_PdfWhiteSpace)||((ch)==kFF_PdfWhiteSpace)||((ch)==kCR_PdfWhiteSpace)||((ch)==kSP_PdfWhiteSpace)) |
+#define isPdfWhiteSpace(ch) (((ch)==kNUL_PdfWhiteSpace)|| \ |
+ ((ch)==kHT_PdfWhiteSpace)|| \ |
+ ((ch)==kLF_PdfWhiteSpace)|| \ |
+ ((ch)==kFF_PdfWhiteSpace)|| \ |
+ ((ch)==kCR_PdfWhiteSpace)|| \ |
+ ((ch)==kSP_PdfWhiteSpace)) |
#define isPdfEOL(ch) (((ch)==kLF_PdfWhiteSpace)||((ch)==kCR_PdfWhiteSpace)) |
@@ -73,26 +83,16 @@ |
const unsigned char* skipPdfWhiteSpaces(const unsigned char* buffer, const unsigned char* end); |
const unsigned char* endOfPdfToken(const unsigned char* start, const unsigned char* end); |
-// TODO(edisonn): typedef read and integer tyepes? make less readable... |
-//typedef double SkPdfReal; |
-//typedef int64_t SkPdfInteger; |
+#define BUFFER_SIZE 1024 |
-// an allocator only allocates memory, and it deletes it all when the allocator is destroyed |
-// this would allow us not to do any garbage collection while we parse or draw a pdf, and defere it |
-// while the user is looking at the image |
- |
-class SkPdfNativeObject; |
- |
+/** \class SkPdfAllocator |
+ * |
+ * An allocator only allocates memory, and it deletes it all when the allocator is destroyed. |
+ * This strategy would allow us not to do any garbage collection while we parse and/or render |
+ * a pdf. |
+ * |
+ */ |
class SkPdfAllocator { |
-#define BUFFER_SIZE 1024 |
- SkTDArray<SkPdfNativeObject*> fHistory; |
- SkTDArray<void*> fHandles; |
- SkPdfNativeObject* fCurrent; |
- int fCurrentUsed; |
- |
- SkPdfNativeObject* allocBlock(); |
- size_t fSizeInBytes; |
- |
public: |
SkPdfAllocator() { |
fSizeInBytes = sizeof(*this); |
@@ -102,9 +102,10 @@ |
~SkPdfAllocator(); |
+ // Allocates an object. It will be reset automatically when ~SkPdfAllocator() is called. |
SkPdfNativeObject* allocObject(); |
- // TODO(edisonn): free this memory in destructor, track the usage? |
+ // Allocates a buffer. It will be freed automatically when ~SkPdfAllocator() is called. |
void* alloc(size_t bytes) { |
void* data = malloc(bytes); |
fHandles.push(data); |
@@ -112,41 +113,71 @@ |
return data; |
} |
+ // Returns the number of bytes used in this allocator. |
size_t bytesUsed() const { |
return fSizeInBytes; |
} |
+ |
+private: |
+ SkTDArray<SkPdfNativeObject*> fHistory; |
+ SkTDArray<void*> fHandles; |
+ SkPdfNativeObject* fCurrent; |
+ int fCurrentUsed; |
+ |
+ SkPdfNativeObject* allocBlock(); |
+ size_t fSizeInBytes; |
}; |
-class SkPdfNativeDoc; |
-const unsigned char* nextObject(const unsigned char* start, const unsigned char* end, SkPdfNativeObject* token, SkPdfAllocator* allocator, SkPdfNativeDoc* doc); |
- |
+// Type of a parsed token. |
enum SkPdfTokenType { |
kKeyword_TokenType, |
kObject_TokenType, |
}; |
+ |
+/** \struct PdfToken |
+ * |
+ * Stores the result of the parsing - a keyword or an object. |
+ * |
+ */ |
struct PdfToken { |
- const char* fKeyword; |
- size_t fKeywordLength; |
- SkPdfNativeObject* fObject; |
- SkPdfTokenType fType; |
+ const char* fKeyword; |
+ size_t fKeywordLength; |
+ SkPdfNativeObject* fObject; |
+ SkPdfTokenType fType; |
PdfToken() : fKeyword(NULL), fKeywordLength(0), fObject(NULL) {} |
}; |
+/** \class SkPdfNativeTokenizer |
+ * |
+ * Responsible to tokenize a stream in small tokens, eityh a keyword or an object. |
+ * A renderer can feed on the tokens and render a pdf. |
+ * |
+ */ |
class SkPdfNativeTokenizer { |
public: |
- SkPdfNativeTokenizer(SkPdfNativeObject* objWithStream, SkPdfAllocator* allocator, SkPdfNativeDoc* doc); |
- SkPdfNativeTokenizer(const unsigned char* buffer, int len, SkPdfAllocator* allocator, SkPdfNativeDoc* doc); |
+ SkPdfNativeTokenizer(SkPdfNativeObject* objWithStream, |
+ SkPdfAllocator* allocator, SkPdfNativeDoc* doc); |
+ SkPdfNativeTokenizer(const unsigned char* buffer, int len, |
+ SkPdfAllocator* allocator, SkPdfNativeDoc* doc); |
virtual ~SkPdfNativeTokenizer(); |
+ // Reads one token. Returns false if there are no more tokens. |
bool readToken(PdfToken* token); |
- bool readTokenCore(PdfToken* token); |
+ |
+ // Put back a token to be read in the nextToken read. Only one token is allowed to be put |
+ // back. Must not necesaarely be the last token read. |
void PutBack(PdfToken token); |
+ |
+ // Reads the inline image that is present in the stream. At this point we just consumed the ID |
+ // token already. |
SkPdfImageDictionary* readInlineImage(); |
private: |
+ bool readTokenCore(PdfToken* token); |
+ |
SkPdfNativeDoc* fDoc; |
SkPdfAllocator* fAllocator; |
@@ -159,4 +190,9 @@ |
PdfToken fPutBack; |
}; |
+const unsigned char* nextObject(const unsigned char* start, const unsigned char* end, |
+ SkPdfNativeObject* token, |
+ SkPdfAllocator* allocator, |
+ SkPdfNativeDoc* doc); |
+ |
#endif // SkPdfNativeTokenizer_DEFINED |