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.
 
 
 
 
 
 

1466 lines
47 KiB

/////////////////////////////////////////
// fmlbpres.c
//
// September.4,1997 H.Ishida (FPL)
//
// COPYRIGHT(C) FUJITSU LIMITED 1997
#include "fmlbp.h"
#include "fmdebug.h"
// for lib.h debug
DWORD gdwDrvMemPoolTag = 'meoD';
enum FUFM_CEX_FLAGS {
FUFM_CEX_CONTINUE = 0x20,
FUFM_CEX_SEPARATE = 0x60,
FUFM_CEX_TERMINATE = 0x70
};
#define CMDID_START_JOB_0 0
#define CMDID_START_JOB_1 1
#define CMDID_START_JOB_2 2
#define CMDID_START_JOB_3 3
#define CMDID_START_JOB_4 4
#define CMDID_END_JOB 9
#define CMDID_EMMODE_FM 10
#define CMDID_EMMODE_ESCP 11
#define CMDID_SIZE_REDUCTION_100 20
#define CMDID_SIZE_REDUCTION_75 21
#define CMDID_SIZE_REDUCITON_70 22
#define CMDID_RESOLUTION_240 30
#define CMDID_RESOLUTION_400 31
#define CMDID_ORIENTATION_PORTRAIT 40
#define CMDID_ORIENTATION_LANDSCAPE 41
#define CMDID_PAPERSOURCE_AUTO 50
#define CMDID_PAPERSOURCE_MANUAL 51
#define CMDID_PAPERSOURCE_BIN1 52
#define CMDID_PAPERSOURCE_BIN2 53
#define CMDID_PAPERSOURCE_BIN3 54
#define CMDID_FORM_A3 60
#define CMDID_FORM_A4 61
#define CMDID_FORM_A5 62
#define CMDID_FORM_B4 63
#define CMDID_FORM_B5 64
#define CMDID_FORM_LETTER 65
#define CMDID_FORM_LEGAL 66
#define CMDID_FORM_JAPANESE_POSTCARD 67
#define CMDID_FORM_CUSTOM_SIZE 68
#define CMDID_COPIES 70
#define CMDID_START_DOC 80
#define CMDID_START_PAGE 90
#define CMDID_SET_LINEFEEDSPACING 100
#define CMDID_FF 101
#define CMDID_CR 102
#define CMDID_LF 103
#define CMDID_X_MOVE 110
#define CMDID_Y_MOVE 111
#define CMDID_SEND_BLOCK 120
#define CMDID_FONTATTR_BOLD_OFF 130
#define CMDID_FONTATTR_BOLD_ON 131
#define CMDID_FONTATTR_ITALIC_OFF 132
#define CMDID_FONTATTR_ITALIC_ON 133
#define CMDID_FONTATTR_UNDERLINE_OFF 134
#define CMDID_FONTATTR_UNDERLINE_ON 135
#define CMDID_FONTATTR_STRIKEOUT_OFF 136
#define CMDID_FONTATTR_STRIKEOUT_ON 137
// #251047: overlaps SBCS on vert mode
#define CMDID_SELECTSINGLE 140
#define CMDID_SELECTDOUBLE 141
/////////////////////////////////////////////////
struct tag_FUFM_COMMAND{
UINT cbCommand;
PBYTE pbCommand;
};
typedef struct tag_FUFM_COMMAND FUFM_COMMAND;
typedef struct tag_FUFM_COMMAND* PFUFM_COMMAND;
typedef const struct tag_FUFM_COMMAND* PCFUFM_COMMAND;
// KGS
const FUFM_COMMAND g_cmd7Point = { 6, "\x1C\x26\x27\x60\x27\x70" };
const FUFM_COMMAND g_cmd9Point = { 6, "\x1C\x26\x29\x60\x29\x70" };
const FUFM_COMMAND g_cmd10halfPoint = { 8, "\x1C\x26\x21\x20\x65\x21\x20\x75" };
const FUFM_COMMAND g_cmd12Point = { 8, "\x1C\x26\x21\x22\x60\x21\x22\x70" };
// TF + HSS2
const FUFM_COMMAND g_cmdMinchou = { 9, "\x1C\x28\x61\x70\x1BQ1 |" };
const FUFM_COMMAND g_cmdGothic = { 9, "\x1C\x28\x61\x71\x1BQ1 |" };
// HWF
const FUFM_COMMAND g_cmdHWF = { 2, "\x1CK" };
// VWF
const FUFM_COMMAND g_cmdVWF = { 7, "\x1CJ\x1BQ1 q" };
// #251047: overlaps SBCS on vert mode
const FUFM_COMMAND g_cmdSingleMode = { 3, "\x1B(H" };
const FUFM_COMMAND g_cmdDoubleMode = { 3, "\x1B$B" };
/////////////////////////////////////////////////
// NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
PBYTE fufmPutULONG(PBYTE pb, size_t cchDest, size_t* pcchRemaining, ULONG ulData)
{
size_t cchRemaining = cchDest;
if (pb){
if (cchDest > 0){
if(9 < ulData){
pb = fufmPutULONG(pb, cchRemaining, &cchRemaining, ulData / 10);
if (NULL == pb) goto stop;
}
*pb++ = (BYTE)('0' + ulData % 10);
cchRemaining--;
}else{
pb = NULL;
}
}
stop:
if (!pb){
cchRemaining = 0;
}
if (pcchRemaining)
{
*pcchRemaining = cchRemaining;
}
return pb;
}
// NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
PBYTE fufmPutLONG(PBYTE pb, size_t cchDest, size_t* pcchRemaining, LONG lData)
{
size_t cchRemaining = cchDest;
if (pb){
if (cchDest > 0){
if(0 > lData){
*pb++ = '-';
lData = -lData;
cchRemaining--;
}
pb = fufmPutULONG(pb, cchRemaining, &cchRemaining, (ULONG)lData);
}else{
pb = NULL;
}
}
if (!pb){
cchRemaining = 0;
}
if (pcchRemaining)
{
*pcchRemaining = cchRemaining;
}
return pb;
}
BYTE fufmGetHEX(int hi, int low)
{
DWORD dwData = 0;
if('0' <= hi && hi <= '9')
dwData += (hi - '0');
else if('a' <= hi && hi <= 'f')
dwData += (hi - 'a') + 10;
else if('A' <= hi && hi <= 'F')
dwData += (hi - 'A') + 10;
dwData *= 10;
if('0' <= low && low <= '9')
dwData += (low - '0');
else if('a' <= low && low <= 'f')
dwData += (low - 'a') + 10;
else if('A' <= low && low <= 'F')
dwData += (low - 'A') + 10;
return (BYTE)dwData;
}
// NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
PBYTE fufmPutCexParam(PBYTE pb, size_t cchDest, size_t* pcchRemaining, int iParam, int iFlag)
{
size_t cchRemaining = cchDest;
if (pb){
if (cchDest > 0){
if(iParam > 9){
pb = fufmPutCexParam(pb, cchRemaining, &cchRemaining, iParam / 10, FUFM_CEX_CONTINUE);
}
*pb++ = (BYTE)((iParam % 10) | iFlag);
cchRemaining--;
}else{
pb = NULL;
}
}
if (!pb){
cchRemaining = 0;
}
if (pcchRemaining)
{
*pcchRemaining = cchRemaining;
}
return pb;
}
// NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
PBYTE _cdecl fufmFormatCommand(PBYTE pbCmd, size_t cchDest, size_t* pcchRemaining, LPCSTR pszFmt, ...)
{
LPCSTR pch;
LPBYTE pb;
size_t cchRemaining = cchDest;
va_list arg;
va_start(arg, pszFmt);
pb = pbCmd;
if (pb){
if (cchDest > 0){
for(pch = pszFmt; *pch != '\0'; ++pch){
// When an error occurs, set the null to pb.
if (cchRemaining < (size_t)(pb - pbCmd)){
pb = NULL;
break;
}
if(*pch == '%'){
++pch;
switch(*pch){
case 'd':
pb = fufmPutLONG(pb, cchRemaining, &cchRemaining, va_arg(arg, LONG));
break;
case 'u':
pb = fufmPutULONG(pb, cchRemaining, &cchRemaining, va_arg(arg, ULONG));
break;
case '%':
*pb++ = '%';
cchRemaining --;
break;
default:
VERBOSE(("[fufmFormatCommand]invalid seq. %%%c\r\n", *pch))
break;
}
}
else{
*pb++ = *pch;
cchRemaining --;
}
}
}else{
pb = NULL;
}
}
va_end(arg);
if (pb && (pb - pbCmd)){
cchRemaining = cchDest - (pb - pbCmd);
}else{
cchRemaining = 0;
}
if (pcchRemaining)
{
*pcchRemaining = cchRemaining;
}
return pb;
}
// NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
PBYTE fufmPutCP(PBYTE pb, size_t cchDest, size_t* pcchRemaining, int iPitch)
{
size_t cchRemaining = cchDest;
if (pb){
// CP
if (cchDest > 1){
*pb++ = 0x1c;
*pb++ = 0x24;
cchRemaining-=2;
pb = fufmPutCexParam(pb, cchRemaining, &cchRemaining, iPitch, FUFM_CEX_TERMINATE);
}else{
pb = NULL;
}
}
if (!pb){
cchRemaining = 0;
}
if (pcchRemaining)
{
*pcchRemaining = cchRemaining;
}
return pb;
}
// NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
PBYTE fufmPutCommand(PBYTE pb, size_t cchDest, size_t* pcchRemaining, const FUFM_COMMAND* pCmd)
{
size_t cchRemaining = cchDest;
if (pb){
if (cchDest > 0){
if (cchDest < pCmd->cbCommand) return NULL;
memcpy(pb, pCmd->pbCommand, pCmd->cbCommand);
cchRemaining -= pCmd->cbCommand;
pb += pCmd->cbCommand;
}else{
pb = NULL;
}
}
if (!pb){
cchRemaining = 0;
}
if (pcchRemaining)
{
*pcchRemaining = cchRemaining;
}
return pb;
}
// NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
PBYTE fufmUpdatePosition(PBYTE pb, size_t cchDest, size_t* pcchRemaining, PFUFMPDEV pFufmPDEV)
{
int x;
int y;
size_t cchRemaining = cchDest;
if (pb){
if(pFufmPDEV->dwPosChanged != 0){
x = pFufmPDEV->x + 1;
y = pFufmPDEV->y + 1;
switch(pFufmPDEV->dwPosChanged){
case FUFM_X_POSCHANGED: // HPA command
VERBOSE(("[fufmUpdatePosition]HPA %d\r\n", x))
if (cchRemaining > 1){
*pb++ = 0x1b;
*pb++ = 0x5b;
cchRemaining-= 2;
}else{
pb = NULL;
break;
}
pb = fufmPutULONG(pb, cchRemaining, &cchRemaining, x);
if (!pb){
pb = NULL;
break;
}
if (cchRemaining > 0){
*pb++ = 0x60;
cchRemaining--;
}else{
pb = NULL;
break;
}
break;
default: // SAP command
VERBOSE(("[fufmUpdatePosition]SAP %d %d\r\n", x, y))
if (cchRemaining > 1){
*pb++ = 0x1c;
*pb++ = 0x22;
cchRemaining-= 2;
}else{
pb = NULL;
break;
}
pb = fufmPutCexParam(pb, cchRemaining, &cchRemaining, x, FUFM_CEX_SEPARATE);
if (!pb){
pb = NULL;
break;
}
pb = fufmPutCexParam(pb, cchRemaining, &cchRemaining, y, FUFM_CEX_TERMINATE);
if (!pb){
pb = NULL;
break;
}
break;
}
pFufmPDEV->dwPosChanged = 0;
}
}
if (!pb){
cchRemaining = 0;
}
if (pcchRemaining)
{
*pcchRemaining = cchRemaining;
}
return pb;
}
// NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
PBYTE fufmUpdateFontAttributes(PBYTE pb, size_t cchDest, size_t* pcchRemaining, PFUFMPDEV pFufmPDEV)
{
DWORD dwAttributes;
DWORD dwParam;
size_t cchRemaining = cchDest;
if (pb){
if((pFufmPDEV->dwFlags & FUFM_FLAG_SCALABLEFONT) != 0){
if(pFufmPDEV->devData.dwFontAttributes != pFufmPDEV->reqData.dwFontAttributes){
pFufmPDEV->devData.dwFontAttributes = pFufmPDEV->reqData.dwFontAttributes;
dwAttributes = pFufmPDEV->devData.dwFontAttributes;
dwParam = 0;
if (cchRemaining > 1){
*pb++ = 0x1c;
*pb++ = '*';
cchRemaining-= 2;
}else{
return NULL;
}
if((dwAttributes & FUFM_FONTATTR_BOLD) != 0){
if (cchRemaining > 0){
*pb++ = (BYTE)(FUFM_CEX_SEPARATE + dwParam);
}else
return NULL;
dwParam = 1;
}
if((dwAttributes & FUFM_FONTATTR_ITALIC) != 0){
if (cchRemaining > 0){
*pb++ = (BYTE)(FUFM_CEX_SEPARATE + dwParam);
}else
return NULL;
dwParam = 3;
}
if((dwAttributes & FUFM_FONTATTR_UNDERLINE) != 0){
if (cchRemaining > 0){
*pb++ = (BYTE)(FUFM_CEX_SEPARATE + dwParam);
}else
return NULL;
dwParam = 4;
}
if((dwAttributes & FUFM_FONTATTR_STRIKEOUT) != 0){
if (cchRemaining > 0){
*pb++ = (BYTE)(FUFM_CEX_SEPARATE + dwParam);
}else
return NULL;
dwParam = 9;
}
if (cchRemaining > 0){
*pb++ = (BYTE)(FUFM_CEX_TERMINATE + dwParam);
}else
return NULL;
}
}
}
if (!pb){
cchRemaining = 0;
}
if (pcchRemaining)
{
*pcchRemaining = cchRemaining;
}
return pb;
}
// NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Change the return value: void -> BOOL
BOOL fufmCmdStartDoc(PDEVOBJ pdevobj)
{
PFUFMPDEV pFufmPDEV;
PCFUFMDATA pReq;
PFUFMDATA pDev;
PBYTE pbCmd;
BYTE abCmd[256];
BOOL bResolutionCommandNeed;
BOOL bPaperCommandNeed;
BOOL bCopyCommandNeed;
DWORD dwPaperSize;
DWORD dwPaperWidth;
DWORD dwPaperLength;
// NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
size_t sizeRem = sizeof(abCmd);
VERBOSE(("[fufmCmdStartDoc]\r\n"))
pFufmPDEV = (PFUFMPDEV)pdevobj->pdevOEM;
pReq = &pFufmPDEV->reqData;
pDev = &pFufmPDEV->devData;
pbCmd = abCmd;
bResolutionCommandNeed = TRUE;
bPaperCommandNeed = FALSE;
bCopyCommandNeed = TRUE;
if(pDev->dwSizeReduction != pReq->dwSizeReduction){
pDev->dwSizeReduction = pReq->dwSizeReduction;
// NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
pbCmd = fufmFormatCommand(pbCmd, sizeRem, &sizeRem, "\x1bQ%u!I", pDev->dwSizeReduction);
if (NULL == pbCmd) return FALSE;
bResolutionCommandNeed = TRUE;
bPaperCommandNeed = TRUE;
}
if(bResolutionCommandNeed != FALSE || pDev->dwResolution != pReq->dwResolution){
pDev->dwResolution = pReq->dwResolution;
// NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
pbCmd = fufmFormatCommand(pbCmd, sizeRem, &sizeRem, "\x1bQ%u!A", pDev->dwResolution);
if (NULL == pbCmd) return FALSE;
bPaperCommandNeed = TRUE;
bCopyCommandNeed = TRUE;
pDev->dwFontAttributes = 0;
}
if(pDev->dwPaperSize != pReq->dwPaperSize){
pDev->dwPaperSize = pReq->dwPaperSize;
bPaperCommandNeed = TRUE;
}
if(pDev->dwPaperSource != pReq->dwPaperSource){
pDev->dwPaperSource = pReq->dwPaperSource;
bPaperCommandNeed = TRUE;
}
if(pDev->dwPaperOrientation != pReq->dwPaperOrientation){
pDev->dwPaperOrientation = pReq->dwPaperOrientation;
bPaperCommandNeed = TRUE;
}
if(bPaperCommandNeed != FALSE){
dwPaperSize = pDev->dwPaperSize;
if(dwPaperSize == FUFM_PAPERSIZE_CUSTOM_SIZE)
dwPaperSize = FUFM_PAPERSIZE_A4;
if(pDev->dwPaperSource != FUFM_PAPERSOURCE_AUTO){
// PAPER command
// NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
pbCmd = fufmFormatCommand(pbCmd, sizeRem, &sizeRem, "\x1bQ%u;%u;%u;%u!@",
HIWORD(dwPaperSize),
LOWORD(dwPaperSize),
LOWORD(pDev->dwPaperSource),
pDev->dwPaperOrientation);
if (NULL == pbCmd) return FALSE;
}
else{
// PAPER2 command
// NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
pbCmd = fufmFormatCommand(pbCmd, sizeRem, &sizeRem, "\x1bQ%u;%u;%u!F",
HIWORD(dwPaperSize),
LOWORD(dwPaperSize),
pDev->dwPaperOrientation);
if (NULL == pbCmd) return FALSE;
}
if((pFufmPDEV->dwFlags & FUFM_FLAG_PAPER3) != 0 &&
pDev->dwPaperSize == FUFM_PAPERSIZE_CUSTOM_SIZE &&
pDev->dwPaperSource == FUFM_PAPERSOURCE_MANUAL){
// PAPER3 command
// NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
pbCmd = fufmFormatCommand(pbCmd, sizeRem, &sizeRem, "\x1bQ9;%u;%u;%u!\\",
pFufmPDEV->dwPaperWidth,
pFufmPDEV->dwPaperLength,
pDev->dwPaperOrientation);
if (NULL == pbCmd) return FALSE;
}
}
if(bCopyCommandNeed != FALSE || pDev->dwCopies != pReq->dwCopies){
pDev->dwCopies = pReq->dwCopies;
// NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
pbCmd = fufmFormatCommand(pbCmd, sizeRem, &sizeRem, "\x1bQ%u!D", pDev->dwCopies);
if (NULL == pbCmd) return FALSE;
}
if((pFufmPDEV->dwFlags & FUFM_FLAG_SCALABLEFONT) != 0){
// NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
pbCmd = fufmFormatCommand(pbCmd, sizeRem, &sizeRem, "\x1bQ1;0;1;1;0!Q\x1c*\x70");
if (NULL == pbCmd) return FALSE;
}
if(pbCmd > abCmd){
WRITESPOOLBUF(pdevobj, abCmd, (DWORD)(pbCmd - abCmd));
}
return TRUE;
}
void fufmCmdEmMode(PDEVOBJ pdevobj, FUFM_EMMODE emMode)
{
PFUFMPDEV pFufmPDEV;
VERBOSE(("[fufmCmdChangeEM]%d\r\n", emMode))
pFufmPDEV = (PFUFMPDEV)pdevobj->pdevOEM;
pFufmPDEV->emMode = emMode;
if(pFufmPDEV->emMode == FUFM_EMMODE_ESCP){
WRITESPOOLBUF(pdevobj, "\x1b/\xb2@\x7f", 5);
}
}
void fufmCmdEndJob(PDEVOBJ pdevobj)
{
PFUFMPDEV pFufmPDEV;
VERBOSE(("[fufmCmdEndJob]\r\n"))
pFufmPDEV = (PFUFMPDEV)pdevobj->pdevOEM;
if(pFufmPDEV->emMode == FUFM_EMMODE_ESCP){
WRITESPOOLBUF(pdevobj, "\x1b\x7f\x00\x00\x01\x05", 6);
}
else if((pFufmPDEV->dwFlags & FUFM_FLAG_QUICKRESET) == 0){
WRITESPOOLBUF(pdevobj, "\x1bQ0!d", 5);
}
else{
WRITESPOOLBUF(pdevobj, "\x1b\x63", 2);
}
}
void fufmCmdStartPage(PDEVOBJ pdevobj)
{
PFUFMPDEV pFufmPDEV;
VERBOSE(("[fufmCmdStartPage]\r\n"))
pFufmPDEV = (PFUFMPDEV)pdevobj->pdevOEM;
pFufmPDEV->x = 0;
pFufmPDEV->y = 0;
pFufmPDEV->dwPosChanged = FUFM_X_POSCHANGED | FUFM_Y_POSCHANGED;
}
void fufmCmdEndPage(PDEVOBJ pdevobj)
{
VERBOSE(("[fufmCmdEndPage]\r\n"))
}
void fufmCmdFormFeed(PDEVOBJ pdevobj)
{
PFUFMPDEV pFufmPDEV;
VERBOSE(("[fufmCmdFormFeed]\r\n"))
pFufmPDEV = (PFUFMPDEV)pdevobj->pdevOEM;
pFufmPDEV->x = 0;
pFufmPDEV->y = 0;
pFufmPDEV->dwPosChanged = FUFM_X_POSCHANGED | FUFM_Y_POSCHANGED;
WRITESPOOLBUF(pdevobj, "\x0c", 1);
}
void fufmCmdCR(PDEVOBJ pdevobj)
{
PFUFMPDEV pFufmPDEV;
VERBOSE(("[fufmCmdCR]\r\n"))
pFufmPDEV = (PFUFMPDEV)pdevobj->pdevOEM;
pFufmPDEV->x = 0;
pFufmPDEV->dwPosChanged |= FUFM_X_POSCHANGED;
}
void fufmCmdSetLinefeedSpacing(PDEVOBJ pdevobj, int iLinefeedSpacing)
{
PFUFMPDEV pFufmPDEV;
VERBOSE(("[fufmSetLinefeedSpacing]\r\n"))
pFufmPDEV = (PFUFMPDEV)pdevobj->pdevOEM;
pFufmPDEV->iLinefeedSpacing = iLinefeedSpacing;
}
void fufmCmdLF(PDEVOBJ pdevobj)
{
PFUFMPDEV pFufmPDEV;
VERBOSE(("[fufmCmdLF]\r\n"))
pFufmPDEV = (PFUFMPDEV)pdevobj->pdevOEM;
pFufmPDEV->y += pFufmPDEV->iLinefeedSpacing;
pFufmPDEV->dwPosChanged |= FUFM_Y_POSCHANGED;
}
INT fufmCmdXMove(PFUFMPDEV pFufmPDEV, PDWORD pdwParams)
{
INT x;
VERBOSE(("[fufmCmdXMove] %d\r\n", pdwParams[0]))
x = FUFM_MASTER_TO_DEVICE(pFufmPDEV, pdwParams[0]);
if(x < 0)
x = 0;
if(x != pFufmPDEV->x){
pFufmPDEV->x = x;
pFufmPDEV->dwPosChanged |= FUFM_X_POSCHANGED;
}
// #492286: Characters printed as wrong position.
return (INT)pdwParams[0];
}
INT fufmCmdYMove(PFUFMPDEV pFufmPDEV, PDWORD pdwParams)
{
INT y;
VERBOSE(("[fufmCmdYMove] %d\n", pdwParams[0]))
y = FUFM_MASTER_TO_DEVICE(pFufmPDEV, pdwParams[0]);
if(y < 0)
y = 0;
if(y != pFufmPDEV->y){
pFufmPDEV->y = y;
pFufmPDEV->dwPosChanged |= FUFM_Y_POSCHANGED;
}
// #492286: Characters printed as wrong position.
return (INT)pdwParams[0];
}
// NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Change the return value: void -> BOOL
BOOL fufmCmdSendBlock(PDEVOBJ pdevobj, PDWORD pdwParams)
{
enum { FUFM_ZERO_DATA_SIZE = 512 };
enum { FUFM_CY_BORDER = 180 };
static BYTE abZeroData[FUFM_ZERO_DATA_SIZE];
PFUFMPDEV pFufmPDEV;
DWORD cbBlockData;
DWORD cBlockByteWidth;
int x;
int y;
int cyBorder;
int yBorder;
int cPadLine;
int cPadSize;
PBYTE pbCmd;
BYTE abCmd[64];
// NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
size_t sizeRem = sizeof(abCmd);
DDI_VERBOSE(("[fufmCmdSendBlock]\r\n"))
pFufmPDEV = pdevobj->pdevOEM;
cbBlockData = pdwParams[0];
cBlockByteWidth = pdwParams[1];
x = pFufmPDEV->x + 1;
y = pFufmPDEV->y + 1;
cyBorder = FUFM_MASTER_TO_DEVICE(pFufmPDEV, FUFM_CY_BORDER);
yBorder = pFufmPDEV->cyPage - cyBorder;
cPadLine = y - yBorder;
if(cPadLine < 0)
cPadLine = 0;
VERBOSE(("y %d yBorder %d cPadLine %d\r\n", y, yBorder, cPadLine))
cPadSize = cPadLine * cBlockByteWidth;
pbCmd = abCmd;
if(pFufmPDEV->dwPosChanged != 0 || cPadLine > 0){
// SAP command
// NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
if (sizeRem > 1){
*pbCmd++ = 0x1c;
*pbCmd++ = 0x22;
sizeRem -= 2;
}else
return FALSE;
pbCmd = fufmPutCexParam(pbCmd, sizeRem, &sizeRem, x, FUFM_CEX_SEPARATE);
if (!pbCmd) return FALSE;
pbCmd = fufmPutCexParam(pbCmd, sizeRem, &sizeRem, y - cPadLine, FUFM_CEX_TERMINATE);
if (!pbCmd) return FALSE;
pFufmPDEV->dwPosChanged = 0;
}
// RTGIMG command
// NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
pbCmd = fufmFormatCommand(pbCmd, sizeRem, &sizeRem, "\x1bQ%u;%u;0!a",
cbBlockData + cPadSize,
cBlockByteWidth * 8);
if (NULL == pbCmd) return FALSE;
WRITESPOOLBUF(pdevobj, abCmd, (DWORD)(pbCmd - abCmd));
if(cPadSize > 0){
VERBOSE(("pad image %d lines\r\n", cPadLine))
for(; cPadSize > FUFM_ZERO_DATA_SIZE; cPadSize -= FUFM_ZERO_DATA_SIZE)
WRITESPOOLBUF(pdevobj, abZeroData, FUFM_ZERO_DATA_SIZE);
WRITESPOOLBUF(pdevobj, abZeroData, cPadSize);
}
return TRUE;
}
// MINI5 Export func.
INT APIENTRY OEMCommandCallback(
PDEVOBJ pdevobj,
DWORD dwCmdCbID,
DWORD dwCount,
PDWORD pdwParams)
{
PFUFMPDEV pFufmPDEV;
DDI_VERBOSE(("[OEMCommandCallback]dwCmdCbID %d\r\n", dwCmdCbID))
// NTRAID#NTBUG9-587382-2002/03/27-v-sueyas-: Check for illegal parameters
if (NULL == pdevobj)
{
ERR(("OEMCommandCallback: Invalid parameter(s).\n"));
return 0;
}
pFufmPDEV = (PFUFMPDEV)pdevobj->pdevOEM;
if(IS_VALID_FUFMPDEV(pFufmPDEV) == FALSE)
return 0;
switch(dwCmdCbID){
case CMDID_FF: fufmCmdFormFeed(pdevobj); break;
case CMDID_CR: fufmCmdCR(pdevobj); break;
case CMDID_SET_LINEFEEDSPACING:
// NTRAID#NTBUG9-587382-2002/03/27-v-sueyas-: Check for illegal parameters
if (!pdwParams)
return 0; // cannot do anything
fufmCmdSetLinefeedSpacing(pdevobj, (int)pdwParams[0]);
break;
case CMDID_LF: fufmCmdLF(pdevobj); break;
case CMDID_X_MOVE:
// NTRAID#NTBUG9-587382-2002/03/27-v-sueyas-: Check for illegal parameters
if (!pdwParams)
return 0; // cannot do anything
return fufmCmdXMove(pFufmPDEV, pdwParams);
// no break
case CMDID_Y_MOVE:
// NTRAID#NTBUG9-587382-2002/03/27-v-sueyas-: Check for illegal parameters
if (!pdwParams)
return 0; // cannot do anything
return fufmCmdYMove(pFufmPDEV, pdwParams);
// no break
case CMDID_SEND_BLOCK:
// NTRAID#NTBUG9-587382-2002/03/27-v-sueyas-: Check for illegal parameters
if (!pdwParams)
return 0; // cannot do anything
fufmCmdSendBlock(pdevobj, pdwParams);
break;
case CMDID_FONTATTR_BOLD_OFF: pFufmPDEV->reqData.dwFontAttributes &= ~FUFM_FONTATTR_BOLD; break;
case CMDID_FONTATTR_BOLD_ON: pFufmPDEV->reqData.dwFontAttributes |= FUFM_FONTATTR_BOLD; break;
case CMDID_FONTATTR_ITALIC_OFF: pFufmPDEV->reqData.dwFontAttributes &= ~FUFM_FONTATTR_ITALIC; break;
case CMDID_FONTATTR_ITALIC_ON: pFufmPDEV->reqData.dwFontAttributes |= FUFM_FONTATTR_ITALIC; break;
case CMDID_FONTATTR_UNDERLINE_OFF: pFufmPDEV->reqData.dwFontAttributes &= ~FUFM_FONTATTR_UNDERLINE; break;
case CMDID_FONTATTR_UNDERLINE_ON: pFufmPDEV->reqData.dwFontAttributes |= FUFM_FONTATTR_UNDERLINE; break;
case CMDID_FONTATTR_STRIKEOUT_OFF: pFufmPDEV->reqData.dwFontAttributes &= ~FUFM_FONTATTR_STRIKEOUT; break;
case CMDID_FONTATTR_STRIKEOUT_ON: pFufmPDEV->reqData.dwFontAttributes |= FUFM_FONTATTR_STRIKEOUT; break;
// #251047: overlaps SBCS on vert mode
case CMDID_SELECTSINGLE: {
PBYTE pb;
BYTE ab[256];
// NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
size_t sizeRem = sizeof(ab);
pb = ab;
pb = fufmPutCommand(pb, sizeRem, &sizeRem, &g_cmdSingleMode);
if (!pb) return 0;
// #284409: SBCS rotated on vert mode
// if (pFufmPDEV->dwFlags & FUFM_FLAG_VERTICALFONT)
// pb = fufmPutCommand(pb, &g_cmdHWF);
if (pb > ab)
WRITESPOOLBUF(pdevobj, ab, (DWORD)(pb - ab));
break;
}
case CMDID_SELECTDOUBLE: {
PBYTE pb;
BYTE ab[256];
// NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
size_t sizeRem = sizeof(ab);
pb = ab;
pb = fufmPutCommand(pb, sizeRem, &sizeRem, &g_cmdDoubleMode);
if (!pb) return 0;
// #284409: SBCS rotated on vert mode
// if (pFufmPDEV->dwFlags & FUFM_FLAG_VERTICALFONT)
// pb = fufmPutCommand(pb, &g_cmdVWF);
if (pb > ab)
WRITESPOOLBUF(pdevobj, ab, (DWORD)(pb - ab));
break;
}
// PAGE_SETUP.1
case CMDID_START_PAGE: fufmCmdStartPage(pdevobj); break;
// DOC_SETUP.1
case CMDID_SIZE_REDUCTION_100: pFufmPDEV->reqData.dwSizeReduction = FUFM_SIZE_REDUCTION_100; break;
case CMDID_SIZE_REDUCTION_75: pFufmPDEV->reqData.dwSizeReduction = FUFM_SIZE_REDUCTION_75; break;
case CMDID_SIZE_REDUCITON_70: pFufmPDEV->reqData.dwSizeReduction = FUFM_SIZE_REDUCTION_70; break;
// DOC_SETUP.2
case CMDID_RESOLUTION_240: pFufmPDEV->reqData.dwResolution = FUFM_RESOLUTION_240; break;
case CMDID_RESOLUTION_400: pFufmPDEV->reqData.dwResolution = FUFM_RESOLUTION_400; break;
// DOC_SETUP.3
case CMDID_ORIENTATION_PORTRAIT: pFufmPDEV->reqData.dwPaperOrientation = FUFM_PAPERORIENTATION_PORTRAIT; break;
case CMDID_ORIENTATION_LANDSCAPE: pFufmPDEV->reqData.dwPaperOrientation = FUFM_PAPERORIENTATION_LANDSCAPE; break;
// DOC_SETUP.4
case CMDID_PAPERSOURCE_AUTO: pFufmPDEV->reqData.dwPaperSource = FUFM_PAPERSOURCE_AUTO; break;
case CMDID_PAPERSOURCE_MANUAL: pFufmPDEV->reqData.dwPaperSource = FUFM_PAPERSOURCE_MANUAL; break;
case CMDID_PAPERSOURCE_BIN1: pFufmPDEV->reqData.dwPaperSource = FUFM_PAPERSOURCE_BIN1; break;
case CMDID_PAPERSOURCE_BIN2: pFufmPDEV->reqData.dwPaperSource = FUFM_PAPERSOURCE_BIN2; break;
case CMDID_PAPERSOURCE_BIN3: pFufmPDEV->reqData.dwPaperSource = FUFM_PAPERSOURCE_BIN3; break;
// DOC_SETUP.5
case CMDID_FORM_A3: pFufmPDEV->reqData.dwPaperSize = FUFM_PAPERSIZE_A3; break;
case CMDID_FORM_A4: pFufmPDEV->reqData.dwPaperSize = FUFM_PAPERSIZE_A4; break;
case CMDID_FORM_A5: pFufmPDEV->reqData.dwPaperSize = FUFM_PAPERSIZE_A5; break;
case CMDID_FORM_B4: pFufmPDEV->reqData.dwPaperSize = FUFM_PAPERSIZE_B4; break;
case CMDID_FORM_B5: pFufmPDEV->reqData.dwPaperSize = FUFM_PAPERSIZE_B5; break;
case CMDID_FORM_LETTER: pFufmPDEV->reqData.dwPaperSize = FUFM_PAPERSIZE_LETTER; break;
case CMDID_FORM_LEGAL: pFufmPDEV->reqData.dwPaperSize = FUFM_PAPERSIZE_LEGAL; break;
case CMDID_FORM_JAPANESE_POSTCARD: pFufmPDEV->reqData.dwPaperSize = FUFM_PAPERSIZE_JAPANESE_POSTCARD; break;
// DOC_SETUP.6
// @Aug/31/98 ->
case CMDID_COPIES:
// NTRAID#NTBUG9-587382-2002/03/27-v-sueyas-: Check for illegal parameters
if (!pdwParams)
return 0; // cannot do anything
if (MAX_COPIES_VALUE < pdwParams[0]) {
pFufmPDEV->reqData.dwCopies = MAX_COPIES_VALUE;
}
else if (1 > pdwParams[0]) {
pFufmPDEV->reqData.dwCopies = 1;
}
else {
pFufmPDEV->reqData.dwCopies = pdwParams[0];
}
// @Aug/31/98 <-
break;
// DOC_SETUP.7
case CMDID_START_DOC: fufmCmdStartDoc(pdevobj); break;
// JOB_SETUP.1
case CMDID_START_JOB_0: pFufmPDEV->dwFlags = 0; break;
case CMDID_START_JOB_1: pFufmPDEV->dwFlags = FUFM_FLAG_START_JOB_1; break;
case CMDID_START_JOB_2: pFufmPDEV->dwFlags = FUFM_FLAG_START_JOB_2; break;
case CMDID_START_JOB_3: pFufmPDEV->dwFlags = FUFM_FLAG_START_JOB_3; break;
case CMDID_START_JOB_4: pFufmPDEV->dwFlags = FUFM_FLAG_START_JOB_4; break;
// JOB_SETUP.2
case CMDID_EMMODE_FM: fufmCmdEmMode(pdevobj, FUFM_EMMODE_FM); break;
case CMDID_EMMODE_ESCP: fufmCmdEmMode(pdevobj, FUFM_EMMODE_ESCP); break;
// JOB_FINISH.1
case CMDID_END_JOB: fufmCmdEndJob(pdevobj); break;
}
return 0;
}
void fufmGetPaperSize(PFUFMPDEV pFufmPDEV, const GDIINFO* pGdiInfo)
{
pFufmPDEV->dwPaperWidth = pGdiInfo->ulHorzSize;
if((LONG)pFufmPDEV->dwPaperWidth < 0)
pFufmPDEV->dwPaperWidth = (-(LONG)pFufmPDEV->dwPaperWidth + 500) / 1000;
pFufmPDEV->dwPaperLength = pGdiInfo->ulVertSize;
if((LONG)pFufmPDEV->dwPaperLength < 0)
pFufmPDEV->dwPaperLength = (-(LONG)pFufmPDEV->dwPaperLength + 500) / 1000;
VERBOSE(("paper size %u %u\r\n", pFufmPDEV->dwPaperWidth, pFufmPDEV->dwPaperLength))
VERBOSE(("printable area %u %u\r\n", pGdiInfo->ulHorzRes, pGdiInfo->ulVertRes))
pFufmPDEV->cyPage = (int)pGdiInfo->ulVertRes;
}
void fufmInitData(PFUFMDATA pDev)
{
pDev->dwSizeReduction = FUFM_SIZE_REDUCTION_UNKNOWN;
pDev->dwResolution = FUFM_RESOLUTION_UNKNOWN;
pDev->dwPaperSize = FUFM_PAPERSIZE_UNKNOWN;
pDev->dwPaperSource = FUFM_PAPERSOURCE_UNKNOWN;
pDev->dwPaperOrientation = FUFM_PAPERORIENTATION_UNKNOWN;
pDev->dwCopies = (DWORD)-1; // UNKNOWN
pDev->dwFontAttributes = 0;
}
// MINI5 Export func.
PDEVOEM APIENTRY OEMEnablePDEV(
PDEVOBJ pdevobj,
PWSTR pPrinterName,
ULONG cPatterns,
HSURF* phsurfPatterns,
ULONG cjGdiInfo,
GDIINFO* pGdiInfo,
ULONG cjDevInfo,
DEVINFO* pDevInfo,
DRVENABLEDATA* pded
)
{
PFUFMPDEV pFufmPDEV;
DDI_VERBOSE(("[OEMEnablePDEV]" __DATE__ " " __TIME__ "\r\n"));
// NTRAID#NTBUG9-587382-2002/03/27-v-sueyas-: Check for illegal parameters
if (NULL == pdevobj)
{
ERR(("Invalid parameter(s).\n"));
return NULL;
}
pFufmPDEV = (PFUFMPDEV)MemAlloc(sizeof(FUFMPDEV));
if(pFufmPDEV != NULL){
pFufmPDEV->dwSignature = FUFM_OEM_SIGNATURE;
pFufmPDEV->emMode = FUFM_EMMODE_FM;
pFufmPDEV->dwFlags = 0;
pFufmPDEV->dwPosChanged = FUFM_X_POSCHANGED | FUFM_Y_POSCHANGED;
pFufmPDEV->x = 0;
pFufmPDEV->y = 0;
pFufmPDEV->iLinefeedSpacing = 0;
VERBOSE(("paper size %u %u\r\n", pGdiInfo->szlPhysSize.cx, pGdiInfo->szlPhysSize.cy))
fufmGetPaperSize(pFufmPDEV, pGdiInfo);
fufmInitData(&pFufmPDEV->devData);
fufmInitData(&pFufmPDEV->reqData);
}
return pFufmPDEV;
}
// MINI5 Export func.
VOID APIENTRY OEMDisablePDEV(PDEVOBJ pdevobj)
{
PFUFMPDEV pFufmPDEV;
DDI_VERBOSE(("[OEMDisablePDEV]\r\n"));
// NTRAID#NTBUG9-587382-2002/03/27-v-sueyas-: Check for illegal parameters
if (NULL == pdevobj)
{
ERR(("Invalid parameter(s).\n"));
return;
}
pFufmPDEV = (PFUFMPDEV)pdevobj->pdevOEM;
if(IS_VALID_FUFMPDEV(pFufmPDEV) == FALSE)
return;
MemFree(pdevobj->pdevOEM);
pdevobj->pdevOEM = NULL;
}
// MINI5 Export func.
BOOL APIENTRY OEMResetPDEV(
PDEVOBJ pdevobjOld,
PDEVOBJ pdevobjNew
)
{
PFUFMPDEV pFufmPDEVOld;
PFUFMPDEV pFufmPDEVNew;
DDI_VERBOSE(("[OEMResetPDEV]\r\n"))
// NTRAID#NTBUG9-587382-2002/03/27-v-sueyas-: Check for illegal parameters
if (NULL == pdevobjOld || NULL == pdevobjNew)
{
ERR(("Invalid parameter(s).\n"));
return FALSE;
}
pFufmPDEVOld = (PFUFMPDEV)pdevobjOld->pdevOEM;
if(IS_VALID_FUFMPDEV(pFufmPDEVOld) == FALSE)
return FALSE;
pFufmPDEVNew = (PFUFMPDEV)pdevobjNew->pdevOEM;
if(IS_VALID_FUFMPDEV(pFufmPDEVNew) == FALSE)
return FALSE;
pFufmPDEVNew->devData = pFufmPDEVOld->devData;
return TRUE;
}
// MINI5 Export func.
// NTRAID#NTBUG9-587382-2002/03/27-v-sueyas-: Error handling
BOOL APIENTRY bOEMOutputCharStr(
PDEVOBJ pdevobj,
PUNIFONTOBJ pUFObj,
DWORD dwType,
DWORD dwCount,
PVOID pGlyph
)
{
PFUFMPDEV pFufmPDEV;
GETINFO_GLYPHSTRING glyphStr;
PBYTE pb;
BYTE abBuff[256];
// #333653: Change I/F for GETINFO_GLYPHSTRING
PTRANSDATA pTrans, aTrans;
DWORD i;
DWORD cbNeeded;
PDWORD pdwGlyphID;
INT cxfont; //#144637
// #284409: SBCS rotated on vert mode
BYTE ab[16];
// NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
size_t sizeRem = sizeof(abBuff);
DDI_VERBOSE(("[OEMOutputCharStr]\r\n"))
// NTRAID#NTBUG9-587382-2002/03/27-v-sueyas-: Check for illegal parameters
if(NULL == pdevobj || NULL == pUFObj)
{
ERR(("bOEMOutputCharStr: Invalid parameter(s).\n"));
return FALSE;
}
pFufmPDEV = (PFUFMPDEV)pdevobj->pdevOEM;
if(IS_VALID_FUFMPDEV(pFufmPDEV) == FALSE)
return FALSE;
pb = abBuff;
// NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
pb = fufmUpdatePosition(pb, sizeRem, &sizeRem, pFufmPDEV);
if (!pb) return FALSE;
// NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
pb = fufmUpdateFontAttributes(pb, sizeRem, &sizeRem, pFufmPDEV);
if (!pb) return FALSE;
if(pb > abBuff){
WRITESPOOLBUF(pdevobj, abBuff, (DWORD)(pb - abBuff));
}
switch(dwType){
case TYPE_GLYPHHANDLE:
VERBOSE(("TYPE_GLYPHHANDLE\r\n"))
glyphStr.dwSize = sizeof(glyphStr);
glyphStr.dwCount = dwCount;
glyphStr.dwTypeIn = TYPE_GLYPHHANDLE;
glyphStr.pGlyphIn = pGlyph;
glyphStr.dwTypeOut = TYPE_TRANSDATA;
// #333653: Change I/F for GETINFO_GLYPHSTRING
glyphStr.pGlyphOut = NULL;
glyphStr.dwGlyphOutSize = 0;
if(pUFObj->pfnGetInfo(pUFObj, UFO_GETINFO_GLYPHSTRING, &glyphStr, sizeof(glyphStr), &cbNeeded) || !glyphStr.dwGlyphOutSize){
VERBOSE(("UFO_GETINFO_GLYPHSTRING error\r\n"))
return FALSE;
}
if((aTrans = (PTRANSDATA)MemAlloc(glyphStr.dwGlyphOutSize)) == NULL) {
VERBOSE(("MemAlloc fail\r\n"))
return FALSE;
}
glyphStr.pGlyphOut = aTrans;
if(FALSE == pUFObj->pfnGetInfo(pUFObj, UFO_GETINFO_GLYPHSTRING, &glyphStr, sizeof(glyphStr), &cbNeeded)){
VERBOSE(("UFO_GETINFO_GLYPHSTRING error\r\n"))
goto out;
}
pTrans = aTrans;
cxfont = pFufmPDEV->cxfont; //#144637
for(i = dwCount; i > 0; --i){
VERBOSE(("TYPE_TRANSDATA:ubCodePageID:0x%x ubType:0x%x\r\n", pTrans->ubCodePageID, pTrans->ubType))
switch(pTrans->ubType & (MTYPE_FORMAT_MASK | MTYPE_DOUBLEBYTECHAR_MASK)){
case MTYPE_DIRECT:
case MTYPE_DIRECT | MTYPE_SINGLE:
case MTYPE_DIRECT | MTYPE_DOUBLE:
// #284409: SBCS rotated on vert mode
if (pFufmPDEV->dwFlags & FUFM_FLAG_VERTICALFONT) {
if (pFufmPDEV->dwFlags & FUFM_FLAG_FONTROTATED) {
// NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
pb = fufmPutCommand(ab, sizeRem, &sizeRem, &g_cmdHWF);
if (!pb) return FALSE;
if (pb > ab)
WRITESPOOLBUF(pdevobj, ab, (DWORD)(pb - ab));
pFufmPDEV->dwFlags &= ~FUFM_FLAG_FONTROTATED;
}
}
WRITESPOOLBUF(pdevobj, &pTrans->uCode.ubCode, 1);
pFufmPDEV->x += (cxfont / 2); //#144637
break;
case MTYPE_PAIRED:
case MTYPE_PAIRED | MTYPE_DOUBLE:
// #284409: SBCS rotated on vert mode
if (pFufmPDEV->dwFlags & FUFM_FLAG_VERTICALFONT) {
if (!(pFufmPDEV->dwFlags & FUFM_FLAG_FONTROTATED)) {
// NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
pb = fufmPutCommand(ab, sizeRem, &sizeRem, &g_cmdVWF);
if (!pb) return FALSE;
if (pb > ab)
WRITESPOOLBUF(pdevobj, ab, (DWORD)(pb - ab));
pFufmPDEV->dwFlags |= FUFM_FLAG_FONTROTATED;
}
}
WRITESPOOLBUF(pdevobj, pTrans->uCode.ubPairs, 2);
pFufmPDEV->x += cxfont; //#144637
break;
case MTYPE_PAIRED | MTYPE_SINGLE:
// #284409: SBCS rotated on vert mode
if (pFufmPDEV->dwFlags & FUFM_FLAG_VERTICALFONT) {
if (pFufmPDEV->dwFlags & FUFM_FLAG_FONTROTATED) {
// NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
pb = fufmPutCommand(ab, sizeRem, &sizeRem, &g_cmdHWF);
if (!pb) return FALSE;
if (pb > ab)
WRITESPOOLBUF(pdevobj, ab, (DWORD)(pb - ab));
pFufmPDEV->dwFlags &= ~FUFM_FLAG_FONTROTATED;
}
}
WRITESPOOLBUF(pdevobj, &pTrans->uCode.ubPairs[1], 1);
pFufmPDEV->x += (cxfont / 2); //#144637
break;
}
++pTrans;
}
out:
MemFree(aTrans);
break;
case TYPE_GLYPHID:
VERBOSE(("TYPE_GLYPHID\r\n"))
pdwGlyphID = (PDWORD)pGlyph;
for(i = dwCount; i > 0; --i){
VERBOSE(("TYPE_GLYPHID:0x%x\r\n", *pdwGlyphID))
WRITESPOOLBUF(pdevobj, (PBYTE)pGlyph, 1);
++pdwGlyphID;
}
break;
case TYPE_TRANSDATA:
VERBOSE(("TYPE_TRANSDATA\r\n"))
break;
case TYPE_UNICODE:
VERBOSE(("TYPE_UNICODE\r\n"))
break;
}
return TRUE;
}
// NTRAID#NTBUG9-587382-2002/03/27-v-sueyas-: Error handling
BOOL APIENTRY bOEMSendFontCmd(
PDEVOBJ pdevobj,
PUNIFONTOBJ pUFObj,
PFINVOCATION pFInv
)
{
PFUFMPDEV pFufmPDEV;
enum { CB_STDVAR_2 = sizeof(GETINFO_STDVAR) + sizeof(DWORD) * 2 * (2 - 1) };
PGETINFO_STDVAR pSV;
DWORD adwStdVarBuff[(CB_STDVAR_2 + sizeof(DWORD) - 1) / sizeof(DWORD)];
DWORD cbNeeded;
DWORD i;
LONG cxFont;
LONG cyFont;
DWORD dwResolution;
PBYTE pbCmd;
BYTE abCmd[256];
PIFIMETRICS pIFI;
// NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
size_t sizeRem = sizeof(abCmd);
// NTRAID#NTBUG9-587382-2002/03/27-v-sueyas-: Check for illegal parameters
if(NULL == pdevobj || NULL == pUFObj || NULL == pFInv)
{
ERR(("bOEMSendFontCmd: Invalid parameter(s).\n"));
return FALSE;
}
pIFI = pUFObj->pIFIMetrics;
#define SV_HEIGHT (pSV->StdVar[0].lStdVariable)
#define SV_WIDTH (pSV->StdVar[1].lStdVariable)
DDI_VERBOSE(("[OEMSendFontCmd]FontID:%d dwFlags:%x\r\n", pUFObj->ulFontID, pUFObj->dwFlags))
pFufmPDEV = (PFUFMPDEV)pdevobj->pdevOEM;
if(IS_VALID_FUFMPDEV(pFufmPDEV) == FALSE)
return FALSE;
pSV = (PGETINFO_STDVAR)adwStdVarBuff;
pSV->dwSize = CB_STDVAR_2;
pSV->dwNumOfVariable = 2;
pSV->StdVar[0].dwStdVarID = FNT_INFO_FONTHEIGHT;
pSV->StdVar[1].dwStdVarID = FNT_INFO_FONTWIDTH;
if (!pUFObj->pfnGetInfo(pUFObj, UFO_GETINFO_STDVARIABLE, pSV, pSV->dwSize, &cbNeeded)) {
VERBOSE(("UFO_GETINFO_STDVARIABLE failed.\r\n"))
return FALSE;
}
VERBOSE(("FNT_INFO_FONTHEIGHT %d\r\n", pSV->StdVar[0].lStdVariable))
VERBOSE(("FNT_INFO_FONTWIDTH %d\r\n", pSV->StdVar[1].lStdVariable))
// this printer requires DBCS cell (square, if not stretched)
// X/Y sizes as X/Y values for scalable font command.
cyFont = FUFM_MASTER_TO_DEVICE(pFufmPDEV, pSV->StdVar[0].lStdVariable);
cxFont = cyFont
* SV_WIDTH * FH_IFI(pIFI) / SV_HEIGHT / FW_IFI(pIFI);
pFufmPDEV->cxfont = cxFont; //#144637
dwResolution = pFufmPDEV->devData.dwResolution;
VERBOSE(("dwResolution %u cxFont %u cyFont %u\r\n", dwResolution, cxFont, cyFont))
pbCmd = abCmd;
for(i = 0; i < pFInv->dwCount; ++i){
switch(pFInv->pubCommand[i]){
case 'a': // 7point non scalable font
pbCmd = fufmPutCommand(pbCmd, sizeRem, &sizeRem, &g_cmd7Point);
if (!pbCmd)return FALSE;
pbCmd = fufmPutCP(pbCmd, sizeRem, &sizeRem, (dwResolution != 400)? 24: 40);
if (!pbCmd)return FALSE;
break;
case 'b': // 9point non scalable font
pbCmd = fufmPutCommand(pbCmd, sizeRem, &sizeRem, &g_cmd9Point);
if (!pbCmd)return FALSE;
pbCmd = fufmPutCP(pbCmd, sizeRem, &sizeRem, (dwResolution != 400)? 30: 50);
if (!pbCmd)return FALSE;
break;
case 'c': // 10.5point non scalable font
pbCmd = fufmPutCommand(pbCmd, sizeRem, &sizeRem, &g_cmd10halfPoint);
if (!pbCmd)return FALSE;
pbCmd = fufmPutCP(pbCmd, sizeRem, &sizeRem, (dwResolution != 400)? 36: 60);
if (!pbCmd)return FALSE;
break;
case 'd': // 12point non scalable font
pbCmd = fufmPutCommand(pbCmd, sizeRem, &sizeRem, &g_cmd12Point);
if (!pbCmd)return FALSE;
pbCmd = fufmPutCP(pbCmd, sizeRem, &sizeRem, (dwResolution != 400)? 40: 66);
if (!pbCmd)return FALSE;
break;
case 's': // scalable font
if (cyFont == cxFont) {
// NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
pbCmd = fufmFormatCommand(pbCmd, sizeRem, &sizeRem, "\x1BQ%u!R", cyFont);
if (NULL == pbCmd) return FALSE;
}
else {
// NTRAID#NTBUG9-590135-2002/04/01-v-sueyas-: Possible buffer overrun risk similar to sprintf
pbCmd = fufmFormatCommand(pbCmd, sizeRem, &sizeRem, "\x1BQ%u;%u!R", cyFont, cxFont);
if (NULL == pbCmd) return FALSE;
}
pbCmd = fufmPutCP(pbCmd, sizeRem, &sizeRem, cxFont);
if (!pbCmd)return FALSE;
break;
case 'H': // HWF
pFufmPDEV->dwFlags &= ~FUFM_FLAG_VERTICALFONT;
pbCmd = fufmPutCommand(pbCmd, sizeRem, &sizeRem, &g_cmdHWF);
if (!pbCmd)return FALSE;
// #284409: SBCS rotated on vert mode
pFufmPDEV->dwFlags &= ~FUFM_FLAG_FONTROTATED;
break;
case 'V': // VWF
pFufmPDEV->dwFlags |= FUFM_FLAG_VERTICALFONT;
// #284409: SBCS rotated on vert mode
// pbCmd = fufmPutCommand(pbCmd, sizeRem, &sizeRem, &g_cmdVWF);
// if (!pbCmd)return FALSE;
break;
case 'M': // Minchou
pbCmd = fufmPutCommand(pbCmd, sizeRem, &sizeRem, &g_cmdMinchou);
if (!pbCmd)return FALSE;
break;
case 'G': // Gothic
pbCmd = fufmPutCommand(pbCmd, sizeRem, &sizeRem, &g_cmdGothic);
if (!pbCmd)return FALSE;
break;
}
}
if(pbCmd > abCmd)
WRITESPOOLBUF(pdevobj, abCmd, (DWORD)(pbCmd - abCmd));
return TRUE;
}
// end of fmlbpres.c