SkPdfNativeTokenizer.h revision 2af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5df
1cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com/*
2cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com * Copyright 2013 Google Inc.
3cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com *
4cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com * Use of this source code is governed by a BSD-style license that can be
5cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com * found in the LICENSE file.
6cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com */
7cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com
8cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com#ifndef SkPdfNativeTokenizer_DEFINED
9cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com#define SkPdfNativeTokenizer_DEFINED
103aac1f9f308192f3787265830fe86ce8874e7382edisonn@google.com
112af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com#include <math.h>
122af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com#include <string.h>
13bca421b468f53a591333918248f54bbd958389d2edisonn@google.com
142af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com#include "SkPdfConfig.h"
15571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#include "SkTDArray.h"
16571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#include "SkTDict.h"
172af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com
182af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com// All these constants are defined by the PDF 1.4 Spec.
19571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
20571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.comclass SkPdfDictionary;
2178b38b130deb8bcfa41611039875ce0162542ac1edisonn@google.comclass SkPdfImageDictionary;
222af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.comclass SkPdfNativeDoc;
232af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.comclass SkPdfNativeObject;
242af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com
25571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
26571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com// White Spaces
27571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#define kNUL_PdfWhiteSpace '\x00'
28571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#define kHT_PdfWhiteSpace  '\x09'
29571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#define kLF_PdfWhiteSpace  '\x0A'
30571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#define kFF_PdfWhiteSpace  '\x0C'
31571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#define kCR_PdfWhiteSpace  '\x0D'
32571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#define kSP_PdfWhiteSpace  '\x20'
33571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
34571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com// PdfDelimiters
35571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#define kOpenedRoundBracket_PdfDelimiter        '('
36571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#define kClosedRoundBracket_PdfDelimiter        ')'
37571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#define kOpenedInequityBracket_PdfDelimiter     '<'
38571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#define kClosedInequityBracket_PdfDelimiter     '>'
39571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#define kOpenedSquareBracket_PdfDelimiter       '['
40571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#define kClosedSquareBracket_PdfDelimiter       ']'
41571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#define kOpenedCurlyBracket_PdfDelimiter        '{'
42571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#define kClosedCurlyBracket_PdfDelimiter        '}'
43571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#define kNamed_PdfDelimiter                     '/'
44571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#define kComment_PdfDelimiter                   '%'
45571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
46571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#define kEscape_PdfSpecial                      '\\'
47571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#define kBackspace_PdfSpecial                   '\x08'
48571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
49571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com// TODO(edisonn): what is the faster way for compiler/machine type to evaluate this expressions?
50571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com// we should evaluate all options. might be even different from one machine to another
51571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com// 1) expand expression, let compiler optimize it
52571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com// 2) binary search
53571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com// 3) linear search in array
54571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com// 4) vector (e.f. T type[256] .. return type[ch] ...
55571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com// 5) manually build the expression with least number of operators, e.g. for consecutive
56571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com// chars, we can use an binary equal ignoring last bit
572af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com#define isPdfWhiteSpace(ch) (((ch)==kNUL_PdfWhiteSpace)|| \
582af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com                             ((ch)==kHT_PdfWhiteSpace)|| \
592af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com                             ((ch)==kLF_PdfWhiteSpace)|| \
602af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com                             ((ch)==kFF_PdfWhiteSpace)|| \
612af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com                             ((ch)==kCR_PdfWhiteSpace)|| \
622af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com                             ((ch)==kSP_PdfWhiteSpace))
63571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
64571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#define isPdfEOL(ch) (((ch)==kLF_PdfWhiteSpace)||((ch)==kCR_PdfWhiteSpace))
65571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
66571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
67571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#define isPdfDelimiter(ch) (((ch)==kOpenedRoundBracket_PdfDelimiter)||\
68571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                            ((ch)==kClosedRoundBracket_PdfDelimiter)||\
69571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                            ((ch)==kOpenedInequityBracket_PdfDelimiter)||\
70571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                            ((ch)==kClosedInequityBracket_PdfDelimiter)||\
71571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                            ((ch)==kOpenedSquareBracket_PdfDelimiter)||\
72571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                            ((ch)==kClosedSquareBracket_PdfDelimiter)||\
73571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                            ((ch)==kOpenedCurlyBracket_PdfDelimiter)||\
74571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                            ((ch)==kClosedCurlyBracket_PdfDelimiter)||\
75571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                            ((ch)==kNamed_PdfDelimiter)||\
76571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                            ((ch)==kComment_PdfDelimiter))
77571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
78571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#define isPdfWhiteSpaceOrPdfDelimiter(ch) (isPdfWhiteSpace(ch)||isPdfDelimiter(ch))
79571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
80571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#define isPdfDigit(ch) ((ch)>='0'&&(ch)<='9')
814ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com#define isPdfNumeric(ch) (isPdfDigit(ch)||(ch)=='+'||(ch)=='-'||(ch)=='.')
82571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
83598cf5d3cfc428108cf21ab45d73a995d7e5c2a8edisonn@google.comconst unsigned char* skipPdfWhiteSpaces(const unsigned char* buffer, const unsigned char* end);
84598cf5d3cfc428108cf21ab45d73a995d7e5c2a8edisonn@google.comconst unsigned char* endOfPdfToken(const unsigned char* start, const unsigned char* end);
85571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
86571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#define BUFFER_SIZE 1024
87571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
882af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com/** \class SkPdfAllocator
892af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com *
902af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com *   An allocator only allocates memory, and it deletes it all when the allocator is destroyed.
912af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com *   This strategy would allow us not to do any garbage collection while we parse and/or render
922af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com *   a pdf.
932af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com *
942af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com */
952af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.comclass SkPdfAllocator {
963aac1f9f308192f3787265830fe86ce8874e7382edisonn@google.compublic:
97571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    SkPdfAllocator() {
98a5aaa7998fc18489701660f781d7daa33ffc6f6eedisonn@google.com        fSizeInBytes = sizeof(*this);
99571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        fCurrent = allocBlock();
100571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        fCurrentUsed = 0;
101571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
102571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
103571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    ~SkPdfAllocator();
104571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1052af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com    // Allocates an object. It will be reset automatically when ~SkPdfAllocator() is called.
1063aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    SkPdfNativeObject* allocObject();
107571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1082af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com    // Allocates a buffer. It will be freed automatically when ~SkPdfAllocator() is called.
109571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    void* alloc(size_t bytes) {
110571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        void* data = malloc(bytes);
111571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        fHandles.push(data);
112a5aaa7998fc18489701660f781d7daa33ffc6f6eedisonn@google.com        fSizeInBytes += bytes;
113571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return data;
114571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
115a5aaa7998fc18489701660f781d7daa33ffc6f6eedisonn@google.com
1162af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com    // Returns the number of bytes used in this allocator.
1177b328fddf94eea5f05ffa36de02d7d9922f504daedisonn@google.com    size_t bytesUsed() const {
118a5aaa7998fc18489701660f781d7daa33ffc6f6eedisonn@google.com        return fSizeInBytes;
119a5aaa7998fc18489701660f781d7daa33ffc6f6eedisonn@google.com    }
120571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1212af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.comprivate:
1222af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com    SkTDArray<SkPdfNativeObject*> fHistory;
1232af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com    SkTDArray<void*> fHandles;
1242af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com    SkPdfNativeObject* fCurrent;
1252af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com    int fCurrentUsed;
1262af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com
1272af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com    SkPdfNativeObject* allocBlock();
1282af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com    size_t fSizeInBytes;
1292af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com};
130571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1312af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com// Type of a parsed token.
132571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.comenum SkPdfTokenType {
133571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    kKeyword_TokenType,
134571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    kObject_TokenType,
135571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com};
136571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1372af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com
1382af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com/** \struct PdfToken
1392af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com *
1402af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com *   Stores the result of the parsing - a keyword or an object.
1412af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com *
1422af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com */
143571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.comstruct PdfToken {
1442af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com    const char*             fKeyword;
1452af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com    size_t                  fKeywordLength;
1462af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com    SkPdfNativeObject*      fObject;
1472af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com    SkPdfTokenType          fType;
148571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
149571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    PdfToken() : fKeyword(NULL), fKeywordLength(0), fObject(NULL) {}
150571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com};
151571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1522af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com/** \class SkPdfNativeTokenizer
1532af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com *
1542af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com *   Responsible to tokenize a stream in small tokens, eityh a keyword or an object.
1552af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com *   A renderer can feed on the tokens and render a pdf.
1562af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com *
1572af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com */
158571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.comclass SkPdfNativeTokenizer {
159571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.compublic:
1602af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com    SkPdfNativeTokenizer(SkPdfNativeObject* objWithStream,
1612af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com                         SkPdfAllocator* allocator, SkPdfNativeDoc* doc);
1622af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com    SkPdfNativeTokenizer(const unsigned char* buffer, int len,
1632af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com                         SkPdfAllocator* allocator, SkPdfNativeDoc* doc);
164571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1653aac1f9f308192f3787265830fe86ce8874e7382edisonn@google.com    virtual ~SkPdfNativeTokenizer();
166571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1672af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com    // Reads one token. Returns false if there are no more tokens.
168571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool readToken(PdfToken* token);
1692af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com
1702af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com    // Put back a token to be read in the nextToken read. Only one token is allowed to be put
1712af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com    // back. Must not necesaarely be the last token read.
172571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    void PutBack(PdfToken token);
1732af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com
1742af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com    // Reads the inline image that is present in the stream. At this point we just consumed the ID
1752af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com    // token already.
17678b38b130deb8bcfa41611039875ce0162542ac1edisonn@google.com    SkPdfImageDictionary* readInlineImage();
177571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
178571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.comprivate:
1792af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com    bool readTokenCore(PdfToken* token);
1802af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com
1813aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    SkPdfNativeDoc* fDoc;
182571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    SkPdfAllocator* fAllocator;
183571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1842ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com    const unsigned char* fUncompressedStreamStart;
1852ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com    const unsigned char* fUncompressedStream;
1862ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com    const unsigned char* fUncompressedStreamEnd;
187571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
188571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool fEmpty;
189571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool fHasPutBack;
190571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    PdfToken fPutBack;
1913aac1f9f308192f3787265830fe86ce8874e7382edisonn@google.com};
1923aac1f9f308192f3787265830fe86ce8874e7382edisonn@google.com
1932af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.comconst unsigned char* nextObject(const unsigned char* start, const unsigned char* end,
1942af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com                                SkPdfNativeObject* token,
1952af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com                                SkPdfAllocator* allocator,
1962af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com                                SkPdfNativeDoc* doc);
1972af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com
198cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com#endif  // SkPdfNativeTokenizer_DEFINED
199