它是有据可查的(如这里),其IE9将忽略字体平滑(又名抗锯齿)的OS范围的设置.即使在Windows中禁用了字体平滑和ClearType,IE仍会显示抗锯齿字体,有些用户难以阅读,特别是在小字体时.
如何在IE9中禁用所有字体抗锯齿(ClearType或其他)?
更多细节:
我们公司构建了一个使用大量小字体的Web应用程序.随着IE9的发布,我们的一些用户抱怨IE9的默认抗锯齿使我们的小字体模糊或模糊.因此,我们需要帮助已安装IE9并希望关闭抗锯齿功能的用户.
另外,就个人而言,我无法阅读小型的抗锯齿字体,所以我想要一个自己使用的解决方案,即使对于我无法控制的网站也是如此.
在IE8中,我可以取消选中"始终使用ClearType for HTML",然后在操作系统中禁用ClearType,IE8将显示所有字体别名.但在IE9中,缺少此选项.
经过一些关于这个问题的研究,这就是我所学到的:核心问题是IE依靠DirectWrite进行文本渲染,并且不支持任何更新的渲染选项,这些选项可以在没有抗锯齿的情况下绘制文本并尊重用户的OS-广泛的默认选择.
更糟糕的是,如果你在操作系统中禁用ClearType,在某些情况下,IE将回退到DirectWrite的默认非cleartype抗锯齿,它甚至比ClearType更模糊.
完全披露:我正在研究我的libui GUI框架的文本API.这包括Windows上的DirectWrite,OS X上的Core Text和其他Unix上的Pango(它使用HarfBuzz进行OpenType整形).我想要指定的文本格式化属性之一是要使用的OpenType功能的集合,这三者都提供了这些功能.DirectWrite是IDWriteTypography.
现在,当您使用这些库绘制一些文本时,默认情况下您将启用一些有用的OpenType功能,例如标准连字(liga),如f + i连字.我认为这是特定于字体的,但事实证明这是特定于正在形成的文本的脚本.Microsoft为OpenType支持的所有脚本提供了指南(在"特定于脚本的开发"下),我可以看到相当复杂的逻辑,可以在HarfBuzz中完成所有这些以确认它.
在Core Text和Pango上,如果我启用其他属性,它们将被添加到这些默认值之上.但是使用DirectWrite,IDWriteTextLayout::SetTypography()这样做会删除默认值:

可以在此处找到生成此输出的程序.
显然我的第一个选择是询问如何获取DirectWrite的默认功能.但是,有人已经在这个网站上这样做了,答案似乎是"不".
我猜测DirectWrite允许我完全控制要应用于某些文本的功能列表.这很好,除了我不能用其他API做到这一点,除非我以某种方式明确禁用默认功能!当然,我不知道这个列表是否会改变,所以硬编码可能不是最好的主意.
即使硬编码是一种选择,我也可以为每个脚本获取HarfBuzz的列表,但是a)它相当复杂 b)脚本有多种可能的整形器,这取决于(我认为)版本兼容性(例如,缅甸).
那么为什么不使用HarfBuzz的列表来重新创建DirectWrite的默认功能列表呢?它似乎想要对其他塑造者准确,所以这应该工作,对吧?好吧,我需要做两件事:找出要使用的脚本,并找出哪些属性用于脚本中字符的位置重要的脚本.
DirectWrite提供了一个接口IDWriteTextAnalyzer,提供执行整形的工具.我可以使用它,但似乎脚本数据在DWRITE_SCRIPT_ANALYSIS结构中返回,并且脚本ID的描述显示"写入系统脚本的从零开始的索引表示.".
这没有用,所以我编写了一个程序来转储我输入的文本的脚本编号.在输入字符串上运行它
????????????????????????? abcd ???? ??? ??????? ????????? ???????? ?????
Run Code Online (Sandbox Code Playgroud)
产生输出
0 - 26 script 3 shapes 0
26 - 5 script 49 shapes 0
31 - 14 script 3 shapes 0
45 - 2 script 1 shapes 1
47 - 25 script 22 …Run Code Online (Sandbox Code Playgroud) 我的目标: 我想获得IDWriteTextFormat字体的高度,这样我就可以计算出在一定高度的IDWriteTextLayout中可以容纳多少行文本.
我的问题: 现在我正在使用此代码来计算可见的行数:
inline int kmTextCtrl::GetVisLines() const
{
/* pTextFormat is an IDWriteTextFormat pointer, dpi_y is the desktop's vertical dpi,
and GetHeight() returns the height (in pixels) of the render target. */
float size = (pTextFormat->GetFontSize()/72.0f)*dpi_y;
return (int)(GetHeight()/size);
}
Run Code Online (Sandbox Code Playgroud)
对于某些字体,计算似乎是准确的,但对于任何TrueType字体都不准确(例如:Courier New,Arial,Times New Roman).对于这些字体,显示的文本剪裁得远远低于渲染目标的下垂直边界.
一些上下文: 我正在制作一个文本回滚缓冲区控件,它使用IDWriteTextLayout将文本放到控件的渲染目标中.我使用GetVisLines()的结果来确定循环缓冲区(由行存储std :: strings中的文本)中的文本行数以拉入布局,并在每次滚动或调整窗口大小时重新创建它.
这是使用"本机"Win32 API C++完成的.
我更喜欢谷歌浏览器几乎在IE10以上的所有方面,但我讨厌的一件事是在IE10中字体看起来好多了.使用小型数学字体尤其明显.它们看起来像IE10中的pdf质量.
经过一番搜索,我发现这是因为IE10在Windows 7/8中使用DirectWrite进行字体渲染.我正在搜索chrome将来是否会支持这个,我发现了这个信息:
每个人都在看这个的更新:
我们的Windows字体渲染正在积极开展.DirectWrite的基本支持现在在Skia中(从注释#13更新).与此同时,GDI深深地嵌入在Windows WebKit端口中,并且仍在根除.我们希望在开发人员可以开始玩的里程碑或者两个里程碑之内.一如既往,它对稳定的速度有多快,关乎我们能够多快地根除和消除任何回归.
我们将在这里更新线程,当它在运行时标志后面可用时,你们都可以尝试.
以下修订涉及此错误:http: //src.chromium.org/viewvc/blink? view = rev&rev = 159071更改路径:M http://src.chromium.org/viewvc/blink/trunk/Source/core /platform/graphics/skia/FontCacheSkiaWin.cpp?r1=159071&r2=159070&pathrev=159071 M http://src.chromium.org/viewvc/blink/trunk/Source/core/page/RuntimeEnabledFeatures.in?r1=159071&r2=159070&pathrev = 159071
添加运行时标志以在Windows上使用DirectWrite
添加运行时启用的功能以在
Windows 上使用DirectWrite skia后端.
BUG = 25541 R = bungeman@chromium.org,eseidel @ chromium.org
评论网址:https://codereview.chromium.org/26335002
我甚至不知道运行时标志是什么,但这听起来有可能以某种方式在chrome中启用directwrite.这是真的 ?或者我应该再等一会儿才能在chrome中使用directwrite字体渲染?
我想使用DirectWrite进行混合颜色文本格式化(确切地说是语法高亮),但似乎无法在布局或排版选项中找到方法.唯一的选择是在渲染文本时传递一个画笔,这对我不起作用,因为我基本上只有一个布局.救命!
CreateTextFormat的文档没有说明字体回退选择,但如果选择了默认(NULL = 系统)集合,那么 DirectWrite 清楚地实现了字体回退。例如,如果我将 Gabriola 字体中未找到的两个字形添加到 DirectWrite SDK 演示应用程序使用的测试字符串中,则 DirectWrite 会从 Segoe UI Symbol 字体中选择丢失的字形。这发生在基本DrawText调用和自定义渲染器(对字体回退不做任何自定义)时,如下所示(唯一的修改是测试字符串):

复选标记和白星来自 Segoe UI Symbol,而不是来自 Gabriola,即使在演示应用程序中只指定了 Gabriola。那么,有谁知道 DirectWrite (CreateTextFormat) 是如何选择后备字体的?
更新。我看到有一个GetSystemFontFallback可以列出后备字体,但它只在 Windows 8.1 中可用(因为它在 IDWriteFactory2 中)。我猜他们已经注意到 API 在枚举后备字体方面的差距。所以我猜在 Windows 8.1 之前没有办法做到这一点,但如果有人知道黑客/解决方法......
更新2。引用MSFT 员工的话:
DirectWrite 具有无法从注册表读取或以任何方式配置的回退数据。但是,在 Windows 8.1 中,引入了允许应用指定其自己的回退的 API。(它类似于用于创建复合字体定义的 WPF API。)
这仍然不能准确解释硬编码算法/替换方案实际上是什么。
我希望能够支持自定义 Windows 控件中的文本输入,就像 EDIT 和 Rich Edit 控件已经做的那样,但不对其中任何一个控件进行子类化。该控件当前使用 Direct2D 和 DirectWrite 绘制文本,并在带有平台更新的 Windows Vista SP1 或更高版本上运行(如果我决定需要更新的 Direct2D 和 DirectWrite 功能,我可能会将其更改为带有平台更新的 Windows 7 SP1 或更高版本,假设这些功能是在那里可用或仅在 Windows 8 上可用,但这是一个不同的问题......)
就其价值而言,在 OS XI 上我会使用NSTextInputClient,在 GTK+ 上我会使用GtkIMContext。我正在谈论的就是这样的事情。
显而易见的选择是使用WM_CHAR,如果我正确收集的话,如果窗口类是用 注册的RegisterClassW(),那么它本身就是 UTF-16 ,因此无论位置如何都应该“正常工作”。然而,WM_CHAR是由 生成的TranslateMessage(),并且它的文档说没有办法确定 a 是否WM_CHAR已生成,因为TranslateMessage()总是返回非零。我需要能够确定当前的键盘消息是否将由文本系统处理(因此应该被忽略);这尤其正确,因为所有非文本键都需要以独立于布局的方式处理(我已经有了)。
我还在 Windows 7 示例代码中看到了 IMM API 和文本服务框架。我不确定一个是否比另一个更好,而且他们似乎都做同样的事情。他们吗?
就 IMM 而言,有许多WM_IMM_xxx消息我不确定是否应该忽略,并且我发现的每个参考文献似乎都不同意我是否应该在 Unicode 窗口中处理它们。 ..此外,上述了解 IMM 是否会处理给定按键事件的问题仍然悬而未决;有办法吗?
TSF 有一个称为 ACP 的概念,它似乎允许我使用我想要的任何文本存储格式来存储我实际要使用的文本(即,不是正在进行的合成)。这是真的?我希望能够将文本存储为带有属性的 UTF-8,在绘图时转换为 …
使用来自IDWriteTextLayout的HitTestTextPosition样式API 我没有设法在"ti","ffi"或其他带有Calibri等字体的连字中正确处理文本位置.它总是在结束之后或之前返回位置,如t | i或f | f | i.
使用DirectWrite API在连线内部进行插入符号移动的推荐方法是什么?
我正在使用 Embarcadero RAD Studio XE7 编译器(C++ Builder),其中我正在尝试提供的 Direct2D API。我的目的是创建提供与 GDI 完全相同的渲染的应用程序,但也可能受益于 Direct2D 提供的新功能,例如 Window 10 上的彩色表情符号。
在这种背景下,我编写了一个小型文本绘制函数,它使用 Direct2D 来完成这项工作。我还搜索了如何配置 Direct2D/DirectWrite 来绘制尽可能接近 GDI 功能的文本。
这导致了以下功能:
void DrawText_Direct2D(const std::wstring& text, const TRect& rect, TColor bgColor,
TFont* pFont, TCanvas* pCanvas)
{
if (!pFont || !pCanvas)
return;
// fill destination canvas background with provided color
WGDIHelper::Fill(pCanvas, rect, bgColor);
::D2D1_RECT_F drawRect;
drawRect.left = rect.Left;
drawRect.top = rect.Top;
drawRect.right = rect.Right;
drawRect.bottom = rect.Bottom;
// get Direct2D destination canvas
std::unique_ptr<TDirect2DCanvas> pD2DCanvas(new TDirect2DCanvas(pCanvas->Handle, rect));
// configure Direct2D …Run Code Online (Sandbox Code Playgroud) 我正在使用C#中的一个小型2D游戏引擎,并决定使用Direct2D和DirectWrite进行渲染.我知道有Windows API Code Pack和SlimDX,但我真的很喜欢从头开始编写接口.我试图在没有托管C++的情况下这样做,但Direct2D和DirectWrite似乎没有使用传统的COM对象.它们定义了派生自的接口IUnknown,但似乎没有办法从C#与COM互操作实际使用它们.有IID d2d1.h,但没有CLSID.
当然,我是COM互操作的新手,所以也许我只是缺少一些东西.有人可以对这种情况有所了解吗?