diff --git a/dlls/gdi32/enhmfdrv/dc.c b/dlls/gdi32/enhmfdrv/dc.c index fe6ee84a253..ea5dda3327e 100644 --- a/dlls/gdi32/enhmfdrv/dc.c +++ b/dlls/gdi32/enhmfdrv/dc.c @@ -656,18 +656,6 @@ static BOOL CDECL emfpathdrv_DeleteDC( PHYSDEV dev ) return TRUE; } -/*********************************************************************** - * emfpathdrv_Ellipse - */ -static BOOL CDECL emfpathdrv_Ellipse( PHYSDEV dev, INT x1, INT y1, INT x2, INT y2 ) -{ - PHYSDEV emfdev = get_emfdev( dev ); - PHYSDEV next = GET_NEXT_PHYSDEV( dev, pEllipse ); - - return (emfdev->funcs->pEllipse( emfdev, x1, y1, x2, y2 ) && - next->funcs->pEllipse( next, x1, y1, x2, y2 )); -} - /*********************************************************************** * emfpathdrv_EndPath */ @@ -834,7 +822,7 @@ static const struct gdi_dc_funcs emfpath_driver = emfpathdrv_DeleteDC, /* pDeleteDC */ NULL, /* pDeleteObject */ NULL, /* pDeviceCapabilities */ - emfpathdrv_Ellipse, /* pEllipse */ + NULL, /* pEllipse */ NULL, /* pEndDoc */ NULL, /* pEndPage */ emfpathdrv_EndPath, /* pEndPath */ diff --git a/dlls/gdi32/enhmfdrv/graphics.c b/dlls/gdi32/enhmfdrv/graphics.c index 32dd9b645a9..3a6087c8a78 100644 --- a/dlls/gdi32/enhmfdrv/graphics.c +++ b/dlls/gdi32/enhmfdrv/graphics.c @@ -372,38 +372,53 @@ BOOL CDECL EMFDRV_AngleArc( PHYSDEV dev, INT x, INT y, DWORD radius, FLOAT start return EMFDRV_WriteRecord( dev, &emr.emr ); } +/*********************************************************************** + * EMFDC_Ellipse + */ +BOOL EMFDC_Ellipse( DC_ATTR *dc_attr, INT left, INT top, INT right, INT bottom ) +{ + EMFDRV_PDEVICE *emf = dc_attr->emf; + EMRELLIPSE emr; + + if (left == right || top == bottom) return FALSE; + + emr.emr.iType = EMR_ELLIPSE; + emr.emr.nSize = sizeof(emr); + emr.rclBox.left = min( left, right ); + emr.rclBox.top = min( top, bottom ); + emr.rclBox.right = max( left, right ); + emr.rclBox.bottom = max( top, bottom ); + if (dc_attr->graphics_mode == GM_COMPATIBLE) + { + emr.rclBox.right--; + emr.rclBox.bottom--; + } + + return EMFDRV_WriteRecord( &emf->dev, &emr.emr ); +} + /*********************************************************************** * EMFDRV_Ellipse */ BOOL CDECL EMFDRV_Ellipse( PHYSDEV dev, INT left, INT top, INT right, INT bottom ) { - EMFDRV_PDEVICE *physDev = get_emf_physdev( dev ); DC *dc = get_physdev_dc( dev ); - EMRELLIPSE emr; - INT temp; + RECTL bounds; - TRACE("%d,%d - %d,%d\n", left, top, right, bottom); + if (left == right || top == bottom) return FALSE; - if(left == right || top == bottom) return FALSE; - - if(left > right) {temp = left; left = right; right = temp;} - if(top > bottom) {temp = top; top = bottom; bottom = temp;} - - if(dc->attr->graphics_mode == GM_COMPATIBLE) { - right--; - bottom--; + bounds.left = min( left, right ); + bounds.top = min( top, bottom ); + bounds.right = max( left, right ); + bounds.bottom = max( top, bottom ); + if (dc->attr->graphics_mode == GM_COMPATIBLE) + { + bounds.right--; + bounds.bottom--; } - emr.emr.iType = EMR_ELLIPSE; - emr.emr.nSize = sizeof(emr); - emr.rclBox.left = left; - emr.rclBox.top = top; - emr.rclBox.right = right; - emr.rclBox.bottom = bottom; - - if(!physDev->path) - EMFDRV_UpdateBBox( dev, &emr.rclBox ); - return EMFDRV_WriteRecord( dev, &emr.emr ); + EMFDRV_UpdateBBox( dev, &bounds ); + return TRUE; } /*********************************************************************** diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h index 73ed6989e9e..4b66360f20b 100644 --- a/dlls/gdi32/gdi_private.h +++ b/dlls/gdi32/gdi_private.h @@ -46,6 +46,7 @@ extern BOOL METADC_Arc( HDC hdc, INT left, INT top, INT right, INT bottom, INT xstart, INT ystart, INT xend, INT yend ) DECLSPEC_HIDDEN; extern BOOL METADC_Chord( HDC hdc, INT left, INT top, INT right, INT bottom, INT xstart, INT ystart, INT xend, INT yend ) DECLSPEC_HIDDEN; +extern BOOL METADC_Ellipse( HDC hdc, INT left, INT top, INT right, INT bottom ) DECLSPEC_HIDDEN; extern BOOL METADC_LineTo( HDC hdc, INT x, INT y ) DECLSPEC_HIDDEN; extern BOOL METADC_MoveTo( HDC hdc, INT x, INT y ) DECLSPEC_HIDDEN; extern BOOL METADC_Pie( HDC hdc, INT left, INT top, INT right, INT bottom, @@ -55,6 +56,8 @@ extern BOOL METADC_Pie( HDC hdc, INT left, INT top, INT right, INT bottom, extern BOOL EMFDC_ArcChordPie( DC_ATTR *dc_attr, INT left, INT top, INT right, INT bottom, INT xstart, INT ystart, INT xend, INT yend, DWORD type ) DECLSPEC_HIDDEN; +extern BOOL EMFDC_Ellipse( DC_ATTR *dc_attr, INT left, INT top, INT right, + INT bottom ) DECLSPEC_HIDDEN; extern BOOL EMFDC_LineTo( DC_ATTR *dc_attr, INT x, INT y ) DECLSPEC_HIDDEN; extern BOOL EMFDC_MoveTo( DC_ATTR *dc_attr, INT x, INT y ) DECLSPEC_HIDDEN; diff --git a/dlls/gdi32/gdidc.c b/dlls/gdi32/gdidc.c index 2f5b786d726..0007d5a2738 100644 --- a/dlls/gdi32/gdidc.c +++ b/dlls/gdi32/gdidc.c @@ -169,3 +169,18 @@ BOOL WINAPI Pie( HDC hdc, INT left, INT top, INT right, INT bottom, return NtGdiArcInternal( NtGdiPie, hdc, left, top, right, bottom, xstart, ystart, xend, yend ); } + +/*********************************************************************** + * Ellipse (GDI32.@) + */ +BOOL WINAPI Ellipse( HDC hdc, INT left, INT top, INT right, INT bottom ) +{ + DC_ATTR *dc_attr; + + TRACE( "%p, (%d, %d)-(%d, %d)\n", hdc, left, top, right, bottom ); + + if (is_meta_dc( hdc )) return METADC_Ellipse( hdc, left, top, right, bottom ); + if (!(dc_attr = get_dc_attr( hdc ))) return FALSE; + if (dc_attr->emf && !EMFDC_Ellipse( dc_attr, left, top, right, bottom )) return FALSE; + return NtGdiEllipse( hdc, left, top, right, bottom ); +} diff --git a/dlls/gdi32/mfdrv/graphics.c b/dlls/gdi32/mfdrv/graphics.c index 2037d7ac2e2..3dee75722af 100644 --- a/dlls/gdi32/mfdrv/graphics.c +++ b/dlls/gdi32/mfdrv/graphics.c @@ -90,11 +90,11 @@ BOOL METADC_Chord( HDC hdc, INT left, INT top, INT right, INT bottom, } /*********************************************************************** - * MFDRV_Ellipse + * METADC_Ellipse */ -BOOL CDECL MFDRV_Ellipse( PHYSDEV dev, INT left, INT top, INT right, INT bottom ) +BOOL METADC_Ellipse( HDC hdc, INT left, INT top, INT right, INT bottom ) { - return MFDRV_MetaParam4(dev, META_ELLIPSE, left, top, right, bottom); + return metadc_param4( hdc, META_ELLIPSE, left, top, right, bottom ); } /*********************************************************************** diff --git a/dlls/gdi32/mfdrv/init.c b/dlls/gdi32/mfdrv/init.c index 444d3dbf1d4..22406cb9e76 100644 --- a/dlls/gdi32/mfdrv/init.c +++ b/dlls/gdi32/mfdrv/init.c @@ -114,7 +114,7 @@ static const struct gdi_dc_funcs MFDRV_Funcs = MFDRV_DeleteDC, /* pDeleteDC */ MFDRV_DeleteObject, /* pDeleteObject */ NULL, /* pDeviceCapabilities */ - MFDRV_Ellipse, /* pEllipse */ + NULL, /* pEllipse */ NULL, /* pEndDoc */ NULL, /* pEndPage */ MFDRV_EndPath, /* pEndPath */ @@ -614,6 +614,15 @@ BOOL metadc_param2( HDC hdc, short func, short param1, short param2 ) return MFDRV_MetaParam2( &dev->dev, func, param1, param2 ); } +BOOL metadc_param4( HDC hdc, short func, short param1, short param2, + short param3, short param4 ) +{ + METAFILEDRV_PDEVICE *dev; + + if (!(dev = get_metadc_ptr( hdc ))) return FALSE; + return MFDRV_MetaParam4( &dev->dev, func, param1, param2, param3, param4 ); +} + BOOL metadc_param8( HDC hdc, short func, short param1, short param2, short param3, short param4, short param5, short param6, short param7, short param8) diff --git a/dlls/gdi32/mfdrv/metafiledrv.h b/dlls/gdi32/mfdrv/metafiledrv.h index 46a9d43d34b..8b3324a5d22 100644 --- a/dlls/gdi32/mfdrv/metafiledrv.h +++ b/dlls/gdi32/mfdrv/metafiledrv.h @@ -60,6 +60,8 @@ extern BOOL MFDRV_RemoveHandle( PHYSDEV dev, UINT index ) DECLSPEC_HIDDEN; extern INT16 MFDRV_CreateBrushIndirect( PHYSDEV dev, HBRUSH hBrush ) DECLSPEC_HIDDEN; extern BOOL metadc_param2( HDC hdc, short func, short param1, short param2 ) DECLSPEC_HIDDEN; +extern BOOL metadc_param4( HDC hdc, short func, short param1, short param2, + short param3, short param4 ) DECLSPEC_HIDDEN; extern BOOL metadc_param8( HDC hdc, short func, short param1, short param2, short param3, short param4, short param5, short param6, short param7, short param8 ) DECLSPEC_HIDDEN; @@ -72,7 +74,6 @@ extern BOOL CDECL MFDRV_ArcTo( PHYSDEV dev, INT left, INT top, INT right, INT bo extern BOOL CDECL MFDRV_BeginPath( PHYSDEV dev ) DECLSPEC_HIDDEN; extern BOOL CDECL MFDRV_CloseFigure( PHYSDEV dev ) DECLSPEC_HIDDEN; extern BOOL CDECL MFDRV_DeleteObject( PHYSDEV dev, HGDIOBJ obj ) DECLSPEC_HIDDEN; -extern BOOL CDECL MFDRV_Ellipse( PHYSDEV dev, INT left, INT top, INT right, INT bottom ) DECLSPEC_HIDDEN; extern BOOL CDECL MFDRV_EndPath( PHYSDEV dev ) DECLSPEC_HIDDEN; extern INT CDECL MFDRV_ExcludeClipRect( PHYSDEV dev, INT left, INT top, INT right, INT bottom ) DECLSPEC_HIDDEN; extern BOOL CDECL MFDRV_ExtFloodFill( PHYSDEV dev, INT x, INT y, COLORREF color, UINT fillType ) DECLSPEC_HIDDEN; diff --git a/dlls/gdi32/painting.c b/dlls/gdi32/painting.c index 985d69303b1..b362ea086b7 100644 --- a/dlls/gdi32/painting.c +++ b/dlls/gdi32/painting.c @@ -339,17 +339,14 @@ BOOL WINAPI NtGdiArcInternal( UINT type, HDC hdc, INT left, INT top, INT right, /*********************************************************************** - * Ellipse (GDI32.@) + * NtGdiEllipse (win32u.@) */ -BOOL WINAPI Ellipse( HDC hdc, INT left, INT top, - INT right, INT bottom ) +BOOL WINAPI NtGdiEllipse( HDC hdc, INT left, INT top, INT right, INT bottom ) { BOOL ret; PHYSDEV physdev; DC * dc = get_dc_ptr( hdc ); - TRACE( "%p, (%d, %d)-(%d, %d)\n", hdc, left, top, right, bottom ); - if (!dc) return FALSE; update_dc( dc ); physdev = GET_DC_PHYSDEV( dc, pEllipse );