2 * Exported functions from the PostScript driver.
4 * [Ext]DeviceMode, DeviceCapabilities, AdvancedSetupDialog.
6 * Will need ExtTextOut for winword6 (urgh!)
8 * Copyright 1998 Huw D M Davies
14 #include "debugtools.h"
20 DEFAULT_DEBUG_CHANNEL(psdrv
);
23 /************************************************************************
27 * Updates dm1 with some fields from dm2
30 void PSDRV_MergeDevmodes(PSDRV_DEVMODEA
*dm1
, PSDRV_DEVMODEA
*dm2
,
33 /* some sanity checks here on dm2 */
35 if(dm2
->dmPublic
.dmFields
& DM_ORIENTATION
)
36 dm1
->dmPublic
.u1
.s1
.dmOrientation
= dm2
->dmPublic
.u1
.s1
.dmOrientation
;
38 /* NB PaperWidth is always < PaperLength */
40 if(dm2
->dmPublic
.dmFields
& DM_PAPERSIZE
) {
43 for(page
= pi
->ppd
->PageSizes
; page
; page
= page
->next
) {
44 if(page
->WinPage
== dm2
->dmPublic
.u1
.s1
.dmPaperSize
)
48 dm1
->dmPublic
.u1
.s1
.dmPaperSize
= dm2
->dmPublic
.u1
.s1
.dmPaperSize
;
49 dm1
->dmPublic
.u1
.s1
.dmPaperWidth
= page
->PaperDimension
->x
*
51 dm1
->dmPublic
.u1
.s1
.dmPaperLength
= page
->PaperDimension
->y
*
53 TRACE("Changing page to %s %d x %d\n", page
->FullName
,
54 dm1
->dmPublic
.u1
.s1
.dmPaperWidth
,
55 dm1
->dmPublic
.u1
.s1
.dmPaperLength
);
57 TRACE("Trying to change to unsupported pagesize %d\n",
58 dm2
->dmPublic
.u1
.s1
.dmPaperSize
);
62 if(dm2
->dmPublic
.dmFields
& DM_PAPERLENGTH
) {
63 dm1
->dmPublic
.u1
.s1
.dmPaperLength
= dm2
->dmPublic
.u1
.s1
.dmPaperLength
;
64 TRACE("Changing PaperLength to %d\n",
65 dm2
->dmPublic
.u1
.s1
.dmPaperLength
);
66 FIXME("Changing PaperLength. Do we adjust PaperSize?\n");
69 if(dm2
->dmPublic
.dmFields
& DM_PAPERWIDTH
) {
70 dm1
->dmPublic
.u1
.s1
.dmPaperWidth
= dm2
->dmPublic
.u1
.s1
.dmPaperWidth
;
71 TRACE("Changing PaperWidth to %d\n",
72 dm2
->dmPublic
.u1
.s1
.dmPaperWidth
);
73 FIXME("Changing PaperWidth. Do we adjust PaperSize?\n");
76 if(dm2
->dmPublic
.dmFields
& DM_SCALE
) {
77 dm1
->dmPublic
.dmScale
= dm2
->dmPublic
.dmScale
;
78 TRACE("Changing Scale to %d\n", dm2
->dmPublic
.dmScale
);
81 if(dm2
->dmPublic
.dmFields
& DM_COPIES
) {
82 dm1
->dmPublic
.dmCopies
= dm2
->dmPublic
.dmCopies
;
83 TRACE("Changing Copies to %d\n", dm2
->dmPublic
.dmCopies
);
86 if(dm2
->dmPublic
.dmFields
& DM_DEFAULTSOURCE
) {
89 for(slot
= pi
->ppd
->InputSlots
; slot
; slot
= slot
->next
) {
90 if(slot
->WinBin
== dm2
->dmPublic
.dmDefaultSource
)
94 dm1
->dmPublic
.dmDefaultSource
= dm2
->dmPublic
.dmDefaultSource
;
95 TRACE("Changing bin to '%s'\n", slot
->FullName
);
97 TRACE("Trying to change to unsupported bin %d\n",
98 dm2
->dmPublic
.dmDefaultSource
);
102 if (dm2
->dmPublic
.dmFields
& DM_DEFAULTSOURCE
)
103 dm1
->dmPublic
.dmDefaultSource
= dm2
->dmPublic
.dmDefaultSource
;
104 if (dm2
->dmPublic
.dmFields
& DM_PRINTQUALITY
)
105 dm1
->dmPublic
.dmPrintQuality
= dm2
->dmPublic
.dmPrintQuality
;
106 if (dm2
->dmPublic
.dmFields
& DM_COLOR
)
107 dm1
->dmPublic
.dmColor
= dm2
->dmPublic
.dmColor
;
108 if (dm2
->dmPublic
.dmFields
& DM_DUPLEX
)
109 dm1
->dmPublic
.dmDuplex
= dm2
->dmPublic
.dmDuplex
;
110 if (dm2
->dmPublic
.dmFields
& DM_YRESOLUTION
)
111 dm1
->dmPublic
.dmYResolution
= dm2
->dmPublic
.dmYResolution
;
112 if (dm2
->dmPublic
.dmFields
& DM_TTOPTION
)
113 dm1
->dmPublic
.dmTTOption
= dm2
->dmPublic
.dmTTOption
;
114 if (dm2
->dmPublic
.dmFields
& DM_COLLATE
)
115 dm1
->dmPublic
.dmCollate
= dm2
->dmPublic
.dmCollate
;
116 if (dm2
->dmPublic
.dmFields
& DM_FORMNAME
)
117 lstrcpynA(dm1
->dmPublic
.dmFormName
, dm2
->dmPublic
.dmFormName
, CCHFORMNAME
);
118 if (dm2
->dmPublic
.dmFields
& DM_BITSPERPEL
)
119 dm1
->dmPublic
.dmBitsPerPel
= dm2
->dmPublic
.dmBitsPerPel
;
120 if (dm2
->dmPublic
.dmFields
& DM_PELSWIDTH
)
121 dm1
->dmPublic
.dmPelsWidth
= dm2
->dmPublic
.dmPelsWidth
;
122 if (dm2
->dmPublic
.dmFields
& DM_PELSHEIGHT
)
123 dm1
->dmPublic
.dmPelsHeight
= dm2
->dmPublic
.dmPelsHeight
;
124 if (dm2
->dmPublic
.dmFields
& DM_DISPLAYFLAGS
)
125 dm1
->dmPublic
.dmDisplayFlags
= dm2
->dmPublic
.dmDisplayFlags
;
126 if (dm2
->dmPublic
.dmFields
& DM_DISPLAYFREQUENCY
)
127 dm1
->dmPublic
.dmDisplayFrequency
= dm2
->dmPublic
.dmDisplayFrequency
;
128 if (dm2
->dmPublic
.dmFields
& DM_POSITION
)
129 dm1
->dmPublic
.u1
.dmPosition
= dm2
->dmPublic
.u1
.dmPosition
;
130 if (dm2
->dmPublic
.dmFields
& DM_LOGPIXELS
)
131 dm1
->dmPublic
.dmLogPixels
= dm2
->dmPublic
.dmLogPixels
;
132 if (dm2
->dmPublic
.dmFields
& DM_ICMMETHOD
)
133 dm1
->dmPublic
.dmICMMethod
= dm2
->dmPublic
.dmICMMethod
;
134 if (dm2
->dmPublic
.dmFields
& DM_ICMINTENT
)
135 dm1
->dmPublic
.dmICMIntent
= dm2
->dmPublic
.dmICMIntent
;
136 if (dm2
->dmPublic
.dmFields
& DM_MEDIATYPE
)
137 dm1
->dmPublic
.dmMediaType
= dm2
->dmPublic
.dmMediaType
;
138 if (dm2
->dmPublic
.dmFields
& DM_DITHERTYPE
)
139 dm1
->dmPublic
.dmDitherType
= dm2
->dmPublic
.dmDitherType
;
140 if (dm2
->dmPublic
.dmFields
& DM_PANNINGWIDTH
)
141 dm1
->dmPublic
.dmPanningWidth
= dm2
->dmPublic
.dmPanningWidth
;
142 if (dm2
->dmPublic
.dmFields
& DM_PANNINGHEIGHT
)
143 dm1
->dmPublic
.dmPanningHeight
= dm2
->dmPublic
.dmPanningHeight
;
149 /**************************************************************
150 * AdvancedSetupDialog [WINEPS16.93]
153 WORD WINAPI
PSDRV_AdvancedSetupDialog16(HWND16 hwnd
, HANDLE16 hDriver
,
154 LPDEVMODEA devin
, LPDEVMODEA devout
)
157 TRACE("hwnd = %04x, hDriver = %04x devin=%p devout=%p\n", hwnd
,
158 hDriver
, devin
, devout
);
162 /****************************************************************
165 * Dialog proc for 'Paper' propsheet
167 BOOL WINAPI
PSDRV_PaperDlgProc(HWND hwnd
, UINT msg
, WPARAM wParam
, LPARAM
177 di
= (PSDRV_DLGINFO
*)((PROPSHEETPAGEA
*)lParam
)->lParam
;
178 SetWindowLongA(hwnd
, DWL_USER
, (LONG
)di
);
180 for(ps
= di
->pi
->ppd
->PageSizes
, i
= 0; ps
; ps
= ps
->next
, i
++) {
181 SendDlgItemMessageA(hwnd
, IDD_PAPERS
, LB_INSERTSTRING
, i
,
182 (LPARAM
)ps
->FullName
);
183 if(di
->pi
->Devmode
->dmPublic
.u1
.s1
.dmPaperSize
== ps
->WinPage
)
186 SendDlgItemMessageA(hwnd
, IDD_PAPERS
, LB_SETCURSEL
, Cursel
, 0);
188 CheckRadioButton(hwnd
, IDD_ORIENT_PORTRAIT
, IDD_ORIENT_LANDSCAPE
,
189 di
->pi
->Devmode
->dmPublic
.u1
.s1
.dmOrientation
==
190 DMORIENT_PORTRAIT
? IDD_ORIENT_PORTRAIT
:
191 IDD_ORIENT_LANDSCAPE
);
195 di
= (PSDRV_DLGINFO
*)GetWindowLongA(hwnd
, DWL_USER
);
196 switch(LOWORD(wParam
)) {
198 if(HIWORD(wParam
) == LBN_SELCHANGE
) {
199 Cursel
= SendDlgItemMessageA(hwnd
, LOWORD(wParam
), LB_GETCURSEL
, 0, 0);
200 for(i
= 0, ps
= di
->pi
->ppd
->PageSizes
; i
< Cursel
; i
++, ps
= ps
->next
)
202 TRACE("Setting pagesize to item %d Winpage = %d\n", Cursel
,
204 di
->dlgdm
->dmPublic
.u1
.s1
.dmPaperSize
= ps
->WinPage
;
207 case IDD_ORIENT_PORTRAIT
:
208 case IDD_ORIENT_LANDSCAPE
:
209 TRACE("Setting orientation to %s\n", wParam
== IDD_ORIENT_PORTRAIT
?
210 "portrait" : "landscape");
211 di
->dlgdm
->dmPublic
.u1
.s1
.dmOrientation
= wParam
== IDD_ORIENT_PORTRAIT
?
212 DMORIENT_PORTRAIT
: DMORIENT_LANDSCAPE
;
219 NMHDR
*nmhdr
= (NMHDR
*)lParam
;
220 di
= (PSDRV_DLGINFO
*)GetWindowLongA(hwnd
, DWL_USER
);
221 switch(nmhdr
->code
) {
223 memcpy(di
->pi
->Devmode
, di
->dlgdm
, sizeof(PSDRV_DEVMODEA
));
224 SetWindowLongA(hwnd
, DWL_MSGRESULT
, PSNRET_NOERROR
);
242 static void WINAPI (*pInitCommonControls
) (void);
243 static HPROPSHEETPAGE
WINAPI (*pCreatePropertySheetPage
) (LPCPROPSHEETPAGEA
);
244 static int WINAPI (*pPropertySheet
) (LPCPROPSHEETHEADERA
);
246 /***************************************************************
247 * ExtDeviceMode [WINEPS16.90]
249 * Just returns default devmode at the moment
251 INT16 WINAPI
PSDRV_ExtDeviceMode16(HWND16 hwnd
, HANDLE16 hDriver
,
252 LPDEVMODEA lpdmOutput
, LPSTR lpszDevice
,
253 LPSTR lpszPort
, LPDEVMODEA lpdmInput
,
254 LPSTR lpszProfile
, WORD fwMode
)
256 PRINTERINFO
*pi
= PSDRV_FindPrinterInfo(lpszDevice
);
259 TRACE("(hwnd=%04x, hDriver=%04x, devOut=%p, Device='%s', Port='%s', devIn=%p, Profile='%s', Mode=%04x)\n",
260 hwnd
, hDriver
, lpdmOutput
, lpszDevice
, lpszPort
, lpdmInput
, lpszProfile
,
264 return sizeof(DEVMODEA
); /* Just copy dmPublic bit of PSDRV_DEVMODE */
266 if((fwMode
& DM_MODIFY
) && lpdmInput
) {
267 TRACE("DM_MODIFY set. devIn->dmFields = %08lx\n", lpdmInput
->dmFields
);
268 PSDRV_MergeDevmodes(pi
->Devmode
, (PSDRV_DEVMODEA
*)lpdmInput
, pi
);
271 if(fwMode
& DM_PROMPT
) {
272 HINSTANCE hinstComctl32
, hinstWineps32
= LoadLibraryA("WINEPS");
273 HPROPSHEETPAGE hpsp
[1];
275 PROPSHEETHEADERA psh
;
277 PSDRV_DEVMODEA
*dlgdm
;
279 hinstComctl32
= LoadLibraryA("comctl32.dll");
280 pInitCommonControls
= (void*)GetProcAddress(hinstComctl32
,
281 "InitCommonControls");
282 pCreatePropertySheetPage
= (void*)GetProcAddress(hinstComctl32
,
283 "CreatePropertySheetPage");
284 pPropertySheet
= (void*)GetProcAddress(hinstComctl32
, "PropertySheet");
285 memset(&psp
,0,sizeof(psp
));
286 dlgdm
= HeapAlloc( PSDRV_Heap
, 0, sizeof(*dlgdm
) );
287 memcpy(dlgdm
, pi
->Devmode
, sizeof(*dlgdm
));
288 di
= HeapAlloc( PSDRV_Heap
, 0, sizeof(*di
) );
291 psp
.dwSize
= sizeof(psp
);
292 psp
.hInstance
= hinstWineps32
;
293 psp
.u
.pszTemplate
= "PAPER";
294 psp
.u2
.pszIcon
= NULL
;
295 psp
.pfnDlgProc
= PSDRV_PaperDlgProc
;
296 psp
.lParam
= (LPARAM
)di
;
297 hpsp
[0] = pCreatePropertySheetPage(&psp
);
299 memset(&psh
, 0, sizeof(psh
));
300 psh
.dwSize
= sizeof(psh
);
301 psh
.pszCaption
= "Setup";
303 psh
.hwndParent
= hwnd
;
304 psh
.u3
.phpage
= hpsp
;
306 pPropertySheet(&psh
);
309 if(fwMode
& DM_UPDATE
)
310 FIXME("Mode DM_UPDATE. Just do the same as DM_COPY\n");
312 if((fwMode
& DM_COPY
) || (fwMode
& DM_UPDATE
)) {
313 memcpy(lpdmOutput
, pi
->Devmode
, sizeof(DEVMODEA
));
318 /**************************************************************
320 * PSDRV_ExtDeviceMode
322 INT
PSDRV_ExtDeviceMode(LPSTR lpszDriver
, HWND hwnd
, LPDEVMODEA lpdmOutput
,
323 LPSTR lpszDevice
, LPSTR lpszPort
, LPDEVMODEA lpdmInput
,
324 LPSTR lpszProfile
, DWORD dwMode
)
326 return PSDRV_ExtDeviceMode16(hwnd
, 0, lpdmOutput
, lpszDevice
, lpszPort
,
327 lpdmInput
, lpszProfile
, dwMode
);
330 /***********************************************************************
331 * DeviceCapabilities [WINEPS16.91]
334 DWORD WINAPI
PSDRV_DeviceCapabilities16(LPCSTR lpszDevice
, LPCSTR lpszPort
,
335 WORD fwCapability
, LPSTR lpszOutput
,
336 LPDEVMODEA lpDevMode
)
340 pi
= PSDRV_FindPrinterInfo(lpszDevice
);
342 TRACE("Cap=%d. Got PrinterInfo = %p\n", fwCapability
, pi
);
346 ERR("no printerinfo for %s, return 0!\n",lpszDevice
);
351 lpdm
= lpDevMode
? lpDevMode
: (DEVMODEA
*)pi
->Devmode
;
353 switch(fwCapability
) {
358 WORD
*wp
= (WORD
*)lpszOutput
;
361 for(ps
= pi
->ppd
->PageSizes
; ps
; ps
= ps
->next
, i
++)
362 if(lpszOutput
!= NULL
)
370 POINT16
*pt
= (POINT16
*)lpszOutput
;
373 for(ps
= pi
->ppd
->PageSizes
; ps
; ps
= ps
->next
, i
++)
374 if(lpszOutput
!= NULL
) {
375 pt
->x
= ps
->PaperDimension
->x
* 254.0 / 72.0;
376 pt
->y
= ps
->PaperDimension
->y
* 254.0 / 72.0;
385 char *cp
= lpszOutput
;
388 for(ps
= pi
->ppd
->PageSizes
; ps
; ps
= ps
->next
, i
++)
389 if(lpszOutput
!= NULL
) {
390 lstrcpynA(cp
, ps
->FullName
, 64);
397 return pi
->ppd
->LandscapeOrientation
? pi
->ppd
->LandscapeOrientation
: 90;
402 WORD
*wp
= (WORD
*)lpszOutput
;
405 /* We explicitly list DMBIN_AUTO first; actually while win9x does this
406 win2000 lists DMBIN_FORMSOURCE instead. */
408 if(lpszOutput
!= NULL
)
411 for(slot
= pi
->ppd
->InputSlots
; slot
; slot
= slot
->next
, i
++)
412 if(lpszOutput
!= NULL
)
413 *wp
++ = slot
->WinBin
;
420 char *cp
= lpszOutput
;
423 /* Add an entry corresponding to DMBIN_AUTO, see DC_BINS */
425 if(lpszOutput
!= NULL
) {
426 strcpy(cp
, "Automatically Select");
430 for(slot
= pi
->ppd
->InputSlots
; slot
; slot
= slot
->next
, i
++)
431 if(lpszOutput
!= NULL
) {
432 lstrcpynA(cp
, slot
->FullName
, 24);
439 FIXME("DC_BINADJUST: stub.\n");
440 return DCBA_FACEUPNONE
;
442 case DC_ENUMRESOLUTIONS
:
444 LONG
*lp
= (LONG
*)lpszOutput
;
446 if(lpszOutput
!= NULL
) {
447 lp
[0] = (LONG
)pi
->ppd
->DefaultResolution
;
448 lp
[1] = (LONG
)pi
->ppd
->DefaultResolution
;
454 FIXME("DC_COPIES: returning %d. Is this correct?\n", lpdm
->dmCopies
);
455 return lpdm
->dmCopies
;
458 return lpdm
->dmDriverVersion
;
460 case DC_DATATYPE_PRODUCED
:
461 FIXME("DATA_TYPE_PRODUCED: stub.\n");
462 return -1; /* simulate that the driver supports 'RAW' */
465 FIXME("DC_DUPLEX: returning %d. Is this correct?\n", lpdm
->dmDuplex
);
466 return lpdm
->dmDuplex
;
468 case DC_EMF_COMPLIANT
:
469 FIXME("DC_EMF_COMPLIANT: stub.\n");
470 return -1; /* simulate that the driver do not support EMF */
473 return lpdm
->dmDriverExtra
;
476 return lpdm
->dmFields
;
478 case DC_FILEDEPENDENCIES
:
479 FIXME("DC_FILEDEPENDENCIES: stub.\n");
487 ptMax
.x
= ptMax
.y
= 0;
489 if(lpszOutput
== NULL
)
493 for(ps
= pi
->ppd
->PageSizes
; ps
; ps
= ps
->next
, i
++) {
494 if(ps
->PaperDimension
->x
> ptMax
.x
)
495 ptMax
.x
= ps
->PaperDimension
->x
;
496 if(ps
->PaperDimension
->y
> ptMax
.y
)
497 ptMax
.y
= ps
->PaperDimension
->y
;
499 *((POINT
*)lpszOutput
) = ptMax
;
508 ptMax
.x
= ptMax
.y
= 0;
510 if(lpszOutput
== NULL
)
514 for(ps
= pi
->ppd
->PageSizes
; ps
; ps
= ps
->next
, i
++) {
515 if(ps
->PaperDimension
->x
> ptMax
.x
)
516 ptMax
.x
= ps
->PaperDimension
->x
;
517 if(ps
->PaperDimension
->y
> ptMax
.y
)
518 ptMax
.y
= ps
->PaperDimension
->y
;
520 *((POINT
*)lpszOutput
) = ptMax
;
528 FIXME("DC_TRUETYPE: stub\n");
532 return lpdm
->dmSpecVersion
;
535 FIXME("Unsupported capability %d\n", fwCapability
);
540 /**************************************************************
542 * PSDRV_DeviceCapabilities
544 DWORD
PSDRV_DeviceCapabilities(LPSTR lpszDriver
, LPCSTR lpszDevice
,
545 LPCSTR lpszPort
, WORD fwCapability
,
546 LPSTR lpszOutput
, LPDEVMODEA lpdm
)
548 return PSDRV_DeviceCapabilities16(lpszDevice
, lpszPort
, fwCapability
,
552 /***************************************************************
553 * DeviceMode [WINEPS16.13]
556 void WINAPI
PSDRV_DeviceMode16(HWND16 hwnd
, HANDLE16 hDriver
,
557 LPSTR lpszDevice
, LPSTR lpszPort
)
559 PSDRV_ExtDeviceMode16( hwnd
, hDriver
, NULL
, lpszDevice
, lpszPort
, NULL
,
568 HPROPSHEETPAGE hPages
[10];
571 INT
PSDRV_ExtDeviceModePropSheet(HWND hwnd
, LPSTR lpszDevice
, LPSTR lpszPort
,
574 EDMPS
*ps
= pPropSheet
;
577 psp
->dwSize
= sizeof(psp
);
578 psp
->hInstance
= 0x1234;