Implement SkTypeface_FreeType::onMakeClone which overrides SkTypeface::onMakeClone.

Overrides of onMakeClone are implemented in:
src/ports/SkFontConfigTypeface.h
src/ports/SkFontMgr_android.cpp
src/ports/SkFontMgr_fontconfig.cpp

Change-Id: I557082ecd105742a899c66b8de7101d5045ebf73
Reviewed-on: https://skia-review.googlesource.com/135324
Commit-Queue: Bruce Wang <brucewang@google.com>
Reviewed-by: Ben Wagner <bungeman@google.com>
diff --git a/src/ports/SkFontConfigTypeface.h b/src/ports/SkFontConfigTypeface.h
index e27fbb3..603d77f 100644
--- a/src/ports/SkFontConfigTypeface.h
+++ b/src/ports/SkFontConfigTypeface.h
@@ -38,6 +38,17 @@
         return fIdentity;
     }
 
+    sk_sp<SkTypeface> onMakeClone(const SkFontArguments& args) const override {
+        std::unique_ptr<SkFontData> data = this->cloneFontData(args);
+        if (!data) {
+            return nullptr;
+        }
+        return sk_sp<SkTypeface>(new SkTypeface_FCI(std::move(data),
+                                                    fFamilyName,
+                                                    this->fontStyle(),
+                                                    this->isFixedPitch()));
+    }
+
 protected:
     SkTypeface_FCI(sk_sp<SkFontConfigInterface> fci,
                    const SkFontConfigInterface::FontIdentity& fi,
diff --git a/src/ports/SkFontHost_FreeType.cpp b/src/ports/SkFontHost_FreeType.cpp
index c3cedf1..b8ce203 100644
--- a/src/ports/SkFontHost_FreeType.cpp
+++ b/src/ports/SkFontHost_FreeType.cpp
@@ -649,6 +649,25 @@
     return c.release();
 }
 
+std::unique_ptr<SkFontData> SkTypeface_FreeType::cloneFontData(
+                                                            const SkFontArguments& args) const {
+    SkString name;
+    AutoFTAccess fta(this);
+    FT_Face face = fta.face();
+    Scanner::AxisDefinitions axisDefinitions;
+
+    if (!Scanner::GetAxes(face, &axisDefinitions)) {
+        return nullptr;
+    }
+    SkAutoSTMalloc<4, SkFixed> axisValues(axisDefinitions.count());
+    Scanner::computeAxisValues(axisDefinitions, args.getVariationDesignPosition(),
+                               axisValues, name);
+    int ttcIndex;
+    auto stream = std::unique_ptr<SkStreamAsset>(this->openStream(&ttcIndex));
+    return skstd::make_unique<SkFontData>(std::move(stream), ttcIndex, axisValues.get(),
+                                          axisDefinitions.count());
+}
+
 void SkTypeface_FreeType::onFilterRec(SkScalerContextRec* rec) const {
     //BOGUS: http://code.google.com/p/chromium/issues/detail?id=121119
     //Cap the requested size as larger sizes give bogus values.
@@ -1775,6 +1794,12 @@
         *isFixedPitch = FT_IS_FIXED_WIDTH(face);
     }
 
+    bool success = GetAxes(face, axes);
+    FT_Done_Face(face);
+    return success;
+}
+
+bool SkTypeface_FreeType::Scanner::GetAxes(FT_Face face, AxisDefinitions* axes) {
     if (axes && face->face_flags & FT_FACE_FLAG_MULTIPLE_MASTERS) {
         FT_MM_Var* variations = nullptr;
         FT_Error err = FT_Get_MM_Var(face, &variations);
@@ -1794,8 +1819,6 @@
             (*axes)[i].fMaximum = ftAxis.maximum;
         }
     }
-
-    FT_Done_Face(face);
     return true;
 }
 
diff --git a/src/ports/SkFontHost_FreeType_common.h b/src/ports/SkFontHost_FreeType_common.h
index eacce04..1386775 100644
--- a/src/ports/SkFontHost_FreeType_common.h
+++ b/src/ports/SkFontHost_FreeType_common.h
@@ -76,6 +76,7 @@
             const SkFontArguments::VariationPosition position,
             SkFixed* axisValues,
             const SkString& name);
+        static bool GetAxes(FT_Face face, AxisDefinitions* axes);
 
     private:
         FT_Face openFace(SkStreamAsset* stream, int ttcIndex, FT_Stream ftStream) const;
@@ -88,6 +89,7 @@
         : INHERITED(style, isFixedPitch)
     {}
 
+    std::unique_ptr<SkFontData> cloneFontData(const SkFontArguments&) const;
     virtual SkScalerContext* onCreateScalerContext(const SkScalerContextEffects&,
                                                    const SkDescriptor*) const override;
     void onFilterRec(SkScalerContextRec*) const override;
diff --git a/src/ports/SkFontMgr_android.cpp b/src/ports/SkFontMgr_android.cpp
index 0e12ce2..5194e1f 100644
--- a/src/ports/SkFontMgr_android.cpp
+++ b/src/ports/SkFontMgr_android.cpp
@@ -136,6 +136,17 @@
         return skstd::make_unique<SkFontData>(*fData);
     }
 
+    sk_sp<SkTypeface> onMakeClone(const SkFontArguments& args) const override {
+        std::unique_ptr<SkFontData> data = this->cloneFontData(args);
+        if (!data) {
+            return nullptr;
+        }
+        return sk_make_sp<SkTypeface_AndroidStream>(std::move(data),
+                                                    this->fontStyle(),
+                                                    this->isFixedPitch(),
+                                                    fFamilyName);
+    }
+
 private:
     const std::unique_ptr<const SkFontData> fData;
     typedef SkTypeface_Android INHERITED;
diff --git a/src/ports/SkFontMgr_fontconfig.cpp b/src/ports/SkFontMgr_fontconfig.cpp
index f1c2bad..3589ae8 100644
--- a/src/ports/SkFontMgr_fontconfig.cpp
+++ b/src/ports/SkFontMgr_fontconfig.cpp
@@ -444,6 +444,17 @@
         return skstd::make_unique<SkFontData>(*fData);
     }
 
+    sk_sp<SkTypeface> onMakeClone(const SkFontArguments& args) const override {
+        std::unique_ptr<SkFontData> data = this->cloneFontData(args);
+        if (!data) {
+            return nullptr;
+        }
+        return sk_make_sp<SkTypeface_stream>(std::move(data),
+                                             fFamilyName,
+                                             this->fontStyle(),
+                                             this->isFixedPitch());
+    }
+
 private:
     SkString fFamilyName;
     const std::unique_ptr<const SkFontData> fData;