From 1643d9517217c56137dead6b1076232d837fce0f Mon Sep 17 00:00:00 2001
From: "bstell%netscape.com" <bstell%netscape.com>
Date: Wed, 15 Aug 2001 04:18:22 +0000
Subject: [PATCH] bug 90736, r=ftang, sr=blizzard for western documents find
 special chars ("smart quotes", bullet) glyphs from adobe-fontspecific fonts
 before Japanese fonts or the early transliterator

---
 gfx/src/gtk/nsFontMetricsGTK.cpp | 126 +++++++++++++++++--------------
 1 file changed, 69 insertions(+), 57 deletions(-)

diff --git a/gfx/src/gtk/nsFontMetricsGTK.cpp b/gfx/src/gtk/nsFontMetricsGTK.cpp
index 0315a1f57be27..b65ff6684c38d 100644
--- a/gfx/src/gtk/nsFontMetricsGTK.cpp
+++ b/gfx/src/gtk/nsFontMetricsGTK.cpp
@@ -2907,60 +2907,60 @@ SetFontLangGroupInfo(nsFontCharSetMap* aCharSetMap)
   // get the atom for mFontLangGroup->mFontLangGroupName so we can
   // apply fontLangGroup operations to it
   // eg: search for related groups, check for scaling prefs
+  const char *langGroup = fontLangGroup->mFontLangGroupName;
+  if (!langGroup)
+    langGroup = "";
   if (!fontLangGroup->mFontLangGroupAtom) {
-    const char *langGroup = fontLangGroup->mFontLangGroupName;
-    if (!langGroup)
-      langGroup = "";
     fontLangGroup->mFontLangGroupAtom = NS_NewAtom(langGroup);
+  }
 
-    // get the font scaling controls
-    nsFontCharSetInfo *charSetInfo = aCharSetMap->mInfo;
-    if (!charSetInfo->mInitedSizeInfo) {
-      charSetInfo->mInitedSizeInfo = PR_TRUE;
-
-      nsCAutoString name;
-      name.Assign("font.scale.outline.min.");
-      name.Append(langGroup);
-      gPref->GetIntPref(name.get(), &charSetInfo->mOutlineScaleMin);
-      if (charSetInfo->mOutlineScaleMin)
-        SIZE_FONT_PRINTF(("%s = %d", name.get(), 
-                                 charSetInfo->mOutlineScaleMin));
-      else
-        charSetInfo->mOutlineScaleMin = gOutlineScaleMinimum;
-
-      name.Assign("font.scale.bitmap.min.");
-      name.Append(langGroup);
-      gPref->GetIntPref(name.get(), &charSetInfo->mBitmapScaleMin);
-      if (charSetInfo->mBitmapScaleMin)
-        SIZE_FONT_PRINTF(("%s = %d", name.get(), 
-                                 charSetInfo->mBitmapScaleMin));
-      else
-        charSetInfo->mBitmapScaleMin = gBitmapScaleMinimum;
-
-      PRInt32 percent = 0;
-      name.Assign("font.scale.bitmap.oversize.");
-      name.Append(langGroup);
-      gPref->GetIntPref(name.get(), &percent);
-      if (percent) {
-        charSetInfo->mBitmapOversize = percent/100.0;
-        SIZE_FONT_PRINTF(("%s = %g", name.get(), 
-                                 charSetInfo->mBitmapOversize));
-      }
-      else
-        charSetInfo->mBitmapOversize = gBitmapOversize;
-
-      percent = 0;
-      name.Assign("font.scale.bitmap.undersize.");
-      name.Append(langGroup);
-      gPref->GetIntPref(name.get(), &percent);
-      if (percent) {
-        charSetInfo->mBitmapUndersize = percent/100.0;
-        SIZE_FONT_PRINTF(("%s = %g", name.get(), 
-                                 charSetInfo->mBitmapUndersize));
-      }
-      else
-        charSetInfo->mBitmapUndersize = gBitmapUndersize;
-    }
+  // get the font scaling controls
+  nsFontCharSetInfo *charSetInfo = aCharSetMap->mInfo;
+  if (!charSetInfo->mInitedSizeInfo) {
+    charSetInfo->mInitedSizeInfo = PR_TRUE;
+
+    nsCAutoString name;
+    name.Assign("font.scale.outline.min.");
+    name.Append(langGroup);
+    gPref->GetIntPref(name.get(), &charSetInfo->mOutlineScaleMin);
+    if (charSetInfo->mOutlineScaleMin)
+      SIZE_FONT_PRINTF(("%s = %d", name.get(), 
+                               charSetInfo->mOutlineScaleMin));
+    else
+      charSetInfo->mOutlineScaleMin = gOutlineScaleMinimum;
+
+    name.Assign("font.scale.bitmap.min.");
+    name.Append(langGroup);
+    gPref->GetIntPref(name.get(), &charSetInfo->mBitmapScaleMin);
+    if (charSetInfo->mBitmapScaleMin)
+      SIZE_FONT_PRINTF(("%s = %d", name.get(), 
+                               charSetInfo->mBitmapScaleMin));
+    else
+      charSetInfo->mBitmapScaleMin = gBitmapScaleMinimum;
+
+    PRInt32 percent = 0;
+    name.Assign("font.scale.bitmap.oversize.");
+    name.Append(langGroup);
+    gPref->GetIntPref(name.get(), &percent);
+    if (percent) {
+      charSetInfo->mBitmapOversize = percent/100.0;
+      SIZE_FONT_PRINTF(("%s = %g", name.get(), 
+                               charSetInfo->mBitmapOversize));
+    }
+    else
+      charSetInfo->mBitmapOversize = gBitmapOversize;
+
+    percent = 0;
+    name.Assign("font.scale.bitmap.undersize.");
+    name.Append(langGroup);
+    gPref->GetIntPref(name.get(), &percent);
+    if (percent) {
+      charSetInfo->mBitmapUndersize = percent/100.0;
+      SIZE_FONT_PRINTF(("%s = %g", name.get(), 
+                               charSetInfo->mBitmapUndersize));
+    }
+    else
+      charSetInfo->mBitmapUndersize = gBitmapUndersize;
   }
 }
 
@@ -3706,24 +3706,36 @@ if (gAllowDoubleByteSpecialChars) {
     }
     if (mDocConverterType == SingleByteConvert) {
       // before we put in the transliterator to disable double byte special chars
-      // make sure we search x-western to get the EURO sign
+      // add the x-western font before the early transliterator
+      // to get the EURO sign (hack)
+
       nsFontGTK* western_font = nsnull;
       if (mLangGroup != gWesternLocale)
         western_font = FindLangGroupPrefFont(gWesternLocale, aChar);
+
+      // add the symbol font before the early transliterator
+      // to get the bullet (hack)
+      nsCAutoString ffre("*-symbol-adobe-fontspecific");
+      nsFontGTK* symbol_font = TryNodes(ffre, 0x0030);
+
+      // add the early transliterator
+      // to avoid getting Japanese "special chars" such as smart
+      // since they are very oversized compared to western fonts
       nsFontGTK* sub_font = FindSubstituteFont(aChar);
       NS_ASSERTION(sub_font, "failed to get a special chars substitute font");
       if (sub_font) {
         sub_font->mMap = gDoubleByteSpecialCharsMap;
         AddToLoadedFontsList(sub_font);
       }
-      if (western_font) {
-        NS_ASSERTION(western_font->SupportsChar(aChar), "font supposed to support this char");
+      if (western_font && FONT_HAS_GLYPH(western_font->mMap, aChar)) {
         return western_font;
       }
-      else if (sub_font) {
+      else if (symbol_font && FONT_HAS_GLYPH(symbol_font->mMap, aChar)) {
+        return symbol_font;
+      }
+      else if (sub_font && FONT_HAS_GLYPH(sub_font->mMap, aChar)) {
         FIND_FONT_PRINTF(("      transliterate special chars for single byte docs"));
-        if (FONT_HAS_GLYPH(sub_font->mMap, aChar))
-          return sub_font;
+        return sub_font;
       }
     }
   }
-- 
GitLab