| Index: src/ports/SkFontMgr_android.cpp
|
| diff --git a/src/ports/SkFontMgr_android.cpp b/src/ports/SkFontMgr_android.cpp
|
| index ae1b663e261dd30a976fbed417e09d033c92bee7..a67c6814eaa0b56b1bff8385548786ecae3bc1b5 100644
|
| --- a/src/ports/SkFontMgr_android.cpp
|
| +++ b/src/ports/SkFontMgr_android.cpp
|
| @@ -27,20 +27,18 @@ static const char* gTestBasePath = NULL;
|
|
|
| class SkTypeface_Android : public SkTypeface_FreeType {
|
| public:
|
| - SkTypeface_Android(int index,
|
| - const SkFontStyle& style,
|
| + SkTypeface_Android(const SkFontStyle& style,
|
| bool isFixedPitch,
|
| const SkString& familyName)
|
| : INHERITED(style, SkTypefaceCache::NewFontID(), isFixedPitch)
|
| - , fIndex(index)
|
| - , fFamilyName(familyName) { }
|
| + , fFamilyName(familyName)
|
| + { }
|
|
|
| protected:
|
| void onGetFamilyName(SkString* familyName) const override {
|
| *familyName = fFamilyName;
|
| }
|
|
|
| - int fIndex;
|
| SkString fFamilyName;
|
|
|
| private:
|
| @@ -51,30 +49,37 @@ class SkTypeface_AndroidSystem : public SkTypeface_Android {
|
| public:
|
| SkTypeface_AndroidSystem(const SkString& pathName,
|
| int index,
|
| + const SkFixed* axes, int axesCount,
|
| const SkFontStyle& style,
|
| bool isFixedPitch,
|
| const SkString& familyName,
|
| const SkLanguage& lang,
|
| FontVariant variantStyle)
|
| - : INHERITED(index, style, isFixedPitch, familyName)
|
| + : INHERITED(style, isFixedPitch, familyName)
|
| , fPathName(pathName)
|
| + , fIndex(index)
|
| + , fAxes(axes, axesCount)
|
| , fLang(lang)
|
| , fVariantStyle(variantStyle) { }
|
|
|
| - virtual void onGetFontDescriptor(SkFontDescriptor* desc,
|
| - bool* serialize) const override {
|
| + virtual void onGetFontDescriptor(SkFontDescriptor* desc, bool* serialize) const override {
|
| SkASSERT(desc);
|
| SkASSERT(serialize);
|
| desc->setFamilyName(fFamilyName.c_str());
|
| - desc->setFontIndex(fIndex);
|
| *serialize = false;
|
| }
|
| SkStreamAsset* onOpenStream(int* ttcIndex) const override {
|
| *ttcIndex = fIndex;
|
| return SkStream::NewFromFile(fPathName.c_str());
|
| }
|
| + SkFontData* onCreateFontData() const override {
|
| + return new SkFontData(SkStream::NewFromFile(fPathName.c_str()), fIndex,
|
| + fAxes.begin(), fAxes.count());
|
| + }
|
|
|
| const SkString fPathName;
|
| + int fIndex;
|
| + const SkSTArray<4, SkFixed, true> fAxes;
|
| const SkLanguage fLang;
|
| const FontVariant fVariantStyle;
|
|
|
| @@ -83,13 +88,13 @@ public:
|
|
|
| class SkTypeface_AndroidStream : public SkTypeface_Android {
|
| public:
|
| - SkTypeface_AndroidStream(SkStreamAsset* stream,
|
| - int index,
|
| + SkTypeface_AndroidStream(SkFontData* data,
|
| const SkFontStyle& style,
|
| bool isFixedPitch,
|
| const SkString& familyName)
|
| - : INHERITED(index, style, isFixedPitch, familyName)
|
| - , fStream(stream) { }
|
| + : INHERITED(style, isFixedPitch, familyName)
|
| + , fData(data)
|
| + { }
|
|
|
| virtual void onGetFontDescriptor(SkFontDescriptor* desc,
|
| bool* serialize) const override {
|
| @@ -100,21 +105,24 @@ public:
|
| }
|
|
|
| SkStreamAsset* onOpenStream(int* ttcIndex) const override {
|
| - *ttcIndex = fIndex;
|
| - return fStream->duplicate();
|
| + *ttcIndex = fData->getIndex();
|
| + return fData->duplicateStream();
|
| }
|
|
|
| -private:
|
| - SkAutoTDelete<SkStreamAsset> fStream;
|
| + SkFontData* onCreateFontData() const override {
|
| + return new SkFontData(*fData.get());
|
| + }
|
|
|
| +private:
|
| + const SkAutoTDelete<const SkFontData> fData;
|
| typedef SkTypeface_Android INHERITED;
|
| };
|
|
|
| class SkFontStyleSet_Android : public SkFontStyleSet {
|
| + typedef SkTypeface_FreeType::Scanner Scanner;
|
| +
|
| public:
|
| - explicit SkFontStyleSet_Android(const FontFamily& family,
|
| - const SkTypeface_FreeType::Scanner& scanner)
|
| - {
|
| + explicit SkFontStyleSet_Android(const FontFamily& family, const Scanner& scanner) {
|
| const SkString* cannonicalFamilyName = NULL;
|
| if (family.fNames.count() > 0) {
|
| cannonicalFamilyName = &family.fNames[0];
|
| @@ -137,7 +145,10 @@ public:
|
| SkString familyName;
|
| SkFontStyle style;
|
| bool isFixedWidth;
|
| - if (!scanner.scanFont(stream.get(), ttcIndex, &familyName, &style, &isFixedWidth)) {
|
| + Scanner::AxisDefinitions axisDefinitions;
|
| + if (!scanner.scanFont(stream.get(), ttcIndex,
|
| + &familyName, &style, &isFixedWidth, &axisDefinitions))
|
| + {
|
| SkDEBUGF(("Requested font file %s exists, but is not a valid font.\n",
|
| pathName.c_str()));
|
| continue;
|
| @@ -166,8 +177,57 @@ public:
|
| familyName = *cannonicalFamilyName;
|
| }
|
|
|
| + SkAutoSTMalloc<4, SkFixed> axisValues(axisDefinitions.count());
|
| + for (int i = 0; i < axisDefinitions.count(); ++i) {
|
| + const Scanner::AxisDefinition& axisDefinition = axisDefinitions[i];
|
| + axisValues[i] = axisDefinition.fDefault;
|
| + for (int j = 0; j < fontFile.fAxes.count(); ++j) {
|
| + const FontFileInfo::Axis& axisSpecified = fontFile.fAxes[j];
|
| + if (axisDefinition.fTag == axisSpecified.fTag) {
|
| + axisValues[i] = SkTPin(axisSpecified.fValue, axisDefinition.fMinimum,
|
| + axisDefinition.fMaximum);
|
| + if (axisValues[i] != axisSpecified.fValue) {
|
| + SkDEBUGF(("Requested font axis value out of range: "
|
| + "%s '%c%c%c%c' %f; pinned to %f.\n",
|
| + familyName.c_str(),
|
| + (axisDefinition.fTag >> 24) & 0xFF,
|
| + (axisDefinition.fTag >> 16) & 0xFF,
|
| + (axisDefinition.fTag >> 8) & 0xFF,
|
| + (axisDefinition.fTag ) & 0xFF,
|
| + SkFixedToDouble(axisSpecified.fValue),
|
| + SkFixedToDouble(axisValues[i])));
|
| + }
|
| + break;
|
| + }
|
| + }
|
| + // TODO: warn on defaulted axis?
|
| + }
|
| +
|
| + SkDEBUGCODE (
|
| + // Check for axis specified, but not matched in font.
|
| + for (int i = 0; i < fontFile.fAxes.count(); ++i) {
|
| + SkFourByteTag skTag = fontFile.fAxes[i].fTag;
|
| + bool found = false;
|
| + for (int j = 0; j < axisDefinitions.count(); ++j) {
|
| + if (skTag == axisDefinitions[j].fTag) {
|
| + found = true;
|
| + break;
|
| + }
|
| + }
|
| + if (!found) {
|
| + SkDEBUGF(("Requested font axis not found: %s '%c%c%c%c'\n",
|
| + familyName.c_str(),
|
| + (skTag >> 24) & 0xFF,
|
| + (skTag >> 16) & 0xFF,
|
| + (skTag >> 8) & 0xFF,
|
| + (skTag ) & 0xFF));
|
| + }
|
| + }
|
| + )
|
| +
|
| fStyles.push_back().reset(SkNEW_ARGS(SkTypeface_AndroidSystem,
|
| (pathName, ttcIndex,
|
| + axisValues.get(), axisDefinitions.count(),
|
| style, isFixedWidth, familyName,
|
| lang, variant)));
|
| }
|
| @@ -411,11 +471,22 @@ protected:
|
| bool isFixedPitch;
|
| SkFontStyle style;
|
| SkString name;
|
| - if (!fScanner.scanFont(stream, ttcIndex, &name, &style, &isFixedPitch)) {
|
| + if (!fScanner.scanFont(stream, ttcIndex, &name, &style, &isFixedPitch, NULL)) {
|
| + return NULL;
|
| + }
|
| + SkFontData* data(new SkFontData(stream.detach(), ttcIndex, NULL, 0));
|
| + return SkNEW_ARGS(SkTypeface_AndroidStream, (data, style, isFixedPitch, name));
|
| + }
|
| +
|
| + SkTypeface* onCreateFromFontData(SkFontData* data) const override {
|
| + SkStreamAsset* stream(data->getStream());
|
| + bool isFixedPitch;
|
| + SkFontStyle style;
|
| + SkString name;
|
| + if (!fScanner.scanFont(stream, data->getIndex(), &name, &style, &isFixedPitch, NULL)) {
|
| return NULL;
|
| }
|
| - return SkNEW_ARGS(SkTypeface_AndroidStream, (stream.detach(), ttcIndex,
|
| - style, isFixedPitch, name));
|
| + return SkNEW_ARGS(SkTypeface_AndroidStream, (data, style, isFixedPitch, name));
|
| }
|
|
|
|
|
|
|