Move resource fonts to common location.

Move resource fonts to resources/fonts, add a destortable font for
testing, and clean up how the tests create fonts from resources.

R=joshualitt@google.com

Review URL: https://codereview.chromium.org/1120823002
diff --git a/bench/TextBench.cpp b/bench/TextBench.cpp
index 39484a2..4ee0fd3 100644
--- a/bench/TextBench.cpp
+++ b/bench/TextBench.cpp
@@ -66,13 +66,7 @@
 
         if (doColorEmoji) {
             SkASSERT(kBW == fFQ);
-            SkString filename = GetResourcePath("/Funkster.ttf");
-            SkAutoTDelete<SkFILEStream> stream(new SkFILEStream(filename.c_str()));
-            if (stream->isValid()) {
-                fColorEmojiTypeface.reset(SkTypeface::CreateFromStream(stream.detach()));
-            } else {
-                SkDebugf("Could not find Funkster.ttf, please set --resourcePath correctly.\n");
-            }
+            fColorEmojiTypeface.reset(GetResourceAsTypeface("/fonts/Funkster.ttf"));
         }
 
         if (doPos) {
diff --git a/gm/coloremoji.cpp b/gm/coloremoji.cpp
index 5a2703b..36897c5 100644
--- a/gm/coloremoji.cpp
+++ b/gm/coloremoji.cpp
@@ -54,15 +54,8 @@
         const char* text;
     } emojiFonts[2];
     virtual void onOnceBeforeDraw() override {
-        SkString filename = GetResourcePath("/Funkster.ttf");
-        SkAutoTDelete<SkFILEStream> stream(new SkFILEStream(filename.c_str()));
-        if (stream->isValid()) {
-            fCBDT_CBLC_Typeface.reset(SkTypeface::CreateFromStream(stream.detach()));
-            emojiFonts[0].typeface = fCBDT_CBLC_Typeface;
-        } else {
-            SkDebugf("Could not find Funkster.ttf, please set --resourcePath correctly.\n");
-            emojiFonts[0].typeface = NULL;
-        }
+        fCBDT_CBLC_Typeface.reset(GetResourceAsTypeface("/fonts/Funkster.ttf"));
+        emojiFonts[0].typeface = fCBDT_CBLC_Typeface;
         emojiFonts[0].text = "hamburgerfons";
 
         fSBIX_Typeface.reset(SkTypeface::CreateFromName("Apple Color Emoji", SkTypeface::kNormal));
diff --git a/gm/dcshader.cpp b/gm/dcshader.cpp
index 8120ff8..6cfd00e 100644
--- a/gm/dcshader.cpp
+++ b/gm/dcshader.cpp
@@ -219,14 +219,7 @@
         struct BmpText : public Text {
            void setFont(SkPaint* paint) override {
                if (!fTypeface) {
-                    SkString filename = GetResourcePath("/Funkster.ttf");
-                    SkAutoTDelete<SkFILEStream> stream(new SkFILEStream(filename.c_str()));
-                    if (!stream->isValid()) {
-                        SkDebugf("Could not find Funkster.ttf, please set --resourcePath "
-                                 "correctly.\n");
-                        return;
-                    }
-                    fTypeface.reset(SkTypeface::CreateFromStream(stream.detach()));
+                    fTypeface.reset(GetResourceAsTypeface("/fonts/Funkster.ttf"));
                }
                paint->setTypeface(fTypeface);
             }
diff --git a/gm/dftext.cpp b/gm/dftext.cpp
index 314ee71..63e7cdf 100755
--- a/gm/dftext.cpp
+++ b/gm/dftext.cpp
@@ -24,14 +24,7 @@
 
 protected:
     void onOnceBeforeDraw() override {
-        SkString filename = GetResourcePath("/Funkster.ttf");
-        SkAutoTDelete<SkFILEStream> stream(new SkFILEStream(filename.c_str()));
-        if (!stream->isValid()) {
-            SkDebugf("Could not find Funkster.ttf, please set --resourcePath correctly.\n");
-            return;
-        }
-
-        fTypeface = SkTypeface::CreateFromStream(stream.detach());
+        fTypeface = GetResourceAsTypeface("/fonts/Funkster.ttf");
     }
 
     SkString onShortName() override {
diff --git a/gm/mixedtextblobs.cpp b/gm/mixedtextblobs.cpp
index 20b91ac..fb1b632 100644
--- a/gm/mixedtextblobs.cpp
+++ b/gm/mixedtextblobs.cpp
@@ -39,29 +39,15 @@
 
 protected:
     void onOnceBeforeDraw() override {
-        SkAutoTDelete<SkFILEStream> stream;
-        SkString filename;
 #ifndef SK_BUILD_FOR_MAC
-        filename = GetResourcePath("/Funkster.ttf");
-        stream.reset(new SkFILEStream(filename.c_str()));
-        if (stream->isValid()) {
-            fEmojiTypeface.reset(SkTypeface::CreateFromStream(stream.detach()));
-        } else {
-            SkDebugf("Could not find Funkster.ttf, please set --resourcePath correctly.\n");
-        }
+        fEmojiTypeface.reset(GetResourceAsTypeface("/fonts/Funkster.ttf"));
         fEmojiText = "Emoji!!!";
 #else
         fEmojiTypeface.reset(SkTypeface::CreateFromName("Apple Color Emoji", SkTypeface::kNormal));
         fEmojiText = "\xF0\x9F\x92\xB0" "\xF0\x9F\x8F\xA1" "\xF0\x9F\x8E\x85" // 💰🏡🎅
                      "\xF0\x9F\x8D\xAA" "\xF0\x9F\x8D\x95" "\xF0\x9F\x9A\x80"; // 🍪🍕🚀
 #endif
-
-        filename = GetResourcePath("/ReallyBigA.ttf");
-
-        stream.reset(new SkFILEStream(filename.c_str()));
-        if (stream->isValid()) {
-            fReallyBigATypeface.reset(SkTypeface::CreateFromStream(stream.detach()));
-        }
+        fReallyBigATypeface.reset(GetResourceAsTypeface("/fonts/ReallyBigA.ttf"));
 
         SkTextBlobBuilder builder;
 
diff --git a/gyp/ports.gyp b/gyp/ports.gyp
index 48fe89f..7968793 100644
--- a/gyp/ports.gyp
+++ b/gyp/ports.gyp
@@ -78,7 +78,7 @@
               'variables': {
                 'embedded_font_data_identifier': 'sk_fonts',
                 'fonts_to_include': [
-                  '../resources/Funkster.ttf',
+                  '../resources/fonts/Funkster.ttf',
                 ],
               },
               'sources': [
diff --git a/resources/fonts/Distortable.ttf b/resources/fonts/Distortable.ttf
new file mode 100644
index 0000000..95f30c3
--- /dev/null
+++ b/resources/fonts/Distortable.ttf
Binary files differ
diff --git a/resources/Funkster.ttf b/resources/fonts/Funkster.ttf
similarity index 100%
rename from resources/Funkster.ttf
rename to resources/fonts/Funkster.ttf
Binary files differ
diff --git a/resources/ReallyBigA.ttf b/resources/fonts/ReallyBigA.ttf
similarity index 100%
rename from resources/ReallyBigA.ttf
rename to resources/fonts/ReallyBigA.ttf
Binary files differ
diff --git a/resources/test.ttc b/resources/fonts/test.ttc
similarity index 100%
rename from resources/test.ttc
rename to resources/fonts/test.ttc
Binary files differ
diff --git a/tests/FontHostTest.cpp b/tests/FontHostTest.cpp
index 249fe7b..ff275e2 100644
--- a/tests/FontHostTest.cpp
+++ b/tests/FontHostTest.cpp
@@ -111,8 +111,7 @@
     }
 }
 
-static void test_fontstream(skiatest::Reporter* reporter,
-                            SkStream* stream, int ttcIndex) {
+static void test_fontstream(skiatest::Reporter* reporter, SkStream* stream, int ttcIndex) {
     int n = SkFontStream::GetTableTags(stream, ttcIndex, NULL);
     SkAutoTArray<SkFontTableTag> array(n);
 
@@ -138,7 +137,13 @@
     }
 }
 
-static void test_fontstream(skiatest::Reporter* reporter, SkStream* stream) {
+static void test_fontstream(skiatest::Reporter* reporter) {
+    SkAutoTDelete<SkStreamAsset> stream(GetResourceAsStream("/fonts/test.ttc"));
+    if (!stream) {
+        SkDebugf("Skipping FontHostTest::test_fontstream\n");
+        return;
+    }
+
     int count = SkFontStream::CountTTCEntries(stream);
 #ifdef DUMP_TTC_TABLES
     SkDebugf("CountTTCEntries %d\n", count);
@@ -148,23 +153,6 @@
     }
 }
 
-static void test_fontstream(skiatest::Reporter* reporter) {
-    // This test cannot run if there is no resource path.
-    SkString resourcePath = GetResourcePath();
-    if (resourcePath.isEmpty()) {
-        SkDebugf("Could not run fontstream test because resourcePath not specified.");
-        return;
-    }
-    SkString filename = SkOSPath::Join(resourcePath.c_str(), "test.ttc");
-
-    SkFILEStream stream(filename.c_str());
-    if (stream.isValid()) {
-        test_fontstream(reporter, &stream);
-    } else {
-        SkDebugf("Could not run fontstream test because test.ttc not found.");
-    }
-}
-
 static void test_tables(skiatest::Reporter* reporter, SkTypeface* face) {
     if (false) { // avoid bit rot, suppress warning
         SkFontID fontID = face->uniqueID();
diff --git a/tests/SerializationTest.cpp b/tests/SerializationTest.cpp
index f6a8a7d..f7e2983 100644
--- a/tests/SerializationTest.cpp
+++ b/tests/SerializationTest.cpp
@@ -317,14 +317,8 @@
 }
 
 static void TestPictureTypefaceSerialization(skiatest::Reporter* reporter) {
-    // Load typeface form file.
-    // This test cannot run if there is no resource path.
-    SkString resourcePath = GetResourcePath();
-    if (resourcePath.isEmpty()) {
-        SkDebugf("Could not run fontstream test because resourcePath not specified.");
-        return;
-    }
-    SkString filename = SkOSPath::Join(resourcePath.c_str(), "test.ttc");
+    // Load typeface form file to test CreateFromFile with index.
+    SkString filename = GetResourcePath("/fonts/test.ttc");
     SkTypeface* typeface = SkTypeface::CreateFromFile(filename.c_str(), 1);
     if (!typeface) {
         SkDebugf("Could not run fontstream test because test.ttc not found.");
diff --git a/tools/Resources.cpp b/tools/Resources.cpp
index 43cc21d..4767edd 100644
--- a/tools/Resources.cpp
+++ b/tools/Resources.cpp
@@ -11,6 +11,8 @@
 #include "SkData.h"
 #include "SkImageGenerator.h"
 #include "SkOSFile.h"
+#include "SkStream.h"
+#include "SkTypeface.h"
 
 DEFINE_string2(resourcePath, i, "resources", "Directory with test resources: images, fonts, etc.");
 
@@ -24,7 +26,29 @@
 
 bool GetResourceAsBitmap(const char* resource, SkBitmap* dst) {
     SkString resourcePath = GetResourcePath(resource);
-    SkAutoTUnref<SkData> resourceData(
-            SkData::NewFromFileName(resourcePath.c_str()));
+    SkAutoTUnref<SkData> resourceData(SkData::NewFromFileName(resourcePath.c_str()));
     return resourceData && SkInstallDiscardablePixelRef(resourceData, dst);
 }
+
+SkStreamAsset* GetResourceAsStream(const char* resource) {
+    SkString resourcePath = GetResourcePath(resource);
+    SkAutoTDelete<SkFILEStream> stream(new SkFILEStream(resourcePath.c_str()));
+    if (stream->isValid()) {
+        return stream.detach();
+    } else {
+        SkDebugf("Resource %s not found.\n", resource);
+        return NULL;
+    }
+}
+
+SkTypeface* GetResourceAsTypeface(const char* resource) {
+    SkAutoTDelete<SkStreamAsset> stream(GetResourceAsStream(resource));
+    if (!stream) {
+        return NULL;
+    }
+    SkAutoTUnref<SkTypeface> typeface(SkTypeface::CreateFromStream(stream.detach()));
+    if (!typeface) {
+        SkDebugf("Resource %s not a valid font.", resource);
+    }
+    return typeface.detach();
+}
diff --git a/tools/Resources.h b/tools/Resources.h
index 99de77a..c9785a5 100644
--- a/tools/Resources.h
+++ b/tools/Resources.h
@@ -11,10 +11,14 @@
 #include "SkString.h"
 
 class SkBitmap;
+class SkStreamAsset;
+class SkTypeface;
 
 SkString GetResourcePath(const char* resource = "");
 void SetResourcePath(const char* );
 
 bool GetResourceAsBitmap(const char* resource, SkBitmap* dst);
+SkStreamAsset* GetResourceAsStream(const char* resource);
+SkTypeface* GetResourceAsTypeface(const char* resource);
 
 #endif  // Resources_DEFINED