void gfxWindowsPlatform::GetCommonFallbackFonts()

in gfx/thebes/gfxWindowsPlatform.cpp [626:1128]


void gfxWindowsPlatform::GetCommonFallbackFonts(
    uint32_t aCh, Script aRunScript, FontPresentation aPresentation,
    nsTArray<const char*>& aFontList) {
  if (PrefersColor(aPresentation)) {
    aFontList.AppendElement("Segoe UI Emoji");
    aFontList.AppendElement("Twemoji Mozilla");
  }

  switch (aRunScript) {
    case Script::INVALID:
    case Script::NUM_SCRIPT_CODES:
      // Ensure the switch covers all the Script enum values.
      MOZ_ASSERT_UNREACHABLE("bad script code");
      break;

    case Script::COMMON:
    case Script::INHERITED:
      // In most cases, COMMON and INHERITED characters will be merged into
      // their context, but if they occur without context, we'll just treat
      // them like Latin, etc.
    case Script::LATIN:
    case Script::CYRILLIC:
    case Script::GREEK:
    case Script::ARMENIAN:
    case Script::HEBREW:
      // We always append Arial below, so no need to add it here.
      // aFontList.AppendElement("Arial");
      break;

    case Script::MATHEMATICAL_NOTATION:
    case Script::SYMBOLS:
    case Script::SYMBOLS_EMOJI:
      // Not currently returned by script run resolution (but some symbols may
      // be handled below).
      break;

      // CJK-related script codes are a bit troublesome because of unification;
      // we'll probably just get HAN much of the time, so the choice of which
      // language font to try for fallback is rather arbitrary. Usually, though,
      // we hope that font prefs will have handled this earlier.
    case Script::BOPOMOFO:
    case Script::HAN_WITH_BOPOMOFO:
    case Script::SIMPLIFIED_HAN:
    case Script::HAN:
      aFontList.AppendElement("SimSun");
      if (aCh > 0xFFFF) {
        aFontList.AppendElement("SimSun-ExtB");
      }
      break;
      // Currently, we don't resolve script runs to this value, but we may do so
      // in future if we get better at handling things like `lang=zh-Hant`, not
      // just resolving based on the Unicode text.
    case Script::TRADITIONAL_HAN:
      aFontList.AppendElement("MingLiU");
      if (aCh > 0xFFFF) {
        aFontList.AppendElement("MingLiU-ExtB");
      }
      break;
    case Script::HIRAGANA:
    case Script::KATAKANA:
    case Script::KATAKANA_OR_HIRAGANA:
    case Script::JAPANESE:
      aFontList.AppendElement("Yu Gothic");
      aFontList.AppendElement("MS PGothic");
      break;
    case Script::HANGUL:
    case Script::JAMO:
    case Script::KOREAN:
      aFontList.AppendElement("Malgun Gothic");
      break;

    case Script::YI:
      aFontList.AppendElement("Microsoft Yi Baiti");
      break;
    case Script::MONGOLIAN:
      aFontList.AppendElement("Mongolian Baiti");
      break;
    case Script::TIBETAN:
      aFontList.AppendElement("Microsoft Himalaya");
      break;
    case Script::PHAGS_PA:
      aFontList.AppendElement("Microsoft PhagsPa");
      break;

    case Script::ARABIC:
      // Default to Arial (added unconditionally below) for Arabic script.
      break;
    case Script::ARABIC_NASTALIQ:
      aFontList.AppendElement("Urdu Typesetting");
      break;
    case Script::SYRIAC:
    case Script::ESTRANGELO_SYRIAC:
      aFontList.AppendElement("Estrangelo Edessa");
      break;
    case Script::THAANA:
      aFontList.AppendElement("MV Boli");
      break;

    case Script::BENGALI:
      aFontList.AppendElement("Vrinda");
      aFontList.AppendElement("Nirmala UI");
      break;
    case Script::DEVANAGARI:
      aFontList.AppendElement("Kokila");
      aFontList.AppendElement("Nirmala UI");
      break;
    case Script::GUJARATI:
      aFontList.AppendElement("Shruti");
      aFontList.AppendElement("Nirmala UI");
      break;
    case Script::GURMUKHI:
      aFontList.AppendElement("Raavi");
      aFontList.AppendElement("Nirmala UI");
      break;
    case Script::KANNADA:
      aFontList.AppendElement("Tunga");
      aFontList.AppendElement("Nirmala UI");
      break;
    case Script::MALAYALAM:
      aFontList.AppendElement("Kartika");
      aFontList.AppendElement("Nirmala UI");
      break;
    case Script::ORIYA:
      aFontList.AppendElement("Kalinga");
      aFontList.AppendElement("Nirmala UI");
      break;
    case Script::TAMIL:
      aFontList.AppendElement("Latha");
      aFontList.AppendElement("Nirmala UI");
      break;
    case Script::TELUGU:
      aFontList.AppendElement("Gautami");
      aFontList.AppendElement("Nirmala UI");
      break;
    case Script::SINHALA:
      aFontList.AppendElement("Iskoola Pota");
      aFontList.AppendElement("Nirmala UI");
      break;

    case Script::CHAKMA:
    case Script::MEETEI_MAYEK:
    case Script::OL_CHIKI:
    case Script::SORA_SOMPENG:
      aFontList.AppendElement("Nirmala UI");
      break;

    case Script::MYANMAR:
      aFontList.AppendElement("Myanmar Text");
      break;
    case Script::KHMER:
      aFontList.AppendElement("Khmer UI");
      break;
    case Script::LAO:
      aFontList.AppendElement("Lao UI");
      break;
    case Script::THAI:
      aFontList.AppendElement("Tahoma");
      aFontList.AppendElement("Leelawadee UI");
      break;
    case Script::TAI_LE:
      aFontList.AppendElement("Microsoft Tai Le");
      break;
    case Script::BUGINESE:
      aFontList.AppendElement("Leelawadee UI");
      break;
    case Script::NEW_TAI_LUE:
      aFontList.AppendElement("Microsoft New Tai Lue");
      break;
    case Script::JAVANESE:
      aFontList.AppendElement("Javanese Text");
      break;

    case Script::GEORGIAN:
    case Script::KHUTSURI:
    case Script::LISU:
      aFontList.AppendElement("Segoe UI");
      break;

    case Script::ETHIOPIC:
      aFontList.AppendElement("Nyala");
      aFontList.AppendElement("Ebrima");
      break;

    case Script::ADLAM:
    case Script::NKO:
    case Script::OSMANYA:
    case Script::TIFINAGH:
    case Script::VAI:
      aFontList.AppendElement("Ebrima");
      break;

    case Script::CANADIAN_ABORIGINAL:
      aFontList.AppendElement("Euphemia");
      break;

    case Script::CHEROKEE:
    case Script::OSAGE:
      aFontList.AppendElement("Gadugi");
      break;

    case Script::BRAILLE:
    case Script::DESERET:
      aFontList.AppendElement("Segoe UI Symbol");
      break;

    case Script::BRAHMI:
    case Script::CARIAN:
    case Script::CUNEIFORM:
    case Script::CYPRIOT:
    case Script::EGYPTIAN_HIEROGLYPHS:
    case Script::GLAGOLITIC:
    case Script::GOTHIC:
    case Script::IMPERIAL_ARAMAIC:
    case Script::INSCRIPTIONAL_PAHLAVI:
    case Script::INSCRIPTIONAL_PARTHIAN:
    case Script::KHAROSHTHI:
    case Script::LYCIAN:
    case Script::LYDIAN:
    case Script::MEROITIC_CURSIVE:
    case Script::OGHAM:
    case Script::OLD_ITALIC:
    case Script::OLD_PERSIAN:
    case Script::OLD_SOUTH_ARABIAN:
    case Script::OLD_TURKIC:
    case Script::PHOENICIAN:
    case Script::RUNIC:
    case Script::SHAVIAN:
    case Script::UGARITIC:
      aFontList.AppendElement("Segoe UI Historic");
      break;

      // For some scripts where Windows doesn't supply a font by default,
      // there are Noto fonts that users might have installed:
    case Script::AHOM:
      aFontList.AppendElement("Noto Serif Ahom");
      break;
    case Script::AVESTAN:
      aFontList.AppendElement("Noto Sans Avestan");
      break;
    case Script::BALINESE:
      aFontList.AppendElement("Noto Sans Balinese");
      break;
    case Script::BAMUM:
      aFontList.AppendElement("Noto Sans Bamum");
      break;
    case Script::BASSA_VAH:
      aFontList.AppendElement("Noto Sans Bassa Vah");
      break;
    case Script::BATAK:
      aFontList.AppendElement("Noto Sans Batak");
      break;
    case Script::BHAIKSUKI:
      aFontList.AppendElement("Noto Sans Bhaiksuki");
      break;
    case Script::BUHID:
      aFontList.AppendElement("Noto Sans Buhid");
      break;
    case Script::CAUCASIAN_ALBANIAN:
      aFontList.AppendElement("Noto Sans Caucasian Albanian");
      break;
    case Script::CHAM:
      aFontList.AppendElement("Noto Sans Cham");
      break;
    case Script::COPTIC:
      aFontList.AppendElement("Noto Sans Coptic");
      break;
    case Script::DUPLOYAN:
      aFontList.AppendElement("Noto Sans Duployan");
      break;
    case Script::ELBASAN:
      aFontList.AppendElement("Noto Sans Elbasan");
      break;
    case Script::GRANTHA:
      aFontList.AppendElement("Noto Sans Grantha");
      break;
    case Script::HANIFI_ROHINGYA:
      aFontList.AppendElement("Noto Sans Hanifi Rohingya");
      break;
    case Script::HANUNOO:
      aFontList.AppendElement("Noto Sans Hanunoo");
      break;
    case Script::HATRAN:
      aFontList.AppendElement("Noto Sans Hatran");
      break;
    case Script::KAITHI:
      aFontList.AppendElement("Noto Sans Kaithi");
      break;
    case Script::KAYAH_LI:
      aFontList.AppendElement("Noto Sans Kayah Li");
      break;
    case Script::KHOJKI:
      aFontList.AppendElement("Noto Sans Khojki");
      break;
    case Script::KHUDAWADI:
      aFontList.AppendElement("Noto Sans Khudawadi");
      break;
    case Script::LEPCHA:
      aFontList.AppendElement("Noto Sans Lepcha");
      break;
    case Script::LIMBU:
      aFontList.AppendElement("Noto Sans Limbu");
      break;
    case Script::LINEAR_A:
      aFontList.AppendElement("Noto Sans Linear A");
      break;
    case Script::LINEAR_B:
      aFontList.AppendElement("Noto Sans Linear B");
      break;
    case Script::MAHAJANI:
      aFontList.AppendElement("Noto Sans Mahajani");
      break;
    case Script::MANDAIC:
      aFontList.AppendElement("Noto Sans Mandaic");
      break;
    case Script::MANICHAEAN:
      aFontList.AppendElement("Noto Sans Manichaean");
      break;
    case Script::MARCHEN:
      aFontList.AppendElement("Noto Sans Marchen");
      break;
    case Script::MENDE_KIKAKUI:
      aFontList.AppendElement("Noto Sans Mende Kikakui");
      break;
    case Script::MEROITIC_HIEROGLYPHS:
      aFontList.AppendElement("Noto Sans Meroitic");
      break;
    case Script::MIAO:
      aFontList.AppendElement("Noto Sans Miao");
      break;
    case Script::MODI:
      aFontList.AppendElement("Noto Sans Modi");
      break;
    case Script::MRO:
      aFontList.AppendElement("Noto Sans Mro");
      break;
    case Script::MULTANI:
      aFontList.AppendElement("Noto Sans Multani");
      break;
    case Script::NABATAEAN:
      aFontList.AppendElement("Noto Sans Nabataean");
      break;
    case Script::NEWA:
      aFontList.AppendElement("Noto Sans Newa");
      break;
    case Script::OLD_HUNGARIAN:
      aFontList.AppendElement("Noto Sans Old Hungarian");
      break;
    case Script::OLD_NORTH_ARABIAN:
      aFontList.AppendElement("Noto Sans Old North Arabian");
      break;
    case Script::OLD_PERMIC:
      aFontList.AppendElement("Noto Sans Old Permic");
      break;
    case Script::PAHAWH_HMONG:
      aFontList.AppendElement("Noto Sans Pahawh Hmong");
      break;
    case Script::PALMYRENE:
      aFontList.AppendElement("Noto Sans Palmyrene");
      break;
    case Script::PAU_CIN_HAU:
      aFontList.AppendElement("Noto Sans Pau Cin Hau");
      break;
    case Script::PSALTER_PAHLAVI:
      aFontList.AppendElement("Noto Sans Psalter Pahlavi");
      break;
    case Script::REJANG:
      aFontList.AppendElement("Noto Sans Rejang");
      break;
    case Script::SAMARITAN:
      aFontList.AppendElement("Noto Sans Samaritan");
      break;
    case Script::SAURASHTRA:
      aFontList.AppendElement("Noto Sans Saurashtra");
      break;
    case Script::SHARADA:
      aFontList.AppendElement("Noto Sans Sharada");
      break;
    case Script::SIDDHAM:
      aFontList.AppendElement("Noto Sans Siddham");
      break;
    case Script::SUNDANESE:
      aFontList.AppendElement("Noto Sans Sundanese");
      break;
    case Script::SYLOTI_NAGRI:
      aFontList.AppendElement("Noto Sans Syloti Nagri");
      break;
    case Script::TAGALOG:
      aFontList.AppendElement("Noto Sans Tagalog");
      break;
    case Script::TAGBANWA:
      aFontList.AppendElement("Noto Sans Tagbanwa");
      break;
    case Script::TAI_THAM:
      aFontList.AppendElement("Noto Sans Tai Tham");
      break;
    case Script::TAI_VIET:
      aFontList.AppendElement("Noto Sans Tai Viet");
      break;
    case Script::TAKRI:
      aFontList.AppendElement("Noto Sans Takri");
      break;
    case Script::TIRHUTA:
      aFontList.AppendElement("Noto Sans Tirhuta");
      break;
    case Script::WANCHO:
      aFontList.AppendElement("Noto Sans Wancho");
      break;
    case Script::WARANG_CITI:
      aFontList.AppendElement("Noto Sans Warang Citi");
      break;

    case Script::AFAKA:
    case Script::ANATOLIAN_HIEROGLYPHS:
    case Script::BLISSYMBOLS:
    case Script::BOOK_PAHLAVI:
    case Script::CHORASMIAN:
    case Script::CIRTH:
    case Script::CYPRO_MINOAN:
    case Script::DEMOTIC_EGYPTIAN:
    case Script::DIVES_AKURU:
    case Script::DOGRA:
    case Script::EASTERN_SYRIAC:
    case Script::ELYMAIC:
    case Script::GARAY:
    case Script::GUNJALA_GONDI:
    case Script::GURUNG_KHEMA:
    case Script::HARAPPAN_INDUS:
    case Script::HIERATIC_EGYPTIAN:
    case Script::JURCHEN:
    case Script::KAWI:
    case Script::KHITAN_SMALL_SCRIPT:
    case Script::KIRAT_RAI:
    case Script::KPELLE:
    case Script::LATIN_FRAKTUR:
    case Script::LATIN_GAELIC:
    case Script::LOMA:
    case Script::MAKASAR:
    case Script::MASARAM_GONDI:
    case Script::MAYAN_HIEROGLYPHS:
    case Script::MEDEFAIDRIN:
    case Script::MOON:
    case Script::NAG_MUNDARI:
    case Script::NAKHI_GEBA:
    case Script::NANDINAGARI:
    case Script::NUSHU:
    case Script::NYIAKENG_PUACHUE_HMONG:
    case Script::OL_ONAL:
    case Script::OLD_CHURCH_SLAVONIC_CYRILLIC:
    case Script::OLD_SOGDIAN:
    case Script::OLD_UYGHUR:
    case Script::RONGORONGO:
    case Script::SARATI:
    case Script::SIGNWRITING:
    case Script::SOGDIAN:
    case Script::SOYOMBO:
    case Script::SUNUWAR:
    case Script::TANGSA:
    case Script::TANGUT:
    case Script::TENGWAR:
    case Script::TODHRI:
    case Script::TOTO:
    case Script::TULU_TIGALARI:
    case Script::UNKNOWN:
    case Script::UNWRITTEN_LANGUAGES:
    case Script::VISIBLE_SPEECH:
    case Script::VITHKUQI:
    case Script::WESTERN_SYRIAC:
    case Script::WOLEAI:
    case Script::YEZIDI:
    case Script::ZANABAZAR_SQUARE:
      break;
  }

  // Arial is used as default fallback for system fallback, so always try that.
  aFontList.AppendElement("Arial");

  // Symbols/dingbats are generally Script=COMMON but may be resolved to any
  // surrounding script run. So we'll always append a couple of likely fonts
  // for such characters.
  const uint32_t b = aCh >> 8;
  if (aRunScript == Script::COMMON ||  // Stray COMMON chars not resolved
      (b >= 0x20 && b <= 0x2b) || b == 0x2e ||  // BMP symbols/punctuation/etc
      GetGenCategory(aCh) == nsUGenCategory::kSymbol ||
      GetGenCategory(aCh) == nsUGenCategory::kPunctuation) {
    // Segoe UI handles some punctuation/symbols that are missing from many text
    // fonts.
    aFontList.AppendElement("Segoe UI");
    aFontList.AppendElement("Segoe UI Symbol");
    aFontList.AppendElement("Cambria Math");
  }

  // Arial Unicode MS also has lots of glyphs for obscure characters; try it as
  // a last resort, if available.
  aFontList.AppendElement("Arial Unicode MS");

  // If we didn't begin with the color-emoji fonts, include them here
  // so that they'll be preferred over user-installed (and possibly
  // broken) fonts in the global fallback path.
  if (!PrefersColor(aPresentation)) {
    aFontList.AppendElement("Segoe UI Emoji");
    aFontList.AppendElement("Twemoji Mozilla");
  }
}