/*
 * 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>

#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);
}
