// Licensed under the Apache License, Version 2.0
// <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0 > or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT >, 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_I
TF, 0 x200);
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 = 0 x00000001;
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 = 0 x00000001;
pub const SSA_TAB: DWORD = 0 x00000002;
pub const SSA_CLIP: DWORD = 0 x00000004;
pub const SSA_FIT: DWORD = 0 x00000008;
pub const SSA_DZWG: DWORD = 0 x00000010;
pub const SSA_FALLBACK: DWORD = 0 x00000020;
pub const SSA_BREAK: DWORD = 0 x00000040;
pub const SSA_GLYPHS: DWORD = 0 x00000080;
pub const SSA_RTL: DWORD = 0 x00000100;
pub const SSA_GCP: DWORD = 0 x00000200;
pub const SSA_HOTKEY: DWORD = 0 x00000400;
pub const SSA_METAFILE: DWORD = 0 x00000800;
pub const SSA_LINK: DWORD = 0 x00001000;
pub const SSA_HIDEHOTKEY: DWORD = 0 x00002000;
pub const SSA_HOTKEYONLY: DWORD = 0 x00002400;
pub const SSA_FULLMEASURE: DWORD = 0 x04000000;
pub const SSA_LPKANSIFALLBACK: DWORD = 0 x08000000;
pub const SSA_PIDX: DWORD = 0 x10000000;
pub const SSA_LAYOUTRTL: DWORD = 0 x20000000;
pub const SSA_DONTGLYPH: DWORD = 0 x40000000;
pub const SSA_NOKASHIDA: DWORD = 0 x80000000;
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 = 0 x00000000;
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;
}
Messung V0.5 in Prozent C=99 H=100 G=99
¤ Dauer der Verarbeitung: 0.12 Sekunden
(vorverarbeitet am 2026-06-22)
¤
*© Formatika GbR, Deutschland