Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(394)

Side by Side Diff: experimental/PdfViewer/pdfparser/native/SkPdfNativeTokenizer.h

Issue 18323019: work on the native parser, in progress, uploaded to have a backup (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 #ifndef EXPERIMENTAL_PDFVIEWER_PDFPARSER_NATIVE_SKPDFNATIVETOKENIZER_H_ 1 #ifndef EXPERIMENTAL_PDFVIEWER_PDFPARSER_NATIVE_SKPDFNATIVETOKENIZER_H_
2 #define EXPERIMENTAL_PDFVIEWER_PDFPARSER_NATIVE_SKPDFNATIVETOKENIZER_H_ 2 #define EXPERIMENTAL_PDFVIEWER_PDFPARSER_NATIVE_SKPDFNATIVETOKENIZER_H_
3 3
4 class SkPdfNativeTokenizer : public SkPdfPodofoTokenizer { 4 #include "SkTDArray.h"
5 #include "SkTDict.h"
6 #include <math.h>
7 #include <string.h>
8
9 class SkPdfMapper;
10 class SkPdfDictionary;
11
12 // White Spaces
13 #define kNUL_PdfWhiteSpace '\x00'
14 #define kHT_PdfWhiteSpace '\x09'
15 #define kLF_PdfWhiteSpace '\x0A'
16 #define kFF_PdfWhiteSpace '\x0C'
17 #define kCR_PdfWhiteSpace '\x0D'
18 #define kSP_PdfWhiteSpace '\x20'
19
20 // PdfDelimiters
21 #define kOpenedRoundBracket_PdfDelimiter '('
22 #define kClosedRoundBracket_PdfDelimiter ')'
23 #define kOpenedInequityBracket_PdfDelimiter '<'
24 #define kClosedInequityBracket_PdfDelimiter '>'
25 #define kOpenedSquareBracket_PdfDelimiter '['
26 #define kClosedSquareBracket_PdfDelimiter ']'
27 #define kOpenedCurlyBracket_PdfDelimiter '{'
28 #define kClosedCurlyBracket_PdfDelimiter '}'
29 #define kNamed_PdfDelimiter '/'
30 #define kComment_PdfDelimiter '%'
31
32 #define kEscape_PdfSpecial '\\'
33 #define kBackspace_PdfSpecial '\x08'
34
35 // TODO(edisonn): what is the faster way for compiler/machine type to evaluate t his expressions?
36 // we should evaluate all options. might be even different from one machine to a nother
37 // 1) expand expression, let compiler optimize it
38 // 2) binary search
39 // 3) linear search in array
40 // 4) vector (e.f. T type[256] .. return type[ch] ...
41 // 5) manually build the expression with least number of operators, e.g. for con secutive
42 // chars, we can use an binary equal ignoring last bit
43 #define isPdfWhiteSpace(ch) (((ch)==kNUL_PdfWhiteSpace)||((ch)==kHT_PdfWhiteSpac e)||((ch)==kLF_PdfWhiteSpace)||((ch)==kFF_PdfWhiteSpace)||((ch)==kCR_PdfWhiteSpa ce)||((ch)==kSP_PdfWhiteSpace))
44
45 #define isPdfEOL(ch) (((ch)==kLF_PdfWhiteSpace)||((ch)==kCR_PdfWhiteSpace))
46
47
48 #define isPdfDelimiter(ch) (((ch)==kOpenedRoundBracket_PdfDelimiter)||\
49 ((ch)==kClosedRoundBracket_PdfDelimiter)||\
50 ((ch)==kOpenedInequityBracket_PdfDelimiter)||\
51 ((ch)==kClosedInequityBracket_PdfDelimiter)||\
52 ((ch)==kOpenedSquareBracket_PdfDelimiter)||\
53 ((ch)==kClosedSquareBracket_PdfDelimiter)||\
54 ((ch)==kOpenedCurlyBracket_PdfDelimiter)||\
55 ((ch)==kClosedCurlyBracket_PdfDelimiter)||\
56 ((ch)==kNamed_PdfDelimiter)||\
57 ((ch)==kComment_PdfDelimiter))
58
59 #define isPdfWhiteSpaceOrPdfDelimiter(ch) (isPdfWhiteSpace(ch)||isPdfDelimiter(c h))
60
61 #define isPdfDigit(ch) ((ch)>='0'&&(ch)<='9')
62 #define isPdfNumeric(ch) (isPdfDigit(ch)||(ch)=='+'||(ch)=='-')
63
64 unsigned char* skipPdfWhiteSpaces(unsigned char* buffer, size_t len);
65 unsigned char* endOfPdfToken(unsigned char* start, size_t len);
66 unsigned char* skipPdfComment(unsigned char* start, size_t len);
67
68 // TODO(edisonn): typedef read and integer tyepes? make less readable...
69 //typedef double SkPdfReal;
70 //typedef int64_t SkPdfInteger;
71
72 // an allocator only allocates memory, and it deletes it all when the allocator is destroyed
73 // this would allow us not to do any garbage collection while we parse or draw a pdf, and defere it
74 // while the user is looking at the image
75
76 class SkPdfObject;
77
78 class SkPdfAllocator {
79 #define BUFFER_SIZE 1024
80 SkTDArray<SkPdfObject*> fHistory;
81 SkTDArray<void*> fHandles;
82 SkPdfObject* fCurrent;
83 int fCurrentUsed;
84
85 SkPdfObject* allocBlock();
86
5 public: 87 public:
6 SkPdfNativeTokenizer(); 88 SkPdfAllocator() {
89 fCurrent = allocBlock();
90 fCurrentUsed = 0;
91 }
92
93 ~SkPdfAllocator();
94
95 SkPdfObject* allocObject();
96
97 // TODO(edisonn): free this memory in destructor, track the usage?
98 void* alloc(size_t bytes) {
99 void* data = malloc(bytes);
100 fHandles.push(data);
101 return data;
102 }
103 };
104
105 unsigned char* nextObject(unsigned char* start, unsigned char* end, SkPdfObject* token, SkPdfAllocator* allocator);
106
107 enum SkPdfTokenType {
108 kKeyword_TokenType,
109 kObject_TokenType,
110 };
111
112 struct PdfToken {
113 const char* fKeyword;
114 size_t fKeywordLength;
115 SkPdfObject* fObject;
116 SkPdfTokenType fType;
117
118 PdfToken() : fKeyword(NULL), fKeywordLength(0), fObject(NULL) {}
119 };
120
121 class SkPdfNativeTokenizer {
122 public:
123 SkPdfNativeTokenizer(SkPdfObject* objWithStream, const SkPdfMapper* mapper, SkPdfAllocator* allocator);
124 SkPdfNativeTokenizer(unsigned char* buffer, int len, const SkPdfMapper* mapp er, SkPdfAllocator* allocator);
125
7 virtual ~SkPdfNativeTokenizer(); 126 virtual ~SkPdfNativeTokenizer();
127
128 bool readToken(PdfToken* token);
129 bool readTokenCore(PdfToken* token);
130 void PutBack(PdfToken token);
131
132 private:
133 const SkPdfMapper* fMapper;
134 SkPdfAllocator* fAllocator;
135
136 unsigned char* fUncompressedStreamStart;
137 unsigned char* fUncompressedStream;
138 unsigned char* fUncompressedStreamEnd;
139
140 bool fEmpty;
141 bool fHasPutBack;
142 PdfToken fPutBack;
8 }; 143 };
9 144
10 #endif // EXPERIMENTAL_PDFVIEWER_PDFPARSER_NATIVE_SKPDFNATIVETOKENIZER_H_ 145 #endif // EXPERIMENTAL_PDFVIEWER_PDFPARSER_NATIVE_SKPDFNATIVETOKENIZER_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698