You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
587 lines
13 KiB
587 lines
13 KiB
/*++ BUILD Version: 0003 // Increment this if a change has global effects
|
|
|
|
Copyright (c) 1990-2003 Microsoft Corporation
|
|
|
|
|
|
Module Name:
|
|
|
|
plotlib.h
|
|
|
|
|
|
Abstract:
|
|
|
|
This module contains defines and prototype for the plotter library
|
|
|
|
|
|
Author:
|
|
|
|
15-Nov-1993 Mon 22:52:46 created
|
|
|
|
29-Dec-1993 Wed 11:00:56 updated
|
|
Change PLOTDBGBLK() macro by adding automatical semi in macro
|
|
|
|
[Environment:]
|
|
|
|
GDI Device Driver - Plotter.
|
|
|
|
|
|
[Notes:]
|
|
|
|
|
|
Revision History:
|
|
|
|
|
|
--*/
|
|
|
|
|
|
#ifndef _PLOTLIB_
|
|
#define _PLOTLIB_
|
|
|
|
#include <plotdm.h>
|
|
#include <plotgpc.h>
|
|
|
|
#define _WCPYSTR(pd,ps,n) wcsncpy((LPWSTR)(pd),(LPWSTR)(ps),(n)); \
|
|
*(((LPWSTR)(pd))+(n)-1)=L'\0'
|
|
#define WCPYFIELDNAME(pField,ps) _WCPYSTR((pField),(ps),COUNT_ARRAY(pField))
|
|
|
|
#define SWAP(a,b,t) { (t)=(a); (a)=(b); (b)=(t); }
|
|
|
|
#define CCHOF(x) (sizeof(x)/sizeof(*(x)))
|
|
|
|
// Some other convinence defines
|
|
|
|
#define DM_PAPER_FIELDS (DM_PAPERWIDTH | DM_PAPERLENGTH | \
|
|
DM_PAPERSIZE | DM_FORMNAME)
|
|
#define DM_PAPER_WL (DM_PAPERWIDTH | DM_PAPERLENGTH)
|
|
|
|
|
|
//
|
|
// new ddi stuff
|
|
//
|
|
|
|
#if defined(UMODE) || defined(USERMODE_DRIVER)
|
|
|
|
#pragma message("*** MSPLOT: Compile in USER Mode ***")
|
|
|
|
|
|
#define xEnumForms EnumForms
|
|
#define xGetPrinter GetPrinter
|
|
#define xGetPrinterData GetPrinterData
|
|
#define xSetPrinterData SetPrinterData
|
|
#define xGetLastError GetLastError
|
|
#define AnsiToUniCode(pb,pw,cch) \
|
|
MultiByteToWideChar(CP_ACP,0,(pb),(cch),(pw),(cch))
|
|
#define UniCodeToAnsi(pb,pw,cch) \
|
|
WideCharToMultiByte(CP_ACP,0,(pw),(cch),(pb),(cch),NULL,NULL)
|
|
|
|
#else
|
|
|
|
#pragma message("*** MSPLOT: Compile in KERNEL Mode ***")
|
|
|
|
#define WritePrinter EngWritePrinter
|
|
#define SetLastError EngSetLastError
|
|
#define GetLastError EngGetLastError
|
|
#define MulDiv EngMulDiv
|
|
#define xEnumForms EngEnumForms
|
|
#define xGetPrinter EngGetPrinter
|
|
#define xGetPrinterData EngGetPrinterData
|
|
#define xSetPrinterData EngSetPrinterData
|
|
#define xGetLastError EngGetLastError
|
|
#define AnsiToUniCode(pb,pw,cch) \
|
|
EngMultiByteToUnicodeN((pw),(cch)*sizeof(WCHAR),NULL,(pb),(cch))
|
|
#define UniCodeToAnsi(pb,pw,cch) \
|
|
EngUnicodeToMultiByteN((pb),(cch),NULL,(pw),(cch)*sizeof(WCHAR))
|
|
|
|
#define LocalAlloc(fl,c) \
|
|
EngAllocMem(((fl) & LMEM_ZEROINIT) ? FL_ZERO_MEMORY:0,c,'tolp')
|
|
#define LocalFree(p) EngFreeMem((PVOID)p)
|
|
|
|
#define DebugBreak() EngDebugBreak()
|
|
|
|
|
|
#endif // UMODE
|
|
|
|
//===========================================================================
|
|
// cacheGPC.c
|
|
//===========================================================================
|
|
|
|
|
|
BOOL
|
|
InitCachedData(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
DestroyCachedData(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
UnGetCachedPlotGPC(
|
|
PPLOTGPC pPlotGPC
|
|
);
|
|
|
|
PPLOTGPC
|
|
GetCachedPlotGPC(
|
|
LPWSTR pwDataFile
|
|
);
|
|
|
|
#ifdef UMODE
|
|
|
|
PPLOTGPC
|
|
hPrinterToPlotGPC(
|
|
HANDLE hPrinter,
|
|
LPWSTR pwDeviceName,
|
|
size_t cchDeviceName
|
|
);
|
|
|
|
#endif
|
|
|
|
//===========================================================================
|
|
// drvinfo.c
|
|
//===========================================================================
|
|
|
|
#ifdef UMODE
|
|
|
|
LPBYTE
|
|
GetDriverInfo(
|
|
HANDLE hPrinter,
|
|
UINT DrvInfoLevel
|
|
);
|
|
|
|
#endif
|
|
|
|
//===========================================================================
|
|
// RegData.c
|
|
//===========================================================================
|
|
|
|
#define PRKI_FIRST PRKI_CI
|
|
#define PRKI_CI 0
|
|
#define PRKI_DEVPELSDPI 1
|
|
#define PRKI_HTPATSIZE 2
|
|
#define PRKI_FORM 3
|
|
#define PRKI_PPDATA 4
|
|
#define PRKI_PENDATA_IDX 5
|
|
#define PRKI_PENDATA1 6
|
|
#define PRKI_PENDATA2 7
|
|
#define PRKI_PENDATA3 8
|
|
#define PRKI_PENDATA4 9
|
|
#define PRKI_PENDATA5 10
|
|
#define PRKI_PENDATA6 11
|
|
#define PRKI_PENDATA7 12
|
|
#define PRKI_PENDATA8 13
|
|
#define PRKI_LAST PRKI_PENDATA8
|
|
|
|
#define PRK_MAX_PENDATA_SET (PRKI_LAST - PRKI_PENDATA1 + 1)
|
|
|
|
|
|
BOOL
|
|
GetPlotRegData(
|
|
HANDLE hPrinter,
|
|
LPBYTE pData,
|
|
DWORD RegIdx
|
|
);
|
|
|
|
|
|
BOOL
|
|
UpdateFromRegistry(
|
|
HANDLE hPrinter,
|
|
PCOLORINFO pColorInfo,
|
|
LPDWORD pDevPelsDPI,
|
|
LPDWORD pHTPatSize,
|
|
PPAPERINFO pCurPaper,
|
|
PPPDATA pPPData,
|
|
LPBYTE pIdxPlotData,
|
|
DWORD cPenData,
|
|
PPENDATA pPenData
|
|
);
|
|
|
|
#ifdef UMODE
|
|
|
|
BOOL
|
|
SetPlotRegData(
|
|
HANDLE hPrinter,
|
|
LPBYTE pData,
|
|
DWORD RegIdx
|
|
);
|
|
BOOL
|
|
SaveToRegistry(
|
|
HANDLE hPrinter,
|
|
PCOLORINFO pColorInfo,
|
|
LPDWORD pDevPelsDPI,
|
|
LPDWORD pHTPatSize,
|
|
PPAPERINFO pCurPaper,
|
|
PPPDATA pPPData,
|
|
LPBYTE pIdxPlotData,
|
|
DWORD cPenData,
|
|
PPENDATA pPenData
|
|
);
|
|
|
|
#endif
|
|
|
|
//===========================================================================
|
|
// Forms.c
|
|
//===========================================================================
|
|
|
|
|
|
#define FI1F_VALID_SIZE 0x80000000
|
|
#define FI1F_ENVELOPE 0x40000000
|
|
#define FI1F_MASK 0xc0000000
|
|
|
|
#define FI1F_ENUMFORMS_MASK 0x00000003
|
|
|
|
|
|
typedef struct _ENUMFORMPARAM {
|
|
PFORM_INFO_1 pFI1Base;
|
|
DWORD Count;
|
|
DWORD ValidCount;
|
|
DWORD cMaxOut;
|
|
PPLOTDEVMODE pPlotDM;
|
|
PPLOTGPC pPlotGPC;
|
|
PFORMSIZE pCurForm;
|
|
SHORT FoundIndex;
|
|
SHORT ReqIndex;
|
|
PFORM_INFO_1 pSizeFI1;
|
|
SIZEL ReqSize;
|
|
} ENUMFORMPARAM, FAR *PENUMFORMPARAM;
|
|
|
|
|
|
//
|
|
// The following fields in ENUMFORMPARAM must set to valid pointer before
|
|
// the PlotEnumForms() call
|
|
//
|
|
// 1. pPlotDM
|
|
// 2. pPlotGPC
|
|
// 3. pCurForm (can be NULL)
|
|
//
|
|
// if a callback function is supplied then only forms which not greater than
|
|
// the device size will be passed to the callback function, for form which
|
|
// smaller or equal to the device size will have FI1F_VALID_SIZE bit set in
|
|
// the FORM_INFO_1 data structure's flag
|
|
//
|
|
//
|
|
// Call back function for enum forms, if return value is
|
|
//
|
|
// (Ret < 0) --> Free pFI1Base pointer and stop enum
|
|
// (Ret = 0) --> Keep pFI1Base and Stop Enum
|
|
// (Ret > 0) --> Continue Enum until all Count is enumerated
|
|
//
|
|
// The last enum callback will have following parameters to give the callback
|
|
// function a chance to return -1 (free the pFormInfo1 data)
|
|
//
|
|
// pFI1 = NULL
|
|
// Index = pEnumFormParam->Count
|
|
//
|
|
|
|
typedef INT (CALLBACK *ENUMFORMPROC)(PFORM_INFO_1 pFI1,
|
|
DWORD Index,
|
|
PENUMFORMPARAM pEnumFormParam);
|
|
|
|
//
|
|
// If (EnumFormProc == NULL) then no enumeration will happened but just
|
|
// return the pFI1/Count in pEnumFormParam, if both EnumFormProc and
|
|
// pEnumFormParam == NULL then it return FALSE
|
|
//
|
|
|
|
BOOL
|
|
PlotEnumForms(
|
|
HANDLE hPrinter,
|
|
ENUMFORMPROC EnumFormProc,
|
|
PENUMFORMPARAM pEnumFormParam
|
|
);
|
|
|
|
|
|
|
|
//===========================================================================
|
|
// plotdm.c
|
|
//===========================================================================
|
|
|
|
|
|
BOOL
|
|
IsA4PaperDefault(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
IntersectRECTL(
|
|
PRECTL prclDest,
|
|
PRECTL prclSrc
|
|
);
|
|
|
|
#define RM_L90 0
|
|
#define RM_180 1
|
|
#define RM_R90 2
|
|
|
|
|
|
BOOL
|
|
RotatePaper(
|
|
PSIZEL pSize,
|
|
PRECTL pImageArea,
|
|
UINT RotateMode
|
|
);
|
|
|
|
SHORT
|
|
GetDefaultPaper(
|
|
PPAPERINFO pPaperInfo
|
|
);
|
|
|
|
VOID
|
|
GetDefaultPlotterForm(
|
|
PPLOTGPC pPlotGPC,
|
|
PPAPERINFO pPaperInfo
|
|
);
|
|
|
|
VOID
|
|
SetDefaultDMForm(
|
|
PPLOTDEVMODE pPlotDM,
|
|
PFORMSIZE pCurForm
|
|
);
|
|
|
|
VOID
|
|
SetDefaultPLOTDM(
|
|
HANDLE hPrinter,
|
|
PPLOTGPC pPlotGPC,
|
|
LPWSTR pwDeviceName,
|
|
PPLOTDEVMODE pPlotDM,
|
|
PFORMSIZE pCurForm
|
|
);
|
|
|
|
DWORD
|
|
ValidateSetPLOTDM(
|
|
HANDLE hPrinter,
|
|
PPLOTGPC pPlotGPC,
|
|
LPWSTR pwDeviceName,
|
|
PPLOTDEVMODE pPlotDMIn,
|
|
PPLOTDEVMODE pPlotDMOut,
|
|
PFORMSIZE pCurForm
|
|
);
|
|
|
|
|
|
//===========================================================================
|
|
// WideChar.c - Unicode/Ansi conversion support
|
|
//===========================================================================
|
|
|
|
LPWSTR
|
|
str2Wstr(
|
|
LPWSTR pwStr,
|
|
size_t cchDest,
|
|
LPSTR pbStr
|
|
);
|
|
|
|
LPWSTR
|
|
str2MemWstr(
|
|
LPSTR pStr
|
|
);
|
|
|
|
LPSTR
|
|
WStr2Str(
|
|
LPSTR pbStr,
|
|
size_t cchDest,
|
|
LPWSTR pwStr
|
|
);
|
|
|
|
//===========================================================================
|
|
// ReadGPC.c - PlotGPC reading/validating
|
|
//===========================================================================
|
|
|
|
BOOL
|
|
ValidateFormSrc(
|
|
PGPCVARSIZE pFormGPC,
|
|
SIZEL DeviceSize,
|
|
BOOL DevRollFeed
|
|
);
|
|
|
|
DWORD
|
|
PickDefaultHTPatSize(
|
|
WORD xDPI,
|
|
WORD yDPI,
|
|
BOOL HTFormat8BPP
|
|
);
|
|
|
|
BOOL
|
|
ValidatePlotGPC(
|
|
PPLOTGPC pPlotGPC
|
|
);
|
|
|
|
PPLOTGPC
|
|
ReadPlotGPCFromFile(
|
|
PWSTR pwsDataFile
|
|
);
|
|
|
|
//===========================================================================
|
|
// file.c - file open/read/close
|
|
//===========================================================================
|
|
|
|
|
|
#if defined(UMODE) || defined(USERMODE_DRIVER)
|
|
|
|
#define OpenPlotFile(pFileName) CreateFile((LPCTSTR)pFileName, \
|
|
GENERIC_READ, \
|
|
FILE_SHARE_READ, \
|
|
NULL, \
|
|
OPEN_EXISTING, \
|
|
FILE_ATTRIBUTE_NORMAL, \
|
|
NULL)
|
|
|
|
#define ClosePlotFile(h) CloseHandle(h)
|
|
#define ReadPlotFile(h,p,c,pc) ReadFile((h),(p),(c),(pc),NULL)
|
|
|
|
|
|
#else
|
|
|
|
typedef struct _PLOTFILE {
|
|
HANDLE hModule;
|
|
LPBYTE pbBeg;
|
|
LPBYTE pbEnd;
|
|
LPBYTE pbCur;
|
|
} PLOTFILE, *PPLOTFILE;
|
|
|
|
|
|
HANDLE
|
|
OpenPlotFile(
|
|
LPWSTR pFileName
|
|
);
|
|
|
|
BOOL
|
|
ClosePlotFile(
|
|
HANDLE hPlotFile
|
|
);
|
|
|
|
BOOL
|
|
ReadPlotFile(
|
|
HANDLE hPlotFile,
|
|
LPVOID pBuf,
|
|
DWORD cToRead,
|
|
LPDWORD pcRead
|
|
);
|
|
|
|
#endif
|
|
|
|
//===========================================================================
|
|
// Devmode.c and halftone.c
|
|
//===========================================================================
|
|
|
|
BOOL
|
|
ValidateColorAdj(
|
|
PCOLORADJUSTMENT pca
|
|
);
|
|
|
|
|
|
LONG
|
|
ConvertDevmode(
|
|
PDEVMODE pdmIn,
|
|
PDEVMODE pdmOut
|
|
);
|
|
|
|
#if defined(UMODE) || defined(USERMODE_DRIVER)
|
|
|
|
#include <winspool.h>
|
|
#include <commctrl.h>
|
|
#include <winddiui.h>
|
|
|
|
// Copy DEVMODE to an output buffer before return to the
|
|
// caller of DrvDocumentPropertySheets
|
|
|
|
BOOL
|
|
ConvertDevmodeOut(
|
|
PDEVMODE pdmSrc,
|
|
PDEVMODE pdmIn,
|
|
PDEVMODE pdmOut
|
|
);
|
|
|
|
typedef struct {
|
|
|
|
WORD dmDriverVersion; // current driver version
|
|
WORD dmDriverExtra; // size of current version private devmode
|
|
WORD dmDriverVersion351; // 3.51 driver version
|
|
WORD dmDriverExtra351; // size of 3.51 version private devmode
|
|
|
|
} DRIVER_VERSION_INFO, *PDRIVER_VERSION_INFO;
|
|
|
|
#define CDM_RESULT_FALSE 0
|
|
#define CDM_RESULT_TRUE 1
|
|
#define CDM_RESULT_NOT_HANDLED 2
|
|
|
|
INT
|
|
CommonDrvConvertDevmode(
|
|
PWSTR pPrinterName,
|
|
PDEVMODE pdmIn,
|
|
PDEVMODE pdmOut,
|
|
PLONG pcbNeeded,
|
|
DWORD fMode,
|
|
PDRIVER_VERSION_INFO pDriverVersions
|
|
);
|
|
|
|
#endif
|
|
|
|
|
|
//===========================================================================
|
|
// PlotDBG.c - debug output support
|
|
//===========================================================================
|
|
|
|
|
|
#if DBG
|
|
|
|
VOID
|
|
cdecl
|
|
PlotDbgPrint(
|
|
LPSTR pszFormat,
|
|
...
|
|
);
|
|
|
|
VOID
|
|
PlotDbgType(
|
|
INT Type
|
|
);
|
|
|
|
VOID
|
|
_PlotAssert(
|
|
LPSTR pMsg,
|
|
LPSTR pFalseExp,
|
|
LPSTR pFilename,
|
|
UINT LineNo,
|
|
DWORD_PTR Exp,
|
|
BOOL Stop
|
|
);
|
|
|
|
extern BOOL DoPlotWarn;
|
|
|
|
|
|
#define DBGP(x) (PlotDbgPrint x)
|
|
|
|
#if 1
|
|
|
|
#define DEFINE_DBGVAR(x) DWORD DBG_PLOTFILENAME=(x)
|
|
#define PLOTDBG(x,y) if (x&DBG_PLOTFILENAME){PlotDbgType(0);DBGP(y);}
|
|
|
|
#else
|
|
|
|
#define DEFINE_DBGVAR(x)
|
|
#define PLOTDBG(x,y) DBGP(y)
|
|
|
|
#endif // DBG_PLOTFILENAME
|
|
|
|
#define PLOTDBGBLK(x) x;
|
|
#define PLOTWARN(x) if (DoPlotWarn) { PlotDbgType(1);DBGP(x); }
|
|
#define PLOTERR(x) PlotDbgType(-1);DBGP(x)
|
|
#define PLOTRIP(x) PLOTERR(x); DebugBreak()
|
|
#define PLOTASSERT(b,x,e,i) \
|
|
if (!(e)) { _PlotAssert(x,#e,__FILE__,(UINT)__LINE__,(DWORD_PTR)i,b); }
|
|
|
|
#else // DBG
|
|
|
|
#define PLOTDBGBLK(x)
|
|
#define DEFINE_DBGVAR(x)
|
|
#define PLOTDBG(x,y)
|
|
#define PLOTWARN(x)
|
|
#define PLOTERR(x)
|
|
#define PLOTRIP(x)
|
|
#define PLOTASSERT(b,x,e,i)
|
|
|
|
#endif // DBG
|
|
|
|
|
|
|
|
|
|
|
|
#endif // _PLOTLIB_
|