Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
210f3e33
Commit
210f3e33
authored
Apr 12, 2012
by
Huw Davies
Committed by
Alexandre Julliard
Apr 12, 2012
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
wineps: Switch to using a Unicode devmode.
parent
0c7a6d89
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
90 additions
and
85 deletions
+90
-85
driver.c
dlls/wineps.drv/driver.c
+59
-10
init.c
dlls/wineps.drv/init.c
+26
-70
psdrv.h
dlls/wineps.drv/psdrv.h
+5
-5
No files found.
dlls/wineps.drv/driver.c
View file @
210f3e33
...
...
@@ -52,8 +52,7 @@ static inline int paper_size_from_points( float size )
* Updates dm1 with some fields from dm2
*
*/
void
PSDRV_MergeDevmodes
(
PSDRV_DEVMODEA
*
dm1
,
PSDRV_DEVMODEA
*
dm2
,
PRINTERINFO
*
pi
)
void
PSDRV_MergeDevmodes
(
PSDRV_DEVMODE
*
dm1
,
PSDRV_DEVMODE
*
dm2
,
PRINTERINFO
*
pi
)
{
/* some sanity checks here on dm2 */
...
...
@@ -183,7 +182,7 @@ void PSDRV_MergeDevmodes(PSDRV_DEVMODEA *dm1, PSDRV_DEVMODEA *dm2,
typedef
struct
{
PRINTERINFO
*
pi
;
PSDRV_DEVMODE
A
*
dlgdm
;
PSDRV_DEVMODE
*
dlgdm
;
}
PSDRV_DLGINFO
;
/****************************************************************
...
...
@@ -320,6 +319,47 @@ static PRINTERINFO *PSDRV_FindPrinterInfoA(LPCSTR name)
return
pi
;
}
/***********************************************************
* DEVMODEdupWtoA
*
* Creates an ascii copy of supplied devmode on the process heap
*
* Copied from dlls/winspool/info.c until full unicodification
*/
static
DEVMODEA
*
DEVMODEdupWtoA
(
const
DEVMODEW
*
dmW
)
{
DEVMODEA
*
dmA
;
DWORD
size
;
BOOL
formname
;
/* there is no pointer dereference here, if your code checking tool complains it's broken */
ptrdiff_t
off_formname
=
(
const
char
*
)
dmW
->
dmFormName
-
(
const
char
*
)
dmW
;
if
(
!
dmW
)
return
NULL
;
formname
=
(
dmW
->
dmSize
>
off_formname
);
size
=
dmW
->
dmSize
-
CCHDEVICENAME
-
(
formname
?
CCHFORMNAME
:
0
);
dmA
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
size
+
dmW
->
dmDriverExtra
);
WideCharToMultiByte
(
CP_ACP
,
0
,
dmW
->
dmDeviceName
,
-
1
,
(
LPSTR
)
dmA
->
dmDeviceName
,
CCHDEVICENAME
,
NULL
,
NULL
);
if
(
!
formname
)
{
memcpy
(
&
dmA
->
dmSpecVersion
,
&
dmW
->
dmSpecVersion
,
dmW
->
dmSize
-
CCHDEVICENAME
*
sizeof
(
WCHAR
)
);
}
else
{
memcpy
(
&
dmA
->
dmSpecVersion
,
&
dmW
->
dmSpecVersion
,
off_formname
-
CCHDEVICENAME
*
sizeof
(
WCHAR
)
);
WideCharToMultiByte
(
CP_ACP
,
0
,
dmW
->
dmFormName
,
-
1
,
(
LPSTR
)
dmA
->
dmFormName
,
CCHFORMNAME
,
NULL
,
NULL
);
memcpy
(
&
dmA
->
dmLogPixels
,
&
dmW
->
dmLogPixels
,
dmW
->
dmSize
-
(
off_formname
+
CCHFORMNAME
*
sizeof
(
WCHAR
))
);
}
dmA
->
dmSize
=
size
;
memcpy
(
(
char
*
)
dmA
+
dmA
->
dmSize
,
(
const
char
*
)
dmW
+
dmW
->
dmSize
,
dmW
->
dmDriverExtra
);
return
dmA
;
}
/******************************************************************
* PSDRV_ExtDeviceMode
*
...
...
@@ -362,12 +402,15 @@ INT PSDRV_ExtDeviceMode(LPSTR lpszDriver, HWND hwnd, LPDEVMODEA lpdmOutput,
/* If dwMode == 0, return size of DEVMODE structure */
if
(
!
dwMode
)
return
pi
->
Devmode
->
dmPublic
.
dmSize
+
pi
->
Devmode
->
dmPublic
.
dmDriverExtra
;
return
pi
->
Devmode
->
dmPublic
.
dmSize
+
pi
->
Devmode
->
dmPublic
.
dmDriverExtra
-
CCHDEVICENAME
-
CCHFORMNAME
;
/* If DM_MODIFY is set, change settings in accordance with lpdmInput */
if
((
dwMode
&
DM_MODIFY
)
&&
lpdmInput
)
{
if
((
dwMode
&
DM_MODIFY
)
&&
lpdmInput
)
{
DEVMODEW
*
dmW
=
GdiConvertToDevmodeW
(
lpdmInput
);
TRACE
(
"DM_MODIFY set. devIn->dmFields = %08x
\n
"
,
lpdmInput
->
dmFields
);
PSDRV_MergeDevmodes
(
pi
->
Devmode
,
(
PSDRV_DEVMODEA
*
)
lpdmInput
,
pi
);
if
(
dmW
)
PSDRV_MergeDevmodes
(
pi
->
Devmode
,
(
PSDRV_DEVMODE
*
)
dmW
,
pi
);
HeapFree
(
GetProcessHeap
(),
0
,
dmW
);
}
/* If DM_PROMPT is set, present modal dialog box */
...
...
@@ -377,7 +420,7 @@ INT PSDRV_ExtDeviceMode(LPSTR lpszDriver, HWND hwnd, LPDEVMODEA lpdmOutput,
PROPSHEETPAGEW
psp
;
PROPSHEETHEADERW
psh
;
PSDRV_DLGINFO
di
;
PSDRV_DEVMODE
A
dlgdm
;
PSDRV_DEVMODE
dlgdm
;
static
const
WCHAR
PAPERW
[]
=
{
'P'
,
'A'
,
'P'
,
'E'
,
'R'
,
'\0'
};
static
const
WCHAR
SetupW
[]
=
{
'S'
,
'e'
,
't'
,
'u'
,
'p'
,
'\0'
};
...
...
@@ -417,7 +460,11 @@ INT PSDRV_ExtDeviceMode(LPSTR lpszDriver, HWND hwnd, LPDEVMODEA lpdmOutput,
/* If DM_COPY is set, should write settings to lpdmOutput */
if
((
dwMode
&
DM_COPY
)
||
(
dwMode
&
DM_UPDATE
))
{
if
(
lpdmOutput
)
memcpy
(
lpdmOutput
,
pi
->
Devmode
,
pi
->
Devmode
->
dmPublic
.
dmSize
+
pi
->
Devmode
->
dmPublic
.
dmDriverExtra
);
{
DEVMODEA
*
dmA
=
DEVMODEdupWtoA
(
&
pi
->
Devmode
->
dmPublic
);
if
(
dmA
)
memcpy
(
lpdmOutput
,
dmA
,
dmA
->
dmSize
+
dmA
->
dmDriverExtra
);
HeapFree
(
GetProcessHeap
(),
0
,
dmA
);
}
else
FIXME
(
"lpdmOutput is NULL what should we do??
\n
"
);
}
...
...
@@ -443,7 +490,7 @@ DWORD PSDRV_DeviceCapabilities(LPSTR lpszDriver, LPCSTR lpszDevice, LPCSTR lpszP
WORD
fwCapability
,
LPSTR
lpszOutput
,
LPDEVMODEA
lpDevMode
)
{
PRINTERINFO
*
pi
;
DEVMODE
A
*
lpdm
;
DEVMODE
W
*
lpdm
;
DWORD
ret
;
pi
=
PSDRV_FindPrinterInfoA
(
lpszDevice
);
...
...
@@ -456,7 +503,8 @@ DWORD PSDRV_DeviceCapabilities(LPSTR lpszDriver, LPCSTR lpszDevice, LPCSTR lpszP
return
0
;
}
lpdm
=
lpDevMode
?
lpDevMode
:
(
DEVMODEA
*
)
pi
->
Devmode
;
lpdm
=
&
pi
->
Devmode
->
dmPublic
;
if
(
lpDevMode
)
lpdm
=
GdiConvertToDevmodeW
(
lpDevMode
);
switch
(
fwCapability
)
{
...
...
@@ -758,6 +806,7 @@ DWORD PSDRV_DeviceCapabilities(LPSTR lpszDriver, LPCSTR lpszDevice, LPCSTR lpszP
ret
=
-
1
;
}
if
(
lpDevMode
)
HeapFree
(
GetProcessHeap
(),
0
,
lpdm
);
return
ret
;
}
...
...
dlls/wineps.drv/init.c
View file @
210f3e33
...
...
@@ -50,14 +50,14 @@ WINE_DEFAULT_DEBUG_CHANNEL(psdrv);
static
void
*
cupshandle
=
NULL
;
#endif
static
const
PSDRV_DEVMODE
A
DefaultDevmode
=
static
const
PSDRV_DEVMODE
DefaultDevmode
=
{
{
/* dmPublic */
/* dmDeviceName */
"Wine PostScript Driver"
,
/* dmDeviceName */
{
'W'
,
'i'
,
'n'
,
'e'
,
' '
,
'P'
,
'o'
,
's'
,
't'
,
'S'
,
'c'
,
'r'
,
'i'
,
'p'
,
't'
,
' '
,
'D'
,
'r'
,
'i'
,
'v'
,
'e'
,
'r'
,
0
}
,
/* dmSpecVersion */
0x30a
,
/* dmDriverVersion */
0x001
,
/* dmSize */
sizeof
(
DEVMODE
A
),
/* dmDriverExtra */
sizeof
(
PSDRV_DEVMODE
A
)
-
sizeof
(
DEVMODEA
),
/* dmSize */
sizeof
(
DEVMODE
W
),
/* dmDriverExtra */
sizeof
(
PSDRV_DEVMODE
)
-
sizeof
(
DEVMODEW
),
/* dmFields */
DM_ORIENTATION
|
DM_PAPERSIZE
|
DM_SCALE
|
DM_COPIES
|
DM_DEFAULTSOURCE
|
DM_COLOR
|
DM_YRESOLUTION
|
DM_TTOPTION
,
...
...
@@ -78,7 +78,7 @@ static const PSDRV_DEVMODEA DefaultDevmode =
/* dmYResolution */
0
,
/* dmTTOption */
DMTT_SUBDEV
,
/* dmCollate */
0
,
/* dmFormName */
""
,
/* dmFormName */
{}
,
/* dmUnusedPadding */
0
,
/* dmBitsPerPel */
0
,
/* dmPelsWidth */
0
,
...
...
@@ -257,46 +257,6 @@ static void PSDRV_UpdateDevCaps( PSDRV_PDEVICE *physDev )
physDev
->
horzRes
,
physDev
->
vertRes
);
}
/***********************************************************
* DEVMODEdupWtoA
*
* Creates an ascii copy of supplied devmode on the process heap
*
* Copied from dlls/winspool/info.c until full unicodification
*/
static
LPDEVMODEA
DEVMODEdupWtoA
(
const
DEVMODEW
*
dmW
)
{
LPDEVMODEA
dmA
;
DWORD
size
;
BOOL
Formname
;
/* there is no pointer dereference here, if your code checking tool complains it's broken */
ptrdiff_t
off_formname
=
(
const
char
*
)
dmW
->
dmFormName
-
(
const
char
*
)
dmW
;
if
(
!
dmW
)
return
NULL
;
Formname
=
(
dmW
->
dmSize
>
off_formname
);
size
=
dmW
->
dmSize
-
CCHDEVICENAME
-
(
Formname
?
CCHFORMNAME
:
0
);
dmA
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
size
+
dmW
->
dmDriverExtra
);
WideCharToMultiByte
(
CP_ACP
,
0
,
dmW
->
dmDeviceName
,
-
1
,
(
LPSTR
)
dmA
->
dmDeviceName
,
CCHDEVICENAME
,
NULL
,
NULL
);
if
(
!
Formname
)
{
memcpy
(
&
dmA
->
dmSpecVersion
,
&
dmW
->
dmSpecVersion
,
dmW
->
dmSize
-
CCHDEVICENAME
*
sizeof
(
WCHAR
));
}
else
{
memcpy
(
&
dmA
->
dmSpecVersion
,
&
dmW
->
dmSpecVersion
,
off_formname
-
CCHDEVICENAME
*
sizeof
(
WCHAR
));
WideCharToMultiByte
(
CP_ACP
,
0
,
dmW
->
dmFormName
,
-
1
,
(
LPSTR
)
dmA
->
dmFormName
,
CCHFORMNAME
,
NULL
,
NULL
);
memcpy
(
&
dmA
->
dmLogPixels
,
&
dmW
->
dmLogPixels
,
dmW
->
dmSize
-
(
off_formname
+
CCHFORMNAME
*
sizeof
(
WCHAR
)));
}
dmA
->
dmSize
=
size
;
memcpy
((
char
*
)
dmA
+
dmA
->
dmSize
,
(
const
char
*
)
dmW
+
dmW
->
dmSize
,
dmW
->
dmDriverExtra
);
return
dmA
;
}
static
PSDRV_PDEVICE
*
create_psdrv_physdev
(
PRINTERINFO
*
pi
)
{
PSDRV_PDEVICE
*
physDev
;
...
...
@@ -304,7 +264,7 @@ static PSDRV_PDEVICE *create_psdrv_physdev( PRINTERINFO *pi )
physDev
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
sizeof
(
*
physDev
)
);
if
(
!
physDev
)
return
NULL
;
physDev
->
Devmode
=
HeapAlloc
(
GetProcessHeap
(),
0
,
sizeof
(
PSDRV_DEVMODE
A
)
);
physDev
->
Devmode
=
HeapAlloc
(
GetProcessHeap
(),
0
,
sizeof
(
PSDRV_DEVMODE
)
);
if
(
!
physDev
->
Devmode
)
{
HeapFree
(
GetProcessHeap
(),
0
,
physDev
);
...
...
@@ -349,11 +309,8 @@ static BOOL PSDRV_CreateDC( PHYSDEV *pdev, LPCWSTR driver, LPCWSTR device,
if
(
output
&&
*
output
)
physDev
->
job
.
output
=
strdupW
(
output
);
if
(
initData
)
{
DEVMODEA
*
devmodeA
=
DEVMODEdupWtoA
(
initData
);
PSDRV_MergeDevmodes
(
physDev
->
Devmode
,
(
PSDRV_DEVMODEA
*
)
devmodeA
,
pi
);
HeapFree
(
GetProcessHeap
(),
0
,
devmodeA
);
}
if
(
initData
)
PSDRV_MergeDevmodes
(
physDev
->
Devmode
,
(
PSDRV_DEVMODE
*
)
initData
,
pi
);
PSDRV_UpdateDevCaps
(
physDev
);
SelectObject
(
(
*
pdev
)
->
hdc
,
PSDRV_DefaultFont
);
...
...
@@ -406,10 +363,9 @@ static HDC PSDRV_ResetDC( PHYSDEV dev, const DEVMODEW *lpInitData )
{
PSDRV_PDEVICE
*
physDev
=
get_psdrv_dev
(
dev
);
if
(
lpInitData
)
{
DEVMODEA
*
devmodeA
=
DEVMODEdupWtoA
(
lpInitData
);
PSDRV_MergeDevmodes
(
physDev
->
Devmode
,
(
PSDRV_DEVMODEA
*
)
devmodeA
,
physDev
->
pi
);
HeapFree
(
GetProcessHeap
(),
0
,
devmodeA
);
if
(
lpInitData
)
{
PSDRV_MergeDevmodes
(
physDev
->
Devmode
,
(
PSDRV_DEVMODE
*
)
lpInitData
,
physDev
->
pi
);
PSDRV_UpdateDevCaps
(
physDev
);
}
return
dev
->
hdc
;
...
...
@@ -554,18 +510,18 @@ static PRINTER_ENUM_VALUESA *load_font_sub_table( HANDLE printer, DWORD *num_ent
return
table
;
}
static
PSDRV_DEVMODE
A
*
get_printer_devmode
(
HANDLE
printer
)
static
PSDRV_DEVMODE
*
get_printer_devmode
(
HANDLE
printer
)
{
DWORD
needed
,
dm_size
;
BOOL
res
;
PRINTER_INFO_9
A
*
info
;
PSDRV_DEVMODE
A
*
dm
;
PRINTER_INFO_9
W
*
info
;
PSDRV_DEVMODE
*
dm
;
GetPrinter
A
(
printer
,
9
,
NULL
,
0
,
&
needed
);
GetPrinter
W
(
printer
,
9
,
NULL
,
0
,
&
needed
);
if
(
GetLastError
()
!=
ERROR_INSUFFICIENT_BUFFER
)
return
NULL
;
info
=
HeapAlloc
(
PSDRV_Heap
,
0
,
needed
);
res
=
GetPrinter
A
(
printer
,
9
,
(
BYTE
*
)
info
,
needed
,
&
needed
);
res
=
GetPrinter
W
(
printer
,
9
,
(
BYTE
*
)
info
,
needed
,
&
needed
);
if
(
!
res
||
!
info
->
pDevMode
)
{
HeapFree
(
PSDRV_Heap
,
0
,
info
);
...
...
@@ -580,14 +536,14 @@ static PSDRV_DEVMODEA *get_printer_devmode( HANDLE printer )
return
NULL
;
}
dm
=
(
PSDRV_DEVMODE
A
*
)
info
;
dm
=
(
PSDRV_DEVMODE
*
)
info
;
memmove
(
dm
,
info
->
pDevMode
,
dm_size
);
return
dm
;
}
static
PSDRV_DEVMODE
A
*
get_devmode
(
HANDLE
printer
,
const
char
*
nameA
,
BOOL
*
is_default
)
static
PSDRV_DEVMODE
*
get_devmode
(
HANDLE
printer
,
const
WCHAR
*
name
,
BOOL
*
is_default
)
{
PSDRV_DEVMODE
A
*
dm
=
get_printer_devmode
(
printer
);
PSDRV_DEVMODE
*
dm
=
get_printer_devmode
(
printer
);
*
is_default
=
FALSE
;
...
...
@@ -603,18 +559,18 @@ static PSDRV_DEVMODEA *get_devmode( HANDLE printer, const char *nameA, BOOL *is_
if
(
dm
)
{
*
dm
=
DefaultDevmode
;
lstrcpyn
A
((
LPSTR
)
dm
->
dmPublic
.
dmDeviceName
,
nameA
,
CCHDEVICENAME
);
lstrcpyn
W
(
(
WCHAR
*
)
dm
->
dmPublic
.
dmDeviceName
,
name
,
CCHDEVICENAME
);
*
is_default
=
TRUE
;
}
return
dm
;
}
static
BOOL
set_devmode
(
HANDLE
printer
,
PSDRV_DEVMODE
A
*
dm
)
static
BOOL
set_devmode
(
HANDLE
printer
,
PSDRV_DEVMODE
*
dm
)
{
PRINTER_INFO_9
A
info
;
PRINTER_INFO_9
W
info
;
info
.
pDevMode
=
&
dm
->
dmPublic
;
return
SetPrinter
A
(
printer
,
9
,
(
BYTE
*
)
&
info
,
0
);
return
SetPrinter
W
(
printer
,
9
,
(
BYTE
*
)
&
info
,
0
);
}
static
struct
list
printer_list
=
LIST_INIT
(
printer_list
);
...
...
@@ -659,7 +615,7 @@ PRINTERINFO *PSDRV_FindPrinterInfo(LPCWSTR name)
nameA
=
HeapAlloc
(
GetProcessHeap
(),
0
,
len
);
WideCharToMultiByte
(
CP_ACP
,
0
,
name
,
-
1
,
nameA
,
len
,
NULL
,
NULL
);
pi
->
Devmode
=
get_devmode
(
hPrinter
,
name
A
,
&
using_default_devmode
);
pi
->
Devmode
=
get_devmode
(
hPrinter
,
name
,
&
using_default_devmode
);
if
(
!
pi
->
Devmode
)
goto
closeprinter
;
#ifdef SONAME_LIBCUPS
...
...
@@ -761,7 +717,7 @@ PRINTERINFO *PSDRV_FindPrinterInfo(LPCWSTR name)
if
(
GetLocaleInfoW
(
LOCALE_USER_DEFAULT
,
LOCALE_IPAPERSIZE
|
LOCALE_RETURN_NUMBER
,
(
LPWSTR
)
&
papersize
,
sizeof
(
papersize
)
/
sizeof
(
WCHAR
)))
{
PSDRV_DEVMODE
A
dm
;
PSDRV_DEVMODE
dm
;
memset
(
&
dm
,
0
,
sizeof
(
dm
));
dm
.
dmPublic
.
dmFields
=
DM_PAPERSIZE
;
dm
.
dmPublic
.
u1
.
s1
.
dmPaperSize
=
papersize
;
...
...
@@ -772,7 +728,7 @@ PRINTERINFO *PSDRV_FindPrinterInfo(LPCWSTR name)
}
if
(
pi
->
ppd
->
DefaultPageSize
)
{
/* We'll let the ppd override the devmode */
PSDRV_DEVMODE
A
dm
;
PSDRV_DEVMODE
dm
;
memset
(
&
dm
,
0
,
sizeof
(
dm
));
dm
.
dmPublic
.
dmFields
=
DM_PAPERSIZE
;
dm
.
dmPublic
.
u1
.
s1
.
dmPaperSize
=
pi
->
ppd
->
DefaultPageSize
->
WinPage
;
...
...
dlls/wineps.drv/psdrv.h
View file @
210f3e33
...
...
@@ -213,7 +213,7 @@ typedef struct {
}
PPD
;
typedef
struct
{
DEVMODE
A
dmPublic
;
DEVMODE
W
dmPublic
;
struct
_tagdocprivate
{
int
dummy
;
}
dmDocPrivate
;
...
...
@@ -227,14 +227,14 @@ numInstalledOptions of OPTIONs
*/
}
PSDRV_DEVMODE
A
;
}
PSDRV_DEVMODE
;
typedef
struct
{
struct
list
entry
;
WCHAR
*
friendly_name
;
PPD
*
ppd
;
PSDRV_DEVMODE
A
*
Devmode
;
PSDRV_DEVMODE
*
Devmode
;
FONTFAMILY
*
Fonts
;
PPRINTER_ENUM_VALUESA
FontSubTable
;
DWORD
FontSubTableSize
;
...
...
@@ -356,7 +356,7 @@ typedef struct
PSCOLOR
bkColor
;
PSCOLOR
inkColor
;
/* Last colour set */
JOB
job
;
PSDRV_DEVMODE
A
*
Devmode
;
PSDRV_DEVMODE
*
Devmode
;
PRINTERINFO
*
pi
;
SIZE
PageSize
;
/* Physical page size in device units */
RECT
ImageableArea
;
/* Imageable area in device units */
...
...
@@ -451,7 +451,7 @@ extern INT PSDRV_StartDoc( PHYSDEV dev, const DOCINFOW *doc ) DECLSPEC_HIDDEN;
extern
BOOL
PSDRV_StrokeAndFillPath
(
PHYSDEV
dev
)
DECLSPEC_HIDDEN
;
extern
BOOL
PSDRV_StrokePath
(
PHYSDEV
dev
)
DECLSPEC_HIDDEN
;
extern
void
PSDRV_MergeDevmodes
(
PSDRV_DEVMODE
A
*
dm1
,
PSDRV_DEVMODEA
*
dm2
,
extern
void
PSDRV_MergeDevmodes
(
PSDRV_DEVMODE
*
dm1
,
PSDRV_DEVMODE
*
dm2
,
PRINTERINFO
*
pi
)
DECLSPEC_HIDDEN
;
extern
BOOL
PSDRV_GetFontMetrics
(
void
)
DECLSPEC_HIDDEN
;
extern
PPD
*
PSDRV_ParsePPD
(
char
*
fname
)
DECLSPEC_HIDDEN
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment