dwrite: Add support for PFM files in Analyze().
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
b9e58dd7cc
commit
38a99b2f25
|
@ -811,6 +811,16 @@ static HRESULT opentype_otf_analyzer(IDWriteFontFileStream *stream, UINT32 *font
|
||||||
static HRESULT opentype_type1_analyzer(IDWriteFontFileStream *stream, UINT32 *font_count, DWRITE_FONT_FILE_TYPE *file_type,
|
static HRESULT opentype_type1_analyzer(IDWriteFontFileStream *stream, UINT32 *font_count, DWRITE_FONT_FILE_TYPE *file_type,
|
||||||
DWRITE_FONT_FACE_TYPE *face_type)
|
DWRITE_FONT_FACE_TYPE *face_type)
|
||||||
{
|
{
|
||||||
|
#include "pshpack1.h"
|
||||||
|
/* Specified in Adobe TechNote #5178 */
|
||||||
|
struct pfm_header {
|
||||||
|
WORD dfVersion;
|
||||||
|
DWORD dfSize;
|
||||||
|
char data0[95];
|
||||||
|
DWORD dfDevice;
|
||||||
|
char data1[12];
|
||||||
|
};
|
||||||
|
#include "poppack.h"
|
||||||
struct type1_header {
|
struct type1_header {
|
||||||
WORD tag;
|
WORD tag;
|
||||||
char data[14];
|
char data[14];
|
||||||
|
@ -834,6 +844,44 @@ static HRESULT opentype_type1_analyzer(IDWriteFontFileStream *stream, UINT32 *fo
|
||||||
|
|
||||||
IDWriteFontFileStream_ReleaseFileFragment(stream, context);
|
IDWriteFontFileStream_ReleaseFileFragment(stream, context);
|
||||||
|
|
||||||
|
/* let's see if it's a .pfm metrics file */
|
||||||
|
if (*file_type == DWRITE_FONT_FILE_TYPE_UNKNOWN) {
|
||||||
|
const struct pfm_header *pfm_header;
|
||||||
|
UINT64 filesize;
|
||||||
|
DWORD offset;
|
||||||
|
BOOL header_checked;
|
||||||
|
|
||||||
|
hr = IDWriteFontFileStream_GetFileSize(stream, &filesize);
|
||||||
|
if (FAILED(hr))
|
||||||
|
return hr;
|
||||||
|
|
||||||
|
hr = IDWriteFontFileStream_ReadFileFragment(stream, (const void**)&pfm_header, 0, sizeof(*pfm_header), &context);
|
||||||
|
if (FAILED(hr))
|
||||||
|
return hr;
|
||||||
|
|
||||||
|
offset = pfm_header->dfDevice;
|
||||||
|
header_checked = pfm_header->dfVersion == 0x100 && pfm_header->dfSize == filesize;
|
||||||
|
IDWriteFontFileStream_ReleaseFileFragment(stream, context);
|
||||||
|
|
||||||
|
/* as a last test check static string in PostScript information section */
|
||||||
|
if (header_checked) {
|
||||||
|
static const char postscript[] = "PostScript";
|
||||||
|
char *devtype_name;
|
||||||
|
|
||||||
|
hr = IDWriteFontFileStream_ReadFileFragment(stream, (const void**)&devtype_name, offset, sizeof(postscript), &context);
|
||||||
|
if (FAILED(hr))
|
||||||
|
return hr;
|
||||||
|
|
||||||
|
if (!memcmp(devtype_name, postscript, sizeof(postscript))) {
|
||||||
|
*font_count = 1;
|
||||||
|
*file_type = DWRITE_FONT_FILE_TYPE_TYPE1_PFM;
|
||||||
|
*face_type = DWRITE_FONT_FACE_TYPE_TYPE1;
|
||||||
|
}
|
||||||
|
|
||||||
|
IDWriteFontFileStream_ReleaseFileFragment(stream, context);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return *file_type != DWRITE_FONT_FILE_TYPE_UNKNOWN ? S_OK : S_FALSE;
|
return *file_type != DWRITE_FONT_FILE_TYPE_UNKNOWN ? S_OK : S_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue