Nikolay Sivov : dwrite: Add support for PFM files in Analyze().
Alexandre Julliard
julliard at wine.codeweavers.com
Thu Feb 11 09:59:45 CST 2016
Module: wine
Branch: master
Commit: 38a99b2f25faf2bf483d59b10a780ad7d842042c
URL: http://source.winehq.org/git/wine.git/?a=commit;h=38a99b2f25faf2bf483d59b10a780ad7d842042c
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Thu Feb 11 04:50:07 2016 +0300
dwrite: Add support for PFM files in Analyze().
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/dwrite/opentype.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 48 insertions(+)
diff --git a/dlls/dwrite/opentype.c b/dlls/dwrite/opentype.c
index a913dc9..5b29c21 100644
--- a/dlls/dwrite/opentype.c
+++ b/dlls/dwrite/opentype.c
@@ -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,
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 {
WORD tag;
char data[14];
@@ -834,6 +844,44 @@ static HRESULT opentype_type1_analyzer(IDWriteFontFileStream *stream, UINT32 *fo
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;
}
More information about the wine-cvs
mailing list