From: Piotr Caban piotr@codeweavers.com
--- dlls/gdi32/emfdc.c | 51 ++++++++++++++++++++++++++++++---------------- 1 file changed, 33 insertions(+), 18 deletions(-)
diff --git a/dlls/gdi32/emfdc.c b/dlls/gdi32/emfdc.c index 45938172a37..645592fea0a 100644 --- a/dlls/gdi32/emfdc.c +++ b/dlls/gdi32/emfdc.c @@ -647,30 +647,45 @@ static BOOL emfdc_select_font( DC_ATTR *dc_attr, HFONT font ) return emfdc_record( emf, &emr.emr ); }
-static DWORD emfdc_create_pen( struct emf *emf, HPEN hPen ) +static DWORD emfdc_ext_create_pen( struct emf *emf, HPEN pen ) { - EMRCREATEPEN emr; - DWORD index = 0; + EMREXTCREATEPEN *emr; + int size, emr_size; + DWORD ret = 0;
- if (!GetObjectW( hPen, sizeof(emr.lopn), &emr.lopn )) - { - /* must be an extended pen */ - EXTLOGPEN *elp; - INT size = GetObjectW( hPen, 0, NULL ); + if (!(size = GetObjectW( pen, 0, NULL ))) + return 0; + emr_size = sizeof(*emr) - sizeof(emr->elp) + size; + emr = HeapAlloc( GetProcessHeap(), 0, emr_size ); + if (!emr) + return 0; + GetObjectW( pen, size, &emr->elp );
- if (!size) return 0; + if (emr->elp.elpBrushStyle == BS_DIBPATTERN || + emr->elp.elpBrushStyle == BS_DIBPATTERNPT || + emr->elp.elpBrushStyle == BS_PATTERN) + { + FIXME( "elpBrushStyle = %d\n", emr->elp.elpBrushStyle ); + HeapFree( GetProcessHeap(), 0, emr ); + return 0; + } + emr->offBmi = emr->cbBmi = emr->offBits = emr->cbBits = 0;
- elp = HeapAlloc( GetProcessHeap(), 0, size ); + emr->emr.iType = EMR_EXTCREATEPEN; + emr->emr.nSize = emr_size; + emr->ihPen = ret = emfdc_add_handle( emf, pen ); + ret = emfdc_record( emf, &emr->emr ) ? ret : 0; + HeapFree( GetProcessHeap(), 0, emr ); + return ret; +}
- GetObjectW( hPen, size, elp ); - /* FIXME: add support for user style pens */ - emr.lopn.lopnStyle = elp->elpPenStyle; - emr.lopn.lopnWidth.x = elp->elpWidth; - emr.lopn.lopnWidth.y = 0; - emr.lopn.lopnColor = elp->elpColor; +static DWORD emfdc_create_pen( struct emf *emf, HPEN hPen ) +{ + EMRCREATEPEN emr; + DWORD index = 0;
- HeapFree( GetProcessHeap(), 0, elp ); - } + if (!GetObjectW( hPen, sizeof(emr.lopn), &emr.lopn )) + return emfdc_ext_create_pen( emf, hPen );
emr.emr.iType = EMR_CREATEPEN; emr.emr.nSize = sizeof(emr);
From: Piotr Caban piotr@codeweavers.com
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=55606 --- dlls/wineps.drv/printproc.c | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/dlls/wineps.drv/printproc.c b/dlls/wineps.drv/printproc.c index 74f43b6d27c..3de05eea3f5 100644 --- a/dlls/wineps.drv/printproc.c +++ b/dlls/wineps.drv/printproc.c @@ -2309,6 +2309,7 @@ static int WINAPI hmf_proc(HDC hdc, HANDLETABLE *htable, case OBJ_PEN: return PSDRV_SelectPen(data->ctx, obj, NULL) != NULL; case OBJ_BRUSH: return PSDRV_SelectBrush(data->ctx, obj, pattern) != NULL; case OBJ_FONT: return PSDRV_SelectFont(data->ctx, obj, &aa_flags) != NULL; + case OBJ_EXTPEN: return PSDRV_SelectPen(data->ctx, obj, NULL) != NULL; default: FIXME("unhandled object type %ld\n", GetObjectType(obj)); return 1; @@ -2843,6 +2844,7 @@ static int WINAPI hmf_proc(HDC hdc, HANDLETABLE *htable, case EMR_SELECTCLIPPATH: case EMR_EXTSELECTCLIPRGN: case EMR_EXTCREATEFONTINDIRECTW: + case EMR_EXTCREATEPEN: case EMR_SETLAYOUT: return PlayEnhMetaFileRecord(data->ctx->hdc, htable, rec, handle_count); default:
This merge request was approved by Huw Davies.