|  | /* | 
|  | *	PostScript driver Escape function | 
|  | * | 
|  | *	Copyright 1998  Huw D M Davies | 
|  | */ | 
|  | #include "wine/winuser16.h" | 
|  | #include "psdrv.h" | 
|  | #include "debugtools.h" | 
|  | #include "winspool.h" | 
|  |  | 
|  | DEFAULT_DEBUG_CHANNEL(psdrv) | 
|  |  | 
|  |  | 
|  | INT PSDRV_Escape( DC *dc, INT nEscape, INT cbInput, | 
|  | SEGPTR lpInData, SEGPTR lpOutData ) | 
|  | { | 
|  | PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev; | 
|  |  | 
|  | switch(nEscape) { | 
|  |  | 
|  | case NEXTBAND: { | 
|  | RECT16 *r = (RECT16 *)PTR_SEG_TO_LIN(lpOutData); | 
|  | if(!physDev->job.banding) { | 
|  | physDev->job.banding = TRUE; | 
|  | SetRect16( r, 0, 0, dc->w.devCaps->horzRes, | 
|  | dc->w.devCaps->vertRes ); | 
|  | TRACE("NEXTBAND returning %d,%d - %d,%d\n", r->left, | 
|  | r->top, r->right, r->bottom ); | 
|  | return 1; | 
|  | } | 
|  | SetRect16( r, 0, 0, 0, 0 ); | 
|  | TRACE("NEXTBAND rect to 0,0 - 0,0\n" ); | 
|  | physDev->job.banding = FALSE; | 
|  | }	/* Fall through */ | 
|  |  | 
|  | case NEWFRAME: | 
|  | TRACE("NEWFRAME\n"); | 
|  |  | 
|  | if(!physDev->job.hJob) { | 
|  | FIXME("hJob == 0. Now what?\n"); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | if(!PSDRV_WriteEndPage( dc )) | 
|  | return 0; | 
|  |  | 
|  | physDev->job.NeedPageHeader = TRUE; | 
|  | return 1; | 
|  |  | 
|  | case QUERYESCSUPPORT: | 
|  | if(cbInput != 2) { | 
|  | WARN("cbInput != 2 (=%d) for QUERYESCSUPPORT\n", cbInput); | 
|  | return 0; | 
|  | } else { | 
|  | UINT16 num = *(UINT16 *)PTR_SEG_TO_LIN(lpInData); | 
|  | TRACE("QUERYESCSUPPORT for %d\n", num); | 
|  |  | 
|  | switch(num) { | 
|  | case NEWFRAME: | 
|  | case NEXTBAND: | 
|  | case QUERYESCSUPPORT: | 
|  | case SETABORTPROC: | 
|  | case STARTDOC: | 
|  | case ENDDOC: | 
|  | case GETPHYSPAGESIZE: | 
|  | case GETPRINTINGOFFSET: | 
|  | case GETSCALINGFACTOR: | 
|  | case SETCOPYCOUNT: | 
|  | case GETTECHNOLOGY: | 
|  | case SETLINECAP: | 
|  | case SETLINEJOIN: | 
|  | case SETMITERLIMIT: | 
|  | case SETCHARSET: | 
|  | case EXT_DEVICE_CAPS: | 
|  | case SET_BOUNDS: | 
|  | return TRUE; | 
|  |  | 
|  | default: | 
|  | return FALSE; | 
|  | } | 
|  | } | 
|  |  | 
|  | case SETABORTPROC: | 
|  | FIXME("SETABORTPROC: Ignoring\n"); | 
|  |  | 
|  | /*	dc->w.lpfnPrint = (FARPROC16)lpInData; | 
|  | */ | 
|  | return 1; | 
|  |  | 
|  | case STARTDOC: | 
|  | TRACE("STARTDOC\n"); | 
|  | if(physDev->job.hJob) { | 
|  | FIXME("hJob != 0. Now what?\n"); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | physDev->job.hJob = OpenJob16(physDev->job.output, | 
|  | PTR_SEG_TO_LIN(lpInData), dc->hSelf); | 
|  | if(!physDev->job.hJob) { | 
|  | WARN("OpenJob failed\n"); | 
|  | return 0; | 
|  | } | 
|  | physDev->job.banding = FALSE; | 
|  | physDev->job.NeedPageHeader = FALSE; | 
|  | physDev->job.PageNo = 1; | 
|  | if(!PSDRV_WriteHeader( dc, PTR_SEG_TO_LIN(lpInData), cbInput )) | 
|  | return 0; | 
|  |  | 
|  | if(!PSDRV_WriteNewPage( dc )) | 
|  | return 0; | 
|  | return 1; | 
|  |  | 
|  | case ENDDOC: | 
|  | TRACE("ENDDOC\n"); | 
|  | if(!physDev->job.hJob) { | 
|  | FIXME("hJob == 0. Now what?\n"); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | physDev->job.NeedPageHeader = FALSE; | 
|  |  | 
|  | if(!PSDRV_WriteFooter( dc )) | 
|  | return 0; | 
|  |  | 
|  | if( CloseJob16( physDev->job.hJob ) == SP_ERROR ) { | 
|  | WARN("CloseJob error\n"); | 
|  | return 0; | 
|  | } | 
|  | physDev->job.hJob = 0; | 
|  | return 1; | 
|  |  | 
|  | case GETPHYSPAGESIZE: | 
|  | { | 
|  | POINT16 *p  = (POINT16 *)PTR_SEG_TO_LIN(lpOutData); | 
|  |  | 
|  | p->x = dc->w.devCaps->horzRes; | 
|  | p->y = dc->w.devCaps->vertRes; | 
|  | TRACE("GETPHYSPAGESIZE: returning %dx%d\n", p->x, p->y); | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | case GETPRINTINGOFFSET: | 
|  | { | 
|  | POINT16 *p = (POINT16 *)PTR_SEG_TO_LIN(lpOutData); | 
|  |  | 
|  | p->x = p->y = 0; | 
|  | TRACE("GETPRINTINGOFFSET: returning %dx%d\n", p->x, p->y); | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | case GETSCALINGFACTOR: | 
|  | { | 
|  | POINT16 *p = (POINT16 *)PTR_SEG_TO_LIN(lpOutData); | 
|  |  | 
|  | p->x = p->y = 0; | 
|  | TRACE("GETSCALINGFACTOR: returning %dx%d\n", p->x, p->y); | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | case SETCOPYCOUNT: | 
|  | { | 
|  | INT16 *NumCopies = (INT16 *)PTR_SEG_TO_LIN(lpInData); | 
|  | INT16 *ActualCopies = (INT16 *)PTR_SEG_TO_LIN(lpOutData); | 
|  | if(cbInput != 2) { | 
|  | WARN("cbInput != 2 (=%d) for SETCOPYCOUNT\n", cbInput); | 
|  | return 0; | 
|  | } | 
|  | TRACE("SETCOPYCOUNT %d\n", *NumCopies); | 
|  | *ActualCopies = 1; | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | case GETTECHNOLOGY: | 
|  | { | 
|  | LPSTR p = (LPSTR)PTR_SEG_TO_LIN(lpOutData); | 
|  | strcpy(p, "PostScript"); | 
|  | *(p + strlen(p) + 1) = '\0'; /* 2 '\0's at end of string */ | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | case SETLINECAP: | 
|  | { | 
|  | INT16 newCap = *(INT16 *)PTR_SEG_TO_LIN(lpInData); | 
|  | if(cbInput != 2) { | 
|  | WARN("cbInput != 2 (=%d) for SETLINECAP\n", cbInput); | 
|  | return 0; | 
|  | } | 
|  | TRACE("SETLINECAP %d\n", newCap); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | case SETLINEJOIN: | 
|  | { | 
|  | INT16 newJoin = *(INT16 *)PTR_SEG_TO_LIN(lpInData); | 
|  | if(cbInput != 2) { | 
|  | WARN("cbInput != 2 (=%d) for SETLINEJOIN\n", cbInput); | 
|  | return 0; | 
|  | } | 
|  | TRACE("SETLINEJOIN %d\n", newJoin); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | case SETMITERLIMIT: | 
|  | { | 
|  | INT16 newLimit = *(INT16 *)PTR_SEG_TO_LIN(lpInData); | 
|  | if(cbInput != 2) { | 
|  | WARN("cbInput != 2 (=%d) for SETMITERLIMIT\n", cbInput); | 
|  | return 0; | 
|  | } | 
|  | TRACE("SETMITERLIMIT %d\n", newLimit); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | case SETCHARSET: | 
|  | /* Undocumented escape used by winword6. | 
|  | Switches between ANSI and a special charset. | 
|  | If *lpInData == 1 we require that | 
|  | 0x91 is quoteleft | 
|  | 0x92 is quoteright | 
|  | 0x93 is quotedblleft | 
|  | 0x94 is quotedblright | 
|  | 0x95 is bullet | 
|  | 0x96 is endash | 
|  | 0x97 is emdash | 
|  | 0xa0 is non break space - yeah right. | 
|  |  | 
|  | If *lpInData == 0 we get ANSI. | 
|  | Since there's nothing else there, let's just make these the default | 
|  | anyway and see what happens... | 
|  | */ | 
|  | return 1; | 
|  |  | 
|  | case EXT_DEVICE_CAPS: | 
|  | { | 
|  | UINT16 cap = *(UINT16 *)PTR_SEG_TO_LIN(lpInData); | 
|  | if(cbInput != 2) { | 
|  | WARN("cbInput != 2 (=%d) for EXT_DEVICE_CAPS\n", | 
|  | cbInput); | 
|  | return 0; | 
|  | } | 
|  | TRACE("EXT_DEVICE_CAPS %d\n", cap); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | case SET_BOUNDS: | 
|  | { | 
|  | RECT16 *r = (RECT16 *)PTR_SEG_TO_LIN(lpInData); | 
|  | if(cbInput != 8) { | 
|  | WARN("cbInput != 8 (=%d) for SET_BOUNDS\n", cbInput); | 
|  | return 0; | 
|  | } | 
|  | TRACE("SET_BOUNDS (%d,%d) - (%d,%d)\n", r->left, r->top, | 
|  | r->right, r->bottom); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | default: | 
|  | FIXME("Unimplemented code 0x%x\n", nEscape); | 
|  | return 0; | 
|  | } | 
|  | } |