SkPDF: Fix skia:8397, reduce RAM use, stop copying ClipStacks.

In particular:
  - GraphicStateEntry no longer holds copy of SkClipStack.
  - ContentEntries are now usually concatinated together and include
    serialized GraphicStateEntry deltas.
  - One GraphicStackState is kept on the pdfdevice, for the currently
    active ContentEntry.

16% reduction in RAM use for running all GMs through SkPDF.

97% reduction in RAM use for a particular test case:
    SkRandom rand;
    SkPaint paint;
    for (int i = 400000; i-- > 0;) {
        SkPoint p0 = {0,   (float)rand.nextRangeU(0, 792)};
        SkPoint p1 = {612, (float)rand.nextRangeU(0, 792)};
        canvas->drawLine(p0, p1, paint);
    }

Bug: skia:8397
Change-Id: Ieb86c0eabac45b120a97fe5c749fdb26d8a85267
Reviewed-on: https://skia-review.googlesource.com/157340
Reviewed-by: Ben Wagner <bungeman@google.com>
Commit-Queue: Hal Canary <halcanary@google.com>
diff --git a/src/pdf/SkPDFGraphicState.cpp b/src/pdf/SkPDFGraphicState.cpp
index 65979b5..ade2b50 100644
--- a/src/pdf/SkPDFGraphicState.cpp
+++ b/src/pdf/SkPDFGraphicState.cpp
@@ -15,27 +15,9 @@
 #include "SkTo.h"
 
 static const char* as_pdf_blend_mode_name(SkBlendMode mode) {
-    // PDF32000.book section 11.3.5 "Blend Mode"
-    switch (mode) {
-        case SkBlendMode::kScreen:      return "Screen";
-        case SkBlendMode::kOverlay:     return "Overlay";
-        case SkBlendMode::kDarken:      return "Darken";
-        case SkBlendMode::kLighten:     return "Lighten";
-        case SkBlendMode::kColorDodge:  return "ColorDodge";
-        case SkBlendMode::kColorBurn:   return "ColorBurn";
-        case SkBlendMode::kHardLight:   return "HardLight";
-        case SkBlendMode::kSoftLight:   return "SoftLight";
-        case SkBlendMode::kDifference:  return "Difference";
-        case SkBlendMode::kExclusion:   return "Exclusion";
-        case SkBlendMode::kMultiply:    return "Multiply";
-        case SkBlendMode::kHue:         return "Hue";
-        case SkBlendMode::kSaturation:  return "Saturation";
-        case SkBlendMode::kColor:       return "Color";
-        case SkBlendMode::kLuminosity:  return "Luminosity";
-        // Other blendmodes are either unsupported or handled in
-        // SkPDFDevice::setUpContentEntry.
-        default:                        return "Normal";
-    }
+    const char* name = SkPDFUtils::BlendModeName(mode);
+    SkASSERT(name);
+    return name;
 }
 
 static int to_stroke_cap(uint8_t cap) {
@@ -61,27 +43,13 @@
 // If a SkXfermode is unsupported in PDF, this function returns
 // SrcOver, otherwise, it returns that Xfermode as a Mode.
 static uint8_t pdf_blend_mode(SkBlendMode mode) {
-    switch (mode) {
-        case SkBlendMode::kSrcOver:
-        case SkBlendMode::kMultiply:
-        case SkBlendMode::kScreen:
-        case SkBlendMode::kOverlay:
-        case SkBlendMode::kDarken:
-        case SkBlendMode::kLighten:
-        case SkBlendMode::kColorDodge:
-        case SkBlendMode::kColorBurn:
-        case SkBlendMode::kHardLight:
-        case SkBlendMode::kSoftLight:
-        case SkBlendMode::kDifference:
-        case SkBlendMode::kExclusion:
-        case SkBlendMode::kHue:
-        case SkBlendMode::kSaturation:
-        case SkBlendMode::kColor:
-        case SkBlendMode::kLuminosity:
-            return SkToU8((unsigned)mode);
-        default:
-            return SkToU8((unsigned)SkBlendMode::kSrcOver);
+    if (!SkPDFUtils::BlendModeName(mode)
+        || SkBlendMode::kXor  == mode
+        || SkBlendMode::kPlus == mode)
+    {
+        mode = SkBlendMode::kSrcOver;
     }
+    return SkToU8((unsigned)mode);
 }
 
 sk_sp<SkPDFDict> SkPDFGraphicState::GetGraphicStateForPaint(SkPDFCanon* canon,