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.
 
 
 
 
 
 

476 lines
13 KiB

//
// fuband.c
//
// August.26,1997 H.Ishida(FPL)
// fuxlres.dll (NT5.0 MiniDriver)
//
// July.31,1996 H.Ishida (FPL)
// FUXL.DLL (NT4.0 MiniDriver)
//
#include "fuxl.h"
#include "fumh.h"
#include "fumh2.h"
#include "fuband.h"
#include "fuimg2.h"
#include "fuimg4.h"
#include "fudebug.h"
//
// FjBAND:
// In Win-F image command(RTGIMG2 and RTGIMG4), image coordinate must
// be a multiple of 32. But I can't create such a GPC file for RasDD.
// Some image data, not on 32x32 grid, must be buffered in FjBAND,
// width:papser width, height:32, x-coordinate:0, y-coordinate:a multiple
// of 32.
//
// Image to be output
// (0, y)
// A----------------------------------+
// | partA |
// B----------------------------------+
// | partB |
// | |
// | |
// C----------------------------------+
// | partC |
// D----------------------------------+
//
// I split source image to 3 part.
// A: top of image, is not a multiple of 32.
// B: top of image, is a multiple of 32.
// C: bottom of image, is a multilpe of 32.
// D: bottom of image, is not a multile of 32.
//
// partA: A to B. this part is buffered in FjBAND, ORed on
// previousely written image.
// partB: B to C. this part is not bufferd, output immediately.
// partC: C to D. this part is buffered in FjBAND, may be ORed
// partA of next image.
//
#define FUXL_BANDHEIGHT 32
//
// void fuxlInitBand(PFUXLPDEV pFuxlPDEV) // fuxlres private PDEV
//
// This function initializes FjBAND, but not allocate memory for band.
//
void fuxlInitBand(PFUXLPDEV pFuxlPDEV)
{
int i;
pFuxlPDEV->cBandByteWidth = (pFuxlPDEV->cxPage + 7) / 8;
i = 0x10000L / pFuxlPDEV->cBandByteWidth;
pFuxlPDEV->cyBandSegment = i - (i % FUXL_BANDHEIGHT);
pFuxlPDEV->pbBand = NULL;
pFuxlPDEV->cbBand = FUXL_BANDHEIGHT * pFuxlPDEV->cBandByteWidth;
pFuxlPDEV->yBandTop = 0;
pFuxlPDEV->bBandDirty = FALSE;
pFuxlPDEV->bBandError = FALSE;
}
//
// BOOL fuxlEnableBand(
// PFUXLPDEV pFuxlPDEV // fuxlres private PDEV
// );
//
// This function allocates memory for FjBAND.
//
// Return Values
// TRUE: band memory is allocated.
// FALSE: band memory is not allocated.
//
BOOL fuxlEnableBand(PFUXLPDEV pFuxlPDEV)
{
DWORD cbBand;
pFuxlPDEV->pbBand = (LPBYTE)MemAllocZ(pFuxlPDEV->cbBand);
if(pFuxlPDEV->pbBand == NULL){
pFuxlPDEV->bBandError = TRUE;
return FALSE;
}
memset(pFuxlPDEV->pbBand, 0, pFuxlPDEV->cbBand);
pFuxlPDEV->bBandDirty = FALSE;
return TRUE;
}
//
// void fuxlDisableBand(
// PFUXLPDEV pFuxlPDEV // fuxlres private PDEV
// );
//
// This function frees memory for FjBAND.
//
void fuxlDisableBand(PFUXLPDEV pFuxlPDEV)
{
if(pFuxlPDEV->pbBand != NULL){
MemFree(pFuxlPDEV->pbBand);
pFuxlPDEV->pbBand = NULL;
}
pFuxlPDEV->bBandError = FALSE;
}
//
// void fuxlCopyBand(
// PDEVOBJ pdevobj, // MINI5 data
// LPBYTE pBuff, // address of source image data.
// LONG lDelta, // width of source image data(in bytes)
// int y, // y-coordinate of source image.
// int cy // height of source image data(scanline)
// );
//
// This function copies source image data to FjBAND.
//
//
void fuxlCopyBand(PDEVOBJ pdevobj, LPCBYTE pbSrc, int cSrcBandWidth, int y, int cy)
{
PFUXLPDEV pFuxlPDEV;
LPCBYTE pbSrcTmp;
LPBYTE pbDst;
LPBYTE pbDstTmp;
int i;
int j;
UINT uTmp;
pFuxlPDEV = (PFUXLPDEV)pdevobj->pdevOEM;
if(pFuxlPDEV->yBandTop <= y && y + cy <= pFuxlPDEV->yBandTop + FUXL_BANDHEIGHT){
pbDst = pFuxlPDEV->pbBand + (y - pFuxlPDEV->yBandTop) * pFuxlPDEV->cBandByteWidth;
uTmp = 0;
for(i = cy; i > 0; --i){
pbDstTmp = pbDst;
for(j = cSrcBandWidth; j > 0; --j){
uTmp |= *pbSrc;
*pbDstTmp++ |= *pbSrc++;
}
pbDst += pFuxlPDEV->cBandByteWidth;
}
if(uTmp != 0)
pFuxlPDEV->bBandDirty = TRUE;
}
}
//
// BOOL fuxlOutputMH(
// PDEVOBJ pdevobj // MINI5 data
// LPCBYTE pbSrc, // address of source image data.
// LONG lDelta, // width of source image data(in byte).
// int y, // y-coordinate of source image data.
// int cy // height of source image data(scanline).
// );
//
// This function outputs image, uses FM-MH(old type).
//
// Return Values
// TRUE: output succeeded.
// FALSE: output failed.
// memory allocate error, or
// MH compression is not effecive for this image data.
//
BOOL fuxlOutputMH(PDEVOBJ pdevobj, LPCBYTE pbSrc, int cSrcBandWidth, int y, int cy)
{
BOOL bResult;
LPBYTE pDest;
LONG cb;
LONG cDestN;
DWORD cbMHData;
BYTE abTmp[10];
bResult = FALSE;
cb = cSrcBandWidth * cy;
cDestN = (cb + 1) / 2;
pDest = (LPBYTE)MemAllocZ(cDestN);
if(pDest != NULL){
cbMHData = (WORD)MhCompress(pDest, cDestN, (LPBYTE)pbSrc, cSrcBandWidth * cy, cSrcBandWidth, cy);
if(cbMHData > 0){
memcpy(abTmp, "\x1d\x30\x20\x62\x00\x00", 6);
abTmp[6] = HIBYTE((WORD)y);
abTmp[7] = LOBYTE((WORD)y);
abTmp[8] = HIBYTE(cbMHData);
abTmp[9] = LOBYTE(cbMHData);
WRITESPOOLBUF(pdevobj, abTmp, 10);
WRITESPOOLBUF(pdevobj, pDest, cbMHData);
WRITESPOOLBUF(pdevobj, "\x00\x00", 2 );
bResult = TRUE;
}
MemFree(pDest);
}
return bResult;
}
//
// BOOL fuxlOutputMH2(
// PDEVOBJ pdevobj, // MINI5 data
// LPCBYTE pbSrc, // address of source image data.
// LONG lDelta, // width of source image data(in byte).
// int y, // y-coordinate of source image data.
// int cy // height of source image data(scanline).
// );
//
// This function outputs image, uses FM-MH2(for XL-65K and after).
//
// Return Value
// TRUE: output succeeded.
// FALSE: output failed.
// memory allocate error, or
// MH compression is not effective for this iamge data.
//
BOOL fuxlOutputMH2(PDEVOBJ pdevobj, LPCBYTE pbSrc, int cSrcByteWidth, int y, int cy)
{
BOOL bResult;
LPBYTE pDest;
LONG cb;
LONG cDestN;
DWORD cbMHData;
BYTE abTmp[10];
bResult = FALSE;
cb = cSrcByteWidth * cy;
cDestN = (cb + 1) / 2;
pDest = (LPBYTE)MemAllocZ(cDestN);
if(pDest != NULL){
cbMHData = Mh2Compress(pDest, cDestN, (LPBYTE)pbSrc, cSrcByteWidth * cy, cSrcByteWidth, cy);
if(cbMHData > 0){
memcpy(abTmp, "\x1d\x30\x20\x62\x00\x00", 6);
abTmp[6] = HIBYTE((WORD)y);
abTmp[7] = LOBYTE((WORD)y);
abTmp[8] = HIBYTE(cbMHData);
abTmp[9] = LOBYTE(cbMHData);
WRITESPOOLBUF(pdevobj, abTmp, 10);
WRITESPOOLBUF(pdevobj, pDest, cbMHData);
WRITESPOOLBUF(pdevobj, "\x00\x00", 2 );
bResult = TRUE;
}
MemFree(pDest);
}
return bResult;
}
//
// void fuxlOutputGraphics(
// PDEVOBJ pdevobj, // MINI5
// LPCBYTE pbSrc, // address of source image data.
// UINT bx, // width of source iamge data(in byte).
// UINT y, // y-coordinate of source iamge data.
// UINT cy // height of source iamge data(scanline).
// );
//
// This function outputs source iamge data.
//
void fuxlOutputGraphics(PDEVOBJ pdevobj, LPCBYTE pbSrc, int cSrcByteWidth, UINT y, UINT cy)
{
PFUXLPDEV pFuxlPDEV;
DWORD dwOutputCmd;
TRACEOUT(("[fuxlOutputGraphics]y %d cy %d\r\n", y, cy))
pFuxlPDEV = (PFUXLPDEV)pdevobj->pdevOEM;
dwOutputCmd = pFuxlPDEV->dwOutputCmd;
if((dwOutputCmd & OUTPUT_MH2) != 0){
TRACEOUT(("[fuxlOutputGraphics]Try MH2\r\n"))
if(fuxlOutputMH2(pdevobj, pbSrc, cSrcByteWidth, y, cy) != FALSE)
return;
}
if((dwOutputCmd & OUTPUT_RTGIMG4) != 0){
TRACEOUT(("[fuxlOutputGraphics]Send RTGIMG4\r\n"))
fuxlOutputRTGIMG4(pdevobj, pbSrc, cSrcByteWidth, y, cy);
return;
}
if((dwOutputCmd & OUTPUT_MH) != 0){
TRACEOUT(("[fuxlOutputGraphics]Try MH\r\n"))
if(fuxlOutputMH(pdevobj, pbSrc, cSrcByteWidth, y, cy) != FALSE)
return;
}
TRACEOUT(("[fuxlOutputGraphics]Send RTGIMG2\r\n"))
fuxlOutputRTGIMG2(pdevobj, pbSrc, cSrcByteWidth, y, cy);
}
//
// BOOL fuxlSetBandPos(
// PDEVOBJ pdevobj, // MINI5 data
// int yPos // y-coordinate
// );
//
// This function sets y-coordinate of FjBAND.
//
// Return Value.
// TRUE: secceeded
// FALSE: failed(FjBAND can't move upward)
//
// Remarks
// Internally, y-coordinate is adjust to a multiple of 32.
// Then check new y-coordinate, if it is equal to previous y-coordinate,
// the contents of FjBAND remain. Otherwise, flushes FjBAND.
//
BOOL fuxlSetBandPos(PDEVOBJ pdevobj, int yPos)
{
PFUXLPDEV pFuxlPDEV;
pFuxlPDEV = (PFUXLPDEV)pdevobj->pdevOEM;
if(yPos < pFuxlPDEV->yBandTop)
return FALSE;
yPos -= yPos % FUXL_BANDHEIGHT;
if(yPos != pFuxlPDEV->yBandTop){
if(pFuxlPDEV->bBandDirty != FALSE){
fuxlOutputGraphics(pdevobj, pFuxlPDEV->pbBand, pFuxlPDEV->cBandByteWidth, pFuxlPDEV->yBandTop, FUXL_BANDHEIGHT);
memset(pFuxlPDEV->pbBand, 0, pFuxlPDEV->cbBand);
pFuxlPDEV->bBandDirty = FALSE;
}
pFuxlPDEV->yBandTop = yPos;
}
return TRUE;
}
//
// void fuxlRefreshBand(
// PDEVOBJ pdevobj // MINI5 data
// );
//
// This function flushes FjBAND, send FormFeed command, and sets
// y-coordinate to top(0).
//
void fuxlRefreshBand(PDEVOBJ pdevobj)
{
PFUXLPDEV pFuxlPDEV;
pFuxlPDEV = (PFUXLPDEV)pdevobj->pdevOEM;
if(pFuxlPDEV->bBandDirty != FALSE){
fuxlOutputGraphics(pdevobj, pFuxlPDEV->pbBand, pFuxlPDEV->cBandByteWidth, pFuxlPDEV->yBandTop, FUXL_BANDHEIGHT);
memset(pFuxlPDEV->pbBand, 0, pFuxlPDEV->cbBand);
pFuxlPDEV->bBandDirty = FALSE;
}
WRITESPOOLBUF(pdevobj, "\x0c", 1); // FF command
pFuxlPDEV->yBandTop = 0;
}
//
// WORD OEMFilterGraphics(
// LPDV lpdv, // address of private data, used by RasDD.
// LPBYTE lpBuf, // address of source iamge data.
// WORD wLen // size of source image data.
// );
//
// This function convert image format to Printer command sequence,
// and spool it.
//
// Return Value
// the number of bytes of processed raster data.
// the number of bytes may be the same as wLen, but not necessarily.
//
// Remarks
//
// | <--------------- pFuxlPDEV->cBlockWidth-----------> |
// lpBuf *--------+--------+--------+--------+--------+--------+---
// | | | | | | | ^
// +--------+--------+--------+--------+--------+--------+ |
// | | | | | | | pFuxlPDEV->
// +--------+--------+--------+--------+--------+--------+ cBlockHeight
// | | | | | | | |
// +--------+--------+--------+--------+--------+--------+ |
// | | | | | | | v
// +--------+--------+--------+--------+--------+--------+---
//
// white dot:0
// black dot:1
//
// coordinate of '*' (left-top of image):
// pFuxlPDEV->x
// pFuxlPDEV->y
//
//
// MINI5 export
BOOL APIENTRY OEMFilterGraphics(PDEVOBJ pdevobj, LPBYTE pbBuf, DWORD dwLen)
{
PFUXLPDEV pFuxlPDEV;
LPCBYTE pbSrc;
int y;
int yAlignTop;
int yBottom;
int yAlignBottom;
int cSrcByteWidth;
int cLine;
TRACEOUT(("[OEMFilterGraphics]\r\n"))
pFuxlPDEV = (PFUXLPDEV)pdevobj->pdevOEM;
if(pFuxlPDEV->pbBand == NULL){
if(pFuxlPDEV->bBandError != FALSE)
return FALSE;
if(fuxlEnableBand(pFuxlPDEV) == FALSE)
return FALSE;
}
pbSrc = pbBuf;
y = pFuxlPDEV->y;
yAlignTop = y - (y % FUXL_BANDHEIGHT);
yBottom = y + pFuxlPDEV->cBlockHeight;
yAlignBottom = yBottom - (yBottom % FUXL_BANDHEIGHT);
cSrcByteWidth = pFuxlPDEV->cBlockByteWidth;
if(yAlignTop < y){
// partA
if(fuxlSetBandPos(pdevobj, y) == FALSE) // FUXL band pos can't move up
return TRUE;
cLine = FUXL_BANDHEIGHT - (y - yAlignTop);
if(y + cLine >= yBottom){
fuxlCopyBand(pdevobj, pbSrc, cSrcByteWidth, y, yBottom - y);
return TRUE;
}
fuxlCopyBand(pdevobj, pbSrc, cSrcByteWidth, y, cLine);
pbSrc += cSrcByteWidth * cLine;
y += cLine;
}
if(y < yAlignBottom){
// partB
if(fuxlSetBandPos(pdevobj, yAlignBottom) == FALSE) // FUXL band pos can't move up
return TRUE;
for(cLine = yAlignBottom - y; cLine >= pFuxlPDEV->cyBandSegment; cLine -= pFuxlPDEV->cyBandSegment){
fuxlOutputGraphics(pdevobj, pbSrc, cSrcByteWidth, y, pFuxlPDEV->cyBandSegment);
pbSrc += cSrcByteWidth * pFuxlPDEV->cyBandSegment;
y += pFuxlPDEV->cyBandSegment;
}
if(cLine > 0){
fuxlOutputGraphics(pdevobj, pbSrc, cSrcByteWidth, y, cLine);
pbSrc += cSrcByteWidth * cLine;
y += cLine;
}
}
if(y < yBottom){
// partC
if(fuxlSetBandPos(pdevobj, y) == FALSE) // FUXL band pos can't move up
return TRUE;
fuxlCopyBand(pdevobj, pbSrc, cSrcByteWidth, y, yBottom - y);
}
return TRUE;
}
// end of fuband.c