diff --git a/dlls/gdiplus/gdiplus_private.h b/dlls/gdiplus/gdiplus_private.h index 0745e7997ff..04294e823b7 100644 --- a/dlls/gdiplus/gdiplus_private.h +++ b/dlls/gdiplus/gdiplus_private.h @@ -118,6 +118,7 @@ extern GpStatus METAFILE_FillPie(GpMetafile *metafile, GpBrush *brush, const GpR extern GpStatus METAFILE_DrawArc(GpMetafile *metafile, GpPen *pen, const GpRectF *rect, REAL startAngle, REAL sweepAngle) DECLSPEC_HIDDEN; extern GpStatus METAFILE_OffsetClip(GpMetafile *metafile, REAL dx, REAL dy) DECLSPEC_HIDDEN; +extern GpStatus METAFILE_ResetClip(GpMetafile *metafile) DECLSPEC_HIDDEN; extern void calc_curve_bezier(const GpPointF *pts, REAL tension, REAL *x1, REAL *y1, REAL *x2, REAL *y2) DECLSPEC_HIDDEN; diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c index dd34cf81ddb..0eb7aa71d46 100644 --- a/dlls/gdiplus/graphics.c +++ b/dlls/gdiplus/graphics.c @@ -5809,6 +5809,8 @@ GpStatus WINGDIPAPI GdipDrawString(GpGraphics *graphics, GDIPCONST WCHAR *string GpStatus WINGDIPAPI GdipResetClip(GpGraphics *graphics) { + GpStatus stat; + TRACE("(%p)\n", graphics); if(!graphics) @@ -5817,6 +5819,13 @@ GpStatus WINGDIPAPI GdipResetClip(GpGraphics *graphics) if(graphics->busy) return ObjectBusy; + if (is_metafile_graphics(graphics)) + { + stat = METAFILE_ResetClip((GpMetafile *)graphics->image); + if (stat != Ok) + return stat; + } + return GdipSetInfinite(graphics->clip); } diff --git a/dlls/gdiplus/metafile.c b/dlls/gdiplus/metafile.c index 8ab1acadb42..c5a97246da2 100644 --- a/dlls/gdiplus/metafile.c +++ b/dlls/gdiplus/metafile.c @@ -5227,3 +5227,24 @@ GpStatus METAFILE_OffsetClip(GpMetafile *metafile, REAL dx, REAL dy) return Ok; } + +GpStatus METAFILE_ResetClip(GpMetafile *metafile) +{ + EmfPlusRecordHeader *record; + GpStatus stat; + + if (metafile->metafile_type == MetafileTypeEmf) + { + FIXME("stub!\n"); + return NotImplemented; + } + + stat = METAFILE_AllocateRecord(metafile, EmfPlusRecordTypeResetClip, + sizeof(*record), (void **)&record); + if (stat != Ok) + return stat; + + METAFILE_WriteRecords(metafile); + + return Ok; +} diff --git a/dlls/gdiplus/tests/metafile.c b/dlls/gdiplus/tests/metafile.c index 9ffd9ef60c8..9701a7d7ba6 100644 --- a/dlls/gdiplus/tests/metafile.c +++ b/dlls/gdiplus/tests/metafile.c @@ -3755,6 +3755,54 @@ static void test_offsetclip(void) expect(Ok, stat); } +static void test_resetclip(void) +{ + static const GpRectF frame = { 0.0f, 0.0f, 100.0f, 100.0f }; + static const emfplus_record reset_clip_records[] = + { + { EMR_HEADER }, + { EmfPlusRecordTypeHeader }, + { EmfPlusRecordTypeResetClip }, + { EmfPlusRecordTypeResetClip }, + { EmfPlusRecordTypeEndOfFile }, + { EMR_EOF }, + { 0 }, + }; + + GpMetafile *metafile; + GpGraphics *graphics; + HENHMETAFILE hemf; + GpStatus stat; + HDC hdc; + + hdc = CreateCompatibleDC(0); + stat = GdipRecordMetafile(hdc, EmfTypeEmfPlusOnly, &frame, MetafileFrameUnitPixel, description, &metafile); + expect(Ok, stat); + DeleteDC(hdc); + + stat = GdipGetImageGraphicsContext((GpImage *)metafile, &graphics); + expect(Ok, stat); + + stat = GdipResetClip(graphics); + expect(Ok, stat); + + stat = GdipResetClip(graphics); + expect(Ok, stat); + + stat = GdipDeleteGraphics(graphics); + expect(Ok, stat); + sync_metafile(&metafile, "reset_clip.emf"); + + stat = GdipGetHemfFromMetafile(metafile, &hemf); + expect(Ok, stat); + + check_emfplus(hemf, reset_clip_records, "reset clip"); + DeleteEnhMetaFile(hemf); + + stat = GdipDisposeImage((GpImage*)metafile); + expect(Ok, stat); +} + START_TEST(metafile) { struct GdiplusStartupInput gdiplusStartupInput; @@ -3813,6 +3861,7 @@ START_TEST(metafile) test_fillellipse(); test_drawrectangle(); test_offsetclip(); + test_resetclip(); GdiplusShutdown(gdiplusToken); }