pdfviewer: load files with missing xref (we need in order to help with testing, as most good pdfx in the whild miss the xref). add period as a valid character to start a real value.

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

git-svn-id: http://skia.googlecode.com/svn/trunk@10423 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/experimental/PdfViewer/SkPdfRenderer.cpp b/experimental/PdfViewer/SkPdfRenderer.cpp
index e2805c7..b18167c 100644
--- a/experimental/PdfViewer/SkPdfRenderer.cpp
+++ b/experimental/PdfViewer/SkPdfRenderer.cpp
@@ -615,6 +615,7 @@
 
     SkRect dst = SkRect::MakeXYWH(SkDoubleToScalar(0.0), SkDoubleToScalar(0.0), SkDoubleToScalar(1.0), SkDoubleToScalar(1.0));
 
+    // TODO(edisonn): soft mask type? alpha/luminosity.
     if (sMask.empty()) {
         canvas->drawBitmapRect(image, dst, NULL);
     } else {
@@ -622,6 +623,7 @@
         canvas->drawBitmapRect(image, dst, NULL);
         SkPaint xfer;
         pdfContext->fGraphicsState.applyGraphicsState(&xfer, false);
+        // TODO(edisonn): is the blend mode specified already implicitly/explicitly in pdf?
         xfer.setXfermodeMode(SkXfermode::kSrcOut_Mode); // SkXfermode::kSdtOut_Mode
         canvas->drawBitmapRect(sMask, dst, &xfer);
         canvas->restore();
@@ -632,15 +634,15 @@
     return kPartial_PdfResult;
 }
 
-
-
-
 static PdfResult doXObject_Form(PdfContext* pdfContext, SkCanvas* canvas, SkPdfType1FormDictionary* skobj) {
     if (!skobj || !skobj->hasStream()) {
         return kIgnoreError_PdfResult;
     }
 
     PdfOp_q(pdfContext, canvas, NULL);
+
+
+
     canvas->save();
 
 
@@ -841,7 +843,12 @@
 }
 
 static PdfResult PdfOp_Td(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** looper) {
+#ifdef PDF_TRACE
+    printf("stack size = %i\n", (int)pdfContext->fObjectStack.size());
+#endif
     double ty = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fObjectStack.pop();
+    SkPdfObject* obj = pdfContext->fObjectStack.top();
+    obj = obj;
     double tx = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fObjectStack.pop();
 
     double array[6] = {1, 0, 0, 1, tx, ty};
@@ -1665,8 +1672,7 @@
 void skpdfGraphicsStateApplySMask_dict(PdfContext* pdfContext, SkPdfDictionary* sMask) {
     // TODO(edisonn): verify input
     if (pdfContext->fPdfDoc->mapper()->mapSoftMaskDictionary(sMask)) {
-        //SkPdfSoftMaskDictionary* smd = (SkPdfSoftMaskDictionary*)sMask;
-        // TODO(edisonn): load soft mask
+        pdfContext->fGraphicsState.fSoftMaskDictionary = (SkPdfSoftMaskDictionary*)sMask;
     } else if (pdfContext->fPdfDoc->mapper()->mapSoftMaskImageDictionary(sMask)) {
         SkPdfSoftMaskImageDictionary* smid = (SkPdfSoftMaskImageDictionary*)sMask;
         pdfContext->fGraphicsState.fSMask = getImageFromObject(pdfContext, smid, true);
@@ -1676,6 +1682,12 @@
 }
 
 void skpdfGraphicsStateApplySMask_name(PdfContext* pdfContext, const std::string& sMask) {
+    if (sMask == "None") {
+        pdfContext->fGraphicsState.fSoftMaskDictionary = NULL;
+        pdfContext->fGraphicsState.fSMask = SkBitmap();
+        return;
+    }
+
     //Next, get the ExtGState Dictionary from the Resource Dictionary:
     SkPdfDictionary* extGStateDictionary = pdfContext->fGraphicsState.fResources->ExtGState(pdfContext->fPdfDoc);
 
@@ -1692,6 +1704,10 @@
         // TODO (edisonn): report error/warning
         return;
     }
+
+    pdfContext->fGraphicsState.fSoftMaskDictionary = NULL;
+    pdfContext->fGraphicsState.fSMask = SkBitmap();
+
     skpdfGraphicsStateApplySMask_dict(pdfContext, obj->asDictionary());
 }
 
@@ -2051,22 +2067,18 @@
 }
 
 PdfResult PdfMainLooper::consumeToken(PdfToken& token) {
-    char keyword[256];
-
     if (token.fType == kKeyword_TokenType && token.fKeywordLength < 256)
     {
-        strncpy(keyword, token.fKeyword, token.fKeywordLength);
-        keyword[token.fKeywordLength] = '\0';
         // TODO(edisonn): log trace flag (verbose, error, info, warning, ...)
         PdfOperatorRenderer pdfOperatorRenderer = NULL;
-        if (gPdfOps.find(keyword, &pdfOperatorRenderer) && pdfOperatorRenderer) {
+        if (gPdfOps.find(token.fKeyword, token.fKeywordLength, &pdfOperatorRenderer) && pdfOperatorRenderer) {
             // caller, main work is done by pdfOperatorRenderer(...)
             PdfTokenLooper* childLooper = NULL;
             PdfResult result = pdfOperatorRenderer(fPdfContext, fCanvas, &childLooper);
 
             int cnt = 0;
-            gRenderStats[result].find(keyword, &cnt);
-            gRenderStats[result].set(keyword, cnt + 1);
+            gRenderStats[result].find(token.fKeyword, token.fKeywordLength, &cnt);
+            gRenderStats[result].set(token.fKeyword, token.fKeywordLength, cnt + 1);
 
             if (childLooper) {
                 childLooper->setUp(this);
@@ -2075,8 +2087,8 @@
             }
         } else {
             int cnt = 0;
-            gRenderStats[kUnsupported_PdfResult].find(keyword, &cnt);
-            gRenderStats[kUnsupported_PdfResult].set(keyword, cnt + 1);
+            gRenderStats[kUnsupported_PdfResult].find(token.fKeyword, token.fKeywordLength, &cnt);
+            gRenderStats[kUnsupported_PdfResult].set(token.fKeyword, token.fKeywordLength, cnt + 1);
         }
     }
     else if (token.fType == kObject_TokenType)