Move SkTypeface::CreateXXX to SkTypeface::MakeXXX.

Skia is moving to returning smart pointers from its factory methods.
This updates uses of SkTypeface::CreateXXX to SkTypeface::MakeXXX and
generally updates use of SkTypeface to sk_sp. This will allow for the
removal of the SK_SUPPORT_LEGACY_TYPEFACE_PTR define.

Change-Id: I017ceb681d2c338e6913aa267915d03a7d3a898b
diff --git a/core/jni/android/graphics/FontFamily.cpp b/core/jni/android/graphics/FontFamily.cpp
index 6fa1ca7..2088421 100644
--- a/core/jni/android/graphics/FontFamily.cpp
+++ b/core/jni/android/graphics/FontFamily.cpp
@@ -53,9 +53,10 @@
     fontFamily->Unref();
 }
 
-static jboolean addSkTypeface(minikin::FontFamily* family, SkTypeface* face, const void* fontData,
-        size_t fontSize, int ttcIndex) {
-    minikin::MinikinFont* minikinFont = new MinikinFontSkia(face, fontData, fontSize, ttcIndex);
+static jboolean addSkTypeface(minikin::FontFamily* family, sk_sp<SkTypeface> face,
+        const void* fontData, size_t fontSize, int ttcIndex) {
+    minikin::MinikinFont* minikinFont =
+            new MinikinFontSkia(std::move(face), fontData, fontSize, ttcIndex);
     bool result = family->addFont(minikinFont);
     minikinFont->Unref();
     return result;
@@ -106,13 +107,13 @@
     params.setCollectionIndex(ttcIndex);
 
     SkAutoTUnref<SkFontMgr> fm(SkFontMgr::RefDefault());
-    SkTypeface* face = fm->createFromStream(fontData.release(), params);
+    sk_sp<SkTypeface> face(fm->createFromStream(fontData.release(), params));
     if (face == NULL) {
         ALOGE("addFont failed to create font");
         return false;
     }
     minikin::FontFamily* fontFamily = reinterpret_cast<minikin::FontFamily*>(familyPtr);
-    return addSkTypeface(fontFamily, face, fontPtr, (size_t)fontSize, ttcIndex);
+    return addSkTypeface(fontFamily, std::move(face), fontPtr, (size_t)fontSize, ttcIndex);
 }
 
 static struct {
@@ -172,14 +173,14 @@
     params.setAxes(skiaAxes.get(), skiaAxesLength);
 
     SkAutoTUnref<SkFontMgr> fm(SkFontMgr::RefDefault());
-    SkTypeface* face = fm->createFromStream(fontData.release(), params);
+    sk_sp<SkTypeface> face(fm->createFromStream(fontData.release(), params));
     if (face == NULL) {
         ALOGE("addFont failed to create font, invalid request");
         return false;
     }
     minikin::FontFamily* fontFamily = reinterpret_cast<minikin::FontFamily*>(familyPtr);
     minikin::MinikinFont* minikinFont =
-            new MinikinFontSkia(face, fontPtr, (size_t)fontSize, ttcIndex);
+            new MinikinFontSkia(std::move(face), fontPtr, (size_t)fontSize, ttcIndex);
     fontFamily->addFont(minikinFont, minikin::FontStyle(weight / 100, isItalic));
     minikinFont->Unref();
     return true;
@@ -216,13 +217,13 @@
     std::unique_ptr<SkStreamAsset> fontData(new SkMemoryStream(std::move(data)));
 
     SkAutoTUnref<SkFontMgr> fm(SkFontMgr::RefDefault());
-    SkTypeface* face = fm->createFromStream(fontData.release(), SkFontMgr::FontParameters());
+    sk_sp<SkTypeface> face(fm->createFromStream(fontData.release(), SkFontMgr::FontParameters()));
     if (face == NULL) {
         ALOGE("addFontFromAsset failed to create font %s", str.c_str());
         return false;
     }
     minikin::FontFamily* fontFamily = reinterpret_cast<minikin::FontFamily*>(familyPtr);
-    return addSkTypeface(fontFamily, face, buf, bufSize, /* ttcIndex */ 0);
+    return addSkTypeface(fontFamily, std::move(face), buf, bufSize, /* ttcIndex */ 0);
 }
 
 ///////////////////////////////////////////////////////////////////////////////
diff --git a/core/jni/android/graphics/Paint.cpp b/core/jni/android/graphics/Paint.cpp
index 67c94fb..9be659e 100644
--- a/core/jni/android/graphics/Paint.cpp
+++ b/core/jni/android/graphics/Paint.cpp
@@ -31,7 +31,6 @@
 #include "SkPath.h"
 #include "SkRasterizer.h"
 #include "SkShader.h"
-#include "SkTypeface.h"
 #include "SkXfermode.h"
 #include "unicode/uloc.h"
 #include "unicode/ushape.h"
diff --git a/libs/hwui/hwui/MinikinSkia.cpp b/libs/hwui/hwui/MinikinSkia.cpp
index d16b6441..a52abfc 100644
--- a/libs/hwui/hwui/MinikinSkia.cpp
+++ b/libs/hwui/hwui/MinikinSkia.cpp
@@ -22,16 +22,12 @@
 
 namespace android {
 
-MinikinFontSkia::MinikinFontSkia(SkTypeface* typeface, const void* fontData, size_t fontSize,
+MinikinFontSkia::MinikinFontSkia(sk_sp<SkTypeface> typeface, const void* fontData, size_t fontSize,
         int ttcIndex) :
-    minikin::MinikinFont(typeface->uniqueID()), mTypeface(typeface), mFontData(fontData),
+    minikin::MinikinFont(typeface->uniqueID()), mTypeface(std::move(typeface)), mFontData(fontData),
     mFontSize(fontSize), mTtcIndex(ttcIndex) {
 }
 
-MinikinFontSkia::~MinikinFontSkia() {
-    SkSafeUnref(mTypeface);
-}
-
 static void MinikinFontSkia_SetSkiaPaint(const minikin::MinikinFont* font, SkPaint* skPaint,
         const minikin::MinikinPaint& paint) {
     skPaint->setTextEncoding(SkPaint::kGlyphID_TextEncoding);
@@ -87,6 +83,10 @@
 }
 
 SkTypeface *MinikinFontSkia::GetSkTypeface() const {
+    return mTypeface.get();
+}
+
+sk_sp<SkTypeface> MinikinFontSkia::RefSkTypeface() const {
     return mTypeface;
 }
 
@@ -121,7 +121,7 @@
 
 void MinikinFontSkia::populateSkPaint(SkPaint* paint, const MinikinFont* font,
         minikin::FontFakery fakery) {
-    paint->setTypeface(reinterpret_cast<const MinikinFontSkia*>(font)->GetSkTypeface());
+    paint->setTypeface(reinterpret_cast<const MinikinFontSkia*>(font)->RefSkTypeface());
     paint->setFakeBoldText(paint->isFakeBoldText() || fakery.isFakeBold());
     if (fakery.isFakeItalic()) {
         paint->setTextSkewX(paint->getTextSkewX() - 0.25f);
diff --git a/libs/hwui/hwui/MinikinSkia.h b/libs/hwui/hwui/MinikinSkia.h
index 96b256d..1ea99fd 100644
--- a/libs/hwui/hwui/MinikinSkia.h
+++ b/libs/hwui/hwui/MinikinSkia.h
@@ -19,6 +19,7 @@
 
 #include <cutils/compiler.h>
 #include <minikin/MinikinFont.h>
+#include <SkRefCnt.h>
 
 class SkPaint;
 class SkTypeface;
@@ -27,12 +28,9 @@
 
 class ANDROID_API MinikinFontSkia : public minikin::MinikinFont {
 public:
-    // Note: this takes ownership of the reference (will unref on dtor)
-    explicit MinikinFontSkia(SkTypeface *typeface, const void* fontData, size_t fontSize,
+    explicit MinikinFontSkia(sk_sp<SkTypeface> typeface, const void* fontData, size_t fontSize,
         int ttcIndex);
 
-    ~MinikinFontSkia();
-
     float GetHorizontalAdvance(uint32_t glyph_id,
         const minikin::MinikinPaint &paint) const;
 
@@ -42,6 +40,7 @@
     const void* GetTable(uint32_t tag, size_t* size, minikin::MinikinDestroyFunc* destroy);
 
     SkTypeface* GetSkTypeface() const;
+    sk_sp<SkTypeface> RefSkTypeface() const;
 
     // Access to underlying raw font bytes
     const void* GetFontData() const;
@@ -55,7 +54,7 @@
     static void populateSkPaint(SkPaint* paint, const minikin::MinikinFont* font,
             minikin::FontFakery fakery);
 private:
-    SkTypeface* mTypeface;
+    sk_sp<SkTypeface> mTypeface;
 
     // A raw pointer to the font data - it should be owned by some other object with
     // lifetime at least as long as this object.
diff --git a/libs/hwui/hwui/Typeface.cpp b/libs/hwui/hwui/Typeface.cpp
index b5c5ef9..18c35b3 100644
--- a/libs/hwui/hwui/Typeface.cpp
+++ b/libs/hwui/hwui/Typeface.cpp
@@ -64,12 +64,12 @@
     for (size_t i = 0; i < sizeof(fns)/sizeof(fns[0]); i++) {
         const char *fn = fns[i];
         ALOGD("makeFontCollection adding %s", fn);
-        SkTypeface *skFace = SkTypeface::CreateFromFile(fn);
+        sk_sp<SkTypeface> skFace = SkTypeface::MakeFromFile(fn);
         if (skFace != NULL) {
             // TODO: might be a nice optimization to get access to the underlying font
             // data, but would require us opening the file ourselves and passing that
             // to the appropriate Create method of SkTypeface.
-            minikin::MinikinFont *font = new MinikinFontSkia(skFace, NULL, 0, 0);
+            minikin::MinikinFont *font = new MinikinFontSkia(std::move(skFace), NULL, 0, 0);
             family->addFont(font);
             font->Unref();
         } else {