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;