Module: wine Branch: master Commit: 59f72abfcf974dd9ad0a87c8c68474f5e47b6c75 URL: https://gitlab.winehq.org/wine/wine/-/commit/59f72abfcf974dd9ad0a87c8c68474f...
Author: Piotr Caban piotr@codeweavers.com Date: Thu Oct 5 13:34:28 2023 +0200
gdi32: Add partial support for creating EMREXTCREATEPEN records.
---
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);