From 75e6490a2952849d72ecb1e59c97e36db8908884 Mon Sep 17 00:00:00 2001 From: Bruce Wang Date: Tue, 12 Jun 2018 14:44:22 -0400 Subject: Implement DWriteFontTypeface::onGetVariationDesignPosition on win10. Copy into 'coordinates' (allocated by the caller) the design variation coordinates. Return the number of axes, or -1 if there is an error. Change-Id: Ie2fe88aaae358ec471aafd655b4ed0be80d43ae6 Reviewed-on: https://skia-review.googlesource.com/134329 Reviewed-by: Ben Wagner Commit-Queue: Bruce Wang --- src/ports/SkTypeface_win_dw.cpp | 49 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) (limited to 'src/ports/SkTypeface_win_dw.cpp') 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 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 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(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 && -- cgit v1.2.3