/*
 * 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);
}
