// Licensed under the Apache License, Version 2.0 // or the MIT license // , at your option. // All files in the project carrying such notice may not be copied, modified, or distributed // except according to those terms. //! Unicode Complex Script processor API declarations use ctypes::{c_int, c_long, c_void}; use shared::minwindef::{BOOL, BYTE, DWORD, UINT, ULONG, WORD}; use shared::ntdef::LCID; use shared::windef::{HDC, RECT, SIZE}; use shared::winerror::{FACILITY_ITF, SEVERITY_ERROR}; use um::wingdi::ABC; use um::winnt::{HRESULT, LONG, WCHAR}; pub const SCRIPT_UNDEFINED: WORD = 0; pub const USP_E_SCRIPT_NOT_IN_FONT: HRESULT = MAKE_HRESULT!(SEVERITY_ERROR, FACILITY_ITF, 0x200); DECLARE_HANDLE!{SCRIPT_CACHE, SCRIPT_CACHE__} extern "system" { pub fn ScriptFreeCache( psc: *mut SCRIPT_CACHE, ) -> HRESULT; } STRUCT!{struct SCRIPT_CONTROL { bit_fields: DWORD, }} BITFIELD!{SCRIPT_CONTROL bit_fields: DWORD [ uDefaultLanguage set_uDefaultLanguage[0..16], fContextDigits set_fContextDigits[16..17], fInvertPreBoundDir set_fInvertPreBoundDir[17..18], fInvertPostBoundDir set_fInvertPostBoundDir[18..19], fLinkStringBefore set_fLinkStringBefore[19..20], fLinkStringAfter set_fLinkStringAfter[20..21], fNeutralOverride set_fNeutralOverride[21..22], fNumericOverride set_fNumericOverride[22..23], fLegacyBidiClass set_fLegacyBidiClass[23..24], fMergeNeutralItems set_fMergeNeutralItems[24..25], fReserved set_fReserved[25..32], ]} STRUCT!{struct SCRIPT_STATE { bit_fields: WORD, }} BITFIELD!{SCRIPT_STATE bit_fields: WORD [ uBidiLevel set_uBidiLevel[0..5], fOverrideDirection set_fOverrideDirection[5..6], fInhibitSymSwap set_fInhibitSymSwap[6..7], fCharShape set_fCharShape[7..8], fDigitSubstitute set_fDigitSubstitute[8..9], fInhibitLigate set_fInhibitLigate[9..10], fDisplayZWG set_fDisplayZWG[10..11], fArabicNumContext set_fArabicNumContext[11..12], fGcpClusters set_fGcpClusters[12..13], fReserved set_fReserved[13..14], fEngineReserved set_fEngineReserved[14..16], ]} STRUCT!{struct SCRIPT_ANALYSIS { bit_fields: WORD, s: SCRIPT_STATE, }} BITFIELD!{SCRIPT_ANALYSIS bit_fields: WORD [ eScript set_eScript[0..10], fRTL set_fRTL[10..11], fLayoutRTL set_fLayoutRTL[11..12], fLinkBefore set_fLinkBefore[12..13], fLinkAfter set_fLinkAfter[13..14], fLogicalOrder set_fLogicalOrder[14..15], fNoGlyphIndex set_fNoGlyphIndex[15..16], ]} STRUCT!{struct SCRIPT_ITEM { iCharPos: c_int, a: SCRIPT_ANALYSIS, }} extern "system" { pub fn ScriptItemize( pwcInChars: *const WCHAR, cInChars: c_int, cMaxItems: c_int, psControl: *const SCRIPT_CONTROL, psState: *const SCRIPT_STATE, pItems: *mut SCRIPT_ITEM, pcItems: *mut c_int, ) -> HRESULT; pub fn ScriptLayout( cRuns: c_int, pbLevel: *const BYTE, piVisualToLogical: *mut c_int, piLogicalToVisual: *mut c_int, ) -> HRESULT; } pub const SCRIPT_JUSTIFY_NONE: WORD = 0; pub const SCRIPT_JUSTIFY_ARABIC_BLANK: WORD = 1; pub const SCRIPT_JUSTIFY_CHARACTER: WORD = 2; pub const SCRIPT_JUSTIFY_RESERVED1: WORD = 3; pub const SCRIPT_JUSTIFY_BLANK: WORD = 4; pub const SCRIPT_JUSTIFY_RESERVED2: WORD = 5; pub const SCRIPT_JUSTIFY_RESERVED3: WORD = 6; pub const SCRIPT_JUSTIFY_ARABIC_NORMAL: WORD = 7; pub const SCRIPT_JUSTIFY_ARABIC_KASHIDA: WORD = 8; pub const SCRIPT_JUSTIFY_ARABIC_ALEF: WORD = 9; pub const SCRIPT_JUSTIFY_ARABIC_HA: WORD = 10; pub const SCRIPT_JUSTIFY_ARABIC_RA: WORD = 11; pub const SCRIPT_JUSTIFY_ARABIC_BA: WORD = 12; pub const SCRIPT_JUSTIFY_ARABIC_BARA: WORD = 13; pub const SCRIPT_JUSTIFY_ARABIC_SEEN: WORD = 14; pub const SCRIPT_JUSTIFY_ARABIC_SEEN_M: WORD = 15; STRUCT!{struct SCRIPT_VISATTR { bit_fields: WORD, }} BITFIELD!{SCRIPT_VISATTR bit_fields: WORD [ uJustification set_uJustification[0..4], fClusterStart set_fClusterStart[4..5], fDiacritic set_fDiacritic[5..6], fZeroWidth set_fZeroWidth[6..7], fReserved set_fReserved[7..8], fShapeReserved set_fShapeReserved[8..16], ]} extern "system" { pub fn ScriptShape( hdc: HDC, psc: *mut SCRIPT_CACHE, pwcChars: *const WCHAR, cChars: c_int, cMaxGlyphs: c_int, psa: *mut SCRIPT_ANALYSIS, pwOutGlyphs: *mut WORD, pwLogClust: *mut WORD, psva: *mut SCRIPT_VISATTR, pcGlyphs: *mut c_int, ) -> HRESULT; } STRUCT!{struct GOFFSET { du: LONG, dv: LONG, }} extern "system" { pub fn ScriptPlace( hdc: HDC, psc: *mut SCRIPT_CACHE, pwGlyphs: *const WORD, cGlyphs: c_int, psva: *const SCRIPT_VISATTR, psa: *mut SCRIPT_ANALYSIS, piAdvance: *mut c_int, pGoffset: *mut GOFFSET, pABC: *mut ABC, ) -> HRESULT; pub fn ScriptTextOut( hdc: HDC, psc: *mut SCRIPT_CACHE, x: c_int, y: c_int, fuOptions: UINT, lprc: *const RECT, psa: *const SCRIPT_ANALYSIS, pwcReserved: *const WCHAR, iReserved: c_int, pwGlyphs: *const WORD, cGlyphs: c_int, piAdvance: *const c_int, piJustify: *const c_int, pGoffset: *const GOFFSET, ) -> HRESULT; pub fn ScriptJustify( psva: *const SCRIPT_VISATTR, piAdvance: *const c_int, cGlyphs: c_int, iDx: c_int, iMinKashida: c_int, piJustify: *mut c_int, ) -> HRESULT; } STRUCT!{struct SCRIPT_LOGATTR { bit_fields: BYTE, }} BITFIELD!{SCRIPT_LOGATTR bit_fields: BYTE [ fSoftBreak set_fSoftBreak[0..1], fWhiteSpace set_fWhiteSpace[1..2], fCharStop set_fCharStop[2..3], fWordStop set_fWordStop[3..4], fInvalid set_fInvalid[4..5], fReserved set_fReserved[5..8], ]} extern "system" { pub fn ScriptBreak( pwcChars: *const WCHAR, cChars: c_int, psa: *const SCRIPT_ANALYSIS, psla: *mut SCRIPT_LOGATTR, ) -> HRESULT; pub fn ScriptCPtoX( iCP: c_int, fTrailing: BOOL, cChars: c_int, cGlyphs: c_int, pwLogClust: *const WORD, psva: *const SCRIPT_VISATTR, piAdvance: *const c_int, psa: *const SCRIPT_ANALYSIS, piX: *mut c_int, ) -> HRESULT; pub fn ScriptXtoCP( iX: c_int, cChars: c_int, cGlyphs: c_int, pwLogClust: *const WORD, psva: *const SCRIPT_VISATTR, piAdvance: *const c_int, psa: *const SCRIPT_ANALYSIS, piCP: *mut c_int, piTrailing: *mut c_int, ) -> HRESULT; pub fn ScriptGetLogicalWidths( psa: *const SCRIPT_ANALYSIS, cChars: c_int, cGlyphs: c_int, piGlyphWidth: *const c_int, pwLogClust: *const WORD, psva: *const SCRIPT_VISATTR, piDx: *mut c_int, ) -> HRESULT; pub fn ScriptApplyLogicalWidth( piDx: *const c_int, cChars: c_int, cGlyphs: c_int, pwLogClust: *const WORD, psva: *const SCRIPT_VISATTR, piAdvance: *const c_int, psa: *const SCRIPT_ANALYSIS, pABC: *mut ABC, piJustify: *mut c_int, ) -> HRESULT; } pub const SGCM_RTL: DWORD = 0x00000001; extern "system" { pub fn ScriptGetCMap( hdc: HDC, psc: *mut SCRIPT_CACHE, pwcInChars: *const WCHAR, cChars: c_int, dwFlags: DWORD, pwOutGlyphs: *mut WORD, ) -> HRESULT; pub fn ScriptGetGlyphABCWidth( hdc: HDC, psc: *mut SCRIPT_CACHE, wGlyph: WORD, pABC: *mut ABC, ) -> HRESULT; } STRUCT!{struct SCRIPT_PROPERTIES { bit_fields1: DWORD, bit_fields2: DWORD, }} BITFIELD!{SCRIPT_PROPERTIES bit_fields1: DWORD [ langid set_langid[0..16], fNumeric set_fNumeric[16..17], fComplex set_fComplex[17..18], fNeedsWordBreaking set_fNeedsWordBreaking[18..19], fNeedsCaretInfo set_fNeedsCaretInfo[19..20], bCharSet set_bCharSet[20..28], fControl set_fControl[28..29], fPrivateUseArea set_fPrivateUseArea[29..30], fNeedsCharacterJustify set_fNeedsCharacterJustify[30..31], fInvalidGlyph set_fInvalidGlyph[31..32], ]} BITFIELD!{SCRIPT_PROPERTIES bit_fields2: DWORD [ fInvalidLogAttr set_fInvalidLogAttr[0..1], fCDM set_fCDM[1..2], fAmbiguousCharSet set_fAmbiguousCharSet[2..3], fClusterSizeVaries set_fClusterSizeVaries[3..4], fRejectInvalid set_fRejectInvalid[4..5], ]} extern "system" { pub fn ScriptGetProperties( ppSp: *mut *mut *const SCRIPT_PROPERTIES, piNumScripts: *mut c_int, ) -> HRESULT; } STRUCT!{struct SCRIPT_FONTPROPERTIES { cBytes: c_int, wgBlank: WORD, wgDefault: WORD, wgInvalid: WORD, wgKashida: WORD, iKashidaWidth: c_int, }} extern "system" { pub fn ScriptGetFontProperties( hdc: HDC, psc: *mut SCRIPT_CACHE, sfp: *mut SCRIPT_FONTPROPERTIES, ) -> HRESULT; pub fn ScriptCacheGetHeight( hdc: HDC, psc: *mut SCRIPT_CACHE, tmHeight: *mut c_long, ) -> HRESULT; } pub const SSA_PASSWORD: DWORD = 0x00000001; pub const SSA_TAB: DWORD = 0x00000002; pub const SSA_CLIP: DWORD = 0x00000004; pub const SSA_FIT: DWORD = 0x00000008; pub const SSA_DZWG: DWORD = 0x00000010; pub const SSA_FALLBACK: DWORD = 0x00000020; pub const SSA_BREAK: DWORD = 0x00000040; pub const SSA_GLYPHS: DWORD = 0x00000080; pub const SSA_RTL: DWORD = 0x00000100; pub const SSA_GCP: DWORD = 0x00000200; pub const SSA_HOTKEY: DWORD = 0x00000400; pub const SSA_METAFILE: DWORD = 0x00000800; pub const SSA_LINK: DWORD = 0x00001000; pub const SSA_HIDEHOTKEY: DWORD = 0x00002000; pub const SSA_HOTKEYONLY: DWORD = 0x00002400; pub const SSA_FULLMEASURE: DWORD = 0x04000000; pub const SSA_LPKANSIFALLBACK: DWORD = 0x08000000; pub const SSA_PIDX: DWORD = 0x10000000; pub const SSA_LAYOUTRTL: DWORD = 0x20000000; pub const SSA_DONTGLYPH: DWORD = 0x40000000; pub const SSA_NOKASHIDA: DWORD = 0x80000000; STRUCT!{struct SCRIPT_TABDEF { cTabStops: c_int, iScale: c_int, pTabStops: *mut c_int, iTabOrigin: c_int, }} DECLARE_HANDLE!{SCRIPT_STRING_ANALYSIS, SCRIPT_STRING_ANALYSIS__} extern "system" { pub fn ScriptStringAnalyse( hdc: HDC, pString: *const c_void, cString: c_int, cGlyphs: c_int, iCharset: c_int, dwFlags: DWORD, iReqWidth: c_int, psControl: *mut SCRIPT_CONTROL, psState: *mut SCRIPT_STATE, piDx: *const c_int, pTabdef: *mut SCRIPT_TABDEF, pbInClass: *const BYTE, pssa: *mut SCRIPT_STRING_ANALYSIS, ) -> HRESULT; pub fn ScriptStringFree( pssa: *mut SCRIPT_STRING_ANALYSIS, ) -> HRESULT; pub fn ScriptString_pSize( ssa: SCRIPT_STRING_ANALYSIS, ) -> *const SIZE; pub fn ScriptString_pcOutChars( ssa: SCRIPT_STRING_ANALYSIS, ) -> *const c_int; pub fn ScriptString_pLogAttr( ssa: SCRIPT_STRING_ANALYSIS, ) -> *const SCRIPT_LOGATTR; pub fn ScriptStringGetOrder( ssa: SCRIPT_STRING_ANALYSIS, puOrder: *mut UINT, ) -> HRESULT; pub fn ScriptStringCPtoX( ssa: SCRIPT_STRING_ANALYSIS, icp: c_int, fTrailing: BOOL, pX: *mut c_int, ) -> HRESULT; pub fn ScriptStringXtoCP( ssa: SCRIPT_STRING_ANALYSIS, iX: c_int, piCh: *mut c_int, piTrailing: *mut c_int, ) -> HRESULT; pub fn ScriptStringGetLogicalWidths( ssa: SCRIPT_STRING_ANALYSIS, dpiDx: *mut c_int, ) -> HRESULT; pub fn ScriptStringValidate( ssa: SCRIPT_STRING_ANALYSIS, ) -> HRESULT; pub fn ScriptStringOut( ssa: SCRIPT_STRING_ANALYSIS, iX: c_int, iY: c_int, uOptions: UINT, prc: *const RECT, iMinSel: c_int, iMaxSel: c_int, fDisabled: BOOL, ) -> HRESULT; } pub const SIC_COMPLEX: DWORD = 1; pub const SIC_ASCIIDIGIT: DWORD = 2; pub const SIC_NEUTRAL: DWORD = 4; extern "system" { pub fn ScriptIsComplex( pwcInChars: *const WCHAR, cInChars: c_int, dwFlags: DWORD, ) -> HRESULT; } STRUCT!{struct SCRIPT_DIGITSUBSTITUTE { bit_fields1: DWORD, bit_fields2: DWORD, dwReserved: DWORD, }} BITFIELD!{SCRIPT_DIGITSUBSTITUTE bit_fields1: DWORD [ NationalDigitLanguage set_NationalDigitLanguage[0..16], TraditionalDigitLanguage set_TraditionalDigitLanguage[16..32], ]} BITFIELD!{SCRIPT_DIGITSUBSTITUTE bit_fields2: DWORD [ DigitSubstitute set_DigitSubstitute[0..8], ]} extern "system" { pub fn ScriptRecordDigitSubstitution( Locale: LCID, psds: *mut SCRIPT_DIGITSUBSTITUTE, ) -> HRESULT; } pub const SCRIPT_DIGITSUBSTITUTE_CONTEXT: BYTE = 0; pub const SCRIPT_DIGITSUBSTITUTE_NONE: BYTE = 1; pub const SCRIPT_DIGITSUBSTITUTE_NATIONAL: BYTE = 2; pub const SCRIPT_DIGITSUBSTITUTE_TRADITIONAL: BYTE = 3; extern "system" { pub fn ScriptApplyDigitSubstitution( psds: *const SCRIPT_DIGITSUBSTITUTE, psc: *mut SCRIPT_CONTROL, pss: *mut SCRIPT_STATE, ) -> HRESULT; } pub type OPENTYPE_TAG = ULONG; pub const SCRIPT_TAG_UNKNOWN: OPENTYPE_TAG = 0x00000000; STRUCT!{struct OPENTYPE_FEATURE_RECORD { tagFeature: OPENTYPE_TAG, lParameter: LONG, }} STRUCT!{struct TEXTRANGE_PROPERTIES { potfRecords: *mut OPENTYPE_FEATURE_RECORD, cotfRecords: c_int, }} STRUCT!{struct SCRIPT_CHARPROP { bit_fields: WORD, }} BITFIELD!{SCRIPT_CHARPROP bit_fields: WORD [ fCanGlyphAlone set_fCanGlyphAlone[0..1], reserved set_reserved[1..16], ]} STRUCT!{struct SCRIPT_GLYPHPROP { sva: SCRIPT_VISATTR, reserved: WORD, }} extern "system" { pub fn ScriptShapeOpenType( hdc: HDC, psc: *mut SCRIPT_CACHE, psa: *mut SCRIPT_ANALYSIS, tagScript: OPENTYPE_TAG, tagLangSys: OPENTYPE_TAG, rcRangeChars: *mut c_int, rpRangeProperties: *mut *mut TEXTRANGE_PROPERTIES, cRanges: c_int, pwcChars: *const WCHAR, cChars: c_int, cMaxGlyphs: c_int, pwLogClust: *mut WORD, pCharProps: *mut SCRIPT_CHARPROP, pwOutGlyphs: *mut WORD, pOutGlyphProps: *mut SCRIPT_GLYPHPROP, pcGlyphs: *mut c_int, ) -> HRESULT; pub fn ScriptPlaceOpenType( hdc: HDC, psc: *mut SCRIPT_CACHE, psa: *mut SCRIPT_ANALYSIS, tagScript: OPENTYPE_TAG, tagLangSys: OPENTYPE_TAG, rcRangeChars: *mut c_int, rpRangeProperties: *mut *mut TEXTRANGE_PROPERTIES, cRanges: c_int, pwcChars: *const WCHAR, pwLogClust: *mut WORD, pCharProps: *mut SCRIPT_CHARPROP, cChars: c_int, pwGlyphs: *const WORD, pGlyphProps: *const SCRIPT_GLYPHPROP, cGlyphs: c_int, piAdvance: *mut c_int, pGoffset: *mut GOFFSET, pABC: *mut ABC, ) -> HRESULT; pub fn ScriptItemizeOpenType( pwcInChars: *const WCHAR, cInChars: c_int, cMaxItems: c_int, psControl: *const SCRIPT_CONTROL, psState: *const SCRIPT_STATE, pItems: *mut SCRIPT_ITEM, pScriptTags: *mut OPENTYPE_TAG, pcItems: *mut c_int, ) -> HRESULT; pub fn ScriptGetFontScriptTags( hdc: HDC, psc: *mut SCRIPT_CACHE, psa: *mut SCRIPT_ANALYSIS, cMaxTags: c_int, pScriptTags: *mut OPENTYPE_TAG, pcTags: *mut c_int, ) -> HRESULT; pub fn ScriptGetFontLanguageTags( hdc: HDC, psc: *mut SCRIPT_CACHE, psa: *mut SCRIPT_ANALYSIS, tagScript: OPENTYPE_TAG, cMaxTags: c_int, pLangsysTags: *mut OPENTYPE_TAG, pcTags: *mut c_int, ) -> HRESULT; pub fn ScriptGetFontFeatureTags( hdc: HDC, psc: *mut SCRIPT_CACHE, psa: *mut SCRIPT_ANALYSIS, tagScript: OPENTYPE_TAG, tagLangSys: OPENTYPE_TAG, cMaxTags: c_int, pFeatureTags: *mut OPENTYPE_TAG, pcTags: *mut c_int, ) -> HRESULT; pub fn ScriptGetFontAlternateGlyphs( hdc: HDC, psc: *mut SCRIPT_CACHE, psa: *mut SCRIPT_ANALYSIS, tagScript: OPENTYPE_TAG, tagLangSys: OPENTYPE_TAG, tagFeature: OPENTYPE_TAG, wGlyphId: WORD, cMaxAlternates: c_int, pAlternateGlyphs: *mut WORD, pcAlternates: *mut c_int, ) -> HRESULT; pub fn ScriptSubstituteSingleGlyph( hdc: HDC, psc: *mut SCRIPT_CACHE, psa: *mut SCRIPT_ANALYSIS, tagScript: OPENTYPE_TAG, tagLangSys: OPENTYPE_TAG, tagFeature: OPENTYPE_TAG, lParameter: LONG, wGlyphId: WORD, pwOutGlyphId: *mut WORD, ) -> HRESULT; pub fn ScriptPositionSingleGlyph( hdc: HDC, psc: *mut SCRIPT_CACHE, psa: *mut SCRIPT_ANALYSIS, tagScript: OPENTYPE_TAG, tagLangSys: OPENTYPE_TAG, tagFeature: OPENTYPE_TAG, lParameter: LONG, wGlyphId: WORD, iAdvance: c_int, GOffset: GOFFSET, piOutAdvance: *mut c_int, pOutGoffset: *mut GOFFSET, ) -> HRESULT; }