From: Piotr Caban piotr@codeweavers.com
--- dlls/wineps.drv/init.c | 4 ++-- dlls/wineps.drv/printproc.c | 24 ++++++++++++++++++++++++ dlls/wineps.drv/psdrv.h | 3 +++ 3 files changed, 29 insertions(+), 2 deletions(-)
diff --git a/dlls/wineps.drv/init.c b/dlls/wineps.drv/init.c index 1fc861dc924..779abf1c98b 100644 --- a/dlls/wineps.drv/init.c +++ b/dlls/wineps.drv/init.c @@ -338,8 +338,8 @@ static void PSDRV_UpdateDevCaps( PSDRV_PDEVICE *physDev ) physDev->horzRes, physDev->vertRes); }
-static PSDRV_PDEVICE *create_psdrv_physdev( HDC hdc, const WCHAR *device, - const PSDRV_DEVMODE *devmode ) +PSDRV_PDEVICE *create_psdrv_physdev( HDC hdc, const WCHAR *device, + const PSDRV_DEVMODE *devmode ) { PRINTERINFO *pi = PSDRV_FindPrinterInfo( device ); PSDRV_PDEVICE *pdev; diff --git a/dlls/wineps.drv/printproc.c b/dlls/wineps.drv/printproc.c index b7b4749afcd..67a9dfd9ce8 100644 --- a/dlls/wineps.drv/printproc.c +++ b/dlls/wineps.drv/printproc.c @@ -24,6 +24,8 @@ #include <winspool.h> #include <ddk/winsplp.h>
+#include "psdrv.h" + #include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(psdrv); @@ -37,6 +39,7 @@ struct pp_data HANDLE hport; WCHAR *doc_name; WCHAR *out_file; + PSDRV_PDEVICE *pdev; };
typedef enum @@ -215,6 +218,7 @@ HANDLE WINAPI OpenPrintProcessor(WCHAR *port, PRINTPROCESSOROPENDATA *open_data) { struct pp_data *data; HANDLE hport; + HDC hdc;
TRACE("%s, %p\n", debugstr_w(port), open_data);
@@ -239,6 +243,23 @@ HANDLE WINAPI OpenPrintProcessor(WCHAR *port, PRINTPROCESSOROPENDATA *open_data) data->hport = hport; data->doc_name = wcsdup(open_data->pDocumentName); data->out_file = wcsdup(open_data->pOutputFile); + + hdc = CreateCompatibleDC(NULL); + if (!hdc) + { + LocalFree(data); + return NULL; + } + SetGraphicsMode(hdc, GM_ADVANCED); + data->pdev = create_psdrv_physdev(hdc, open_data->pPrinterName, + (const PSDRV_DEVMODE *)open_data->pDevMode); + if (!data->pdev) + { + DeleteDC(hdc); + LocalFree(data); + return NULL; + } + data->pdev->dev.hdc = hdc; return (HANDLE)data; }
@@ -368,6 +389,9 @@ BOOL WINAPI ClosePrintProcessor(HANDLE pp) ClosePrinter(data->hport); free(data->doc_name); free(data->out_file); + DeleteDC(data->pdev->dev.hdc); + HeapFree(GetProcessHeap(), 0, data->pdev->Devmode); + HeapFree(GetProcessHeap(), 0, data->pdev);
memset(data, 0, sizeof(*data)); LocalFree(data); diff --git a/dlls/wineps.drv/psdrv.h b/dlls/wineps.drv/psdrv.h index 153601d4c86..9817128fc70 100644 --- a/dlls/wineps.drv/psdrv.h +++ b/dlls/wineps.drv/psdrv.h @@ -393,6 +393,9 @@ static inline PSDRV_PDEVICE *get_psdrv_dev( PHYSDEV dev ) return (PSDRV_PDEVICE *)dev; }
+extern PSDRV_PDEVICE *create_psdrv_physdev( HDC hdc, const WCHAR *device, + const PSDRV_DEVMODE *devmode ) DECLSPEC_HIDDEN; + /* * Every glyph name in the Adobe Glyph List and the 35 core PostScript fonts */