ICU-2253 Initial support for language codes, CJK language-specific variants and associated clean-up.

X-SVN-Rev: 11534
This commit is contained in:
Eric Mader 2003-04-12 00:37:12 +00:00
parent f69ff31d30
commit 1bb8d611a2
19 changed files with 553 additions and 114 deletions

View file

@ -7,6 +7,7 @@
*/
#include "LETypes.h"
#include "LEScripts.h"
#include "LEGlyphFilter.h"
#include "LayoutEngine.h"
#include "OpenTypeLayoutEngine.h"
@ -54,13 +55,13 @@ ArabicOpenTypeLayoutEngine::ArabicOpenTypeLayoutEngine(const LEFontInstance *fon
const GlyphSubstitutionTableHeader *gsubTable)
: OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, gsubTable)
{
fFeatureOrder = ArabicShaping::getFeatureOrder();
// fFeatureOrder = ArabicShaping::getFeatureOrder();
}
ArabicOpenTypeLayoutEngine::ArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode)
: OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode)
{
fFeatureOrder = ArabicShaping::getFeatureOrder();
// fFeatureOrder = ArabicShaping::getFeatureOrder();
}
ArabicOpenTypeLayoutEngine::~ArabicOpenTypeLayoutEngine()

View file

@ -65,36 +65,36 @@ ArabicShaping::ShapeType ArabicShaping::getShapeType(LEUnicode c)
}
#if 0
const LETag GlyphShaper::isolFeatureTag = 0x69736F6C; // 'isol'
const LETag GlyphShaper::initFeatureTag = 0x696E6974; // 'init'
const LETag GlyphShaper::mediFeatureTag = 0x6D656469; // 'medi'
const LETag GlyphShaper::finaFeatureTag = 0x66696E61; // 'fina'
const LETag GlyphShaper::ligaFeatureTag = 0x6C696761; // 'liga'
const LETag GlyphShaper::msetFeatureTag = 0x6D736574; // 'mset'
const LETag GlyphShaper::markFeatureTag = 0x6D61726B; // 'mark'
const LETag GlyphShaper::isolFeatureTag = LE_MAKE_TAG('i', 's', 'o', 'l');
const LETag GlyphShaper::initFeatureTag = LE_MAKE_TAG('i', 'n', 'i', 't');
const LETag GlyphShaper::mediFeatureTag = LE_MAKE_TAG('m', 'e', 'd', 'i');
const LETag GlyphShaper::finaFeatureTag = LE_MAKE_TAG('f', 'i', 'n', 'a');
const LETag GlyphShaper::ligaFeatureTag = LE_MAKE_TAG('l', 'i', 'g', 'a');
const LETag GlyphShaper::msetFeatureTag = LE_MAKE_TAG('m', 's', 'e', 't');
const LETag GlyphShaper::markFeatureTag = LE_MAKE_TAG('m', 'a', 'r', 'k');
const LETag GlyphShaper::emptyTag = 0x00000000; // ''
#else
const LETag isolFeatureTag = 0x69736F6C; // 'isol'
const LETag initFeatureTag = 0x696E6974; // 'init'
const LETag mediFeatureTag = 0x6D656469; // 'medi'
const LETag finaFeatureTag = 0x66696E61; // 'fina'
const LETag ligaFeatureTag = 0x6C696761; // 'liga'
const LETag msetFeatureTag = 0x6D736574; // 'mset'
const LETag markFeatureTag = 0x6D61726B; // 'mark'
const LETag isolFeatureTag = LE_MAKE_TAG('i', 's', 'o', 'l');
const LETag initFeatureTag = LE_MAKE_TAG('i', 'n', 'i', 't');
const LETag mediFeatureTag = LE_MAKE_TAG('m', 'e', 'd', 'i');
const LETag finaFeatureTag = LE_MAKE_TAG('f', 'i', 'n', 'a');
const LETag ligaFeatureTag = LE_MAKE_TAG('l', 'i', 'g', 'a');
const LETag msetFeatureTag = LE_MAKE_TAG('m', 's', 'e', 't');
const LETag markFeatureTag = LE_MAKE_TAG('m', 'a', 'r', 'k');
const LETag emptyTag = 0x00000000; // ''
#endif
const LETag ccmpFeatureTag = 0x63636D70; // 'ccmp'
const LETag rligFeatureTag = 0x726C6967; // 'rlig'
const LETag caltFeatureTag = 0x63616C74; // 'calt'
const LETag dligFeatureTag = 0x646C6967; // 'dlig'
const LETag cswhFeatureTag = 0x63737768; // 'cswh'
const LETag cursFeatureTag = 0x63757273; // 'curs'
const LETag kernFeatureTag = 0x6B65726E; // 'kern'
const LETag mkmkFeatureTag = 0x6D6B6D6B; // 'mkmk'
const LETag ccmpFeatureTag = LE_MAKE_TAG('c', 'c', 'm', 'p');
const LETag rligFeatureTag = LE_MAKE_TAG('r', 'l', 'i', 'g');
const LETag caltFeatureTag = LE_MAKE_TAG('c', 'a', 'l', 't');
const LETag dligFeatureTag = LE_MAKE_TAG('d', 'l', 'i', 'g');
const LETag cswhFeatureTag = LE_MAKE_TAG('c', 's', 'w', 'h');
const LETag cursFeatureTag = LE_MAKE_TAG('c', 'u', 'r', 's');
const LETag kernFeatureTag = LE_MAKE_TAG('k', 'e', 'r', 'n');
const LETag mkmkFeatureTag = LE_MAKE_TAG('m', 'k', 'm', 'k');
const LETag featureOrder[] =

View file

@ -35,4 +35,11 @@ le_bool GlyphSubstitutionTableHeader::coversScript(LETag scriptTag) const
return scriptListTable->findScript(scriptTag) != NULL;
}
le_bool GlyphSubstitutionTableHeader::coversScriptAndLanguage(LETag scriptTag, LETag languageTag) const
{
const ScriptListTable *scriptListTable = (const ScriptListTable *) ((char *)this + SWAPW(scriptListOffset));
return scriptListTable->findLanguage(scriptTag, languageTag, true) != NULL;
}
U_NAMESPACE_END

View file

@ -35,6 +35,7 @@ struct GlyphSubstitutionTableHeader
const LEGlyphFilter *filter = NULL, const LETag *featureOrder = NULL) const;
le_bool coversScript(LETag scriptTag) const;
le_bool coversScriptAndLanguage(LETag scriptTag, LETag languageTag) const;
};
enum GlyphSubstitutionSubtableTypes

View file

@ -0,0 +1,68 @@
/*
* HanLayoutEngine.cpp: OpenType processing for Han fonts.
*
* (C) Copyright IBM Corp. 1998 - 2003 - All Rights Reserved.
*
* $Source: /xsrl/Nsvn/icu/icu/source/layout/HanLayoutEngine.cpp,v $ $Date: 2003/04/12 00:37:11 $ $Revision: 1.1 $
*/
#include "LETypes.h"
#include "LEScripts.h"
#include "LELanguages.h"
#include "LayoutEngine.h"
#include "OpenTypeLayoutEngine.h"
#include "HanLayoutEngine.h"
#include "ScriptAndLanguageTags.h"
const char HanOpenTypeLayoutEngine::fgClassID=0;
HanOpenTypeLayoutEngine::HanOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
const GlyphSubstitutionTableHeader *gsubTable)
: OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, gsubTable)
{
// nothing else to do...
}
HanOpenTypeLayoutEngine::~HanOpenTypeLayoutEngine()
{
// nothing to do
}
const LETag emptyTag = 0x00000000;
const LETag loclFeatureTag = LE_MAKE_TAG('l', 'o', 'c', 'l');
const LETag smplFeatureTag = LE_MAKE_TAG('s', 'm', 'p', 'l');
const LETag tradFeatureTag = LE_MAKE_TAG('t', 'r', 'a', 'd');
const LETag features[] = {loclFeatureTag, emptyTag};
le_int32 HanOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft,
LEUnicode *&outChars, le_int32 *&charIndices, const LETag **&featureTags, LEErrorCode &success)
{
if (LE_FAILURE(success)) {
return 0;
}
if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) {
success = LE_ILLEGAL_ARGUMENT_ERROR;
return 0;
}
featureTags = LE_NEW_ARRAY(const LETag *, count);
if (featureTags == NULL) {
success = LE_MEMORY_ALLOCATION_ERROR;
return 0;
}
// FIXME: do we want to add the 'trad' feature for 'ZHT' and the
// 'smpl' feature for 'ZHS'? If we do this, we can remove the exact
// flag from the language tag lookups, so we can use these features
// with the default LangSys...
for (le_int32 i = 0; i < count; i += 1) {
featureTags[i] = features;
}
return count;
}

View file

@ -0,0 +1,111 @@
/*
* HanLayoutEngine.h: OpenType processing for Han fonts.
*
* (C) Copyright IBM Corp. 1998 - 2003 - All Rights Reserved.
*
* $Source: /xsrl/Nsvn/icu/icu/source/layout/HanLayoutEngine.h,v $ $Date: 2003/04/12 00:37:11 $ $Revision: 1.1 $
*/
#ifndef __HANLAYOUTENGINE_H
#define __HANLAYOUTENGINE_H
#include "LETypes.h"
#include "LEFontInstance.h"
#include "LayoutEngine.h"
#include "OpenTypeLayoutEngine.h"
#include "GlyphSubstitutionTables.h"
U_NAMESPACE_BEGIN
/**
* This class implements OpenType layout for Han fonts. It overrides
* the characerProcessing method to assign the correct OpenType feature
* tags for the CJK language-specific forms.
*
* @internal
*/
class HanOpenTypeLayoutEngine : public OpenTypeLayoutEngine
{
public:
/*
* This is the main constructor. It constructs an instance of HanOpenTypeLayoutEngine for
* a particular font, script and language. It takes the GSUB table as a parameter since
* LayoutEngine::layoutEngineFactory has to read the GSUB table to know that it has a
* Han OpenType font.
*
* @param fontInstance - the font
* @param scriptCode - the script
* @param langaugeCode - the language
* @param gsubTable - the GSUB table
*
* @see LayoutEngine::layoutEngineFactory
* @see OpenTypeLayoutEngine
* @see ScriptAndLangaugeTags.h for script and language codes
*
* @internal
*/
HanOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
const GlyphSubstitutionTableHeader *gsubTable);
/**
* The destructor, virtual for correct polymorphic invocation.
*
* @internal
*/
virtual ~HanOpenTypeLayoutEngine();
/**
* ICU "poor man's RTTI", returns a UClassID for the actual class.
*
* @draft ICU 2.2
*/
virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); }
/**
* ICU "poor man's RTTI", returns a UClassID for this class.
*
* @draft ICU 2.2
*/
static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; }
protected:
/**
* This method does Han OpenType character processing. It assigns the OpenType feature
* tags to the characters to generate the correct language-specific variants.
*
* Input parameters:
* @param chars - the input character context
* @param offset - the index of the first character to process
* @param count - the number of characters to process
* @param max - the number of characters in the input context
* @param rightToLeft - true if the characters are in a right to left directional run
*
* Output parameters:
* @param outChars - the output character arrayt
* @param charIndices - the output character index array
* @param featureTags - the output feature tag array
* @param success - set to an error code if the operation fails
*
* @return the output character count
*
* @internal
*/
virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft,
LEUnicode *&outChars, le_int32 *&charIndices, const LETag **&featureTags, LEErrorCode &success);
private:
/**
* The address of this static class variable serves as this class's ID
* for ICU "poor man's RTTI".
*/
static const char fgClassID;
};
U_NAMESPACE_END
#endif

View file

@ -2,8 +2,8 @@
* (C) Copyright IBM Corp. 1998 - 2003 - All Rights Reserved
*
* $Source: /xsrl/Nsvn/icu/icu/source/layout/IndicReordering.cpp,v $
* $Date: 2003/01/28 23:30:56 $
* $Revision: 1.9 $
* $Date: 2003/04/12 00:37:11 $
* $Revision: 1.10 $
*
*/
@ -155,22 +155,22 @@ enum
const LETag emptyTag = 0x00000000; // ''
const LETag nuktFeatureTag = 0x6E756B74; // 'nukt'
const LETag akhnFeatureTag = 0x616B686E; // 'akhn'
const LETag rphfFeatureTag = 0x72706866; // 'rphf'
const LETag blwfFeatureTag = 0x626C7766; // 'blwf'
const LETag halfFeatureTag = 0x68616C66; // 'half'
const LETag pstfFeatureTag = 0x70737466; // 'pstf'
const LETag vatuFeatureTag = 0x76617475; // 'vatu'
const LETag presFeatureTag = 0x70726573; // 'pres'
const LETag blwsFeatureTag = 0x626C7773; // 'blws'
const LETag abvsFeatureTag = 0x61627673; // 'abvs'
const LETag pstsFeatureTag = 0x70737473; // 'psts'
const LETag halnFeatureTag = 0x68616C6E; // 'haln'
const LETag nuktFeatureTag = LE_MAKE_TAG('n', 'u', 'k', 't');
const LETag akhnFeatureTag = LE_MAKE_TAG('a', 'k', 'h', 'n');
const LETag rphfFeatureTag = LE_MAKE_TAG('r', 'p', 'h', 'f');
const LETag blwfFeatureTag = LE_MAKE_TAG('b', 'l', 'w', 'f');
const LETag halfFeatureTag = LE_MAKE_TAG('h', 'a', 'l', 'f');
const LETag pstfFeatureTag = LE_MAKE_TAG('p', 's', 't', 'f');
const LETag vatuFeatureTag = LE_MAKE_TAG('v', 'a', 't', 'u');
const LETag presFeatureTag = LE_MAKE_TAG('p', 'r', 'e', 's');
const LETag blwsFeatureTag = LE_MAKE_TAG('b', 'l', 'w', 's');
const LETag abvsFeatureTag = LE_MAKE_TAG('a', 'b', 'v', 's');
const LETag pstsFeatureTag = LE_MAKE_TAG('p', 's', 't', 's');
const LETag halnFeatureTag = LE_MAKE_TAG('h', 'a', 'l', 'n');
const LETag blwmFeatureTag = 0x626C776D; // 'blwm'
const LETag abvmFeatureTag = 0x6162766D; // 'abvm'
const LETag distFeatureTag = 0x64697374; // 'dist'
const LETag blwmFeatureTag = LE_MAKE_TAG('b', 'l', 'w', 'm');
const LETag abvmFeatureTag = LE_MAKE_TAG('a', 'b', 'v', 'm');
const LETag distFeatureTag = LE_MAKE_TAG('d', 'i', 's', 't');
// These are in the order in which the features need to be applied
// for correct processing

View file

@ -0,0 +1,59 @@
/*
*
* (C) Copyright IBM Corp. 1998 - 2003. All Rights Reserved.
*
* WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS
* YOU REALLY KNOW WHAT YOU'RE DOING.
*
* $Source: /xsrl/Nsvn/icu/icu/source/layout/LELanguages.h,v $ $Date: 2003/04/12 00:37:12 $ $Revision: 1.1 $
*/
#ifndef __LELANGUAGES_H
#define __LELANGUAGES_H
U_NAMESPACE_BEGIN
/**
* A provisional list of language codes. For now,
* this is just a list of languages which the LayoutEngine
* supports.
*
* @draft ICU 2.6
*/
enum LanguageCodes {
araLanguageCode = 0,
asmLanguageCode = 1,
benLanguageCode = 2,
farLanguageCode = 3,
gujLanguageCode = 4,
hinLanguageCode = 5,
iwrLanguageCode = 6,
jiiLanguageCode = 7,
janLanguageCode = 8,
kanLanguageCode = 9,
kokLanguageCode = 10,
korLanguageCode = 11,
kshLanguageCode = 12,
malLanguageCode = 13,
marLanguageCode = 14,
mlrLanguageCode = 15,
mniLanguageCode = 16,
oriLanguageCode = 17,
sanLanguageCode = 18,
sndLanguageCode = 19,
snhLanguageCode = 20,
syrLanguageCode = 21,
tamLanguageCode = 22,
telLanguageCode = 23,
thaLanguageCode = 24,
urdLanguageCode = 25,
zhpLanguageCode = 26,
zhsLanguageCode = 27,
zhtLanguageCode = 28,
languageCodeCount = 29
};
U_NAMESPACE_END
#endif

View file

@ -1,11 +1,11 @@
/*
* %W% %E%
*
* (C) Copyright IBM Corp. 1998 - 2002. All Rights Reserved.
* (C) Copyright IBM Corp. 1998 - 2003. All Rights Reserved.
*
* WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS
* YOU REALLY KNOW WHAT YOU'RE DOING.
*
* $Source: /xsrl/Nsvn/icu/icu/source/layout/LEScripts.h,v $ $Date: 2003/04/12 00:37:12 $ $Revision: 1.6 $
*/
#ifndef __LESCRIPTS_H
@ -17,8 +17,9 @@ U_NAMESPACE_BEGIN
* Constants for Unicode script values, generated using
* ICU4J's <code>UScript</code> class.
*
* @draft ICU 2.4
* @draft ICU 2.6
*/
enum ScriptCodes {
zyyyScriptCode = 0,
qaaiScriptCode = 1,
@ -66,8 +67,16 @@ enum ScriptCodes {
hanoScriptCode = 43,
buhdScriptCode = 44,
tagbScriptCode = 45,
braiScriptCode = 46,
cprtScriptCode = 47,
limbScriptCode = 48,
linbScriptCode = 49,
osmaScriptCode = 50,
shawScriptCode = 51,
taleScriptCode = 52,
ugarScriptCode = 53,
scriptCodeCount = 46
scriptCodeCount = 54
};
U_NAMESPACE_END

View file

@ -295,7 +295,7 @@ typedef struct LEPoint LEPoint;
*
* @draft ICU 2.6
*/
#define LE_GROW_ARRAY(array, newSize) uprv_realloc((void *) (array), newSize * sizeof (array)[0])
#define LE_GROW_ARRAY(array, newSize) uprv_realloc((void *) (array), (newSize) * sizeof (array)[0])
/**
* Free an array of basic types. This is used to isolate the rest of
@ -305,6 +305,19 @@ typedef struct LEPoint LEPoint;
*/
#define LE_DELETE_ARRAY(array) uprv_free((void *) (array))
/**
* A macro to construct the four-letter tags used to
* label TrueType tables, and for script, language and
* feature tags in OpenType tables.
*
* @draft ICU 2.6
*/
#define LE_MAKE_TAG(a, b, c, d) \
(((le_uint32)(a) << 24) | \
((le_uint32)(b) << 16) | \
((le_uint32)(c) << 8) | \
(le_uint32)(d))
/**
* Error codes returned by the LayoutEngine.
*

View file

@ -7,9 +7,12 @@
*/
#include "LETypes.h"
#include "LEScripts.h"
#include "LELanguages.h"
#include "LayoutEngine.h"
#include "ArabicLayoutEngine.h"
//#include "HebrewLayoutEngine.h"
#include "HanLayoutEngine.h"
#include "IndicLayoutEngine.h"
#include "ThaiLayoutEngine.h"
#include "GXLayoutEngine.h"
@ -320,8 +323,8 @@ void LayoutEngine::reset()
LayoutEngine *LayoutEngine::layoutEngineFactory(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, LEErrorCode &success)
{
static le_uint32 gsubTableTag = 0x47535542; // "GSUB"
static le_uint32 mortTableTag = 0x6D6F7274; // 'mort'
static le_uint32 gsubTableTag = LE_MAKE_TAG('G', 'S', 'U', 'B');
static le_uint32 mortTableTag = LE_MAKE_TAG('m', 'o', 'r', 't');
if (LE_FAILURE(success)) {
return NULL;
@ -329,8 +332,10 @@ LayoutEngine *LayoutEngine::layoutEngineFactory(const LEFontInstance *fontInstan
const GlyphSubstitutionTableHeader *gsubTable = (const GlyphSubstitutionTableHeader *) fontInstance->getFontTable(gsubTableTag);
LayoutEngine *result = NULL;
LETag scriptTag = 0x00000000;
LETag languageTag = 0x00000000;
if (gsubTable != NULL && gsubTable->coversScript(OpenTypeLayoutEngine::getScriptTag(scriptCode))) {
if (gsubTable != NULL && gsubTable->coversScript(scriptTag = OpenTypeLayoutEngine::getScriptTag(scriptCode))) {
switch (scriptCode) {
case bengScriptCode:
case devaScriptCode:
@ -348,6 +353,27 @@ LayoutEngine *LayoutEngine::layoutEngineFactory(const LEFontInstance *fontInstan
result = new ArabicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, gsubTable);
break;
case haniScriptCode:
languageTag = OpenTypeLayoutEngine::getLangSysTag(languageCode);
switch (languageCode) {
case korLanguageCode:
case janLanguageCode:
case zhtLanguageCode:
case zhsLanguageCode:
if (gsubTable->coversScriptAndLanguage(scriptTag, languageTag)) {
result = new HanOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, gsubTable);
break;
}
// note: falling through to default case.
default:
result = new OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, gsubTable);
break;
}
break;
default:
result = new OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, gsubTable);
break;

View file

@ -29,7 +29,7 @@ le_uint32 MultipleSubstitutionSubtable::process(GlyphIterator *glyphIterator, co
if (glyphCount == 0) {
glyphIterator->setCurrGlyphID(0xFFFF);
return 1;
} else if (glyphCount == 1) {
} else if (glyphCount >= 1) {
TTGlyphID substitute = SWAPW(sequenceTable->substituteArray[0]);
if (filter == NULL || filter->accept(LE_SET_GLYPH(glyph, substitute))) {

View file

@ -7,6 +7,9 @@
*/
#include "LETypes.h"
#include "LEScripts.h"
#include "LELanguages.h"
#include "LayoutEngine.h"
#include "OpenTypeLayoutEngine.h"
#include "ScriptAndLanguageTags.h"
@ -26,8 +29,8 @@ OpenTypeLayoutEngine::OpenTypeLayoutEngine(const LEFontInstance *fontInstance, l
: LayoutEngine(fontInstance, scriptCode, languageCode), fFeatureTags(NULL), fGSUBTable(gsubTable),
fSubstitutionFilter(NULL), fFeatureOrder(NULL)
{
static le_uint32 gdefTableTag = 0x47444546; // "GDEF"
static le_uint32 gposTableTag = 0x47504F53; // "GPOS"
static le_uint32 gdefTableTag = LE_MAKE_TAG('G', 'D', 'E', 'F');
static le_uint32 gposTableTag = LE_MAKE_TAG('G', 'P', 'O', 'S');
fGDEFTable = (const GlyphDefinitionTableHeader *) getFontTable(gdefTableTag);
fGPOSTable = (const GlyphPositioningTableHeader *) getFontTable(gposTableTag);
@ -76,8 +79,11 @@ LETag OpenTypeLayoutEngine::getScriptTag(le_int32 scriptCode)
LETag OpenTypeLayoutEngine::getLangSysTag(le_int32 languageCode)
{
// FIXME: do this for real some day (soon?)
return 0xFFFFFFFF;
if (languageCode < 0 || languageCode >= languageCodeCount) {
return 0xFFFFFFFF;
}
return languageTags[languageCode];
}
void OpenTypeLayoutEngine::setScriptAndLanguageTags()

View file

@ -137,6 +137,11 @@ private:
*/
static const LETag scriptTags[];
/**
* The array of language tags, indexed by language code.
*/
static const LETag languageTags[];
/**
* The address of this static class variable serves as this class's ID
* for ICU "poor man's RTTI".

View file

@ -13,10 +13,10 @@
U_NAMESPACE_BEGIN
const LangSysTable *ScriptTable::findLanguage(LETag languageTag) const
const LangSysTable *ScriptTable::findLanguage(LETag languageTag, le_bool exactMatch) const
{
le_uint16 count = SWAPW(langSysCount);
Offset langSysTableOffset = defaultLangSysTableOffset;
Offset langSysTableOffset = exactMatch? 0 : SWAPW(defaultLangSysTableOffset);
if (count > 0) {
Offset foundOffset =
@ -28,7 +28,7 @@ const LangSysTable *ScriptTable::findLanguage(LETag languageTag) const
}
if (langSysTableOffset != 0) {
return (const LangSysTable *) ((char *)this + SWAPW(langSysTableOffset));
return (const LangSysTable *) ((char *)this + langSysTableOffset);
}
return 0;
@ -47,7 +47,7 @@ const ScriptTable *ScriptListTable::findScript(LETag scriptTag) const
return 0;
}
const LangSysTable *ScriptListTable::findLanguage(LETag scriptTag, LETag languageTag) const
const LangSysTable *ScriptListTable::findLanguage(LETag scriptTag, LETag languageTag, le_bool exactMatch) const
{
const ScriptTable *scriptTable = findScript(scriptTag);
@ -55,7 +55,7 @@ const LangSysTable *ScriptListTable::findLanguage(LETag scriptTag, LETag languag
return 0;
}
return scriptTable->findLanguage(languageTag);
return scriptTable->findLanguage(languageTag, exactMatch);
}
U_NAMESPACE_END

View file

@ -34,7 +34,7 @@ struct ScriptTable
le_uint16 langSysCount;
LangSysRecord langSysRecordArray[ANY_NUMBER];
const LangSysTable *findLanguage(LETag languageTag) const;
const LangSysTable *findLanguage(LETag languageTag, le_bool exactMatch = false) const;
};
typedef TagAndOffsetRecord ScriptRecord;
@ -45,7 +45,7 @@ struct ScriptListTable
ScriptRecord scriptRecordArray[ANY_NUMBER];
const ScriptTable *findScript(LETag scriptTag) const;
const LangSysTable *findLanguage(LETag scriptTag, LETag languageTag) const;
const LangSysTable *findLanguage(LETag scriptTag, LETag languageTag, le_bool exactMatch = false) const;
};
U_NAMESPACE_END

View file

@ -1,11 +1,11 @@
/*
* %W% %E%
*
* (C) Copyright IBM Corp. 1998 - 2002. All Rights Reserved.
* (C) Copyright IBM Corp. 1998 - 2003. All Rights Reserved.
*
* WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS
* YOU REALLY KNOW WHAT YOU'RE DOING.
*
* $Source: /xsrl/Nsvn/icu/icu/source/layout/ScriptAndLanguageTags.cpp,v $ $Date: 2003/04/12 00:37:12 $ $Revision: 1.5 $
*/
#include "LETypes.h"
@ -60,7 +60,47 @@ const LETag OpenTypeLayoutEngine::scriptTags[] = {
tglgScriptTag, /* 'tglg' (TAGALOG) */
hanoScriptTag, /* 'hano' (HANUNOO) */
buhdScriptTag, /* 'buhd' (BUHID) */
tagbScriptTag /* 'tagb' (TAGBANWA) */
tagbScriptTag, /* 'tagb' (TAGBANWA) */
braiScriptTag, /* 'brai' (BRAILLE) */
cprtScriptTag, /* 'cprt' (CYPRIOT) */
limbScriptTag, /* 'limb' (LIMBU) */
linbScriptTag, /* 'linb' (LINEAR_B) */
osmaScriptTag, /* 'osma' (OSMANYA) */
shawScriptTag, /* 'shaw' (SHAVIAN) */
taleScriptTag, /* 'tale' (TAI_LE) */
ugarScriptTag /* 'ugar' (UGARITIC) */
};
const LETag OpenTypeLayoutEngine::languageTags[] = {
araLanguageTag, /* 'ARA' (Arabic) */
asmLanguageTag, /* 'ASM' (Assamese) */
benLanguageTag, /* 'BEN' (Bengali) */
farLanguageTag, /* 'FAR' (Farsi) */
gujLanguageTag, /* 'GUJ' (Gujarati) */
hinLanguageTag, /* 'HIN' (Hindi) */
iwrLanguageTag, /* 'IWR' (Hebrew) */
jiiLanguageTag, /* 'JII' (Yiddish) */
janLanguageTag, /* 'JAN' (Japanese) */
kanLanguageTag, /* 'KAN' (Kannada) */
kokLanguageTag, /* 'KOK' (Konkani) */
korLanguageTag, /* 'KOR' (Korean) */
kshLanguageTag, /* 'KSH' (Kashmiri) */
malLanguageTag, /* 'MAL' (Malayalam (Traditional)) */
marLanguageTag, /* 'MAR' (Marathi) */
mlrLanguageTag, /* 'MLR' (Malayalam (Reformed)) */
mniLanguageTag, /* 'MNI' (Manipuri) */
oriLanguageTag, /* 'ORI' (Oriya) */
sanLanguageTag, /* 'SAN' (Sanscrit) */
sndLanguageTag, /* 'SND' (Sindhi) */
snhLanguageTag, /* 'SNH' (Sinhalese) */
syrLanguageTag, /* 'SYR' (Syriac) */
tamLanguageTag, /* 'TAM' (Tamil) */
telLanguageTag, /* 'TEL' (Telugu) */
thaLanguageTag, /* 'THA' (Thai) */
urdLanguageTag, /* 'URD' (Urdu) */
zhpLanguageTag, /* 'ZHP' (Chinese (Phonetic)) */
zhsLanguageTag, /* 'ZHS' (Chinese (Simplified)) */
zhtLanguageTag /* 'ZHT' (Chinese (Traditional)) */
};
U_NAMESPACE_END

View file

@ -1,11 +1,11 @@
/*
* %W% %E%
*
* (C) Copyright IBM Corp. 1998 - 2003. All Rights Reserved.
*
* WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS
* YOU REALLY KNOW WHAT YOU'RE DOING.
*
* $Source: /xsrl/Nsvn/icu/icu/source/layout/ScriptAndLanguageTags.h,v $ $Date: 2003/04/12 00:37:12 $ $Revision: 1.7 $
*/
#ifndef __SCRIPTANDLANGUAGES_H
@ -17,60 +17,98 @@
*/
#include "LETypes.h"
#include "LEScripts.h"
U_NAMESPACE_BEGIN
const LETag zyyyScriptTag = 0x7A797979; /* 'zyyy' (COMMON) */
const LETag qaaiScriptTag = 0x71616169; /* 'qaai' (INHERITED) */
const LETag arabScriptTag = 0x61726162; /* 'arab' (ARABIC) */
const LETag armnScriptTag = 0x61726D6E; /* 'armn' (ARMENIAN) */
const LETag bengScriptTag = 0x62656E67; /* 'beng' (BENGALI) */
const LETag bopoScriptTag = 0x626F706F; /* 'bopo' (BOPOMOFO) */
const LETag cherScriptTag = 0x63686572; /* 'cher' (CHEROKEE) */
const LETag qaacScriptTag = 0x71616163; /* 'qaac' (COPTIC) */
const LETag cyrlScriptTag = 0x6379726C; /* 'cyrl' (CYRILLIC) */
const LETag dsrtScriptTag = 0x64737274; /* 'dsrt' (DESERET) */
const LETag devaScriptTag = 0x64657661; /* 'deva' (DEVANAGARI) */
const LETag ethiScriptTag = 0x65746869; /* 'ethi' (ETHIOPIC) */
const LETag georScriptTag = 0x67656F72; /* 'geor' (GEORGIAN) */
const LETag gothScriptTag = 0x676F7468; /* 'goth' (GOTHIC) */
const LETag grekScriptTag = 0x6772656B; /* 'grek' (GREEK) */
const LETag gujrScriptTag = 0x67756A72; /* 'gujr' (GUJARATI) */
const LETag guruScriptTag = 0x67757275; /* 'guru' (GURMUKHI) */
const LETag haniScriptTag = 0x68616E69; /* 'hani' (HAN) */
const LETag hangScriptTag = 0x68616E67; /* 'hang' (HANGUL) */
const LETag hebrScriptTag = 0x68656272; /* 'hebr' (HEBREW) */
const LETag hiraScriptTag = 0x68697261; /* 'hira' (HIRAGANA) */
const LETag kndaScriptTag = 0x6B6E6461; /* 'knda' (KANNADA) */
const LETag kanaScriptTag = 0x6B616E61; /* 'kana' (KATAKANA) */
const LETag khmrScriptTag = 0x6B686D72; /* 'khmr' (KHMER) */
const LETag laooScriptTag = 0x6C616F6F; /* 'laoo' (LAO) */
const LETag latnScriptTag = 0x6C61746E; /* 'latn' (LATIN) */
const LETag mlymScriptTag = 0x6D6C796D; /* 'mlym' (MALAYALAM) */
const LETag mongScriptTag = 0x6D6F6E67; /* 'mong' (MONGOLIAN) */
const LETag mymrScriptTag = 0x6D796D72; /* 'mymr' (MYANMAR) */
const LETag ogamScriptTag = 0x6F67616D; /* 'ogam' (OGHAM) */
const LETag italScriptTag = 0x6974616C; /* 'ital' (OLD_ITALIC) */
const LETag oryaScriptTag = 0x6F727961; /* 'orya' (ORIYA) */
const LETag runrScriptTag = 0x72756E72; /* 'runr' (RUNIC) */
const LETag sinhScriptTag = 0x73696E68; /* 'sinh' (SINHALA) */
const LETag syrcScriptTag = 0x73797263; /* 'syrc' (SYRIAC) */
const LETag tamlScriptTag = 0x74616D6C; /* 'taml' (TAMIL) */
const LETag teluScriptTag = 0x74656C75; /* 'telu' (TELUGU) */
const LETag thaaScriptTag = 0x74686161; /* 'thaa' (THAANA) */
const LETag thaiScriptTag = 0x74686169; /* 'thai' (THAI) */
const LETag tibtScriptTag = 0x74696274; /* 'tibt' (TIBETAN) */
const LETag cansScriptTag = 0x63616E73; /* 'cans' (CANADIAN_ABORIGINAL) */
const LETag yiiiScriptTag = 0x79696969; /* 'yiii' (YI) */
const LETag tglgScriptTag = 0x74676C67; /* 'tglg' (TAGALOG) */
const LETag hanoScriptTag = 0x68616E6F; /* 'hano' (HANUNOO) */
const LETag buhdScriptTag = 0x62756864; /* 'buhd' (BUHID) */
const LETag tagbScriptTag = 0x74616762; /* 'tagb' (TAGBANWA) */
const LETag zyyyScriptTag = LE_MAKE_TAG('z', 'y', 'y', 'y'); /* COMMON */
const LETag qaaiScriptTag = LE_MAKE_TAG('q', 'a', 'a', 'i'); /* INHERITED */
const LETag arabScriptTag = LE_MAKE_TAG('a', 'r', 'a', 'b'); /* ARABIC */
const LETag armnScriptTag = LE_MAKE_TAG('a', 'r', 'm', 'n'); /* ARMENIAN */
const LETag bengScriptTag = LE_MAKE_TAG('b', 'e', 'n', 'g'); /* BENGALI */
const LETag bopoScriptTag = LE_MAKE_TAG('b', 'o', 'p', 'o'); /* BOPOMOFO */
const LETag cherScriptTag = LE_MAKE_TAG('c', 'h', 'e', 'r'); /* CHEROKEE */
const LETag qaacScriptTag = LE_MAKE_TAG('q', 'a', 'a', 'c'); /* COPTIC */
const LETag cyrlScriptTag = LE_MAKE_TAG('c', 'y', 'r', 'l'); /* CYRILLIC */
const LETag dsrtScriptTag = LE_MAKE_TAG('d', 's', 'r', 't'); /* DESERET */
const LETag devaScriptTag = LE_MAKE_TAG('d', 'e', 'v', 'a'); /* DEVANAGARI */
const LETag ethiScriptTag = LE_MAKE_TAG('e', 't', 'h', 'i'); /* ETHIOPIC */
const LETag georScriptTag = LE_MAKE_TAG('g', 'e', 'o', 'r'); /* GEORGIAN */
const LETag gothScriptTag = LE_MAKE_TAG('g', 'o', 't', 'h'); /* GOTHIC */
const LETag grekScriptTag = LE_MAKE_TAG('g', 'r', 'e', 'k'); /* GREEK */
const LETag gujrScriptTag = LE_MAKE_TAG('g', 'u', 'j', 'r'); /* GUJARATI */
const LETag guruScriptTag = LE_MAKE_TAG('g', 'u', 'r', 'u'); /* GURMUKHI */
const LETag haniScriptTag = LE_MAKE_TAG('h', 'a', 'n', 'i'); /* HAN */
const LETag hangScriptTag = LE_MAKE_TAG('h', 'a', 'n', 'g'); /* HANGUL */
const LETag hebrScriptTag = LE_MAKE_TAG('h', 'e', 'b', 'r'); /* HEBREW */
const LETag hiraScriptTag = LE_MAKE_TAG('h', 'i', 'r', 'a'); /* HIRAGANA */
const LETag kndaScriptTag = LE_MAKE_TAG('k', 'n', 'd', 'a'); /* KANNADA */
const LETag kanaScriptTag = LE_MAKE_TAG('k', 'a', 'n', 'a'); /* KATAKANA */
const LETag khmrScriptTag = LE_MAKE_TAG('k', 'h', 'm', 'r'); /* KHMER */
const LETag laooScriptTag = LE_MAKE_TAG('l', 'a', 'o', 'o'); /* LAO */
const LETag latnScriptTag = LE_MAKE_TAG('l', 'a', 't', 'n'); /* LATIN */
const LETag mlymScriptTag = LE_MAKE_TAG('m', 'l', 'y', 'm'); /* MALAYALAM */
const LETag mongScriptTag = LE_MAKE_TAG('m', 'o', 'n', 'g'); /* MONGOLIAN */
const LETag mymrScriptTag = LE_MAKE_TAG('m', 'y', 'm', 'r'); /* MYANMAR */
const LETag ogamScriptTag = LE_MAKE_TAG('o', 'g', 'a', 'm'); /* OGHAM */
const LETag italScriptTag = LE_MAKE_TAG('i', 't', 'a', 'l'); /* OLD_ITALIC */
const LETag oryaScriptTag = LE_MAKE_TAG('o', 'r', 'y', 'a'); /* ORIYA */
const LETag runrScriptTag = LE_MAKE_TAG('r', 'u', 'n', 'r'); /* RUNIC */
const LETag sinhScriptTag = LE_MAKE_TAG('s', 'i', 'n', 'h'); /* SINHALA */
const LETag syrcScriptTag = LE_MAKE_TAG('s', 'y', 'r', 'c'); /* SYRIAC */
const LETag tamlScriptTag = LE_MAKE_TAG('t', 'a', 'm', 'l'); /* TAMIL */
const LETag teluScriptTag = LE_MAKE_TAG('t', 'e', 'l', 'u'); /* TELUGU */
const LETag thaaScriptTag = LE_MAKE_TAG('t', 'h', 'a', 'a'); /* THAANA */
const LETag thaiScriptTag = LE_MAKE_TAG('t', 'h', 'a', 'i'); /* THAI */
const LETag tibtScriptTag = LE_MAKE_TAG('t', 'i', 'b', 't'); /* TIBETAN */
const LETag cansScriptTag = LE_MAKE_TAG('c', 'a', 'n', 's'); /* CANADIAN_ABORIGINAL */
const LETag yiiiScriptTag = LE_MAKE_TAG('y', 'i', 'i', 'i'); /* YI */
const LETag tglgScriptTag = LE_MAKE_TAG('t', 'g', 'l', 'g'); /* TAGALOG */
const LETag hanoScriptTag = LE_MAKE_TAG('h', 'a', 'n', 'o'); /* HANUNOO */
const LETag buhdScriptTag = LE_MAKE_TAG('b', 'u', 'h', 'd'); /* BUHID */
const LETag tagbScriptTag = LE_MAKE_TAG('t', 'a', 'g', 'b'); /* TAGBANWA */
const LETag braiScriptTag = LE_MAKE_TAG('b', 'r', 'a', 'i'); /* BRAILLE */
const LETag cprtScriptTag = LE_MAKE_TAG('c', 'p', 'r', 't'); /* CYPRIOT */
const LETag limbScriptTag = LE_MAKE_TAG('l', 'i', 'm', 'b'); /* LIMBU */
const LETag linbScriptTag = LE_MAKE_TAG('l', 'i', 'n', 'b'); /* LINEAR_B */
const LETag osmaScriptTag = LE_MAKE_TAG('o', 's', 'm', 'a'); /* OSMANYA */
const LETag shawScriptTag = LE_MAKE_TAG('s', 'h', 'a', 'w'); /* SHAVIAN */
const LETag taleScriptTag = LE_MAKE_TAG('t', 'a', 'l', 'e'); /* TAI_LE */
const LETag ugarScriptTag = LE_MAKE_TAG('u', 'g', 'a', 'r'); /* UGARITIC */
const LETag nullScriptTag = 0x00000000; /* '' (NULL) */
const LETag noLangSysTag = 0x00000000; /* '' (NONE) */
const LETag araLanguageTag = LE_MAKE_TAG('A', 'R', 'A', ' '); /* Arabic */
const LETag asmLanguageTag = LE_MAKE_TAG('A', 'S', 'M', ' '); /* Assamese */
const LETag benLanguageTag = LE_MAKE_TAG('B', 'E', 'N', ' '); /* Bengali */
const LETag farLanguageTag = LE_MAKE_TAG('F', 'A', 'R', ' '); /* Farsi */
const LETag gujLanguageTag = LE_MAKE_TAG('G', 'U', 'J', ' '); /* Gujarati */
const LETag hinLanguageTag = LE_MAKE_TAG('H', 'I', 'N', ' '); /* Hindi */
const LETag iwrLanguageTag = LE_MAKE_TAG('I', 'W', 'R', ' '); /* Hebrew */
const LETag jiiLanguageTag = LE_MAKE_TAG('J', 'I', 'I', ' '); /* Yiddish */
const LETag janLanguageTag = LE_MAKE_TAG('J', 'A', 'N', ' '); /* Japanese */
const LETag kanLanguageTag = LE_MAKE_TAG('K', 'A', 'N', ' '); /* Kannada */
const LETag kokLanguageTag = LE_MAKE_TAG('K', 'O', 'K', ' '); /* Konkani */
const LETag korLanguageTag = LE_MAKE_TAG('K', 'O', 'R', ' '); /* Korean */
const LETag kshLanguageTag = LE_MAKE_TAG('K', 'S', 'H', ' '); /* Kashmiri */
const LETag malLanguageTag = LE_MAKE_TAG('M', 'A', 'L', ' '); /* Malayalam (Traditional) */
const LETag marLanguageTag = LE_MAKE_TAG('M', 'A', 'R', ' '); /* Marathi */
const LETag mlrLanguageTag = LE_MAKE_TAG('M', 'L', 'R', ' '); /* Malayalam (Reformed) */
const LETag mniLanguageTag = LE_MAKE_TAG('M', 'N', 'I', ' '); /* Manipuri */
const LETag oriLanguageTag = LE_MAKE_TAG('O', 'R', 'I', ' '); /* Oriya */
const LETag sanLanguageTag = LE_MAKE_TAG('S', 'A', 'N', ' '); /* Sanscrit */
const LETag sndLanguageTag = LE_MAKE_TAG('S', 'N', 'D', ' '); /* Sindhi */
const LETag snhLanguageTag = LE_MAKE_TAG('S', 'N', 'H', ' '); /* Sinhalese */
const LETag syrLanguageTag = LE_MAKE_TAG('S', 'Y', 'R', ' '); /* Syriac */
const LETag tamLanguageTag = LE_MAKE_TAG('T', 'A', 'M', ' '); /* Tamil */
const LETag telLanguageTag = LE_MAKE_TAG('T', 'E', 'L', ' '); /* Telugu */
const LETag thaLanguageTag = LE_MAKE_TAG('T', 'H', 'A', ' '); /* Thai */
const LETag urdLanguageTag = LE_MAKE_TAG('U', 'R', 'D', ' '); /* Urdu */
const LETag zhpLanguageTag = LE_MAKE_TAG('Z', 'H', 'P', ' '); /* Chinese (Phonetic) */
const LETag zhsLanguageTag = LE_MAKE_TAG('Z', 'H', 'S', ' '); /* Chinese (Simplified) */
const LETag zhtLanguageTag = LE_MAKE_TAG('Z', 'H', 'T', ' '); /* Chinese (Traditional) */
const LETag noLanguageTag = 0x00000000; /* '' (NONE) */
U_NAMESPACE_END
#endif

View file

@ -234,6 +234,10 @@ SOURCE=.\GXLayoutEngine.cpp
# End Source File
# Begin Source File
SOURCE=.\HanLayoutEngine.cpp
# End Source File
# Begin Source File
SOURCE=.\HebrewLigatureData.cpp
# End Source File
# Begin Source File
@ -502,6 +506,10 @@ SOURCE=.\GXLayoutEngine.h
# End Source File
# Begin Source File
SOURCE=.\HanLayoutEngine.h
# End Source File
# Begin Source File
SOURCE=.\HebrewShaping.h
# End Source File
# Begin Source File
@ -671,6 +679,53 @@ InputPath=.\LEGlyphFilter.h
# End Source File
# Begin Source File
SOURCE=.\LELanguages.h
!IF "$(CFG)" == "layout - Win32 Release"
# Begin Custom Build
InputPath=.\LELanguages.h
"..\..\include\layout\LELanguages.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
copy $(InputPath) ..\..\include\layout
# End Custom Build
!ELSEIF "$(CFG)" == "layout - Win32 Debug"
# Begin Custom Build
InputPath=.\LELanguages.h
"..\..\include\layout\LELanguages.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
copy $(InputPath) ..\..\include\layout
# End Custom Build
!ELSEIF "$(CFG)" == "layout - Win64 Release"
# Begin Custom Build
InputPath=.\LELanguages.h
"..\..\include\layout\LELanguages.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
copy $(InputPath) ..\..\include\layout
# End Custom Build
!ELSEIF "$(CFG)" == "layout - Win64 Debug"
# Begin Custom Build
InputPath=.\LELanguages.h
"..\..\include\layout\LELanguages.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
copy $(InputPath) ..\..\include\layout
# End Custom Build
!ENDIF
# End Source File
# Begin Source File
SOURCE=.\LEScripts.h
!IF "$(CFG)" == "layout - Win32 Release"