2020-09-30 17:12:29 +02:00

226 lines
7.7 KiB
C

/*****************************************************************/
/** Microsoft LAN Manager **/
/** Copyright(c) Microsoft Corp., 1985-1990 **/
/*****************************************************************/
/****************************** Module Header ******************************\
Module Name: QPSTD.C
This module contains the code for printing a PM_Q_STD format spooler file
(i.e. a GPI Metafile).
History:
07-Sep-88 [stevewo] Created.
\***************************************************************************/
#define INCL_GPICONTROL
#define INCL_GPITRANSFORMS
#define INCL_GPIMETAFILES
#define INCL_GPIREGIONS
#define INCL_DEV
#include "pmprint.h"
BOOL PASCAL SplQpStdPrintFile( pQProc, pszFileName )
register PQPROCINST pQProc;
PSZ pszFileName;
{
BOOL result = FALSE;
HDC hdcDisplay;
PSZ devOpenData[ DRIVER_NAME+1 ];
LONG pmfOptions[ PMF_COLORREALIZABLE+1 ];
SIZEL ptSize;
HRGN Region;
SplOutSem();
pQProc->hmf = NULL;
hdcDisplay = NULL;
if (OpenQPInputFile( pQProc, pszFileName, FALSE ) &&
(pQProc->hmf = (HMF)GpiLoadMetaFile( HABX, pszFileName ))) {
devOpenData[ ADDRESS ] = pQProc->pszPortName;
devOpenData[ DRIVER_NAME ] = pQProc->pszDriverName;
devOpenData[ DRIVER_DATA ] = (PSZ)pQProc->pDriverData;
pQProc->hInfodc = DevOpenDC( HABX, OD_INFO, "*", (LONG)DRIVER_DATA+1,
devOpenData, pQProc->hInfodc );
ptSize.cx = 0;
ptSize.cy = 0;
if (pQProc->hps = GpiCreatePS( HABX, pQProc->hInfodc,
(PSIZEL)&ptSize,
PU_PELS | GPIA_ASSOC )) {
pmfOptions[ PMF_SEGBASE ] = 0L;
pmfOptions[ PMF_LOADTYPE ] = LT_ORIGINALVIEW;
pmfOptions[ PMF_RESOLVE ] = RS_DEFAULT;
pmfOptions[ PMF_LCIDS ] = LC_LOADDISC;
pmfOptions[ PMF_RESET ] = RES_RESET;
pmfOptions[ PMF_SUPPRESS ] = SUP_SUPPRESS;
pmfOptions[ PMF_COLORTABLES ] = 0;
pmfOptions[ PMF_COLORREALIZABLE ] = 0;
GpiPlayMetaFile( pQProc->hps, pQProc->hmf,
(LONG)PMF_SUPPRESS+1, pmfOptions,
NULL, 0L, NULL );
GpiAssociate( pQProc->hps, NULL );
DevCloseDC( pQProc->hInfodc ); /* If any of this fails you
are in deep do do. */
OpenQPOutputDC(pQProc, ASSOCIATE);
result = !pQProc->qparms.fTransform || SetViewMatrix( pQProc );
}
pmfOptions[ PMF_SEGBASE ] = 0L;
pmfOptions[ PMF_LOADTYPE ] = LT_ORIGINALVIEW;
pmfOptions[ PMF_RESOLVE ] = RS_DEFAULT;
pmfOptions[ PMF_LCIDS ] = LC_LOADDISC;
pmfOptions[ PMF_RESET ] = RES_NORESET;
pmfOptions[ PMF_SUPPRESS ] = SUP_NOSUPPRESS;
pmfOptions[ PMF_COLORTABLES ] = CTAB_REPLACE;
pmfOptions[ PMF_COLORREALIZABLE ] = CREA_REALIZE;
pmfOptions[ PMF_DEFAULTS ] = DDEF_LOADDISC;
if (GpiPlayMetaFile( pQProc->hps, pQProc->hmf,
(LONG)PMF_DEFAULTS+1, pmfOptions,
NULL, 0L, NULL ) != GPI_OK)
if (pQProc->fsStatus & QP_ABORTED)
result = FALSE;
/* clear STOP_DRAW condition if job got aborted via other thread */
GpiSetStopDraw( pQProc->hps, SDW_OFF );
DevEscape(pQProc->hdc, DEVESC_ENDDOC, 0L, (PBYTE)NULL,
(PLONG)NULL, (PBYTE)NULL);
if (pQProc->region) {
GpiSetClipRegion(pQProc->hps, pQProc->region, &Region);
GpiDestroyRegion(pQProc->hps,Region);
}
GpiAssociate( pQProc->hps, (HDC)0 );
}
if (pQProc->hmf) {
GpiDeleteMetaFile( pQProc->hmf );
pQProc->hmf = NULL;
}
if (pQProc->hps) {
GpiDestroyPS( pQProc->hps );
pQProc->hps = NULL;
}
CloseQPOutputDC( pQProc, FALSE);
CloseQPInputFile( pQProc );
if (!result)
SplPanic( "SplQpStdPrintFile failed for %0s", pszFileName, 0 );
return( result );
}
/* SetViewMatrix
*
* in: pQProc - -> qproc instance struct
* out: ok?
*/
BOOL SetViewMatrix( pQProc )
register PQPROCINST pQProc;
{
SIZEL ptSize;
RECTL ClipRectl, PageView;
POINTL Centre,l_t_in_pels,shift_value;
BOOL Clip=FALSE;
if (!DevQueryCaps( pQProc->hdc, CAPS_WIDTH, 2L, (PLONG)&ptSize))
return FALSE;
if (pQProc->qparms.fLandscape && ptSize.cy >= ptSize.cx)
pQProc->qparms.fLandscape = FALSE;
if (GpiQueryPageViewport( pQProc->hps, (PRECTL)&PageView ) == GPI_ERROR)
return FALSE;
if (!pQProc->qparms.fArea) {
ClipRectl.xLeft=0l;
ClipRectl.yBottom=0l;
ClipRectl.xRight=ptSize.cx;
ClipRectl.yTop=ptSize.cy;
Clip=FALSE;
} else {
if (!pQProc->qparms.ptAreaOrigin.x.chLeft)
ClipRectl.xLeft=0l;
else if (pQProc->qparms.ptAreaOrigin.x.chLeft == 100)
ClipRectl.xLeft=ptSize.cx;
else
ClipRectl.xLeft=pQProc->qparms.ptAreaOrigin.x.chLeft*ptSize.cx/100l;
if (!pQProc->qparms.ptAreaOrigin.y.chTop)
ClipRectl.yTop=ptSize.cy;
else if (pQProc->qparms.ptAreaOrigin.y.chTop == 100)
ClipRectl.yTop=0L;
else
ClipRectl.yTop=(100-pQProc->qparms.ptAreaOrigin.y.chTop)*ptSize.cy/100l;
pQProc->qparms.ptAreaSize.x.chWidth = min(pQProc->qparms.ptAreaSize.x.chWidth,
(UCHAR)100-pQProc->qparms.ptAreaOrigin.x.chLeft);
pQProc->qparms.ptAreaSize.y.chDepth = min(pQProc->qparms.ptAreaSize.y.chDepth,
(UCHAR)100-pQProc->qparms.ptAreaOrigin.y.chTop);
ClipRectl.xRight = ClipRectl.xLeft + (pQProc->qparms.ptAreaSize.x.chWidth*
ptSize.cx/100l);
ClipRectl.yBottom = ClipRectl.yTop - (pQProc->qparms.ptAreaSize.y.chDepth*
ptSize.cy/100l);
Clip=TRUE;
}
if (!pQProc->qparms.fFit) {
PageView.xLeft=ClipRectl.xLeft;
PageView.yBottom=ClipRectl.yBottom;
if (((ClipRectl.yTop - ClipRectl.yBottom) * PageView.xRight) <=
((ClipRectl.xRight - ClipRectl.xLeft) * PageView.yTop)) {
PageView.xRight = PageView.xLeft +
((PageView.xRight *
(ClipRectl.yTop - ClipRectl.yBottom)) /
PageView.yTop);
PageView.yTop = ClipRectl.yTop;
} else {
PageView.yTop = PageView.yBottom +
((PageView.yTop *
(ClipRectl.xRight - ClipRectl.xLeft)) /
PageView.xRight);
PageView.xRight = ClipRectl.xRight;
}
} else {
Centre.x = (ClipRectl.xRight+ClipRectl.xLeft)/2;
Centre.y = (ClipRectl.yTop+ClipRectl.yBottom)/2;
l_t_in_pels.x = PageView.xRight*pQProc->qparms.ptFit.x.chLeft/100;
l_t_in_pels.y = PageView.yTop * (100 - pQProc->qparms.ptFit.y.chTop)/100;
shift_value.x = Centre.x - l_t_in_pels.x;
shift_value.y = Centre.y - l_t_in_pels.y;
PageView.xLeft += shift_value.x;
PageView.yTop += shift_value.y;
PageView.xRight += shift_value.x;
PageView.yBottom += shift_value.y;
}
ClipRectl.xRight++;
ClipRectl.yTop++;
GpiSetPageViewport( pQProc->hps, &PageView );
pQProc->region=FALSE;
if (Clip) {
if( pQProc->region = GpiCreateRegion( pQProc->hps, 1L, &ClipRectl ) )
GpiSetClipRegion( pQProc->hps , pQProc->region , &pQProc->region );
}
return TRUE;
}