/*
 ллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл
 лл                                                                         лл
 лл                    Copyright (C) 1999 Symantec Corp.                    лл
 лл                           All Rights Reserved                           лл
 лл                                                                         лл
 лл      Information in this file is proprietary and confidential, and      лл
 лл        may not be copied, reproduced or distributed in any manner       лл
 лл     without the express written permission of Symantec Corp.            лл
 лл                                                                         лл
 ллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл
*/

#ifndef _INC_VXPRINT
   #define _INC_VXPRINT

#ifndef _INC_WINDOWS
   #include <windows.h>
#endif

#ifndef WIN32
   #ifndef _INC_PRINT                  // Dependent upon print.h for DEVMODE
      #include <print.h>               // Standard SDK 3.1 header
   #endif
#else
   #ifndef _WINDGDI_                   // Dependent upon WINGDI for DEVMODE
      #include <wingdi.h>              // WIN32 SDK header
   #endif
#endif

#ifndef  _INC_GPWIN
   #include <gpwin.h>
#endif

#ifndef WIN32
   #ifndef _INC_PRINT                  // Dependent upon print.h for DEVMODE
      #include <print.h>               // Standard SDK 3.1 header
   #endif
#else
   #ifndef _WINDGDI_                   // Dependent upon WINGDI for DEVMODE
      #include <wingdi.h>              // WIN32 SDK header
   #endif
#endif

#define MAXFONTCACHE    20
#define MAXTABS         12

#ifndef GLOBAL_HANDLE
#ifdef WIN32
#define GLOBAL_HANDLE(lptr) GlobalHandle(lptr)
#else
#define GLOBAL_HANDLE(lptr) ((HGLOBAL) LOWORD(GlobalHandle((__segment)lptr)))
#endif
#endif

#ifndef MAXFILENAME
   #define MAXFILENAME  260
#endif

typedef struct
{
   float  left;
   float  right;
   float  top;
   float  bottom;
} VXPMARGIN;

typedef struct
{
   int         HorzRes;                //Available Res after margins
   int         VertRes;                //Available Vert Res after margins
   int         LogPixelX;              //Logical Pixels / inch
   int         LogPixelY;              //Logical Pixels / inch (Vert)
} VXPRINTERINFO;

typedef struct
{
   int         charWidths[256];        //Character widths for selected font
   LOGFONT     lf;                     //Logfont structure associated with the device
   BYTE        nCols;                  //Number of columns
   BYTE        bSingleHigh;            //Single high or not
   HFONT       hFont;                  //Font Currently Selected
   LONG        nLineHeight;            //Line Height;
}  FONTCACHE;
// changed from byte to short (need line heights > 255)

typedef struct print_tag
{
   BYTE        bInUse;                 //Device in use flag
   BYTE        bDeviceFixed;           //Device is fixed now. Cannot change Device
   BYTE        bSpoolError;            //Spooler had error for this job - dont generate any more
   LPDEVMODE   lpdm;                   //Devmode
   LPDEVNAMES  lpdn;                   //Device Name, driver, port
   HDC         hPrnDC;                 //Printer DC
   BYTE        nRawMode;               //Raw or non Raw or Pseudo Raw
   int         nPage;                  //Current Page Number
   POINT       Pt;                     //Current rendering of text
   HDC         hDC;                    //Metafile DC of current page
   char        szBaseName[MAXFILENAME];//Base metafile Name/raw print file name
   VXPMARGIN   pageMargin;             //Page Margin
   char        szHeader[66];           //Header string for every page
   char        szFooter[66];           //Footer for every page
   BYTE        szCurLine[257];         //Overflow of characters into next line
   BYTE        nCurPos;                //Current position in current line
   UINT        fuAlign;                //Alignment flag
   float       fTabs[MAXTABS];         //Tab positions
   BYTE        nTabs;                  //Number of tab positions
   VXPRINTERINFO printerInfo;          //Printer Resolution etc.
   FONTCACHE   fc[MAXFONTCACHE];       //Font cache - to avoid multiple selection of same font
                                       //into printer DC to get text metrics
   int         nfc;                    //Number of fonts cached
   int         nCurFont;               //Currently selected font
   BOOL        bReleaseMem;            //TRUE if default printer was used and we alloced DEVMODE.
   HWND        hWnd;                   //Hwnd to notify, NULL if notify disabled.
} VXPRINT, *PVXPRINT, FAR *LPVXPRINT;

typedef int HVXP;
typedef HVXP *PHVXP;
typedef HVXP FAR *LPHVXP;

#define VXP_ERROR     (-1)

#define VXP_MAX         5

#define VXP_NONRAW      0
#define VXP_RAW         1
#define VXP_PSEUDO_RAW  2

//Message ID's for messages to Print Spooler

#define VXP_OPENSERVER     1000
#define VXP_STARTDOC       1001
#define VXP_ENDDOC         1002
#define VXP_PAGE           1003
#define VXP_CANCEL         1004

#define PWSPOOL_PAGEDONE   2000

#define IDS_PRNSPOOLERR    100
#define IDS_WORDBREAK      101
#define IDS_VXPMEMORYERROR 102

#ifdef   __cplusplus
extern "C" {
#endif

EXPORTED HVXP  FAR PASCAL VXPOpen(LPDEVMODE lpDevMode, LPDEVNAMES lpDevName, int nRaw);
EXPORTED HVXP  FAR PASCAL VXPOpenWithNotify ( LPDEVMODE lpDevMode, LPDEVNAMES lpDevName, int nRaw, HWND hWnd );
EXPORTED int   FAR PASCAL VXPStartPage(HVXP nHandle);
EXPORTED int   FAR PASCAL VXPEndPage(HVXP nHandle);
EXPORTED int   FAR PASCAL VXPClose(HVXP nHandle);
EXPORTED HDC   FAR PASCAL VXPGetDC(HVXP nHandle);
EXPORTED void  FAR PASCAL VXPGetDevmode(HVXP nHandle, LPDEVMODE lpdm);
EXPORTED void  FAR PASCAL VXPSetDevmode(HVXP nHandle, LPDEVMODE lpdm);
EXPORTED void  FAR PASCAL VXPSetHeader(HVXP nHandle, LPSTR lpHeader);
EXPORTED void  FAR PASCAL VXPSetFooter(HVXP nHandle, LPSTR lpFooter);
EXPORTED VOID  FAR PASCAL VXPSetFont(HVXP nHandle, LOGFONT FAR *lpFont);
EXPORTED VOID  FAR PASCAL VXPGetFont(HVXP nHandle, LOGFONT FAR *lpFont);
EXPORTED VOID  FAR PASCAL VXPSetTermFont(HVXP nHandle, LOGFONT FAR *lpFont, int nCols, BOOL bSingleHeight);
EXPORTED VOID  FAR PASCAL VXPCancel(HVXP nHandle);
EXPORTED int   FAR PASCAL VXPPrintLine(HVXP nHandle, LPSTR lpStr, int nChars);
EXPORTED int   FAR PASCAL VXPPrintChars(HVXP nHandle, LPSTR lpStr, int nChars);
EXPORTED int   FAR PASCAL VXPNewLine(HVXP nHandle);
EXPORTED int   FAR PASCAL VXPSetMargins(HVXP nHandle, float left, float top, float right, float bottom);
EXPORTED BOOL  FAR PASCAL VXPPrintFit(int nHandle, LPSTR lpStr, int nChars);
EXPORTED VOID  FAR PASCAL VXPDeleteFiles(LPSTR lpFile);
EXPORTED int   FAR PASCAL VXPExpandTabs(LPSTR lpStr, int nChars, LPSTR lpDest, int nPos);
EXPORTED UINT  FAR PASCAL VXPSetTextAlign(int nHandle, UINT fuAlign);
EXPORTED HVXP  FAR PASCAL VXPGetHVXPFromHDC ( HDC hPrinterDC );

EXPORTED void  FAR PASCAL VXPGetPageRect(HVXP nHandle, LPRECT lpRect);
EXPORTED void  FAR PASCAL VXPSetXPos(HVXP nHandle, int iNewXPos);
EXPORTED int   FAR PASCAL VXPGetXPos(HVXP nHandle);
EXPORTED int   FAR PASCAL VXPGetYPos(HVXP nHandle);
EXPORTED int   FAR PASCAL VXPGetLineHeight(HVXP nHandle);

EXPORTED void  FAR PASCAL VXPSetTabs(HVXP nHandle, float far *fTabs, int nTabs);
EXPORTED int   FAR PASCAL VXPTabbedTextOut(HVXP nHandle, LPSTR lpStr, int nChars);
EXPORTED COLORREF FAR PASCAL VXPSetTextColor(HVXP nHandle, COLORREF clr);
EXPORTED COLORREF FAR PASCAL VXPSetBkColor(HVXP nHandle, COLORREF clr);
EXPORTED void  FAR PASCAL VXPFreeEntry(HVXP nHandle);

BOOL IsDevnameDefault(LPDEVNAMES lpDevName);

EXPORTED HVXP  CALLBACK VXPOpenWithNotify ( LPDEVMODE lpDevMode, LPDEVNAMES lpDevName, int nRaw, HWND hWnd );

#ifdef   __cplusplus
}
#endif   // #ifdef   __cplusplus

#endif   // _INC_VXPRINT
