-- v2: winedump/emf: Add EMR_SETMITERLIMIT record dumping.
From: Nikolay Sivov nsivov@codeweavers.com
--- 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 );
From: Nikolay Sivov nsivov@codeweavers.com
--- dlls/gdi32/tests/dc.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+)
diff --git a/dlls/gdi32/tests/dc.c b/dlls/gdi32/tests/dc.c index e3d29ae9ca9..d8204acfc14 100644 --- a/dlls/gdi32/tests/dc.c +++ b/dlls/gdi32/tests/dc.c @@ -38,6 +38,8 @@ static void test_dc_values(void) HDC hdc = CreateDCA("DISPLAY", NULL, NULL, NULL); COLORREF color; int extra, attr; + float limit; + BOOL ret;
ok( hdc != NULL, "CreateDC failed\n" ); color = SetBkColor( hdc, 0x12345678 ); @@ -91,6 +93,25 @@ static void test_dc_values(void) ok(!attr, "GetDeviceCaps rets %d\n", attr); ok(GetLastError() == ERROR_INVALID_HANDLE, "GetLastError() = %lu\n", GetLastError());
+ /* Miter limit */ + limit = 123.0f; + ret = GetMiterLimit(hdc, &limit); + ok(ret, "Unexpected return value.\n"); + ok(limit == 10.0f, "Unexpected default miter limit %f.\n", limit); + + limit = 456.0; + ret = SetMiterLimit(hdc, 0.9f, &limit); + todo_wine + ok(!ret, "Unexpected return value.\n"); + todo_wine + ok(limit == 456.0f, "Unexpected default miter limit %f.\n", limit); + + limit = 0.0; + ret = SetMiterLimit(hdc, 1.0f, &limit); + ok(ret, "Unexpected return value.\n"); + todo_wine + ok(limit == 10.0f, "Unexpected default miter limit %f.\n", limit); + DeleteDC( hdc ); }
From: Nikolay Sivov nsivov@codeweavers.com
--- dlls/gdi32/dc.c | 1 + dlls/gdi32/tests/dc.c | 3 --- 2 files changed, 1 insertion(+), 3 deletions(-)
diff --git a/dlls/gdi32/dc.c b/dlls/gdi32/dc.c index 27211a2b1d2..09068c7d13a 100644 --- a/dlls/gdi32/dc.c +++ b/dlls/gdi32/dc.c @@ -1372,6 +1372,7 @@ BOOL WINAPI SetMiterLimit( HDC hdc, FLOAT limit, FLOAT *old_limit ) DC_ATTR *dc_attr; if (!(dc_attr = get_dc_attr( hdc ))) return FALSE; if (dc_attr->emf && !EMFDC_SetMiterLimit( dc_attr, limit )) return 0; + if (limit < 1.0f) return FALSE; if (old_limit) *old_limit = dc_attr->miter_limit; dc_attr->miter_limit = limit; return TRUE; diff --git a/dlls/gdi32/tests/dc.c b/dlls/gdi32/tests/dc.c index d8204acfc14..ef121470dfe 100644 --- a/dlls/gdi32/tests/dc.c +++ b/dlls/gdi32/tests/dc.c @@ -101,15 +101,12 @@ static void test_dc_values(void)
limit = 456.0; ret = SetMiterLimit(hdc, 0.9f, &limit); - todo_wine ok(!ret, "Unexpected return value.\n"); - todo_wine ok(limit == 456.0f, "Unexpected default miter limit %f.\n", limit);
limit = 0.0; ret = SetMiterLimit(hdc, 1.0f, &limit); ok(ret, "Unexpected return value.\n"); - todo_wine ok(limit == 10.0f, "Unexpected default miter limit %f.\n", limit);
DeleteDC( hdc );
From: Nikolay Sivov nsivov@codeweavers.com
--- dlls/gdi32/dc.c | 2 +- dlls/gdi32/emfdc.c | 9 +++++++++ dlls/gdi32/gdi_private.h | 1 + 3 files changed, 11 insertions(+), 1 deletion(-)
diff --git a/dlls/gdi32/dc.c b/dlls/gdi32/dc.c index 09068c7d13a..3185fb273ba 100644 --- a/dlls/gdi32/dc.c +++ b/dlls/gdi32/dc.c @@ -2253,7 +2253,7 @@ INT WINAPI SetMetaRgn( HDC hdc ) DC_ATTR *dc_attr;
if (!(dc_attr = get_dc_attr( hdc ))) return FALSE; - if (dc_attr->emf) FIXME( "EMFs are not yet supported\n" ); + if (dc_attr->emf && !EMFDC_SetMetaRgn( dc_attr )) return FALSE; return NtGdiSetMetaRgn( hdc ); }
diff --git a/dlls/gdi32/emfdc.c b/dlls/gdi32/emfdc.c index 35910b388c3..e94f3c69b12 100644 --- a/dlls/gdi32/emfdc.c +++ b/dlls/gdi32/emfdc.c @@ -2254,6 +2254,15 @@ BOOL EMFDC_SetMapMode( DC_ATTR *dc_attr, INT mode ) return emfdc_record( get_dc_emf( dc_attr ), &emr.emr ); }
+BOOL EMFDC_SetMetaRgn( DC_ATTR *dc_attr ) +{ + EMRSETMETARGN emr; + + emr.emr.iType = EMR_SETMETARGN; + emr.emr.nSize = sizeof(emr); + 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; diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h index a98c0f29917..d9bf1c32895 100644 --- a/dlls/gdi32/gdi_private.h +++ b/dlls/gdi32/gdi_private.h @@ -241,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_SetMetaRgn( DC_ATTR *dc_attr ); 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 );
From: Nikolay Sivov nsivov@codeweavers.com
--- tools/winedump/emf.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/tools/winedump/emf.c b/tools/winedump/emf.c index 8a04886571c..42b1f9469af 100644 --- a/tools/winedump/emf.c +++ b/tools/winedump/emf.c @@ -174,7 +174,6 @@ unsigned long dump_emfrecord(const char *pfx, unsigned long offset) EMRCASE(EMR_ARCTO); EMRCASE(EMR_POLYDRAW); EMRCASE(EMR_SETARCDIRECTION); - EMRCASE(EMR_SETMITERLIMIT); EMRCASE(EMR_BEGINPATH); EMRCASE(EMR_ENDPATH); EMRCASE(EMR_CLOSEFIGURE); @@ -186,6 +185,15 @@ unsigned long dump_emfrecord(const char *pfx, unsigned long offset) EMRCASE(EMR_SELECTCLIPPATH); EMRCASE(EMR_ABORTPATH);
+ case EMR_SETMITERLIMIT: + { + const EMRSETMITERLIMIT *record = PRD(offset, sizeof(*record)); + + printf("%s%-20s %08x\n", pfx, "EMR_SETMITERLIMIT", length); + printf("%s miter limit %u\n", pfx, *(unsigned int *)&record->eMiterLimit); + break; + } + case EMR_GDICOMMENT: { printf("%s%-20s %08x\n", pfx, "EMR_GDICOMMENT", length);
This merge request was approved by Huw Davies.