/***************************************************************************\
*
* Module Name: OS2DEF.H
*
* OS/2 Common Definitions file
*
* Copyright (c) International Business Machines Corporation 1981, 1988-1990
*
\***************************************************************************/

/* XLATOFF */
#define PASCAL  pascal
#define FAR     far
#define NEAR    near
#define VOID    void
/* XLATON */

typedef unsigned short SHANDLE;
typedef void far      *LHANDLE;

/* XLATOFF */
#define EXPENTRY pascal far _loadds
#define APIENTRY pascal far

#define CHAR    char            /* ch  */
#define SHORT   short           /* s   */
#define LONG    long            /* l   */
#ifndef INCL_SAADEFS
#define INT     int             /* i   */
#endif /* !INCL_SAADEFS */
/* XLATON */

typedef unsigned char UCHAR;    /* uch */
typedef unsigned short USHORT;  /* us  */
typedef unsigned long ULONG;    /* ul  */
#ifndef INCL_SAADEFS
typedef unsigned int  UINT;     /* ui  */
#endif /* !INCL_SAADEFS */

typedef unsigned char BYTE;     /* b   */

/* define NULL pointer value */
/* Echo the format of the ifdefs that stdio.h uses */

#if (defined(M_I86SM) || defined(M_I86MM))
#define  NULL    0
#else
#if (defined(M_I86L) || defined(M_I86CM) || defined(M_I86LM) || defined(M_I86HM))
#define  NULL    0L
#else
#define  NULL    0
#endif
#endif

typedef unsigned char far  *PSZ;
typedef unsigned char near *NPSZ;

typedef unsigned char far  *PCH;
typedef unsigned char near *NPCH;

typedef int   (pascal far  *PFN)();
typedef int   (pascal near *NPFN)();

typedef BYTE   FAR  *PBYTE;
typedef BYTE   near *NPBYTE;

typedef CHAR   FAR *PCHAR;
typedef SHORT  FAR *PSHORT;
typedef LONG   FAR *PLONG;
#ifndef INCL_SAADEFS
typedef INT    FAR *PINT;
#endif /* !INCL_SAADEFS */

typedef UCHAR  FAR *PUCHAR;
typedef USHORT FAR *PUSHORT;
typedef ULONG  FAR *PULONG;
#ifndef INCL_SAADEFS
typedef UINT   FAR *PUINT;
#endif /* !INCL_SAADEFS */

typedef VOID   FAR *PVOID;

typedef unsigned short BOOL;    /* f   */
typedef BOOL FAR *PBOOL;

#define FALSE   0
#define TRUE    1

#ifndef INCL_SAADEFS
typedef unsigned short SEL;     /* sel */
typedef SEL FAR *PSEL;

/*** Useful Helper Macros */

/* Create untyped far pointer from selector and offset */
#define MAKEP(sel, off)     ((PVOID)MAKEULONG(off, sel))

/* Extract selector or offset from far pointer */
#define SELECTOROF(p)       (((PUSHORT)&(p))[1])
#define OFFSETOF(p)         (((PUSHORT)&(p))[0])
#endif  /* !INCL_SAADEFS */

/* Cast any variable to an instance of the specified type. */
#define MAKETYPE(v, type)   (*((type far *)&v))

/* Calculate the byte offset of a field in a structure of type type. */
#define FIELDOFFSET(type, field)    ((SHORT)&(((type *)0)->field))

/* Combine l & h to form a 32 bit quantity. */
#define MAKEULONG(l, h)  ((ULONG)(((USHORT)(l)) | ((ULONG)((USHORT)(h))) << 16))
#define MAKELONG(l, h)   ((LONG)MAKEULONG(l, h))

/* Combine l & h to form a 16 bit quantity. */
#define MAKEUSHORT(l, h) (((USHORT)(l)) | ((USHORT)(h)) << 8)
#define MAKESHORT(l, h)  ((SHORT)MAKEUSHORT(l, h))

/* Extract high and low order parts of 16 and 32 bit quantity */
#define LOBYTE(w)       LOUCHAR(w)
#define HIBYTE(w)       HIUCHAR(w)
#define LOUCHAR(w)      ((UCHAR)(w))
#define HIUCHAR(w)      ((UCHAR)(((USHORT)(w) >> 8) & 0xff))
#define LOUSHORT(l)     ((USHORT)(l))
#define HIUSHORT(l)     ((USHORT)(((ULONG)(l) >> 16) & 0xffff))

/*** Common Error definitions ****/

typedef ULONG ERRORID;  /* errid */
typedef ERRORID FAR *PERRORID;

/* Combine severity and error code to produce ERRORID */
#define MAKEERRORID(sev, error) (ERRORID)(MAKEULONG((error), (sev)))
/* Extract error number from an errorid */
#define ERRORIDERROR(errid)            (LOUSHORT(errid))
/* Extract severity from an errorid */
#define ERRORIDSEV(errid)              (HIUSHORT(errid))

/* Severity codes */
#define SEVERITY_NOERROR           0x0000
#define SEVERITY_WARNING           0x0004
#define SEVERITY_ERROR             0x0008
#define SEVERITY_SEVERE            0x000C
#define SEVERITY_UNRECOVERABLE     0x0010

/* Base component error values */

#define WINERR_BASE                0x1000  /* Window Manager                  */
#define GPIERR_BASE                0x2000  /* Graphics Presentation Interface */
#define DEVERR_BASE                0x3000  /* Device Manager                  */
#define SPLERR_BASE                0x4000  /* Spooler                         */

/*** Common types used across components */

/*** Common DOS types */

typedef USHORT    HMODULE;  /* hmod */
typedef HMODULE FAR *PHMODULE;

#ifndef INCL_SAADEFS
typedef USHORT    PID;      /* pid  */
typedef PID FAR *PPID;

typedef USHORT    TID;      /* tid  */
typedef TID FAR *PTID;

typedef VOID FAR *HSEM;     /* hsem */
typedef HSEM FAR *PHSEM;
#endif  /* !INCL_SAADEFS */

/*** Common SUP types */

typedef LHANDLE   HAB;      /* hab  */
typedef HAB FAR *PHAB;

/*** Common GPI/DEV types */

typedef LHANDLE   HPS;      /* hps  */
typedef HPS FAR *PHPS;

typedef LHANDLE   HDC;      /* hdc  */
typedef HDC FAR *PHDC;

typedef LHANDLE   HRGN;     /* hrgn */
typedef HRGN FAR *PHRGN;

typedef LHANDLE   HBITMAP;  /* hbm  */
typedef HBITMAP FAR *PHBITMAP;

typedef LHANDLE   HMF;      /* hmf  */
typedef HMF FAR *PHMF;

typedef LONG     COLOR;     /* clr  */
typedef COLOR FAR *PCOLOR;

typedef struct _POINTL {    /* ptl  */
    LONG    x;
    LONG    y;
} POINTL;
typedef POINTL  FAR  *PPOINTL;
typedef POINTL  near *NPPOINTL;

typedef struct _POINTS {    /* pts */
    SHORT   x;
    SHORT   y;
} POINTS;
typedef POINTS FAR *PPOINTS;

typedef struct _RECTL {     /* rcl */
    LONG    xLeft;
    LONG    yBottom;
    LONG    xRight;
    LONG    yTop;
} RECTL;
typedef RECTL FAR  *PRECTL;
typedef RECTL near *NPRECTL;

typedef CHAR STR8[8];       /* str8 */
typedef STR8 FAR *PSTR8;

/*** common DEV/SPL types */

/* structure for Device Driver data */

typedef struct _DRIVDATA {  /* driv */
    LONG    cb;
    LONG    lVersion;
    CHAR    szDeviceName[32];
    CHAR    abGeneralData[1];
} DRIVDATA;
typedef DRIVDATA far *PDRIVDATA;

/* array indices for array parameter for DevOpenDC, SplQmOpen or SplQpOpen */

#define ADDRESS          0
#ifndef INCL_SAADEFS
#define DRIVER_NAME      1
#define DRIVER_DATA      2
#define DATA_TYPE        3
#define COMMENT          4
#define PROC_NAME        5
#define PROC_PARAMS      6
#define SPL_PARAMS       7
#define NETWORK_PARAMS   8
#endif  /* !INCL_SAADEFS */

/* structure definition as an alternative of the array parameter */

typedef struct _DEVOPENSTRUC { /* dop */
    PSZ        pszLogAddress;
    PSZ        pszDriverName;
    PDRIVDATA  pdriv;
    PSZ        pszDataType;
    PSZ        pszComment;
    PSZ        pszQueueProcName;
    PSZ        pszQueueProcParams;
    PSZ        pszSpoolerParams;
    PSZ        pszNetworkParams;
} DEVOPENSTRUC;
typedef DEVOPENSTRUC FAR *PDEVOPENSTRUC;

/*** common AVIO/GPI types */

/* values of fsSelection field of FATTRS structure */
#define FATTR_SEL_ITALIC           0x0001
#define FATTR_SEL_UNDERSCORE       0x0002
#define FATTR_SEL_OUTLINE          0x0008          /* Hollow Outline Font */
#define FATTR_SEL_STRIKEOUT        0x0010
#define FATTR_SEL_BOLD             0x0020

/* values of fsType field of FATTRS structure */
#define FATTR_TYPE_KERNING         0x0004
#define FATTR_TYPE_MBCS            0x0008
#define FATTR_TYPE_DBCS            0x0010
#define FATTR_TYPE_ANTIALIASED     0x0020

/* values of fsFontUse field of FATTRS structure */
#define FATTR_FONTUSE_NOMIX         0x0002
#define FATTR_FONTUSE_OUTLINE       0x0004
#define FATTR_FONTUSE_TRANSFORMABLE 0x0008


/* size for fields in the font structures */

#define FACESIZE 32

/* font struct for Vio/GpiCreateLogFont */

typedef struct _FATTRS {    /* fat */
    USHORT  usRecordLength;
    USHORT  fsSelection;
    LONG    lMatch;
    CHAR    szFacename[FACESIZE];
    USHORT  idRegistry;
    USHORT  usCodePage;
    LONG    lMaxBaselineExt;
    LONG    lAveCharWidth;
    USHORT  fsType;
    USHORT  fsFontUse;
} FATTRS;
typedef FATTRS far *PFATTRS;

/* values of fsType field of FONTMETRICS structure */
#define FM_TYPE_FIXED              0x0001
#define FM_TYPE_LICENSED           0x0002
#define FM_TYPE_KERNING            0x0004
#define FM_TYPE_DBCS               0x0010
#define FM_TYPE_MBCS               0x0018
#define FM_TYPE_64K                0x8000

/* values of fsDefn field of FONTMETRICS structure */
#define FM_DEFN_OUTLINE            0x0001
#define FM_DEFN_GENERIC            0x8000

/* values of fsSelection field of FONTMETRICS structure */
#define FM_SEL_ITALIC              0x0001
#define FM_SEL_UNDERSCORE          0x0002
#define FM_SEL_NEGATIVE            0x0004
#define FM_SEL_OUTLINE             0x0008          /* Hollow Outline Font */
#define FM_SEL_STRIKEOUT           0x0010
#define FM_SEL_BOLD                0x0020

/* values of fsCapabilities field of FONTMETRICS structure */
#define FM_CAP_NOMIX               0x0001

/* font metrics returned by GpiQueryFonts and others */

typedef struct _FONTMETRICS { /* fm */
    CHAR    szFamilyname[FACESIZE];
    CHAR    szFacename[FACESIZE];
    USHORT  idRegistry;
    USHORT  usCodePage;
    LONG    lEmHeight;
    LONG    lXHeight;
    LONG    lMaxAscender;
    LONG    lMaxDescender;
    LONG    lLowerCaseAscent;
    LONG    lLowerCaseDescent;
    LONG    lInternalLeading;
    LONG    lExternalLeading;
    LONG    lAveCharWidth;
    LONG    lMaxCharInc;
    LONG    lEmInc;
    LONG    lMaxBaselineExt;
    SHORT   sCharSlope;
    SHORT   sInlineDir;
    SHORT   sCharRot;
    USHORT  usWeightClass;
    USHORT  usWidthClass;
    SHORT   sXDeviceRes;
    SHORT   sYDeviceRes;
    SHORT   sFirstChar;
    SHORT   sLastChar;
    SHORT   sDefaultChar;
    SHORT   sBreakChar;
    SHORT   sNominalPointSize;
    SHORT   sMinimumPointSize;
    SHORT   sMaximumPointSize;
    USHORT  fsType;
    USHORT  fsDefn;
    USHORT  fsSelection;
    USHORT  fsCapabilities;
    LONG    lSubscriptXSize;
    LONG    lSubscriptYSize;
    LONG    lSubscriptXOffset;
    LONG    lSubscriptYOffset;
    LONG    lSuperscriptXSize;
    LONG    lSuperscriptYSize;
    LONG    lSuperscriptXOffset;
    LONG    lSuperscriptYOffset;
    LONG    lUnderscoreSize;
    LONG    lUnderscorePosition;
    LONG    lStrikeoutSize;
    LONG    lStrikeoutPosition;
    SHORT   sKerningPairs;
    SHORT   sFamilyClass;
    LONG    lMatch;
} FONTMETRICS;
typedef FONTMETRICS far *PFONTMETRICS;

/*** Common WIN types */

typedef LHANDLE HWND;       /* hwnd */
typedef HWND FAR *PHWND;

typedef struct _WRECT {     /* wrc */
    SHORT   xLeft;
    SHORT   dummy1;
    SHORT   yBottom;
    SHORT   dummy2;
    SHORT   xRight;
    SHORT   dummy3;
    SHORT   yTop;
    SHORT   dummy4;
} WRECT;
typedef WRECT FAR *PWRECT;
typedef WRECT near *NPWRECT;

typedef struct _WPOINT {    /* wpt */
    SHORT   x;
    SHORT   dummy1;
    SHORT   y;
    SHORT   dummy2;
} WPOINT;
typedef WPOINT FAR *PWPOINT;
typedef WPOINT near *NPWPOINT;
