// The following ifdef block is the standard way of creating macros which make exporting 
// from a DLL simpler. All files within this DLL are compiled with the BARCODE_EXPORTS
// symbol defined on the command line. this symbol should not be defined on any project
// that uses this DLL. This way any other project whose source files include this file see 
// BARCODE_API functions as being imported from a DLL, wheras this DLL sees symbols
// defined with this macro as being exported.
#ifdef PRINTDC_EXPORTS
	#define PRINTDC_API extern "C" __declspec(dllexport)
#else
	#ifdef __cplusplus
//		#define PRINTDC_API __declspec(dllimport)
		#define PRINTDC_API extern "C" __declspec(dllimport)
	#else
		#define PRINTDC_API __declspec(dllimport)
	#endif
#endif

extern HDC PDC_hPrinterDC;
extern BOOL CheckPrintDC();
/*
extern int savPR_LeftMgn;
extern int savPR_TopMgn;
extern int savPR_RightMgn;
extern int savPR_BottomMgn;
extern int savPR_PgWidth;
extern int savPR_PgHeight;
*/
extern HGDIOBJ savBitmapObject;
extern HDC CompatibleHDC;
extern HDC savhPrDC;
extern int BkMode;
extern int ROP;
extern COLORREF TextColor,BkColor;
extern HFONT hFirstFont;
extern HFONT hSystemFont;

//-------------------------------------------------------------------------------
//-------------------------------------------------------------------------------
//Include certain printer defines and structs 

//Turn this on for W32 -> App side (not PrintDC side)
#if defined(_WIN32_WCE)
#ifndef PRDC_GLOB
#define PRDC_GLOB

//-------------------------------
#ifndef PD_SELECTPORTRAIT

typedef UINT (APIENTRY *LPPRINTHOOKPROC) (HWND, UINT, WPARAM, LPARAM);
typedef struct tagPD  {
   DWORD            cbStruct;
   HWND             hwndOwner;
   HDC              hdc;
   DWORD            dwFlags;
   RECT             rcMinMargin;
   RECT             rcMargin;
   HINSTANCE        hinst;
   LPARAM           lCustData;
   LPPRINTHOOKPROC  pfnPrintHook;
   LPCTSTR          pszPrintTemplateName;
   HGLOBAL          hglbPrintTemplateResource;
} PRINTDLG , *LPPRINTDLG ;
BOOL  APIENTRY     PrintDlg (LPPRINTDLG);
// Out only
#define PD_SELECTALLPAGES                 0x00000001
#define PD_SELECTSELECTION                0x00000002
#define PD_SELECTDRAFTMODE                0x00000008
#define PD_SELECTA4                       0x00000010
#define PD_SELECTLETTER                   0x00000020
#define PD_SELECTINFRARED                 0x00000040 
#define PD_SELECTSERIAL                   0x00000080

// In-Out
#define PD_SELECTPORTRAIT                 0x00040000
#define PD_SELECTLANDSCAPE                0x00080000
#define PD_MARGINS                        0x00100000
#define PD_INTHOUSANDTHSOFINCHES          0x00200000
#define PD_INHUNDREDTHSOFMILLIMETERS      0x00400000
#define PD_MINMARGINS                     0x00800000

#define PD_SELECTPARALLEL				  0x01000000
#define PD_SELECTNETWORK				  0x02000000
#define PD_SELECTLEGAL					  0x04000000
#define PD_SELECTB5						  0x08000000
#define PD_SELECTPRINTINCOLOR			  0x10000000

#define PD_RETURNDEFAULTDC                0x00002000

#define PD_DISABLEPAPERSIZE               0x00000100
#define PD_DISABLEPRINTRANGE              0x00000200
#define PD_DISABLEMARGINS                 0x00000400
#define PD_DISABLEORIENTATION             0x00000800
#endif

//-------------------------------
#ifndef PSD_DEFAULTMINMARGINS
typedef struct tagDEVNAMES {
   WORD wDriverOffset;
   WORD wDeviceOffset;
   WORD wOutputOffset;
   WORD wDefault;
} DEVNAMES;

typedef DEVNAMES * LPDEVNAMES;

#define DN_DEFAULTPRN      0x0001

DWORD APIENTRY     CommDlgExtendedError(VOID);

typedef UINT (APIENTRY* LPPAGEPAINTHOOK)( HWND, UINT, WPARAM, LPARAM );
typedef UINT (APIENTRY* LPPAGESETUPHOOK)( HWND, UINT, WPARAM, LPARAM );

// only wide types supported in CE - include for synchronization with nt .h
typedef struct tagPSDA
{
    DWORD           lStructSize;
    HWND            hwndOwner;
    HGLOBAL         hDevMode;
    HGLOBAL         hDevNames;
    DWORD           Flags;
    POINT           ptPaperSize;
    RECT            rtMinMargin;
    RECT            rtMargin;
    HINSTANCE       hInstance;
    LPARAM          lCustData;
    LPPAGESETUPHOOK lpfnPageSetupHook;
    LPPAGEPAINTHOOK lpfnPagePaintHook;
    LPCSTR          lpPageSetupTemplateName;
    HGLOBAL         hPageSetupTemplate;
} PAGESETUPDLGA, * LPPAGESETUPDLGA;
typedef struct tagPSDW
{
    DWORD           lStructSize;
    HWND            hwndOwner;
    HGLOBAL         hDevMode;
    HGLOBAL         hDevNames;
    DWORD           Flags;
    POINT           ptPaperSize; // ignored in CE
    RECT            rtMinMargin;
    RECT            rtMargin;
    HINSTANCE       hInstance;
    LPARAM          lCustData;
    LPPAGESETUPHOOK lpfnPageSetupHook;
    LPPAGEPAINTHOOK lpfnPagePaintHook; // ignored in CE
    LPCWSTR         lpPageSetupTemplateName;
    HGLOBAL         hPageSetupTemplate;
} PAGESETUPDLGW, * LPPAGESETUPDLGW;
#ifdef UNICODE
typedef PAGESETUPDLGW PAGESETUPDLG;
typedef LPPAGESETUPDLGW LPPAGESETUPDLG;
#else
typedef PAGESETUPDLGA PAGESETUPDLG;
typedef LPPAGESETUPDLGA LPPAGESETUPDLG;
#endif // UNICODE

BOOL APIENTRY PageSetupDlgA( LPPAGESETUPDLGA );
BOOL APIENTRY PageSetupDlgW( LPPAGESETUPDLGW );
#ifdef UNICODE
#define PageSetupDlg  PageSetupDlgW
#else
#define PageSetupDlg  PageSetupDlgA
#endif // !UNICODE

#define PSD_DEFAULTMINMARGINS             0x00000000 // default (printer's)
#define PSD_INWININIINTLMEASURE           0x00000000 // 1st of 4 possible

#define PSD_MINMARGINS                    0x00000001 // use caller's
#define PSD_MARGINS                       0x00000002 // use caller's
#define PSD_INTHOUSANDTHSOFINCHES         0x00000004 // 2nd of 4 possible
#define PSD_INHUNDREDTHSOFMILLIMETERS     0x00000008 // 3rd of 4 possible
#define PSD_DISABLEMARGINS                0x00000010
#define PSD_DISABLEPRINTER                0x00000020
// #define PSD_NOWARNING                  0x00000080 // not used in CE
#define PSD_DISABLEORIENTATION            0x00000100
#define PSD_DISABLEPAPER                  0x00000200
#define PSD_RETURNDEFAULT                 0x00000400
// #define PSD_SHOWHELP                   0x00000800 // not used in CE
#define PSD_ENABLEPAGESETUPHOOK           0x00002000
#define PSD_ENABLEPAGESETUPTEMPLATE       0x00008000
#define PSD_ENABLEPAGESETUPTEMPLATEHANDLE 0x00020000
// #define PSD_ENABLEPAGEPAINTHOOK        0x00040000 // not used in CE
// #define PSD_DISABLEPAGEPAINTING        0x00080000 // not used in CE
// #define PSD_NONETWORKBUTTON            0x00200000 // not used in CE

// new in Win CE - print range flags
#define PSD_DISABLEPRINTRANGE		      0x10000000
#define PSD_RANGESELECTION				  0x20000000

#endif

//-------------------------------
#ifndef SP_ERROR
#define SP_ERROR                     (-1)

#ifdef STRICT
typedef BOOL (CALLBACK* ABORTPROC)(HDC, int);
#else
typedef FARPROC ABORTPROC;
#endif //STRICT
typedef struct _DOCINFOA {
    int     cbSize;
    LPCSTR   lpszDocName;
    LPCSTR   lpszOutput;
    LPCSTR   lpszDatatype;
    DWORD    fwType;
} DOCINFOA, *LPDOCINFOA;

typedef struct _DOCINFOW {
    int     cbSize;
    LPCWSTR  lpszDocName;
    LPCWSTR  lpszOutput;
    LPCWSTR  lpszDatatype;
    DWORD    fwType;
} DOCINFOW, *LPDOCINFOW;

#ifdef UNICODE
typedef DOCINFOW DOCINFO;
typedef LPDOCINFOW LPDOCINFO;
#else
typedef DOCINFOA DOCINFO;
typedef LPDOCINFOA LPDOCINFO;
#endif // UNICODE
#endif // SP_ERROR

#endif //PRDC_GLOB

#endif //_WIN32_WCE


//-------------------------------------------------------------------------------
//-------------------------------------------------------------------------------
PRINTDC_API HDC PDC_GetPrinterDC();
PRINTDC_API int PDC_Init(LPTSTR szInitString);
PRINTDC_API int PDC_UnInit();
PRINTDC_API void PDC_SetReportLevel(long ReportLevel);
PRINTDC_API int PDC_StatusCheck();
PRINTDC_API int PDC_ImagesNotPrinted();
PRINTDC_API int PDC_GetVersion();
PRINTDC_API int PDC_StatusReset();

PRINTDC_API BOOL PDC_PrintDlg(PRINTDLG *lppd);
PRINTDC_API HDC PDC_CreateCompatibleDC(HDC hdc);
PRINTDC_API BOOL PDC_DeleteDC(HDC hdc);
PRINTDC_API int PDC_GetDeviceCaps(HDC hdc,int nIndex);
PRINTDC_API HGDIOBJ PDC_SelectObject(HDC hdc,HGDIOBJ hgdiobj);
PRINTDC_API BOOL PDC_GetTextMetrics(HDC hdc,LPTEXTMETRIC lptm);
PRINTDC_API int PDC_StartDoc(HDC hdc,const DOCINFO * lpdi);
PRINTDC_API int PDC_StartPage(HDC hdc);
PRINTDC_API int PDC_EndPage(HDC hdc);
PRINTDC_API int PDC_EndDoc(HDC hdc);
PRINTDC_API int PDC_KillDoc(HDC hdc);

PRINTDC_API BOOL PDC_ExtTextOut(HDC hdc,int X, int Y, UINT fuOptions, const RECT *lprc, LPCTSTR lpString, UINT cbCount,const int *lpDx);
PRINTDC_API BOOL PDC_Rectangle(HDC hdc,int nLeftRect, int nTopRect, int nRightRect,int nBottomRect);
PRINTDC_API BOOL PDC_GetTextExtentExPoint(HDC hdc,LPCTSTR lpszStr, int cchString,int nMaxExtent,LPINT lpnFit, LPINT alpDx, LPSIZE lpSize);
PRINTDC_API BOOL PDC_GetTextExtentPoint(HDC hdc,LPCTSTR lpszStr, int cbString,LPSIZE lpSize);
PRINTDC_API BOOL PDC_Ellipse(HDC hdc,int nLeftRect, int nTopRect, int nRightRect,int nBottomRect);
PRINTDC_API BOOL PDC_Polyline(HDC hdc,const POINT * lppt, int cPoints);
PRINTDC_API BOOL PDC_RoundRect(HDC hdc,int nLeftRect, int nTopRect, int nRightRect,int nBottomRect, int nWidth, int nHeight);
PRINTDC_API int PDC_SetAbortProc(HDC hdc,ABORTPROC lpAbortProc);
PRINTDC_API BOOL PDC_PageSetupDlg(LPPAGESETUPDLG lppsd );
PRINTDC_API DWORD PDC_GetLastError();
PRINTDC_API BOOL PDC_StretchBlt(HDC hdcDest,int nXOriginDest,int nYOriginDest,int nWidthDest, int nHeightDest, HDC hdcSrc, int nXOriginSrc,int nYOriginSrc, int nWidthSrc, int nHeightSrc, DWORD dwRop);
PRINTDC_API BOOL PDC_BitBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HDC hdcSrc, int nXSrc, int nYSrc, DWORD dwRop);
PRINTDC_API int PDC_SetBkMode(HDC hPrDC,int iBkMode);
PRINTDC_API COLORREF PDC_SetBkColor(HDC hPrDC,COLORREF crColor);
PRINTDC_API COLORREF PDC_SetTextColor(HDC hPrDC,COLORREF crColor);
PRINTDC_API int PDC_SetROP2(HDC hPrDC,int fnDrawMode);
PRINTDC_API int PDC_DrawText(HDC hPrDC,LPCTSTR lpString,int nCount,LPRECT lpRect,UINT uFormat);
PRINTDC_API int PDC_PrDialogBox(int Operation);
PRINTDC_API int PDC_SetScaleMode(int scalemode);

PRINTDC_API long PDC_ScaleMode(long newVal);
PRINTDC_API BOOL PDC_DrawPicture(LPTSTR picturefile, float x, float y, float* width, float* height,int keepaspect);
PRINTDC_API void PDC_SetErrorLevel(long newVal);
PRINTDC_API long PDC_JustifyVert(long newVal);
PRINTDC_API long PDC_JustifyHoriz(long newVal);
PRINTDC_API long PDC_SetImageBrightness(long newVal);
PRINTDC_API BOOL PDC_GetImageStats(LPTSTR picturefile,int* filesize, int* memsize,int* wid, int* ht);
PRINTDC_API BOOL PDC_SetupPrinter(long Printer, long Port, long Baudrate,BOOL OpenPort);
PRINTDC_API BOOL PDC_SetupPaper(long PaperSize, long Orientation, float PaperWidth, float PaperHeight, float LeftMgn, float TopMgn, float RightMgn, float BottomMgn);
PRINTDC_API BOOL PDC_SetupPrinterOther(long FFSetting,float FFScroll,long Density,long Handshake,long BitFlags,long Compressed,long Dither,long DraftMode);
PRINTDC_API BOOL PDC_SetupNetPath(LPTSTR netstr);
PRINTDC_API int PDC_MaxY();
PRINTDC_API void PDC_PrDialogBoxText(LPTSTR MainText, LPTSTR TitleText, LPTSTR CancelBtnText);

PRINTDC_API int PDC_DrawTextFlow(LPTSTR pstr,int* dxcoord,int* dycoord,int dleft,int dtop,int dwidth,int dheight,int ccnt,int SpecialType);
//SpecialTypes - OR together
#define FLOW_STANDARD			0x00000000
#define FLOW_NOWORDWRAP			0x00000001
#define FLOW_AUTOINDENT			0x00000002
#define FLOW_IGNORE_FFCHAR		0x00000004
#define FLOW_IGNORE_TABCHAR		0x00000008
#define FLOW_NOFORMFEED			0x00000010
#define FLOW_NOENDINGLINEFEED	0x00000020
#define FLOW_HARDBREAK			0x00000040

#ifndef PICT_BMP_TYPE
#define PICT_BMP_TYPE	0
//Currently only BMP images supported
//#define PICT_JPEG_TYPE	1
//#define PICT_PNG_TYPE	2

typedef struct stPicInfo {
	int ImageType;
	int SrcWid,SrcHt;
	int DestWid,DestHt;
	int ScaleX,ScaleY;
	int bitsperpixel,planes,widthbytes;
	int bytecnt;
	int cropL,cropT,cropR,cropB;
	BYTE* pBits;
} PICINFO;
PRINTDC_API int PDC_DrawPictIndirect(HDC hdc,PICINFO* gPic,int X,int Y);

#define CUST_DATA_SETUPPRINTER  0x88

#endif


