diff options
-rw-r--r-- | gn/core.gni | 1 | ||||
-rw-r--r-- | include/core/SkFontArguments.h | 10 | ||||
-rw-r--r-- | include/core/SkFontParameters.h | 38 | ||||
-rw-r--r-- | include/core/SkTypeface.h | 18 | ||||
-rw-r--r-- | src/core/SkTypeface.cpp | 16 | ||||
-rw-r--r-- | src/core/SkTypeface_remote.h | 5 | ||||
-rw-r--r-- | src/ports/SkFontHost_FreeType.cpp | 73 | ||||
-rw-r--r-- | src/ports/SkFontHost_FreeType_common.h | 2 | ||||
-rw-r--r-- | src/ports/SkFontHost_win.cpp | 5 | ||||
-rw-r--r-- | src/ports/SkTypeface_win_dw.cpp | 70 | ||||
-rw-r--r-- | src/ports/SkTypeface_win_dw.h | 2 | ||||
-rw-r--r-- | tests/TypefaceTest.cpp | 42 | ||||
-rw-r--r-- | tools/fonts/SkRandomScalerContext.cpp | 6 | ||||
-rw-r--r-- | tools/fonts/SkRandomScalerContext.h | 2 | ||||
-rw-r--r-- | tools/fonts/SkTestSVGTypeface.h | 6 | ||||
-rw-r--r-- | tools/fonts/SkTestTypeface.h | 6 |
16 files changed, 286 insertions, 16 deletions
diff --git a/gn/core.gni b/gn/core.gni index d37981699e..96ac5cd327 100644 --- a/gn/core.gni +++ b/gn/core.gni @@ -399,6 +399,7 @@ skia_core_sources = [ "$_include/core/SkFontArguments.h", "$_include/core/SkFontLCDConfig.h", "$_include/core/SkFontMgr.h", + "$_include/core/SkFontParameters.h", "$_include/core/SkFontStyle.h", "$_include/core/SkGraphics.h", "$_include/core/SkImage.h", diff --git a/include/core/SkFontArguments.h b/include/core/SkFontArguments.h index 473798fb84..52f20728a1 100644 --- a/include/core/SkFontArguments.h +++ b/include/core/SkFontArguments.h @@ -5,8 +5,8 @@ * found in the LICENSE file. */ -#ifndef SkFontAgruments_DEFINED -#define SkFontAgruments_DEFINED +#ifndef SkFontArguments_DEFINED +#define SkFontArguments_DEFINED #include "SkScalar.h" #include "SkTypes.h" @@ -16,15 +16,15 @@ struct SkFontArguments { struct VariationPosition { struct Coordinate { SkFourByteTag axis; - SkScalar value; + float value; }; const Coordinate* coordinates; int coordinateCount; }; - // deprecated, use VariationCoordinate instead + // deprecated, use VariationPosition::Coordinate instead struct Axis { SkFourByteTag fTag; - SkScalar fStyleValue; + float fStyleValue; }; SkFontArguments() : fCollectionIndex(0), fVariationDesignPosition{nullptr, 0} {} diff --git a/include/core/SkFontParameters.h b/include/core/SkFontParameters.h new file mode 100644 index 0000000000..7d3c407add --- /dev/null +++ b/include/core/SkFontParameters.h @@ -0,0 +1,38 @@ +/* + * Copyright 2018 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef SkFontParameters_DEFINED +#define SkFontParameters_DEFINED + +#include "SkScalar.h" +#include "SkTypes.h" + +struct SkFontParameters { + struct Variation { + // Parameters in a variation font axis. + struct Axis { + // Four character identifier of the font axis (weight, width, slant, italic...). + SkFourByteTag tag; + // Minimum value supported by this axis. + float min; + // Default value set by this axis. + float def; + // Maximum value supported by this axis. The maximum can equal the minimum. + float max; + // Return whether this axis is recommended to be remain hidden in user interfaces. + bool isHidden() const { return flags & HIDDEN; } + // Set this axis to be remain hidden in user interfaces. + void setHidden(bool hidden) { flags = hidden ? (flags | HIDDEN) : (flags & ~HIDDEN); } + private: + static constexpr uint16_t HIDDEN = 0x0001; + // Attributes for a font axis. + uint16_t flags; + }; + }; +}; + +#endif diff --git a/include/core/SkTypeface.h b/include/core/SkTypeface.h index 4118152dea..51f339ccfa 100644 --- a/include/core/SkTypeface.h +++ b/include/core/SkTypeface.h @@ -11,6 +11,7 @@ #include "../private/SkOnce.h" #include "../private/SkWeakRefCnt.h" #include "SkFontArguments.h" +#include "SkFontParameters.h" #include "SkFontStyle.h" #include "SkRect.h" #include "SkString.h" @@ -71,6 +72,20 @@ public: int getVariationDesignPosition(SkFontArguments::VariationPosition::Coordinate coordinates[], int coordinateCount) const; + /** Copy into 'parameters' (allocated by the caller) the design variation parameters. + * + * @param parameters the buffer into which to write the design variation parameters. + * @param coordinateCount the number of entries available through 'parameters'. + * + * @return The number of axes, or -1 if there is an error. + * If 'parameters != nullptr' and 'parameterCount >= numAxes' then 'parameters' will be + * filled with the variation parameters describing the position of this typeface in design + * variation space. It is possible the number of axes can be retrieved but actual parameters + * cannot. + */ + int getVariationDesignParameters(SkFontParameters::Variation::Axis parameters[], + int parameterCount) const; + /** Return a 32bit value for this typeface, unique for the underlying font data. Will never return 0. */ @@ -341,6 +356,9 @@ protected: SkFontArguments::VariationPosition::Coordinate coordinates[], int coordinateCount) const = 0; + virtual int onGetVariationDesignParameters( + SkFontParameters::Variation::Axis parameters[], int parameterCount) const; + virtual void onGetFontDescriptor(SkFontDescriptor*, bool* isLocal) const = 0; virtual int onCharsToGlyphs(const void* chars, Encoding, SkGlyphID glyphs[], diff --git a/src/core/SkTypeface.cpp b/src/core/SkTypeface.cpp index 8e90f51a9b..cc0bd3f025 100644 --- a/src/core/SkTypeface.cpp +++ b/src/core/SkTypeface.cpp @@ -79,6 +79,11 @@ protected: { return 0; } + int onGetVariationDesignParameters(SkFontParameters::Variation::Axis parameters[], + int parameterCount) const override + { + return 0; + } int onGetTableTags(SkFontTableTag tags[]) const override { return 0; } size_t onGetTableData(SkFontTableTag, size_t, size_t, void*) const override { return 0; @@ -207,6 +212,12 @@ int SkTypeface::getVariationDesignPosition( return this->onGetVariationDesignPosition(coordinates, coordinateCount); } +int SkTypeface::getVariationDesignParameters( + SkFontParameters::Variation::Axis parameters[], int parameterCount) const +{ + return this->onGetVariationDesignParameters(parameters, parameterCount); +} + int SkTypeface::countTables() const { return this->onGetTableTags(nullptr); } @@ -324,6 +335,11 @@ sk_sp<SkTypeface> SkTypeface::onMakeClone(const SkFontArguments& args) const { return sk_ref_sp(this); } +int SkTypeface::onGetVariationDesignParameters( + SkFontParameters::Variation::Axis parameters[], int parameterCount) const { + return -1; +} + /////////////////////////////////////////////////////////////////////////////// #include "SkDescriptor.h" diff --git a/src/core/SkTypeface_remote.h b/src/core/SkTypeface_remote.h index 1b4ad89025..c751745b0f 100644 --- a/src/core/SkTypeface_remote.h +++ b/src/core/SkTypeface_remote.h @@ -82,6 +82,11 @@ protected: SK_ABORT("Should never be called."); return 0; } + int onGetVariationDesignParameters(SkFontParameters::Variation::Axis parameters[], + int parameterCount) const override { + SK_ABORT("Should never be called."); + return 0; + } void onGetFamilyName(SkString* familyName) const override { // Used by SkStrikeCache::DumpMemoryStatistics. *familyName = ""; diff --git a/src/ports/SkFontHost_FreeType.cpp b/src/ports/SkFontHost_FreeType.cpp index b8ce2033b1..03f499fcf6 100644 --- a/src/ports/SkFontHost_FreeType.cpp +++ b/src/ports/SkFontHost_FreeType.cpp @@ -72,6 +72,12 @@ # define FT_LOAD_BITMAP_METRICS_ONLY ( 1L << 22 ) #endif +// FT_VAR_AXIS_FLAG_HIDDEN was introduced in FreeType 2.8.1 +// The variation axis should not be exposed to user interfaces. +#ifndef FT_VAR_AXIS_FLAG_HIDDEN +# define FT_VAR_AXIS_FLAG_HIDDEN 1 +#endif + //#define ENABLE_GLYPH_SPEW // for tracing calls //#define DUMP_STRIKE_CREATION //#define SK_FONTHOST_FREETYPE_RUNTIME_VERSION @@ -104,6 +110,7 @@ class FreeTypeLibrary : SkNoncopyable { public: FreeTypeLibrary() : fGetVarDesignCoordinates(nullptr) + , fGetVarAxisFlags(nullptr) , fLibrary(nullptr) , fIsLCDSupported(false) , fLCDExtra(0) @@ -153,6 +160,19 @@ public: } #endif +#if SK_FREETYPE_MINIMUM_RUNTIME_VERSION >= 0x02080100 + fGetVarAxisFlags = FT_Get_Var_Axis_Flags; +#elif SK_FREETYPE_MINIMUM_RUNTIME_VERSION & SK_FREETYPE_DLOPEN + if (major > 2 || ((major == 2 && minor > 7) || (major == 2 && minor == 7 && patch >= 0))) { + //The FreeType library is already loaded, so symbols are available in process. + void* self = dlopen(nullptr, RTLD_LAZY); + if (self) { + *(void**)(&fGetVarAxisFlags) = dlsym(self, "FT_Get_Var_Axis_Flags"); + dlclose(self); + } + } +#endif + // Setup LCD filtering. This reduces color fringes for LCD smoothed glyphs. // The default has changed over time, so this doesn't mean the same thing to all users. if (FT_Library_SetLcdFilter(fLibrary, FT_LCD_FILTER_DEFAULT) == 0) { @@ -177,6 +197,12 @@ public: using FT_Get_Var_Blend_CoordinatesProc = FT_Error (*)(FT_Face, FT_UInt, FT_Fixed*); FT_Get_Var_Blend_CoordinatesProc fGetVarDesignCoordinates; + // FT_Get_Var_Axis_Flags was introduced in FreeType 2.8.1 + // Get the ‘flags’ field of an OpenType Variation Axis Record. + // Not meaningful for Adobe MM fonts (‘*flags’ is always zero). + using FT_Get_Var_Axis_FlagsProc = FT_Error (*)(FT_MM_Var*, FT_UInt, FT_UInt*); + FT_Get_Var_Axis_FlagsProc fGetVarAxisFlags; + private: FT_Library fLibrary; bool fIsLCDSupported; @@ -1546,18 +1572,21 @@ SkTypeface::LocalizedStrings* SkTypeface_FreeType::onCreateFamilyNameIterator() } int SkTypeface_FreeType::onGetVariationDesignPosition( - SkFontArguments::VariationPosition::Coordinate coordinates[], int coordinateCount) const + SkFontArguments::VariationPosition::Coordinate coordinates[], int coordinateCount) const { AutoFTAccess fta(this); FT_Face face = fta.face(); + if (!face) { + return -1; + } - if (!face || !(face->face_flags & FT_FACE_FLAG_MULTIPLE_MASTERS)) { + if (!(face->face_flags & FT_FACE_FLAG_MULTIPLE_MASTERS)) { return 0; } FT_MM_Var* variations = nullptr; if (FT_Get_MM_Var(face, &variations)) { - return 0; + return -1; } SkAutoFree autoFreeVariations(variations); @@ -1590,6 +1619,44 @@ int SkTypeface_FreeType::onGetVariationDesignPosition( return variations->num_axis; } +int SkTypeface_FreeType::onGetVariationDesignParameters( + SkFontParameters::Variation::Axis parameters[], int parameterCount) const +{ + AutoFTAccess fta(this); + FT_Face face = fta.face(); + if (!face) { + return -1; + } + + if (!(face->face_flags & FT_FACE_FLAG_MULTIPLE_MASTERS)) { + return 0; + } + + FT_MM_Var* variations = nullptr; + if (FT_Get_MM_Var(face, &variations)) { + return -1; + } + SkAutoFree autoFreeVariations(variations); + + if (!parameters || parameterCount < SkToInt(variations->num_axis)) { + return variations->num_axis; + } + + for (FT_UInt i = 0; i < variations->num_axis; ++i) { + parameters[i].tag = variations->axis[i].tag; + parameters[i].min = SkFixedToScalar(variations->axis[i].minimum); + parameters[i].def = SkFixedToScalar(variations->axis[i].def); + parameters[i].max = SkFixedToScalar(variations->axis[i].maximum); + FT_UInt flags = 0; + bool hidden = gFTLibrary->fGetVarAxisFlags && + !gFTLibrary->fGetVarAxisFlags(variations, i, &flags) && + (flags & FT_VAR_AXIS_FLAG_HIDDEN); + parameters[i].setHidden(hidden); + } + + return variations->num_axis; +} + int SkTypeface_FreeType::onGetTableTags(SkFontTableTag tags[]) const { AutoFTAccess fta(this); FT_Face face = fta.face(); diff --git a/src/ports/SkFontHost_FreeType_common.h b/src/ports/SkFontHost_FreeType_common.h index 1386775bb8..939aa4b643 100644 --- a/src/ports/SkFontHost_FreeType_common.h +++ b/src/ports/SkFontHost_FreeType_common.h @@ -107,6 +107,8 @@ protected: int onGetVariationDesignPosition(SkFontArguments::VariationPosition::Coordinate coordinates[], int coordinateCount) const override; + int onGetVariationDesignParameters(SkFontParameters::Variation::Axis parameters[], + int parameterCount) 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/src/ports/SkFontHost_win.cpp b/src/ports/SkFontHost_win.cpp index 264ae9226d..07d37aedfe 100644 --- a/src/ports/SkFontHost_win.cpp +++ b/src/ports/SkFontHost_win.cpp @@ -277,6 +277,11 @@ protected: { return -1; } + int onGetVariationDesignParameters(SkFontParameters::Variation::Axis parameters[], + int parameterCount) const override + { + return -1; + } int onGetTableTags(SkFontTableTag tags[]) const override; size_t onGetTableData(SkFontTableTag, size_t offset, size_t length, void* data) const override; }; 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); } } diff --git a/src/ports/SkTypeface_win_dw.h b/src/ports/SkTypeface_win_dw.h index 2d76b39adb..a671eb4855 100644 --- a/src/ports/SkTypeface_win_dw.h +++ b/src/ports/SkTypeface_win_dw.h @@ -117,6 +117,8 @@ protected: SkTypeface::LocalizedStrings* onCreateFamilyNameIterator() const override; int onGetVariationDesignPosition(SkFontArguments::VariationPosition::Coordinate coordinates[], int coordinateCount) const override; + int onGetVariationDesignParameters(SkFontParameters::Variation::Axis parameters[], + int parameterCount) 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 757f3a5e44..cc04fa24ce 100644 --- a/tests/TypefaceTest.cpp +++ b/tests/TypefaceTest.cpp @@ -226,6 +226,43 @@ DEF_TEST(Typeface, reporter) { REPORTER_ASSERT(reporter, SkTypeface::Equal(t2.get(), nullptr)); } +DEF_TEST(TypefaceAxesParameters, reporter) { + std::unique_ptr<SkStreamAsset> distortable(GetResourceAsStream("fonts/Distortable.ttf")); + if (!distortable) { + REPORT_FAILURE(reporter, "distortable", SkString()); + return; + } + constexpr int numberOfAxesInDistortable = 1; + constexpr SkScalar minAxisInDistortable = 0.5; + constexpr SkScalar defAxisInDistortable = 1; + constexpr SkScalar maxAxisInDistortable = 2; + constexpr bool axisIsHiddenInDistortable = false; + + sk_sp<SkFontMgr> fm = SkFontMgr::RefDefault(); + + SkFontArguments params; + sk_sp<SkTypeface> typeface = fm->makeFromStream(std::move(distortable), params); + + if (!typeface) { + // Not all SkFontMgr can makeFromStream(). + return; + } + + SkFontParameters::Variation::Axis parameter[numberOfAxesInDistortable]; + int count = typeface->getVariationDesignParameters(parameter, SK_ARRAY_COUNT(parameter)); + if (count == -1) { + return; + } + + REPORTER_ASSERT(reporter, count == SK_ARRAY_COUNT(parameter)); + REPORTER_ASSERT(reporter, parameter[0].min == minAxisInDistortable); + REPORTER_ASSERT(reporter, parameter[0].def == defAxisInDistortable); + REPORTER_ASSERT(reporter, parameter[0].max == maxAxisInDistortable); + REPORTER_ASSERT(reporter, parameter[0].tag == SkSetFourByteTag('w','g','h','t')); + REPORTER_ASSERT(reporter, parameter[0].isHidden() == axisIsHiddenInDistortable); + +} + namespace { class EmptyTypeface : public SkTypeface { @@ -264,6 +301,11 @@ protected: { return 0; } + int onGetVariationDesignParameters(SkFontParameters::Variation::Axis parameters[], + int parameterCount) const override + { + return 0; + } int onGetTableTags(SkFontTableTag tags[]) const override { return 0; } size_t onGetTableData(SkFontTableTag, size_t, size_t, void*) const override { return 0; } }; diff --git a/tools/fonts/SkRandomScalerContext.cpp b/tools/fonts/SkRandomScalerContext.cpp index c7cfbff9c3..d32fd62604 100644 --- a/tools/fonts/SkRandomScalerContext.cpp +++ b/tools/fonts/SkRandomScalerContext.cpp @@ -217,6 +217,12 @@ int SkRandomTypeface::onGetVariationDesignPosition( return fProxy->onGetVariationDesignPosition(coordinates, coordinateCount); } +int SkRandomTypeface::onGetVariationDesignParameters( + SkFontParameters::Variation::Axis parameters[], int parameterCount) const +{ + return fProxy->onGetVariationDesignParameters(parameters, parameterCount); +} + int SkRandomTypeface::onGetTableTags(SkFontTableTag tags[]) const { return fProxy->getTableTags(tags); } diff --git a/tools/fonts/SkRandomScalerContext.h b/tools/fonts/SkRandomScalerContext.h index 8eb8b99f52..42f6095ed7 100644 --- a/tools/fonts/SkRandomScalerContext.h +++ b/tools/fonts/SkRandomScalerContext.h @@ -43,6 +43,8 @@ protected: int onGetVariationDesignPosition(SkFontArguments::VariationPosition::Coordinate coordinates[], int coordinateCount) const override; + int onGetVariationDesignParameters(SkFontParameters::Variation::Axis parameters[], + int parameterCount) 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/tools/fonts/SkTestSVGTypeface.h b/tools/fonts/SkTestSVGTypeface.h index 2275c678a5..597ec33902 100644 --- a/tools/fonts/SkTestSVGTypeface.h +++ b/tools/fonts/SkTestSVGTypeface.h @@ -110,6 +110,12 @@ protected: return 0; } + int onGetVariationDesignParameters(SkFontParameters::Variation::Axis parameters[], + int parameterCount) const override + { + return 0; + } + int onGetTableTags(SkFontTableTag tags[]) const override { return 0; } diff --git a/tools/fonts/SkTestTypeface.h b/tools/fonts/SkTestTypeface.h index e5ca64ff9a..677874399b 100644 --- a/tools/fonts/SkTestTypeface.h +++ b/tools/fonts/SkTestTypeface.h @@ -104,6 +104,12 @@ protected: return 0; } + int onGetVariationDesignParameters(SkFontParameters::Variation::Axis parameters[], + int parameterCount) const override + { + return 0; + } + int onGetTableTags(SkFontTableTag tags[]) const override { return 0; } |