diff options
-rw-r--r-- | src/ports/SkFontConfigTypeface.h | 11 | ||||
-rw-r--r-- | src/ports/SkFontHost_FreeType.cpp | 27 | ||||
-rw-r--r-- | src/ports/SkFontHost_FreeType_common.h | 2 | ||||
-rw-r--r-- | src/ports/SkFontMgr_android.cpp | 11 | ||||
-rw-r--r-- | src/ports/SkFontMgr_fontconfig.cpp | 11 |
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; |