Put clear and discard into GrBatch.

Review URL: https://codereview.chromium.org/1293563003
diff --git a/src/core/SkStringUtils.cpp b/src/core/SkStringUtils.cpp
index 390de7f..35e5557 100644
--- a/src/core/SkStringUtils.cpp
+++ b/src/core/SkStringUtils.cpp
@@ -35,3 +35,29 @@
     }
 }
 
+SkString SkTabString(const SkString& string, int tabCnt) {
+    if (tabCnt <= 0) {
+        return string;
+    }
+    SkString tabs;
+    for (int i = 0; i < tabCnt; ++i) {
+        tabs.append("\t");
+    }
+    SkString result;
+    static const char newline[] = "\n";
+    const char* input = string.c_str();
+    int nextNL = SkStrFind(input, newline);
+    while (nextNL >= 0) {
+        if (nextNL > 0) {
+            result.append(tabs);
+        }
+        result.append(input, nextNL + 1);
+        input += nextNL + 1;
+        nextNL = SkStrFind(input, newline);
+    }
+    if (*input != '\0') {
+        result.append(tabs);
+    }
+    result.append(input);
+    return result;
+}
diff --git a/src/core/SkStringUtils.h b/src/core/SkStringUtils.h
index 2839ac2..fd158c3 100644
--- a/src/core/SkStringUtils.h
+++ b/src/core/SkStringUtils.h
@@ -35,4 +35,7 @@
     SkAppendScalar(str, value, kHex_SkScalarAsStringType);
 }
 
+/** Indents every non-empty line of the string by tabCnt tabs */
+SkString SkTabString(const SkString& string, int tabCnt);
+
 #endif