Dmitry Timoshkov : winedump: Add an ability to dump font files.

Alexandre Julliard julliard at winehq.org
Mon May 11 09:10:49 CDT 2009


Module: wine
Branch: master
Commit: 60482be24bca109601008df0113b64858dd45863
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=60482be24bca109601008df0113b64858dd45863

Author: Dmitry Timoshkov <dmitry at codeweavers.com>
Date:   Mon May 11 20:56:23 2009 +0900

winedump: Add an ability to dump font files.

---

 tools/winedump/Makefile.in |    1 +
 tools/winedump/dump.c      |    1 +
 tools/winedump/font.c      |  139 ++++++++++++++++++++++++++++++++++++++++++++
 tools/winedump/winedump.h  |    4 +-
 4 files changed, 144 insertions(+), 1 deletions(-)

diff --git a/tools/winedump/Makefile.in b/tools/winedump/Makefile.in
index 6f7f1d2..34445ad 100644
--- a/tools/winedump/Makefile.in
+++ b/tools/winedump/Makefile.in
@@ -13,6 +13,7 @@ C_SRCS = \
 	dos.c \
 	dump.c \
 	emf.c \
+	font.c \
 	le.c \
 	lib.c \
 	lnk.c \
diff --git a/tools/winedump/dump.c b/tools/winedump/dump.c
index 9c8f2ff..e882c3c 100644
--- a/tools/winedump/dump.c
+++ b/tools/winedump/dump.c
@@ -242,6 +242,7 @@ dumpers[] =
     {SIG_MDMP,          get_kind_mdmp,  mdmp_dump},
     {SIG_LNK,           get_kind_lnk,   lnk_dump},
     {SIG_EMF,           get_kind_emf,   emf_dump},
+    {SIG_FNT,           get_kind_fnt,   fnt_dump},
     {SIG_UNKNOWN,       NULL,           NULL} /* sentinel */
 };
 
diff --git a/tools/winedump/font.c b/tools/winedump/font.c
new file mode 100644
index 0000000..76710b8
--- /dev/null
+++ b/tools/winedump/font.c
@@ -0,0 +1,139 @@
+/*
+ * Dump a font file
+ *
+ * Copyright 2009 Dmitry Timoshkov
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "config.h"
+#include "wine/port.h"
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_MMAN_H
+#include <sys/mman.h>
+#endif
+#include <fcntl.h>
+
+#define NONAMELESSUNION
+#define NONAMELESSSTRUCT
+#include "windef.h"
+#include "winbase.h"
+#include "winnt.h"
+
+#include "winedump.h"
+
+#include <pshpack1.h>
+typedef struct
+{
+    INT16 dfType;
+    INT16 dfPoints;
+    INT16 dfVertRes;
+    INT16 dfHorizRes;
+    INT16 dfAscent;
+    INT16 dfInternalLeading;
+    INT16 dfExternalLeading;
+    BYTE  dfItalic;
+    BYTE  dfUnderline;
+    BYTE  dfStrikeOut;
+    INT16 dfWeight;
+    BYTE  dfCharSet;
+    INT16 dfPixWidth;
+    INT16 dfPixHeight;
+    BYTE  dfPitchAndFamily;
+    INT16 dfAvgWidth;
+    INT16 dfMaxWidth;
+    BYTE  dfFirstChar;
+    BYTE  dfLastChar;
+    BYTE  dfDefaultChar;
+    BYTE  dfBreakChar;
+    INT16 dfWidthBytes;
+    LONG  dfDevice;
+    LONG  dfFace;
+    LONG  dfBitsPointer;
+    LONG  dfBitsOffset;
+    BYTE  dfReserved;
+    /* Fields, introduced for Windows 3.x fonts */
+    LONG  dfFlags;
+    INT16 dfAspace;
+    INT16 dfBspace;
+    INT16 dfCspace;
+    LONG  dfColorPointer;
+    LONG  dfReserved1[4];
+} FONTINFO16;
+
+typedef struct
+{
+    SHORT dfVersion;		/* Version */
+    LONG dfSize;		/* Total File Size */
+    char dfCopyright[60];	/* Copyright notice */
+    FONTINFO16 fi;		/* FONTINFO structure */
+} WINFNT;
+#include <poppack.h>
+
+/* FIXME: recognize and dump also NE/PE wrapped fonts */
+
+enum FileSig get_kind_fnt(void)
+{
+    const WINFNT *fnt = PRD(0, sizeof(WINFNT));
+    if (fnt && (fnt->dfVersion == 0x200 || fnt->dfVersion == 0x300) &&
+        PRD(0, fnt->dfSize) != NULL)
+        return SIG_FNT;
+    return SIG_UNKNOWN;
+}
+
+void fnt_dump(void)
+{
+    const WINFNT *fnt = PRD(0, sizeof(WINFNT));
+
+    printf("dfVersion %#x, dfSize %d bytes, dfCopyright %.60s\n",
+        fnt->dfVersion, fnt->dfSize, fnt->dfCopyright);
+    printf("dfType %d\n"
+        "dfPoints %d\n"
+        "dfVertRes %d\n"
+        "dfHorizRes %d\n"
+        "dfAscent %d\n"
+        "dfInternalLeading %d\n"
+        "dfExternalLeading %d\n"
+        "dfItalic %d\n"
+        "dfUnderline %d\n"
+        "dfStrikeOut %d\n"
+        "dfWeight %d\n"
+        "dfCharSet %d\n"
+        "dfPixWidth %d\n"
+        "dfPixHeight %d\n"
+        "dfPitchAndFamily %#x\n"
+        "dfAvgWidth %d\n"
+        "dfMaxWidth %d\n"
+        "dfFirstChar %#x\n"
+        "dfLastChar %#x\n"
+        "dfDefaultChar %#x\n"
+        "dfBreakChar %#x\n"
+        "dfWidthBytes %d\n",
+        fnt->fi.dfType, fnt->fi.dfPoints, fnt->fi.dfVertRes, fnt->fi.dfHorizRes,
+        fnt->fi.dfAscent, fnt->fi.dfInternalLeading, fnt->fi.dfExternalLeading,
+        fnt->fi.dfItalic, fnt->fi.dfUnderline, fnt->fi.dfStrikeOut, fnt->fi.dfWeight,
+        fnt->fi.dfCharSet, fnt->fi.dfPixWidth, fnt->fi.dfPixHeight, fnt->fi.dfPitchAndFamily,
+        fnt->fi.dfAvgWidth, fnt->fi.dfMaxWidth, fnt->fi.dfFirstChar, fnt->fi.dfLastChar,
+        fnt->fi.dfDefaultChar, fnt->fi.dfBreakChar, fnt->fi.dfWidthBytes);
+}
diff --git a/tools/winedump/winedump.h b/tools/winedump/winedump.h
index f71103e..4b89842 100644
--- a/tools/winedump/winedump.h
+++ b/tools/winedump/winedump.h
@@ -217,7 +217,7 @@ char *str_toupper (char *str);
 const char *get_machine_str(int mach);
 
 /* file dumping functions */
-enum FileSig {SIG_UNKNOWN, SIG_DOS, SIG_PE, SIG_DBG, SIG_PDB, SIG_NE, SIG_LE, SIG_MDMP, SIG_COFFLIB, SIG_LNK, SIG_EMF};
+enum FileSig {SIG_UNKNOWN, SIG_DOS, SIG_PE, SIG_DBG, SIG_PDB, SIG_NE, SIG_LE, SIG_MDMP, SIG_COFFLIB, SIG_LNK, SIG_EMF, SIG_FNT};
 
 const void*	PRD(unsigned long prd, unsigned long len);
 unsigned long	Offset(const void* ptr);
@@ -252,6 +252,8 @@ enum FileSig    get_kind_emf(void);
 void            emf_dump( void );
 enum FileSig    get_kind_pdb(void);
 void            pdb_dump(void);
+enum FileSig    get_kind_fnt(void);
+void            fnt_dump( void );
 int             codeview_dump_symbols(const void* root, unsigned long size);
 int             codeview_dump_types_from_offsets(const void* table, const DWORD* offsets, unsigned num_types);
 int             codeview_dump_types_from_block(const void* table, unsigned long len);




More information about the wine-cvs mailing list