diff options
author | edisonn@google.com <edisonn@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-07-10 22:33:10 +0000 |
---|---|---|
committer | edisonn@google.com <edisonn@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-07-10 22:33:10 +0000 |
commit | 222382b30a176db9d9044d9df1ae14e0fbe27181 (patch) | |
tree | 1637df5492b89c338b6e3666d993572a5487c7bf /experimental/PdfViewer/pdfparser | |
parent | 5857e0350d6c3b5e312e1ec9f220aef0fdba06a5 (diff) |
pdf viewer: refactor, add -w parameter to pdfviewer, add -n to remove extenassion page when there is a single page (so skdiff can be run easily) and fix a bug (SkPdfobject should not reset on destruct)
Review URL: https://codereview.chromium.org/18435007
git-svn-id: http://skia.googlecode.com/svn/trunk@9983 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'experimental/PdfViewer/pdfparser')
3 files changed, 28 insertions, 85 deletions
diff --git a/experimental/PdfViewer/pdfparser/native/SkNativeParsedPDF.cpp b/experimental/PdfViewer/pdfparser/native/SkNativeParsedPDF.cpp index b359a8d33d..5f16176376 100644 --- a/experimental/PdfViewer/pdfparser/native/SkNativeParsedPDF.cpp +++ b/experimental/PdfViewer/pdfparser/native/SkNativeParsedPDF.cpp @@ -1,7 +1,6 @@ #include "SkNativeParsedPDF.h" #include "SkPdfNativeTokenizer.h" #include "SkPdfBasics.h" -#include "SkPdfParser.h" #include "SkPdfObject.h" #include <stdio.h> @@ -59,6 +58,7 @@ static unsigned char* ignoreLine(unsigned char* current, unsigned char* end) { return current; } +SkNativeParsedPDF* gDoc = NULL; // TODO(edisonn): NYI // TODO(edisonn): 3 constructuctors from URL, from stream, from file ... @@ -68,10 +68,12 @@ static unsigned char* ignoreLine(unsigned char* current, unsigned char* end) { // 2) recoverable corupt file: remove endobj, endsteam, remove other keywords, use other white spaces, insert comments randomly, ... // 3) irrecoverable corrupt file SkNativeParsedPDF::SkNativeParsedPDF(const char* path) : fAllocator(new SkPdfAllocator()) { + gDoc = this; FILE* file = fopen(path, "r"); fContentLength = getFileSize(path); - fFileContent = new unsigned char[fContentLength]; + fFileContent = new unsigned char[fContentLength + 1]; fread(fFileContent, fContentLength, 1, file); + fFileContent[fContentLength] = '\0'; fclose(file); file = NULL; @@ -355,73 +357,6 @@ SkPdfString* SkNativeParsedPDF::createString(unsigned char* sz, size_t len) cons return (SkPdfString*)obj; } -PdfContext* gPdfContext = NULL; - -void SkNativeParsedPDF::drawPage(int page, SkCanvas* canvas) { - SkPdfNativeTokenizer* tokenizer = tokenizerOfPage(page); - - PdfContext pdfContext(this); - pdfContext.fOriginalMatrix = SkMatrix::I(); - pdfContext.fGraphicsState.fResources = pageResources(page); - - gPdfContext = &pdfContext; - - // TODO(edisonn): get matrix stuff right. - // TODO(edisonn): add DPI/scale/zoom. - SkScalar z = SkIntToScalar(0); - SkRect rect = MediaBox(page); - SkScalar w = rect.width(); - SkScalar h = rect.height(); - - SkPoint pdfSpace[4] = {SkPoint::Make(z, z), SkPoint::Make(w, z), SkPoint::Make(w, h), SkPoint::Make(z, h)}; -// SkPoint skiaSpace[4] = {SkPoint::Make(z, h), SkPoint::Make(w, h), SkPoint::Make(w, z), SkPoint::Make(z, z)}; - - // TODO(edisonn): add flag for this app to create sourunding buffer zone - // TODO(edisonn): add flagg for no clipping. - // Use larger image to make sure we do not draw anything outside of page - // could be used in tests. - -#ifdef PDF_DEBUG_3X - SkPoint skiaSpace[4] = {SkPoint::Make(w+z, h+h), SkPoint::Make(w+w, h+h), SkPoint::Make(w+w, h+z), SkPoint::Make(w+z, h+z)}; -#else - SkPoint skiaSpace[4] = {SkPoint::Make(z, h), SkPoint::Make(w, h), SkPoint::Make(w, z), SkPoint::Make(z, z)}; -#endif - //SkPoint pdfSpace[2] = {SkPoint::Make(z, z), SkPoint::Make(w, h)}; - //SkPoint skiaSpace[2] = {SkPoint::Make(w, z), SkPoint::Make(z, h)}; - - //SkPoint pdfSpace[2] = {SkPoint::Make(z, z), SkPoint::Make(z, h)}; - //SkPoint skiaSpace[2] = {SkPoint::Make(z, h), SkPoint::Make(z, z)}; - - //SkPoint pdfSpace[3] = {SkPoint::Make(z, z), SkPoint::Make(z, h), SkPoint::Make(w, h)}; - //SkPoint skiaSpace[3] = {SkPoint::Make(z, h), SkPoint::Make(z, z), SkPoint::Make(w, 0)}; - - SkAssertResult(pdfContext.fOriginalMatrix.setPolyToPoly(pdfSpace, skiaSpace, 4)); - SkTraceMatrix(pdfContext.fOriginalMatrix, "Original matrix"); - - - pdfContext.fGraphicsState.fMatrix = pdfContext.fOriginalMatrix; - pdfContext.fGraphicsState.fMatrixTm = pdfContext.fGraphicsState.fMatrix; - pdfContext.fGraphicsState.fMatrixTlm = pdfContext.fGraphicsState.fMatrix; - - canvas->setMatrix(pdfContext.fOriginalMatrix); - -#ifndef PDF_DEBUG_NO_PAGE_CLIPING - canvas->clipRect(SkRect::MakeXYWH(z, z, w, h), SkRegion::kIntersect_Op, true); -#endif - -// erase with red before? -// SkPaint paint; -// paint.setColor(SK_ColorRED); -// canvas->drawRect(rect, paint); - - PdfMainLooper looper(NULL, tokenizer, &pdfContext, canvas); - looper.loop(); - - delete tokenizer; - - canvas->flush(); -} - SkPdfAllocator* SkNativeParsedPDF::allocator() const { return fAllocator; } diff --git a/experimental/PdfViewer/pdfparser/native/SkPdfNativeTokenizer.cpp b/experimental/PdfViewer/pdfparser/native/SkPdfNativeTokenizer.cpp index 53987fa383..fc3e0b94ed 100644 --- a/experimental/PdfViewer/pdfparser/native/SkPdfNativeTokenizer.cpp +++ b/experimental/PdfViewer/pdfparser/native/SkPdfNativeTokenizer.cpp @@ -656,8 +656,14 @@ SkPdfAllocator::~SkPdfAllocator() { free(fHandles[i]); } for (int i = 0 ; i < fHistory.count(); i++) { + for (int j = 0 ; j < BUFFER_SIZE; j++) { + fHistory[i][j].reset(); + } delete[] fHistory[i]; } + for (int j = 0 ; j < BUFFER_SIZE; j++) { + fCurrent[j].reset(); + } delete[] fCurrent; } @@ -667,7 +673,6 @@ SkPdfObject* SkPdfAllocator::allocObject() { fCurrent = allocBlock(); fCurrentUsed = 0; } - fCurrentUsed++; return &fCurrent[fCurrentUsed - 1]; } @@ -677,26 +682,28 @@ SkPdfNativeTokenizer::SkPdfNativeTokenizer(SkPdfObject* objWithStream, const SkP unsigned char* buffer = NULL; size_t len = 0; objWithStream->GetFilteredStreamRef(&buffer, &len, fAllocator); + // TODO(edisonn): hack, find end of object + char* endobj = strstr((char*)buffer, "endobj"); + if (endobj) { + len = endobj - (char*)buffer + strlen("endobj"); + } fUncompressedStreamStart = fUncompressedStream = (unsigned char*)fAllocator->alloc(len); fUncompressedStreamEnd = fUncompressedStream + len; - memcpy(fUncompressedStream, buffer, len);} + memcpy(fUncompressedStream, buffer, len); +} SkPdfNativeTokenizer::SkPdfNativeTokenizer(unsigned char* buffer, int len, const SkPdfMapper* mapper, SkPdfAllocator* allocator) : fMapper(mapper), fAllocator(allocator), fEmpty(false), fHasPutBack(false) { + // TODO(edisonn): hack, find end of object + char* endobj = strstr((char*)buffer, "endobj"); + if (endobj) { + len = endobj - (char*)buffer + strlen("endobj"); + } fUncompressedStreamStart = fUncompressedStream = (unsigned char*)fAllocator->alloc(len); fUncompressedStreamEnd = fUncompressedStream + len; memcpy(fUncompressedStream, buffer, len); } SkPdfNativeTokenizer::~SkPdfNativeTokenizer() { - // free the unparsed stream, we don't need it. - // the parsed one is locked as it contains the strings and keywords referenced in objects - if (fUncompressedStream) { - void* dummy = realloc(fUncompressedStreamStart, fUncompressedStream - fUncompressedStreamStart); - //SkASSERT(dummy == fUncompressedStreamStart); - fUncompressedStreamStart = (unsigned char*)dummy; // suppress compiler warning - } else { - SkASSERT(false); - } } bool SkPdfNativeTokenizer::readTokenCore(PdfToken* token) { @@ -726,7 +733,7 @@ bool SkPdfNativeTokenizer::readTokenCore(PdfToken* token) { #ifdef PDF_TRACE static int read_op = 0; read_op++; - if (182749 == read_op) { + if (548 == read_op) { printf("break;\n"); } printf("%i READ %s %s\n", read_op, token->fType == kKeyword_TokenType ? "Keyword" : "Object", token->fKeyword ? std::string(token->fKeyword, token->fKeywordLength).c_str() : token->fObject->toString().c_str()); @@ -763,3 +770,4 @@ bool SkPdfNativeTokenizer::readToken(PdfToken* token) { return readTokenCore(token); } + diff --git a/experimental/PdfViewer/pdfparser/native/SkPdfObject.h b/experimental/PdfViewer/pdfparser/native/SkPdfObject.h index 86963b0398..a215501056 100644 --- a/experimental/PdfViewer/pdfparser/native/SkPdfObject.h +++ b/experimental/PdfViewer/pdfparser/native/SkPdfObject.h @@ -86,7 +86,7 @@ private: public: - SkPdfObject() : fObjectType(kInvalid_PdfObjectType), fData(NULL) {} + SkPdfObject() : fObjectType(kInvalid_PdfObjectType), fMap(NULL), fData(NULL) {} inline void* data() { return fData; @@ -96,9 +96,9 @@ public: fData = data; } - ~SkPdfObject() { - reset(); - } +// ~SkPdfObject() { +// //reset(); must be called manually! +// } void reset() { switch (fObjectType) { |