[Fontations] Implement onOpenStream for SkTypeface_Fontations

Fixed: skia:14333, skia:14334
Change-Id: I848189e0f7a5a9d198c73bfd297c724a02a21313
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/702876
Reviewed-by: Ben Wagner <bungeman@google.com>
Commit-Queue: Dominik Röttsches <drott@google.com>
diff --git a/src/ports/SkTypeface_fontations.cpp b/src/ports/SkTypeface_fontations.cpp
index ed8146c..b8ea64d 100644
--- a/src/ports/SkTypeface_fontations.cpp
+++ b/src/ports/SkTypeface_fontations.cpp
@@ -22,17 +22,19 @@
     return SkData::MakeFromStream(font_data.get(), font_data->getLength());
 }
 
-::rust::Box<::fontations_ffi::BridgeFontRef> make_bridge_font_ref(sk_sp<SkData> fontData,
-                                                                  uint32_t index = 0) {
+rust::Box<::fontations_ffi::BridgeFontRef> make_bridge_font_ref(sk_sp<SkData> fontData,
+                                                                  uint32_t index) {
     rust::Slice<const uint8_t> slice{fontData->bytes(), fontData->size()};
     return fontations_ffi::make_font_ref(slice, index);
 }
 }  // namespace
 
-SkTypeface_Fontations::SkTypeface_Fontations(std::unique_ptr<SkStreamAsset> font_data)
+SkTypeface_Fontations::SkTypeface_Fontations(std::unique_ptr<SkStreamAsset> font_data,
+                                             uint32_t ttcIndex)
         : SkTypeface(SkFontStyle(), true)
         , fFontData(streamToData(font_data))
-        , fBridgeFontRef(make_bridge_font_ref(fFontData)) {}
+        , fTtcIndex(ttcIndex)
+        , fBridgeFontRef(make_bridge_font_ref(fFontData, fTtcIndex)) {}
 
 int SkTypeface_Fontations::onGetUPEM() const {
     return fontations_ffi::units_per_em_or_zero(*fBridgeFontRef);
@@ -177,6 +179,11 @@
     const fontations_ffi::BridgeFontRef& fBridgeFontRef;
 };
 
+std::unique_ptr<SkStreamAsset> SkTypeface_Fontations::onOpenStream(int* ttcIndex) const {
+    *ttcIndex = fTtcIndex;
+    return std::make_unique<SkMemoryStream>(fFontData);
+}
+
 std::unique_ptr<SkScalerContext> SkTypeface_Fontations::onCreateScalerContext(
         const SkScalerContextEffects& effects, const SkDescriptor* desc) const {
     return std::make_unique<SkFontationsScalerContext>(
diff --git a/src/ports/SkTypeface_fontations.h b/src/ports/SkTypeface_fontations.h
index ece4b81..bd9b0f4 100644
--- a/src/ports/SkTypeface_fontations.h
+++ b/src/ports/SkTypeface_fontations.h
@@ -21,12 +21,12 @@
 /** SkTypeface implementation based on Google Fonts Fontations Rust libraries. */
 class SkTypeface_Fontations : public SkTypeface {
 public:
-    SkTypeface_Fontations(std::unique_ptr<SkStreamAsset> font_data);
+    SkTypeface_Fontations(std::unique_ptr<SkStreamAsset> font_data, uint32_t ttcIndex = 0);
 
     const fontations_ffi::BridgeFontRef& getBridgeFontRef() { return *fBridgeFontRef; }
 
 protected:
-    std::unique_ptr<SkStreamAsset> onOpenStream(int* ttcIndex) const override { return nullptr; }
+    std::unique_ptr<SkStreamAsset> onOpenStream(int* ttcIndex) const override;
     sk_sp<SkTypeface> onMakeClone(const SkFontArguments& args) const override {
         return sk_ref_sp(this);
     }
@@ -59,6 +59,8 @@
 
 private:
     sk_sp<SkData> fFontData;
+    // Incoming ttc index requested when this typeface was instantiated from data.
+    uint32_t fTtcIndex = 0;
     // fBridgeFontRef accesses the data in fFontData. fFontData needs to be kept around for the
     // lifetime of fBridgeFontRef to safely request parsed data.
     rust::Box<::fontations_ffi::BridgeFontRef> fBridgeFontRef;