在 WPF 里面的 GlyphRun 里,有一个令人迷惑的 DeviceFontName 属性,似乎给这个属性传入什么值,结果都不会有变更。通过阅读源代码,可以了解到,这是一个没什么用途的属性。本文将告诉大家这个属性的细节逻辑

在上一篇博客 WPF 简单聊聊如何使用 DrawGlyphRun 绘制文本 里面就提到如何创建 GlyphRun 对象,在创建的时候发现设置的 DeviceFontName 参数,无论设置为什么值,结果都没有变化

官方文档对于 GlyphRun.DeviceFontName 的描述也是比较不清不楚的。中文文档里面是机器翻译,不如看看英文原文吧

When a GlyphRun is rendered on a device that has built-in support for the named device font, the GlyphRun should be rendered using a device specific mechanism for selecting that font, and by sending Unicode code points rather than glyph indices. When rendering onto a device that does not include built-in support for the named device font, DeviceFontName should be ignored.

我本来以为这是一个能用来优化性能的属性,但是我似乎没有在网上找到大佬们讨论过这个属性。好在 WPF 是完全开源的,我就开始阅读源代码。通过阅读源代码发现这个属性其实没有什么作用,属性的定义代码如下

    public class GlyphRun : DUCE.IResource, ISupportInitialize
{
/// <summary>
/// Identifies a specific device font for which the GlyphRun has been optimized. When a GlyphRun is
/// being rendered on a device that has built-in support for this named font, then the GlyphRun should be rendered using a
/// possibly device specific mechanism for selecting that font, and by sending the Unicode codepoints rather than the
/// glyph indices. When rendering onto a device that does not include built-in support for the named font,
/// this property should be ignored.
/// </summary>
public string DeviceFontName
{
get
{
CheckInitialized();
return _deviceFontName;
}
set
{
CheckInitializing(); // This can only be set during initialization.
_deviceFontName = value;
}
} private string _deviceFontName; ...// 忽略其他代码
}

无论是 _deviceFontName 还是 DeviceFontName 属性,唯一的作用就是给自己,也就是给 _deviceFontNameDeviceFontName 提供赋值。完全就是自己玩自己的代码。看看 ReSharper 帮我找到的引用关系图

至于 DeviceFontName 属性,完全只有一个逻辑在使用,那就是用来创建 GlyphRun 副本时作为参数传入,如下面代码

namespace System.Windows.Xps.Serialization
{
internal class VisualSerializer: IMetroDrawingContext
{
private static GlyphRun FilterXmlInvalidChar(GlyphRun glyphRun)
{
...// 忽略其他代码 GlyphRun filtered = new GlyphRun(
glyphRun.GlyphTypeface,
glyphRun.BidiLevel,
glyphRun.IsSideways,
glyphRun.FontRenderingEmSize,
glyphRun.PixelsPerDip,
glyphRun.GlyphIndices,
glyphRun.BaselineOrigin,
glyphRun.AdvanceWidths,
glyphRun.GlyphOffsets,
filteredCharacters,
glyphRun.DeviceFontName,
glyphRun.ClusterMap,
glyphRun.CaretStops,
glyphRun.Language
); return filtered;
}
...// 忽略其他代码
}
}

可以看到,这是一个完全没有实际作用的属性,这也就是为什么传入任何的值,都不会影响结果的原因

我猜测这是在远古的 WPF 存在多个代码版本时,在某些代码版本,这个属性是有实际实现逻辑

但是我好奇的是,在 DX 上是没有任何可以和这个属性对应的,如果有优化,那是如何实现的,还请有了解的大佬教教我

当前的 WPF 在 https://github.com/dotnet/wpf 完全开源,使用友好的 MIT 协议,意味着允许任何人任何组织和企业任意处置,包括使用,复制,修改,合并,发表,分发,再授权,或者销售。在仓库里面包含了完全的构建逻辑,只需要本地的网络足够好(因为需要下载一堆构建工具),即可进行本地构建

dotnet 读 WPF 源代码笔记 GlyphRun 的 DeviceFontName 的功能是什么的更多相关文章

  1. dotnet 读 WPF 源代码笔记 布局时 Arrange 如何影响元素渲染坐标

    大家是否好奇,在 WPF 里面,对 UIElement 重写 OnRender 方法进行渲染的内容,是如何受到上层容器控件的布局而进行坐标偏移.如有两个放入到 StackPanel 的自定义 UIEl ...

  2. dotnet 读 WPF 源代码笔记 渲染收集是如何触发

    在 WPF 里面,渲染可以从架构上划分为两层.上层是 WPF 框架的 OnRender 之类的函数,作用是收集应用程序渲染的命令.上层将收集到的应用程序绘制渲染的命令传给下层,下层是 WPF 的 GF ...

  3. 读Flask源代码学习Python--config原理

    读Flask源代码学习Python--config原理 个人学习笔记,水平有限.如果理解错误的地方,请大家指出来,谢谢!第一次写文章,发现好累--!. 起因   莫名其妙在第一份工作中使用了从来没有接 ...

  4. 《深入浅出WPF》笔记——绘画与动画

    <深入浅出WPF>笔记——绘画与动画   本篇将记录一下如何在WPF中绘画和设计动画,这方面一直都不是VS的强项,然而它有一套利器Blend:这方面也不是我的优势,幸好我有博客园,能记录一 ...

  5. 《深入浅出WPF》笔记——资源篇

    原文:<深入浅出WPF>笔记--资源篇 前面的记录有的地方已经用到了资源,本文就来详细的记录一下WPF中的资源.我们平时的“资源”一词是指“资财之源”,是创造人类社会财富的源泉.在计算机程 ...

  6. 在Linux上编译dotnet cli的源代码生成.NET Core SDK的安装包

    .NET 的开源,有了更多的DIY乐趣.这篇博文记录一下在新安装的 Linux Ubuntu 14.04 上通过自己动手编译 dotnet cli 的源代码生成 .net core sdk 的 deb ...

  7. [WPF源代码]QQ空间相册下载工具

    放一个WPF源代码,源代码地址 http://download.csdn.net/detail/witch_soya/6195987 代码没多少技术含量,就是用WPF做的一个QQ空间相册下载工具,效果 ...

  8. WPF学习笔记-用Expression Design制作矢量图然后导出为XAML

    WPF学习笔记-用Expression Design制作矢量图然后导出为XAML 第一次用Windows live writer写东西,感觉不错,哈哈~~ 1.在白纸上完全凭感觉,想象来画图难度很大, ...

  9. WPF 学习笔记-在WPF下创建托盘图标

    原文:WPF 学习笔记-在WPF下创建托盘图标 首先需要在项目中引用System.Windows.Forms,System.Drawing; using System; using System.Co ...

  10. WPF 学习笔记-设置属性使窗口不可改变大小

    原文:WPF 学习笔记-设置属性使窗口不可改变大小 调整Windows下的ResizeMode属性: ResizeMode = NoResize Resize属性是控制Windows是否可以改变大小, ...

随机推荐

  1. .Net实现Html保存到照片

    本文将使用PuppeteerSharp组件.实现Html代码片段生成Jpg照片 PuppeteerSharp项目地址:https://github.com/hardkoded/puppeteer-sh ...

  2. Java博客大汇总

    目录介绍 01.Java基础[30篇] 02.面向对象[15篇] 03.数据结构[27篇] 04.IO流知识[11篇] 05.线程进程[9篇] 06.虚拟机[12篇] 07.类的加载[7篇] 08.反 ...

  3. FreeRTOS教程8 任务通知

    1.准备材料 正点原子stm32f407探索者开发板V2.4 STM32CubeMX软件(Version 6.10.0) Keil µVision5 IDE(MDK-Arm) 野火DAP仿真器 XCO ...

  4. JDBC反序列化

    JDBC反序列化攻击 介绍 JDBC(Java DataBase Connectivity)是一种用于执行Sql语句的Java Api,即Java数据库连接,是Java语言中用来规范客户端程序如何来访 ...

  5. 快速上手系列:XML

    一 xml 简介extensible markup language :可扩展标记型语言(1)标记型语言:html 也是标记型语言,即使用标签来操作(2)可扩展: 1)html 里面的标签是固定的,每 ...

  6. Docker网络模型以及容器通信

    本篇接着上篇:[Docker0网络及原理探究],继续深入探究容器网络通信原理,通过学习Docker网路驱动模型,更好地解决容器间的通信问题 1.Docker的网络驱动模型 1.1.Docker的网络驱 ...

  7. FTP上传中文文件,内容乱码

    记录一下: spring boot 程序 ftp上传中文文件,内容乱码. 1.刚开始程序部署在Windows平台上测试,发现上传后的文件内容是乱码,查看文件编码格式是ANSI(Windows下文本文件 ...

  8. Python爬虫爬取爱奇艺、腾讯视频电影相关信息(改进版)---团队第一阶段冲刺

    爱奇艺 1 import time 2 import traceback 3 import requests 4 from lxml import etree 5 import re 6 from b ...

  9. 利用 🤗 Optimum Intel 和 fastRAG 在 CPU 上优化文本嵌入

    嵌入模型在很多场合都有广泛应用,如检索.重排.聚类以及分类.近年来,研究界在嵌入模型领域取得了很大的进展,这些进展大大提高了基于语义的应用的竞争力.BGE.GTE 以及 E5 等模型在 MTEB 基准 ...

  10. C 语言文件处理全攻略:创建、写入、追加操作解析

    C 语言中的文件处理 在 C 语言中,您可以通过声明类型为 FILE 的指针,并使用 fopen() 函数来创建.打开.读取和写入文件: FILE *fptr; fptr = fopen(filena ...