DirectWrite: IDWriteFontFamily::GetFontCount



当我尝试使用DirectWrite获取字体系列中的字体数时,我得到了错误的结果。例如,当我查看系统字体文件夹时,Arial字体家族有9种字体,但是GetFontCount返回14。剩余的5号是多少?这是怎么发生的?这是一个错误,还是有我不知道的东西,或者文档中没有提到?这是一个最小的repo示例。

#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>

#include <dwrite.h>

#pragma comment(lib, "dwrite")

IDWriteFactory* pDWriteFactory = NULL;
IDWriteFontCollection* pFontCollection = NULL;
IDWriteFontFamily* pFontFamily = NULL;
IDWriteFont* pFont = NULL;
IDWriteFontFace* pFontFace = NULL;

int main()
{
HRESULT hr = DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, &IID_IDWriteFactory, &pDWriteFactory);
if (FAILED(hr))
return -1;

hr = pDWriteFactory->GetSystemFontCollection(&pFontCollection, FALSE);

if (FAILED(hr))
return -2;

UINT index = 0;
BOOL exists;
hr = pFontCollection->FindFamilyName(L"Arial", &index, &exists);
if (FAILED(hr))
return -3;
hr = pFontCollection->GetFontFamily(index, &pFontFamily);
if (FAILED(hr))
return -4;
UINT count;

count = pFontFamily->GetFontCount();
if (FAILED(hr))
return -5;
DWRITE_FONT_METRICS metrics;
for (int i = 0; i < count; i++)
{
hr = pFontFamily->GetFont(i, &pFont);
pFont->GetMetrics(&metrics);

printf("%d %d %d %dn", metrics.designUnitsPerEm, metrics.ascent, metrics.descent, metrics.lineGap);
}
return 0;
}

DirectWrite模拟"倾斜的";字体(不在物理文件中(。

对于倾斜,通过执行剪切来实现倾斜从普通字体转换字符。当一个真实的斜体在计算机或打印机上不可用样式可以从普通字体生成,并用于模拟斜体。

因此,您将获得"Oblique"、"Narrow Oblique’"、"Bold Oblique‘"、"窄-粗-斜’"模拟字体,总共14种。

如果斜体可用,则不应使用斜体。

您可以在每个字体上使用IDWriteFontFace::GetSimulations方法进行检查,这将为这些字体返回DWRITE_font_SIMULATIONS_OBLIQUE。

最新更新