使用Uniscribe 处理复杂文本(4)
站长推荐:NSetup一键部署软件
一键式完成美化安装包制作,自动增量升级,数据统计,数字签名。应对各种复杂场景,脚本模块化拆分,常规复杂的脚本代码,图形化设置。无需专业的研发经验,轻松完成项目部署。(www.nsetup.cn)
HRESULT WINAPI ScriptGetCMap(
HDC hdc,
SCRIPT_CACHE *psc,
const WCHAR *pwcInChars,
int cChars,
DWORD dwFlags,
WORD *pwOutGlyphs
);
函数功能:
获取字符对应的字形索引值。
参数描述:
hdc: 输入参数,设备上下文
psc: 输入参数,字体缓存,此函数针对每一个Item 使用
pwcInChars: 输入参数,字符串
cChars: 输入参数,字符个数
dwFlags: 输入参数,标志
pwOutGlyphs: 输出参数,字形索引数组
函数存在目的:
使用该函数可以用来判断当前字体是否支持所有字符。如果返回值为S_OK 则表示支持,反之不支持。
可以使用该函数来验证是否需要字体回退。
HRESULT WINAPI ScriptGetFontProperties(
HDC hdc,
SCRIPT_CACHE *psc,
SCRIPT_FONTPROPERTIES *sfp
);
函数功能:
获取字体缓存中的字体信息。
参数描述:
hdc: 输入参数,设备上下文
psc: 输入参数,字体缓存
sfp: 输出参数,字体属性信息
函数存在目的:
使用该函数可以获取当前字体下某些特殊字形的索引值,如缺省字形,无效字形等。在调用ScriptShape 函数得出字形后,可以使用该函数来判断计算出来的字形是否全部有效,在一定程度上该函数也能验证是否需要字体回退。
HRESULT WINAPI ScriptGetGlyphABCWidth(
HDC hdc,
SCRIPT_CACHE *psc,
WORD wGlyph,
ABC *pABC,
);
没用过。
HRESULT WINAPI ScriptGetLogicalWidths(
const SCRIPT_ANALYSIS *psa,
int cChars,
int cGlyphs,
const int *piGlyphWidth,
const WORD *pwLogClust,
const SCRIPT_VISATTR *psva,
int *piDx,
);
函数功能:
计算当前Item 所有字符(不是字形)的逻辑宽度。
参数描述:
psa: 输入参数,通过ScriptItemize 函数得到的每一个Item 的分析结果
cChars: 输入参数,字符个数
cGlyphs: 输入参数,字形个数
piGlyphWidth: 输入参数,字形宽度数组
pwLogClust: 输入参数,簇信息
psva: 输入参数,调用ScriptShape 得到
piDx: 输出参数,字符宽度
函数存在目的:
可以通过此函数获取每个字符的宽度,据此可以计算出子字符串的范围(如索引值1-4 的子字符串左右范围)。当然这个函数是针对每一个Item 而言的,对于整个字符串还需要联合调用函数,如ScriptStringGetLogicalWidths 即是通过调用ScriptGetLogicalWidths 实现的。
函数如何实现?
该函数针对单独的Item,一个Item 的字符串可以被分割成多个簇。字符的宽度是根据簇来计算的。
簇内每个字符的宽度等于簇内所有字形的宽度之和除以簇内字符的个数。
例.
ฆูีฟิฟ
字体选用:Tahoma
文本绘制方向:LTR
字符码值: U+0e06, U+0e39, U+0e35, U+0e1d, U+0e34, U+0e1d
字形值: 2109 2160 3232 2134 5444 2134
字形宽度: 9 0 0 8 0 8
簇标记: 0 0 0 3 3 5
簇信息:
第一簇: 字符范围[0,2], 字形范围[0,2], 宽度9
第二簇: 字符范围[3,4], 字形范围[3,4], 宽度8
第三簇: 字符范围[5], 字形范围[5], 宽度9
则字符的逻辑宽度是
index = 0 width = 9/3 = 3
index = 1 width = 9/3 = 3
index = 2 width = 9- 3 – 3 = 3(最后一个必须是减法,因为除法可能出现余数)
index = 3 width = 8/2 = 4
index = 4 width = 8 – 4 = 4
index = 5 width = 9/1 = 9
HRESULT WINAPI ScriptGetProperties(
const SCRIPT_PROPERTIES ***ppSp,
int *piNumScripts
);
函数功能:
获取当前Uniscribe 引擎指定的脚本信息。
参数描述:
ppSp: 输出参数,脚本信息
piNumScripts: 输出参数,当前引擎支持的脚本个数
函数存在目的:
使用该函数我们可以获取指定脚本的详细信息,如该脚本语言Id、是否是复杂文本、是否是控制字符、数字等。
HRESULT WINAPI ScriptIsComplex(
const WCHAR *pwcInChars,
int cInChars,
DWORD dwFlags
);
函数功能:
判断一段文本是否含有复杂文本。
参数描述:
pwcInChars: 输入参数,需要判断的文本
cInChars: 输入参数,文本的字符个数
dwFlags: 输入参数,指定标志
返回值:
如果返回S_OK, 则说明是复杂文本。
函数存在目的:
如果一段文本经过此函数判断后,返回S_OK,则需要使用Uniscribe 引擎进行其他处理,如Shape,Place 等。反之,直接使用GDI 函数即可完成所需的操作。
函数如何实现?
学习日记,兼职软件设计,软件修改,毕业设计。
本文出自 学习日记,转载时请注明出处及相应链接。
本文永久链接: https://www.softwareace.cn/?p=302