Strip font name of special characters before dumping

The font name can contain special characters in some OS that is
considered as delimiters ('/') by the traces. This causes error in the
dump name. This CL strips the fone name obtained before adding it to
traces.

This also adds discardable memory size for resources in cache.

BUG=532838

Review URL: https://codereview.chromium.org/1346993006
diff --git a/src/core/SkGlyphCache.cpp b/src/core/SkGlyphCache.cpp
index 3f64d6e..ed158d3 100644
--- a/src/core/SkGlyphCache.cpp
+++ b/src/core/SkGlyphCache.cpp
@@ -14,6 +14,8 @@
 #include "SkTraceMemoryDump.h"
 #include "SkTypeface.h"
 
+#include <cctype>
+
 //#define SPEW_PURGE_STATUS
 
 namespace {
@@ -427,12 +429,19 @@
     *counter += 1;
 
     const SkTypeface* face = cache.getScalerContext()->getTypeface();
-    SkString fontName;
-    face->getFamilyName(&fontName);
     const SkScalerContextRec& rec = cache.getScalerContext()->getRec();
 
-    SkString dumpName = SkStringPrintf("%s/%s_%3d/index_%d",
-                                        gGlyphCacheDumpName, fontName.c_str(), rec.fFontID, index);
+    SkString fontName;
+    face->getFamilyName(&fontName);
+    // Replace all special characters with '_'.
+    for (size_t index = 0; index < fontName.size(); ++index) {
+        if (!std::isalnum(fontName[index])) {
+            fontName[index] = '_';
+        }
+    }
+
+    SkString dumpName = SkStringPrintf("%s/%s_%d/index_%d",
+                                       gGlyphCacheDumpName, fontName.c_str(), rec.fFontID, index);
 
     dump->dumpNumericValue(dumpName.c_str(), "size", "bytes", cache.getMemoryUsed());
     dump->dumpNumericValue(dumpName.c_str(), "glyph_count", "objects", cache.countCachedGlyphs());
diff --git a/src/core/SkResourceCache.cpp b/src/core/SkResourceCache.cpp
index a1234e1..240d197 100644
--- a/src/core/SkResourceCache.cpp
+++ b/src/core/SkResourceCache.cpp
@@ -679,6 +679,10 @@
     SkDiscardableMemory* discardable = rec.diagnostic_only_getDiscardable();
     if (discardable) {
         dump->setDiscardableMemoryBacking(dumpName.c_str(), *discardable);
+
+        // The discardable memory size will be calculated by dumper, but we also dump what we think
+        // the size of object in memory is irrespective of whether object is live or dead.
+        dump->dumpNumericValue(dumpName.c_str(), "discardable_size", "bytes", rec.bytesUsed());
     } else {
         dump->dumpNumericValue(dumpName.c_str(), "size", "bytes", rec.bytesUsed());
         dump->setMemoryBacking(dumpName.c_str(), "malloc", nullptr);