[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;