Mercurial > projects > dynamin
view dynamin/c/uniscribe.d @ 89:0d6778fea624
Add some Windows error constants and related functions.
author | Jordan Miner <jminer7@gmail.com> |
---|---|
date | Mon, 26 Jul 2010 00:33:22 -0500 |
parents | f149c868a34f |
children | acdbb30fee7e |
line wrap: on
line source
module dynamin.c.uniscribe; /* * A complete binding to Uniscribe. */ import dynamin.c.windows; version(build) { pragma(link, usp10); } // TODO: move to a general place? // http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D.learn&article_id=1507 template BitField(uint start, uint count, alias data, type = uint) { static assert((1L << (start + count)) - 1 <= data.max); const typeof(data) mask = (1UL << count) - 1; type get() { return cast(type) ((data >> start) & mask); } type set(type value) { data = (data & ~(mask << start)) | ((cast(typeof(data)) value & mask) << start); return value; } } extern(Windows): const int USPBUILD = 0400; enum { SCRIPT_UNDEFINED = 0 } const HRESULT USP_E_SCRIPT_NOT_IN_FONT = MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x200); alias void* SCRIPT_CACHE; HRESULT ScriptFreeCache(SCRIPT_CACHE* psc); struct SCRIPT_CONTROL { // 32 bits DWORD fields; mixin BitField!( 0, 16, fields) uDefaultLanguage; mixin BitField!(16, 1, fields) fContextDigits; mixin BitField!(17, 1, fields) fInvertPreBoundDir; mixin BitField!(18, 1, fields) fInvertPostBoundDir; mixin BitField!(19, 1, fields) fLinkStringBefore; mixin BitField!(20, 1, fields) fLinkStringAfter; mixin BitField!(21, 1, fields) fNeutralOverride; mixin BitField!(22, 1, fields) fNumericOverride; mixin BitField!(23, 1, fields) fLegacyBidiClass; mixin BitField!(24, 8, fields) fReserved; /* DWORD uDefaultLanguage :16; DWORD fContextDigits :1; DWORD fInvertPreBoundDir :1; DWORD fInvertPostBoundDir :1; DWORD fLinkStringBefore :1; DWORD fLinkStringAfter :1; DWORD fNeutralOverride :1; DWORD fNumericOverride :1; DWORD fLegacyBidiClass :1; DWORD fReserved :8; */ } struct SCRIPT_STATE { // 16 bits WORD fields; mixin BitField!( 0, 5, fields, WORD) uBidiLevel; mixin BitField!( 5, 1, fields, WORD) fOverrideDirection; mixin BitField!( 6, 1, fields, WORD) fInhibitSymSwap; mixin BitField!( 7, 1, fields, WORD) fCharShape; mixin BitField!( 8, 1, fields, WORD) fDigitSubstitute; mixin BitField!( 9, 1, fields, WORD) fInhibitLigate; mixin BitField!(10, 1, fields, WORD) fDisplayZWG; mixin BitField!(11, 1, fields, WORD) fArabicNumContext; mixin BitField!(12, 1, fields, WORD) fGcpClusters; mixin BitField!(13, 1, fields, WORD) fReserved; mixin BitField!(14, 2, fields, WORD) fEngineReserved; /* WORD uBidiLevel :5; WORD fOverrideDirection :1; WORD fInhibitSymSwap :1; WORD fCharShape :1; WORD fDigitSubstitute :1; WORD fInhibitLigate :1; WORD fDisplayZWG :1; WORD fArabicNumContext :1; WORD fGcpClusters :1; WORD fReserved :1; WORD fEngineReserved :2; */ } struct SCRIPT_ANALYSIS { // 16 bits + WORD fields; mixin BitField!( 0, 10, fields, WORD) eScript; mixin BitField!(10, 1, fields, WORD) fRTL; mixin BitField!(11, 1, fields, WORD) fLayoutRTL; mixin BitField!(12, 1, fields, WORD) fLinkBefore; mixin BitField!(13, 1, fields, WORD) fLinkAfter; mixin BitField!(14, 1, fields, WORD) fLogicalOrder; mixin BitField!(15, 1, fields, WORD) fNoGlyphIndex; /* WORD eScript :10; WORD fRTL :1; WORD fLayoutRTL :1; WORD fLinkBefore :1; WORD fLinkAfter :1; WORD fLogicalOrder :1; WORD fNoGlyphIndex :1; */ SCRIPT_STATE s; } struct SCRIPT_ITEM { int iCharPos; SCRIPT_ANALYSIS a; } HRESULT ScriptItemize( /*const*/ WCHAR* pwcInChars, int cInChars, int cMaxItems, /*const*/ SCRIPT_CONTROL* psControl, /*const*/ SCRIPT_STATE* psState, SCRIPT_ITEM* pItems, int* pcItems); HRESULT ScriptLayout( int cRuns, /*const*/ BYTE* pbLevel, int* piVisualToLogical, int* piLogicalToVisual); enum SCRIPT_JUSTIFY { SCRIPT_JUSTIFY_NONE = 0, SCRIPT_JUSTIFY_ARABIC_BLANK = 1, SCRIPT_JUSTIFY_CHARACTER = 2, SCRIPT_JUSTIFY_RESERVED1 = 3, SCRIPT_JUSTIFY_BLANK = 4, SCRIPT_JUSTIFY_RESERVED2 = 5, SCRIPT_JUSTIFY_RESERVED3 = 6, SCRIPT_JUSTIFY_ARABIC_NORMAL = 7, SCRIPT_JUSTIFY_ARABIC_KASHIDA = 8, SCRIPT_JUSTIFY_ARABIC_ALEF = 9, SCRIPT_JUSTIFY_ARABIC_HA = 10, SCRIPT_JUSTIFY_ARABIC_RA = 11, SCRIPT_JUSTIFY_ARABIC_BA = 12, SCRIPT_JUSTIFY_ARABIC_BARA = 13, SCRIPT_JUSTIFY_ARABIC_SEEN = 14, SCRIPT_JUSTIFY_RESERVED4 = 15, } struct SCRIPT_VISATTR { // 16 bits WORD fields; mixin BitField!(0, 4, fields, WORD) uJustification; mixin BitField!(4, 1, fields, WORD) fClusterStart; mixin BitField!(5, 1, fields, WORD) fDiacritic; mixin BitField!(6, 1, fields, WORD) fZeroWidth; mixin BitField!(7, 1, fields, WORD) fReserved; mixin BitField!(8, 8, fields, WORD) fShapeReserved; /* WORD uJustification :4; WORD fClusterStart :1; WORD fDiacritic :1; WORD fZeroWidth :1; WORD fReserved :1; WORD fShapeReserved :8; */ } HRESULT ScriptShape( HDC hdc, SCRIPT_CACHE* psc, /*const*/ WCHAR* pwcChars, int cChars, int cMaxGlyphs, SCRIPT_ANALYSIS* psa, WORD* pwOutGlyphs, WORD* pwLogClust, SCRIPT_VISATTR* psva, int* pcGlyphs); struct GOFFSET { LONG du; LONG dv; } HRESULT ScriptPlace( HDC hdc, SCRIPT_CACHE* psc, /*const*/ WORD* pwGlyphs, int cGlyphs, /*const*/ SCRIPT_VISATTR* psva, SCRIPT_ANALYSIS* psa, int* piAdvance, GOFFSET* pGoffset, ABC* pABC); HRESULT ScriptTextOut( /*const*/ HDC hdc, SCRIPT_CACHE* psc, int x, int y, UINT fuOptions, /*const*/ RECT* lprc, /*const*/ SCRIPT_ANALYSIS* psa, /*const*/ WCHAR* pwcReserved, int iReserved, /*const*/ WORD* pwGlyphs, int cGlyphs, /*const*/ int* piAdvance, /*const*/ int* piJustify, /*const*/ GOFFSET* pGoffset); HRESULT ScriptJustify( /*const*/ SCRIPT_VISATTR* psva, /*const*/ int* piAdvance, int cGlyphs, int iDx, int iMinKashida, int* piJustify); struct SCRIPT_LOGATTR { // 8 bits BYTE fields; mixin BitField!(0, 1, fields, BYTE) fSoftBreak; mixin BitField!(1, 1, fields, BYTE) fWhiteSpace; mixin BitField!(2, 1, fields, BYTE) fCharStop; mixin BitField!(3, 1, fields, BYTE) fWordStop; mixin BitField!(4, 1, fields, BYTE) fInvalid; mixin BitField!(5, 3, fields, BYTE) fReserved; /* BYTE fSoftBreak :1; BYTE fWhiteSpace :1; BYTE fCharStop :1; BYTE fWordStop :1; BYTE fInvalid :1; BYTE fReserved :3; */ } HRESULT ScriptBreak( /*const*/ WCHAR* pwcChars, int cChars, /*const*/ SCRIPT_ANALYSIS* psa, SCRIPT_LOGATTR* psla); HRESULT ScriptCPtoX( int iCP, BOOL fTrailing, int cChars, int cGlyphs, /*const*/ WORD* pwLogClust, /*const*/ SCRIPT_VISATTR* psva, /*const*/ int* piAdvance, /*const*/ SCRIPT_ANALYSIS* psa, int* piX); HRESULT ScriptXtoCP( int iX, int cChars, int cGlyphs, /*const*/ WORD* pwLogClust, /*const*/ SCRIPT_VISATTR* psva, /*const*/ int* piAdvance, /*const*/ SCRIPT_ANALYSIS* psa, int* piCP, int* piTrailing); HRESULT ScriptGetLogicalWidths( /*const*/ SCRIPT_ANALYSIS* psa, int cChars, int cGlyphs, /*const*/ int* piGlyphWidth, /*const*/ WORD* pwLogClust, /*const*/ SCRIPT_VISATTR* psva, int* piDx); HRESULT ScriptApplyLogicalWidth( /*const*/ int* piDx, int cChars, int cGlyphs, /*const*/ WORD* pwLogClust, /*const*/ SCRIPT_VISATTR* psva, /*const*/ int* piAdvance, /*const*/ SCRIPT_ANALYSIS* psa, ABC* pABC, int* piJustify); enum { SGCM_RTL = 0x00000001 } HRESULT ScriptGetCMap( HDC hdc, SCRIPT_CACHE* psc, /*const*/ WCHAR* pwcInChars, int cChars, DWORD dwFlags, WORD* pwOutGlyphs); HRESULT ScriptGetGlyphABCWidth( HDC hdc, SCRIPT_CACHE* psc, WORD wGlyph, ABC* pABC); struct SCRIPT_PROPERTIES { // 37 bits DWORD fields1; DWORD fields2; mixin BitField!( 0, 16, fields1) langid; mixin BitField!(16, 1, fields1) fNumeric; mixin BitField!(17, 1, fields1) fComplex; mixin BitField!(18, 1, fields1) fNeedsWordBreaking; mixin BitField!(19, 1, fields1) fNeedsCaretInfo; mixin BitField!(20, 8, fields1) bCharSet; mixin BitField!(28, 1, fields1) fControl; mixin BitField!(29, 1, fields1) fPrivateUseArea; mixin BitField!(30, 1, fields1) fNeedsCharacterJustify; mixin BitField!(31, 1, fields1) fInvalidGlyph; mixin BitField!( 0, 1, fields2) fInvalidLogAttr; mixin BitField!( 1, 1, fields2) fCDM; mixin BitField!( 2, 1, fields2) fAmbiguousCharSet; mixin BitField!( 3, 1, fields2) fClusterSizeVaries; mixin BitField!( 4, 1, fields2) fRejectInvalid; /* DWORD langid :16; DWORD fNumeric :1; DWORD fComplex :1; DWORD fNeedsWordBreaking :1; DWORD fNeedsCaretInfo :1; DWORD bCharSet :8; DWORD fControl :1; DWORD fPrivateUseArea :1; DWORD fNeedsCharacterJustify :1; DWORD fInvalidGlyph :1; DWORD fInvalidLogAttr :1; DWORD fCDM :1; DWORD fAmbiguousCharSet :1; DWORD fClusterSizeVaries :1; DWORD fRejectInvalid :1; */ } HRESULT ScriptGetProperties( /*const*/ SCRIPT_PROPERTIES*** ppSp, int* piNumScripts); struct SCRIPT_FONTPROPERTIES { int cBytes; WORD wgBlank; WORD wgDefault; WORD wgInvalid; WORD wgKashida; int iKashidaWidth; } HRESULT ScriptGetFontProperties( HDC hdc, SCRIPT_CACHE* psc, SCRIPT_FONTPROPERTIES* sfp); HRESULT ScriptCacheGetHeight( HDC hdc, SCRIPT_CACHE* psc, int* tmHeight); enum { 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, } struct SCRIPT_TABDEF { int cTabStops; int iScale; int* pTabStops; int iTabOrigin; } alias void* SCRIPT_STRING_ANALYSIS; HRESULT ScriptStringAnalyse( HDC hdc, /*const*/ void* pString, int cString, int cGlyphs, int iCharset, DWORD dwFlags, int iReqWidth, SCRIPT_CONTROL* psControl, SCRIPT_STATE* psState, /*const*/ int* piDx, SCRIPT_TABDEF* pTabdef, /*const*/ BYTE* pbInClass, SCRIPT_STRING_ANALYSIS* pssa); HRESULT ScriptStringFree(SCRIPT_STRING_ANALYSIS* pssa); /*const*/ SIZE* ScriptString_pSize(SCRIPT_STRING_ANALYSIS ssa); /*const*/ int* ScriptString_pcOutChars(SCRIPT_STRING_ANALYSIS ssa); /*const*/ SCRIPT_LOGATTR* ScriptString_pLogAttr(SCRIPT_STRING_ANALYSIS ssa); HRESULT ScriptStringGetOrder(SCRIPT_STRING_ANALYSIS ssa, UINT* puOrder); HRESULT ScriptStringCPtoX( SCRIPT_STRING_ANALYSIS ssa, int icp, BOOL fTrailing, int* pX); HRESULT ScriptStringXtoCP( SCRIPT_STRING_ANALYSIS ssa, int iX, int* piCh, int* piTrailing); HRESULT ScriptStringGetLogicalWidths(SCRIPT_STRING_ANALYSIS ssa, int* piDx); HRESULT ScriptStringValidate(SCRIPT_STRING_ANALYSIS ssa); HRESULT ScriptStringOut( SCRIPT_STRING_ANALYSIS ssa, int iX, int iY, UINT uOptions, /*const*/ RECT* prc, int iMinSel, int iMaxSel, BOOL fDisabled); enum { SIC_COMPLEX = 1, SIC_ASCIIDIGIT = 2, SIC_NEUTRAL = 4, } HRESULT ScriptIsComplex( /*const*/ WCHAR* pwcInChars, int cInChars, DWORD dwFlags); struct SCRIPT_DIGITSUBSTITUTE { DWORD fields1; DWORD fields2; mixin BitField!( 0, 16, fields1) NationalDigitLanguage; mixin BitField!(16, 16, fields1) TraditionalDigitLanguage; mixin BitField!( 0, 8, fields2) DigitSubstitute; /* DWORD NationalDigitLanguage :16; DWORD TraditionalDigitLanguage :16; DWORD DigitSubstitute :8; */ DWORD dwReserved; } HRESULT ScriptRecordDigitSubstitution( LCID Locale, SCRIPT_DIGITSUBSTITUTE* psds); enum { SCRIPT_DIGITSUBSTITUTE_CONTEXT = 0, SCRIPT_DIGITSUBSTITUTE_NONE = 1, SCRIPT_DIGITSUBSTITUTE_NATIONAL = 2, SCRIPT_DIGITSUBSTITUTE_TRADITIONAL = 3, } HRESULT ScriptApplyDigitSubstitution( /*const*/ SCRIPT_DIGITSUBSTITUTE* psds, SCRIPT_CONTROL* psc, SCRIPT_STATE* pss);