我需要将字体与我的数据一起存储,以确保我的文档在所有机器上都相同。为此,我使用 TTEmbedFont 来抓取字节并将它们保存出来,然后在将字体加载到内存后使用 TTLoadEmbeddedFont 来安装字体。
问题是每当我尝试使用 TTLoadEmbeddedFont 时,我都会收到 E_FONTDATAINVALID。它调用我的 READEMBEDPROC 三次,每次请求 4 个字节,然后返回错误。我的读取过程如下所示:
unsigned long CFontLoaderDlg::ReadFontCallback(
_In_ void *lpvReadStream,
_In_ void *lpvBuffer,
_In_ const unsigned long cbBuffer
)
{
CFontLoaderDlg *loader = static_cast<CFontLoaderDlg *>(lpvReadStream);
size_t remaining = loader->m_font_bytes.size() - loader->m_pos;
size_t bytes_to_read = (cbBuffer > remaining) ? remaining : cbBuffer;
memcpy(lpvBuffer, &(loader->m_font_bytes[loader->m_pos]), bytes_to_read);
loader->m_pos += bytes_to_read;
return bytes_to_read;
}
向量 m_font_bytes 保存了我调用 TTEmbedFont 时写的再见。
我对 TTLoadFont 的调用如下所示:
LONG ret = TTLoadEmbeddedFont(
&hFontReference,
TTLOAD_PRIVATE,
&ulPrivStatus,
LICENSE_PREVIEWPRINT,
&ulStatus,
ReadFontCallback,
this,
nullptr,
nullptr,
nullptr
);
有没有人遇到过类似的问题,或者让这些东西正常工作?