/* USP - Unicode Complex Script processor
* http://msdn2.microsoft.com/library/ms776488 */
module win32.usp10;
import win32.windows;
/* Uniscribe Enumeration Types
* http://msdn2.microsoft.com/library/ms776518 */
enum : WORD {
SCRIPT_UNDEFINED = 0,
}
enum : DWORD {
SGCM_RTL = 0x00000001,
}
enum : DWORD {
SSA_PASSWORD = 0x00000001,
SSA_TAB = 0x00000002,
SSA_CLIP = 0x00000004,
SSA_FIT = 0x00000008,
SSA_DZWG = 0x00000010,
SSA_FALLBACK = 0x00000020,
SSA_BREAK = 0x00000040,
SSA_GLYPHS = 0x00000080,
SSA_RTL = 0x00000100,
SSA_GCP = 0x00000200,
SSA_HOTKEY = 0x00000400,
SSA_METAFILE = 0x00000800,
SSA_LINK = 0x00001000,
SSA_HIDEHOTKEY = 0x00002000,
SSA_HOTKEYONLY = 0x00002400,
SSA_FULLMEASURE = 0x04000000,
SSA_LPKANSIFALLBACK = 0x08000000,
SSA_PIDX = 0x10000000,
SSA_LAYOUTRTL = 0x20000000,
SSA_DONTGLYPH = 0x40000000,
SSA_NOKASHIDA = 0x80000000,
}
enum : DWORD {
SIC_COMPLEX = 1,
SIC_ASCIIDIGIT = 2,
SIC_NEUTRAL = 4,
}
enum : DWORD {
SCRIPT_DIGITSUBSTITUTE_CONTEXT,
SCRIPT_DIGITSUBSTITUTE_NONE,
SCRIPT_DIGITSUBSTITUTE_NATIONAL,
SCRIPT_DIGITSUBSTITUTE_TRADITIONAL,
}
enum SCRIPT_JUSTIFY : WORD {
SCRIPT_JUSTIFY_NONE,
SCRIPT_JUSTIFY_ARABIC_BLANK,
SCRIPT_JUSTIFY_CHARACTER,
SCRIPT_JUSTIFY_RESERVED1,
SCRIPT_JUSTIFY_BLANK,
SCRIPT_JUSTIFY_RESERVED2,
SCRIPT_JUSTIFY_RESERVED3,
SCRIPT_JUSTIFY_ARABIC_NORMAL,
SCRIPT_JUSTIFY_ARABIC_KASHIDA,
SCRIPT_JUSTIFY_ARABIC_ALEF,
SCRIPT_JUSTIFY_ARABIC_HA,
SCRIPT_JUSTIFY_ARABIC_RA,
SCRIPT_JUSTIFY_ARABIC_BA,
SCRIPT_JUSTIFY_ARABIC_BARA,
SCRIPT_JUSTIFY_ARABIC_SEEN,
SCRIPT_JUSTIFY_ARABIC_SEEN_M,
}
/* Uniscribe Structures
* http://msdn2.microsoft.com/library/ms776479 */
alias void* SCRIPT_CACHE;
alias void* SCRIPT_STRING_ANALYSIS;
extern (C)
{
struct SCRIPT_CONTROL
{
private DWORD _bitfield;
DWORD uDefaultLanguage() { return (_bitfield >> 0) & 0xFFFF; }
DWORD uDefaultLanguage(DWORD val) { _bitfield = cast(DWORD)((_bitfield & 0xFFFFFFFFFFFF0000) | (val << 0)); return val; }
DWORD fContextDigits() { return (_bitfield >> 16) & 0x1; }
DWORD fContextDigits(DWORD val) { _bitfield = cast(DWORD)((_bitfield & 0xFFFFFFFFFFFEFFFF) | (val << 16)); return val; }
DWORD fInvertPreBoundDir() { return (_bitfield >> 17) & 0x1; }
DWORD fInvertPreBoundDir(DWORD val) { _bitfield = cast(DWORD)((_bitfield & 0xFFFFFFFFFFFDFFFF) | (val << 17)); return val; }
DWORD fInvertPostBoundDir() { return (_bitfield >> 18) & 0x1; }
DWORD fInvertPostBoundDir(DWORD val) { _bitfield = cast(DWORD)((_bitfield & 0xFFFFFFFFFFFBFFFF) | (val << 18)); return val; }
DWORD fLinkStringBefore() { return (_bitfield >> 19) & 0x1; }
DWORD fLinkStringBefore(DWORD val) { _bitfield = cast(DWORD)((_bitfield & 0xFFFFFFFFFFF7FFFF) | (val << 19)); return val; }
DWORD fLinkStringAfter() { return (_bitfield >> 20) & 0x1; }
DWORD fLinkStringAfter(DWORD val) { _bitfield = cast(DWORD)((_bitfield & 0xFFFFFFFFFFEFFFFF) | (val << 20)); return val; }
DWORD fNeutralOverride() { return (_bitfield >> 21) & 0x1; }
DWORD fNeutralOverride(DWORD val) { _bitfield = cast(DWORD)((_bitfield & 0xFFFFFFFFFFDFFFFF) | (val << 21)); return val; }
DWORD fNumericOverride() { return (_bitfield >> 22) & 0x1; }
DWORD fNumericOverride(DWORD val) { _bitfield = cast(DWORD)((_bitfield & 0xFFFFFFFFFFBFFFFF) | (val << 22)); return val; }
DWORD fLegacyBidiClass() { return (_bitfield >> 23) & 0x1; }
DWORD fLegacyBidiClass(DWORD val) { _bitfield = cast(DWORD)((_bitfield & 0xFFFFFFFFFF7FFFFF) | (val << 23)); return val; }
DWORD fReserved() { return (_bitfield >> 24) & 0xFF; }
DWORD fReserved(DWORD val) { _bitfield = cast(DWORD)((_bitfield & 0xFFFFFFFF00FFFFFF) | (val << 24)); return val; }
}
struct SCRIPT_STATE
{
private WORD _bitfield;
WORD uBidiLevel() { return cast(WORD)((_bitfield >> 0) & 0x1F); }
WORD uBidiLevel(WORD val) { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFFFFE0) | (val << 0)); return val; }
WORD fOverrideDirection() { return cast(WORD)((_bitfield >> 5) & 0x1); }
WORD fOverrideDirection(WORD val) { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFFFFDF) | (val << 5)); return val; }
WORD fInhibitSymSwap() { return cast(WORD)((_bitfield >> 6) & 0x1); }
WORD fInhibitSymSwap(WORD val) { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFFFFBF) | (val << 6)); return val; }
WORD fCharShape() { return cast(WORD)((_bitfield >> 7) & 0x1); }
WORD fCharShape(WORD val) { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFFFF7F) | (val << 7)); return val; }
WORD fDigitSubstitute() { return cast(WORD)((_bitfield >> 8) & 0x1); }
WORD fDigitSubstitute(WORD val) { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFFFEFF) | (val << 8)); return val; }
WORD fInhibitLigate() { return cast(WORD)((_bitfield >> 9) & 0x1); }
WORD fInhibitLigate(WORD val) { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFFFDFF) | (val << 9)); return val; }
WORD fDisplayZWG() { return cast(WORD)((_bitfield >> 10) & 0x1); }
WORD fDisplayZWG(WORD val) { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFFFBFF) | (val << 10)); return val; }
WORD fArabicNumContext() { return cast(WORD)((_bitfield >> 11) & 0x1); }
WORD fArabicNumContext(WORD val) { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFFF7FF) | (val << 11)); return val; }
WORD fGcpClusters() { return cast(WORD)((_bitfield >> 12) & 0x1); }
WORD fGcpClusters(WORD val) { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFFEFFF) | (val << 12)); return val; }
WORD fReserved() { return cast(WORD)((_bitfield >> 13) & 0x1); }
WORD fReserved(WORD val) { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFFDFFF) | (val << 13)); return val; }
WORD fEngineReserved() { return cast(WORD)((_bitfield >> 14) & 0x3); }
WORD fEngineReserved(WORD val) { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFF3FFF) | (val << 14)); return val; }
}
struct SCRIPT_ANALYSIS
{
private WORD _bitfield;
WORD eScript() { return cast(WORD)((_bitfield >> 0) & 0x3FF); }
WORD eScript(WORD val) { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFFFC00) | (val << 0)); return val; }
WORD fRTL() { return cast(WORD)((_bitfield >> 10) & 0x1); }
WORD fRTL(WORD val) { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFFFBFF) | (val << 10)); return val; }
WORD fLayoutRTL() { return cast(WORD)((_bitfield >> 11) & 0x1); }
WORD fLayoutRTL(WORD val) { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFFF7FF) | (val << 11)); return val; }
WORD fLinkBefore() { return cast(WORD)((_bitfield >> 12) & 0x1); }
WORD fLinkBefore(WORD val) { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFFEFFF) | (val << 12)); return val; }
WORD fLinkAfter() { return cast(WORD)((_bitfield >> 13) & 0x1); }
WORD fLinkAfter(WORD val) { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFFDFFF) | (val << 13)); return val; }
WORD fLogicalOrder() { return cast(WORD)((_bitfield >> 14) & 0x1); }
WORD fLogicalOrder(WORD val) { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFFBFFF) | (val << 14)); return val; }
WORD fNoGlyphIndex() { return cast(WORD)((_bitfield >> 15) & 0x1); }
WORD fNoGlyphIndex(WORD val) { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFF7FFF) | (val << 15)); return val; }
SCRIPT_STATE s;
}
struct SCRIPT_ITEM
{
int iCharPos;
SCRIPT_ANALYSIS a;
}
struct SCRIPT_VISATTR
{
private WORD _bitfield;
WORD uJustification() { return cast(WORD)((_bitfield >> 0) & 0xF); }
WORD uJustification(WORD val) { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFFFFF0) | (val << 0)); return val; }
WORD fClusterStart() { return cast(WORD)((_bitfield >> 4) & 0x1); }
WORD fClusterStart(WORD val) { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFFFFEF) | (val << 4)); return val; }
WORD fDiacritic() { return cast(WORD)((_bitfield >> 5) & 0x1); }
WORD fDiacritic(WORD val) { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFFFFDF) | (val << 5)); return val; }
WORD fZeroWidth() { return cast(WORD)((_bitfield >> 6) & 0x1); }
WORD fZeroWidth(WORD val) { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFFFFBF) | (val << 6)); return val; }
WORD fReserved() { return cast(WORD)((_bitfield >> 7) & 0x1); }
WORD fReserved(WORD val) { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFFFF7F) | (val << 7)); return val; }
WORD fShapeReserved() { return cast(WORD)((_bitfield >> 8) & 0xFF); }
WORD fShapeReserved(WORD val) { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFF00FF) | (val << 8)); return val; }
}
struct GOFFSET
{
LONG du;
LONG dv;
}
struct SCRIPT_LOGATTR
{
BYTE _bitfield;
BYTE fSoftBreak() { return cast(BYTE)((_bitfield >> 0) & 0x1); }
BYTE fSoftBreak(BYTE val) { _bitfield = cast(BYTE)((_bitfield & 0xFFFFFFFFFFFFFFFE) | (val << 0)); return val; }
BYTE fWhiteSpace() { return cast(BYTE)((_bitfield >> 1) & 0x1); }
BYTE fWhiteSpace(BYTE val) { _bitfield = cast(BYTE)((_bitfield & 0xFFFFFFFFFFFFFFFD) | (val << 1)); return val; }
BYTE fCharStop() { return cast(BYTE)((_bitfield >> 2) & 0x1); }
BYTE fCharStop(BYTE val) { _bitfield = cast(BYTE)((_bitfield & 0xFFFFFFFFFFFFFFFB) | (val << 2)); return val; }
BYTE fWordStop() { return cast(BYTE)((_bitfield >> 3) & 0x1); }
BYTE fWordStop(BYTE val) { _bitfield = cast(BYTE)((_bitfield & 0xFFFFFFFFFFFFFFF7) | (val << 3)); return val; }
BYTE fInvalid() { return cast(BYTE)((_bitfield >> 4) & 0x1); }
BYTE fInvalid(BYTE val) { _bitfield = cast(BYTE)((_bitfield & 0xFFFFFFFFFFFFFFEF) | (val << 4)); return val; }
BYTE fReserved() { return cast(BYTE)((_bitfield >> 5) & 0x7); }
BYTE fReserved(BYTE val) { _bitfield = cast(BYTE)((_bitfield & 0xFFFFFFFFFFFFFF1F) | (val << 5)); return val; }
}
struct SCRIPT_PROPERTIES
{
private DWORD _bitfield1;
DWORD langid() { return (_bitfield1 >> 0) & 0xFFFF; }
DWORD langid(DWORD val) { _bitfield1 = cast(DWORD)((_bitfield1 & 0xFFFFFFFFFFFF0000) | (val << 0)); return val; }
DWORD fNumeric() { return (_bitfield1 >> 16) & 0x1; }
DWORD fNumeric(DWORD val) { _bitfield1 = cast(DWORD)((_bitfield1 & 0xFFFFFFFFFFFEFFFF) | (val << 16)); return val; }
DWORD fComplex() { return (_bitfield1 >> 17) & 0x1; }
DWORD fComplex(DWORD val) { _bitfield1 = cast(DWORD)((_bitfield1 & 0xFFFFFFFFFFFDFFFF) | (val << 17)); return val; }
DWORD fNeedsWordBreaking() { return (_bitfield1 >> 18) & 0x1; }
DWORD fNeedsWordBreaking(DWORD val) { _bitfield1 = cast(DWORD)((_bitfield1 & 0xFFFFFFFFFFFBFFFF) | (val << 18)); return val; }
DWORD fNeedsCaretInfo() { return (_bitfield1 >> 19) & 0x1; }
DWORD fNeedsCaretInfo(DWORD val) { _bitfield1 = cast(DWORD)((_bitfield1 & 0xFFFFFFFFFFF7FFFF) | (val << 19)); return val; }
DWORD bCharSet() { return (_bitfield1 >> 20) & 0xFF; }
DWORD bCharSet(DWORD val) { _bitfield1 = cast(DWORD)((_bitfield1 & 0xFFFFFFFFF00FFFFF) | (val << 20)); return val; }
DWORD fControl() { return (_bitfield1 >> 28) & 0x1; }
DWORD fControl(DWORD val) { _bitfield1 = cast(DWORD)((_bitfield1 & 0xFFFFFFFFEFFFFFFF) | (val << 28)); return val; }
DWORD fPrivateUseArea() { return (_bitfield1 >> 29) & 0x1; }
DWORD fPrivateUseArea(DWORD val) { _bitfield1 = cast(DWORD)((_bitfield1 & 0xFFFFFFFFDFFFFFFF) | (val << 29)); return val; }
DWORD fNeedsCharacterJustify() { return (_bitfield1 >> 30) & 0x1; }
DWORD fNeedsCharacterJustify(DWORD val) { _bitfield1 = cast(DWORD)((_bitfield1 & 0xFFFFFFFFBFFFFFFF) | (val << 30)); return val; }
DWORD fInvalidGlyph() { return (_bitfield1 >> 31) & 0x1; }
DWORD fInvalidGlyph(DWORD val) { _bitfield1 = cast(DWORD)((_bitfield1 & 0xFFFFFFFF7FFFFFFF) | (val << 31)); return val; }
private DWORD _bitfield2;
DWORD fInvalidLogAttr() { return (_bitfield2 >> 0) & 0x1; }
DWORD fInvalidLogAttr(DWORD val) { _bitfield2 = cast(DWORD)((_bitfield2 & 0xFFFFFFFFFFFFFFFE) | (val << 0)); return val; }
DWORD fCDM() { return (_bitfield2 >> 1) & 0x1; }
DWORD fCDM(DWORD val) { _bitfield2 = cast(DWORD)((_bitfield2 & 0xFFFFFFFFFFFFFFFD) | (val << 1)); return val; }
DWORD fAmbiguousCharSet() { return (_bitfield2 >> 2) & 0x1; }
DWORD fAmbiguousCharSet(DWORD val) { _bitfield2 = cast(DWORD)((_bitfield2 & 0xFFFFFFFFFFFFFFFB) | (val << 2)); return val; }
DWORD fClusterSizeVaries() { return (_bitfield2 >> 3) & 0x1; }
DWORD fClusterSizeVaries(DWORD val) { _bitfield2 = cast(DWORD)((_bitfield2 & 0xFFFFFFFFFFFFFFF7) | (val << 3)); return val; }
DWORD fRejectInvalid() { return (_bitfield2 >> 4) & 0x1; }
DWORD fRejectInvalid(DWORD val) { _bitfield2 = cast(DWORD)((_bitfield2 & 0xFFFFFFFFFFFFFFEF) | (val << 4)); return val; }
}
struct SCRIPT_FONTPROPERTIES
{
int cBytes = SCRIPT_FONTPROPERTIES.sizeof;
WORD wgBlank;
WORD wgDefault;
WORD wgInvalid;
WORD wgKashida;
int iKashidaWidth;
}
struct SCRIPT_TABDEF
{
int cTabStops;
int iScale;
int* pTabStops;
int iTabOrigin;
}
struct SCRIPT_DIGITSUBSTITUTE
{
private DWORD _bitfield1;
DWORD NationalDigitLanguage() { return (_bitfield1 >> 0) & 0xFFFF; }
DWORD NationalDigitLanguage(DWORD val) { _bitfield1 = cast(DWORD)((_bitfield1 & 0xFFFFFFFFFFFF0000) | (val << 0)); return val; }
DWORD TraditionalDigitLanguage() { return (_bitfield1 >> 16) & 0xFFFF; }
DWORD TraditionalDigitLanguage(DWORD val) { _bitfield1 = cast(DWORD)((_bitfield1 & 0xFFFFFFFF0000FFFF) | (val << 16)); return val; }
private DWORD _bitfield2;
DWORD DigitSubstitute() { return (_bitfield2 >> 0) & 0xFF; }
DWORD DigitSubstitute(DWORD val) { _bitfield2 = cast(DWORD)((_bitfield2 & 0xFFFFFFFFFFFFFF00) | (val << 0)); return val; }
DWORD dwReserved;
}
/* TODO: Windows Vista fearured structs
OPENTYPE_FEATURE_RECORD
OPENTYPE_TAG
SCRIPT_CHARPROP
SCRIPT_GLYPHPROP
TEXTRANGE_PROPERTIES
*/
}
/* Uniscribe Functions
* http://msdn2.microsoft.com/library/ms776469 */
extern (Windows)
{
HRESULT ScriptFreeCache(SCRIPT_CACHE*);
HRESULT ScriptItemize(CPtr!(WCHAR), int, int, CPtr!(SCRIPT_CONTROL), CPtr!(SCRIPT_STATE), SCRIPT_ITEM*, int*);
HRESULT ScriptLayout(int, CPtr!(BYTE), int*, int*);
HRESULT ScriptShape(HDC, SCRIPT_CACHE*, CPtr!(WCHAR), int, int, SCRIPT_ANALYSIS*, WORD*, WORD*, SCRIPT_VISATTR*, int*);
HRESULT ScriptPlace(HDC, SCRIPT_CACHE*, CPtr!(WORD), int, CPtr!(SCRIPT_VISATTR), SCRIPT_ANALYSIS*, int*, GOFFSET*, ABC*);
HRESULT ScriptTextOut(HDC, SCRIPT_CACHE*, int, int, UINT, CPtr!(RECT), CPtr!(SCRIPT_ANALYSIS), CPtr!(WCHAR), int, CPtr!(WORD), int, CPtr!(int), int*, CPtr!(GOFFSET));
HRESULT ScriptJustify(CPtr!(SCRIPT_VISATTR), CPtr!(int), int, int, int, int*);
HRESULT ScriptBreak(CPtr!(WCHAR), int, CPtr!(SCRIPT_ANALYSIS), CPtr!(SCRIPT_LOGATTR));
HRESULT ScriptCPtoX(int, BOOL, int, int, CPtr!(WORD), CPtr!(SCRIPT_VISATTR), CPtr!(int), CPtr!(SCRIPT_ANALYSIS), int*);
HRESULT ScriptXtoCP(int, int, int, CPtr!(WORD), CPtr!(SCRIPT_VISATTR), CPtr!(int), CPtr!(SCRIPT_ANALYSIS), int*, int*);
HRESULT ScriptGetLogicalWidths(CPtr!(SCRIPT_ANALYSIS), int, int, CPtr!(int), CPtr!(WORD), CPtr!(SCRIPT_VISATTR), int*);
HRESULT ScriptApplyLogicalWidth(CPtr!(int), int, int, CPtr!(WORD), CPtr!(SCRIPT_VISATTR), CPtr!(int), CPtr!(SCRIPT_ANALYSIS), ABC*, int*);
HRESULT ScriptGetCMap(HDC, SCRIPT_CACHE*, CPtr!(WCHAR), int, DWORD, WORD*);
HRESULT ScriptGetGlyphABCWidth(HDC, SCRIPT_CACHE*, WORD, ABC*);
HRESULT ScriptGetProperties(CPtr!(SCRIPT_PROPERTIES**), int*);
HRESULT ScriptGetFontProperties(HDC, SCRIPT_CACHE*, SCRIPT_FONTPROPERTIES*);
HRESULT ScriptCacheGetHeight(HDC, SCRIPT_CACHE*, int*);
HRESULT ScriptIsComplex(CPtr!(WCHAR), int, DWORD);
HRESULT ScriptRecordDigitSubstitution(LCID, SCRIPT_DIGITSUBSTITUTE*);
HRESULT ScriptApplyDigitSubstitution(CPtr!(SCRIPT_DIGITSUBSTITUTE), SCRIPT_CONTROL*, SCRIPT_STATE*);
/* ScriptString Functions
* http://msdn2.microsoft.com/library/ms776485 */
HRESULT ScriptStringAnalyse(HDC, CPtr!(void), int, int, int, DWORD, int, SCRIPT_CONTROL*, SCRIPT_STATE*, CPtr!(int), SCRIPT_TABDEF*, CPtr!(BYTE), SCRIPT_STRING_ANALYSIS*);
HRESULT ScriptStringFree(SCRIPT_STRING_ANALYSIS*);
CPtr!(SIZE) ScriptString_pSize(SCRIPT_STRING_ANALYSIS);
CPtr!(int) ScriptString_pcOutChars(SCRIPT_STRING_ANALYSIS);
CPtr!(SCRIPT_LOGATTR) ScriptString_pLogAttr(SCRIPT_STRING_ANALYSIS);
HRESULT ScriptStringGetOrder(SCRIPT_STRING_ANALYSIS, UINT*);
HRESULT ScriptStringCPtoX(SCRIPT_STRING_ANALYSIS, int, BOOL, int*);
HRESULT ScriptStringXtoCP(SCRIPT_STRING_ANALYSIS, int, int*, int*);
HRESULT ScriptStringGetLogicalWidths(SCRIPT_STRING_ANALYSIS, int*);
HRESULT ScriptStringValidate(SCRIPT_STRING_ANALYSIS);
HRESULT ScriptStringOut(SCRIPT_STRING_ANALYSIS, int, int, UINT, CPtr!(RECT), int, int, BOOL);
/* TODO: Windows Vista fearured functions
ScriptGetFontAlternateGlyphs()
ScriptGetFontFeatureTags()
ScriptGetFontLanguageTags()
ScriptGetFontScriptTags()
ScriptItemizeOpenType()
ScriptPlaceOpenType()
ScriptPositionSingleGlyph()
ScriptShapeOpenType()
ScriptSubstituteSingleGlyph()
*/
}