226 lines
7.7 KiB
C
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;
|
|
}
|