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
diff --git a/experimental/PdfViewer/SkPdfRenderer.cpp b/experimental/PdfViewer/SkPdfRenderer.cpp
index b18167c..eb3695d 100644
--- a/experimental/PdfViewer/SkPdfRenderer.cpp
+++ b/experimental/PdfViewer/SkPdfRenderer.cpp
@@ -784,6 +784,57 @@
}
}
+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 @@
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 @@
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;