windows-nt/Source/XPSP1/NT/drivers/tpg/hwx/commonu/inc/locale.h
2020-09-26 16:20:57 +08:00

335 lines
12 KiB
C

/******************************************************************************\
* FILE: locale.h
*
* Public structures and functions library that are used to access the
* localization information.
*
* There are two major pieces of this. The first deals with stuff available
* to the runtime of shipped products (e.g. the recognizer). The second is
* stuff needed at train time that we do not want in the shipped product
* (usually for size reasons).
\******************************************************************************/
#if !defined (__HWX_LOCALE__)
#define __HWX_LOCALE__
#ifdef __cplusplus
extern "C" {
#endif
/******************************************************************************\
* Stuff for the product runtime, also used by all the other code.
\******************************************************************************/
//
// Constants
//
// Masks to get at baseline and height values from a BLINE_HEIGHT value.
#define LOCBH_BASE_MASK ((BYTE)0x0F)
#define LOCBH_HEIGHT_MASK ((BYTE)0xF0)
//
// Structures and types
//
// define the types needed for ClassBigrams and BaseLine Height
typedef unsigned char CODEPOINT_CLASS;
typedef unsigned char BLINE_HEIGHT;
// CodePointClass Header describes:
// - how the CodePointClass codes for a certain subrange are stored (Array vs ExceptionList)
// - The size of the Array/(Exception Lists)
// - Offset to the Array/the 1st Exception List
typedef struct tagCODEPOINT_CLASS_HEADER
{
WORD iFlags; // Bit15 indicates the format of the data
// 0:Array (Full array is supplied)
// 1:Exception (A default and exception list(s) are supplied
// if Bit0=0
// Bits 0-14 Number of Array Entries (up 32768)
// if Bit15=1
// Bits 8-14 Number of Exceptions
// Bits 1-8 Default BigramClass code
WORD iOffset; // Offset in bytes in the ArrayBuffer (Bit15=0) or ExceptionsBuffer (Bit0=1)
}CODEPOINT_CLASS_HEADER;
// BLHeight Header describes:
// - how the BLHeight codes for a certain subrange are stored (Array vs ExceptionList)
// - The size of the Array/(Exception Lists)
// - Offset to the Array/the 1st Exception List
typedef struct tagBLINE_HEIGHT_HEADER
{
WORD iFlags; // Bit15 indicates the format of the data
// 0:Array (Full array is supplied)
// 1:Exception (A default and exception list(s) are supplied
// if Bit15=0
// Bits 1-14 Number of Array Entries (up 32768)
// if Bit15=1
// Bits 8-14 Number of exceptions
// Bits 1-8 Default BLHeight code
WORD iOffset; // Offset in bytes in the ArrayBuffer (Bit15=0) or ExceptionsBuffer (Bit0=1)
}BLINE_HEIGHT_HEADER;
// CodePointClass Exception describes the Class Bigram exception structure
typedef struct tagCODEPOINT_CLASS_EXCEPTION
{
CODEPOINT_CLASS clCode; // The CodePointClass Code for this list
BYTE cNumEntries; // Number of entries in the exception list
wchar_t wDenseCode[1]; // an Array of CodePoint Indices in the subrange
}CODEPOINT_CLASS_EXCEPTION;
// BLineHgt Exception describes the Class Bigram exception structure
typedef struct tagBLINE_HEIGHT_EXCEPTION
{
BLINE_HEIGHT blhCode; // The BLineHgt Code for this list
BYTE cNumEntries; // Number of entries in the exception list
wchar_t wDenseCode[1]; // an Array of CodePoint Indices in the subrange
}BLINE_HEIGHT_EXCEPTION;
// Range specification for ALC subranges of Dense coding of the character set.
// Giving both the first code and the number of codes is redundent, but we
// would waste the space anyway to keep DWORD alignment, and it makes some
// coding easier. Note that the ALC bits for the first range are zero because
// you need to use the ALC table for individual ALC values for each code in
// the range.
typedef struct tagLOCRUN_ALC_SUBRANGE {
WORD iFirstCode; // First code in range.
WORD cCodesInRange; // Number of codes in this range.
ALC alcRange; // The ALC bits for all code points in this range.
CODEPOINT_CLASS_HEADER clHeader; // Class Bigram Header
BLINE_HEIGHT_HEADER blhHeader; // BaseLine Header
} LOCRUN_ALC_SUBRANGE;
// Defines to make it easy to have pointers to folding sets.
#define LOCRUN_FOLD_MAX_ALTERNATES 8 // Max alternates in the folding table
typedef WORD LOCRUN_FOLDING_SET[LOCRUN_FOLD_MAX_ALTERNATES];
// Structure giving access to a loaded copy of the localization runtime tables.
// NOTE: The arrays pointed to by pClassExcpts and pBLineHgtExcpts contain
// word data that is only byte aligned, and can cause data misalignment faults
// in CE. Search for the string "UNALIGNED" in locrun.c to see how this is worked
// around.
typedef struct tagLOCRUN_INFO {
DWORD adwSignature [3]; // A signature computed from the loc info
// DWORD0: Date/Time Stamp (time_t)
// DWORD1: XORING ALC values for all CPs
// DWORD2 HIWORD: XORING ALL Valid CPs
// LOWORD: XORING ALL BasLn,Hgt Info
WORD cCodePoints; // Number of supported code points.
BYTE cALCSubranges; // Number of subranges defined
// across Dense coding
BYTE cFoldingSets; // Number of folding sets defined
WORD cClassesArraySize; // size in bytes of classes arrays
WORD cClassesExcptSize; // size in bytes of classes exception lists
WORD cBLineHgtArraySize; // size in bytes of BLineHgt arrays
WORD cBLineHgtExcptSize; // size in bytes of BLineHgt exception lists
wchar_t *pDense2Unicode; // Map from Dense coding to Unicode.
LOCRUN_ALC_SUBRANGE *pALCSubranges; // Subranges of Dense coding, and
// their ALC values.
ALC *pSubrange0ALC; // The ALC values for the first
// subrange
LOCRUN_FOLDING_SET *pFoldingSets; // List of folding sets
ALC *pFoldingSetsALC; // The merged ALCs for the folded
// characters.
CODEPOINT_CLASS *pClasses; // Array of Codepoint classes for all subranges
BYTE *pClassExcpts; // classes Exception lists for all subranges
BLINE_HEIGHT *pBLineHgtCodes; // Array of BLineHgt codes for all subranges
BYTE *pBLineHgtExcpts; // BLineHgt Exception lists for all subranges
void *pLoadInfo1; // Handles needed to unload the data
void *pLoadInfo2;
void *pLoadInfo3;
} LOCRUN_INFO;
//
// Macros to access the runtime localization information
//
// Is value a valid Dense code
#define LocRunIsDenseCode(pLocRunInfo,dch) \
((dch) < (pLocRunInfo)->cCodePoints)
// Is value a valid folded code. Folded codes are placed directly after
// the Dense codes.
#define LocRunIsFoldedCode(pLocRunInfo,dch) ( \
((pLocRunInfo)->cCodePoints <= (dch)) && \
((dch) < ((pLocRunInfo)->cCodePoints + (pLocRunInfo)->cFoldingSets)) \
)
// Convert Dense code to Unicode.
#define LocRunDense2Unicode(pLocRunInfo,dch) \
((pLocRunInfo)->pDense2Unicode[dch])
// Get pointer to folding set for a folded code.
#define LocRunFolded2FoldingSet(pLocRunInfo,fch) ( \
(wchar_t *)(pLocRunInfo)->pFoldingSets[(fch) - (pLocRunInfo)->cCodePoints] \
)
// Convert Folded code to Dense code.
#define LocRunFolded2Dense(pLocRunInfo,fch) ( \
(pLocRunInfo)->pFoldingSets[(fch) - (pLocRunInfo)->cCodePoints][0] \
)
// Get ALC from either dense or folded code.
#define LocRun2ALC(pLocRunInfo, dch) ( \
LocRunIsFoldedCode(pLocRunInfo,dch) \
? LocRunFolded2ALC(pLocRunInfo, dch) \
: LocRunDense2ALC(pLocRunInfo, dch) \
)
// Value returned when GetDensecodeClass is unable to determine the class
#define LOC_RUN_NO_CLASS 0xFE
// Value returned when LocRunDense2BLineHgt is unable to determine the BlineHgt
#define LOC_RUN_NO_BLINEHGT 0xFE
// Value returned by LocRunUnicode2Dense and LocTrainUnicode2Dense when there is
// no dense code for the supplied Unicode character.
// JRB: Should really rename this LOC_RUN_NO_DENSE_CODE
#define LOC_TRAIN_NO_DENSE_CODE L'\xFFFF'
//
//Functions to access the runtime localization information
//
// Load runtime localization information from a file.
BOOL LocRunLoadFile(LOCRUN_INFO *pLocRunInfo, wchar_t *pPath);
// Unload runtime localization information that was loaded from a file.
BOOL LocRunUnloadFile(LOCRUN_INFO *pLocRunInfo);
// Load runtime localization information from a resource.
// Note, don't need to unload resources.
BOOL LocRunLoadRes(
LOCRUN_INFO *pLocRunInfo,
HINSTANCE hInst,
int nResID,
int nType
);
// Load runtime localization information from an image already loaded into
// memory.
BOOL LocRunLoadPointer(LOCRUN_INFO *pLocRunInfo, void *pData);
// Write a properly formated binary file containing the runtime localization
// information.
#ifndef HWX_PRODUCT // Hide this when compiling product
BOOL LocRunWriteFile(LOCRUN_INFO *pLocRunInfo, FILE *pFile);
#endif
// Get ALC value for a Dense coded character
ALC LocRunDense2ALC(LOCRUN_INFO *pLocRunInfo, wchar_t dch);
// Get ALC value for a folded character
ALC LocRunFolded2ALC(LOCRUN_INFO *pLocRunInfo, wchar_t dch);
// Convert Dense code to Folded code.
wchar_t LocRunDense2Folded(LOCRUN_INFO *pLocRunInfo, wchar_t dch);
// Convert from Dense coding to Unicode. If no dense code for the Unicode
// value, 0xFFFF is returned.
// WARNING: this is expensive. For code outside the runtime recognizer, use
// the LocTranUnicode2Dense function. For the recognizer, you have to use
// this, but use it as little as possable.
wchar_t LocRunUnicode2Dense(LOCRUN_INFO *pLocRunInfo, wchar_t wch);
// Get the BLineHgt code for a specific dense code
BLINE_HEIGHT
LocRunDense2BLineHgt(LOCRUN_INFO *pLocRunInfo, wchar_t dch);
// Convert a dense coded character to its character class.
CODEPOINT_CLASS
LocRunDensecode2Class(LOCRUN_INFO *pLocRunInfo, wchar_t dch);
/******************************************************************************\
* Stuff for the training programs, not to be used by product code.
\******************************************************************************/
#ifndef HWX_PRODUCT // Hide this when compiling product
//
// Structures and types
//
// Information on min and max stroke counts for a code point.
typedef struct tagSTROKE_COUNT_INFO {
BYTE minStrokes; // Min legal strokes for char.
BYTE maxStrokes; // Max legal strokes for char.
} STROKE_COUNT_INFO;
// Structure giving access to a loaded copy of the localization training time
// tables.
typedef struct tagLOCTRAIN_INFO {
// Convsion from unicode to dense.
WORD cCodePoints; // Number of supported code points.
wchar_t *pUnicode2Dense; // Map from Unicode to Dense coding.
// Stroke count info per character. Indexed by dense code.
WORD cStrokeCountInfo; // Number of entries array.
STROKE_COUNT_INFO *pStrokeCountInfo; // Stoke count info array.
void *pLoadInfo1; // Handles needed to unload the
void *pLoadInfo2; // data.
void *pLoadInfo3;
} LOCTRAIN_INFO;
//
// Constants
//
// Values to set min and max stroke counts to when they are not known.
#define LOC_TRAIN_UNKNOWN_MIN_STROKE_COUNT 0x00
#define LOC_TRAIN_UNKNOWN_MAX_STROKE_COUNT 0xFF
//
// Macros to access the train time localization information
//
// Convert Unicode to Dense code.
#define LocTrainUnicode2Dense(pLocTrainInfo,wch) \
((pLocTrainInfo)->pUnicode2Dense[wch])
//
//Functions to access the train time localization information
//
// Load train time localization information from a file.
BOOL LocTrainLoadFile(LOCRUN_INFO *pLocRunInfo, LOCTRAIN_INFO *pLocTrainInfo, wchar_t *pPath);
// Unload train time localization information that was loaded from a file.
BOOL LocTrainUnloadFile(LOCTRAIN_INFO *pLocTrainInfo);
// Load train time localization information from a resource.
BOOL LocTrainLoadRes(
LOCRUN_INFO *pLocRunInfo, LOCTRAIN_INFO *pLocTrainInfo, HINSTANCE hInst, int nResID, int nType
);
// Load train time localization information from an image already loaded into
// memory.
BOOL LocTrainLoadPointer(LOCRUN_INFO *pLocRunInfo, LOCTRAIN_INFO *pLocTrainInfo, void *pData);
// Write a properly formated binary file containing the train time
// localization information.
BOOL LocTrainWriteFile(LOCRUN_INFO *pLocRunInfo, LOCTRAIN_INFO *pLocTrainInfo, FILE *pFile);
// Check if valid stroke count for character. Takes dense code.
BOOL LocTrainValidStrokeCount(
LOCTRAIN_INFO *pLocTrainInfo, wchar_t dch, int cStrokes
);
#endif
#ifdef __cplusplus
}
#endif
#endif