Expose raw typeface metadata buffer.

This allows callers to access metadata without initializing MinikinFont,
which is expensive.

Bug: 188201287
Test: atest minikin_tests
Change-Id: Ice7572c88e6f10ace72fc2b5312626d2858db07a
diff --git a/include/minikin/Font.h b/include/minikin/Font.h
index cfd8478..67feecf 100644
--- a/include/minikin/Font.h
+++ b/include/minikin/Font.h
@@ -17,7 +17,6 @@
 #ifndef MINIKIN_FONT_H
 #define MINIKIN_FONT_H
 
-#include <functional>
 #include <memory>
 #include <mutex>
 #include <unordered_set>
@@ -112,18 +111,20 @@
     };
 
     // Type for functions to load MinikinFont lazily.
-    using TypefaceLoader = std::function<std::shared_ptr<MinikinFont>()>;
-    // Type for functions to read MinikinFont metadata and construct
+    using TypefaceLoader = std::shared_ptr<MinikinFont>(BufferReader reader);
+    // Type for functions to read MinikinFont metadata and return
     // TypefaceLoader.
-    using TypefaceReader = TypefaceLoader(BufferReader* reader);
+    using TypefaceReader = TypefaceLoader*(BufferReader* reader);
     // Type for functions to write MinikinFont metadata.
     using TypefaceWriter = void(BufferWriter* writer, const MinikinFont* typeface);
 
     template <TypefaceReader typefaceReader>
     static std::shared_ptr<Font> readFrom(BufferReader* reader, uint32_t localeListId) {
         FontStyle style = FontStyle(reader);
-        TypefaceLoader typefaceLoader = typefaceReader(reader);
-        return std::shared_ptr<Font>(new Font(style, std::move(typefaceLoader), localeListId));
+        BufferReader typefaceMetadataReader = *reader;
+        TypefaceLoader* typefaceLoader = typefaceReader(reader);
+        return std::shared_ptr<Font>(
+                new Font(style, typefaceMetadataReader, typefaceLoader, localeListId));
     }
 
     template <TypefaceWriter typefaceWriter>
@@ -138,6 +139,7 @@
     const std::shared_ptr<MinikinFont>& typeface() const;
     inline FontStyle style() const { return mStyle; }
     const HbFontUniquePtr& baseFont() const;
+    BufferReader typefaceMetadataReader() const { return mTypefaceMetadataReader; }
 
     std::unordered_set<AxisTag> getSupportedAxes() const;
 
@@ -148,10 +150,14 @@
             : mTypeface(std::move(typeface)),
               mStyle(style),
               mBaseFont(std::move(baseFont)),
+              mTypefaceLoader(nullptr),
+              mTypefaceMetadataReader(nullptr),
               mLocaleListId(localeListId) {}
-    Font(FontStyle style, TypefaceLoader&& typefaceLoader, uint32_t localeListId)
+    Font(FontStyle style, BufferReader typefaceMetadataReader, TypefaceLoader* typefaceLoader,
+         uint32_t localeListId)
             : mStyle(style),
-              mTypefaceLoader(std::move(typefaceLoader)),
+              mTypefaceLoader(typefaceLoader),
+              mTypefaceMetadataReader(typefaceMetadataReader),
               mLocaleListId(localeListId) {}
 
     void initTypefaceLocked() const EXCLUSIVE_LOCKS_REQUIRED(mTypefaceMutex);
@@ -166,8 +172,10 @@
     mutable HbFontUniquePtr mBaseFont GUARDED_BY(mTypefaceMutex);
 
     mutable std::mutex mTypefaceMutex;
-    // Non-empty if created by readFrom().
-    TypefaceLoader mTypefaceLoader;
+    // Non-null if created by readFrom().
+    TypefaceLoader* mTypefaceLoader;
+    // Non-null if created by readFrom().
+    BufferReader mTypefaceMetadataReader;
 
     uint32_t mLocaleListId;
 
diff --git a/libs/minikin/Font.cpp b/libs/minikin/Font.cpp
index ba42b2c..c2e74b7 100644
--- a/libs/minikin/Font.cpp
+++ b/libs/minikin/Font.cpp
@@ -69,7 +69,7 @@
 void Font::initTypefaceLocked() const {
     if (mTypeface) return;
     MINIKIN_ASSERT(mTypefaceLoader, "mTypefaceLoader should not be empty when mTypeface is null");
-    mTypeface = mTypefaceLoader();
+    mTypeface = mTypefaceLoader(mTypefaceMetadataReader);
 }
 
 // static
diff --git a/tests/util/FreeTypeMinikinFontForTest.cpp b/tests/util/FreeTypeMinikinFontForTest.cpp
index bed6b4e..1be466a 100644
--- a/tests/util/FreeTypeMinikinFontForTest.cpp
+++ b/tests/util/FreeTypeMinikinFontForTest.cpp
@@ -116,9 +116,14 @@
     writer->writeString(typeface->GetFontPath());
 }
 
-Font::TypefaceLoader readFreeTypeMinikinFontForTest(BufferReader* reader) {
-    std::string fontPath(reader->readString());
-    return [fontPath]() { return std::make_shared<FreeTypeMinikinFontForTest>(fontPath); };
+std::shared_ptr<MinikinFont> loadFreeTypeMinikinFontForTest(BufferReader reader) {
+    std::string fontPath(reader.readString());
+    return std::make_shared<FreeTypeMinikinFontForTest>(fontPath);
+}
+
+Font::TypefaceLoader* readFreeTypeMinikinFontForTest(BufferReader* reader) {
+    reader->skipString();  // fontPath
+    return &loadFreeTypeMinikinFontForTest;
 }
 
 }  // namespace minikin
diff --git a/tests/util/FreeTypeMinikinFontForTest.h b/tests/util/FreeTypeMinikinFontForTest.h
index 4f63638..4cdb6d8 100644
--- a/tests/util/FreeTypeMinikinFontForTest.h
+++ b/tests/util/FreeTypeMinikinFontForTest.h
@@ -66,7 +66,7 @@
 
 void writeFreeTypeMinikinFontForTest(BufferWriter* writer, const MinikinFont* typeface);
 
-Font::TypefaceLoader readFreeTypeMinikinFontForTest(BufferReader* reader);
+Font::TypefaceLoader* readFreeTypeMinikinFontForTest(BufferReader* reader);
 
 }  // namespace minikin