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
10 * This library is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2.1 of the License, or (at your option) any later version.
15 * This library is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with this library; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
34 #include "ddk/winddiui.h"
36 #include "wine/debug.h"
41 WINE_DEFAULT_DEBUG_CHANNEL(psdrv
);
48 LPCWSTR pszPrinterName
;
53 } DOCUMENTPROPERTYHEADERW
;
55 /* convert points to paper size units (10th of a millimeter) */
56 static inline int paper_size_from_points( float size
)
58 return size
* 254 / 72;
61 INPUTSLOT
*find_slot( PPD
*ppd
, const DEVMODEW
*dm
)
65 LIST_FOR_EACH_ENTRY( slot
, &ppd
->InputSlots
, INPUTSLOT
, entry
)
66 if (slot
->WinBin
== dm
->dmDefaultSource
)
72 PAGESIZE
*find_pagesize( PPD
*ppd
, const DEVMODEW
*dm
)
76 LIST_FOR_EACH_ENTRY( page
, &ppd
->PageSizes
, PAGESIZE
, entry
)
77 if (page
->WinPage
== dm
->dmPaperSize
)
83 DUPLEX
*find_duplex( PPD
*ppd
, const DEVMODEW
*dm
)
86 WORD win_duplex
= dm
->dmFields
& DM_DUPLEX
? dm
->dmDuplex
: 0;
88 if (win_duplex
== 0) return NULL
; /* Not capable */
90 LIST_FOR_EACH_ENTRY( duplex
, &ppd
->Duplexes
, DUPLEX
, entry
)
91 if (duplex
->WinDuplex
== win_duplex
)
97 /************************************************************************
101 * Updates dm1 with some fields from dm2
104 void PSDRV_MergeDevmodes( PSDRV_DEVMODE
*dm1
, const DEVMODEW
*dm2
, PRINTERINFO
*pi
)
106 /* some sanity checks here on dm2 */
108 if(dm2
->dmFields
& DM_ORIENTATION
) {
109 dm1
->dmPublic
.dmOrientation
= dm2
->dmOrientation
;
110 TRACE("Changing orientation to %d (%s)\n",
111 dm1
->dmPublic
.dmOrientation
,
112 dm1
->dmPublic
.dmOrientation
== DMORIENT_PORTRAIT
?
114 (dm1
->dmPublic
.dmOrientation
== DMORIENT_LANDSCAPE
?
115 "Landscape" : "unknown"));
118 /* NB PaperWidth is always < PaperLength */
119 if (dm2
->dmFields
& DM_PAPERSIZE
)
121 PAGESIZE
*page
= find_pagesize( pi
->ppd
, dm2
);
125 dm1
->dmPublic
.dmPaperSize
= dm2
->dmPaperSize
;
126 dm1
->dmPublic
.dmPaperWidth
= paper_size_from_points( page
->PaperDimension
->x
);
127 dm1
->dmPublic
.dmPaperLength
= paper_size_from_points( page
->PaperDimension
->y
);
128 dm1
->dmPublic
.dmFields
|= DM_PAPERSIZE
| DM_PAPERWIDTH
| DM_PAPERLENGTH
;
129 TRACE("Changing page to %s %d x %d\n", debugstr_w(page
->FullName
),
130 dm1
->dmPublic
.dmPaperWidth
,
131 dm1
->dmPublic
.dmPaperLength
);
133 if (dm1
->dmPublic
.dmSize
>= FIELD_OFFSET(DEVMODEW
, dmFormName
) + CCHFORMNAME
* sizeof(WCHAR
))
135 lstrcpynW(dm1
->dmPublic
.dmFormName
, page
->FullName
, CCHFORMNAME
);
136 dm1
->dmPublic
.dmFields
|= DM_FORMNAME
;
140 TRACE("Trying to change to unsupported pagesize %d\n", dm2
->dmPaperSize
);
143 else if((dm2
->dmFields
& DM_PAPERLENGTH
) &&
144 (dm2
->dmFields
& DM_PAPERWIDTH
)) {
145 dm1
->dmPublic
.dmPaperLength
= dm2
->dmPaperLength
;
146 dm1
->dmPublic
.dmPaperWidth
= dm2
->dmPaperWidth
;
147 TRACE("Changing PaperLength|Width to %dx%d\n",
150 dm1
->dmPublic
.dmFields
&= ~DM_PAPERSIZE
;
151 dm1
->dmPublic
.dmFields
|= (DM_PAPERLENGTH
| DM_PAPERWIDTH
);
152 } else if(dm2
->dmFields
& (DM_PAPERLENGTH
| DM_PAPERWIDTH
)) {
153 /* You might think that this would be allowed if dm1 is in custom size
154 mode, but apparently Windows reverts to standard paper mode even in
156 FIXME("Trying to change only paperlength or paperwidth\n");
157 dm1
->dmPublic
.dmFields
&= ~(DM_PAPERLENGTH
| DM_PAPERWIDTH
);
158 dm1
->dmPublic
.dmFields
|= DM_PAPERSIZE
;
161 if(dm2
->dmFields
& DM_SCALE
) {
162 dm1
->dmPublic
.dmScale
= dm2
->dmScale
;
163 TRACE("Changing Scale to %d\n", dm2
->dmScale
);
166 if(dm2
->dmFields
& DM_COPIES
) {
167 dm1
->dmPublic
.dmCopies
= dm2
->dmCopies
;
168 TRACE("Changing Copies to %d\n", dm2
->dmCopies
);
171 if (dm2
->dmFields
& DM_DEFAULTSOURCE
)
173 INPUTSLOT
*slot
= find_slot( pi
->ppd
, dm2
);
177 dm1
->dmPublic
.dmDefaultSource
= dm2
->dmDefaultSource
;
178 TRACE("Changing bin to '%s'\n", slot
->FullName
);
181 TRACE("Trying to change to unsupported bin %d\n", dm2
->dmDefaultSource
);
184 if (dm2
->dmFields
& DM_DEFAULTSOURCE
)
185 dm1
->dmPublic
.dmDefaultSource
= dm2
->dmDefaultSource
;
186 if (dm2
->dmFields
& DM_PRINTQUALITY
)
187 dm1
->dmPublic
.dmPrintQuality
= dm2
->dmPrintQuality
;
188 if (dm2
->dmFields
& DM_COLOR
)
189 dm1
->dmPublic
.dmColor
= dm2
->dmColor
;
190 if (dm2
->dmFields
& DM_DUPLEX
&& pi
->ppd
->DefaultDuplex
&& pi
->ppd
->DefaultDuplex
->WinDuplex
!= 0)
191 dm1
->dmPublic
.dmDuplex
= dm2
->dmDuplex
;
192 if (dm2
->dmFields
& DM_YRESOLUTION
)
193 dm1
->dmPublic
.dmYResolution
= dm2
->dmYResolution
;
194 if (dm2
->dmFields
& DM_TTOPTION
)
195 dm1
->dmPublic
.dmTTOption
= dm2
->dmTTOption
;
196 if (dm2
->dmFields
& DM_COLLATE
)
197 dm1
->dmPublic
.dmCollate
= dm2
->dmCollate
;
198 if (dm2
->dmFields
& DM_FORMNAME
)
199 lstrcpynW(dm1
->dmPublic
.dmFormName
, dm2
->dmFormName
, CCHFORMNAME
);
200 if (dm2
->dmFields
& DM_BITSPERPEL
)
201 dm1
->dmPublic
.dmBitsPerPel
= dm2
->dmBitsPerPel
;
202 if (dm2
->dmFields
& DM_PELSWIDTH
)
203 dm1
->dmPublic
.dmPelsWidth
= dm2
->dmPelsWidth
;
204 if (dm2
->dmFields
& DM_PELSHEIGHT
)
205 dm1
->dmPublic
.dmPelsHeight
= dm2
->dmPelsHeight
;
206 if (dm2
->dmFields
& DM_DISPLAYFLAGS
)
207 dm1
->dmPublic
.dmDisplayFlags
= dm2
->dmDisplayFlags
;
208 if (dm2
->dmFields
& DM_DISPLAYFREQUENCY
)
209 dm1
->dmPublic
.dmDisplayFrequency
= dm2
->dmDisplayFrequency
;
210 if (dm2
->dmFields
& DM_POSITION
)
211 dm1
->dmPublic
.dmPosition
= dm2
->dmPosition
;
212 if (dm2
->dmFields
& DM_LOGPIXELS
)
213 dm1
->dmPublic
.dmLogPixels
= dm2
->dmLogPixels
;
214 if (dm2
->dmFields
& DM_ICMMETHOD
)
215 dm1
->dmPublic
.dmICMMethod
= dm2
->dmICMMethod
;
216 if (dm2
->dmFields
& DM_ICMINTENT
)
217 dm1
->dmPublic
.dmICMIntent
= dm2
->dmICMIntent
;
218 if (dm2
->dmFields
& DM_MEDIATYPE
)
219 dm1
->dmPublic
.dmMediaType
= dm2
->dmMediaType
;
220 if (dm2
->dmFields
& DM_DITHERTYPE
)
221 dm1
->dmPublic
.dmDitherType
= dm2
->dmDitherType
;
222 if (dm2
->dmFields
& DM_PANNINGWIDTH
)
223 dm1
->dmPublic
.dmPanningWidth
= dm2
->dmPanningWidth
;
224 if (dm2
->dmFields
& DM_PANNINGHEIGHT
)
225 dm1
->dmPublic
.dmPanningHeight
= dm2
->dmPanningHeight
;
234 PSDRV_DEVMODE
*dlgdm
;
237 /****************************************************************
240 * Dialog proc for 'Paper' propsheet
242 static INT_PTR CALLBACK
PSDRV_PaperDlgProc(HWND hwnd
, UINT msg
,
243 WPARAM wParam
, LPARAM lParam
)
253 di
= (PSDRV_DLGINFO
*)((PROPSHEETPAGEA
*)lParam
)->lParam
;
254 SetWindowLongPtrW(hwnd
, DWLP_USER
, (LONG_PTR
)di
);
257 LIST_FOR_EACH_ENTRY(ps
, &di
->pi
->ppd
->PageSizes
, PAGESIZE
, entry
) {
258 SendDlgItemMessageA(hwnd
, IDD_PAPERS
, LB_INSERTSTRING
, i
,
259 (LPARAM
)ps
->FullName
);
260 if(di
->pi
->Devmode
->dmPublic
.dmPaperSize
== ps
->WinPage
)
264 SendDlgItemMessageA(hwnd
, IDD_PAPERS
, LB_SETCURSEL
, Cursel
, 0);
266 CheckRadioButton(hwnd
, IDD_ORIENT_PORTRAIT
, IDD_ORIENT_LANDSCAPE
,
267 di
->pi
->Devmode
->dmPublic
.dmOrientation
==
268 DMORIENT_PORTRAIT
? IDD_ORIENT_PORTRAIT
:
269 IDD_ORIENT_LANDSCAPE
);
271 if (list_empty( &di
->pi
->ppd
->Duplexes
))
273 ShowWindow(GetDlgItem(hwnd
, IDD_DUPLEX
), SW_HIDE
);
274 ShowWindow(GetDlgItem(hwnd
, IDD_DUPLEX_NAME
), SW_HIDE
);
279 LIST_FOR_EACH_ENTRY( duplex
, &di
->pi
->ppd
->Duplexes
, DUPLEX
, entry
)
281 SendDlgItemMessageA(hwnd
, IDD_DUPLEX
, CB_INSERTSTRING
, i
,
282 (LPARAM
)(duplex
->FullName
? duplex
->FullName
: duplex
->Name
));
283 if(di
->pi
->Devmode
->dmPublic
.dmDuplex
== duplex
->WinDuplex
)
287 SendDlgItemMessageA(hwnd
, IDD_DUPLEX
, CB_SETCURSEL
, Cursel
, 0);
290 if (list_empty( &di
->pi
->ppd
->Resolutions
))
295 res
= di
->pi
->ppd
->DefaultResolution
;
296 len
= swprintf(buf
, ARRAY_SIZE(buf
), L
"%d", res
);
298 LoadStringW(PSDRV_hInstance
, IDS_DPI
, buf
+ len
, ARRAY_SIZE(buf
) - len
);
299 SendDlgItemMessageW(hwnd
, IDD_QUALITY
, CB_ADDSTRING
, 0, (LPARAM
)buf
);
300 SendDlgItemMessageW(hwnd
, IDD_QUALITY
, CB_SETITEMDATA
, 0, MAKELONG(res
, res
));
308 resx
= resy
= di
->pi
->ppd
->DefaultResolution
;
310 if (di
->pi
->Devmode
->dmPublic
.dmFields
& DM_PRINTQUALITY
)
311 resx
= resy
= di
->pi
->Devmode
->dmPublic
.dmPrintQuality
;
313 if (di
->pi
->Devmode
->dmPublic
.dmFields
& DM_YRESOLUTION
)
314 resy
= di
->pi
->Devmode
->dmPublic
.dmYResolution
;
316 if (di
->pi
->Devmode
->dmPublic
.dmFields
& DM_LOGPIXELS
)
317 resx
= resy
= di
->pi
->Devmode
->dmPublic
.dmLogPixels
;
319 LIST_FOR_EACH_ENTRY(res
, &di
->pi
->ppd
->Resolutions
, RESOLUTION
, entry
)
325 if (res
->resx
== res
->resy
)
326 len
= swprintf(buf
, ARRAY_SIZE(buf
), L
"%d", res
->resx
);
328 len
= swprintf(buf
, ARRAY_SIZE(buf
), L
"%dx%d", res
->resx
, res
->resy
);
330 LoadStringW(PSDRV_hInstance
, IDS_DPI
, buf
+ len
, ARRAY_SIZE(buf
) - len
);
331 idx
= SendDlgItemMessageW(hwnd
, IDD_QUALITY
, CB_ADDSTRING
, 0, (LPARAM
)buf
);
332 SendDlgItemMessageW(hwnd
, IDD_QUALITY
, CB_SETITEMDATA
, idx
, MAKELONG(res
->resx
, res
->resy
));
334 if (res
->resx
== resx
&& res
->resy
== resy
)
338 SendDlgItemMessageW(hwnd
, IDD_QUALITY
, CB_SETCURSEL
, Cursel
, 0);
343 di
= (PSDRV_DLGINFO
*)GetWindowLongPtrW(hwnd
, DWLP_USER
);
344 switch(LOWORD(wParam
)) {
346 if(HIWORD(wParam
) == LBN_SELCHANGE
) {
347 Cursel
= SendDlgItemMessageA(hwnd
, LOWORD(wParam
), LB_GETCURSEL
, 0, 0);
349 LIST_FOR_EACH_ENTRY(ps
, &di
->pi
->ppd
->PageSizes
, PAGESIZE
, entry
) {
350 if(i
>= Cursel
) break;
353 TRACE("Setting pagesize to item %d, WinPage %d (%s), PaperSize %.2fx%.2f\n", Cursel
,
354 ps
->WinPage
, debugstr_w(ps
->FullName
), ps
->PaperDimension
->x
, ps
->PaperDimension
->y
);
355 di
->dlgdm
->dmPublic
.dmPaperSize
= ps
->WinPage
;
356 di
->dlgdm
->dmPublic
.dmFields
|= DM_PAPERSIZE
;
358 di
->dlgdm
->dmPublic
.dmPaperWidth
= paper_size_from_points(ps
->PaperDimension
->x
);
359 di
->dlgdm
->dmPublic
.dmPaperLength
= paper_size_from_points(ps
->PaperDimension
->y
);
360 di
->dlgdm
->dmPublic
.dmFields
|= DM_PAPERLENGTH
| DM_PAPERWIDTH
;
362 if (di
->dlgdm
->dmPublic
.dmSize
>= FIELD_OFFSET(DEVMODEW
, dmFormName
) + CCHFORMNAME
* sizeof(WCHAR
))
364 lstrcpynW(di
->dlgdm
->dmPublic
.dmFormName
, ps
->FullName
, CCHFORMNAME
);
365 di
->dlgdm
->dmPublic
.dmFields
|= DM_FORMNAME
;
367 SendMessageW(GetParent(hwnd
), PSM_CHANGED
, 0, 0);
370 case IDD_ORIENT_PORTRAIT
:
371 case IDD_ORIENT_LANDSCAPE
:
372 TRACE("Setting orientation to %s\n", wParam
== IDD_ORIENT_PORTRAIT
?
373 "portrait" : "landscape");
374 di
->dlgdm
->dmPublic
.dmOrientation
= wParam
== IDD_ORIENT_PORTRAIT
?
375 DMORIENT_PORTRAIT
: DMORIENT_LANDSCAPE
;
376 di
->dlgdm
->dmPublic
.dmFields
|= DM_ORIENTATION
;
377 SendMessageW(GetParent(hwnd
), PSM_CHANGED
, 0, 0);
380 if(HIWORD(wParam
) == CBN_SELCHANGE
) {
381 Cursel
= SendDlgItemMessageA(hwnd
, LOWORD(wParam
), CB_GETCURSEL
, 0, 0);
383 LIST_FOR_EACH_ENTRY( duplex
, &di
->pi
->ppd
->Duplexes
, DUPLEX
, entry
)
385 if (i
>= Cursel
) break;
388 TRACE("Setting duplex to item %d Winduplex = %d\n", Cursel
, duplex
->WinDuplex
);
389 di
->dlgdm
->dmPublic
.dmDuplex
= duplex
->WinDuplex
;
390 di
->dlgdm
->dmPublic
.dmFields
|= DM_DUPLEX
;
391 SendMessageW(GetParent(hwnd
), PSM_CHANGED
, 0, 0);
396 if (HIWORD(wParam
) == CBN_SELCHANGE
)
401 Cursel
= SendDlgItemMessageW(hwnd
, LOWORD(wParam
), CB_GETCURSEL
, 0, 0);
402 data
= SendDlgItemMessageW(hwnd
, IDD_QUALITY
, CB_GETITEMDATA
, Cursel
, 0);
406 TRACE("Setting resolution to %dx%d\n", resx
, resy
);
408 di
->dlgdm
->dmPublic
.dmPrintQuality
= resx
;
409 di
->dlgdm
->dmPublic
.dmFields
|= DM_PRINTQUALITY
;
411 di
->dlgdm
->dmPublic
.dmYResolution
= resy
;
412 di
->dlgdm
->dmPublic
.dmFields
|= DM_YRESOLUTION
;
414 if (di
->pi
->Devmode
->dmPublic
.dmFields
& DM_LOGPIXELS
)
416 di
->dlgdm
->dmPublic
.dmLogPixels
= resx
;
417 di
->dlgdm
->dmPublic
.dmFields
|= DM_LOGPIXELS
;
420 SendMessageW(GetParent(hwnd
), PSM_CHANGED
, 0, 0);
428 NMHDR
*nmhdr
= (NMHDR
*)lParam
;
429 di
= (PSDRV_DLGINFO
*)GetWindowLongPtrW(hwnd
, DWLP_USER
);
430 switch(nmhdr
->code
) {
432 *di
->pi
->Devmode
= *di
->dlgdm
;
433 SetWindowLongPtrW(hwnd
, DWLP_MSGRESULT
, PSNRET_NOERROR
);
448 /******************************************************************************
449 * DrvDocumentPropertySheets (wineps.drv.@)
451 LONG WINAPI
DrvDocumentPropertySheets(PROPSHEETUI_INFO
*info
, LPARAM lparam
)
453 DOCUMENTPROPERTYHEADERW
*dph
;
456 TRACE("(info=%p, lparam=%Id)\n", info
, lparam
);
458 dph
= (DOCUMENTPROPERTYHEADERW
*)(info
? info
->lParamInit
: lparam
);
460 if (!(pi
= PSDRV_FindPrinterInfo(dph
->pszPrinterName
))) return ERR_CPSUI_GETLASTERROR
;
462 if (!info
|| info
->Reason
== PROPSHEETUI_REASON_INIT
)
464 /* If dph->fMode == 0, return size of DEVMODE structure */
465 if (!dph
->fMode
|| !dph
->pdmOut
)
467 dph
->cbOut
= pi
->Devmode
->dmPublic
.dmSize
+ pi
->Devmode
->dmPublic
.dmDriverExtra
;
471 /* If DM_MODIFY is set, change settings in accordance with pdmIn */
472 if ((dph
->fMode
& DM_MODIFY
) && dph
->pdmIn
)
474 TRACE("DM_MODIFY set. devIn->dmFields = %08lx\n", dph
->pdmIn
->dmFields
);
475 PSDRV_MergeDevmodes(pi
->Devmode
, dph
->pdmIn
, pi
);
478 /* If DM_PROMPT is set, present modal dialog box */
479 if (dph
->fMode
& DM_PROMPT
)
486 ERR("DM_PROMPT passed with NULL PROPSHEETUI_INFO\n");
487 return ERR_CPSUI_GETLASTERROR
;
490 di
= malloc(sizeof(*di
));
492 return ERR_CPSUI_ALLOCMEM_FAILED
;
493 info
->UserData
= (ULONG_PTR
)di
;
495 di
->dlgdm
= malloc(sizeof(*di
->dlgdm
));
497 return ERR_CPSUI_ALLOCMEM_FAILED
;
499 memset(&psp
, 0, sizeof(psp
));
501 *di
->dlgdm
= *pi
->Devmode
;
502 psp
.dwSize
= sizeof(psp
);
503 psp
.hInstance
= PSDRV_hInstance
;
504 psp
.pszTemplate
= L
"PAPER";
506 psp
.pfnDlgProc
= PSDRV_PaperDlgProc
;
507 psp
.lParam
= (LPARAM
)di
;
509 if (!info
->pfnComPropSheet(info
->hComPropSheet
, CPSFUNC_ADD_PROPSHEETPAGEW
, (LPARAM
)&psp
, 0))
510 return ERR_CPSUI_GETLASTERROR
;
514 if (info
&& info
->Reason
== PROPSHEETUI_REASON_DESTROY
)
517 free(((PSDRV_DLGINFO
*)info
->UserData
)->dlgdm
);
518 free((void *)info
->UserData
);
521 if (!info
|| (info
->Reason
== PROPSHEETUI_REASON_DESTROY
&& lparam
))
523 /* If DM_UPDATE is set, should write settings to environment and initialization file */
524 if (dph
->fMode
& DM_UPDATE
)
525 FIXME("Mode DM_UPDATE. Just do the same as DM_COPY\n");
527 /* If DM_COPY is set, should write settings to pdmOut */
528 if (dph
->pdmOut
&& (dph
->fMode
& (DM_COPY
| DM_UPDATE
)))
529 memcpy(dph
->pdmOut
, &pi
->Devmode
->dmPublic
,
530 pi
->Devmode
->dmPublic
.dmSize
+ pi
->Devmode
->dmPublic
.dmDriverExtra
);
536 /******************************************************************************
537 * DrvDeviceCapabilities (wineps.drv.@)
539 DWORD WINAPI
DrvDeviceCapabilities(HANDLE printer
, WCHAR
*device_name
, WORD capability
,
540 void *output
, DEVMODEW
*devmode
)
546 TRACE("%s %u, %p, %p\n", debugstr_w(device_name
), capability
, output
, devmode
);
548 if (!(pi
= PSDRV_FindPrinterInfo(device_name
))) {
549 ERR("no printer info for %s, return 0!\n", debugstr_w(device_name
));
553 lpdm
= &pi
->Devmode
->dmPublic
;
554 if (devmode
) lpdm
= devmode
;
564 LIST_FOR_EACH_ENTRY(ps
, &pi
->ppd
->PageSizes
, PAGESIZE
, entry
)
566 TRACE("DC_PAPERS: %u\n", ps
->WinPage
);
568 if (output
!= NULL
) *wp
++ = ps
->WinPage
;
580 LIST_FOR_EACH_ENTRY(ps
, &pi
->ppd
->PageSizes
, PAGESIZE
, entry
)
582 TRACE("DC_PAPERSIZE: %f x %f\n", ps
->PaperDimension
->x
, ps
->PaperDimension
->y
);
584 if (output
!= NULL
) {
585 pt
->x
= paper_size_from_points( ps
->PaperDimension
->x
);
586 pt
->y
= paper_size_from_points( ps
->PaperDimension
->y
);
600 LIST_FOR_EACH_ENTRY(ps
, &pi
->ppd
->PageSizes
, PAGESIZE
, entry
)
602 TRACE("DC_PAPERNAMES: %s\n", debugstr_w(ps
->FullName
));
604 if (output
!= NULL
) {
605 lstrcpynW(cp
, ps
->FullName
, 64);
614 ret
= pi
->ppd
->LandscapeOrientation
? pi
->ppd
->LandscapeOrientation
: 90;
623 LIST_FOR_EACH_ENTRY( slot
, &pi
->ppd
->InputSlots
, INPUTSLOT
, entry
)
627 *wp
++ = slot
->WinBin
;
639 LIST_FOR_EACH_ENTRY( slot
, &pi
->ppd
->InputSlots
, INPUTSLOT
, entry
)
644 MultiByteToWideChar(CP_ACP
, 0, slot
->FullName
, -1, cp
, 24);
653 FIXME("DC_BINADJUST: stub.\n");
654 ret
= DCBA_FACEUPNONE
;
657 case DC_ENUMRESOLUTIONS
:
663 LIST_FOR_EACH_ENTRY(res
, &pi
->ppd
->Resolutions
, RESOLUTION
, entry
)
677 /* Windows returns 9999 too */
679 TRACE("DC_COPIES: returning 9999\n");
684 ret
= lpdm
->dmDriverVersion
;
687 case DC_DATATYPE_PRODUCED
:
688 FIXME("DATA_TYPE_PRODUCED: stub.\n");
689 ret
= -1; /* simulate that the driver supports 'RAW' */
694 if(pi
->ppd
->DefaultDuplex
&& pi
->ppd
->DefaultDuplex
->WinDuplex
!= 0)
696 TRACE("DC_DUPLEX: returning %ld\n", ret
);
699 case DC_EMF_COMPLIANT
:
700 FIXME("DC_EMF_COMPLIANT: stub.\n");
701 ret
= -1; /* simulate that the driver do not support EMF */
705 ret
= lpdm
->dmDriverExtra
;
709 ret
= lpdm
->dmFields
;
712 case DC_FILEDEPENDENCIES
:
713 FIXME("DC_FILEDEPENDENCIES: stub.\n");
722 LIST_FOR_EACH_ENTRY(ps
, &pi
->ppd
->PageSizes
, PAGESIZE
, entry
)
724 if (ps
->PaperDimension
->x
> x
) x
= ps
->PaperDimension
->x
;
725 if (ps
->PaperDimension
->y
> y
) y
= ps
->PaperDimension
->y
;
727 ret
= MAKELONG( paper_size_from_points(x
), paper_size_from_points(y
) );
734 float x
= 1e6
, y
= 1e6
;
736 LIST_FOR_EACH_ENTRY(ps
, &pi
->ppd
->PageSizes
, PAGESIZE
, entry
)
738 if (ps
->PaperDimension
->x
< x
) x
= ps
->PaperDimension
->x
;
739 if (ps
->PaperDimension
->y
< y
) y
= ps
->PaperDimension
->y
;
741 ret
= MAKELONG( paper_size_from_points(x
), paper_size_from_points(y
) );
750 FIXME("DC_TRUETYPE: stub\n");
755 ret
= lpdm
->dmSpecVersion
;
758 /* We'll just return false here, very few printers can collate anyway */
760 TRACE("DC_COLLATE: returning FALSE\n");
764 /* Printer supports colour printing - 1 if yes, 0 if no (Win2k/XP only) */
766 ret
= pi
->ppd
->ColorDevice
!= CD_False
;
769 /* Identification number of the printer manufacturer for use with ICM (Win9x only) */
770 case DC_MANUFACTURER
:
771 FIXME("DC_MANUFACTURER: stub\n");
775 /* Identification number of the printer model for use with ICM (Win9x only) */
777 FIXME("DC_MODEL: stub\n");
781 /* Nonzero if the printer supports stapling, zero otherwise (Win2k/XP only) */
782 case DC_STAPLE
: /* WINVER >= 0x0500 */
783 FIXME("DC_STAPLE: stub\n");
787 /* Returns an array of 64-character string buffers containing the names of the paper forms
788 * available for use, unless pOutput is NULL. The return value is the number of paper forms.
791 case DC_MEDIAREADY
: /* WINVER >= 0x0500 */
792 FIXME("DC_MEDIAREADY: stub\n");
796 /* Returns an array of 64-character string buffers containing the names of the supported
797 * media types, unless pOutput is NULL. The return value is the number of supported.
798 * media types (XP only)
800 case DC_MEDIATYPENAMES
: /* WINVER >= 0x0501 */
801 FIXME("DC_MEDIATYPENAMES: stub\n");
805 /* Returns an array of DWORD values which represent the supported media types, unless
806 * pOutput is NULL. The return value is the number of supported media types. (XP only)
808 case DC_MEDIATYPES
: /* WINVER >= 0x0501 */
809 FIXME("DC_MEDIATYPES: stub\n");
813 /* Returns an array of DWORD values, each representing a supported number of document
814 * pages per printed page, unless pOutput is NULL. The return value is the number of
815 * array entries. (Win2k/XP only)
818 FIXME("DC_NUP: stub\n");
822 /* Returns an array of 32-character string buffers containing a list of printer description
823 * languages supported by the printer, unless pOutput is NULL. The return value is
824 * number of array entries. (Win2k/XP only)
826 case DC_PERSONALITY
: /* WINVER >= 0x0500 */
827 FIXME("DC_PERSONALITY: stub\n");
831 /* Returns the amount of printer memory in kilobytes. (Win2k/XP only) */
832 case DC_PRINTERMEM
: /* WINVER >= 0x0500 */
833 FIXME("DC_PRINTERMEM: stub\n");
837 /* Returns the printer's print rate in PRINTRATEUNIT units. (Win2k/XP only) */
838 case DC_PRINTRATE
: /* WINVER >= 0x0500 */
839 FIXME("DC_PRINTRATE: stub\n");
843 /* Returns the printer's print rate in pages per minute. (Win2k/XP only) */
844 case DC_PRINTRATEPPM
: /* WINVER >= 0x0500 */
845 FIXME("DC_PRINTRATEPPM: stub\n");
849 /* Returns the printer rate unit used for DC_PRINTRATE, which is one of
850 * PRINTRATEUNIT_{CPS,IPM,LPM,PPM} (Win2k/XP only)
852 case DC_PRINTRATEUNIT
: /* WINVER >= 0x0500 */
853 FIXME("DC_PRINTRATEUNIT: stub\n");
858 FIXME("Unsupported capability %d\n", capability
);
869 HPROPSHEETPAGE hPages
[10];
872 INT
PSDRV_ExtDeviceModePropSheet(HWND hwnd
, LPSTR lpszDevice
, LPSTR lpszPort
,
875 EDMPS
*ps
= pPropSheet
;
878 psp
->dwSize
= sizeof(psp
);
879 psp
->hInstance
= 0x1234;