2 * PostScript driver Escape function
4 * Copyright 1998 Huw D M Davies
6 #include "wine/winuser16.h"
8 #include "debugtools.h"
12 DEFAULT_DEBUG_CHANNEL(psdrv)
15 INT PSDRV_Escape( DC *dc, INT nEscape, INT cbInput,
16 SEGPTR lpInData, SEGPTR lpOutData )
18 PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
23 RECT16 *r = (RECT16 *)PTR_SEG_TO_LIN(lpOutData);
24 if(!physDev->job.banding) {
25 physDev->job.banding = TRUE;
26 SetRect16( r, 0, 0, dc->w.devCaps->horzRes,
27 dc->w.devCaps->vertRes );
28 TRACE("NEXTBAND returning %d,%d - %d,%d\n", r->left,
29 r->top, r->right, r->bottom );
32 SetRect16( r, 0, 0, 0, 0 );
33 TRACE("NEXTBAND rect to 0,0 - 0,0\n" );
34 physDev->job.banding = FALSE;
40 if(!physDev->job.hJob) {
41 FIXME("hJob == 0. Now what?\n");
45 if(!PSDRV_EndPage( dc ))
51 WARN("cbInput < 2 (=%d) for QUERYESCSUPPORT\n", cbInput);
54 UINT16 num = *(UINT16 *)PTR_SEG_TO_LIN(lpInData);
55 TRACE("QUERYESCSUPPORT for %d\n", num);
65 case GETPRINTINGOFFSET:
66 case GETSCALINGFACTOR:
83 TRACE("SETABORTPROC\n");
84 dc->w.spfnPrint = (FARPROC16)lpInData;
95 /* lpInData may not be 0 terminated so we must copy it */
97 name = HeapAlloc( GetProcessHeap(), 0, cbInput+1 );
98 memcpy(name, PTR_SEG_TO_LIN(lpInData), cbInput);
101 doc.cbSize = sizeof(doc);
102 doc.lpszDocName = name;
103 doc.lpszOutput = doc.lpszDatatype = NULL;
106 ret = PSDRV_StartDoc(dc, &doc);
107 if(name) HeapFree( GetProcessHeap(), 0, name );
108 if(ret <= 0) return -1;
109 ret = PSDRV_StartPage(dc);
110 if(ret <= 0) return -1;
116 return PSDRV_EndDoc( dc );
118 case GETPHYSPAGESIZE:
120 POINT16 *p = (POINT16 *)PTR_SEG_TO_LIN(lpOutData);
122 p->x = dc->w.devCaps->horzRes;
123 p->y = dc->w.devCaps->vertRes;
124 TRACE("GETPHYSPAGESIZE: returning %dx%d\n", p->x, p->y);
128 case GETPRINTINGOFFSET:
130 POINT16 *p = (POINT16 *)PTR_SEG_TO_LIN(lpOutData);
133 TRACE("GETPRINTINGOFFSET: returning %dx%d\n", p->x, p->y);
137 case GETSCALINGFACTOR:
139 POINT16 *p = (POINT16 *)PTR_SEG_TO_LIN(lpOutData);
142 TRACE("GETSCALINGFACTOR: returning %dx%d\n", p->x, p->y);
148 INT16 *NumCopies = (INT16 *)PTR_SEG_TO_LIN(lpInData);
149 INT16 *ActualCopies = (INT16 *)PTR_SEG_TO_LIN(lpOutData);
151 WARN("cbInput != 2 (=%d) for SETCOPYCOUNT\n", cbInput);
154 TRACE("SETCOPYCOUNT %d\n", *NumCopies);
161 LPSTR p = (LPSTR)PTR_SEG_TO_LIN(lpOutData);
162 strcpy(p, "PostScript");
163 *(p + strlen(p) + 1) = '\0'; /* 2 '\0's at end of string */
169 INT16 newCap = *(INT16 *)PTR_SEG_TO_LIN(lpInData);
171 WARN("cbInput != 2 (=%d) for SETLINECAP\n", cbInput);
174 TRACE("SETLINECAP %d\n", newCap);
180 INT16 newJoin = *(INT16 *)PTR_SEG_TO_LIN(lpInData);
182 WARN("cbInput != 2 (=%d) for SETLINEJOIN\n", cbInput);
185 TRACE("SETLINEJOIN %d\n", newJoin);
191 INT16 newLimit = *(INT16 *)PTR_SEG_TO_LIN(lpInData);
193 WARN("cbInput != 2 (=%d) for SETMITERLIMIT\n", cbInput);
196 TRACE("SETMITERLIMIT %d\n", newLimit);
201 /* Undocumented escape used by winword6.
202 Switches between ANSI and a special charset.
203 If *lpInData == 1 we require that
207 0x94 is quotedblright
211 0xa0 is non break space - yeah right.
213 If *lpInData == 0 we get ANSI.
214 Since there's nothing else there, let's just make these the default
215 anyway and see what happens...
219 case EXT_DEVICE_CAPS:
221 UINT16 cap = *(UINT16 *)PTR_SEG_TO_LIN(lpInData);
223 WARN("cbInput != 2 (=%d) for EXT_DEVICE_CAPS\n",
227 TRACE("EXT_DEVICE_CAPS %d\n", cap);
233 RECT16 *r = (RECT16 *)PTR_SEG_TO_LIN(lpInData);
235 WARN("cbInput != 8 (=%d) for SET_BOUNDS\n", cbInput);
238 TRACE("SET_BOUNDS (%d,%d) - (%d,%d)\n", r->left, r->top,
239 r->right, r->bottom);
244 FIXME("Unimplemented code 0x%x\n", nEscape);
249 /************************************************************************
252 INT PSDRV_StartPage( DC *dc )
254 PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
256 if(!physDev->job.OutOfPage) {
257 FIXME("Already started a page?\n");
260 physDev->job.PageNo++;
261 if(!PSDRV_WriteNewPage( dc ))
263 physDev->job.OutOfPage = FALSE;
268 /************************************************************************
271 INT PSDRV_EndPage( DC *dc )
273 PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
275 if(physDev->job.OutOfPage) {
276 FIXME("Already ended a page?\n");
279 if(!PSDRV_WriteEndPage( dc ))
281 physDev->job.OutOfPage = TRUE;
286 /************************************************************************
289 INT PSDRV_StartDoc( DC *dc, const DOCINFOA *doc )
291 PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
293 if(physDev->job.hJob) {
294 FIXME("hJob != 0. Now what?\n");
298 if(doc->lpszOutput) {
299 HeapFree( PSDRV_Heap, 0, physDev->job.output );
300 physDev->job.output = HEAP_strdupA( PSDRV_Heap, 0, doc->lpszOutput );
302 physDev->job.hJob = OpenJob16(physDev->job.output, doc->lpszDocName,
304 if(!physDev->job.hJob) {
305 WARN("OpenJob failed\n");
308 physDev->job.banding = FALSE;
309 physDev->job.OutOfPage = TRUE;
310 physDev->job.PageNo = 0;
311 if(!PSDRV_WriteHeader( dc, doc->lpszDocName ))
314 return physDev->job.hJob;
318 /************************************************************************
321 INT PSDRV_EndDoc( DC *dc )
323 PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
325 if(!physDev->job.hJob) {
326 FIXME("hJob == 0. Now what?\n");
330 if(!physDev->job.OutOfPage) {
331 WARN("Somebody forgot a EndPage\n");
334 if(!PSDRV_WriteFooter( dc ))
337 if( CloseJob16( physDev->job.hJob ) == SP_ERROR ) {
338 WARN("CloseJob error\n");
341 physDev->job.hJob = 0;