diff options
-rw-r--r-- | src/ports/SkTypeface_win_dw.cpp | 49 | ||||
-rw-r--r-- | src/ports/SkTypeface_win_dw.h | 5 | ||||
-rw-r--r-- | tests/TypefaceTest.cpp | 2 |
3 files changed, 51 insertions, 5 deletions
diff --git a/src/ports/SkTypeface_win_dw.cpp b/src/ports/SkTypeface_win_dw.cpp index aa88c4c911..a7bad0d24e 100644 --- a/src/ports/SkTypeface_win_dw.cpp +++ b/src/ports/SkTypeface_win_dw.cpp @@ -185,6 +185,55 @@ SkTypeface::LocalizedStrings* DWriteFontTypeface::onCreateFamilyNameIterator() c return nameIter; } +int DWriteFontTypeface::onGetVariationDesignPosition(SkFontArguments::VariationPosition::Coordinate coordinates[], + int coordinateCount) const { + +#if defined(NTDDI_WIN10_RS3) && NTDDI_VERSION >= NTDDI_WIN10_RS3 + + SkTScopedComPtr<IDWriteFontFace5> fontFace5; + if (FAILED(fDWriteFontFace->QueryInterface(&fontFace5))) { + return -1; + } + + // Return 0 if the font is not variable font. + if (!fontFace5->HasVariations()) { + return 0; + } + + UINT32 fontAxisCount = fontFace5->GetFontAxisValueCount(); + SkTScopedComPtr<IDWriteFontResource> fontResource; + HR_GENERAL(fontFace5->GetFontResource(&fontResource), nullptr, -1); + int variableAxisCount = 0; + for (UINT32 i = 0; i < fontAxisCount; ++i) { + if (fontResource->GetFontAxisAttributes(i) & DWRITE_FONT_AXIS_ATTRIBUTES_VARIABLE) { + variableAxisCount++; + } + } + + if (!coordinates || !coordinateCount || !variableAxisCount) { + return variableAxisCount; + } + + SkAutoSTMalloc<8, DWRITE_FONT_AXIS_VALUE> fontAxisValue(fontAxisCount); + HR_GENERAL(fontFace5->GetFontAxisValues(fontAxisValue.get(), fontAxisCount), nullptr, -1); + UINT32 minCount = SkMin32(variableAxisCount, SkTo<UINT32>(coordinateCount)); + UINT32 coordinatesIndex = 0; + + for (UINT32 axisIndex = 0; axisIndex < fontAxisCount; ++axisIndex) { + if (fontResource->GetFontAxisAttributes(axisIndex) & DWRITE_FONT_AXIS_ATTRIBUTES_VARIABLE) { + coordinates[coordinatesIndex].axis = SkEndian_SwapBE32(fontAxisValue[axisIndex].axisTag); + coordinates[coordinatesIndex].value = fontAxisValue[axisIndex].value; + if (++coordinatesIndex == minCount) break; + } + } + + return variableAxisCount; + +#endif + + return -1; +} + int DWriteFontTypeface::onGetTableTags(SkFontTableTag tags[]) const { DWRITE_FONT_FACE_TYPE type = fDWriteFontFace->GetType(); if (type != DWRITE_FONT_FACE_TYPE_CFF && diff --git a/src/ports/SkTypeface_win_dw.h b/src/ports/SkTypeface_win_dw.h index b443c28efe..2d76b39adb 100644 --- a/src/ports/SkTypeface_win_dw.h +++ b/src/ports/SkTypeface_win_dw.h @@ -116,10 +116,7 @@ protected: void onGetFamilyName(SkString* familyName) const override; SkTypeface::LocalizedStrings* onCreateFamilyNameIterator() const override; int onGetVariationDesignPosition(SkFontArguments::VariationPosition::Coordinate coordinates[], - int coordinateCount) const override - { - return -1; - } + int coordinateCount) const override; int onGetTableTags(SkFontTableTag tags[]) const override; size_t onGetTableData(SkFontTableTag, size_t offset, size_t length, void* data) const override; diff --git a/tests/TypefaceTest.cpp b/tests/TypefaceTest.cpp index fcef366cb2..f0253ef08f 100644 --- a/tests/TypefaceTest.cpp +++ b/tests/TypefaceTest.cpp @@ -174,7 +174,7 @@ DEF_TEST(TypefaceAxes, reporter) { // Convert to fixed for "almost equal". SkFixed fixedRead = SkScalarToFixed(positionRead[0].value); SkFixed fixedOriginal = SkScalarToFixed(position[1].value); - REPORTER_ASSERT(reporter, fixedRead == fixedOriginal); + REPORTER_ASSERT(reporter, SkTAbs(fixedRead - fixedOriginal) < 2); } DEF_TEST(TypefaceVariationIndex, reporter) { |