Added correct implementation of GetCaps, changed Play and Stop handling
[wine/multimedia.git] / graphics / psdrv / escape.c
blobd5f46e5446551ab1f60b9796dcb1fef7545f2775
1 /*
2 * PostScript driver Escape function
4 * Copyright 1998 Huw D M Davies
5 */
6 #include "windows.h"
7 #include "psdrv.h"
8 #include "debug.h"
9 #include "print.h"
12 INT32 PSDRV_Escape( DC *dc, INT32 nEscape, INT32 cbInput,
13 SEGPTR lpInData, SEGPTR lpOutData )
15 PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
17 switch(nEscape) {
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;
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");
36 if(!physDev->job.hJob) {
37 FIXME(psdrv, "hJob == 0. Now what?\n");
38 return 0;
41 if(!PSDRV_WriteEndPage( dc ))
42 return 0;
44 physDev->job.NeedPageHeader = TRUE;
45 return 1;
47 case STARTDOC:
48 TRACE(psdrv, "STARTDOC\n");
49 if(physDev->job.hJob) {
50 FIXME(psdrv, "hJob != 0. Now what?\n");
51 return 0;
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;
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;
66 if(!PSDRV_WriteNewPage( dc ))
67 return 0;
68 return 1;
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;
80 case SETABORTPROC:
81 FIXME(psdrv, "SETABORTPROC: ignoring\n");
82 return 1;
84 case GETPHYSPAGESIZE:
86 POINT16 *p = (POINT16 *)PTR_SEG_TO_LIN(lpOutData);
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;
94 case GETPRINTINGOFFSET:
96 POINT16 *p = (POINT16 *)PTR_SEG_TO_LIN(lpOutData);
98 p->x = p->y = 0;
99 TRACE(psdrv, "GETPRINTINGOFFSET: returning %dx%d\n", p->x, p->y);
100 return 1;
103 case GETSCALINGFACTOR:
105 POINT16 *p = (POINT16 *)PTR_SEG_TO_LIN(lpOutData);
107 p->x = p->y = 0;
108 TRACE(psdrv, "GETSCALINGFACTOR: returning %dx%d\n", p->x, p->y);
109 return 1;
112 case ENDDOC:
113 TRACE(psdrv, "ENDDOC\n");
114 if(!physDev->job.hJob) {
115 FIXME(psdrv, "hJob == 0. Now what?\n");
116 return 0;
119 physDev->job.NeedPageHeader = FALSE;
121 if(!PSDRV_WriteFooter( dc ))
122 return 0;
124 if( CloseJob( physDev->job.hJob ) == SP_ERROR ) {
125 WARN(psdrv, "CloseJob error\n");
126 return 0;
128 physDev->job.hJob = 0;
129 return 1;
131 default:
132 FIXME(psdrv, "Unimplemented code 0x%x\n", nEscape);
133 return 0;