SkPDF: debugging flag - SK_PDF_BASE85_BINARY

If this is defined at compile time, binary date embedded in PDFs are
encoded n base85 to make them more inspectable.  This is only useful to
anyone hacking on SkPDF.

If the flag is unset, there is no change from this CL.

Change-Id: Ib07dc7ef7cedbff17a5fde0ffbeccd24dbeb6a8e
Reviewed-on: https://skia-review.googlesource.com/c/179250
Reviewed-by: Hal Canary <halcanary@google.com>
Commit-Queue: Hal Canary <halcanary@google.com>
diff --git a/src/pdf/SkPDFUtils.cpp b/src/pdf/SkPDFUtils.cpp
index 56e646e..252d698 100644
--- a/src/pdf/SkPDFUtils.cpp
+++ b/src/pdf/SkPDFUtils.cpp
@@ -335,3 +335,54 @@
     }
     return false;
 }
+
+#ifdef SK_PDF_BASE85_BINARY
+static void base85_fourbytes(uint32_t v, char dst[5]) {
+    for (int n = 4; n > 0; --n) {
+        dst[n] = (v % 85) + '!';
+        v /= 85;
+    }
+    dst[0] = v + '!';
+}
+
+static uint32_t big_end(const uint8_t s[4]) {
+    return ((uint32_t)s[0] << 24) | ((uint32_t)s[1] << 16) | ((uint32_t)s[2] << 8) | s[3];
+}
+
+void SkPDFUtils::Base85Encode(SkDynamicMemoryWStream* dst) {
+    SkASSERT(dst);
+    std::unique_ptr<SkStreamAsset> stream = dst->detachAsStream();
+    SkASSERT(src);
+    size_t remaining = stream->getLength();
+    dst->writeText("\n");
+    int line = 0;
+    while (remaining > 3) {
+        uint8_t src[4];
+        (void)stream->read(src, 4);
+        remaining -= 4;
+        uint32_t v = big_end(src);
+        if (v != 0) {
+            char buffer[5];
+            base85_fourbytes(v, buffer);
+            dst->write(buffer, 5);
+            line += 5;
+        } else {
+            dst->writeText("z");
+            line += 1;
+        }
+        if (line > 74) {
+            dst->writeText("\n");
+            line = 0;
+        }
+    }
+    if (remaining > 0) {
+        SkASSERT(remaining < 4);
+        uint8_t src[4] = {0, 0, 0, 0};
+        (void)stream->read(src, remaining);
+        char buffer[5];
+        base85_fourbytes(big_end(src), buffer);
+        dst->write(buffer, remaining + 1);
+    }
+    dst->writeText("~>\n");
+}
+#endif //  SK_PDF_BASE85_BINARY