2 * PostScript driver Escape function
4 * Copyright 1998 Huw D M Davies
6 #include "wine/winuser16.h"
12 INT
PSDRV_Escape( DC
*dc
, INT nEscape
, INT cbInput
,
13 SEGPTR lpInData
, SEGPTR lpOutData
)
15 PSDRV_PDEVICE
*physDev
= (PSDRV_PDEVICE
*)dc
->physDev
;
20 RECT16
*r
= (RECT16
*)PTR_SEG_TO_LIN(lpOutData
);
21 if(!physDev
->job
.banding
) {
22 physDev
->job
.banding
= TRUE
;
23 SetRect16( r
, 0, 0, dc
->w
.devCaps
->horzRes
,
24 dc
->w
.devCaps
->vertRes
);
25 TRACE(psdrv
, "NEXTBAND returning %d,%d - %d,%d\n", r
->left
,
26 r
->top
, r
->right
, r
->bottom
);
29 SetRect16( r
, 0, 0, 0, 0 );
30 TRACE(psdrv
, "NEXTBAND rect to 0,0 - 0,0\n" );
31 physDev
->job
.banding
= FALSE
;
35 TRACE(psdrv
, "NEWFRAME\n");
37 if(!physDev
->job
.hJob
) {
38 FIXME(psdrv
, "hJob == 0. Now what?\n");
42 if(!PSDRV_WriteEndPage( dc
))
45 physDev
->job
.NeedPageHeader
= TRUE
;
50 WARN(psdrv
, "cbInput != 2 (=%d) for QUERYESCSUPPORT\n", cbInput
);
53 UINT16 num
= *(UINT16
*)PTR_SEG_TO_LIN(lpInData
);
54 TRACE(psdrv
, "QUERYESCSUPPORT for %d\n", num
);
64 case GETPRINTINGOFFSET
:
65 case GETSCALINGFACTOR
:
82 FIXME(psdrv
, "SETABORTPROC: Ignoring\n");
84 /* dc->w.lpfnPrint = (FARPROC16)lpInData;
89 TRACE(psdrv
, "STARTDOC\n");
90 if(physDev
->job
.hJob
) {
91 FIXME(psdrv
, "hJob != 0. Now what?\n");
95 physDev
->job
.hJob
= OpenJob16(physDev
->job
.output
,
96 PTR_SEG_TO_LIN(lpInData
), dc
->hSelf
);
97 if(!physDev
->job
.hJob
) {
98 WARN(psdrv
, "OpenJob failed\n");
101 physDev
->job
.banding
= FALSE
;
102 physDev
->job
.NeedPageHeader
= FALSE
;
103 physDev
->job
.PageNo
= 1;
104 if(!PSDRV_WriteHeader( dc
, PTR_SEG_TO_LIN(lpInData
), cbInput
))
107 if(!PSDRV_WriteNewPage( dc
))
112 TRACE(psdrv
, "ENDDOC\n");
113 if(!physDev
->job
.hJob
) {
114 FIXME(psdrv
, "hJob == 0. Now what?\n");
118 physDev
->job
.NeedPageHeader
= FALSE
;
120 if(!PSDRV_WriteFooter( dc
))
123 if( CloseJob16( physDev
->job
.hJob
) == SP_ERROR
) {
124 WARN(psdrv
, "CloseJob error\n");
127 physDev
->job
.hJob
= 0;
130 case GETPHYSPAGESIZE
:
132 POINT16
*p
= (POINT16
*)PTR_SEG_TO_LIN(lpOutData
);
134 p
->x
= dc
->w
.devCaps
->horzRes
;
135 p
->y
= dc
->w
.devCaps
->vertRes
;
136 TRACE(psdrv
, "GETPHYSPAGESIZE: returning %dx%d\n", p
->x
, p
->y
);
140 case GETPRINTINGOFFSET
:
142 POINT16
*p
= (POINT16
*)PTR_SEG_TO_LIN(lpOutData
);
145 TRACE(psdrv
, "GETPRINTINGOFFSET: returning %dx%d\n", p
->x
, p
->y
);
149 case GETSCALINGFACTOR
:
151 POINT16
*p
= (POINT16
*)PTR_SEG_TO_LIN(lpOutData
);
154 TRACE(psdrv
, "GETSCALINGFACTOR: returning %dx%d\n", p
->x
, p
->y
);
160 INT16
*NumCopies
= (INT16
*)PTR_SEG_TO_LIN(lpInData
);
161 INT16
*ActualCopies
= (INT16
*)PTR_SEG_TO_LIN(lpOutData
);
163 WARN(psdrv
, "cbInput != 2 (=%d) for SETCOPYCOUNT\n", cbInput
);
166 TRACE(psdrv
, "SETCOPYCOUNT %d\n", *NumCopies
);
173 LPSTR p
= (LPSTR
)PTR_SEG_TO_LIN(lpOutData
);
174 strcpy(p
, "PostScript");
175 *(p
+ strlen(p
) + 1) = '\0'; /* 2 '\0's at end of string */
181 INT16 newCap
= *(INT16
*)PTR_SEG_TO_LIN(lpInData
);
183 WARN(psdrv
, "cbInput != 2 (=%d) for SETLINECAP\n", cbInput
);
186 TRACE(psdrv
, "SETLINECAP %d\n", newCap
);
192 INT16 newJoin
= *(INT16
*)PTR_SEG_TO_LIN(lpInData
);
194 WARN(psdrv
, "cbInput != 2 (=%d) for SETLINEJOIN\n", cbInput
);
197 TRACE(psdrv
, "SETLINEJOIN %d\n", newJoin
);
203 INT16 newLimit
= *(INT16
*)PTR_SEG_TO_LIN(lpInData
);
205 WARN(psdrv
, "cbInput != 2 (=%d) for SETMITERLIMIT\n", cbInput
);
208 TRACE(psdrv
, "SETMITERLIMIT %d\n", newLimit
);
213 /* Undocumented escape used by winword6.
214 Switches between ANSI and a special charset.
215 If *lpInData == 1 we require that
219 0x94 is quotedblright
223 0xa0 is non break space - yeah right.
225 If *lpInData == 0 we get ANSI.
226 Since there's nothing else there, let's just make these the default
227 anyway and see what happens...
231 case EXT_DEVICE_CAPS
:
233 UINT16 cap
= *(UINT16
*)PTR_SEG_TO_LIN(lpInData
);
235 WARN(psdrv
, "cbInput != 2 (=%d) for EXT_DEVICE_CAPS\n",
239 TRACE(psdrv
, "EXT_DEVICE_CAPS %d\n", cap
);
245 RECT16
*r
= (RECT16
*)PTR_SEG_TO_LIN(lpInData
);
247 WARN(psdrv
, "cbInput != 8 (=%d) for SET_BOUNDS\n", cbInput
);
250 TRACE(psdrv
, "SET_BOUNDS (%d,%d) - (%d,%d)\n", r
->left
, r
->top
,
251 r
->right
, r
->bottom
);
256 FIXME(psdrv
, "Unimplemented code 0x%x\n", nEscape
);