aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/ports/SkFontConfigTypeface.h11
-rw-r--r--src/ports/SkFontHost_FreeType.cpp27
-rw-r--r--src/ports/SkFontHost_FreeType_common.h2
-rw-r--r--src/ports/SkFontMgr_android.cpp11
-rw-r--r--src/ports/SkFontMgr_fontconfig.cpp11
5 files changed, 60 insertions, 2 deletions
diff --git a/src/ports/SkFontConfigTypeface.h b/src/ports/SkFontConfigTypeface.h
index e27fbb3d85..603d77fbd8 100644
--- a/src/ports/SkFontConfigTypeface.h
+++ b/src/ports/SkFontConfigTypeface.h
@@ -38,6 +38,17 @@ public:
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 c3cedf11b0..b8ce2033b1 100644
--- a/src/ports/SkFontHost_FreeType.cpp
+++ b/src/ports/SkFontHost_FreeType.cpp
@@ -649,6 +649,25 @@ SkScalerContext* SkTypeface_FreeType::onCreateScalerContext(const SkScalerContex
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 @@ bool SkTypeface_FreeType::Scanner::scanFont(
*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 @@ bool SkTypeface_FreeType::Scanner::scanFont(
(*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 eacce04ca1..1386775bb8 100644
--- a/src/ports/SkFontHost_FreeType_common.h
+++ b/src/ports/SkFontHost_FreeType_common.h
@@ -76,6 +76,7 @@ public:
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 @@ protected:
: 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 0e12ce2c30..5194e1f7b7 100644
--- a/src/ports/SkFontMgr_android.cpp
+++ b/src/ports/SkFontMgr_android.cpp
@@ -136,6 +136,17 @@ public:
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 f1c2bad355..3589ae8100 100644
--- a/src/ports/SkFontMgr_fontconfig.cpp
+++ b/src/ports/SkFontMgr_fontconfig.cpp
@@ -444,6 +444,17 @@ public:
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;