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.
528 lines
21 KiB
528 lines
21 KiB
/*++
|
|
|
|
Copyright (c) 1996 - 1999 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
pdev.h
|
|
|
|
Abstract:
|
|
|
|
Unidrv PDEV and related info header file.
|
|
|
|
Environment:
|
|
|
|
Windows NT Unidrv driver
|
|
|
|
Revision History:
|
|
|
|
10/14/96 -amandan-
|
|
Created
|
|
|
|
03/31/97 -zhanw-
|
|
Added OEM customization support
|
|
|
|
--*/
|
|
|
|
#include "oemkm.h"
|
|
#include "state.h"
|
|
|
|
#ifndef _PDEV_H_
|
|
#define _PDEV_H_
|
|
|
|
#define CCHNAME 32 // length of port names.
|
|
#define CCHMAXBUF 128 // size of local buffer
|
|
#define CCHSPOOL 4096 // Size of spool buffer
|
|
#define PDEV_ID 0x72706476 // "rpdv" in ASCII
|
|
|
|
#define BBITS 8 // Bits per BYTE
|
|
#define WBITS (sizeof( WORD ) * BBITS)
|
|
#define WBYTES (sizeof( WORD ))
|
|
#define DWBITS (sizeof( DWORD ) * BBITS)
|
|
#define DWBYTES (sizeof( DWORD ))
|
|
|
|
#define NOOCD -1 // Command does not exist
|
|
|
|
#define MIN(x, y) ((x) < (y) ? (x) : (y))
|
|
#define MAX(x, y) ((x) < (y) ? (y) : (x))
|
|
|
|
//
|
|
// Possible personality types
|
|
//
|
|
typedef enum _EPERSONALITY {
|
|
kNoPersonality,
|
|
kPCLXL,
|
|
kHPGL2,
|
|
kPCLXL_RASTER,
|
|
} EPERSONALITY;
|
|
|
|
//
|
|
// SHRINK_FACTOR is used to reduce the number of scan lines in the
|
|
// drawing surface bitmap when we cannot create a full sized version.
|
|
// Each iteration of the "try this size" loop will reduce the number
|
|
// of scan lines by this factor.
|
|
//
|
|
|
|
#define SHRINK_FACTOR 2 // Bitmap reduction size
|
|
#define ONE_MBYTE (1024L * 1024L)
|
|
#define MAX_SIZE_OF_BITMAP (6L * ONE_MBYTE)
|
|
#define MIN_SIZE_OF_BITMAP (ONE_MBYTE / 2L)
|
|
#define MAX_COLUMM 8
|
|
#define LINESPERBLOCK 32 // scans per bitmap block for erasing surface
|
|
#define MAX_NUM_RULES 256
|
|
//
|
|
// OUTPUTCTL is included in PDEVICE for controlling the state of the output
|
|
// device during banding
|
|
//
|
|
|
|
typedef struct _OUTPUTCTL {
|
|
|
|
POINT ptCursor; // current cursor position (printer's CAP)
|
|
// (in master units), use this for
|
|
// absolute x,y move cmds
|
|
POINT ptRelativePos; // The desired relative cursor position,
|
|
// relative to current
|
|
// cursor position
|
|
POINT ptAbsolutePos; // The absolute cursor postion
|
|
DWORD dwMode; // flags for controling printer state.
|
|
LONG lLineSpacing; // last line spacing chosen
|
|
ULONG ulBrushColor; // Current Brush Color.
|
|
|
|
//
|
|
// The following fields are initialized and update by
|
|
// the Raster module
|
|
//
|
|
|
|
SHORT sColor; // Last color chosen
|
|
SHORT sBytesPerPinPass; // number of bytes per row of printhead.
|
|
SHORT sPad; // Padding for alignment
|
|
|
|
} OUTPUTCTL;
|
|
|
|
//
|
|
// flags for OUTPUTCTL.dwCursorMode
|
|
//
|
|
|
|
#define MODE_CURSOR_X_UNINITIALIZED 0x00000001
|
|
#define MODE_CURSOR_Y_UNINITIALIZED 0x00000002
|
|
#define MODE_CURSOR_UNINITIALIZED 0x00000003 // both X and Y
|
|
#define MODE_BRUSH_RESET_COLOR 0x00000004 // Reset the brush color by
|
|
// by sending the command.
|
|
|
|
typedef struct _PAPERFORMAT {
|
|
//
|
|
// All paper units are in Master units. All fields are in Portrait orientation.
|
|
//
|
|
|
|
SIZEL szPhysSizeM; // Physical size, in Portrait
|
|
SIZEL szImageAreaM; // Imageable area of paper, in Portrait
|
|
POINT ptImageOriginM; // X, Y origin of imageable area, in Portrait
|
|
|
|
} PAPERFORMAT, *PPAPERFORMAT;
|
|
|
|
typedef struct _SURFACEFORMAT {
|
|
//
|
|
// all fields in this structure are in the current orientation.
|
|
// Fields end with 'M' are in master units; and those end with 'G' are in graphics
|
|
// device units.
|
|
|
|
POINT ptPrintOffsetM; // X, Y offset of image origin relative to cursor origin
|
|
SIZEL szPhysPaperG;
|
|
SIZEL szImageAreaG;
|
|
POINT ptImageOriginG;
|
|
|
|
} SURFACEFORMAT, * PSURFACEFORMAT;
|
|
//
|
|
// PDEVICE structure for Unidrv
|
|
//
|
|
|
|
typedef struct _PDEV {
|
|
//
|
|
// the first field must be DEVOBJ, defined in <printoem.h>.
|
|
//
|
|
DEVOBJ devobj; // the first field of DEVOBJ is the pointer
|
|
// to PDEV itself.
|
|
//
|
|
// General information
|
|
//
|
|
|
|
PVOID pvStartSig; // Signature at the start
|
|
ULONG ulID; // For PDEV verification
|
|
HANDLE hUniResDLL; // Handle to resource DLL
|
|
HBITMAP hbm; // The bitmap handle from EngCreateBitmap
|
|
HSURF hSurface; // The surface handle from EngCreateDeviceSurface
|
|
SURFOBJ *pso; // Pointer to driver managed surface
|
|
DWORD fMode; // Device context flags
|
|
DWORD fMode2; // Device context flags
|
|
DWORD fHooks; // Hook flag for EngAssociateSurface
|
|
WINRESDATA WinResData; // Struct for resource data loading
|
|
// WINRESDATA localWinResData; // references unires.dll
|
|
BOOL bTTY; // Set if the printer is TTY
|
|
PDRIVER_INFO_3 pDriverInfo3; // pointer to DRIVER_INFO_3 structure
|
|
DWORD dwDelta; // Size of each columm for z-ordering fix
|
|
PBYTE pbScanBuf; // Array representing # of scan lines on the band
|
|
PBYTE pbRasterScanBuf; // Array representing # of scan lines block on the band
|
|
#ifndef DISABLE_NEWRULES
|
|
PRECTL pbRulesArray; // Array containing pseudo vector rectangles
|
|
DWORD dwRulesCount; // Number of pseudo vector rectangles
|
|
#endif
|
|
DWORD dwHTPatSize; // Size of halftone pattern
|
|
PFORM_INFO_1 pSplForms; // Array of forms registered in forms database.
|
|
DWORD dwSplForms ; // Number of forms in the array.
|
|
|
|
//
|
|
// OEM info
|
|
//
|
|
POEM_PLUGINS pOemPlugins;
|
|
POEM_PLUGINS pOemEntry; // the Plugin that supports the selected OEM entry point
|
|
POEM_HOOK_INFO pOemHookInfo;
|
|
DWORD dwCallingFuncID;
|
|
PFN_OEMCommandCallback pfnOemCmdCallback; // cache the function ptr, if any
|
|
|
|
//
|
|
// Graphic State Info
|
|
//
|
|
|
|
GSTATE GState;
|
|
|
|
//
|
|
// Personality
|
|
//
|
|
EPERSONALITY ePersonality;
|
|
|
|
//
|
|
// Memory related information
|
|
//
|
|
|
|
DWORD dwFreeMem; // Memory available on printer
|
|
|
|
//
|
|
// Banding related information
|
|
//
|
|
|
|
BOOL bBanding; // Flag to indicate banding
|
|
INT iBandDirection; // Banding direction
|
|
SIZEL szBand; // Dimensions of the band in Graphic units
|
|
RECTL rcClipRgn; // Clipping region
|
|
//
|
|
// Binary data related information
|
|
//
|
|
|
|
GPDDRIVERINFO *pDriverInfo; // Pointer to GPDDRVINFO
|
|
RAWBINARYDATA *pRawData; // Pointer to RAWBINARYDATA
|
|
INFOHEADER *pInfoHeader; // Pointer to INFOHEADER
|
|
UIINFO *pUIInfo; // Pointer to UIINFO
|
|
PRINTERDATA PrinterData; // PRINTERDATA struct
|
|
POPTSELECT pOptionsArray; // Pointer to combined option array
|
|
SHORT sBitsPixel; // Bits per pixel selected, from COLORMODEEX
|
|
|
|
PDWORD arStdPtrs[SV_MAX]; // Array of PDWORD , where the
|
|
// pointers points to the standard variables
|
|
GLOBALS * pGlobals; // Pointer to GLOBALS struct
|
|
|
|
PCOMMAND arCmdTable[CMD_MAX]; // Table containing pointers
|
|
// to each predefined command index as
|
|
// enumerated in gpd.h, CMDINDEX
|
|
|
|
//
|
|
// The following fields are use by the standard variable table.
|
|
//
|
|
|
|
//
|
|
// Control module items
|
|
//
|
|
|
|
SHORT sCopies; // SV_COPIES
|
|
// SV_DESTX, SV_DESTY,
|
|
// SV_DESTXREL, SV_DESTYREL,
|
|
// SV_LINEFEED
|
|
// are in OUTPUTCTL
|
|
|
|
// SV_PHYSPAPERLENGTH, SV_PHYSPAPERWIDTH,
|
|
// are in PAPERFORMAT
|
|
|
|
DWORD dwRop3; // SV_ROP3
|
|
|
|
// SV_TEXTXRES , SV_TEXTYRES are
|
|
// in ptTextRes
|
|
|
|
DWORD dwPageNumber ; // SV_PAGENUMBER of a document - may not be accurate
|
|
// if multiple copies is simulated.
|
|
//
|
|
// Brush specific standard variables
|
|
//
|
|
|
|
DWORD dwPatternBrushType; // SV_PATTERNBRUSH_TYPE
|
|
DWORD dwPatternBrushID; // SV_PATTERNBRUSH_ID
|
|
DWORD dwPatternBrushSize; // SV_PATTERNBRUSH_SIZE
|
|
|
|
//
|
|
// Palette specific standard variables.
|
|
//
|
|
|
|
DWORD dwRedValue; // SV_REDVALUE
|
|
DWORD dwGreenValue; // SV_GREENVALUE
|
|
DWORD dwBlueValue ; // SV_BLUEVALUE
|
|
DWORD dwPaletteIndexToProgram; // SV_PALETTEINDEXTOPROGRAM
|
|
DWORD dwCurrentPaletteIndex ; // SV_CURRENTPALETTEINDEX
|
|
|
|
|
|
|
|
//
|
|
// Raster module items
|
|
//
|
|
|
|
DWORD dwNumOfDataBytes; // SV_NUMDATABYTES
|
|
DWORD dwWidthInBytes; // SV_WIDTHINBYTES
|
|
DWORD dwHeightInPixels; // SV_HEIGHTINPIXELS
|
|
DWORD dwRectXSize; // SV_RECTXSIZE
|
|
DWORD dwRectYSize; // SV_RECTYSIZE
|
|
DWORD dwGrayPercentage; // SV_GRAYPERCENT
|
|
|
|
//
|
|
// Font module items
|
|
//
|
|
|
|
DWORD dwPrintDirection; // SV_PRINTDIR
|
|
DWORD dwNextFontID; // SV_NEXTFONTID
|
|
DWORD dwNextGlyph; // SV_NEXTGLYPH
|
|
DWORD dwFontHeight; // SV_FONTHEIGHT
|
|
DWORD dwFontWidth; // SV_FONTWIDTH
|
|
DWORD dwFontMaxWidth; // SV_FONTMAXWIDTH
|
|
DWORD dwFontBold; // SV_FONTBOLD
|
|
DWORD dwFontItalic; // SV_FONTITALIC
|
|
DWORD dwFontUnderline; // SV_FONTUNDERLINE
|
|
DWORD dwFontStrikeThru; // SV_FONTSTRIKETHU
|
|
DWORD dwCurrentFontID; // SV_CURRENTFONTID
|
|
|
|
//
|
|
// The following are the pointers to the options selected
|
|
// as indicated in the pOptionsArray
|
|
//
|
|
|
|
PORIENTATION pOrientation; // Pointer to ORIENTATION option
|
|
PRESOLUTION pResolution; // Pointer to RESOLUTION option
|
|
PRESOLUTIONEX pResolutionEx; // Pointer to RESOLUTIONEX option
|
|
PCOLORMODE pColorMode; // Pointer to COLORMODE option
|
|
PCOLORMODEEX pColorModeEx; // Pointer to COLORMODEEX option
|
|
PDUPLEX pDuplex; // Pointer to DUPLEX option
|
|
PPAGESIZE pPageSize; // Pointer to PAGESIZE option
|
|
PPAGESIZEEX pPageSizeEx; // Pointer to PAGESIZEEX option
|
|
PINPUTSLOT pInputSlot; // Pointer to INPUTSLOT option
|
|
PMEMOPTION pMemOption; // Pointer to MEMOPTION option
|
|
PHALFTONING pHalftone; // Pointer to HALFTONING option
|
|
PPAGEPROTECT pPageProtect; // Pointer to PAGEPROTECT option
|
|
|
|
// PMEDIATYPE pMediaType; // Pointer to MEDIATYPE option
|
|
// POPTION pOutputBin; // Pointer to OUTPUTBIN option
|
|
// POPTION pCollate; // Pointer to COLLATE option
|
|
|
|
|
|
//
|
|
// Text and Graphics Resolution
|
|
//
|
|
|
|
POINT ptGrxRes; // Graphics resolution selected
|
|
POINT ptTextRes; // Text resolution selected
|
|
POINT ptGrxScale; // Scale between Master and Graphics Units
|
|
POINT ptDeviceFac; // Factor to convert from Device to Master Units
|
|
|
|
//
|
|
// UNIDRV devmode
|
|
//
|
|
|
|
PDEVMODE pdm; // current devmode
|
|
PUNIDRVEXTRA pdmPrivate; // pointer to driver private portion
|
|
|
|
//
|
|
// Output Control Information, Paper Format and Palette
|
|
//
|
|
|
|
OUTPUTCTL ctl; // State of the printer
|
|
PAPERFORMAT pf; // PAPERFORMAT struct
|
|
SURFACEFORMAT sf; // SURFACEFORMAT struct
|
|
DWORD fYMove; // Fields saved from looking
|
|
// ast YMoveAttributes keyword
|
|
PVOID pPalData; // Pointer to PAL_DATA structure
|
|
//
|
|
// Spool buffer
|
|
//
|
|
|
|
INT iSpool; // offset into the spool buffer
|
|
PBYTE pbOBuf; // Output buffer base address
|
|
|
|
//
|
|
// Text Specific Information
|
|
//
|
|
INT iFonts; // Number of Device Fonts
|
|
DWORD dwLookAhead; // Look ahead region:DskJet type
|
|
POINT ptDefaultFont; // Default font width & height.
|
|
PVOID pFontPDev; // Font Module PDEV
|
|
PVOID pFontProcs; // Table of font functions
|
|
PVOID pFileList; // Pointer to Font File List
|
|
|
|
//
|
|
// Raster Specific Information
|
|
//
|
|
|
|
PVOID pRasterPDEV; // Raster Module PDEV
|
|
PVOID pRasterProcs; // Table of raster functions
|
|
|
|
//
|
|
// Vector Specific Information
|
|
//
|
|
|
|
PVOID pVectorPDEV; // Vector Module PDEV
|
|
PVOID pVectorProcs; // Table of vector functions
|
|
DWORD dwVMCallingFuncID; // ID of vector function.
|
|
|
|
//
|
|
// Temporary copies due to the fact that we unload
|
|
// the binary data at DrvEnablePDEV and reloads it at
|
|
// DrvEnableSurface
|
|
//
|
|
|
|
DWORD dwMaxCopies;
|
|
DWORD dwMaxGrayFill;
|
|
DWORD dwMinGrayFill;
|
|
CURSORXAFTERRECTFILL cxafterfill; // *CursorXAfterRectFill
|
|
CURSORYAFTERRECTFILL cyafterfill; // *CursorYAfterRectFill
|
|
|
|
//
|
|
// DMS
|
|
//
|
|
DWORD dwDMSInfo;
|
|
|
|
PVOID pvEndSig; // Signature at the end
|
|
|
|
} PDEV, *PPDEV;
|
|
|
|
#define SW_DOWN 0
|
|
#define SW_LTOR 1
|
|
#define SW_RTOL 2
|
|
#define SW_UP 4 // enum bottom band first and work towards top
|
|
|
|
//
|
|
// Flags for fMode
|
|
//
|
|
|
|
#define PF_ABORTED 0x00000001 // Output aborted
|
|
#define PF_DOCSTARTED 0x00000002 // Document Started
|
|
#define PF_DOC_SENT 0x00000004 // Indicates start doc cmds sent,
|
|
// this flag is propagated during a resetPDEV.
|
|
#define PF_PAGEPROTECT 0x00000008 // PageProtection
|
|
|
|
// Set in DrvResetPDEV for not sending cmds that cause page eject.
|
|
#define PF_SEND_ONLY_NOEJECT_CMDS 0x00000010
|
|
#define PF_NOEMFSPOOL 0x00000020 // No EMF Spooling
|
|
#define PF_CCW_ROTATE90 0x00000040 // Rotation is 90 degress ccw
|
|
#define PF_ROTATE 0x00000080 // We are doing L->P rotation ourselves since device cannot rotate grx data
|
|
#define PF_NO_RELX_MOVE 0x00000100 // No relative X move cmd
|
|
#define PF_NO_RELY_MOVE 0x00000200 // No relative Y move cmd
|
|
#define PF_NO_XMOVE_CMD 0x00000400 // No X move cmd
|
|
#define PF_NO_YMOVE_CMD 0x00000800 // No Y move cmd
|
|
#define PF_FORCE_BANDING 0x00001000 // Force banding
|
|
#define PF_ENUM_TEXT 0x00002000 // This is a delayed Text Band
|
|
#define PF_REPLAY_BAND 0x00004000 // Enumerate the same band again
|
|
#define PF_ENUM_GRXTXT 0x00008000 // This is a Graphics/Text Band.
|
|
#define PF_RECT_FILL 0x00010000 // device support rect area fill
|
|
#define PF_RESTORE_WHITE_ENTRY 0x00020000 // Restore palette Last entry to original color.
|
|
#define PF_ANYCOLOR_BRUSH 0x00040000 // Device supports programmable color brush.
|
|
#define PF_DOWNLOADED_TEXT 0x00080000 // To indicate we have seen downloaded or device font for the page
|
|
#define PF_WHITEBLACK_BRUSH 0x00100000 // To indicate white/black brush selection cmds
|
|
#define PF_DOWNLOAD_PATTERN 0x00200000 // To indicate support user defined download patter
|
|
#define PF_SHADING_PATTERN 0x00400000 // To indicate support pattern shading
|
|
#define PF_SURFACE_USED 0x00800000 // Indicates the bitmap surface has been used
|
|
#define PF_RECTWHITE_FILL 0x01000000
|
|
#define PF_SURFACE_ERASED 0x02000000 // Indicates entire surface has been cleared
|
|
|
|
#define PF_RESELECTFONT_AFTER_GRXDATA 0x04000000 // Reset font after Graphics
|
|
#define PF_RESELECTFONT_AFTER_XMOVE 0x08000000 // Reset Font after XMOVE
|
|
#define PF_RESELECTFONT_AFTER_FF 0x10000000 // Reset Font after FF
|
|
#define PF_DEVICE_MANAGED 0x20000000 // Indicates a device surface driver
|
|
|
|
#define PF_JOB_SENT 0x40000000 // Indicates job cmds sent, this flag is
|
|
// propagated during a resetPDEV.
|
|
#define PF_SINGLEDOT_FILTER 0x80000000 // Enables filter to expand single pixels
|
|
|
|
//
|
|
// Flags for fMode2
|
|
//
|
|
|
|
#define PF2_MIRRORING_ENABLED 0x00000001 // Indicates to mirror output raster
|
|
#define PF2_WRITE_PRINTER_HOOKED 0x00000002 // One of plug-ins hooks WritePrinter
|
|
#define PF2_CALLING_OEM_WRITE_PRINTER 0x00000004 // a call to an OEM WRitePrinter is in process
|
|
#define PF2_PASSTHROUGH_CALLED_FOR_TTY 0x00000008// DrvEscape with passthrough
|
|
// is called for TTY drv.
|
|
// TTY driver.
|
|
#define PF2_DRVTEXTOUT_CALLED_FOR_TTY 0x00000010 // DrvText is called for TTY.
|
|
#define PF2_INVERTED_ROP_MODE 0x00000020 // Indicates ROPs should be inverted for CMY vs RGB
|
|
#define PF2_WHITEN_SURFACE 0x00000040 // If you want psoDst to be Whitened when
|
|
// psoSrc=STYPE_DEVICE, psoDst=STYPE_BITMAP
|
|
// in DrvCopyBits
|
|
#define PF2_SURFACE_WHITENED 0x00000080 // Just tells that surface has been whitened
|
|
|
|
|
|
//
|
|
// Flags for fYMove
|
|
//
|
|
|
|
#define FYMOVE_FAVOR_LINEFEEDSPACING 0x00000001
|
|
#define FYMOVE_SEND_CR_FIRST 0x00000002
|
|
|
|
//
|
|
// MACROS
|
|
//
|
|
|
|
#define VALID_PDEV(pdev) \
|
|
((pdev) && ((pdev) == (pdev)->pvStartSig) && \
|
|
((pdev) == (pdev)->pvEndSig) && \
|
|
((pdev)->ulID == PDEV_ID))
|
|
|
|
#if DBG
|
|
|
|
#define ASSERT_VALID_PDEV(pdev) ASSERT(VALID_PDEV(pdev))
|
|
|
|
#else // ! DBG
|
|
|
|
#define ASSERT_VALID_PDEV(pdev) \
|
|
if (!(VALID_PDEV(pdev))) \
|
|
{ \
|
|
SetLastError(ERROR_INVALID_PARAMETER); \
|
|
return 0; \
|
|
}
|
|
|
|
#endif // end !DBG
|
|
|
|
//
|
|
// checks for device managed surface
|
|
//
|
|
#define DRIVER_DEVICEMANAGED(pPDev) ((pPDev->fMode) & PF_DEVICE_MANAGED)
|
|
|
|
|
|
#ifndef USERMODE_DRIVER
|
|
|
|
extern HSEMAPHORE ghUniSemaphore;
|
|
|
|
#define DECLARE_CRITICAL_SECTION HSEMAPHORE ghUniSemaphore
|
|
#define INIT_CRITICAL_SECTION() ghUniSemaphore = EngCreateSemaphore()
|
|
#define ENTER_CRITICAL_SECTION() EngAcquireSemaphore(ghUniSemaphore)
|
|
#define LEAVE_CRITICAL_SECTION() EngReleaseSemaphore(ghUniSemaphore)
|
|
#define DELETE_CRITICAL_SECTION() EngDeleteSemaphore(ghUniSemaphore)
|
|
#define IS_VALID_DRIVER_SEMAPHORE() (ghUniSemaphore ? TRUE : FALSE)
|
|
|
|
#else // USERMODE_DRIVER
|
|
|
|
extern CRITICAL_SECTION gUniCritSection;
|
|
|
|
#define DECLARE_CRITICAL_SECTION CRITICAL_SECTION gUniCritSection
|
|
#define INIT_CRITICAL_SECTION() InitializeCriticalSection(&gUniCritSection)
|
|
#define ENTER_CRITICAL_SECTION() EnterCriticalSection(&gUniCritSection)
|
|
#define LEAVE_CRITICAL_SECTION() LeaveCriticalSection(&gUniCritSection)
|
|
#define DELETE_CRITICAL_SECTION() DeleteCriticalSection(&gUniCritSection)
|
|
|
|
#endif // USERMODE_DRIVER
|
|
|
|
|
|
#endif // !_PDEV_H_
|
|
|