Sweden-Number/tools/winedump/font.c

128 lines
3.6 KiB
C

/*
* 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 <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#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);
}