summaryrefslogtreecommitdiff
path: root/gfx/thebes/gfxPlatformFontList.h
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/thebes/gfxPlatformFontList.h')
-rw-r--r--gfx/thebes/gfxPlatformFontList.h482
1 files changed, 0 insertions, 482 deletions
diff --git a/gfx/thebes/gfxPlatformFontList.h b/gfx/thebes/gfxPlatformFontList.h
deleted file mode 100644
index d77c12059..000000000
--- a/gfx/thebes/gfxPlatformFontList.h
+++ /dev/null
@@ -1,482 +0,0 @@
-/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*-
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#ifndef GFXPLATFORMFONTLIST_H_
-#define GFXPLATFORMFONTLIST_H_
-
-#include "nsDataHashtable.h"
-#include "nsRefPtrHashtable.h"
-#include "nsTHashtable.h"
-
-#include "gfxFontUtils.h"
-#include "gfxFontInfoLoader.h"
-#include "gfxFont.h"
-#include "gfxFontConstants.h"
-#include "gfxPlatform.h"
-#include "gfxFontFamilyList.h"
-
-#include "nsIMemoryReporter.h"
-#include "mozilla/Attributes.h"
-#include "mozilla/MemoryReporting.h"
-#include "mozilla/RangedArray.h"
-#include "nsILanguageAtomService.h"
-
-class CharMapHashKey : public PLDHashEntryHdr
-{
-public:
- typedef gfxCharacterMap* KeyType;
- typedef const gfxCharacterMap* KeyTypePointer;
-
- explicit CharMapHashKey(const gfxCharacterMap *aCharMap) :
- mCharMap(const_cast<gfxCharacterMap*>(aCharMap))
- {
- MOZ_COUNT_CTOR(CharMapHashKey);
- }
- CharMapHashKey(const CharMapHashKey& toCopy) :
- mCharMap(toCopy.mCharMap)
- {
- MOZ_COUNT_CTOR(CharMapHashKey);
- }
- ~CharMapHashKey()
- {
- MOZ_COUNT_DTOR(CharMapHashKey);
- }
-
- gfxCharacterMap* GetKey() const { return mCharMap; }
-
- bool KeyEquals(const gfxCharacterMap *aCharMap) const {
- NS_ASSERTION(!aCharMap->mBuildOnTheFly && !mCharMap->mBuildOnTheFly,
- "custom cmap used in shared cmap hashtable");
- // cmaps built on the fly never match
- if (aCharMap->mHash != mCharMap->mHash)
- {
- return false;
- }
- return mCharMap->Equals(aCharMap);
- }
-
- static const gfxCharacterMap* KeyToPointer(gfxCharacterMap *aCharMap) {
- return aCharMap;
- }
- static PLDHashNumber HashKey(const gfxCharacterMap *aCharMap) {
- return aCharMap->mHash;
- }
-
- enum { ALLOW_MEMMOVE = true };
-
-protected:
- gfxCharacterMap *mCharMap;
-};
-
-// gfxPlatformFontList is an abstract class for the global font list on the system;
-// concrete subclasses for each platform implement the actual interface to the system fonts.
-// This class exists because we cannot rely on the platform font-finding APIs to behave
-// in sensible/similar ways, particularly with rich, complex OpenType families,
-// so we do our own font family/style management here instead.
-
-// Much of this is based on the old gfxQuartzFontCache, but adapted for use on all platforms.
-
-struct FontListSizes {
- uint32_t mFontListSize; // size of the font list and dependent objects
- // (font family and face names, etc), but NOT
- // including the font table cache and the cmaps
- uint32_t mFontTableCacheSize; // memory used for the gfxFontEntry table caches
- uint32_t mCharMapsSize; // memory used for cmap coverage info
-};
-
-class gfxUserFontSet;
-
-class gfxPlatformFontList : public gfxFontInfoLoader
-{
-public:
- typedef mozilla::unicode::Script Script;
-
- static gfxPlatformFontList* PlatformFontList() {
- return sPlatformFontList;
- }
-
- static nsresult Init() {
- NS_ASSERTION(!sPlatformFontList, "What's this doing here?");
- gfxPlatform::GetPlatform()->CreatePlatformFontList();
- if (!sPlatformFontList) {
- return NS_ERROR_OUT_OF_MEMORY;
- }
- return NS_OK;
- }
-
- static void Shutdown() {
- delete sPlatformFontList;
- sPlatformFontList = nullptr;
- }
-
- virtual ~gfxPlatformFontList();
-
- // initialize font lists
- nsresult InitFontList();
-
- virtual void GetFontList(nsIAtom *aLangGroup,
- const nsACString& aGenericFamily,
- nsTArray<nsString>& aListOfFonts);
-
- void UpdateFontList();
-
- virtual void ClearLangGroupPrefFonts();
-
- virtual void GetFontFamilyList(nsTArray<RefPtr<gfxFontFamily> >& aFamilyArray);
-
- gfxFontEntry*
- SystemFindFontForChar(uint32_t aCh, uint32_t aNextCh,
- Script aRunScript,
- const gfxFontStyle* aStyle);
-
- // Find family(ies) matching aFamily and append to the aOutput array
- // (there may be multiple results in the case of fontconfig aliases, etc).
- // Return true if any match was found and appended, false if none.
- virtual bool
- FindAndAddFamilies(const nsAString& aFamily,
- nsTArray<gfxFontFamily*>* aOutput,
- gfxFontStyle* aStyle = nullptr,
- gfxFloat aDevToCssSize = 1.0);
-
- gfxFontEntry* FindFontForFamily(const nsAString& aFamily, const gfxFontStyle* aStyle, bool& aNeedsBold);
-
- // name lookup table methods
-
- void AddOtherFamilyName(gfxFontFamily *aFamilyEntry, nsAString& aOtherFamilyName);
-
- void AddFullname(gfxFontEntry *aFontEntry, nsAString& aFullname);
-
- void AddPostscriptName(gfxFontEntry *aFontEntry, nsAString& aPostscriptName);
-
- bool NeedFullnamePostscriptNames() { return mExtraNames != nullptr; }
-
- // pure virtual functions, to be provided by concrete subclasses
-
- // get the system default font family
- gfxFontFamily* GetDefaultFont(const gfxFontStyle* aStyle);
-
- // look up a font by name on the host platform
- virtual gfxFontEntry* LookupLocalFont(const nsAString& aFontName,
- uint16_t aWeight,
- int16_t aStretch,
- uint8_t aStyle) = 0;
-
- // create a new platform font from downloaded data (@font-face)
- // this method is responsible to ensure aFontData is free()'d
- virtual gfxFontEntry* MakePlatformFont(const nsAString& aFontName,
- uint16_t aWeight,
- int16_t aStretch,
- uint8_t aStyle,
- const uint8_t* aFontData,
- uint32_t aLength) = 0;
-
- // get the standard family name on the platform for a given font name
- // (platforms may override, eg Mac)
- virtual bool GetStandardFamilyName(const nsAString& aFontName, nsAString& aFamilyName);
-
- virtual void AddSizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf,
- FontListSizes* aSizes) const;
- virtual void AddSizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf,
- FontListSizes* aSizes) const;
-
- // search for existing cmap that matches the input
- // return the input if no match is found
- gfxCharacterMap* FindCharMap(gfxCharacterMap *aCmap);
-
- // add a cmap to the shared cmap set
- gfxCharacterMap* AddCmap(const gfxCharacterMap *aCharMap);
-
- // remove the cmap from the shared cmap set
- void RemoveCmap(const gfxCharacterMap *aCharMap);
-
- // keep track of userfont sets to notify when global fontlist changes occur
- void AddUserFontSet(gfxUserFontSet *aUserFontSet) {
- mUserFontSetList.PutEntry(aUserFontSet);
- }
-
- void RemoveUserFontSet(gfxUserFontSet *aUserFontSet) {
- mUserFontSetList.RemoveEntry(aUserFontSet);
- }
-
- static const gfxFontEntry::ScriptRange sComplexScriptRanges[];
-
- void GetFontlistInitInfo(uint32_t& aNumInits, uint32_t& aLoaderState) {
- aNumInits = mFontlistInitCount;
- aLoaderState = (uint32_t) mState;
- }
-
- virtual void
- AddGenericFonts(mozilla::FontFamilyType aGenericType,
- nsIAtom* aLanguage,
- nsTArray<gfxFontFamily*>& aFamilyList);
-
- nsTArray<RefPtr<gfxFontFamily>>*
- GetPrefFontsLangGroup(mozilla::FontFamilyType aGenericType,
- eFontPrefLang aPrefLang);
-
- // in some situations, need to make decisions about ambiguous characters, may need to look at multiple pref langs
- void GetLangPrefs(eFontPrefLang aPrefLangs[], uint32_t &aLen, eFontPrefLang aCharLang, eFontPrefLang aPageLang);
-
- // convert a lang group to enum constant (i.e. "zh-TW" ==> eFontPrefLang_ChineseTW)
- static eFontPrefLang GetFontPrefLangFor(const char* aLang);
-
- // convert a lang group atom to enum constant
- static eFontPrefLang GetFontPrefLangFor(nsIAtom *aLang);
-
- // convert an enum constant to a lang group atom
- static nsIAtom* GetLangGroupForPrefLang(eFontPrefLang aLang);
-
- // convert a enum constant to lang group string (i.e. eFontPrefLang_ChineseTW ==> "zh-TW")
- static const char* GetPrefLangName(eFontPrefLang aLang);
-
- // map a Unicode range (based on char code) to a font language for Preferences
- static eFontPrefLang GetFontPrefLangFor(uint8_t aUnicodeRange);
-
- // returns true if a pref lang is CJK
- static bool IsLangCJK(eFontPrefLang aLang);
-
- // helper method to add a pref lang to an array, if not already in array
- static void AppendPrefLang(eFontPrefLang aPrefLangs[], uint32_t& aLen, eFontPrefLang aAddLang);
-
- // default serif/sans-serif choice based on font.default.xxx prefs
- mozilla::FontFamilyType
- GetDefaultGeneric(eFontPrefLang aLang);
-
- // map lang group ==> lang string
- void GetSampleLangForGroup(nsIAtom* aLanguage, nsACString& aLangStr,
- bool aCheckEnvironment = true);
-
- // Returns true if the font family whitelist is not empty.
- bool IsFontFamilyWhitelistActive();
-
- static void FontWhitelistPrefChanged(const char *aPref, void *aClosure) {
- gfxPlatformFontList::PlatformFontList()->UpdateFontList();
- }
-
-protected:
- class MemoryReporter final : public nsIMemoryReporter
- {
- ~MemoryReporter() {}
- public:
- NS_DECL_ISUPPORTS
- NS_DECL_NSIMEMORYREPORTER
- };
-
- explicit gfxPlatformFontList(bool aNeedFullnamePostscriptNames = true);
-
- static gfxPlatformFontList *sPlatformFontList;
-
- // Convenience method to return the first matching family (if any) as found
- // by FindAndAddFamilies().
- gfxFontFamily*
- FindFamily(const nsAString& aFamily, gfxFontStyle* aStyle = nullptr,
- gfxFloat aDevToCssSize = 1.0)
- {
- AutoTArray<gfxFontFamily*,1> families;
- return FindAndAddFamilies(aFamily, &families, aStyle, aDevToCssSize)
- ? families[0] : nullptr;
- }
-
- // Lookup family name in global family list without substitutions or
- // localized family name lookup. Used for common font fallback families.
- gfxFontFamily* FindFamilyByCanonicalName(const nsAString& aFamily) {
- nsAutoString key;
- gfxFontFamily *familyEntry;
- GenerateFontListKey(aFamily, key);
- if ((familyEntry = mFontFamilies.GetWeak(key))) {
- return CheckFamily(familyEntry);
- }
- return nullptr;
- }
-
- // returns default font for a given character, null otherwise
- gfxFontEntry* CommonFontFallback(uint32_t aCh, uint32_t aNextCh,
- Script aRunScript,
- const gfxFontStyle* aMatchStyle,
- gfxFontFamily** aMatchedFamily);
-
- // Search fonts system-wide for a given character, null if not found.
- gfxFontEntry* GlobalFontFallback(const uint32_t aCh,
- Script aRunScript,
- const gfxFontStyle* aMatchStyle,
- uint32_t& aCmapCount,
- gfxFontFamily** aMatchedFamily);
-
- // Platform-specific implementation of global font fallback, if any;
- // this may return nullptr in which case the default cmap-based fallback
- // will be performed.
- virtual gfxFontEntry*
- PlatformGlobalFontFallback(const uint32_t aCh,
- Script aRunScript,
- const gfxFontStyle* aMatchStyle,
- gfxFontFamily** aMatchedFamily)
- {
- return nullptr;
- }
-
- // whether system-based font fallback is used or not
- // if system fallback is used, no need to load all cmaps
- virtual bool UsesSystemFallback() { return false; }
-
- void AppendCJKPrefLangs(eFontPrefLang aPrefLangs[], uint32_t &aLen,
- eFontPrefLang aCharLang, eFontPrefLang aPageLang);
-
- // verifies that a family contains a non-zero font count
- gfxFontFamily* CheckFamily(gfxFontFamily *aFamily);
-
- // initialize localized family names
- void InitOtherFamilyNames();
-
- // search through font families, looking for a given name, initializing
- // facename lists along the way. first checks all families with names
- // close to face name, then searchs all families if not found.
- gfxFontEntry* SearchFamiliesForFaceName(const nsAString& aFaceName);
-
- // helper method for finding fullname/postscript names in facename lists
- gfxFontEntry* FindFaceName(const nsAString& aFaceName);
-
- // look up a font by name, for cases where platform font list
- // maintains explicit mappings of fullname/psname ==> font
- virtual gfxFontEntry* LookupInFaceNameLists(const nsAString& aFontName);
-
- // commonly used fonts for which the name table should be loaded at startup
- virtual void PreloadNamesList();
-
- // load the bad underline blacklist from pref.
- void LoadBadUnderlineList();
-
- void GenerateFontListKey(const nsAString& aKeyName, nsAString& aResult);
-
- virtual void GetFontFamilyNames(nsTArray<nsString>& aFontFamilyNames);
-
- nsILanguageAtomService* GetLangService();
-
- // helper function to map lang to lang group
- nsIAtom* GetLangGroup(nsIAtom* aLanguage);
-
- // helper method for finding an appropriate lang string
- bool TryLangForGroup(const nsACString& aOSLang, nsIAtom* aLangGroup,
- nsACString& aLang);
-
- static const char* GetGenericName(mozilla::FontFamilyType aGenericType);
-
- // gfxFontInfoLoader overrides, used to load in font cmaps
- virtual void InitLoader();
- virtual bool LoadFontInfo();
- virtual void CleanupLoader();
-
- // read the loader initialization prefs, and start it
- void GetPrefsAndStartLoader();
-
- // for font list changes that affect all documents
- void ForceGlobalReflow();
-
- void RebuildLocalFonts();
-
- void
- ResolveGenericFontNames(mozilla::FontFamilyType aGenericType,
- eFontPrefLang aPrefLang,
- nsTArray<RefPtr<gfxFontFamily>>* aGenericFamilies);
-
- void
- ResolveEmojiFontNames(nsTArray<RefPtr<gfxFontFamily>>* aGenericFamilies);
-
- void
- GetFontFamiliesFromGenericFamilies(
- nsTArray<nsString>& aGenericFamilies,
- nsIAtom* aLangGroup,
- nsTArray<RefPtr<gfxFontFamily>>* aFontFamilies);
-
- virtual nsresult InitFontListForPlatform() = 0;
-
- void ApplyWhitelist();
-
- typedef nsRefPtrHashtable<nsStringHashKey, gfxFontFamily> FontFamilyTable;
- typedef nsRefPtrHashtable<nsStringHashKey, gfxFontEntry> FontEntryTable;
-
- // used by memory reporter to accumulate sizes of family names in the table
- static size_t
- SizeOfFontFamilyTableExcludingThis(const FontFamilyTable& aTable,
- mozilla::MallocSizeOf aMallocSizeOf);
- static size_t
- SizeOfFontEntryTableExcludingThis(const FontEntryTable& aTable,
- mozilla::MallocSizeOf aMallocSizeOf);
-
- // Platform-specific helper for GetDefaultFont(...).
- virtual gfxFontFamily*
- GetDefaultFontForPlatform(const gfxFontStyle* aStyle) = 0;
-
- // canonical family name ==> family entry (unique, one name per family entry)
- FontFamilyTable mFontFamilies;
-
- // other family name ==> family entry (not unique, can have multiple names per
- // family entry, only names *other* than the canonical names are stored here)
- FontFamilyTable mOtherFamilyNames;
-
- // flag set after InitOtherFamilyNames is called upon first name lookup miss
- bool mOtherFamilyNamesInitialized;
-
- // flag set after fullname and Postcript name lists are populated
- bool mFaceNameListsInitialized;
-
- struct ExtraNames {
- ExtraNames() : mFullnames(64), mPostscriptNames(64) {}
-
- // fullname ==> font entry (unique, one name per font entry)
- FontEntryTable mFullnames;
- // Postscript name ==> font entry (unique, one name per font entry)
- FontEntryTable mPostscriptNames;
- };
- mozilla::UniquePtr<ExtraNames> mExtraNames;
-
- // face names missed when face name loading takes a long time
- mozilla::UniquePtr<nsTHashtable<nsStringHashKey> > mFaceNamesMissed;
-
- // localized family names missed when face name loading takes a long time
- mozilla::UniquePtr<nsTHashtable<nsStringHashKey> > mOtherNamesMissed;
-
- typedef nsTArray<RefPtr<gfxFontFamily>> PrefFontList;
- typedef mozilla::RangedArray<mozilla::UniquePtr<PrefFontList>,
- mozilla::eFamily_generic_first,
- mozilla::eFamily_generic_count> PrefFontsForLangGroup;
- mozilla::RangedArray<PrefFontsForLangGroup,
- eFontPrefLang_First,
- eFontPrefLang_Count> mLangGroupPrefFonts;
-
- mozilla::UniquePtr<PrefFontList> mEmojiPrefFont;
-
- // when system-wide font lookup fails for a character, cache it to skip future searches
- gfxSparseBitSet mCodepointsWithNoFonts;
-
- // the family to use for U+FFFD fallback, to avoid expensive search every time
- // on pages with lots of problems
- RefPtr<gfxFontFamily> mReplacementCharFallbackFamily;
-
- nsTHashtable<nsStringHashKey> mBadUnderlineFamilyNames;
-
- // character map data shared across families
- // contains weak ptrs to cmaps shared by font entry objects
- nsTHashtable<CharMapHashKey> mSharedCmaps;
-
- // data used as part of the font cmap loading process
- nsTArray<RefPtr<gfxFontFamily> > mFontFamiliesToLoad;
- uint32_t mStartIndex;
- uint32_t mIncrement;
- uint32_t mNumFamilies;
-
- // xxx - info for diagnosing no default font aborts
- // see bugs 636957, 1070983, 1189129
- uint32_t mFontlistInitCount; // num times InitFontList called
-
- nsTHashtable<nsPtrHashKey<gfxUserFontSet> > mUserFontSetList;
-
- nsCOMPtr<nsILanguageAtomService> mLangService;
- nsTArray<uint32_t> mCJKPrefLangs;
- nsTArray<mozilla::FontFamilyType> mDefaultGenericsLangGroup;
-
- bool mFontFamilyWhitelistActive;
-};
-
-#endif /* GFXPLATFORMFONTLIST_H_ */