Uniscribe文字自动换行

我们获得了每个字形的宽度数组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]一个 结构指针.

cChars

[in] 在RUN中的逻辑编码点数量

cGlyphs

[in] 在一个RUN中的字形数量

piGlyphWidth

[in] 字形向前宽度的数组指针

pwLogClust

[in] 逻辑Cluster的数组指针

psva

[in] 结构指针

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,并进行相应的划分。

Original: https://www.cnblogs.com/Clingingboy/p/3463764.html
Author: Clingingboy
Title: Uniscribe文字自动换行

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/551449/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 函数响应式编程

    将值的变化和事件看作状态的变化;编程的目的在于响应状态; 将函数作为变量注册为状态的响应处理器。 rx 响应式编程天然具有函数式编程特征; 一切变化皆状态(流)。 Original…

    技术杂谈 2023年5月31日
    092
  • 彩食鲜架构团队风采

    2020-4-15 架构组支援福州做冷热数据拆分 4-24 听说最近测试环境不稳定,首席掏腰包请大家喝个茶吧~~ ps: 服务器资源不足,咋办? :) 4-25 诸事不顺,上天台聊…

    技术杂谈 2023年7月23日
    060
  • Django Model 如何返回空的 QuerySet

    >>> from django.contrib.auth.models import User >>> User.objects.none() …

    技术杂谈 2023年6月21日
    0110
  • test

    https://www.cnblogs.com/hsqdboke/archive/2012/04/02/2429988.html https://wenku.baidu.com/v…

    技术杂谈 2023年6月1日
    092
  • MVCC简介

    一、MVCC简介 MVCC (Multiversion Concurrency Control),即多版本并发控制技术,它使得大部分支持行锁的事务引擎,不再单纯的使用行锁来进行数据…

    技术杂谈 2023年6月1日
    097
  • 如何高效地写 Form

    工作少不了写”增删改查”,”增删改查”中的”增”和”改”都与 Form 有关,可以说…

    技术杂谈 2023年7月11日
    093
  • 图解|用好MySQL索引,你需要知道的一些事情

    我是蝉沐风。 这一篇文章来聊一聊如何用好MySQL索引。 为了更好地进行解释,我创建了一个存储引擎为InnoDB的表 user_innodb,并批量初始化了500W+条数据。包含主…

    技术杂谈 2023年7月23日
    085
  • 接口和抽象类是否有构造方法

    先上结论: 接口没有,抽象类可以有。 甚至于有其他的区别: 接口不能有方法体,抽象类可以有 (仅限java8以前) 接口不能有静态方法,抽象类可以有 (仅限java8以前) 接口中…

    技术杂谈 2023年7月25日
    055
  • Understanding the managed heap

    【 Understanding the managed heap】 1、common problem faced by many Unity developers is the u…

    技术杂谈 2023年5月31日
    098
  • 导出websphere内存镜像

    1.将脚本放致profiles\appservername\bin 下 2.查看一下soap host(在控制台port中能够看到) 3.运行例如以下命令:./wsadmin.sh…

    技术杂谈 2023年5月31日
    074
  • 浅谈kali : arpspoof工具原理

    介绍 arpspoof是一个通过ARP协议伪造数据包实现中间人攻击的kali工具。 中间人攻击虽然古老,但仍处于受到黑客攻击的危险中,可能会严重导致危害服务器和用户。仍然有很多变种…

    技术杂谈 2023年7月25日
    082
  • 醒酒菜:动画图解核心内存区-堆

    端午佳节一下子就过完了,大家是不是还沉迷在假期的欢乐气氛中无法自拔?今天阿Q为大家准备了上好的”醒酒菜”——JVM运行时数据区的核心内存区——堆。 堆的概述…

    技术杂谈 2023年7月11日
    091
  • @SuppressWarning

    看到一个没见过的SuppressWarning( @SuppressWarnings(“WeakerAccess”)),网上也没搜到。 找到一篇文章(@SuppressWarnin…

    技术杂谈 2023年7月24日
    086
  • Linux基础学习(四)

    自建yum仓库,分别为网络源和本地源 1.本地源 点击查看代码 root@ct7:~# yum install autofs root@ct7:~# systemctl enabl…

    技术杂谈 2023年6月21日
    099
  • 如何选购电脑

    作为非电脑硬件专业人士,挑选一套性价比高的电脑是件困难的事情,一不小心就要交智商税。钱多不在乎的请略过。 最近家里需要换一台电脑,于是我学了一下相关知识,将挑选过程记录下来,以备后…

    技术杂谈 2023年5月31日
    081
  • Vue自定义组件开发:使用v-model封装el-pagination组件

    1、前言 通过封装el-pagination组件开发自定义分页组件的类似文章网上已经有很多了,但看了一圈,总是不如意,于是决定还是自己动手搞一个。 2、背景 利用el-pagina…

    技术杂谈 2023年6月21日
    079
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球