Loading gfx/thebes/gfxFont.cpp +8 −2 Original line number Diff line number Diff line Loading @@ -1378,6 +1378,7 @@ void gfxFont::CheckForFeaturesInvolvingSpace() const { flags = flags | gfxFontEntry::SpaceFeatures::HasFeatures; uint32_t index = static_cast<uint32_t>(s) >> 5; uint32_t bit = static_cast<uint32_t>(s) & 0x1f; MutexAutoLock lock(mFontEntry->mFeatureInfoLock); if (isDefaultFeature) { mFontEntry->mDefaultSubSpaceFeatures[index] |= (1 << bit); } else { Loading @@ -1391,9 +1392,12 @@ void gfxFont::CheckForFeaturesInvolvingSpace() const { // spaces in default features of default script? // ==> can't use word cache, skip GPOS analysis bool canUseWordCache = true; { MutexAutoLock lock(mFontEntry->mFeatureInfoLock); if (HasSubstitution(mFontEntry->mDefaultSubSpaceFeatures, Script::COMMON)) { canUseWordCache = false; } } // GPOS lookups - distinguish kerning from non-kerning features if (canUseWordCache && hb_ot_layout_has_positioning(face)) { Loading @@ -1411,6 +1415,7 @@ void gfxFont::CheckForFeaturesInvolvingSpace() const { } if (MOZ_UNLIKELY(log)) { MutexAutoLock lock(mFontEntry->mFeatureInfoLock); TimeDuration elapsed = TimeStamp::Now() - start; LOG_FONTINIT(( "(fontinit-spacelookups) font: %s - " Loading Loading @@ -1445,6 +1450,7 @@ bool gfxFont::HasSubstitutionRulesWithSpaceLookups(Script aRunScript) const { } // default features have space lookups ==> true MutexAutoLock lock(mFontEntry->mFeatureInfoLock); if (HasSubstitution(mFontEntry->mDefaultSubSpaceFeatures, Script::COMMON) || HasSubstitution(mFontEntry->mDefaultSubSpaceFeatures, aRunScript)) { return true; Loading gfx/thebes/gfxFontEntry.h +4 −3 Original line number Diff line number Diff line Loading @@ -592,9 +592,10 @@ class gfxFontEntry { // bitvector of substitution space features per script, one each // for default and non-default features uint32_t mDefaultSubSpaceFeatures[(int(Script::NUM_SCRIPT_CODES) + 31) / 32]; uint32_t mNonDefaultSubSpaceFeatures[(int(Script::NUM_SCRIPT_CODES) + 31) / 32]; uint32_t mDefaultSubSpaceFeatures[(int(Script::NUM_SCRIPT_CODES) + 31) / 32] MOZ_GUARDED_BY(mFeatureInfoLock); uint32_t mNonDefaultSubSpaceFeatures[(int(Script::NUM_SCRIPT_CODES) + 31) / 32] MOZ_GUARDED_BY(mFeatureInfoLock); mozilla::Atomic<uint32_t> mUVSOffset; Loading Loading
gfx/thebes/gfxFont.cpp +8 −2 Original line number Diff line number Diff line Loading @@ -1378,6 +1378,7 @@ void gfxFont::CheckForFeaturesInvolvingSpace() const { flags = flags | gfxFontEntry::SpaceFeatures::HasFeatures; uint32_t index = static_cast<uint32_t>(s) >> 5; uint32_t bit = static_cast<uint32_t>(s) & 0x1f; MutexAutoLock lock(mFontEntry->mFeatureInfoLock); if (isDefaultFeature) { mFontEntry->mDefaultSubSpaceFeatures[index] |= (1 << bit); } else { Loading @@ -1391,9 +1392,12 @@ void gfxFont::CheckForFeaturesInvolvingSpace() const { // spaces in default features of default script? // ==> can't use word cache, skip GPOS analysis bool canUseWordCache = true; { MutexAutoLock lock(mFontEntry->mFeatureInfoLock); if (HasSubstitution(mFontEntry->mDefaultSubSpaceFeatures, Script::COMMON)) { canUseWordCache = false; } } // GPOS lookups - distinguish kerning from non-kerning features if (canUseWordCache && hb_ot_layout_has_positioning(face)) { Loading @@ -1411,6 +1415,7 @@ void gfxFont::CheckForFeaturesInvolvingSpace() const { } if (MOZ_UNLIKELY(log)) { MutexAutoLock lock(mFontEntry->mFeatureInfoLock); TimeDuration elapsed = TimeStamp::Now() - start; LOG_FONTINIT(( "(fontinit-spacelookups) font: %s - " Loading Loading @@ -1445,6 +1450,7 @@ bool gfxFont::HasSubstitutionRulesWithSpaceLookups(Script aRunScript) const { } // default features have space lookups ==> true MutexAutoLock lock(mFontEntry->mFeatureInfoLock); if (HasSubstitution(mFontEntry->mDefaultSubSpaceFeatures, Script::COMMON) || HasSubstitution(mFontEntry->mDefaultSubSpaceFeatures, aRunScript)) { return true; Loading
gfx/thebes/gfxFontEntry.h +4 −3 Original line number Diff line number Diff line Loading @@ -592,9 +592,10 @@ class gfxFontEntry { // bitvector of substitution space features per script, one each // for default and non-default features uint32_t mDefaultSubSpaceFeatures[(int(Script::NUM_SCRIPT_CODES) + 31) / 32]; uint32_t mNonDefaultSubSpaceFeatures[(int(Script::NUM_SCRIPT_CODES) + 31) / 32]; uint32_t mDefaultSubSpaceFeatures[(int(Script::NUM_SCRIPT_CODES) + 31) / 32] MOZ_GUARDED_BY(mFeatureInfoLock); uint32_t mNonDefaultSubSpaceFeatures[(int(Script::NUM_SCRIPT_CODES) + 31) / 32] MOZ_GUARDED_BY(mFeatureInfoLock); mozilla::Atomic<uint32_t> mUVSOffset; Loading