问题标签 [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.

0 投票
1 回答
738 浏览

c++ - DirectWrite 中的 RTL 文本宽度

我使用IDWriteTextAnalysisSink/AnalyzeScript在 DirectWrite (C++) 中显示混合的 LTR(英语)和 RTL(希伯来语)文本,并计算文本宽度:

glyphAdvances返回GetGlyphPlacements

但是对于从右到左的文本,这通常是不准确的,导致文本重叠等。这是正确的方法吗?

谢谢。

0 投票
1 回答
224 浏览

windows - 使用 DirectWrite 确定字边界

DirectWrite 通过 IDWriteTextAnalysisSink::SetLineBreakpoints() 提供换行信息。但是,我还需要根据Unicode Annex #29: Unicode Text Segmentation确定单词边界。

有没有办法使用 DirectWrite 做到这一点?如果没有,有哪些替代方案可以与 Windows 桌面中的 DirectWrite 文本布局系统以及 WinRT 一起使用?

0 投票
2 回答
566 浏览

c++ - DirectWrite:为拉丁文和复杂脚本使用不同的字体

我使用CreateTextLayoutCreateTextFormat使用 DirectWrite (C++) 绘制文本,文本混合了希伯来语/英语,有没有办法为拉丁语和希伯来语字符使用不同的字体/字体大小?

谢谢。

0 投票
2 回答
845 浏览

html - Chrome 35 DirectWrite(默认开启)破坏了我的站点菜单

刚刚更新到最新的 Chrome 35 Stable,并注意到字体更流畅 - 太好了,他们已经实现了 DirectWrite。可爱的东西。

但是,它似乎在我的网站上中断了。

我的主菜单有以下标记(非常简单):

每个a都像这样填充:padding: 16px 17px; 它们也显示为其 parent 中的块li

每个a > span的样式都是这样的:

新的 DirectWrite 使菜单如下所示:

使用 DirectWrite

当它应该像这样出现时:

没有 DirectWrite

多余的线是从哪里来的?有什么解决方法吗?我尝试在 中添加 amargin-rightspan查看文本是否会流回第一行,但没有这样的运气。

以下是 thea和的完整 LESS span

编辑:

只是让你知道,我正在使用@font-face. 我使用的字体是 Lato。将其关闭并默认为 Arial 或 Helvetica 并不能解决问题。

0 投票
1 回答
228 浏览

dpi - DirectWrite'ing 字形使 em 正方形具有特定大小

我正在开发一个呈现音乐符号的应用程序。音乐符号在常规字体文件中指定,它们使用的约定是 em 方格的高度对应于常规五行乐谱的高度。例如,音符头的字形大约 0.25 em 高,即五线谱两行之间的距离。

在渲染方面,我使用了一个坐标系,其中 4 个单位对应于五线谱表的高度。因此,我需要渲染字形以使 em 方格最终呈现 4 个单位高。但是 DirectWrite 只允许在设备独立像素 (DIP) 中指定文本大小,我对如何在坐标系之间进行调整感到困惑。这有两个部分:

  • 从 DIP 中给定的字体大小,我可以计算物理像素的高度,但是映射到该高度的是什么?em square 还是其他一些设计空间度量?
  • 如果我使用一些任意变换矩阵怎么办?如何指定 DIP 以便在我使用的坐标系中获得有意义的值?

为了更好的衡量:

  • 如果让它工作,这是否会弄乱字体提示,因为我的 DIP 值与物理像素没有明确的关系?
0 投票
1 回答
636 浏览

c# - 为什么 DrawTextLayout 在 SharpDX 中忽略来自 SetDrawingEffect 的画笔?

我的目标是在具有特定范围不同大小和不透明度的单一布局中绘制文本。该ID2D1RenderTarget::DrawTextLayout方法似乎是要走的路。

参数的文档defaultForegroundBrush

画笔用于在 textLayout 中绘制任何尚未有画笔关联的文本作为绘图效果(由 IDWriteTextLayout::SetDrawingEffect方法指定)。

根据该IDWriteTextLayout::SetDrawingEffect方法的备注部分,

如果您使用ID2D1RenderTarget::DrawTextLayout 绘制文本并且该笔刷将用于绘制指定范围的文本,则可以将ID2D1Brush(例如颜色或渐变笔刷)设置为绘制效果。

此绘制效果与指定范围相关联,在绘制时绘制范围时会通过回调的方式传回应用程序。

听起来ID2D1RenderTarget::DrawTextLayout肯定会使用IDWriteTextLayout::SetDrawingEffect. 这个不受管理的 C++ 答案似乎证实了这个想法。

但是,在实践中,DrawTextLayout忽略SolidColorBrush我使用SetDrawingEffect. 我得到了适当范围内的样式和大小,但一切都是使用默认画笔绘制的。

我通过实现一个自定义文本渲染器 ( gistID2D1RenderTarget::DrawTextLayout ) 来解决这个问题,它非常简单,并且完全按照文档的要求绘制了我所期望的内容。我会很满意,但 aTextRendererBase和的性能DrawGlyphRun比 . 慢 25% 以上ID2D1RenderTarget::DrawTextLayout

什么可能导致此问题?我可以按照文档的建议使用颜色并仍然使用ID2D1RenderTarget::DrawTextLayout吗?

0 投票
1 回答
204 浏览

qt - 用于复杂字体渲染引擎的 Web 与桌面

问题

我希望为乌尔都语开发一个小型桌面出版应用程序。这是一种从右到左的语言,但排版可能非常复杂。

简单来说,可以使用 Unicode 字体,这是 BBC 在这里使用的方法: http ://www.bbc.co.uk/urdu

但是,Unicode 方法本质上是强制所有字母牢固地位于一个共同的基线上并具有相同的字母高度。文本看起来更像阿拉伯文,这对于商业文件来说是可以接受的,但乌尔都语的美在于其自由形式的书法风格。一个例子可以在这里看到:

http://upload.wikimedia.org/wikipedia/commons/9/94/Urdu_couplet.svg

我希望编写一个乌尔都语字体渲染引擎,它可以为以书法风格渲染 Unicode 乌尔都语文本提供大量控制。创建一个单独的字体文件(假设它可以容纳大约 18,000 个字母字形组合)并不能完全解决问题。例如,我想增加“字距”(字母间距),这需要流畅地延伸连接字母的线条,同时保持平滑的曲线。

问题

我最初的方法是只针对 Windows 并使用 C++ 和 MFC。但这些都是非常古老的技术,虽然可能仍然可以解决问题,但我想问什么是更现代的方法。以下是我探索过的选项:

  • 由于字体渲染是一种低级活动,因此 C#/WPF 可能不合适
  • 我想避免只针对 Windows,所以也许 C++/Qt 可能是一个选项
  • 鉴于云计算趋势,理想的做法是通过浏览器进行部署,但我认为不可能获得一致的体验。再说一次,我还没有正确探索 GDI 和 DirectWrite
  • 也许可以从 DirectX / OpenGL 游戏中利用一些东西
0 投票
1 回答
1972 浏览

visual-c++ - 使用 GetDesignGlyphMetrics 在 DirectWrite 中计算 unicode 字符的宽度

我正在从事 GDI 到 DirectWrite 迁移项目。我想计算每个 unicode 字符的宽度,在 GDI 上这是使用 GetCharWidth 完成的。在 msdn 博客上,我发现 GDI 的 GetCharWidth 的替代品是 GetDesignGlyphMetrics 。

谁能告诉我如何使用这个函数 GetDesignGlyphMetrics 来获取 DWRITE_GLYPH_METRICS?

如何实例化它的第一个参数 UINT16 const* glyphIndices?

0 投票
0 回答
735 浏览

unicode - 计算一个unicode字符的宽度

我试图在不使用 GDI api 的情况下计算直接写入中 unicode 字符的宽度。我的问题是一些字符是全角字符,有些是半角字符,因此下面的公式不起作用,因为左侧轴承和右侧轴承因差异字符而异. 我该如何解决这个问题?

0 投票
2 回答
822 浏览

delphi - DirectWrite RegisterFontFileLoader : 创建一个字体文件加载器并在 Delphi 中注册它而不会访问冲突

我正在尝试注册一个基于 DirectWrite(Windows 7、Windows 8)API 的字体文件加载器,并在 Delphi 中重新创建,这是来自 Windows 7 SDK 的 CustomFont 演示,它展示了如何将DirectWriteAPI 与自定义字体集合一起使用。这允许 DirectWrite 使用您自己从应用程序资源中加载的字体,这些字体未在 Windows 字体系统中全局注册。我遇到了访问冲突。下面是一个最小示例。

首先,我对 XE6 中附带的 Delphi Direct2D 接口有疑问。在 Delphi 单元中 Winapi.D2D1 是IDWriteFactory类型。一个特殊的接口方法可以让你注册一个字体文件加载器: RegisterFontFileLoader

在将此与 C++ direct2d 标头进行比较时,我发现自己想知道以上内容是否正确翻译。这是 C/C++ direct2d 标头 (dwrite.h) 等效项:

请注意,在普通 C++ 中,您不能使用“IDWriteFontFileLoader fontFileLoader”类型的变量,接口引用的类型为“IDWriteFontFileLoader*”。因此我质疑上述var界面中关键字的适用性。

这是我的示例代码,它在内部dwrite.dll因访问冲突而崩溃。我在这里做明显错误的事情吗?TLoader 对象是微不足道的,它是一个 TInterfacedObject,我创建了它,但我无法注册该对象。我怀疑这个方法的单个参数没有被正确传递,我不确定我是否做错了什么,或者我是否在 Delphi RTL 的 Direct2D 包装器代码中发现了一个错误。

在 Windows SDK 中可以找到 C++ 的工作示例。上面的 C++ 代码出现在 C++ 演示中,作为 DirectWrite 工厂和 D2D1 工厂创建后首先要做的事情之一:

以通常的ResourceFontFileLoader::GetLoader()C++ 方式简单地返回构造的 C++ 对象转换为接口类型:

上面的代码在 C++ 中手动实现了 IUnknown,而我的代码使用TInterfacedObject了干净地实现 IUnknown 的 Delphi。接口IDWriteFontFileLoader方法中只有一个方法,CreateStreamFromKey,在注册的时候C++demo中没有调用,所以实际代码不可能有影响,只有调用约定,栈,前置状态或 DirectWrite 工厂的设置步骤似乎是可能的原因。