2025-04-27 07:49:33 -04:00

556 lines
16 KiB
C

//-----------------------------------------------------------------------------
// 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.
//-----------------------------------------------------------------------------
// 08/08/94 Wrote it. by Hayakawa, Task.
//
#define _FUPRJRES_C
#include "pdev.h"
DWORD gdwDrvMemPoolTag = 'meoD'; // lib.h requires this global var, for debugging
/***************************************************************************
Function Name : SheetFeed
Parameters : LPDV lpdv Private Device Structure
Note : Make this. 09/13/94 Task
***************************************************************************/
void SheetFeed(
PDEVOBJ pdevobj
){
USHORT bFirstPage;
DEVICE_DATA *pOEM;
DWORD dwResult;
//
// verify pdevobj okay
//
ASSERT(VALID_PDEVOBJ(pdevobj));
pOEM = (DEVICE_DATA *)MINIDEV_DATA(pdevobj);
bFirstPage = (USHORT)pOEM->bFirstPage;
if ((pOEM->wPaperSource == DMBIN_180BIN1) ||
(pOEM->wPaperSource == DMBIN_180BIN2) ||
(pOEM->wPaperSource == DMBIN_360BIN1) ||
(pOEM->wPaperSource == DMBIN_360BIN2) ||
(pOEM->wPaperSource == DMBIN_SUIHEI_BIN1) ||
(pOEM->wPaperSource == DMBIN_TAMOKUTEKI_BIN1) ||
(pOEM->wPaperSource == DMBIN_FI_FRONT)) {
WRITESPOOLBUF(pdevobj, ecCSFBPAGE.pEscStr, ecCSFBPAGE.cbSize, &dwResult);
} else if ((pOEM->wPaperSource == DMBIN_TRACTOR) ||
(pOEM->wPaperSource == DMBIN_FI_TRACTOR)) {
WRITESPOOLBUF(pdevobj, ecTRCTBPAGE.pEscStr, ecTRCTBPAGE.cbSize, &dwResult);
} else if ((pOEM->wPaperSource == DMBIN_MANUAL) &&
(!bFirstPage)) {
WRITESPOOLBUF(pdevobj, ecManual2P.pEscStr, ecManual2P.cbSize, &dwResult);
pOEM->bFirstPage = FALSE;
}
WRITESPOOLBUF(pdevobj,"\x0D", 1, &dwResult);
if (bFirstPage) pOEM->bFirstPage = FALSE;
}
/***************************************************************************
Function Name : OEMSendFontCmd
Note : Make this. 09/26/97
***************************************************************************/
VOID APIENTRY OEMSendFontCmd(
PDEVOBJ pdevobj,
PUNIFONTOBJ pUFObj,
PFINVOCATION pFInv)
{
DWORD dwResult;
WRITESPOOLBUF(pdevobj,pFInv->pubCommand, pFInv->dwCount, &dwResult);
}
/***************************************************************************
Function Name : OEMCommandCallback
Note : Make this. 09/26/97
***************************************************************************/
INT APIENTRY OEMCommandCallback(
PDEVOBJ pdevobj,
DWORD dwCmdCbID,
DWORD dwCount,
PDWORD pdwParams
){
USHORT bFirstPage;
DEVICE_DATA *pOEM;
DWORD dwResult;
//
// verify pdevobj okay
//
ASSERT(VALID_PDEVOBJ(pdevobj));
pOEM = (DEVICE_DATA *)MINIDEV_DATA(pdevobj);
bFirstPage = (USHORT)pOEM->bFirstPage;
switch (dwCmdCbID) {
case CMDID_ENDDOC :
WRITESPOOLBUF(pdevobj,ecFMEnddoc.pEscStr,ecFMEnddoc.cbSize, &dwResult);
break;
case CMDID_BEGINDOC :
pOEM->bFirstPage = 1;
pOEM->wPaperSource = 0;
break;
case CMDID_MAN180 :
case CMDID_MAN360 :
pOEM->wPaperSource = DMBIN_MANUAL;
SheetFeed(pdevobj);
break;
case CMDID_TRA180 :
pOEM->wPaperSource = DMBIN_TRACTOR;
SheetFeed(pdevobj);
break;
case CMDID_180BIN1 :
if (pOEM->wPaperSource != DMBIN_180BIN1) {
pOEM->wPaperSource = DMBIN_180BIN1;
WRITESPOOLBUF(pdevobj, ecSelectBIN1.pEscStr, ecSelectBIN1.cbSize, &dwResult);
}
SheetFeed(pdevobj);
break;
case CMDID_180BIN2 :
if (pOEM->wPaperSource != DMBIN_180BIN2) {
pOEM->wPaperSource = DMBIN_180BIN2;
WRITESPOOLBUF(pdevobj, ecSelectBIN2.pEscStr, ecSelectBIN2.cbSize, &dwResult);
}
SheetFeed(pdevobj);
break;
case CMDID_360BIN1 :
if (pOEM->wPaperSource != DMBIN_360BIN1) {
pOEM->wPaperSource = DMBIN_360BIN1;
WRITESPOOLBUF(pdevobj, ecSelectBIN1.pEscStr, ecSelectBIN1.cbSize, &dwResult);
}
SheetFeed(pdevobj);
break;
case CMDID_360BIN2 :
if (pOEM->wPaperSource != DMBIN_360BIN2) {
pOEM->wPaperSource = DMBIN_360BIN2;
WRITESPOOLBUF(pdevobj, ecSelectBIN2.pEscStr, ecSelectBIN2.cbSize, &dwResult);
}
SheetFeed(pdevobj);
break;
case CMDID_FI_TRACTOR :
if (pOEM->wPaperSource != DMBIN_FI_TRACTOR) {
pOEM->wPaperSource = DMBIN_FI_TRACTOR;
WRITESPOOLBUF(pdevobj, ecSelectFTRCT.pEscStr, ecSelectFTRCT.cbSize, &dwResult);
}
SheetFeed(pdevobj);
break;
case CMDID_FI_FRONT :
if (pOEM->wPaperSource != DMBIN_FI_FRONT) {
pOEM->wPaperSource = DMBIN_FI_FRONT;
WRITESPOOLBUF(pdevobj, ecSelectFFRNT.pEscStr, ecSelectFFRNT.cbSize, &dwResult);
}
SheetFeed(pdevobj);
break;
case CMDID_SUIHEI_BIN1 :
if (pOEM->wPaperSource != DMBIN_SUIHEI_BIN1) {
pOEM->wPaperSource = DMBIN_SUIHEI_BIN1;
WRITESPOOLBUF(pdevobj, ecSelectBIN1.pEscStr, ecSelectBIN1.cbSize, &dwResult);
}
SheetFeed(pdevobj);
break;
case CMDID_TAMOKUTEKI_BIN1 :
if (pOEM->wPaperSource != DMBIN_TAMOKUTEKI_BIN1) {
pOEM->wPaperSource = DMBIN_TAMOKUTEKI_BIN1;
WRITESPOOLBUF(pdevobj, ecSelectBIN1.pEscStr, ecSelectBIN1.cbSize, &dwResult);
}
SheetFeed(pdevobj);
break;
case CMDID_BEGINPAGE :
// Assume it is not safe to think color settings
// are carried over pages.
SetRibbonColor(pdevobj, TEXT_COLOR_UNKNOWN);
#if 0
if ((pOEM->wPaperSource == DMBIN_180BIN1) ||
(pOEM->wPaperSource == DMBIN_180BIN2) ||
(pOEM->wPaperSource == DMBIN_360BIN1) ||
(pOEM->wPaperSource == DMBIN_360BIN2) ||
(pOEM->wPaperSource == DMBIN_SUIHEI_BIN1) ||
(pOEM->wPaperSource == DMBIN_TAMOKUTEKI_BIN1) ||
(pOEM->wPaperSource == DMBIN_FI_FRONT)) {
WRITESPOOLBUF(pdevobj, ecCSFBPAGE.pEscStr, ecCSFBPAGE.cbSize, &dwResult);
} else if ((pOEM->wPaperSource == DMBIN_TRACTOR) ||
(pOEM->wPaperSource == DMBIN_FI_TRACTOR)) {
WRITESPOOLBUF(pdevobj, ecTRCTBPAGE.pEscStr, ecTRCTBPAGE.cbSize, &dwResult);
} else if ((pOEM->wPaperSource == DMBIN_MANUAL) &&
(!bFirstPage)) {
WRITESPOOLBUF(pdevobj, ecManual2P.pEscStr, ecManual2P.cbSize, &dwResult);
pOEM->bFirstPage = FALSE;
}
WRITESPOOLBUF(pdevobj, "\x0D", 1, &dwResult);
if (bFirstPage) pOEM->bFirstPage = FALSE;
#endif
break;
case CMDID_ENDPAGE :
if ((pOEM->wPaperSource == DMBIN_180BIN1) ||
(pOEM->wPaperSource == DMBIN_180BIN2) ||
(pOEM->wPaperSource == DMBIN_360BIN1) ||
(pOEM->wPaperSource == DMBIN_360BIN2) ||
(pOEM->wPaperSource == DMBIN_SUIHEI_BIN1) ||
(pOEM->wPaperSource == DMBIN_TAMOKUTEKI_BIN1) ||
(pOEM->wPaperSource == DMBIN_FI_FRONT)) {
WRITESPOOLBUF(pdevobj, ecCSFEPAGE.pEscStr, ecCSFEPAGE.cbSize, &dwResult);
}
break;
case CMDID_SELECT_BLACK_COLOR:
pOEM->jColor = 8;
break;
case CMDID_SELECT_BLUE_COLOR:
pOEM->jColor = 6;
break;
case CMDID_SELECT_CYAN_COLOR:
pOEM->jColor = 4;
break;
case CMDID_SELECT_GREEN_COLOR:
pOEM->jColor = 5;
break;
case CMDID_SELECT_MAGENTA_COLOR:
pOEM->jColor = 2;
break;
case CMDID_SELECT_RED_COLOR:
pOEM->jColor = 3;
break;
case CMDID_SELECT_WHITE_COLOR:
// Should not happen
pOEM->jColor = 0;
break;
case CMDID_SELECT_YELLOW_COLOR:
pOEM->jColor = 1;
break;
case CMDID_SEND_BLACK_COLOR:
SetRibbonColor(pdevobj, TEXT_COLOR_BLACK);
break;
case CMDID_SEND_CYAN_COLOR:
SetRibbonColor(pdevobj, TEXT_COLOR_CYAN);
break;
case CMDID_SEND_MAGENTA_COLOR:
SetRibbonColor(pdevobj, TEXT_COLOR_MAGENTA);
break;
case CMDID_SEND_YELLOW_COLOR:
SetRibbonColor(pdevobj, TEXT_COLOR_YELLOW);
break;
} /* end switch */
// MSKK 11/05
return 0;
}
PDEVOEM APIENTRY
OEMEnablePDEV(
PDEVOBJ pdevobj,
PWSTR pPrinterName,
ULONG cPatterns,
HSURF *phsurfPatterns,
ULONG cjGdiInfo,
GDIINFO* pGdiInfo,
ULONG cjDevInfo,
DEVINFO* pDevInfo,
DRVENABLEDATA *pded)
{
DEVICE_DATA *pTemp;
VERBOSE((DLLTEXT("OEMEnablePDEV() entry.\n")));
// Set minidriver PDEV address.
pTemp = (DEVICE_DATA *)MemAllocZ(sizeof(DEVICE_DATA));
if (NULL == pTemp) {
ERR(("Memory allocation failure.\n"));
return NULL;
}
pTemp->bFirstPage = TRUE;
pdevobj->pdevOEM = (MINIDEV *)MemAllocZ(sizeof(MINIDEV));
if (NULL == pdevobj->pdevOEM) {
ERR(("Memory allocation failure.\n"));
return NULL;
}
MINIDEV_DATA(pdevobj) = (PDEVOEM)pTemp;
return pdevobj->pdevOEM;
}
VOID APIENTRY
OEMDisablePDEV(
PDEVOBJ pdevobj)
{
VERBOSE((DLLTEXT("OEMDisablePDEV() entry.\n")));
if ( NULL != pdevobj->pdevOEM ) {
if (MINIDEV_DATA(pdevobj)) {
MemFree(MINIDEV_DATA(pdevobj));
}
MemFree( pdevobj->pdevOEM );
pdevobj->pdevOEM = NULL;
}
}
BOOL APIENTRY OEMResetPDEV(
PDEVOBJ pdevobjOld,
PDEVOBJ pdevobjNew)
{
DEVICE_DATA *pOEMOld, *pOEMNew;
pOEMOld = (DEVICE_DATA *)MINIDEV_DATA(pdevobjOld);
pOEMNew = (DEVICE_DATA *)MINIDEV_DATA(pdevobjNew);
if (pOEMOld != NULL && pOEMNew != NULL)
*pOEMNew = *pOEMOld;
return TRUE;
}
VOID APIENTRY
OEMOutputCharStr(
PDEVOBJ pdevobj,
PUNIFONTOBJ pUFObj,
DWORD dwType,
DWORD dwCount,
PVOID pGlyph )
{
GETINFO_GLYPHSTRING GStr;
PBYTE aubBuff;
PTRANSDATA pTrans;
DWORD dwI;
DEVICE_DATA *pOEM;
DWORD dwResult;
INT i;
BYTE jColor;
BOOL bBackTab;
VERBOSE(("OEMOutputCharStr() entry.\n"));
ASSERT(VALID_PDEVOBJ(pdevobj));
if(!pdevobj || !pUFObj || !pGlyph)
{
ERR(("OEMOutputCharStr: Invalid parameter.\n"));
return;
}
// if(dwType == TYPE_GLYPHHANDLE &&
// (pUFObj->ulFontID < 1 || pUFObj->ulFontID > 21))
if(dwType == TYPE_GLYPHHANDLE)
{
// ERR(("OEMOutputCharStr: Invalid font ID %d.\n",
// pUFObj->ulFontID));
// return;
// VERBOSE(("OEMOutputCharStr: Font ID %d.\n",
// pUFObj->ulFontID));
}
pOEM = (DEVICE_DATA *)MINIDEV_DATA(pdevobj);
switch (dwType)
{
case TYPE_GLYPHHANDLE:
// if(!(aubBuff = (PBYTE)MemAllocZ(dwCount * sizeof(TRANSDATA))) )
// {
// ERR(("MemAlloc failed.\n"));
// return;
// }
GStr.dwSize = sizeof (GETINFO_GLYPHSTRING);
GStr.dwCount = dwCount;
GStr.dwTypeIn = TYPE_GLYPHHANDLE;
GStr.pGlyphIn = pGlyph;
GStr.dwTypeOut = TYPE_TRANSDATA;
// #333653: Change I/F for GETINFO_GLYPHSTRING
GStr.pGlyphOut = NULL;
GStr.dwGlyphOutSize = 0;
if (pUFObj->pfnGetInfo(pUFObj, UFO_GETINFO_GLYPHSTRING, &GStr, 0, NULL) || !GStr.dwGlyphOutSize)
{
ERR(("UNIFONTOBJ_GetInfo:UFO_GETINFO_GLYPHSTRING failed.\n"));
return;
}
if(!(aubBuff = (PBYTE)MemAllocZ(GStr.dwGlyphOutSize)) )
{
ERR(("MemAlloc failed.\n"));
return;
}
GStr.pGlyphOut = aubBuff;
if (!pUFObj->pfnGetInfo(pUFObj, UFO_GETINFO_GLYPHSTRING, &GStr, 0, NULL))
{
ERR(("UNIFONTOBJ_GetInfo:UFO_GETINFO_GLYPHSTRING failed.\n"));
goto out;
}
jColor = pOEM->jColor;
VERBOSE(("jColor=%d\n", jColor));
// If old color can be used as it is,
// use it first.
jColor <<= 1;
if (0 != (pOEM->jColor & pOEM->jOldColor)) {
jColor &= ~(pOEM->jOldColor << 1);
jColor |= 1;
}
for (i = 0; i < 5 && jColor > 0;
i++, (jColor >>= 1)) {
pTrans = (PTRANSDATA)aubBuff;
// Check if we need to print this plane.
if (!(jColor & 1))
continue;
// Check if we need to do back-tab
bBackTab = (jColor > 1);
if (bBackTab)
{
WRITESPOOLBUF(pdevobj,
"\x1BH", 2, &dwResult);
}
// Send out color select command
switch (i)
{
case 0:
// Same as before
break;
case 1:
// Y
SetRibbonColor(pdevobj, TEXT_COLOR_YELLOW);
break;
case 2:
// M
SetRibbonColor(pdevobj, TEXT_COLOR_MAGENTA);
break;
case 3:
// C
SetRibbonColor(pdevobj, TEXT_COLOR_CYAN);
break;
case 4:
// K
SetRibbonColor(pdevobj, TEXT_COLOR_BLACK);
break;
}
// Send out text
for (dwI = 0; dwI < dwCount; dwI ++, pTrans++)
{
switch (pTrans->ubType & MTYPE_FORMAT_MASK)
{
case MTYPE_DIRECT:
WRITESPOOLBUF(pdevobj,
&pTrans->uCode.ubCode, 1,
&dwResult);
break;
case MTYPE_PAIRED:
WRITESPOOLBUF(pdevobj,
&pTrans->uCode.ubPairs[0], 1,
&dwResult);
WRITESPOOLBUF(pdevobj,
&pTrans->uCode.ubPairs[1], 1,
&dwResult);
break;
}
}
// Do back-tab for next plane
if (bBackTab)
{
WRITESPOOLBUF(pdevobj,
"\x1C" "D\x1B[3g", 6,
&dwResult);
}
}
out:
MemFree(aubBuff);
break;
}
return;
}
VOID
SetRibbonColor(
PDEVOBJ pdevobj,
BYTE jColor)
{
DEVICE_DATA *pOEM;
DWORD dwResult;
pOEM = (DEVICE_DATA *)MINIDEV_DATA(pdevobj);
switch (jColor)
{
case TEXT_COLOR_YELLOW:
if (TEXT_COLOR_YELLOW != pOEM->jOldColor)
{
WRITESPOOLBUF(pdevobj,
"\x1C*!s", 4, &dwResult);
pOEM->jOldColor = TEXT_COLOR_YELLOW;
}
break;
case TEXT_COLOR_MAGENTA:
if (TEXT_COLOR_MAGENTA != pOEM->jOldColor)
{
WRITESPOOLBUF(pdevobj,
"\x1C*!u", 4, &dwResult);
pOEM->jOldColor = TEXT_COLOR_MAGENTA;
}
break;
case TEXT_COLOR_CYAN:
if (TEXT_COLOR_CYAN != pOEM->jOldColor)
{
WRITESPOOLBUF(pdevobj,
"\x1C*!v", 4, &dwResult);
pOEM->jOldColor = TEXT_COLOR_CYAN;
}
break;
case TEXT_COLOR_BLACK:
if (TEXT_COLOR_BLACK != pOEM->jOldColor)
{
WRITESPOOLBUF(pdevobj,
"\x1C*!p", 4, &dwResult);
pOEM->jOldColor = TEXT_COLOR_BLACK;
}
break;
case TEXT_COLOR_UNKNOWN:
pOEM->jOldColor = TEXT_COLOR_UNKNOWN;
break;
}
}