Release 980809
[wine] / graphics / psdrv / driver.c
1 /*
2  * Exported functions from the PostScript driver.
3  *
4  * [Ext]DeviceMode, DeviceCapabilities, AdvancedSetupDialog. 
5  *
6  * Will need ExtTextOut for winword6 (urgh!)
7  *
8  * Copyright 1998  Huw D M Davies
9  *
10  */
11
12 #include <windows.h>
13 #include <psdrv.h>
14 #include <debug.h>
15 #include <resource.h>
16 #include <string.h>
17 #include <win.h>
18 #include <print.h>
19
20 static LONG Resolutions[][2] = { {600,600} };
21
22
23 /************************************************************************
24  *
25  *              PSDRV_MergeDevmodes
26  *
27  * Updates dm1 with some fields from dm2
28  *
29  */
30 void PSDRV_MergeDevmodes(PSDRV_DEVMODE16 *dm1, PSDRV_DEVMODE16 *dm2,
31                          PRINTERINFO *pi)
32 {
33     /* some sanity checks here on dm2 */
34     if(dm2->dmPublic.dmFields & DM_ORIENTATION)
35         dm1->dmPublic.dmOrientation = dm2->dmPublic.dmOrientation;
36             /* NB PaperWidth is always < PaperLength */
37         
38     if(dm2->dmPublic.dmFields & DM_PAPERSIZE) {
39         PAGESIZE *page;
40
41         for(page = pi->ppd->PageSizes; page; page = page->next) {
42             if(page->WinPage == dm2->dmPublic.dmPaperSize)
43                 break;
44         }
45         if(page) {
46             dm1->dmPublic.dmPaperSize = dm2->dmPublic.dmPaperSize;
47             dm1->dmPublic.dmPaperWidth = page->PaperDimension->x * 25.4 / 72.0;
48             dm1->dmPublic.dmPaperLength = page->PaperDimension->y * 25.4 / 72.0;
49             TRACE(psdrv, "Changing page to %s %d x %d\n", page->FullName,
50                      dm1->dmPublic.dmPaperWidth, dm1->dmPublic.dmPaperLength );
51         } else {
52             TRACE(psdrv, "Trying to change to unsupported pagesize %d\n",
53                       dm2->dmPublic.dmPaperSize);
54         }
55     }
56
57     if(dm2->dmPublic.dmFields & DM_DEFAULTSOURCE) {
58         INPUTSLOT *slot;
59         
60         for(slot = pi->ppd->InputSlots; slot; slot = slot->next) {
61             if(slot->WinBin == dm2->dmPublic.dmDefaultSource)
62                 break;
63         }
64         if(slot) {
65             dm1->dmPublic.dmDefaultSource = dm2->dmPublic.dmDefaultSource;
66             TRACE(psdrv, "Changing bin to '%s'\n", slot->FullName);
67         } else {
68           TRACE(psdrv, "Trying to change to unsupported bin %d\n",
69                 dm2->dmPublic.dmDefaultSource);
70         }
71     }
72
73     /* etc */
74
75     return;
76 }
77
78
79 #if 0
80 /*******************************************************************
81  *
82  *              PSDRV_NewPrinterDlgProc32
83  *
84  *
85  */
86 LRESULT WINAPI PSDRV_NewPrinterDlgProc32(HWND32 hWnd, UINT32 wMsg,
87                                             WPARAM32 wParam, LPARAM lParam)
88 {
89   switch (wMsg) {
90   case WM_INITDIALOG:
91     TRACE(psdrv,"WM_INITDIALOG lParam=%08lX\n", lParam);
92     ShowWindow32(hWnd, SW_SHOWNORMAL);
93     return TRUE;
94  
95   case WM_COMMAND:
96     switch (LOWORD(wParam)) {
97     case IDOK:
98       EndDialog32(hWnd, TRUE);
99       return TRUE;
100   
101     case IDCANCEL:
102       EndDialog32(hWnd, FALSE);
103       return TRUE;
104     
105     default:
106       return FALSE;
107     }
108   
109   default:
110     return FALSE;
111   }
112 }
113
114 LRESULT WINAPI PSDRV_AdvancedSetupDlgProc32(HWND32 hWnd, UINT32 wMsg,
115                                             WPARAM32 wParam, LPARAM lParam)
116 {
117   switch (wMsg) {
118   case WM_INITDIALOG:
119     TRACE(psdrv,"WM_INITDIALOG lParam=%08lX\n", lParam);
120     SendDlgItemMessage32A(hWnd, 99, CB_ADDSTRING32, 0, 
121                           (LPARAM)"Default Tray");
122     ShowWindow32(hWnd, SW_SHOWNORMAL);
123     return TRUE;
124
125   case WM_COMMAND:
126     switch (LOWORD(wParam)) {
127     case IDOK:
128       EndDialog32(hWnd, TRUE);
129       return TRUE;
130
131     case IDCANCEL:
132       EndDialog32(hWnd, FALSE);
133       return TRUE;
134
135     case 200:
136       DialogBoxIndirectParam32A( WIN_GetWindowInstance( hWnd ),
137                           SYSRES_GetResPtr( SYSRES_DIALOG_PSDRV_NEWPRINTER ),
138                           hWnd, PSDRV_NewPrinterDlgProc32, (LPARAM) NULL );
139       return TRUE;
140
141     default:
142       return FALSE;
143     }
144
145   default:    
146     return FALSE;
147   }
148 }
149 #endif /* 0 */
150
151 /**************************************************************
152  *
153  *      PSDRV_AdvancedSetupDialog16     [WINEPS.93]
154  *
155  * Presumably dev1 and dev2 are in and out, don't know which is which yet.
156  * Not sure about return value either. (I haven't got any docs on this at all)
157  *
158  */
159 INT16 WINAPI PSDRV_AdvancedSetupDialog16(HWND16 hwnd, HANDLE16 hDriver,
160                                          LPDEVMODE16 dev1, LPDEVMODE16 dev2 )
161 {
162
163   TRACE(psdrv, "hwnd = %04x, hDriver = %04x dev1=%p dev2=%p\n", hwnd,
164         hDriver, dev1, dev2);
165   return IDCANCEL;
166
167
168 #if 0
169   return DialogBoxIndirectParam32A( WIN_GetWindowInstance( hwnd ),
170         SYSRES_GetResPtr( SYSRES_DIALOG_PSDRV_ADVANCEDSETUP ),
171         hwnd, PSDRV_AdvancedSetupDlgProc32, (LPARAM) NULL );
172 #endif
173
174
175 }
176
177 /***************************************************************
178  *
179  *      PSDRV_ExtDeviceMode16   [WINEPS.90]
180  *
181  * Just returns default devmode at the moment
182  */
183 INT16 WINAPI PSDRV_ExtDeviceMode16(HWND16 hwnd, HANDLE16 hDriver,
184 LPDEVMODE16 lpdmOutput, LPSTR lpszDevice, LPSTR lpszPort,
185 LPDEVMODE16 lpdmInput, LPSTR lpszProfile, WORD fwMode)
186 {
187   PRINTERINFO *pi = PSDRV_FindPrinterInfo(lpszDevice);
188
189   TRACE(psdrv,
190 "(hwnd=%04x, hDriver=%04x, devOut=%p, Device='%s', Port='%s', devIn=%p, Profile='%s', Mode=%04x)\n",
191 hwnd, hDriver, lpdmOutput, lpszDevice, lpszPort, lpdmInput, lpszProfile,
192 fwMode);
193
194   if(!fwMode)
195     return sizeof(DEVMODE16); /* Just copy dmPublic bit of PSDRV_DEVMODE */
196
197   if((fwMode & DM_PROMPT) || (fwMode & DM_UPDATE))
198     FIXME(psdrv, "Mode %d not implemented\n", fwMode);
199
200   if(fwMode & DM_MODIFY) {
201     TRACE(psdrv, "DM_MODIFY set. devIn->dmFields = %08lx\n", lpdmInput->dmFields);
202     PSDRV_MergeDevmodes(pi->Devmode, (PSDRV_DEVMODE16 *)lpdmInput, pi);
203   }
204
205   if(fwMode & DM_COPY) {
206     memcpy(lpdmOutput, pi->Devmode, sizeof(DEVMODE16));
207   }
208   return IDOK;
209 }
210
211
212 /***************************************************************
213  *
214  *      PSDRV_DeviceCapabilities16      [WINEPS.91]
215  *
216  */
217 DWORD WINAPI PSDRV_DeviceCapabilities16(LPSTR lpszDevice, LPSTR lpszPort,
218   WORD fwCapability, LPSTR lpszOutput, LPDEVMODE16 lpdm)
219 {
220   PRINTERINFO *pi;
221
222   pi = PSDRV_FindPrinterInfo(lpszDevice);
223   TRACE(psdrv, "Cap=%d. Got PrinterInfo = %p\n", fwCapability, pi);
224
225   switch(fwCapability) {
226
227   case DC_PAPERS:
228     {
229       PAGESIZE *ps;
230       WORD *wp = (WORD *)lpszOutput;
231       int i = 0;
232
233       for(ps = pi->ppd->PageSizes; ps; ps = ps->next, i++)
234         if(lpszOutput != NULL)
235           *wp++ = ps->WinPage;
236       return i;
237     }
238
239   case DC_PAPERSIZE:
240     {
241       PAGESIZE *ps;
242       POINT16 *pt = (POINT16 *)lpszOutput;
243       int i = 0;
244
245       for(ps = pi->ppd->PageSizes; ps; ps = ps->next, i++)
246         if(lpszOutput != NULL) {
247           pt->x = ps->PaperDimension->x * 254.0 / 72.0;
248           pt->y = ps->PaperDimension->y * 254.0 / 72.0;
249           pt++;
250         }
251       return i;
252     }
253
254   case DC_PAPERNAMES:
255     {
256       PAGESIZE *ps;
257       char *cp = lpszOutput;
258       int i = 0;
259
260       for(ps = pi->ppd->PageSizes; ps; ps = ps->next, i++)
261         if(lpszOutput != NULL) {
262           strncpy(cp, ps->FullName, 64);
263           *(cp + 63) = '\0';
264           cp += 64;
265         }
266       return i;
267     }
268
269   case DC_ORIENTATION:
270     return pi->ppd->LandscapeOrientation ? pi->ppd->LandscapeOrientation : 90;
271
272   case DC_BINS:
273     {
274       INPUTSLOT *slot;
275       WORD *wp = (WORD *)lpszOutput;
276       int i = 0;
277
278       for(slot = pi->ppd->InputSlots; slot; slot = slot->next, i++)
279         if(lpszOutput != NULL)
280           *wp++ = slot->WinBin;
281       return i;
282     }
283
284   case DC_BINNAMES:
285     {
286       INPUTSLOT *slot;
287       char *cp = lpszOutput;
288       int i = 0;
289       
290       for(slot = pi->ppd->InputSlots; slot; slot = slot->next, i++)
291         if(lpszOutput != NULL) {
292           strncpy(cp, slot->FullName, 24);
293           *(cp + 23) = '\0';
294           cp += 24;
295         }
296       return i;
297     }
298
299   case DC_ENUMRESOLUTIONS:
300     if(lpszOutput != NULL)
301       memcpy(lpszOutput, Resolutions, sizeof(Resolutions));
302     return sizeof(Resolutions) / sizeof(Resolutions[0]);
303
304
305   default:
306     FIXME(psdrv, "Unsupported capability %d\n", fwCapability);
307   }
308   return -1;
309 }
310
311 /***************************************************************
312  *
313  *      PSDRV_DeviceMode16      [WINEPS.13]
314  *
315  */
316 void WINAPI PSDRV_DeviceMode16(HWND16 hwnd, HANDLE16 hDriver,
317 LPSTR lpszDevice, LPSTR lpszPort)
318 {
319     PSDRV_ExtDeviceMode16( hwnd, hDriver, NULL, lpszDevice, lpszPort, NULL, 
320                            NULL, DM_PROMPT );
321     return;
322 }