| Index: experimental/PdfViewer/pdfparser/native/SkPdfNativeDoc.cpp
|
| ===================================================================
|
| --- experimental/PdfViewer/pdfparser/native/SkPdfNativeDoc.cpp (revision 10543)
|
| +++ experimental/PdfViewer/pdfparser/native/SkPdfNativeDoc.cpp (working copy)
|
| @@ -1,7 +1,6 @@
|
| -#include "SkNativeParsedPDF.h"
|
| +#include "SkPdfNativeDoc.h"
|
| #include "SkPdfNativeTokenizer.h"
|
| -#include "SkPdfBasics.h"
|
| -#include "SkPdfObject.h"
|
| +#include "SkPdfNativeObject.h"
|
|
|
| #include <stdio.h>
|
| #include <string.h>
|
| @@ -59,7 +58,7 @@
|
| return current;
|
| }
|
|
|
| -SkNativeParsedPDF* gDoc = NULL;
|
| +SkPdfNativeDoc* gDoc = NULL;
|
|
|
| // TODO(edisonn): NYI
|
| // TODO(edisonn): 3 constructuctors from URL, from stream, from file ...
|
| @@ -69,7 +68,7 @@
|
| // 2) recoverable corupt file: remove endobj, endsteam, remove other keywords, use other white spaces, insert comments randomly, ...
|
| // 3) irrecoverable corrupt file
|
|
|
| -SkNativeParsedPDF::SkNativeParsedPDF(SkStream* stream)
|
| +SkPdfNativeDoc::SkPdfNativeDoc(SkStream* stream)
|
| : fAllocator(new SkPdfAllocator())
|
| , fFileContent(NULL)
|
| , fContentLength(0)
|
| @@ -82,7 +81,7 @@
|
| init(ptr, size);
|
| }
|
|
|
| -SkNativeParsedPDF::SkNativeParsedPDF(const char* path)
|
| +SkPdfNativeDoc::SkPdfNativeDoc(const char* path)
|
| : fAllocator(new SkPdfAllocator())
|
| , fFileContent(NULL)
|
| , fContentLength(0)
|
| @@ -108,7 +107,7 @@
|
| }
|
| }
|
|
|
| -void SkNativeParsedPDF::init(const void* bytes, size_t length) {
|
| +void SkPdfNativeDoc::init(const void* bytes, size_t length) {
|
| fFileContent = (const unsigned char*)bytes;
|
| fContentLength = length;
|
| const unsigned char* eofLine = lineHome(fFileContent, fFileContent + fContentLength - 1);
|
| @@ -158,7 +157,7 @@
|
| // and resolve references?... or not ...
|
| }
|
|
|
| -void SkNativeParsedPDF::loadWithoutXRef() {
|
| +void SkPdfNativeDoc::loadWithoutXRef() {
|
| const unsigned char* current = fFileContent;
|
| const unsigned char* end = fFileContent + fContentLength;
|
|
|
| @@ -167,7 +166,7 @@
|
|
|
| current = skipPdfWhiteSpaces(0, current, end);
|
| while (current < end) {
|
| - SkPdfObject token;
|
| + SkPdfNativeObject token;
|
| current = nextObject(0, current, end, &token, NULL, NULL);
|
| if (token.isInteger()) {
|
| int id = (int)token.intValue();
|
| @@ -189,7 +188,7 @@
|
|
|
| fObjects[id].fOffset = current - fFileContent;
|
|
|
| - SkPdfObject* obj = fAllocator->allocObject();
|
| + SkPdfNativeObject* obj = fAllocator->allocObject();
|
| current = nextObject(0, current, end, obj, fAllocator, this);
|
|
|
| fObjects[id].fResolvedReference = obj;
|
| @@ -210,8 +209,8 @@
|
| // TODO(edisonn): hack, detect root catalog - we need to implement liniarized support, and remove this hack.
|
| if (!fRootCatalogRef) {
|
| for (unsigned int i = 0 ; i < objects(); i++) {
|
| - SkPdfObject* obj = object(i);
|
| - SkPdfObject* root = (obj && obj->isDictionary()) ? obj->get("Root") : NULL;
|
| + SkPdfNativeObject* obj = object(i);
|
| + SkPdfNativeObject* root = (obj && obj->isDictionary()) ? obj->get("Root") : NULL;
|
| if (root && root->isReference()) {
|
| fRootCatalogRef = root;
|
| }
|
| @@ -233,20 +232,20 @@
|
| }
|
|
|
| // TODO(edisonn): NYI
|
| -SkNativeParsedPDF::~SkNativeParsedPDF() {
|
| +SkPdfNativeDoc::~SkPdfNativeDoc() {
|
| sk_free((void*)fFileContent);
|
| delete fAllocator;
|
| }
|
|
|
| -const unsigned char* SkNativeParsedPDF::readCrossReferenceSection(const unsigned char* xrefStart, const unsigned char* trailerEnd) {
|
| - SkPdfObject xref;
|
| +const unsigned char* SkPdfNativeDoc::readCrossReferenceSection(const unsigned char* xrefStart, const unsigned char* trailerEnd) {
|
| + SkPdfNativeObject xref;
|
| const unsigned char* current = nextObject(0, xrefStart, trailerEnd, &xref, NULL, NULL);
|
|
|
| if (!xref.isKeyword("xref")) {
|
| return trailerEnd;
|
| }
|
|
|
| - SkPdfObject token;
|
| + SkPdfNativeObject token;
|
| while (current < trailerEnd) {
|
| token.reset();
|
| const unsigned char* previous = current;
|
| @@ -297,12 +296,12 @@
|
| return current;
|
| }
|
|
|
| -const unsigned char* SkNativeParsedPDF::readTrailer(const unsigned char* trailerStart, const unsigned char* trailerEnd, bool storeCatalog, long* prev, bool skipKeyword) {
|
| +const unsigned char* SkPdfNativeDoc::readTrailer(const unsigned char* trailerStart, const unsigned char* trailerEnd, bool storeCatalog, long* prev, bool skipKeyword) {
|
| *prev = -1;
|
|
|
| const unsigned char* current = trailerStart;
|
| if (!skipKeyword) {
|
| - SkPdfObject trailerKeyword;
|
| + SkPdfNativeObject trailerKeyword;
|
| // TODO(edisonn): use null allocator, and let it just fail if memory
|
| // needs allocated (but no crash)!
|
| current = nextObject(0, current, trailerEnd, &trailerKeyword, NULL, NULL);
|
| @@ -314,7 +313,7 @@
|
| }
|
| }
|
|
|
| - SkPdfObject token;
|
| + SkPdfNativeObject token;
|
| current = nextObject(0, current, trailerEnd, &token, fAllocator, NULL);
|
| if (!token.isDictionary()) {
|
| return current;
|
| @@ -325,7 +324,7 @@
|
| }
|
|
|
| if (storeCatalog) {
|
| - SkPdfObject* ref = trailer->Root(NULL);
|
| + SkPdfNativeObject* ref = trailer->Root(NULL);
|
| if (ref == NULL || !ref->isReference()) {
|
| // TODO(edisonn): oops, we have to fix the corrup pdf file
|
| return current;
|
| @@ -340,7 +339,7 @@
|
| return current;
|
| }
|
|
|
| -void SkNativeParsedPDF::addCrossSectionInfo(int id, int generation, int offset, bool isFreed) {
|
| +void SkPdfNativeDoc::addCrossSectionInfo(int id, int generation, int offset, bool isFreed) {
|
| // TODO(edisonn): security here
|
| while (fObjects.count() < id + 1) {
|
| reset(fObjects.append());
|
| @@ -351,7 +350,7 @@
|
| fObjects[id].fResolvedReference = NULL;
|
| }
|
|
|
| -SkPdfObject* SkNativeParsedPDF::readObject(int id/*, int expectedGeneration*/) {
|
| +SkPdfNativeObject* SkPdfNativeDoc::readObject(int id/*, int expectedGeneration*/) {
|
| long startOffset = fObjects[id].fOffset;
|
| //long endOffset = fObjects[id].fOffsetEnd;
|
| // TODO(edisonn): use hinted endOffset
|
| @@ -364,10 +363,10 @@
|
|
|
| SkPdfNativeTokenizer tokenizer(current, end - current, fMapper, fAllocator, this);
|
|
|
| - SkPdfObject idObj;
|
| - SkPdfObject generationObj;
|
| - SkPdfObject objKeyword;
|
| - SkPdfObject* dict = fAllocator->allocObject();
|
| + SkPdfNativeObject idObj;
|
| + SkPdfNativeObject generationObj;
|
| + SkPdfNativeObject objKeyword;
|
| + SkPdfNativeObject* dict = fAllocator->allocObject();
|
|
|
| current = nextObject(0, current, end, &idObj, NULL, NULL);
|
| if (current >= end) {
|
| @@ -402,7 +401,7 @@
|
| return dict;
|
| }
|
|
|
| -void SkNativeParsedPDF::fillPages(SkPdfPageTreeNodeDictionary* tree) {
|
| +void SkPdfNativeDoc::fillPages(SkPdfPageTreeNodeDictionary* tree) {
|
| SkPdfArray* kids = tree->Kids(this);
|
| if (kids == NULL) {
|
| *fPages.append() = (SkPdfPageObjectDictionary*)tree;
|
| @@ -411,8 +410,8 @@
|
|
|
| int cnt = kids->size();
|
| for (int i = 0; i < cnt; i++) {
|
| - SkPdfObject* obj = resolveReference(kids->objAtAIndex(i));
|
| - if (fMapper->mapPageObjectDictionary(obj) != kPageObjectDictionary_SkPdfObjectType) {
|
| + SkPdfNativeObject* obj = resolveReference(kids->objAtAIndex(i));
|
| + if (fMapper->mapPageObjectDictionary(obj) != kPageObjectDictionary_SkPdfNativeObjectType) {
|
| *fPages.append() = (SkPdfPageObjectDictionary*)obj;
|
| } else {
|
| // TODO(edisonn): verify that it is a page tree indeed
|
| @@ -421,23 +420,23 @@
|
| }
|
| }
|
|
|
| -int SkNativeParsedPDF::pages() const {
|
| +int SkPdfNativeDoc::pages() const {
|
| return fPages.count();
|
| }
|
|
|
| -SkPdfPageObjectDictionary* SkNativeParsedPDF::page(int page) {
|
| +SkPdfPageObjectDictionary* SkPdfNativeDoc::page(int page) {
|
| SkASSERT(page >= 0 && page < fPages.count());
|
| return fPages[page];
|
| }
|
|
|
|
|
| -SkPdfResourceDictionary* SkNativeParsedPDF::pageResources(int page) {
|
| +SkPdfResourceDictionary* SkPdfNativeDoc::pageResources(int page) {
|
| SkASSERT(page >= 0 && page < fPages.count());
|
| return fPages[page]->Resources(this);
|
| }
|
|
|
| // TODO(edisonn): Partial implemented. Move the logics directly in the code generator for inheritable and default value?
|
| -SkRect SkNativeParsedPDF::MediaBox(int page) {
|
| +SkRect SkPdfNativeDoc::MediaBox(int page) {
|
| SkPdfPageObjectDictionary* current = fPages[page];
|
| while (!current->has_MediaBox() && current->has_Parent()) {
|
| current = (SkPdfPageObjectDictionary*)current->Parent(this);
|
| @@ -449,7 +448,7 @@
|
| }
|
|
|
| // TODO(edisonn): stream or array ... ? for now only array
|
| -SkPdfNativeTokenizer* SkNativeParsedPDF::tokenizerOfPage(int page,
|
| +SkPdfNativeTokenizer* SkPdfNativeDoc::tokenizerOfPage(int page,
|
| SkPdfAllocator* allocator) {
|
| if (fPages[page]->isContentsAStream(this)) {
|
| return tokenizerOfStream(fPages[page]->getContentsAsStream(this), allocator);
|
| @@ -460,7 +459,7 @@
|
| }
|
| }
|
|
|
| -SkPdfNativeTokenizer* SkNativeParsedPDF::tokenizerOfStream(SkPdfObject* stream,
|
| +SkPdfNativeTokenizer* SkPdfNativeDoc::tokenizerOfStream(SkPdfNativeObject* stream,
|
| SkPdfAllocator* allocator) {
|
| if (stream == NULL) {
|
| return NULL;
|
| @@ -470,18 +469,18 @@
|
| }
|
|
|
| // TODO(edisonn): NYI
|
| -SkPdfNativeTokenizer* SkNativeParsedPDF::tokenizerOfBuffer(const unsigned char* buffer, size_t len,
|
| +SkPdfNativeTokenizer* SkPdfNativeDoc::tokenizerOfBuffer(const unsigned char* buffer, size_t len,
|
| SkPdfAllocator* allocator) {
|
| // warning does not track two calls in the same buffer! the buffer is updated!
|
| // make a clean copy if needed!
|
| return new SkPdfNativeTokenizer(buffer, len, fMapper, allocator, this);
|
| }
|
|
|
| -size_t SkNativeParsedPDF::objects() const {
|
| +size_t SkPdfNativeDoc::objects() const {
|
| return fObjects.count();
|
| }
|
|
|
| -SkPdfObject* SkNativeParsedPDF::object(int i) {
|
| +SkPdfNativeObject* SkPdfNativeDoc::object(int i) {
|
| SkASSERT(!(i < 0 || i > fObjects.count()));
|
|
|
| if (i < 0 || i > fObjects.count()) {
|
| @@ -497,35 +496,35 @@
|
| return fObjects[i].fObj;
|
| }
|
|
|
| -const SkPdfMapper* SkNativeParsedPDF::mapper() const {
|
| +const SkPdfMapper* SkPdfNativeDoc::mapper() const {
|
| return fMapper;
|
| }
|
|
|
| -SkPdfReal* SkNativeParsedPDF::createReal(double value) const {
|
| - SkPdfObject* obj = fAllocator->allocObject();
|
| - SkPdfObject::makeReal(value, obj);
|
| +SkPdfReal* SkPdfNativeDoc::createReal(double value) const {
|
| + SkPdfNativeObject* obj = fAllocator->allocObject();
|
| + SkPdfNativeObject::makeReal(value, obj);
|
| return (SkPdfReal*)obj;
|
| }
|
|
|
| -SkPdfInteger* SkNativeParsedPDF::createInteger(int value) const {
|
| - SkPdfObject* obj = fAllocator->allocObject();
|
| - SkPdfObject::makeInteger(value, obj);
|
| +SkPdfInteger* SkPdfNativeDoc::createInteger(int value) const {
|
| + SkPdfNativeObject* obj = fAllocator->allocObject();
|
| + SkPdfNativeObject::makeInteger(value, obj);
|
| return (SkPdfInteger*)obj;
|
| }
|
|
|
| -SkPdfString* SkNativeParsedPDF::createString(const unsigned char* sz, size_t len) const {
|
| - SkPdfObject* obj = fAllocator->allocObject();
|
| - SkPdfObject::makeString(sz, len, obj);
|
| +SkPdfString* SkPdfNativeDoc::createString(const unsigned char* sz, size_t len) const {
|
| + SkPdfNativeObject* obj = fAllocator->allocObject();
|
| + SkPdfNativeObject::makeString(sz, len, obj);
|
| return (SkPdfString*)obj;
|
| }
|
|
|
| -SkPdfAllocator* SkNativeParsedPDF::allocator() const {
|
| +SkPdfAllocator* SkPdfNativeDoc::allocator() const {
|
| return fAllocator;
|
| }
|
|
|
| // TODO(edisonn): fix infinite loop if ref to itself!
|
| // TODO(edisonn): perf, fix refs at load, and resolve will simply return fResolvedReference?
|
| -SkPdfObject* SkNativeParsedPDF::resolveReference(SkPdfObject* ref) {
|
| +SkPdfNativeObject* SkPdfNativeDoc::resolveReference(SkPdfNativeObject* ref) {
|
| if (ref && ref->isReference()) {
|
| int id = ref->referenceId();
|
| // TODO(edisonn): generation/updates not supported now
|
| @@ -564,13 +563,11 @@
|
| return fObjects[id].fResolvedReference;
|
| }
|
|
|
| -
|
| -
|
| // TODO(edisonn): fix the mess with const, probably we need to remove it pretty much everywhere
|
| - return (SkPdfObject*)ref;
|
| + return (SkPdfNativeObject*)ref;
|
| }
|
|
|
| -size_t SkNativeParsedPDF::bytesUsed() const {
|
| +size_t SkPdfNativeDoc::bytesUsed() const {
|
| return fAllocator->bytesUsed() +
|
| fContentLength +
|
| fObjects.count() * sizeof(PublicObjectEntry) +
|
|
|