Commit 135c7c99 authored by Jonathan Kew's avatar Jonathan Kew
Browse files

Bug 1565966 - part 2 - Include Family attributes in mAliasTable when...

Bug 1565966 - part 2 - Include Family attributes in mAliasTable when collecting font-name aliases, so that fontEntry instantiation on Windows can work correctly for the Aliases eventually stored in the font-list. r=jwatt

Differential Revision: https://phabricator.services.mozilla.com/D41243

--HG--
extra : moz-landing-system : lando
parent f2b7b914
Loading
Loading
Loading
Loading
+25 −2
Original line number Diff line number Diff line
@@ -24,6 +24,30 @@
namespace mozilla {
namespace fontlist {

/**
 * Data used to initialize a font family alias (a "virtual" family that refers
 * to some or all of the faces of another family, used when alternate family
 * names are found in the font resource for localization or for styled
 * subfamilies). AliasData records are collected incrementally while scanning
 * the fonts, and then used to set up the Aliases list in the shared font list.
 */
struct AliasData {
  nsTArray<Pointer> mFaces;
  uint32_t mIndex = 0;
  bool mHidden = false;
  bool mBundled = false;
  bool mBadUnderline = false;
  bool mForceClassic = false;

  void InitFromFamily(const Family* aFamily) {
    mIndex = aFamily->Index();
    mHidden = aFamily->IsHidden();
    mBundled = aFamily->IsBundled();
    mBadUnderline = aFamily->IsBadUnderlineFamily();
    mForceClassic = aFamily->IsForceClassic();
  }
};

/**
 * The Shared Font List is a collection of data that lives in shared memory
 * so that all processes can use it, rather than maintaining their own copies,
@@ -93,8 +117,7 @@ class FontList {
   *
   * Only used in the parent process.
   */
  void SetAliases(
      nsClassHashtable<nsCStringHashKey, nsTArray<Pointer>>& aAliasTable);
  void SetAliases(nsClassHashtable<nsCStringHashKey, AliasData>& aAliasTable);

  /**
   * Local names are PostScript or Full font names of individual faces, used
+8 −4
Original line number Diff line number Diff line
@@ -634,15 +634,19 @@ void FontList::SetFamilyNames(const nsTArray<Family::InitData>& aFamilies) {
}

void FontList::SetAliases(
    nsClassHashtable<nsCStringHashKey, nsTArray<Pointer>>& aAliasTable) {
    nsClassHashtable<nsCStringHashKey, AliasData>& aAliasTable) {
  MOZ_ASSERT(XRE_IsParentProcess());

  Header& header = GetHeader();

  // Build an array of Family::InitData records based on the entries in
  // aAliasTable, then sort them and store into the fontlist.
  nsTArray<Family::InitData> aliasArray;
  aliasArray.SetCapacity(aAliasTable.Count());
  for (auto i = aAliasTable.Iter(); !i.Done(); i.Next()) {
    aliasArray.AppendElement(Family::InitData(i.Key(), i.Key()));
    aliasArray.AppendElement(Family::InitData(
        i.Key(), i.Key(), i.Data()->mIndex, i.Data()->mHidden,
        i.Data()->mBundled, i.Data()->mBadUnderline, i.Data()->mForceClassic));
  }
  aliasArray.Sort();

@@ -658,9 +662,9 @@ void FontList::SetAliases(
    (void)new (&aliases[i]) Family(this, aliasArray[i]);
    LOG_FONTLIST(("(shared-fontlist) alias family %u (%s)", (unsigned)i,
                  aliasArray[i].mName.get()));
    aliases[i].SetFacePtrs(this, *aAliasTable.Get(aliasArray[i].mName));
    aliases[i].SetFacePtrs(this, aAliasTable.Get(aliasArray[i].mName)->mFaces);
    if (LOG_FONTLIST_ENABLED()) {
      const auto& faces = *aAliasTable.Get(aliasArray[i].mName);
      const auto& faces = aAliasTable.Get(aliasArray[i].mName)->mFaces;
      for (unsigned j = 0; j < faces.Length(); j++) {
        auto face = static_cast<const fontlist::Face*>(faces[j].ToPtr(this));
        const nsCString& desc = face->mDescriptor.AsString(this);
+3 −2
Original line number Diff line number Diff line
@@ -1165,8 +1165,9 @@ void gfxDWriteFontList::ReadFaceNamesForFamily(
    for (const auto& alias : otherFamilyNames) {
      nsAutoCString key(alias);
      ToLowerCase(key);
      auto af = mAliasTable.LookupOrAdd(key);
      af->AppendElement(facePtrs[i]);
      auto aliasData = mAliasTable.LookupOrAdd(key);
      aliasData->InitFromFamily(aFamily);
      aliasData->mFaces.AppendElement(facePtrs[i]);
    }

    nsAutoCString psname, fullname;
+7 −4
Original line number Diff line number Diff line
@@ -1071,8 +1071,10 @@ void gfxMacPlatformFontList::InitAliasesForSingleFaceList() {
          MOZ_ASSERT(false, "single-face family already known");
          break;
        }
        auto af = mAliasTable.LookupOrAdd(key);
        af->AppendElement(facePtrs[i]);
        auto aliasData = mAliasTable.LookupOrAdd(key);
        // The "alias" here isn't based on an existing family, so we don't call
        // aliasData->InitFromFamily(); the various flags are left as defaults.
        aliasData->mFaces.AppendElement(facePtrs[i]);
        break;
      }
    }
@@ -1794,8 +1796,9 @@ void gfxMacPlatformFontList::ReadFaceNamesForFamily(fontlist::Family* aFamily,
    for (const auto& alias : otherFamilyNames) {
      nsAutoCString key;
      GenerateFontListKey(alias, key);
      auto af = mAliasTable.LookupOrAdd(key);
      af->AppendElement(facePtrs[i]);
      auto aliasData = mAliasTable.LookupOrAdd(key);
      aliasData->InitFromFamily(aFamily);
      aliasData->mFaces.AppendElement(facePtrs[i]);
    }
  }
}
+9 −2
Original line number Diff line number Diff line
@@ -27,6 +27,12 @@
#include "mozilla/RangedArray.h"
#include "nsLanguageAtomService.h"

namespace mozilla {
namespace fontlist {
struct AliasData;
}
}  // namespace mozilla

class CharMapHashKey : public PLDHashEntryHdr {
 public:
  typedef gfxCharacterMap* KeyType;
@@ -431,6 +437,8 @@ class gfxPlatformFontList : public gfxFontInfoLoader {
      mozilla::StyleGenericFontFamily aGenericType);

 protected:
  friend class mozilla::fontlist::FontList;

  class InitOtherFamilyNamesRunnable : public mozilla::CancelableRunnable {
   public:
    InitOtherFamilyNamesRunnable()
@@ -778,8 +786,7 @@ class gfxPlatformFontList : public gfxFontInfoLoader {

  mozilla::UniquePtr<mozilla::fontlist::FontList> mSharedFontList;

  nsClassHashtable<nsCStringHashKey, nsTArray<mozilla::fontlist::Pointer>>
      mAliasTable;
  nsClassHashtable<nsCStringHashKey, mozilla::fontlist::AliasData> mAliasTable;
  nsDataHashtable<nsCStringHashKey, mozilla::fontlist::LocalFaceRec::InitData>
      mLocalNameTable;