tools/winedump: Add an ability to dump font files.
Dmitry Timoshkov
dmitry at codeweavers.com
Mon May 11 06:56:23 CDT 2009
---
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(-)
create mode 100644 tools/winedump/font.c
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);
--
1.6.2.4
More information about the wine-patches
mailing list