//*************************************************************************************************** // COLMATCH.C // // Functions of color matching //--------------------------------------------------------------------------------------------------- // copyright(C) 1997-1999 CASIO COMPUTER CO.,LTD. / CASIO ELECTRONICS MANUFACTURING CO.,LTD. //*************************************************************************************************** #include "PDEV.H" //#include "DEBUG.H" #include "PRNCTL.H" #include "strsafe.h" // Security-Code 2002.3.6 //--------------------------------------------------------------------------------------------------- // Byte/Bit table //--------------------------------------------------------------------------------------------------- static const BYTE BitTbl[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01}; //--------------------------------------------------------------------------------------------------- // Table for numbering dither method //--------------------------------------------------------------------------------------------------- static const WORD DizNumTbl[7] = {1, // XX_DITHERING_OFF 1, // XX_DITHERING_ON 0, // XX_DITHERING_DET 1, // XX_DITHERING_PIC 2, // XX_DITHERING_GRA 0, // XX_DITHERING_CAR 3 // XX_DITHERING_GOSA }; #define MAX_DIZNUM (sizeof DizNumTbl / sizeof DizNumTbl[0]) //--------------------------------------------------------------------------------------------------- // Define LUT fine name //--------------------------------------------------------------------------------------------------- #define N4LUT000 L"CPN4RGB0.LUT" // For N4 printer #define N4LUT001 L"CPN4RGB1.LUT" #define N4LUT002 L"CPN4RGB2.LUT" #define N4LUT003 L"CPN4RGB3.LUT" #define N4LUT004 L"CPN4RGB4.LUT" #define N4LUT005 L"CPN4RGB5.LUT" #define N403LUTX L"CPN4RGBX.LUT" // For N4-612 printer #define N403LUTY L"CPN4RGBY.LUT" //--------------------------------------------------------------------------------------------------- // Define DLL name //--------------------------------------------------------------------------------------------------- #define CSN46RESDLL L"CSN46RES.DLL" //--------------------------------------------------------------------------------------------------- // Define data //--------------------------------------------------------------------------------------------------- #define DPI300 300 #define DPI600 600 static BYTE ORG_MODE_IN[] = "\x1Bz\xD0\x01"; static BYTE ORG_MODE_OUT[] = "\x1Bz\x00\x01"; static BYTE PALETTE_SELECT[] = "Cd,%d,%d*"; static BYTE PLANE_RESET[] = "Da,0,0,0,0*"; // Replacement of strsafe-api 2002.3.6 >>> //#ifdef wsprintf //#undef wsprintf //#endif // wsprintf //#define wsprintf sprintf // Replacement of strsafe-api 2002.3.6 <<< //*************************************************************************************************** // Prototype declaration //*************************************************************************************************** static BOOL DizTblSetN4(PDEVOBJ, WORD); static BOOL DizTblSetN403(PDEVOBJ, WORD); static BOOL LutFileLoadN4(PDEVOBJ, WORD, WORD, WORD); static BOOL LutFileLoadN403(PDEVOBJ, WORD, WORD); static BOOL TnrTblSetN4(PDEVOBJ, SHORT); static BOOL TnrTblSetN403(PDEVOBJ, SHORT); static BOOL ColGosTblSet(LPN4DIZINF, WORD); static void ColGosTblFree(LPN4DIZINF); static void ColRgbGos(PDEVOBJ, WORD, WORD, WORD, LPBYTE); static BOOL BmpBufAlloc(PDEVOBJ, WORD, WORD, WORD, WORD, WORD, WORD, WORD, WORD, LPBMPBIF); static void BmpBufFree(LPBMPBIF); static void BmpBufClear(LPBMPBIF); static WORD Dithering001(PDEVOBJ, WORD, WORD, WORD, WORD, WORD, WORD, LPBYTE, LPBYTE, LPBYTE, LPBYTE, LPBYTE); static void BmpPrint(PDEVOBJ, LPBMPBIF, POINT, WORD, WORD, WORD); static void BmpRGBCnv(LPRGB, LPBYTE, WORD, WORD, WORD, LPRGBQUAD); //*************************************************************************************************** // Functions //*************************************************************************************************** //=================================================================================================== // Initialize the members of color-matching //=================================================================================================== BOOL FAR PASCAL ColMatchInit( PDEVOBJ pdevobj // Pointer to PDEVOBJ structure ) { LPN4DIZINF lpN4DizInf; // N4DIZINF structure LPN403DIZINF lpN403DizInf; // N403DIZINF structure PMYPDEV pOEM = (PMYPDEV)pdevobj->pdevOEM; pOEM->Col.Mch.Mode = pOEM->iColorMatching; pOEM->Col.Mch.Diz = pOEM->iDithering; pOEM->Col.Mch.PColor = No; pOEM->Col.Mch.Toner = 0; if (pOEM->iCmyBlack == XX_CMYBLACK_ON) { // Replace K with CMY? pOEM->Col.Mch.CmyBlk = 1; } else { pOEM->Col.Mch.CmyBlk = 0; // Use black toner } // 0 fixed pOEM->Col.Mch.Bright = 0; // 0 fixed pOEM->Col.Mch.Contrast = 0; // Color balance(R) : 10 fixed pOEM->Col.Mch.GamRed = 10; // Color balance(G) : 10 fixed pOEM->Col.Mch.GamGreen = 10; // Color balance(B) : 10 fixed pOEM->Col.Mch.GamBlue = 10; pOEM->Col.Mch.Speed = pOEM->iBitFont; pOEM->Col.Mch.Gos32 = No; pOEM->Col.Mch.LutNum = 0; // LUT table number pOEM->Col.Mch.TnrNum = 0; // Toner density table number pOEM->Col.Mch.SubDef = Yes; // Not change setting of color balance, bright and contrast? CM_VERBOSE(("CMINit ENT Tn=%d Col=%d Mod=%d DZ=%d Cyk=%d Sp=%d Prt=%d\n", pOEM->iTone, pOEM->iColor, pOEM->Col.Mch.Mode,pOEM->Col.Mch.Diz,pOEM->Col.Mch.CmyBlk,pOEM->Col.Mch.Speed,pOEM->Printer)); if (pOEM->Printer != PRN_N403) { // N4 printer if ((pOEM->Col.N4.lpDizInf = MemAllocZ(sizeof(N4DIZINF))) == NULL) { ERR(("Alloc ERROR!!\n")); return 0; } lpN4DizInf = pOEM->Col.N4.lpDizInf; if (pOEM->iColor != XX_MONO) { lpN4DizInf->ColMon = N4_COL; // Color } else { lpN4DizInf->ColMon = N4_MON; // Monochrome } if (pOEM->iResolution == XX_RES_300DPI) { pOEM->Col.wReso = DPI300; } pOEM->Col.DatBit = 1; pOEM->Col.BytDot = 8; // Numbers of DPI(2 value) if (pOEM->iBitFont == XX_BITFONT_OFF) { pOEM->Col.Mch.Gos32 = Yes; } pOEM->Col.Mch.Speed = Yes; if (pOEM->Col.Mch.Diz != XX_DITHERING_GOSA) { // Make dither table for N4 printer if (DizTblSetN4(pdevobj, pOEM->Col.Mch.Diz) == FALSE) { ERR(("DizTblSetN4 ERROR!!\n")); return 0; } } if (lpN4DizInf->ColMon == N4_COL) { if (pOEM->Col.Mch.Mode != XX_COLORMATCH_NONE) { // Load LUT file if (LutFileLoadN4(pdevobj, pOEM->Col.Mch.Mode, pOEM->Col.Mch.Diz, pOEM->Col.Mch.Speed) == FALSE) { ERR(("LutFileLoadN4 ERROR!!\n")); return 0; } pOEM->Col.Mch.LutNum = 0; // Lut table number } // Make toner density table if (TnrTblSetN4(pdevobj, pOEM->Col.Mch.Toner) == FALSE) { ERR(("TnrTblSetN4 ERROR!!\n")); return 0; } pOEM->Col.Mch.TnrNum = 0; // Toner density table number } } else { // N403 printer if ((pOEM->Col.N403.lpDizInf = MemAllocZ(sizeof(N403DIZINF))) == NULL) { ERR(("Init Alloc ERROR!!\n")); return 0; } lpN403DizInf = pOEM->Col.N403.lpDizInf; if (pOEM->Col.Mch.Mode == XX_COLORMATCH_VIV) { pOEM->Col.Mch.Viv = 20; } pOEM->Col.wReso = (pOEM->iResolution == XX_RES_300DPI) ? DPI300 : DPI600; if (pOEM->iColor != XX_MONO) { lpN403DizInf->ColMon = N403_COL; // Color } else { lpN403DizInf->ColMon = N403_MON; // Monochrome } if (pOEM->iColor == XX_COLOR_SINGLE) { lpN403DizInf->PrnMod = (pOEM->iResolution == XX_RES_300DPI) ? N403_MOD_300B1 : N403_MOD_600B1; } if (pOEM->iColor == XX_COLOR_MANY) { lpN403DizInf->PrnMod = (pOEM->iResolution == XX_RES_300DPI) ? N403_MOD_300B4 : N403_MOD_600B2; } if (lpN403DizInf->PrnMod == N403_MOD_300B1) { // 300DPI 2 value CM_VERBOSE(("N403_MOD_300B1\n")); pOEM->Col.DatBit = 1; pOEM->Col.BytDot = 8; // Number of DPI(2 value) } else if (lpN403DizInf->PrnMod == N403_MOD_300B4) { // 300DPI 16 value CM_VERBOSE(("N403_MOD_300B4\n")); pOEM->Col.DatBit = 4; pOEM->Col.BytDot = 2; } else if (lpN403DizInf->PrnMod == N403_MOD_600B1) { // 600DPI 2 value CM_VERBOSE(("N403_MOD_600B1\n")); pOEM->Col.DatBit = 1; pOEM->Col.BytDot = 8; } else { // 600DPI 4 value CM_VERBOSE(("N403_MOD_600B2\n")); pOEM->Col.DatBit = 2; pOEM->Col.BytDot = 4; } // Make dither table for N4-612 printer if (DizTblSetN403(pdevobj, pOEM->Col.Mch.Diz) == FALSE) { ERR(("diztblset n403 ERROR!!\n")); return 0; } if (lpN403DizInf->ColMon == N403_COL) { if (pOEM->Col.Mch.Mode != XX_COLORMATCH_NONE) { // Load LUT file if (LutFileLoadN403(pdevobj, pOEM->Col.Mch.Mode, pOEM->Col.Mch.Speed) == FALSE) { ERR(("lutfileloadn4 ERROR!!\n")); return 0; } pOEM->Col.Mch.LutNum = 0; } // Make toner density table if (TnrTblSetN403(pdevobj, pOEM->Col.Mch.Toner) == FALSE) { ERR(("tnrtblsetn4 ERROR!!\n")); return 0; } pOEM->Col.Mch.TnrNum = 0; } } CM_VERBOSE(("ColMatchInit End pOEM->Col.wReso= %d\n",pOEM->Col.wReso)); return TRUE; } //=================================================================================================== // DIB spools to the printer //=================================================================================================== BOOL FAR PASCAL DIBtoPrn( PDEVOBJ pdevobj, PBYTE pSrcBmp, PBITMAPINFOHEADER pBitmapInfoHeader, PBYTE pColorTable, PIPPARAMS pIPParams) { BMPBIF bmpBuf; // BMPBIF structure POINT drwPos; // Start position for spooling WORD dstWByt; // X size of destination bitmap data LONG dstX; // X coordinates of destination bitmap data LONG dstY; // Y coordinates of destination bitmap data LONG dstYEnd; // The last Y coordinates(+1) of destination bitmap data WORD dstScn; // Number of destination bitmap data lines WORD srcY; // Y coordinates of source bitmap data LONG srcWByt; // Y size of source bitmap data WORD setCnt; // count LPCMYK lpCMYK; // CMYK temporary data buffer BYTE Cmd[64]; WORD wlen; LPSTR pDestEnd; // 2002.3.6 size_t szRemLen; // 2002.3.6 PMYPDEV pOEM = (PMYPDEV)pdevobj->pdevOEM; CM_VERBOSE((" ImagePro ENTRY Dx=%d Dy=%d SxSiz=%d SySiz=%d BC=%d Sz=%d ", pIPParams->ptOffset.x, pIPParams->ptOffset.y, pBitmapInfoHeader->biWidth, pBitmapInfoHeader->biHeight, pBitmapInfoHeader->biBitCount, pIPParams->dwSize)); if (pOEM->Printer != PRN_N403) { // N4 printer if (pOEM->iDithering == XX_DITHERING_GOSA) { if (pOEM->Col.N4.lpDizInf->GosRGB.Siz < (DWORD)pBitmapInfoHeader->biWidth) { ColGosTblFree(pOEM->Col.N4.lpDizInf); if ((ColGosTblSet(pOEM->Col.N4.lpDizInf, (WORD)pBitmapInfoHeader->biWidth)) == FALSE) { return FALSE; } } } } // Initialization of // RGB buffer :(X size of source bitmap data) * 3 // CMYK buffer :(X size of source bitmap data) * 4 // CMYK bit buffer :((X size of source bitmap data) * (Magnification of X) + 7) / 8 * (Y size of source bitmap data) * (Magnification of Y)) memset(&bmpBuf, 0x00, sizeof(BMPBIF)); if (BmpBufAlloc(pdevobj, (WORD)pBitmapInfoHeader->biWidth, (WORD)pBitmapInfoHeader->biHeight, 0, 0, 1, 1, 1, 1, &bmpBuf) == FALSE) { ERR(("Alloc ERROR!!\n")); return FALSE; } bmpBuf.Diz = pOEM->iDithering; bmpBuf.Style = 0; bmpBuf.DatBit = pOEM->Col.DatBit; dstWByt = (WORD)((pBitmapInfoHeader->biWidth + pOEM->Col.BytDot - 1) / pOEM->Col.BytDot); srcWByt = (pBitmapInfoHeader->biWidth * pBitmapInfoHeader->biBitCount + 31L) / 32L * 4L; drwPos.x = dstX = pIPParams->ptOffset.x; dstY = pIPParams->ptOffset.y; srcY = 0; dstYEnd = pIPParams->ptOffset.y + pBitmapInfoHeader->biHeight; // Convert DIB and spool to the printer for (;dstY < dstYEnd; ) { BmpBufClear(&bmpBuf); drwPos.y = dstY; for (dstScn = 0; dstY < dstYEnd && dstScn < bmpBuf.Drv.Bit.Lin; dstScn++, dstY++) { // Convert 1 line RGB bitmap data into 24bit (for 1pixel) RGB bitmap data BmpRGBCnv(bmpBuf.Drv.Rgb.Pnt, pSrcBmp, pBitmapInfoHeader->biBitCount, 0, (WORD)pBitmapInfoHeader->biWidth, (LPRGBQUAD)pColorTable); if (pOEM->Col.Mch.Gos32 == Yes) { ColRgbGos(pdevobj, (WORD)pBitmapInfoHeader->biWidth, (WORD)dstX, (WORD)dstY, (LPBYTE)bmpBuf.Drv.Rgb.Pnt); } // Convert RGB into CMYK bmpBuf.Drv.Rgb.AllWhite = (WORD)StrColMatching(pdevobj, (WORD)pBitmapInfoHeader->biWidth, bmpBuf.Drv.Rgb.Pnt, bmpBuf.Drv.Cmyk.Pnt); lpCMYK = bmpBuf.Drv.Cmyk.Pnt; if (pOEM->iDithering == XX_DITHERING_OFF) { for (setCnt = 0; setCnt < pBitmapInfoHeader->biWidth; setCnt++) { if (lpCMYK[setCnt].Cyn != 0) { lpCMYK[setCnt].Cyn = 255; } if (lpCMYK[setCnt].Mgt != 0) { lpCMYK[setCnt].Mgt = 255; } if (lpCMYK[setCnt].Yel != 0) { lpCMYK[setCnt].Yel = 255; } if (lpCMYK[setCnt].Bla != 0) { lpCMYK[setCnt].Bla = 255; } } } Dithering001(pdevobj, (WORD)pOEM->iDithering, (WORD)pBitmapInfoHeader->biWidth, (WORD)dstX, (WORD)dstY, srcY, (WORD)bmpBuf.Drv.Rgb.AllWhite, (LPBYTE)bmpBuf.Drv.Cmyk.Pnt, bmpBuf.Drv.Bit.Pnt[CYAN] + dstWByt * dstScn, bmpBuf.Drv.Bit.Pnt[MGENTA] + dstWByt * dstScn, bmpBuf.Drv.Bit.Pnt[YELLOW] + dstWByt * dstScn, bmpBuf.Drv.Bit.Pnt[BLACK] + dstWByt * dstScn); srcY++; pSrcBmp += srcWByt; } if (dstScn != 0) { // Spool to printer BmpPrint(pdevobj, &bmpBuf, drwPos, (WORD)pBitmapInfoHeader->biWidth, dstScn, dstWByt); } } // Set back palette (Palette No. is fixed , All plane(CMYK) is OK ) // Same as palette state before OEMImageProcessing call WRITESPOOLBUF(pdevobj, ORG_MODE_IN, BYTE_LENGTH(ORG_MODE_IN)); // Replacement of strsafe-api 2002.3.6 >>> // wlen = (WORD)wsprintf(Cmd, PALETTE_SELECT, 0, DEFAULT_PALETTE_INDEX); if (S_OK != StringCbPrintfExA(Cmd, sizeof(Cmd), &pDestEnd, &szRemLen, STRSAFE_IGNORE_NULLS | STRSAFE_NULL_ON_FAILURE, PALETTE_SELECT, 0, DEFAULT_PALETTE_INDEX)) { BmpBufFree(&bmpBuf); return FALSE; } wlen = (WORD)(pDestEnd - Cmd); // Replacement of strsafe-api 2002.3.6 <<< WRITESPOOLBUF(pdevobj, Cmd, wlen); WRITESPOOLBUF(pdevobj, PLANE_RESET, BYTE_LENGTH(PLANE_RESET)); WRITESPOOLBUF(pdevobj, ORG_MODE_OUT, BYTE_LENGTH(ORG_MODE_OUT)); BmpBufFree(&bmpBuf); CM_VERBOSE(("ImagePro End\n")); return TRUE; } //=================================================================================================== // Convert RGB data into CMYK data //=================================================================================================== BOOL FAR PASCAL StrColMatching( PDEVOBJ pdevobj, // Pointer to pdevobj structure WORD MchSiz, // X size of RGB LPRGB lpRGB, // RGB buffer LPCMYK lpCMYK // CMYK buffer ) { LPN4DIZINF lpN4DizInf; // N4DIZINF structure LPN403DIZINF lpN403DizInf; // N403DIZINF structure WORD chkCnt; // RGB white data check count DWORD bCnv; // Replace black PMYPDEV pOEM = (PMYPDEV)pdevobj->pdevOEM; for (chkCnt = 0; chkCnt < MchSiz; chkCnt++) { // Check RGB data if (lpRGB[chkCnt].Blue != 0xff || lpRGB[chkCnt].Green != 0xff || lpRGB[chkCnt].Red != 0xff) { break; // There are data except white data } } if (chkCnt >= MchSiz) { return Yes; // All RGB data is white } if (pOEM->Printer != PRN_N403) { // N4 printer lpN4DizInf = pOEM->Col.N4.lpDizInf; bCnv = pOEM->Col.Mch.CmyBlk; if (lpN4DizInf->ColMon == N4_COL) { // Color // Convert RGB data if (pOEM->Col.Mch.Diz == XX_DITHERING_OFF) { N4ColCnvLin(lpN4DizInf, lpRGB, lpCMYK, (DWORD)MchSiz); } else if (/*pOEM->Col.Mch.KToner == Yes && */MchSiz == 1 && lpRGB->Blue == lpRGB->Green && lpRGB->Blue == lpRGB->Red) { // For monochrome N4ColCnvMon(lpN4DizInf, (DWORD)DizNumTbl[pOEM->Col.Mch.Diz], lpRGB, lpCMYK, (DWORD)MchSiz); } else if (pOEM->Col.Mch.Mode != XX_COLORMATCH_NONE) { if (pOEM->Col.Mch.Speed == Yes) { N4ColMch000(lpN4DizInf, lpRGB, lpCMYK, (DWORD)MchSiz, bCnv); } else { N4ColMch001(lpN4DizInf, lpRGB, lpCMYK, (DWORD)MchSiz, bCnv); } } else { N4ColCnvSld(lpN4DizInf, lpRGB, lpCMYK, (DWORD)MchSiz); } } else { // For monochrome N4ColCnvMon(lpN4DizInf, (DWORD)DizNumTbl[pOEM->Col.Mch.Diz], lpRGB, lpCMYK, (DWORD)MchSiz); } } else { // N403 printer lpN403DizInf = pOEM->Col.N403.lpDizInf; bCnv = pOEM->Col.Mch.CmyBlk; if (lpN403DizInf->ColMon == N403_COL) { // Color if (pOEM->Col.Mch.Diz == XX_DITHERING_OFF) { N403ColCnvL02(lpN403DizInf, lpRGB, lpCMYK, (DWORD)MchSiz); } else if (/*pOEM->Col.Mch.KToner == Yes && */MchSiz == 1 && lpRGB->Blue == lpRGB->Green && lpRGB->Blue == lpRGB->Red) { // For monochrome N403ColCnvMon(lpN403DizInf, lpRGB, lpCMYK, (DWORD)MchSiz); } else if (pOEM->Col.Mch.Mode != XX_COLORMATCH_NONE) { if (pOEM->Col.Mch.Speed == Yes) { N403ColMch000(lpN403DizInf, lpRGB, lpCMYK, (DWORD)MchSiz, bCnv); } else { N403ColMch001(lpN403DizInf, lpRGB, lpCMYK, (DWORD)MchSiz, bCnv); } if (pOEM->Col.Mch.Mode == XX_COLORMATCH_VIV) { N403ColVivPrc(lpN403DizInf, lpCMYK, (DWORD)MchSiz, (DWORD)pOEM->Col.Mch.Viv); } } else { N403ColCnvSld(lpN403DizInf, lpRGB, lpCMYK, (DWORD)MchSiz, bCnv); } } else { // For monochrome N403ColCnvMon(lpN403DizInf, lpRGB, lpCMYK, (DWORD)MchSiz); } } return No; // There are data except white data } //=================================================================================================== // Allocate GOSA-KAKUSAN table (Only for N4 printer) //=================================================================================================== BOOL ColGosTblSet( LPN4DIZINF lpN4DizInf, // Pointer to N4DIZINF structure WORD XSize // Xsize ) { if ((lpN4DizInf->GosRGB.Tbl[0] = MemAllocZ((DWORD)(XSize + 2) * sizeof(SHORT) * 3)) == NULL) { return 0; } if ((lpN4DizInf->GosRGB.Tbl[1] = MemAllocZ((DWORD)(XSize + 2) * sizeof(SHORT) * 3)) == NULL) { return 0; } if ((lpN4DizInf->GosCMYK.Tbl[0] = MemAllocZ((DWORD)(XSize + 2) * sizeof(SHORT) * 4)) == NULL) { return 0; } if ((lpN4DizInf->GosCMYK.Tbl[1] = MemAllocZ((DWORD)(XSize + 2) * sizeof(SHORT) * 4)) == NULL) { return 0; } lpN4DizInf->GosRGB.Num = 0; lpN4DizInf->GosCMYK.Num = 0; lpN4DizInf->GosRGB.Siz = XSize; lpN4DizInf->GosCMYK.Siz = XSize; lpN4DizInf->GosRGB.Yax = 0xffffffff; lpN4DizInf->GosCMYK.Yax = 0xffffffff; return TRUE; } //=================================================================================================== // Free GOSA-KAKUSAN table (Only for N4 printer) //=================================================================================================== void ColGosTblFree( LPN4DIZINF lpN4DizInf // Pointer to N4DIZINF structure ) { if (lpN4DizInf->GosRGB.Tbl[0]) { MemFree(lpN4DizInf->GosRGB.Tbl[0]); lpN4DizInf->GosRGB.Tbl[0] = NULL; } if (lpN4DizInf->GosRGB.Tbl[1]) { MemFree(lpN4DizInf->GosRGB.Tbl[1]) lpN4DizInf->GosRGB.Tbl[1] = NULL; } if (lpN4DizInf->GosCMYK.Tbl[0]) { MemFree(lpN4DizInf->GosCMYK.Tbl[0]); lpN4DizInf->GosCMYK.Tbl[0] = NULL; } if (lpN4DizInf->GosCMYK.Tbl[1]) { MemFree(lpN4DizInf->GosCMYK.Tbl[1]); lpN4DizInf->GosCMYK.Tbl[1] = NULL; } return; } //=================================================================================================== // RGB data conversion(For GOSA-KAKUSAN, only for N4) //=================================================================================================== void ColRgbGos( PDEVOBJ pdevobj, WORD XSize, WORD XPos, WORD YOff, LPBYTE lpRGB ) { LPN4DIZINF lpN4DizInf; PMYPDEV pOEM = (PMYPDEV)pdevobj->pdevOEM; if (pOEM->Printer == PRN_N403) { return; } lpN4DizInf = pOEM->Col.N4.lpDizInf; N4RgbGos(lpN4DizInf, (DWORD)XSize, (DWORD)XPos, (DWORD)YOff, lpRGB); return; } //=================================================================================================== // Free dither table, toner density table , Lut table, N403DIZINF(N4DIZINF) structure buffer //=================================================================================================== void FAR PASCAL DizLutTnrTblFree( PDEVOBJ pdevobj ) { int i; DWORD dizNum; WORD alcCnt; WORD alcTbl; PMYPDEV pOEM = (PMYPDEV)pdevobj->pdevOEM; if (pOEM->Printer != PRN_N403 && NULL != pOEM->Col.N4.lpDizInf) { // N4 printer CM_VERBOSE(("OEMDisablePDEV N4\n")); if (pOEM->Col.Mch.Diz != XX_DITHERING_GOSA) { dizNum = DizNumTbl[pOEM->Col.Mch.Diz]; // Dither number for (i = 0; i < 4; i++) { if (pOEM->Col.N4.lpDizInf->Diz.Tbl[dizNum][i]) { MemFree(pOEM->Col.N4.lpDizInf->Diz.Tbl[dizNum][i]); pOEM->Col.N4.lpDizInf->Diz.Tbl[dizNum][i] = NULL; } } } if (pOEM->Col.N4.lpDizInf->Tnr.Tbl) { MemFree(pOEM->Col.N4.lpDizInf->Tnr.Tbl); pOEM->Col.N4.lpDizInf->Tnr.Tbl = NULL; } if (pOEM->Col.Mch.Mode != XX_COLORMATCH_NONE) { if (pOEM->Col.N4.lpDizInf->Lut.Tbl) { MemFree(pOEM->Col.N4.lpDizInf->Lut.Tbl); pOEM->Col.N4.lpDizInf->Lut.Tbl = NULL; } if (pOEM->Col.Mch.Speed == No) { if (pOEM->Col.N4.lpDizInf->Lut.CchRgb) { MemFree(pOEM->Col.N4.lpDizInf->Lut.CchRgb); pOEM->Col.N4.lpDizInf->Lut.CchRgb = NULL; } if (pOEM->Col.N4.lpDizInf->Lut.CchCmy) { MemFree(pOEM->Col.N4.lpDizInf->Lut.CchCmy); pOEM->Col.N4.lpDizInf->Lut.CchCmy = NULL; } } } if (pOEM->iDithering == XX_DITHERING_GOSA) { ColGosTblFree(pOEM->Col.N4.lpDizInf); } if (pOEM->Col.N4.lpDizInf) { MemFree(pOEM->Col.N4.lpDizInf); pOEM->Col.N4.lpDizInf = NULL; } } else if (NULL != pOEM->Col.N403.lpDizInf) { // N4-612 printer CM_VERBOSE(("OEMDisablePDEV N403\n")); dizNum = DizNumTbl[pOEM->Col.Mch.Diz]; if (pOEM->Col.N403.lpDizInf->PrnMod == N403_MOD_600B2 && pOEM->Col.Mch.Diz == XX_DITHERING_DET) { alcTbl = 1; } else { alcTbl = 4; } for (alcCnt = 0; alcCnt < alcTbl; alcCnt++) { if (pOEM->Col.N403.lpDizInf->Diz.Tbl[dizNum][alcCnt]) { MemFree(pOEM->Col.N403.lpDizInf->Diz.Tbl[dizNum][alcCnt]); pOEM->Col.N403.lpDizInf->Diz.Tbl[dizNum][alcCnt] = NULL; } } if (pOEM->Col.N403.lpDizInf->PrnMod == N403_MOD_600B2) { for (i = 0; i < 4; i++) { if (pOEM->Col.N403.lpDizInf->EntDiz.Tbl[i]) { MemFree(pOEM->Col.N403.lpDizInf->EntDiz.Tbl[i]); pOEM->Col.N403.lpDizInf->EntDiz.Tbl[i] = NULL; } } } if (pOEM->Col.N403.lpDizInf->Tnr.Tbl) { MemFree(pOEM->Col.N403.lpDizInf->Tnr.Tbl); pOEM->Col.N403.lpDizInf->Tnr.Tbl = NULL; } if (pOEM->Col.Mch.Mode != XX_COLORMATCH_NONE) { if (pOEM->Col.N403.lpDizInf->Lut.Tbl) { MemFree(pOEM->Col.N403.lpDizInf->Lut.Tbl); pOEM->Col.N403.lpDizInf->Lut.Tbl = NULL; } if (pOEM->Col.Mch.Speed == No) { if (pOEM->Col.N403.lpDizInf->Lut.CchRgb) { MemFree(pOEM->Col.N403.lpDizInf->Lut.CchRgb); pOEM->Col.N403.lpDizInf->Lut.CchRgb = NULL; } if (pOEM->Col.N403.lpDizInf->Lut.CchCmy) { MemFree(pOEM->Col.N403.lpDizInf->Lut.CchCmy); pOEM->Col.N403.lpDizInf->Lut.CchCmy = NULL; } } } if (pOEM->Col.N403.lpDizInf) { MemFree(pOEM->Col.N403.lpDizInf); pOEM->Col.N403.lpDizInf = NULL; } } } //=================================================================================================== // Allocate bitmap data buffer //--------------------------------------------------------------------------------------------------- // Allocate size // RGB buffer :Source bitmap Xsize * 3 // CMYK buffer :Source bitmap Xsize * 4 // CMYK bit buffer :2 value (Source Xsize * XNrt + 7) / 8 * Source Ysize * YNrt // :4 value (Source Xsize * XNrt + 3) / 4 * Source Ysize * YNrt // :16 value (Source Xsize * XNrt + 1) / 2 * Source Ysize * YNrt //=================================================================================================== BOOL BmpBufAlloc( PDEVOBJ pdevobj, // Pointer to pdevobj structure WORD SrcXSiz, // Source bitmap data Xsize WORD SrcYSiz, // Source bitmap data Ysize WORD SrcXOff, // Source X offset WORD SrcYOff, // Source Y offset WORD XNrt, // Magnification of X (numerator) WORD XDnt, // Magnification of X (denominator) WORD YNrt, // Magnification of Y (numerator) WORD YDnt, // Magnification of Y (denominator) LPBMPBIF lpBmpBuf // Pointer to bitmap buffer structure ) { WORD setSiz; WORD setCnt; WORD alcErr; // Allocate error? WORD bytDot; // DPI WORD xSiz; WORD ySiz; WORD alcLin; DWORD alcSiz; PMYPDEV pOEM = (PMYPDEV)pdevobj->pdevOEM; alcErr = Yes; bytDot = pOEM->Col.BytDot; // Check of zero divide 2002.3.23 >>> if ((XDnt == 0) || (YDnt == 0)) { ERR(("BmpBufAlloc() 0Div-Check [XDnt, YDnt=0] \n")); return 0; } // Check of zero divide 2002.3.23 <<< xSiz = (WORD)(((DWORD)SrcXOff + SrcXSiz) * XNrt / XDnt); xSiz -= (WORD)((DWORD)SrcXOff * XNrt / XDnt); ySiz = (WORD)(((DWORD)SrcYOff + SrcYSiz + 2) * YNrt / YDnt); ySiz -= (WORD)((DWORD)SrcYOff * YNrt / YDnt); // The size of CMYK bit buffer if (((DWORD)((xSiz + bytDot - 1) / bytDot) * ySiz) < (64L * 1024L - 1L)) { alcLin = ySiz; } else { // Over 64kb? alcLin = (WORD)((64L * 1024L - 1L) / ((xSiz + bytDot - 1) / bytDot)); } alcSiz = ((xSiz + bytDot - 1) / bytDot) * alcLin; // The size of CMYK bit buffer(8bit boundary) for ( ; ; ) { // Allocation // The number of lines that required. lpBmpBuf->Drv.Bit.BseLin = (WORD)((DWORD)(YNrt + YDnt - 1) / YDnt); if (lpBmpBuf->Drv.Bit.BseLin > alcLin) { break; } lpBmpBuf->Drv.Rgb.Siz = SrcXSiz * 3; // RGB buffer if ((lpBmpBuf->Drv.Rgb.Pnt = (LPRGB)MemAllocZ(lpBmpBuf->Drv.Rgb.Siz)) == NULL) { break; } lpBmpBuf->Drv.Cmyk.Siz = SrcXSiz * 4; // CMYK buffer if ((lpBmpBuf->Drv.Cmyk.Pnt = (LPCMYK)MemAllocZ(lpBmpBuf->Drv.Cmyk.Siz)) == NULL) { break; } if (pOEM->iColor == XX_COLOR_SINGLE || pOEM->iColor == XX_COLOR_MANY) { // Color? setSiz = 4; // CMYK } else { // Mono? setSiz = 1; // K } // CMYK bit buffer for (setCnt = 0; setCnt < setSiz; setCnt++) { if ((lpBmpBuf->Drv.Bit.Pnt[setCnt] = MemAllocZ(alcSiz)) == NULL) { break; } } if (setCnt == setSiz) { lpBmpBuf->Drv.Bit.Siz = alcSiz; lpBmpBuf->Drv.Bit.Lin = alcLin; alcErr = No; // Allocate OK } break; } if (alcErr == Yes) { // Allocate error? BmpBufFree(lpBmpBuf); return FALSE; } return TRUE; } //=================================================================================================== // Free bitmap data buffer //=================================================================================================== void BmpBufFree( LPBMPBIF lpBmpBuf // Pointer to bitmap buffer structure ) { WORD chkCnt; if (lpBmpBuf->Drv.Rgb.Pnt) { // Free RGB buffer MemFree(lpBmpBuf->Drv.Rgb.Pnt); lpBmpBuf->Drv.Rgb.Pnt = NULL; } if (lpBmpBuf->Drv.Cmyk.Pnt) { // Free CMYK buffer MemFree(lpBmpBuf->Drv.Cmyk.Pnt); lpBmpBuf->Drv.Cmyk.Pnt = NULL; } // CMYK bit buffer for (chkCnt = 0; chkCnt < 4; chkCnt++) { // CMYK(2/4/16value)bitmap buffer if (lpBmpBuf->Drv.Bit.Pnt[chkCnt]) { MemFree(lpBmpBuf->Drv.Bit.Pnt[chkCnt]); lpBmpBuf->Drv.Bit.Pnt[chkCnt] = NULL; } } return; } //=================================================================================================== // Clear CMYK bitmap data buffer //=================================================================================================== void BmpBufClear( LPBMPBIF lpBmpBuf // Pointer to bitmap buffer structure ) { WORD chkCnt; for (chkCnt = 0; chkCnt < 4; chkCnt++) { // Clear CMYK(2/4/16value)bit buffer if (lpBmpBuf->Drv.Bit.Pnt[chkCnt]) { memset(lpBmpBuf->Drv.Bit.Pnt[chkCnt], 0x00, (WORD)lpBmpBuf->Drv.Bit.Siz); } } return; } //=================================================================================================== // Dithering //=================================================================================================== WORD Dithering001( // Number of lines PDEVOBJ pdevobj, // Pointer to PDEVOBJ structure WORD Diz, // Type of dither WORD XSize, // Numer of Xpixel WORD XPos, // Start X position for spooling WORD YPos, // Start Y position for spooling WORD YOff, // Y offset(Only for GOSA-KAKUSAN) WORD AllWhite, // All white data? LPBYTE lpCMYKBuf, // CMYK buffer LPBYTE lpCBuf, // Line buffer(C) LPBYTE lpMBuf, // Line buffer(M) LPBYTE lpYBuf, // Line buffer(Y) LPBYTE lpKBuf // Line buffer(K) ) { DWORD dizLin = 0; /* 441436: Assume failing dither => 0 lines */ /* NOTE: Nobody uses the return value of Dithering001 */ LPN4DIZINF lpN4DizInf; LPN403DIZINF lpN403DizInf; PMYPDEV pOEM = (PMYPDEV)pdevobj->pdevOEM; if (AllWhite == Yes) { return 1; // Number of line } if (pOEM->Printer != PRN_N403) { // N4 printer lpN4DizInf = pOEM->Col.N4.lpDizInf; if (Diz == XX_DITHERING_GOSA) { dizLin = N4Gos001(lpN4DizInf, (DWORD)XSize, (DWORD)XPos, (DWORD)YPos, lpCMYKBuf, lpCBuf, lpMBuf, lpYBuf, lpKBuf); } else { lpN4DizInf->Diz.Num = DizNumTbl[Diz]; dizLin = N4Diz001(lpN4DizInf, (DWORD)XSize, (DWORD)XPos, (DWORD)YPos, lpCMYKBuf, lpCBuf, lpMBuf, lpYBuf, lpKBuf); } } else { // N4-612 printer lpN403DizInf = pOEM->Col.N403.lpDizInf; lpN403DizInf->Diz.Num = DizNumTbl[Diz]; if (lpN403DizInf->PrnMod == N403_MOD_300B1 || lpN403DizInf->PrnMod == N403_MOD_600B1) { dizLin = N403Diz002(lpN403DizInf, (DWORD)XSize, (DWORD)XPos, (DWORD)YPos, (DWORD)0, (DWORD)0, (DWORD)1, (DWORD)1, (DWORD)1, (DWORD)1, (LPCMYK)lpCMYKBuf, lpCBuf, lpMBuf, lpYBuf, lpKBuf); /* } else if (lpN403DizInf->PrnMod == N403_MOD_300B2) { dizLin = N403Diz004(lpN403DizInf, (DWORD)XSize, (DWORD)XPos, (DWORD)YPos, (DWORD)0, (DWORD)0, (DWORD)1, (DWORD)1, (DWORD)1, (DWORD)1, (LPCMYK)lpCMYKBuf, lpCBuf, lpMBuf, lpYBuf, lpKBuf); */ } else if (lpN403DizInf->PrnMod == N403_MOD_600B2) { // Addition of a condition (XX_DITHERING_OFF) 2002.3.28 >>> // if (lpN403DizInf->ColMon == N403_MON || Diz == XX_DITHERING_ON) { if (lpN403DizInf->ColMon == N403_MON || Diz == XX_DITHERING_ON || Diz == XX_DITHERING_OFF) { // Addition of a condition (XX_DITHERING_OFF) 2002.3.28 <<< dizLin = N403Diz004(lpN403DizInf, (DWORD)XSize, (DWORD)XPos, (DWORD)YPos, (DWORD)0, (DWORD)0, (DWORD)1, (DWORD)1, (DWORD)1, (DWORD)1, (LPCMYK)lpCMYKBuf, lpCBuf, lpMBuf, lpYBuf, lpKBuf); } else if (lpN403DizInf->ColMon == N403_MON || Diz == XX_DITHERING_DET) { dizLin = N403DizSml(lpN403DizInf, (DWORD)XSize, (DWORD)XPos, (DWORD)YPos, (DWORD)0, (DWORD)0, (DWORD)1, (DWORD)1, (DWORD)1, (DWORD)1, (LPCMYK)lpCMYKBuf, lpCBuf, lpMBuf, lpYBuf, lpKBuf); } } else { dizLin = N403Diz016(lpN403DizInf, (DWORD)XSize, (DWORD)XPos, (DWORD)YPos, (DWORD)0, (DWORD)0, (DWORD)1, (DWORD)1, (DWORD)1, (DWORD)1, (LPCMYK)lpCMYKBuf, lpCBuf, lpMBuf, lpYBuf, lpKBuf); } } return (WORD)dizLin; } //=================================================================================================== // Spool bitmap data //=================================================================================================== void BmpPrint( PDEVOBJ pdevobj, // Pointer to pdevobj structure LPBMPBIF lpBmpBuf, // Pointer to bitmap buffer structure POINT Pos, // Start position for spooling WORD Width, // Width(dot) WORD Height, // Height(dot) WORD WidthByte // Width(byte) ) { DRWBMP drwBmp; // For Spooling bitmap data structure DRWBMPCMYK drwBmpCMYK; // For Spooling CMYK bitmap data structure WORD colCnt; PMYPDEV pOEM = (PMYPDEV)pdevobj->pdevOEM; static const CMYK colTbl[4] = { // CMYK table { 0, 0, 0, 255}, // Black { 0, 0, 255, 0}, // Yellow { 0, 255, 0, 0}, // Magenta {255, 0, 0, 0} // Cyan }; static const WORD plnTbl[4] = { // Plane table PLN_BLACK, PLN_YELLOW, PLN_MGENTA, PLN_CYAN }; static const WORD frmTbl[4] = {0, 3, 2, 1}; // Frame table(For N4-612) // Not N4-612 printer? if (pOEM->Printer != PRN_N403) { drwBmp.Style = lpBmpBuf->Style; drwBmp.DrawPos = Pos; drwBmp.Diz = lpBmpBuf->Diz; drwBmp.Width = Width; drwBmp.Height = Height; drwBmp.WidthByte = WidthByte; // Color? if (pOEM->iColor == XX_COLOR_SINGLE || pOEM->iColor == XX_COLOR_MANY) { for (colCnt = 0; colCnt < 4; colCnt++) { // Setting value for spooling bitmap data drwBmp.Plane = plnTbl[colCnt]; // For each plane drwBmp.Color = colTbl[colCnt]; drwBmp.lpBit = lpBmpBuf->Drv.Bit.Pnt[colCnt]/* + WidthByte*/; PrnBitmap(pdevobj, &drwBmp); // Spool bitmap data } } else { // Mono // Setting value for spooling bitmap data drwBmp.Color = colTbl[0]; drwBmp.lpBit = lpBmpBuf->Drv.Bit.Pnt[0]/* + WidthByte*/; PrnBitmap(pdevobj, &drwBmp); // Spool bitmap data } } else { // N4-612 printer? drwBmpCMYK.Style = lpBmpBuf->Style; drwBmpCMYK.DataBit = lpBmpBuf->DatBit; drwBmpCMYK.DrawPos = Pos; drwBmpCMYK.Width = Width; drwBmpCMYK.Height = Height; drwBmpCMYK.WidthByte = WidthByte; // Color? if (pOEM->iColor == XX_COLOR_SINGLE || pOEM->iColor == XX_COLOR_MANY) { for (colCnt = 0; colCnt < 4; colCnt++) { // Setting value for spooling bitmap data // For each plane drwBmpCMYK.Plane = PLN_ALL; // All Plane is OK drwBmpCMYK.Frame = frmTbl[colCnt]; drwBmpCMYK.lpBit = lpBmpBuf->Drv.Bit.Pnt[colCnt]/* + WidthByte*/; PrnBitmapCMYK(pdevobj, &drwBmpCMYK); // Spool bitmap data } } else { // Mono // Setting value for spooling bitmap data drwBmpCMYK.Plane = plnTbl[0]; drwBmpCMYK.Frame = frmTbl[0]; drwBmpCMYK.lpBit = lpBmpBuf->Drv.Bit.Pnt[0]/* + WidthByte*/; PrnBitmapCMYK(pdevobj, &drwBmpCMYK); // Spool bitmap data } } return; } //=================================================================================================== // Allocate dither table(N4 printer) //=================================================================================================== BOOL DizTblSetN4( PDEVOBJ pdevobj, // Pointer to pdevobj structure WORD Diz // Type of dither ) { DWORD dizNum; LPN4DIZINF lpN4DizInf; PMYPDEV pOEM = (PMYPDEV)pdevobj->pdevOEM; lpN4DizInf = pOEM->Col.N4.lpDizInf; dizNum = DizNumTbl[Diz]; lpN4DizInf->Diz.Num = dizNum; if ((lpN4DizInf->Diz.Tbl[dizNum][0] = MemAllocZ(N4_DIZSIZ_CM)) == NULL) { return 0; } if ((lpN4DizInf->Diz.Tbl[dizNum][1] = MemAllocZ(N4_DIZSIZ_CM)) == NULL) { return 0; } if ((lpN4DizInf->Diz.Tbl[dizNum][2] = MemAllocZ(N4_DIZSIZ_YK)) == NULL) { return 0; } if ((lpN4DizInf->Diz.Tbl[dizNum][3] = MemAllocZ(N4_DIZSIZ_YK)) == NULL) { return 0; } N4DizPtnMak(lpN4DizInf, dizNum, dizNum); // Make dither pattern return TRUE; } //=================================================================================================== // Allocate dither table(N4-612 printer) //=================================================================================================== BOOL DizTblSetN403( PDEVOBJ pdevobj, // Pointer to pdevobj structure WORD Diz // Type of dither ) { DWORD dizNum; DWORD alcSiz; WORD alcCnt; WORD alcTbl; LPN403DIZINF lpN403DizInf; PMYPDEV pOEM = (PMYPDEV)pdevobj->pdevOEM; lpN403DizInf = pOEM->Col.N403.lpDizInf; dizNum = DizNumTbl[Diz]; lpN403DizInf->Diz.Num = dizNum; if (lpN403DizInf->PrnMod == N403_MOD_300B1 || lpN403DizInf->PrnMod == N403_MOD_600B1) { alcSiz = N403_DIZSIZ_B1; } else if (/*lpN403DizInf->PrnMod == N403_MOD_300B2 ||*/ lpN403DizInf->PrnMod == N403_MOD_600B2) { alcSiz = N403_DIZSIZ_B2; } else { alcSiz = N403_DIZSIZ_B4; } if (lpN403DizInf->ColMon == N403_COL && lpN403DizInf->PrnMod == N403_MOD_600B2 && Diz == XX_DITHERING_DET) { alcTbl = 1; } else { alcTbl = 4; } for (alcCnt = 0; alcCnt < alcTbl; alcCnt++) { if ((lpN403DizInf->Diz.Tbl[dizNum][alcCnt] = MemAllocZ(alcSiz)) == NULL) { ERR(("DizTbl ALLOC ERROR!!\n")); return 0; } } if (lpN403DizInf->ColMon == N403_COL && lpN403DizInf->PrnMod == N403_MOD_600B2) { alcSiz = N403_ENTDIZSIZ_B2; for (alcCnt = 0; alcCnt < 4; alcCnt++) { if ((lpN403DizInf->EntDiz.Tbl[alcCnt] = MemAllocZ(alcSiz)) == NULL) { ERR(("EntDizTbl ALLOC ERROR!!\n")); return 0; } } } N403DizPtnMak(lpN403DizInf, dizNum, dizNum); // Make dither pattern return TRUE; } //=================================================================================================== // Load LUT file(For N4 printer) //=================================================================================================== BOOL LutFileLoadN4( PDEVOBJ pdevobj, // Pointer to pdevobj structure WORD Mch, // Type of color match WORD Diz, // Type of dither WORD Speed // speed? ) { HANDLE fp_Lut; OFSTRUCT opeBuf; WORD setCnt; LPBYTE lpDst; LPN4DIZINF lpN4DizInf; DWORD nSize; WCHAR LutName[MAX_PATH], *pTemp; int i; BOOL bRet; DWORD dwRet; PMYPDEV pOEM = (PMYPDEV)pdevobj->pdevOEM; nSize = GetModuleFileName(pdevobj->hOEM, LutName, MAX_PATH); nSize -= (sizeof (CSN46RESDLL) / sizeof (WCHAR) - 1); // Choice of LUT file pTemp = N4LUT000; // Default value. if (Mch == XX_COLORMATCH_NORMAL) { if (Diz != XX_DITHERING_GOSA) { pTemp = N4LUT000; } else { pTemp = N4LUT003; } } else if (Mch == XX_COLORMATCH_VIVCOL) { if (Diz != XX_DITHERING_GOSA) { pTemp = N4LUT001; } else { pTemp = N4LUT004; } } else if (Mch == XX_COLORMATCH_NATCOL) { if (Diz != XX_DITHERING_GOSA) { pTemp = N4LUT002; } else { pTemp = N4LUT005; } } // Replacement of strsafe-api 2002.3.6 >>> // lstrcpy(&LutName[nSize], pTemp); if (S_OK != StringCchCopy(&LutName[nSize], MAX_PATH - nSize, pTemp)) return 0; // Replacement of strsafe-api 2002.3.6 <<< CM_VERBOSE(("n403 Newbuf--> %ws\n", LutName)); // Open LUT file if (INVALID_HANDLE_VALUE == (fp_Lut = CreateFile(LutName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL))) { ERR(("Error opening LUT file %ws (%d)\n", LutName, GetLastError())); return 0; } lpN4DizInf = pOEM->Col.N4.lpDizInf; if ((lpN4DizInf->Lut.Tbl = MemAllocZ((DWORD)N4_LUTTBLSIZ)) == NULL) { CloseHandle(fp_Lut); /* 441434 */ return 0; } lpDst = (LPBYTE)(lpN4DizInf->Lut.Tbl); // Load LUT data for(setCnt = 0 ; setCnt < (N4_GLDNUM / 8) ; setCnt++) { if (FALSE == ReadFile(fp_Lut, &lpDst[(DWORD)setCnt * 8L * N4_GLDNUM * N4_GLDNUM * 4L], (8L * N4_GLDNUM * N4_GLDNUM * 4L), &dwRet, NULL) || 0 == dwRet) { ERR(("Error reading LUT file %ws (%d)\n", LutName, GetLastError())); // Abort CloseHandle(fp_Lut); return FALSE; } } // Close LUT file if (FALSE == CloseHandle(fp_Lut)) { ERR(("Error closing LUT file %ws (%d)\n", LutName, GetLastError())); } if (Speed == No) { if ((lpN4DizInf->Lut.CchRgb = MemAllocZ(N4_CCHRGBSIZ)) == NULL) { return 0; } if ((lpN4DizInf->Lut.CchCmy = MemAllocZ(N4_CCHCMYSIZ)) == NULL) { return 0; } memset(lpN4DizInf->Lut.CchRgb, 0xff, N4_CCHRGBSIZ); memset(lpN4DizInf->Lut.CchCmy, 0x00, N4_CCHCMYSIZ); } return TRUE; } //=================================================================================================== // Load LUT file(For N4-612 printer) //=================================================================================================== BOOL LutFileLoadN403( PDEVOBJ pdevobj, // Pointer to pdevobj structure WORD Mch, // Type of color matching WORD Speed ) { HANDLE fp_Lut; OFSTRUCT opeBuf; WORD setCnt; LPBYTE lpDst; LPN403DIZINF lpN403DizInf; DWORD nSize; WCHAR LutName[MAX_PATH], *pTemp; int i; BOOL bRet; DWORD dwRet; PMYPDEV pOEM = (PMYPDEV)pdevobj->pdevOEM; nSize = GetModuleFileName(pdevobj->hOEM, LutName, MAX_PATH); nSize -= (sizeof (CSN46RESDLL) / sizeof (WCHAR) - 1); // Choice of LUT file if (Mch == XX_COLORMATCH_IRO) { pTemp = N403LUTY; } else { pTemp = N403LUTX; } // Replacement of strsafe-api 2002.3.6 >>> // lstrcpy(&LutName[nSize], pTemp); if (S_OK != StringCchCopy(&LutName[nSize], MAX_PATH - nSize, pTemp)) return 0; // Replacement of strsafe-api 2002.3.6 <<< CM_VERBOSE(("n403 Newbuf--> %ws\n", LutName)); // Open LUT file if (INVALID_HANDLE_VALUE == (fp_Lut = CreateFile( LutName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL))) { ERR(("Error opening LUT file %ws (%d)\n", LutName, GetLastError())); return 0; } lpN403DizInf = pOEM->Col.N403.lpDizInf; if ((lpN403DizInf->Lut.Tbl = MemAllocZ((DWORD)N403_LUTTBLSIZ))== NULL) { CloseHandle(fp_Lut); /* 441433 */ return 0; } lpDst = (LPBYTE)(lpN403DizInf->Lut.Tbl); // Load LUT data for(setCnt = 0 ; setCnt < (N403_GLDNUM / 8) ; setCnt++) { if (FALSE == ReadFile(fp_Lut, &lpDst[(DWORD)setCnt * 8L * N403_GLDNUM * N403_GLDNUM * 4L], (8L * N403_GLDNUM * N403_GLDNUM * 4L), &dwRet, NULL) || 0 == dwRet) { ERR(("Error reading LUT file %ws (%d)\n", LutName, GetLastError())); // Abort CloseHandle(fp_Lut); return FALSE; } } // Close LUT file if (FALSE == CloseHandle(fp_Lut)) { ERR(("Error closing LUT file %ws (%d)\n", LutName, GetLastError())); } if (Speed == No) { if ((lpN403DizInf->Lut.CchRgb = MemAllocZ(N403_CCHRGBSIZ)) == NULL) { return 0; } if ((lpN403DizInf->Lut.CchCmy = MemAllocZ(N403_CCHCMYSIZ)) == NULL) { return 0; } memset(lpN403DizInf->Lut.CchRgb, 0xff, N403_CCHRGBSIZ); memset(lpN403DizInf->Lut.CchCmy, 0x00, N403_CCHCMYSIZ); } return TRUE; } //=================================================================================================== // Allocate toner density table(For N4 printer) //=================================================================================================== BOOL TnrTblSetN4( PDEVOBJ pdevobj, // Pointer to pdevobj structure SHORT Tnr // Toner density(-30~30) ) { LPN4DIZINF lpN4DizInf; PMYPDEV pOEM = (PMYPDEV)pdevobj->pdevOEM; lpN4DizInf = pOEM->Col.N4.lpDizInf; if ((lpN4DizInf->Tnr.Tbl = MemAllocZ(N4_TNRTBLSIZ)) == NULL) { return 0; } N4TnrTblMak(lpN4DizInf, (LONG)Tnr); return TRUE; } //=================================================================================================== // Allocate toner density table(For N4-612 printer) //=================================================================================================== BOOL TnrTblSetN403( PDEVOBJ pdevobj, // Pointer to pdevobj structure SHORT Tnr // Toner density(-30~30) ) { LPN403DIZINF lpN403DizInf; PMYPDEV pOEM = (PMYPDEV)pdevobj->pdevOEM; lpN403DizInf = pOEM->Col.N403.lpDizInf; if ((lpN403DizInf->Tnr.Tbl = MemAllocZ(N403_TNRTBLSIZ)) == NULL) { return 0; } N403TnrTblMak(lpN403DizInf, (LONG)Tnr); return TRUE; } //=================================================================================================== // Convert 1 line RGB bitmap data into 24bit (for 1pixel) RGB bitmap data //=================================================================================================== void BmpRGBCnv( LPRGB lpRGB, // Pointer to destination bitmap data LPBYTE lpSrc, // Pointer to source bitmap data WORD SrcBit, // Pixel of source bitmap data WORD SrcX, // X coordinates of source bitmap data WORD SrcXSiz, // X size of source bitmap data LPRGBQUAD lpPlt // Color palette table of source bitmap data(1/4/8pixel) ) { WORD setCnt; BYTE colNum; LPWORD lpWSrc; switch (SrcBit) { case 1: // 1 bit for (setCnt = 0; setCnt < SrcXSiz; setCnt++, SrcX++) { // Foreground color? if (!(lpSrc[SrcX / 8] & BitTbl[SrcX & 0x0007])) { lpRGB[setCnt].Blue = lpPlt[0].rgbBlue; lpRGB[setCnt].Green = lpPlt[0].rgbGreen; lpRGB[setCnt].Red = lpPlt[0].rgbRed; } else { lpRGB[setCnt].Blue = lpPlt[1].rgbBlue; lpRGB[setCnt].Green = lpPlt[1].rgbGreen; lpRGB[setCnt].Red = lpPlt[1].rgbRed; } } break; case 4: // 4bit for (setCnt = 0; setCnt < SrcXSiz; setCnt++, SrcX++) { if (!(SrcX & 0x0001)) { // A even number coordinates? colNum = lpSrc[SrcX / 2] / 16; } else { colNum = lpSrc[SrcX / 2] % 16; } lpRGB[setCnt].Blue = lpPlt[colNum].rgbBlue; lpRGB[setCnt].Green = lpPlt[colNum].rgbGreen; lpRGB[setCnt].Red = lpPlt[colNum].rgbRed; } break; case 8: // 8bit for (setCnt = 0; setCnt < SrcXSiz; setCnt++, SrcX++) { colNum = lpSrc[SrcX]; lpRGB[setCnt].Blue = lpPlt[colNum].rgbBlue; lpRGB[setCnt].Green = lpPlt[colNum].rgbGreen; lpRGB[setCnt].Red = lpPlt[colNum].rgbRed; } break; case 16: // 16bit lpWSrc = (LPWORD)lpSrc + SrcX; for (setCnt = 0; setCnt < SrcXSiz; setCnt++, lpWSrc++) { lpRGB[setCnt].Blue = (BYTE)((*lpWSrc & 0x001f) << 3); lpRGB[setCnt].Green = (BYTE)((*lpWSrc & 0x03e0) >> 2); lpRGB[setCnt].Red = (BYTE)((*lpWSrc / 0x0400) << 3); } break; case 24: // 24 bit lpSrc += SrcX * 3; for (setCnt = 0; setCnt < SrcXSiz; setCnt++, lpSrc += 3) { lpRGB[setCnt].Red = lpSrc[0]; lpRGB[setCnt].Green = lpSrc[1]; lpRGB[setCnt].Blue = lpSrc[2]; // lpRGB[setCnt].Blue = lpSrc[0]; // lpRGB[setCnt].Green = lpSrc[1]; // lpRGB[setCnt].Red = lpSrc[2]; } // memcpy(lpRGB, lpSrc, SrcXSiz * 3); break; case 32: // 32bit lpSrc += SrcX * 4; for (setCnt = 0; setCnt < SrcXSiz; setCnt++, lpSrc += 4) { lpRGB[setCnt].Blue = lpSrc[0]; lpRGB[setCnt].Green = lpSrc[1]; lpRGB[setCnt].Red = lpSrc[2]; } break; } return; } // End of File