转载:http://blog.csdn.net/jianlizhao66/article/details/1480457数组
咱们得到了每一个字形的宽度数组piAdvances,以及这个RUN所占用的总宽度abc。函数
piVdvances对应于每一个字符,它取得了每一个字形所占用宽度。字体
若是咱们以行为单位来绘制文字,咱们能够以一个循环来取得每一个RUN的宽度信息,并一直相加,假设咱们己取得了一些run的宽度和,假设这个宽度和为LineWidth.当咱们再取得链表中下一个run的宽度(假设为lo)与这个宽度相加后超过一个行的宽度。咱们假设这个run的索引为n即在链表中的节点顺序由头节点向后遍历的顺序为第n个。编码
咱们能够中断这个run即把这个run分为两个run,所谓划分实际上也就是把这个run的字符分为两部分。.net
能够这样实现:指针
hr = ScriptGetLogicalWidths(&pRun->analysis,htm
pRun->iLen,blog
cGlyphs,索引
piAdvances,ip
pClusters,
pVisattrs,
logwidths);
ScriptGetLogicalWidhts函数转换一个指定字体的字形向前宽度为逻辑宽度。
HRESULT WINAPI ScriptGetLogicalWidths(
const SCRIPT_ANALYSIS *psa,
int cChars,
int cGlyphs,
const int *piGlyphWidth,
const WORD *pwLogClust,
const SCRIPT_VISATTR *psva,
int *piDx,
);
psa
[in]一个 SCRIPT_ANALYSIS 结构指针.
cChars
[in] 在RUN中的逻辑编码点数量
cGlyphs
[in] 在一个RUN中的字形数量
piGlyphWidth
[in] 字形向前宽度的数组指针
pwLogClust
[in] 逻辑Cluster的数组指针
psva
[in] SCRIPT_VISATTR 结构指针
piDx
[out] 逻辑宽度的数组指针
能够看出这个函数的最后一个参数为输出参数,它表明逻辑宽度的数组。即每一个字形所占用的宽度数组。
而后咱们能够以一个循环来判断具体到哪一个字符时知足不超过窗口宽度的条件。
iChars = 0;
iWidth = 0;
while(iChars < pRun->iLen && iWidth + logwidths[iChars] < iMaxWidth)
{
iWidth += logwidths[iChars];
iChars++;
}
pRun表明咱们当前的run。iWidth表明当前run中某个字符的逻辑宽度,iMaxWidth表明窗口剩余的宽度即剩余了iMaxWidth的宽度,但这个宽度不足以显示这个run.
经过上面这个循环,咱们找到了这个字符的位置。
if(iChars < pRun->iLen )
{
pNewRun = new RUN;
*pNewRun = *pRun;
pRun->pNext = pNewRun;
pRun->iLen = iChars;
pNewRun->iLen -= iChars;
}
咱们已经划分了这个RUN。
第二步已经完成,总结第二步,主要目的是肯定一行(窗口宽度)要显示多少个RUN,并进行相应的划分。