layout_object_transform 或 wcslayout_object_transform 子例程

用途

根据 LayoutObject 结构的当前布局值变换文本。

布局库 (libi18n.a)

语法

#include <sys/lc_layout.h>
int layout_object_transform 
( layout_object,  InpBuf,  InpSize,  OutBuf,  OutSize,  InpToOut,  OutToInp,  BidiLvl)
LayoutObject layout_object;
const char *InpBuf;
size_t *InpSize;
void * OutBuf;
size_t *OutSize;
size_t  *InpToOut;
size_t *OutToInp;
unsigned char *BidiLvl;

int wcslayout_object_transform 
(layout_object, InpBuf, InpSize, OutBuf, OutSize, InpToOut, OutToInp, BidiLvl)
LayoutObject layout_object;
const char *InpBuf;
size_t *InpSize;
void *OutBuf;
Size_t *OutSize;
size_t *InpToOut;
size_t *OutToInp;
unsigned char *BidiLvl;

描述

layout_object_transformwcslayout_object_transform 子例程根据 LayoutObject 结构中的当前布局值来变换由 InpBuf 参数指定的文本。 任何类型为LayoutTextDescriptor的布局值都会描述 InpBufOutBuf参数中的属性。 如果属性与 InpBufOutBuf 参数本身相同,那么将针对该特定布局值执行空变换。

这些子例程的输出可能是下列其中一个或多个结果,具体取决于各自参数的设置:

描述
OutBufOutSize 任何转换后的数据都存储在 OutBuf 参数中。
InpToOut InpBuf 参数的每个代码元素到转换后的数据的交叉引用。
OutToInp 对转换后数据中 InpBuf 参数的每个代码元素的交叉引用。
BidiLvl 表示 InpBuf 参数的每个代码元素的方向级别的加权值。 级别取决于 LayoutObject 结构的内部方向算法。

您可以将这些输出参数中的每个参数指定为 Null ,以指示特定参数不需要任何输出。 但是,您应该至少将其中一个参数设置为 nonNULL 值以执行任何重要工作。

要对文本字符串进行整形而不对代码元素重新排序,可将 "TypeOfText布局值设置为 "文字视觉,并将 "方向 "布局值的 "入 "和 "出 "值设置为相同的值。 这些布局值位于 LayoutObject 结构中。

注: 如果您正在开发可能支持多字节语言环境的国际化应用程序,请参阅 常规编程概念: 编写和调试营销计划 中的 Libcur 包的使用

参数

描述
layout_object 指定由 layout_object_create 子例程创建的 LayoutObject 结构。
InpBuf 指定要处理的源文本。 此参数不能为空。
InpSize 指定与 layout_object_transformwcslayout_object_transform 子例程的字节相关联的已处理代码元素的单位。 如果值为-1,则表示输入以空码元素分隔。 返回时,该值将被修改为InBuf参数中已处理的代码元素的实际数量。 但是,如果OutSize参数的值为零,则InpSize参数的值不会改变。
OutBuf 包含已转换的数据。 您可以将此参数指定为空指针,以指示不需要变换数据。

OutBuf 参数的编码取决于 LayoutObject 结构中定义的 ShapeCharset 布局值。 如果ActiveShapeEditing布局值设置为 True,则OutBuf参数的编码与LayoutObject结构相关联的本地编码集相同。

OutSize 指定输出缓冲区的大小 (以字节为单位)。 输出缓冲区应该足够大,以包含转换后的结果; 否则,只执行部分转换。 如果ActiveShapeEditing布局值设置为 True,则应分配OutBuf参数,使其至少包含ShapeCharsetSize布局值乘以代码元素数。

返回时,会将 OutSize 参数修改为该参数中放置的实际字节数。

当您将 OutSize 参数指定为 0 时,子例程会将输出缓冲区的大小计算为足以包含转换后的文本。 结果将在此字段中返回。 由 InpBufOutBuf 参数指定的缓冲区的内容以及 InpSize 参数的值保持不变。

InpToOut 如果InpToOut参数不是空指针,则代表一个数值数组,其代码元素数目与InpBuf参数相同。

输出时,InpToOut参数中的第 n 个值InpBuf参数中的第 n 个代码元素相对应。 此值是 OutBuf 参数中的索引,用于标识 InpBuf 参数中 nth 代码元素的已变换 ShapeCharset 元素。 You can specify the InpToOut parameter as null if no index array from the InpBuf to OutBuf parameters is desired.

OutTolnp 如果OutToInp参数不是空指针,则代表与OutBuf参数中所含代码元素数目相同的数值数组。

在输出时, OutTolnp 参数中的 n值对应于 OutBuf 参数中的 nth ShapeCharset 元素。 此值是 InpBuf 参数中的索引,用于标识 OutBuf 参数中 nth ShapeCharset 元素的原始代码元素。 如果不需要从 OutBufInpBuf 参数的索引数组,那么可以将 OutTolnp 参数指定为 NULL。

BidiLvl 如果 BidiLvl 参数不是空指针,那么表示具有与源文本相同的元素数量的值的数组。 BidiLvl 参数中的 n值对应于 InpBuf 参数中的 n代码元素。 此值是此代码元素的级别 (由双向算法确定)。 如果不需要级别数组,那么可以将 BidiLvl 参数指定为空。

返回值

成功完成后,这些子例程将返回值 0。

错误代码

如果这些子例程失败,那么它们将返回以下值:

描述
LAYOUT_EILSEQ 由于输入代码元素无法形成或无效,因此变换已停止。 InpSize 参数指示已成功变换的代码元素的编号。
注: 您可以使用此错误代码来确定导致错误的代码元素。

此代码元素是有效的代码元素,但不能形成 ShapeCharset 布局值,或者是 LayoutObject 结构的语言环境的代码集未定义的无效代码元素。 您可以使用 mbTowcwctomb 子例程来确定在与 LayoutObject 结构相同的语言环境中使用时代码元素是否有效。

LAYOUT_E2BIG 输出缓冲区已满,且未完全处理源文本。
LAYOUT_EINVAL 由于输入缓冲区末尾的代码元素或移位序列不完整,因此变换已停止。 InpSize 参数指示成功变换的代码元素数。
注: 您可以使用此错误代码来确定导致错误的代码元素。
LAYOUT_ERANGE 源文本中包含超过 15 个嵌入级别,或者 InpBuf 参数包含不平衡的方向格式 (Push/Pop)。

OutBuf 参数的大小不足以包含整个转换后的文本时,将返回 LAYOUT_E2BIG 错误代码末尾的输入文本状态。 要恢复对剩余文本的变换,应用程序将使用相同的 LayoutObject 结构,相同的 InpBuf 参数和设置为 0 的 InpSize 参数来调用 layout_object_transform 子例程。

示例

以下是两个方向重新排序和整形的变换示例。

注意:
  1. 大写表示从左到右的字符; 小写表示从右到左的字符。
  2. xyz表示形状cde.
    Position:            0123456789
    InpBuf:              AB cde 12Z
    
    Position:            0123456789
    OutBuf:              AB 12 zyxZ
    
    Position:            0123456789
    ToTarget:            0128765349
    
    Position:            0123456789
    ToSource:            0127865439
    
    Position:            0123456789
    BidiLevel:           0001111220