pdfviewer: when q start, and an operator is called, it should not be able to see operands before q. nest/unnest are similar with pop/push - simulates a stack of stacks, in a single stack

Review URL: https://codereview.chromium.org/23033022

git-svn-id: http://skia.googlecode.com/svn/trunk@10873 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/experimental/PdfViewer/SkPdfRenderer.cpp b/experimental/PdfViewer/SkPdfRenderer.cpp
index e7be1d8..21e4287 100644
--- a/experimental/PdfViewer/SkPdfRenderer.cpp
+++ b/experimental/PdfViewer/SkPdfRenderer.cpp
@@ -1085,13 +1085,25 @@
     // it is not possible to see under the previous q?
     pdfContext->fStateStack.push(pdfContext->fGraphicsState);
     canvas->save();
+    pdfContext->fObjectStack.nest();
     return kOK_SkPdfResult;
 }
 
 SkPdfResult PdfOp_Q(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** looper) {
-    pdfContext->fGraphicsState = pdfContext->fStateStack.top();
-    pdfContext->fStateStack.pop();
-    canvas->restore();
+    if (pdfContext->fStateStack.count() > 0) {
+        pdfContext->fGraphicsState = pdfContext->fStateStack.top();
+        pdfContext->fStateStack.pop();
+        canvas->restore();
+
+        if (pdfContext->fObjectStack.nests() <= 0) {
+            return kIgnoreError_SkPdfResult;
+        } else {
+            pdfContext->fObjectStack.unnest();
+        }
+    } else {
+        return kIgnoreError_SkPdfResult;
+    }
+
     return kOK_SkPdfResult;
 }
 
@@ -2775,6 +2787,10 @@
     SkScalar w = dst.width();
     SkScalar h = dst.height();
 
+    if (SkScalarTruncToInt(w) <= 0 || SkScalarTruncToInt(h) <= 0) {
+        return true;
+    }
+
     SkScalar wp = fPdfDoc->MediaBox(page).width();
     SkScalar hp = fPdfDoc->MediaBox(page).height();