dotnet 简单聊聊 Skia 里的 SKFontMetrics 的各项属性作用

打印 上一主题 下一主题

主题 941|帖子 941|积分 2823

本文将和大家简单聊聊 Skia 里的 SKFontMetrics 的各项属性作用和代表的含义
熟悉文本排版的伙伴大概对于字体的 Metrics 概念不陌生,在 Skia 里面提供的 SKFontMetrics 就包罗了从字体信息里面所获取的多项信息。只是略微有所不同的是 Skia 多加了对字体大小的加工,即 SKFontMetrics 获取到的属性已经是和 SKFont 的 Size 相关
如下图所示,是我绘制的表现图

通过以上表现图再配合咱小学学到的四线三格知识,大概就可以明确各个属性的含义了。基线是排版里面一个重要的概念,基线(Baseline)是字母(拉丁字母、希腊字母、西里尔字母)放置的程度线。排版里面对齐基线非常重要

【SkiaSharp绘图04】SKPaint详解(二)FakeBoldText/FilterQuality/FontMetrics/FontSpacing/ImageFilter_skiasharp 字体-CSDN博客 博客所述,各属性含义如下

  • Top:表现字体基线(baseline)以上的最高点的坐标。对于大多数拉丁字母,这个值通常是负的,因为大多数字形的顶部在基线之上。
  • Ascent:表现字体的上升(ascent)值,即从基线到字体最高点的距离。正值表现从基线向上的距离,通常包括字符顶部的额外空间。
  • Descent:表现字体的降落(descent)值,即从基线向下到字体最低点的距离。正值表现从基线向下的距离,通常包括字符底部的额外空间。
  • Bottom:表现字体基线以下的最低点的坐标。这个值通常是负的,因为大多数字形的底部在基线以下。
  • Leading:表现字体的行间距(leading),即每行文字之间的额外空间。它是上一行 descent 到下一行 ascent 之间的间距。
  • CapHeight:表现大写字母的高度,即大写字母的顶部到基线的距离。这个值对于调整字体大小和行高很有效。
  • XHeight:表现小写字母的高度,即小写字母 x 的顶部到基线的距离。它通常用于调整字体大小和行高,以确保小写字母的清晰显示
由此可以看到和 DriectX 的 DWRITE_FONT_METRICS 结构体比较相似
在 Skia 里面,通过 DrawText 方法绘制文本时,传入的 X 和 Y 属于 baseline 基线的坐标,而不是文本渲染的左上角坐标。如以下的小测试代码所示
  1.             using var paint = new SKPaint();
  2.             paint.Color = SKColors.Blue;
  3.             paint.Style = SKPaintStyle.Stroke;
  4.             paint.IsAntialias = true;
  5.             var marginLeft = 35;
  6.             var marginTop = 30;
  7.             // 在基线绘制一条线,用于测试字体的基线
  8.             var baseline = 100;
  9.             skCanvas.DrawLine(marginLeft, baseline + marginTop, 300 + marginLeft, baseline + marginTop, paint);
  10.             // 尝试绘制文本内容
  11.             var text = "asdfghijpqWER";
  12.             paint.TextSize = 30;
  13.             skCanvas.DrawText(text, marginLeft, baseline + marginTop, paint);
复制代码
此时可见文本是绘制在蓝色线上的,且是基线部门绘制对齐蓝线,运行之后的界面效果大概如下

在 Skia 里面盘算出 baseline 基线的方法是通过 Ascent 属性盘算出来的,在 Skia 里面取 Ascent 的绝对值就是 baseline 基线的值
排版里面的字高就是再 baseline + Descent 的值,即 |Ascent| + Descent 的值。排版的字高不等同与渲染字高,渲染字高在不思量合写字环境下,一样平常就是 Top 线到 Bottom 线之间的高度就是渲染字高度。正常咱是不关心渲染字高,最多只关心排版字高
行距部门会比较复杂,我自己建立的文本库就预备尝试模仿 WPF 的行距算法或 PPT 的行距算法,具体请看 dotnet OpenXML 聊聊 PPT 文本行距行高盘算公式
本文代码放在 githubgitee 上,可以使用如下下令行拉代替码。我整个代码仓库比较庞大,使用以下下令行可以进行部门拉取,拉取速度比较快
先创建一个空文件夹,接着使用下令行 cd 下令进入此空文件夹,在下令行里面输入以下代码,即可获取到本文的代码
  1. git init
  2. git remote add origin https://gitee.com/lindexi/lindexi_gd.git
  3. git pull origin 9c035b4fc813169ead14567f8d40bdb9c382ec4c
复制代码
以上使用的是国内的 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在下令行继续输入以下代码,将 gitee 源换成 github 源进行拉代替码。如果依然拉取不到代码,可以发邮件向我要代码
  1. git remote remove origin
  2. git remote add origin https://github.com/lindexi/lindexi_gd.git
  3. git pull origin 9c035b4fc813169ead14567f8d40bdb9c382ec4c
复制代码
获代替码之后,进入 SkiaSharp/RijojahijayNoherrerhu 文件夹,即可获取到源代码
更多技能博客,请参阅 博客导航
参考文档:
【SkiaSharp绘图04】SKPaint详解(二)FakeBoldText/FilterQuality/FontMetrics/FontSpacing/ImageFilter_skiasharp 字体-CSDN博客
《冒号和比号的体式及其应用问题》 林穗芳 人民出版社 2008
中文字体的FontMetrics解析-CSDN博客
术语表 - FontForge 与字体设计 - UDN开源文档

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

风雨同行

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表