| Index: experimental/PdfViewer/pdfparser/native/SkPdfNativeTokenizer.cpp
|
| ===================================================================
|
| --- experimental/PdfViewer/pdfparser/native/SkPdfNativeTokenizer.cpp (revision 10712)
|
| +++ experimental/PdfViewer/pdfparser/native/SkPdfNativeTokenizer.cpp (working copy)
|
| @@ -1,6 +1,6 @@
|
|
|
| #include "SkPdfNativeTokenizer.h"
|
| -#include "SkPdfObject.h"
|
| +#include "SkPdfNativeObject.h"
|
| #include "SkPdfConfig.h"
|
|
|
| #include "SkPdfStreamCommonDictionary_autogen.h"
|
| @@ -126,7 +126,7 @@
|
| }
|
|
|
| // last elem has to be ]
|
| -static const unsigned char* readArray(int level, const unsigned char* start, const unsigned char* end, SkPdfObject* array, SkPdfAllocator* allocator, SkNativeParsedPDF* doc) {
|
| +static const unsigned char* readArray(int level, const unsigned char* start, const unsigned char* end, SkPdfNativeObject* array, SkPdfAllocator* allocator, SkPdfNativeDoc* doc) {
|
| if (allocator == NULL) {
|
| // TODO(edisonn): report/warning error
|
| return end;
|
| @@ -148,15 +148,15 @@
|
| return endOfToken;
|
| }
|
|
|
| - SkPdfObject* newObj = allocator->allocObject();
|
| + SkPdfNativeObject* newObj = allocator->allocObject();
|
| start = nextObject(level + 1, start, end, newObj, allocator, doc);
|
| // TODO(edisonn): perf/memory: put the variables on the stack, and flush them on the array only when
|
| // we are sure they are not references!
|
| if (newObj->isKeywordReference() && array->size() >= 2 && array->objAtAIndex(array->size() - 1)->isInteger() && array->objAtAIndex(array->size() - 2)->isInteger()) {
|
| - SkPdfObject* gen = array->removeLastInArray();
|
| - SkPdfObject* id = array->removeLastInArray();
|
| + SkPdfNativeObject* gen = array->removeLastInArray();
|
| + SkPdfNativeObject* id = array->removeLastInArray();
|
| newObj->reset();
|
| - SkPdfObject::makeReference((unsigned int)id->intValue(), (unsigned int)gen->intValue(), newObj);
|
| + SkPdfNativeObject::makeReference((unsigned int)id->intValue(), (unsigned int)gen->intValue(), newObj);
|
| }
|
| array->appendInArray(newObj);
|
| }
|
| @@ -296,7 +296,7 @@
|
| return readString(level, start, end, NULL) - start;
|
| }
|
|
|
| -static const unsigned char* readString(int level, const unsigned char* start, const unsigned char* end, SkPdfObject* str, SkPdfAllocator* allocator) {
|
| +static const unsigned char* readString(int level, const unsigned char* start, const unsigned char* end, SkPdfNativeObject* str, SkPdfAllocator* allocator) {
|
| if (!allocator) {
|
| return end;
|
| }
|
| @@ -304,7 +304,7 @@
|
| // TODO(edisonn): optimize the allocation, don't allocate new string, but put it in a preallocated buffer
|
| unsigned char* out = (unsigned char*)allocator->alloc(outLength);
|
| start = readString(level, start, end, out);
|
| - SkPdfObject::makeString(out, out + outLength, str);
|
| + SkPdfNativeObject::makeString(out, out + outLength, str);
|
| TRACE_STRING(out, out + outLength);
|
| return start; // consumed already ) at the end of the string
|
| }
|
| @@ -443,7 +443,7 @@
|
| return readHexString(level, start, end, NULL) - start;
|
| }
|
|
|
| -static const unsigned char* readHexString(int level, const unsigned char* start, const unsigned char* end, SkPdfObject* str, SkPdfAllocator* allocator) {
|
| +static const unsigned char* readHexString(int level, const unsigned char* start, const unsigned char* end, SkPdfNativeObject* str, SkPdfAllocator* allocator) {
|
| if (!allocator) {
|
| return end;
|
| }
|
| @@ -451,7 +451,7 @@
|
| // TODO(edisonn): optimize the allocation, don't allocate new string, but put it in a preallocated buffer
|
| unsigned char* out = (unsigned char*)allocator->alloc(outLength);
|
| start = readHexString(level, start, end, out);
|
| - SkPdfObject::makeHexString(out, out + outLength, str);
|
| + SkPdfNativeObject::makeHexString(out, out + outLength, str);
|
| TRACE_HEXSTRING(out, out + outLength);
|
| return start; // consumed already > at the end of the string
|
| }
|
| @@ -568,7 +568,7 @@
|
| return readName(level, start, end, NULL) - start;
|
| }
|
|
|
| -static const unsigned char* readName(int level, const unsigned char* start, const unsigned char* end, SkPdfObject* name, SkPdfAllocator* allocator) {
|
| +static const unsigned char* readName(int level, const unsigned char* start, const unsigned char* end, SkPdfNativeObject* name, SkPdfAllocator* allocator) {
|
| if (!allocator) {
|
| return end;
|
| }
|
| @@ -576,7 +576,7 @@
|
| // TODO(edisonn): optimize the allocation, don't allocate new string, but put it in a preallocated buffer
|
| unsigned char* out = (unsigned char*)allocator->alloc(outLength);
|
| start = readName(level, start, end, out);
|
| - SkPdfObject::makeName(out, out + outLength, name);
|
| + SkPdfNativeObject::makeName(out, out + outLength, name);
|
| TRACE_NAME(out, out + outLength);
|
| return start;
|
| }
|
| @@ -605,7 +605,7 @@
|
| // right now implement the silly algorithm that assumes endstream is finishing the stream
|
|
|
|
|
| -static const unsigned char* readStream(int level, const unsigned char* start, const unsigned char* end, SkPdfObject* dict, SkNativeParsedPDF* doc) {
|
| +static const unsigned char* readStream(int level, const unsigned char* start, const unsigned char* end, SkPdfNativeObject* dict, SkPdfNativeDoc* doc) {
|
| TRACE_INDENT(level, "Stream");
|
| start = skipPdfWhiteSpaces(level, start, end);
|
| if (!(start[0] == 's' && start[1] == 't' && start[2] == 'r' && start[3] == 'e' && start[4] == 'a' && start[5] == 'm')) {
|
| @@ -682,7 +682,7 @@
|
| return start;
|
| }
|
|
|
| -static const unsigned char* readInlineImageStream(int level, const unsigned char* start, const unsigned char* end, SkPdfImageDictionary* inlineImage, SkNativeParsedPDF* doc) {
|
| +static const unsigned char* readInlineImageStream(int level, const unsigned char* start, const unsigned char* end, SkPdfImageDictionary* inlineImage, SkPdfNativeDoc* doc) {
|
| TRACE_INDENT(level, "Inline Image");
|
| // We already processed ID keyword, and we should be positioned immediately after it
|
|
|
| @@ -714,26 +714,26 @@
|
| return endEI;
|
| }
|
|
|
| -static const unsigned char* readDictionary(int level, const unsigned char* start, const unsigned char* end, SkPdfObject* dict, SkPdfAllocator* allocator, SkNativeParsedPDF* doc) {
|
| +static const unsigned char* readDictionary(int level, const unsigned char* start, const unsigned char* end, SkPdfNativeObject* dict, SkPdfAllocator* allocator, SkPdfNativeDoc* doc) {
|
| if (allocator == NULL) {
|
| // TODO(edisonn): report/warning error
|
| return end;
|
| }
|
| TRACE_INDENT(level, "Dictionary");
|
| - SkPdfObject::makeEmptyDictionary(dict);
|
| + SkPdfNativeObject::makeEmptyDictionary(dict);
|
|
|
| start = skipPdfWhiteSpaces(level, start, end);
|
| SkPdfAllocator tmpStorage; // keys will be stored in dict, we can free them immediately after set.
|
|
|
| while (start < end && *start == kNamed_PdfDelimiter) {
|
| - SkPdfObject key;
|
| + SkPdfNativeObject key;
|
| //*start = '\0';
|
| start++;
|
| start = readName(level + 1, start, end, &key, &tmpStorage);
|
| start = skipPdfWhiteSpaces(level + 1, start, end);
|
|
|
| if (start < end) {
|
| - SkPdfObject* value = allocator->allocObject();
|
| + SkPdfNativeObject* value = allocator->allocObject();
|
| start = nextObject(level + 1, start, end, value, allocator, doc);
|
|
|
| start = skipPdfWhiteSpaces(level + 1, start, end);
|
| @@ -741,16 +741,16 @@
|
| if (start < end) {
|
| // seems we have an indirect reference
|
| if (isPdfDigit(*start)) {
|
| - SkPdfObject generation;
|
| + SkPdfNativeObject generation;
|
| start = nextObject(level + 1, start, end, &generation, allocator, doc);
|
|
|
| - SkPdfObject keywordR;
|
| + SkPdfNativeObject keywordR;
|
| start = nextObject(level + 1, start, end, &keywordR, allocator, doc);
|
|
|
| if (value->isInteger() && generation.isInteger() && keywordR.isKeywordReference()) {
|
| int64_t id = value->intValue();
|
| value->reset();
|
| - SkPdfObject::makeReference((unsigned int)id, (unsigned int)generation.intValue(), value);
|
| + SkPdfNativeObject::makeReference((unsigned int)id, (unsigned int)generation.intValue(), value);
|
| dict->set(&key, value);
|
| } else {
|
| // error, ignore
|
| @@ -767,7 +767,7 @@
|
| }
|
| start = skipPdfWhiteSpaces(level + 1, start, end);
|
| } else {
|
| - dict->set(&key, &SkPdfObject::kNull);
|
| + dict->set(&key, &SkPdfNativeObject::kNull);
|
| return end;
|
| }
|
| }
|
| @@ -792,7 +792,7 @@
|
| return start;
|
| }
|
|
|
| -const unsigned char* nextObject(int level, const unsigned char* start, const unsigned char* end, SkPdfObject* token, SkPdfAllocator* allocator, SkNativeParsedPDF* doc) {
|
| +const unsigned char* nextObject(int level, const unsigned char* start, const unsigned char* end, SkPdfNativeObject* token, SkPdfAllocator* allocator, SkPdfNativeDoc* doc) {
|
| const unsigned char* current;
|
|
|
| // skip white spaces
|
| @@ -812,7 +812,7 @@
|
| switch (*start) {
|
| case kOpenedSquareBracket_PdfDelimiter:
|
| //*start = '\0';
|
| - SkPdfObject::makeEmptyArray(token);
|
| + SkPdfNativeObject::makeEmptyArray(token);
|
| return readArray(level + 1, current, end, token, allocator, doc);
|
|
|
| case kOpenedRoundBracket_PdfDelimiter:
|
| @@ -847,31 +847,31 @@
|
| }
|
|
|
| if (tokenLen == 4 && start[0] == 'n' && start[1] == 'u' && start[2] == 'l' && start[3] == 'l') {
|
| - SkPdfObject::makeNull(token);
|
| + SkPdfNativeObject::makeNull(token);
|
| return current;
|
| }
|
|
|
| if (tokenLen == 4 && start[0] == 't' && start[1] == 'r' && start[2] == 'u' && start[3] == 'e') {
|
| - SkPdfObject::makeBoolean(true, token);
|
| + SkPdfNativeObject::makeBoolean(true, token);
|
| return current;
|
| }
|
|
|
| if (tokenLen == 5 && start[0] == 'f' && start[1] == 'a' && start[2] == 'l' && start[3] == 's' && start[4] == 'e') {
|
| - SkPdfObject::makeBoolean(false, token);
|
| + SkPdfNativeObject::makeBoolean(false, token);
|
| return current;
|
| }
|
|
|
| if (isPdfNumeric(*start)) {
|
| - SkPdfObject::makeNumeric(start, current, token);
|
| + SkPdfNativeObject::makeNumeric(start, current, token);
|
| } else {
|
| - SkPdfObject::makeKeyword(start, current, token);
|
| + SkPdfNativeObject::makeKeyword(start, current, token);
|
| }
|
| return current;
|
| }
|
|
|
| -SkPdfObject* SkPdfAllocator::allocBlock() {
|
| - fSizeInBytes += BUFFER_SIZE * sizeof(SkPdfObject);
|
| - return new SkPdfObject[BUFFER_SIZE];
|
| +SkPdfNativeObject* SkPdfAllocator::allocBlock() {
|
| + fSizeInBytes += BUFFER_SIZE * sizeof(SkPdfNativeObject);
|
| + return new SkPdfNativeObject[BUFFER_SIZE];
|
| }
|
|
|
| SkPdfAllocator::~SkPdfAllocator() {
|
| @@ -890,19 +890,19 @@
|
| delete[] fCurrent;
|
| }
|
|
|
| -SkPdfObject* SkPdfAllocator::allocObject() {
|
| +SkPdfNativeObject* SkPdfAllocator::allocObject() {
|
| if (fCurrentUsed >= BUFFER_SIZE) {
|
| fHistory.push(fCurrent);
|
| fCurrent = allocBlock();
|
| fCurrentUsed = 0;
|
| - fSizeInBytes += sizeof(SkPdfObject*);
|
| + fSizeInBytes += sizeof(SkPdfNativeObject*);
|
| }
|
| fCurrentUsed++;
|
| return &fCurrent[fCurrentUsed - 1];
|
| }
|
|
|
| // TODO(edisonn): perf: do no copy the buffers, but use them, and mark cache the result, so there is no need of a second pass
|
| -SkPdfNativeTokenizer::SkPdfNativeTokenizer(SkPdfObject* objWithStream, const SkPdfMapper* mapper, SkPdfAllocator* allocator, SkNativeParsedPDF* doc) : fDoc(doc), fMapper(mapper), fAllocator(allocator), fUncompressedStream(NULL), fUncompressedStreamEnd(NULL), fEmpty(false), fHasPutBack(false) {
|
| +SkPdfNativeTokenizer::SkPdfNativeTokenizer(SkPdfNativeObject* objWithStream, const SkPdfMapper* mapper, SkPdfAllocator* allocator, SkPdfNativeDoc* doc) : fDoc(doc), fMapper(mapper), fAllocator(allocator), fUncompressedStream(NULL), fUncompressedStreamEnd(NULL), fEmpty(false), fHasPutBack(false) {
|
| const unsigned char* buffer = NULL;
|
| size_t len = 0;
|
| objWithStream->GetFilteredStreamRef(&buffer, &len);
|
| @@ -915,7 +915,7 @@
|
| fUncompressedStreamEnd = fUncompressedStream + len;
|
| }
|
|
|
| -SkPdfNativeTokenizer::SkPdfNativeTokenizer(const unsigned char* buffer, int len, const SkPdfMapper* mapper, SkPdfAllocator* allocator, SkNativeParsedPDF* doc) : fDoc(doc), fMapper(mapper), fAllocator(allocator), fEmpty(false), fHasPutBack(false) {
|
| +SkPdfNativeTokenizer::SkPdfNativeTokenizer(const unsigned char* buffer, int len, const SkPdfMapper* mapper, SkPdfAllocator* allocator, SkPdfNativeDoc* doc) : fDoc(doc), fMapper(mapper), fAllocator(allocator), fEmpty(false), fHasPutBack(false) {
|
| // TODO(edisonn): hack, find end of object
|
| char* endobj = strrstrk((char*)buffer, (char*)buffer + len, "endobj");
|
| if (endobj) {
|
| @@ -929,7 +929,7 @@
|
| }
|
|
|
| bool SkPdfNativeTokenizer::readTokenCore(PdfToken* token) {
|
| - SkPdfObject obj;
|
| + SkPdfNativeObject obj;
|
| #ifdef PDF_TRACE_READ_TOKEN
|
| static int read_op = 0;
|
| #endif
|
| @@ -944,12 +944,12 @@
|
| fUncompressedStream = nextObject(0, fUncompressedStream, fUncompressedStreamEnd, &obj, fAllocator, fDoc);
|
|
|
| // If it is a keyword, we will only get the pointer of the string
|
| - if (obj.type() == SkPdfObject::kKeyword_PdfObjectType) {
|
| + if (obj.type() == SkPdfNativeObject::kKeyword_PdfObjectType) {
|
| token->fKeyword = obj.c_str();
|
| token->fKeywordLength = obj.lenstr();
|
| token->fType = kKeyword_TokenType;
|
| } else {
|
| - SkPdfObject* pobj = fAllocator->allocObject();
|
| + SkPdfNativeObject* pobj = fAllocator->allocObject();
|
| *pobj = obj;
|
| token->fObject = pobj;
|
| token->fType = kObject_TokenType;
|
| @@ -1027,7 +1027,7 @@
|
| #define HANDLE_NAME_ABBR(obj,longName,shortName) if (obj->isName(#shortName)) return &longName;
|
|
|
|
|
| -static SkPdfObject* inlineImageKeyAbbreviationExpand(SkPdfObject* key) {
|
| +static SkPdfNativeObject* inlineImageKeyAbbreviationExpand(SkPdfNativeObject* key) {
|
| if (!key || !key->isName()) {
|
| return key;
|
| }
|
| @@ -1047,7 +1047,7 @@
|
| return key;
|
| }
|
|
|
| -static SkPdfObject* inlineImageValueAbbreviationExpand(SkPdfObject* value) {
|
| +static SkPdfNativeObject* inlineImageValueAbbreviationExpand(SkPdfNativeObject* value) {
|
| if (!value || !value->isName()) {
|
| return value;
|
| }
|
| @@ -1076,17 +1076,17 @@
|
| }
|
|
|
| SkPdfImageDictionary* inlineImage = (SkPdfImageDictionary*)fAllocator->allocObject();
|
| - SkPdfObject::makeEmptyDictionary(inlineImage);
|
| + SkPdfNativeObject::makeEmptyDictionary(inlineImage);
|
|
|
| while (fUncompressedStream < fUncompressedStreamEnd) {
|
| - SkPdfObject* key = fAllocator->allocObject();
|
| + SkPdfNativeObject* key = fAllocator->allocObject();
|
| fUncompressedStream = nextObject(0, fUncompressedStream, fUncompressedStreamEnd, key, fAllocator, fDoc);
|
|
|
| if (key->isKeyword() && key->lenstr() == 2 && key->c_str()[0] == 'I' && key->c_str()[1] == 'D') { // ID
|
| fUncompressedStream = readInlineImageStream(0, fUncompressedStream, fUncompressedStreamEnd, inlineImage, fDoc);
|
| return inlineImage;
|
| } else {
|
| - SkPdfObject* obj = fAllocator->allocObject();
|
| + SkPdfNativeObject* obj = fAllocator->allocObject();
|
| fUncompressedStream = nextObject(0, fUncompressedStream, fUncompressedStreamEnd, obj, fAllocator, fDoc);
|
| // TODO(edisonn): perf maybe we should not expand abreviation like this
|
| inlineImage->set(inlineImageKeyAbbreviationExpand(key),
|
|
|