aboutsummaryrefslogtreecommitdiffhomepage
path: root/experimental/PdfViewer/pdfparser
diff options
context:
space:
mode:
authorGravatar edisonn@google.com <edisonn@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-07-10 22:33:10 +0000
committerGravatar edisonn@google.com <edisonn@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-07-10 22:33:10 +0000
commit222382b30a176db9d9044d9df1ae14e0fbe27181 (patch)
tree1637df5492b89c338b6e3666d993572a5487c7bf /experimental/PdfViewer/pdfparser
parent5857e0350d6c3b5e312e1ec9f220aef0fdba06a5 (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')
-rw-r--r--experimental/PdfViewer/pdfparser/native/SkNativeParsedPDF.cpp73
-rw-r--r--experimental/PdfViewer/pdfparser/native/SkPdfNativeTokenizer.cpp32
-rw-r--r--experimental/PdfViewer/pdfparser/native/SkPdfObject.h8
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) {