Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
Public Member Functions | Static Public Member Functions | Static Public Attributes | Protected Member Functions | List of all members
SkTypeface_Fontations Class Reference

#include <SkTypeface_fontations_priv.h>

Inheritance diagram for SkTypeface_Fontations:
SkTypeface SkWeakRefCnt SkRefCnt SkRefCntBase

Public Member Functions

const fontations_ffi::BridgeFontRef & getBridgeFontRef ()
 
const fontations_ffi::BridgeNormalizedCoords & getBridgeNormalizedCoords ()
 
const fontations_ffi::BridgeOutlineCollection & getOutlines ()
 
SkSpan< SkColorgetPalette ()
 
- Public Member Functions inherited from SkTypeface
SkFontStyle fontStyle () const
 
bool isBold () const
 
bool isItalic () const
 
bool isFixedPitch () const
 
int getVariationDesignPosition (SkFontArguments::VariationPosition::Coordinate coordinates[], int coordinateCount) const
 
int getVariationDesignParameters (SkFontParameters::Variation::Axis parameters[], int parameterCount) const
 
SkTypefaceID uniqueID () const
 
sk_sp< SkTypefacemakeClone (const SkFontArguments &) const
 
void serialize (SkWStream *, SerializeBehavior=SerializeBehavior::kIncludeDataIfLocal) const
 
sk_sp< SkDataserialize (SerializeBehavior=SerializeBehavior::kIncludeDataIfLocal) const
 
void unicharsToGlyphs (const SkUnichar uni[], int count, SkGlyphID glyphs[]) const
 
int textToGlyphs (const void *text, size_t byteLength, SkTextEncoding encoding, SkGlyphID glyphs[], int maxGlyphCount) const
 
SkGlyphID unicharToGlyph (SkUnichar unichar) const
 
int countGlyphs () const
 
int countTables () const
 
int getTableTags (SkFontTableTag tags[]) const
 
size_t getTableSize (SkFontTableTag) const
 
size_t getTableData (SkFontTableTag tag, size_t offset, size_t length, void *data) const
 
sk_sp< SkDatacopyTableData (SkFontTableTag tag) const
 
int getUnitsPerEm () const
 
bool getKerningPairAdjustments (const SkGlyphID glyphs[], int count, int32_t adjustments[]) const
 
LocalizedStringscreateFamilyNameIterator () const
 
void getFamilyName (SkString *name) const
 
bool getPostScriptName (SkString *name) const
 
std::unique_ptr< SkStreamAssetopenStream (int *ttcIndex) const
 
std::unique_ptr< SkStreamAssetopenExistingStream (int *ttcIndex) const
 
std::unique_ptr< SkScalerContextcreateScalerContext (const SkScalerContextEffects &, const SkDescriptor *) const
 
SkRect getBounds () const
 
void filterRec (SkScalerContextRec *rec) const
 
void getFontDescriptor (SkFontDescriptor *desc, bool *isLocal) const
 
void * internal_private_getCTFontRef () const
 
- Public Member Functions inherited from SkWeakRefCnt
 SkWeakRefCnt ()
 
 ~SkWeakRefCnt () override
 
bool try_ref () const
 
void weak_ref () const
 
void weak_unref () const
 
bool weak_expired () const
 
- Public Member Functions inherited from SkRefCntBase
 SkRefCntBase ()
 
virtual ~SkRefCntBase ()
 
bool unique () const
 
void ref () const
 
void unref () const
 

Static Public Member Functions

static sk_sp< SkTypefaceMakeFromData (sk_sp< SkData > fontData, const SkFontArguments &)
 
static sk_sp< SkTypefaceMakeFromStream (std::unique_ptr< SkStreamAsset >, const SkFontArguments &)
 
- Static Public Member Functions inherited from SkTypeface
static bool Equal (const SkTypeface *facea, const SkTypeface *faceb)
 
static sk_sp< SkTypefaceMakeEmpty ()
 
static sk_sp< SkTypefaceMakeDeserialize (SkStream *, sk_sp< SkFontMgr > lastResortMgr)
 
static void Register (FactoryId id, sk_sp< SkTypeface >(*make)(std::unique_ptr< SkStreamAsset >, const SkFontArguments &))
 

Static Public Attributes

static constexpr SkTypeface::FactoryId FactoryId = SkSetFourByteTag('f', 'n', 't', 'a')
 

Protected Member Functions

std::unique_ptr< SkStreamAssetonOpenStream (int *ttcIndex) const override
 
sk_sp< SkTypefaceonMakeClone (const SkFontArguments &args) const override
 
std::unique_ptr< SkScalerContextonCreateScalerContext (const SkScalerContextEffects &effects, const SkDescriptor *desc) const override
 
void onFilterRec (SkScalerContextRec *) const override
 
std::unique_ptr< SkAdvancedTypefaceMetricsonGetAdvancedMetrics () const override
 
void onGetFontDescriptor (SkFontDescriptor *, bool *) const override
 
void onCharsToGlyphs (const SkUnichar *chars, int count, SkGlyphID glyphs[]) const override
 
int onCountGlyphs () const override
 
void getPostScriptGlyphNames (SkString *) const override
 
void getGlyphToUnicodeMap (SkUnichar *) const override
 
int onGetUPEM () const override
 
void onGetFamilyName (SkString *familyName) const override
 
bool onGetPostScriptName (SkString *) const override
 
SkTypeface::LocalizedStringsonCreateFamilyNameIterator () const override
 
bool onGlyphMaskNeedsCurrentColor () 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, size_t, void *) const override
 
- Protected Member Functions inherited from SkTypeface
 SkTypeface (const SkFontStyle &style, bool isFixedPitch=false)
 
 ~SkTypeface () override
 
void setIsFixedPitch (bool isFixedPitch)
 
void setFontStyle (SkFontStyle style)
 
virtual std::unique_ptr< SkStreamAssetonOpenExistingStream (int *ttcIndex) const
 
virtual bool onGetKerningPairAdjustments (const SkGlyphID glyphs[], int count, int32_t adjustments[]) const
 
virtual sk_sp< SkDataonCopyTableData (SkFontTableTag) const
 
virtual bool onComputeBounds (SkRect *) const
 
virtual void * onGetCTFontRef () const
 
- Protected Member Functions inherited from SkWeakRefCnt
virtual void weak_dispose () const
 

Additional Inherited Members

- Public Types inherited from SkTypeface
enum class  SerializeBehavior { kDoIncludeData , kDontIncludeData , kIncludeDataIfLocal }
 
using FactoryId = SkFourByteTag
 

Detailed Description

SkTypeface implementation based on Google Fonts Fontations Rust libraries.

Definition at line 205 of file SkTypeface_fontations_priv.h.

Member Function Documentation

◆ getBridgeFontRef()

const fontations_ffi::BridgeFontRef & SkTypeface_Fontations::getBridgeFontRef ( )
inline

Definition at line 217 of file SkTypeface_fontations_priv.h.

217{ return *fBridgeFontRef; }

◆ getBridgeNormalizedCoords()

const fontations_ffi::BridgeNormalizedCoords & SkTypeface_Fontations::getBridgeNormalizedCoords ( )
inline

Definition at line 218 of file SkTypeface_fontations_priv.h.

218 {
219 return *fBridgeNormalizedCoords;
220 }

◆ getGlyphToUnicodeMap()

void SkTypeface_Fontations::getGlyphToUnicodeMap ( SkUnichar codepointForGlyphMap) const
overrideprotectedvirtual

Implements SkTypeface.

Definition at line 295 of file SkTypeface_fontations.cpp.

295 {
296 size_t numGlyphs = SkToSizeT(onCountGlyphs());
297 if (!codepointForGlyphMap) {
298 SkASSERT(numGlyphs == 0);
299 }
300 rust::Slice<uint32_t> codepointForGlyphSlice{reinterpret_cast<uint32_t*>(codepointForGlyphMap),
301 numGlyphs};
302 fontations_ffi::fill_glyph_to_unicode_map(*fBridgeFontRef, codepointForGlyphSlice);
303}
#define SkASSERT(cond)
Definition SkAssert.h:116
constexpr size_t SkToSizeT(S x)
Definition SkTo.h:31
int onCountGlyphs() const override

◆ getOutlines()

const fontations_ffi::BridgeOutlineCollection & SkTypeface_Fontations::getOutlines ( )
inline

Definition at line 221 of file SkTypeface_fontations_priv.h.

221{ return *fOutlines; }

◆ getPalette()

SkSpan< SkColor > SkTypeface_Fontations::getPalette ( )
inline

Definition at line 222 of file SkTypeface_fontations_priv.h.

222 {
223 return SkSpan<SkColor>(reinterpret_cast<SkColor*>(fPalette.data()), fPalette.size());
224 }
uint32_t SkColor
Definition SkColor.h:37

◆ getPostScriptGlyphNames()

void SkTypeface_Fontations::getPostScriptGlyphNames ( SkString ) const
inlineoverrideprotectedvirtual

Implements SkTypeface.

Definition at line 241 of file SkTypeface_fontations_priv.h.

241{}

◆ MakeFromData()

sk_sp< SkTypeface > SkTypeface_Fontations::MakeFromData ( sk_sp< SkData fontData,
const SkFontArguments args 
)
static

Definition at line 109 of file SkTypeface_fontations.cpp.

110 {
111 uint32_t ttcIndex = args.getCollectionIndex();
112 rust::Box<fontations_ffi::BridgeFontRef> bridgeFontRef = make_bridge_font_ref(data, ttcIndex);
113 if (!fontations_ffi::font_ref_is_valid(*bridgeFontRef)) {
114 return nullptr;
115 }
116
117 SkFontStyle style;
118 fontations_ffi::BridgeFontStyle fontStyle;
119 if (fontations_ffi::get_font_style(*bridgeFontRef, fontStyle)) {
122 static_cast<SkFontStyle::Slant>(fontStyle.slant));
123 }
124 rust::Box<fontations_ffi::BridgeMappingIndex> mappingIndex =
125 fontations_ffi::make_mapping_index(*bridgeFontRef);
126
127 SkFontArguments::VariationPosition variationPosition = args.getVariationDesignPosition();
128 std::unique_ptr<SkFontArguments::VariationPosition::Coordinate[]> concatenatedCoords = nullptr;
129 // Handle FreeType behaviour of upper 15 bits of collection index
130 // representing a named instance choice. If so, prepopulate the variation
131 // coordinates with the values from the named instance and append the user
132 // coordinates after that so they can override the named instance's
133 // coordinates.
134 if (args.getCollectionIndex() & 0xFFFF0000) {
135 size_t numNamedInstanceCoords =
136 fontations_ffi::coordinates_for_shifted_named_instance_index(
137 *bridgeFontRef,
138 args.getCollectionIndex(),
139 rust::cxxbridge1::Slice<fontations_ffi::SkiaDesignCoordinate>());
140 concatenatedCoords.reset(
142 [numNamedInstanceCoords + variationPosition.coordinateCount]);
143
144 rust::cxxbridge1::Slice<fontations_ffi::SkiaDesignCoordinate> targetSlice(
145 reinterpret_cast<fontations_ffi::SkiaDesignCoordinate*>(concatenatedCoords.get()),
146 numNamedInstanceCoords);
147 size_t retrievedNamedInstanceCoords =
148 fontations_ffi::coordinates_for_shifted_named_instance_index(
149 *bridgeFontRef, args.getCollectionIndex(), targetSlice);
150 if (numNamedInstanceCoords != retrievedNamedInstanceCoords) {
151 return nullptr;
152 }
153 for (int i = 0; i < variationPosition.coordinateCount; ++i) {
154 concatenatedCoords[numNamedInstanceCoords + i] = variationPosition.coordinates[i];
155 }
156 variationPosition.coordinateCount += numNamedInstanceCoords;
157 variationPosition.coordinates = concatenatedCoords.get();
158 }
159
160 rust::Box<fontations_ffi::BridgeNormalizedCoords> normalizedCoords =
161 make_normalized_coords(*bridgeFontRef, variationPosition);
162 rust::Box<fontations_ffi::BridgeOutlineCollection> outlines =
163 fontations_ffi::get_outline_collection(*bridgeFontRef);
164
165 rust::Slice<const fontations_ffi::PaletteOverride> paletteOverrides(
166 reinterpret_cast<const ::fontations_ffi::PaletteOverride*>(args.getPalette().overrides),
167 args.getPalette().overrideCount);
168 rust::Vec<uint32_t> palette =
169 resolve_palette(*bridgeFontRef, args.getPalette().index, paletteOverrides);
170
172 style,
173 ttcIndex,
174 std::move(bridgeFontRef),
175 std::move(mappingIndex),
176 std::move(normalizedCoords),
177 std::move(outlines),
178 std::move(palette)));
179}
Slant slant() const
Definition SkFontStyle.h:64
int width() const
Definition SkFontStyle.h:63
int weight() const
Definition SkFontStyle.h:62
SkFontStyle fontStyle() const
Definition SkTypeface.h:55
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args

◆ MakeFromStream()

sk_sp< SkTypeface > SkTypeface_Fontations::MakeFromStream ( std::unique_ptr< SkStreamAsset stream,
const SkFontArguments args 
)
static

Definition at line 104 of file SkTypeface_fontations.cpp.

105 {
106 return MakeFromData(streamToData(stream), args);
107}
static sk_sp< SkTypeface > MakeFromData(sk_sp< SkData > fontData, const SkFontArguments &)

◆ onCharsToGlyphs()

void SkTypeface_Fontations::onCharsToGlyphs ( const SkUnichar chars,
int  count,
SkGlyphID  glyphs[] 
) const
overrideprotectedvirtual

Implements SkTypeface.

Definition at line 282 of file SkTypeface_fontations.cpp.

284 {
285 sk_bzero(glyphs, count * sizeof(glyphs[0]));
286
287 for (int i = 0; i < count; ++i) {
288 glyphs[i] = fontations_ffi::lookup_glyph_or_zero(*fBridgeFontRef, *fMappingIndex, chars[i]);
289 }
290}
uint16_t glyphs[5]
int count
static void sk_bzero(void *buffer, size_t size)
Definition SkMalloc.h:105

◆ onCountGlyphs()

int SkTypeface_Fontations::onCountGlyphs ( ) const
overrideprotectedvirtual

Implements SkTypeface.

Definition at line 291 of file SkTypeface_fontations.cpp.

291 {
292 return fontations_ffi::num_glyphs(*fBridgeFontRef);
293}

◆ onCreateFamilyNameIterator()

SkTypeface::LocalizedStrings * SkTypeface_Fontations::onCreateFamilyNameIterator ( ) const
overrideprotectedvirtual

Returns an iterator over the family names in the font.

Implements SkTypeface.

Definition at line 330 of file SkTypeface_fontations.cpp.

330 {
331 return new SkrifaLocalizedStrings(fontations_ffi::get_localized_strings(*fBridgeFontRef));
332}

◆ onCreateScalerContext()

std::unique_ptr< SkScalerContext > SkTypeface_Fontations::onCreateScalerContext ( const SkScalerContextEffects effects,
const SkDescriptor desc 
) const
overrideprotectedvirtual

Implements SkTypeface.

Definition at line 818 of file SkTypeface_fontations.cpp.

819 {
820 return std::make_unique<SkFontationsScalerContext>(
821 sk_ref_sp(const_cast<SkTypeface_Fontations*>(this)), effects, desc);
822}
sk_sp< T > sk_ref_sp(T *obj)
Definition SkRefCnt.h:381

◆ onFilterRec()

void SkTypeface_Fontations::onFilterRec ( SkScalerContextRec rec) const
overrideprotectedvirtual

Implements SkTypeface.

Definition at line 305 of file SkTypeface_fontations.cpp.

305 {
307}
@ kNone
glyph outlines unchanged
void setHinting(SkFontHinting)

◆ onGetAdvancedMetrics()

std::unique_ptr< SkAdvancedTypefaceMetrics > SkTypeface_Fontations::onGetAdvancedMetrics ( ) const
overrideprotectedvirtual

Implements SkTypeface.

Definition at line 824 of file SkTypeface_fontations.cpp.

824 {
825 std::unique_ptr<SkAdvancedTypefaceMetrics> info(new SkAdvancedTypefaceMetrics);
826
827 if (!fontations_ffi::is_embeddable(*fBridgeFontRef)) {
829 }
830
831 if (!fontations_ffi::is_subsettable(*fBridgeFontRef)) {
833 }
834
835 if (fontations_ffi::table_data(
836 *fBridgeFontRef, SkSetFourByteTag('f', 'v', 'a', 'r'), 0, rust::Slice<uint8_t>())) {
838 }
839
840 // Metrics information.
841 fontations_ffi::Metrics metrics =
842 fontations_ffi::get_unscaled_metrics(*fBridgeFontRef, *fBridgeNormalizedCoords);
843 info->fAscent = metrics.ascent;
844 info->fDescent = metrics.descent;
845 info->fCapHeight = metrics.cap_height;
846
847 info->fBBox = SkIRect::MakeLTRB((int32_t)metrics.x_min,
848 (int32_t)metrics.top,
849 (int32_t)metrics.x_max,
850 (int32_t)metrics.bottom);
851
852 // Style information.
853 if (fontations_ffi::is_fixed_pitch(*fBridgeFontRef)) {
855 }
856
857 fontations_ffi::BridgeFontStyle fontStyle;
858 if (fontations_ffi::get_font_style(*fBridgeFontRef, fontStyle)) {
861 }
862 }
863
864 if (fontations_ffi::is_serif_style(*fBridgeFontRef)) {
866 } else if (fontations_ffi::is_script_style(*fBridgeFontRef)) {
868 }
869
870 info->fItalicAngle = fontations_ffi::italic_angle(*fBridgeFontRef);
871
872 return info;
873}
static void info(const char *fmt,...) SK_PRINTF_LIKE(1
Definition DM.cpp:213
static constexpr SkFourByteTag SkSetFourByteTag(char a, char b, char c, char d)
Definition SkTypes.h:167
@ kNotEmbeddable_FontFlag
May not be embedded.
@ kNotSubsettable_FontFlag
May not be subset.
@ kVariable_FontFlag
May be true for Type1, CFF, or TrueType fonts.
static constexpr SkIRect MakeLTRB(int32_t l, int32_t t, int32_t r, int32_t b)
Definition SkRect.h:91

◆ onGetFamilyName()

void SkTypeface_Fontations::onGetFamilyName ( SkString familyName) const
overrideprotectedvirtual

Returns the family name of the typeface as known by its font manager. This name may or may not be produced by the family name iterator.

Implements SkTypeface.

Definition at line 257 of file SkTypeface_fontations.cpp.

257 {
258 rust::String readFamilyName = fontations_ffi::family_name(*fBridgeFontRef);
259 *familyName = SkString(readFamilyName.data(), readFamilyName.size());
260}

◆ onGetFontDescriptor()

void SkTypeface_Fontations::onGetFontDescriptor ( SkFontDescriptor desc,
bool *  serialize 
) const
overrideprotectedvirtual

Implements SkTypeface.

Definition at line 875 of file SkTypeface_fontations.cpp.

875 {
876 SkString familyName;
877 onGetFamilyName(&familyName);
878 desc->setFamilyName(familyName.c_str());
879 desc->setStyle(this->fontStyle());
880 desc->setFactoryId(FactoryId);
881 *serialize = true;
882}
void setFactoryId(SkTypeface::FactoryId factoryId)
const char * c_str() const
Definition SkString.h:133
static constexpr SkTypeface::FactoryId FactoryId
void onGetFamilyName(SkString *familyName) const override
void serialize(SkWStream *, SerializeBehavior=SerializeBehavior::kIncludeDataIfLocal) const

◆ onGetPostScriptName()

bool SkTypeface_Fontations::onGetPostScriptName ( SkString postscriptName) const
overrideprotectedvirtual

Implements SkTypeface.

Definition at line 262 of file SkTypeface_fontations.cpp.

262 {
263 rust::String readPsName;
264 if (fontations_ffi::postscript_name(*fBridgeFontRef, readPsName)) {
265 if (postscriptName) {
266 *postscriptName = SkString(readPsName.data(), readPsName.size());
267 }
268 return true;
269 }
270
271 return false;
272}

◆ onGetTableData()

size_t SkTypeface_Fontations::onGetTableData ( SkFontTableTag  tag,
size_t  offset,
size_t  length,
void *  data 
) const
overrideprotectedvirtual

Implements SkTypeface.

Definition at line 884 of file SkTypeface_fontations.cpp.

887 {
888 rust::Slice<uint8_t> dataSlice;
889 if (data) {
890 dataSlice = rust::Slice<uint8_t>(reinterpret_cast<uint8_t*>(data), length);
891 }
892 size_t copied = fontations_ffi::table_data(*fBridgeFontRef, tag, offset, dataSlice);
893 // If data is nullptr, the Rust side doesn't see a length limit.
894 return std::min(copied, length);
895}
size_t length
Point offset

◆ onGetTableTags()

int SkTypeface_Fontations::onGetTableTags ( SkFontTableTag  tags[]) const
overrideprotectedvirtual

Implements SkTypeface.

Definition at line 897 of file SkTypeface_fontations.cpp.

897 {
898 uint16_t numTables = fontations_ffi::table_tags(*fBridgeFontRef, rust::Slice<uint32_t>());
899 if (!tags) {
900 return numTables;
901 }
902 rust::Slice<uint32_t> copyToTags(tags, numTables);
903 return fontations_ffi::table_tags(*fBridgeFontRef, copyToTags);
904}

◆ onGetUPEM()

int SkTypeface_Fontations::onGetUPEM ( ) const
overrideprotectedvirtual

Implements SkTypeface.

Definition at line 253 of file SkTypeface_fontations.cpp.

253 {
254 return fontations_ffi::units_per_em_or_zero(*fBridgeFontRef);
255}

◆ onGetVariationDesignParameters()

int SkTypeface_Fontations::onGetVariationDesignParameters ( SkFontParameters::Variation::Axis  parameters[],
int  parameterCount 
) const
overrideprotectedvirtual

Implements SkTypeface.

Definition at line 917 of file SkTypeface_fontations.cpp.

918 {
919 sk_fontations::AxisWrapper axisWrapper(parameters, parameterCount);
920 return fontations_ffi::populate_axes(*fBridgeFontRef, axisWrapper);
921}

◆ onGetVariationDesignPosition()

int SkTypeface_Fontations::onGetVariationDesignPosition ( SkFontArguments::VariationPosition::Coordinate  coordinates[],
int  coordinateCount 
) const
overrideprotectedvirtual

Implements SkTypeface.

Definition at line 906 of file SkTypeface_fontations.cpp.

907 {
908 rust::Slice<fontations_ffi::SkiaDesignCoordinate> copyToCoordinates;
909 if (coordinates) {
910 copyToCoordinates = rust::Slice<fontations_ffi::SkiaDesignCoordinate>(
911 reinterpret_cast<fontations_ffi::SkiaDesignCoordinate*>(coordinates),
912 coordinateCount);
913 }
914 return fontations_ffi::variation_position(*fBridgeNormalizedCoords, copyToCoordinates);
915}

◆ onGlyphMaskNeedsCurrentColor()

bool SkTypeface_Fontations::onGlyphMaskNeedsCurrentColor ( ) const
overrideprotectedvirtual

Implements SkTypeface.

Definition at line 274 of file SkTypeface_fontations.cpp.

274 {
275 fGlyphMasksMayNeedCurrentColorOnce([this] {
276 static constexpr SkFourByteTag COLRTag = SkSetFourByteTag('C', 'O', 'L', 'R');
277 fGlyphMasksMayNeedCurrentColor = this->getTableSize(COLRTag) > 0;
278 });
279 return fGlyphMasksMayNeedCurrentColor;
280}
uint32_t SkFourByteTag
Definition SkTypes.h:166
size_t getTableSize(SkFontTableTag) const

◆ onMakeClone()

sk_sp< SkTypeface > SkTypeface_Fontations::onMakeClone ( const SkFontArguments args) const
overrideprotectedvirtual

Implements SkTypeface.

Definition at line 767 of file SkTypeface_fontations.cpp.

767 {
768 // Matching DWrite implementation, return self if ttc index mismatches.
769 if (fTtcIndex != SkTo<uint32_t>(args.getCollectionIndex())) {
770 return sk_ref_sp(this);
771 }
772
773 int numAxes = onGetVariationDesignPosition(nullptr, 0);
774 auto fusedDesignPosition =
775 std::make_unique<SkFontArguments::VariationPosition::Coordinate[]>(numAxes);
776 int retrievedAxes = onGetVariationDesignPosition(fusedDesignPosition.get(), numAxes);
777 if (numAxes != retrievedAxes) {
778 return nullptr;
779 }
780
781 // We know the internally retrieved axes are normalized, contain a value for every possible
782 // axis, other axes do not exist, so we only need to override any of those.
783 for (int i = 0; i < numAxes; ++i) {
784 const SkFontArguments::VariationPosition& argPosition = args.getVariationDesignPosition();
785 for (int j = 0; j < argPosition.coordinateCount; ++j) {
786 if (fusedDesignPosition[i].axis == argPosition.coordinates[j].axis) {
787 fusedDesignPosition[i].value = argPosition.coordinates[j].value;
788 }
789 }
790 }
791
792 SkFontArguments fusedArgs;
793 fusedArgs.setVariationDesignPosition({fusedDesignPosition.get(), SkToInt(numAxes)});
794 fusedArgs.setPalette(args.getPalette());
795
796 rust::cxxbridge1::Box<fontations_ffi::BridgeNormalizedCoords> normalized_args =
797 make_normalized_coords(*fBridgeFontRef, fusedArgs.getVariationDesignPosition());
798
799 if (!fontations_ffi::normalized_coords_equal(*normalized_args, *fBridgeNormalizedCoords)) {
800 return MakeFromData(fFontData, fusedArgs);
801 }
802
803 // TODO(crbug.com/skia/330149870): Palette differences are not fused, see DWrite backend impl.
804 rust::Slice<const fontations_ffi::PaletteOverride> argPaletteOverrides(
805 reinterpret_cast<const fontations_ffi::PaletteOverride*>(args.getPalette().overrides),
806 args.getPalette().overrideCount);
807 rust::Vec<uint32_t> newPalette =
808 resolve_palette(*fBridgeFontRef, args.getPalette().index, argPaletteOverrides);
809
810 if (fPalette.size() != newPalette.size() ||
811 memcmp(fPalette.data(), newPalette.data(), fPalette.size() * sizeof(fPalette[0]))) {
812 return MakeFromData(fFontData, fusedArgs);
813 }
814
815 return sk_ref_sp(this);
816}
constexpr int SkToInt(S x)
Definition SkTo.h:29
int onGetVariationDesignPosition(SkFontArguments::VariationPosition::Coordinate coordinates[], int coordinateCount) const override
SkFontArguments & setVariationDesignPosition(VariationPosition position)
SkFontArguments & setPalette(Palette palette)
VariationPosition getVariationDesignPosition() const

◆ onOpenStream()

std::unique_ptr< SkStreamAsset > SkTypeface_Fontations::onOpenStream ( int ttcIndex) const
overrideprotectedvirtual

Implements SkTypeface.

Definition at line 762 of file SkTypeface_fontations.cpp.

762 {
763 *ttcIndex = fTtcIndex;
764 return std::make_unique<SkMemoryStream>(fFontData);
765}

Member Data Documentation

◆ FactoryId

constexpr SkTypeface::FactoryId SkTypeface_Fontations::FactoryId = SkSetFourByteTag('f', 'n', 't', 'a')
staticconstexpr

Definition at line 226 of file SkTypeface_fontations_priv.h.


The documentation for this class was generated from the following files: