mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-03 12:35:58 +00:00
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:
parent
cdb40ca922
commit
5bb5607380
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user