blob: b2f24be06eac34650c936b8e43b0f3df70e98dc6 [file] [log] [blame]
// 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_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;
}