From a4c3ed02ee11b00d306e3876c25fa42bcd0a43d0 Mon Sep 17 00:00:00 2001 From: Huw Davies Date: Fri, 15 Nov 2002 00:02:13 +0000 Subject: [PATCH] Implemented Escapes *_PATH and POSTSCRIPT_IGNORE. --- dlls/wineps/brush.c | 3 ++ dlls/wineps/escape.c | 82 ++++++++++++++++++++++++++++++++++++++--- dlls/wineps/graphics.c | 3 ++ dlls/wineps/ps.c | 10 ++++- dlls/wineps/psdrv.h | 3 ++ include/wine/wingdi16.h | 21 +++++++++++ 6 files changed, 115 insertions(+), 7 deletions(-) diff --git a/dlls/wineps/brush.c b/dlls/wineps/brush.c index 849d25bdac6..eb656744abe 100644 --- a/dlls/wineps/brush.c +++ b/dlls/wineps/brush.c @@ -134,6 +134,9 @@ BOOL PSDRV_Brush(PSDRV_PDEVICE *physDev, BOOL EO) LOGBRUSH logbrush; BOOL ret = TRUE; + if(physDev->pathdepth) + return FALSE; + if (!GetObjectA( GetCurrentObject(physDev->hdc,OBJ_BRUSH), sizeof(logbrush), &logbrush )) { ERR("Can't get BRUSHOBJ\n"); diff --git a/dlls/wineps/escape.c b/dlls/wineps/escape.c index f1364928372..8891de713dc 100644 --- a/dlls/wineps/escape.c +++ b/dlls/wineps/escape.c @@ -19,6 +19,7 @@ */ #include "windef.h" #include "wingdi.h" +#include "wine/wingdi16.h" #include "wine/winuser16.h" #include "wownt32.h" #include "psdrv.h" @@ -27,7 +28,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(psdrv); - /********************************************************************** * ExtEscape (WINEPS.@) */ @@ -56,8 +56,13 @@ INT PSDRV_ExtEscape( PSDRV_PDEVICE *physDev, INT nEscape, INT cbInput, LPCVOID i case EXT_DEVICE_CAPS: case SET_BOUNDS: case EPSPRINTING: + case POSTSCRIPT_DATA: case PASSTHROUGH: case POSTSCRIPT_PASSTHROUGH: + case POSTSCRIPT_IGNORE: + case BEGIN_PATH: + case CLIP_TO_PATH: + case END_PATH: return TRUE; default: @@ -192,6 +197,8 @@ INT PSDRV_ExtEscape( PSDRV_PDEVICE *physDev, INT nEscape, INT cbInput, LPCVOID i TRACE("EPS Printing support %sable.\n",epsprint?"en":"dis"); return 1; } + + case POSTSCRIPT_DATA: case PASSTHROUGH: case POSTSCRIPT_PASSTHROUGH: { @@ -204,6 +211,14 @@ INT PSDRV_ExtEscape( PSDRV_PDEVICE *physDev, INT nEscape, INT cbInput, LPCVOID i return WriteSpool16(physDev->job.hJob,((char*)in_data)+2,cbInput-2); } + case POSTSCRIPT_IGNORE: + { + BOOL ret = physDev->job.quiet; + TRACE("POSTSCRIPT_IGNORE %d\n", *(short*)in_data); + physDev->job.quiet = *(short*)in_data; + return ret; + } + case GETSETPRINTORIENT: { /* If lpInData is present, it is a 20 byte structure, first 32 @@ -213,6 +228,63 @@ INT PSDRV_ExtEscape( PSDRV_PDEVICE *physDev, INT nEscape, INT cbInput, LPCVOID i FIXME("GETSETPRINTORIENT not implemented (data %p)!\n",in_data); return 1; } + case BEGIN_PATH: + TRACE("BEGIN_PATH\n"); + if(physDev->pathdepth) + FIXME("Nested paths not yet handled\n"); + return ++physDev->pathdepth; + + case END_PATH: + { + struct PATH_INFO *info = (struct PATH_INFO*)in_data; + + TRACE("END_PATH\n"); + if(!physDev->pathdepth) { + ERR("END_PATH called without a BEIGN_PATH\n"); + return -1; + } + TRACE("RenderMode = %d, FillMode = %d, BkMode = %d\n", + info->RenderMode, info->FillMode, info->BkMode); + switch(info->RenderMode) { + case RENDERMODE_NO_DISPLAY: + PSDRV_WriteClosePath(physDev); /* not sure if this is necessary, but it can't hurt */ + break; + case RENDERMODE_OPEN: + case RENDERMODE_CLOSED: + default: + FIXME("END_PATH: RenderMode %d, not yet supported\n", info->RenderMode); + break; + } + return --physDev->pathdepth; + } + + case CLIP_TO_PATH: + { + WORD mode = *(WORD*)in_data; + + switch(mode) { + case CLIP_SAVE: + TRACE("CLIP_TO_PATH: CLIP_SAVE\n"); + PSDRV_WriteGSave(physDev); + return 1; + case CLIP_RESTORE: + TRACE("CLIP_TO_PATH: CLIP_RESTORE\n"); + PSDRV_WriteGRestore(physDev); + return 1; + case CLIP_INCLUSIVE: + TRACE("CLIP_TO_PATH: CLIP_INCLUSIVE\n"); + /* FIXME to clip or eoclip ? (see PATH_INFO.FillMode) */ + PSDRV_WriteClip(physDev); + return 1; + case CLIP_EXCLUSIVE: + FIXME("CLIP_EXCLUSIVE: not implemented\n"); + return 0; + default: + FIXME("Unknown CLIP_TO_PATH mode %d\n", mode); + return 0; + } + return 0; + } default: FIXME("Unimplemented code 0x%x\n", nEscape); return 0; @@ -288,6 +360,7 @@ INT PSDRV_StartDoc( PSDRV_PDEVICE *physDev, const DOCINFOA *doc ) */ INT PSDRV_EndDoc( PSDRV_PDEVICE *physDev ) { + INT ret = 1; if(!physDev->job.hJob) { FIXME("hJob == 0. Now what?\n"); return 0; @@ -297,13 +370,12 @@ INT PSDRV_EndDoc( PSDRV_PDEVICE *physDev ) WARN("Somebody forgot a EndPage\n"); PSDRV_EndPage( physDev ); } - if(!PSDRV_WriteFooter( physDev )) - return 0; + PSDRV_WriteFooter( physDev ); if( CloseJob16( physDev->job.hJob ) == SP_ERROR ) { WARN("CloseJob error\n"); - return 0; + ret = 0; } physDev->job.hJob = 0; - return 1; + return ret; } diff --git a/dlls/wineps/graphics.c b/dlls/wineps/graphics.c index fd272feebd8..f9f39a59224 100644 --- a/dlls/wineps/graphics.c +++ b/dlls/wineps/graphics.c @@ -361,6 +361,9 @@ COLORREF PSDRV_SetPixel( PSDRV_PDEVICE *physDev, INT x, INT y, COLORREF color ) */ VOID PSDRV_DrawLine( PSDRV_PDEVICE *physDev ) { + if(physDev->pathdepth) + return; + if (physDev->pen.style == PS_NULL) PSDRV_WriteNewPath(physDev); else diff --git a/dlls/wineps/ps.c b/dlls/wineps/ps.c index b8904e352c6..8c072fca1fc 100644 --- a/dlls/wineps/ps.c +++ b/dlls/wineps/ps.c @@ -53,7 +53,8 @@ static char psprolog[] = " r cvi gap idiv gap mul\n" " {t moveto 0 b t sub rlineto}\n" " for\n" -"} bind def\n"; +"} bind def\n" +"/B {pop pop pop pop} def\n"; static char psbeginsetup[] = "%%BeginSetup\n"; @@ -191,9 +192,14 @@ static char psarraydef[] = int PSDRV_WriteSpool(PSDRV_PDEVICE *physDev, LPSTR lpData, WORD cch) { + if(physDev->job.quiet) { + TRACE("ignoring output\n"); + return 0; + } + if(physDev->job.OutOfPage) { /* Will get here after NEWFRAME Escape */ if( !PSDRV_StartPage(physDev) ) - return FALSE; + return 0; } return WriteSpool16( physDev->job.hJob, lpData, cch ); } diff --git a/dlls/wineps/psdrv.h b/dlls/wineps/psdrv.h index cf331b0ee60..a537c55f1ee 100644 --- a/dlls/wineps/psdrv.h +++ b/dlls/wineps/psdrv.h @@ -305,6 +305,7 @@ typedef struct { BOOL banding; /* Have we received a NEXTBAND */ BOOL OutOfPage; /* Page header not sent yet */ INT PageNo; + BOOL quiet; /* Don't actually output anything */ } JOB; typedef struct { @@ -331,6 +332,8 @@ typedef struct { int vertSize; int logPixelsX; int logPixelsY; + + int pathdepth; } PSDRV_PDEVICE; typedef struct { diff --git a/include/wine/wingdi16.h b/include/wine/wingdi16.h index c2b664a7b16..237cb6a2c6a 100644 --- a/include/wine/wingdi16.h +++ b/include/wine/wingdi16.h @@ -354,6 +354,27 @@ typedef BOOL16 (CALLBACK *ABORTPROC16)(HDC16, INT16); #define INT_PD_DEFAULT_DEVMODE 1 #define INT_PD_DEFAULT_MODEL 2 +/* Escape: CLIP_TO_PATH modes */ +#define CLIP_SAVE 0 +#define CLIP_RESTORE 1 +#define CLIP_INCLUSIVE 2 +#define CLIP_EXCLUSIVE 3 + +/* Escape: END_PATH info */ +struct PATH_INFO { + short RenderMode; + BYTE FillMode; + BYTE BkMode; + LOGPEN16 Pen; + LOGBRUSH16 Brush; + DWORD BkColor; +}; + +/* RenderMode */ +#define RENDERMODE_NO_DISPLAY 0 +#define RENDERMODE_OPEN 1 +#define RENDERMODE_CLOSED 2 + #include "poppack.h"