///////////////////////////////////////////////////////////////////////////// // FILE : faxdrv16.c // // // // DESCRIPTION : Implementation for the unidriver dump callback. // // // // AUTHOR : DanL. // // // // HISTORY : // // Oct 19 1999 DannyL Creation. // // // // Copyright (C) 1999 Microsoft Corporation All Rights Reserved // ///////////////////////////////////////////////////////////////////////////// #include "stdhdr.h" BYTE szBuf[4] = {0xFF, 0xFF, 0xFF, 0xFF}; /* - fnDump - * Purpose: Gets filled in band block from GDI and sends to BlockOut * one scan line at a time. * * Arguments: * [in] lpdv - Address of a PDEVICE structure for device data. * [in] lpptCursor - Address of a pair of POINT structures that specify the * coordinates of the current and final position of the * print head. * [in] fMode - Landscape flag. If this parameter is CD_LANDSCAPE, the * printer is in landscape mode; otherwise, it is in portrait mode. * * Returns: * Return value conflicts with documentation. Doenst seem to have * any specific meaning. * * Remarks: * For complete documentation refer to fnOEMDump in the Minidriver * Developer's Guide. */ short FAR PASCAL fnDump(LPDV lpdv, LPPOINT lpptCursor, WORD fMode) { short sRet = 1; WORD iScan, i, WidthBytes, BandHeight; WORD wScanlinesPerSeg, wWAlignBytes, wSegmentInc; LPBITMAP lpbmHdr; BOOL fHuge; LPBYTE lpSrc; LPBYTE lpScanLine; LPEXTPDEV lpXPDV; WORD count = 0; BOOL fAbort = FALSE; DBG_PROC_ENTRY("fnDump"); // // get pointer to our private data stored in UNIDRV's PDEVICE // lpXPDV = ((LPEXTPDEV)lpdv->lpMd); // // get ptr to PBITMAP // lpbmHdr = (LPBITMAP)((LPSTR)lpdv + lpdv->oBruteHdr); // // initialize some things // fHuge = lpbmHdr->bmSegmentIndex > 0; lpSrc = lpbmHdr->bmBits; wWAlignBytes = (lpbmHdr->bmWidth+7)>>3; WidthBytes = lpbmHdr->bmWidthBytes; BandHeight = lpbmHdr->bmHeight; DBG_TRACE2("Page dump:%d pxls X %d pxls",lpbmHdr->bmWidth,BandHeight); wScanlinesPerSeg = lpbmHdr->bmScanSegment; wSegmentInc = lpbmHdr->bmSegmentIndex; // // We take landscape orientation into cosideration on OutputPageBitmap. // for (iScan = 0; ((iScan < BandHeight) && (fAbort = QueryAbort(lpXPDV->hAppDC,0)) && lpXPDV->hScanBuf);iScan += wScanlinesPerSeg) { DBG_TRACE("Inside main loop"); // // get next 64K segment of scans // if (iScan) { WORD wRemainingScans = BandHeight - iScan; // // cross the segment boundary // lpSrc = (LPBYTE)MAKELONG(0,HIWORD(lpSrc)+wSegmentInc); if (wScanlinesPerSeg > wRemainingScans) wScanlinesPerSeg = wRemainingScans; } // // loop through scan lines in 64K segment // for (i=iScan, lpScanLine=lpSrc; ((i < iScan + wScanlinesPerSeg) && QueryAbort(lpXPDV->hAppDC, 0) && lpXPDV->hScanBuf); i++) { BlockOut(lpdv, lpScanLine, wWAlignBytes); lpScanLine += WidthBytes; count++; } } // end for iScan DBG_TRACE("Out of main loop"); DBG_TRACE2("iScan: %d BandHeight: %d", iScan, BandHeight); DBG_TRACE1("lpXPDV->hScanBuf: 0x%lx", lpXPDV->hScanBuf); DBG_TRACE1("fAbort: %d", fAbort); DBG_TRACE1("count is: %d",count); RETURN sRet; } /* - BlockOut - * Purpose: * Copy a scan line to the global scan buffer. * * Arguments: * [in] lpdv - Address of a PDEVICE structure. * [in] lpBuf - Address of buffer containing scanline. * [in] len - width of scanline. * * Returns: * [N/A] * * Remarks: * [N/A] */ short FAR PASCAL BlockOut(LPDV lpdv, LPSTR lpBuf, WORD len) { WORD wBytes; LPEXTPDEV lpXPDV; SDBG_PROC_ENTRY("BlockOut"); // // get pointer to our private data stored in UNIDRV's PDEVICE // lpXPDV = ((LPEXTPDEV)lpdv->lpMd); // // convert from BYTE aligned to DWORD aligned buffer // get DWORD amount of bytes // wBytes = (WORD)DW_WIDTHBYTES((DWORD)len*8); // // check to see if need to realloc scan buffer // if ((lpXPDV->dwTotalScanBytes + wBytes) > lpXPDV->dwScanBufSize) { HANDLE hTemp; lpXPDV->dwScanBufSize += BUF_CHUNK; hTemp = GlobalReAlloc(lpXPDV->hScanBuf, lpXPDV->dwScanBufSize, 0); // // if realloc fails, call ABORTDOC to clean up scan buf // if (!hTemp) { DBG_CALL_FAIL("GlobalReAlloc ... Aborting",0); DBG_TRACE3("lpXPDV->hScanBuf: 0x%lx, lpXPDV->dwScanBufSize: %d, (ec: %d)", lpXPDV->hScanBuf, lpXPDV->dwScanBufSize, GetLastError()); Control(lpdv, ABORTDOC, NULL, NULL); RETURN 0; } else { lpXPDV->hScanBuf = hTemp; lpXPDV->lpScanBuf = (char _huge *)GlobalLock(lpXPDV->hScanBuf); lpXPDV->lpScanBuf += lpXPDV->dwTotalScanBytes; } } ASSERT((lpXPDV->dwTotalScanBytes + wBytes) < lpXPDV->dwScanBufSize); // // copy scan line to scan buffer // _fmemcpy(lpXPDV->lpScanBuf, lpBuf, len); lpXPDV->lpScanBuf += len; _fmemcpy(lpXPDV->lpScanBuf, (LPSTR)szBuf, wBytes-len); lpXPDV->lpScanBuf += wBytes-len; // // update total scan bytes // lpXPDV->dwTotalScanBytes += wBytes; lpXPDV->dwTotalScans++; RETURN wBytes; }