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;