|
|
//-----------------------------------------------------------------------------
// This files contains the module name for this mini driver. Each mini driver
// must have a unique module name. The module name is used to obtain the
// module handle of this Mini Driver. The module handle is used by the
// generic library to load in tables from the Mini Driver.
//-----------------------------------------------------------------------------
/*++
Copyright (c) 1996-1999 Microsoft Corporation
Module Name:
cmdcb.c
Abstract:
Implementation of GPD command callback for "test.gpd": OEMCommandCallback
Environment:
Windows NT Unidrv driver
Revision History:
04/07/97 -zhanw- Created it.
--*/
#include "pdev.h"
//////////////////////////////////////////////////////////////////////////
// Function: BInitOEMExtraData
//
// Description: Initializes OEM Extra data.
//
//
// Parameters:
//
// pOEMExtra Pointer to a OEM Extra data.
//
// dwSize Size of OEM extra data.
//
//
// Returns: TRUE if successful; FALSE otherwise.
//
//
// Comments:
//
//
// History:
// 02/11/97 APresley Created.
//
//////////////////////////////////////////////////////////////////////////
BOOL BInitOEMExtraData(POEMUD_EXTRADATA pOEMExtra) { // Initialize OEM Extra data.
pOEMExtra->dmExtraHdr.dwSize = sizeof(OEMUD_EXTRADATA); pOEMExtra->dmExtraHdr.dwSignature = OEM_SIGNATURE; pOEMExtra->dmExtraHdr.dwVersion = OEM_VERSION;
pOEMExtra->bComp = FALSE;
return TRUE; }
//////////////////////////////////////////////////////////////////////////
// Function: BMergeOEMExtraData
//
// Description: Validates and merges OEM Extra data.
//
//
// Parameters:
//
// pdmIn pointer to an input OEM private devmode containing the settings
// to be validated and merged. Its size is current.
//
// pdmOut pointer to the output OEM private devmode containing the
// default settings.
//
//
// Returns: TRUE if valid; FALSE otherwise.
//
//
// Comments:
//
//
// History:
// 02/11/97 APresley Created.
// 04/08/97 ZhanW Modified the interface
//
//////////////////////////////////////////////////////////////////////////
BOOL BMergeOEMExtraData( POEMUD_EXTRADATA pdmIn, POEMUD_EXTRADATA pdmOut ) { if(pdmIn && pdmOut) { //
// copy over the private fields, if they are valid
//
pdmOut->bComp = pdmIn->bComp; }
return TRUE; }
#define MASTER_UNIT 600
#define WRITESPOOLBUF(p, s, n) \
((p)->pDrvProcs->DrvWriteSpoolBuf(p, s, n))
#define PARAM(p,n) \
(*((p)+(n)))
//
// Command callback ID's
//
#define CMD_XMOVE_ABS 10 // X-move Absolute
#define CMD_YMOVE_ABS 11 // Y-move Absolute
#define CMD_CR 12
#define CMD_LF 13
#define CMD_SEND_BLOCK_DATA 14
#define CMD_ENABLE_OEM_COMP 15
#define CMD_DISALBE_COMP 16
INT APIENTRY OEMCommandCallback( PDEVOBJ pdevobj, DWORD dwCmdCbID, DWORD dwCount, PDWORD pdwParams ) { INT i; BYTE Cmd[16]; DWORD dwDestX, dwDestY; DWORD dwDataWidth; DWORD dwDataSize; INT iRet = 0;
POEMUD_EXTRADATA lpOemData;
VERBOSE(("OEMCommandCallback entry - %d, %d\r\n", dwCmdCbID, dwCount));
//
// verify pdevobj okay
//
ASSERT(VALID_PDEVOBJ(pdevobj));
lpOemData = (POEMUD_EXTRADATA)(pdevobj->pOEMDM);
//
// fill in printer commands
//
i = 0;
switch (dwCmdCbID) {
case CMD_XMOVE_ABS: case CMD_YMOVE_ABS:
//
// The commands require 4 parameters
//
if (dwCount < 4 || !pdwParams) return 0;
VERBOSE(("MOVE_ABS - %d, %d, %d, %d\r\n", PARAM(pdwParams, 0),PARAM(pdwParams, 1), PARAM(pdwParams, 2),PARAM(pdwParams, 3)));
dwDestX = (PARAM(pdwParams, 0) * PARAM(pdwParams, 2)) / MASTER_UNIT; dwDestY = (PARAM(pdwParams, 1) * PARAM(pdwParams, 3)) / MASTER_UNIT;
Cmd[i++] = (BYTE)'\x9B'; Cmd[i++] = 'P'; Cmd[i++] = (BYTE)(dwDestX >> 8); Cmd[i++] = (BYTE)(dwDestX); Cmd[i++] = (BYTE)(dwDestY >> 8); Cmd[i++] = (BYTE)(dwDestY);
WRITESPOOLBUF(pdevobj, Cmd, i);
switch (dwCmdCbID) { case CMD_XMOVE_ABS: iRet = dwDestX; break; case CMD_YMOVE_ABS: iRet = dwDestY; break; } break;
case CMD_CR: // Added to check the NULL pointer.
if (pdwParams == NULL) return -1;
dwDestY = (PARAM(pdwParams, 0) * PARAM(pdwParams, 1)) / MASTER_UNIT;
Cmd[i++] = (BYTE)'\x9B'; Cmd[i++] = 'P'; Cmd[i++] = 0; Cmd[i++] = 0; Cmd[i++] = (BYTE)(dwDestY >> 8); Cmd[i++] = (BYTE)dwDestY;
WRITESPOOLBUF(pdevobj, Cmd, i);
break;
case CMD_LF: // DUMMY entry.
break;
case CMD_SEND_BLOCK_DATA: // Added to check the NULL pointer.
if (pdwParams == NULL) return -1;
dwDataWidth = PARAM(pdwParams, 0) * 8;
Cmd[i++] = (BYTE)'\x9B'; Cmd[i++] = 'S'; Cmd[i++] = (BYTE)(dwDataWidth >> 8); Cmd[i++] = (BYTE)(dwDataWidth);
// In case it is OEMCompression data, we already
// embedded printing command and data length.
if (!lpOemData->bComp) { dwDataSize = PARAM(pdwParams, 1); Cmd[i++] = (BYTE)'\x9B'; Cmd[i++] = 'I'; Cmd[i++] = COMP_NONE; Cmd[i++] = (BYTE)(dwDataSize >> 8); Cmd[i++] = (BYTE)(dwDataSize); }
WRITESPOOLBUF(pdevobj, Cmd, i); break;
case CMD_ENABLE_OEM_COMP: lpOemData->bComp = TRUE; break;
case CMD_DISALBE_COMP: lpOemData->bComp = FALSE; break; }
return iRet; }
INT APIENTRY OEMCompression( PDEVOBJ pdevobj, PBYTE pInBuf, PBYTE pOutBuf, DWORD dwInLen, DWORD dwOutLen) { INT iRet = -1; INT iRetRLE, iRetMHE; DWORD dwMHECeil = 0xc00000; // Can be any.
if (pInBuf == NULL && dwInLen != 0) return -1; if (pOutBuf == NULL && dwOutLen != 0) return -1;
// Compression algorithm (per each scanline)
#if defined(RLETEST)
if (LGCompRLE(NULL, pInBuf, dwInLen, 1) <= (INT)(dwOutLen * 2 / 3)) { iRet = LGCompRLE(pOutBuf, pInBuf, dwInLen, 1); }
#elif defined(MHETEST)
if (LGCompMHE(NULL, pInBuf, dwInLen, 1) <= (INT)(dwOutLen * 2 / 3)) { iRet = LGCompMHE(pOutBuf, pInBuf, dwInLen, 1); }
#else // Normal case.
iRetRLE = LGCompRLE(NULL, pInBuf, dwInLen, 1); if (iRetRLE >= 0 && iRetRLE < (INT)dwInLen / 2) {
// Ok with RLE.
iRet = LGCompRLE(pOutBuf, pInBuf, dwInLen, 1); } else if (iRetRLE <= (INT)dwInLen) {
// Try MHE.
iRetMHE = LGCompMHE(NULL, pInBuf, dwInLen, 1); if (iRetMHE > 0 && iRetMHE < iRetRLE && iRetMHE < (INT)dwMHECeil) {
// Go with MHE.
iRet = LGCompMHE(pOutBuf, pInBuf, dwInLen, 1); } else { // Go with RLE.
iRet = LGCompRLE(pOutBuf, pInBuf, dwInLen, 1); } } #endif // NORMAL
VERBOSE(("OEMCompression - dwInLen=%d,dwOutLen=%d,iRet = %d\n", dwInLen, dwOutLen, iRet));
return iRet; }
|