Module: wine Branch: master Commit: 5b471a2963f52b5550e045ae0066bf4d393d7a56 URL: https://gitlab.winehq.org/wine/wine/-/commit/5b471a2963f52b5550e045ae0066bf4...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Sat Oct 7 17:53:00 2023 +0200
gdi32/emf: Fix miter limit serialization.
---
dlls/gdi32/dc.c | 2 +- dlls/gdi32/emfdc.c | 10 ++++++++++ dlls/gdi32/enhmetafile.c | 2 +- dlls/gdi32/gdi_private.h | 10 ++++++++++ 4 files changed, 22 insertions(+), 2 deletions(-)
diff --git a/dlls/gdi32/dc.c b/dlls/gdi32/dc.c index e1f6703f81e..27211a2b1d2 100644 --- a/dlls/gdi32/dc.c +++ b/dlls/gdi32/dc.c @@ -1371,7 +1371,7 @@ BOOL WINAPI SetMiterLimit( HDC hdc, FLOAT limit, FLOAT *old_limit ) { DC_ATTR *dc_attr; if (!(dc_attr = get_dc_attr( hdc ))) return FALSE; - /* FIXME: record EMFs */ + if (dc_attr->emf && !EMFDC_SetMiterLimit( dc_attr, limit )) return 0; if (old_limit) *old_limit = dc_attr->miter_limit; dc_attr->miter_limit = limit; return TRUE; diff --git a/dlls/gdi32/emfdc.c b/dlls/gdi32/emfdc.c index 645592fea0a..35910b388c3 100644 --- a/dlls/gdi32/emfdc.c +++ b/dlls/gdi32/emfdc.c @@ -2254,6 +2254,16 @@ BOOL EMFDC_SetMapMode( DC_ATTR *dc_attr, INT mode ) return emfdc_record( get_dc_emf( dc_attr ), &emr.emr ); }
+BOOL EMFDC_SetMiterLimit( DC_ATTR *dc_attr, FLOAT limit ) +{ + struct emr_set_miter_limit emr; + + emr.emr.iType = EMR_SETMITERLIMIT; + emr.emr.nSize = sizeof(emr); + emr.eMiterLimit = limit; + return emfdc_record( get_dc_emf( dc_attr ), &emr.emr ); +} + BOOL EMFDC_SetViewportExtEx( DC_ATTR *dc_attr, INT cx, INT cy ) { EMRSETVIEWPORTEXTEX emr; diff --git a/dlls/gdi32/enhmetafile.c b/dlls/gdi32/enhmetafile.c index 12449ecfdf0..0351d8c462d 100644 --- a/dlls/gdi32/enhmetafile.c +++ b/dlls/gdi32/enhmetafile.c @@ -1680,7 +1680,7 @@ BOOL WINAPI PlayEnhMetaFileRecord(
case EMR_SETMITERLIMIT: { - const EMRSETMITERLIMIT *lpSetMiterLimit = (const EMRSETMITERLIMIT *)mr; + const struct emr_set_miter_limit *lpSetMiterLimit = (const struct emr_set_miter_limit *)mr; SetMiterLimit( hdc, lpSetMiterLimit->eMiterLimit, NULL ); break; } diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h index f717181b252..a98c0f29917 100644 --- a/dlls/gdi32/gdi_private.h +++ b/dlls/gdi32/gdi_private.h @@ -160,6 +160,15 @@ typedef struct INT nBreakCount; } EMRSETTEXTJUSTIFICATION, *PEMRSETTEXTJUSTIFICATION;
+/* Public structure EMRSETMITERLIMIT is using a float field, + that does not match serialized output or documentation, + which are both using unsigned integer. */ +struct emr_set_miter_limit +{ + EMR emr; + DWORD eMiterLimit; +}; + BOOL EMFDC_AbortPath( DC_ATTR *dc_attr ); BOOL EMFDC_AlphaBlend( DC_ATTR *dc_attr, INT x_dst, INT y_dst, INT width_dst, INT height_dst, HDC hdc_src, INT x_src, INT y_src, INT width_src, INT height_src, @@ -232,6 +241,7 @@ INT EMFDC_SetDIBitsToDevice( DC_ATTR *dc_attr, INT x_dest, INT y_dest, DWORD wi BOOL EMFDC_SetLayout( DC_ATTR *dc_attr, DWORD layout ); BOOL EMFDC_SetMapMode( DC_ATTR *dc_attr, INT mode ); BOOL EMFDC_SetMapperFlags( DC_ATTR *dc_attr, DWORD flags ); +BOOL EMFDC_SetMiterLimit( DC_ATTR *dc_attr, FLOAT limit ); BOOL EMFDC_SetPixel( DC_ATTR *dc_attr, INT x, INT y, COLORREF color ); BOOL EMFDC_SetPolyFillMode( DC_ATTR *dc_attr, INT mode ); BOOL EMFDC_SetROP2( DC_ATTR *dc_attr, INT rop );