Uniscribe文字自动换行
转载:http://blog.csdn.net/jianlizhao66/article/details/1480457
我们获得了每个字形的宽度数组piAdvances,以及这个RUN所占用的总宽度abc。
piVdvances对应于每个字符,它取得了每个字形所占用宽度。
如果我们以行为单位来绘制文字,我们可以以一个循环来取得每个RUN的宽度信息,并一直相加,假设我们己取得了一些run的宽度和,假设这个宽度和为LineWidth.当我们再取得链表中下一个run的宽度(假设为lo)与这个宽度相加后超过一个行的宽度。我们假设这个run的索引为n即在链表中的节点顺序由头节点向后遍历的顺序为第n个。
我们可以中断这个run即把这个run分为两个run,所谓划分实际上也就是把这个run的字符分为两部分。
可以这样实现:
hr = ScriptGetLogicalWidths(&pRun->analysis,
pRun->iLen,
cGlyphs,
piAdvances,
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,并进行相应的划分。
Uniscribe文字自动换行的更多相关文章
- canvas文字自动换行、圆角矩形画法、生成图片手机长按保存、方形图片变圆形
canvas的文字自动换行函数封装 // str:要绘制的字符串 // canvas:canvas对象 // initX:绘制字符串起始x坐标 // initY:绘制字符串起始y坐标 // lineH ...
- 使用echart的雷达图的时候,如果文字越界的解决办法记录,标签文字自动换行
使用echart的雷达图的时候,如果文字越界的解决办法记录,标签文字自动换行 前几天项目中有一个图表的是用echart生成的,遇到一个问题,就是在手机端显示的售时候,如果文字太长就会超出div,之前的 ...
- HTML DIV中文字自动换行 , 顶部对齐
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta ht ...
- WPF控件TextBlock中文字自动换行
原文:WPF控件TextBlock中文字自动换行 在很多的WPF项目中,往往为了追求界面的美观,需要控制控件中文字的换行显示,现对TextBlock控件换行的实现方式进行总结,希望大家多多拍砖!!! ...
- css控制文字自动换行
自动换行问题,正常字符的换行是比较合理的,而连续的数字和英文字符常常将容器撑大,挺让人头疼,下面介绍的是CSS如何实现换 行的方法 对于div,p等块级元素正常文字的换行(亚洲文字和非亚洲文字)元素拥 ...
- html/css实现文字自动换行,超出部分出现(...)
PS:这是我在别人博客copy下来的 做前端的我们都会发现这样一个问题,当你控制文字出现多行时,而这多行是有限制的(比如超出部分隐藏不显示),而这多行文字如果全部是数字或者字母抑或是数字和字母的组合时 ...
- java 画图 Graphics 文字自动换行
/** * 文字超出限定长度自动换行 * * @param g 画布 * @param font 字体样式 * @param text 文字 * @param widthLength 最大长度 (多少 ...
- H5 canvas填充文字自动换行
canvas是H5中非常重要,非常常用,也是非常强大的一个新标签,美中不足的事,canvas中没没有自动换行的属性,我的第一反应是,字符串截取,然后计算每行的距离来实现自动换行.. 然后百度了一下,已 ...
- UIlabel多行文字自动换行 (自动折行)
UIView *footerView = [[UIView alloc]initWithFrame:CGRectMake(, , , )]; UILabel *label = [[UILabel al ...
随机推荐
- scala.collection.immutable.HashSet$.empty()Lscala/collection/immutable/HashSet
最近重新搭了spark环境.在Master上使用了IDEA来写代码.确实很方便.我用的是hadoop2.6.spark1.5.1forhadoop2.6. scala之前用的是2.11.0老是报这个错 ...
- angularjs 延迟更新和angularjsUI
angularjsUI库https://material.angularjs.org/latest/ ng-model-options="{ updateOn: 'blur' }" ...
- Net分布式系统之二:CentOS系统搭建Nginx负载均衡(下)
上一篇文章介绍了VMWare12虚拟机.Linux(CentOS7)系统安装.部署Nginx1.6.3代理服务做负载均衡.接下来介绍通过Nginx将请求分发到各web应用处理服务. 一.Web应用开发 ...
- 一个很酷的加载loading效果--IT蓝豹
一个很酷的加载loading效果,自定义LeafLoadingView实现,LeafLoadingView继承view, 本例子主要由以下几点构成 (1):RotateAnimation实现叶子旋转 ...
- ngx.lua中遇到的小问题
作者: 胡 志伟 分类: ngx_lua, 开发代码 发布时间: 2013-09-26 08:40 ė 6评论关闭 在使用ngx.redirect 到一个新的地址时,错误日志提示: lua entry ...
- 使用网易ubuntu镜像加速软件包安装
用vi工具编辑文件 sudo vi /etc/apt/sources.list 以trusty(14.04)为例,插入下面内容到文件的最前面: deb http://mirrors.163.com/u ...
- ORACLE恢复数据
ORACLE恢复删除表或表记录 一:表的恢复 对误删的表,只要没有使用PURGE永久删除选项,那么从flash back区恢复回来希望是挺大的.一般步骤有: 1.从flash back里查询 ...
- asp.net截取指定长度的字符串内容
/// <summary> /// 用于截取指定长度的字符串内容 /// </summary> /// <param name="sString"&g ...
- 循序渐进Python3(七) --1-- 面向对象
Python 面向对象 什么是面向对象编程? 面向对象编程是一种程序设计范式 对现实世界建立对象模型 把程序看作不同对象的相互调用 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Py ...
- APK动态加载框架(DL)解析
转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/39937639 (来自singwhatiwanna的csdn博客) 前言 好久 ...