IDWriteTextLayout问题与斜体文本



有没有人知道如何让IDWriteTextLayout调整布局,使字形不会超出布局边界?当与LHS或RHS对齐时,某些字体下的斜体(如'f')尤其会出现这个问题。

GDI+默认的行为是这样的(参见:StringformatFlagsNoFitBlackBox)。一种选择是实现自定义布局。但这似乎过于复杂了。如果可能的话,我更喜欢使用标准布局。

IDWriteTextLayout总是使用字形的布局边界(字形的起源和宽度)而不是墨水来对齐字形的布局范围,这意味着墨水确实可以溢出到外面,因为斜体倾斜或装饰,像Gabriola的花式斜线(至少在Win7&8)。

我认为你最好的办法,除了编写自己的自定义布局,将包括一些明确的边距(使布局尺寸小于控制区域)或扩大任何剪辑区域,以允许墨水溢出一些。这就是为什么常见的EDIT控件和CSS默认使用一些填充的原因之一。要估计内边距,您可以使用从其他UI设置中获得的固定值,字体大小的比例,或者测量一次以获得DWRITE_OVERHANG_METRICS,并使用调整/缩小的大小第二次调整大小。

textLayout->SetMaxWidth(initialMaxWidth);
textLayout->GetOverhangMetrics(OUT &overhangMetrics);
float newSmallerWidth = initialMaxWidth
                      - std::max(overhangMetrics.left,  0.0f)
                      - std::max(overhangMetrics.right, 0.0f);
textLayout->SetMaxWidth(newSmallerWidth);

IDWriteTextFormat1IDWriteTextLayout2中有SetOpticalAlignment(DWRITE_OPTICAL_ALIGNMENT opticalAlignment)。根据文档

默认情况下,字形通过字形的默认原点和侧面方向与页边距对齐。如果您指定DWRITE_OPTICAL_ALIGNMENT_NO_SIDE_BEARINGS,则对齐使用侧轴承从对齐的边缘偏移字形,以确保字形的墨水对齐。

然而,在DWRITE_2.H中,DWRITE_OPTICAL_ALIGNMENT_NO_SIDE_BEARINGS的注释说明:

/// Align glyphs to the margins. Without this, some small whitespace
/// may be present between the text and the margin from the glyph's side
/// bearing values. Note that glyphs may still overhang outside the
/// margin, such as flourishes or italic slants.

我没有试过,所以我不能说它是否适用于你的情况。: - (

相关内容

  • 没有找到相关文章

最新更新