Chromium Code Reviews| Index: src/ports/SkFontMgr_custom.cpp |
| diff --git a/src/ports/SkFontMgr_custom.cpp b/src/ports/SkFontMgr_custom.cpp |
| index ed5e58dd332b2cf814aa98e69808989225c604e0..200173d987a4cf5030fcab2c188d1e640834eb70 100644 |
| --- a/src/ports/SkFontMgr_custom.cpp |
| +++ b/src/ports/SkFontMgr_custom.cpp |
| @@ -21,6 +21,7 @@ |
| #include "SkTypes.h" |
| #include <limits> |
| +#include <memory> |
| class SkData; |
| @@ -72,20 +73,25 @@ private: |
| /** The stream SkTypeface implementation for the custom font manager. */ |
| class SkTypeface_Stream : public SkTypeface_Custom { |
| public: |
| - SkTypeface_Stream(const SkFontStyle& style, bool isFixedPitch, bool sysFont, |
| - const SkString familyName, SkStreamAsset* stream, int index) |
| - : INHERITED(style, isFixedPitch, sysFont, familyName, index) |
| - , fStream(stream) |
| + SkTypeface_Stream(std::unique_ptr<SkFontData> fontData, |
| + const SkFontStyle& style, bool isFixedPitch, bool sysFont, |
| + const SkString familyName) |
| + : INHERITED(style, isFixedPitch, sysFont, familyName, fontData->getIndex()) |
| + , fData(std::move(fontData)) |
| { } |
| protected: |
| SkStreamAsset* onOpenStream(int* ttcIndex) const override { |
| - *ttcIndex = this->getIndex(); |
| - return fStream->duplicate(); |
| + *ttcIndex = fData->getIndex(); |
| + return fData->duplicateStream(); |
| + } |
| + |
| + SkFontData* onCreateFontData() const override { |
| + return new SkFontData(*fData.get()); |
| } |
| private: |
| - const SkAutoTDelete<const SkStreamAsset> fStream; |
| + std::unique_ptr<const SkFontData> fData; |
| typedef SkTypeface_Custom INHERITED; |
| }; |
| @@ -123,8 +129,8 @@ public: |
| explicit SkFontStyleSet_Custom(const SkString familyName) : fFamilyName(familyName) { } |
| /** Should only be called during the inital build phase. */ |
| - void appendTypeface(SkTypeface_Custom* typeface) { |
| - fStyles.push_back().reset(typeface); |
| + void appendTypeface(sk_sp<SkTypeface_Custom> typeface) { |
| + fStyles.emplace_back(std::move(typeface)); |
| } |
| int count() override { |
| @@ -153,7 +159,7 @@ public: |
| SkString getFamilyName() { return fFamilyName; } |
| private: |
| - SkTArray<SkAutoTUnref<SkTypeface_Custom>, true> fStyles; |
| + SkTArray<sk_sp<SkTypeface_Custom>> fStyles; |
| SkString fFamilyName; |
| friend class SkFontMgr_Custom; |
| @@ -168,7 +174,7 @@ private: |
| */ |
| class SkFontMgr_Custom : public SkFontMgr { |
| public: |
| - typedef SkTArray<SkAutoTUnref<SkFontStyleSet_Custom>, true> Families; |
| + typedef SkTArray<sk_sp<SkFontStyleSet_Custom>> Families; |
| class SystemFontLoader { |
| public: |
| virtual ~SystemFontLoader() { } |
| @@ -182,23 +188,23 @@ public: |
| "Arial", "Verdana", "Times New Roman", "Droid Sans", nullptr |
| }; |
| for (size_t i = 0; i < SK_ARRAY_COUNT(defaultNames); ++i) { |
| - SkFontStyleSet_Custom* set = this->onMatchFamily(defaultNames[i]); |
| + sk_sp<SkFontStyleSet_Custom> set(this->onMatchFamily(defaultNames[i])); |
| if (nullptr == set) { |
| continue; |
| } |
| - SkTypeface* tf = set->matchStyle(SkFontStyle(SkFontStyle::kNormal_Weight, |
| - SkFontStyle::kNormal_Width, |
| - SkFontStyle::kUpright_Slant)); |
| + sk_sp<SkTypeface> tf(set->matchStyle(SkFontStyle(SkFontStyle::kNormal_Weight, |
| + SkFontStyle::kNormal_Width, |
| + SkFontStyle::kUpright_Slant))); |
| if (nullptr == tf) { |
| continue; |
| } |
| - fDefaultFamily = set; |
| + fDefaultFamily = set.get(); |
| break; |
| } |
| if (nullptr == fDefaultFamily) { |
| - fDefaultFamily = fFamilies[0]; |
| + fDefaultFamily = fFamilies[0].get(); |
| } |
| } |
| @@ -245,7 +251,7 @@ protected: |
| { |
| for (int i = 0; i < fFamilies.count(); ++i) { |
| for (int j = 0; j < fFamilies[i]->fStyles.count(); ++j) { |
| - if (fFamilies[i]->fStyles[j] == familyMember) { |
| + if (fFamilies[i]->fStyles[j].get() == familyMember) { |
| return fFamilies[i]->matchStyle(fontStyle); |
| } |
| } |
| @@ -258,20 +264,31 @@ protected: |
| } |
| SkTypeface* onCreateFromStream(SkStreamAsset* bareStream, int ttcIndex) const override { |
| - SkAutoTDelete<SkStreamAsset> stream(bareStream); |
| - if (nullptr == stream || stream->getLength() <= 0) { |
| - return nullptr; |
| - } |
| + return this->createFromStream(bareStream, FontParameters().setCollectionIndex(ttcIndex)); |
| + } |
| + SkTypeface* onCreateFromStream(SkStreamAsset* s, const FontParameters& params) const override { |
| + using Scanner = SkTypeface_FreeType::Scanner; |
| + SkAutoTDelete<SkStreamAsset> stream(s); |
| bool isFixedPitch; |
| SkFontStyle style; |
| SkString name; |
| - if (fScanner.scanFont(stream, ttcIndex, &name, &style, &isFixedPitch, nullptr)) { |
| - return new SkTypeface_Stream(style, isFixedPitch, false, name, stream.release(), |
| - ttcIndex); |
| - } else { |
| + Scanner::AxisDefinitions axisDefinitions; |
| + if (!fScanner.scanFont(stream, params.getCollectionIndex(), &name, &style, &isFixedPitch, |
| + &axisDefinitions)) |
| + { |
| return nullptr; |
| } |
| + |
| + int paramAxisCount; |
| + const FontParameters::Axis* paramAxes = params.getAxes(¶mAxisCount); |
| + SkAutoSTMalloc<4, SkFixed> axisValues(axisDefinitions.count()); |
| + Scanner::computeAxisValues(axisDefinitions, paramAxes, paramAxisCount, axisValues, name); |
| + |
| + std::unique_ptr<SkFontData> data(new SkFontData(stream.release(), |
| + params.getCollectionIndex(), |
| + axisValues.get(), axisDefinitions.count())); |
| + return new SkTypeface_Stream(std::move(data), style, isFixedPitch, false, name); |
| } |
| SkTypeface* onCreateFromFile(const char path[], int ttcIndex) const override { |
| @@ -290,7 +307,7 @@ protected: |
| tf = fDefaultFamily->matchStyle(style); |
| } |
| - return SkSafeRef(tf); |
| + return tf; |
|
bungeman-skia
2016/06/10 00:18:48
Like in the SkFontMgr_Custom constructor, this lea
|
| } |
| private: |
| @@ -316,7 +333,7 @@ public: |
| if (families->empty()) { |
| SkFontStyleSet_Custom* family = new SkFontStyleSet_Custom(SkString()); |
| families->push_back().reset(family); |
| - family->appendTypeface(new SkTypeface_Empty); |
| + family->appendTypeface(sk_make_sp<SkTypeface_Empty>()); |
| } |
| } |
| @@ -363,16 +380,14 @@ private: |
| continue; |
| } |
| - SkTypeface_Custom* tf = new SkTypeface_File(style, isFixedPitch, |
| - true, // system-font (cannot delete) |
| - realname, filename.c_str(), faceIndex); |
| - |
| SkFontStyleSet_Custom* addTo = find_family(*families, realname.c_str()); |
| if (nullptr == addTo) { |
| addTo = new SkFontStyleSet_Custom(realname); |
| families->push_back().reset(addTo); |
| } |
| - addTo->appendTypeface(tf); |
| + addTo->appendTypeface(sk_make_sp<SkTypeface_File>(style, isFixedPitch, true, |
| + realname, filename.c_str(), |
| + faceIndex)); |
| } |
| } |
| @@ -413,7 +428,7 @@ public: |
| if (families->empty()) { |
| SkFontStyleSet_Custom* family = new SkFontStyleSet_Custom(SkString()); |
| families->push_back().reset(family); |
| - family->appendTypeface(new SkTypeface_Empty); |
| + family->appendTypeface(sk_make_sp<SkTypeface_Empty>()); |
| } |
| } |
| @@ -450,16 +465,16 @@ private: |
| return; |
| } |
| - SkTypeface_Custom* tf = |
| - new SkTypeface_Stream(style, isFixedPitch, true, // system-font (cannot delete) |
| - realname, stream.release(), faceIndex); |
| - |
| SkFontStyleSet_Custom* addTo = find_family(*families, realname.c_str()); |
| if (nullptr == addTo) { |
| addTo = new SkFontStyleSet_Custom(realname); |
| families->push_back().reset(addTo); |
| } |
| - addTo->appendTypeface(tf); |
| + std::unique_ptr<SkFontData> data( |
| + new SkFontData(stream.release(), faceIndex, nullptr, 0)); |
| + addTo->appendTypeface(sk_make_sp<SkTypeface_Stream>(std::move(data), |
| + style, isFixedPitch, |
| + true, realname)); |
| } |
| } |
| @@ -481,7 +496,7 @@ public: |
| { |
| SkFontStyleSet_Custom* family = new SkFontStyleSet_Custom(SkString()); |
| families->push_back().reset(family); |
| - family->appendTypeface(new SkTypeface_Empty); |
| + family->appendTypeface(sk_make_sp<SkTypeface_Empty>()); |
| } |
| }; |