зеркало из https://github.com/mozilla/pjs.git
First Checked In.
This commit is contained in:
Родитель
fdeef7af48
Коммит
2c53d70289
|
@ -0,0 +1,61 @@
|
||||||
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Netscape Public License
|
||||||
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||||
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||||
|
* http://www.mozilla.org/NPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||||
|
* for the specific language governing rights and limitations under the
|
||||||
|
* NPL.
|
||||||
|
*
|
||||||
|
* The Initial Developer of this code under the NPL is Netscape
|
||||||
|
* Communications Corporation. Portions created by Netscape are
|
||||||
|
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||||
|
* Reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef nsUnicodeBlock_h__
|
||||||
|
#define nsUnicodeBlock_h__
|
||||||
|
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
// blocks which always use the same script to render, regardless of the order of fonts
|
||||||
|
kGreek = 0,
|
||||||
|
kCyrillic,
|
||||||
|
kArmenian,
|
||||||
|
kHebrew,
|
||||||
|
kArabic,
|
||||||
|
kDevanagari,
|
||||||
|
kBengali,
|
||||||
|
kGurmukhi,
|
||||||
|
kGujarati,
|
||||||
|
kOriya,
|
||||||
|
kTamil,
|
||||||
|
kTelugu,
|
||||||
|
kKannada,
|
||||||
|
kMalayalam,
|
||||||
|
kThai,
|
||||||
|
kLao,
|
||||||
|
kTibetan,
|
||||||
|
kGeorgian,
|
||||||
|
kHangul,
|
||||||
|
kBopomofo,
|
||||||
|
|
||||||
|
kUnicodeBlockFixedScriptMax,
|
||||||
|
|
||||||
|
// blocks which may use different script to render, depend on the order of fonts
|
||||||
|
kBasicLatin = kUnicodeBlockFixedScriptMax,
|
||||||
|
kLatin ,
|
||||||
|
kCJKMisc,
|
||||||
|
kHiraganaKatakana,
|
||||||
|
kCJKIdeographs,
|
||||||
|
kOthers,
|
||||||
|
|
||||||
|
kUnicodeBlockSize,
|
||||||
|
|
||||||
|
kUnicodeBlockVarScriptMax = kUnicodeBlockSize - kUnicodeBlockFixedScriptMax
|
||||||
|
} nsUnicodeBlock;
|
||||||
|
|
||||||
|
#endif nsUnicodeBlock_h__
|
|
@ -0,0 +1,92 @@
|
||||||
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Netscape Public License
|
||||||
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||||
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||||
|
* http://www.mozilla.org/NPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||||
|
* for the specific language governing rights and limitations under the
|
||||||
|
* NPL.
|
||||||
|
*
|
||||||
|
* The Initial Developer of this code under the NPL is Netscape
|
||||||
|
* Communications Corporation. Portions created by Netscape are
|
||||||
|
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||||
|
* Reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef nsUnicodeFallbackCache_h__
|
||||||
|
#define nsUnicodeFallbackCache_h__
|
||||||
|
#include "prtypes.h"
|
||||||
|
#include "plhash.h"
|
||||||
|
#include <Script.h>
|
||||||
|
#include "nsDebug.h"
|
||||||
|
#include "nscore.h"
|
||||||
|
|
||||||
|
class nsUnicodeFallbackCache
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
nsUnicodeFallbackCache()
|
||||||
|
{
|
||||||
|
mTable = PL_NewHashTable(8, (PLHashFunction)HashKey,
|
||||||
|
(PLHashComparator)CompareKeys,
|
||||||
|
(PLHashComparator)CompareValues,
|
||||||
|
nsnull, nsnull);
|
||||||
|
mCount = 0;
|
||||||
|
};
|
||||||
|
~nsUnicodeFallbackCache()
|
||||||
|
{
|
||||||
|
if (mTable)
|
||||||
|
{
|
||||||
|
PL_HashTableEnumerateEntries(mTable, FreeHashEntries, 0);
|
||||||
|
PL_HashTableDestroy(mTable);
|
||||||
|
mTable = nsnull;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
inline PRBool Get(PRUnichar aChar, ScriptCode& oScript)
|
||||||
|
{
|
||||||
|
ScriptCode ret = (ScriptCode)PL_HashTableLookup(mTable, (void*)aChar);
|
||||||
|
oScript = 0x00FF & ret ;
|
||||||
|
return 0x00 != (0xFF00 & ret);
|
||||||
|
};
|
||||||
|
|
||||||
|
inline void Set(PRUnichar aChar, ScriptCode aScript)
|
||||||
|
{
|
||||||
|
PL_HashTableAdd(mTable,(void*) aChar, (void*)(aScript | 0xFF00));
|
||||||
|
mCount ++;
|
||||||
|
};
|
||||||
|
|
||||||
|
inline static nsUnicodeFallbackCache* GetSingleton()
|
||||||
|
{
|
||||||
|
if(! gSingleton)
|
||||||
|
gSingleton = new nsUnicodeFallbackCache();
|
||||||
|
return gSingleton;
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
inline static PR_CALLBACK PLHashNumber HashKey(const void *aKey)
|
||||||
|
{
|
||||||
|
return (PRUnichar)aKey;
|
||||||
|
};
|
||||||
|
|
||||||
|
inline static PR_CALLBACK PRIntn CompareKeys(const void *v1, const void *v2)
|
||||||
|
{
|
||||||
|
return (((PRUnichar ) v1) == ((PRUnichar ) v2));
|
||||||
|
};
|
||||||
|
|
||||||
|
inline static PR_CALLBACK PRIntn CompareValues(const void *v1, const void *v2)
|
||||||
|
{
|
||||||
|
return (((ScriptCode)v1) == ((ScriptCode)v2));
|
||||||
|
};
|
||||||
|
inline static PR_CALLBACK PRIntn FreeHashEntries(PLHashEntry *he, PRIntn italic, void *arg)
|
||||||
|
{
|
||||||
|
return HT_ENUMERATE_REMOVE;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct PLHashTable* mTable;
|
||||||
|
PRUint32 mCount;
|
||||||
|
|
||||||
|
static nsUnicodeFallbackCache* gSingleton;
|
||||||
|
};
|
||||||
|
#endif nsUnicodeFallbackCache_h__
|
|
@ -0,0 +1,86 @@
|
||||||
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Netscape Public License
|
||||||
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||||
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||||
|
* http://www.mozilla.org/NPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||||
|
* for the specific language governing rights and limitations under the
|
||||||
|
* NPL.
|
||||||
|
*
|
||||||
|
* The Initial Developer of this code under the NPL is Netscape
|
||||||
|
* Communications Corporation. Portions created by Netscape are
|
||||||
|
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||||
|
* Reserved.
|
||||||
|
*/
|
||||||
|
#ifndef nsUnicodeFontMappingCache_h__
|
||||||
|
#define nsUnicodeFontMappingCache_h__
|
||||||
|
#include "plhash.h"
|
||||||
|
#include "nsCRT.h"
|
||||||
|
#include "nsString.h"
|
||||||
|
#include "nsUnicodeFontMappingMac.h"
|
||||||
|
|
||||||
|
class nsUnicodeFontMappingCache
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
nsUnicodeFontMappingCache()
|
||||||
|
{
|
||||||
|
mTable = PL_NewHashTable(8, (PLHashFunction)HashKey,
|
||||||
|
(PLHashComparator)CompareKeys,
|
||||||
|
(PLHashComparator)CompareValues,
|
||||||
|
nsnull, nsnull);
|
||||||
|
mCount = 0;
|
||||||
|
};
|
||||||
|
~nsUnicodeFontMappingCache()
|
||||||
|
{
|
||||||
|
if (mTable)
|
||||||
|
{
|
||||||
|
PL_HashTableEnumerateEntries(mTable, FreeHashEntries, 0);
|
||||||
|
PL_HashTableDestroy(mTable);
|
||||||
|
mTable = nsnull;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
inline PRBool Get(const nsString& key, nsUnicodeFontMappingMac **item)
|
||||||
|
{
|
||||||
|
*item = (nsUnicodeFontMappingMac*)PL_HashTableLookup(mTable, &key);
|
||||||
|
return nsnull != (*item);
|
||||||
|
};
|
||||||
|
inline void Set(const nsString& key, nsUnicodeFontMappingMac *item)
|
||||||
|
{
|
||||||
|
nsString *newKey = new nsString(key);
|
||||||
|
if (newKey)
|
||||||
|
{
|
||||||
|
PL_HashTableAdd(mTable, newKey, item);
|
||||||
|
mCount ++;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private:
|
||||||
|
inline static PR_CALLBACK PLHashNumber HashKey(const void *aKey)
|
||||||
|
{
|
||||||
|
PRUint32 uslen;
|
||||||
|
return nsCRT::HashValue(((nsString*)aKey)->GetUnicode(), &uslen);
|
||||||
|
};
|
||||||
|
inline static PR_CALLBACK PRIntn CompareKeys(const void *v1, const void *v2)
|
||||||
|
{
|
||||||
|
return ((nsString *)v1) -> Equals(* ((nsString *)v2));
|
||||||
|
};
|
||||||
|
inline static PR_CALLBACK PRIntn CompareValues(const void *v1, const void *v2)
|
||||||
|
{
|
||||||
|
return ((nsUnicodeFontMappingMac*)v1) -> Equals(* ((nsUnicodeFontMappingMac*)v2));
|
||||||
|
};
|
||||||
|
inline static PR_CALLBACK PRIntn FreeHashEntries(PLHashEntry *he, PRIntn italic, void *arg)
|
||||||
|
{
|
||||||
|
delete (nsString*)he->key;
|
||||||
|
delete (nsUnicodeFontMappingMac*)he->value;
|
||||||
|
return HT_ENUMERATE_REMOVE;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct PLHashTable* mTable;
|
||||||
|
PRUint32 mCount;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* nsUnicodeFontMappingCache_h__ */
|
|
@ -0,0 +1,505 @@
|
||||||
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Netscape Public License
|
||||||
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||||
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||||
|
* http://www.mozilla.org/NPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||||
|
* for the specific language governing rights and limitations under the
|
||||||
|
* NPL.
|
||||||
|
*
|
||||||
|
* The Initial Developer of this code under the NPL is Netscape
|
||||||
|
* Communications Corporation. Portions created by Netscape are
|
||||||
|
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||||
|
* Reserved.
|
||||||
|
*/
|
||||||
|
#include <Script.h>
|
||||||
|
#include "nsDeviceContextMac.h"
|
||||||
|
#include "plhash.h"
|
||||||
|
#include "nsCRT.h"
|
||||||
|
|
||||||
|
#include "nsUnicodeFontMappingMac.h"
|
||||||
|
#include "nsUnicodeFontMappingCache.h"
|
||||||
|
#include "nsUnicodeMappingUtil.h"
|
||||||
|
#define BAD_FONT_NUM -1
|
||||||
|
#define BAD_SCRIPT 0x7f
|
||||||
|
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
|
||||||
|
static void FillVarBlockToScript( PRInt8 script, PRInt8 *aMap)
|
||||||
|
{
|
||||||
|
if(BAD_SCRIPT == aMap[kBasicLatin - kUnicodeBlockFixedScriptMax])
|
||||||
|
aMap[kBasicLatin - kUnicodeBlockFixedScriptMax] = script;
|
||||||
|
if(BAD_SCRIPT == aMap[kOthers - kUnicodeBlockFixedScriptMax])
|
||||||
|
aMap[kOthers - kUnicodeBlockFixedScriptMax] = script;
|
||||||
|
switch( script )
|
||||||
|
{
|
||||||
|
case smRoman:
|
||||||
|
case smCentralEuroRoman:
|
||||||
|
case smVietnamese:
|
||||||
|
if(BAD_SCRIPT == aMap[kLatin - kUnicodeBlockFixedScriptMax])
|
||||||
|
aMap[kLatin - kUnicodeBlockFixedScriptMax] = script;
|
||||||
|
break;
|
||||||
|
case smTradChinese:
|
||||||
|
if(BAD_SCRIPT == aMap[kCJKMisc - kUnicodeBlockFixedScriptMax])
|
||||||
|
aMap[kCJKMisc - kUnicodeBlockFixedScriptMax] = script;
|
||||||
|
if(BAD_SCRIPT == aMap[kCJKIdeographs - kUnicodeBlockFixedScriptMax])
|
||||||
|
aMap[kCJKIdeographs - kUnicodeBlockFixedScriptMax] = script;
|
||||||
|
break;
|
||||||
|
case smKorean:
|
||||||
|
case smJapanese:
|
||||||
|
case smSimpChinese:
|
||||||
|
if(BAD_SCRIPT == aMap[kCJKMisc - kUnicodeBlockFixedScriptMax])
|
||||||
|
aMap[kCJKMisc - kUnicodeBlockFixedScriptMax] = script;
|
||||||
|
if(BAD_SCRIPT == aMap[kCJKIdeographs - kUnicodeBlockFixedScriptMax])
|
||||||
|
aMap[kCJKIdeographs - kUnicodeBlockFixedScriptMax] = script;
|
||||||
|
if(BAD_SCRIPT == aMap[kHiraganaKatakana - kUnicodeBlockFixedScriptMax])
|
||||||
|
aMap[kHiraganaKatakana - kUnicodeBlockFixedScriptMax] = script;
|
||||||
|
break;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
struct MyFontEnumData {
|
||||||
|
MyFontEnumData(nsIDeviceContext* aDC, PRInt8* pMap, short* pFonts) : mContext(aDC) {
|
||||||
|
mMap = pMap;
|
||||||
|
mFont = pFonts;
|
||||||
|
};
|
||||||
|
nsIDeviceContext* mContext;
|
||||||
|
PRInt8 *mMap;
|
||||||
|
short *mFont;
|
||||||
|
};
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
|
||||||
|
static PRBool FontEnumCallback(const nsString& aFamily, PRBool aGeneric, void *aData)
|
||||||
|
{
|
||||||
|
MyFontEnumData* data = (MyFontEnumData*)aData;
|
||||||
|
nsUnicodeMappingUtil * info = nsUnicodeMappingUtil::GetSingleton();
|
||||||
|
NS_PRECONDITION(info != nsnull, "out of memory");
|
||||||
|
if (aGeneric)
|
||||||
|
{
|
||||||
|
if(nsnull == info)
|
||||||
|
return PR_FALSE;
|
||||||
|
nsGenericFontNameType type = info->MapGenericFontNameType(aFamily);
|
||||||
|
|
||||||
|
if( type != kUknownGenericFontName) {
|
||||||
|
for(ScriptCode script = 0; script < 32 ; script++)
|
||||||
|
{
|
||||||
|
const nsString* fontName = info->GenericFontNameForScript(script,type);
|
||||||
|
if(nsnull != fontName) {
|
||||||
|
short fontNum;
|
||||||
|
nsDeviceContextMac::GetMacFontNumber(*fontName, fontNum);
|
||||||
|
|
||||||
|
if((0 != fontNum) && (BAD_FONT_NUM == data->mFont[ script ]))
|
||||||
|
data->mFont[ script ] = fontNum;
|
||||||
|
// since this is a generic font name, it won't impact the order of script we used
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nsAutoString realFace;
|
||||||
|
PRBool aliased;
|
||||||
|
data->mContext->GetLocalFontName(aFamily, realFace, aliased);
|
||||||
|
if (aliased || (NS_OK == data->mContext->CheckFontExistence(realFace)))
|
||||||
|
{
|
||||||
|
short fontNum;
|
||||||
|
nsDeviceContextMac::GetMacFontNumber(realFace, fontNum);
|
||||||
|
|
||||||
|
if(0 != fontNum) {
|
||||||
|
ScriptCode script = ::FontToScript(fontNum);
|
||||||
|
if(BAD_FONT_NUM == data->mFont[ script ])
|
||||||
|
data->mFont[ script ] = fontNum;
|
||||||
|
FillVarBlockToScript( script, data->mMap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return PR_TRUE;
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
nsUnicodeMappingUtil *nsUnicodeFontMappingMac::gUtil = nsnull;
|
||||||
|
nsUnicodeFontMappingCache *nsUnicodeFontMappingMac::gCache = nsnull;
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void nsUnicodeFontMappingMac::InitByFontFamily(nsFont* aFont, nsIDeviceContext *aDeviceContext)
|
||||||
|
{
|
||||||
|
MyFontEnumData fontData(aDeviceContext, mPrivBlockToScript, mScriptFallbackFontIDs);
|
||||||
|
aFont->EnumerateFamilies(FontEnumCallback, &fontData);
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void nsUnicodeFontMappingMac::processOneLangRegion(const char* aLanguage, const char* aRegion )
|
||||||
|
{
|
||||||
|
if(! nsCRT::strcmp(aLanguage,"zh")) {
|
||||||
|
if((! nsCRT::strcmp(aRegion,"TW")) || (! nsCRT::strcmp(aRegion,"HK"))) {
|
||||||
|
if(gUtil->ScriptEnabled(smTradChinese))
|
||||||
|
FillVarBlockToScript(smTradChinese, mPrivBlockToScript);
|
||||||
|
} else {
|
||||||
|
if(gUtil->ScriptEnabled(smSimpChinese))
|
||||||
|
FillVarBlockToScript(smSimpChinese, mPrivBlockToScript);
|
||||||
|
}
|
||||||
|
} else if(! nsCRT::strcmp(aLanguage,"ko")) {
|
||||||
|
if(gUtil->ScriptEnabled(smKorean))
|
||||||
|
FillVarBlockToScript(smKorean, mPrivBlockToScript);
|
||||||
|
} else if(! nsCRT::strcmp(aLanguage,"ja")) {
|
||||||
|
if(gUtil->ScriptEnabled(smJapanese))
|
||||||
|
FillVarBlockToScript(smJapanese, mPrivBlockToScript);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
PRBool nsUnicodeFontMappingMac::ScriptMapInitComplete()
|
||||||
|
{
|
||||||
|
PRInt32 i;
|
||||||
|
for(i = kUnicodeBlockFixedScriptMax ; i < kUnicodeBlockSize; i++) {
|
||||||
|
if(BAD_SCRIPT == mPrivBlockToScript[i - kUnicodeBlockFixedScriptMax])
|
||||||
|
return PR_FALSE;
|
||||||
|
}
|
||||||
|
return PR_TRUE;
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
|
||||||
|
const PRUnichar kA = PRUnichar('A');
|
||||||
|
const PRUnichar kZ = PRUnichar('Z');
|
||||||
|
const PRUnichar ka = PRUnichar('a');
|
||||||
|
const PRUnichar kz = PRUnichar('z');
|
||||||
|
const PRUnichar kComma = PRUnichar(',');
|
||||||
|
const PRUnichar kUnderline = PRUnichar('_');
|
||||||
|
const PRUnichar kSpace = PRUnichar(' ');
|
||||||
|
const PRUnichar kNullCh = PRUnichar('\0');
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void nsUnicodeFontMappingMac::InitByLANG(const nsString& aLANG)
|
||||||
|
{
|
||||||
|
// do not countinue if there are no difference to look at the lang tag
|
||||||
|
if( ScriptMapInitComplete() )
|
||||||
|
return;
|
||||||
|
const PRUnichar *p = aLANG.GetUnicode();
|
||||||
|
PRUint32 len = aLANG.Length();
|
||||||
|
char language[3];
|
||||||
|
char region[3];
|
||||||
|
language[2] = region[2]= '\0';;
|
||||||
|
language[0]= language[1] = region[0]= region[1] = ' ';
|
||||||
|
PRUint32 state = 0;
|
||||||
|
|
||||||
|
for(PRUint32 i = 0; (state != -1) && (i < len); i++, p++)
|
||||||
|
{
|
||||||
|
switch (state) {
|
||||||
|
case 0:
|
||||||
|
if(( ka <= *p) && (*p <= kz )) {
|
||||||
|
language[state++] = (char)*p;
|
||||||
|
} else if( kSpace == *p) {
|
||||||
|
state = 0;
|
||||||
|
} else {
|
||||||
|
state = -1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
if(( ka <= *p) && (*p <= kz )) {
|
||||||
|
language[state++] = (char)*p;
|
||||||
|
} else {
|
||||||
|
state = -1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
if(kComma == *p) {
|
||||||
|
processOneLangRegion(language, region);
|
||||||
|
language[0]= language[1] = region[0]= region[1] = ' ';
|
||||||
|
state = 0;
|
||||||
|
} else if(kUnderline == *p) {
|
||||||
|
state = 3;
|
||||||
|
} else {
|
||||||
|
state = -1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
case 4:
|
||||||
|
if(( kA <= *p) && (*p <= kZ )) {
|
||||||
|
region[state - 3] = (char)*p;
|
||||||
|
state++;
|
||||||
|
} else {
|
||||||
|
state = -1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
if(kComma == *p) {
|
||||||
|
processOneLangRegion(language, region);
|
||||||
|
language[0]= language[1] = region[0]= region[1] = ' ';
|
||||||
|
state = 0;
|
||||||
|
} else {
|
||||||
|
state = -1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
if((2 == state) || (5 == state)) {
|
||||||
|
processOneLangRegion(language, region);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
void nsUnicodeFontMappingMac::InitByDocumentCharset(const nsString& aDocumentCharset)
|
||||||
|
{
|
||||||
|
// do not countinue if there are no difference to look at the document Charset
|
||||||
|
if( ScriptMapInitComplete() )
|
||||||
|
return;
|
||||||
|
if (aDocumentCharset.EqualsIgnoreCase("GB2312") ||
|
||||||
|
aDocumentCharset.EqualsIgnoreCase("ISO-2022-CN") ||
|
||||||
|
aDocumentCharset.EqualsIgnoreCase("ZH") )
|
||||||
|
{
|
||||||
|
if(gUtil->ScriptEnabled(smSimpChinese))
|
||||||
|
FillVarBlockToScript(smSimpChinese, mPrivBlockToScript);
|
||||||
|
} else if( aDocumentCharset.EqualsIgnoreCase("EUC-KR") ||
|
||||||
|
aDocumentCharset.EqualsIgnoreCase("ISO-2022-KR") )
|
||||||
|
{
|
||||||
|
if(gUtil->ScriptEnabled(smKorean))
|
||||||
|
FillVarBlockToScript(smKorean, mPrivBlockToScript);
|
||||||
|
} else if( aDocumentCharset.EqualsIgnoreCase("Big5") ||
|
||||||
|
aDocumentCharset.EqualsIgnoreCase("x-euc-tw") )
|
||||||
|
{
|
||||||
|
if(gUtil->ScriptEnabled(smTradChinese))
|
||||||
|
FillVarBlockToScript(smTradChinese, mPrivBlockToScript);
|
||||||
|
} else if( aDocumentCharset.EqualsIgnoreCase("Shift_JIS") ||
|
||||||
|
aDocumentCharset.EqualsIgnoreCase("EUC-JP") ||
|
||||||
|
aDocumentCharset.EqualsIgnoreCase("ISO-2022-JP") )
|
||||||
|
{
|
||||||
|
if(gUtil->ScriptEnabled(smJapanese))
|
||||||
|
FillVarBlockToScript(smJapanese, mPrivBlockToScript);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void nsUnicodeFontMappingMac::InitDefaultScriptFonts()
|
||||||
|
{
|
||||||
|
for(PRInt32 i = 0 ; i < 32; i++)
|
||||||
|
{
|
||||||
|
// copy from global mapping
|
||||||
|
if(BAD_FONT_NUM == mScriptFallbackFontIDs[i])
|
||||||
|
mScriptFallbackFontIDs[i] = gUtil->ScriptFont(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
|
||||||
|
nsUnicodeFontMappingMac::nsUnicodeFontMappingMac(
|
||||||
|
nsFont* aFont, nsIDeviceContext *aDeviceContext,
|
||||||
|
const nsString& aDocumentCharset, const nsString& aLANG)
|
||||||
|
{
|
||||||
|
PRInt32 i;
|
||||||
|
for(i = kUnicodeBlockFixedScriptMax ; i < kUnicodeBlockSize; i++)
|
||||||
|
mPrivBlockToScript[i - kUnicodeBlockFixedScriptMax] = BAD_SCRIPT;
|
||||||
|
for(i = 0 ; i < 32; i++)
|
||||||
|
mScriptFallbackFontIDs[i] = BAD_FONT_NUM;
|
||||||
|
|
||||||
|
InitByFontFamily(aFont, aDeviceContext);
|
||||||
|
InitByLANG(aLANG);
|
||||||
|
InitByDocumentCharset(aDocumentCharset);
|
||||||
|
InitDefaultScriptFonts();
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
|
||||||
|
nsUnicodeFontMappingMac* nsUnicodeFontMappingMac::GetCachedInstance(
|
||||||
|
nsFont* aFont, nsIDeviceContext *aDeviceContext, const nsString& aDocumentCharset, const nsString& aLANG)
|
||||||
|
{
|
||||||
|
if(! gUtil)
|
||||||
|
gUtil = nsUnicodeMappingUtil::GetSingleton();
|
||||||
|
if(! gCache)
|
||||||
|
gCache = gUtil->GetFontMappingCache();
|
||||||
|
|
||||||
|
nsUnicodeFontMappingMac* obj = nsnull;
|
||||||
|
nsAutoString key = aFont->name;
|
||||||
|
key.Append(":");
|
||||||
|
key.Append(aDocumentCharset);
|
||||||
|
key.Append(":");
|
||||||
|
key.Append(aLANG);
|
||||||
|
if(! gCache->Get ( key, &obj )){
|
||||||
|
obj = new nsUnicodeFontMappingMac(aFont, aDeviceContext, aDocumentCharset, aLANG);
|
||||||
|
if( obj )
|
||||||
|
gCache->Set ( key, obj);
|
||||||
|
}
|
||||||
|
NS_PRECONDITION(nsnull != obj, "out of memory");
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
|
||||||
|
PRBool nsUnicodeFontMappingMac::Equals(const nsUnicodeFontMappingMac& aMap)
|
||||||
|
{
|
||||||
|
PRUint32 i;
|
||||||
|
if(&aMap != this) {
|
||||||
|
for( i=0; i < 32; i++)
|
||||||
|
{
|
||||||
|
if(mScriptFallbackFontIDs[i] != aMap.mScriptFallbackFontIDs[i])
|
||||||
|
return PR_FALSE;
|
||||||
|
}
|
||||||
|
for( i=0; i < kUnicodeBlockVarScriptMax; i++)
|
||||||
|
{
|
||||||
|
if(mPrivBlockToScript[i] != aMap.mPrivBlockToScript[i])
|
||||||
|
return PR_FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return PR_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
|
||||||
|
short nsUnicodeFontMappingMac::GetFontID(PRUnichar aChar) {
|
||||||
|
nsUnicodeBlock block = GetBlock(aChar);
|
||||||
|
if(block < kUnicodeBlockFixedScriptMax)
|
||||||
|
return mScriptFallbackFontIDs[gUtil->BlockToScript(block)];
|
||||||
|
else
|
||||||
|
return mScriptFallbackFontIDs[ mPrivBlockToScript[ block - kUnicodeBlockFixedScriptMax] ];
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
static nsUnicodeBlock gU0xxxMap[32]=
|
||||||
|
{
|
||||||
|
kBasicLatin, kLatin, // U+0000
|
||||||
|
kLatin, kLatin, // U+0100
|
||||||
|
kOthers, kOthers, // U+0200
|
||||||
|
kOthers, kGreek, // U+0300
|
||||||
|
kCyrillic, kCyrillic, // U+0400
|
||||||
|
kArmenian, kOthers, // U+0500
|
||||||
|
kArabic, kArabic, // U+0600
|
||||||
|
kOthers, kOthers, // U+0700
|
||||||
|
kOthers, kOthers, // U+0800
|
||||||
|
kDevanagari, kBengali, // U+0900
|
||||||
|
kGurmukhi, kGujarati, // U+0a00
|
||||||
|
kOriya, kTamil, // U+0b00
|
||||||
|
kTelugu, kKannada, // U+0c00
|
||||||
|
kMalayalam, kOthers , // U+0d00
|
||||||
|
kThai, kLao, // U+0e00
|
||||||
|
kTibetan, kTibetan, // U+0f00
|
||||||
|
};
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
|
||||||
|
static nsUnicodeBlock GetBlockU0XXX(PRUnichar aChar)
|
||||||
|
{
|
||||||
|
nsUnicodeBlock res = gU0xxxMap[ (aChar >> 8) & 0x0F];
|
||||||
|
if(res == kOthers) {
|
||||||
|
if((0x0200 <= aChar) && ( aChar <= 0x024F )) res = kLatin;
|
||||||
|
else if((0x0370 <= aChar) && ( aChar <= 0x037F )) res = kGreek;
|
||||||
|
else if((0x0580 <= aChar) && ( aChar <= 0x058F )) res = kArmenian;
|
||||||
|
else if((0x0590 <= aChar) && ( aChar <= 0x05ff )) res = kHebrew;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
|
||||||
|
static nsUnicodeBlock GetBlockU1XXX(PRUnichar aChar)
|
||||||
|
{
|
||||||
|
switch( aChar & 0x0F00 )
|
||||||
|
{
|
||||||
|
case 0x0000: return kGeorgian;
|
||||||
|
case 0x0100: return kHangul;
|
||||||
|
case 0x0e00: return kLatin;
|
||||||
|
case 0x0f00: return kGreek;
|
||||||
|
default: return kOthers;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
|
||||||
|
static nsUnicodeBlock GetBlockU2XXX(PRUnichar aChar)
|
||||||
|
{
|
||||||
|
return kOthers;
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
|
||||||
|
static nsUnicodeBlock GetBlockU3XXX(PRUnichar aChar)
|
||||||
|
{
|
||||||
|
if(aChar < 0x3040) return kCJKMisc;
|
||||||
|
else if(aChar < 0x3100) return kHiraganaKatakana;
|
||||||
|
else if(aChar < 0x3130) return kBopomofo;
|
||||||
|
else if(aChar < 0x3190) return kHangul;
|
||||||
|
else return kCJKMisc;
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
|
||||||
|
static nsUnicodeBlock GetBlockU4XXX(PRUnichar aChar)
|
||||||
|
{
|
||||||
|
if(aChar < 0x4E00) return kOthers;
|
||||||
|
else return kCJKIdeographs;
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
|
||||||
|
static nsUnicodeBlock GetBlockCJKIdeographs(PRUnichar aChar)
|
||||||
|
{
|
||||||
|
return kCJKIdeographs;
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
|
||||||
|
static nsUnicodeBlock GetBlockHangul(PRUnichar aChar)
|
||||||
|
{
|
||||||
|
return kHangul;
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
|
||||||
|
static nsUnicodeBlock GetBlockUAXXX(PRUnichar aChar)
|
||||||
|
{
|
||||||
|
if(aChar < 0xAC00) return kOthers;
|
||||||
|
else return kHangul;
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
|
||||||
|
static nsUnicodeBlock GetBlockUDXXX(PRUnichar aChar)
|
||||||
|
{
|
||||||
|
if(aChar < 0xD800) return kHangul;
|
||||||
|
else return kOthers;
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
|
||||||
|
static nsUnicodeBlock GetBlockUEXXX(PRUnichar aChar)
|
||||||
|
{
|
||||||
|
return kOthers;
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
|
||||||
|
static nsUnicodeBlock GetBlockUFXXX(PRUnichar aChar)
|
||||||
|
{
|
||||||
|
// U+FFxx is used more frequently in the U+Fxxxx block
|
||||||
|
if(aChar >= 0xff00)
|
||||||
|
{
|
||||||
|
if(aChar < 0xff60) return kCJKMisc;
|
||||||
|
else if(aChar < 0xffA0) return kHiraganaKatakana;
|
||||||
|
else if(aChar < 0xffe0) return kHangul;
|
||||||
|
else return kOthers;
|
||||||
|
}
|
||||||
|
|
||||||
|
// The rest is rarely used, we don't care the performance below.
|
||||||
|
if(aChar < 0xf900) return kOthers;
|
||||||
|
else if(aChar < 0xfb00) return kCJKIdeographs;
|
||||||
|
else if(aChar < 0xfb10) return kLatin;
|
||||||
|
else if(aChar < 0xfb18) return kArmenian;
|
||||||
|
else if(aChar < 0xfb50) return kHebrew;
|
||||||
|
else if(aChar < 0xfe20) return kArabic;
|
||||||
|
else if(aChar < 0xfe70) return kOthers;
|
||||||
|
else return kArabic;
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
|
||||||
|
typedef nsUnicodeBlock (* getUnicodeBlock)(PRUnichar aChar);
|
||||||
|
static getUnicodeBlock gAllGetBlock[16] =
|
||||||
|
{
|
||||||
|
&GetBlockU0XXX, // 0
|
||||||
|
&GetBlockU1XXX, // 1
|
||||||
|
&GetBlockU2XXX, // 2
|
||||||
|
&GetBlockU3XXX, // 3
|
||||||
|
&GetBlockU4XXX, // 4
|
||||||
|
&GetBlockCJKIdeographs, // 5
|
||||||
|
&GetBlockCJKIdeographs, // 6
|
||||||
|
&GetBlockCJKIdeographs, // 7
|
||||||
|
&GetBlockCJKIdeographs, // 8
|
||||||
|
&GetBlockCJKIdeographs, // 9
|
||||||
|
&GetBlockUAXXX, // a
|
||||||
|
&GetBlockHangul, // b
|
||||||
|
&GetBlockHangul, // c
|
||||||
|
&GetBlockUDXXX, // d
|
||||||
|
&GetBlockUEXXX, // e
|
||||||
|
&GetBlockUFXXX // f
|
||||||
|
};
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
|
||||||
|
nsUnicodeBlock nsUnicodeFontMappingMac:: GetBlock(PRUnichar aChar)
|
||||||
|
{
|
||||||
|
return (*(gAllGetBlock[(aChar >> 12)]))(aChar);
|
||||||
|
}
|
|
@ -0,0 +1,59 @@
|
||||||
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Netscape Public License
|
||||||
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||||
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||||
|
* http://www.mozilla.org/NPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||||
|
* for the specific language governing rights and limitations under the
|
||||||
|
* NPL.
|
||||||
|
*
|
||||||
|
* The Initial Developer of this code under the NPL is Netscape
|
||||||
|
* Communications Corporation. Portions created by Netscape are
|
||||||
|
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||||
|
* Reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef nsUnicodeFontMappingMac_h__
|
||||||
|
#define nsUnicodeFontMappingMac_h__
|
||||||
|
|
||||||
|
#include "nsUnicodeBlock.h"
|
||||||
|
#include "nsIDeviceContext.h"
|
||||||
|
#include "nsFont.h"
|
||||||
|
|
||||||
|
class nsUnicodeMappingUtil;
|
||||||
|
class nsUnicodeFontMappingCache;
|
||||||
|
|
||||||
|
class nsUnicodeFontMappingMac {
|
||||||
|
public:
|
||||||
|
nsUnicodeFontMappingMac(nsFont* aFont, nsIDeviceContext *aDeviceContext,
|
||||||
|
const nsString& aDocumentCharset, const nsString& aLANG);
|
||||||
|
short GetFontID(PRUnichar aChar);
|
||||||
|
inline const short *GetScriptFallbackFonts() {
|
||||||
|
return mScriptFallbackFontIDs;
|
||||||
|
}
|
||||||
|
PRBool Equals(const nsUnicodeFontMappingMac& anther);
|
||||||
|
|
||||||
|
static nsUnicodeFontMappingMac* GetCachedInstance(nsFont* aFont, nsIDeviceContext *aDeviceContext,
|
||||||
|
const nsString& aDocumentCharset, const nsString& aLANG);
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
PRBool ScriptMapInitComplete();
|
||||||
|
void InitByFontFamily(nsFont* aFont, nsIDeviceContext *aDeviceContext);
|
||||||
|
void InitByLANG(const nsString& aLANG);
|
||||||
|
void InitByDocumentCharset(const nsString& aDocumentCharset);
|
||||||
|
void InitDefaultScriptFonts();
|
||||||
|
void processOneLangRegion(const char* aLanguage, const char* aRegion );
|
||||||
|
nsUnicodeBlock GetBlock(PRUnichar aChar);
|
||||||
|
private:
|
||||||
|
|
||||||
|
PRInt8 mPrivBlockToScript [kUnicodeBlockVarScriptMax] ;
|
||||||
|
short mScriptFallbackFontIDs [32] ;
|
||||||
|
static nsUnicodeMappingUtil* gUtil;
|
||||||
|
static nsUnicodeFontMappingCache* gCache;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* nsUnicodeFontMappingMac_h__ */
|
|
@ -0,0 +1,281 @@
|
||||||
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Netscape Public License
|
||||||
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||||
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||||
|
* http://www.mozilla.org/NPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||||
|
* for the specific language governing rights and limitations under the
|
||||||
|
* NPL.
|
||||||
|
*
|
||||||
|
* The Initial Developer of this code under the NPL is Netscape
|
||||||
|
* Communications Corporation. Portions created by Netscape are
|
||||||
|
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||||
|
* Reserved.
|
||||||
|
*/
|
||||||
|
#include "nsUnicodeMappingUtil.h"
|
||||||
|
#include "nsUnicodeFontMappingCache.h"
|
||||||
|
#define BAD_FONT_NUM -1
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
|
||||||
|
nsUnicodeMappingUtil *nsUnicodeMappingUtil::gSingleton = nsnull;
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
|
||||||
|
nsUnicodeMappingUtil::nsUnicodeMappingUtil()
|
||||||
|
{
|
||||||
|
InitScriptEnabled();
|
||||||
|
InitGenericFontMapping();
|
||||||
|
InitScriptFontMapping();
|
||||||
|
InitBlockToScriptMapping(); // this must be called after InitScriptEnabled()
|
||||||
|
gCache = new nsUnicodeFontMappingCache();
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
|
||||||
|
nsUnicodeMappingUtil::~nsUnicodeMappingUtil()
|
||||||
|
{
|
||||||
|
for(int i= 0 ; i < 32; i ++) {
|
||||||
|
for(int j=0; j < 5; j++) {
|
||||||
|
if(mGenericFontMapping[i][j])
|
||||||
|
delete mGenericFontMapping[i][j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(gCache)
|
||||||
|
delete gCache;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void nsUnicodeMappingUtil::InitScriptEnabled()
|
||||||
|
{
|
||||||
|
PRUint8 numOfScripts = ::GetScriptManagerVariable(smEnabled);
|
||||||
|
ScriptCode script, gotScripts;
|
||||||
|
mScriptEnabled = 0;
|
||||||
|
PRUint32 scriptMask = 1;
|
||||||
|
for(script = gotScripts = 0;
|
||||||
|
((script < 32) && ( gotScripts < numOfScripts)) ;
|
||||||
|
script++, scriptMask <<= 1)
|
||||||
|
{
|
||||||
|
if(::GetScriptVariable(script, smScriptEnabled))
|
||||||
|
mScriptEnabled |= scriptMask;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void nsUnicodeMappingUtil::InitGenericFontMapping()
|
||||||
|
{
|
||||||
|
for(int i= 0 ; i < 32; i ++)
|
||||||
|
for(int j=0; j < 5; j++)
|
||||||
|
mGenericFontMapping[i][j] = nsnull;
|
||||||
|
|
||||||
|
// We probabaly should put the following info into resource ....
|
||||||
|
// smRoman
|
||||||
|
static nsAutoString times_str("Times");
|
||||||
|
static nsAutoString helvetica_str("Helvetica");
|
||||||
|
static nsAutoString courier_str("Courier");
|
||||||
|
static nsAutoString zapfChancery_str("Zapf Chancery");
|
||||||
|
static nsAutoString newCenturySchlbk_str("New Century Schlbk");
|
||||||
|
mGenericFontMapping[smRoman][kSerif] = & times_str;
|
||||||
|
mGenericFontMapping[smRoman][kSansSerif] = & helvetica_str; // note: MRJ use Geneva for Sans-Serif
|
||||||
|
mGenericFontMapping[smRoman][kMonospace] = & courier_str;
|
||||||
|
mGenericFontMapping[smRoman][kCursive] = & zapfChancery_str;
|
||||||
|
mGenericFontMapping[smRoman][kFantasy] = & newCenturySchlbk_str;
|
||||||
|
|
||||||
|
// smJapanese
|
||||||
|
static PRUnichar jfontname1[] = {
|
||||||
|
0x672C, 0x660E, 0x671D, 0x2212, 0xFF2D, 0x0000 // –{–¾’©<E28099>|‚l
|
||||||
|
};
|
||||||
|
static PRUnichar jfontname2[] = {
|
||||||
|
0x4E38, 0x30B4, 0x30B7, 0x30C3, 0x30AF, 0x2212, 0xFF2D, 0x0000 // ŠÛƒSƒVƒbƒN<C692>|‚l
|
||||||
|
};
|
||||||
|
static PRUnichar jfontname3[] = {
|
||||||
|
0x004F, 0x0073, 0x0061, 0x006B, 0x0061, 0x2212, 0x7B49, 0x5E45, 0x0000 // Osaka<6B>|“™•<E284A2>
|
||||||
|
};
|
||||||
|
static nsAutoString nsJFont1(jfontname1);
|
||||||
|
static nsAutoString nsJFont2(jfontname2);
|
||||||
|
static nsAutoString nsJFont3(jfontname3);
|
||||||
|
mGenericFontMapping[smJapanese][kSerif] = &nsJFont1;
|
||||||
|
mGenericFontMapping[smJapanese][kSansSerif] = &nsJFont2;
|
||||||
|
mGenericFontMapping[smJapanese][kMonospace] = &nsJFont3;
|
||||||
|
|
||||||
|
// smTradChinese
|
||||||
|
static nsAutoString appleLiSungLight_str("Apple LiSung Light");
|
||||||
|
static nsAutoString appleLiGothicMedium_str("Apple LiGothic Medium");
|
||||||
|
mGenericFontMapping[smTradChinese][kSerif] = & appleLiSungLight_str;
|
||||||
|
mGenericFontMapping[smTradChinese][kSansSerif]
|
||||||
|
= mGenericFontMapping[smTradChinese][kMonospace] = & appleLiGothicMedium_str;
|
||||||
|
|
||||||
|
// smKorean
|
||||||
|
static nsAutoString appleMyungjo_str("AppleMyungjo");
|
||||||
|
static nsAutoString appleGothic_str("AppleGothic");
|
||||||
|
mGenericFontMapping[smKorean][kSerif] = & appleMyungjo_str;
|
||||||
|
mGenericFontMapping[smKorean][kSansSerif]
|
||||||
|
= mGenericFontMapping[smKorean][kMonospace] = &appleGothic_str;
|
||||||
|
|
||||||
|
// 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 // ÌêÒÉ
|
||||||
|
};
|
||||||
|
static nsAutoString nsAFont1(afontname1);
|
||||||
|
static nsAutoString nsAFont2(afontname2);
|
||||||
|
static nsAutoString nsAFont3(afontname3);
|
||||||
|
mGenericFontMapping[smArabic][kSerif] = &nsAFont1;
|
||||||
|
mGenericFontMapping[smArabic][kSansSerif] = &nsAFont2;
|
||||||
|
mGenericFontMapping[smArabic][kMonospace] = &nsAFont3;
|
||||||
|
|
||||||
|
// 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 // àøéàì
|
||||||
|
};
|
||||||
|
static nsAutoString nsHFont1(hfontname1);
|
||||||
|
static nsAutoString nsHFont2(hfontname2);
|
||||||
|
mGenericFontMapping[smHebrew][kSerif] = & nsHFont1;
|
||||||
|
mGenericFontMapping[smHebrew][kSansSerif]
|
||||||
|
= mGenericFontMapping[smHebrew][kMonospace] = & nsHFont2;
|
||||||
|
|
||||||
|
// smCyrillic
|
||||||
|
static nsAutoString latinski_str("Latinski");
|
||||||
|
static nsAutoString pryamoyProp_str("Pryamoy Prop");
|
||||||
|
static nsAutoString apcCourier_str("APC Courier");
|
||||||
|
mGenericFontMapping[smCyrillic][kSerif] = &latinski_str;
|
||||||
|
mGenericFontMapping[smCyrillic][kSansSerif] = &pryamoyProp_str;
|
||||||
|
mGenericFontMapping[smCyrillic][kMonospace] = &apcCourier_str;
|
||||||
|
|
||||||
|
// smDevanagari
|
||||||
|
static nsAutoString devanagariMT_str("Devanagari MT");
|
||||||
|
mGenericFontMapping[smDevanagari][kSerif]
|
||||||
|
= mGenericFontMapping[smDevanagari][kSansSerif]
|
||||||
|
= mGenericFontMapping[smDevanagari][kMonospace] = & devanagariMT_str;
|
||||||
|
|
||||||
|
// smGurmukhi
|
||||||
|
static nsAutoString gurukhiMT_str("Gurmukhi MT");
|
||||||
|
mGenericFontMapping[smGurmukhi][kSerif]
|
||||||
|
= mGenericFontMapping[smGurmukhi][kSansSerif]
|
||||||
|
= mGenericFontMapping[smGurmukhi][kMonospace] = & gurukhiMT_str;
|
||||||
|
|
||||||
|
// smGujarati
|
||||||
|
static nsAutoString gujaratiMT_str("Gujarati MT");
|
||||||
|
mGenericFontMapping[smGujarati][kSerif]
|
||||||
|
= mGenericFontMapping[smGujarati][kSansSerif]
|
||||||
|
= mGenericFontMapping[smGujarati][kMonospace] = & gujaratiMT_str;
|
||||||
|
|
||||||
|
// smThai
|
||||||
|
static nsAutoString thonburi_str("Thonburi");
|
||||||
|
static nsAutoString krungthep_str("Krungthep");
|
||||||
|
static nsAutoString ayuthaya_str("Ayuthaya");
|
||||||
|
mGenericFontMapping[smThai][kSerif] = &thonburi_str;
|
||||||
|
mGenericFontMapping[smThai][kSansSerif] = &krungthep_str;
|
||||||
|
mGenericFontMapping[smThai][kMonospace] = &ayuthaya_str;
|
||||||
|
|
||||||
|
// smSimpChinese
|
||||||
|
static nsAutoString song_str("Song");
|
||||||
|
static nsAutoString hei_str("Hei");
|
||||||
|
mGenericFontMapping[smSimpChinese][kSerif] = &song_str;
|
||||||
|
mGenericFontMapping[smSimpChinese][kSansSerif]
|
||||||
|
= mGenericFontMapping[smSimpChinese][kMonospace] = & hei_str;
|
||||||
|
|
||||||
|
// smCentralEuroRoman
|
||||||
|
static nsAutoString timesCE_str("Times CE");
|
||||||
|
static nsAutoString helveticaCE_str("Helvetica CE");
|
||||||
|
static nsAutoString courierCE_str("Courier CE");
|
||||||
|
mGenericFontMapping[smCentralEuroRoman][kSerif] = ×CE_str;
|
||||||
|
mGenericFontMapping[smCentralEuroRoman][kSansSerif] = &helveticaCE_str;
|
||||||
|
mGenericFontMapping[smCentralEuroRoman][kMonospace] = &courierCE_str;
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void nsUnicodeMappingUtil::InitScriptFontMapping()
|
||||||
|
{
|
||||||
|
// Get font from Script manager
|
||||||
|
for(ScriptCode script = 0; script< 32 ; script++)
|
||||||
|
{
|
||||||
|
mScriptFontMapping[script] = BAD_FONT_NUM;
|
||||||
|
short fontNum;
|
||||||
|
if(ScriptEnabled(script)) {
|
||||||
|
long fondsize = ::GetScriptVariable(script, smScriptPrefFondSize);
|
||||||
|
if((fondsize) && ((fondsize >> 16))) {
|
||||||
|
fontNum = (fondsize >> 16);
|
||||||
|
mScriptFontMapping[script] = fontNum;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
void nsUnicodeMappingUtil::InitBlockToScriptMapping()
|
||||||
|
{
|
||||||
|
static ScriptCode prebuildMapping[kUnicodeBlockSize] =
|
||||||
|
{
|
||||||
|
// start the fixed section
|
||||||
|
smGreek, smCyrillic, smArmenian,
|
||||||
|
smHebrew, smArabic, smDevanagari, smBengali,
|
||||||
|
smGurmukhi, smGujarati, smOriya, smTamil,
|
||||||
|
smTelugu, smKannada, smMalayalam, smThai,
|
||||||
|
smLao, smTibetan, smGeorgian, smKorean,
|
||||||
|
smTradChinese,
|
||||||
|
|
||||||
|
// start the variable section
|
||||||
|
smRoman, smRoman, smJapanese, smJapanese, smJapanese,
|
||||||
|
smRoman
|
||||||
|
};
|
||||||
|
for(PRUint32 i= 0; i < kUnicodeBlockSize; i++)
|
||||||
|
{
|
||||||
|
if( ScriptEnabled(prebuildMapping[i]) ) {
|
||||||
|
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 )
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
nsGenericFontNameType nsUnicodeMappingUtil::MapGenericFontNameType(const nsString& aGenericName)
|
||||||
|
{
|
||||||
|
if (aGenericName.EqualsIgnoreCase("serif"))
|
||||||
|
return kSerif;
|
||||||
|
if (aGenericName.EqualsIgnoreCase("sans-serif"))
|
||||||
|
return kSansSerif;
|
||||||
|
if (aGenericName.EqualsIgnoreCase("monospace"))
|
||||||
|
return kMonospace;
|
||||||
|
if (aGenericName.EqualsIgnoreCase("cursive"))
|
||||||
|
return kCursive;
|
||||||
|
if (aGenericName.EqualsIgnoreCase("fantasy"))
|
||||||
|
return kFantasy;
|
||||||
|
|
||||||
|
return kUknownGenericFontName;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
|
||||||
|
nsUnicodeMappingUtil* nsUnicodeMappingUtil::GetSingleton()
|
||||||
|
{
|
||||||
|
if( ! gSingleton)
|
||||||
|
gSingleton = new nsUnicodeMappingUtil();
|
||||||
|
return gSingleton;
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------------------
|
|
@ -0,0 +1,85 @@
|
||||||
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Netscape Public License
|
||||||
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||||
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||||
|
* http://www.mozilla.org/NPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||||
|
* for the specific language governing rights and limitations under the
|
||||||
|
* NPL.
|
||||||
|
*
|
||||||
|
* The Initial Developer of this code under the NPL is Netscape
|
||||||
|
* Communications Corporation. Portions created by Netscape are
|
||||||
|
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||||
|
* Reserved.
|
||||||
|
*/
|
||||||
|
#include <Script.h>
|
||||||
|
|
||||||
|
#include "prtypes.h"
|
||||||
|
#include "nsUnicodeBlock.h"
|
||||||
|
#include "nsDebug.h"
|
||||||
|
#include "nscore.h"
|
||||||
|
|
||||||
|
class nsUnicodeFontMappingCache;
|
||||||
|
class nsString;
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
typedef enum {
|
||||||
|
kSerif = 0,
|
||||||
|
kSansSerif,
|
||||||
|
kMonospace,
|
||||||
|
kCursive,
|
||||||
|
kFantasy,
|
||||||
|
kUknownGenericFontName
|
||||||
|
} nsGenericFontNameType;
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class nsUnicodeMappingUtil {
|
||||||
|
public:
|
||||||
|
nsUnicodeMappingUtil();
|
||||||
|
~nsUnicodeMappingUtil();
|
||||||
|
|
||||||
|
inline PRBool ScriptEnabled(ScriptCode script)
|
||||||
|
{ return (0 != (mScriptEnabled & (1L << script))); };
|
||||||
|
inline ScriptCode BlockToScript(nsUnicodeBlock blockID)
|
||||||
|
{
|
||||||
|
NS_PRECONDITION(blockID < kUnicodeBlockSize, "illegal value");
|
||||||
|
return (ScriptCode) mBlockToScriptMapping[blockID];
|
||||||
|
};
|
||||||
|
inline short ScriptFont(ScriptCode script)
|
||||||
|
{
|
||||||
|
NS_PRECONDITION(script < 32, "bad script code");
|
||||||
|
return mScriptFontMapping[script];
|
||||||
|
};
|
||||||
|
nsGenericFontNameType MapGenericFontNameType(const nsString& aGenericName);
|
||||||
|
inline nsString* GenericFontNameForScript(ScriptCode aScript, nsGenericFontNameType aType) const
|
||||||
|
{
|
||||||
|
NS_PRECONDITION(aScript < 32, "bad script code");
|
||||||
|
NS_PRECONDITION(aType <= kUknownGenericFontName, "illegal value");
|
||||||
|
if( aType >= kUknownGenericFontName)
|
||||||
|
return nsnull;
|
||||||
|
else
|
||||||
|
return mGenericFontMapping[aScript][aType];
|
||||||
|
}
|
||||||
|
inline nsUnicodeFontMappingCache* GetFontMappingCache() { return gCache; };
|
||||||
|
|
||||||
|
static nsUnicodeMappingUtil* GetSingleton();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void InitScriptEnabled();
|
||||||
|
void InitGenericFontMapping();
|
||||||
|
void InitBlockToScriptMapping();
|
||||||
|
void InitScriptFontMapping();
|
||||||
|
|
||||||
|
private:
|
||||||
|
PRUint32 mScriptEnabled;
|
||||||
|
nsString *mGenericFontMapping[32][5];
|
||||||
|
short mScriptFontMapping[32];
|
||||||
|
PRInt8 mBlockToScriptMapping[kUnicodeBlockSize];
|
||||||
|
nsUnicodeFontMappingCache* gCache;
|
||||||
|
|
||||||
|
static nsUnicodeMappingUtil* gSingleton;
|
||||||
|
|
||||||
|
};
|
Загрузка…
Ссылка в новой задаче