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.
225 lines
6.3 KiB
225 lines
6.3 KiB
#include <windef.h>
|
|
#include <wingdi.h>
|
|
#include <unidrv.h>
|
|
|
|
#include "../modinit.c"
|
|
|
|
#define SCANLINE_BUFFER_SIZE 1280 // A3 landscape scanline length + extra
|
|
|
|
// Delta Raw Compression routine
|
|
int DeltaRawCompress(LPBYTE, LPBYTE, LPBYTE, WORD, WORD);
|
|
|
|
LPWRITESPOOLBUF WriteSpoolBuf;
|
|
LPALLOCMEM UniDrvAllocMem;
|
|
LPFREEMEM UniDrvFreeMem;
|
|
|
|
typedef struct tagQLASERDV
|
|
{
|
|
BOOL bFirst;
|
|
WORD wLastScanLineLen;
|
|
BYTE lpLastScanLine[SCANLINE_BUFFER_SIZE];
|
|
} QLASERDV, FAR *LPQLASERDV;
|
|
|
|
|
|
BOOL MiniDrvEnablePDEV(LPDV lpdv, ULONG *pdevcaps)
|
|
{
|
|
lpdv->fMdv = FALSE;
|
|
if (!(lpdv->lpMdv = UniDrvAllocMem(sizeof(QLASERDV))))
|
|
return FALSE;
|
|
|
|
lpdv->fMdv = TRUE;
|
|
((LPQLASERDV)lpdv->lpMdv)->bFirst = FALSE;
|
|
((LPQLASERDV)lpdv->lpMdv)->wLastScanLineLen = 0;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
VOID MiniDrvDisablePDEV(LPDV lpdv)
|
|
{
|
|
if (lpdv->fMdv)
|
|
{
|
|
UniDrvFreeMem(lpdv->lpMdv);
|
|
lpdv->fMdv = FALSE;
|
|
}
|
|
}
|
|
|
|
|
|
VOID FAR PASCAL fnOEMOutputCmd(LPDV lpdv, WORD wCmdCbId, PDWORD lpdwParams)
|
|
{
|
|
if (wCmdCbId == 1) // StartPage
|
|
{
|
|
WriteSpoolBuf(lpdv, "\033}0;0;3B", 8);
|
|
((LPQLASERDV)lpdv->lpMdv)->bFirst = TRUE;
|
|
}
|
|
}
|
|
|
|
|
|
WORD FAR PASCAL CBFilterGraphics(LPDV lpdv, LPBYTE lpBuf, WORD wLen)
|
|
{
|
|
BYTE CompressedScanLine[SCANLINE_BUFFER_SIZE];
|
|
BYTE HeaderScanLine[4];
|
|
WORD nCompBufLen;
|
|
LPQLASERDV lpQDV = lpdv->lpMdv;
|
|
|
|
if (lpQDV->bFirst)
|
|
{
|
|
ZeroMemory(lpQDV->lpLastScanLine, (WORD)SCANLINE_BUFFER_SIZE);
|
|
lpQDV->bFirst = FALSE;
|
|
}
|
|
nCompBufLen = (WORD) DeltaRawCompress(lpBuf, lpQDV->lpLastScanLine,
|
|
CompressedScanLine, (lpQDV->wLastScanLineLen > wLen)
|
|
? lpQDV->wLastScanLineLen : wLen, 0);
|
|
|
|
HeaderScanLine[0] = 0;
|
|
HeaderScanLine[1] = 0;
|
|
HeaderScanLine[2] = (BYTE) (nCompBufLen >> 8);
|
|
HeaderScanLine[3] = (BYTE) nCompBufLen;
|
|
WriteSpoolBuf(lpdv, (LPBYTE) HeaderScanLine, 4);
|
|
WriteSpoolBuf(lpdv, (LPBYTE) CompressedScanLine, nCompBufLen);
|
|
|
|
CopyMemory(lpQDV->lpLastScanLine, lpBuf, wLen);
|
|
if (lpQDV->wLastScanLineLen > wLen)
|
|
ZeroMemory(lpQDV->lpLastScanLine + wLen, lpQDV->wLastScanLineLen - wLen);
|
|
lpQDV->wLastScanLineLen = wLen;
|
|
|
|
return nCompBufLen;
|
|
}
|
|
|
|
|
|
DRVFN MiniDrvFnTab[] =
|
|
{
|
|
{ INDEX_MiniDrvEnablePDEV, (PFN)MiniDrvEnablePDEV },
|
|
{ INDEX_MiniDrvDisablePDEV, (PFN)MiniDrvDisablePDEV },
|
|
{ INDEX_OEMOutputCmd, (PFN)fnOEMOutputCmd },
|
|
{ INDEX_OEMWriteSpoolBuf, (PFN)CBFilterGraphics },
|
|
};
|
|
|
|
|
|
BOOL MiniDrvEnableDriver(MINIDRVENABLEDATA *pEnableData)
|
|
{
|
|
if (pEnableData == NULL)
|
|
return FALSE;
|
|
|
|
if (pEnableData->cbSize == 0)
|
|
{
|
|
pEnableData->cbSize = sizeof (MINIDRVENABLEDATA);
|
|
return TRUE;
|
|
}
|
|
|
|
if (pEnableData->cbSize < sizeof (MINIDRVENABLEDATA)
|
|
|| HIBYTE(pEnableData->DriverVersion)
|
|
< HIBYTE(MDI_DRIVER_VERSION))
|
|
{
|
|
// Wrong size and/or mismatched version
|
|
return FALSE;
|
|
}
|
|
|
|
// Load callbacks provided by the Unidriver
|
|
if (!bLoadUniDrvCallBack(pEnableData,
|
|
INDEX_UniDrvWriteSpoolBuf, (PFN *) &WriteSpoolBuf)
|
|
|| !bLoadUniDrvCallBack(pEnableData,
|
|
INDEX_UniDrvAllocMem, (PFN *) &UniDrvAllocMem)
|
|
|| !bLoadUniDrvCallBack(pEnableData,
|
|
INDEX_UniDrvFreeMem, (PFN *) &UniDrvFreeMem))
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
pEnableData->cMiniDrvFn
|
|
= sizeof (MiniDrvFnTab) / sizeof(MiniDrvFnTab[0]);
|
|
pEnableData->pMiniDrvFn = MiniDrvFnTab;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*************************************************
|
|
*
|
|
* Image Delta Compression Routine
|
|
*
|
|
*===================================================
|
|
* Input:
|
|
* nbyte : # of byte, raw data
|
|
* Image_string: pointer of raw data
|
|
* Prn_string : pointer of compress data
|
|
* Output:
|
|
* Ret_count : # of byte, compress data
|
|
**************************************************/
|
|
int DeltaRawCompress( Image_string, //pbData,
|
|
ORG_image, //pbSeedRow,
|
|
Prn_string, //pbReturn,
|
|
nbyte, //usTotalBytes
|
|
nMagics) //Magic number
|
|
LPBYTE Image_string; /* pointer to original string */
|
|
LPBYTE ORG_image; /* pointer to previous scanline's string */
|
|
LPBYTE Prn_string; /* pointer to return string */
|
|
WORD nbyte; /* original number of bytes */
|
|
WORD nMagics; //Magic number
|
|
{
|
|
int c, Ret_count, Skip_flag, Skip_count;
|
|
unsigned int i, j, k, outcount;
|
|
LPBYTE Diff_ptr;
|
|
LPBYTE ORG_ptr;
|
|
LPBYTE Skip_ptr;
|
|
BYTE Diff_byte;
|
|
BYTE Diff_mask[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
|
|
|
|
BOOL bstart = TRUE;
|
|
|
|
outcount = 0;
|
|
Ret_count = 0;
|
|
ORG_ptr = ORG_image;
|
|
Skip_flag = TRUE;
|
|
|
|
Skip_ptr = Prn_string++;
|
|
*Skip_ptr = Skip_count = (nMagics/8)/8;
|
|
|
|
k = (nbyte+7)/8;
|
|
for(i=0;i<k;i++)
|
|
{
|
|
Diff_byte = 0;
|
|
Diff_ptr = Prn_string++;
|
|
|
|
for(j=0;j<8;j++)
|
|
{
|
|
if ( (i*8+j) >= nbyte ){
|
|
*Prn_string++= 0;
|
|
Diff_byte |= Diff_mask[j];
|
|
outcount++;
|
|
} else {
|
|
c = *Image_string++;
|
|
if(c != *ORG_ptr){
|
|
*ORG_ptr++ = c;
|
|
*Prn_string++= c;
|
|
Diff_byte |= Diff_mask[j];
|
|
outcount++;
|
|
} else {
|
|
ORG_ptr++;
|
|
}
|
|
}
|
|
}
|
|
if(Diff_byte == 0){
|
|
if(Skip_flag == TRUE){
|
|
Skip_count++;
|
|
Prn_string--;
|
|
}else{
|
|
*Diff_ptr = Diff_byte;
|
|
outcount++;
|
|
}
|
|
}else{
|
|
if(Skip_flag == TRUE){
|
|
Skip_flag = FALSE;
|
|
*Skip_ptr = Skip_count;
|
|
outcount++;
|
|
*Diff_ptr = Diff_byte;
|
|
outcount++;
|
|
}else{
|
|
*Diff_ptr = Diff_byte;
|
|
outcount++;
|
|
}
|
|
Ret_count = outcount;
|
|
}
|
|
}
|
|
return(Ret_count);
|
|
}
|