Reland "Implement onMakeClone(const SkFontArguments& args) in class SkTypeface_fontconfig."

This reverts commit cce82d2b7c6ce3addd72016191e1be73bc084953.

Reason for revert: Just add suppression.

Original change's description:
> Revert "Implement onMakeClone(const SkFontArguments& args) in class SkTypeface_fontconfig."
>
> This reverts commit 96b1ecc25d00a3d52dcc51a788b0df0acdd1dad9.
>
> Reason for revert: Breaking Google3, I think
>
> Original change's description:
> > Implement onMakeClone(const SkFontArguments& args) in class SkTypeface_fontconfig.
> >
> > Create FontMgrFontConfigTest.cpp file to test the above function.
> >
> > Change-Id: I7716355f702af3d6f25574305914f0b82a4147ce
> > Reviewed-on: https://skia-review.googlesource.com/137133
> > Reviewed-by: Ben Wagner <bungeman@google.com>
> > Commit-Queue: Ben Wagner <bungeman@google.com>
>
> TBR=bungeman@google.com,herb@google.com,brucewang@google.com
>
> Change-Id: I665de46d379f1b533358f0be644814aa4bfffb33
> No-Presubmit: true
> No-Tree-Checks: true
> No-Try: true
> Reviewed-on: https://skia-review.googlesource.com/137240
> Reviewed-by: Kevin Lubick <kjlubick@google.com>
> Commit-Queue: Kevin Lubick <kjlubick@google.com>

TBR=bungeman@google.com,herb@google.com,kjlubick@google.com,brucewang@google.com

Change-Id: I41f0e4505ed0579a77a56212898e9a6caf6f1ed5
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Reviewed-on: https://skia-review.googlesource.com/137260
Commit-Queue: Ben Wagner <bungeman@google.com>
Reviewed-by: Ben Wagner <bungeman@google.com>
diff --git a/BUILD.gn b/BUILD.gn
index f3f170e..97cbf73 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -1390,6 +1390,9 @@
     if (!fontmgr_android_enabled) {
       sources -= [ "//tests/FontMgrAndroidParserTest.cpp" ]
     }
+    if (!(skia_use_freetype && skia_use_fontconfig)) {
+      sources -= [ "//tests/FontMgrFontConfigTest.cpp" ]
+    }
     deps = [
       ":experimental_svg_model",
       ":flags",
diff --git a/gn/tests.gni b/gn/tests.gni
index 32c3337..2068ae5 100644
--- a/gn/tests.gni
+++ b/gn/tests.gni
@@ -77,6 +77,7 @@
   "$_tests/FontHostStreamTest.cpp",
   "$_tests/FontHostTest.cpp",
   "$_tests/FontMgrAndroidParserTest.cpp",
+  "$_tests/FontMgrFontConfigTest.cpp",
   "$_tests/FontMgrTest.cpp",
   "$_tests/FontNamesTest.cpp",
   "$_tests/FontObjTest.cpp",
diff --git a/public.bzl b/public.bzl
index e8fbf61..b99c60c 100644
--- a/public.bzl
+++ b/public.bzl
@@ -496,6 +496,7 @@
     exclude = [
         "gm/cgms.cpp",
         "tests/FontMgrAndroidParserTest.cpp",  # Android-only.
+        "tests/FontMgrFontConfigTest.cpp",  # FontConfig-only.
         "tests/skia_test.cpp",  # Old main.
         "tools/gpu/atlastext/*",
         "tools/gpu/gl/angle/*",
diff --git a/src/ports/SkFontMgr_fontconfig.cpp b/src/ports/SkFontMgr_fontconfig.cpp
index 3589ae8..e5aed18 100644
--- a/src/ports/SkFontMgr_fontconfig.cpp
+++ b/src/ports/SkFontMgr_fontconfig.cpp
@@ -525,6 +525,21 @@
         return info;
     }
 
+    sk_sp<SkTypeface> onMakeClone(const SkFontArguments& args) const override {
+        std::unique_ptr<SkFontData> data = this->cloneFontData(args);
+        if (!data) {
+            return nullptr;
+        }
+
+        SkString fFamilyName;
+        this->getFamilyName(&fFamilyName);
+
+        return sk_make_sp<SkTypeface_stream>(std::move(data),
+                                             fFamilyName,
+                                             this->fontStyle(),
+                                             this->isFixedPitch());
+    }
+
     ~SkTypeface_fontconfig() override {
         // Hold the lock while unrefing the pattern.
         FCLocker lock;
diff --git a/tests/FontMgrFontConfigTest.cpp b/tests/FontMgrFontConfigTest.cpp
new file mode 100644
index 0000000..0ecca63
--- /dev/null
+++ b/tests/FontMgrFontConfigTest.cpp
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2014 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include <fontconfig/fontconfig.h>
+#include "Resources.h"
+#include "SkCanvas.h"
+#include "SkFontMgr.h"
+#include "SkFontMgr_fontconfig.h"
+#include "SkTypeface.h"
+#include "Test.h"
+
+static bool bitmap_compare(const SkBitmap& ref, const SkBitmap& test) {
+    for (int y = 0; y < test.height(); ++y) {
+        for (int x = 0; x < test.width(); ++x) {
+            SkColor testColor = test.getColor(x, y);
+            SkColor refColor = ref.getColor(x, y);
+            if (refColor != testColor) {
+                return false;
+            }
+        }
+    }
+    return true;
+}
+
+DEF_TEST(FontMgrFontConfig, reporter) {
+    FcConfig* config = FcConfigCreate();
+    SkString distortablePath = GetResourcePath("fonts/Distortable.ttf");
+    FcConfigAppFontAddFile(
+        config, reinterpret_cast<const FcChar8*>(distortablePath.c_str()));
+    FcConfigBuildFonts(config);
+
+    sk_sp<SkFontMgr> fontMgr(SkFontMgr_New_FontConfig(config));
+    sk_sp<SkTypeface> typeface(fontMgr->legacyMakeTypeface("Distortable", SkFontStyle()));
+
+    SkBitmap bitmapStream;
+    bitmapStream.allocN32Pixels(64, 64);
+    SkCanvas canvasStream(bitmapStream);
+    canvasStream.drawColor(SK_ColorWHITE);
+
+    SkBitmap bitmapClone;
+    bitmapClone.allocN32Pixels(64, 64);
+    SkCanvas canvasClone(bitmapClone);
+    canvasStream.drawColor(SK_ColorWHITE);
+
+    SkPaint paintStream;
+    paintStream.setColor(SK_ColorGRAY);
+    paintStream.setTextSize(SkIntToScalar(20));
+    paintStream.setAntiAlias(true);
+    paintStream.setLCDRenderText(true);
+
+    SkPaint paintClone;
+    paintClone.setColor(SK_ColorGRAY);
+    paintClone.setTextSize(SkIntToScalar(20));
+    paintClone.setAntiAlias(true);
+    paintClone.setLCDRenderText(true);
+
+    std::unique_ptr<SkStreamAsset> distortableStream(
+        GetResourceAsStream("fonts/Distortable.ttf"));
+    if (!distortableStream) {
+        return;
+    }
+
+    const char* text = "abc";
+    const size_t textLen = strlen(text);
+    SkPoint point = SkPoint::Make(20.0f, 20.0f);
+    SkFourByteTag tag = SkSetFourByteTag('w', 'g', 'h', 't');
+
+    for (int i = 0; i < 10; ++i) {
+        SkScalar styleValue =
+            SkDoubleToScalar(0.5 + i * ((2.0 - 0.5) / 10));
+        SkFontArguments::VariationPosition::Coordinate
+            coordinates[] = {{tag, styleValue}};
+        SkFontArguments::VariationPosition
+            position = {coordinates, SK_ARRAY_COUNT(coordinates)};
+
+        paintStream.setTypeface(sk_sp<SkTypeface>(
+            fontMgr->makeFromStream(distortableStream->duplicate(),
+                                    SkFontArguments().setVariationDesignPosition(position))));
+        paintClone.setTypeface(sk_sp<SkTypeface>(
+            typeface->makeClone(SkFontArguments().setVariationDesignPosition(position))));
+
+        canvasStream.drawColor(SK_ColorWHITE);
+        canvasStream.drawText(text, textLen, point.fX, point.fY, paintStream);
+
+        canvasClone.drawColor(SK_ColorWHITE);
+        canvasClone.drawText(text, textLen, point.fX, point.fY, paintClone);
+
+        bool success = bitmap_compare(bitmapStream, bitmapClone);
+        REPORTER_ASSERT(reporter, success);
+    }
+}
\ No newline at end of file