| Index: experimental/PdfViewer/SkPdfRenderer.cpp | 
| =================================================================== | 
| --- experimental/PdfViewer/SkPdfRenderer.cpp	(revision 10423) | 
| +++ experimental/PdfViewer/SkPdfRenderer.cpp	(working copy) | 
| @@ -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,16 +2285,14 @@ | 
|  | 
| 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; | 
| } | 
|  |