Leaked source code of windows server 2003
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.
 
 
 
 
 
 

356 lines
13 KiB

/*++
Copyright (c) 1990-2003 Microsoft Corporation
Module Name:
plotters.h
Abstract:
This module contains basic plotter infomation to be includes by most of
the source file
This module contains the bulk of the plotter driver defines. It is included
by most modules.
Development History:
18-Nov-1993 Thu 01:25:51 created
Wrote for the Windows.
07-Dec-1993 Tue 01:14:40 updated
another round of clean up, adding new PDEV stuff
21-Dec-1993 Tue 10:58:03 updated
Change PLOTFORM's flags
Replaced PAL_BGR_ENTRY with PALENTRY and moved all pen cached stuff to
local output.c
06-Jan-1994 Thu 00:05:56 updated
remove PLOTTER_UNIT_DPI and used pPlotGPC->PlotXDPI in GPC,
change PDEV's wCurPenSelected to CurPenSelected (WORD to LONG) to have
DWORD aligned for next field in the structure.
14-Jan-1994 Fri 20:24:12 updated
Change DEVBRUSH
19-Jan-1994 Wed 14:28:45 updated
Adding hack to handle EngStretchBlt() to our own temp surfobj
27-Jan-1994 Thu 23:38:48 updated
Add DBCACHE structure, modify PDEV to handle cached fill type and
cached User defined pattern
03-Mar-1994 Thu 09:40:36 updated
Remove dead stufff which confused, adding minimum required DDI version
for this plotter driver to run
18-Mar-1994 Fri 12:58:24 updated
Adding ptlRTLCAP in PDEV to catch the RTL relative position problem
Adding PLOTF_RTL_NO_DPI_XY, PLOTF_RTLMONO_NO_CID and
PLOTF_RTLMONO_FIXPAL flags
12-Apr-1994 Tue 14:14:15 updated
Changed DIVRNDUP from +0.5 round up to round to next smallest integer
[Environment:]
GDI Device Driver - Plotter.
[Notes:]
13-Apr-1994 Wed 14:29:57 updated
FXTOL(x) is assumed to be (X >> 4) (Defined by WINDDI.H)
LTOFX(x) is (X << 4)
IF WINDDI.H changes that definition then we must change LTOFX and
FXTOL2(x)
Revision History:
--*/
#ifndef _PLOTTER_MAIN_HEADER_
#define _PLOTTER_MAIN_HEADER_
#define DRIVER_VERSION 0x0500
#define COUNT_ARRAY(x) (sizeof((x)) / sizeof((x)[0]))
#define ABS(Value) ((Value) > 0 ? (Value) : (-(Value)))
#define DW_ALIGN(x) (((DWORD)(x) + 3) & ~(DWORD)3)
//
// In order to have the style units mean something we break them up
// into units that are 1/25 of an inch.
//
#define PLOT_STYLE_STEP(p) ((p)->lCurResolution / 25)
//
// Define where WHITE is when the plotter driver is a Pallete device
//
#define WHITE_INDEX 0
//
// The PALENTRY is the correct RGB order for the plotter driver, if any changes
// need to be made to the order then only this structure needs to be changed.
//
// CURRENTLY it is in Blue/Green/Red order, for accessing bits in the BGR format
// instead of RGB
//
typedef struct PALENTRY {
BYTE B;
BYTE G;
BYTE R;
BYTE Flags;
} PALENTRY, FAR *PPALENTRY;
#define PFF_ROT_COORD_L90 0x0001
#define PFF_FLIP_X_COORD 0x0002
#define PFF_FLIP_Y_COORD 0x0004
#define BMP_ROT_NONE 0
#define BMP_ROT_RIGHT_90 1
typedef struct _PLOTFORM {
WORD Flags; // PFF_xxxx flags;
BYTE BmpRotMode; // BMP_ROT_xxx
BYTE NotUsed; // not used
SIZEL PlotSize; // Hard Clip Limit SIZE Size for PS cmd
POINTL PhyOrg; // Physical origin from PlotSize origin
SIZEL LogSize; // Logical Paper Size in 1/1000mm unit
POINTL LogOrg; // Logical left/top margin in 1/1000mm unit
SIZEL LogExt; // Printable area in 1/1000mm unit
POINTL BmpOffset; // Bitmap Offset location
} PLOTFORM, FAR *PPLOTFORM;
//
// Define the PDEV that this driver uses.
//
#define PDEV_BEG_ID 'tolP'
#define PDEV_END_ID 'VEDP'
#define RF_MAX_IDX 8
typedef struct _DBCACHE {
WORD RFIndex; // RF command index 1-RF_MAX_IDX
WORD DBUniq; // unique for cache
} DBCACHE, FAR *PDBCACHE;
typedef struct _INTDECIW {
WORD Integer;
WORD Decimal;
} INTDECIW, *PINTDECIW;
#define PW_HATCH_INT 0
#define PW_HATCH_DECI 26
typedef struct _PDEV {
DWORD PDEVBegID; // Check if we got the right one
DWORD SizePDEV; // pdev size to be checked against
DWORD Flags; // PDEVF_xxx
HDEV hpdev; // Engines handle to this structure
HSURF hsurf; // Engine's handle to drawing surface
HPALETTE hPalDefault; // default palette for pdev
SURFOBJ *pso; // Current surface
HANDLE hPrinter; // handle to the current pdev printer
SURFOBJ *psoHTBlt; // temporary blt surfobj
RECTL rclHTBlt; // location for curreent psoHTBlt
PPLOTGPC pPlotGPC; // plotter characterization data
LPBYTE pOutBuffer; // output buffer location
DWORD cbBufferBytes; // current count of bytes in output buffer
PLOTDEVMODE PlotDM; // plotter extended devmode structure
FORMSIZE CurForm; // Current user requested form
PAPERINFO CurPaper; // current loaded paper
PPDATA PPData; // PrinterProperties data PPDATA
PLOTFORM PlotForm; // computed current selected form
LONG lCurResolution; // The current resolution.
LONG VertRes; // Printable page height, pels
LONG HorzRes; // Printable page width, pels
POINTL ptlAnchorCorner; // current brush origin.
POINTL ptlRTLCAP; // Current RTL CAP
RECTL rclCurClip; // current clipping rectangle
LPVOID pTransPosTable; // bitmap rotation xlate table
LPVOID pvDrvHTData; // device's halftone info
LPVOID pPenCache; // Pointer to the device pen cache
LONG BrightestPen; // brightest pen for pen plotter
LONG CurPenSelected; // Tracks the pen currently in plotter
WORD LastDevROP; // Current MERGE (ROP2) sent to plotter
WORD Rop3CopyBits; // Rop3 used in DrvCopyBits()
WORD LastFillTypeIndex; // last filltype (FT) index sent
WORD LastLineType; // Last line type used (LT)
WORD MinLToDevL; // Min RasDPI->PlotDPI Transform unit
WORD DevBrushUniq; // uniq number for DEVBRUSH cache
INTDECIW PenWidth; // pen width variable cache
DBCACHE DBCache[RF_MAX_IDX];// DevBrush cache
DWORD PDEVEndID; // ending block ID checking
} PDEV, *PPDEV;
//
// Following are the flags for pPDev->Flags
//
#define PDEVF_CANCEL_JOB 0x80000000
#define PDEVF_IN_BANDHTBLT 0x00000001
#define PDEVF_PP_CENTER 0x00000002
#define PDEVF_HAS_CLIPRECT 0x00000004
#define PLOT_CANCEL_JOB(pPDev) (pPDev->Flags & PDEVF_CANCEL_JOB)
//
// Following are the flags definitions for the GPC data
//
#define GET_PLOTFLAGS(pPDev) (DWORD)(pPDev->pPlotGPC->Flags)
#define PF_RASTER(PlotFlags) (PlotFlags & PLOTF_RASTER)
#define PF_COLOR(PlotFlags) (PlotFlags & PLOTF_COLOR)
#define PF_BEZIER(PlotFlags) (PlotFlags & PLOTF_BEZIER)
#define PF_TRANSPARENT(PlotFlags) (PlotFlags & PLOTF_TRANSPARENT)
#define PF_WINDINGFILL(PlotFlags) (PlotFlags & PLOTF_WINDINGFILL)
#define PF_ROLLFEED(PlotFlags) (PlotFlags & PLOTF_ROLLFEED)
#define PF_PAPERTRAY(PlotFlags) (PlotFlags & PLOTF_PAPERTRAY)
#define PF_BYTEALIGN(PlotFlags) (PlotFlags & PLOTF_RASTERBYTEALIGN)
#define PF_PUSHPAL(PlotFlags) (PlotFlags & PLOTF_PUSHPOPPAL)
#define PF_NO_BMP_FONT(PlotFlags) (PlotFlags & PLOTF_NO_BMP_FONT)
#define PF_RTLMONOENCODE_5(PlotFlags) (PlotFlags & PLOTF_RTLMONOENCODE_5)
#define PF_RTL_NO_DPI_XY(PlotFlags) (PlotFlags & PLOTF_RTL_NO_DPI_XY)
#define PF_RTLMONO_NO_CID(PlotFlags) (PlotFlags & PLOTF_RTLMONO_NO_CID)
#define PF_RTLMONO_FIXPAL(PlotFlags) (PlotFlags & PLOTF_RTLMONO_FIXPAL)
#define IS_RASTER(pPDev) (pPDev->pPlotGPC->Flags&PLOTF_RASTER)
#define IS_COLOR(pPDev) (pPDev->pPlotGPC->Flags&PLOTF_COLOR)
#define IS_BEZIER(pPDev) (pPDev->pPlotGPC->Flags&PLOTF_BEZIER)
#define IS_TRANSPARENT(pPDev) (pPDev->pPlotGPC->Flags&PLOTF_TRANSPARENT)
#define IS_WINDINGFILL(pPDev) (pPDev->pPlotGPC->Flags&PLOTF_WINDINGFILL)
#define IS_ROLLFEED(pPDev) (pPDev->pPlotGPC->Flags&PLOTF_ROLLFEED)
#define HAS_PAPERTRAY(pPDev) (pPDev->pPlotGPC->Flags&PLOTF_PAPERTRAY)
#define NEED_BYTEALIGN(pPDev) (pPDev->pPlotGPC->Flags&PLOTF_RASTERBYTEALIGN)
#define NEED_PUSHPAL(pPDev) (pPDev->pPlotGPC->Flags&PLOTF_PUSHPOPPAL)
#define NO_BMP_FONT(pPDev) (pPDev->pPlotGPC->Flags&PLOTF_NO_BMP_FONT)
#define RTLMONOENCODE_5(pPDev) (pPDev->pPlotGPC->Flags&PLOTF_RTLMONOENCODE_5)
#define RTL_NO_DPI_XY(pPDev) (pPDev->pPlotGPC->Flags&PLOTF_RTL_NO_DPI_XY)
#define RTLMONO_NO_CID(pPDev) (pPDev->pPlotGPC->Flags&PLOTF_RTLMONO_NO_CID)
#define RTLMONO_FIXPAL(pPDev) (pPDev->pPlotGPC->Flags&PLOTF_RTLMONO_FIXPAL)
#define HTPATSIZE(pPDev) (((pPDev->pPlotGPC->HTPatternSize>>1)+1)<<1)
#define HTBMPFORMAT(pPDev) (((PDRVHTINFO)(pPDev->pvDrvHTData))->HTBmpFormat)
#define DB_INV_PATIDX 0xFFFF
//
// This structure defines our realization of a logical brush. Since GDI
// asks us to construct this, GDI keeps giving it back to us
//
typedef struct _DEVBRUSH {
SURFOBJ *psoMask; // the mask for the pattern
WORD PatIndex; // Pattern Index (iHatch HS_xxxx)
WORD Uniq; // Uniq number for DEVBRUSH
LONG LineSpacing; // Brush line spacing
DWORD ColorFG; // foreground color of the brush
DWORD ColorBG; // background color of the brush
SIZEL sizlBitmap; // sizeof the bitmap
LONG ScanLineDelta; // Number of bytes to move per scanline
WORD BmpFormat; // format of the bitmap
WORD BmpFlags; // Flags in surfobj
LPBYTE pbgr24; // 24bpp BGR bitmap for user pattern
WORD cxbgr24; // cx Size of the BGR
WORD cybgr24; // cy Size of the BGR
BYTE BmpBits[32]; // pattern bitmap. (min 8x8 of 4bpp)
} DEVBRUSH, *PDEVBRUSH;
//
// data_structure used in GenPolyGon()
//
typedef struct _POLYGONDATA {
PPDEV pPDev;
SURFOBJ *pso; // only required in GenPolygonPath()
PATHOBJ *ppo;
CLIPOBJ *pco;
DEVBRUSH *pBrush;
PPOINTL pptlBrushOrg;
RECTL *prectl;
short iType; // only required in GenPolygon()
MIX mixMode;
BRUSHOBJ *pBrushToUse;
} POLYGONDATA, *PPOLYGONDATA;
//
// Conversion type of things
//
#define DIVROUND(x,y) ((y)?(((LONG)(x)+(LONG)((y)>>1))/(LONG)(y)):0)
#define DIVRNDUP(x,y) ((y)?(((LONG)(x)+(LONG)((y)-1))/(LONG)(y)):0)
#define __PLOT_DPI (LONG)pPDev->pPlotGPC->PlotXDPI
#define _PLOT_DPI (LONG)pPlotGPC->PlotXDPI
#define _CURR_DPI (LONG)pPDev->lCurResolution
#define LTOFX(x) ((x)<<4)
#define DMTOSPL(dm) ((LONG)(dm) * 100L)
#define SPLTODM(spl) (SHORT)DIVROUND(spl, 100)
#define MMTODM(mm) ((LONG)(mm) * 10L)
#define DMTOENGUNITS(pPDev, dm) DIVROUND((dm)*_CURR_DPI, 254)
#define DMTOPLOTUNITS(pPlotGPC, dm) DIVROUND((dm)*_PLOT_DPI, 254)
#define MMTOENGUNITS(pPDev, mm) DMTOENGUNITS(pPDev, MMTODM(mm))
#define MMTOPLOTUNITS(pPlotGPC, mm) DMTOPLOTUNITS(pPlotGPC, MMTODM(mm))
#define SPLTOENGUNITS(pPDev, spl) DIVROUND((spl/100)*_CURR_DPI, 254)
#define SPLTOPLOTUNITS(pPlotGPC, spl) DIVROUND((spl/100)*_PLOT_DPI, 254)
//
// Change to using Raster DPI as user unit
//
// #define ENGTODEV(pPDev, x) DIVROUND((x)*__PLOT_DPI, _CURR_DPI)
//
#define ENGTODEV(pPDev, x) (x)
#define FXTODEVL(pPDev, x) ENGTODEV(pPDev, FXTOLROUND(x))
#define LTODEVL(pPDev, x) ENGTODEV(pPDev, x)
//
// Minimum type of form supported
//
#define MIN_SPL_FORM_CX MIN_PLOTGPC_FORM_CX
#define MIN_SPL_FORM_CY MIN_PLOTGPC_FORM_CY
#define MIN_DM_FORM_CX SPLTODM(MIN_SPL_FORM_CX)
#define MIN_DM_FORM_CY SPLTODM(MIN_SPL_FORM_CY)
//
// Finally include this one in order to validate the PDEV
//
#include "pdevinfo.h"
#endif // _PLOTTER_MAIN_HEADER_