Module: wine Branch: master Commit: cdb0be727240470568cf164071e83be488bf9d7c URL: https://gitlab.winehq.org/wine/wine/-/commit/cdb0be727240470568cf164071e83be...
Author: Piotr Caban piotr@codeweavers.com Date: Thu Apr 27 18:29:56 2023 +0200
wineps: Handle EMRI_DEVMODE record in spool files.
---
dlls/wineps.drv/init.c | 2 +- dlls/wineps.drv/printproc.c | 26 +++++++++++++++++++++++++- dlls/wineps.drv/psdrv.h | 1 + 3 files changed, 27 insertions(+), 2 deletions(-)
diff --git a/dlls/wineps.drv/init.c b/dlls/wineps.drv/init.c index 01cfa07e591..39c7e2a4a7f 100644 --- a/dlls/wineps.drv/init.c +++ b/dlls/wineps.drv/init.c @@ -436,7 +436,7 @@ static BOOL CDECL PSDRV_DeleteDC( PHYSDEV dev ) /********************************************************************** * ResetDC (WINEPS.@) */ -static BOOL CDECL PSDRV_ResetDC( PHYSDEV dev, const DEVMODEW *lpInitData ) +BOOL CDECL PSDRV_ResetDC( PHYSDEV dev, const DEVMODEW *lpInitData ) { PSDRV_PDEVICE *physDev = get_psdrv_dev( dev );
diff --git a/dlls/wineps.drv/printproc.c b/dlls/wineps.drv/printproc.c index 9b96b2c1465..9786f5f83df 100644 --- a/dlls/wineps.drv/printproc.c +++ b/dlls/wineps.drv/printproc.c @@ -3228,6 +3228,30 @@ BOOL WINAPI PrintDocumentOnPrintProcessor(HANDLE pp, WCHAR *doc_name)
switch (record.ulID) { + case EMRI_DEVMODE: + { + DEVMODEW *devmode = NULL; + + if (record.cjSize) + { + devmode = malloc(record.cjSize); + if (!devmode) + goto cleanup; + ret = ReadPrinter(spool_data, devmode, record.cjSize, &r); + if (ret && r != record.cjSize) + { + SetLastError(ERROR_INVALID_DATA); + ret = FALSE; + } + } + + if (ret) + ret = PSDRV_ResetDC(&data->pdev->dev, devmode); + free(devmode); + if (!ret) + goto cleanup; + break; + } case EMRI_METAFILE_DATA: pos.QuadPart = record.cjSize; ret = SeekPrinter(spool_data, pos, NULL, FILE_CURRENT, FALSE); @@ -3242,7 +3266,7 @@ BOOL WINAPI PrintDocumentOnPrintProcessor(HANDLE pp, WCHAR *doc_name) { cur.QuadPart += record.cjSize; ret = ReadPrinter(spool_data, &pos, sizeof(pos), &r); - if (r != sizeof(pos)) + if (ret && r != sizeof(pos)) { SetLastError(ERROR_INVALID_DATA); ret = FALSE; diff --git a/dlls/wineps.drv/psdrv.h b/dlls/wineps.drv/psdrv.h index 81cb0206e7e..bfa2807ce6f 100644 --- a/dlls/wineps.drv/psdrv.h +++ b/dlls/wineps.drv/psdrv.h @@ -467,6 +467,7 @@ extern INT CDECL PSDRV_StartDoc( PHYSDEV dev, const DOCINFOW *doc ) DECLSPEC_HID extern BOOL CDECL PSDRV_StrokeAndFillPath( PHYSDEV dev ) DECLSPEC_HIDDEN; extern BOOL CDECL PSDRV_StrokePath( PHYSDEV dev ) DECLSPEC_HIDDEN;
+extern BOOL CDECL PSDRV_ResetDC( PHYSDEV dev, const DEVMODEW *lpInitData ) DECLSPEC_HIDDEN; extern void PSDRV_MergeDevmodes(PSDRV_DEVMODE *dm1, const PSDRV_DEVMODE *dm2, PRINTERINFO *pi) DECLSPEC_HIDDEN; extern BOOL PSDRV_GetFontMetrics(void) DECLSPEC_HIDDEN;