From aee07862deefba66f3a62327f24840464bc8159b Mon Sep 17 00:00:00 2001 From: "smontagu%smontagu.org" Date: Wed, 4 Aug 2004 21:48:39 +0000 Subject: [PATCH] Bug 120401: Font selection in pref. does not work (Hebrew, Arabic, CE, Baltic, Cyrillic, CJK, etc). Patch by Asaf Romano bugs.mano@mailcentral.com with contributions by me. r=jhpedemonte, sr=sfraser. --- gfx/src/mac/nsUnicodeFontMappingMac.cpp | 76 ++++++---------------- gfx/src/mac/nsUnicodeMappingUtil.cpp | 84 +++++-------------------- gfx/src/mac/nsUnicodeMappingUtil.h | 4 -- modules/libpref/src/init/all.js | 16 ++--- 4 files changed, 41 insertions(+), 139 deletions(-) diff --git a/gfx/src/mac/nsUnicodeFontMappingMac.cpp b/gfx/src/mac/nsUnicodeFontMappingMac.cpp index 80e0ebe4177..32707a22f71 100644 --- a/gfx/src/mac/nsUnicodeFontMappingMac.cpp +++ b/gfx/src/mac/nsUnicodeFontMappingMac.cpp @@ -58,33 +58,6 @@ static UnicodeToTextInfo gConverters[32] = { nsnull, nsnull, nsnull, nsnull, nsnull, nsnull, nsnull, nsnull }; //------------------------------------------------------------------------ -static UnicodeToTextInfo -GetConverterByScript(ScriptCode sc) -{ - // because the Mac QuickDraw BIDI support are quite different from other platform - // we try not to use them and use the XP BIDI feature - // those text will be drawn by ATSUI intead one character at a time - if ((sc == smArabic) || (sc == smHebrew)) - return nsnull; - NS_PRECONDITION(sc < 32, "illegal script id"); - if(sc >= 32) - return nsnull; - if (gConverters[sc] != nsnull) { - return gConverters[sc]; - } - OSStatus err = noErr; - - // - TextEncoding scriptEncoding; - err = ::UpgradeScriptInfoToTextEncoding(sc, kTextLanguageDontCare, kTextRegionDontCare, nsnull, &scriptEncoding); - if ( noErr == err ) - err = ::CreateUnicodeToTextInfoByEncoding(scriptEncoding, &gConverters[sc] ); - - if (noErr != err) - gConverters[sc] = nsnull; - return gConverters[sc]; -} - class nsUnicodeFontMappingEntry { @@ -122,18 +95,7 @@ public: } return PR_FALSE; } - - UnicodeToTextInfo converter = GetConverterByScript(mScript); - if(converter) - { - OSStatus err = ::ConvertFromUnicodeToText(converter, 2 * aStringLength, - (ConstUniCharArrayPtr) aString, - opts, 0, NULL, 0, NULL, - aBufferLength, &oBytesRead, &oActualLength, - (LogicalAddress) aBuffer); - - return (oActualLength > 0 ? PR_TRUE : PR_FALSE); - } + return PR_FALSE; } @@ -298,21 +260,20 @@ void nsUnicodeFontMappingMac::InitByFontFamily(nsFont* aFont, nsIDeviceContext * void nsUnicodeFontMappingMac::processOneLangRegion(const char* aLanguage, const char* aRegion ) { - if(gUtil->ScriptEnabled(smTradChinese) && - ((! nsCRT::strcmp(aLanguage,"zh")) && - ((! nsCRT::strcmp(aRegion,"TW")) || (! nsCRT::strcmp(aRegion,"HK"))))) + if ((! nsCRT::strcmp(aLanguage,"zh")) && + ((! nsCRT::strcmp(aRegion,"TW")) || (! nsCRT::strcmp(aRegion,"HK")))) { FillVarBlockToScript(smTradChinese, mPrivBlockToScript); } - else if(gUtil->ScriptEnabled(smSimpChinese) && (! nsCRT::strcmp(aLanguage,"zh"))) + else if(! nsCRT::strcmp(aLanguage,"zh")) { FillVarBlockToScript(smSimpChinese, mPrivBlockToScript); } - else if(gUtil->ScriptEnabled(smKorean) && (! nsCRT::strcmp(aLanguage,"ko"))) + else if(! nsCRT::strcmp(aLanguage,"ko")) { FillVarBlockToScript(smKorean, mPrivBlockToScript); } - else if(gUtil->ScriptEnabled(smJapanese) && (! nsCRT::strcmp(aLanguage,"ja"))) + else if(! nsCRT::strcmp(aLanguage,"ja")) { FillVarBlockToScript(smJapanese, mPrivBlockToScript); } @@ -407,25 +368,26 @@ void nsUnicodeFontMappingMac::InitByLANG(const nsString& aLANG) //-------------------------------------------------------------------------- void nsUnicodeFontMappingMac::InitByLangGroup(const nsString& aLangGroup) { - // do not countinue if there are no difference to look at the document Charset + // do not continue if there are no difference to look at the document Charset if( ScriptMapInitComplete() ) return; - if(gUtil->ScriptEnabled(smRoman) && aLangGroup.LowerCaseEqualsLiteral("x-western")) - { + if(aLangGroup.LowerCaseEqualsLiteral("x-western")) + { FillVarBlockToScript(smRoman, mPrivBlockToScript); - } else if(gUtil->ScriptEnabled(smSimpChinese) && aLangGroup.LowerCaseEqualsLiteral("zh-cn")) - { + } else if(aLangGroup.LowerCaseEqualsLiteral("zh-cn")) + { FillVarBlockToScript(smSimpChinese, mPrivBlockToScript); - } else if(gUtil->ScriptEnabled(smKorean) && aLangGroup.LowerCaseEqualsLiteral("ko")) - { + } else if(aLangGroup.LowerCaseEqualsLiteral("ko")) + { FillVarBlockToScript(smKorean, mPrivBlockToScript); - } else if((gUtil->ScriptEnabled(smTradChinese)) && ((aLangGroup.LowerCaseEqualsLiteral("zh-tw")) || (aLangGroup.LowerCaseEqualsLiteral("zh-hk")))) - { + } else if(aLangGroup.LowerCaseEqualsLiteral("zh-tw") || + aLangGroup.LowerCaseEqualsLiteral("zh-hk")) + { FillVarBlockToScript(smTradChinese, mPrivBlockToScript); - } else if(gUtil->ScriptEnabled(smJapanese) && aLangGroup.LowerCaseEqualsLiteral("ja")) - { + } else if(aLangGroup.LowerCaseEqualsLiteral("ja")) + { FillVarBlockToScript(smJapanese, mPrivBlockToScript); - } + } } //-------------------------------------------------------------------------- diff --git a/gfx/src/mac/nsUnicodeMappingUtil.cpp b/gfx/src/mac/nsUnicodeMappingUtil.cpp index f38dc2975ac..f16a5cd2053 100644 --- a/gfx/src/mac/nsUnicodeMappingUtil.cpp +++ b/gfx/src/mac/nsUnicodeMappingUtil.cpp @@ -80,11 +80,10 @@ void nsUnicodeMappingUtil::Reset() } void nsUnicodeMappingUtil::Init() { - InitScriptEnabled(); InitGenericFontMapping(); InitFromPref(); InitScriptFontMapping(); - InitBlockToScriptMapping(); // this must be called after InitScriptEnabled() + InitBlockToScriptMapping(); } void nsUnicodeMappingUtil::CleanUp() { @@ -110,22 +109,6 @@ nsUnicodeMappingUtil::~nsUnicodeMappingUtil() //-------------------------------------------------------------------------- -void nsUnicodeMappingUtil::InitScriptEnabled() -{ - PRUint8 numOfScripts = ::GetScriptManagerVariable(smEnabled); - ScriptCode script, gotScripts; - mScriptEnabled = 0; - PRUint32 scriptMask = 1; - for(script = gotScripts = 0; - ((script < smUninterp) && ( gotScripts < numOfScripts)) ; - script++, scriptMask <<= 1) - { - if(::GetScriptVariable(script, smScriptEnabled)) - mScriptEnabled |= scriptMask; - } -} -//-------------------------------------------------------------------------- - void nsUnicodeMappingUtil::InitGenericFontMapping() { for(int i= 0 ; i < smPseudoTotalScripts; i ++) @@ -165,31 +148,15 @@ void nsUnicodeMappingUtil::InitGenericFontMapping() mGenericFontMapping[smKorean][kSansSerif] = new nsAutoString( NS_LITERAL_STRING("AppleGothic") ); mGenericFontMapping[smKorean][kMonospace] = new nsAutoString( NS_LITERAL_STRING("AppleGothic") ); - // smArabic - static PRUnichar afontname1[] = { - 0x062B, 0x0644, 0x062B, 0x202E, 0x0020, 0x202C, 0x0623, 0x0628, 0x064A, 0x0636, 0x0000 // ˠ - }; - static PRUnichar afontname2[] = { - 0x0627, 0x0644, 0x0628, 0x064A, 0x0627, 0x0646, 0x0000 // - }; - static PRUnichar afontname3[] = { - 0x062C, 0x064A, 0x0632, 0x0629, 0x0000 // - }; - mGenericFontMapping[smArabic][kSerif] = new nsAutoString(afontname1); - mGenericFontMapping[smArabic][kSansSerif] = new nsAutoString(afontname2); - mGenericFontMapping[smArabic][kMonospace] = new nsAutoString(afontname3); + // smArabic + mGenericFontMapping[smArabic][kSerif] = new nsAutoString( NS_LITERAL_STRING("Lucida Grande") ); + mGenericFontMapping[smArabic][kSansSerif] = new nsAutoString( NS_LITERAL_STRING("Lucida Grande") ); + mGenericFontMapping[smArabic][kMonospace] = new nsAutoString( NS_LITERAL_STRING("Monaco") ); // smHebrew - static PRUnichar hfontname1[] = { - 0x05E4, 0x05E0, 0x05D9, 0x05E0, 0x05D9, 0x05DD, 0x202E, 0x0020, 0x202C, 0x05D7, 0x05D3, 0x05E9, 0x0000 // - }; - static PRUnichar hfontname2[] = { - 0x05D0, 0x05E8, 0x05D9, 0x05D0, 0x05DC, 0x0000 // - }; - - mGenericFontMapping[smHebrew][kSerif] = new nsAutoString(hfontname1); - mGenericFontMapping[smHebrew][kSansSerif] = new nsAutoString(hfontname2); - mGenericFontMapping[smHebrew][kMonospace] = new nsAutoString(hfontname2); + mGenericFontMapping[smHebrew][kSerif] = new nsAutoString( NS_LITERAL_STRING("Lucida Grande") ); + mGenericFontMapping[smHebrew][kSansSerif] = new nsAutoString( NS_LITERAL_STRING("Lucida Grande") ); + mGenericFontMapping[smHebrew][kMonospace] = new nsAutoString( NS_LITERAL_STRING("Monaco") ); // smCyrillic mGenericFontMapping[smCyrillic][kSerif] = new nsAutoString( NS_LITERAL_STRING("Latinski") ); @@ -346,13 +313,6 @@ nsUnicodeMappingUtil::PrefEnumCallback(const char* aName, void* aClosure) nsString *fontname = new nsAutoString(valueInUCS2); if(nsnull == fontname) return; - short fontID=0; - if( (! nsDeviceContextMac::GetMacFontNumber(*fontname, fontID)) || - ((script < smUninterp) && (::FontToScript(fontID) != script))) - { - delete fontname; - return; - } if( Self->mGenericFontMapping[script][type] ) delete Self->mGenericFontMapping[script][type]; Self->mGenericFontMapping[script][type] = fontname; @@ -424,8 +384,11 @@ void nsUnicodeMappingUtil::InitScriptFontMapping() } } } - else if(ScriptEnabled(script)) { + else { long fondsize = ::GetScriptVariable(script, smScriptPrefFondSize); + if (!fondsize) + fondsize = ::GetScriptVariable(smUnicodeScript, smScriptPrefFondSize); + if((fondsize) && ((fondsize >> 16))) { fontNum = (fondsize >> 16); mScriptFontMapping[script] = fontNum; @@ -453,27 +416,8 @@ void nsUnicodeMappingUtil::InitBlockToScriptMapping() }; for(PRUint32 i= 0; i < kUnicodeBlockSize; i++) { - if( ScriptEnabled(prebuildMapping[i]) ) { - mBlockToScriptMapping[i] = prebuildMapping[i]; - } else { - if (i == kUserDefinedEncoding) - mBlockToScriptMapping[i] = prebuildMapping[i]; - else if(i < kUnicodeBlockFixedScriptMax) { - mBlockToScriptMapping[i] = (PRInt8) smRoman; - } else { - if( (kCJKMisc == i) || (kHiraganaKatakana == i) || (kCJKIdeographs == i) ) { - // fallback in the following sequence - // smTradChinese smKorean smSimpChinese - mBlockToScriptMapping[i] = (PRInt8) - ( ScriptEnabled(smTradChinese) ? smTradChinese : - ( ScriptEnabled(smKorean) ? smKorean : - ( ScriptEnabled(smSimpChinese) ? smSimpChinese : smRoman ) - ) - ); - } - } - } - } + mBlockToScriptMapping[i] = prebuildMapping[i]; + } } //-------------------------------------------------------------------------- diff --git a/gfx/src/mac/nsUnicodeMappingUtil.h b/gfx/src/mac/nsUnicodeMappingUtil.h index b5aeedc498d..e3b796a9e71 100644 --- a/gfx/src/mac/nsUnicodeMappingUtil.h +++ b/gfx/src/mac/nsUnicodeMappingUtil.h @@ -63,8 +63,6 @@ public: void Init(); void CleanUp(); void Reset(); - inline PRBool ScriptEnabled(ScriptCode script) - { return (0 != (mScriptEnabled & (1L << script))); }; inline ScriptCode BlockToScript(nsUnicodeBlock blockID) { NS_PRECONDITION(blockID < kUnicodeBlockSize, "illegal value"); @@ -92,7 +90,6 @@ public: nsString *mGenericFontMapping[smPseudoTotalScripts][kUknownGenericFontName]; protected: - void InitScriptEnabled(); void InitGenericFontMapping(); void InitBlockToScriptMapping(); void InitScriptFontMapping(); @@ -102,7 +99,6 @@ protected: static void PR_CALLBACK_DECL PrefEnumCallback(const char* aName, void* aClosure); private: - PRUint32 mScriptEnabled; short mScriptFontMapping[smPseudoTotalScripts]; PRInt8 mBlockToScriptMapping[kUnicodeBlockSize]; nsCOMPtr mPref; diff --git a/modules/libpref/src/init/all.js b/modules/libpref/src/init/all.js index 7912aec0ed0..3d1cb78b71e 100644 --- a/modules/libpref/src/init/all.js +++ b/modules/libpref/src/init/all.js @@ -1053,9 +1053,9 @@ pref("browser.always_reuse_window", false); // default font name (in UTF8) -pref("font.name.serif.ar", "ثلث‮ ‬أبيض"); -pref("font.name.sans-serif.ar", "البيان"); -pref("font.name.monospace.ar", "جيزة"); +pref("font.name.serif.ar", "Lucida Grande"); +pref("font.name.sans-serif.ar", "Lucida Grande"); +pref("font.name.monospace.ar", "Monaco"); pref("font.name.cursive.ar", "XXX.cursive"); pref("font.name.fantasy.ar", "XXX.fantasy"); @@ -1065,9 +1065,9 @@ pref("font.name.monospace.el", "Courier GR"); pref("font.name.cursive.el", "XXX.cursive"); pref("font.name.fantasy.el", "XXX.fantasy"); -pref("font.name.serif.he", "פנינים‮ ‬חדש"); -pref("font.name.sans-serif.he", "אריאל"); -pref("font.name.monospace.he", "אריאל"); +pref("font.name.serif.he", "Lucida Grande"); +pref("font.name.sans-serif.he", "Lucida Grande"); +pref("font.name.monospace.he", "Monaco"); pref("font.name.cursive.he", "XXX.cursive"); pref("font.name.fantasy.he", "XXX.fantasy"); @@ -1148,13 +1148,13 @@ pref("font.name.fantasy.zh-HK", "XXX.fantasy"); pref("font.default", "serif"); pref("font.default", "serif"); -pref("font.size.variable.ar", 16); +pref("font.size.variable.ar", 15); pref("font.size.fixed.ar", 13); pref("font.size.variable.el", 16); pref("font.size.fixed.el", 13); -pref("font.size.variable.he", 16); +pref("font.size.variable.he", 15); pref("font.size.fixed.he", 13); pref("font.size.variable.ja", 14);