- New implementation of SendMessage, ReceiveMessage, ReplyMessage functions
[wine] / graphics / psdrv / escape.c
1 /*
2  *      PostScript driver Escape function
3  *
4  *      Copyright 1998  Huw D M Davies
5  */
6 #include "wine/winuser16.h"
7 #include "psdrv.h"
8 #include "debug.h"
9 #include "winspool.h"
10
11
12 INT32 PSDRV_Escape( DC *dc, INT32 nEscape, INT32 cbInput, 
13                               SEGPTR lpInData, SEGPTR lpOutData )
14 {
15     PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
16
17     switch(nEscape) {
18
19     case NEXTBAND: {
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 );
27             return 1;
28         }
29         SetRect16( r, 0, 0, 0, 0 );
30         TRACE(psdrv, "NEXTBAND rect to 0,0 - 0,0\n" );
31         physDev->job.banding = FALSE;
32     }   /* Fall through */
33     case NEWFRAME:
34         TRACE(psdrv, "NEWFRAME\n");
35
36         if(!physDev->job.hJob) {
37             FIXME(psdrv, "hJob == 0. Now what?\n");
38             return 0;
39         }
40
41         if(!PSDRV_WriteEndPage( dc ))
42             return 0;
43
44         physDev->job.NeedPageHeader = TRUE;
45         return 1;
46           
47     case STARTDOC:
48         TRACE(psdrv, "STARTDOC\n");
49         if(physDev->job.hJob) {
50             FIXME(psdrv, "hJob != 0. Now what?\n");
51             return 0;
52         }
53
54         physDev->job.hJob = OpenJob(physDev->job.output,
55                                     PTR_SEG_TO_LIN(lpInData), dc->hSelf);
56         if(!physDev->job.hJob) {
57             WARN(psdrv, "OpenJob failed\n");
58             return 0;
59         }
60         physDev->job.banding = FALSE;
61         physDev->job.NeedPageHeader = FALSE;
62         physDev->job.PageNo = 1;
63         if(!PSDRV_WriteHeader( dc, PTR_SEG_TO_LIN(lpInData), cbInput ))
64             return 0;
65
66         if(!PSDRV_WriteNewPage( dc ))
67             return 0;
68         return 1;
69
70     case QUERYESCSUPPORT:
71         if(cbInput != 2) {
72             WARN(psdrv, "cbInput != 2 (=%d) for QUERYESCSUPPORT\n", cbInput);
73             return 0;
74         } else {
75             UINT16 num = *(UINT16 *)PTR_SEG_TO_LIN(lpInData);
76             TRACE(psdrv, "QUERYESCSUPPORT for %d\n", num);         
77             return 0;
78         }
79
80     case SETABORTPROC:
81         FIXME(psdrv, "SETABORTPROC: ignoring\n");
82         return 1;
83
84     case GETPHYSPAGESIZE:
85         {
86             POINT16 *p  = (POINT16 *)PTR_SEG_TO_LIN(lpOutData);
87             
88             p->x = dc->w.devCaps->horzRes;
89             p->y = dc->w.devCaps->vertRes;
90             TRACE(psdrv, "GETPHYSPAGESIZE: returning %dx%d\n", p->x, p->y);
91             return 1;
92         }
93
94     case GETPRINTINGOFFSET:
95         {
96             POINT16 *p  = (POINT16 *)PTR_SEG_TO_LIN(lpOutData);
97         
98             p->x = p->y = 0;
99             TRACE(psdrv, "GETPRINTINGOFFSET: returning %dx%d\n", p->x, p->y);
100             return 1;
101         }
102       
103     case GETSCALINGFACTOR:
104         {
105             POINT16 *p  = (POINT16 *)PTR_SEG_TO_LIN(lpOutData);
106         
107             p->x = p->y = 0;
108             TRACE(psdrv, "GETSCALINGFACTOR: returning %dx%d\n", p->x, p->y);
109             return 1;
110         }
111
112     case ENDDOC:
113         TRACE(psdrv, "ENDDOC\n");
114         if(!physDev->job.hJob) {
115             FIXME(psdrv, "hJob == 0. Now what?\n");
116             return 0;
117         }
118
119         physDev->job.NeedPageHeader = FALSE;
120
121         if(!PSDRV_WriteFooter( dc ))
122             return 0;
123
124         if( CloseJob( physDev->job.hJob ) == SP_ERROR ) {
125             WARN(psdrv, "CloseJob error\n");
126             return 0;
127         }
128         physDev->job.hJob = 0;
129         return 1;
130
131     default:
132         FIXME(psdrv, "Unimplemented code 0x%x\n", nEscape);
133         return 0;
134     }
135 }
136
137