Bug 1435984 - patch 3 - Store variation settings from the @font-face rule in the gfxFontEntry for user fonts. r=jwatt

--HG--
extra : source : 66947639ccc3236ff3e81b535e6a4e5173a8e05f
This commit is contained in:
Jonathan Kew 2018-02-14 22:02:05 +11:00
parent cdb40ca922
commit 5bb5607380
6 changed files with 50 additions and 6 deletions

View File

@ -413,6 +413,7 @@ public:
// list of gfxFonts that are using SVG glyphs
nsTArray<gfxFont*> mFontsUsingSVGGlyphs;
nsTArray<gfxFontFeature> mFeatureSettings;
nsTArray<gfxFontVariation> mVariationSettings;
mozilla::UniquePtr<nsDataHashtable<nsUint32HashKey,bool>> mSupportedFeatures;
mozilla::UniquePtr<nsDataHashtable<nsUint32HashKey,hb_set_t*>> mFeatureInputs;
uint32_t mLanguageOverride;

View File

@ -108,6 +108,7 @@ gfxUserFontEntry::gfxUserFontEntry(gfxUserFontSet* aFontSet,
int32_t aStretch,
uint8_t aStyle,
const nsTArray<gfxFontFeature>& aFeatureSettings,
const nsTArray<gfxFontVariation>& aVariationSettings,
uint32_t aLanguageOverride,
gfxCharacterMap* aUnicodeRanges,
uint8_t aFontDisplay)
@ -128,6 +129,7 @@ gfxUserFontEntry::gfxUserFontEntry(gfxUserFontSet* aFontSet,
mStretch = aStretch;
mStyle = aStyle;
mFeatureSettings.AppendElements(aFeatureSettings);
mVariationSettings.AppendElements(aVariationSettings);
mLanguageOverride = aLanguageOverride;
mCharacterMap = aUnicodeRanges;
}
@ -146,6 +148,7 @@ gfxUserFontEntry::Matches(const nsTArray<gfxFontFaceSrc>& aFontFaceSrcList,
int32_t aStretch,
uint8_t aStyle,
const nsTArray<gfxFontFeature>& aFeatureSettings,
const nsTArray<gfxFontVariation>& aVariationSettings,
uint32_t aLanguageOverride,
gfxCharacterMap* aUnicodeRanges,
uint8_t aFontDisplay)
@ -154,6 +157,7 @@ gfxUserFontEntry::Matches(const nsTArray<gfxFontFaceSrc>& aFontFaceSrcList,
mStretch == aStretch &&
mStyle == aStyle &&
mFeatureSettings == aFeatureSettings &&
mVariationSettings == aVariationSettings &&
mLanguageOverride == aLanguageOverride &&
mSrcList == aFontFaceSrcList &&
mFontDisplay == aFontDisplay &&
@ -518,6 +522,7 @@ gfxUserFontEntry::DoLoadNextSrc(bool aForceAsync)
NS_ConvertUTF16toUTF8(mFamilyName).get(),
uint32_t(mFontSet->mGeneration)));
fe->mFeatureSettings.AppendElements(mFeatureSettings);
fe->mVariationSettings.AppendElements(mVariationSettings);
fe->mLanguageOverride = mLanguageOverride;
fe->mFamilyName = mFamilyName;
// For src:local(), we don't care whether the request is from
@ -805,6 +810,7 @@ gfxUserFontEntry::LoadPlatformFont(const uint8_t* aFontData, uint32_t& aLength)
// copy OpenType feature/language settings from the userfont entry to the
// newly-created font entry
fe->mFeatureSettings.AppendElements(mFeatureSettings);
fe->mVariationSettings.AppendElements(mVariationSettings);
fe->mLanguageOverride = mLanguageOverride;
fe->mFamilyName = mFamilyName;
StoreUserFontData(fe, mFontSet->GetPrivateBrowsing(), originalFullName,
@ -943,6 +949,7 @@ gfxUserFontSet::FindOrCreateUserFontEntry(
int32_t aStretch,
uint8_t aStyle,
const nsTArray<gfxFontFeature>& aFeatureSettings,
const nsTArray<gfxFontVariation>& aVariationSettings,
uint32_t aLanguageOverride,
gfxCharacterMap* aUnicodeRanges,
uint8_t aFontDisplay)
@ -959,13 +966,14 @@ gfxUserFontSet::FindOrCreateUserFontEntry(
if (family) {
entry = FindExistingUserFontEntry(family, aFontFaceSrcList, aWeight,
aStretch, aStyle,
aFeatureSettings, aLanguageOverride,
aFeatureSettings, aVariationSettings,
aLanguageOverride,
aUnicodeRanges, aFontDisplay);
}
if (!entry) {
entry = CreateUserFontEntry(aFontFaceSrcList, aWeight, aStretch,
aStyle, aFeatureSettings,
aStyle, aFeatureSettings, aVariationSettings,
aLanguageOverride, aUnicodeRanges,
aFontDisplay);
entry->mFamilyName = aFamilyName;
@ -981,6 +989,7 @@ gfxUserFontSet::CreateUserFontEntry(
int32_t aStretch,
uint8_t aStyle,
const nsTArray<gfxFontFeature>& aFeatureSettings,
const nsTArray<gfxFontVariation>& aVariationSettings,
uint32_t aLanguageOverride,
gfxCharacterMap* aUnicodeRanges,
uint8_t aFontDisplay)
@ -988,7 +997,7 @@ gfxUserFontSet::CreateUserFontEntry(
RefPtr<gfxUserFontEntry> userFontEntry =
new gfxUserFontEntry(this, aFontFaceSrcList, aWeight,
aStretch, aStyle, aFeatureSettings,
aStretch, aStyle, aFeatureSettings, aVariationSettings,
aLanguageOverride, aUnicodeRanges, aFontDisplay);
return userFontEntry.forget();
}
@ -1001,6 +1010,7 @@ gfxUserFontSet::FindExistingUserFontEntry(
int32_t aStretch,
uint8_t aStyle,
const nsTArray<gfxFontFeature>& aFeatureSettings,
const nsTArray<gfxFontVariation>& aVariationSettings,
uint32_t aLanguageOverride,
gfxCharacterMap* aUnicodeRanges,
uint8_t aFontDisplay)
@ -1019,7 +1029,8 @@ gfxUserFontSet::FindExistingUserFontEntry(
static_cast<gfxUserFontEntry*>(fontList[i].get());
if (!existingUserFontEntry->Matches(aFontFaceSrcList,
aWeight, aStretch, aStyle,
aFeatureSettings, aLanguageOverride,
aFeatureSettings, aVariationSettings,
aLanguageOverride,
aUnicodeRanges, aFontDisplay)) {
continue;
}
@ -1186,6 +1197,7 @@ gfxUserFontSet::UserFontCache::Entry::KeyEquals(const KeyTypePointer aKey) const
mFontEntry->mWeight != fe->mWeight ||
mFontEntry->mStretch != fe->mStretch ||
mFontEntry->mFeatureSettings != fe->mFeatureSettings ||
mFontEntry->mVariationSettings != fe->mVariationSettings ||
mFontEntry->mLanguageOverride != fe->mLanguageOverride ||
mFontEntry->mFamilyName != fe->mFamilyName) {
return false;

View File

@ -220,6 +220,7 @@ public:
int32_t aStretch,
uint8_t aStyle,
const nsTArray<gfxFontFeature>& aFeatureSettings,
const nsTArray<gfxFontVariation>& aVariationSettings,
uint32_t aLanguageOverride,
gfxCharacterMap* aUnicodeRanges,
uint8_t aFontDisplay) = 0;
@ -233,6 +234,7 @@ public:
int32_t aStretch,
uint8_t aStyle,
const nsTArray<gfxFontFeature>& aFeatureSettings,
const nsTArray<gfxFontVariation>& aVariationSettings,
uint32_t aLanguageOverride,
gfxCharacterMap* aUnicodeRanges,
uint8_t aFontDisplay);
@ -423,6 +425,7 @@ public:
return mozilla::HashGeneric(principalHash + int(aKey->mPrivate),
aKey->mURI->Hash(),
HashFeatures(aKey->mFontEntry->mFeatureSettings),
HashVariations(aKey->mFontEntry->mVariationSettings),
mozilla::HashString(aKey->mFontEntry->mFamilyName),
(aKey->mFontEntry->mStyle |
(aKey->mFontEntry->mWeight << 2) |
@ -459,6 +462,12 @@ public:
aFeatures.Length() * sizeof(gfxFontFeature));
}
static uint32_t
HashVariations(const nsTArray<gfxFontVariation>& aVariations) {
return mozilla::HashBytes(aVariations.Elements(),
aVariations.Length() * sizeof(gfxFontVariation));
}
// An entry in mAllowedFontSets.
class LoadResultEntry : public nsPtrHashKey<gfxUserFontSet>
{
@ -566,6 +575,7 @@ protected:
int32_t aStretch,
uint8_t aStyle,
const nsTArray<gfxFontFeature>& aFeatureSettings,
const nsTArray<gfxFontVariation>& aVariationSettings,
uint32_t aLanguageOverride,
gfxCharacterMap* aUnicodeRanges,
uint8_t aFontDisplay);
@ -615,6 +625,7 @@ public:
int32_t aStretch,
uint8_t aStyle,
const nsTArray<gfxFontFeature>& aFeatureSettings,
const nsTArray<gfxFontVariation>& aVariationSettings,
uint32_t aLanguageOverride,
gfxCharacterMap* aUnicodeRanges,
uint8_t aFontDisplay);
@ -627,6 +638,7 @@ public:
int32_t aStretch,
uint8_t aStyle,
const nsTArray<gfxFontFeature>& aFeatureSettings,
const nsTArray<gfxFontVariation>& aVariationSettings,
uint32_t aLanguageOverride,
gfxCharacterMap* aUnicodeRanges,
uint8_t aFontDisplay);

View File

@ -50,11 +50,13 @@ public:
int32_t aStretch,
uint8_t aStyle,
const nsTArray<gfxFontFeature>& aFeatureSettings,
const nsTArray<gfxFontVariation>& aVariationSettings,
uint32_t aLanguageOverride,
gfxCharacterMap* aUnicodeRanges,
uint8_t aFontDisplay)
: gfxUserFontEntry(aFontSet, aFontFaceSrcList, aWeight, aStretch,
aStyle, aFeatureSettings, aLanguageOverride,
aStyle, aFeatureSettings, aVariationSettings,
aLanguageOverride,
aUnicodeRanges, aFontDisplay) {}
virtual void SetLoadState(UserFontLoadState aLoadState) override;

View File

@ -1102,6 +1102,19 @@ FontFaceSet::FindOrCreateUserFontEntryFromFontFace(const nsAString& aFamilyName,
"@font-face font-feature-settings has unexpected unit");
}
// set up font variations
nsTArray<gfxFontVariation> variationSettings;
aFontFace->GetDesc(eCSSFontDesc_FontVariationSettings, val);
unit = val.GetUnit();
if (unit == eCSSUnit_Normal) {
// empty list of variations
} else if (unit == eCSSUnit_PairList || unit == eCSSUnit_PairListDep) {
nsLayoutUtils::ComputeFontVariations(val.GetPairListValue(), variationSettings);
} else {
NS_ASSERTION(unit == eCSSUnit_Null,
"@font-face font-variation-settings has unexpected unit");
}
// set up font language override
aFontFace->GetDesc(eCSSFontDesc_FontLanguageOverride, val);
unit = val.GetUnit();
@ -1229,6 +1242,7 @@ FontFaceSet::FindOrCreateUserFontEntryFromFontFace(const nsAString& aFamilyName,
set->mUserFontSet->FindOrCreateUserFontEntry(aFamilyName, srcArray, weight,
stretch, italicStyle,
featureSettings,
variationSettings,
languageOverride,
unicodeRanges, fontDisplay);
return entry.forget();
@ -2001,13 +2015,15 @@ FontFaceSet::UserFontSet::CreateUserFontEntry(
int32_t aStretch,
uint8_t aStyle,
const nsTArray<gfxFontFeature>& aFeatureSettings,
const nsTArray<gfxFontVariation>& aVariationSettings,
uint32_t aLanguageOverride,
gfxCharacterMap* aUnicodeRanges,
uint8_t aFontDisplay)
{
RefPtr<gfxUserFontEntry> entry =
new FontFace::Entry(this, aFontFaceSrcList, aWeight, aStretch, aStyle,
aFeatureSettings, aLanguageOverride, aUnicodeRanges,
aFeatureSettings, aVariationSettings,
aLanguageOverride, aUnicodeRanges,
aFontDisplay);
return entry.forget();
}

View File

@ -100,6 +100,7 @@ public:
int32_t aStretch,
uint8_t aStyle,
const nsTArray<gfxFontFeature>& aFeatureSettings,
const nsTArray<gfxFontVariation>& aVariationSettings,
uint32_t aLanguageOverride,
gfxCharacterMap* aUnicodeRanges,
uint8_t aFontDisplay) override;