From 5bb5607380086d6fcfccd23f7f6aa659f082e43d Mon Sep 17 00:00:00 2001 From: Jonathan Kew Date: Wed, 14 Feb 2018 22:02:05 +1100 Subject: [PATCH] Bug 1435984 - patch 3 - Store variation settings from the @font-face rule in the gfxFontEntry for user fonts. r=jwatt --HG-- extra : source : 66947639ccc3236ff3e81b535e6a4e5173a8e05f --- gfx/thebes/gfxFontEntry.h | 1 + gfx/thebes/gfxUserFontSet.cpp | 20 ++++++++++++++++---- gfx/thebes/gfxUserFontSet.h | 12 ++++++++++++ layout/style/FontFace.h | 4 +++- layout/style/FontFaceSet.cpp | 18 +++++++++++++++++- layout/style/FontFaceSet.h | 1 + 6 files changed, 50 insertions(+), 6 deletions(-) diff --git a/gfx/thebes/gfxFontEntry.h b/gfx/thebes/gfxFontEntry.h index 42cc0be6e12b..728480e3a152 100644 --- a/gfx/thebes/gfxFontEntry.h +++ b/gfx/thebes/gfxFontEntry.h @@ -413,6 +413,7 @@ public: // list of gfxFonts that are using SVG glyphs nsTArray mFontsUsingSVGGlyphs; nsTArray mFeatureSettings; + nsTArray mVariationSettings; mozilla::UniquePtr> mSupportedFeatures; mozilla::UniquePtr> mFeatureInputs; uint32_t mLanguageOverride; diff --git a/gfx/thebes/gfxUserFontSet.cpp b/gfx/thebes/gfxUserFontSet.cpp index e38baaa38304..eacb5028d290 100644 --- a/gfx/thebes/gfxUserFontSet.cpp +++ b/gfx/thebes/gfxUserFontSet.cpp @@ -108,6 +108,7 @@ gfxUserFontEntry::gfxUserFontEntry(gfxUserFontSet* aFontSet, int32_t aStretch, uint8_t aStyle, const nsTArray& aFeatureSettings, + const nsTArray& 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& aFontFaceSrcList, int32_t aStretch, uint8_t aStyle, const nsTArray& aFeatureSettings, + const nsTArray& aVariationSettings, uint32_t aLanguageOverride, gfxCharacterMap* aUnicodeRanges, uint8_t aFontDisplay) @@ -154,6 +157,7 @@ gfxUserFontEntry::Matches(const nsTArray& 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& aFeatureSettings, + const nsTArray& 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& aFeatureSettings, + const nsTArray& aVariationSettings, uint32_t aLanguageOverride, gfxCharacterMap* aUnicodeRanges, uint8_t aFontDisplay) @@ -988,7 +997,7 @@ gfxUserFontSet::CreateUserFontEntry( RefPtr 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& aFeatureSettings, + const nsTArray& aVariationSettings, uint32_t aLanguageOverride, gfxCharacterMap* aUnicodeRanges, uint8_t aFontDisplay) @@ -1019,7 +1029,8 @@ gfxUserFontSet::FindExistingUserFontEntry( static_cast(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; diff --git a/gfx/thebes/gfxUserFontSet.h b/gfx/thebes/gfxUserFontSet.h index 661db4bebbd7..0bd07a82e3c4 100644 --- a/gfx/thebes/gfxUserFontSet.h +++ b/gfx/thebes/gfxUserFontSet.h @@ -220,6 +220,7 @@ public: int32_t aStretch, uint8_t aStyle, const nsTArray& aFeatureSettings, + const nsTArray& aVariationSettings, uint32_t aLanguageOverride, gfxCharacterMap* aUnicodeRanges, uint8_t aFontDisplay) = 0; @@ -233,6 +234,7 @@ public: int32_t aStretch, uint8_t aStyle, const nsTArray& aFeatureSettings, + const nsTArray& 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& aVariations) { + return mozilla::HashBytes(aVariations.Elements(), + aVariations.Length() * sizeof(gfxFontVariation)); + } + // An entry in mAllowedFontSets. class LoadResultEntry : public nsPtrHashKey { @@ -566,6 +575,7 @@ protected: int32_t aStretch, uint8_t aStyle, const nsTArray& aFeatureSettings, + const nsTArray& aVariationSettings, uint32_t aLanguageOverride, gfxCharacterMap* aUnicodeRanges, uint8_t aFontDisplay); @@ -615,6 +625,7 @@ public: int32_t aStretch, uint8_t aStyle, const nsTArray& aFeatureSettings, + const nsTArray& aVariationSettings, uint32_t aLanguageOverride, gfxCharacterMap* aUnicodeRanges, uint8_t aFontDisplay); @@ -627,6 +638,7 @@ public: int32_t aStretch, uint8_t aStyle, const nsTArray& aFeatureSettings, + const nsTArray& aVariationSettings, uint32_t aLanguageOverride, gfxCharacterMap* aUnicodeRanges, uint8_t aFontDisplay); diff --git a/layout/style/FontFace.h b/layout/style/FontFace.h index cb00e297bb20..5f3658587993 100644 --- a/layout/style/FontFace.h +++ b/layout/style/FontFace.h @@ -50,11 +50,13 @@ public: int32_t aStretch, uint8_t aStyle, const nsTArray& aFeatureSettings, + const nsTArray& 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; diff --git a/layout/style/FontFaceSet.cpp b/layout/style/FontFaceSet.cpp index 5a570cb67178..b82179cfe860 100644 --- a/layout/style/FontFaceSet.cpp +++ b/layout/style/FontFaceSet.cpp @@ -1102,6 +1102,19 @@ FontFaceSet::FindOrCreateUserFontEntryFromFontFace(const nsAString& aFamilyName, "@font-face font-feature-settings has unexpected unit"); } + // set up font variations + nsTArray 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& aFeatureSettings, + const nsTArray& aVariationSettings, uint32_t aLanguageOverride, gfxCharacterMap* aUnicodeRanges, uint8_t aFontDisplay) { RefPtr entry = new FontFace::Entry(this, aFontFaceSrcList, aWeight, aStretch, aStyle, - aFeatureSettings, aLanguageOverride, aUnicodeRanges, + aFeatureSettings, aVariationSettings, + aLanguageOverride, aUnicodeRanges, aFontDisplay); return entry.forget(); } diff --git a/layout/style/FontFaceSet.h b/layout/style/FontFaceSet.h index 658da6368b92..746580481e34 100644 --- a/layout/style/FontFaceSet.h +++ b/layout/style/FontFaceSet.h @@ -100,6 +100,7 @@ public: int32_t aStretch, uint8_t aStyle, const nsTArray& aFeatureSettings, + const nsTArray& aVariationSettings, uint32_t aLanguageOverride, gfxCharacterMap* aUnicodeRanges, uint8_t aFontDisplay) override;