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.
 
 
 
 
 
 

448 lines
8.7 KiB

/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
xlenable.cpp
Abstract:
Implementation of enable/disable function for PCLXL
Environment:
Windows Whistler
Revision History:
08/23/99
Created it.
--*/
#include "xlpdev.h"
#include "xldebug.h"
#include <assert.h>
#include "pclxle.h"
#include "pclxlcmd.h"
#include "xlgstate.h"
#include "xloutput.h"
#include "xlbmpcvt.h"
#include "pclxlcmn.h"
#include "xltt.h"
////////////////////////////////////////////////////////////////////////////////
//
// Local function prototypes
//
inline BOOL BIsColor(
IN PDEVOBJ pDevObj);
////////////////////////////////////////////////////////////////////////////////
//
// Functions
//
extern "C" VOID APIENTRY
PCLXLDisableDriver(VOID)
/*++
Routine Description:
IPrintOemUni DisableDriver interface
Free all resources, and get prepared to be unloaded.
Arguments:
Return Value:
Note:
--*/
{
VERBOSE(("PCLXLDisaleDriver() entry.\r\n"));
}
extern "C" PDEVOEM APIENTRY
PCLXLEnablePDEV(
PDEVOBJ pdevobj,
PWSTR pPrinterName,
ULONG cPatterns,
HSURF *phsurfPatterns,
ULONG cjGdiInfo,
GDIINFO *pGdiInfo,
ULONG cjDevInfo,
DEVINFO *pDevInfo,
DRVENABLEDATA *pded)
/*++
Routine Description:
IPrintOemUni EnablePDEV interface
Construct its own PDEV. At this time, the driver also passes a function
table which contains its own implementation of DDI entrypoints
Arguments:
pdevobj - pointer to a DEVOBJ structure. pdevobj->pdevOEM is undefined.
pPrinterName - name of the current printer.
Cpatterns -
phsurfPatterns -
cjGdiInfo - size of GDIINFO
pGdiInfo - a pointer to GDIINFO
cjDevInfo - size of DEVINFO
pDevInfo - These parameters are identical to what39s passed into DrvEnablePDEV.
pded: points to a function table which contains the system driver39s
implementation of DDI entrypoints.
Return Value:
--*/
{
PXLPDEV pxlpdev;
VERBOSE(("PCLXLEnablePDEV() entry.\r\n"));
//
// Allocate the XLPDEV
//
if (!(pxlpdev = (PXLPDEV)MemAllocZ(sizeof(XLPDEV))))
return NULL;
pxlpdev->dwSig = XLPDEV_SIG;
//
// Save UNIDRV PDEV
//
pxlpdev->pPDev = (PPDEV)pdevobj;
//
// HS_HORIZONTAL: 0
// HS_VERTICAL: 1
// HS_BDIAGONAL: 2
// HS_FDIAGONAL: 3
// HS_CROSS: 4
// HS_DIAGCROSS: 5
//
pxlpdev->dwLastBrushID = 10; // Raster pattern ID starts from 10.
//
// Initialize buffers
//
// Text string data
//
pxlpdev->pTransOrg = (PTRANSDATA)NULL;
pxlpdev->dwcbTransSize = 0;
pxlpdev->plWidth = (PLONG)NULL;
pxlpdev->dwcbWidthSize = 0;
//
// Initialize buffers
//
// String cache
//
pxlpdev->pptlCharAdvance = (PPOINTL)NULL;
pxlpdev->pawChar = (PWORD)NULL;
pxlpdev->dwCharCount =
pxlpdev->dwMaxCharCount = 0;
//
// Initalize XOutput
//
pxlpdev->pOutput = new XLOutput;
if (NULL == pxlpdev->pOutput)
{
MemFree(pxlpdev);
return NULL;
}
pxlpdev->pOutput->SetResolutionForBrush(((PPDEV)pdevobj)->ptGrxRes.x);
ColorDepth CD;
if (BIsColor(pdevobj))
{
CD = e24Bit;
}
else
{
CD = e8Bit;
}
pxlpdev->pOutput->SetDeviceColorDepth(CD);
#if DBG
pxlpdev->pOutput->SetOutputDbgLevel(OUTPUTDBG);
pxlpdev->pOutput->SetGStateDbgLevel(GSTATEDBG);
#endif
//
// Initialize device font name buffer
//
if (!SUCCEEDED(StringCchCopyA(pxlpdev->ubFontName, CCHOF(pxlpdev->ubFontName),"MS PCLXLFont ")))
{
delete pxlpdev->pOutput;
MemFree(pxlpdev);
return NULL;
}
//
// Initialize
// Fixed pitch TT
// Number of downloaded TrueType font
//
pxlpdev->dwFixedTTWidth = 0;
pxlpdev->dwNumOfTTFont = 0;
//
// TrueType file object
//
pxlpdev->pTTFile = new XLTrueType;
if (NULL == pxlpdev->pTTFile)
{
delete pxlpdev->pOutput;
MemFree(pxlpdev);
return NULL;
}
//
// Text resolution and Font Height
//
pxlpdev->dwFontHeight =
pxlpdev->dwTextRes = 0;
//
// Text Angle
//
pxlpdev->dwTextAngle = 0;
//
// JPEG support
//
//pDevInfo->flGraphicsCaps2 |= GCAPS2_JPEGSRC;
pDevInfo->flGraphicsCaps |= GCAPS_BEZIERS |
GCAPS_BEZIERS |
//GCAPS_GEOMETRICWIDE |
GCAPS_ALTERNATEFILL |
GCAPS_WINDINGFILL |
GCAPS_NUP |
GCAPS_OPAQUERECT |
GCAPS_COLOR_DITHER |
GCAPS_HORIZSTRIKE |
GCAPS_VERTSTRIKE |
GCAPS_OPAQUERECT;
//
// PCL-XL always expects GDI to give the driver full color information.
// Even if PCLXL may be printing monochrome, it still wants full color info.
//
pDevInfo->cxDither = pDevInfo->cyDither = 0;
pDevInfo->iDitherFormat = BMF_24BPP;
//
// Set cursor offset.
//
pxlpdev->pOutput->SetCursorOffset(((PPDEV)pdevobj)->sf.ptPrintOffsetM.x,
((PPDEV)pdevobj)->sf.ptPrintOffsetM.y);
//
// Return the result
//
return (PDEVOEM)pxlpdev;
}
extern "C" BOOL APIENTRY
PCLXLResetPDEV(
PDEVOBJ pdevobjOld,
PDEVOBJ pdevobjNew)
/*++
Routine Description:
IPrintOemUni ResetPDEV interface
OEMResetPDEV transfers the state of the driver from the old PDEVOBJ to the
new PDEVOBJ when an application calls ResetDC.
Arguments:
pdevobjOld - pdevobj containing Old PDEV
pdevobjNew - pdevobj containing New PDEV
Return Value:
Note:
--*/
{
VERBOSE(("PCLXLResetPDEV entry.\r\n"));
PXLPDEV pxlpdevOld = (PXLPDEV)pdevobjOld->pdevOEM;
PXLPDEV pxlpdevNew = (PXLPDEV)pdevobjNew->pdevOEM;
if (!(pxlpdevOld->dwFlags & XLPDEV_FLAGS_FIRSTPAGE))
{
RemoveAllFonts(pdevobjOld);
}
pxlpdevNew->dwFlags |= XLPDEV_FLAGS_RESETPDEV_CALLED;
return TRUE;
}
extern "C" VOID APIENTRY
PCLXLDisablePDEV(
PDEVOBJ pdevobj)
/*++
Routine Description:
IPrintOemUni DisablePDEV interface
Free resources allocated for the PDEV.
Arguments:
pdevobj -
Return Value:
Note:
--*/
{
PXLPDEV pxlpdev;
VERBOSE(("PCLXLDisablePDEV() entry.\r\n"));
//
// Error check
//
if (!pdevobj)
{
ERR(("PCLXLDisablePDEV(): invalid pdevobj.\r\n"));
return;
}
//
// free memory for XLPDEV and any memory block that hangs off XLPDEV.
//
pxlpdev = (PXLPDEV)pdevobj->pdevOEM;
if (pxlpdev)
{
//
// *Trans data buffer
// *Width data buffer
// *String cache(string and width) buffer
//
if (pxlpdev->pTransOrg)
MemFree(pxlpdev->pTransOrg);
if (pxlpdev->plWidth)
MemFree(pxlpdev->plWidth);
if (pxlpdev->pptlCharAdvance)
MemFree(pxlpdev->pptlCharAdvance);
if (pxlpdev->pawChar)
MemFree(pxlpdev->pawChar);
//
// Delete XLTrueType
//
delete pxlpdev->pTTFile;
//
// Delete XLOutput
//
delete pxlpdev->pOutput;
//
// Delete XLFont
//
delete pxlpdev->pXLFont;
//
// Free XLPDEV
//
MemFree(pxlpdev);
}
}
extern "C"
BOOL
PCLXLDriverDMS(
PVOID pDevObj,
PVOID pBuffer,
DWORD cbSize,
PDWORD pcbNeeded)
/*++
Routine Description:
IPrintOemUni DriverDMS interface
Arguments:
Return Value:
Note:
--*/
{
VERBOSE(("PCLXLDriverDMS() entry.\r\n"));
if (cbSize >= sizeof(DWORD))
{
*(PDWORD)pBuffer =
HOOK_TEXTOUT |
HOOK_LINETO |
HOOK_COPYBITS |
HOOK_BITBLT |
HOOK_STRETCHBLT |
HOOK_PAINT |
HOOK_PLGBLT |
HOOK_STRETCHBLTROP |
HOOK_TRANSPARENTBLT |
HOOK_ALPHABLEND |
HOOK_GRADIENTFILL |
HOOK_STROKEPATH |
HOOK_FILLPATH |
HOOK_STROKEANDFILLPATH;
}
return TRUE;
}
inline BOOL BIsColor(
IN PDEVOBJ pdevobj)
{
//
// If no ColorModeEx is present or if its bColor attribute
// is not set, then its not color.
//
if ( NULL == ((PPDEV)pdevobj)->pColorModeEx ||
FALSE == ((PPDEV)pdevobj)->pColorModeEx->bColor)
{
return FALSE;
}
else
{
return TRUE;
}
}