问题标签 [directwrite]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
google-chrome - Chrome 37 DirectWrite fixed text rendering, but special characters still appear grainy
Chrome 37 fixed its font rendering issues by supporting DirectWrite on Windows. As a result, text renders much better, as seen in a screenshot of my web app:
However, note that the stars on the right remain ugly. The stars are ☆ WHITE STAR (U+2606).
I also have ✓ CHECK MARK (U+2713) on my page, and it appears grainy and pixelated:
When zooming in to 125%, the stars jump from a grainy outline to a smoother shape. The checkmark becomes smooth at 200% page zoom.
The symbols appear fine in Firefox, although the stars look bad in IE11 like in Chrome.
Since Chrome fixed font rendering as seen with the text above, why do the stars and checkmarks appear grainy still? How can I fix this to make them look like they do in Firefox?
fonts - DirectWrite (CreateTextFormat) 如何选择后备字体?
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。)
这仍然不能准确解释硬编码算法/替换方案实际上是什么。
c++ - 在 DirectWrite 中使用 TAB
我只是在 C++ 中通过 DirectWrite 工作,这似乎解决了我在不同渲染目标(屏幕和打印机)中具有相同布局的需求。
我仔细检查了 HelloWorld 示例(http://msdn.microsoft.com/en-us/library/windows/desktop/dd368048%28v=vs.85%29.aspx)并从中学到了很多。
HelloWorld 示例甚至被 Charles Petzold 的一篇文章(我认为)排在首位,该文章对 DirectWrite 的高级功能进行了更多说明:“使用 DirectWrite 进行字符格式化扩展”(http://www.charlespetzold.com/blog/2014/ 01/Character-Formatting-Extensions-with-DirectWrite.html )。
但是到目前为止我发现的所有文档和示例中仍然缺少一个主题:有关在 DirectWrite 中使用 TABstops 的文档。到目前为止,我发现的只是一个(非常)简短的关于“增量选项卡”设置的文档,它甚至没有提到如何对齐每个单独选项卡中的文本。
有人知道关于 DirectWrite 中 TAB 的更深入描述吗?提前致谢。
delphi - 文本周围的 Direct2D 边框
为了更好的视觉外观,想在我的文本周围画一个黑色边框。
目前我正在绘制相同的文本 5 次。
如果我想在 x = 5, y = 10 上绘制文本,我会在实际位置上绘制一次文本。
然后我会用黑色绘制相同的文本,位置稍有不同。
- x = 4,y = 10
x = 5, y = 9
...
我只能想象这是糟糕的表现。或者这是正确的方法?
c++ - 用 DirectWrite 实现滚动文本
我有一个存储各种记录数据的字符串。这些数据应该可以通过控制台访问。控制台当然只有有限的高度。因此,我不需要渲染整个文本,而只需渲染可见的内容。为此,我有一个变量,用于存储用户向上滚动的文本底部(最近)端的像素数。现在我想我需要一种方法来找出我的文本的哪一部分适合我的控制台,以及如何告诉 DirectWrite 只渲染它。
到目前为止我所做的:现在我正在使用CreateTextLayout(...)
并DrawTextLayout(...)
绘制完整的文本(现在只是一个小的测试文本)而没有滚动能力。
CreateTextLayout(...)
已经接受了参数maxWidth
和maxHeight
. 所以也许这可以解决只渲染适合控制台的问题。
我也曾经DWRITE_PARAGRAPH_ALIGNMENT_FAR
看到最新的文本行。但是如何添加额外的滚动(最好是额外的像素而不是线条,以便我可以通过一些时间控制的增量来实现平滑滚动)?
简而言之
- 是否
CreateTextLayout(...)
为我处理“仅渲染可见部分”? - 如何包含滚动部分?
编辑:更改了标题,因为它并没有很好地总结问题。
c++ - IDWriteFactory::CreateTextFormat() 失败
我正面临一个我正在自杀的问题。我有以下代码:
最后一行 textFormat 指向 null 之后。CreateTextFormat() 返回值 E_INVALIDARG。我肯定安装了Arial,根据MSDN,这两个nullptr参数是允许的,所以我看不出什么是无效的。任何人都可以对此有所了解吗?
c# - SharpDX DirectWrite 旋转文本
我想知道如何使用 SharpDX 旋转使用 Direct2D 呈现的文本。
找不到任何可能性
RenderTarget2D.DrawText()
或者
RenderTarget2D.DrawTextLayout()
c++ - Direct2D:将文本转换为路径
我对 Direct2D 和 DirectWrite 非常陌生,并且仍在研究这些 API 提供的可能性。对于潜在的图形应用程序,我想知道是否可以将文本渲染为路径,以便可以像在矢量图形编辑器中一样修改各个点。是否可以直接在 Direct2D 和 DirectWrite 中执行类似的操作,或者至少有办法检索必要的信息并手动构建类似于文本的路径对象?
gdi - IDWriteGdiInterop::CreateBitmapRenderTarget 失败
我有一个将字形呈现到打印机设备上下文的应用程序。早些时候,它使用 GDI 并且运行良好。但现在,我尝试改用 Directwrite。
我更改了现有的 ExtTextOut 调用并使用了 IDWriteTextLayout::Draw 函数。
我需要在绘图函数中传递一个实现 IDWriteTextRenderer 接口的对象。
我已经使用对 IDWriteBitmapRenderTarget:: DrawGlyphRun 的调用在 IDWriteTextRenderer 接口中实现了 DrawGlyphRun 回调。所以,我需要创建一个 IDWriteBitmapRenderTarget 对象。
我有以下代码:
设备上下文 hDC 正在由另一个 dll 中的函数传递。
结果:hr=E_FAIL
也许我错过了一些非常基本的东西,但我对设备上下文知之甚少,而且我是 DirectWrite 的新手。我需要知道为什么与 ExtTextOut 调用兼容的相同 HDC 结构与 DirectWrite 不兼容。
此外,由于 HDC 字段是可选的,如果我传递 NULL,它会成功,但绘图函数不会渲染任何内容。传递 NULL 意味着什么?
c++ - DirectWrite:Windows 7 上的字符间距
我需要将使用 GDI 和 GDI+ 的现有 C++ 代码中的一些文本到位图渲染例程转换为使用 DirectWrite(需要 CFF 支持和 OTF 功能支持)。
我是 DirectWrite 的新手。花一些时间研究迁移现有功能所需的内容并进行一些原型设计,我遇到了一个问题:我的问题是 DirectWrite(开箱即用)不支持字符间距调整(这是现有功能的要求)应用程序),至少不是在 Windows 7 上。我知道它随 Windows 8 一起提供,但不幸的是,这个现有应用程序的另一个要求是在 Windows 7 上运行。
到目前为止,我在研究中发现,要走的路似乎是实现自定义 DirectWrite 文本布局,但我还没有找到任何关于如何做到这一点的好的指导方针,尤其是在字符间距方面(关于MSDN 关于如何创建自定义文本布局对我来说有点模糊)。
正如我认为这必须在之前完成,在花费数天和/或数周的研究和开发重新发明轮子之前,这里有没有人知道我可以使用自定义字符间距的 DirectWrite 文本布局的示例实现作为开始点还是教程?
UPDATE1:不是答案,但是 - 我发现 IDWriteTextLayout1 界面(支持设置字符空格)不仅随 Windows 8 提供,而且还随 Windows 7 上的“Windows 7 Platform Update for SP1”(KB 2670838)提供。因为我可以要求应用程序正常运行,这解决了我的问题,尽管它没有回答我的问题。