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