diff options
Diffstat (limited to 'src/ports/SkTypeface_win_dw.cpp')
-rw-r--r-- | src/ports/SkTypeface_win_dw.cpp | 70 |
1 files changed, 62 insertions, 8 deletions
diff --git a/src/ports/SkTypeface_win_dw.cpp b/src/ports/SkTypeface_win_dw.cpp index a7bad0d24e..3bf61347df 100644 --- a/src/ports/SkTypeface_win_dw.cpp +++ b/src/ports/SkTypeface_win_dw.cpp @@ -185,8 +185,9 @@ SkTypeface::LocalizedStrings* DWriteFontTypeface::onCreateFamilyNameIterator() c return nameIter; } -int DWriteFontTypeface::onGetVariationDesignPosition(SkFontArguments::VariationPosition::Coordinate coordinates[], - int coordinateCount) const { +int DWriteFontTypeface::onGetVariationDesignPosition( + SkFontArguments::VariationPosition::Coordinate coordinates[], int coordinateCount) const +{ #if defined(NTDDI_WIN10_RS3) && NTDDI_VERSION >= NTDDI_WIN10_RS3 @@ -210,20 +211,73 @@ int DWriteFontTypeface::onGetVariationDesignPosition(SkFontArguments::VariationP } } - if (!coordinates || !coordinateCount || !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; + UINT32 coordIndex = 0; + + for (UINT32 axisIndex = 0; axisIndex < fontAxisCount; ++axisIndex) { + if (fontResource->GetFontAxisAttributes(axisIndex) & DWRITE_FONT_AXIS_ATTRIBUTES_VARIABLE) { + coordinates[coordIndex].axis = SkEndian_SwapBE32(fontAxisValue[axisIndex].axisTag); + coordinates[coordIndex].value = fontAxisValue[axisIndex].value; + } + } + + return variableAxisCount; + +#endif + + return -1; +} + +int DWriteFontTypeface::onGetVariationDesignParameters( + SkFontParameters::Variation::Axis parameters[], int parameterCount) 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 (!parameters || parameterCount < variableAxisCount) { + return variableAxisCount; + } + + SkAutoSTMalloc<8, DWRITE_FONT_AXIS_RANGE> fontAxisRange(fontAxisCount); + HR_GENERAL(fontResource->GetFontAxisRanges(fontAxisRange.get(), fontAxisCount), nullptr, -1); + SkAutoSTMalloc<8, DWRITE_FONT_AXIS_VALUE> fontAxisDefaultValue(fontAxisCount); + HR_GENERAL(fontResource->GetDefaultFontAxisValues(fontAxisDefaultValue.get(), fontAxisCount), + nullptr, -1); + UINT32 coordIndex = 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; + parameters[coordIndex].tag = SkEndian_SwapBE32(fontAxisDefaultValue[axisIndex].axisTag); + parameters[coordIndex].min = fontAxisRange[axisIndex].minValue; + parameters[coordIndex].def = fontAxisDefaultValue[axisIndex].value; + parameters[coordIndex].max = fontAxisRange[axisIndex].maxValue; + parameters[coordIndex].setHidden(fontResource->GetFontAxisAttributes(axisIndex) & + DWRITE_FONT_AXIS_ATTRIBUTES_HIDDEN); } } |