a8a561
diff -up mozilla-aurora/gfx/thebes/gfxFcPlatformFontList.cpp.build-el5-fontconfig mozilla-aurora/gfx/thebes/gfxFcPlatformFontList.cpp
a8a561
--- mozilla-aurora/gfx/thebes/gfxFcPlatformFontList.cpp.build-el5-fontconfig	2015-12-16 16:47:28.000000000 +0100
a8a561
+++ mozilla-aurora/gfx/thebes/gfxFcPlatformFontList.cpp	2016-01-19 14:20:43.676153725 +0100
a8a561
@@ -367,7 +367,48 @@ gfxFontconfigFontEntry::gfxFontconfigFon
a8a561
     // "blanks", effectively assuming that, if the font has a blank glyph,
a8a561
     // then the author intends any associated character to be rendered
a8a561
     // blank.
a8a561
-    mFontPattern = FcFreeTypeQueryFace(mFTFace, ToFcChar8Ptr(""), 0, nullptr);
a8a561
+    // BACKPORT: FcFreeTypeQueryFace is not available in RHEL5's fontconfig
a8a561
+    // mFontPattern = FcFreeTypeQueryFace(mFTFace, ToFcChar8Ptr(""), 0, nullptr);
a8a561
+
a8a561
+
a8a561
+    // FC_CHARSET is vital to determine which characters are supported.
a8a561
+    nsAutoRef<FcCharSet> charset(FcFreeTypeCharSet(mFTFace, nullptr));
a8a561
+    // If there are no characters then assume we don't know how to read
a8a561
+    // this font.
a8a561
+    if (!charset || FcCharSetCount(charset) == 0)
a8a561
+      return;
a8a561
+
a8a561
+    mFontPattern = FcPatternCreate();
a8a561
+    FcPatternAddCharSet(mFontPattern, FC_CHARSET, charset);
a8a561
+
a8a561
+    // FC_PIXEL_SIZE can be important for font selection of fixed-size
a8a561
+    // fonts.
a8a561
+    if (!(mFTFace->face_flags & FT_FACE_FLAG_SCALABLE)) {
a8a561
+      for (FT_Int i = 0; i < mFTFace->num_fixed_sizes; ++i) {
a8a561
+#if HAVE_FT_BITMAP_SIZE_Y_PPEM
a8a561
+        double size = FLOAT_FROM_26_6(mFTFace->available_sizes[i].y_ppem);
a8a561
+#else
a8a561
+        double size = mFTFace->available_sizes[i].height;
a8a561
+#endif
a8a561
+        FcPatternAddDouble (mFontPattern, FC_PIXEL_SIZE, size);
a8a561
+      }
a8a561
+
a8a561
+      // Not sure whether this is important;
a8a561
+      // imitating FcFreeTypeQueryFace:
a8a561
+      FcPatternAddBool (mFontPattern, FC_ANTIALIAS, FcFalse);
a8a561
+    }
a8a561
+
a8a561
+    // Setting up the FC_LANGSET property is very difficult with the APIs
a8a561
+    // available prior to FcFreeTypeQueryFace.  Having no FC_LANGSET
a8a561
+    // property seems better than having a property with an empty LangSet.
a8a561
+    // With no FC_LANGSET property, fontconfig sort functions will
a8a561
+    // consider this face to have the same priority as (otherwise equal)
a8a561
+    // faces that have support for the primary requested language, but
a8a561
+    // will not consider any language to have been satisfied (and so will
a8a561
+    // continue to look for a face with language support in fallback
a8a561
+    // fonts).
a8a561
+
a8a561
+    // END BACKPORT
a8a561
     // given that we have a FT_Face, not really sure this is possible...
a8a561
     if (!mFontPattern) {
a8a561
         mFontPattern = FcPatternCreate();
a8a561
@@ -1015,9 +1056,12 @@ gfxFcPlatformFontList::gfxFcPlatformFont
a8a561
     , mAlwaysUseFontconfigGenerics(true)
a8a561
 {
a8a561
     // if the rescan interval is set, start the timer
a8a561
-    int rescanInterval = FcConfigGetRescanInterval(nullptr);
a8a561
+    // BACKPORT - do not implement rescan interval
a8a561
+    //int rescanInterval = FcConfigGetRescanInterval(nullptr);
a8a561
+    int rescanInterval = 0;
a8a561
     if (rescanInterval) {
a8a561
-        mLastConfig = FcConfigGetCurrent();
a8a561
+        nsAutoRef<FcConfig> fc_conf(FcConfigGetCurrent());
a8a561
+        mLastConfig = fc_conf.out();
a8a561
         mCheckFontUpdatesTimer = do_CreateInstance("@mozilla.org/timer;1");
a8a561
         if (mCheckFontUpdatesTimer) {
a8a561
             mCheckFontUpdatesTimer->
a8a561
@@ -1131,7 +1175,8 @@ gfxFcPlatformFontList::AddFontSetFamilie
a8a561
 nsresult
a8a561
 gfxFcPlatformFontList::InitFontList()
a8a561
 {
a8a561
-    mLastConfig = FcConfigGetCurrent();
a8a561
+    nsAutoRef<FcConfig> fc_conf(FcConfigGetCurrent());
a8a561
+    mLastConfig = fc_conf.out();
a8a561
 
a8a561
     // reset font lists
a8a561
     gfxPlatformFontList::InitFontList();
a8a561
diff -up mozilla-aurora/gfx/thebes/gfxFcPlatformFontList.h.build-el5-fontconfig mozilla-aurora/gfx/thebes/gfxFcPlatformFontList.h
a8a561
--- mozilla-aurora/gfx/thebes/gfxFcPlatformFontList.h.build-el5-fontconfig	2016-01-19 11:45:08.927745469 +0100
a8a561
+++ mozilla-aurora/gfx/thebes/gfxFcPlatformFontList.h	2016-01-19 13:49:58.296124911 +0100
a8a561
@@ -33,7 +33,8 @@ class nsAutoRefTraits<FcConfig> : public
a8a561
 {
a8a561
 public:
a8a561
     static void Release(FcConfig *ptr) { FcConfigDestroy(ptr); }
a8a561
-    static void AddRef(FcConfig *ptr) { FcConfigReference(ptr); }
a8a561
+    // AddRef is not supported in older font-config
a8a561
+    // static void AddRef(FcConfig *ptr) { FcConfigReference(ptr); }
a8a561
 };
a8a561
 
a8a561
 // Helper classes used for clearning out user font data when cairo font
a8a561
@@ -290,7 +291,7 @@ protected:
a8a561
     nsRefPtrHashtable<nsCStringHashKey, gfxFontFamily> mFcSubstituteCache;
a8a561
 
a8a561
     nsCOMPtr<nsITimer> mCheckFontUpdatesTimer;
a8a561
-    nsCountedRef<FcConfig> mLastConfig;
a8a561
+    nsAutoRef<FcConfig> mLastConfig;
a8a561
 
a8a561
     // By default, font prefs under Linux are set to simply lookup
a8a561
     // via fontconfig the appropriate font for serif/sans-serif/monospace.