aboutsummaryrefslogtreecommitdiffhomepage
path: root/experimental
diff options
context:
space:
mode:
authorGravatar edisonn@google.com <edisonn@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-07-30 13:34:10 +0000
committerGravatar edisonn@google.com <edisonn@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-07-30 13:34:10 +0000
commit88fc03dd1f47ad33b08d60c47013de860f8fa69f (patch)
tree65b94874a6812c4ca5ad916dd291f96acd471d30 /experimental
parent38bad32cf5297ec6908620fd174cd08c937d331a (diff)
pdfviewer: add doPage function, cet stream from Contents
Review URL: https://codereview.chromium.org/21049009 git-svn-id: http://skia.googlecode.com/svn/trunk@10433 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'experimental')
-rw-r--r--experimental/PdfViewer/SkPdfRenderer.cpp67
-rw-r--r--experimental/PdfViewer/pdfparser/native/SkNativeParsedPDF.cpp9
-rw-r--r--experimental/PdfViewer/pdfparser/native/SkNativeParsedPDF.h1
3 files changed, 63 insertions, 14 deletions
diff --git a/experimental/PdfViewer/SkPdfRenderer.cpp b/experimental/PdfViewer/SkPdfRenderer.cpp
index b18167ce9f..eb3695d781 100644
--- a/experimental/PdfViewer/SkPdfRenderer.cpp
+++ b/experimental/PdfViewer/SkPdfRenderer.cpp
@@ -784,6 +784,57 @@ static PdfResult doXObject(PdfContext* pdfContext, SkCanvas* canvas, const SkPdf
}
}
+static PdfResult doPage(PdfContext* pdfContext, SkCanvas* canvas, SkPdfPageObjectDictionary* skobj) {
+ if (!skobj) {
+ return kIgnoreError_PdfResult;
+ }
+
+ if (!skobj->isContentsAStream(pdfContext->fPdfDoc)) {
+ return kNYI_PdfResult;
+ }
+
+ SkPdfStream* stream = skobj->getContentsAsStream(pdfContext->fPdfDoc);
+
+ if (!stream) {
+ return kIgnoreError_PdfResult;
+ }
+
+ if (CheckRecursiveRendering::IsInRendering(skobj)) {
+ // Oops, corrupt PDF!
+ return kIgnoreError_PdfResult;
+ }
+ CheckRecursiveRendering checkRecursion(skobj);
+
+
+ PdfOp_q(pdfContext, canvas, NULL);
+
+ canvas->save();
+
+ if (skobj->Resources(pdfContext->fPdfDoc)) {
+ pdfContext->fGraphicsState.fResources = skobj->Resources(pdfContext->fPdfDoc);
+ }
+
+ // TODO(edisonn): refactor common path with doXObject()
+ // This is a group?
+ if (skobj->has_Group()) {
+ //TransparencyGroupDictionary* ...
+ }
+
+ SkPdfNativeTokenizer* tokenizer =
+ pdfContext->fPdfDoc->tokenizerOfStream(stream, pdfContext->fTmpPageAllocator);
+ if (tokenizer != NULL) {
+ PdfMainLooper looper(NULL, tokenizer, pdfContext, canvas);
+ looper.loop();
+ delete tokenizer;
+ }
+
+ // TODO(edisonn): should we restore the variable stack at the same state?
+ // There could be operands left, that could be consumed by a parent tokenizer when we pop.
+ canvas->restore();
+ PdfOp_Q(pdfContext, canvas, NULL);
+ return kPartial_PdfResult;
+}
+
PdfResult PdfOp_q(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** looper) {
pdfContext->fStateStack.push(pdfContext->fGraphicsState);
canvas->save();
@@ -2185,12 +2236,6 @@ bool SkPdfRenderer::renderPage(int page, SkCanvas* canvas, const SkRect& dst) co
PdfContext pdfContext(fPdfDoc);
- SkPdfNativeTokenizer* tokenizer = fPdfDoc->tokenizerOfPage(page, pdfContext.fTmpPageAllocator);
- if (!tokenizer) {
- // TODO(edisonn): report/warning/debug
- return false;
- }
-
pdfContext.fOriginalMatrix = SkMatrix::I();
pdfContext.fGraphicsState.fResources = fPdfDoc->pageResources(page);
@@ -2240,15 +2285,13 @@ bool SkPdfRenderer::renderPage(int page, SkCanvas* canvas, const SkRect& dst) co
canvas->setMatrix(pdfContext.fOriginalMatrix);
-// erase with red before?
+ doPage(&pdfContext, canvas, fPdfDoc->page(page));
+
+ // TODO(edisonn:) erase with white before draw?
// SkPaint paint;
-// paint.setColor(SK_ColorRED);
+// paint.setColor(SK_ColorWHITE);
// canvas->drawRect(rect, paint);
- PdfMainLooper looper(NULL, tokenizer, &pdfContext, canvas);
- looper.loop();
-
- delete tokenizer;
canvas->flush();
return true;
diff --git a/experimental/PdfViewer/pdfparser/native/SkNativeParsedPDF.cpp b/experimental/PdfViewer/pdfparser/native/SkNativeParsedPDF.cpp
index 9e89b84424..3273182269 100644
--- a/experimental/PdfViewer/pdfparser/native/SkNativeParsedPDF.cpp
+++ b/experimental/PdfViewer/pdfparser/native/SkNativeParsedPDF.cpp
@@ -403,7 +403,14 @@ int SkNativeParsedPDF::pages() const {
return fPages.count();
}
+SkPdfPageObjectDictionary* SkNativeParsedPDF::page(int page) {
+ SkASSERT(page >= 0 && page < fPages.count());
+ return fPages[page];
+}
+
+
SkPdfResourceDictionary* SkNativeParsedPDF::pageResources(int page) {
+ SkASSERT(page >= 0 && page < fPages.count());
return fPages[page]->Resources(this);
}
@@ -502,8 +509,6 @@ SkPdfObject* SkNativeParsedPDF::resolveReference(const SkPdfObject* ref) {
// TODO(edisonn): generation/updates not supported now
//int gen = ref->referenceGeneration();
- SkASSERT(!(id < 0 || id > fObjects.count()));
-
// TODO(edisonn): verify id and gen expected
if (id < 0 || id >= fObjects.count()) {
// TODO(edisonn): report error/warning
diff --git a/experimental/PdfViewer/pdfparser/native/SkNativeParsedPDF.h b/experimental/PdfViewer/pdfparser/native/SkNativeParsedPDF.h
index 77a98c7d04..d073f00a30 100644
--- a/experimental/PdfViewer/pdfparser/native/SkNativeParsedPDF.h
+++ b/experimental/PdfViewer/pdfparser/native/SkNativeParsedPDF.h
@@ -54,6 +54,7 @@ public:
size_t objects() const;
SkPdfObject* object(int i);
+ SkPdfPageObjectDictionary* page(int page);
const SkPdfMapper* mapper() const;
SkPdfAllocator* allocator() const;