首页 > 其他分享 >dotnet 读 WPF 源代码笔记 GlyphRun 的 DeviceFontName 的功能是什么

dotnet 读 WPF 源代码笔记 GlyphRun 的 DeviceFontName 的功能是什么

时间:2023-09-05 15:00:32浏览次数:51  
标签:font GlyphRun glyphRun DeviceFontName device 源代码 属性

在 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 协议,意味着允许任何人任何组织和企业任意处置,包括使用,复制,修改,合并,发表,分发,再授权,或者销售。在仓库里面包含了完全的构建逻辑,只需要本地的网络足够好(因为需要下载一堆构建工具),即可进行本地构建

标签:font,GlyphRun,glyphRun,DeviceFontName,device,源代码,属性
From: https://www.cnblogs.com/lindexi/p/17679568.html

相关文章

  • 如何利用FuncGPT告别繁琐的开源代码调试
    作为一名开发人员,您是否曾经在浩如烟海的开源社区中搜索代码,然后花费大量时间测试、调试,最后才发现这些代码并不符合您的需求?专注Java生成AI函数的FuncGPT(慧函数)就像您的私人编程助手,只需输入你的需求,就能提供符合要求的函数,让你告别繁琐的搜索、测试和调试,迈向高效的开发之旅。一......
  • 起盟生活APP系统开发设计和部分远源代码分享
    起盟生活也是一种卷轴模式,卷轴模式从趣步模式开始到现在,不断有新的项目出来,如果说2023年商业模式项目做个排行,我想有一半的项目是卷轴模式的项目,它的特点也很明显,互联网生意讲究免费,羊毛出在猪身上狗来买单的逻辑.免费,让所有人都能参与进来玩,免费,让系统本身具备分销裂变的属性,可以......
  • centos stream 9 编译 python3.11.5 源代码
    wgethttps://www.python.org/ftp/python/3.11.5/Python-3.11.5.tgztar-zxvfPython-3.11.5.tgzcdPython-3.11.5执行配置帮助./configure--help主要是想设置安装路径Installationdirectories:--prefix=PREFIXinstallarchitecture-independentfilesinP......
  • Node为nuxt.js 的源代码打包的执行命令
    为Node源代码打包的执行命令#清理缓存数据/root/.nvm/versions/node/v14.17.6/bin/npmcacheclean--force#删除之前使用过的插件模板文件等,若下面有.nuxt文件也一下做删除rm-rfnode_modulespackage-lock.json.nuxt#设置淘宝的npm源/root/.nvm/versions/node/v14.17......
  • svnWebUI svn服务端web 开源代码版本控制系统 图形化管理系统
    svn是Subversion的简称,是一个开源的代码版本控制系统,svn就是用于多人共同开发同一个项目,达到资源共用目的工具。版本控制是什么?版本控制(Revisioncontrol)是指对软件开发过程中各种程序代码、配置文件及说明文档等文件变更的管理。可记录每个版本的信息,方便问题追踪。同时版本控制......
  • 源代码泄露总结
    .git源码泄露.git信息泄露漏洞-简明原理及利用方法-FreeBuf网络安全行业门户Git信息泄露原理解析及利用总结-FreeBuf网络安全行业门户commit、tree和blob三个对象之间的关系|Git(geek-docs.com)参考源于上面师傅文章,引用以作学习之用!git简单使用Git常用命令实操1......
  • 学习笔记413—python实现BP神经网络进行预测和误差分析(附源代码)
    python实现BP神经网络进行预测和误差分析(附源代码)反向传播算法也称为BP神经网络,是一种带有反馈的神经网络反向学习方法,它可以对神经网络的各层上的各个神经元的各个神经元之间的连接权重进行不断迭代修改,使神经网络将输入数据转换成期望的输出数据 BP神经网络的学习过程由正向......
  • 免费开源网校系统源代码轻松搭建在线教育平台_兔知云课堂教育系统:数字化教育平台快速
    在如今快节奏的时代,越来越多的教育机构和个人教师开始寻求一种高效的方式来搭建网络教育平台,以满足学习者的需求。在这个背景下,兔知云课堂教育系统成为了一款备受瞩目的解决方案,为教育者们提供了快速搭建平台的新途径。 想要开始快速搭建网络教育平台吗?不妨考虑兔知云课堂教育......
  • Linux下MySql的三种安装方式:RPM 二进制包和源代码
    mysql的三种安装方式:RPM二进制包和源代码本次安装的系统平台为redhat5一、使用RPM包进行安装    首先可以从安装光盘中或者到mysql的网站上下载对应版本的rpm包如下:MySQL-server-community-5.1.38-0.rhel5.i386.rpmMySQL-client-community-5.1.38-0.rhel5.i386.rpm   ......
  • Meta即将推出开源代码生成平台Code Llama,挑战OpenAI和google
    您的关注是对我最大的支持......