/*
 * X11 physical font definitions
 *
 * Copyright 1997 Alex Korobka
 *
 * 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
 */

#ifndef __WINE_X11FONT_H
#define __WINE_X11FONT_H

#include "wine/wingdi16.h"
#include "x11drv.h"
#include "pshpack1.h"

/* this is a part of the font resource header, should
 * make it easier to implement dynamic softfont loading */

typedef struct
{
    INT16	dfType;
    INT16	dfPoints;
    INT16	dfVertRes;
    INT16	dfHorizRes;
    INT16	dfAscent;
    INT16	dfInternalLeading;
    INT16	dfExternalLeading;
    CHAR	dfItalic;
    CHAR	dfUnderline;
    CHAR	dfStrikeOut;
    INT16	dfWeight;
    BYTE	dfCharSet;
    INT16	dfPixWidth;
    INT16	dfPixHeight;
    CHAR	dfPitchAndFamily;
    INT16	dfAvgWidth;
    INT16	dfMaxWidth;
    CHAR	dfFirstChar;
    CHAR	dfLastChar;
    CHAR	dfDefaultChar;
    CHAR	dfBreakChar;
    INT16	dfWidthBytes;
    LPCSTR	dfDevice;
    LPCSTR	dfFace;
} IFONTINFO16, *LPIFONTINFO16;

#include "poppack.h"

/* internal flags */

#define FI_POLYWEIGHT	    0x0001
#define FI_POLYSLANT 	    0x0002
#define FI_OBLIQUE	    0x0004
#define FI_SCALABLE  	    0x0008
#define FI_FW_BOOK	    0x0010
#define FI_FW_DEMI	    0x0020
#define FI_VARIABLEPITCH    0x0040
#define FI_FIXEDPITCH       0x0080

#define FI_FIXEDEX	    0x1000
#define FI_NORMAL	    0x2000
#define FI_SUBSET 	    0x4000
#define FI_TRUETYPE	    0x8000

/* code pages */

#define FI_ENC_ANSI		0
#define FI_ENC_ISO8859	    	1
#define FI_ENC_ISO646		2
#define FI_ENC_MICROSOFT	3
#define FI_ENC_KOI8		4
#define FI_ENC_ASCII		5
#define FI_ENC_VISCII		6
#define FI_ENC_TCVN		7
#define FI_ENC_TIS620		8

enum X11DRV_CPTABLE
{
    X11DRV_CPTABLE_SBCS,
    X11DRV_CPTABLE_UNICODE,
    X11DRV_CPTABLE_CP932,
    X11DRV_CPTABLE_CP936,
    X11DRV_CPTABLE_CP949,
    X11DRV_CPTABLE_CP950,
    X11DRV_CPTABLE_SYMBOL,
    X11DRV_CPTABLE_COUNT
};

typedef struct tagFontInfo
{
    struct tagFontInfo*		next;
    UINT16			fi_flags;
    UINT16			fi_encoding;
    UINT16			codepage;
    UINT16			cptable;
    WORD			internal_charset;

 /* LFD parameters can be quite different from the actual metrics */

    UINT16			lfd_height;
    UINT16			lfd_resolution;
    IFONTINFO16			df;
} fontInfo;

/* Font resource list for EnumFont() purposes */

#define FR_SOFTFONT         0x1000              /* - .FON or .FOT file */
#define FR_SOFTRESOURCE     0x2000              /* - resource handle */
#define FR_REMOVED          0x4000              /* delayed remove */
#define FR_NAMESET          0x8000

#define LFD_FIELDS 14
typedef struct
{
    const char* foundry;
    const char* family;
    const char* weight;
    const char* slant;
    const char* set_width;
    const char* add_style;
    const char* pixel_size;
    const char* point_size;
    const char* resolution_x;
    const char* resolution_y;
    const char* spacing;
    const char* average_width;
    const char* charset_registry;
    const char* charset_encoding;
} LFD;

typedef struct tagFontResource
{
  struct tagFontResource*	next;
  UINT16			fr_flags;
  UINT16			fr_penalty;
  UINT16			fi_count;
  UINT16			fo_count;
  fontInfo*			fi;
  LFD*                          resource;
  HANDLE			hOwner;		/*  For FR_SOFTFONT/FR_SOFTRESOURCE fonts */
  CHAR				lfFaceName[LF_FACESIZE];
} fontResource;

typedef struct {
  float		a,b,c,d;	/* pixelsize matrix, FIXME: switch to MAT2 format */
  unsigned long	RAW_ASCENT;
  unsigned long	RAW_DESCENT;
  float		pixelsize;
  float		ascent;
  float		descent;
} XFONTTRANS;

#define FO_RESOURCE_MASK	0x000F
#define FO_SYSTEM		0x0001		/* resident in cache */
#define FO_SOFTFONT		0x0002		/* installed at runtime */
#define FO_SHARED		0x0004		/* MITSHM */
#define FO_REMOVED		0x0008		/* remove when count falls to 0 */

#define FO_MATCH_MASK		0x00F0
#define FO_MATCH_NORASTER	0x0010
#define FO_MATCH_PAF		0x0020
#define FO_MATCH_XYINDEP	0x0040

#define FO_SYNTH_MASK		0xFF00
#define FO_SYNTH_HEIGHT   	0x2000
#define FO_SYNTH_WIDTH		0x4000
#define FO_SYNTH_ROTATE 	0x8000
#define FO_SYNTH_BOLD		0x0100
#define FO_SYNTH_ITALIC		0x0200
#define FO_SYNTH_UNDERLINE	0x0400
#define FO_SYNTH_STRIKEOUT	0x0800

/* Realized screen font */

#define	X11FONT_REFOBJS_MAX		4

typedef struct
{
  XFontStruct*          fs;			/* text metrics */
  fontResource*         fr;			/* font family */
  fontInfo*		fi;			/* font instance info */
  Pixmap*               lpPixmap;		/* optional character bitmasks for synth fonts */
  X_PHYSFONT		prefobjs[X11FONT_REFOBJS_MAX];	/* font objects for DBCS charsets */

  XFONTTRANS		*lpX11Trans;		/* Info for X11R6 transform */
  float                 rescale;                /* Rescale for large fonts */
  INT16			foInternalLeading;
  INT16			foAvgCharWidth;
  INT16			foMaxCharWidth;
  UINT16		fo_flags;

  /* font cache housekeeping */

  UINT16                count;
  UINT16                lru;
  UINT16                lfchecksum;
  LOGFONT16             lf;
} fontObject;

typedef struct
{
  fontResource*		pfr;
  fontInfo*		pfi;
  UINT16		height;
  UINT16		flags;
  LPLOGFONT16		plf;
  WORD			internal_charset;
} fontMatch;

extern fontObject* XFONT_GetFontObject( X_PHYSFONT pFont );
extern XFontStruct* XFONT_GetFontStruct( X_PHYSFONT pFont );
extern LPIFONTINFO16 XFONT_GetFontInfo( X_PHYSFONT pFont );

/* internal charset(hibyte must be set) */
/* lobyte is DEFAULT_CHARSET(=0). */
#define X11FONT_JISX0201_CHARSET	0x100
#define X11FONT_JISX0212_CHARSET	0x200

typedef struct tagX11DRV_CP
{
    WORD (*penum_subfont_charset)( UINT index );
    XChar2b* (*punicode_to_char2b)( fontObject* pfo,
                                    LPCWSTR lpwstr, UINT count );
    void (*pDrawString)( fontObject* pfo, Display* pdisp, Drawable d, GC gc,
                         int x, int y, XChar2b* pstr, int count );
    int (*pTextWidth)( fontObject* pfo, XChar2b* pstr, int count );
    void (*pDrawText)( fontObject* pfo, Display* pdisp, Drawable d, GC gc,
                       int x, int y, XTextItem16* pitems, int count );
    void (*pTextExtents)( fontObject* pfo, XChar2b* pstr, int count,
                          int* pdir, int* pascent, int* pdescent,
                          int* pwidth );
    void (*pGetTextMetricsW)( fontObject* pfo, LPTEXTMETRICW pTM );
} X11DRV_CP;

extern const X11DRV_CP X11DRV_cptable[X11DRV_CPTABLE_COUNT];

#endif /* __WINE_X11FONT_H */